mirror of https://github.com/OpenTTD/OpenTTD
(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
parent
a00a4b5ad8
commit
2d454f37f0
|
@ -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)
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -238,7 +238,8 @@ 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);
|
||||||
|
|
||||||
|
@ -249,7 +250,8 @@ static void CDECL HandleSavegameLoadCrash(int signum);
|
||||||
static void SetSignalHandlers()
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue