From bb363695fc3abc59d42733071ea1ce3f1b842bba Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 17 Jan 2020 19:23:03 +0000 Subject: [PATCH] YAPF: Prevent user for configuring signal penalties to negative values Warn if signal penalty polynomial goes negative, and clamp to non-negative --- src/pathfinder/yapf/yapf_costrail.hpp | 4 ++-- src/pathfinder/yapf/yapf_rail.cpp | 16 ++++++++++++++++ src/saveload/afterload.cpp | 3 +++ src/settings.cpp | 8 ++++++++ src/table/settings.ini | 5 +++++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/pathfinder/yapf/yapf_costrail.hpp b/src/pathfinder/yapf/yapf_costrail.hpp index 2169429131e..8a78208d5de 100644 --- a/src/pathfinder/yapf/yapf_costrail.hpp +++ b/src/pathfinder/yapf/yapf_costrail.hpp @@ -70,8 +70,8 @@ class CYapfCostRailT : public CYapfCostBase { int p1 = Yapf().PfGetSettings().rail_look_ahead_signal_p1; int p2 = Yapf().PfGetSettings().rail_look_ahead_signal_p2; int *pen = m_sig_look_ahead_costs.GrowSizeNC(Yapf().PfGetSettings().rail_look_ahead_max_signals); - for (uint i = 0; i < Yapf().PfGetSettings().rail_look_ahead_max_signals; i++) { - pen[i] = p0 + i * (p1 + i * p2); + for (int i = 0; i < (int) Yapf().PfGetSettings().rail_look_ahead_max_signals; i++) { + pen[i] = max(0, p0 + i * (p1 + i * p2)); } } diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp index e4d5085b92e..60b163e9584 100644 --- a/src/pathfinder/yapf/yapf_rail.cpp +++ b/src/pathfinder/yapf/yapf_rail.cpp @@ -17,6 +17,7 @@ #include "../../viewport_func.h" #include "../../newgrf_station.h" #include "../../tracerestrict.h" +#include "../../debug.h" #include "../../safeguards.h" @@ -762,3 +763,18 @@ void YapfNotifyTrackLayoutChange(TileIndex tile, Track track) { CSegmentCostCacheBase::NotifyTrackLayoutChange(tile, track); } + +void YapfCheckRailSignalPenalties() +{ + bool negative = false; + int p0 = _settings_game.pf.yapf.rail_look_ahead_signal_p0; + int p1 = _settings_game.pf.yapf.rail_look_ahead_signal_p1; + int p2 = _settings_game.pf.yapf.rail_look_ahead_signal_p2; + for (int i = 0; i < (int) _settings_game.pf.yapf.rail_look_ahead_max_signals; i++) { + if (p0 + i * (p1 + i * p2) < 0) negative = true; + } + if (negative) { + DEBUG(misc, 0, "Settings: pf.yapf.rail_look_ahead_signal_p0, pf.yapf.rail_look_ahead_signal_p1, pf.yapf.rail_look_ahead_signal_p2 and pf.yapf.rail_look_ahead_max_signal " + "are set to incorrect values (i.e. resulting in hegative penalties), negative penalties will be truncated"); + } +} diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index b51f6af1ec3..01b6d1c3456 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3795,6 +3795,9 @@ bool AfterLoadGame() InvalidateVehicleTickCaches(); ClearVehicleTickCaches(); + extern void YapfCheckRailSignalPenalties(); + YapfCheckRailSignalPenalties(); + /* Show this message last to avoid covering up an error message if we bail out part way */ switch (gcf_res) { case GLC_COMPATIBLE: ShowErrorMessage(STR_NEWGRF_COMPATIBLE_LOAD_WARNING, INVALID_STRING_ID, WL_CRITICAL); break; diff --git a/src/settings.cpp b/src/settings.cpp index ec02a42819b..d587585d269 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1228,6 +1228,14 @@ static bool EnableSingleVehSharedOrderGuiChanged(int32) return true; } +static bool CheckYapfRailSignalPenalties(int32) +{ + extern void YapfCheckRailSignalPenalties(); + YapfCheckRailSignalPenalties(); + + return true; +} + /** Checks if any settings are set to incorrect values, and sets them to correct values in that case. */ static void ValidateSettings() { diff --git a/src/table/settings.ini b/src/table/settings.ini index 05310f0f09f..4a0f3911cb8 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -47,6 +47,7 @@ static bool ImprovedBreakdownsSettingChanged(int32 p1); static bool DayLengthChanged(int32 p1); static bool SimulatedWormholeSignalsChanged(int32 p1); static bool EnableSingleVehSharedOrderGuiChanged(int32 p1); +static bool CheckYapfRailSignalPenalties(int32 p1); static bool UpdateClientName(int32 p1); static bool UpdateServerPassword(int32 p1); @@ -3078,6 +3079,7 @@ def = 10 min = 1 max = 100 cat = SC_EXPERT +proc = CheckYapfRailSignalPenalties [SDT_VAR] base = GameSettings @@ -3088,6 +3090,7 @@ def = 500 min = -1000000 max = 1000000 cat = SC_EXPERT +proc = CheckYapfRailSignalPenalties [SDT_VAR] base = GameSettings @@ -3098,6 +3101,7 @@ def = -100 min = -1000000 max = 1000000 cat = SC_EXPERT +proc = CheckYapfRailSignalPenalties [SDT_VAR] base = GameSettings @@ -3108,6 +3112,7 @@ def = 5 min = -1000000 max = 1000000 cat = SC_EXPERT +proc = CheckYapfRailSignalPenalties [SDT_VAR] base = GameSettings