mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-15 11:03:00 +01:00
Fix #8142: Reliability of unbreakable rides can go below 100%
This commit is contained in:
committed by
Michael Steenbeek
parent
f8add7f62e
commit
0cd7f1e07c
@@ -28,7 +28,7 @@
|
||||
// This string specifies which version of network stream current build uses.
|
||||
// It is used for making sure only compatible builds get connected, even within
|
||||
// single OpenRCT2 version.
|
||||
#define NETWORK_STREAM_VERSION "6"
|
||||
#define NETWORK_STREAM_VERSION "7"
|
||||
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
|
||||
|
||||
static rct_peep* _pickup_peep = nullptr;
|
||||
|
||||
@@ -262,7 +262,7 @@ rct_ride_measurement* get_ride_measurement(int32_t index)
|
||||
return &gRideMeasurements[index];
|
||||
}
|
||||
|
||||
rct_ride_entry* get_ride_entry_by_ride(Ride* ride)
|
||||
rct_ride_entry* get_ride_entry_by_ride(const Ride* ride)
|
||||
{
|
||||
rct_ride_entry* type = get_ride_entry(ride->subtype);
|
||||
if (type == nullptr)
|
||||
@@ -2479,6 +2479,12 @@ static void ride_breakdown_update(int32_t rideIndex)
|
||||
if (ride->status == RIDE_STATUS_CLOSED)
|
||||
return;
|
||||
|
||||
if (!ride->CanBreakDown())
|
||||
{
|
||||
ride->reliability = RIDE_INITIAL_RELIABILITY;
|
||||
return;
|
||||
}
|
||||
|
||||
// Calculate breakdown probability?
|
||||
int32_t unreliabilityAccumulator = ride->unreliability_factor + get_age_penalty(ride);
|
||||
ride->reliability = (uint16_t)std::max(0, (ride->reliability - unreliabilityAccumulator));
|
||||
@@ -2506,13 +2512,11 @@ static void ride_breakdown_update(int32_t rideIndex)
|
||||
static int32_t ride_get_new_breakdown_problem(Ride* ride)
|
||||
{
|
||||
int32_t availableBreakdownProblems, monthsOld, totalProbability, randomProbability, problemBits, breakdownProblem;
|
||||
rct_ride_entry* entry;
|
||||
|
||||
// Brake failure is more likely when it's raining
|
||||
_breakdownProblemProbabilities[BREAKDOWN_BRAKES_FAILURE] = climate_is_raining() ? 20 : 3;
|
||||
|
||||
entry = get_ride_entry_by_ride(ride);
|
||||
if (entry == nullptr || entry->flags & RIDE_ENTRY_FLAG_CANNOT_BREAK_DOWN)
|
||||
if (!ride->CanBreakDown())
|
||||
return -1;
|
||||
|
||||
availableBreakdownProblems = RideAvailableBreakdowns[ride->type];
|
||||
@@ -2562,6 +2566,22 @@ static int32_t ride_get_new_breakdown_problem(Ride* ride)
|
||||
return BREAKDOWN_BRAKES_FAILURE;
|
||||
}
|
||||
|
||||
bool Ride::CanBreakDown() const
|
||||
{
|
||||
if (RideAvailableBreakdowns[this->type] == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
rct_ride_entry* entry = get_ride_entry_by_ride(this);
|
||||
if (entry == nullptr || entry->flags & RIDE_ENTRY_FLAG_CANNOT_BREAK_DOWN)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void choose_random_train_to_breakdown_safe(Ride* ride)
|
||||
{
|
||||
ride->broken_vehicle = scenario_rand() % ride->num_vehicles;
|
||||
|
||||
@@ -341,6 +341,7 @@ struct Ride
|
||||
uint8_t cable_lift_z;
|
||||
uint16_t cable_lift;
|
||||
uint16_t queue_length[MAX_STATIONS];
|
||||
bool CanBreakDown() const;
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
@@ -1032,7 +1033,7 @@ track_colour ride_get_track_colour(Ride* ride, int32_t colourScheme);
|
||||
vehicle_colour ride_get_vehicle_colour(Ride* ride, int32_t vehicleIndex);
|
||||
int32_t ride_get_unused_preset_vehicle_colour(uint8_t ride_sub_type);
|
||||
void ride_set_vehicle_colours_to_random_preset(Ride* ride, uint8_t preset_index);
|
||||
rct_ride_entry* get_ride_entry_by_ride(Ride* ride);
|
||||
rct_ride_entry* get_ride_entry_by_ride(const Ride* ride);
|
||||
uint8_t* get_ride_entry_indices_for_ride_type(uint8_t rideType);
|
||||
void reset_type_to_ride_entry_index_map(IObjectManager& objectManager);
|
||||
void ride_measurement_clear(Ride* ride);
|
||||
|
||||
Reference in New Issue
Block a user