From e3896b69d3505599e9f3accf8128e4a853f907ff Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 4 Sep 2022 18:20:09 +0100 Subject: [PATCH] Fix #416: Division by zero for trains of 0 mass In maximum achievable speed estimator --- src/tbtr_template_vehicle.h | 2 +- src/tbtr_template_vehicle_func.cpp | 4 +++- src/train.h | 2 +- src/train_cmd.cpp | 4 +++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/tbtr_template_vehicle.h b/src/tbtr_template_vehicle.h index 6ea5ae8f56..76ed726775 100644 --- a/src/tbtr_template_vehicle.h +++ b/src/tbtr_template_vehicle.h @@ -225,6 +225,6 @@ short DeleteTemplateReplacementsByGroupID(GroupID); void ReindexTemplateReplacements(); -int GetTemplateVehicleEstimatedMaxAchievableSpeed(const TemplateVehicle *tv, const int mass, const int speed_cap); +int GetTemplateVehicleEstimatedMaxAchievableSpeed(const TemplateVehicle *tv, int mass, const int speed_cap); #endif /* TEMPLATE_VEH_H */ diff --git a/src/tbtr_template_vehicle_func.cpp b/src/tbtr_template_vehicle_func.cpp index e7dc2dae74..5d5343f4ba 100644 --- a/src/tbtr_template_vehicle_func.cpp +++ b/src/tbtr_template_vehicle_func.cpp @@ -502,11 +502,13 @@ void UpdateAllTemplateVehicleImages() _template_vehicle_images_valid = true; } -int GetTemplateVehicleEstimatedMaxAchievableSpeed(const TemplateVehicle *tv, const int mass, const int speed_cap) +int GetTemplateVehicleEstimatedMaxAchievableSpeed(const TemplateVehicle *tv, int mass, const int speed_cap) { int max_speed = 0; int acceleration; + if (mass < 1) mass = 1; + do { max_speed++; diff --git a/src/train.h b/src/train.h index c6cebeb728..834bb1d27a 100644 --- a/src/train.h +++ b/src/train.h @@ -520,6 +520,6 @@ inline int GetTileMarginInFrontOfTrain(const Train *v) int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, bool update_train_state, int *station_ahead, int *station_length); int GetTrainRealisticAccelerationAtSpeed(const int speed, const int mass, const uint32 cached_power, const uint32 max_te, const uint32 air_drag, const RailType railtype); -int GetTrainEstimatedMaxAchievableSpeed(const Train *train, const int mass, const int speed_cap); +int GetTrainEstimatedMaxAchievableSpeed(const Train *train, int mass, const int speed_cap); #endif /* TRAIN_H */ diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 3fb7721340..51000ac71a 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -7320,11 +7320,13 @@ int GetTrainRealisticAccelerationAtSpeed(const int speed, const int mass, const return acceleration; } -int GetTrainEstimatedMaxAchievableSpeed(const Train *train, const int mass, const int speed_cap) +int GetTrainEstimatedMaxAchievableSpeed(const Train *train, int mass, const int speed_cap) { int max_speed = 0; int acceleration; + if (mass < 1) mass = 1; + do { max_speed++;