mirror of https://github.com/OpenRCT2/OpenRCT2.git
Finish entity fixes
This commit is contained in:
parent
e7113a9f26
commit
44c9cca676
|
@ -750,73 +750,12 @@ namespace OpenRCT2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> void WriteEntitiesOfType(OrcaStream::ChunkStream& cs)
|
template<typename T> static void ReadWriteEntity(OrcaStream::ChunkStream& cs, T& entity);
|
||||||
{
|
|
||||||
auto count = GetEntityListCount(T::cEntityType);
|
|
||||||
cs.Write(T::cEntityType);
|
|
||||||
cs.Write(count);
|
|
||||||
for (auto* ent : EntityList<T>())
|
|
||||||
{
|
|
||||||
ReadWriteEntity(cs, *ent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
template<typename... T> void WriteEntitiesOfTypes(OrcaStream::ChunkStream& cs)
|
|
||||||
{
|
|
||||||
(WriteEntitiesOfType<T>(cs), ...);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ReadWriteEntitiesChunk(OrcaStream& os)
|
|
||||||
{
|
|
||||||
os.ReadWriteChunk(ParkFileChunkType::ENTITIES, [this](OrcaStream::ChunkStream& cs) {
|
|
||||||
if (cs.GetMode() == OrcaStream::Mode::READING)
|
|
||||||
{
|
|
||||||
reset_sprite_list();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<uint16_t> 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<Vehicle>());
|
|
||||||
break;
|
|
||||||
case SpriteIdentifier::Peep:
|
|
||||||
ReadWriteEntityPeep(cs, *entity.As<Peep>());
|
|
||||||
break;
|
|
||||||
case SpriteIdentifier::Misc:
|
|
||||||
ReadWriteEntityMisc(cs, *entity.As<MiscEntity>());
|
|
||||||
break;
|
|
||||||
case SpriteIdentifier::Litter:
|
|
||||||
ReadWriteEntityLitter(cs, *entity.As<Litter>());
|
|
||||||
break;
|
|
||||||
case SpriteIdentifier::Null:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ReadWriteEntityCommon(OrcaStream::ChunkStream& cs, SpriteBase& entity)
|
static void ReadWriteEntityCommon(OrcaStream::ChunkStream& cs, SpriteBase& entity)
|
||||||
{
|
{
|
||||||
cs.ReadWrite(entity.sprite_height_negative);
|
|
||||||
cs.ReadWrite(entity.sprite_index);
|
cs.ReadWrite(entity.sprite_index);
|
||||||
|
cs.ReadWrite(entity.sprite_height_negative);
|
||||||
cs.ReadWrite(entity.flags);
|
cs.ReadWrite(entity.flags);
|
||||||
cs.ReadWrite(entity.x);
|
cs.ReadWrite(entity.x);
|
||||||
cs.ReadWrite(entity.y);
|
cs.ReadWrite(entity.y);
|
||||||
|
@ -826,8 +765,9 @@ namespace OpenRCT2
|
||||||
cs.ReadWrite(entity.sprite_direction);
|
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();
|
auto ride = entity.GetRide();
|
||||||
cs.ReadWrite(entity.SubType);
|
cs.ReadWrite(entity.SubType);
|
||||||
cs.ReadWrite(entity.vehicle_sprite_type);
|
cs.ReadWrite(entity.vehicle_sprite_type);
|
||||||
|
@ -902,8 +842,17 @@ namespace OpenRCT2
|
||||||
cs.ReadWrite(entity.target_seat_rotation);
|
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.Name);
|
||||||
cs.ReadWrite(entity.NextLoc);
|
cs.ReadWrite(entity.NextLoc);
|
||||||
cs.ReadWrite(entity.NextFlags);
|
cs.ReadWrite(entity.NextFlags);
|
||||||
|
@ -1017,90 +966,145 @@ namespace OpenRCT2
|
||||||
cs.ReadWrite(entity.FavouriteRideRating);
|
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<typename T> void WriteEntitiesOfType(OrcaStream::ChunkStream& cs)
|
||||||
|
{
|
||||||
|
uint16_t count = GetEntityListCount(T::cEntityType);
|
||||||
|
cs.Write(T::cEntityType);
|
||||||
|
cs.Write(count);
|
||||||
|
for (auto* ent : EntityList<T>())
|
||||||
{
|
{
|
||||||
case MiscEntityType::SteamParticle:
|
cs.Write(ent->sprite_index);
|
||||||
{
|
ReadWriteEntity(cs, *ent);
|
||||||
auto steamParticle = entity.As<SteamParticle>();
|
|
||||||
cs.ReadWrite(steamParticle->time_to_move);
|
|
||||||
cs.ReadWrite(steamParticle->frame);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MiscEntityType::MoneyEffect:
|
|
||||||
{
|
|
||||||
auto moneyEffect = entity.As<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);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MiscEntityType::CrashedVehicleParticle:
|
|
||||||
{
|
|
||||||
auto vehicleCrashParticle = entity.As<VehicleCrashParticle>();
|
|
||||||
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<JumpingFountain>();
|
|
||||||
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<Balloon>();
|
|
||||||
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<Duck>();
|
|
||||||
cs.ReadWrite(duck->frame);
|
|
||||||
cs.ReadWrite(duck->target_x);
|
|
||||||
cs.ReadWrite(duck->target_y);
|
|
||||||
cs.ReadWrite(duck->state);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ReadWriteEntityLitter(OrcaStream::ChunkStream& cs, Litter& entity)
|
template<typename... T> void WriteEntitiesOfTypes(OrcaStream::ChunkStream& cs)
|
||||||
{
|
{
|
||||||
cs.ReadWrite(entity.SubType);
|
(WriteEntitiesOfType<T>(cs), ...);
|
||||||
cs.ReadWrite(entity.creationTick);
|
}
|
||||||
|
|
||||||
|
template<typename T> void ReadEntitiesOfType(OrcaStream::ChunkStream& cs)
|
||||||
|
{
|
||||||
|
auto t = cs.Read<EntityType>();
|
||||||
|
assert(t == T::cEntityType);
|
||||||
|
auto count = cs.Read<uint16_t>();
|
||||||
|
for (auto i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
auto index = cs.Read<uint16_t>();
|
||||||
|
auto* ent = CreateEntityAt<T>(index);
|
||||||
|
ReadWriteEntity(cs, *ent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename... T> void ReadEntitiesOfTypes(OrcaStream::ChunkStream& cs)
|
||||||
|
{
|
||||||
|
(ReadEntitiesOfType<T>(cs), ...);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReadWriteEntitiesChunk(OrcaStream& os)
|
||||||
|
{
|
||||||
|
os.ReadWriteChunk(ParkFileChunkType::ENTITIES, [this](OrcaStream::ChunkStream& cs) {
|
||||||
|
if (cs.GetMode() == OrcaStream::Mode::READING)
|
||||||
|
{
|
||||||
|
reset_sprite_list();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint16_t> 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()
|
void AutoDeriveVariables()
|
||||||
|
|
Loading…
Reference in New Issue