Index: src/saveload/afterload.cpp =================================================================== --- src/saveload/afterload.cpp (revision 20910) +++ src/saveload/afterload.cpp (working copy) @@ -2320,6 +2320,55 @@ } } + if (CheckSavegameVersion(149)) { + Trackdir _road_exit_tunnel_state[DIAGDIR_END] = {TRACKDIR_X_SW, TRACKDIR_Y_NW, TRACKDIR_X_NE, TRACKDIR_Y_SE}; + Vehicle *v; + FOR_ALL_VEHICLES(v) { + if (v->type != VEH_TRAIN && v->type != VEH_ROAD) continue; + if (!IsTunnelTile(v->tile)) continue; + + TileIndex tile = TileVirtXY(v->x_pos, v->y_pos); + if (v->tile != tile && GetOtherTunnelBridgeEnd(v->tile) != tile) continue; + + DiagDirection dir = GetTunnelBridgeDirection(tile); + + v->tile = tile; + switch (v->type) { + case VEH_TRAIN: { + Train *t = Train::From(v); + if (t->track == TRACK_BIT_WORMHOLE) { + t->track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y); + } else { + continue; + } + } break; + + case VEH_ROAD: { + RoadVehicle *rv = RoadVehicle::From(v); + if (rv->state == RVSB_WORMHOLE) { + rv->state = _road_exit_tunnel_state[dir]; + rv->frame = RVC_DEFAULT_START_FRAME; + } else { + continue; + } + } break; + + default: NOT_REACHED(); + } + + if (dir != DirToDiagDir(v->direction)) continue; + + switch (dir) { + default: NOT_REACHED(); + case DIAGDIR_NE: if ((v->x_pos & 0xF) != 0) continue; break; + case DIAGDIR_SE: if ((v->y_pos & 0xF) != TILE_SIZE - 1) continue; break; + case DIAGDIR_SW: if ((v->x_pos & 0xF) != TILE_SIZE - 1) continue; break; + case DIAGDIR_NW: if ((v->y_pos & 0xF) != 0) continue; break; + } + VehicleEnterTile(v, tile, v->x_pos, v->y_pos); // just before leaving ramp and enter wormhole + } + } + /* Road stops is 'only' updating some caches */ AfterLoadRoadStops(); AfterLoadLabelMaps();