From db5b98f7027fc38da5689e11224f3231e3ef7f50 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 27 Aug 2025 14:04:08 +0200 Subject: [PATCH] Pass GameState on when importing entities from save files --- src/openrct2/park/ParkFile.cpp | 24 ++++++------ src/openrct2/rct1/S4Importer.cpp | 64 ++++++++++++++++---------------- src/openrct2/rct2/S6Importer.cpp | 64 ++++++++++++++++---------------- 3 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index 5dffbd4459..a7b39c0beb 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -2155,15 +2155,15 @@ namespace OpenRCT2 } template - void WriteEntitiesOfType(OrcaStream& os, OrcaStream::ChunkStream& cs); + void WriteEntitiesOfType(GameState_t& gameState, OrcaStream& os, OrcaStream::ChunkStream& cs); template - void WriteEntitiesOfTypes(OrcaStream& os, OrcaStream::ChunkStream& cs); + void WriteEntitiesOfTypes(GameState_t& gameState, OrcaStream& os, OrcaStream::ChunkStream& cs); template - void ReadEntitiesOfType(OrcaStream& os, OrcaStream::ChunkStream& cs); + void ReadEntitiesOfType(GameState_t& gameState, OrcaStream& os, OrcaStream::ChunkStream& cs); template - void ReadEntitiesOfTypes(OrcaStream& os, OrcaStream::ChunkStream& cs); + void ReadEntitiesOfTypes(GameState_t& gameState, OrcaStream& os, OrcaStream::ChunkStream& cs); void ReadWriteEntitiesChunk(GameState_t& gameState, OrcaStream& os); @@ -2637,7 +2637,7 @@ namespace OpenRCT2 } template - void ParkFile::WriteEntitiesOfType(OrcaStream& os, OrcaStream::ChunkStream& cs) + void ParkFile::WriteEntitiesOfType(GameState_t& gameState, OrcaStream& os, OrcaStream::ChunkStream& cs) { uint16_t count = GetEntityListCount(T::cEntityType); cs.write(T::cEntityType); @@ -2650,13 +2650,13 @@ namespace OpenRCT2 } template - void ParkFile::WriteEntitiesOfTypes(OrcaStream& os, OrcaStream::ChunkStream& cs) + void ParkFile::WriteEntitiesOfTypes(GameState_t& gameState, OrcaStream& os, OrcaStream::ChunkStream& cs) { - (WriteEntitiesOfType(os, cs), ...); + (WriteEntitiesOfType(gameState, os, cs), ...); } template - void ParkFile::ReadEntitiesOfType(OrcaStream& os, OrcaStream::ChunkStream& cs) + void ParkFile::ReadEntitiesOfType(GameState_t& gameState, OrcaStream& os, OrcaStream::ChunkStream& cs) { [[maybe_unused]] auto t = cs.read(); assert(t == T::cEntityType); @@ -2677,9 +2677,9 @@ namespace OpenRCT2 } template - void ParkFile::ReadEntitiesOfTypes(OrcaStream& os, OrcaStream::ChunkStream& cs) + void ParkFile::ReadEntitiesOfTypes(GameState_t& gameState, OrcaStream& os, OrcaStream::ChunkStream& cs) { - (ReadEntitiesOfType(os, cs), ...); + (ReadEntitiesOfType(gameState, os, cs), ...); } void ParkFile::ReadWriteEntitiesChunk(GameState_t& gameState, OrcaStream& os) @@ -2695,7 +2695,7 @@ namespace OpenRCT2 { ReadEntitiesOfTypes< Vehicle, Guest, Staff, Litter, SteamParticle, MoneyEffect, VehicleCrashParticle, ExplosionCloud, - CrashSplashParticle, ExplosionFlare, JumpingFountain, Balloon, Duck>(os, cs); + CrashSplashParticle, ExplosionFlare, JumpingFountain, Balloon, Duck>(gameState, os, cs); auto version = os.getHeader().targetVersion; if (version < kPeepAnimationObjectsVersion) @@ -2707,7 +2707,7 @@ namespace OpenRCT2 { WriteEntitiesOfTypes< Vehicle, Guest, Staff, Litter, SteamParticle, MoneyEffect, VehicleCrashParticle, ExplosionCloud, - CrashSplashParticle, ExplosionFlare, JumpingFountain, Balloon, Duck>(os, cs); + CrashSplashParticle, ExplosionFlare, JumpingFountain, Balloon, Duck>(gameState, os, cs); } }); } diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 8469953740..5ac9c55d75 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -189,7 +189,7 @@ namespace OpenRCT2::RCT1 ImportRides(); ImportRideMeasurements(); - ImportEntities(); + ImportEntities(gameState); ImportTileElements(gameState); ImportMapAnimations(); ImportPeepSpawns(gameState); @@ -1259,15 +1259,15 @@ namespace OpenRCT2::RCT1 } } - void ImportEntity(const RCT12EntityBase& src); + void ImportEntity(GameState_t& gameState, const RCT12EntityBase& src); template - void ImportEntity(const RCT12EntityBase& src); + void ImportEntity(GameState_t& gameState, const RCT12EntityBase& src); - void ImportEntities() + void ImportEntities(GameState_t& gameState) { for (int i = 0; i < Limits::kMaxEntities; i++) { - ImportEntity(_s4.Entities[i].Unknown); + ImportEntity(gameState, _s4.Entities[i].Unknown); } } @@ -2782,7 +2782,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity<::Vehicle>(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity<::Vehicle>(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt<::Vehicle>(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -2905,7 +2905,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -2997,7 +2997,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3016,7 +3016,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3027,7 +3027,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3038,7 +3038,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3053,7 +3053,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3072,7 +3072,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3081,7 +3081,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3090,7 +3090,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3099,7 +3099,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3119,7 +3119,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3140,7 +3140,7 @@ namespace OpenRCT2::RCT1 } template<> - void S4Importer::ImportEntity(const RCT12EntityBase& srcBase) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& srcBase) { auto* dst = CreateEntityAt(EntityId::FromUnderlying(srcBase.EntityIndex)); auto* src = static_cast(&srcBase); @@ -3152,48 +3152,48 @@ namespace OpenRCT2::RCT1 dst->state = static_cast(src->State); } - void S4Importer::ImportEntity(const RCT12EntityBase& src) + void S4Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& src) { switch (GetEntityTypeFromRCT1Sprite(src)) { case EntityType::Vehicle: - ImportEntity<::Vehicle>(src); + ImportEntity<::Vehicle>(gameState, src); break; case EntityType::Guest: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::Staff: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::SteamParticle: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::MoneyEffect: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::CrashedVehicleParticle: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::ExplosionCloud: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::ExplosionFlare: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::CrashSplash: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::JumpingFountain: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::Balloon: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::Duck: - ImportEntity(src); + ImportEntity(gameState, src); break; case EntityType::Litter: - ImportEntity(src); + ImportEntity(gameState, src); break; default: // Null elements do not need imported diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index b2a7eceb89..db1809e2b6 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -351,7 +351,7 @@ namespace OpenRCT2::RCT2 DetermineFlatRideStatus(); ImportTileElements(gameState); - ImportEntities(); + ImportEntities(gameState); ConvertPeepAnimationTypeToObjects(gameState); auto& park = gameState.park; @@ -1645,11 +1645,11 @@ namespace OpenRCT2::RCT2 } } - void ImportEntities() + void ImportEntities(GameState_t& gameState) { for (int32_t i = 0; i < GetMaxEntities(); i++) { - ImportEntity(_s6.Entities[i].Unknown); + ImportEntity(gameState, _s6.Entities[i].Unknown); } } @@ -1659,7 +1659,7 @@ namespace OpenRCT2::RCT2 } template - void ImportEntity(const RCT12EntityBase& src); + void ImportEntity(GameState_t& gameState, const RCT12EntityBase& src); void ImportEntityPeep(::Peep* dst, const Peep* src) { @@ -1813,7 +1813,7 @@ namespace OpenRCT2::RCT2 dst->Orientation = src->EntityDirection; } - void ImportEntity(const RCT12EntityBase& src); + void ImportEntity(GameState_t& gameState, const RCT12EntityBase& src); std::string GetUserString(StringId stringId) { @@ -1944,7 +1944,7 @@ namespace OpenRCT2::RCT2 }; template<> - void S6Importer::ImportEntity<::Vehicle>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::Vehicle>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::Vehicle>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2070,7 +2070,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::Guest>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::Guest>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::Guest>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2145,7 +2145,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::Staff>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::Staff>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::Staff>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2166,7 +2166,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::SteamParticle>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::SteamParticle>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::SteamParticle>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2176,7 +2176,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::MoneyEffect>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::MoneyEffect>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::MoneyEffect>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2190,7 +2190,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::VehicleCrashParticle>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::VehicleCrashParticle>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::VehicleCrashParticle>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2210,7 +2210,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::ExplosionCloud>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::ExplosionCloud>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::ExplosionCloud>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2219,7 +2219,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::ExplosionFlare>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::ExplosionFlare>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::ExplosionFlare>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2228,7 +2228,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::CrashSplashParticle>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::CrashSplashParticle>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::CrashSplashParticle>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2237,7 +2237,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::JumpingFountain>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::JumpingFountain>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::JumpingFountain>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2254,7 +2254,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::Balloon>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::Balloon>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::Balloon>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2266,7 +2266,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::Duck>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::Duck>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::Duck>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2278,7 +2278,7 @@ namespace OpenRCT2::RCT2 } template<> - void S6Importer::ImportEntity<::Litter>(const RCT12EntityBase& baseSrc) + void S6Importer::ImportEntity<::Litter>(GameState_t& gameState, const RCT12EntityBase& baseSrc) { auto dst = CreateEntityAt<::Litter>(EntityId::FromUnderlying(baseSrc.EntityIndex)); auto src = static_cast(&baseSrc); @@ -2287,48 +2287,48 @@ namespace OpenRCT2::RCT2 dst->creationTick = AdjustScenarioToCurrentTicks(_s6, src->CreationTick); } - void S6Importer::ImportEntity(const RCT12EntityBase& src) + void S6Importer::ImportEntity(GameState_t& gameState, const RCT12EntityBase& src) { switch (GetEntityTypeFromRCT2Sprite(&src)) { case EntityType::Vehicle: - ImportEntity<::Vehicle>(src); + ImportEntity<::Vehicle>(gameState, src); break; case EntityType::Guest: - ImportEntity<::Guest>(src); + ImportEntity<::Guest>(gameState, src); break; case EntityType::Staff: - ImportEntity<::Staff>(src); + ImportEntity<::Staff>(gameState, src); break; case EntityType::SteamParticle: - ImportEntity<::SteamParticle>(src); + ImportEntity<::SteamParticle>(gameState, src); break; case EntityType::MoneyEffect: - ImportEntity<::MoneyEffect>(src); + ImportEntity<::MoneyEffect>(gameState, src); break; case EntityType::CrashedVehicleParticle: - ImportEntity<::VehicleCrashParticle>(src); + ImportEntity<::VehicleCrashParticle>(gameState, src); break; case EntityType::ExplosionCloud: - ImportEntity<::ExplosionCloud>(src); + ImportEntity<::ExplosionCloud>(gameState, src); break; case EntityType::ExplosionFlare: - ImportEntity<::ExplosionFlare>(src); + ImportEntity<::ExplosionFlare>(gameState, src); break; case EntityType::CrashSplash: - ImportEntity<::CrashSplashParticle>(src); + ImportEntity<::CrashSplashParticle>(gameState, src); break; case EntityType::JumpingFountain: - ImportEntity<::JumpingFountain>(src); + ImportEntity<::JumpingFountain>(gameState, src); break; case EntityType::Balloon: - ImportEntity<::Balloon>(src); + ImportEntity<::Balloon>(gameState, src); break; case EntityType::Duck: - ImportEntity<::Duck>(src); + ImportEntity<::Duck>(gameState, src); break; case EntityType::Litter: - ImportEntity<::Litter>(src); + ImportEntity<::Litter>(gameState, src); break; default: // Null elements do not need imported