summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-01-16 19:08:33 +0000
committerrubidium <rubidium@openttd.org>2010-01-16 19:08:33 +0000
commit251ffaa000b66821ba3133db154336ab847f57b9 (patch)
tree7ee50b7519244f92e5e07c207f9266c4f9407bbe
parent7e7ec4f25043e7218b6b40f5be42c71a3abc3a12 (diff)
downloadopenttd-251ffaa000b66821ba3133db154336ab847f57b9.tar.xz
(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
-rw-r--r--src/os/macosx/crashlog_osx.cpp8
-rw-r--r--src/os/unix/crashlog_unix.cpp8
-rw-r--r--src/os/windows/crashlog_win.cpp10
-rw-r--r--src/saveload/afterload.cpp15
-rw-r--r--src/saveload/saveload.h2
5 files changed, 43 insertions, 0 deletions
diff --git a/src/os/macosx/crashlog_osx.cpp b/src/os/macosx/crashlog_osx.cpp
index df17366af..77a363237 100644
--- a/src/os/macosx/crashlog_osx.cpp
+++ b/src/os/macosx/crashlog_osx.cpp
@@ -13,6 +13,7 @@
#include "../../crashlog.h"
#include "../../string_func.h"
#include "../../gamelog.h"
+#include "../../saveload/saveload.h"
#include "macos.h"
#include <errno.h>
@@ -230,6 +231,13 @@ void CDECL HandleCrash(int signum)
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);
log.MakeCrashLog();
log.DisplayCrashDialog();
diff --git a/src/os/unix/crashlog_unix.cpp b/src/os/unix/crashlog_unix.cpp
index c8314f5c8..72d023825 100644
--- a/src/os/unix/crashlog_unix.cpp
+++ b/src/os/unix/crashlog_unix.cpp
@@ -13,6 +13,7 @@
#include "../../crashlog.h"
#include "../../string_func.h"
#include "../../gamelog.h"
+#include "../../saveload/saveload.h"
#include <errno.h>
#include <signal.h>
@@ -156,6 +157,13 @@ static void CDECL HandleCrash(int signum)
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);
log.MakeCrashLog();
diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp
index 0d5b60040..30a4cf7db 100644
--- a/src/os/windows/crashlog_win.cpp
+++ b/src/os/windows/crashlog_win.cpp
@@ -18,6 +18,7 @@
#include "../../fileio_func.h"
#include "../../strings_func.h"
#include "../../gamelog.h"
+#include "../../saveload/saveload.h"
#include <windows.h>
#include <signal.h>
@@ -378,6 +379,15 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep)
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::current = log;
log->FillCrashLog(log->crashlog, lastof(log->crashlog));
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index 0a4c44a45..72c0635d0 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -311,6 +311,19 @@ static const GRFIdentifier *GetOverriddenIdentifier(const GRFConfig *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
* the savegame loading process; especially when there's problems with the
@@ -342,11 +355,13 @@ static void CDECL HandleSavegameLoadCrash(int signum)
char buf[40];
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);
+ _saveload_crash_with_missing_newgrfs = true;
}
if (c->status == GCS_NOT_FOUND) {
char buf[40];
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);
+ _saveload_crash_with_missing_newgrfs = true;
}
}
diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h
index 91ccf3404..b5218456c 100644
--- a/src/saveload/saveload.h
+++ b/src/saveload/saveload.h
@@ -324,6 +324,8 @@ void SlArray(void *array, size_t length, VarType conv);
void SlObject(void *object, const SaveLoad *sld);
bool SlObjectMember(void *object, const SaveLoad *sld);
+bool SaveloadCrashWithMissingNewGRFs();
+
extern char _savegame_format[8];
#endif /* SAVELOAD_H */