From 31bf792538bdc9a6c59a07c23c7b01112047d6bc Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Tue, 2 Jan 2018 20:31:48 +0100 Subject: [PATCH] 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. --- .../windows/EditorBottomToolbar.cpp | 8 +-- .../windows/EditorObjectSelection.cpp | 2 +- src/openrct2/management/Research.cpp | 55 ++++++------------- src/openrct2/management/Research.h | 13 +++-- src/openrct2/rct2.h | 26 +++++---- src/openrct2/rct2/S6Exporter.cpp | 38 ++++++++++++- src/openrct2/rct2/S6Exporter.h | 2 + src/openrct2/rct2/S6Importer.cpp | 35 +++++++++++- src/openrct2/scenario/Scenario.h | 4 +- src/openrct2/world/Park.cpp | 6 +- 10 files changed, 118 insertions(+), 71 deletions(-) diff --git a/src/openrct2-ui/windows/EditorBottomToolbar.cpp b/src/openrct2-ui/windows/EditorBottomToolbar.cpp index 9e443f5f81..6f30b99e1e 100644 --- a/src/openrct2-ui/windows/EditorBottomToolbar.cpp +++ b/src/openrct2-ui/windows/EditorBottomToolbar.cpp @@ -144,7 +144,7 @@ rct_window * window_editor_bottom_toolbar_open() (1 << WIDX_NEXT_IMAGE); window_init_scroll_widgets(window); - reset_researched_scenery_items(); + set_all_scenery_items_invented(); 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() { window_close_all(); - reset_researched_scenery_items(); + set_all_scenery_items_invented(); scenery_set_default_placement_configuration(); gS6Info.editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; context_open_window(WC_MAP); @@ -227,12 +227,12 @@ void window_editor_bottom_toolbar_jump_forward_from_object_selection() return; if (gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) { - reset_researched_ride_types_and_entries(); + set_every_ride_entry_invented(); context_open_window(WC_CONSTRUCT_RIDE); gS6Info.editor_step = EDITOR_STEP_ROLLERCOASTER_DESIGNER; gfx_invalidate_screen(); } else { - reset_researched_scenery_items(); + set_all_scenery_items_invented(); scenery_set_default_placement_configuration(); gS6Info.editor_step = EDITOR_STEP_LANDSCAPE_EDITOR; context_open_window(WC_MAP); diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index eab0648234..9a11554ba9 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -1234,7 +1234,7 @@ static sint32 get_object_from_object_selection(uint8 object_type, sint32 y) */ 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; diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index 830251a150..1d85e937a1 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -34,6 +34,7 @@ #include "NewsItem.h" #include "Finance.h" #include "Research.h" +#include "../core/Memory.hpp" const sint32 _researchRate[] = {0, 160, 250, 400}; @@ -53,8 +54,8 @@ rct_research_item gResearchItems[MAX_RESEARCH_ITEMS]; // 0x00EE787C uint8 gResearchUncompletedCategories; -uint32 gResearchedRideTypes[MAX_RESEARCHED_RIDE_TYPES]; -uint32 gResearchedRideEntries[MAX_RESEARCHED_RIDE_ENTRIES]; +bool gResearchedRideTypes[RIDE_TYPE_COUNT]; +bool gResearchedRideEntries[MAX_RIDE_OBJECTS]; uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS]; bool gSilentResearch = false; @@ -413,15 +414,7 @@ void research_reset_current_item() ebp->category = cat; } - for (auto &researchedRideType : gResearchedRideTypes) - { - researchedRideType = 0; - } - - for (auto &researchedRideEntry : gResearchedRideEntries) - { - researchedRideEntry = 0; - } + set_every_ride_entry_not_invented(); 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) { - sint32 quadIndex = rideType >> 5; - sint32 bitIndex = rideType & 0x1F; - bool invented = (gResearchedRideTypes[quadIndex] & ((uint32) 1 << bitIndex)); - return invented; + return gResearchedRideTypes[rideType]; } bool ride_entry_is_invented(sint32 rideEntryIndex) { - sint32 quadIndex = rideEntryIndex >> 5; - sint32 bitIndex = rideEntryIndex & 0x1F; - bool invented = (gResearchedRideEntries[quadIndex] & ((uint32) 1 << bitIndex)); - return invented; + return gResearchedRideEntries[rideEntryIndex]; } 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) { - sint32 quadIndex = rideType >> 5; - sint32 bitIndex = rideType & 0x1F; - gResearchedRideTypes[quadIndex] |= (uint32) 1 << bitIndex; + gResearchedRideTypes[rideType] = true; } static void ride_entry_set_invented(sint32 rideEntryIndex) { - sint32 quadIndex = rideEntryIndex >> 5; - sint32 bitIndex = rideEntryIndex & 0x1F; - gResearchedRideEntries[quadIndex] |= (uint32) 1 << bitIndex; + gResearchedRideEntries[rideEntryIndex] = true; } bool scenery_is_invented(uint16 sceneryItem) @@ -823,7 +806,7 @@ bool scenery_group_is_invented(sint32 sgIndex) return invented; } -void reset_researched_scenery_items() +void set_all_scenery_items_invented() { 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 - for (auto &researchedRideType : gResearchedRideTypes) - { - researchedRideType = 0xFFFFFFFF; - } + Memory::Set(gResearchedRideTypes, true, sizeof(gResearchedRideTypes)); + Memory::Set(gResearchedRideEntries, true, sizeof(gResearchedRideEntries)); +} - for (auto &researchedRideEntry : gResearchedRideEntries) - { - researchedRideEntry = 0xFFFFFFFF; - } +void set_every_ride_entry_not_invented() +{ + 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); } } -} \ No newline at end of file +} diff --git a/src/openrct2/management/Research.h b/src/openrct2/management/Research.h index 0ff27d43f3..5245a3decd 100644 --- a/src/openrct2/management/Research.h +++ b/src/openrct2/management/Research.h @@ -17,6 +17,8 @@ #pragma once #include "../common.h" +#include "../object/ObjectLimits.h" +#include "../ride/Ride.h" typedef struct rct_ride_entry rct_ride_entry; @@ -43,8 +45,6 @@ enum{ #define MAX_RESEARCH_ITEMS 500 #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 RESEARCH_ENTRY_RIDE_MASK 0x10000 @@ -92,8 +92,8 @@ extern uint32 gResearchNextItem; extern rct_research_item gResearchItems[MAX_RESEARCH_ITEMS]; extern uint8 gResearchUncompletedCategories; -extern uint32 gResearchedRideTypes[MAX_RESEARCHED_RIDE_TYPES]; -extern uint32 gResearchedRideEntries[MAX_RESEARCHED_RIDE_ENTRIES]; +extern bool gResearchedRideTypes[RIDE_TYPE_COUNT]; +extern bool gResearchedRideEntries[MAX_RIDE_OBJECTS]; extern uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS]; 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 scenery_group_is_invented(sint32 sgIndex); bool scenery_is_invented(uint16 sceneryItem); -void reset_researched_scenery_items(); -void reset_researched_ride_types_and_entries(); +void set_all_scenery_items_invented(); +void set_every_ride_entry_invented(); +void set_every_ride_entry_not_invented(); rct_string_id research_item_get_name(uint32 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); diff --git a/src/openrct2/rct2.h b/src/openrct2/rct2.h index cd66bef725..a139e14e48 100644 --- a/src/openrct2/rct2.h +++ b/src/openrct2/rct2.h @@ -22,19 +22,21 @@ #include "common.h" #include "rct12.h" -#define RCT2_MAX_RIDES_IN_PARK 255 -#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_RIDES_IN_PARK 255 +#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_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 { diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index 35330289e3..acd609f4a6 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -38,6 +38,7 @@ #include "../management/NewsItem.h" #include "../management/Research.h" #include "../object/Object.h" +#include "../object/ObjectLimits.h" #include "../OpenRCT2.h" #include "../peep/Staff.h" #include "../ride/Ride.h" @@ -216,10 +217,11 @@ void S6Exporter::Export() _s6.guest_count_change_modifier = gGuestChangeModifier; _s6.current_research_level = gResearchFundingLevel; // pad_01357400 - memcpy(_s6.researched_ride_types, gResearchedRideTypes, sizeof(_s6.researched_ride_types)); - memcpy(_s6.researched_ride_entries, gResearchedRideEntries, sizeof(_s6.researched_ride_entries)); + ExportResearchedRideTypes(); + ExportResearchedRideEntries(); // 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; researchedTrackPiecesB[i] = (RideTypePossibleTrackConfigurations[i] >> 32ULL) & 0xFFFFFFFFULL; } @@ -652,6 +654,36 @@ void S6Exporter::ExportRide(rct2_ride * dst, const Ride * src) // 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" { enum { diff --git a/src/openrct2/rct2/S6Exporter.h b/src/openrct2/rct2/S6Exporter.h index 7b9d9be43b..138559c4b2 100644 --- a/src/openrct2/rct2/S6Exporter.h +++ b/src/openrct2/rct2/S6Exporter.h @@ -51,6 +51,8 @@ private: void Save(IStream * stream, bool isScenario); static uint32 GetLoanHash(money32 initialCash, money32 bankLoan, uint32 maxBankLoan); + void ExportResearchedRideTypes(); + void ExportResearchedRideEntries(); }; #endif diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 8cf960a602..5f9d972df4 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -22,9 +22,9 @@ #include "../core/String.hpp" #include "../management/Award.h" #include "../network/network.h" +#include "../object/ObjectLimits.h" #include "../object/ObjectManager.h" #include "../object/ObjectRepository.h" -#include "../object/ObjectManager.h" #include "../ParkImporter.h" #include "../rct12/SawyerChunkReader.h" #include "../rct12/SawyerEncoding.h" @@ -235,8 +235,8 @@ public: gGuestChangeModifier = _s6.guest_count_change_modifier; gResearchFundingLevel = _s6.current_research_level; // pad_01357400 - memcpy(gResearchedRideTypes, _s6.researched_ride_types, sizeof(_s6.researched_ride_types)); - memcpy(gResearchedRideEntries, _s6.researched_ride_entries, sizeof(_s6.researched_ride_entries)); + ImportResearchedRideTypes(); + ImportResearchedRideEntries(); // _s6.researched_track_types_a // _s6.researched_track_types_b @@ -699,6 +699,35 @@ public: // 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() { game_init_all(_s6.map_size); diff --git a/src/openrct2/scenario/Scenario.h b/src/openrct2/scenario/Scenario.h index 2671841ff5..e467fe26ed 100644 --- a/src/openrct2/scenario/Scenario.h +++ b/src/openrct2/scenario/Scenario.h @@ -131,8 +131,8 @@ typedef struct rct_s6_data { uint8 guest_count_change_modifier; uint8 current_research_level; uint8 pad_01357400[4]; - uint32 researched_ride_types[8]; - uint32 researched_ride_entries[8]; + uint32 researched_ride_types[RCT2_MAX_RESEARCHED_RIDE_TYPE_QUADS]; + uint32 researched_ride_entries[RCT2_MAX_RESEARCHED_RIDE_ENTRY_QUADS]; uint32 researched_track_types_a[128]; uint32 researched_track_types_b[128]; diff --git a/src/openrct2/world/Park.cpp b/src/openrct2/world/Park.cpp index a7f72636a6..ebde6fe958 100644 --- a/src/openrct2/world/Park.cpp +++ b/src/openrct2/world/Park.cpp @@ -17,6 +17,7 @@ #include "../Cheats.h" #include "../config/Config.h" #include "../core/Math.hpp" +#include "../core/Memory.hpp" #include "../core/Util.hpp" #include "../Game.h" #include "../interface/colour.h" @@ -108,10 +109,9 @@ void park_init() research_reset_items(); finance_init(); - for (i = 0; i < 2; i++) - gResearchedRideTypes[i] = 0; + Memory::Set(gResearchedRideTypes, false, sizeof(gResearchedRideTypes)); - reset_researched_scenery_items(); + set_all_scenery_items_invented(); gParkEntranceFee = MONEY(10, 00); gPeepSpawns[0].x = PEEP_SPAWN_UNDEFINED;