# HG changeset patch # User rubidium # Date 2010-11-14 21:39:12 # Node ID eb27f731001d552a1ae476e6a9967b999d0018a2 # Parent 4fc43945af2247a57e8b9d144388918c88694656 (svn r21195) -Fix [FS#4230] (r21135): in some corner cases the savegame conversion didn't do the right thing diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -2346,10 +2346,18 @@ bool AfterLoadGame() 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(); + } + v->tile = vtile; + + if (hidden) { v->vehstatus |= VS_HIDDEN; switch (v->type) { @@ -2357,10 +2365,7 @@ bool AfterLoadGame() 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. */ - v->tile = vtile; + } else { v->vehstatus &= ~VS_HIDDEN; switch (v->type) {