diff --git a/src/openrct2/FileClassifier.cpp b/src/openrct2/FileClassifier.cpp index c865ba018d..f9e4547228 100644 --- a/src/openrct2/FileClassifier.cpp +++ b/src/openrct2/FileClassifier.cpp @@ -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" diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index 98a8c06e09..0f13a4fbcb 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -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(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 diff --git a/src/openrct2/management/Research.h b/src/openrct2/management/Research.h index def062b443..cbfa059335 100644 --- a/src/openrct2/management/Research.h +++ b/src/openrct2/management/Research.h @@ -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 @@ -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(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, diff --git a/src/openrct2/rct12/RCT12.cpp b/src/openrct2/rct12/RCT12.cpp index 0fe0c50c21..fab801189d 100644 --- a/src/openrct2/rct12/RCT12.cpp +++ b/src/openrct2/rct12/RCT12.cpp @@ -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(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; +} diff --git a/src/openrct2/rct12/RCT12.h b/src/openrct2/rct12/RCT12.h index b0ea2b0b62..30e6e76c02 100644 --- a/src/openrct2/rct12/RCT12.h +++ b/src/openrct2/rct12/RCT12.h @@ -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); diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 4fbf1bbbb9..29e695e7f3 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -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()); } }