1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-20 05:23:04 +01:00

Create calls for min/max cars per train

This commit is contained in:
Michael Steenbeek
2020-11-05 17:42:02 +01:00
committed by GitHub
parent 69b07904c1
commit eea57f2bfe
9 changed files with 74 additions and 9 deletions

View File

@@ -2821,10 +2821,10 @@ static OpenRCT2String window_ride_vehicle_tooltip(
auto ft = Formatter();
ft.Increment(16);
ft.Add<uint16_t>(std::max(1, ride->min_max_cars_per_train & 0xF) - rideEntry->zero_cars);
ft.Add<uint16_t>(std::max(uint8_t(1), ride->GetMaxCarsPerTrain()) - rideEntry->zero_cars);
rct_string_id stringId = RideComponentNames[RIDE_COMPONENT_TYPE_CAR].singular;
if ((ride->min_max_cars_per_train & 0xF) - rideEntry->zero_cars > 1)
if (ride->GetMaxCarsPerTrain() - rideEntry->zero_cars > 1)
{
stringId = RideComponentNames[RIDE_COMPONENT_TYPE_CAR].plural;
}

View File

@@ -309,7 +309,8 @@ public:
ride->num_circuits = 1;
ride->mode = ride->GetDefaultMode();
ride->min_max_cars_per_train = (rideEntry->min_cars_in_train << 4) | rideEntry->max_cars_in_train;
ride->SetMinCarsPerTrain(rideEntry->min_cars_in_train);
ride->SetMaxCarsPerTrain(rideEntry->max_cars_in_train);
ride_set_vehicle_colours_to_random_preset(ride, _colour2);
window_invalidate_by_class(WC_RIDE_LIST);

View File

@@ -836,7 +836,8 @@ private:
dst->max_waiting_time = src->max_waiting_time;
dst->operation_option = src->operation_option;
dst->num_circuits = 1;
dst->min_max_cars_per_train = (rideEntry->min_cars_in_train << 4) | rideEntry->max_cars_in_train;
dst->SetMinCarsPerTrain(rideEntry->min_cars_in_train);
dst->SetMaxCarsPerTrain(rideEntry->max_cars_in_train);
// RCT1 used 5mph / 8 km/h for every lift hill
dst->lift_hill_speed = 5;

View File

@@ -83,3 +83,25 @@ uint8_t OpenRCT2RideTypeToRCT2RideType(ObjectEntryIndex openrct2Type)
return openrct2Type;
}
}
uint8_t rct2_ride::GetMinCarsPerTrain() const
{
return min_max_cars_per_train >> 4;
}
uint8_t rct2_ride::GetMaxCarsPerTrain() const
{
return min_max_cars_per_train & 0xF;
}
void rct2_ride::SetMinCarsPerTrain(uint8_t newValue)
{
min_max_cars_per_train &= ~0xF0;
min_max_cars_per_train |= (newValue << 4);
}
void rct2_ride::SetMaxCarsPerTrain(uint8_t newValue)
{
min_max_cars_per_train &= ~0x0F;
min_max_cars_per_train |= newValue & 0x0F;
}

View File

@@ -318,6 +318,11 @@ struct rct2_ride
uint16_t cable_lift; // 0x1FE
uint16_t queue_length[RCT12_MAX_STATIONS_PER_RIDE]; // 0x200
uint8_t pad_208[0x58]; // 0x208
uint8_t GetMinCarsPerTrain() const;
uint8_t GetMaxCarsPerTrain() const;
void SetMinCarsPerTrain(uint8_t newValue);
void SetMaxCarsPerTrain(uint8_t newValue);
};
assert_struct_size(rct2_ride, 0x260);

View File

