1248 static const byte _tunnel_fractcoord_1[4] = {0x8E, 0x18, 0x81, 0xE8}; |
1248 static const byte _tunnel_fractcoord_1[4] = {0x8E, 0x18, 0x81, 0xE8}; |
1249 static const byte _tunnel_fractcoord_2[4] = {0x81, 0x98, 0x87, 0x38}; |
1249 static const byte _tunnel_fractcoord_2[4] = {0x81, 0x98, 0x87, 0x38}; |
1250 static const byte _tunnel_fractcoord_3[4] = {0x82, 0x88, 0x86, 0x48}; |
1250 static const byte _tunnel_fractcoord_3[4] = {0x82, 0x88, 0x86, 0x48}; |
1251 static const byte _exit_tunnel_track[4] = {1, 2, 1, 2}; |
1251 static const byte _exit_tunnel_track[4] = {1, 2, 1, 2}; |
1252 |
1252 |
1253 static const byte _road_exit_tunnel_state[4] = {8, 9, 0, 1}; |
1253 /** Get the trackdir of the exit of a tunnel */ |
|
1254 static const Trackdir _road_exit_tunnel_state[DIAGDIR_END] = { |
|
1255 TRACKDIR_X_SW, TRACKDIR_Y_NW, TRACKDIR_X_NE, TRACKDIR_Y_SE |
|
1256 }; |
1254 static const byte _road_exit_tunnel_frame[4] = {2, 7, 9, 4}; |
1257 static const byte _road_exit_tunnel_frame[4] = {2, 7, 9, 4}; |
1255 |
1258 |
1256 static const byte _tunnel_fractcoord_4[4] = {0x52, 0x85, 0x98, 0x29}; |
1259 static const byte _tunnel_fractcoord_4[4] = {0x52, 0x85, 0x98, 0x29}; |
1257 static const byte _tunnel_fractcoord_5[4] = {0x92, 0x89, 0x58, 0x25}; |
1260 static const byte _tunnel_fractcoord_5[4] = {0x92, 0x89, 0x58, 0x25}; |
1258 static const byte _tunnel_fractcoord_6[4] = {0x92, 0x89, 0x56, 0x45}; |
1261 static const byte _tunnel_fractcoord_6[4] = {0x92, 0x89, 0x56, 0x45}; |
1302 fc = (x & 0xF) + (y << 4); |
1305 fc = (x & 0xF) + (y << 4); |
1303 dir = GetTunnelDirection(tile); |
1306 dir = GetTunnelDirection(tile); |
1304 vdir = DirToDiagDir(v->direction); |
1307 vdir = DirToDiagDir(v->direction); |
1305 |
1308 |
1306 // Enter tunnel? |
1309 // Enter tunnel? |
1307 if (v->u.road.state != 0xFF && dir == vdir) { |
1310 if (v->u.road.state != RVSB_WORMHOLE && dir == vdir) { |
1308 if (fc == _tunnel_fractcoord_4[dir] || |
1311 if (fc == _tunnel_fractcoord_4[dir] || |
1309 fc == _tunnel_fractcoord_5[dir]) { |
1312 fc == _tunnel_fractcoord_5[dir]) { |
1310 v->tile = tile; |
1313 v->tile = tile; |
1311 v->u.road.state = 0xFF; |
1314 v->u.road.state = RVSB_WORMHOLE; |
1312 v->vehstatus |= VS_HIDDEN; |
1315 v->vehstatus |= VS_HIDDEN; |
1313 return VETSB_ENTERED_WORMHOLE; |
1316 return VETSB_ENTERED_WORMHOLE; |
1314 } else { |
1317 } else { |
1315 return VETSB_CONTINUE; |
1318 return VETSB_CONTINUE; |
1316 } |
1319 } |
1352 if (v->type == VEH_Train) { |
1355 if (v->type == VEH_Train) { |
1353 v->u.rail.track = TRACK_BIT_WORMHOLE; |
1356 v->u.rail.track = TRACK_BIT_WORMHOLE; |
1354 CLRBIT(v->u.rail.flags, VRF_GOINGUP); |
1357 CLRBIT(v->u.rail.flags, VRF_GOINGUP); |
1355 CLRBIT(v->u.rail.flags, VRF_GOINGDOWN); |
1358 CLRBIT(v->u.rail.flags, VRF_GOINGDOWN); |
1356 } else { |
1359 } else { |
1357 v->u.road.state = 0xFF; |
1360 v->u.road.state = RVSB_WORMHOLE; |
1358 } |
1361 } |
1359 return VETSB_ENTERED_WORMHOLE; |
1362 return VETSB_ENTERED_WORMHOLE; |
1360 } else if (DirToDiagDir(v->direction) == ReverseDiagDir(dir)) { |
1363 } else if (DirToDiagDir(v->direction) == ReverseDiagDir(dir)) { |
1361 v->tile = tile; |
1364 v->tile = tile; |
1362 if (v->type == VEH_Train) { |
1365 if (v->type == VEH_Train) { |
1363 if (v->u.rail.track == TRACK_BIT_WORMHOLE) { |
1366 if (v->u.rail.track == TRACK_BIT_WORMHOLE) { |
1364 v->u.rail.track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y); |
1367 v->u.rail.track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y); |
1365 return VETSB_ENTERED_WORMHOLE; |
1368 return VETSB_ENTERED_WORMHOLE; |
1366 } |
1369 } |
1367 } else { |
1370 } else { |
1368 if (v->u.road.state == 0xFF) { |
1371 if (v->u.road.state == RVSB_WORMHOLE) { |
1369 v->u.road.state = _road_exit_tunnel_state[dir]; |
1372 v->u.road.state = _road_exit_tunnel_state[dir]; |
1370 v->u.road.frame = 0; |
1373 v->u.road.frame = 0; |
1371 return VETSB_ENTERED_WORMHOLE; |
1374 return VETSB_ENTERED_WORMHOLE; |
1372 } |
1375 } |
1373 } |
1376 } |