add import code

This commit is contained in:
Spacek531 2024-04-13 17:20:16 -07:00
parent 516314af41
commit 2b9e714f15
6 changed files with 141 additions and 18 deletions

View File

@ -44,6 +44,7 @@
#include "../object/ObjectManager.h"
#include "../object/ObjectRepository.h"
#include "../peep/RideUseSystem.h"
#include "../ride/RideData.h"
#include "../ride/ShopItem.h"
#include "../ride/Vehicle.h"
#include "../scenario/Scenario.h"
@ -65,6 +66,7 @@
#include <vector>
constexpr uint32_t BlockBrakeImprovementsVersion = 27;
constexpr uint32_t UnifyBoosterSpeedVersion = 33;
using namespace OpenRCT2;
@ -1102,12 +1104,21 @@ namespace OpenRCT2
{
it.element->SetInvisible(true);
}
if (os.GetHeader().TargetVersion < BlockBrakeImprovementsVersion)
if (os.GetHeader().TargetVersion < UnifyBoosterSpeedVersion)
{
if (trackType == TrackElemType::Brakes)
trackElement->SetBrakeClosed(true);
if (trackType == TrackElemType::BlockBrakes)
trackElement->SetBrakeBoosterSpeed(kRCT2DefaultBlockBrakeSpeed);
auto brakeSpeed = trackElement->GetBrakeBoosterSpeed() * kLegacyBrakeSpeedMultiplier;
if (trackType == TrackElemType::Booster)
{
brakeSpeed = GetAbsoluteBoosterSpeed(trackElement->GetRideType(), brakeSpeed);
}
if (os.GetHeader().TargetVersion < BlockBrakeImprovementsVersion)
{
if (trackType == TrackElemType::Brakes)
trackElement->SetBrakeClosed(true);
if (trackType == TrackElemType::BlockBrakes)
brakeSpeed = kRCT2DefaultBlockBrakeSpeed;
}
trackElement->SetBrakeBoosterSpeed(brakeSpeed);
}
}
else if (
@ -1297,6 +1308,8 @@ namespace OpenRCT2
cs.ReadWrite(ride.status);
cs.ReadWrite(ride.depart_flags);
cs.ReadWrite(ride.lifecycle_flags);
if (version < UnifyBoosterSpeedVersion)
ride.SetLifecycleFlag(RIDE_LIFECYCLE_LEGACY_BOOSTER_SPEED, true);
// Meta
cs.ReadWrite(ride.custom_name);
@ -2100,13 +2113,36 @@ namespace OpenRCT2
cs.ReadWrite(entity.scream_sound_id);
cs.ReadWrite(entity.TrackSubposition);
cs.ReadWrite(entity.NumLaps);
if (cs.GetMode() == OrcaStream::Mode::READING && os.GetHeader().TargetVersion < BlockBrakeImprovementsVersion)
if (cs.GetMode() == OrcaStream::Mode::READING && os.GetHeader().TargetVersion < UnifyBoosterSpeedVersion)
{
entity.SetFlag(VehicleFlags::LegacyBoosterSpeed);
uint8_t brakeSpeed;
cs.ReadWrite(brakeSpeed);
if (entity.GetTrackType() == TrackElemType::BlockBrakes)
brakeSpeed = kRCT2DefaultBlockBrakeSpeed;
entity.brake_speed = brakeSpeed;
auto trackType = entity.GetTrackType();
auto rtd = entity.GetRide()->GetRideTypeDescriptor();
if (trackType == TrackElemType::Booster)
{
entity.BoosterAcceleration = rtd.OperatingSettings.BoosterAcceleration;
brakeSpeed = rtd.GetAbsoluteBoosterSpeed(brakeSpeed);
}
else if (
(trackType == TrackElemType::PoweredLift)
|| (trackType == TrackElemType::Flat && entity.GetRide()->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER))
{
entity.BoosterAcceleration = rtd.OperatingSettings.PoweredLiftAcceleration;
entity.SetFlag(VehicleFlags::OnPoweredLift);
}
entity.brake_speed = brakeSpeed * kLegacyBrakeSpeedMultiplier;
if (os.GetHeader().TargetVersion < BlockBrakeImprovementsVersion)
{
if (entity.GetTrackType() == TrackElemType::BlockBrakes)
{
entity.brake_speed = kRCT2DefaultBlockBrakeSpeed;
}
entity.BlockBrakeSpeed = entity.brake_speed;
}
}
else
{
@ -2130,6 +2166,7 @@ namespace OpenRCT2
entity.SetFlag(VehicleFlags::Crashed);
}
}
if (cs.GetMode() == OrcaStream::Mode::READING && os.GetHeader().TargetVersion < BlockBrakeImprovementsVersion)
{
entity.BlockBrakeSpeed = kRCT2DefaultBlockBrakeSpeed;
@ -2138,6 +2175,11 @@ namespace OpenRCT2
{
cs.ReadWrite(entity.BlockBrakeSpeed);
}
if (os.GetHeader().TargetVersion >= UnifyBoosterSpeedVersion)
{
cs.ReadWrite(entity.BoosterAcceleration);
}
}
template<> void ParkFile::ReadWriteEntity(OrcaStream& os, OrcaStream::ChunkStream& cs, Guest& guest)

