author | miham |
Wed, 17 Aug 2005 12:30:07 +0000 | |
changeset 2349 | df02d0ffb588 |
parent 2186 | 461a2aff3486 |
child 2403 | f339737b38bc |
permissions | -rw-r--r-- |
2186 | 1 |
/* $Id$ */ |
2 |
||
1247 | 3 |
#include "stdafx.h" |
1891
92a3b0aa0946
(svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents:
1857
diff
changeset
|
4 |
#include "openttd.h" |
1299
0a6510cc889b
(svn r1803) Move debugging stuff into files of it's own
tron
parents:
1248
diff
changeset
|
5 |
#include "debug.h" |
2163
637ec3c361f5
(svn r2673) Include functions.h directly, not globally via openttd.h
tron
parents:
2115
diff
changeset
|
6 |
#include "functions.h" |
1247 | 7 |
#include "npf.h" |
8 |
#include "aystar.h" |
|
9 |
#include "macros.h" |
|
10 |
#include "pathfind.h" |
|
11 |
#include "station.h" |
|
12 |
#include "tile.h" |
|
1313
bba6afb8a995
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1299
diff
changeset
|
13 |
#include "depot.h" |
1247 | 14 |
|
1983 | 15 |
static AyStar _npf_aystar; |
1247 | 16 |
|
17 |
/* The cost of each trackdir. A diagonal piece is the full NPF_TILE_LENGTH, |
|
18 |
* the shorter piece is sqrt(2)/2*NPF_TILE_LENGTH =~ 0.7071 |
|
19 |
*/ |
|
1677
c18884ca76d5
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1661
diff
changeset
|
20 |
#define NPF_STRAIGHT_LENGTH (uint)(NPF_TILE_LENGTH * STRAIGHT_TRACK_LENGTH) |
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
21 |
static const uint _trackdir_length[TRACKDIR_END] = { |
1463
a9b4664cef34
(svn r1967) Codechange: A mix of mostly indentation-related tidyups.
pasky
parents:
1460
diff
changeset
|
22 |
NPF_TILE_LENGTH, NPF_TILE_LENGTH, NPF_STRAIGHT_LENGTH, NPF_STRAIGHT_LENGTH, NPF_STRAIGHT_LENGTH, NPF_STRAIGHT_LENGTH, |
a9b4664cef34
(svn r1967) Codechange: A mix of mostly indentation-related tidyups.
pasky
parents:
1460
diff
changeset
|
23 |
0, 0, |
a9b4664cef34
(svn r1967) Codechange: A mix of mostly indentation-related tidyups.
pasky
parents:
1460
diff
changeset
|
24 |
NPF_TILE_LENGTH, NPF_TILE_LENGTH, NPF_STRAIGHT_LENGTH, NPF_STRAIGHT_LENGTH, NPF_STRAIGHT_LENGTH, NPF_STRAIGHT_LENGTH |
1247 | 25 |
}; |
26 |
||
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
27 |
/** |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
28 |
* Check if a rail track is the end of the line. Will also consider 1-way signals to be the end of a line. |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
29 |
* @param tile The tile on which the current track is. |
2029
4a678baaaae5
(svn r2538) - Fix: Use IsCompatibleRailType() function instead of checking this yourself.
hackykid
parents:
2009
diff
changeset
|
30 |
* @param trackdir The (track)direction in which you want to look. |
4a678baaaae5
(svn r2538) - Fix: Use IsCompatibleRailType() function instead of checking this yourself.
hackykid
parents:
2009
diff
changeset
|
31 |
* @param enginetype The type of the engine for which we are checking this. |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
32 |
*/ |
2029
4a678baaaae5
(svn r2538) - Fix: Use IsCompatibleRailType() function instead of checking this yourself.
hackykid
parents:
2009
diff
changeset
|
33 |
bool IsEndOfLine(TileIndex tile, Trackdir trackdir, RailType enginetype) |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
34 |
{ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
35 |
byte exitdir = TrackdirToExitdir(trackdir); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
36 |
TileIndex dst_tile; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
37 |
uint32 ts; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
38 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
39 |
// tunnel entrance? |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
40 |
if (IsTileType(tile, MP_TUNNELBRIDGE) && (_m[tile].m5 & 0xF0)==0 && (_m[tile].m5 & 3) == exitdir) |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
41 |
return false; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
42 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
43 |
// depot |
2009
e5981b336208
(svn r2517) - Fix: [pbs] Detect end-of-lines properly regarding depots.
hackykid
parents:
2008
diff
changeset
|
44 |
if (IsTileDepotType(tile, TRANSPORT_RAIL) && (exitdir != GetDepotDirection(tile, TRANSPORT_RAIL))) |
e5981b336208
(svn r2517) - Fix: [pbs] Detect end-of-lines properly regarding depots.
hackykid
parents:
2008
diff
changeset
|
45 |
return true; |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
46 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
47 |
/* Calculate next tile */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
48 |
dst_tile = tile + TileOffsByDir(exitdir); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
49 |
// determine the track status on the next tile. |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
50 |
ts = GetTileTrackStatus(dst_tile, TRANSPORT_RAIL) & TrackdirReachesTrackdirs(trackdir); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
51 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
52 |
// when none of the trackdir bits are set, we cant enter the new tile |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
53 |
if ( (ts & TRACKDIR_BIT_MASK) == 0) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
54 |
return true; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
55 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
56 |
{ |
2009
e5981b336208
(svn r2517) - Fix: [pbs] Detect end-of-lines properly regarding depots.
hackykid
parents:
2008
diff
changeset
|
57 |
byte dst_type = GetTileRailType(dst_tile, exitdir); |
2029
4a678baaaae5
(svn r2538) - Fix: Use IsCompatibleRailType() function instead of checking this yourself.
hackykid
parents:
2009
diff
changeset
|
58 |
if (!IsCompatibleRail(enginetype, dst_type)) |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
59 |
return true; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
60 |
if (GetTileOwner(tile) != GetTileOwner(dst_tile)) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
61 |
return true; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
62 |
|
2009
e5981b336208
(svn r2517) - Fix: [pbs] Detect end-of-lines properly regarding depots.
hackykid
parents:
2008
diff
changeset
|
63 |
if (IsTileDepotType(dst_tile, TRANSPORT_RAIL) && (exitdir != ReverseDiagdir(GetDepotDirection(dst_tile, TRANSPORT_RAIL)))) |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
64 |
return true; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
65 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
66 |
/* Check for oneway signal against us */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
67 |
if (IsTileType(dst_tile, MP_RAILWAY) && GetRailTileType(dst_tile) == RAIL_TYPE_SIGNALS) { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
68 |
if (HasSignalOnTrackdir(dst_tile, ReverseTrackdir(FindFirstBit2x64(ts))) && !HasSignalOnTrackdir(dst_tile, FindFirstBit2x64(ts))) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
69 |
// if one way signal not pointing towards us, stop going in this direction. |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
70 |
return true; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
71 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
72 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
73 |
return false; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
74 |
} |
2182 | 75 |
} |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
76 |
|
2075
7f0ca01392db
(svn r2585) - Fix [Makefile]: some small cleanups, remove warnings, and add mersenne to makefile (Luca)
Darkvater
parents:
2049
diff
changeset
|
77 |
#if 0 |
1983 | 78 |
static uint NTPHash(uint key1, uint key2) |
1247 | 79 |
{ |
1661
6af0c4416154
(svn r2165) - Codechange: [NPF] Properly enummed NPF hash size, it is easily changable now.
matthijs
parents:
1655
diff
changeset
|
80 |
/* This function uses the old hash, which is fixed on 10 bits (1024 buckets) */ |
1247 | 81 |
return PATHFIND_HASH_TILE(key1); |
82 |
} |
|
2075
7f0ca01392db
(svn r2585) - Fix [Makefile]: some small cleanups, remove warnings, and add mersenne to makefile (Luca)
Darkvater
parents:
2049
diff
changeset
|
83 |
#endif |
1247 | 84 |
|
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
85 |
/** |
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
86 |
* Calculates a hash value for use in the NPF. |
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
87 |
* @param key1 The TileIndex of the tile to hash |
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
88 |
* @param key1 The Trackdir of the track on the tile. |
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
89 |
* |
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
90 |
* @todo Think of a better hash. |
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
91 |
*/ |
1983 | 92 |
static uint NPFHash(uint key1, uint key2) |
1661
6af0c4416154
(svn r2165) - Codechange: [NPF] Properly enummed NPF hash size, it is easily changable now.
matthijs
parents:
1655
diff
changeset
|
93 |
{ |
6af0c4416154
(svn r2165) - Codechange: [NPF] Properly enummed NPF hash size, it is easily changable now.
matthijs
parents:
1655
diff
changeset
|
94 |
/* TODO: think of a better hash? */ |
6af0c4416154
(svn r2165) - Codechange: [NPF] Properly enummed NPF hash size, it is easily changable now.
matthijs
parents:
1655
diff
changeset
|
95 |
uint part1 = TileX(key1) & NPF_HASH_HALFMASK; |
6af0c4416154
(svn r2165) - Codechange: [NPF] Properly enummed NPF hash size, it is easily changable now.
matthijs
parents:
1655
diff
changeset
|
96 |
uint part2 = TileY(key1) & NPF_HASH_HALFMASK; |
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
97 |
|
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
98 |
assert(IsValidTrackdir(key2)); |
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
99 |
assert(IsValidTile(key1)); |
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
100 |
return ((((part1 << NPF_HASH_HALFBITS) | part2)) + (NPF_HASH_SIZE * key2 / TRACKDIR_END)) % NPF_HASH_SIZE; |
1661
6af0c4416154
(svn r2165) - Codechange: [NPF] Properly enummed NPF hash size, it is easily changable now.
matthijs
parents:
1655
diff
changeset
|
101 |
} |
6af0c4416154
(svn r2165) - Codechange: [NPF] Properly enummed NPF hash size, it is easily changable now.
matthijs
parents:
1655
diff
changeset
|
102 |
|
1983 | 103 |
static int32 NPFCalcZero(AyStar* as, AyStarNode* current, OpenListNode* parent) |
104 |
{ |
|
1247 | 105 |
return 0; |
106 |
} |
|
107 |
||
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
108 |
/* Calcs the tile of given station that is closest to a given tile |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
109 |
* for this we assume the station is a rectangle, |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
110 |
* as defined by its top tile (st->train_tile) and its width/height (st->trainst_w, st->trainst_h) |
1247 | 111 |
*/ |
1983 | 112 |
static TileIndex CalcClosestStationTile(StationID station, TileIndex tile) |
113 |
{ |
|
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
114 |
const Station* st = GetStation(station); |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
115 |
|
1983 | 116 |
uint minx = TileX(st->train_tile); // topmost corner of station |
117 |
uint miny = TileY(st->train_tile); |
|
118 |
uint maxx = minx + st->trainst_w - 1; // lowermost corner of station |
|
119 |
uint maxy = miny + st->trainst_h - 1; |
|
120 |
uint x; |
|
121 |
uint y; |
|
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
122 |
|
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
123 |
// we are going the aim for the x coordinate of the closest corner |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
124 |
// but if we are between those coordinates, we will aim for our own x coordinate |
1983 | 125 |
x = clamp(TileX(tile), minx, maxx); |
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
126 |
|
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
127 |
// same for y coordinate, see above comment |
1983 | 128 |
y = clamp(TileY(tile), miny, maxy); |
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
129 |
|
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
130 |
// return the tile of our target coordinates |
1983 | 131 |
return TileXY(x, y); |
2182 | 132 |
} |
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
133 |
|
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
134 |
/* On PBS pathfinding runs, this is called before pathfinding ends (BeforeExit aystar callback), and will |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
135 |
* reserve the appropriate tracks, if needed. */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
136 |
void NPFReservePBSPath(AyStar *as) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
137 |
{ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
138 |
NPFFoundTargetData* ftd = (NPFFoundTargetData*)as->user_path; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
139 |
bool eol_end = false; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
140 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
141 |
if (ftd->best_trackdir == 0xFF) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
142 |
return; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
143 |
|
2029
4a678baaaae5
(svn r2538) - Fix: Use IsCompatibleRailType() function instead of checking this yourself.
hackykid
parents:
2009
diff
changeset
|
144 |
if (!NPFGetFlag(&ftd->node, NPF_FLAG_PBS_EXIT) && IsEndOfLine(ftd->node.tile, ftd->node.direction, as->user_data[NPF_RAILTYPE]) && !NPFGetFlag(&ftd->node, NPF_FLAG_SEEN_SIGNAL)) { |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
145 |
/* The path ends in an end of line, we'll need to reserve a path. |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
146 |
* We treat and end of line as a red exit signal */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
147 |
eol_end = true; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
148 |
NPFSetFlag(&ftd->node, NPF_FLAG_PBS_EXIT, true); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
149 |
if (!NPFGetFlag(&ftd->node, NPF_FLAG_PBS_TARGET_SEEN)) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
150 |
NPFSetFlag(&ftd->node, NPF_FLAG_PBS_RED, true); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
151 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
152 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
153 |
if (!NPFGetFlag(&ftd->node, NPF_FLAG_PBS_CHOICE)) { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
154 |
/* there have been no choices to make on our path, we dont care if our end signal is red */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
155 |
NPFSetFlag(&ftd->node, NPF_FLAG_PBS_RED, false); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
156 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
157 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
158 |
if (NPFGetFlag(&ftd->node, NPF_FLAG_PBS_EXIT) && // we passed an exit signal |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
159 |
!NPFGetFlag(&ftd->node, NPF_FLAG_PBS_BLOCKED) && // we didnt encounter reserver tracks |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
160 |
((as->user_data[NPF_PBS_MODE] != PBS_MODE_GREEN) || (!NPFGetFlag(&ftd->node, NPF_FLAG_PBS_RED))) ) { // our mode permits having a red exit signal, or the signal is green |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
161 |
PathNode parent; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
162 |
PathNode *curr; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
163 |
PathNode *prev; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
164 |
TileIndex start = INVALID_TILE; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
165 |
byte trackdir = 0; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
166 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
167 |
parent.node = ftd->node; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
168 |
parent.parent = &ftd->path; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
169 |
curr = &parent; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
170 |
prev = NULL; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
171 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
172 |
do { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
173 |
if (!NPFGetFlag(&curr->node, NPF_FLAG_PBS_EXIT) || eol_end) { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
174 |
/* check for already reserved track on this path, if they clash with what we |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
175 |
currently trying to reserve, we have a self-crossing path :-( */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
176 |
if ((PBSTileUnavail(curr->node.tile) & (1 << curr->node.direction)) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
177 |
&& !(PBSTileReserved(curr->node.tile) & (1 << (curr->node.direction & 7))) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
178 |
&& (start != INVALID_TILE)) { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
179 |
/* It's actually quite bad if this happens, it means the pathfinder |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
180 |
* found a path that is intersecting with itself, which is a very bad |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
181 |
* thing in a pbs block. Also there is not much we can do about it at |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
182 |
* this point.... |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
183 |
* BUT, you have to have a pretty fucked up junction layout for this to happen, |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
184 |
* so we'll just stop this train, the user will eventually notice, so he can fix it. |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
185 |
*/ |
2115
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
186 |
PBSClearPath(start, trackdir, curr->node.tile, curr->node.direction); |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
187 |
NPFSetFlag(&ftd->node, NPF_FLAG_PBS_BLOCKED, true); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
188 |
DEBUG(pbs, 1) ("PBS: Self-crossing path!!!"); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
189 |
return; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
190 |
}; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
191 |
|
2115
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
192 |
PBSReserveTrack(curr->node.tile, TrackdirToTrack(curr->node.direction) ); |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
193 |
|
2115
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
194 |
/* we want to reserve the last tile (with the signal) on the path too |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
195 |
also remember this tile, cause its the end of the path (where we exit the block) */ |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
196 |
if (start == INVALID_TILE) { |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
197 |
if (prev != NULL) { |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
198 |
PBSReserveTrack(prev->node.tile, TrackdirToTrack(prev->node.direction) ); |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
199 |
start = prev->node.tile; |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
200 |
trackdir = ReverseTrackdir(prev->node.direction); |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
201 |
} else { |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
202 |
start = curr->node.tile; |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
203 |
trackdir = curr->node.direction; |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
204 |
} |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
205 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
206 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
207 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
208 |
prev = curr; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
209 |
curr = curr->parent; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
210 |
} while (curr != NULL); |
2115
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
211 |
// we remember the tile/track where this path leaves the pbs junction |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
212 |
ftd->node.tile = start; |
71e12444631c
(svn r2625) - Fix: [pbs] Store the end of a train's reserved path explicitly. Prevents trains from unreserving eachothers paths in some cases.
hackykid
parents:
2075
diff
changeset
|
213 |
ftd->node.direction = trackdir; |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
214 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
215 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
216 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
217 |
|
1677
c18884ca76d5
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1661
diff
changeset
|
218 |
/* Calcs the heuristic to the target station or tile. For train stations, it |
c18884ca76d5
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1661
diff
changeset
|
219 |
* takes into account the direction of approach. |
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
220 |
*/ |
1983 | 221 |
static int32 NPFCalcStationOrTileHeuristic(AyStar* as, AyStarNode* current, OpenListNode* parent) |
222 |
{ |
|
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
223 |
NPFFindStationOrTileData* fstd = (NPFFindStationOrTileData*)as->user_target; |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
224 |
NPFFoundTargetData* ftd = (NPFFoundTargetData*)as->user_path; |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
225 |
TileIndex from = current->tile; |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
226 |
TileIndex to = fstd->dest_coords; |
1453 | 227 |
uint dist; |
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
228 |
|
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
229 |
// for train-stations, we are going to aim for the closest station tile |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
230 |
if ((as->user_data[NPF_TYPE] == TRANSPORT_RAIL) && (fstd->station_index != -1)) |
1453 | 231 |
to = CalcClosestStationTile(fstd->station_index, from); |
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
232 |
|
1677
c18884ca76d5
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1661
diff
changeset
|
233 |
if (as->user_data[NPF_TYPE] == TRANSPORT_ROAD) |
c18884ca76d5
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1661
diff
changeset
|
234 |
/* Since roads only have diagonal pieces, we use manhattan distance here */ |
c18884ca76d5
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1661
diff
changeset
|
235 |
dist = DistanceManhattan(from, to) * NPF_TILE_LENGTH; |
c18884ca76d5
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1661
diff
changeset
|
236 |
else |
c18884ca76d5
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1661
diff
changeset
|
237 |
/* Ships and trains can also go diagonal, so the minimum distance is shorter */ |
c18884ca76d5
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1661
diff
changeset
|
238 |
dist = DistanceTrack(from, to) * NPF_TILE_LENGTH; |
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
239 |
|
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
240 |
DEBUG(npf, 4)("Calculating H for: (%d, %d). Result: %d", TileX(current->tile), TileY(current->tile), dist); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
241 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
242 |
/* for pbs runs, we ignore tiles inside the pbs block for the tracking |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
243 |
of the 'closest' tile */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
244 |
if ((as->user_data[NPF_PBS_MODE] != PBS_MODE_NONE) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
245 |
&& (!NPFGetFlag(current , NPF_FLAG_SEEN_SIGNAL)) |
2029
4a678baaaae5
(svn r2538) - Fix: Use IsCompatibleRailType() function instead of checking this yourself.
hackykid
parents:
2009
diff
changeset
|
246 |
&& (!IsEndOfLine(current->tile, current->direction, as->user_data[NPF_RAILTYPE]))) |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
247 |
return dist; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
248 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
249 |
if ((dist < ftd->best_bird_dist) || |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
250 |
/* for pbs runs, prefer tiles that pass a green exit signal to the pbs blocks */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
251 |
((as->user_data[NPF_PBS_MODE] != PBS_MODE_NONE) && !NPFGetFlag(current, NPF_FLAG_PBS_RED) && NPFGetFlag(&ftd->node, NPF_FLAG_PBS_RED)) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
252 |
) { |
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
253 |
ftd->best_bird_dist = dist; |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
254 |
ftd->best_trackdir = current->user_data[NPF_TRACKDIR_CHOICE]; |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
255 |
ftd->path = parent->path; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
256 |
ftd->node = *current; |
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
257 |
} |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
258 |
return dist; |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
259 |
} |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
260 |
|
1247 | 261 |
/* Fills AyStarNode.user_data[NPF_TRACKDIRCHOICE] with the chosen direction to |
262 |
* get here, either getting it from the current choice or from the parent's |
|
263 |
* choice */ |
|
1983 | 264 |
static void NPFFillTrackdirChoice(AyStarNode* current, OpenListNode* parent) |
1247 | 265 |
{ |
266 |
if (parent->path.parent == NULL) { |
|
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
267 |
Trackdir trackdir = (Trackdir)current->direction; |
1247 | 268 |
/* This is a first order decision, so we'd better save the |
269 |
* direction we chose */ |
|
270 |
current->user_data[NPF_TRACKDIR_CHOICE] = trackdir; |
|
1678
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
271 |
DEBUG(npf, 6)("Saving trackdir: %#x", trackdir); |
1247 | 272 |
} else { |
273 |
/* We've already made the decision, so just save our parent's |
|
274 |
* decision */ |
|
275 |
current->user_data[NPF_TRACKDIR_CHOICE] = parent->path.node.user_data[NPF_TRACKDIR_CHOICE]; |
|
276 |
} |
|
277 |
||
278 |
} |
|
279 |
||
280 |
/* Will return the cost of the tunnel. If it is an entry, it will return the |
|
281 |
* cost of that tile. If the tile is an exit, it will return the tunnel length |
|
282 |
* including the exit tile. Requires that this is a Tunnel tile */ |
|
1983 | 283 |
static uint NPFTunnelCost(AyStarNode* current) |
284 |
{ |
|
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
285 |
DiagDirection exitdir = TrackdirToExitdir((Trackdir)current->direction); |
1247 | 286 |
TileIndex tile = current->tile; |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
287 |
if ( (DiagDirection)(_m[tile].m5 & 3) == ReverseDiagdir(exitdir)) { |
1247 | 288 |
/* We just popped out if this tunnel, since were |
289 |
* facing the tunnel exit */ |
|
290 |
FindLengthOfTunnelResult flotr; |
|
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
291 |
flotr = FindLengthOfTunnel(tile, ReverseDiagdir(exitdir)); |
1247 | 292 |
return flotr.length * NPF_TILE_LENGTH; |
293 |
//TODO: Penalty for tunnels? |
|
294 |
} else { |
|
295 |
/* We are entering the tunnel, the enter tile is just a |
|
296 |
* straight track */ |
|
297 |
return NPF_TILE_LENGTH; |
|
298 |
} |
|
299 |
} |
|
300 |
||
1983 | 301 |
static uint NPFSlopeCost(AyStarNode* current) |
302 |
{ |
|
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
303 |
TileIndex next = current->tile + TileOffsByDir(TrackdirToExitdir(current->direction)); |
1503
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
304 |
int x,y; |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
305 |
int8 z1,z2; |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
306 |
|
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
307 |
x = TileX(current->tile) * TILE_SIZE; |
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
308 |
y = TileY(current->tile) * TILE_SIZE; |
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
309 |
/* get the height of the center of the current tile */ |
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
310 |
z1 = GetSlopeZ(x+TILE_HEIGHT, y+TILE_HEIGHT); |
1503
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
311 |
|
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
312 |
x = TileX(next) * TILE_SIZE; |
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
313 |
y = TileY(next) * TILE_SIZE; |
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
314 |
/* get the height of the center of the next tile */ |
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
315 |
z2 = GetSlopeZ(x+TILE_HEIGHT, y+TILE_HEIGHT); |
1503
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
316 |
|
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
317 |
if ((z2 - z1) > 1) { |
1247 | 318 |
/* Slope up */ |
319 |
return _patches.npf_rail_slope_penalty; |
|
320 |
} |
|
321 |
return 0; |
|
322 |
/* Should we give a bonus for slope down? Probably not, we |
|
323 |
* could just substract that bonus from the penalty, because |
|
324 |
* there is only one level of steepness... */ |
|
325 |
} |
|
326 |
||
1678
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
327 |
/* Mark tiles by mowing the grass when npf debug level >= 1 */ |
1983 | 328 |
static void NPFMarkTile(TileIndex tile) |
329 |
{ |
|
1678
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
330 |
#ifdef NO_DEBUG_MESSAGES |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
331 |
return; |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
332 |
#else |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
333 |
if (_debug_npf_level >= 1) |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
334 |
switch(GetTileType(tile)) { |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
335 |
case MP_RAILWAY: |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
336 |
/* DEBUG: mark visited tiles by mowing the grass under them |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
337 |
* ;-) */ |
1753
091f7a870a2a
(svn r2257) - Fix: [NPF] NPF debug markings modify _map2 instead of _map3_hi for street tiles, corrupting them.
matthijs
parents:
1751
diff
changeset
|
338 |
if (!IsTileDepotType(tile, TRANSPORT_RAIL)) { |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
339 |
_m[tile].m2 &= ~15; /* Clear bits 0-3 */ |
1753
091f7a870a2a
(svn r2257) - Fix: [NPF] NPF debug markings modify _map2 instead of _map3_hi for street tiles, corrupting them.
matthijs
parents:
1751
diff
changeset
|
340 |
MarkTileDirtyByTile(tile); |
091f7a870a2a
(svn r2257) - Fix: [NPF] NPF debug markings modify _map2 instead of _map3_hi for street tiles, corrupting them.
matthijs
parents:
1751
diff
changeset
|
341 |
} |
091f7a870a2a
(svn r2257) - Fix: [NPF] NPF debug markings modify _map2 instead of _map3_hi for street tiles, corrupting them.
matthijs
parents:
1751
diff
changeset
|
342 |
break; |
091f7a870a2a
(svn r2257) - Fix: [NPF] NPF debug markings modify _map2 instead of _map3_hi for street tiles, corrupting them.
matthijs
parents:
1751
diff
changeset
|
343 |
case MP_STREET: |
091f7a870a2a
(svn r2257) - Fix: [NPF] NPF debug markings modify _map2 instead of _map3_hi for street tiles, corrupting them.
matthijs
parents:
1751
diff
changeset
|
344 |
if (!IsTileDepotType(tile, TRANSPORT_ROAD)) { |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
345 |
_m[tile].m4 &= ~0x70; /* Clear bits 4-6 */ |
1753
091f7a870a2a
(svn r2257) - Fix: [NPF] NPF debug markings modify _map2 instead of _map3_hi for street tiles, corrupting them.
matthijs
parents:
1751
diff
changeset
|
346 |
MarkTileDirtyByTile(tile); |
091f7a870a2a
(svn r2257) - Fix: [NPF] NPF debug markings modify _map2 instead of _map3_hi for street tiles, corrupting them.
matthijs
parents:
1751
diff
changeset
|
347 |
} |
1678
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
348 |
break; |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
349 |
default: |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
350 |
break; |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
351 |
} |
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
352 |
#endif |
1247 | 353 |
} |
354 |
||
1983 | 355 |
static int32 NPFWaterPathCost(AyStar* as, AyStarNode* current, OpenListNode* parent) |
356 |
{ |
|
1247 | 357 |
//TileIndex tile = current->tile; |
358 |
int32 cost = 0; |
|
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
359 |
Trackdir trackdir = (Trackdir)current->direction; |
1247 | 360 |
|
361 |
cost = _trackdir_length[trackdir]; /* Should be different for diagonal tracks */ |
|
362 |
||
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
363 |
if (IsBuoyTile(current->tile) && IsDiagonalTrackdir(trackdir)) |
1751
954dd2900ac9
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1749
diff
changeset
|
364 |
cost += _patches.npf_buoy_penalty; /* A small penalty for going over buoys */ |
954dd2900ac9
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1749
diff
changeset
|
365 |
|
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
366 |
if (current->direction != NextTrackdir((Trackdir)parent->path.node.direction)) |
1751
954dd2900ac9
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1749
diff
changeset
|
367 |
cost += _patches.npf_water_curve_penalty; |
954dd2900ac9
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1749
diff
changeset
|
368 |
|
954dd2900ac9
(svn r2255) - Fix: [ 9680363 ] [NPF] Broken buoy handling for ships
matthijs
parents:
1749
diff
changeset
|
369 |
/* TODO More penalties? */ |
1247 | 370 |
|
371 |
return cost; |
|
372 |
} |
|
373 |
||
374 |
/* Determine the cost of this node, for road tracks */ |
|
1983 | 375 |
static int32 NPFRoadPathCost(AyStar* as, AyStarNode* current, OpenListNode* parent) |
376 |
{ |
|
1247 | 377 |
TileIndex tile = current->tile; |
378 |
int32 cost = 0; |
|
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
379 |
|
1247 | 380 |
/* Determine base length */ |
381 |
switch (GetTileType(tile)) { |
|
382 |
case MP_TUNNELBRIDGE: |
|
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
383 |
if ((_m[tile].m5 & 0xF0)==0) { |
1247 | 384 |
cost = NPFTunnelCost(current); |
385 |
break; |
|
386 |
} |
|
387 |
/* Fall through if above if is false, it is a bridge |
|
2006
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
388 |
* then. We treat that as ordinary road */ |
1247 | 389 |
case MP_STREET: |
390 |
cost = NPF_TILE_LENGTH; |
|
2006
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
391 |
/* Increase the cost for level crossings */ |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
392 |
if ((_m[tile].m5 & 0xF0) == 0x10) |
2006
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
393 |
cost += _patches.npf_crossing_penalty; |
1247 | 394 |
break; |
395 |
default: |
|
396 |
break; |
|
397 |
} |
|
398 |
||
399 |
/* Determine extra costs */ |
|
400 |
||
401 |
/* Check for slope */ |
|
402 |
cost += NPFSlopeCost(current); |
|
403 |
||
1941
b1cb02c0401c
(svn r2447) * Add: [NPF] Penalty for road vehicles making turns.
matthijs
parents:
1927
diff
changeset
|
404 |
/* Check for turns. Road vehicles only really drive diagonal, turns are |
b1cb02c0401c
(svn r2447) * Add: [NPF] Penalty for road vehicles making turns.
matthijs
parents:
1927
diff
changeset
|
405 |
* represented by non-diagonal tracks */ |
b1cb02c0401c
(svn r2447) * Add: [NPF] Penalty for road vehicles making turns.
matthijs
parents:
1927
diff
changeset
|
406 |
if (!IsDiagonalTrackdir(current->direction)) |
b1cb02c0401c
(svn r2447) * Add: [NPF] Penalty for road vehicles making turns.
matthijs
parents:
1927
diff
changeset
|
407 |
cost += _patches.npf_road_curve_penalty; |
1247 | 408 |
|
409 |
NPFMarkTile(tile); |
|
1678
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
410 |
DEBUG(npf, 4)("Calculating G for: (%d, %d). Result: %d", TileX(current->tile), TileY(current->tile), cost); |
1247 | 411 |
return cost; |
412 |
} |
|
413 |
||
414 |
||
415 |
/* Determine the cost of this node, for railway tracks */ |
|
1983 | 416 |
static int32 NPFRailPathCost(AyStar* as, AyStarNode* current, OpenListNode* parent) |
417 |
{ |
|
1247 | 418 |
TileIndex tile = current->tile; |
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
419 |
Trackdir trackdir = (Trackdir)current->direction; |
1247 | 420 |
int32 cost = 0; |
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
421 |
/* HACK: We create a OpenListNode manualy, so we can call EndNodeCheck */ |
1617
55878ca5ada9
(svn r2121) -Fix: changed the 2nd param of AyStar_EndNodeCheck back to what it should be
truelight
parents:
1503
diff
changeset
|
422 |
OpenListNode new_node; |
55878ca5ada9
(svn r2121) -Fix: changed the 2nd param of AyStar_EndNodeCheck back to what it should be
truelight
parents:
1503
diff
changeset
|
423 |
|
1247 | 424 |
/* Determine base length */ |
425 |
switch (GetTileType(tile)) { |
|
426 |
case MP_TUNNELBRIDGE: |
|
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
427 |
if ((_m[tile].m5 & 0xF0)==0) { |
1247 | 428 |
cost = NPFTunnelCost(current); |
429 |
break; |
|
430 |
} |
|
431 |
/* Fall through if above if is false, it is a bridge |
|
432 |
* then. We treat that as ordinary rail */ |
|
433 |
case MP_RAILWAY: |
|
434 |
cost = _trackdir_length[trackdir]; /* Should be different for diagonal tracks */ |
|
435 |
break; |
|
436 |
case MP_STREET: /* Railway crossing */ |
|
437 |
cost = NPF_TILE_LENGTH; |
|
438 |
break; |
|
1503
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
439 |
case MP_STATION: |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
440 |
/* We give a station tile a penalty. Logically we would only |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
441 |
* want to give station tiles that are not our destination |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
442 |
* this penalty. This would discourage trains to drive through |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
443 |
* busy stations. But, we can just give any station tile a |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
444 |
* penalty, because every possible route will get this penalty |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
445 |
* exactly once, on its end tile (if it's a station) and it |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
446 |
* will therefore not make a difference. */ |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
447 |
cost = NPF_TILE_LENGTH + _patches.npf_rail_station_penalty; |
be35a76c7555
(svn r2007) - Fix: [NPF] Slope penalties did not work correctly with foundations. (HackyKid)
matthijs
parents:
1502
diff
changeset
|
448 |
break; |
1247 | 449 |
default: |
450 |
break; |
|
451 |
} |
|
452 |
||
453 |
/* Determine extra costs */ |
|
454 |
||
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
455 |
/* Check for reserved tracks (PBS) */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
456 |
if ((as->user_data[NPF_PBS_MODE] != PBS_MODE_NONE) && !(NPFGetFlag(current, NPF_FLAG_PBS_EXIT)) && !(NPFGetFlag(current, NPF_FLAG_PBS_BLOCKED)) && (PBSTileUnavail(tile) & (1<<trackdir))) { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
457 |
NPFSetFlag(current, NPF_FLAG_PBS_BLOCKED, true); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
458 |
}; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
459 |
|
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
460 |
/* Check for signals */ |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
461 |
if (IsTileType(tile, MP_RAILWAY) && HasSignalOnTrackdir(tile, trackdir)) { |
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
462 |
/* Ordinary track with signals */ |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
463 |
if (GetSignalState(tile, trackdir) == SIGNAL_STATE_RED) { |
1247 | 464 |
/* Signal facing us is red */ |
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
465 |
if (!NPFGetFlag(current, NPF_FLAG_SEEN_SIGNAL)) { |
1247 | 466 |
/* Penalize the first signal we |
467 |
* encounter, if it is red */ |
|
1643
d38655053062
(svn r2147) - Add: [NPF] Give red presignal exit signals a different (higher) penalty, to discourage trains from waiting at presignal exits.
matthijs
parents:
1617
diff
changeset
|
468 |
|
d38655053062
(svn r2147) - Add: [NPF] Give red presignal exit signals a different (higher) penalty, to discourage trains from waiting at presignal exits.
matthijs
parents:
1617
diff
changeset
|
469 |
/* Is this a presignal exit or combo? */ |
1945
74355187d85f
(svn r2451) * Fix: Assertion caused by passing a trackdir where a track was expected.
matthijs
parents:
1944
diff
changeset
|
470 |
SignalType sigtype = GetSignalType(tile, TrackdirToTrack(trackdir)); |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
471 |
if (sigtype == SIGTYPE_EXIT || sigtype == SIGTYPE_COMBO) |
1643
d38655053062
(svn r2147) - Add: [NPF] Give red presignal exit signals a different (higher) penalty, to discourage trains from waiting at presignal exits.
matthijs
parents:
1617
diff
changeset
|
472 |
/* Penalise exit and combo signals differently (heavier) */ |
d38655053062
(svn r2147) - Add: [NPF] Give red presignal exit signals a different (higher) penalty, to discourage trains from waiting at presignal exits.
matthijs
parents:
1617
diff
changeset
|
473 |
cost += _patches.npf_rail_firstred_exit_penalty; |
d38655053062
(svn r2147) - Add: [NPF] Give red presignal exit signals a different (higher) penalty, to discourage trains from waiting at presignal exits.
matthijs
parents:
1617
diff
changeset
|
474 |
else |
d38655053062
(svn r2147) - Add: [NPF] Give red presignal exit signals a different (higher) penalty, to discourage trains from waiting at presignal exits.
matthijs
parents:
1617
diff
changeset
|
475 |
cost += _patches.npf_rail_firstred_penalty; |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
476 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
477 |
/* for pbs runs, store the fact that the exit signal to the pbs block was red */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
478 |
if (!(NPFGetFlag(current, NPF_FLAG_PBS_EXIT)) && !(NPFGetFlag(current, NPF_FLAG_PBS_RED)) && NPFGetFlag(current, NPF_FLAG_PBS_CHOICE)) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
479 |
NPFSetFlag(current, NPF_FLAG_PBS_RED, true); |
1247 | 480 |
} |
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
481 |
/* Record the state of this signal */ |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
482 |
NPFSetFlag(current, NPF_FLAG_LAST_SIGNAL_RED, true); |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
483 |
} else { |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
484 |
/* Record the state of this signal */ |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
485 |
NPFSetFlag(current, NPF_FLAG_LAST_SIGNAL_RED, false); |
1247 | 486 |
} |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
487 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
488 |
if (!NPFGetFlag(current, NPF_FLAG_SEEN_SIGNAL) && NPFGetFlag(current, NPF_FLAG_PBS_BLOCKED)) { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
489 |
/* penalise a path through the pbs block if it crosses reserved tracks */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
490 |
cost += 1000; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
491 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
492 |
if ((PBSIsPbsSignal(tile, trackdir)) && !NPFGetFlag(current, NPF_FLAG_SEEN_SIGNAL)) { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
493 |
/* we've encountered an exit signal to the pbs block */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
494 |
NPFSetFlag(current, NPF_FLAG_PBS_EXIT, true); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
495 |
} |
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
496 |
NPFSetFlag(current, NPF_FLAG_SEEN_SIGNAL, true); |
1247 | 497 |
} |
498 |
||
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
499 |
/* Penalise the tile if it is a target tile and the last signal was |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
500 |
* red */ |
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
501 |
/* HACK: We create a new_node here so we can call EndNodeCheck. Ugly as hell |
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
502 |
* of course... */ |
1617
55878ca5ada9
(svn r2121) -Fix: changed the 2nd param of AyStar_EndNodeCheck back to what it should be
truelight
parents:
1503
diff
changeset
|
503 |
new_node.path.node = *current; |
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
504 |
if (as->EndNodeCheck(as, &new_node) == AYSTAR_FOUND_END_NODE && NPFGetFlag(current, NPF_FLAG_LAST_SIGNAL_RED)) |
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
505 |
cost += _patches.npf_rail_lastred_penalty; |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
506 |
|
1247 | 507 |
/* Check for slope */ |
508 |
cost += NPFSlopeCost(current); |
|
509 |
||
510 |
/* Check for turns */ |
|
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
511 |
if (current->direction != NextTrackdir((Trackdir)parent->path.node.direction)) |
1460 | 512 |
cost += _patches.npf_rail_curve_penalty; |
513 |
//TODO, with realistic acceleration, also the amount of straight track between |
|
514 |
// curves should be taken into account, as this affects the speed limit. |
|
1247 | 515 |
|
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
516 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
517 |
/* Check for depots */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
518 |
if (IsTileDepotType(tile, TRANSPORT_RAIL)) { |
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
519 |
/* Penalise any depot tile that is not the last tile in the path. This |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
520 |
* _should_ penalise every occurence of reversing in a depot (and only |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
521 |
* that) */ |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
522 |
if (as->EndNodeCheck(as, &new_node) != AYSTAR_FOUND_END_NODE) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
523 |
cost += _patches.npf_rail_depot_reverse_penalty; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
524 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
525 |
/* Do we treat this depot as a pbs signal? */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
526 |
if (!NPFGetFlag(current, NPF_FLAG_SEEN_SIGNAL)) { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
527 |
if (NPFGetFlag(current, NPF_FLAG_PBS_BLOCKED)) { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
528 |
cost += 1000; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
529 |
} |
2164
74c8163d1e14
(svn r2674) - CodeChange: [pbs] Generalise the PSBISPbsDepot function so it can check if an arbitrary junction is a pbs junction. Preparations for making pbs more safe.
hackykid
parents:
2163
diff
changeset
|
530 |
if (PBSIsPbsSegment(tile, ReverseTrackdir(trackdir))) { |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
531 |
NPFSetFlag(current, NPF_FLAG_PBS_EXIT, true); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
532 |
NPFSetFlag(current, NPF_FLAG_SEEN_SIGNAL, true); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
533 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
534 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
535 |
NPFSetFlag(current, NPF_FLAG_LAST_SIGNAL_RED, false); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
536 |
} |
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
537 |
|
1247 | 538 |
/* Check for occupied track */ |
539 |
//TODO |
|
540 |
||
541 |
NPFMarkTile(tile); |
|
1678
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
542 |
DEBUG(npf, 4)("Calculating G for: (%d, %d). Result: %d", TileX(current->tile), TileY(current->tile), cost); |
1247 | 543 |
return cost; |
544 |
} |
|
545 |
||
546 |
/* Will find any depot */ |
|
1983 | 547 |
static int32 NPFFindDepot(AyStar* as, OpenListNode *current) |
548 |
{ |
|
1617
55878ca5ada9
(svn r2121) -Fix: changed the 2nd param of AyStar_EndNodeCheck back to what it should be
truelight
parents:
1503
diff
changeset
|
549 |
TileIndex tile = current->path.node.tile; |
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
550 |
|
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
551 |
/* It's not worth caching the result with NPF_FLAG_IS_TARGET here as below, |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
552 |
* since checking the cache not that much faster than the actual check */ |
1330
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
553 |
if (IsTileDepotType(tile, as->user_data[NPF_TYPE])) |
1247 | 554 |
return AYSTAR_FOUND_END_NODE; |
555 |
else |
|
556 |
return AYSTAR_DONE; |
|
557 |
} |
|
558 |
||
559 |
/* Will find a station identified using the NPFFindStationOrTileData */ |
|
1983 | 560 |
static int32 NPFFindStationOrTile(AyStar* as, OpenListNode *current) |
561 |
{ |
|
1464
266d3b0ee2c8
(svn r1968) - Fix: [NPF] Mixed declarations and statements
matthijs
parents:
1463
diff
changeset
|
562 |
NPFFindStationOrTileData* fstd = (NPFFindStationOrTileData*)as->user_target; |
1617
55878ca5ada9
(svn r2121) -Fix: changed the 2nd param of AyStar_EndNodeCheck back to what it should be
truelight
parents:
1503
diff
changeset
|
563 |
AyStarNode *node = ¤t->path.node; |
1464
266d3b0ee2c8
(svn r1968) - Fix: [NPF] Mixed declarations and statements
matthijs
parents:
1463
diff
changeset
|
564 |
TileIndex tile = node->tile; |
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
565 |
|
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
566 |
if (tile == 0x4611c) { |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
567 |
tile++; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
568 |
tile--; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
569 |
} |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
570 |
|
1247 | 571 |
/* If GetNeighbours said we could get here, we assume the station type |
572 |
* is correct */ |
|
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
573 |
if ( |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
574 |
(fstd->station_index == -1 && tile == fstd->dest_coords) || /* We've found the tile, or */ |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
575 |
(IsTileType(tile, MP_STATION) && _m[tile].m2 == fstd->station_index) || /* the station */ |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
576 |
(NPFGetFlag(node, NPF_FLAG_PBS_TARGET_SEEN)) /* or, we've passed it already (for pbs) */ |
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
577 |
) { |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
578 |
NPFSetFlag(¤t->path.node, NPF_FLAG_PBS_TARGET_SEEN, true); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
579 |
/* for pbs runs, only accept we've found the target if we've also found a way out of the block */ |
2029
4a678baaaae5
(svn r2538) - Fix: Use IsCompatibleRailType() function instead of checking this yourself.
hackykid
parents:
2009
diff
changeset
|
580 |
if ((as->user_data[NPF_PBS_MODE] != PBS_MODE_NONE) && !NPFGetFlag(node, NPF_FLAG_SEEN_SIGNAL) && !IsEndOfLine(node->tile, node->direction, as->user_data[NPF_RAILTYPE])) |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
581 |
return AYSTAR_DONE; |
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
582 |
return AYSTAR_FOUND_END_NODE; |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
583 |
} else { |
1247 | 584 |
return AYSTAR_DONE; |
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
585 |
} |
1247 | 586 |
} |
587 |
||
588 |
/* To be called when current contains the (shortest route to) the target node. |
|
589 |
* Will fill the contents of the NPFFoundTargetData using |
|
590 |
* AyStarNode[NPF_TRACKDIR_CHOICE]. |
|
591 |
*/ |
|
1983 | 592 |
static void NPFSaveTargetData(AyStar* as, OpenListNode* current) |
593 |
{ |
|
1247 | 594 |
NPFFoundTargetData* ftd = (NPFFoundTargetData*)as->user_path; |
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
595 |
ftd->best_trackdir = (Trackdir)current->path.node.user_data[NPF_TRACKDIR_CHOICE]; |
1247 | 596 |
ftd->best_path_dist = current->g; |
597 |
ftd->best_bird_dist = 0; |
|
598 |
ftd->node = current->path.node; |
|
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
599 |
ftd->path = current->path; |
1247 | 600 |
} |
601 |
||
1967
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
602 |
/** |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
603 |
* Finds out if a given player's vehicles are allowed to enter a given tile. |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
604 |
* @param owner The owner of the vehicle. |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
605 |
* @param tile The tile that is about to be entered. |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
606 |
* @param enterdir The direction from which the vehicle wants to enter the tile. |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
607 |
* @return true if the vehicle can enter the tile. |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
608 |
* @todo This function should be used in other places than just NPF, |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
609 |
* maybe moved to another file too. |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
610 |
*/ |
1983 | 611 |
static bool VehicleMayEnterTile(Owner owner, TileIndex tile, DiagDirection enterdir) |
1967
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
612 |
{ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
613 |
if ( |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
614 |
IsTileType(tile, MP_RAILWAY) /* Rail tile (also rail depot) */ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
615 |
|| IsTrainStationTile(tile) /* Rail station tile */ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
616 |
|| IsTileDepotType(tile, TRANSPORT_ROAD) /* Road depot tile */ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
617 |
|| IsRoadStationTile(tile) /* Road station tile */ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
618 |
|| IsTileDepotType(tile, TRANSPORT_WATER) /* Water depot tile */ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
619 |
) |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
620 |
return IsTileOwner(tile, owner); /* You need to own these tiles entirely to use them */ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
621 |
|
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
622 |
switch (GetTileType(tile)) { |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
623 |
case MP_STREET: |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
624 |
/* rail-road crossing : are we looking at the railway part? */ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
625 |
if (IsLevelCrossing(tile) && GetCrossingTransportType(tile, TrackdirToTrack(DiagdirToDiagTrackdir(enterdir))) == TRANSPORT_RAIL) |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
626 |
return IsTileOwner(tile, owner); /* Railway needs owner check, while the street is public */ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
627 |
break; |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
628 |
case MP_TUNNELBRIDGE: |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
629 |
#if 0 |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
630 |
/* OPTIMISATION: If we are on the middle of a bridge, we will not do the cpu |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
631 |
* intensive owner check, instead we will just assume that if the vehicle |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
632 |
* managed to get on the bridge, it is probably allowed to :-) |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
633 |
*/ |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
634 |
if ((_m[tile].m5 & 0xC6) == 0xC0 && (unsigned)(_m[tile].m5 & 0x1) == (enterdir & 0x1)) { |
1967
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
635 |
/* on the middle part of a railway bridge: find bridge ending */ |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
636 |
while (IsTileType(tile, MP_TUNNELBRIDGE) && !((_m[tile].m5 & 0xC6) == 0x80)) { |
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
637 |
tile += TileOffsByDir(_m[tile].m5 & 0x1); |
1967
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
638 |
} |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
639 |
} |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
640 |
/* if we were on a railway middle part, we are now at a railway bridge ending */ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
641 |
#endif |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
642 |
if ( |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
643 |
(_m[tile].m5 & 0xFC) == 0 /* railway tunnel */ |
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
644 |
|| (_m[tile].m5 & 0xC6) == 0x80 /* railway bridge ending */ |
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
645 |
|| ((_m[tile].m5 & 0xF8) == 0xE0 && ((unsigned)_m[tile].m5 & 0x1) != (enterdir & 0x1)) /* railway under bridge */ |
1967
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
646 |
) |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
647 |
return IsTileOwner(tile, owner); |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
648 |
break; |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
649 |
default: |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
650 |
break; |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
651 |
} |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
652 |
|
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
653 |
return true; /* no need to check */ |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
654 |
} |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
655 |
|
1247 | 656 |
/* Will just follow the results of GetTileTrackStatus concerning where we can |
657 |
* go and where not. Uses AyStar.user_data[NPF_TYPE] as the transport type and |
|
658 |
* an argument to GetTileTrackStatus. Will skip tunnels, meaning that the |
|
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
659 |
* entry and exit are neighbours. Will fill |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
660 |
* AyStarNode.user_data[NPF_TRACKDIR_CHOICE] with an appropriate value, and |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
661 |
* copy AyStarNode.user_data[NPF_NODE_FLAGS] from the parent */ |
1983 | 662 |
static void NPFFollowTrack(AyStar* aystar, OpenListNode* current) |
663 |
{ |
|
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
664 |
Trackdir src_trackdir = (Trackdir)current->path.node.direction; |
1247 | 665 |
TileIndex src_tile = current->path.node.tile; |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
666 |
DiagDirection src_exitdir = TrackdirToExitdir(src_trackdir); |
1247 | 667 |
FindLengthOfTunnelResult flotr; |
668 |
TileIndex dst_tile; |
|
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
669 |
int i; |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
670 |
TrackdirBits trackdirbits, ts; |
1247 | 671 |
TransportType type = aystar->user_data[NPF_TYPE]; |
672 |
/* Initialize to 0, so we can jump out (return) somewhere an have no neighbours */ |
|
673 |
aystar->num_neighbours = 0; |
|
1678
838dd6f46081
(svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents:
1677
diff
changeset
|
674 |
DEBUG(npf, 4)("Expanding: (%d, %d, %d) [%d]", TileX(src_tile), TileY(src_tile), src_trackdir, src_tile); |
1247 | 675 |
|
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
676 |
aystar->EndNodeCheck(aystar, current); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
677 |
|
1247 | 678 |
/* Find dest tile */ |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
679 |
if (IsTileType(src_tile, MP_TUNNELBRIDGE) && (_m[src_tile].m5 & 0xF0)==0 && (DiagDirection)(_m[src_tile].m5 & 3) == src_exitdir) { |
1247 | 680 |
/* This is a tunnel. We know this tunnel is our type, |
681 |
* otherwise we wouldn't have got here. It is also facing us, |
|
682 |
* so we should skip it's body */ |
|
683 |
flotr = FindLengthOfTunnel(src_tile, src_exitdir); |
|
684 |
dst_tile = flotr.tile; |
|
685 |
} else { |
|
1650
12a20779af79
(svn r2154) - Fix: [NPF] Vehicles should no longer try to drive through the back of depots and road stations.
matthijs
parents:
1644
diff
changeset
|
686 |
if (type != TRANSPORT_WATER && (IsRoadStationTile(src_tile) || IsTileDepotType(src_tile, type))){ |
1247 | 687 |
/* This is a road station or a train or road depot. We can enter and exit |
688 |
* those from one side only. Trackdirs don't support that (yet), so we'll |
|
689 |
* do this here. */ |
|
690 |
||
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
691 |
DiagDirection exitdir; |
1247 | 692 |
/* Find out the exit direction first */ |
693 |
if (IsRoadStationTile(src_tile)) |
|
694 |
exitdir = GetRoadStationDir(src_tile); |
|
695 |
else /* Train or road depot. Direction is stored the same for both, in map5 */ |
|
1650
12a20779af79
(svn r2154) - Fix: [NPF] Vehicles should no longer try to drive through the back of depots and road stations.
matthijs
parents:
1644
diff
changeset
|
696 |
exitdir = GetDepotDirection(src_tile, type); |
1247 | 697 |
|
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
698 |
/* Let's see if were headed the right way into the depot, and reverse |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
699 |
* otherwise (only for trains, since only with trains you can |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
700 |
* (sometimes) reach tiles after reversing that you couldn't reach |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
701 |
* without reversing. */ |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
702 |
if (src_trackdir == DiagdirToDiagTrackdir(ReverseDiagdir(exitdir)) && type == TRANSPORT_RAIL) |
1644
1a08c3ebdcd8
(svn r2148) - Add: [NPF] Trains can now plan taking into account that they can reverse in depots. This makes forced servicing tracks work with NPF.
matthijs
parents:
1643
diff
changeset
|
703 |
/* We are headed inwards. We can only reverse here, so we'll not |
1a08c3ebdcd8
(svn r2148) - Add: [NPF] Trains can now plan taking into account that they can reverse in depots. This makes forced servicing tracks work with NPF.
matthijs
parents:
1643
diff
changeset
|
704 |
* consider this direction, but jump ahead to the reverse direction. |
1a08c3ebdcd8
(svn r2148) - Add: [NPF] Trains can now plan taking into account that they can reverse in depots. This makes forced servicing tracks work with NPF.
matthijs
parents:
1643
diff
changeset
|
705 |
* It would be nicer to return one neighbour here (the reverse |
1a08c3ebdcd8
(svn r2148) - Add: [NPF] Trains can now plan taking into account that they can reverse in depots. This makes forced servicing tracks work with NPF.
matthijs
parents:
1643
diff
changeset
|
706 |
* trackdir of the one we are considering now) and then considering |
1a08c3ebdcd8
(svn r2148) - Add: [NPF] Trains can now plan taking into account that they can reverse in depots. This makes forced servicing tracks work with NPF.
matthijs
parents:
1643
diff
changeset
|
707 |
* that one to return the tracks outside of the depot. But, because |
1a08c3ebdcd8
(svn r2148) - Add: [NPF] Trains can now plan taking into account that they can reverse in depots. This makes forced servicing tracks work with NPF.
matthijs
parents:
1643
diff
changeset
|
708 |
* the code layout is cleaner this way, we will just pretend we are |
1a08c3ebdcd8
(svn r2148) - Add: [NPF] Trains can now plan taking into account that they can reverse in depots. This makes forced servicing tracks work with NPF.
matthijs
parents:
1643
diff
changeset
|
709 |
* reversed already */ |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
710 |
src_trackdir = ReverseTrackdir(src_trackdir); |
1247 | 711 |
} |
712 |
/* This a normal tile, a bridge, a tunnel exit, etc. */ |
|
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
713 |
dst_tile = AddTileIndexDiffCWrap(src_tile, TileIndexDiffCByDir(TrackdirToExitdir(src_trackdir))); |
1247 | 714 |
if (dst_tile == INVALID_TILE) { |
715 |
/* We reached the border of the map */ |
|
716 |
/* TODO Nicer control flow for this */ |
|
717 |
return; |
|
718 |
} |
|
719 |
} |
|
720 |
||
1965
ef27280abb9a
(svn r2471) - Fix: [ 1221249 ] [NPF] Vehicles try to drive into a tunnel entrance from above.
matthijs
parents:
1950
diff
changeset
|
721 |
/* I can't enter a tunnel entry/exit tile from a tile above the tunnel. Note |
ef27280abb9a
(svn r2471) - Fix: [ 1221249 ] [NPF] Vehicles try to drive into a tunnel entrance from above.
matthijs
parents:
1950
diff
changeset
|
722 |
* that I can enter the tunnel from a tile below the tunnel entrance. This |
ef27280abb9a
(svn r2471) - Fix: [ 1221249 ] [NPF] Vehicles try to drive into a tunnel entrance from above.
matthijs
parents:
1950
diff
changeset
|
723 |
* solves the problem of vehicles wanting to drive off a tunnel entrance */ |
2049
ad0d49c916d4
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2029
diff
changeset
|
724 |
if (IsTileType(dst_tile, MP_TUNNELBRIDGE) && (_m[dst_tile].m5 & 0xF0) == 0 && GetTileZ(dst_tile) < GetTileZ(src_tile)) |
1965
ef27280abb9a
(svn r2471) - Fix: [ 1221249 ] [NPF] Vehicles try to drive into a tunnel entrance from above.
matthijs
parents:
1950
diff
changeset
|
725 |
return; |
ef27280abb9a
(svn r2471) - Fix: [ 1221249 ] [NPF] Vehicles try to drive into a tunnel entrance from above.
matthijs
parents:
1950
diff
changeset
|
726 |
|
2006
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
727 |
/* check correct rail type (mono, maglev, etc) */ |
1749
bb7fa90dd0cb
(svn r2253) - Fix: [ 1190896 1184378 ] [NPF] Trains ignoring their railtype (mono, maglev) (glx)
matthijs
parents:
1700
diff
changeset
|
728 |
if (type == TRANSPORT_RAIL) { |
2006
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
729 |
RailType dst_type = GetTileRailType(dst_tile, src_trackdir); |
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
730 |
if (!IsCompatibleRail(aystar->user_data[NPF_RAILTYPE], dst_type)) |
1749
bb7fa90dd0cb
(svn r2253) - Fix: [ 1190896 1184378 ] [NPF] Trains ignoring their railtype (mono, maglev) (glx)
matthijs
parents:
1700
diff
changeset
|
731 |
return; |
bb7fa90dd0cb
(svn r2253) - Fix: [ 1190896 1184378 ] [NPF] Trains ignoring their railtype (mono, maglev) (glx)
matthijs
parents:
1700
diff
changeset
|
732 |
} |
1330
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
733 |
|
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
734 |
/* Check the owner of the tile */ |
1967
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
735 |
if (!VehicleMayEnterTile(aystar->user_data[NPF_OWNER], dst_tile, TrackdirToExitdir(src_trackdir))) { |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
736 |
return; |
c57192f4c121
(svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents:
1965
diff
changeset
|
737 |
} |
1247 | 738 |
|
739 |
/* Determine available tracks */ |
|
1655
f45015d2df03
(svn r2159) - Fix: [NPF] Road vehicles never found their target station or depots (introduced in r2154)
matthijs
parents:
1650
diff
changeset
|
740 |
if (type != TRANSPORT_WATER && (IsRoadStationTile(dst_tile) || IsTileDepotType(dst_tile, type))){ |
f45015d2df03
(svn r2159) - Fix: [NPF] Road vehicles never found their target station or depots (introduced in r2154)
matthijs
parents:
1650
diff
changeset
|
741 |
/* Road stations and road and train depots return 0 on GTTS, so we have to do this by hand... */ |
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
742 |
DiagDirection exitdir; |
1330
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
743 |
if (IsRoadStationTile(dst_tile)) |
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
744 |
exitdir = GetRoadStationDir(dst_tile); |
1655
f45015d2df03
(svn r2159) - Fix: [NPF] Road vehicles never found their target station or depots (introduced in r2154)
matthijs
parents:
1650
diff
changeset
|
745 |
else /* Road or train depot */ |
1650
12a20779af79
(svn r2154) - Fix: [NPF] Vehicles should no longer try to drive through the back of depots and road stations.
matthijs
parents:
1644
diff
changeset
|
746 |
exitdir = GetDepotDirection(dst_tile, type); |
12a20779af79
(svn r2154) - Fix: [NPF] Vehicles should no longer try to drive through the back of depots and road stations.
matthijs
parents:
1644
diff
changeset
|
747 |
/* Find the trackdirs that are available for a depot or station with this |
12a20779af79
(svn r2154) - Fix: [NPF] Vehicles should no longer try to drive through the back of depots and road stations.
matthijs
parents:
1644
diff
changeset
|
748 |
* orientation. They are only "inwards", since we are reaching this tile |
12a20779af79
(svn r2154) - Fix: [NPF] Vehicles should no longer try to drive through the back of depots and road stations.
matthijs
parents:
1644
diff
changeset
|
749 |
* from some other tile. This prevents vehicles driving into depots from |
12a20779af79
(svn r2154) - Fix: [NPF] Vehicles should no longer try to drive through the back of depots and road stations.
matthijs
parents:
1644
diff
changeset
|
750 |
* the back */ |
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
751 |
ts = TrackdirToTrackdirBits(DiagdirToDiagTrackdir(ReverseDiagdir(exitdir))); |
1247 | 752 |
} else { |
753 |
ts = GetTileTrackStatus(dst_tile, type); |
|
754 |
} |
|
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
755 |
trackdirbits = ts & TRACKDIR_BIT_MASK; /* Filter out signal status and the unused bits */ |
1247 | 756 |
|
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
757 |
DEBUG(npf, 4)("Next node: (%d, %d) [%d], possible trackdirs: %#x", TileX(dst_tile), TileY(dst_tile), dst_tile, trackdirbits); |
1247 | 758 |
/* Select only trackdirs we can reach from our current trackdir */ |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
759 |
trackdirbits &= TrackdirReachesTrackdirs(src_trackdir); |
1247 | 760 |
if (_patches.forbid_90_deg && (type == TRANSPORT_RAIL || type == TRANSPORT_WATER)) /* Filter out trackdirs that would make 90 deg turns for trains */ |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
761 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
762 |
trackdirbits &= ~TrackdirCrossesTrackdirs(src_trackdir); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
763 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
764 |
if (KillFirstBit2x64(trackdirbits) != 0) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
765 |
NPFSetFlag(¤t->path.node, NPF_FLAG_PBS_CHOICE, true); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
766 |
|
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
767 |
/* When looking for 'any' route, ie when already inside a pbs block, discard all tracks that would cross |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
768 |
other reserved tracks, so we *always* will find a valid route if there is one */ |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
769 |
if (!(NPFGetFlag(¤t->path.node, NPF_FLAG_PBS_EXIT)) && (aystar->user_data[NPF_PBS_MODE] == PBS_MODE_ANY)) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
770 |
trackdirbits &= ~PBSTileUnavail(dst_tile); |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
771 |
|
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
772 |
DEBUG(npf,6)("After filtering: (%d, %d), possible trackdirs: %#x", TileX(dst_tile), TileY(dst_tile), trackdirbits); |
1247 | 773 |
|
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
774 |
i = 0; |
1247 | 775 |
/* Enumerate possible track */ |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
776 |
while (trackdirbits != 0) { |
1950
6e4d384034d9
(svn r2456) * Prettyfied npf.c using enums and wrappers from rail.h.
matthijs
parents:
1945
diff
changeset
|
777 |
Trackdir dst_trackdir; |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
778 |
dst_trackdir = FindFirstBit2x64(trackdirbits); |
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
779 |
trackdirbits = KillFirstBit2x64(trackdirbits); |
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
780 |
DEBUG(npf, 5)("Expanded into trackdir: %d, remaining trackdirs: %#x", dst_trackdir, trackdirbits); |
1247 | 781 |
|
782 |
/* Check for oneway signal against us */ |
|
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
783 |
if (IsTileType(dst_tile, MP_RAILWAY) && GetRailTileType(dst_tile) == RAIL_TYPE_SIGNALS) { |
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
784 |
if (HasSignalOnTrackdir(dst_tile, ReverseTrackdir(dst_trackdir)) && !HasSignalOnTrackdir(dst_tile, dst_trackdir)) |
1247 | 785 |
// if one way signal not pointing towards us, stop going in this direction. |
1944
012fa5e69118
(svn r2450) * Codechange: Replaced all uses of the arrays in tile.h with calls to the associated wrapper functions.
matthijs
parents:
1942
diff
changeset
|
786 |
break; |
1247 | 787 |
} |
788 |
{ |
|
789 |
/* We've found ourselves a neighbour :-) */ |
|
790 |
AyStarNode* neighbour = &aystar->neighbours[i]; |
|
791 |
neighbour->tile = dst_tile; |
|
792 |
neighbour->direction = dst_trackdir; |
|
793 |
/* Save user data */ |
|
794 |
neighbour->user_data[NPF_NODE_FLAGS] = current->path.node.user_data[NPF_NODE_FLAGS]; |
|
795 |
NPFFillTrackdirChoice(neighbour, current); |
|
796 |
} |
|
797 |
i++; |
|
798 |
} |
|
799 |
aystar->num_neighbours = i; |
|
800 |
} |
|
801 |
||
802 |
/* |
|
803 |
* Plan a route to the specified target (which is checked by target_proc), |
|
804 |
* from start1 and if not NULL, from start2 as well. The type of transport we |
|
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
805 |
* are checking is in type. reverse_penalty is applied to all routes that |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
806 |
* originate from the second start node. |
1247 | 807 |
* When we are looking for one specific target (optionally multiple tiles), we |
808 |
* should use a good heuristic to perform aystar search. When we search for |
|
809 |
* multiple targets that are spread around, we should perform a breadth first |
|
810 |
* search by specifiying CalcZero as our heuristic. |
|
811 |
*/ |
|
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
812 |
static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start2, NPFFindStationOrTileData* target, AyStar_EndNodeCheck target_proc, AyStar_CalculateH heuristic_proc, TransportType type, Owner owner, RailType railtype, uint reverse_penalty, byte pbs_mode) |
1983 | 813 |
{ |
1247 | 814 |
int r; |
815 |
NPFFoundTargetData result; |
|
816 |
||
817 |
/* Initialize procs */ |
|
818 |
_npf_aystar.CalculateH = heuristic_proc; |
|
819 |
_npf_aystar.EndNodeCheck = target_proc; |
|
820 |
_npf_aystar.FoundEndNode = NPFSaveTargetData; |
|
821 |
_npf_aystar.GetNeighbours = NPFFollowTrack; |
|
822 |
if (type == TRANSPORT_RAIL) |
|
823 |
_npf_aystar.CalculateG = NPFRailPathCost; |
|
824 |
else if (type == TRANSPORT_ROAD) |
|
825 |
_npf_aystar.CalculateG = NPFRoadPathCost; |
|
826 |
else if (type == TRANSPORT_WATER) |
|
827 |
_npf_aystar.CalculateG = NPFWaterPathCost; |
|
828 |
else |
|
829 |
assert(0); |
|
830 |
||
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
831 |
if (pbs_mode != PBS_MODE_NONE) |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
832 |
_npf_aystar.BeforeExit = NPFReservePBSPath; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
833 |
else |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
834 |
_npf_aystar.BeforeExit = NULL; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
835 |
|
1247 | 836 |
/* Initialize Start Node(s) */ |
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
837 |
start1->user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; |
1247 | 838 |
start1->user_data[NPF_NODE_FLAGS] = 0; |
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
839 |
_npf_aystar.addstart(&_npf_aystar, start1, 0); |
1247 | 840 |
if (start2) { |
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
841 |
start2->user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; |
1459
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
842 |
start2->user_data[NPF_NODE_FLAGS] = 0; |
6c1f01803928
(svn r1963) - Add: [NPF] Penalty for a red signal that is the last signal on the path.
matthijs
parents:
1453
diff
changeset
|
843 |
NPFSetFlag(start2, NPF_FLAG_REVERSE, true); |
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
844 |
_npf_aystar.addstart(&_npf_aystar, start2, reverse_penalty); |
1247 | 845 |
} |
846 |
||
847 |
/* Initialize result */ |
|
848 |
result.best_bird_dist = (uint)-1; |
|
849 |
result.best_path_dist = (uint)-1; |
|
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
850 |
result.best_trackdir = INVALID_TRACKDIR; |
1247 | 851 |
_npf_aystar.user_path = &result; |
852 |
||
853 |
/* Initialize target */ |
|
854 |
_npf_aystar.user_target = target; |
|
855 |
||
856 |
/* Initialize user_data */ |
|
857 |
_npf_aystar.user_data[NPF_TYPE] = type; |
|
1330
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
858 |
_npf_aystar.user_data[NPF_OWNER] = owner; |
2006
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
859 |
_npf_aystar.user_data[NPF_RAILTYPE] = railtype; |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
860 |
_npf_aystar.user_data[NPF_PBS_MODE] = pbs_mode; |
1247 | 861 |
|
862 |
/* GO! */ |
|
863 |
r = AyStarMain_Main(&_npf_aystar); |
|
864 |
assert(r != AYSTAR_STILL_BUSY); |
|
865 |
||
866 |
if (result.best_bird_dist != 0) { |
|
867 |
if (target) { |
|
868 |
DEBUG(misc, 1) ("NPF: Could not find route to 0x%x from 0x%x.", target->dest_coords, start1->tile); |
|
869 |
} else { |
|
870 |
/* Assumption: target == NULL, so we are looking for a depot */ |
|
871 |
DEBUG(misc, 1) ("NPF: Could not find route to a depot from 0x%x.", start1->tile); |
|
872 |
} |
|
873 |
||
874 |
} |
|
875 |
return result; |
|
876 |
} |
|
877 |
||
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
878 |
NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailType railtype, byte pbs_mode) |
1983 | 879 |
{ |
1247 | 880 |
AyStarNode start1; |
881 |
AyStarNode start2; |
|
882 |
||
883 |
start1.tile = tile1; |
|
884 |
start2.tile = tile2; |
|
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
885 |
/* We set this in case the target is also the start tile, we will just |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
886 |
* return a not found then */ |
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
887 |
start1.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; |
1247 | 888 |
start1.direction = trackdir1; |
889 |
start2.direction = trackdir2; |
|
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
890 |
start2.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; |
1247 | 891 |
|
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
892 |
return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), target, NPFFindStationOrTile, NPFCalcStationOrTileHeuristic, type, owner, railtype, 0, pbs_mode); |
1247 | 893 |
} |
894 |
||
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
895 |
NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailType railtype, byte pbs_mode) |
1983 | 896 |
{ |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
897 |
return NPFRouteToStationOrTileTwoWay(tile, trackdir, INVALID_TILE, 0, target, type, owner, railtype, pbs_mode); |
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
898 |
} |
1247 | 899 |
|
2006
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
900 |
NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, TransportType type, Owner owner, RailType railtype, uint reverse_penalty) |
1983 | 901 |
{ |
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
902 |
AyStarNode start1; |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
903 |
AyStarNode start2; |
1247 | 904 |
|
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
905 |
start1.tile = tile1; |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
906 |
start2.tile = tile2; |
1247 | 907 |
/* We set this in case the target is also the start tile, we will just |
908 |
* return a not found then */ |
|
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
909 |
start1.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; |
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
910 |
start1.direction = trackdir1; |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
911 |
start2.direction = trackdir2; |
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
912 |
start2.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; |
1247 | 913 |
|
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
914 |
/* perform a breadth first search. Target is NULL, |
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
915 |
* since we are just looking for any depot...*/ |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
916 |
return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), NULL, NPFFindDepot, NPFCalcZero, type, owner, railtype, reverse_penalty, PBS_MODE_NONE); |
1247 | 917 |
} |
918 |
||
2006
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
919 |
NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailType railtype) |
1983 | 920 |
{ |
2006
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
921 |
return NPFRouteToDepotBreadthFirstTwoWay(tile, trackdir, INVALID_TILE, 0, type, owner, railtype, 0); |
1247 | 922 |
} |
923 |
||
2006
324916f22a8a
(svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents:
1983
diff
changeset
|
924 |
NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailType railtype) |
1983 | 925 |
{ |
1247 | 926 |
/* Okay, what we're gonna do. First, we look at all depots, calculate |
927 |
* the manhatten distance to get to each depot. We then sort them by |
|
928 |
* distance. We start by trying to plan a route to the closest, then |
|
929 |
* the next closest, etc. We stop when the best route we have found so |
|
930 |
* far, is shorter than the manhattan distance. This will obviously |
|
931 |
* always find the closest depot. It will probably be most efficient |
|
932 |
* for ships, since the heuristic will not be to far off then. I hope. |
|
933 |
*/ |
|
934 |
Queue depots; |
|
935 |
int r; |
|
936 |
NPFFoundTargetData best_result; |
|
937 |
NPFFoundTargetData result; |
|
938 |
NPFFindStationOrTileData target; |
|
939 |
AyStarNode start; |
|
940 |
Depot* current; |
|
1313
bba6afb8a995
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1299
diff
changeset
|
941 |
Depot *depot; |
1247 | 942 |
|
943 |
init_InsSort(&depots); |
|
944 |
/* Okay, let's find all depots that we can use first */ |
|
1313
bba6afb8a995
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1299
diff
changeset
|
945 |
FOR_ALL_DEPOTS(depot) { |
1330
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
946 |
/* Check if this is really a valid depot, it is of the needed type and |
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
947 |
* owner */ |
1338 | 948 |
if (IsValidDepot(depot) && IsTileDepotType(depot->xy, type) && IsTileOwner(depot->xy, owner)) |
1330
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
949 |
/* If so, let's add it to the queue, sorted by distance */ |
1313
bba6afb8a995
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1299
diff
changeset
|
950 |
depots.push(&depots, depot, DistanceManhattan(tile, depot->xy)); |
1247 | 951 |
} |
952 |
||
953 |
/* Now, let's initialise the aystar */ |
|
954 |
||
955 |
/* Initialize procs */ |
|
956 |
_npf_aystar.CalculateH = NPFCalcStationOrTileHeuristic; |
|
957 |
_npf_aystar.EndNodeCheck = NPFFindStationOrTile; |
|
958 |
_npf_aystar.FoundEndNode = NPFSaveTargetData; |
|
959 |
_npf_aystar.GetNeighbours = NPFFollowTrack; |
|
960 |
if (type == TRANSPORT_RAIL) |
|
961 |
_npf_aystar.CalculateG = NPFRailPathCost; |
|
962 |
else if (type == TRANSPORT_ROAD) |
|
963 |
_npf_aystar.CalculateG = NPFRoadPathCost; |
|
964 |
else if (type == TRANSPORT_WATER) |
|
965 |
_npf_aystar.CalculateG = NPFWaterPathCost; |
|
966 |
else |
|
967 |
assert(0); |
|
968 |
||
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
969 |
_npf_aystar.BeforeExit = NULL; |
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
970 |
|
1247 | 971 |
/* Initialize target */ |
972 |
target.station_index = -1; /* We will initialize dest_coords inside the loop below */ |
|
973 |
_npf_aystar.user_target = ⌖ |
|
974 |
||
975 |
/* Initialize user_data */ |
|
976 |
_npf_aystar.user_data[NPF_TYPE] = type; |
|
1330
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
977 |
_npf_aystar.user_data[NPF_OWNER] = owner; |
2008
c9d6585c96c8
(svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents:
2006
diff
changeset
|
978 |
_npf_aystar.user_data[NPF_PBS_MODE] = PBS_MODE_NONE; |
1247 | 979 |
|
980 |
/* Initialize Start Node */ |
|
981 |
start.tile = tile; |
|
982 |
start.direction = trackdir; /* We will initialize user_data inside the loop below */ |
|
983 |
||
984 |
/* Initialize Result */ |
|
985 |
_npf_aystar.user_path = &result; |
|
986 |
best_result.best_path_dist = (uint)-1; |
|
1330
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
987 |
best_result.best_bird_dist = (uint)-1; |
1247 | 988 |
|
989 |
/* Just iterate the depots in order of increasing distance */ |
|
990 |
while ((current = depots.pop(&depots))) { |
|
991 |
/* Check to see if we already have a path shorter than this |
|
1330
8a67d04016ce
(svn r1834) - Fix: NPF does not check the owner of its target, busses try to enter other players' depots. TODO
matthijs
parents:
1313
diff
changeset
|
992 |
* depot's manhattan distance. HACK: We call DistanceManhattan |
1247 | 993 |
* again, we should probably modify the queue to give us that |
994 |
* value... */ |
|
995 |
if ( DistanceManhattan(tile, current->xy * NPF_TILE_LENGTH) > best_result.best_path_dist) |
|
996 |
break; |
|
997 |
||
998 |
/* Initialize Start Node */ |
|
999 |
/* We set this in case the target is also the start tile, we will just |
|
1000 |
* return a not found then */ |
|
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
1001 |
start.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR; |
1247 | 1002 |
start.user_data[NPF_NODE_FLAGS] = 0; |
1777
d328484bd6f2
(svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents:
1753
diff
changeset
|
1003 |
_npf_aystar.addstart(&_npf_aystar, &start, 0); |
1247 | 1004 |
|
1005 |
/* Initialize result */ |
|
1006 |
result.best_bird_dist = (uint)-1; |
|
1007 |
result.best_path_dist = (uint)-1; |
|
1942
634961366cdc
(svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
1941
diff
changeset
|
1008 |
result.best_trackdir = INVALID_TRACKDIR; |
1247 | 1009 |
|
1010 |
/* Initialize target */ |
|
1011 |
target.dest_coords = current->xy; |
|
1012 |
||
1013 |
/* GO! */ |
|
1014 |
r = AyStarMain_Main(&_npf_aystar); |
|
1015 |
assert(r != AYSTAR_STILL_BUSY); |
|
1016 |
||
1017 |
/* This depot is closer */ |
|
1018 |
if (result.best_path_dist < best_result.best_path_dist) |
|
1019 |
best_result = result; |
|
1020 |
} |
|
1021 |
if (result.best_bird_dist != 0) { |
|
1022 |
DEBUG(misc, 1) ("NPF: Could not find route to any depot from 0x%x.", tile); |
|
1023 |
} |
|
1024 |
return best_result; |
|
1025 |
} |
|
1026 |
||
1027 |
void InitializeNPF(void) |
|
1028 |
{ |
|
1661
6af0c4416154
(svn r2165) - Codechange: [NPF] Properly enummed NPF hash size, it is easily changable now.
matthijs
parents:
1655
diff
changeset
|
1029 |
init_AyStar(&_npf_aystar, NPFHash, NPF_HASH_SIZE); |
1463
a9b4664cef34
(svn r1967) Codechange: A mix of mostly indentation-related tidyups.
pasky
parents:
1460
diff
changeset
|
1030 |
_npf_aystar.loops_per_tick = 0; |
a9b4664cef34
(svn r1967) Codechange: A mix of mostly indentation-related tidyups.
pasky
parents:
1460
diff
changeset
|
1031 |
_npf_aystar.max_path_cost = 0; |
1700
b8ecf0494fdd
(svn r2204) - Add: [NPF] NPF now has a maximum number of nodes it will search. The default value is 5000 for now, which is an educated guess. Probably needs some finetuning. Hopefully this "feature" can be removed later on, when more sophisticated means of limiting the pathfinder have been implemented. This should make ships and larger networks playable for now, though.
matthijs
parents:
1678
diff
changeset
|
1032 |
//_npf_aystar.max_search_nodes = 0; |
b8ecf0494fdd
(svn r2204) - Add: [NPF] NPF now has a maximum number of nodes it will search. The default value is 5000 for now, which is an educated guess. Probably needs some finetuning. Hopefully this "feature" can be removed later on, when more sophisticated means of limiting the pathfinder have been implemented. This should make ships and larger networks playable for now, though.
matthijs
parents:
1678
diff
changeset
|
1033 |
/* We will limit the number of nodes for now, until we have a better |
b8ecf0494fdd
(svn r2204) - Add: [NPF] NPF now has a maximum number of nodes it will search. The default value is 5000 for now, which is an educated guess. Probably needs some finetuning. Hopefully this "feature" can be removed later on, when more sophisticated means of limiting the pathfinder have been implemented. This should make ships and larger networks playable for now, though.
matthijs
parents:
1678
diff
changeset
|
1034 |
* solution to really fix performance */ |
b8ecf0494fdd
(svn r2204) - Add: [NPF] NPF now has a maximum number of nodes it will search. The default value is 5000 for now, which is an educated guess. Probably needs some finetuning. Hopefully this "feature" can be removed later on, when more sophisticated means of limiting the pathfinder have been implemented. This should make ships and larger networks playable for now, though.
matthijs
parents:
1678
diff
changeset
|
1035 |
_npf_aystar.max_search_nodes = _patches.npf_max_search_nodes; |
1247 | 1036 |
} |
1037 |
||
1983 | 1038 |
void NPFFillWithOrderData(NPFFindStationOrTileData* fstd, Vehicle* v) |
1039 |
{ |
|
1247 | 1040 |
/* Ships don't really reach their stations, but the tile in front. So don't |
1041 |
* save the station id for ships. For roadvehs we don't store it either, |
|
1042 |
* because multistop depends on vehicles actually reaching the exact |
|
1043 |
* dest_tile, not just any stop of that station. |
|
1044 |
* So only for train orders to stations we fill fstd->station_index, for all |
|
1045 |
* others only dest_coords */ |
|
1046 |
if ((v->current_order.type) == OT_GOTO_STATION && v->type == VEH_Train) { |
|
1047 |
fstd->station_index = v->current_order.station; |
|
1452
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
1048 |
/* Let's take the closest tile of the station as our target for trains */ |
9285e482f984
(svn r1956) -Fix: [NPF] New target tile for heuristic should perform better with larger stations (HackyKid)
matthijs
parents:
1339
diff
changeset
|
1049 |
fstd->dest_coords = CalcClosestStationTile(v->current_order.station, v->tile); |
1247 | 1050 |
} else { |
1051 |
fstd->dest_coords = v->dest_tile; |
|
1052 |
fstd->station_index = -1; |
|
1053 |
} |
|
1054 |
} |