@@ -2343,27 +2343,32 @@ bool AfterLoadGame()
/* Have we passed the visibility "switch" state already? */
byte pos = (DiagDirToAxis(vdir) == AXIS_X ? v->x_pos : v->y_pos) & TILE_UNIT_MASK;
byte frame = (vdir == DIAGDIR_NE || vdir == DIAGDIR_NW) ? TILE_SIZE - 1 - pos : pos;
extern const byte _tunnel_visibility_frame[DIAGDIR_END];
if (dir == vdir && !(v->vehstatus & VS_HIDDEN)) {
if (frame < _tunnel_visibility_frame[dir]) continue;
/* Tunnel entrance, make us invisible. */
v->tile = vtile;
/* Should the vehicle be hidden or not? */
bool hidden;
if (dir == vdir) { // Entering tunnel
hidden = frame >= _tunnel_visibility_frame[dir];
} else if (dir == ReverseDiagDir(vdir)) { // Leaving tunnel
hidden = frame < TILE_SIZE - _tunnel_visibility_frame[dir];
} else { // Something freaky going on?
NOT_REACHED();
}
if (hidden) {
v->vehstatus |= VS_HIDDEN;
switch (v->type) {
case VEH_TRAIN: Train::From(v)->track = TRACK_BIT_WORMHOLE; break;
case VEH_ROAD: RoadVehicle::From(v)->state = RVSB_WORMHOLE; break;
default: NOT_REACHED();
} else if (dir == ReverseDiagDir(vdir) && (v->vehstatus & VS_HIDDEN)) {
if (frame < TILE_SIZE - _tunnel_visibility_frame[dir]) continue;
/* Tunnel exit, make us visible again. */
} else {
v->vehstatus &= ~VS_HIDDEN;
case VEH_TRAIN: Train::From(v)->track = DiagDirToDiagTrackBits(vdir); break;
case VEH_ROAD: RoadVehicle::From(v)->state = DiagDirToDiagTrackdir(vdir); break;
Status change: