1
0
Fork 0

(svn r16597) [0.7] -Backport from trunk:

- Fix: Also catch FPEs in saveload and the warning about missing NewGRFs; only happens when assertions are disabled and NewGRFs are missing (r16572)
- Fix: In some cases, train could be stuck in depot [FS#2974] (r16571)
- Fix: [NoAI] AIMarine::AreWaterTilesConnected did not return true for bridge head<>neighbouring water tile (r16563)
- Fix: Removing of duplicates of base graphics set could behave randomly (r16548)
release/0.7
rubidium 2009-06-18 22:14:13 +00:00
parent a00a4b5ad8
commit 2d454f37f0
4 changed files with 19 additions and 10 deletions

View File

@ -55,13 +55,13 @@
DiagDirection to_other_tile = (TileX(t1) == TileX(t2)) ? DIAGDIR_SE : DIAGDIR_SW; DiagDirection to_other_tile = (TileX(t1) == TileX(t2)) ? DIAGDIR_SE : DIAGDIR_SW;
/* Determine the reachable tracks from the shared edge */ /* Determine the reachable tracks from the shared edge */
TrackBits gtts2 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t2, TRANSPORT_WATER, 0, to_other_tile)) & ::DiagdirReachesTracks(to_other_tile); TrackBits gtts1 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t1, TRANSPORT_WATER, 0, to_other_tile)) & ::DiagdirReachesTracks(to_other_tile);
if (gtts2 == TRACK_BIT_NONE) return false; if (gtts1 == TRACK_BIT_NONE) return false;
to_other_tile = ReverseDiagDir(to_other_tile); to_other_tile = ReverseDiagDir(to_other_tile);
TrackBits gtts1 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t1, TRANSPORT_WATER, 0, to_other_tile)) & ::DiagdirReachesTracks(to_other_tile); TrackBits gtts2 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t2, TRANSPORT_WATER, 0, to_other_tile)) & ::DiagdirReachesTracks(to_other_tile);
return gtts1 != TRACK_BIT_NONE; return gtts2 != TRACK_BIT_NONE;
} }
/* static */ bool AIMarine::BuildWaterDepot(TileIndex tile, TileIndex front) /* static */ bool AIMarine::BuildWaterDepot(TileIndex tile, TileIndex front)

View File

@ -469,8 +469,8 @@ bool OBGFileScanner::AddFile(const char *filename, size_t basepath_length)
} }
if (duplicate != NULL) { if (duplicate != NULL) {
/* The more complete graphics set takes precedence over the version number. */ /* The more complete graphics set takes precedence over the version number. */
if ((duplicate->files == graphics->files && duplicate->version >= graphics->version) || if ((duplicate->found_grfs == graphics->found_grfs && duplicate->version >= graphics->version) ||
duplicate->files > graphics->files) { duplicate->found_grfs > graphics->found_grfs) {
DEBUG(grf, 1, "Not adding %s (%i) as base graphics set (duplicate)", graphics->name, graphics->version); DEBUG(grf, 1, "Not adding %s (%i) as base graphics set (duplicate)", graphics->name, graphics->version);
delete graphics; delete graphics;
} else { } else {

View File

@ -239,6 +239,7 @@ static bool InitializeWindowsAndCaches()
typedef void (CDECL *SignalHandlerPointer)(int); typedef void (CDECL *SignalHandlerPointer)(int);
static SignalHandlerPointer _prev_segfault = NULL; static SignalHandlerPointer _prev_segfault = NULL;
static SignalHandlerPointer _prev_abort = NULL; static SignalHandlerPointer _prev_abort = NULL;
static SignalHandlerPointer _prev_fpe = NULL;
static void CDECL HandleSavegameLoadCrash(int signum); static void CDECL HandleSavegameLoadCrash(int signum);
@ -250,6 +251,7 @@ static void SetSignalHandlers()
{ {
_prev_segfault = signal(SIGSEGV, HandleSavegameLoadCrash); _prev_segfault = signal(SIGSEGV, HandleSavegameLoadCrash);
_prev_abort = signal(SIGABRT, HandleSavegameLoadCrash); _prev_abort = signal(SIGABRT, HandleSavegameLoadCrash);
_prev_fpe = signal(SIGFPE, HandleSavegameLoadCrash);
} }
/** /**
@ -259,6 +261,7 @@ static void ResetSignalHandlers()
{ {
signal(SIGSEGV, _prev_segfault); signal(SIGSEGV, _prev_segfault);
signal(SIGABRT, _prev_abort); signal(SIGABRT, _prev_abort);
signal(SIGFPE, _prev_fpe);
} }
/** /**
@ -301,7 +304,13 @@ static void CDECL HandleSavegameLoadCrash(int signum)
ShowInfo(buffer); ShowInfo(buffer);
SignalHandlerPointer call = signum == SIGSEGV ? _prev_segfault : _prev_abort; SignalHandlerPointer call = NULL;
switch (signum) {
case SIGSEGV: call = _prev_segfault; break;
case SIGABRT: call = _prev_abort; break;
case SIGFPE: call = _prev_fpe; break;
default: NOT_REACHED();
}
if (call != NULL) call(signum); if (call != NULL) call(signum);
} }

View File

@ -2387,7 +2387,7 @@ static bool CheckTrainStayInDepot(Vehicle *v)
} }
/* We are leaving a depot, but have to go to the exact same one; re-enter */ /* We are leaving a depot, but have to go to the exact same one; re-enter */
if (v->tile == v->dest_tile) { if (v->current_order.IsType(OT_GOTO_DEPOT) && v->tile == v->dest_tile) {
/* We need to have a reservation for this to work. */ /* We need to have a reservation for this to work. */
if (GetDepotWaypointReservation(v->tile)) return true; if (GetDepotWaypointReservation(v->tile)) return true;
SetDepotWaypointReservation(v->tile, true); SetDepotWaypointReservation(v->tile, true);