mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 14:27:16 +00:00
(svn r2147) - Add: [NPF] Give red presignal exit signals a different (higher) penalty, to discourage trains from waiting at presignal exits.
This commit is contained in:
parent
00c819c0d5
commit
6c825df8f7
8
npf.c
8
npf.c
@ -373,7 +373,13 @@ int32 NPFRailPathCost(AyStar* as, AyStarNode* current, OpenListNode* parent) {
|
|||||||
if (!NPFGetFlag(current, NPF_FLAG_SEEN_SIGNAL)) {
|
if (!NPFGetFlag(current, NPF_FLAG_SEEN_SIGNAL)) {
|
||||||
/* Penalize the first signal we
|
/* Penalize the first signal we
|
||||||
* encounter, if it is red */
|
* 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 */
|
/* Record the state of this signal */
|
||||||
NPFSetFlag(current, NPF_FLAG_LAST_SIGNAL_RED, true);
|
NPFSetFlag(current, NPF_FLAG_LAST_SIGNAL_RED, true);
|
||||||
|
15
settings.c
15
settings.c
@ -937,15 +937,18 @@ const SettingDesc patch_settings[] = {
|
|||||||
* again, just because the sign at the right side was red. If we take
|
* 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
|
* 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
|
* sure), so we set the default penalty at 10 (the station tile
|
||||||
* penalty will further prevent this */
|
* penalty will further prevent this.
|
||||||
{"npf_rail_firstred_penalty", SDT_UINT32, (void*)(10 * NPF_TILE_LENGTH), &_patches.npf_rail_firstred_penalty, NULL},
|
* 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 penalty is for when the last signal before the target is red.
|
||||||
* This is useful for train stations, where there are multiple
|
* This is useful for train stations, where there are multiple
|
||||||
* platforms to choose from, which lie in different signal blocks.
|
* platforms to choose from, which lie in different signal blocks.
|
||||||
* Every target in a occupied signal block (ie an occupied platform)
|
* Every target in a occupied signal block (ie an occupied platform)
|
||||||
* will get this penalty.
|
* 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
|
/* 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
|
* 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
|
* 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
|
* a penalty of 1 tile for every station tile passed, the route will
|
||||||
* be around it.
|
* be around it.
|
||||||
*/
|
*/
|
||||||
{"npf_rail_station_penalty", SDT_UINT32, (void*)(1 * NPF_TILE_LENGTH), &_patches.npf_rail_station_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_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_curve_penalty", SDT_UINT32, (void*)(1), &_patches.npf_rail_curve_penalty, NULL},
|
||||||
|
|
||||||
{NULL, 0, NULL, NULL, NULL}
|
{NULL, 0, NULL, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
@ -195,7 +195,8 @@ typedef struct Patches {
|
|||||||
/* New Path Finding */
|
/* New Path Finding */
|
||||||
bool new_pathfinding_all; /* Use the newest pathfinding algorithm for all */
|
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_lastred_penalty; /* The penalty for when the last signal is red */
|
||||||
uint32 npf_rail_station_penalty; /* The penalty for station tiles */
|
uint32 npf_rail_station_penalty; /* The penalty for station tiles */
|
||||||
uint32 npf_rail_slope_penalty; /* The penalty for sloping upwards */
|
uint32 npf_rail_slope_penalty; /* The penalty for sloping upwards */
|
||||||
|
Loading…
Reference in New Issue
Block a user