1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-21 22:13:07 +01:00

Refactor gResearchedSceneryItems

This commit is contained in:
Michael Steenbeek
2018-01-10 13:55:30 +01:00
parent d2de1a4a95
commit b11f59ba6c
6 changed files with 67 additions and 38 deletions

View File

@@ -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()

View File

@@ -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();

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -53,6 +53,7 @@ private:
static uint32 GetLoanHash(money32 initialCash, money32 bankLoan, uint32 maxBankLoan);
void ExportResearchedRideTypes();
void ExportResearchedRideEntries();
void ExportResearchedSceneryItems();
};
#endif

View File

@@ -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()