changeset 14279:22e76a982410 draft

(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
author rubidium <rubidium@openttd.org>
date Sat, 16 Jan 2010 19:08:33 +0000
parents d897da0fa0df
children 1a19aa34b237
files src/os/macosx/crashlog_osx.cpp src/os/unix/crashlog_unix.cpp src/os/windows/crashlog_win.cpp src/saveload/afterload.cpp src/saveload/saveload.h
diffstat 5 files changed, 43 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 		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();
--- 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 @@
 		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();
 
--- 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 @@
 		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));
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -311,6 +311,19 @@
 	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 @@
 			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;
 		}
 	}
 
--- a/src/saveload/saveload.h
+++ b/src/saveload/saveload.h
@@ -324,6 +324,8 @@
 void SlObject(void *object, const SaveLoad *sld);
 bool SlObjectMember(void *object, const SaveLoad *sld);
 
+bool SaveloadCrashWithMissingNewGRFs();
+
 extern char _savegame_format[8];
 
 #endif /* SAVELOAD_H */