import block brake from legacy file types

This commit is contained in:
Spacek531 2023-03-05 22:22:47 -08:00
parent 99ffaa8b71
commit 115fc957c0
3 changed files with 39 additions and 5 deletions

View File

@ -1674,6 +1674,8 @@ namespace RCT1
// Skipping IsHighlighted()
auto trackType = dst2->GetTrackType();
// Brakes import as closed to preserve legacy behaviour
dst2->SetBrakeClosed(trackType == TrackElemType::Brakes);
if (TrackTypeHasSpeedSetting(trackType))
{
dst2->SetBrakeBoosterSpeed(src2->GetBrakeBoosterSpeed());
@ -2817,6 +2819,7 @@ namespace RCT1
{
dst->SetFlag(VehicleFlags::Crashed);
}
dst->BlockBrakeSpeed = kRCT2DefaultBlockBrakeSpeed;
}
template<> void S4Importer::ImportEntity<Guest>(const RCT12EntityBase& srcBase)

View File

@ -1440,11 +1440,17 @@ namespace RCT2
dst2->SetInverted(src2->IsInverted());
dst2->SetStationIndex(StationIndex::FromUnderlying(src2->GetStationIndex()));
dst2->SetHasGreenLight(src2->HasGreenLight());
dst2->SetBrakeClosed(src2->BlockBrakeClosed());
// Brakes import as closed to preserve legacy behaviour
dst2->SetBrakeClosed(src2->BlockBrakeClosed() || (trackType == TrackElemType::Brakes));
dst2->SetIsIndestructible(src2->IsIndestructible());
// Skipping IsHighlighted()
if (TrackTypeHasSpeedSetting(trackType))
// Import block brakes to keep legacy behaviour
if (trackType == TrackElemType::BlockBrakes)
{
dst2->SetBrakeBoosterSpeed(kRCT2DefaultBlockBrakeSpeed);
}
else if (TrackTypeHasSpeedSetting(trackType))
{
dst2->SetBrakeBoosterSpeed(src2->GetBrakeBoosterSpeed());
}
@ -2009,6 +2015,10 @@ namespace RCT2
if (tileElement2 != nullptr)
dst->SetTrackType(TrackElemType::RotationControlToggle);
}
else if (src->GetTrackType() == TrackElemType::BlockBrakes)
{
dst->brake_speed = kRCT2DefaultBlockBrakeSpeed;
}
}
else
{
@ -2075,6 +2085,7 @@ namespace RCT2
{
dst->SetFlag(VehicleFlags::Crashed);
}
dst->BlockBrakeSpeed = kRCT2DefaultBlockBrakeSpeed;
}
static uint32_t AdjustScenarioToCurrentTicks(const S6Data& s6, uint32_t tick)

View File

@ -182,6 +182,8 @@ ResultWithMessage TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, con
return { false, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY };
}
StringId warningMessage = STR_NONE;
RideGetStartOfTrack(&trackElement);
int32_t z = trackElement.element->GetBaseZ();
@ -222,7 +224,8 @@ ResultWithMessage TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, con
track.type = trackElement.element->AsTrack()->GetTrackType();
uint8_t trackFlags;
if (TrackTypeHasSpeedSetting(track.type))
// 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() >> 1;
}
@ -231,6 +234,13 @@ ResultWithMessage TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, con
trackFlags = trackElement.element->AsTrack()->GetSeatRotation();
}
// This warning will not apply to new track design format
if (track.type == TrackElemType::BlockBrakes
&& trackElement.element->AsTrack()->GetBrakeBoosterSpeed() != kRCT2DefaultBlockBrakeSpeed)
{
warningMessage = STR_TRACK_DESIGN_BLOCK_BRAKE_SPEED_RESET;
}
if (trackElement.element->AsTrack()->HasChain())
trackFlags |= RCT12_TRACK_ELEMENT_TYPE_FLAG_CHAIN_LIFT;
trackFlags |= trackElement.element->AsTrack()->GetColourScheme() << 4;
@ -349,7 +359,7 @@ ResultWithMessage TrackDesign::CreateTrackDesignTrack(TrackDesignState& tds, con
space_required_x = ((tds.PreviewMax.x - tds.PreviewMin.x) / 32) + 1;
space_required_y = ((tds.PreviewMax.y - tds.PreviewMin.y) / 32) + 1;
return { true };
return { true, warningMessage };
}
ResultWithMessage TrackDesign::CreateTrackDesignMaze(TrackDesignState& tds, const Ride& ride)
@ -1617,7 +1627,17 @@ static GameActions::Result TrackDesignPlaceRide(TrackDesignState& tds, TrackDesi
// di
int16_t tempZ = newCoords.z - trackCoordinates->z_begin;
uint32_t trackColour = (track.flags >> 4) & 0x3;
uint32_t brakeSpeed = (track.flags & 0x0F) * 2;
uint32_t brakeSpeed;
// RCT2-created track designs write brake speed to all tracks; block brake speed must be treated as
// garbage data.
if (trackType == TrackElemType::BlockBrakes)
{
brakeSpeed = kRCT2DefaultBlockBrakeSpeed;
}
else
{
brakeSpeed = (track.flags & 0x0F) * 2;
}
uint32_t seatRotation = track.flags & 0x0F;
int32_t liftHillAndAlternativeState = 0;