View File

@ -862,6 +862,7 @@ namespace RCT1
{
dst->lifecycle_flags |= RIDE_LIFECYCLE_REVERSED_TRAINS;
}
dst->SetLifecycleFlag(RIDE_LIFECYCLE_LEGACY_BOOSTER_SPEED, true);
// Station
if (src->OverallView.IsNull())
@ -1696,7 +1697,15 @@ namespace RCT1
dst2->SetBrakeClosed(trackType == TrackElemType::Brakes);
if (TrackTypeHasSpeedSetting(trackType))
{
dst2->SetBrakeBoosterSpeed(src2->GetBrakeBoosterSpeed());
auto brakeSpeed = src2->GetBrakeBoosterSpeed() * kLegacyBrakeSpeedMultiplier;
if (dst2->GetTrackType() != TrackElemType::Booster)
{
dst2->SetBrakeBoosterSpeed(brakeSpeed);
}
else
{
dst2->SetBrakeBoosterSpeed(GetAbsoluteBoosterSpeed(rideType, brakeSpeed));
}
}
else if (trackType == TrackElemType::OnRidePhoto)
{
@ -2111,7 +2120,7 @@ namespace RCT1
void InsertResearchVehicle(const ResearchItem& researchItem, bool researched)
{
uint8_t vehicle = researchItem.Item;
// RCT1 research sometimes contain vehicles that arent actually researched.
// RCT1 research sometimes contain vehicles that aren<EFBFBD>t actually researched.
// In such cases, `_vehicleTypeToRideEntryMap` will return OBJECT_ENTRY_INDEX_NULL. This is expected.
auto rideEntryIndex = _vehicleTypeToRideEntryMap[vehicle];
@ -2847,7 +2856,6 @@ namespace RCT1
dst->num_seats = src->NumSeats;
dst->speed = src->Speed;
dst->powered_acceleration = src->PoweredAcceleration;
dst->brake_speed = src->BrakeSpeed;
dst->velocity = src->Velocity;
dst->acceleration = src->Acceleration;
@ -2912,10 +2920,26 @@ namespace RCT1
dst->SetTrackDirection(0);
dst->SetTrackType(0);
}
dst->brake_speed = src->BrakeSpeed * kLegacyBrakeSpeedMultiplier;
dst->BlockBrakeSpeed = kRCT2DefaultBlockBrakeSpeed;
dst->Flags = src->UpdateFlags;
dst->SetFlag(VehicleFlags::LegacyBoosterSpeed);
if ((dst->GetTrackType() == TrackElemType::PoweredLift)
|| (dst->GetTrackType() == TrackElemType::Flat && ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER))
{
dst->BoosterAcceleration = ride->GetRideTypeDescriptor().OperatingSettings.PoweredLiftAcceleration;
dst->SetFlag(VehicleFlags::OnPoweredLift);
}
else if (dst->GetTrackType() == TrackElemType::Booster)
{
dst->brake_speed = ride->GetRideTypeDescriptor().GetAbsoluteBoosterSpeed(dst->brake_speed);
dst->BoosterAcceleration = ride->GetRideTypeDescriptor().OperatingSettings.BoosterAcceleration;
}
dst->track_progress = src->TrackProgress;
dst->vertical_drop_countdown = src->VerticalDropCountdown;
dst->sub_state = src->SubState;
dst->Flags = src->UpdateFlags;
SetVehicleColours(dst, src);

View File

@ -18,6 +18,7 @@
#include "../ride/Ride.h"
#include "../ride/Track.h"
#include "../ride/TrackDesign.h"
#include "../ride/Vehicle.h"
#include "../scenario/Scenario.h"
#include "../world/Banner.h"
#include "../world/Footpath.h"
@ -248,7 +249,7 @@ uint8_t RCT12TrackElement::GetBrakeBoosterSpeed() const
{
if (TrackTypeHasSpeedSetting(GetTrackType()))
{
return (Sequence >> 4) << 1;
return Sequence >> 4;
}
return 0;
}

View File

@ -1588,6 +1588,7 @@ namespace RCT2
dst->lift_hill_speed = src->LiftHillSpeed;
dst->guests_favourite = src->GuestsFavourite;
dst->lifecycle_flags = src->LifecycleFlags;
dst->SetLifecycleFlag(RIDE_LIFECYCLE_LEGACY_BOOSTER_SPEED, true);
for (uint8_t i = 0; i < Limits::MaxTrainsPerRide; i++)
{
@ -1964,7 +1965,15 @@ namespace RCT2
}
else if (TrackTypeHasSpeedSetting(trackType))
{
dst2->SetBrakeBoosterSpeed(src2->GetBrakeBoosterSpeed());
auto brakeSpeed = src2->GetBrakeBoosterSpeed() * kLegacyBrakeSpeedMultiplier;
if (dst2->GetTrackType() == TrackElemType::Booster)
{
dst2->SetBrakeBoosterSpeed(GetAbsoluteBoosterSpeed(rideType, brakeSpeed));
}
else
{
dst2->SetBrakeBoosterSpeed(brakeSpeed);
}
}
else if (trackType == TrackElemType::OnRidePhoto)
{
@ -2584,7 +2593,22 @@ namespace RCT2
dst->scream_sound_id = static_cast<OpenRCT2::Audio::SoundId>(src->ScreamSoundId);
dst->TrackSubposition = VehicleTrackSubposition{ src->TrackSubposition };
dst->NumLaps = src->NumLaps;
dst->brake_speed = src->BrakeSpeed;
dst->brake_speed = src->BrakeSpeed * kLegacyBrakeSpeedMultiplier;
dst->SetFlag(VehicleFlags::LegacyBoosterSpeed);
if ((dst->GetTrackType() == TrackElemType::PoweredLift)
|| (dst->GetTrackType() == TrackElemType::Flat && ride.Type == RIDE_TYPE_REVERSE_FREEFALL_COASTER))
{
dst->BoosterAcceleration = GetRideTypeDescriptor(ride.Type).OperatingSettings.PoweredLiftAcceleration;
dst->SetFlag(VehicleFlags::OnPoweredLift);
}
else if (dst->GetTrackType() == TrackElemType::Booster)
{
dst->brake_speed = GetRideTypeDescriptor(ride.Type).GetAbsoluteBoosterSpeed(dst->brake_speed);
dst->BoosterAcceleration = GetRideTypeDescriptor(ride.Type).OperatingSettings.BoosterAcceleration;
}
dst->lost_time_out = src->LostTimeOut;
dst->vertical_drop_countdown = src->VerticalDropCountdown;
dst->var_D3 = src->VarD3;

View File

@ -227,8 +227,40 @@ ResultWithMessage TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, con
track.BrakeBoosterSpeed = element->GetBrakeBoosterSpeed();
track.SeatRotation = element->GetSeatRotation();
uint8_t trackFlags;
// This if-else block only applies to td6. New track design format will always encode speed and seat rotation.
if (TrackTypeHasSpeedSetting(track.Type) && track.Type != TrackElemType::BlockBrakes)
{
trackFlags = trackElement.element->AsTrack()->GetBrakeBoosterSpeed();
if (track.Type == TrackElemType::Booster)
{
trackFlags = ride.GetRideTypeDescriptor().GetRelativeBoosterSpeed(trackFlags);
}
// check to ensure the value is serializable. This warning will not apply to new track design format
bool tooHigh = trackFlags > kLegacyBrakeSpeedMask;
bool tooPrecise = trackFlags & 1;
if (tooPrecise || tooHigh)
{
warningMessage = STR_TRACK_DESIGN_SPEED_UNSERIALIZABLE;
}
if (tooPrecise)
{
trackFlags += 1;
}
trackFlags = std::min<uint8_t>(trackFlags, kLegacyBrakeSpeedMask);
trackFlags /= kLegacyBrakeSpeedMultiplier;
trackFlags &= 0xF;
}
else
{
trackFlags = trackElement.element->AsTrack()->GetSeatRotation();
}
// This warning will not apply to new track design format
if (track.Type == TrackElemType::BlockBrakes && element->GetBrakeBoosterSpeed() != kRCT2DefaultBlockBrakeSpeed)
if (track.Type == TrackElemType::BlockBrakes && element->GetBrakeBoosterSpeed() != kRCT2DefaultBlockBrakeSpeed
&& warningMessage == STR_NONE)
{
warningMessage = STR_TRACK_DESIGN_BLOCK_BRAKE_SPEED_RESET;
}

View File

@ -345,7 +345,7 @@ private:
// - Bits 1 and 2 are set when a vehicle triggers the on-ride photo and act like a countdown from 3.
// - If any of the bits 1-4 are set, the game counts it as a photo being taken.
uint8_t OnridePhotoBits;
// Contains the brake/booster speed, divided by 2.
// Contains the brake/booster speed
uint8_t BrakeBoosterSpeed;
};
StationIndex stationIndex;