diff --git a/src/ground_vehicle.cpp b/src/ground_vehicle.cpp index 12d493d567..f61fb1defd 100644 --- a/src/ground_vehicle.cpp +++ b/src/ground_vehicle.cpp @@ -112,6 +112,7 @@ void GroundVehicle::CargoChanged() u->gcache.cached_slope_resistance = current_weight * u->GetSlopeSteepness() * 100; u->cur_image_valid_dir = INVALID_DIR; } + ClrBit(this->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST); /* Store consist weight in cache. */ this->gcache.cached_weight = max(1, weight); @@ -332,12 +333,14 @@ void GroundVehicle::UpdateZPositionInWormhole() if (delta != 2) { slope = slope_north; SetBit(this->gv_flags, going_north ? GVF_GOINGUP_BIT : GVF_GOINGDOWN_BIT); + ClrBit(this->First()->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST); } } else if ((delta = south_coord - pos_coord) <= 3) { this->z_pos = TILE_HEIGHT * (delta == 3 ? -2 : -1); if (delta != 2) { slope = SLOPE_ELEVATED ^ slope_north; SetBit(this->gv_flags, going_north ? GVF_GOINGDOWN_BIT : GVF_GOINGUP_BIT); + ClrBit(this->First()->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST); } } diff --git a/src/ground_vehicle.hpp b/src/ground_vehicle.hpp index 8d9acf3924..bc515a90a3 100644 --- a/src/ground_vehicle.hpp +++ b/src/ground_vehicle.hpp @@ -118,8 +118,10 @@ struct GroundVehicle : public SpecializedVehicle { * Calculates the total slope resistance for this vehicle. * @return Slope resistance. */ - inline int64 GetSlopeResistance() const + inline int64 GetSlopeResistance() { + if (likely(HasBit(this->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST))) return 0; + int64 incl = 0; for (const T *u = T::From(this); u != NULL; u = u->Next()) { @@ -129,6 +131,7 @@ struct GroundVehicle : public SpecializedVehicle { incl -= u->gcache.cached_slope_resistance; } } + if (incl == 0) SetBit(this->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST); return incl; } @@ -154,6 +157,7 @@ struct GroundVehicle : public SpecializedVehicle { if (middle_z != this->z_pos) { SetBit(this->gv_flags, (middle_z > this->z_pos) ? GVF_GOINGUP_BIT : GVF_GOINGDOWN_BIT); + ClrBit(this->First()->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST); } } } diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index d4da8dbf3c..a244d5a2a9 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2175,6 +2175,8 @@ void ReverseTrainDirection(Train *v) AdvanceWagonsAfterSwap(v); + ClrBit(v->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST); + if (IsRailDepotTile(v->tile)) { InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 6bcd6ace49..8b95794f19 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -3706,6 +3706,7 @@ char *Vehicle::DumpVehicleFlags(char *b, const char *last) const dump('a', HasBit(this->vehicle_flags, VF_AUTOMATE_TIMETABLE)); b += seprintf(b, last, ", vcf:"); dump('l', HasBit(this->vcache.cached_veh_flags, VCF_LAST_VISUAL_EFFECT)); + dump('z', HasBit(this->vcache.cached_veh_flags, VCF_GV_ZERO_SLOPE_RESIST)); if (this->IsGroundVehicle()) { uint16 gv_flags = this->GetGroundVehicleFlags(); b += seprintf(b, last, ", gvf:"); diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 6fded6e0b0..a0f90ff908 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -135,6 +135,7 @@ enum GroundVehicleSubtypeFlags { */ enum VehicleCacheFlags { VCF_LAST_VISUAL_EFFECT = 0, ///< Last vehicle in the consist with a visual effect. + VCF_GV_ZERO_SLOPE_RESIST = 1, ///< GrounVehicle: Consist has zero slope resistance (valid only for the first engine), may be false negative. }; /** Cached often queried values common to all vehicles. */