diff --git a/src/openrct2/ParkFile.cpp b/src/openrct2/ParkFile.cpp index 6f5dc649ab..8a016384cb 100644 --- a/src/openrct2/ParkFile.cpp +++ b/src/openrct2/ParkFile.cpp @@ -750,73 +750,12 @@ namespace OpenRCT2 } } - template void WriteEntitiesOfType(OrcaStream::ChunkStream& cs) - { - auto count = GetEntityListCount(T::cEntityType); - cs.Write(T::cEntityType); - cs.Write(count); - for (auto* ent : EntityList()) - { - ReadWriteEntity(cs, *ent); - } - } - template void WriteEntitiesOfTypes(OrcaStream::ChunkStream& cs) - { - (WriteEntitiesOfType(cs), ...); - } - - void ReadWriteEntitiesChunk(OrcaStream& os) - { - os.ReadWriteChunk(ParkFileChunkType::ENTITIES, [this](OrcaStream::ChunkStream& cs) { - if (cs.GetMode() == OrcaStream::Mode::READING) - { - reset_sprite_list(); - } - - std::vector entityIndices; - if (cs.GetMode() == OrcaStream::Mode::READING) - { - cs.ReadWriteVector(entityIndices, [&cs](uint16_t& index) { - cs.ReadWrite(index); - auto& entity = *(get_sprite(index)); - ReadWriteEntity(cs, entity); - }); - } - else - { - WriteEntitiesOfTypes< - Vehicle, Guest, Staff, Litter, SteamParticle, MoneyEffect, VehicleCrashParticle, ExplosionCloud, - CrashSplashParticle, ExplosionFlare, JumpingFountain, Balloon, Duck>(cs); - } - }); - } - - static void ReadWriteEntity(OrcaStream::ChunkStream& cs, SpriteBase& entity) - { - ReadWriteEntityCommon(cs, entity); - switch (entity.sprite_identifier) - { - case SpriteIdentifier::Vehicle: - ReadWriteEntityVehicle(cs, *entity.As()); - break; - case SpriteIdentifier::Peep: - ReadWriteEntityPeep(cs, *entity.As()); - break; - case SpriteIdentifier::Misc: - ReadWriteEntityMisc(cs, *entity.As()); - break; - case SpriteIdentifier::Litter: - ReadWriteEntityLitter(cs, *entity.As()); - break; - case SpriteIdentifier::Null: - break; - } - } + template static void ReadWriteEntity(OrcaStream::ChunkStream& cs, T& entity); static void ReadWriteEntityCommon(OrcaStream::ChunkStream& cs, SpriteBase& entity) { - cs.ReadWrite(entity.sprite_height_negative); cs.ReadWrite(entity.sprite_index); + cs.ReadWrite(entity.sprite_height_negative); cs.ReadWrite(entity.flags); cs.ReadWrite(entity.x); cs.ReadWrite(entity.y); @@ -826,8 +765,9 @@ namespace OpenRCT2 cs.ReadWrite(entity.sprite_direction); } - static void ReadWriteEntityVehicle(OrcaStream::ChunkStream& cs, Vehicle& entity) + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, Vehicle& entity) { + ReadWriteEntityCommon(cs, entity); auto ride = entity.GetRide(); cs.ReadWrite(entity.SubType); cs.ReadWrite(entity.vehicle_sprite_type); @@ -902,8 +842,17 @@ namespace OpenRCT2 cs.ReadWrite(entity.target_seat_rotation); } - static void ReadWriteEntityPeep(OrcaStream::ChunkStream& cs, Peep& entity) + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, Guest& entity) { + ReadWritePeep(cs, entity); + } + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, Staff& entity) + { + ReadWritePeep(cs, entity); + } + static void ReadWritePeep(OrcaStream::ChunkStream& cs, Peep& entity) + { + ReadWriteEntityCommon(cs, entity); cs.ReadWrite(entity.Name); cs.ReadWrite(entity.NextLoc); cs.ReadWrite(entity.NextFlags); @@ -1017,90 +966,145 @@ namespace OpenRCT2 cs.ReadWrite(entity.FavouriteRideRating); } - static void ReadWriteEntityMisc(OrcaStream::ChunkStream& cs, MiscEntity& entity) + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, SteamParticle& steamParticle) { - switch (entity.SubType) + ReadWriteEntityCommon(cs, steamParticle); + cs.ReadWrite(steamParticle.time_to_move); + cs.ReadWrite(steamParticle.frame); + } + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, MoneyEffect& moneyEffect) + { + ReadWriteEntityCommon(cs, moneyEffect); + cs.ReadWrite(moneyEffect.MoveDelay); + cs.ReadWrite(moneyEffect.NumMovements); + cs.ReadWrite(moneyEffect.Vertical); + cs.ReadWrite(moneyEffect.Value); + cs.ReadWrite(moneyEffect.OffsetX); + cs.ReadWrite(moneyEffect.Wiggle); + } + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, VehicleCrashParticle& vehicleCrashParticle) + { + ReadWriteEntityCommon(cs, vehicleCrashParticle); + cs.ReadWrite(vehicleCrashParticle.frame); + cs.ReadWrite(vehicleCrashParticle.time_to_live); + cs.ReadWrite(vehicleCrashParticle.frame); + cs.ReadWrite(vehicleCrashParticle.colour[0]); + cs.ReadWrite(vehicleCrashParticle.colour[1]); + cs.ReadWrite(vehicleCrashParticle.crashed_sprite_base); + cs.ReadWrite(vehicleCrashParticle.velocity_x); + cs.ReadWrite(vehicleCrashParticle.velocity_y); + cs.ReadWrite(vehicleCrashParticle.velocity_z); + cs.ReadWrite(vehicleCrashParticle.acceleration_x); + cs.ReadWrite(vehicleCrashParticle.acceleration_y); + cs.ReadWrite(vehicleCrashParticle.acceleration_z); + } + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, ExplosionCloud& entity) + { + ReadWriteEntityCommon(cs, entity); + cs.ReadWrite(entity.frame); + } + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, CrashSplashParticle& entity) + { + ReadWriteEntityCommon(cs, entity); + cs.ReadWrite(entity.frame); + } + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, ExplosionFlare& entity) + { + ReadWriteEntityCommon(cs, entity); + cs.ReadWrite(entity.frame); + } + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, JumpingFountain& fountain) + { + ReadWriteEntityCommon(cs, fountain); + cs.ReadWrite(fountain.NumTicksAlive); + cs.ReadWrite(fountain.frame); + cs.ReadWrite(fountain.FountainFlags); + cs.ReadWrite(fountain.TargetX); + cs.ReadWrite(fountain.TargetY); + cs.ReadWrite(fountain.TargetY); + cs.ReadWrite(fountain.Iteration); + } + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, Balloon& balloon) + { + ReadWriteEntityCommon(cs, balloon); + cs.ReadWrite(balloon.popped); + cs.ReadWrite(balloon.time_to_move); + cs.ReadWrite(balloon.frame); + cs.ReadWrite(balloon.colour); + } + template<> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, Duck& duck) + { + ReadWriteEntityCommon(cs, duck); + cs.ReadWrite(duck.frame); + cs.ReadWrite(duck.target_x); + cs.ReadWrite(duck.target_y); + cs.ReadWrite(duck.state); + } + + static void ReadWriteEntity(OrcaStream::ChunkStream& cs, Litter& entity) + { + ReadWriteEntityCommon(cs, entity); + cs.ReadWrite(entity.SubType); + cs.ReadWrite(entity.creationTick); + } + + template void WriteEntitiesOfType(OrcaStream::ChunkStream& cs) + { + uint16_t count = GetEntityListCount(T::cEntityType); + cs.Write(T::cEntityType); + cs.Write(count); + for (auto* ent : EntityList()) { - case MiscEntityType::SteamParticle: - { - auto steamParticle = entity.As(); - cs.ReadWrite(steamParticle->time_to_move); - cs.ReadWrite(steamParticle->frame); - break; - } - case MiscEntityType::MoneyEffect: - { - auto moneyEffect = entity.As(); - cs.ReadWrite(moneyEffect->MoveDelay); - cs.ReadWrite(moneyEffect->NumMovements); - cs.ReadWrite(moneyEffect->Vertical); - cs.ReadWrite(moneyEffect->Value); - cs.ReadWrite(moneyEffect->OffsetX); - cs.ReadWrite(moneyEffect->Wiggle); - break; - } - case MiscEntityType::CrashedVehicleParticle: - { - auto vehicleCrashParticle = entity.As(); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->frame); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->time_to_live); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->frame); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->colour[0]); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->colour[1]); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->crashed_sprite_base); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->velocity_x); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->velocity_y); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->velocity_z); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->acceleration_x); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->acceleration_y); - cs.ReadWrite(vehicleCrashParticle, vehicleCrashParticle->acceleration_z); - break; - } - case MiscEntityType::ExplosionCloud: - case MiscEntityType::CrashSplash: - case MiscEntityType::ExplosionFlare: - { - cs.ReadWrite(entity.frame); - break; - } - case MiscEntityType::JumpingFountainWater: - case MiscEntityType::JumpingFountainSnow: - { - auto fountain = entity.As(); - cs.ReadWrite(fountain->NumTicksAlive); - cs.ReadWrite(fountain->frame); - cs.ReadWrite(fountain->FountainFlags); - cs.ReadWrite(fountain->TargetX); - cs.ReadWrite(fountain->TargetY); - cs.ReadWrite(fountain->TargetY); - cs.ReadWrite(fountain->Iteration); - break; - } - case MiscEntityType::Balloon: - { - auto balloon = entity.As(); - cs.ReadWrite(balloon->popped); - cs.ReadWrite(balloon->time_to_move); - cs.ReadWrite(balloon->frame); - cs.ReadWrite(balloon->colour); - break; - } - case MiscEntityType::Duck: - { - auto duck = entity.As(); - cs.ReadWrite(duck->frame); - cs.ReadWrite(duck->target_x); - cs.ReadWrite(duck->target_y); - cs.ReadWrite(duck->state); - break; - } + cs.Write(ent->sprite_index); + ReadWriteEntity(cs, *ent); } } - static void ReadWriteEntityLitter(OrcaStream::ChunkStream& cs, Litter& entity) + template void WriteEntitiesOfTypes(OrcaStream::ChunkStream& cs) { - cs.ReadWrite(entity.SubType); - cs.ReadWrite(entity.creationTick); + (WriteEntitiesOfType(cs), ...); + } + + template void ReadEntitiesOfType(OrcaStream::ChunkStream& cs) + { + auto t = cs.Read(); + assert(t == T::cEntityType); + auto count = cs.Read(); + for (auto i = 0; i < count; ++i) + { + auto index = cs.Read(); + auto* ent = CreateEntityAt(index); + ReadWriteEntity(cs, *ent); + } + } + + template void ReadEntitiesOfTypes(OrcaStream::ChunkStream& cs) + { + (ReadEntitiesOfType(cs), ...); + } + + void ReadWriteEntitiesChunk(OrcaStream& os) + { + os.ReadWriteChunk(ParkFileChunkType::ENTITIES, [this](OrcaStream::ChunkStream& cs) { + if (cs.GetMode() == OrcaStream::Mode::READING) + { + reset_sprite_list(); + } + + std::vector entityIndices; + if (cs.GetMode() == OrcaStream::Mode::READING) + { + ReadEntitiesOfTypes< + Vehicle, Guest, Staff, Litter, SteamParticle, MoneyEffect, VehicleCrashParticle, ExplosionCloud, + CrashSplashParticle, ExplosionFlare, JumpingFountain, Balloon, Duck>(cs); + } + else + { + WriteEntitiesOfTypes< + Vehicle, Guest, Staff, Litter, SteamParticle, MoneyEffect, VehicleCrashParticle, ExplosionCloud, + CrashSplashParticle, ExplosionFlare, JumpingFountain, Balloon, Duck>(cs); + } + }); } void AutoDeriveVariables()