diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index 67e64987ea..c571268af8 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -56,7 +56,7 @@ uint8 gResearchUncompletedCategories; static bool _researchedRideTypes[RIDE_TYPE_COUNT]; static bool _researchedRideEntries[MAX_RIDE_OBJECTS]; -uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS]; +static bool _researchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS]; bool gSilentResearch = false; @@ -706,24 +706,17 @@ void ride_entry_set_invented(sint32 rideEntryIndex) bool scenery_is_invented(uint16 sceneryItem) { - sint32 quadIndex = sceneryItem >> 5; - sint32 bitIndex = sceneryItem & 0x1F; - bool invented = (gResearchedSceneryItems[quadIndex] & ((uint32) 1 << bitIndex)); - return invented; + return _researchedSceneryItems[sceneryItem]; } void scenery_set_invented(uint16 sceneryItem) { - sint32 quadIndex = sceneryItem >> 5; - sint32 bitIndex = sceneryItem & 0x1F; - gResearchedSceneryItems[quadIndex] |= (uint32) 1 << bitIndex; + _researchedSceneryItems[sceneryItem] = true; } void scenery_set_not_invented(uint16 sceneryItem) { - sint32 quadIndex = sceneryItem >> 5; - sint32 bitIndex = sceneryItem & 0x1F; - gResearchedSceneryItems[quadIndex] &= ~((uint32) 1 << bitIndex); + _researchedSceneryItems[sceneryItem] = false; } bool scenery_group_is_invented(sint32 sgIndex) @@ -754,10 +747,12 @@ bool scenery_group_is_invented(sint32 sgIndex) void set_all_scenery_items_invented() { - for (auto &researchedSceneryItem : gResearchedSceneryItems) - { - researchedSceneryItem = 0xFFFFFFFF; - } + Memory::Set(_researchedSceneryItems, true, sizeof(_researchedSceneryItems)); +} + +void set_all_scenery_items_not_invented() +{ + Memory::Set(_researchedSceneryItems, false, sizeof(_researchedSceneryItems)); } void set_every_ride_type_invented() diff --git a/src/openrct2/management/Research.h b/src/openrct2/management/Research.h index b93c586aca..4d572a35f0 100644 --- a/src/openrct2/management/Research.h +++ b/src/openrct2/management/Research.h @@ -58,12 +58,12 @@ enum #define RESEARCHED_ITEMS_SEPARATOR -1 // Everything before this point and after separator still requires research #define RESEARCHED_ITEMS_END -2 -// Extra end of list entry. Unsure why? +// Extra end of list entry. Leftover from RCT1. #define RESEARCHED_ITEMS_END_2 -3 -#define MAX_RESEARCH_ITEMS 500 -#define MAX_RESEARCHED_SCENERY_ITEMS 56 // Actually 56 * 32 = 1792 -#define MAX_RESEARCHED_TRACK_TYPES 128 +#define MAX_RESEARCH_ITEMS 500 +#define MAX_RESEARCHED_TRACK_TYPES 128 +#define MAX_RESEARCHED_SCENERY_ITEMS 1792 #define RESEARCH_ENTRY_RIDE_MASK 0x10000 @@ -110,7 +110,6 @@ extern rct_research_item gResearchNextItem; extern rct_research_item gResearchItems[MAX_RESEARCH_ITEMS]; extern uint8 gResearchUncompletedCategories; -extern uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS]; extern bool gSilentResearch; void research_reset_items(); @@ -140,6 +139,7 @@ bool track_piece_is_available_for_ride_type(uint8 rideType, sint32 trackType); bool scenery_group_is_invented(sint32 sgIndex); bool scenery_is_invented(uint16 sceneryItem); void set_all_scenery_items_invented(); +void set_all_scenery_items_not_invented(); void set_every_ride_type_invented(); void set_every_ride_type_not_invented(); void set_every_ride_entry_invented(); diff --git a/src/openrct2/rct2/RCT2.h b/src/openrct2/rct2/RCT2.h index b645b86cb6..600d2d1406 100644 --- a/src/openrct2/rct2/RCT2.h +++ b/src/openrct2/rct2/RCT2.h @@ -22,20 +22,21 @@ #include "../common.h" #include "../rct12/RCT12.h" -#define RCT2_MAX_STAFF 200 -#define RCT2_MAX_BANNERS_IN_PARK 250 -#define RCT2_MAX_VEHICLES_PER_RIDE 32 -#define RCT2_MAX_CARS_PER_TRAIN 32 -#define RCT2_MAX_CATEGORIES_PER_RIDE 2 -#define RCT2_MAX_RIDE_TYPES_PER_RIDE_ENTRY 3 -#define RCT2_MAX_VEHICLES_PER_RIDE_ENTRY 4 -#define RCT2_DOWNTIME_HISTORY_SIZE 8 -#define RCT2_CUSTOMER_HISTORY_SIZE 10 -#define RCT2_MAX_SPRITES 10000 -#define RCT2_MAX_TILE_ELEMENTS 0x30000 -#define RCT2_MAX_ANIMATED_OBJECTS 2000 -#define RCT2_MAX_RESEARCHED_RIDE_TYPE_QUADS 8 // With 32 bits per uint32, this means there is room for 256 types. -#define RCT2_MAX_RESEARCHED_RIDE_ENTRY_QUADS 8 // With 32 bits per uint32, this means there is room for 256 entries. +#define RCT2_MAX_STAFF 200 +#define RCT2_MAX_BANNERS_IN_PARK 250 +#define RCT2_MAX_VEHICLES_PER_RIDE 32 +#define RCT2_MAX_CARS_PER_TRAIN 32 +#define RCT2_MAX_CATEGORIES_PER_RIDE 2 +#define RCT2_MAX_RIDE_TYPES_PER_RIDE_ENTRY 3 +#define RCT2_MAX_VEHICLES_PER_RIDE_ENTRY 4 +#define RCT2_DOWNTIME_HISTORY_SIZE 8 +#define RCT2_CUSTOMER_HISTORY_SIZE 10 +#define RCT2_MAX_SPRITES 10000 +#define RCT2_MAX_TILE_ELEMENTS 0x30000 +#define RCT2_MAX_ANIMATED_OBJECTS 2000 +#define RCT2_MAX_RESEARCHED_RIDE_TYPE_QUADS 8 // With 32 bits per uint32, this means there is room for 256 types. +#define RCT2_MAX_RESEARCHED_RIDE_ENTRY_QUADS 8 // With 32 bits per uint32, this means there is room for 256 entries. +#define RCT2_MAX_RESEARCHED_SCENERY_ITEM_QUADS 56 // With 32 bits per uint32, this means there is room for 1792 items. typedef struct rct2_install_info { diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index 814c7aac7f..3488c58d4c 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -238,7 +238,7 @@ void S6Exporter::Export() _s6.mechanic_colour = gStaffMechanicColour; _s6.security_colour = gStaffSecurityColour; - memcpy(_s6.researched_scenery_items, gResearchedSceneryItems, sizeof(_s6.researched_scenery_items)); + ExportResearchedSceneryItems(); _s6.park_rating = gParkRating; @@ -683,6 +683,21 @@ void S6Exporter::ExportResearchedRideEntries() } } +void S6Exporter::ExportResearchedSceneryItems() +{ + Memory::Set(_s6.researched_scenery_items, false, sizeof(_s6.researched_scenery_items)); + + for (uint16 sceneryEntryIndex = 0; sceneryEntryIndex < RCT2_MAX_RESEARCHED_SCENERY_ITEM_QUADS; sceneryEntryIndex++) + { + if (scenery_is_invented(sceneryEntryIndex)) + { + sint32 quadIndex = sceneryEntryIndex >> 5; + sint32 bitIndex = sceneryEntryIndex & 0x1F; + _s6.researched_scenery_items[quadIndex] |= (uint32) 1 << bitIndex; + } + } +} + extern "C" { enum { diff --git a/src/openrct2/rct2/S6Exporter.h b/src/openrct2/rct2/S6Exporter.h index 138559c4b2..6bfb6105f0 100644 --- a/src/openrct2/rct2/S6Exporter.h +++ b/src/openrct2/rct2/S6Exporter.h @@ -53,6 +53,7 @@ private: static uint32 GetLoanHash(money32 initialCash, money32 bankLoan, uint32 maxBankLoan); void ExportResearchedRideTypes(); void ExportResearchedRideEntries(); + void ExportResearchedSceneryItems(); }; #endif diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 36e2eec6bc..481bdf925b 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -236,6 +236,7 @@ public: // pad_01357400 ImportResearchedRideTypes(); ImportResearchedRideEntries(); + ImportResearchedSceneryItems(); // _s6.researched_track_types_a // _s6.researched_track_types_b @@ -256,7 +257,7 @@ public: gStaffMechanicColour = _s6.mechanic_colour; gStaffSecurityColour = _s6.security_colour; - memcpy(gResearchedSceneryItems, _s6.researched_scenery_items, sizeof(_s6.researched_scenery_items)); + ImportResearchedSceneryItems(); gParkRating = _s6.park_rating; @@ -708,7 +709,8 @@ public: sint32 bitIndex = rideType & 0x1F; bool invented = (_s6.researched_ride_types[quadIndex] & ((uint32) 1 << bitIndex)); - ride_type_set_invented(rideType); + if (invented) + ride_type_set_invented(rideType); } } @@ -722,9 +724,24 @@ public: sint32 bitIndex = rideEntryIndex & 0x1F; bool invented = (_s6.researched_ride_entries[quadIndex] & ((uint32) 1 << bitIndex)); - ride_entry_set_invented(rideEntryIndex); + if (invented) + ride_entry_set_invented(rideEntryIndex); } + } + void ImportResearchedSceneryItems() + { + set_all_scenery_items_not_invented(); + + for (uint16 sceneryEntryIndex = 0; sceneryEntryIndex < RCT2_MAX_RESEARCHED_SCENERY_ITEM_QUADS; sceneryEntryIndex++) + { + sint32 quadIndex = sceneryEntryIndex >> 5; + sint32 bitIndex = sceneryEntryIndex & 0x1F; + bool invented = (_s6.researched_scenery_items[quadIndex] & ((uint32) 1 << bitIndex)); + + if (invented) + scenery_set_invented(sceneryEntryIndex); + } } void Initialise()