@@ -606,7 +606,8 @@ void S6Exporter::ExportRide(rct2_ride* dst, const Ride* src)
dst->proposed_num_vehicles = src->proposed_num_vehicles;
dst->proposed_num_cars_per_train = src->proposed_num_cars_per_train;
dst->max_trains = src->max_trains;
dst->min_max_cars_per_train = src->min_max_cars_per_train;
dst->SetMinCarsPerTrain(src->GetMinCarsPerTrain());
dst->SetMaxCarsPerTrain(src->GetMaxCarsPerTrain());
dst->min_waiting_time = src->min_waiting_time;
dst->max_waiting_time = src->max_waiting_time;

View File

@@ -627,7 +627,8 @@ public:
dst->proposed_num_vehicles = src->proposed_num_vehicles;
dst->proposed_num_cars_per_train = src->proposed_num_cars_per_train;
dst->max_trains = src->max_trains;
dst->min_max_cars_per_train = src->min_max_cars_per_train;
dst->SetMinCarsPerTrain(src->GetMinCarsPerTrain());
dst->SetMaxCarsPerTrain(src->GetMaxCarsPerTrain());
dst->min_waiting_time = src->min_waiting_time;
dst->max_waiting_time = src->max_waiting_time;

View File

@@ -6658,7 +6658,8 @@ void Ride::UpdateMaxVehicles()
{
int32_t trainLength;
num_cars_per_train = std::max(rideEntry->min_cars_in_train, num_cars_per_train);
min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4);
SetMinCarsPerTrain(rideEntry->min_cars_in_train);
SetMaxCarsPerTrain(rideEntry->max_cars_in_train);
// Calculate maximum train length based on smallest station length
auto stationNumTiles = ride_get_smallest_station_length(this);
@@ -6691,7 +6692,8 @@ void Ride::UpdateMaxVehicles()
{
newCarsPerTrain = std::min(maxCarsPerTrain, newCarsPerTrain);
}
min_max_cars_per_train = maxCarsPerTrain | (rideEntry->min_cars_in_train << 4);
SetMaxCarsPerTrain(maxCarsPerTrain);
SetMinCarsPerTrain(rideEntry->min_cars_in_train);
switch (mode)
{
@@ -6769,7 +6771,8 @@ void Ride::UpdateMaxVehicles()
else
{
max_trains = rideEntry->cars_per_flat_ride;
min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4);
SetMinCarsPerTrain(rideEntry->min_cars_in_train);
SetMaxCarsPerTrain(rideEntry->max_cars_in_train);
numCarsPerTrain = rideEntry->max_cars_in_train;
maxNumTrains = rideEntry->cars_per_flat_ride;
}
@@ -7619,3 +7622,25 @@ const RideTypeDescriptor& Ride::GetRideTypeDescriptor() const
{
return RideTypeDescriptors[type];
}
uint8_t Ride::GetMinCarsPerTrain() const
{
return min_max_cars_per_train >> 4;
}
uint8_t Ride::GetMaxCarsPerTrain() const
{
return min_max_cars_per_train & 0xF;
}
void Ride::SetMinCarsPerTrain(uint8_t newValue)
{
min_max_cars_per_train &= ~0xF0;
min_max_cars_per_train |= (newValue << 4);
}
void Ride::SetMaxCarsPerTrain(uint8_t newValue)
{
min_max_cars_per_train &= ~0x0F;
min_max_cars_per_train |= newValue & 0x0F;
}

View File

@@ -221,7 +221,11 @@ struct Ride
uint8_t proposed_num_vehicles;
uint8_t proposed_num_cars_per_train;
uint8_t max_trains;
private:
uint8_t min_max_cars_per_train;
public:
uint8_t min_waiting_time;
uint8_t max_waiting_time;
union
@@ -443,6 +447,11 @@ public:
TrackElement* GetOriginElement(StationIndex stationIndex) const;
std::pair<RideMeasurement*, OpenRCT2String> GetMeasurement();
uint8_t GetMinCarsPerTrain() const;
uint8_t GetMaxCarsPerTrain() const;
void SetMinCarsPerTrain(uint8_t newValue);
void SetMaxCarsPerTrain(uint8_t newValue);
};
#pragma pack(push, 1)