From 503b330eb83e00ff47e9e229b17e9e0db9f9f5d5 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Tue, 5 May 2015 19:11:35 +0100 Subject: [PATCH] Fix bugs in viewport interaction and loadsave dialog Part of the issue was comparing an int litteral when it should have been a short but the main issue was due to a wrong mask in the viewport interaction code. Loadsave MS dialog box should now work correctly. Fixes #1040. Fixes #1039. --- src/interface/viewport.c | 2 +- src/interface/viewport.h | 2 +- src/interface/viewport_interaction.c | 2 +- src/windows/loadsave.c | 4 +++ src/windows/top_toolbar.c | 44 ++++++++++++++++++---------- 5 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 1aa26ded41..80b93835be 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1885,7 +1885,7 @@ void store_interaction_info(paint_struct *ps) uint16 mask; if (ps->sprite_type == VIEWPORT_INTERACTION_ITEM_BANNER) // I think CS made a typo here. Let's replicate the original behaviour. - mask = 1 << 9; + mask = 1 << (ps->sprite_type - 3); else mask = 1 << (ps->sprite_type - 1); diff --git a/src/interface/viewport.h b/src/interface/viewport.h index 6e809dcee2..7bd3d1b23d 100644 --- a/src/interface/viewport.h +++ b/src/interface/viewport.h @@ -72,7 +72,7 @@ enum { VIEWPORT_INTERACTION_MASK_PARK = ~(1 << (VIEWPORT_INTERACTION_ITEM_PARK - 1)), VIEWPORT_INTERACTION_MASK_WALL = ~(1 << (VIEWPORT_INTERACTION_ITEM_WALL - 1)), VIEWPORT_INTERACTION_MASK_LARGE_SCENERY = ~(1 << (VIEWPORT_INTERACTION_ITEM_LARGE_SCENERY - 1)), - VIEWPORT_INTERACTION_MASK_BANNER = ~(1 << (VIEWPORT_INTERACTION_ITEM_BANNER - 1)), + VIEWPORT_INTERACTION_MASK_BANNER = ~(1 << (VIEWPORT_INTERACTION_ITEM_BANNER - 2)), // Note the -2 for BANNER }; typedef struct { diff --git a/src/interface/viewport_interaction.c b/src/interface/viewport_interaction.c index 8843ea2be3..80dcc80ffe 100644 --- a/src/interface/viewport_interaction.c +++ b/src/interface/viewport_interaction.c @@ -568,7 +568,7 @@ void sub_68A15E(int screenX, int screenY, short *x, short *y, int *direction, rc int my_x, my_y, z, interactionType; rct_map_element *myMapElement; rct_viewport *viewport; - get_map_coordinates_from_pos(screenX, screenY, VIEWPORT_INTERACTION_MASK_SPRITE & VIEWPORT_INTERACTION_MASK_WATER, &my_x, &my_y, &interactionType, &myMapElement, &viewport); + get_map_coordinates_from_pos(screenX, screenY, VIEWPORT_INTERACTION_MASK_TERRAIN & VIEWPORT_INTERACTION_MASK_WATER, &my_x, &my_y, &interactionType, &myMapElement, &viewport); if (interactionType == VIEWPORT_INTERACTION_ITEM_NONE) { *x = 0x8000; diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index d5bfe35e8d..ca43a637bd 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -255,6 +255,10 @@ static void window_loadsave_mouseup() char filename[MAX_PATH], filter[MAX_PATH]; int result; + strcpy(filename, _directory); + if (_type & LOADSAVETYPE_SAVE){ + strcat(filename, (char*)RCT2_ADDRESS_SCENARIO_NAME); + } memset(filter, '\0', MAX_PATH); strncpy(filter, "*", MAX_PATH); strncat(filter, _extension, MAX_PATH); diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 8bf424ea9c..3807aa5474 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -637,10 +637,10 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ // edx rct_map_element* map_element; uint16 flags = - ~((1 << (VIEWPORT_INTERACTION_ITEM_SCENERY - 1)) | - (1 << (VIEWPORT_INTERACTION_ITEM_WALL - 1)) | - (1 << (VIEWPORT_INTERACTION_ITEM_LARGE_SCENERY - 1)) | - (1 << (VIEWPORT_INTERACTION_ITEM_BANNER - 2))); + VIEWPORT_INTERACTION_MASK_SCENERY & + VIEWPORT_INTERACTION_MASK_WALL & + VIEWPORT_INTERACTION_MASK_LARGE_SCENERY & + VIEWPORT_INTERACTION_MASK_BANNER; // This is -2 as banner is 12 but flags are offset different // not used @@ -826,7 +826,13 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin // CTRL pressed if (RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) & (1 << 1)){ rct_map_element* map_element; - uint16 flags = 0xFCCA; + uint16 flags = + VIEWPORT_INTERACTION_MASK_TERRAIN & + VIEWPORT_INTERACTION_MASK_RIDE & + VIEWPORT_INTERACTION_MASK_SCENERY & + VIEWPORT_INTERACTION_MASK_FOOTPATH & + VIEWPORT_INTERACTION_MASK_WALL & + VIEWPORT_INTERACTION_MASK_LARGE_SCENERY; int interaction_type; get_map_coordinates_from_pos(x, y, flags, NULL, NULL, &interaction_type, &map_element, NULL); @@ -880,7 +886,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED, uint8) == 0){ sub_689604(x, y, grid_x, grid_y, &cl); - if (*grid_x == 0x8000) + if (*grid_x == (sint16)0x8000) return; RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) = 0; @@ -922,7 +928,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) = z; } - if (*grid_x == 0x8000) + if (*grid_x == (sint16)0x8000) return; uint8 rotation = window_scenery_rotation; @@ -943,7 +949,9 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin // If CTRL not pressed if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED, uint8) == 0){ - uint16 flags = 0xFFF6; + uint16 flags = + VIEWPORT_INTERACTION_MASK_TERRAIN & + VIEWPORT_INTERACTION_MASK_WATER; int interaction_type = 0; rct_map_element* map_element; @@ -999,7 +1007,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) = z; } - if (*grid_x == 0x8000) + if (*grid_x == (sint16)0x8000) return; *grid_x &= 0xFFE0; @@ -1023,7 +1031,9 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin { // Path bits - uint16 flags = 0xFF9F; + uint16 flags = + VIEWPORT_INTERACTION_MASK_FOOTPATH & + VIEWPORT_INTERACTION_MASK_FOOTPATH_ITEM; int interaction_type = 0; rct_map_element* map_element; @@ -1054,7 +1064,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED, uint8) == 0){ sub_689692(x, y, grid_x, grid_y, &cl); - if (*grid_x == 0x8000) + if (*grid_x == (sint16)0x8000) return; RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) = 0; @@ -1094,7 +1104,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) = z; } - if (*grid_x == 0x8000) + if (*grid_x == (sint16)0x8000) return; RCT2_GLOBAL(0x00F64F15, uint8) = window_scenery_secondary_colour; @@ -1113,7 +1123,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin if (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TOOL_CTRL_PRESSED, uint8) == 0){ sub_68A15E(x, y, grid_x, grid_y, NULL, NULL); - if (*grid_x == 0x8000) + if (*grid_x == (sint16)0x8000) return; RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) = 0; @@ -1153,7 +1163,7 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_Z_COORDINATE, sint16) = z; } - if (*grid_x == 0x8000) + if (*grid_x == (sint16)0x8000) return; *grid_x &= 0xFFE0; @@ -1172,7 +1182,9 @@ void sub_6E1F34(sint16 x, sint16 y, uint16 selected_scenery, sint16* grid_x, sin { // Banner - uint16 flags = 0xFF9F; + uint16 flags = + VIEWPORT_INTERACTION_MASK_FOOTPATH & + VIEWPORT_INTERACTION_MASK_FOOTPATH_ITEM; int interaction_type = 0; rct_map_element* map_element; @@ -1232,7 +1244,7 @@ static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w sub_6E1F34(x, y, selected_tab, &grid_x, &grid_y, ¶meter_1, ¶meter_2, ¶meter_3); - if (grid_x == 0x8000)return; + if (grid_x == (sint16)0x8000)return; switch (scenery_type){ case 0: