From 0652b326e1d5b52e612246852baa4f98605fb2c5 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 17 Aug 2021 22:39:58 +0100 Subject: [PATCH] Fix merge issues add ride use history --- src/openrct2/ParkFile.cpp | 101 ++++++++++++++++++++++++++++++---- src/openrct2/peep/Guest.cpp | 4 +- src/openrct2/world/Sprite.cpp | 4 +- 3 files changed, 93 insertions(+), 16 deletions(-) diff --git a/src/openrct2/ParkFile.cpp b/src/openrct2/ParkFile.cpp index cade9af83d..79fa6f86ba 100644 --- a/src/openrct2/ParkFile.cpp +++ b/src/openrct2/ParkFile.cpp @@ -33,6 +33,7 @@ #include "object/Object.h" #include "object/ObjectManager.h" #include "object/ObjectRepository.h" +#include "peep/RideUseSystem.h" #include "peep/Staff.h" #include "ride/ShopItem.h" #include "ride/Vehicle.h" @@ -73,7 +74,7 @@ namespace OpenRCT2 constexpr uint32_t PARK_FILE_MAGIC = 0x4B524150; // PARK // Current version that is saved. - constexpr uint32_t PARK_FILE_CURRENT_VERSION = 0x2; + constexpr uint32_t PARK_FILE_CURRENT_VERSION = 0x3; // The minimum version that is forwards compatible with the current version. constexpr uint32_t PARK_FILE_MIN_VERSION = 0x2; @@ -1282,6 +1283,31 @@ namespace OpenRCT2 cs.ReadWrite(entity.sprite_direction); } + static std::vector LegacyGetRideTypesBeenOn(const std::array& srcArray) + { + std::vector ridesTypesBeenOn; + for (ObjectEntryIndex i = 0; i < RCT12_MAX_RIDE_OBJECTS; i++) + { + if (srcArray[i / 8] & (1 << (i % 8))) + { + ridesTypesBeenOn.push_back(i); + } + } + return ridesTypesBeenOn; + } + static std::vector LegacyGetRidesBeenOn(const std::array& srcArray) + { + std::vector ridesBeenOn; + for (uint16_t i = 0; i < RCT12_MAX_RIDES_IN_PARK; i++) + { + if (srcArray[i / 8] & (1 << (i % 8))) + { + ridesBeenOn.push_back(i); + } + } + return ridesBeenOn; + } + static void ReadWritePeep(OrcaStream& os, OrcaStream::ChunkStream& cs, Peep& entity) { auto version = os.GetHeader().TargetVersion; @@ -1408,10 +1434,12 @@ namespace OpenRCT2 if (guest != nullptr) { cs.ReadWrite(guest->PaidOnDrink); - cs.ReadWriteArray(guest->RideTypesBeenOn, [&cs](uint8_t& rideType) { + std::array rideTypeBeenOn; + cs.ReadWriteArray(rideTypeBeenOn, [&cs](uint8_t& rideType) { cs.ReadWrite(rideType); return true; }); + OpenRCT2::RideUse::GetTypeHistory().Set(guest->sprite_index, LegacyGetRideTypesBeenOn(rideTypeBeenOn)); cs.ReadWrite(guest->ItemFlags); cs.ReadWrite(guest->Photo2RideRef); cs.ReadWrite(guest->Photo3RideRef); @@ -1465,10 +1493,12 @@ namespace OpenRCT2 if (guest != nullptr) { cs.ReadWrite(guest->TimeInQueue); - cs.ReadWriteArray(guest->RidesBeenOn, [&cs](ride_id_t& rideId) { - cs.ReadWrite(rideId); + std::array ridesBeenOn; + cs.ReadWriteArray(ridesBeenOn, [&cs](uint8_t& rideType) { + cs.ReadWrite(rideType); return true; }); + OpenRCT2::RideUse::GetHistory().Set(guest->sprite_index, LegacyGetRidesBeenOn(ridesBeenOn)); } else { @@ -1770,15 +1800,62 @@ namespace OpenRCT2 cs.Write(static_cast(guest.Intensity)); } cs.ReadWrite(guest.NauseaTolerance); - cs.ReadWriteArray(guest.RideTypesBeenOn, [&cs](uint8_t& rideType) { - cs.ReadWrite(rideType); - return true; - }); + + if (os.GetHeader().TargetVersion < 3) + { + std::array rideTypeBeenOn; + cs.ReadWriteArray(rideTypeBeenOn, [&cs](uint8_t& rideType) { + cs.ReadWrite(rideType); + return true; + }); + OpenRCT2::RideUse::GetTypeHistory().Set(guest.sprite_index, LegacyGetRideTypesBeenOn(rideTypeBeenOn)); + } + cs.ReadWrite(guest.TimeInQueue); - cs.ReadWriteArray(guest.RidesBeenOn, [&cs](ride_id_t& rideId) { - cs.ReadWrite(rideId); - return true; - }); + if (os.GetHeader().TargetVersion < 3) + { + std::array ridesBeenOn; + cs.ReadWriteArray(ridesBeenOn, [&cs](uint8_t& rideType) { + cs.ReadWrite(rideType); + return true; + }); + OpenRCT2::RideUse::GetHistory().Set(guest.sprite_index, LegacyGetRidesBeenOn(ridesBeenOn)); + } + else + { + if (cs.GetMode() == OrcaStream::Mode::READING) + { + std::vector rideUse; + cs.ReadWriteVector(rideUse, [&cs](ride_id_t& rideId) { cs.ReadWrite(rideId); }); + OpenRCT2::RideUse::GetHistory().Set(guest.sprite_index, std::move(rideUse)); + std::vector rideTypeUse; + cs.ReadWriteVector(rideTypeUse, [&cs](ObjectEntryIndex& rideType) { cs.ReadWrite(rideType); }); + OpenRCT2::RideUse::GetTypeHistory().Set(guest.sprite_index, std::move(rideTypeUse)); + } + else + { + auto* rideUse = OpenRCT2::RideUse::GetHistory().GetAll(guest.sprite_index); + if (rideUse == nullptr) + { + std::vector empty; + cs.ReadWriteVector(empty, [&cs](ride_id_t& rideId) { cs.ReadWrite(rideId); }); + } + else + { + cs.ReadWriteVector(*rideUse, [&cs](ride_id_t& rideId) { cs.ReadWrite(rideId); }); + } + auto* rideTypeUse = OpenRCT2::RideUse::GetTypeHistory().GetAll(guest.sprite_index); + if (rideTypeUse == nullptr) + { + std::vector empty; + cs.ReadWriteVector(empty, [&cs](ObjectEntryIndex& rideId) { cs.ReadWrite(rideId); }); + } + else + { + cs.ReadWriteVector(*rideTypeUse, [&cs](ObjectEntryIndex& rideId) { cs.ReadWrite(rideId); }); + } + } + } cs.ReadWrite(guest.CashInPocket); cs.ReadWrite(guest.CashSpent); cs.ReadWrite(guest.Photo1RideRef); diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index b610b41d09..0cb97c66a5 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -7446,7 +7446,7 @@ void Guest::RemoveRideFromMemory(ride_id_t rideId) break; // Ride ids and shop item ids might have the same value, look only for ride thoughts. - if (IsThoughtShopItemRelated(entry.type) || entry.item != rideId) + if (IsThoughtShopItemRelated(entry.type) || entry.ride != rideId) { it++; continue; @@ -7461,6 +7461,6 @@ void Guest::RemoveRideFromMemory(ride_id_t rideId) // Last slot is now free. auto& lastEntry = Thoughts.back(); lastEntry.type = PeepThoughtType::None; - lastEntry.item = PEEP_THOUGHT_ITEM_NONE; + lastEntry.argument = 0; } } diff --git a/src/openrct2/world/Sprite.cpp b/src/openrct2/world/Sprite.cpp index 4782844399..ee4d314569 100644 --- a/src/openrct2/world/Sprite.cpp +++ b/src/openrct2/world/Sprite.cpp @@ -44,7 +44,7 @@ constexpr const uint32_t SPATIAL_INDEX_LOCATION_NULL = SPATIAL_INDEX_SIZE - 1; static std::array, SPATIAL_INDEX_SIZE> gSpriteSpatialIndex; -static void FreeEntity(SpriteBase* entity); +static void FreeEntity(SpriteBase& entity); constexpr size_t GetSpatialIndexOffset(int32_t x, int32_t y) { @@ -239,7 +239,7 @@ void reset_sprite_list() { continue; } - FreeEntity(spr); + FreeEntity(*spr); spr->Type = EntityType::Null; spr->sprite_index = i;