OpenTTD Source  1.11.0-beta2
elrail_data.h
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
13 #ifndef ELRAIL_DATA_H
14 #define ELRAIL_DATA_H
15 
20 enum TLG {
21  XEVEN_YEVEN = 0,
22  XEVEN_YODD = 1,
23  XODD_YEVEN = 2,
24  XODD_YODD = 3,
25  TLG_END
26 };
27 
33 enum TileSource {
34  TS_HOME = 0,
35  TS_NEIGHBOUR = 1,
36 
37  TS_END
38 };
39 
40 static const uint NUM_TRACKS_AT_PCP = 6;
41 
43 static const byte AllowedPPPonPCP[DIAGDIR_END] = {
44  1 << DIR_N | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S | 1 << DIR_W | 1 << DIR_NW,
45  1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
46  1 << DIR_N | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S | 1 << DIR_W | 1 << DIR_NW,
47  1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
48 };
49 
55 static const byte OwnedPPPonPCP[DIAGDIR_END] = {
56  1 << DIR_SE | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
57  1 << DIR_N | 1 << DIR_SW | 1 << DIR_W | 1 << DIR_NW,
58  1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_NW,
59  1 << DIR_NE | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S
60 };
61 
63 static const DiagDirection PCPpositions[TRACK_END][2] = {
64  {DIAGDIR_NE, DIAGDIR_SW}, // X
65  {DIAGDIR_SE, DIAGDIR_NW}, // Y
66  {DIAGDIR_NW, DIAGDIR_NE}, // UPPER
67  {DIAGDIR_SE, DIAGDIR_SW}, // LOWER
68  {DIAGDIR_SW, DIAGDIR_NW}, // LEFT
69  {DIAGDIR_NE, DIAGDIR_SE}, // RIGHT
70 };
71 
72 #define PCP_NOT_ON_TRACK 0xFF
73 
80  { // X
81  1 << DIR_NE | 1 << DIR_SE | 1 << DIR_NW, // NE
82  PCP_NOT_ON_TRACK, // SE
83  1 << DIR_SE | 1 << DIR_SW | 1 << DIR_NW, // SW
84  PCP_NOT_ON_TRACK // NE
85  }, { // Y
86  PCP_NOT_ON_TRACK,
87  1 << DIR_NE | 1 << DIR_SE | 1 << DIR_SW,
88  PCP_NOT_ON_TRACK,
89  1 << DIR_SW | 1 << DIR_NW | 1 << DIR_NE
90  }, { // UPPER
91  1 << DIR_E | 1 << DIR_N | 1 << DIR_S,
92  PCP_NOT_ON_TRACK,
93  PCP_NOT_ON_TRACK,
94  1 << DIR_W | 1 << DIR_N | 1 << DIR_S
95  }, { // LOWER
96  PCP_NOT_ON_TRACK,
97  1 << DIR_E | 1 << DIR_N | 1 << DIR_S,
98  1 << DIR_W | 1 << DIR_N | 1 << DIR_S,
99  PCP_NOT_ON_TRACK
100  }, { // LEFT
101  PCP_NOT_ON_TRACK,
102  PCP_NOT_ON_TRACK,
103  1 << DIR_S | 1 << DIR_E | 1 << DIR_W,
104  1 << DIR_N | 1 << DIR_E | 1 << DIR_W
105  }, { // RIGHT
106  1 << DIR_N | 1 << DIR_E | 1 << DIR_W,
107  1 << DIR_S | 1 << DIR_E | 1 << DIR_W,
108  PCP_NOT_ON_TRACK,
109  PCP_NOT_ON_TRACK
110  }
111 };
112 #undef PCP_NOT_ON_TRACK
113 
114 
115 #define NUM_IGNORE_GROUPS 3
116 #define IGNORE_NONE 0xFF
117 
122 static const byte IgnoredPCP[NUM_IGNORE_GROUPS][TLG_END][DIAGDIR_END] = {
123  { // Ignore group 1, X and Y tracks
124  { // X even, Y even
125  IGNORE_NONE,
126  1 << DIR_NE | 1 << DIR_SW,
127  1 << DIR_NW | 1 << DIR_SE,
128  IGNORE_NONE
129  }, { // X even, Y odd
130  IGNORE_NONE,
131  IGNORE_NONE,
132  1 << DIR_NW | 1 << DIR_SE,
133  1 << DIR_NE | 1 << DIR_SW
134  }, { // X odd, Y even
135  1 << DIR_NW | 1 << DIR_SE,
136  1 << DIR_NE | 1 << DIR_SW,
137  IGNORE_NONE,
138  IGNORE_NONE
139  }, { // X odd, Y odd
140  1 << DIR_NW | 1 << DIR_SE,
141  IGNORE_NONE,
142  IGNORE_NONE,
143  1 << DIR_NE | 1 << DIR_SW
144  }
145  },
146  { // Ignore group 2, LEFT and RIGHT tracks
147  {
148  1 << DIR_E | 1 << DIR_W,
149  IGNORE_NONE,
150  IGNORE_NONE,
151  1 << DIR_E | 1 << DIR_W
152  }, {
153  IGNORE_NONE,
154  1 << DIR_E | 1 << DIR_W,
155  1 << DIR_E | 1 << DIR_W,
156  IGNORE_NONE
157  }, {
158  IGNORE_NONE,
159  1 << DIR_E | 1 << DIR_W,
160  1 << DIR_E | 1 << DIR_W,
161  IGNORE_NONE
162  }, {
163  1 << DIR_E | 1 << DIR_W,
164  IGNORE_NONE,
165  IGNORE_NONE,
166  1 << DIR_E | 1 << DIR_W
167  }
168  },
169  { // Ignore group 3, UPPER and LOWER tracks
170  {
171  1 << DIR_N | 1 << DIR_S,
172  1 << DIR_N | 1 << DIR_S,
173  IGNORE_NONE,
174  IGNORE_NONE
175  }, {
176  IGNORE_NONE,
177  IGNORE_NONE,
178  1 << DIR_N | 1 << DIR_S,
179  1 << DIR_N | 1 << DIR_S
180  }, {
181  IGNORE_NONE,
182  IGNORE_NONE,
183  1 << DIR_N | 1 << DIR_S ,
184  1 << DIR_N | 1 << DIR_S
185  }, {
186  1 << DIR_N | 1 << DIR_S,
187  1 << DIR_N | 1 << DIR_S,
188  IGNORE_NONE,
189  IGNORE_NONE
190  }
191  }
192 };
193 
194 #undef NO_IGNORE
195 
198  {1 << DIR_SW | 1 << DIR_NE, 0, 1 << DIR_SW | 1 << DIR_NE, 0 }, // X
199  {0, 1 << DIR_NW | 1 << DIR_SE, 0, 1 << DIR_NW | 1 << DIR_SE}, // Y
200  {1 << DIR_W | 1 << DIR_E, 0, 0, 1 << DIR_W | 1 << DIR_E }, // UPPER
201  {0, 1 << DIR_W | 1 << DIR_E, 1 << DIR_W | 1 << DIR_E, 0 }, // LOWER
202  {0, 0, 1 << DIR_S | 1 << DIR_N, 1 << DIR_N | 1 << DIR_S }, // LEFT
203  {1 << DIR_S | 1 << DIR_N, 1 << DIR_S | 1 << DIR_N, 0, 0, }, // RIGHT
204 };
205 
206 /* This array stores which track bits can meet at a tile edge */
207 static const Track TracksAtPCP[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
212 };
213 
214 /* takes each of the 6 track bits from the array above and
215  * assigns it to the home tile or neighbour tile */
216 static const TileSource TrackSourceTile[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
217  {TS_HOME, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME },
218  {TS_HOME, TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_HOME },
219  {TS_HOME, TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME , TS_HOME , TS_NEIGHBOUR},
220  {TS_HOME, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR},
221 };
222 
223 /* Several PPPs maybe exist, here they are sorted in order of preference. */
224 static const Direction PPPorder[DIAGDIR_END][TLG_END][DIR_END] = { // X - Y
225  { // PCP 0
226  {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_N, DIR_E, DIR_S, DIR_W}, // evn - evn
227  {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_S, DIR_W, DIR_N, DIR_E}, // evn - odd
228  {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_S, DIR_W, DIR_N, DIR_E}, // odd - evn
229  {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_N, DIR_E, DIR_S, DIR_W}, // odd - odd
230  }, {// PCP 1
231  {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_S, DIR_E, DIR_N, DIR_W}, // evn - evn
232  {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_N, DIR_W, DIR_S, DIR_E}, // evn - odd
233  {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_N, DIR_W, DIR_S, DIR_E}, // odd - evn
234  {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_S, DIR_E, DIR_N, DIR_W}, // odd - odd
235  }, {// PCP 2
236  {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_S, DIR_W, DIR_N, DIR_E}, // evn - evn
237  {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_N, DIR_E, DIR_S, DIR_W}, // evn - odd
238  {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_N, DIR_E, DIR_S, DIR_W}, // odd - evn
239  {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_S, DIR_W, DIR_N, DIR_E}, // odd - odd
240  }, {// PCP 3
241  {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_N, DIR_W, DIR_S, DIR_E}, // evn - evn
242  {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_S, DIR_E, DIR_N, DIR_W}, // evn - odd
243  {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_S, DIR_E, DIR_N, DIR_W}, // odd - evn
244  {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_N, DIR_W, DIR_S, DIR_E}, // odd - odd
245  }
246 };
247 /* Geometric placement of the PCP relative to the tile origin */
248 static const int8 x_pcp_offsets[DIAGDIR_END] = {0, 8, 16, 8};
249 static const int8 y_pcp_offsets[DIAGDIR_END] = {8, 16, 8, 0};
250 /* Geometric placement of the PPP relative to the PCP*/
251 static const int8 x_ppp_offsets[DIR_END] = {-2, -4, -2, 0, 2, 4, 2, 0};
252 static const int8 y_ppp_offsets[DIR_END] = {-2, 0, 2, 4, 2, 0, -2, -4};
253 
258  PSO_Y_NE,
259  PSO_Y_SW,
260  PSO_X_NW,
261  PSO_X_SE,
262  PSO_EW_N,
263  PSO_EW_S,
264  PSO_NS_W,
265  PSO_NS_E,
266 };
267 
268 /* The type of pylon to draw at each PPP */
269 static const uint8 pylon_sprites[] = {
270  PSO_EW_N,
271  PSO_Y_NE,
272  PSO_NS_E,
273  PSO_X_SE,
274  PSO_EW_S,
275  PSO_Y_SW,
276  PSO_NS_W,
277  PSO_X_NW,
278 };
279 
284  WSO_X_SHORT,
285  WSO_Y_SHORT,
286  WSO_EW_SHORT,
287  WSO_NS_SHORT,
288  WSO_X_SHORT_DOWN,
289  WSO_Y_SHORT_UP,
290  WSO_X_SHORT_UP,
291  WSO_Y_SHORT_DOWN,
292 
293  WSO_X_SW,
294  WSO_Y_SE,
295  WSO_EW_E,
296  WSO_NS_S,
297  WSO_X_SW_DOWN,
298  WSO_Y_SE_UP,
299  WSO_X_SW_UP,
300  WSO_Y_SE_DOWN,
301 
302  WSO_X_NE,
303  WSO_Y_NW,
304  WSO_EW_W,
305  WSO_NS_N,
306  WSO_X_NE_DOWN,
307  WSO_Y_NW_UP,
308  WSO_X_NE_UP,
309  WSO_Y_NW_DOWN,
310 
311  WSO_ENTRANCE_SW,
312  WSO_ENTRANCE_NW,
313  WSO_ENTRANCE_NE,
314  WSO_ENTRANCE_SE,
315 };
316 
318  uint8 image_offset;
319  int8 x_offset;
320  int8 y_offset;
321  int8 x_size;
322  int8 y_size;
323  int8 z_size;
324  int8 z_offset;
325 };
326 
328 static const uint ELRAIL_ELEVATION = 10;
331 
332 static const SortableSpriteStruct RailCatenarySpriteData[] = {
333 /* X direction
334  * Flat tiles:
335  * Wires */
336  { WSO_X_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
337  { WSO_X_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
338  { WSO_X_SHORT, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
339 
340  /* "up" tiles
341  * Wires */
342  { WSO_X_SW_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE },
343  { WSO_X_NE_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE },
344  { WSO_X_SHORT_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE },
345 
346  /* "down" tiles
347  * Wires */
348  { WSO_X_SW_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION },
349  { WSO_X_NE_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION },
350  { WSO_X_SHORT_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION },
351 
352 
353 /* Y direction
354  * Flat tiles:
355  * Wires */
356  { WSO_Y_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
357  { WSO_Y_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
358  { WSO_Y_SHORT, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
359 
360  /* "up" tiles
361  * Wires */
362  { WSO_Y_SE_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE },
363  { WSO_Y_NW_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE },
364  { WSO_Y_SHORT_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE },
365 
366  /* "down" tiles
367  * Wires */
368  { WSO_Y_SE_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION },
369  { WSO_Y_NW_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION },
370  { WSO_Y_SHORT_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION },
371 
372 /* NS Direction */
373  { WSO_NS_SHORT, 8, 0, 8, 8, 1, ELRAIL_ELEVATION },
374  { WSO_NS_SHORT, 0, 8, 8, 8, 1, ELRAIL_ELEVATION },
375 
376  { WSO_NS_N, 8, 0, 8, 8, 1, ELRAIL_ELEVATION },
377  { WSO_NS_N, 0, 8, 8, 8, 1, ELRAIL_ELEVATION },
378 
379  { WSO_NS_S, 8, 0, 8, 8, 1, ELRAIL_ELEVATION },
380  { WSO_NS_S, 0, 8, 8, 8, 1, ELRAIL_ELEVATION },
381 
382 /* EW Direction */
383  { WSO_EW_SHORT, 7, 0, 1, 1, 1, ELRAIL_ELEVATION },
384  { WSO_EW_SHORT, 15, 8, 3, 3, 1, ELRAIL_ELEVATION },
385 
386  { WSO_EW_W, 7, 0, 1, 1, 1, ELRAIL_ELEVATION },
387  { WSO_EW_W, 15, 8, 3, 3, 1, ELRAIL_ELEVATION },
388 
389  { WSO_EW_E, 7, 0, 1, 1, 1, ELRAIL_ELEVATION },
390  { WSO_EW_E, 15, 8, 3, 3, 1, ELRAIL_ELEVATION }
391 };
392 
393 static const SortableSpriteStruct RailCatenarySpriteData_Depot[] = {
394  { WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
395  { WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
396  { WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
397  { WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }
398 };
399 
400 static const SortableSpriteStruct RailCatenarySpriteData_Tunnel[] = {
401  { WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
402  { WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
403  { WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
404  { WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }
405 };
406 
407 
421  WIRE_X_FLAT_SW,
422  WIRE_X_FLAT_NE,
423  WIRE_X_FLAT_BOTH,
424 
425  WIRE_X_UP_SW,
426  WIRE_X_UP_NE,
427  WIRE_X_UP_BOTH,
428 
429  WIRE_X_DOWN_SW,
430  WIRE_X_DOWN_NE,
431  WIRE_X_DOWN_BOTH,
432 
433  WIRE_Y_FLAT_SE,
434  WIRE_Y_FLAT_NW,
435  WIRE_Y_FLAT_BOTH,
436 
437  WIRE_Y_UP_SE,
438  WIRE_Y_UP_NW,
439  WIRE_Y_UP_BOTH,
440 
441  WIRE_Y_DOWN_SE,
442  WIRE_Y_DOWN_NW,
443  WIRE_Y_DOWN_BOTH,
444 
445  WIRE_NS_W_BOTH,
446  WIRE_NS_E_BOTH,
447 
448  WIRE_NS_W_N,
449  WIRE_NS_E_N,
450 
451  WIRE_NS_W_S,
452  WIRE_NS_E_S,
453 
454  WIRE_EW_N_BOTH,
455  WIRE_EW_S_BOTH,
456 
457  WIRE_EW_N_W,
458  WIRE_EW_S_W,
459 
460  WIRE_EW_N_E,
461  WIRE_EW_S_E,
462 
463  INVALID_CATENARY = 0xFF
464 };
465 
466 /* Selects a Wire (with white and grey ends) depending on whether:
467  * a) none (should never happen)
468  * b) the first
469  * c) the second
470  * d) both
471  * PCP exists.*/
472 static const RailCatenarySprite Wires[5][TRACK_END][4] = {
473  { // Tileh == 0
474  {INVALID_CATENARY, WIRE_X_FLAT_NE, WIRE_X_FLAT_SW, WIRE_X_FLAT_BOTH},
475  {INVALID_CATENARY, WIRE_Y_FLAT_SE, WIRE_Y_FLAT_NW, WIRE_Y_FLAT_BOTH},
476  {INVALID_CATENARY, WIRE_EW_N_W, WIRE_EW_N_E, WIRE_EW_N_BOTH},
477  {INVALID_CATENARY, WIRE_EW_S_E, WIRE_EW_S_W, WIRE_EW_S_BOTH},
478  {INVALID_CATENARY, WIRE_NS_W_S, WIRE_NS_W_N, WIRE_NS_W_BOTH},
479  {INVALID_CATENARY, WIRE_NS_E_N, WIRE_NS_E_S, WIRE_NS_E_BOTH},
480  }, { // Tileh == 3
481  {INVALID_CATENARY, WIRE_X_UP_NE, WIRE_X_UP_SW, WIRE_X_UP_BOTH},
482  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
483  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
484  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
485  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
486  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
487  }, { // Tileh == 6
488  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
489  {INVALID_CATENARY, WIRE_Y_UP_SE, WIRE_Y_UP_NW, WIRE_Y_UP_BOTH},
490  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
491  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
492  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
493  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
494  }, { // Tileh == 9
495  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
496  {INVALID_CATENARY, WIRE_Y_DOWN_SE, WIRE_Y_DOWN_NW, WIRE_Y_DOWN_BOTH},
497  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
498  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
499  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
500  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
501  }, { // Tileh == 12
502  {INVALID_CATENARY, WIRE_X_DOWN_NE, WIRE_X_DOWN_SW, WIRE_X_DOWN_BOTH},
503  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
504  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
505  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
506  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
507  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
508  }
509 };
510 
511 #endif /* ELRAIL_DATA_H */
DIAGDIR_SE
@ DIAGDIR_SE
Southeast.
Definition: direction_type.h:80
DIR_SW
@ DIR_SW
Southwest.
Definition: direction_type.h:31
Direction
Direction
Defines the 8 directions on the map.
Definition: direction_type.h:24
DIR_SE
@ DIR_SE
Southeast.
Definition: direction_type.h:29
DIR_NW
@ DIR_NW
Northwest.
Definition: direction_type.h:33
TRACK_LOWER
@ TRACK_LOWER
Track in the lower corner of the tile (south)
Definition: track_type.h:24
DIAGDIR_END
@ DIAGDIR_END
Used for iterations.
Definition: direction_type.h:83
WireSpriteOffset
WireSpriteOffset
Offset for wire sprites from the base wire sprite.
Definition: elrail_data.h:283
TRACK_X
@ TRACK_X
Track along the x-axis (north-east to south-west)
Definition: track_type.h:21
RailCatenarySprite
RailCatenarySprite
Refers to a certain element of the catenary.
Definition: elrail_data.h:420
DIAGDIR_NW
@ DIAGDIR_NW
Northwest.
Definition: direction_type.h:82
DIR_W
@ DIR_W
West.
Definition: direction_type.h:32
DIR_N
@ DIR_N
North.
Definition: direction_type.h:26
TRACK_RIGHT
@ TRACK_RIGHT
Track in the right corner of the tile (east)
Definition: track_type.h:26
DIAGDIR_SW
@ DIAGDIR_SW
Southwest.
Definition: direction_type.h:81
TRACK_Y
@ TRACK_Y
Track along the y-axis (north-west to south-east)
Definition: track_type.h:22
DIR_E
@ DIR_E
East.
Definition: direction_type.h:28
TileSource
TileSource
When determining the pylon configuration on the edge, two tiles are taken into account: the tile bein...
Definition: elrail_data.h:33
TRACK_UPPER
@ TRACK_UPPER
Track in the upper corner of the tile (north)
Definition: track_type.h:23
DIR_NE
@ DIR_NE
Northeast.
Definition: direction_type.h:27
ELRAIL_ELEVATION
static const uint ELRAIL_ELEVATION
Distance between wire and rail.
Definition: elrail_data.h:328
DIR_S
@ DIR_S
South.
Definition: direction_type.h:30
TRACK_LEFT
@ TRACK_LEFT
Track in the left corner of the tile (west)
Definition: track_type.h:25
DiagDirection
DiagDirection
Enumeration for diagonal directions.
Definition: direction_type.h:77
ELRAIL_ELEVRAISE
static const uint ELRAIL_ELEVRAISE
Wires that a draw one level higher than the north corner.
Definition: elrail_data.h:330
TRACK_END
@ TRACK_END
Used for iterations.
Definition: track_type.h:27
DIR_END
@ DIR_END
Used to iterate.
Definition: direction_type.h:34
PreferredPPPofTrackAtPCP
static const byte PreferredPPPofTrackAtPCP[TRACK_END][DIAGDIR_END]
Preferred points of each trackbit.
Definition: elrail_data.h:79
AllowedPPPonPCP
static const byte AllowedPPPonPCP[DIAGDIR_END]
Which PPPs are possible at all on a given PCP.
Definition: elrail_data.h:43
TILE_HEIGHT
static const uint TILE_HEIGHT
Height of a height level in world coordinate AND in pixels in #ZOOM_LVL_BASE.
Definition: tile_type.h:16
TLG
TLG
Tile Location group.
Definition: elrail_data.h:20
DisallowedPPPofTrackAtPCP
static const byte DisallowedPPPofTrackAtPCP[TRACK_END][DIAGDIR_END]
Which pylons can definitely NOT be built.
Definition: elrail_data.h:197
IgnoredPCP
static const byte IgnoredPCP[NUM_IGNORE_GROUPS][TLG_END][DIAGDIR_END]
In case we have a straight line, we place pylon only every two tiles, so there are certain tiles whic...
Definition: elrail_data.h:122
PCPpositions
static const DiagDirection PCPpositions[TRACK_END][2]
Maps a track bit onto two PCP positions.
Definition: elrail_data.h:63
Track
Track
These are used to specify a single track.
Definition: track_type.h:19
PylonSpriteOffset
PylonSpriteOffset
Offset for pylon sprites from the base pylon sprite.
Definition: elrail_data.h:257
DIAGDIR_NE
@ DIAGDIR_NE
Northeast, upper right on your monitor.
Definition: direction_type.h:79
OwnedPPPonPCP
static const byte OwnedPPPonPCP[DIAGDIR_END]
Which of the PPPs are inside the tile.
Definition: elrail_data.h:55
SortableSpriteStruct
Definition: elrail_data.h:317