summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatthijs <matthijs@openttd.org>2005-04-04 17:53:39 +0000
committermatthijs <matthijs@openttd.org>2005-04-04 17:53:39 +0000
commit6c825df8f76442acf61f0c2f01620bdbff8a776f (patch)
tree99922c71839c7787413ed4d520b38e4542cb1267
parent00c819c0d5e2e64717d6c7968f477cb4642a94d5 (diff)
downloadopenttd-6c825df8f76442acf61f0c2f01620bdbff8a776f.tar.xz
(svn r2147) - Add: [NPF] Give red presignal exit signals a different (higher) penalty, to discourage trains from waiting at presignal exits.
-rw-r--r--npf.c8
-rw-r--r--settings.c15
-rw-r--r--variables.h3
3 files changed, 18 insertions, 8 deletions
diff --git a/npf.c b/npf.c
index 7f408d1b6..3b50055a5 100644
--- a/npf.c
+++ b/npf.c
@@ -373,7 +373,13 @@ int32 NPFRailPathCost(AyStar* as, AyStarNode* current, OpenListNode* parent) {
if (!NPFGetFlag(current, NPF_FLAG_SEEN_SIGNAL)) {
/* Penalize the first signal we
* encounter, if it is red */
- cost += _patches.npf_rail_firstred_penalty;
+
+ /* Is this a presignal exit or combo? */
+ if ((_map3_hi[tile] & 0x3) == 0x2 || (_map3_hi[tile] & 0x3) == 0x3)
+ /* Penalise exit and combo signals differently (heavier) */
+ cost += _patches.npf_rail_firstred_exit_penalty;
+ else
+ cost += _patches.npf_rail_firstred_penalty;
}
/* Record the state of this signal */
NPFSetFlag(current, NPF_FLAG_LAST_SIGNAL_RED, true);
diff --git a/settings.c b/settings.c
index 11b7b2f21..a29efea56 100644
--- a/settings.c
+++ b/settings.c
@@ -937,15 +937,18 @@ const SettingDesc patch_settings[] = {
* again, just because the sign at the right side was red. If we take
* a typical 5 length station, this detour is 10 or 11 tiles (not
* sure), so we set the default penalty at 10 (the station tile
- * penalty will further prevent this */
- {"npf_rail_firstred_penalty", SDT_UINT32, (void*)(10 * NPF_TILE_LENGTH), &_patches.npf_rail_firstred_penalty, NULL},
+ * penalty will further prevent this.
+ * We give presignal exits (and combo's) a different (larger) penalty, because we really
+ * don't want trains waiting in front of a presignal exit. */
+ {"npf_rail_firstred_penalty", SDT_UINT32, (void*)(10 * NPF_TILE_LENGTH), &_patches.npf_rail_firstred_penalty, NULL},
+ {"npf_rail_firstred_exit_penalty", SDT_UINT32, (void*)(100 * NPF_TILE_LENGTH), &_patches.npf_rail_firstred_exit_penalty, NULL},
/* This penalty is for when the last signal before the target is red.
* This is useful for train stations, where there are multiple
* platforms to choose from, which lie in different signal blocks.
* Every target in a occupied signal block (ie an occupied platform)
* will get this penalty.
*/
- {"npf_rail_lastred_penalty", SDT_UINT32, (void*)(10 * NPF_TILE_LENGTH), &_patches.npf_rail_lastred_penalty, NULL},
+ {"npf_rail_lastred_penalty", SDT_UINT32, (void*)(10 * NPF_TILE_LENGTH), &_patches.npf_rail_lastred_penalty, NULL},
/* When a train plans a route over a station tile, this penalty is
* applied. We want that trains plan a route around a typical, 4x5
* station, which means two tiles to the right, and two tiles back to
@@ -953,9 +956,9 @@ const SettingDesc patch_settings[] = {
* a penalty of 1 tile for every station tile passed, the route will
* be around it.
*/
- {"npf_rail_station_penalty", SDT_UINT32, (void*)(1 * NPF_TILE_LENGTH), &_patches.npf_rail_station_penalty, NULL},
- {"npf_rail_slope_penalty", SDT_UINT32, (void*)(1 * NPF_TILE_LENGTH), &_patches.npf_rail_slope_penalty, NULL},
- {"npf_rail_curve_penalty", SDT_UINT32, (void*)(1), &_patches.npf_rail_curve_penalty, NULL},
+ {"npf_rail_station_penalty", SDT_UINT32, (void*)(1 * NPF_TILE_LENGTH), &_patches.npf_rail_station_penalty, NULL},
+ {"npf_rail_slope_penalty", SDT_UINT32, (void*)(1 * NPF_TILE_LENGTH), &_patches.npf_rail_slope_penalty, NULL},
+ {"npf_rail_curve_penalty", SDT_UINT32, (void*)(1), &_patches.npf_rail_curve_penalty, NULL},
{NULL, 0, NULL, NULL, NULL}
};
diff --git a/variables.h b/variables.h
index dc9ed347f..c1f977ec1 100644
--- a/variables.h
+++ b/variables.h
@@ -195,7 +195,8 @@ typedef struct Patches {
/* New Path Finding */
bool new_pathfinding_all; /* Use the newest pathfinding algorithm for all */
- uint32 npf_rail_firstred_penalty; /* The penalty for when the first signal is red */
+ uint32 npf_rail_firstred_penalty; /* The penalty for when the first signal is red (and it is not an exit or combo signal) */
+ uint32 npf_rail_firstred_exit_penalty; /* The penalty for when the first signal is red (and it is an exit or combo signal) */
uint32 npf_rail_lastred_penalty; /* The penalty for when the last signal is red */
uint32 npf_rail_station_penalty; /* The penalty for station tiles */
uint32 npf_rail_slope_penalty; /* The penalty for sloping upwards */