(svn r18831) -Change [FS#3537]: do not go into the crashlog handler in case loading a savegame misses with missing NewGRFs. This way the load game crash handler gets better visibility and the user is instructed to find the missing NewGRFs before filing a bug report

This commit is contained in:
rubidium 2010-01-16 19:08:33 +00:00
parent 7e7ec4f250
commit 251ffaa000
5 changed files with 43 additions and 0 deletions

View File

@ -13,6 +13,7 @@
#include "../../crashlog.h" #include "../../crashlog.h"
#include "../../string_func.h" #include "../../string_func.h"
#include "../../gamelog.h" #include "../../gamelog.h"
#include "../../saveload/saveload.h"
#include "macos.h" #include "macos.h"
#include <errno.h> #include <errno.h>
@ -230,6 +231,13 @@ void CDECL HandleCrash(int signum)
abort(); abort();
} }
if (SaveloadCrashWithMissingNewGRFs()) {
ShowMacDialog("A serious fault condition occured in the game. The game will shut down.",
"As you loaded an savegame for which you do not have the required NewGRFs no crash information will be generated.\n",
"Quit");
abort();
}
CrashLogOSX log(signum); CrashLogOSX log(signum);
log.MakeCrashLog(); log.MakeCrashLog();
log.DisplayCrashDialog(); log.DisplayCrashDialog();

View File

@ -13,6 +13,7 @@
#include "../../crashlog.h" #include "../../crashlog.h"
#include "../../string_func.h" #include "../../string_func.h"
#include "../../gamelog.h" #include "../../gamelog.h"
#include "../../saveload/saveload.h"
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
@ -156,6 +157,13 @@ static void CDECL HandleCrash(int signum)
abort(); abort();
} }
if (SaveloadCrashWithMissingNewGRFs()) {
printf("A serious fault condition occured in the game. The game will shut down.\n");
printf("As you loaded an savegame for which you do not have the required NewGRFs\n");
printf("no crash information will be generated.\n");
abort();
}
CrashLogUnix log(signum); CrashLogUnix log(signum);
log.MakeCrashLog(); log.MakeCrashLog();

View File

@ -18,6 +18,7 @@
#include "../../fileio_func.h" #include "../../fileio_func.h"
#include "../../strings_func.h" #include "../../strings_func.h"
#include "../../gamelog.h" #include "../../gamelog.h"
#include "../../saveload/saveload.h"
#include <windows.h> #include <windows.h>
#include <signal.h> #include <signal.h>
@ -378,6 +379,15 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep)
ExitProcess(3); ExitProcess(3);
} }
if (SaveloadCrashWithMissingNewGRFs()) {
static const TCHAR _saveload_crash[] =
_T("A serious fault condition occured in the game. The game will shut down.\n")
_T("As you loaded an savegame for which you do not have the required NewGRFs\n")
_T("no crash information will be generated.\n");
MessageBox(NULL, _saveload_crash, _T("Fatal Application Failure"), MB_ICONERROR);
ExitProcess(3);
}
CrashLogWindows *log = new CrashLogWindows(ep); CrashLogWindows *log = new CrashLogWindows(ep);
CrashLogWindows::current = log; CrashLogWindows::current = log;
log->FillCrashLog(log->crashlog, lastof(log->crashlog)); log->FillCrashLog(log->crashlog, lastof(log->crashlog));

View File

@ -311,6 +311,19 @@ static const GRFIdentifier *GetOverriddenIdentifier(const GRFConfig *c)
return c; return c;
} }
/** Was the saveload crash because of missing NewGRFs? */
static bool _saveload_crash_with_missing_newgrfs = false;
/**
* Did loading the savegame cause a crash? If so,
* were NewGRFs missing?
* @return when the saveload crashed due to missing NewGRFs.
*/
bool SaveloadCrashWithMissingNewGRFs()
{
return _saveload_crash_with_missing_newgrfs;
}
/** /**
* Signal handler used to give a user a more useful report for crashes during * Signal handler used to give a user a more useful report for crashes during
* the savegame loading process; especially when there's problems with the * the savegame loading process; especially when there's problems with the
@ -342,11 +355,13 @@ static void CDECL HandleSavegameLoadCrash(int signum)
char buf[40]; char buf[40];
md5sumToString(buf, lastof(buf), replaced->md5sum); md5sumToString(buf, lastof(buf), replaced->md5sum);
p += seprintf(p, lastof(buffer), "NewGRF %08X (checksum %s) not found.\n Loaded NewGRF \"%s\" with same GRF ID instead.\n", BSWAP32(c->grfid), buf, c->filename); p += seprintf(p, lastof(buffer), "NewGRF %08X (checksum %s) not found.\n Loaded NewGRF \"%s\" with same GRF ID instead.\n", BSWAP32(c->grfid), buf, c->filename);
_saveload_crash_with_missing_newgrfs = true;
} }
if (c->status == GCS_NOT_FOUND) { if (c->status == GCS_NOT_FOUND) {
char buf[40]; char buf[40];
md5sumToString(buf, lastof(buf), c->md5sum); md5sumToString(buf, lastof(buf), c->md5sum);
p += seprintf(p, lastof(buffer), "NewGRF %08X (%s) not found; checksum %s.\n", BSWAP32(c->grfid), c->filename, buf); p += seprintf(p, lastof(buffer), "NewGRF %08X (%s) not found; checksum %s.\n", BSWAP32(c->grfid), c->filename, buf);
_saveload_crash_with_missing_newgrfs = true;
} }
} }

View File

@ -324,6 +324,8 @@ void SlArray(void *array, size_t length, VarType conv);
void SlObject(void *object, const SaveLoad *sld); void SlObject(void *object, const SaveLoad *sld);
bool SlObjectMember(void *object, const SaveLoad *sld); bool SlObjectMember(void *object, const SaveLoad *sld);
bool SaveloadCrashWithMissingNewGRFs();
extern char _savegame_format[8]; extern char _savegame_format[8];
#endif /* SAVELOAD_H */ #endif /* SAVELOAD_H */