Reduce frequency of brake overheating breakdowns
Decay overheat state more quickly Avoid double-triggering overheating Make overheating speed-dependent
This commit is contained in:
@@ -468,10 +468,12 @@ protected:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool brake_overheated = false;
|
||||||
if (this->cur_speed > max_speed) {
|
if (this->cur_speed > max_speed) {
|
||||||
if (use_realistic_braking && accel.braking >= 0) {
|
if (use_realistic_braking && accel.braking >= 0) {
|
||||||
extern void TrainBrakesOverheatedBreakdown(Vehicle *v);
|
extern void TrainBrakesOverheatedBreakdown(Vehicle *v, int speed, int max_speed);
|
||||||
TrainBrakesOverheatedBreakdown(this);
|
TrainBrakesOverheatedBreakdown(this, this->cur_speed, max_speed);
|
||||||
|
brake_overheated = true;
|
||||||
}
|
}
|
||||||
tempmax = std::max(this->cur_speed - (this->cur_speed / 10) - 1, max_speed);
|
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);
|
new_subspeed = Clamp(advisory_max_speed << 8, new_lb_subspeed, new_subspeed);
|
||||||
|
|
||||||
if ((new_subspeed >> 8) > tempmax) {
|
if ((new_subspeed >> 8) > tempmax) {
|
||||||
if (use_realistic_braking && accel.braking >= 0) {
|
if (use_realistic_braking && accel.braking >= 0 && !brake_overheated) {
|
||||||
extern void TrainBrakesOverheatedBreakdown(Vehicle *v);
|
extern void TrainBrakesOverheatedBreakdown(Vehicle *v, int speed, int max_speed);
|
||||||
TrainBrakesOverheatedBreakdown(this);
|
TrainBrakesOverheatedBreakdown(this, (new_subspeed >> 8), tempmax);
|
||||||
}
|
}
|
||||||
new_subspeed = tempmax << 8;
|
new_subspeed = tempmax << 8;
|
||||||
}
|
}
|
||||||
|
@@ -6607,7 +6607,7 @@ static bool TrainLocoHandler(Train *v, bool mode)
|
|||||||
return mode ? true : HandleCrashedTrain(v); // 'this' can be deleted here
|
return mode ? true : HandleCrashedTrain(v); // 'this' can be deleted here
|
||||||
} else if (v->crash_anim_pos > 0) {
|
} else if (v->crash_anim_pos > 0) {
|
||||||
/* Reduce realistic braking brake overheating */
|
/* 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) {
|
if (v->force_proceed != TFP_NONE) {
|
||||||
@@ -7565,8 +7565,9 @@ void TrainRoadVehicleCrashBreakdown(Vehicle *v)
|
|||||||
t->reliability = 0;
|
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();
|
Train *t = Train::From(v)->First();
|
||||||
if (t->breakdown_ctr != 0 || (t->vehstatus & VS_CRASHED)) return;
|
if (t->breakdown_ctr != 0 || (t->vehstatus & VS_CRASHED)) return;
|
||||||
|
|
||||||
@@ -7574,7 +7575,7 @@ void TrainBrakesOverheatedBreakdown(Vehicle *v)
|
|||||||
ShowVehicleViewWindow(t);
|
ShowVehicleViewWindow(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
t->crash_anim_pos = std::min<uint>(1500, t->crash_anim_pos + 200);
|
t->crash_anim_pos = std::min<uint>(1500, t->crash_anim_pos + Clamp(((speed - max_speed) * speed) / 2, 0, 500));
|
||||||
if (t->crash_anim_pos < 1500) return;
|
if (t->crash_anim_pos < 1500) return;
|
||||||
|
|
||||||
t->breakdown_ctr = 2;
|
t->breakdown_ctr = 2;
|
||||||
|
Reference in New Issue
Block a user