00001
00005 #ifndef ELRAIL_DATA_H
00006 #define ELRAIL_DATA_H
00007
00010 enum TLG {
00011 XEVEN_YEVEN = 0,
00012 XEVEN_YODD = 1,
00013 XODD_YEVEN = 2,
00014 XODD_YODD = 3,
00015 TLG_END
00016 };
00017
00021 enum TileSource {
00022 TS_HOME = 0,
00023 TS_NEIGHBOUR = 1,
00024
00025 TS_END
00026 };
00027
00028 enum {
00029 NUM_TRACKS_AT_PCP = 6
00030 };
00031
00033 static byte AllowedPPPonPCP[DIAGDIR_END] = {
00034 1 << DIR_N | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S | 1 << DIR_W | 1 << DIR_NW,
00035 1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
00036 1 << DIR_N | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S | 1 << DIR_W | 1 << DIR_NW,
00037 1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
00038 };
00039
00043 static byte OwnedPPPonPCP[DIAGDIR_END] = {
00044 1 << DIR_SE | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
00045 1 << DIR_N | 1 << DIR_SW | 1 << DIR_W | 1 << DIR_NW,
00046 1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_NW,
00047 1 << DIR_NE | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S
00048 };
00049
00051 static const DiagDirection PCPpositions[TRACK_END][2] = {
00052 {DIAGDIR_NE, DIAGDIR_SW},
00053 {DIAGDIR_SE, DIAGDIR_NW},
00054 {DIAGDIR_NW, DIAGDIR_NE},
00055 {DIAGDIR_SE, DIAGDIR_SW},
00056 {DIAGDIR_SW, DIAGDIR_NW},
00057 {DIAGDIR_NE, DIAGDIR_SE},
00058 };
00059
00060 #define PCP_NOT_ON_TRACK 0xFF
00061
00065 static byte PreferredPPPofTrackAtPCP[TRACK_END][DIAGDIR_END] = {
00066 {
00067 1 << DIR_NE | 1 << DIR_SE | 1 << DIR_NW,
00068 PCP_NOT_ON_TRACK,
00069 1 << DIR_SE | 1 << DIR_SW | 1 << DIR_NW,
00070 PCP_NOT_ON_TRACK
00071 }, {
00072 PCP_NOT_ON_TRACK,
00073 1 << DIR_NE | 1 << DIR_SE | 1 << DIR_SW,
00074 PCP_NOT_ON_TRACK,
00075 1 << DIR_SW | 1 << DIR_NW | 1 << DIR_NE
00076 }, {
00077 1 << DIR_E | 1 << DIR_N | 1 << DIR_S,
00078 PCP_NOT_ON_TRACK,
00079 PCP_NOT_ON_TRACK,
00080 1 << DIR_W | 1 << DIR_N | 1 << DIR_S
00081 }, {
00082 PCP_NOT_ON_TRACK,
00083 1 << DIR_E | 1 << DIR_N | 1 << DIR_S,
00084 1 << DIR_W | 1 << DIR_N | 1 << DIR_S,
00085 PCP_NOT_ON_TRACK
00086 }, {
00087 PCP_NOT_ON_TRACK,
00088 PCP_NOT_ON_TRACK,
00089 1 << DIR_S | 1 << DIR_E | 1 << DIR_W,
00090 1 << DIR_N | 1 << DIR_E | 1 << DIR_W
00091 }, {
00092 1 << DIR_N | 1 << DIR_E | 1 << DIR_W,
00093 1 << DIR_S | 1 << DIR_E | 1 << DIR_W,
00094 PCP_NOT_ON_TRACK,
00095 PCP_NOT_ON_TRACK
00096 }
00097 };
00098 #undef PCP_NOT_ON_TRACK
00099
00100
00101 #define NUM_IGNORE_GROUPS 3
00102 #define IGNORE_NONE 0xFF
00103
00106 static byte IgnoredPCP[NUM_IGNORE_GROUPS][TLG_END][DIAGDIR_END] = {
00107 {
00108 {
00109 IGNORE_NONE,
00110 1 << DIR_NE | 1 << DIR_SW,
00111 1 << DIR_NW | 1 << DIR_SE,
00112 IGNORE_NONE
00113 }, {
00114 IGNORE_NONE,
00115 IGNORE_NONE,
00116 1 << DIR_NW | 1 << DIR_SE,
00117 1 << DIR_NE | 1 << DIR_SW
00118 }, {
00119 1 << DIR_NW | 1 << DIR_SE,
00120 1 << DIR_NE | 1 << DIR_SW,
00121 IGNORE_NONE,
00122 IGNORE_NONE
00123 }, {
00124 1 << DIR_NW | 1 << DIR_SE,
00125 IGNORE_NONE,
00126 IGNORE_NONE,
00127 1 << DIR_NE | 1 << DIR_SW
00128 }
00129 },
00130 {
00131 {
00132 1 << DIR_E | 1 << DIR_W,
00133 IGNORE_NONE,
00134 IGNORE_NONE,
00135 1 << DIR_E | 1 << DIR_W
00136 }, {
00137 IGNORE_NONE,
00138 1 << DIR_E | 1 << DIR_W,
00139 1 << DIR_E | 1 << DIR_W,
00140 IGNORE_NONE
00141 }, {
00142 IGNORE_NONE,
00143 1 << DIR_E | 1 << DIR_W,
00144 1 << DIR_E | 1 << DIR_W,
00145 IGNORE_NONE
00146 }, {
00147 1 << DIR_E | 1 << DIR_W,
00148 IGNORE_NONE,
00149 IGNORE_NONE,
00150 1 << DIR_E | 1 << DIR_W
00151 }
00152 },
00153 {
00154 {
00155 1 << DIR_N | 1 << DIR_S,
00156 1 << DIR_N | 1 << DIR_S,
00157 IGNORE_NONE,
00158 IGNORE_NONE
00159 }, {
00160 IGNORE_NONE,
00161 IGNORE_NONE,
00162 1 << DIR_N | 1 << DIR_S,
00163 1 << DIR_N | 1 << DIR_S
00164 }, {
00165 IGNORE_NONE,
00166 IGNORE_NONE,
00167 1 << DIR_N | 1 << DIR_S ,
00168 1 << DIR_N | 1 << DIR_S
00169 }, {
00170 1 << DIR_N | 1 << DIR_S,
00171 1 << DIR_N | 1 << DIR_S,
00172 IGNORE_NONE,
00173 IGNORE_NONE
00174 }
00175 }
00176 };
00177
00178 #undef NO_IGNORE
00179
00181 static byte DisallowedPPPofTrackAtPCP[TRACK_END][DIAGDIR_END] = {
00182 {1 << DIR_SW | 1 << DIR_NE, 0, 1 << DIR_SW | 1 << DIR_NE, 0 },
00183 {0, 1 << DIR_NW | 1 << DIR_SE, 0, 1 << DIR_NW | 1 << DIR_SE},
00184 {1 << DIR_W | 1 << DIR_E, 0, 0, 1 << DIR_W | 1 << DIR_E },
00185 {0, 1 << DIR_W | 1 << DIR_E, 1 << DIR_W | 1 << DIR_E, 0 },
00186 {0, 0, 1 << DIR_S | 1 << DIR_N, 1 << DIR_N | 1 << DIR_S },
00187 {1 << DIR_S | 1 << DIR_N, 1 << DIR_S | 1 << DIR_N, 0, 0, },
00188 };
00189
00190
00191 static const Track TracksAtPCP[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
00192 {TRACK_X, TRACK_X, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
00193 {TRACK_Y, TRACK_Y, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
00194 {TRACK_X, TRACK_X, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
00195 {TRACK_Y, TRACK_Y, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
00196 };
00197
00198
00199
00200 static const TileSource TrackSourceTile[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
00201 {TS_HOME, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME },
00202 {TS_HOME, TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_HOME },
00203 {TS_HOME, TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME , TS_HOME , TS_NEIGHBOUR},
00204 {TS_HOME, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR},
00205 };
00206
00207
00208 static const Direction PPPorder[DIAGDIR_END][TLG_END][DIR_END] = {
00209 {
00210 {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_N, DIR_E, DIR_S, DIR_W},
00211 {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_S, DIR_W, DIR_N, DIR_E},
00212 {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_S, DIR_W, DIR_N, DIR_E},
00213 {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_N, DIR_E, DIR_S, DIR_W},
00214 }, {
00215 {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_S, DIR_E, DIR_N, DIR_W},
00216 {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_N, DIR_W, DIR_S, DIR_E},
00217 {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_N, DIR_W, DIR_S, DIR_E},
00218 {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_S, DIR_E, DIR_N, DIR_W},
00219 }, {
00220 {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_S, DIR_W, DIR_N, DIR_E},
00221 {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_N, DIR_E, DIR_S, DIR_W},
00222 {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_N, DIR_E, DIR_S, DIR_W},
00223 {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_S, DIR_W, DIR_N, DIR_E},
00224 }, {
00225 {DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_N, DIR_W, DIR_S, DIR_E},
00226 {DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_S, DIR_E, DIR_N, DIR_W},
00227 {DIR_SW, DIR_NW, DIR_NE, DIR_SE, DIR_S, DIR_E, DIR_N, DIR_W},
00228 {DIR_SW, DIR_SE, DIR_NE, DIR_NW, DIR_N, DIR_W, DIR_S, DIR_E},
00229 }
00230 };
00231
00232 static const int8 x_pcp_offsets[DIAGDIR_END] = {0, 8, 16, 8};
00233 static const int8 y_pcp_offsets[DIAGDIR_END] = {8, 16, 8, 0};
00234
00235 static const int8 x_ppp_offsets[DIR_END] = {-2, -4, -2, 0, 2, 4, 2, 0};
00236 static const int8 y_ppp_offsets[DIR_END] = {-2, 0, 2, 4, 2, 0, -2, -4};
00237
00238 static const SpriteID pylon_sprites[] = {
00239 SPR_PYLON_EW_N,
00240 SPR_PYLON_Y_NE,
00241 SPR_PYLON_NS_E,
00242 SPR_PYLON_X_SE,
00243 SPR_PYLON_EW_S,
00244 SPR_PYLON_Y_SW,
00245 SPR_PYLON_NS_W,
00246 SPR_PYLON_X_NW
00247 };
00248
00249 struct SortableSpriteStruct {
00250 SpriteID image;
00251 int8 x_offset;
00252 int8 y_offset;
00253 int8 x_size;
00254 int8 y_size;
00255 int8 z_size;
00256 int8 z_offset;
00257 };
00258
00259 enum {
00261 ELRAIL_ELEVATION = 10,
00263 ELRAIL_ELEVRAISE = ELRAIL_ELEVATION + TILE_HEIGHT
00264 };
00265
00266 static const SortableSpriteStruct CatenarySpriteData[] = {
00267
00268
00269
00270 { SPR_WIRE_X_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
00271 { SPR_WIRE_X_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
00272 { SPR_WIRE_X_SHORT, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
00273
00274
00275
00276 { SPR_WIRE_X_SW_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE },
00277 { SPR_WIRE_X_NE_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE },
00278 { SPR_WIRE_X_SHORT_UP, 0, 7, 15, 8, 1, ELRAIL_ELEVRAISE },
00279
00280
00281
00282 { SPR_WIRE_X_SW_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION },
00283 { SPR_WIRE_X_NE_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION },
00284 { SPR_WIRE_X_SHORT_DOWN, 0, 7, 15, 8, 1, ELRAIL_ELEVATION },
00285
00286
00287
00288
00289
00290 { SPR_WIRE_Y_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
00291 { SPR_WIRE_Y_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
00292 { SPR_WIRE_Y_SHORT, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
00293
00294
00295
00296 { SPR_WIRE_Y_SE_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE },
00297 { SPR_WIRE_Y_NW_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE },
00298 { SPR_WIRE_Y_SHORT_UP, 7, 0, 8, 15, 1, ELRAIL_ELEVRAISE },
00299
00300
00301
00302 { SPR_WIRE_Y_SE_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION },
00303 { SPR_WIRE_Y_NW_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION },
00304 { SPR_WIRE_Y_SHORT_DOWN, 7, 0, 8, 15, 1, ELRAIL_ELEVATION },
00305
00306
00307 { SPR_WIRE_NS_SHORT, 8, 0, 8, 8, 1, ELRAIL_ELEVATION },
00308 { SPR_WIRE_NS_SHORT, 0, 8, 8, 8, 1, ELRAIL_ELEVATION },
00309
00310 { SPR_WIRE_NS_N, 8, 0, 8, 8, 1, ELRAIL_ELEVATION },
00311 { SPR_WIRE_NS_N, 0, 8, 8, 8, 1, ELRAIL_ELEVATION },
00312
00313 { SPR_WIRE_NS_S, 8, 0, 8, 8, 1, ELRAIL_ELEVATION },
00314 { SPR_WIRE_NS_S, 0, 8, 8, 8, 1, ELRAIL_ELEVATION },
00315
00316
00317 { SPR_WIRE_EW_SHORT, 7, 0, 1, 1, 1, ELRAIL_ELEVATION },
00318 { SPR_WIRE_EW_SHORT, 15, 8, 3, 3, 1, ELRAIL_ELEVATION },
00319
00320 { SPR_WIRE_EW_W, 7, 0, 1, 1, 1, ELRAIL_ELEVATION },
00321 { SPR_WIRE_EW_W, 15, 8, 3, 3, 1, ELRAIL_ELEVATION },
00322
00323 { SPR_WIRE_EW_E, 7, 0, 1, 1, 1, ELRAIL_ELEVATION },
00324 { SPR_WIRE_EW_E, 15, 8, 3, 3, 1, ELRAIL_ELEVATION }
00325 };
00326
00327 static const SortableSpriteStruct CatenarySpriteData_Depot[] = {
00328 { SPR_WIRE_DEPOT_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
00329 { SPR_WIRE_DEPOT_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
00330 { SPR_WIRE_DEPOT_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
00331 { SPR_WIRE_DEPOT_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }
00332 };
00333
00334 static const SortableSpriteStruct CatenarySpriteData_Tunnel[] = {
00335 { SPR_WIRE_TUNNEL_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
00336 { SPR_WIRE_TUNNEL_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION },
00337 { SPR_WIRE_TUNNEL_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION },
00338 { SPR_WIRE_TUNNEL_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }
00339 };
00340
00341
00353 enum CatenarySprite {
00354 WIRE_X_FLAT_SW,
00355 WIRE_X_FLAT_NE,
00356 WIRE_X_FLAT_BOTH,
00357
00358 WIRE_X_UP_SW,
00359 WIRE_X_UP_NE,
00360 WIRE_X_UP_BOTH,
00361
00362 WIRE_X_DOWN_SW,
00363 WIRE_X_DOWN_NE,
00364 WIRE_X_DOWN_BOTH,
00365
00366 WIRE_Y_FLAT_SE,
00367 WIRE_Y_FLAT_NW,
00368 WIRE_Y_FLAT_BOTH,
00369
00370 WIRE_Y_UP_SE,
00371 WIRE_Y_UP_NW,
00372 WIRE_Y_UP_BOTH,
00373
00374 WIRE_Y_DOWN_SE,
00375 WIRE_Y_DOWN_NW,
00376 WIRE_Y_DOWN_BOTH,
00377
00378 WIRE_NS_W_BOTH,
00379 WIRE_NS_E_BOTH,
00380
00381 WIRE_NS_W_N,
00382 WIRE_NS_E_N,
00383
00384 WIRE_NS_W_S,
00385 WIRE_NS_E_S,
00386
00387 WIRE_EW_N_BOTH,
00388 WIRE_EW_S_BOTH,
00389
00390 WIRE_EW_N_W,
00391 WIRE_EW_S_W,
00392
00393 WIRE_EW_N_E,
00394 WIRE_EW_S_E,
00395
00396 INVALID_CATENARY = 0xFF
00397 };
00398
00399
00400
00401
00402
00403
00404
00405 static const CatenarySprite Wires[5][TRACK_END][4] = {
00406 {
00407 {INVALID_CATENARY, WIRE_X_FLAT_NE, WIRE_X_FLAT_SW, WIRE_X_FLAT_BOTH},
00408 {INVALID_CATENARY, WIRE_Y_FLAT_SE, WIRE_Y_FLAT_NW, WIRE_Y_FLAT_BOTH},
00409 {INVALID_CATENARY, WIRE_EW_N_W, WIRE_EW_N_E, WIRE_EW_N_BOTH},
00410 {INVALID_CATENARY, WIRE_EW_S_E, WIRE_EW_S_W, WIRE_EW_S_BOTH},
00411 {INVALID_CATENARY, WIRE_NS_W_S, WIRE_NS_W_N, WIRE_NS_W_BOTH},
00412 {INVALID_CATENARY, WIRE_NS_E_N, WIRE_NS_E_S, WIRE_NS_E_BOTH},
00413 }, {
00414 {INVALID_CATENARY, WIRE_X_UP_NE, WIRE_X_UP_SW, WIRE_X_UP_BOTH},
00415 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00416 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00417 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00418 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00419 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00420 }, {
00421 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00422 {INVALID_CATENARY, WIRE_Y_UP_SE, WIRE_Y_UP_NW, WIRE_Y_UP_BOTH},
00423 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00424 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00425 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00426 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00427 }, {
00428 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00429 {INVALID_CATENARY, WIRE_Y_DOWN_SE, WIRE_Y_DOWN_NW, WIRE_Y_DOWN_BOTH},
00430 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00431 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00432 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00433 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00434 }, {
00435 {INVALID_CATENARY, WIRE_X_DOWN_NE, WIRE_X_DOWN_SW, WIRE_X_DOWN_BOTH},
00436 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00437 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00438 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00439 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00440 {INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY, INVALID_CATENARY},
00441 }
00442 };
00443
00444 #endif