Skip to content

Commit

Permalink
YAPF: Prevent user for configuring signal penalties to negative values
Browse files Browse the repository at this point in the history
Warn if signal penalty polynomial goes negative, and clamp to non-negative
  • Loading branch information
JGRennison committed Jan 17, 2020
1 parent 07f5b86 commit bb36369
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/pathfinder/yapf/yapf_costrail.hpp
Expand Up @@ -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<int>(0, p0 + i * (p1 + i * p2));
}
}

Expand Down
16 changes: 16 additions & 0 deletions src/pathfinder/yapf/yapf_rail.cpp
Expand Up @@ -17,6 +17,7 @@
#include "../../viewport_func.h"
#include "../../newgrf_station.h"
#include "../../tracerestrict.h"
#include "../../debug.h"

#include "../../safeguards.h"

Expand Down Expand Up @@ -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");
}
}
3 changes: 3 additions & 0 deletions src/saveload/afterload.cpp
Expand Up @@ -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;
Expand Down
8 changes: 8 additions & 0 deletions src/settings.cpp
Expand Up @@ -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()
{
Expand Down
5 changes: 5 additions & 0 deletions src/table/settings.ini
Expand Up @@ -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);
Expand Down Expand Up @@ -3078,6 +3079,7 @@ def = 10
min = 1
max = 100
cat = SC_EXPERT
proc = CheckYapfRailSignalPenalties
[SDT_VAR]
base = GameSettings
Expand All @@ -3088,6 +3090,7 @@ def = 500
min = -1000000
max = 1000000
cat = SC_EXPERT
proc = CheckYapfRailSignalPenalties
[SDT_VAR]
base = GameSettings
Expand All @@ -3098,6 +3101,7 @@ def = -100
min = -1000000
max = 1000000
cat = SC_EXPERT
proc = CheckYapfRailSignalPenalties
[SDT_VAR]
base = GameSettings
Expand All @@ -3108,6 +3112,7 @@ def = 5
min = -1000000
max = 1000000
cat = SC_EXPERT
proc = CheckYapfRailSignalPenalties
[SDT_VAR]
base = GameSettings
Expand Down

0 comments on commit bb36369

Please sign in to comment.