OpenTTD
elrail_data.h
Go to the documentation of this file.
1 /* $Id: elrail_data.h 24900 2013-01-08 22:46:42Z planetmaker $ */
2 
3 /*
4  * This file is part of OpenTTD.
5  * 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.
6  * 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.
7  * 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/>.
8  */
9 
15 #ifndef ELRAIL_DATA_H
16 #define ELRAIL_DATA_H
17 
22 enum TLG {
23  XEVEN_YEVEN = 0,
24  XEVEN_YODD = 1,
25  XODD_YEVEN = 2,
26  XODD_YODD = 3,
27  TLG_END
28 };
29 
35 enum TileSource {
36  TS_HOME = 0,
37  TS_NEIGHBOUR = 1,
38 
39  TS_END
40 };
41 
42 static const uint NUM_TRACKS_AT_PCP = 6;
43 
45 static const byte AllowedPPPonPCP[DIAGDIR_END] = {
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  1 << DIR_N | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S | 1 << DIR_W | 1 << DIR_NW,
49  1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
50 };
51 
57 static const byte OwnedPPPonPCP[DIAGDIR_END] = {
58  1 << DIR_SE | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
59  1 << DIR_N | 1 << DIR_SW | 1 << DIR_W | 1 << DIR_NW,
60  1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_NW,
61  1 << DIR_NE | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S
62 };
63 
65 static const DiagDirection PCPpositions[TRACK_END][2] = {
66  {DIAGDIR_NE, DIAGDIR_SW}, // X
67  {DIAGDIR_SE, DIAGDIR_NW}, // Y
68  {DIAGDIR_NW, DIAGDIR_NE}, // UPPER
69  {DIAGDIR_SE, DIAGDIR_SW}, // LOWER
70  {DIAGDIR_SW, DIAGDIR_NW}, // LEFT
71  {DIAGDIR_NE, DIAGDIR_SE}, // RIGHT
72 };
73 
74 #define PCP_NOT_ON_TRACK 0xFF
75 
82  { // X
83  1 << DIR_NE | 1 << DIR_SE | 1 << DIR_NW, // NE
84  PCP_NOT_ON_TRACK, // SE
85  1 << DIR_SE | 1 << DIR_SW | 1 << DIR_NW, // SW
86  PCP_NOT_ON_TRACK // NE
87  }, { // Y
88  PCP_NOT_ON_TRACK,
89  1 << DIR_NE | 1 << DIR_SE | 1 << DIR_SW,
90  PCP_NOT_ON_TRACK,
91  1 << DIR_SW | 1 << DIR_NW | 1 << DIR_NE
92  }, { // UPPER
93  1 << DIR_E | 1 << DIR_N | 1 << DIR_S,
94  PCP_NOT_ON_TRACK,
95  PCP_NOT_ON_TRACK,
96  1 << DIR_W | 1 << DIR_N | 1 << DIR_S
97  }, { // LOWER
98  PCP_NOT_ON_TRACK,
99  1 << DIR_E | 1 << DIR_N | 1 << DIR_S,
100  1 << DIR_W | 1 << DIR_N | 1 << DIR_S,
101  PCP_NOT_ON_TRACK
102  }, { // LEFT
103  PCP_NOT_ON_TRACK,
104  PCP_NOT_ON_TRACK,
105  1 << DIR_S | 1 << DIR_E | 1 << DIR_W,
106  1 << DIR_N | 1 << DIR_E | 1 << DIR_W
107  }, { // RIGHT
108  1 << DIR_N | 1 << DIR_E | 1 << DIR_W,
109  1 << DIR_S | 1 << DIR_E | 1 << DIR_W,
110  PCP_NOT_ON_TRACK,
111  PCP_NOT_ON_TRACK
112  }
113 };
114 #undef PCP_NOT_ON_TRACK
115 
116 
117 #define NUM_IGNORE_GROUPS 3
118 #define IGNORE_NONE 0xFF
119 
124 static const byte IgnoredPCP[NUM_IGNORE_GROUPS][TLG_END][DIAGDIR_END] = {
125  { // Ignore group 1, X and Y tracks
126  { // X even, Y even
127  IGNORE_NONE,
128  1 << DIR_NE | 1 << DIR_SW,
129  1 << DIR_NW | 1 << DIR_SE,
130  IGNORE_NONE
131  }, { // X even, Y odd
132  IGNORE_NONE,
133  IGNORE_NONE,
134  1 << DIR_NW | 1 << DIR_SE,
135  1 << DIR_NE | 1 << DIR_SW
136  }, { // X odd, Y even
137  1 << DIR_NW | 1 << DIR_SE,
138  1 << DIR_NE | 1 << DIR_SW,
139  IGNORE_NONE,
140  IGNORE_NONE
141  }, { // X odd, Y odd
142  1 << DIR_NW | 1 << DIR_SE,
143  IGNORE_NONE,
144  IGNORE_NONE,
145  1 << DIR_NE | 1 << DIR_SW
146  }
147  },
148  { // Ignore group 2, LEFT and RIGHT tracks
149  {
150  1 << DIR_E | 1 << DIR_W,
151  IGNORE_NONE,
152  IGNORE_NONE,
153  1 << DIR_E | 1 << DIR_W
154  }, {
155  IGNORE_NONE,
156  1 << DIR_E | 1 << DIR_W,
157  1 << DIR_E | 1 << DIR_W,
158  IGNORE_NONE
159  }, {
160  IGNORE_NONE,
161  1 << DIR_E | 1 << DIR_W,
162  1 << DIR_E | 1 << DIR_W,
163  IGNORE_NONE
164  }, {
165  1 << DIR_E | 1 << DIR_W,
166  IGNORE_NONE,
167  IGNORE_NONE,
168  1 << DIR_E | 1 << DIR_W
169  }
170  },
171  { // Ignore group 3, UPPER and LOWER tracks
172  {
173  1 << DIR_N | 1 << DIR_S,
174  1 << DIR_N | 1 << DIR_S,
175  IGNORE_NONE,
176  IGNORE_NONE
177  }, {
178  IGNORE_NONE,
179  IGNORE_NONE,
180  1 << DIR_N | 1 << DIR_S,
181  1 << DIR_N | 1 << DIR_S
182  }, {
183  IGNORE_NONE,
184  IGNORE_NONE,
185  1 << DIR_N | 1 << DIR_S ,
186  1 << DIR_N | 1 << DIR_S
187  }, {
188  1 << DIR_N | 1 << DIR_S,
189  1 << DIR_N | 1 << DIR_S,
190  IGNORE_NONE,
191  IGNORE_NONE
192  }
193  }
194 };
195 
196 #undef NO_IGNORE
197 
200  {1 << DIR_SW | 1 << DIR_NE, 0, 1 << DIR_SW | 1 << DIR_NE, 0 }, // X
201  {0, 1 << DIR_NW | 1 << DIR_SE, 0, 1 << DIR_NW | 1 << DIR_SE}, // Y
202  {1 << DIR_W | 1 << DIR_E, 0, 0, 1 << DIR_W | 1 << DIR_E }, // UPPER
203  {0, 1 << DIR_W | 1 << DIR_E, 1 << DIR_W | 1 << DIR_E, 0 }, // LOWER
204  {0, 0, 1 << DIR_S | 1 << DIR_N, 1 << DIR_N | 1 << DIR_S }, // LEFT
205  {1 << DIR_S | 1 << DIR_N, 1 << DIR_S | 1 << DIR_N, 0, 0, }, // RIGHT
206 };
207 
208 /* This array stores which track bits can meet at a tile edge */
209 static const Track TracksAtPCP[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
214 };
215 
216 /* takes each of the 6 track bits from the array above and
217  * assigns it to the home tile or neighbour tile */
218 static const TileSource TrackSourceTile[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
219  {TS_HOME, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME },
220  {TS_HOME, TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_HOME },
221  {TS_HOME, TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME , TS_HOME , TS_NEIGHBOUR},
222  {TS_HOME, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR},
223 };
224 
225 /* Several PPPs maybe exist, here they are sorted in order of preference. */
226 static const Direction PPPorder[DIAGDIR_END][TLG_END][DIR_END] = { // X - Y
227  { // PCP 0
228  {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_N, DIR_E, DIR_S, DIR_W}, // evn - evn
229  {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_S, DIR_W, DIR_N, DIR_E}, // evn - odd
230  {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_S, DIR_W, DIR_N, DIR_E}, // odd - evn
231  {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_N, DIR_E, DIR_S, DIR_W}, // odd - odd
232  }, {// PCP 1
233  {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_S, DIR_E, DIR_N, DIR_W}, // evn - evn
234  {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_N, DIR_W, DIR_S, DIR_E}, // evn - odd
235  {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_N, DIR_W, DIR_S, DIR_E}, // odd - evn
236  {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_S, DIR_E, DIR_N, DIR_W}, // odd - odd
237  }, {// PCP 2
238  {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_S, DIR_W, DIR_N, DIR_E}, // evn - evn
239  {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_N, DIR_E, DIR_S, DIR_W}, // evn - odd
240  {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_N, DIR_E, DIR_S, DIR_W}, // odd - evn
241  {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_S, DIR_W, DIR_N, DIR_E}, // odd - odd
242  }, {// PCP 3
243  {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_N, DIR_W, DIR_S, DIR_E}, // evn - evn
244  {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_S, DIR_E, DIR_N, DIR_W}, // evn - odd
245  {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_S, DIR_E, DIR_N, DIR_W}, // odd - evn
246  {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_N, DIR_W, DIR_S, DIR_E}, // odd - odd
247  }
248 };
249 /* Geometric placement of the PCP relative to the tile origin */
250 static const int8 x_pcp_offsets[DIAGDIR_END] = {0, 8, 16, 8};
251 static const int8 y_pcp_offsets[DIAGDIR_END] = {8, 16, 8, 0};
252 /* Geometric placement of the PPP relative to the PCP*/
253 static const int8 x_ppp_offsets[DIR_END] = {-2, -4, -2, 0, 2, 4, 2, 0};
254 static const int8 y_ppp_offsets[DIR_END] = {-2, 0, 2, 4, 2, 0, -2, -4};
255 
260  PSO_Y_NE,
261  PSO_Y_SW,
262  PSO_X_NW,
263  PSO_X_SE,
264  PSO_EW_N,
265  PSO_EW_S,
266  PSO_NS_W,
267  PSO_NS_E,
268 };
269 
270 /* The type of pylon to draw at each PPP */
271 static const uint8 pylon_sprites[] = {
272  PSO_EW_N,
273  PSO_Y_NE,
274  PSO_NS_E,
275  PSO_X_SE,
276  PSO_EW_S,
277  PSO_Y_SW,
278  PSO_NS_W,
279  PSO_X_NW,
280 };
281 
286  WSO_X_SHORT,
287  WSO_Y_SHORT,
288  WSO_EW_SHORT,
289  WSO_NS_SHORT,
290  WSO_X_SHORT_DOWN,
291  WSO_Y_SHORT_UP,
292  WSO_X_SHORT_UP,
293  WSO_Y_SHORT_DOWN,
294 
295  WSO_X_SW,
296  WSO_Y_SE,
297  WSO_EW_E,
298  WSO_NS_S,
299  WSO_X_SW_DOWN,
300  WSO_Y_SE_UP,
301  WSO_X_SW_UP,
302  WSO_Y_SE_DOWN,
303 
304  WSO_X_NE,
305  WSO_Y_NW,
306  WSO_EW_W,
307  WSO_NS_N,
308  WSO_X_NE_DOWN,
309  WSO_Y_NW_UP,
310  WSO_X_NE_UP,
311  WSO_Y_NW_DOWN,
312 
313  WSO_ENTRANCE_NE,
314  WSO_ENTRANCE_SE,
315  WSO_ENTRANCE_SW,
316  WSO_ENTRANCE_NW,
317 };
318 
320  uint8 image_offset;
321  int8 x_offset;
322  int8 y_offset;
323  int8 x_size;
324  int8 y_size;
325  int8 z_size;
326  int8 z_offset;
327 };
328 
330 static const uint ELRAIL_ELEVATION = 10;
333 
334 static const SortableSpriteStruct CatenarySpriteData[] = {
335 /* X direction
336  * Flat tiles:
337  * Wires */
338  { WSO_X_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
339  { WSO_X_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
340  { WSO_X_SHORT, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
341 
342  /* "up" tiles
343  * Wires */
344  { WSO_X_SW_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE },
345  { WSO_X_NE_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE },
346  { WSO_X_SHORT_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE },
347 
348  /* "down" tiles
349  * Wires */
350  { WSO_X_SW_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION },
351  { WSO_X_NE_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION },
352  { WSO_X_SHORT_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION },
353 
354 
355 /* Y direction
356  * Flat tiles:
357  * Wires */
358  { WSO_Y_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
359  { WSO_Y_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
360  { WSO_Y_SHORT, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
361 
362  /* "up" tiles
363  * Wires */
364  { WSO_Y_SE_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE },
365  { WSO_Y_NW_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE },
366  { WSO_Y_SHORT_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE },
367 
368  /* "down" tiles
369  * Wires */
370  { WSO_Y_SE_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION },
371  { WSO_Y_NW_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION },
372  { WSO_Y_SHORT_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION },
373 
374 /* NS Direction */
375  { WSO_NS_SHORT, 8, 0, 8, 8, 1, ELRAIL_ELEVATION },
376  { WSO_NS_SHORT, 0, 8, 8, 8, 1, ELRAIL_ELEVATION },
377 
378  { WSO_NS_N, 8, 0, 8, 8, 1, ELRAIL_ELEVATION },
379  { WSO_NS_N, 0, 8, 8, 8, 1, ELRAIL_ELEVATION },
380 
381  { WSO_NS_S, 8, 0, 8, 8, 1, ELRAIL_ELEVATION },
382  { WSO_NS_S, 0, 8, 8, 8, 1, ELRAIL_ELEVATION },
383 
384 /* EW Direction */
385  { WSO_EW_SHORT, 7, 0, 1, 1, 1, ELRAIL_ELEVATION },
386  { WSO_EW_SHORT, 15, 8, 3, 3, 1, ELRAIL_ELEVATION },
387 
388  { WSO_EW_W, 7, 0, 1, 1, 1, ELRAIL_ELEVATION },
389  { WSO_EW_W, 15, 8, 3, 3, 1, ELRAIL_ELEVATION },
390 
391  { WSO_EW_E, 7, 0, 1, 1, 1, ELRAIL_ELEVATION },
392  { WSO_EW_E, 15, 8, 3, 3, 1, ELRAIL_ELEVATION }
393 };
394 
395 static const SortableSpriteStruct CatenarySpriteData_Depot[] = {
396  { WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
397  { WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
398  { WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
399  { WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }
400 };
401 
402 static const SortableSpriteStruct CatenarySpriteData_Tunnel[] = {
403  { WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
404  { WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
405  { WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
406  { WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }
407 };
408 
409 
423  WIRE_X_FLAT_SW,
424  WIRE_X_FLAT_NE,
425  WIRE_X_FLAT_BOTH,
426 
427  WIRE_X_UP_SW,
428  WIRE_X_UP_NE,
429  WIRE_X_UP_BOTH,
430 
431  WIRE_X_DOWN_SW,
432  WIRE_X_DOWN_NE,
433  WIRE_X_DOWN_BOTH,
434 
435  WIRE_Y_FLAT_SE,
436  WIRE_Y_FLAT_NW,
437  WIRE_Y_FLAT_BOTH,
438 
439  WIRE_Y_UP_SE,
440  WIRE_Y_UP_NW,
441  WIRE_Y_UP_BOTH,
442 
443  WIRE_Y_DOWN_SE,
444  WIRE_Y_DOWN_NW,
445  WIRE_Y_DOWN_BOTH,
446 
447  WIRE_NS_W_BOTH,
448  WIRE_NS_E_BOTH,
449 
450  WIRE_NS_W_N,
451  WIRE_NS_E_N,
452 
453  WIRE_NS_W_S,
454  WIRE_NS_E_S,
455 
456  WIRE_EW_N_BOTH,
457  WIRE_EW_S_BOTH,
458 
459  WIRE_EW_N_W,
460  WIRE_EW_S_W,
461 
462  WIRE_EW_N_E,
463  WIRE_EW_S_E,
464 
465  INVALID_CATENARY = 0xFF
466 };
467 
468 /* Selects a Wire (with white and grey ends) depending on whether:
469  * a) none (should never happen)
470  * b) the first
471  * c) the second
472  * d) both
473  * PCP exists.*/
474 static const CatenarySprite Wires[5][TRACK_END][4] = {
475  { // Tileh == 0
476  {INVALID_CATENARY, WIRE_X_FLAT_NE, WIRE_X_FLAT_SW, WIRE_X_FLAT_BOTH},
477  {INVALID_CATENARY, WIRE_Y_FLAT_SE, WIRE_Y_FLAT_NW, WIRE_Y_FLAT_BOTH},
478  {INVALID_CATENARY, WIRE_EW_N_W, WIRE_EW_N_E, WIRE_EW_N_BOTH},
479  {INVALID_CATENARY, WIRE_EW_S_E, WIRE_EW_S_W, WIRE_EW_S_BOTH},
480  {INVALID_CATENARY, WIRE_NS_W_S, WIRE_NS_W_N, WIRE_NS_W_BOTH},
481  {INVALID_CATENARY, WIRE_NS_E_N, WIRE_NS_E_S, WIRE_NS_E_BOTH},
482  }, { // Tileh == 3
483  {INVALID_CATENARY, WIRE_X_UP_NE, WIRE_X_UP_SW, WIRE_X_UP_BOTH},
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  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
488  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
489  }, { // Tileh == 6
490  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
491  {INVALID_CATENARY, WIRE_Y_UP_SE, WIRE_Y_UP_NW, WIRE_Y_UP_BOTH},
492  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
493  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
494  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
495  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
496  }, { // Tileh == 9
497  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
498  {INVALID_CATENARY, WIRE_Y_DOWN_SE, WIRE_Y_DOWN_NW, WIRE_Y_DOWN_BOTH},
499  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
500  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
501  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
502  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
503  }, { // Tileh == 12
504  {INVALID_CATENARY, WIRE_X_DOWN_NE, WIRE_X_DOWN_SW, WIRE_X_DOWN_BOTH},
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  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
509  {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
510  }
511 };
512 
513 #endif /* ELRAIL_DATA_H */