Refactor research - spike 1

This involves refactoring gResearchedRideTypes and gResearchedRideEntries
and the functions involved.

Also renames some functions in order to better express what they do.
This commit is contained in:
Michael Steenbeek 2018-01-02 20:31:48 +01:00
parent c7417e11a4
commit 31bf792538
10 changed files with 118 additions and 71 deletions

View File

@ -144,7 +144,7 @@ rct_window * window_editor_bottom_toolbar_open()
(1 << WIDX_NEXT_IMAGE); (1 << WIDX_NEXT_IMAGE);
window_init_scroll_widgets(window); window_init_scroll_widgets(window);
reset_researched_scenery_items(); set_all_scenery_items_invented();
return window; return window;
} }
@ -165,7 +165,7 @@ void window_editor_bottom_toolbar_jump_back_to_object_selection() {
*/ */
void window_editor_bottom_toolbar_jump_back_to_landscape_editor() { void window_editor_bottom_toolbar_jump_back_to_landscape_editor() {
window_close_all(); window_close_all();
reset_researched_scenery_items(); set_all_scenery_items_invented();
scenery_set_default_placement_configuration(); scenery_set_default_placement_configuration();
gS6Info.editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; gS6Info.editor_step = EDITOR_STEP_LANDSCAPE_EDITOR;
context_open_window(WC_MAP); context_open_window(WC_MAP);
@ -227,12 +227,12 @@ void window_editor_bottom_toolbar_jump_forward_from_object_selection()
return; return;
if (gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) { if (gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) {
reset_researched_ride_types_and_entries(); set_every_ride_entry_invented();
context_open_window(WC_CONSTRUCT_RIDE); context_open_window(WC_CONSTRUCT_RIDE);
gS6Info.editor_step = EDITOR_STEP_ROLLERCOASTER_DESIGNER; gS6Info.editor_step = EDITOR_STEP_ROLLERCOASTER_DESIGNER;
gfx_invalidate_screen(); gfx_invalidate_screen();
} else { } else {
reset_researched_scenery_items(); set_all_scenery_items_invented();
scenery_set_default_placement_configuration(); scenery_set_default_placement_configuration();
gS6Info.editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; gS6Info.editor_step = EDITOR_STEP_LANDSCAPE_EDITOR;
context_open_window(WC_MAP); context_open_window(WC_MAP);

View File

@ -1234,7 +1234,7 @@ static sint32 get_object_from_object_selection(uint8 object_type, sint32 y)
*/ */
static void window_editor_object_selection_manage_tracks() static void window_editor_object_selection_manage_tracks()
{ {
reset_researched_ride_types_and_entries(); set_every_ride_entry_invented();
gS6Info.editor_step = EDITOR_STEP_TRACK_DESIGNS_MANAGER; gS6Info.editor_step = EDITOR_STEP_TRACK_DESIGNS_MANAGER;

View File

@ -34,6 +34,7 @@
#include "NewsItem.h" #include "NewsItem.h"
#include "Finance.h" #include "Finance.h"
#include "Research.h" #include "Research.h"
#include "../core/Memory.hpp"
const sint32 _researchRate[] = {0, 160, 250, 400}; const sint32 _researchRate[] = {0, 160, 250, 400};
@ -53,8 +54,8 @@ rct_research_item gResearchItems[MAX_RESEARCH_ITEMS];
// 0x00EE787C // 0x00EE787C
uint8 gResearchUncompletedCategories; uint8 gResearchUncompletedCategories;
uint32 gResearchedRideTypes[MAX_RESEARCHED_RIDE_TYPES]; bool gResearchedRideTypes[RIDE_TYPE_COUNT];
uint32 gResearchedRideEntries[MAX_RESEARCHED_RIDE_ENTRIES]; bool gResearchedRideEntries[MAX_RIDE_OBJECTS];
uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS]; uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS];
bool gSilentResearch = false; bool gSilentResearch = false;
@ -413,15 +414,7 @@ void research_reset_current_item()
ebp->category = cat; ebp->category = cat;
} }
for (auto &researchedRideType : gResearchedRideTypes) set_every_ride_entry_not_invented();
{
researchedRideType = 0;
}
for (auto &researchedRideEntry : gResearchedRideEntries)
{
researchedRideEntry = 0;
}
for (auto &researchedSceneryItem : gResearchedSceneryItems) for (auto &researchedSceneryItem : gResearchedSceneryItems)
{ {
@ -756,18 +749,12 @@ void research_insert_scenery_group_entry(uint8 entryIndex, bool researched)
bool ride_type_is_invented(sint32 rideType) bool ride_type_is_invented(sint32 rideType)
{ {
sint32 quadIndex = rideType >> 5; return gResearchedRideTypes[rideType];
sint32 bitIndex = rideType & 0x1F;
bool invented = (gResearchedRideTypes[quadIndex] & ((uint32) 1 << bitIndex));
return invented;
} }
bool ride_entry_is_invented(sint32 rideEntryIndex) bool ride_entry_is_invented(sint32 rideEntryIndex)
{ {
sint32 quadIndex = rideEntryIndex >> 5; return gResearchedRideEntries[rideEntryIndex];
sint32 bitIndex = rideEntryIndex & 0x1F;
bool invented = (gResearchedRideEntries[quadIndex] & ((uint32) 1 << bitIndex));
return invented;
} }
bool track_piece_is_available_for_ride_type(uint8 rideType, sint32 trackType) bool track_piece_is_available_for_ride_type(uint8 rideType, sint32 trackType)
@ -777,16 +764,12 @@ bool track_piece_is_available_for_ride_type(uint8 rideType, sint32 trackType)
static void ride_type_set_invented(sint32 rideType) static void ride_type_set_invented(sint32 rideType)
{ {
sint32 quadIndex = rideType >> 5; gResearchedRideTypes[rideType] = true;
sint32 bitIndex = rideType & 0x1F;
gResearchedRideTypes[quadIndex] |= (uint32) 1 << bitIndex;
} }
static void ride_entry_set_invented(sint32 rideEntryIndex) static void ride_entry_set_invented(sint32 rideEntryIndex)
{ {
sint32 quadIndex = rideEntryIndex >> 5; gResearchedRideEntries[rideEntryIndex] = true;
sint32 bitIndex = rideEntryIndex & 0x1F;
gResearchedRideEntries[quadIndex] |= (uint32) 1 << bitIndex;
} }
bool scenery_is_invented(uint16 sceneryItem) bool scenery_is_invented(uint16 sceneryItem)
@ -823,7 +806,7 @@ bool scenery_group_is_invented(sint32 sgIndex)
return invented; return invented;
} }
void reset_researched_scenery_items() void set_all_scenery_items_invented()
{ {
for (auto &researchedSceneryItem : gResearchedSceneryItems) for (auto &researchedSceneryItem : gResearchedSceneryItems)
{ {
@ -831,18 +814,16 @@ void reset_researched_scenery_items()
} }
} }
void reset_researched_ride_types_and_entries() void set_every_ride_entry_invented()
{ {
// Iteration endpoint used to be 4 for unknown reasons, likely a mistake Memory::Set(gResearchedRideTypes, true, sizeof(gResearchedRideTypes));
for (auto &researchedRideType : gResearchedRideTypes) Memory::Set(gResearchedRideEntries, true, sizeof(gResearchedRideEntries));
{ }
researchedRideType = 0xFFFFFFFF;
}
for (auto &researchedRideEntry : gResearchedRideEntries) void set_every_ride_entry_not_invented()
{ {
researchedRideEntry = 0xFFFFFFFF; Memory::Set(gResearchedRideTypes, false, sizeof(gResearchedRideTypes));
} Memory::Set(gResearchedRideEntries, false, sizeof(gResearchedRideEntries));
} }
/** /**
@ -995,4 +976,4 @@ void research_fix()
research_insert_scenery_group_entry(i, true); research_insert_scenery_group_entry(i, true);
} }
} }
} }

View File

@ -17,6 +17,8 @@
#pragma once #pragma once
#include "../common.h" #include "../common.h"
#include "../object/ObjectLimits.h"
#include "../ride/Ride.h"
typedef struct rct_ride_entry rct_ride_entry; typedef struct rct_ride_entry rct_ride_entry;
@ -43,8 +45,6 @@ enum{
#define MAX_RESEARCH_ITEMS 500 #define MAX_RESEARCH_ITEMS 500
#define MAX_RESEARCHED_SCENERY_ITEMS 56 #define MAX_RESEARCHED_SCENERY_ITEMS 56
#define MAX_RESEARCHED_RIDE_TYPES 8 // Really 256, since there are 32 bits per uint32.
#define MAX_RESEARCHED_RIDE_ENTRIES 8 // Really 256, since there are 32 bits per uint32.
#define MAX_RESEARCHED_TRACK_TYPES 128 #define MAX_RESEARCHED_TRACK_TYPES 128
#define RESEARCH_ENTRY_RIDE_MASK 0x10000 #define RESEARCH_ENTRY_RIDE_MASK 0x10000
@ -92,8 +92,8 @@ extern uint32 gResearchNextItem;
extern rct_research_item gResearchItems[MAX_RESEARCH_ITEMS]; extern rct_research_item gResearchItems[MAX_RESEARCH_ITEMS];
extern uint8 gResearchUncompletedCategories; extern uint8 gResearchUncompletedCategories;
extern uint32 gResearchedRideTypes[MAX_RESEARCHED_RIDE_TYPES]; extern bool gResearchedRideTypes[RIDE_TYPE_COUNT];
extern uint32 gResearchedRideEntries[MAX_RESEARCHED_RIDE_ENTRIES]; extern bool gResearchedRideEntries[MAX_RIDE_OBJECTS];
extern uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS]; extern uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS];
extern bool gSilentResearch; extern bool gSilentResearch;
@ -120,8 +120,9 @@ bool ride_entry_is_invented(sint32 rideEntryIndex);
bool track_piece_is_available_for_ride_type(uint8 rideType, sint32 trackType); bool track_piece_is_available_for_ride_type(uint8 rideType, sint32 trackType);
bool scenery_group_is_invented(sint32 sgIndex); bool scenery_group_is_invented(sint32 sgIndex);
bool scenery_is_invented(uint16 sceneryItem); bool scenery_is_invented(uint16 sceneryItem);
void reset_researched_scenery_items(); void set_all_scenery_items_invented();
void reset_researched_ride_types_and_entries(); void set_every_ride_entry_invented();
void set_every_ride_entry_not_invented();
rct_string_id research_item_get_name(uint32 researchItem); rct_string_id research_item_get_name(uint32 researchItem);
uint8 research_get_ride_base_type(sint32 researchItem); uint8 research_get_ride_base_type(sint32 researchItem);
rct_string_id research_get_friendly_base_ride_type_name(uint8 trackType, rct_ride_entry * rideEntry); rct_string_id research_get_friendly_base_ride_type_name(uint8 trackType, rct_ride_entry * rideEntry);

View File

@ -22,19 +22,21 @@
#include "common.h" #include "common.h"
#include "rct12.h" #include "rct12.h"
#define RCT2_MAX_RIDES_IN_PARK 255 #define RCT2_MAX_RIDES_IN_PARK 255
#define RCT2_MAX_STAFF 200 #define RCT2_MAX_STAFF 200
#define RCT2_MAX_BANNERS_IN_PARK 250 #define RCT2_MAX_BANNERS_IN_PARK 250
#define RCT2_MAX_VEHICLES_PER_RIDE 32 #define RCT2_MAX_VEHICLES_PER_RIDE 32
#define RCT2_MAX_CARS_PER_TRAIN 32 #define RCT2_MAX_CARS_PER_TRAIN 32
#define RCT2_MAX_CATEGORIES_PER_RIDE 2 #define RCT2_MAX_CATEGORIES_PER_RIDE 2
#define RCT2_MAX_RIDE_TYPES_PER_RIDE_ENTRY 3 #define RCT2_MAX_RIDE_TYPES_PER_RIDE_ENTRY 3
#define RCT2_MAX_VEHICLES_PER_RIDE_ENTRY 4 #define RCT2_MAX_VEHICLES_PER_RIDE_ENTRY 4
#define RCT2_DOWNTIME_HISTORY_SIZE 8 #define RCT2_DOWNTIME_HISTORY_SIZE 8
#define RCT2_CUSTOMER_HISTORY_SIZE 10 #define RCT2_CUSTOMER_HISTORY_SIZE 10
#define RCT2_MAX_SPRITES 10000 #define RCT2_MAX_SPRITES 10000
#define RCT2_MAX_TILE_ELEMENTS 0x30000 #define RCT2_MAX_TILE_ELEMENTS 0x30000
#define RCT2_MAX_ANIMATED_OBJECTS 2000 #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.
typedef struct rct2_install_info { typedef struct rct2_install_info {

View File

@ -38,6 +38,7 @@
#include "../management/NewsItem.h" #include "../management/NewsItem.h"
#include "../management/Research.h" #include "../management/Research.h"
#include "../object/Object.h" #include "../object/Object.h"
#include "../object/ObjectLimits.h"
#include "../OpenRCT2.h" #include "../OpenRCT2.h"
#include "../peep/Staff.h" #include "../peep/Staff.h"
#include "../ride/Ride.h" #include "../ride/Ride.h"
@ -216,10 +217,11 @@ void S6Exporter::Export()
_s6.guest_count_change_modifier = gGuestChangeModifier; _s6.guest_count_change_modifier = gGuestChangeModifier;
_s6.current_research_level = gResearchFundingLevel; _s6.current_research_level = gResearchFundingLevel;
// pad_01357400 // pad_01357400
memcpy(_s6.researched_ride_types, gResearchedRideTypes, sizeof(_s6.researched_ride_types)); ExportResearchedRideTypes();
memcpy(_s6.researched_ride_entries, gResearchedRideEntries, sizeof(_s6.researched_ride_entries)); ExportResearchedRideEntries();
// Not used by OpenRCT2 any more, but left in to keep RCT2 export working. // Not used by OpenRCT2 any more, but left in to keep RCT2 export working.
for (uint8 i = 0; i < Util::CountOf(RideTypePossibleTrackConfigurations); i++) { for (uint8 i = 0; i < Util::CountOf(RideTypePossibleTrackConfigurations); i++)
{
researchedTrackPiecesA[i] = (RideTypePossibleTrackConfigurations[i] ) & 0xFFFFFFFFULL; researchedTrackPiecesA[i] = (RideTypePossibleTrackConfigurations[i] ) & 0xFFFFFFFFULL;
researchedTrackPiecesB[i] = (RideTypePossibleTrackConfigurations[i] >> 32ULL) & 0xFFFFFFFFULL; researchedTrackPiecesB[i] = (RideTypePossibleTrackConfigurations[i] >> 32ULL) & 0xFFFFFFFFULL;
} }
@ -652,6 +654,36 @@ void S6Exporter::ExportRide(rct2_ride * dst, const Ride * src)
// pad_208[0x58]; // pad_208[0x58];
} }
void S6Exporter::ExportResearchedRideTypes()
{
Memory::Set(_s6.researched_ride_types, false, sizeof(_s6.researched_ride_types));
for (sint32 rideType = 0; rideType < RIDE_TYPE_COUNT; rideType++)
{
if (ride_type_is_invented(rideType))
{
sint32 quadIndex = rideType >> 5;
sint32 bitIndex = rideType & 0x1F;
_s6.researched_ride_types[quadIndex] |= (uint32) 1 << bitIndex;
}
}
}
void S6Exporter::ExportResearchedRideEntries()
{
Memory::Set(_s6.researched_ride_entries, false, sizeof(_s6.researched_ride_entries));
for (sint32 rideEntryIndex = 0; rideEntryIndex < MAX_RIDE_OBJECTS; rideEntryIndex++)
{
if (ride_entry_is_invented(rideEntryIndex))
{
sint32 quadIndex = rideEntryIndex >> 5;
sint32 bitIndex = rideEntryIndex & 0x1F;
_s6.researched_ride_entries[quadIndex] |= (uint32) 1 << bitIndex;
}
}
}
extern "C" extern "C"
{ {
enum { enum {

View File

@ -51,6 +51,8 @@ private:
void Save(IStream * stream, bool isScenario); void Save(IStream * stream, bool isScenario);
static uint32 GetLoanHash(money32 initialCash, money32 bankLoan, uint32 maxBankLoan); static uint32 GetLoanHash(money32 initialCash, money32 bankLoan, uint32 maxBankLoan);
void ExportResearchedRideTypes();
void ExportResearchedRideEntries();
}; };
#endif #endif

View File

@ -22,9 +22,9 @@
#include "../core/String.hpp" #include "../core/String.hpp"
#include "../management/Award.h" #include "../management/Award.h"
#include "../network/network.h" #include "../network/network.h"
#include "../object/ObjectLimits.h"
#include "../object/ObjectManager.h" #include "../object/ObjectManager.h"
#include "../object/ObjectRepository.h" #include "../object/ObjectRepository.h"
#include "../object/ObjectManager.h"
#include "../ParkImporter.h" #include "../ParkImporter.h"
#include "../rct12/SawyerChunkReader.h" #include "../rct12/SawyerChunkReader.h"
#include "../rct12/SawyerEncoding.h" #include "../rct12/SawyerEncoding.h"
@ -235,8 +235,8 @@ public:
gGuestChangeModifier = _s6.guest_count_change_modifier; gGuestChangeModifier = _s6.guest_count_change_modifier;
gResearchFundingLevel = _s6.current_research_level; gResearchFundingLevel = _s6.current_research_level;
// pad_01357400 // pad_01357400
memcpy(gResearchedRideTypes, _s6.researched_ride_types, sizeof(_s6.researched_ride_types)); ImportResearchedRideTypes();
memcpy(gResearchedRideEntries, _s6.researched_ride_entries, sizeof(_s6.researched_ride_entries)); ImportResearchedRideEntries();
// _s6.researched_track_types_a // _s6.researched_track_types_a
// _s6.researched_track_types_b // _s6.researched_track_types_b
@ -699,6 +699,35 @@ public:
// pad_208[0x58]; // pad_208[0x58];
} }
void ImportResearchedRideTypes()
{
Memory::Set(gResearchedRideTypes, false, sizeof(gResearchedRideTypes));
for (sint32 rideType = 0; rideType < RIDE_TYPE_COUNT; rideType++)
{
sint32 quadIndex = rideType >> 5;
sint32 bitIndex = rideType & 0x1F;
bool invented = (_s6.researched_ride_types[quadIndex] & ((uint32) 1 << bitIndex));
gResearchedRideTypes[rideType] = invented;
}
}
void ImportResearchedRideEntries()
{
Memory::Set(gResearchedRideEntries, false, sizeof(gResearchedRideEntries));
for (sint32 rideEntryIndex = 0; rideEntryIndex < MAX_RIDE_OBJECTS; rideEntryIndex++)
{
sint32 quadIndex = rideEntryIndex >> 5;
sint32 bitIndex = rideEntryIndex & 0x1F;
bool invented = (_s6.researched_ride_entries[quadIndex] & ((uint32) 1 << bitIndex));
gResearchedRideEntries[rideEntryIndex] = invented;
}
}
void Initialise() void Initialise()
{ {
game_init_all(_s6.map_size); game_init_all(_s6.map_size);

View File

@ -131,8 +131,8 @@ typedef struct rct_s6_data {
uint8 guest_count_change_modifier; uint8 guest_count_change_modifier;
uint8 current_research_level; uint8 current_research_level;
uint8 pad_01357400[4]; uint8 pad_01357400[4];
uint32 researched_ride_types[8]; uint32 researched_ride_types[RCT2_MAX_RESEARCHED_RIDE_TYPE_QUADS];
uint32 researched_ride_entries[8]; uint32 researched_ride_entries[RCT2_MAX_RESEARCHED_RIDE_ENTRY_QUADS];
uint32 researched_track_types_a[128]; uint32 researched_track_types_a[128];
uint32 researched_track_types_b[128]; uint32 researched_track_types_b[128];

View File

@ -17,6 +17,7 @@
#include "../Cheats.h" #include "../Cheats.h"
#include "../config/Config.h" #include "../config/Config.h"
#include "../core/Math.hpp" #include "../core/Math.hpp"
#include "../core/Memory.hpp"
#include "../core/Util.hpp" #include "../core/Util.hpp"
#include "../Game.h" #include "../Game.h"
#include "../interface/colour.h" #include "../interface/colour.h"
@ -108,10 +109,9 @@ void park_init()
research_reset_items(); research_reset_items();
finance_init(); finance_init();
for (i = 0; i < 2; i++) Memory::Set(gResearchedRideTypes, false, sizeof(gResearchedRideTypes));
gResearchedRideTypes[i] = 0;
reset_researched_scenery_items(); set_all_scenery_items_invented();
gParkEntranceFee = MONEY(10, 00); gParkEntranceFee = MONEY(10, 00);
gPeepSpawns[0].x = PEEP_SPAWN_UNDEFINED; gPeepSpawns[0].x = PEEP_SPAWN_UNDEFINED;