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

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()
{
reset_researched_ride_types_and_entries();
set_every_ride_entry_invented();
gS6Info.editor_step = EDITOR_STEP_TRACK_DESIGNS_MANAGER;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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];

View File

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