Fix 9ff161e4 boosting lookahead braking stats but not actual brake forces

pull/407/head
Jonathan G Rennison 2 years ago
parent bd28d5a239
commit c6ae82b611

@ -226,7 +226,7 @@ GroundVehicleAcceleration GroundVehicle<T, Type>::GetAcceleration()
}
if (Type == VEH_TRAIN && Train::From(this)->UsingRealisticBraking()) {
braking_power += (Train::From(this)->gcache.cached_total_length * (int64)RBC_BRAKE_POWER_PER_LENGTH);
braking_power += (Train::From(this)->tcache.cached_braking_length * (int64)RBC_BRAKE_POWER_PER_LENGTH);
}
/* If power is 0 because of a breakdown, we make the force 0 if accelerating */
@ -269,7 +269,7 @@ GroundVehicleAcceleration GroundVehicle<T, Type>::GetAcceleration()
/* Assume that every part of a train is braked, not just the engine.
* Exceptionally heavy freight trains should still have a sensible braking distance.
* The total braking force is generally larger than the total tractive force. */
braking_accel = ClampToI32((-braking_force - resistance - (Train::From(this)->gcache.cached_total_length * (int64)RBC_BRAKE_FORCE_PER_LENGTH)) / (mass * 4));
braking_accel = ClampToI32((-braking_force - resistance - (Train::From(this)->tcache.cached_braking_length * (int64)RBC_BRAKE_FORCE_PER_LENGTH)) / (mass * 4));
/* Defensive driving: prevent ridiculously fast deceleration.
* -130 corresponds to a braking distance of about 6.2 tiles from 160 km/h. */

