author | rubidium |
Sun, 25 May 2008 19:17:03 +0000 | |
changeset 9354 | 845e07db4549 |
parent 9323 | 909e4fa75ac1 |
child 9565 | 3197734ce244 |
permissions | -rw-r--r-- |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
1 |
/* $Id$ */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
2 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
3 |
/** @file signal.cpp functions related to rail signals updating */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
4 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
5 |
#include "stdafx.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
6 |
#include "openttd.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
7 |
#include "debug.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
8 |
#include "tile_cmd.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
9 |
#include "rail_map.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
10 |
#include "road_map.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
11 |
#include "station_map.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
12 |
#include "tunnelbridge_map.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
13 |
#include "vehicle_func.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
14 |
#include "train.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
15 |
#include "newgrf_station.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
16 |
#include "functions.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
17 |
#include "track_type.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
18 |
#include "track_func.h" |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
19 |
#include "signal_func.h" |
8254
1496654ca5e7
(svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents:
8251
diff
changeset
|
20 |
#include "player_func.h" |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
21 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
22 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
23 |
/** these are the maximums used for updating signal blocks */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
24 |
enum { |
8306
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
25 |
SIG_TBU_SIZE = 64, ///< number of signals entering to block |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
26 |
SIG_TBD_SIZE = 256, ///< number of intersections - open nodes in current block |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
27 |
SIG_GLOB_SIZE = 128, ///< number of open blocks (block can be opened more times until detected) |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
28 |
SIG_GLOB_UPDATE = 64, ///< how many items need to be in _globset to force update |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
29 |
}; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
30 |
|
8337 | 31 |
/* need to typecast to compile with MorphOS */ |
32 |
assert_compile((int)SIG_GLOB_UPDATE <= (int)SIG_GLOB_SIZE); |
|
8306
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
33 |
|
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
34 |
/** incidating trackbits with given enterdir */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
35 |
static const TrackBitsByte _enterdir_to_trackbits[DIAGDIR_END] = { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
36 |
{TRACK_BIT_3WAY_NE}, |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
37 |
{TRACK_BIT_3WAY_SE}, |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
38 |
{TRACK_BIT_3WAY_SW}, |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
39 |
{TRACK_BIT_3WAY_NW} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
40 |
}; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
41 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
42 |
/** incidating trackdirbits with given enterdir */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
43 |
static const TrackdirBitsShort _enterdir_to_trackdirbits[DIAGDIR_END] = { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
44 |
{TRACKDIR_BIT_X_SW | TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_RIGHT_S}, |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
45 |
{TRACKDIR_BIT_Y_NW | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_RIGHT_N}, |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
46 |
{TRACKDIR_BIT_X_NE | TRACKDIR_BIT_LOWER_E | TRACKDIR_BIT_LEFT_N}, |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
47 |
{TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LEFT_S} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
48 |
}; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
49 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
50 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
51 |
* Set containing 'items' items of 'tile and Tdir' |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
52 |
* No tree structure is used because it would cause |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
53 |
* slowdowns in most usual cases |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
54 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
55 |
template <typename Tdir, uint items> |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
56 |
struct SmallSet { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
57 |
private: |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
58 |
uint n; // actual number of units |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
59 |
bool overflowed; // did we try to oveflow the set? |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
60 |
const char *name; // name, used for debugging purposes... |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
61 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
62 |
/** Element of set */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
63 |
struct SSdata { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
64 |
TileIndex tile; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
65 |
Tdir dir; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
66 |
} data[items]; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
67 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
68 |
public: |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
69 |
/** Constructor - just set default values and 'name' */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
70 |
SmallSet(const char *name) : n(0), overflowed(false), name(name) { } |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
71 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
72 |
/** Reset variables to default values */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
73 |
void Reset() |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
74 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
75 |
this->n = 0; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
76 |
this->overflowed = false; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
77 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
78 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
79 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
80 |
* Returns value of 'oveflowed' |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
81 |
* @return did we try to overflow the set? |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
82 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
83 |
bool Overflowed() |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
84 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
85 |
return this->overflowed; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
86 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
87 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
88 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
89 |
* Checks for empty set |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
90 |
* @return is the set empty? |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
91 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
92 |
bool IsEmpty() |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
93 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
94 |
return this->n == 0; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
95 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
96 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
97 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
98 |
* Checks for full set |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
99 |
* @return is the set full? |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
100 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
101 |
bool IsFull() |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
102 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
103 |
return this->n == lengthof(data); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
104 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
105 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
106 |
/** |
8306
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
107 |
* Reads the number of items |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
108 |
* @return current number of items |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
109 |
*/ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
110 |
uint Items() |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
111 |
{ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
112 |
return this->n; |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
113 |
} |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
114 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
115 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
116 |
/** |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
117 |
* Tries to remove first instance of given tile and dir |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
118 |
* @param tile tile |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
119 |
* @param dir and dir to remove |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
120 |
* @return element was found and removed |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
121 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
122 |
bool Remove(TileIndex tile, Tdir dir) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
123 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
124 |
for (uint i = 0; i < this->n; i++) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
125 |
if (this->data[i].tile == tile && this->data[i].dir == dir) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
126 |
this->data[i] = this->data[--this->n]; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
127 |
return true; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
128 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
129 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
130 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
131 |
return false; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
132 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
133 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
134 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
135 |
* Tries to find given tile and dir in the set |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
136 |
* @param tile tile |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
137 |
* @param dir and dir to find |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
138 |
* @return true iff the tile & dir elemnt was found |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
139 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
140 |
bool IsIn(TileIndex tile, Tdir dir) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
141 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
142 |
for (uint i = 0; i < this->n; i++) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
143 |
if (this->data[i].tile == tile && this->data[i].dir == dir) return true; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
144 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
145 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
146 |
return false; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
147 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
148 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
149 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
150 |
* Adds tile & dir into the set, checks for full set |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
151 |
* Sets the 'overflowed' flag if the set was full |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
152 |
* @param tile tile |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
153 |
* @param dir and dir to add |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
154 |
* @return true iff the item could be added (set wasn't full) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
155 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
156 |
bool Add(TileIndex tile, Tdir dir) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
157 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
158 |
if (this->IsFull()) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
159 |
overflowed = true; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
160 |
DEBUG(misc, 0, "SignalSegment too complex. Set %s is full (maximum %d)", name, items); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
161 |
return false; // set is full |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
162 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
163 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
164 |
this->data[this->n].tile = tile; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
165 |
this->data[this->n].dir = dir; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
166 |
this->n++; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
167 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
168 |
return true; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
169 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
170 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
171 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
172 |
* Reads the last added element into the set |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
173 |
* @param tile pointer where tile is written to |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
174 |
* @param dir pointer where dir is written to |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
175 |
* @return false iff the set was empty |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
176 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
177 |
bool Get(TileIndex *tile, Tdir *dir) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
178 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
179 |
if (this->n == 0) return false; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
180 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
181 |
this->n--; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
182 |
*tile = this->data[this->n].tile; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
183 |
*dir = this->data[this->n].dir; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
184 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
185 |
return true; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
186 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
187 |
}; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
188 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
189 |
static SmallSet<Trackdir, SIG_TBU_SIZE> _tbuset("_tbuset"); ///< set of signals that will be updated |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
190 |
static SmallSet<DiagDirection, SIG_TBD_SIZE> _tbdset("_tbdset"); ///< set of open nodes in current signal block |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
191 |
static SmallSet<DiagDirection, SIG_GLOB_SIZE> _globset("_globset"); ///< set of places to be updated in following runs |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
192 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
193 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
194 |
/** Check whether there is a train on rail, not in a depot */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
195 |
static void *TrainOnTileEnum(Vehicle *v, void *) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
196 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
197 |
if (v->type != VEH_TRAIN || v->u.rail.track == TRACK_BIT_DEPOT) return NULL; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
198 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
199 |
return v; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
200 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
201 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
202 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
203 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
204 |
* Perform some operations before adding data into Todo set |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
205 |
* The new and reverse direction is removed from _globset, because we are sure |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
206 |
* it doesn't need to be checked again |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
207 |
* Also, remove reverse direction from _tbdset |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
208 |
* This is the 'core' part so the graph seaching won't enter any tile twice |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
209 |
* |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
210 |
* @param t1 tile we are entering |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
211 |
* @param d1 direction (tile side) we are entering |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
212 |
* @param t2 tile we are leaving |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
213 |
* @param d2 direction (tile side) we are leaving |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
214 |
* @return false iff reverse direction was in Todo set |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
215 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
216 |
static inline bool CheckAddToTodoSet(TileIndex t1, DiagDirection d1, TileIndex t2, DiagDirection d2) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
217 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
218 |
_globset.Remove(t1, d1); // it can be in Global but not in Todo |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
219 |
_globset.Remove(t2, d2); // remove in all cases |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
220 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
221 |
assert(!_tbdset.IsIn(t1, d1)); // it really shouldn't be there already |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
222 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
223 |
if (_tbdset.Remove(t2, d2)) return false; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
224 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
225 |
return true; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
226 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
227 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
228 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
229 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
230 |
* Perform some operations before adding data into Todo set |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
231 |
* The new and reverse direction is removed from Global set, because we are sure |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
232 |
* it doesn't need to be checked again |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
233 |
* Also, remove reverse direction from Todo set |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
234 |
* This is the 'core' part so the graph seaching won't enter any tile twice |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
235 |
* |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
236 |
* @param t1 tile we are entering |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
237 |
* @param d1 direction (tile side) we are entering |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
238 |
* @param t2 tile we are leaving |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
239 |
* @param d2 direction (tile side) we are leaving |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
240 |
* @return false iff the Todo buffer would be overrun |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
241 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
242 |
static inline bool MaybeAddToTodoSet(TileIndex t1, DiagDirection d1, TileIndex t2, DiagDirection d2) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
243 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
244 |
if (!CheckAddToTodoSet(t1, d1, t2, d2)) return true; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
245 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
246 |
return _tbdset.Add(t1, d1); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
247 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
248 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
249 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
250 |
/** Current signal block state flags */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
251 |
enum SigFlags { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
252 |
SF_NONE = 0, |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
253 |
SF_TRAIN = 1 << 0, ///< train found in segment |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
254 |
SF_EXIT = 1 << 1, ///< exitsignal found |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
255 |
SF_EXIT2 = 1 << 2, ///< two or more exits found |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
256 |
SF_GREEN = 1 << 3, ///< green exitsignal found |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
257 |
SF_GREEN2 = 1 << 4, ///< two or more green exits found |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
258 |
SF_FULL = 1 << 5, ///< some of buffers was full, do not continue |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
259 |
}; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
260 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
261 |
DECLARE_ENUM_AS_BIT_SET(SigFlags) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
262 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
263 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
264 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
265 |
* Search signal block |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
266 |
* |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
267 |
* @param owner owner whose signals we are updating |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
268 |
* @return SigFlags |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
269 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
270 |
static SigFlags ExploreSegment(Owner owner) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
271 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
272 |
SigFlags flags = SF_NONE; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
273 |
|
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
274 |
TileIndex tile; |
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
275 |
DiagDirection enterdir; |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
276 |
|
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
277 |
while (_tbdset.Get(&tile, &enterdir)) { |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
278 |
TileIndex oldtile = tile; // tile we are leaving |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
279 |
DiagDirection exitdir = enterdir == INVALID_DIAGDIR ? INVALID_DIAGDIR : ReverseDiagDir(enterdir); // expected new exit direction (for straight line) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
280 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
281 |
switch (GetTileType(tile)) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
282 |
case MP_RAILWAY: { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
283 |
if (GetTileOwner(tile) != owner) continue; // do not propagate signals on others' tiles (remove for tracksharing) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
284 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
285 |
if (IsRailDepot(tile)) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
286 |
if (enterdir == INVALID_DIAGDIR) { // from 'inside' - train just entered or left the depot |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
287 |
if (!(flags & SF_TRAIN) && VehicleFromPos(tile, NULL, &TrainOnTileEnum)) flags |= SF_TRAIN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
288 |
exitdir = GetRailDepotDirection(tile); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
289 |
tile += TileOffsByDiagDir(exitdir); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
290 |
enterdir = ReverseDiagDir(exitdir); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
291 |
break; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
292 |
} else if (enterdir == GetRailDepotDirection(tile)) { // entered a depot |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
293 |
if (!(flags & SF_TRAIN) && VehicleFromPos(tile, NULL, &TrainOnTileEnum)) flags |= SF_TRAIN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
294 |
continue; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
295 |
} else { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
296 |
continue; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
297 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
298 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
299 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
300 |
if (GetRailTileType(tile) == RAIL_TILE_WAYPOINT) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
301 |
if (!(flags & SF_TRAIN) && VehicleFromPos(tile, NULL, &TrainOnTileEnum)) flags |= SF_TRAIN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
302 |
tile += TileOffsByDiagDir(exitdir); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
303 |
/* enterdir and exitdir stay the same */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
304 |
break; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
305 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
306 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
307 |
TrackBits tracks = GetTrackBits(tile); // trackbits of tile |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
308 |
TrackBits tracks_masked = (TrackBits)(tracks & _enterdir_to_trackbits[enterdir]); // only incidating trackbits |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
309 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
310 |
if (tracks == TRACK_BIT_HORZ || tracks == TRACK_BIT_VERT) { // there is exactly one incidating track, no need to check |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
311 |
tracks = tracks_masked; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
312 |
if (!(flags & SF_TRAIN) && VehicleFromPos(tile, &tracks, &EnsureNoTrainOnTrackProc)) flags |= SF_TRAIN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
313 |
} else { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
314 |
if (tracks_masked == TRACK_BIT_NONE) continue; // no incidating track |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
315 |
if (!(flags & SF_TRAIN) && VehicleFromPos(tile, NULL, &TrainOnTileEnum)) flags |= SF_TRAIN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
316 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
317 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
318 |
if (HasSignals(tile)) { // there is exactly one track - not zero, because there is exit from this tile |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
319 |
Track track = TrackBitsToTrack(tracks_masked); // mask TRACK_BIT_X and Y too |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
320 |
if (HasSignalOnTrack(tile, track)) { // now check whole track, not trackdir |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
321 |
SignalType sig = GetSignalType(tile, track); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
322 |
Trackdir trackdir = (Trackdir)FindFirstBit((tracks * 0x101) & _enterdir_to_trackdirbits[enterdir]); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
323 |
Trackdir reversedir = ReverseTrackdir(trackdir); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
324 |
/* add (tile, reversetrackdir) to 'to-be-updated' set when there is |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
325 |
* ANY signal in REVERSE direction |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
326 |
* (if it is a presignal EXIT and it changes, it will be added to 'to-be-done' set later) */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
327 |
if (HasSignalOnTrackdir(tile, reversedir)) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
328 |
if (!_tbuset.Add(tile, reversedir)) return flags | SF_FULL; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
329 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
330 |
/* if it is a presignal EXIT in OUR direction and we haven't found 2 green exits yes, do special check */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
331 |
if (!(flags & SF_GREEN2) && (sig & SIGTYPE_EXIT) && HasSignalOnTrackdir(tile, trackdir)) { // found presignal exit |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
332 |
if (flags & SF_EXIT) flags |= SF_EXIT2; // found two (or more) exits |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
333 |
flags |= SF_EXIT; // found at least one exit - allow for compiler optimizations |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
334 |
if (GetSignalStateByTrackdir(tile, trackdir) == SIGNAL_STATE_GREEN) { // found green presignal exit |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
335 |
if (flags & SF_GREEN) flags |= SF_GREEN2; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
336 |
flags |= SF_GREEN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
337 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
338 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
339 |
continue; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
340 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
341 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
342 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
343 |
for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) { // test all possible exit directions |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
344 |
if (dir != enterdir && tracks & _enterdir_to_trackbits[dir]) { // any track incidating? |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
345 |
TileIndex newtile = tile + TileOffsByDiagDir(dir); // new tile to check |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
346 |
DiagDirection newdir = ReverseDiagDir(dir); // direction we are entering from |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
347 |
if (!MaybeAddToTodoSet(newtile, newdir, tile, dir)) return flags | SF_FULL; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
348 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
349 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
350 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
351 |
continue; // continue the while() loop |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
352 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
353 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
354 |
case MP_STATION: |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
355 |
if (!IsRailwayStation(tile)) continue; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
356 |
if (GetTileOwner(tile) != owner) continue; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
357 |
if (DiagDirToAxis(enterdir) != GetRailStationAxis(tile)) continue; // different axis |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
358 |
if (IsStationTileBlocked(tile)) continue; // 'eye-candy' station tile |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
359 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
360 |
if (!(flags & SF_TRAIN) && VehicleFromPos(tile, NULL, &TrainOnTileEnum)) flags |= SF_TRAIN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
361 |
tile += TileOffsByDiagDir(exitdir); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
362 |
break; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
363 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
364 |
case MP_ROAD: |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
365 |
if (!IsLevelCrossing(tile)) continue; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
366 |
if (GetTileOwner(tile) != owner) continue; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
367 |
if (DiagDirToAxis(enterdir) == GetCrossingRoadAxis(tile)) continue; // different axis |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
368 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
369 |
if (!(flags & SF_TRAIN) && VehicleFromPos(tile, NULL, &TrainOnTileEnum)) flags |= SF_TRAIN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
370 |
tile += TileOffsByDiagDir(exitdir); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
371 |
break; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
372 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
373 |
case MP_TUNNELBRIDGE: { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
374 |
if (GetTileOwner(tile) != owner) continue; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
375 |
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_RAIL) continue; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
376 |
DiagDirection dir = GetTunnelBridgeDirection(tile); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
377 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
378 |
if (enterdir == INVALID_DIAGDIR) { // incoming from the wormhole |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
379 |
if (!(flags & SF_TRAIN) && VehicleFromPos(tile, NULL, &TrainOnTileEnum)) flags |= SF_TRAIN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
380 |
enterdir = dir; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
381 |
exitdir = ReverseDiagDir(dir); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
382 |
tile += TileOffsByDiagDir(exitdir); // just skip to next tile |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
383 |
} else { // NOT incoming from the wormhole! |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
384 |
if (ReverseDiagDir(enterdir) != dir) continue; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
385 |
if (!(flags & SF_TRAIN) && VehicleFromPos(tile, NULL, &TrainOnTileEnum)) flags |= SF_TRAIN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
386 |
tile = GetOtherTunnelBridgeEnd(tile); // just skip to exit tile |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
387 |
enterdir = INVALID_DIAGDIR; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
388 |
exitdir = INVALID_DIAGDIR; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
389 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
390 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
391 |
break; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
392 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
393 |
default: |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
394 |
continue; // continue the while() loop |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
395 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
396 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
397 |
if (!MaybeAddToTodoSet(tile, enterdir, oldtile, exitdir)) return flags | SF_FULL; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
398 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
399 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
400 |
return flags; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
401 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
402 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
403 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
404 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
405 |
* Update signals around segment in _tbuset |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
406 |
* |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
407 |
* @param flags info about segment |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
408 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
409 |
static void UpdateSignalsAroundSegment(SigFlags flags) |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
410 |
{ |
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
411 |
TileIndex tile; |
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
412 |
Trackdir trackdir; |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
413 |
|
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
414 |
while (_tbuset.Get(&tile, &trackdir)) { |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
415 |
assert(HasSignalOnTrackdir(tile, trackdir)); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
416 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
417 |
SignalType sig = GetSignalType(tile, TrackdirToTrack(trackdir)); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
418 |
SignalState newstate = SIGNAL_STATE_GREEN; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
419 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
420 |
/* determine whether the new state is red */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
421 |
if (flags & SF_TRAIN) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
422 |
/* train in the segment */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
423 |
newstate = SIGNAL_STATE_RED; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
424 |
} else { |
8970
da7261f48b7e
(svn r12762) -Fix: tabs after the first non-tab character are generally not okay (or lines starting with a space and then tabs).
rubidium
parents:
8616
diff
changeset
|
425 |
/* is it a bidir combo? - then do not count its other signal direction as exit */ |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
426 |
if (sig == SIGTYPE_COMBO && HasSignalOnTrackdir(tile, ReverseTrackdir(trackdir))) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
427 |
/* at least one more exit */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
428 |
if (flags & SF_EXIT2 && |
8970
da7261f48b7e
(svn r12762) -Fix: tabs after the first non-tab character are generally not okay (or lines starting with a space and then tabs).
rubidium
parents:
8616
diff
changeset
|
429 |
/* no green exit */ |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
430 |
(!(flags & SF_GREEN) || |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
431 |
/* only one green exit, and it is this one - so all other exits are red */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
432 |
(!(flags & SF_GREEN2) && GetSignalStateByTrackdir(tile, ReverseTrackdir(trackdir)) == SIGNAL_STATE_GREEN))) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
433 |
newstate = SIGNAL_STATE_RED; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
434 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
435 |
} else { // entry, at least one exit, no green exit |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
436 |
if (sig & SIGTYPE_ENTRY && (flags & SF_EXIT && !(flags & SF_GREEN))) newstate = SIGNAL_STATE_RED; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
437 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
438 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
439 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
440 |
/* only when the state changes */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
441 |
if (newstate != GetSignalStateByTrackdir(tile, trackdir)) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
442 |
if (sig & SIGTYPE_EXIT) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
443 |
/* for pre-signal exits, add block to the global set */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
444 |
DiagDirection exitdir = TrackdirToExitdir(ReverseTrackdir(trackdir)); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
445 |
_globset.Add(tile, exitdir); // do not check for full global set, first update all signals |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
446 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
447 |
SetSignalStateByTrackdir(tile, trackdir, newstate); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
448 |
MarkTileDirtyByTile(tile); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
449 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
450 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
451 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
452 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
453 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
454 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
455 |
/** Reset all sets after one set overflowed */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
456 |
static inline void ResetSets() |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
457 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
458 |
_tbuset.Reset(); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
459 |
_tbdset.Reset(); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
460 |
_globset.Reset(); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
461 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
462 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
463 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
464 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
465 |
* Updates blocks in _globset buffer |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
466 |
* |
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
467 |
* @param owner player whose signals we are updating |
9323 | 468 |
* @return state of the first block from _globset |
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
469 |
* @pre IsValidPlayer(owner) |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
470 |
*/ |
9222
78f27b94fe76
(svn r13088) -Codechange: use SigSegState enum instead of bool variable (michi_cc)
smatz
parents:
8970
diff
changeset
|
471 |
static SigSegState UpdateSignalsInBuffer(Owner owner) |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
472 |
{ |
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
473 |
assert(IsValidPlayer(owner)); |
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
474 |
|
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
475 |
bool first = true; // first block? |
9222
78f27b94fe76
(svn r13088) -Codechange: use SigSegState enum instead of bool variable (michi_cc)
smatz
parents:
8970
diff
changeset
|
476 |
SigSegState state = SIGSEG_FREE; // value to return |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
477 |
|
8251
886d6a9cefef
(svn r11815) -Codechange (r11802): some compilers were giving a false warning about uninitialized variable
smatz
parents:
8246
diff
changeset
|
478 |
TileIndex tile; |
886d6a9cefef
(svn r11815) -Codechange (r11802): some compilers were giving a false warning about uninitialized variable
smatz
parents:
8246
diff
changeset
|
479 |
DiagDirection dir; |
886d6a9cefef
(svn r11815) -Codechange (r11802): some compilers were giving a false warning about uninitialized variable
smatz
parents:
8246
diff
changeset
|
480 |
|
886d6a9cefef
(svn r11815) -Codechange (r11802): some compilers were giving a false warning about uninitialized variable
smatz
parents:
8246
diff
changeset
|
481 |
while (_globset.Get(&tile, &dir)) { |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
482 |
assert(_tbuset.IsEmpty()); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
483 |
assert(_tbdset.IsEmpty()); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
484 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
485 |
/* After updating signal, data stored are always MP_RAILWAY with signals. |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
486 |
* Other situations happen when data are from outside functions - |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
487 |
* modification of railbits (including both rail building and removal), |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
488 |
* train entering/leaving block, train leaving depot... |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
489 |
*/ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
490 |
switch (GetTileType(tile)) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
491 |
case MP_TUNNELBRIDGE: |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
492 |
/* 'optimization assert' - do not try to update signals when it is not needed */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
493 |
assert(GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
494 |
assert(dir == INVALID_DIAGDIR || dir == ReverseDiagDir(GetTunnelBridgeDirection(tile))); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
495 |
_tbdset.Add(tile, INVALID_DIAGDIR); // we can safely start from wormhole centre |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
496 |
_tbdset.Add(GetOtherTunnelBridgeEnd(tile), INVALID_DIAGDIR); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
497 |
break; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
498 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
499 |
case MP_RAILWAY: |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
500 |
if (IsRailDepot(tile)) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
501 |
/* 'optimization assert' do not try to update signals in other cases */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
502 |
assert(dir == INVALID_DIAGDIR || dir == GetRailDepotDirection(tile)); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
503 |
_tbdset.Add(tile, INVALID_DIAGDIR); // start from depot inside |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
504 |
break; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
505 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
506 |
/* FALLTHROUGH */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
507 |
case MP_STATION: |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
508 |
case MP_ROAD: |
8616
fd862a55c47f
(svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents:
8337
diff
changeset
|
509 |
if ((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) { |
8970
da7261f48b7e
(svn r12762) -Fix: tabs after the first non-tab character are generally not okay (or lines starting with a space and then tabs).
rubidium
parents:
8616
diff
changeset
|
510 |
/* only add to set when there is some 'interesting' track */ |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
511 |
_tbdset.Add(tile, dir); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
512 |
_tbdset.Add(tile + TileOffsByDiagDir(dir), ReverseDiagDir(dir)); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
513 |
break; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
514 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
515 |
/* FALLTHROUGH */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
516 |
default: |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
517 |
/* jump to next tile */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
518 |
tile = tile + TileOffsByDiagDir(dir); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
519 |
dir = ReverseDiagDir(dir); |
8616
fd862a55c47f
(svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents:
8337
diff
changeset
|
520 |
if ((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) { |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
521 |
_tbdset.Add(tile, dir); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
522 |
break; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
523 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
524 |
/* happens when removing a rail that wasn't connected at one or both sides */ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
525 |
continue; // continue the while() loop |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
526 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
527 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
528 |
assert(!_tbdset.Overflowed()); // it really shouldn't overflow by these one or two items |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
529 |
assert(!_tbdset.IsEmpty()); // it wouldn't hurt anyone, but shouldn't happen too |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
530 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
531 |
SigFlags flags = ExploreSegment(owner); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
532 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
533 |
if (first) { |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
534 |
first = false; |
9222
78f27b94fe76
(svn r13088) -Codechange: use SigSegState enum instead of bool variable (michi_cc)
smatz
parents:
8970
diff
changeset
|
535 |
if ((flags & SF_TRAIN) || (flags & SF_EXIT && !(flags & SF_GREEN)) || (flags & SF_FULL)) { |
78f27b94fe76
(svn r13088) -Codechange: use SigSegState enum instead of bool variable (michi_cc)
smatz
parents:
8970
diff
changeset
|
536 |
/* SIGSEG_FREE is set by default */ |
78f27b94fe76
(svn r13088) -Codechange: use SigSegState enum instead of bool variable (michi_cc)
smatz
parents:
8970
diff
changeset
|
537 |
state = SIGSEG_FULL; |
78f27b94fe76
(svn r13088) -Codechange: use SigSegState enum instead of bool variable (michi_cc)
smatz
parents:
8970
diff
changeset
|
538 |
} |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
539 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
540 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
541 |
/* do not do anything when some buffer was full */ |
8246
4469741c1f70
(svn r11810) -Fix (r11802): reset sets when leaving prematurely
smatz
parents:
8238
diff
changeset
|
542 |
if (flags & SF_FULL) { |
4469741c1f70
(svn r11810) -Fix (r11802): reset sets when leaving prematurely
smatz
parents:
8238
diff
changeset
|
543 |
ResetSets(); // free all sets |
4469741c1f70
(svn r11810) -Fix (r11802): reset sets when leaving prematurely
smatz
parents:
8238
diff
changeset
|
544 |
break; |
4469741c1f70
(svn r11810) -Fix (r11802): reset sets when leaving prematurely
smatz
parents:
8238
diff
changeset
|
545 |
} |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
546 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
547 |
UpdateSignalsAroundSegment(flags); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
548 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
549 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
550 |
return state; |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
551 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
552 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
553 |
|
8306
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
554 |
static Owner _last_owner = INVALID_OWNER; ///< last owner whose track was put into _globset |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
555 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
556 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
557 |
/** |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
558 |
* Update signals in buffer |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
559 |
* Called from 'outside' |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
560 |
*/ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
561 |
void UpdateSignalsInBuffer() |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
562 |
{ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
563 |
if (!_globset.IsEmpty()) { |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
564 |
UpdateSignalsInBuffer(_last_owner); |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
565 |
_last_owner = INVALID_OWNER; // invalidate |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
566 |
} |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
567 |
} |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
568 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
569 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
570 |
/** |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
571 |
* Add track to signal update buffer |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
572 |
* |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
573 |
* @param tile tile where we start |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
574 |
* @param track track at which ends we will update signals |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
575 |
* @param owner owner whose signals we will update |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
576 |
*/ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
577 |
void AddTrackToSignalBuffer(TileIndex tile, Track track, Owner owner) |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
578 |
{ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
579 |
static const DiagDirection _search_dir_1[] = { |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
580 |
DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
581 |
}; |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
582 |
static const DiagDirection _search_dir_2[] = { |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
583 |
DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
584 |
}; |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
585 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
586 |
/* do not allow signal updates for two players in one run */ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
587 |
assert(_globset.IsEmpty() || owner == _last_owner); |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
588 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
589 |
_last_owner = owner; |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
590 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
591 |
_globset.Add(tile, _search_dir_1[track]); |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
592 |
_globset.Add(tile, _search_dir_2[track]); |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
593 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
594 |
if (_globset.Items() >= SIG_GLOB_UPDATE) { |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
595 |
/* too many items, force update */ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
596 |
UpdateSignalsInBuffer(_last_owner); |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
597 |
_last_owner = INVALID_OWNER; |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
598 |
} |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
599 |
} |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
600 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
601 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
602 |
/** |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
603 |
* Add side of tile to signal update buffer |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
604 |
* |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
605 |
* @param tile tile where we start |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
606 |
* @param side side of tile |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
607 |
* @param owner owner whose signals we will update |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
608 |
*/ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
609 |
void AddSideToSignalBuffer(TileIndex tile, DiagDirection side, Owner owner) |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
610 |
{ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
611 |
/* do not allow signal updates for two players in one run */ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
612 |
assert(_globset.IsEmpty() || owner == _last_owner); |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
613 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
614 |
_last_owner = owner; |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
615 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
616 |
_globset.Add(tile, side); |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
617 |
|
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
618 |
if (_globset.Items() >= SIG_GLOB_UPDATE) { |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
619 |
/* too many items, force update */ |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
620 |
UpdateSignalsInBuffer(_last_owner); |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
621 |
_last_owner = INVALID_OWNER; |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
622 |
} |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
623 |
} |
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
624 |
|
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
625 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
626 |
* Update signals, starting at one side of a tile |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
627 |
* Will check tile next to this at opposite side too |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
628 |
* |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
629 |
* @see UpdateSignalsInBuffer() |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
630 |
* @param tile tile where we start |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
631 |
* @param side side of tile |
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
632 |
* @param owner owner whose signals we will update |
9323 | 633 |
* @return the state of the signal segment |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
634 |
*/ |
9222
78f27b94fe76
(svn r13088) -Codechange: use SigSegState enum instead of bool variable (michi_cc)
smatz
parents:
8970
diff
changeset
|
635 |
SigSegState UpdateSignalsOnSegment(TileIndex tile, DiagDirection side, Owner owner) |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
636 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
637 |
assert(_globset.IsEmpty()); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
638 |
_globset.Add(tile, side); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
639 |
|
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
640 |
return UpdateSignalsInBuffer(owner); |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
641 |
} |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
642 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
643 |
|
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
644 |
/** |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
645 |
* Update signals at segments that are at both ends of |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
646 |
* given (existent or non-existent) track |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
647 |
* |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
648 |
* @see UpdateSignalsInBuffer() |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
649 |
* @param tile tile where we start |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
650 |
* @param track track at which ends we will update signals |
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
651 |
* @param owner owner whose signals we will update |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
652 |
*/ |
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
653 |
void SetSignalsOnBothDir(TileIndex tile, Track track, Owner owner) |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
654 |
{ |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
655 |
assert(_globset.IsEmpty()); |
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
656 |
|
8306
22e1344c5457
(svn r11871) -Fix [FS#1074]: do not update signals after each tile when building/removing a large block of track/signals/station
smatz
parents:
8300
diff
changeset
|
657 |
AddTrackToSignalBuffer(tile, track, owner); |
8300
dfd530665621
(svn r11864) -Codechange: pass owner whose signals we will update instead of complex detection later
smatz
parents:
8254
diff
changeset
|
658 |
UpdateSignalsInBuffer(owner); |
8238
d47a86c79603
(svn r11802) -Fix [FS#716]: do not crash trains when leaving depot to a very long track
smatz
parents:
diff
changeset
|
659 |
} |