# elrail_data.h

Go to the documentation of this file.

    00001 /* $Id: elrail_data.h 24900 2013-01-08 22:46:42Z planetmaker $ */
    00002
    00003 /*
    00004  * This file is part of OpenTTD.
    00005  * 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.
    00006  * 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.
    00007  * 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/>.
    00008  */
    00009
    00015 #ifndef ELRAIL_DATA_H
    00016 #define ELRAIL_DATA_H
    00017
    00022 enum TLG {
    00023   XEVEN_YEVEN = 0,
    00024   XEVEN_YODD  = 1,
    00025   XODD_YEVEN  = 2,
    00026   XODD_YODD   = 3,
    00027   TLG_END
    00028 };
    00029
    00035 enum TileSource {
    00036   TS_HOME      = 0,
    00037   TS_NEIGHBOUR = 1,
    00038
    00039   TS_END
    00040 };
    00041
    00042 static const uint NUM_TRACKS_AT_PCP = 6;
    00043
    00045 static const byte AllowedPPPonPCP[DIAGDIR_END] = {
    00046   1 << DIR_N | 1 << DIR_E  | 1 << DIR_SE | 1 << DIR_S | 1 << DIR_W  | 1 << DIR_NW,
    00047   1 << DIR_N | 1 << DIR_NE | 1 << DIR_E  | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
    00048   1 << DIR_N | 1 << DIR_E  | 1 << DIR_SE | 1 << DIR_S | 1 << DIR_W  | 1 << DIR_NW,
    00049   1 << DIR_N | 1 << DIR_NE | 1 << DIR_E  | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
    00050 };
    00051
    00057 static const byte OwnedPPPonPCP[DIAGDIR_END] = {
    00058   1 << DIR_SE | 1 << DIR_S  | 1 << DIR_SW | 1 << DIR_W,
    00059   1 << DIR_N  | 1 << DIR_SW | 1 << DIR_W  | 1 << DIR_NW,
    00060   1 << DIR_N  | 1 << DIR_NE | 1 << DIR_E  | 1 << DIR_NW,
    00061   1 << DIR_NE | 1 << DIR_E  | 1 << DIR_SE | 1 << DIR_S
    00062 };
    00063
    00065 static const DiagDirection PCPpositions[TRACK_END][2] = {
    00066   {DIAGDIR_NE, DIAGDIR_SW}, // X
    00067   {DIAGDIR_SE, DIAGDIR_NW}, // Y
    00068   {DIAGDIR_NW, DIAGDIR_NE}, // UPPER
    00069   {DIAGDIR_SE, DIAGDIR_SW}, // LOWER
    00070   {DIAGDIR_SW, DIAGDIR_NW}, // LEFT
    00071   {DIAGDIR_NE, DIAGDIR_SE}, // RIGHT
    00072 };
    00073
    00074 #define PCP_NOT_ON_TRACK 0xFF
    00075
    00081 static const byte PreferredPPPofTrackAtPCP[TRACK_END][DIAGDIR_END] = {
    00082   {    // X
    00083     1 << DIR_NE | 1 << DIR_SE | 1 << DIR_NW, // NE
    00084     PCP_NOT_ON_TRACK,                        // SE
    00085     1 << DIR_SE | 1 << DIR_SW | 1 << DIR_NW, // SW
    00086     PCP_NOT_ON_TRACK                         // NE
    00087   }, { // Y
    00088     PCP_NOT_ON_TRACK,
    00089     1 << DIR_NE | 1 << DIR_SE | 1 << DIR_SW,
    00090     PCP_NOT_ON_TRACK,
    00091     1 << DIR_SW | 1 << DIR_NW | 1 << DIR_NE
    00092   }, { // UPPER
    00093     1 << DIR_E | 1 << DIR_N | 1 << DIR_S,
    00094     PCP_NOT_ON_TRACK,
    00095     PCP_NOT_ON_TRACK,
    00096     1 << DIR_W | 1 << DIR_N | 1 << DIR_S
    00097   }, { // LOWER
    00098     PCP_NOT_ON_TRACK,
    00099     1 << DIR_E | 1 << DIR_N | 1 << DIR_S,
    00100     1 << DIR_W | 1 << DIR_N | 1 << DIR_S,
    00101     PCP_NOT_ON_TRACK
    00102   }, { // LEFT
    00103     PCP_NOT_ON_TRACK,
    00104     PCP_NOT_ON_TRACK,
    00105     1 << DIR_S | 1 << DIR_E | 1 << DIR_W,
    00106     1 << DIR_N | 1 << DIR_E | 1 << DIR_W
    00107   }, { // RIGHT
    00108     1 << DIR_N | 1 << DIR_E | 1 << DIR_W,
    00109     1 << DIR_S | 1 << DIR_E | 1 << DIR_W,
    00110     PCP_NOT_ON_TRACK,
    00111     PCP_NOT_ON_TRACK
    00112   }
    00113 };
    00114 #undef PCP_NOT_ON_TRACK
    00115
    00116
    00117 #define NUM_IGNORE_GROUPS 3
    00118 #define IGNORE_NONE 0xFF
    00119
    00124 static const byte IgnoredPCP[NUM_IGNORE_GROUPS][TLG_END][DIAGDIR_END] = {
    00125   {   // Ignore group 1, X and Y tracks
    00126     {     // X even, Y even
    00127       IGNORE_NONE,
    00128       1 << DIR_NE | 1 << DIR_SW,
    00129       1 << DIR_NW | 1 << DIR_SE,
    00130       IGNORE_NONE
    00131     }, { // X even, Y odd
    00132       IGNORE_NONE,
    00133       IGNORE_NONE,
    00134       1 << DIR_NW | 1 << DIR_SE,
    00135       1 << DIR_NE | 1 << DIR_SW
    00136     }, { // X odd,  Y even
    00137       1 << DIR_NW | 1 << DIR_SE,
    00138       1 << DIR_NE | 1 << DIR_SW,
    00139       IGNORE_NONE,
    00140       IGNORE_NONE
    00141     }, { // X odd,  Y odd
    00142       1 << DIR_NW | 1 << DIR_SE,
    00143       IGNORE_NONE,
    00144       IGNORE_NONE,
    00145       1 << DIR_NE | 1 << DIR_SW
    00146     }
    00147   },
    00148   {   // Ignore group 2, LEFT and RIGHT tracks
    00149     {
    00150       1 << DIR_E | 1 << DIR_W,
    00151       IGNORE_NONE,
    00152       IGNORE_NONE,
    00153       1 << DIR_E | 1 << DIR_W
    00154     }, {
    00155       IGNORE_NONE,
    00156       1 << DIR_E | 1 << DIR_W,
    00157       1 << DIR_E | 1 << DIR_W,
    00158       IGNORE_NONE
    00159     }, {
    00160       IGNORE_NONE,
    00161       1 << DIR_E | 1 << DIR_W,
    00162       1 << DIR_E | 1 << DIR_W,
    00163       IGNORE_NONE
    00164     }, {
    00165       1 << DIR_E | 1 << DIR_W,
    00166       IGNORE_NONE,
    00167       IGNORE_NONE,
    00168       1 << DIR_E | 1 << DIR_W
    00169     }
    00170   },
    00171   {   // Ignore group 3, UPPER and LOWER tracks
    00172     {
    00173       1 << DIR_N | 1 << DIR_S,
    00174       1 << DIR_N | 1 << DIR_S,
    00175       IGNORE_NONE,
    00176       IGNORE_NONE
    00177     }, {
    00178       IGNORE_NONE,
    00179       IGNORE_NONE,
    00180       1 << DIR_N | 1 << DIR_S,
    00181       1 << DIR_N | 1 << DIR_S
    00182     }, {
    00183       IGNORE_NONE,
    00184       IGNORE_NONE,
    00185       1 << DIR_N | 1 << DIR_S ,
    00186       1 << DIR_N | 1 << DIR_S
    00187     }, {
    00188       1 << DIR_N | 1 << DIR_S,
    00189       1 << DIR_N | 1 << DIR_S,
    00190       IGNORE_NONE,
    00191       IGNORE_NONE
    00192     }
    00193   }
    00194 };
    00195
    00196 #undef NO_IGNORE
    00197
    00199 static const byte DisallowedPPPofTrackAtPCP[TRACK_END][DIAGDIR_END] = {
    00200   {1 << DIR_SW | 1 << DIR_NE, 0,           1 << DIR_SW | 1 << DIR_NE, 0          }, // X
    00201   {0,           1 << DIR_NW | 1 << DIR_SE, 0,           1 << DIR_NW | 1 << DIR_SE}, // Y
    00202   {1 << DIR_W | 1 << DIR_E,  0,           0,           1 << DIR_W | 1 << DIR_E }, // UPPER
    00203   {0,           1 << DIR_W | 1 << DIR_E,  1 << DIR_W | 1 << DIR_E,  0          }, // LOWER
    00204   {0,           0,           1 << DIR_S | 1 << DIR_N,  1 << DIR_N | 1 << DIR_S }, // LEFT
    00205   {1 << DIR_S | 1 << DIR_N,  1 << DIR_S | 1 << DIR_N,  0,           0,         }, // RIGHT
    00206 };
    00207
    00208 /* This array stores which track bits can meet at a tile edge */
    00209 static const Track TracksAtPCP[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
    00210   {TRACK_X, TRACK_X, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
    00211   {TRACK_Y, TRACK_Y, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
    00212   {TRACK_X, TRACK_X, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
    00213   {TRACK_Y, TRACK_Y, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
    00214 };
    00215
    00216 /* takes each of the 6 track bits from the array above and
    00217  * assigns it to the home tile or neighbour tile */
    00218 static const TileSource TrackSourceTile[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
    00219   {TS_HOME, TS_NEIGHBOUR, TS_HOME     , TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME     },
    00220   {TS_HOME, TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME     , TS_NEIGHBOUR, TS_HOME     },
    00221   {TS_HOME, TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME     , TS_HOME     , TS_NEIGHBOUR},
    00222   {TS_HOME, TS_NEIGHBOUR, TS_HOME     , TS_NEIGHBOUR, TS_HOME     , TS_NEIGHBOUR},
    00223 };
    00224
    00225 /* Several PPPs maybe exist, here they are sorted in order of preference. */
    00226 static const Direction PPPorder[DIAGDIR_END][TLG_END][DIR_END] = {    //  X  -  Y
    00227   {   // PCP 0
    00228     {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_N, DIR_E, DIR_S, DIR_W}, // evn - evn
    00229     {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_S, DIR_W, DIR_N, DIR_E}, // evn - odd
    00230     {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_S, DIR_W, DIR_N, DIR_E}, // odd - evn
    00231     {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_N, DIR_E, DIR_S, DIR_W}, // odd - odd
    00232   }, {// PCP 1
    00233     {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_S, DIR_E, DIR_N, DIR_W}, // evn - evn
    00234     {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_N, DIR_W, DIR_S, DIR_E}, // evn - odd
    00235     {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_N, DIR_W, DIR_S, DIR_E}, // odd - evn
    00236     {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_S, DIR_E, DIR_N, DIR_W}, // odd - odd
    00237   }, {// PCP 2
    00238     {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_S, DIR_W, DIR_N, DIR_E}, // evn - evn
    00239     {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_N, DIR_E, DIR_S, DIR_W}, // evn - odd
    00240     {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_N, DIR_E, DIR_S, DIR_W}, // odd - evn
    00241     {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_S, DIR_W, DIR_N, DIR_E}, // odd - odd
    00242   }, {// PCP 3
    00243     {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_N, DIR_W, DIR_S, DIR_E}, // evn - evn
    00244     {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_S, DIR_E, DIR_N, DIR_W}, // evn - odd
    00245     {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_S, DIR_E, DIR_N, DIR_W}, // odd - evn
    00246     {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_N, DIR_W, DIR_S, DIR_E}, // odd - odd
    00247   }
    00248 };
    00249 /* Geometric placement of the PCP relative to the tile origin */
    00250 static const int8 x_pcp_offsets[DIAGDIR_END] = {0,  8, 16, 8};
    00251 static const int8 y_pcp_offsets[DIAGDIR_END] = {8, 16,  8, 0};
    00252 /* Geometric placement of the PPP relative to the PCP*/
    00253 static const int8 x_ppp_offsets[DIR_END] = {-2, -4, -2,  0,  2,  4,  2,  0};
    00254 static const int8 y_ppp_offsets[DIR_END] = {-2,  0,  2,  4,  2,  0, -2, -4};
    00255
    00259 enum PylonSpriteOffset {
    00260   PSO_Y_NE,
    00261   PSO_Y_SW,
    00262   PSO_X_NW,
    00263   PSO_X_SE,
    00264   PSO_EW_N,
    00265   PSO_EW_S,
    00266   PSO_NS_W,
    00267   PSO_NS_E,
    00268 };
    00269
    00270 /* The type of pylon to draw at each PPP */
    00271 static const uint8 pylon_sprites[] = {
    00272   PSO_EW_N,
    00273   PSO_Y_NE,
    00274   PSO_NS_E,
    00275   PSO_X_SE,
    00276   PSO_EW_S,
    00277   PSO_Y_SW,
    00278   PSO_NS_W,
    00279   PSO_X_NW,
    00280 };
    00281
    00285 enum WireSpriteOffset {
    00286   WSO_X_SHORT,
    00287   WSO_Y_SHORT,
    00288   WSO_EW_SHORT,
    00289   WSO_NS_SHORT,
    00290   WSO_X_SHORT_DOWN,
    00291   WSO_Y_SHORT_UP,
    00292   WSO_X_SHORT_UP,
    00293   WSO_Y_SHORT_DOWN,
    00294
    00295   WSO_X_SW,
    00296   WSO_Y_SE,
    00297   WSO_EW_E,
    00298   WSO_NS_S,
    00299   WSO_X_SW_DOWN,
    00300   WSO_Y_SE_UP,
    00301   WSO_X_SW_UP,
    00302   WSO_Y_SE_DOWN,
    00303
    00304   WSO_X_NE,
    00305   WSO_Y_NW,
    00306   WSO_EW_W,
    00307   WSO_NS_N,
    00308   WSO_X_NE_DOWN,
    00309   WSO_Y_NW_UP,
    00310   WSO_X_NE_UP,
    00311   WSO_Y_NW_DOWN,
    00312
    00313   WSO_ENTRANCE_NE,
    00314   WSO_ENTRANCE_SE,
    00315   WSO_ENTRANCE_SW,
    00316   WSO_ENTRANCE_NW,
    00317 };
    00318
    00319 struct SortableSpriteStruct {
    00320   uint8 image_offset;
    00321   int8 x_offset;
    00322   int8 y_offset;
    00323   int8 x_size;
    00324   int8 y_size;
    00325   int8 z_size;
    00326   int8 z_offset;
    00327 };
    00328
    00330 static const uint ELRAIL_ELEVATION = 10;
    00332 static const uint ELRAIL_ELEVRAISE = ELRAIL_ELEVATION + TILE_HEIGHT;
    00333
    00334 static const SortableSpriteStruct CatenarySpriteData[] = {
    00335 /* X direction
    00336    * Flat tiles:
    00337      * Wires */
    00338   { WSO_X_SW,          0,  7, 15,  1,  1, ELRAIL_ELEVATION },
    00339   { WSO_X_NE,          0,  7, 15,  1,  1, ELRAIL_ELEVATION },
    00340   { WSO_X_SHORT,       0,  7, 15,  1,  1, ELRAIL_ELEVATION },
    00341
    00342   /* "up" tiles
    00343      * Wires */
    00344   { WSO_X_SW_UP,       0,  7, 15,  8,  1, ELRAIL_ELEVRAISE },
    00345   { WSO_X_NE_UP,       0,  7, 15,  8,  1, ELRAIL_ELEVRAISE },
    00346   { WSO_X_SHORT_UP,    0,  7, 15,  8,  1, ELRAIL_ELEVRAISE },
    00347
    00348   /* "down" tiles
    00349      * Wires */
    00350   { WSO_X_SW_DOWN,     0,  7, 15,  8,  1, ELRAIL_ELEVATION },
    00351   { WSO_X_NE_DOWN,     0,  7, 15,  8,  1, ELRAIL_ELEVATION },
    00352   { WSO_X_SHORT_DOWN,  0,  7, 15,  8,  1, ELRAIL_ELEVATION },
    00353
    00354
    00355 /* Y direction
    00356    * Flat tiles:
    00357      * Wires */
    00358   { WSO_Y_SE,          7,  0,  1, 15,  1, ELRAIL_ELEVATION },
    00359   { WSO_Y_NW,          7,  0,  1, 15,  1, ELRAIL_ELEVATION },
    00360   { WSO_Y_SHORT,       7,  0,  1, 15,  1, ELRAIL_ELEVATION },
    00361
    00362   /* "up" tiles
    00363      * Wires */
    00364   { WSO_Y_SE_UP,       7,  0,  8, 15,  1, ELRAIL_ELEVRAISE },
    00365   { WSO_Y_NW_UP,       7,  0,  8, 15,  1, ELRAIL_ELEVRAISE },
    00366   { WSO_Y_SHORT_UP,    7,  0,  8, 15,  1, ELRAIL_ELEVRAISE },
    00367
    00368   /* "down" tiles
    00369      * Wires */
    00370   { WSO_Y_SE_DOWN,     7,  0,  8, 15,  1, ELRAIL_ELEVATION },
    00371   { WSO_Y_NW_DOWN,     7,  0,  8, 15,  1, ELRAIL_ELEVATION },
    00372   { WSO_Y_SHORT_DOWN,  7,  0,  8, 15,  1, ELRAIL_ELEVATION },
    00373
    00374 /* NS Direction */
    00375   { WSO_NS_SHORT,      8,  0,  8,  8,  1, ELRAIL_ELEVATION },
    00376   { WSO_NS_SHORT,      0,  8,  8,  8,  1, ELRAIL_ELEVATION },
    00377
    00378   { WSO_NS_N,          8,  0,  8,  8,  1, ELRAIL_ELEVATION },
    00379   { WSO_NS_N,          0,  8,  8,  8,  1, ELRAIL_ELEVATION },
    00380
    00381   { WSO_NS_S,          8,  0,  8,  8,  1, ELRAIL_ELEVATION },
    00382   { WSO_NS_S,          0,  8,  8,  8,  1, ELRAIL_ELEVATION },
    00383
    00384 /* EW Direction */
    00385   { WSO_EW_SHORT,      7,  0,  1,  1,  1, ELRAIL_ELEVATION },
    00386   { WSO_EW_SHORT,     15,  8,  3,  3,  1, ELRAIL_ELEVATION },
    00387
    00388   { WSO_EW_W,          7,  0,  1,  1,  1, ELRAIL_ELEVATION },
    00389   { WSO_EW_W,         15,  8,  3,  3,  1, ELRAIL_ELEVATION },
    00390
    00391   { WSO_EW_E,          7,  0,  1,  1,  1, ELRAIL_ELEVATION },
    00392   { WSO_EW_E,         15,  8,  3,  3,  1, ELRAIL_ELEVATION }
    00393 };
    00394
    00395 static const SortableSpriteStruct CatenarySpriteData_Depot[] = {
    00396   { WSO_ENTRANCE_NE,   0,  7, 15,  1,  1, ELRAIL_ELEVATION },
    00397   { WSO_ENTRANCE_SE,   7,  0,  1, 15,  1, ELRAIL_ELEVATION },
    00398   { WSO_ENTRANCE_SW,   0,  7, 15,  1,  1, ELRAIL_ELEVATION },
    00399   { WSO_ENTRANCE_NW,   7,  0,  1, 15,  1, ELRAIL_ELEVATION }
    00400 };
    00401
    00402 static const SortableSpriteStruct CatenarySpriteData_Tunnel[] = {
    00403   { WSO_ENTRANCE_NE,   0,  7, 15,  1,  1, ELRAIL_ELEVATION },
    00404   { WSO_ENTRANCE_SE,   7,  0,  1, 15,  1, ELRAIL_ELEVATION },
    00405   { WSO_ENTRANCE_SW,   0,  7, 15,  1,  1, ELRAIL_ELEVATION },
    00406   { WSO_ENTRANCE_NW,   7,  0,  1, 15,  1, ELRAIL_ELEVATION }
    00407 };
    00408
    00409
    00422 enum CatenarySprite {
    00423   WIRE_X_FLAT_SW,
    00424   WIRE_X_FLAT_NE,
    00425   WIRE_X_FLAT_BOTH,
    00426
    00427   WIRE_X_UP_SW,
    00428   WIRE_X_UP_NE,
    00429   WIRE_X_UP_BOTH,
    00430
    00431   WIRE_X_DOWN_SW,
    00432   WIRE_X_DOWN_NE,
    00433   WIRE_X_DOWN_BOTH,
    00434
    00435   WIRE_Y_FLAT_SE,
    00436   WIRE_Y_FLAT_NW,
    00437   WIRE_Y_FLAT_BOTH,
    00438
    00439   WIRE_Y_UP_SE,
    00440   WIRE_Y_UP_NW,
    00441   WIRE_Y_UP_BOTH,
    00442
    00443   WIRE_Y_DOWN_SE,
    00444   WIRE_Y_DOWN_NW,
    00445   WIRE_Y_DOWN_BOTH,
    00446
    00447   WIRE_NS_W_BOTH,
    00448   WIRE_NS_E_BOTH,
    00449
    00450   WIRE_NS_W_N,
    00451   WIRE_NS_E_N,
    00452
    00453   WIRE_NS_W_S,
    00454   WIRE_NS_E_S,
    00455
    00456   WIRE_EW_N_BOTH,
    00457   WIRE_EW_S_BOTH,
    00458
    00459   WIRE_EW_N_W,
    00460   WIRE_EW_S_W,
    00461
    00462   WIRE_EW_N_E,
    00463   WIRE_EW_S_E,
    00464
    00465   INVALID_CATENARY = 0xFF
    00466 };
    00467
    00468 /* Selects a Wire (with white and grey ends) depending on whether:
    00469  * a) none (should never happen)
    00470  * b) the first
    00471  * c) the second
    00472  * d) both
    00473  * PCP exists.*/
    00474 static const CatenarySprite Wires[5][TRACK_END][4] = {
    00475   { // Tileh == 0
    00476     {INVALID_CATENARY, WIRE_X_FLAT_NE,   WIRE_X_FLAT_SW,   WIRE_X_FLAT_BOTH},
    00477     {INVALID_CATENARY, WIRE_Y_FLAT_SE,   WIRE_Y_FLAT_NW,   WIRE_Y_FLAT_BOTH},
    00478     {INVALID_CATENARY, WIRE_EW_N_W,      WIRE_EW_N_E,      WIRE_EW_N_BOTH},
    00479     {INVALID_CATENARY, WIRE_EW_S_E,      WIRE_EW_S_W,      WIRE_EW_S_BOTH},
    00480     {INVALID_CATENARY, WIRE_NS_W_S,      WIRE_NS_W_N,      WIRE_NS_W_BOTH},
    00481     {INVALID_CATENARY, WIRE_NS_E_N,      WIRE_NS_E_S,      WIRE_NS_E_BOTH},
    00482   }, { // Tileh == 3
    00483     {INVALID_CATENARY, WIRE_X_UP_NE,     WIRE_X_UP_SW,     WIRE_X_UP_BOTH},
    00484     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00485     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00486     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00487     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00488     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00489   }, { // Tileh == 6
    00490     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00491     {INVALID_CATENARY, WIRE_Y_UP_SE,     WIRE_Y_UP_NW,     WIRE_Y_UP_BOTH},
    00492     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00493     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00494     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00495     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00496   }, { // Tileh == 9
    00497     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00498     {INVALID_CATENARY, WIRE_Y_DOWN_SE,   WIRE_Y_DOWN_NW,   WIRE_Y_DOWN_BOTH},
    00499     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00500     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00501     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00502     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00503   }, { // Tileh == 12
    00504     {INVALID_CATENARY, WIRE_X_DOWN_NE,   WIRE_X_DOWN_SW,   WIRE_X_DOWN_BOTH},
    00505     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00506     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00507     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00508     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00509     {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
    00510   }
    00511 };
    00512
    00513 #endif /* ELRAIL_DATA_H */