@ -1695,12 +1695,13 @@ void CheckCaches(bool force_check, std::function<void(const char *)> log, CheckC
print_gv_cache_diff("train", gro_cache[length], Train::From(u)->gcache);
}
if (memcmp(&tra_cache[length], &Train::From(u)->tcache, sizeof(TrainCache)) != 0) {
CCLOGV("train cache mismatch: %c%c%c%c%c%c%c%c%c%c",
CCLOGV("train cache mismatch: %c%c%c%c%c%c%c%c%c%c%c",
tra_cache[length].cached_override != Train::From(u)->tcache.cached_override ? 'o' : '-',
tra_cache[length].cached_curve_speed_mod != Train::From(u)->tcache.cached_curve_speed_mod ? 'C' : '-',
tra_cache[length].cached_tflags != Train::From(u)->tcache.cached_tflags ? 'f' : '-',
tra_cache[length].cached_num_engines != Train::From(u)->tcache.cached_num_engines ? 'e' : '-',
tra_cache[length].cached_centre_mass != Train::From(u)->tcache.cached_centre_mass ? 'm' : '-',
tra_cache[length].cached_braking_length != Train::From(u)->tcache.cached_braking_length ? 'b' : '-',
tra_cache[length].cached_veh_weight != Train::From(u)->tcache.cached_veh_weight ? 'w' : '-',
tra_cache[length].cached_uncapped_decel != Train::From(u)->tcache.cached_uncapped_decel ? 'D' : '-',
tra_cache[length].cached_deceleration != Train::From(u)->tcache.cached_deceleration ? 'd' : '-',

@ -1137,6 +1137,7 @@ struct train_venc {
uint8 cached_tflags;
uint8 cached_num_engines;
uint16 cached_centre_mass;
uint16 cached_braking_length;
uint16 cached_veh_weight;
uint16 cached_uncapped_decel;
uint8 cached_deceleration;
@ -1206,6 +1207,7 @@ void Save_VENC()
SlWriteByte(t->tcache.cached_tflags);
SlWriteByte(t->tcache.cached_num_engines);
SlWriteUint16(t->tcache.cached_centre_mass);
SlWriteUint16(t->tcache.cached_braking_length);
SlWriteUint16(t->tcache.cached_veh_weight);
SlWriteUint16(t->tcache.cached_uncapped_decel);
SlWriteByte(t->tcache.cached_deceleration);
@ -1268,6 +1270,7 @@ void Load_VENC()
venc.cached_tflags = SlReadByte();
venc.cached_num_engines = SlReadByte();
venc.cached_centre_mass = SlReadUint16();
venc.cached_braking_length = SlReadUint16();
venc.cached_veh_weight = SlReadUint16();
venc.cached_uncapped_decel = SlReadUint16();
venc.cached_deceleration = SlReadByte();
@ -1356,6 +1359,7 @@ void SlProcessVENC()
CheckVehicleVENCProp(t->tcache.cached_tflags, (TrainCacheFlags)venc.cached_tflags, t, "cached_tflags");
CheckVehicleVENCProp(t->tcache.cached_num_engines, venc.cached_num_engines, t, "cached_num_engines");
CheckVehicleVENCProp(t->tcache.cached_centre_mass, venc.cached_centre_mass, t, "cached_centre_mass");
CheckVehicleVENCProp(t->tcache.cached_braking_length, venc.cached_braking_length, t, "cached_braking_length");
CheckVehicleVENCProp(t->tcache.cached_veh_weight, venc.cached_veh_weight, t, "cached_veh_weight");
CheckVehicleVENCProp(t->tcache.cached_uncapped_decel, venc.cached_uncapped_decel, t, "cached_uncapped_decel");
CheckVehicleVENCProp(t->tcache.cached_deceleration, venc.cached_deceleration, t, "cached_deceleration");

@ -187,8 +187,8 @@ class NIHVehicle : public NIHelper {
seprintf(buffer, lastof(buffer), " T cache: tilt: %d, speed varies by railtype: %d, curve speed mod: %d, engines: %u",
(t->tcache.cached_tflags & TCF_TILT) ? 1 : 0, (t->tcache.cached_tflags & TCF_SPD_RAILTYPE) ? 1 : 0, t->tcache.cached_curve_speed_mod, t->tcache.cached_num_engines);
output.print(buffer);
seprintf(buffer, lastof(buffer), " T cache: RL braking: %d, decel: %u, uncapped decel: %u, centre mass: %u",
(t->UsingRealisticBraking()) ? 1 : 0, t->tcache.cached_deceleration, t->tcache.cached_uncapped_decel, t->tcache.cached_centre_mass);
seprintf(buffer, lastof(buffer), " T cache: RL braking: %d, decel: %u, uncapped decel: %u, centre mass: %u, braking length: %u",
(t->UsingRealisticBraking()) ? 1 : 0, t->tcache.cached_deceleration, t->tcache.cached_uncapped_decel, t->tcache.cached_centre_mass, t->tcache.cached_braking_length);
output.print(buffer);
seprintf(buffer, lastof(buffer), " T cache: veh weight: %u, user data: %u, curve speed: %u",
t->tcache.cached_veh_weight, t->tcache.user_def_data, t->tcache.cached_max_curve_speed);

@ -116,6 +116,7 @@ struct TrainCache {
TrainCacheFlags cached_tflags;///< train cached flags
uint8 cached_num_engines; ///< total number of engines, including rear ends of multiheaded engines
uint16 cached_centre_mass; ///< Cached position of the centre of mass, from the front
uint16 cached_braking_length; ///< Cached effective length used for deceleration force and power purposes
uint16 cached_veh_weight; ///< Cached individual vehicle weight
uint16 cached_uncapped_decel; ///< Uncapped cached deceleration for realistic braking lookahead purposes
uint8 cached_deceleration; ///< Cached deceleration for realistic braking lookahead purposes

@ -418,6 +418,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
u->gcache.cached_total_length = 0;
u->tcache.cached_num_engines = 0;
u->tcache.cached_centre_mass = 0;
u->tcache.cached_braking_length = 0;
u->tcache.cached_deceleration = 0;
u->tcache.cached_uncapped_decel = 0;
u->tcache.cached_tflags = TCF_NONE;
@ -853,8 +854,8 @@ static int GetRealisticBrakingSpeedForDistance(const TrainDecelerationStats &sta
/* calculate speed at which braking would be sufficient */
uint weight = stats.t->gcache.cached_weight;
int64 power_w = (stats.t->gcache.cached_power * 746ll) + (stats.t->gcache.cached_total_length * (int64)RBC_BRAKE_POWER_PER_LENGTH);
int64 min_braking_force = (stats.t->gcache.cached_total_length * (int64)RBC_BRAKE_FORCE_PER_LENGTH) + stats.t->gcache.cached_axle_resistance + (weight * 16);
int64 power_w = (stats.t->gcache.cached_power * 746ll) + (stats.t->tcache.cached_braking_length * (int64)RBC_BRAKE_POWER_PER_LENGTH);
int64 min_braking_force = (stats.t->tcache.cached_braking_length * (int64)RBC_BRAKE_FORCE_PER_LENGTH) + stats.t->gcache.cached_axle_resistance + (weight * 16);
/* F = (7/8) * (F_min + ((power_w * 18) / (5 * v)))
* v^2 = sloped_ke + F * s / (4 * m)
@ -1166,6 +1167,7 @@ void Train::UpdateAcceleration()
default: NOT_REACHED();
case AM_ORIGINAL:
this->tcache.cached_uncapped_decel = this->tcache.cached_deceleration = Clamp((this->acceleration * 7) / 2, 1, 200);
this->tcache.cached_braking_length = this->gcache.cached_total_length;
break;
case AM_REALISTIC: {
@ -1182,7 +1184,9 @@ void Train::UpdateAcceleration()
length += ((u->gcache.cached_veh_length * adjust) + 1) / 2;
}
}
length = Clamp<uint>(length, 0, UINT16_MAX);
}
this->tcache.cached_braking_length = length;
int64 min_braking_force = (int64)length * (int64)RBC_BRAKE_FORCE_PER_LENGTH;
if (!maglev) {
@ -1233,6 +1237,7 @@ void Train::UpdateAcceleration()
this->tcache.cached_tflags &= ~TCF_RL_BRAKING;
this->tcache.cached_deceleration = 0;
this->tcache.cached_uncapped_decel = 0;
this->tcache.cached_braking_length = this->gcache.cached_total_length;
}
if (_settings_game.vehicle.improved_breakdowns) {

Loading…
Cancel
Save