diff --git a/src/ground_vehicle.hpp b/src/ground_vehicle.hpp index 0b3a86cd5a..9dfa8b4a8e 100644 --- a/src/ground_vehicle.hpp +++ b/src/ground_vehicle.hpp @@ -468,10 +468,12 @@ protected: } } + bool brake_overheated = false; if (this->cur_speed > max_speed) { if (use_realistic_braking && accel.braking >= 0) { - extern void TrainBrakesOverheatedBreakdown(Vehicle *v); - TrainBrakesOverheatedBreakdown(this); + extern void TrainBrakesOverheatedBreakdown(Vehicle *v, int speed, int max_speed); + TrainBrakesOverheatedBreakdown(this, this->cur_speed, max_speed); + brake_overheated = true; } tempmax = std::max(this->cur_speed - (this->cur_speed / 10) - 1, max_speed); } @@ -480,9 +482,9 @@ protected: new_subspeed = Clamp(advisory_max_speed << 8, new_lb_subspeed, new_subspeed); if ((new_subspeed >> 8) > tempmax) { - if (use_realistic_braking && accel.braking >= 0) { - extern void TrainBrakesOverheatedBreakdown(Vehicle *v); - TrainBrakesOverheatedBreakdown(this); + if (use_realistic_braking && accel.braking >= 0 && !brake_overheated) { + extern void TrainBrakesOverheatedBreakdown(Vehicle *v, int speed, int max_speed); + TrainBrakesOverheatedBreakdown(this, (new_subspeed >> 8), tempmax); } new_subspeed = tempmax << 8; } diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 812975b575..1d0adc0cd7 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -6607,7 +6607,7 @@ static bool TrainLocoHandler(Train *v, bool mode) return mode ? true : HandleCrashedTrain(v); // 'this' can be deleted here } else if (v->crash_anim_pos > 0) { /* Reduce realistic braking brake overheating */ - v->crash_anim_pos--; + v->crash_anim_pos -= (v->crash_anim_pos + 255) >> 8; } if (v->force_proceed != TFP_NONE) { @@ -7565,8 +7565,9 @@ void TrainRoadVehicleCrashBreakdown(Vehicle *v) t->reliability = 0; } -void TrainBrakesOverheatedBreakdown(Vehicle *v) +void TrainBrakesOverheatedBreakdown(Vehicle *v, int speed, int max_speed) { + if (v->type != VEH_TRAIN) return; Train *t = Train::From(v)->First(); if (t->breakdown_ctr != 0 || (t->vehstatus & VS_CRASHED)) return; @@ -7574,7 +7575,7 @@ void TrainBrakesOverheatedBreakdown(Vehicle *v) ShowVehicleViewWindow(t); } - t->crash_anim_pos = std::min(1500, t->crash_anim_pos + 200); + t->crash_anim_pos = std::min(1500, t->crash_anim_pos + Clamp(((speed - max_speed) * speed) / 2, 0, 500)); if (t->crash_anim_pos < 1500) return; t->breakdown_ctr = 2;