Close #16013: Refactor RCT12Research import (#16350)

* Remove unused symbols in Research.h

* Move RCT12ResearchItem conversion out of Research.cpp/h
This commit is contained in:
Michael Steenbeek 2022-01-03 11:20:04 +01:00 committed by GitHub
parent 819495800c
commit 2fa33983ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 44 additions and 62 deletions

View File

@ -15,6 +15,7 @@
#include "core/String.hpp"
#include "park/ParkFile.h"
#include "rct12/SawyerChunkReader.h"
#include "rct2/RCT2.h"
#include "scenario/Scenario.h"
#include "util/SawyerCoding.h"

View File

@ -23,7 +23,6 @@
#include "../localisation/StringIds.h"
#include "../object/ObjectList.h"
#include "../object/RideObject.h"
#include "../rct1/RCT1.h"
#include "../ride/Ride.h"
#include "../ride/RideData.h"
#include "../ride/RideEntry.h"
@ -68,35 +67,6 @@ static bool _researchedSceneryItems[SCENERY_TYPE_COUNT][UINT16_MAX];
bool gSilentResearch = false;
// TODO: MOVE TO S4/6 IMPORT
ResearchItem::ResearchItem(const RCT12ResearchItem& oldResearchItem)
{
if (oldResearchItem.IsInventedEndMarker() || oldResearchItem.IsUninventedEndMarker() || oldResearchItem.IsRandomEndMarker())
{
rawValue = 0;
flags = 0;
category = ResearchCategory::Transport;
SetNull();
}
else
{
type = Research::EntryType{ oldResearchItem.type };
entryIndex = RCTEntryIndexToOpenRCT2EntryIndex(oldResearchItem.entryIndex);
flags = oldResearchItem.flags;
category = static_cast<ResearchCategory>(oldResearchItem.category);
if (type == Research::EntryType::Ride)
{
auto* rideEntry = get_ride_entry(entryIndex);
baseRideType = rideEntry != nullptr ? RCT2::RCT2RideTypeToOpenRCT2RideType(oldResearchItem.baseRideType, rideEntry)
: oldResearchItem.baseRideType;
}
else
{
baseRideType = 0;
}
}
}
/**
*
* rct2: 0x006671AD, part of 0x00667132

View File

@ -10,8 +10,8 @@
#pragma once
#include "../common.h"
#include "../object/Object.h"
#include "../object/ObjectLimits.h"
#include "../rct2/RCT2.h"
#include "../util/Util.h"
#include <optional>
@ -87,35 +87,9 @@ struct ResearchItem
{
}
RCT12ResearchItem ToRCT12ResearchItem() const
{
RCT12ResearchItem retItem = {};
if (IsNull())
{
retItem.rawValue = RCT12_RESEARCHED_ITEMS_SEPARATOR;
}
else
{
retItem.entryIndex = OpenRCT2EntryIndexToRCTEntryIndex(entryIndex);
retItem.baseRideType = RCT2::OpenRCT2RideTypeToRCT2RideType(baseRideType);
retItem.type = static_cast<uint8_t>(type);
retItem.flags = (flags & ~RESEARCH_ENTRY_FLAG_FIRST_OF_TYPE);
retItem.category = EnumValue(category);
}
return retItem;
}
ResearchItem(const RCT12ResearchItem& oldResearchItem);
bool operator==(const ResearchItem& rhs) const;
};
// Only used to mark as null nowadays. Deprecated. TODO: remove.
#define RESEARCH_ITEM_NULL 0xFFFFFFFF
#define MAX_RESEARCH_ITEMS 500
enum
{
RESEARCH_FUNDING_NONE,

View File

@ -13,6 +13,8 @@
#include "../localisation/Formatting.h"
#include "../localisation/Localisation.h"
#include "../object/ObjectList.h"
#include "../rct2/RCT2.h"
#include "../ride/Ride.h"
#include "../ride/Track.h"
#include "../scenario/Scenario.h"
#include "../world/Banner.h"
@ -911,3 +913,34 @@ money32 OpenRCT2CompletedCompanyValueToRCT12(money64 origValue)
return ToMoney32(origValue);
}
ResearchItem RCT12ResearchItem::ToResearchItem() const
{
auto newResearchItem = ResearchItem();
if (IsInventedEndMarker() || IsUninventedEndMarker() || IsRandomEndMarker())
{
newResearchItem.rawValue = 0;
newResearchItem.flags = 0;
newResearchItem.category = ResearchCategory::Transport;
newResearchItem.SetNull();
}
else
{
newResearchItem.type = Research::EntryType{ type };
newResearchItem.entryIndex = RCTEntryIndexToOpenRCT2EntryIndex(entryIndex);
newResearchItem.flags = flags;
newResearchItem.category = static_cast<ResearchCategory>(category);
if (newResearchItem.type == Research::EntryType::Ride)
{
auto* rideEntry = get_ride_entry(newResearchItem.entryIndex);
newResearchItem.baseRideType = rideEntry != nullptr ? RCT2::RCT2RideTypeToOpenRCT2RideType(baseRideType, rideEntry)
: baseRideType;
}
else
{
newResearchItem.baseRideType = 0;
}
}
return newResearchItem;
}

View File

@ -12,6 +12,7 @@
// Structures shared between both RCT1 and RCT2.
#include "../common.h"
#include "../management/Research.h"
#include "../object/Object.h"
#include "../ride/RideTypes.h"
#include "../world/tile_element/TileElementType.h"
@ -838,6 +839,8 @@ struct RCT12ResearchItem
bool IsInventedEndMarker() const;
bool IsRandomEndMarker() const;
bool IsUninventedEndMarker() const;
ResearchItem ToResearchItem() const;
};
assert_struct_size(RCT12ResearchItem, 5);

View File

@ -299,13 +299,14 @@ namespace RCT2
gResearchPriorities = _s6.active_research_types;
gResearchProgressStage = _s6.research_progress_stage;
if (_s6.last_researched_item_subject != RCT12_RESEARCHED_ITEMS_SEPARATOR)
gResearchLastItem = ResearchItem(
RCT12ResearchItem{ _s6.last_researched_item_subject, EnumValue(ResearchCategory::Transport) });
gResearchLastItem = RCT12ResearchItem{ _s6.last_researched_item_subject,
EnumValue(ResearchCategory::Transport) }
.ToResearchItem();
else
gResearchLastItem = std::nullopt;
// pad_01357CF8
if (_s6.next_research_item != RCT12_RESEARCHED_ITEMS_SEPARATOR)
gResearchNextItem = ResearchItem(RCT12ResearchItem{ _s6.next_research_item, _s6.next_research_category });
gResearchNextItem = RCT12ResearchItem{ _s6.next_research_item, _s6.next_research_category }.ToResearchItem();
else
gResearchNextItem = std::nullopt;
@ -1003,9 +1004,9 @@ namespace RCT2
}
if (invented)
gResearchItemsInvented.emplace_back(researchItem);
gResearchItemsInvented.emplace_back(researchItem.ToResearchItem());
else
gResearchItemsUninvented.emplace_back(researchItem);
gResearchItemsUninvented.emplace_back(researchItem.ToResearchItem());
}
}