From 3251af4f30db015294cf74cda1dfcfc8e07c15e2 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 19 Nov 2017 16:03:09 +0000 Subject: [PATCH] Refactor entertainer invented logic Remove hard dependency on scenery window by calling a new is scenery set invented function. I don't think this the performance is any worse as it called init_scenery anyway for every call to get_available_entertainers. --- src/openrct2-ui/windows/Scenery.cpp | 4 ++++ src/openrct2/management/Research.cpp | 26 ++++++++++++++++++++++++++ src/openrct2/management/Research.h | 1 + src/openrct2/peep/Staff.cpp | 4 +--- src/openrct2/windows/_legacy.c | 3 --- src/openrct2/world/scenery.h | 4 ---- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/openrct2-ui/windows/Scenery.cpp b/src/openrct2-ui/windows/Scenery.cpp index 05cff2d917..7043b99077 100644 --- a/src/openrct2-ui/windows/Scenery.cpp +++ b/src/openrct2-ui/windows/Scenery.cpp @@ -33,6 +33,7 @@ #define WINDOW_SCENERY_HEIGHT 180 #define SCENERY_BUTTON_WIDTH 66 #define SCENERY_BUTTON_HEIGHT 80 +#define SCENERY_WINDOW_TABS (MAX_SCENERY_GROUP_OBJECTS + 1) // The + 1 is for the 'Miscellaneous' tab enum { WINDOW_SCENERY_TAB_1, @@ -180,6 +181,9 @@ static rct_widget window_scenery_widgets[] = { void window_scenery_update_scroll(rct_window *w); +// rct2: 0x00F64F2C +static sint16 window_scenery_tab_entries[SCENERY_WINDOW_TABS][SCENERY_ENTRIES_BY_TAB + 1]; + /** * Was part of 0x006DFA00 * The same code repeated five times for every scenery entry type diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index bc38234262..120188ad03 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -817,6 +817,32 @@ bool scenery_is_invented(uint16 sceneryItem) return invented; } +bool scenery_set_is_invented(sint32 scenerySetIndex) +{ + auto invented = false; + const auto scenerySetEntry = get_scenery_group_entry(scenerySetIndex); + if (scenerySetEntry != nullptr && scenerySetEntry->entry_count > 0) + { + if (gCheatsIgnoreResearchStatus) + { + invented = true; + } + else + { + for (auto i = 0; i < scenerySetEntry->entry_count; i++) + { + auto sceneryEntryIndex = scenerySetEntry->scenery_entries[i]; + if (scenery_is_invented(sceneryEntryIndex)) + { + invented = true; + break; + } + } + } + } + return invented; +} + void reset_researched_scenery_items() { for (sint32 i = 0; i < MAX_RESEARCHED_SCENERY_ITEMS; i++) diff --git a/src/openrct2/management/Research.h b/src/openrct2/management/Research.h index eefeaa60e0..77cef7dbfc 100644 --- a/src/openrct2/management/Research.h +++ b/src/openrct2/management/Research.h @@ -118,6 +118,7 @@ void research_insert_scenery_group_entry(uint8 entryIndex, bool researched); bool ride_type_is_invented(sint32 rideType); bool ride_entry_is_invented(sint32 rideEntryIndex); bool track_piece_is_available_for_ride_type(uint8 rideType, sint32 trackType); +bool scenery_set_is_invented(sint32 scenerySetIndex); bool scenery_is_invented(uint16 sceneryItem); void reset_researched_scenery_items(); void reset_researched_ride_types_and_entries(); diff --git a/src/openrct2/peep/Staff.cpp b/src/openrct2/peep/Staff.cpp index c0814a24fe..3da6c4b318 100644 --- a/src/openrct2/peep/Staff.cpp +++ b/src/openrct2/peep/Staff.cpp @@ -1656,12 +1656,10 @@ bool staff_set_colour(uint8 staffType, colour_t value) uint32 staff_get_available_entertainer_costumes() { - init_scenery(); - uint32 entertainerCostumes = 0; for (sint32 i = 0; i < MAX_SCENERY_GROUP_OBJECTS; i++) { - if (window_scenery_tab_entries[i][0] != -1) + if (scenery_set_is_invented(i)) { rct_scenery_set_entry * scenery_entry = get_scenery_group_entry(i); entertainerCostumes |= scenery_entry->entertainer_costumes; diff --git a/src/openrct2/windows/_legacy.c b/src/openrct2/windows/_legacy.c index f63b390366..d5df507c0c 100644 --- a/src/openrct2/windows/_legacy.c +++ b/src/openrct2/windows/_legacy.c @@ -77,9 +77,6 @@ const rct_object_entry DefaultSelectedObjects[26] = { { 0x00000087, { "SCGWATER" }, 0 } // Water Feature Theming }; -// rct2: 0x00F64F2C -sint16 window_scenery_tab_entries[SCENERY_WINDOW_TABS][SCENERY_ENTRIES_BY_TAB + 1]; - void game_command_callback_pickup_guest(sint32 eax, sint32 ebx, sint32 ecx, sint32 edx, sint32 esi, sint32 edi, sint32 ebp) { switch (ecx) diff --git a/src/openrct2/world/scenery.h b/src/openrct2/world/scenery.h index da417b93ae..fda379f668 100644 --- a/src/openrct2/world/scenery.h +++ b/src/openrct2/world/scenery.h @@ -32,8 +32,6 @@ #define SCENERY_PATH_SCENERY_ID_MIN 0x100 #define SCENERY_PATH_SCENERY_ID_MAX 0x10F -#define SCENERY_WINDOW_TABS 20 // (MAX_SCENERY_GROUP_OBJECTS + 1). The + 1 is for the 'Miscellaneous' tab - #pragma pack(push, 1) typedef struct rct_small_scenery_entry { uint32 flags; // 0x06 @@ -297,8 +295,6 @@ extern uint8 gSceneryGroundFlags; extern const LocationXY8 ScenerySubTileOffsets[]; -extern sint16 window_scenery_tab_entries[SCENERY_WINDOW_TABS][SCENERY_ENTRIES_BY_TAB + 1]; - extern money32 gClearSceneryCost; void init_scenery();