diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 25ac1c8ef6..fb3f59102a 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -4338,7 +4338,7 @@ STR_6026 :Ride construction - Previous track STR_6027 :Ride construction - Next track STR_6028 :Ride construction - Build current STR_6029 :Ride construction - Demolish current - +STR_6030 :{SMALLFONT}{BLACK}Scenery picker. Click any scenery on the map to select the same piece for construction. ############# # Scenarios # diff --git a/src/openrct2/localisation/string_ids.h b/src/openrct2/localisation/string_ids.h index 0dad51d44a..222ae50e91 100644 --- a/src/openrct2/localisation/string_ids.h +++ b/src/openrct2/localisation/string_ids.h @@ -3682,6 +3682,8 @@ enum { STR_SHORTCUT_RIDE_CONSTRUCTION_BUILD_CURRENT = 6028, STR_SHORTCUT_RIDE_CONSTRUCTION_DEMOLISH_CURRENT = 6029, + STR_SCENERY_EYEDROPPER_TIP = 6030, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/openrct2/windows/scenery.c b/src/openrct2/windows/scenery.c index 978b9d2891..621571c622 100644 --- a/src/openrct2/windows/scenery.c +++ b/src/openrct2/windows/scenery.c @@ -34,7 +34,7 @@ #include "../sprites.h" #define WINDOW_SCENERY_WIDTH 634 -#define WINDOW_SCENERY_HEIGHT 142 +#define WINDOW_SCENERY_HEIGHT 166 #define SCENERY_BUTTON_WIDTH 66 #define SCENERY_BUTTON_HEIGHT 80 @@ -139,7 +139,8 @@ enum WINDOW_SCENERY_LIST_WIDGET_IDX { WIDX_SCENERY_PRIMARY_COLOUR_BUTTON, // 8000000 WIDX_SCENERY_SECONDARY_COLOUR_BUTTON, // 10000000 WIDX_SCENERY_TERTIARY_COLOUR_BUTTON, // 20000000 - WIDX_SCENERY_BUILD_CLUSTER_BUTTON, // 40000000 + WIDX_SCENERY_EYEDROPPER_BUTTON, // 40000000 + WIDX_SCENERY_BUILD_CLUSTER_BUTTON, // 80000000 }; static rct_widget window_scenery_widgets[] = { @@ -173,7 +174,8 @@ static rct_widget window_scenery_widgets[] = { { WWT_COLOURBTN, 1, 615, 626, 93, 104, 0xFFFFFFFF, STR_SELECT_COLOUR }, // 8000000 0x009DE448 { WWT_COLOURBTN, 1, 615, 626, 105, 116, 0xFFFFFFFF, STR_SELECT_SECONDARY_COLOUR }, // 10000000 0x009DE458 { WWT_COLOURBTN, 1, 615, 626, 117, 128, 0xFFFFFFFF, STR_SELECT_TERNARY_COLOUR }, // 20000000 0x009DE468 - { WWT_FLATBTN, 1, 609, 632, 117, 140, SPR_SCENERY_CLUSTER, STR_SCENERY_CLUSTER_TIP }, // 40000000 0x009DE478 + { WWT_FLATBTN, 1, 609, 632, 118, 141, SPR_PICKUP_BTN, STR_SCENERY_EYEDROPPER_TIP }, // 40000000 0x009DE478 + { WWT_FLATBTN, 1, 609, 632, 142, 165, SPR_SCENERY_CLUSTER, STR_SCENERY_CLUSTER_TIP }, // 40000000 0x009DE478 { WIDGETS_END }, }; @@ -456,6 +458,7 @@ void window_scenery_open() (1 << WIDX_SCENERY_SECONDARY_COLOUR_BUTTON) | (1 << WIDX_SCENERY_REPAINT_SCENERY_BUTTON) | (1 << WIDX_SCENERY_TERTIARY_COLOUR_BUTTON) | + (1 << WIDX_SCENERY_EYEDROPPER_BUTTON) | (1 << WIDX_SCENERY_BUILD_CLUSTER_BUTTON); window_init_scroll_widgets(window); @@ -471,6 +474,7 @@ void window_scenery_open() gSceneryPlaceCost = MONEY32_UNDEFINED; gSceneryPlaceRotation = 0; gWindowSceneryPaintEnabled = 0; // repaint coloured scenery tool state + gWindowSceneryEyedropperEnabled = false; gWindowSceneryClusterEnabled = 0; // build cluster tool state window->min_width = WINDOW_SCENERY_WIDTH; @@ -580,9 +584,19 @@ static void window_scenery_mouseup(rct_window *w, sint32 widgetIndex) break; case WIDX_SCENERY_REPAINT_SCENERY_BUTTON: gWindowSceneryPaintEnabled ^= 1; + gWindowSceneryClusterEnabled = 0; + gWindowSceneryEyedropperEnabled = false; + window_invalidate(w); + break; + case WIDX_SCENERY_EYEDROPPER_BUTTON: + gWindowSceneryPaintEnabled = 0; + gWindowSceneryClusterEnabled = 0; + gWindowSceneryEyedropperEnabled = !gWindowSceneryEyedropperEnabled; window_invalidate(w); break; case WIDX_SCENERY_BUILD_CLUSTER_BUTTON: + gWindowSceneryPaintEnabled = 0; + gWindowSceneryEyedropperEnabled = false; if (gWindowSceneryClusterEnabled == 1) { gWindowSceneryClusterEnabled = 0; } @@ -774,7 +788,9 @@ static void window_scenery_update(rct_window *w) return; } - if (gWindowSceneryPaintEnabled == 1) { // the repaint scenery tool is active + if (gWindowSceneryEyedropperEnabled) { + gCurrentToolId = 7; + } else if (gWindowSceneryPaintEnabled == 1) { // the repaint scenery tool is active gCurrentToolId = 0x17; } else { uint16 tabIndex = gWindowSceneryActiveTabIndex; @@ -838,6 +854,7 @@ void window_scenery_scrollmousedown(rct_window *w, sint32 scrollIndex, sint32 x, gWindowSceneryTabSelections[tabIndex] = sceneryId; gWindowSceneryPaintEnabled &= 0xFE; + gWindowSceneryEyedropperEnabled = false; audio_play_sound_panned(4, (w->width >> 1) + w->x, 0, 0, 0); w->scenery.hover_counter = -16; gSceneryPlaceCost = MONEY32_UNDEFINED; @@ -913,18 +930,22 @@ void window_scenery_invalidate(rct_window *w) if (gWindowSceneryPaintEnabled == 1) w->pressed_widgets |= (1 << WIDX_SCENERY_REPAINT_SCENERY_BUTTON); - + if (gWindowSceneryEyedropperEnabled) + w->pressed_widgets |= (1 << WIDX_SCENERY_EYEDROPPER_BUTTON); if (gWindowSceneryClusterEnabled == 1) w->pressed_widgets |= (1 << WIDX_SCENERY_BUILD_CLUSTER_BUTTON); window_scenery_widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].type = WWT_EMPTY; + window_scenery_widgets[WIDX_SCENERY_EYEDROPPER_BUTTON].type = WWT_EMPTY; window_scenery_widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].type = WWT_EMPTY; sint16 tabSelectedSceneryId = gWindowSceneryTabSelections[tabIndex]; if (tabSelectedSceneryId != -1) { if (tabSelectedSceneryId < 0x100) { - if (!(gWindowSceneryPaintEnabled & 1)) + if (!(gWindowSceneryPaintEnabled & 1)) { + window_scenery_widgets[WIDX_SCENERY_EYEDROPPER_BUTTON].type = WWT_FLATBTN; window_scenery_widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].type = WWT_FLATBTN; + } rct_scenery_entry* sceneryEntry = get_small_scenery_entry(tabSelectedSceneryId); if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG4) { @@ -1005,9 +1026,11 @@ void window_scenery_invalidate(rct_window *w) window_scenery_widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].left = w->width - 25; window_scenery_widgets[WIDX_SCENERY_REPAINT_SCENERY_BUTTON].left = w->width - 25; + window_scenery_widgets[WIDX_SCENERY_EYEDROPPER_BUTTON].left = w->width - 25; window_scenery_widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].left = w->width - 25; window_scenery_widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].right = w->width - 2; window_scenery_widgets[WIDX_SCENERY_REPAINT_SCENERY_BUTTON].right = w->width - 2; + window_scenery_widgets[WIDX_SCENERY_EYEDROPPER_BUTTON].right = w->width - 2; window_scenery_widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].right = w->width - 2; window_scenery_widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].left = w->width - 19; @@ -1039,6 +1062,8 @@ void window_scenery_paint(rct_window *w, rct_drawpixelinfo *dpi) if (selectedSceneryEntryId == -1) { if (gWindowSceneryPaintEnabled & 1) // repaint coloured scenery tool is on return; + if (gWindowSceneryEyedropperEnabled) + return; selectedSceneryEntryId = gWindowSceneryTabSelections[tabIndex]; @@ -1100,7 +1125,7 @@ void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 sc while ((currentSceneryGlobalId = window_scenery_tab_entries[tabIndex][sceneryTabItemIndex]) != -1) { uint16 tabSelectedSceneryId = gWindowSceneryTabSelections[tabIndex]; - if (gWindowSceneryPaintEnabled == 1) { + if (gWindowSceneryPaintEnabled == 1 || gWindowSceneryEyedropperEnabled) { if (w->scenery.selected_scenery_id == currentSceneryGlobalId) { gfx_fill_rect_inset(dpi, left, top, left + SCENERY_BUTTON_WIDTH - 1, top + SCENERY_BUTTON_HEIGHT - 1, w->colours[1], INSET_RECT_FLAG_FILL_MID_LIGHT); diff --git a/src/openrct2/windows/top_toolbar.c b/src/openrct2/windows/top_toolbar.c index 3f8202cdd3..c004e76ed7 100644 --- a/src/openrct2/windows/top_toolbar.c +++ b/src/openrct2/windows/top_toolbar.c @@ -1000,6 +1000,11 @@ static void repaint_scenery_tool_down(sint16 x, sint16 y, sint16 widgetIndex){ } } +static void scenery_eyedropper_tool_down(sint16 x, sint16 y, sint16 widgetIndex) +{ + +} + /** * * rct2: 0x006E1F34 @@ -1444,6 +1449,9 @@ static void window_top_toolbar_scenery_tool_down(sint16 x, sint16 y, rct_window if (gWindowSceneryPaintEnabled & 1) { repaint_scenery_tool_down(x, y, widgetIndex); return; + } else if (gWindowSceneryEyedropperEnabled) { + scenery_eyedropper_tool_down(x, y, widgetIndex); + return; } sint32 selectedTab = gWindowSceneryTabSelections[gWindowSceneryActiveTabIndex]; @@ -2270,6 +2278,8 @@ static void top_toolbar_tool_update_scenery(sint16 x, sint16 y){ if (gWindowSceneryPaintEnabled) return; + if (gWindowSceneryEyedropperEnabled) + return; sint16 selected_tab = gWindowSceneryTabSelections[gWindowSceneryActiveTabIndex]; @@ -2806,6 +2816,8 @@ static void window_top_toolbar_tool_drag(rct_window* w, sint32 widgetIndex, sint case WIDX_SCENERY: if (gWindowSceneryPaintEnabled & 1) window_top_toolbar_scenery_tool_down(x, y, w, widgetIndex); + if (gWindowSceneryEyedropperEnabled) + window_top_toolbar_scenery_tool_down(x, y, w, widgetIndex); break; } } diff --git a/src/openrct2/world/scenery.c b/src/openrct2/world/scenery.c index 570154659d..9c22faf927 100644 --- a/src/openrct2/world/scenery.c +++ b/src/openrct2/world/scenery.c @@ -35,6 +35,7 @@ uint8 gWindowSceneryRotation; colour_t gWindowSceneryPrimaryColour; colour_t gWindowScenerySecondaryColour; colour_t gWindowSceneryTertiaryColour; +bool gWindowSceneryEyedropperEnabled; rct_map_element *gSceneryMapElement; uint8 gSceneryMapElementType; diff --git a/src/openrct2/world/scenery.h b/src/openrct2/world/scenery.h index 356b886613..5a9dbf7d03 100644 --- a/src/openrct2/world/scenery.h +++ b/src/openrct2/world/scenery.h @@ -235,6 +235,7 @@ extern uint8 gWindowSceneryRotation; extern colour_t gWindowSceneryPrimaryColour; extern colour_t gWindowScenerySecondaryColour; extern colour_t gWindowSceneryTertiaryColour; +extern bool gWindowSceneryEyedropperEnabled; extern rct_map_element *gSceneryMapElement; extern uint8 gSceneryMapElementType;