diff --git a/src/pathfinder/yapf/yapf_costrail.hpp b/src/pathfinder/yapf/yapf_costrail.hpp index 2169429131..8a78208d5d 100644 --- a/src/pathfinder/yapf/yapf_costrail.hpp +++ b/src/pathfinder/yapf/yapf_costrail.hpp @@ -70,8 +70,8 @@ protected: 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 e4d5085b92..60b163e958 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 b51f6af1ec..01b6d1c345 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 ec02a42819..d587585d26 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 05310f0f09..4a0f3911cb 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