diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 67f4f32a2d..9086168928 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -352,6 +352,14 @@ char *CrashLog::FillCrashLog(char *buffer, const char *last) const { time_t cur_time = time(NULL); buffer += seprintf(buffer, last, "*** OpenTTD Crash Report ***\n\n"); + + if (GamelogTestEmergency()) { + buffer += seprintf(buffer, last, "-=-=- As you loaded an emergency savegame no crash information would ordinarily be generated. -=-=-\n\n"); + } + if (SaveloadCrashWithMissingNewGRFs()) { + buffer += seprintf(buffer, last, "-=-=- As you loaded a savegame for which you do not have the required NewGRFs no crash information would ordinarily be generated. -=-=-\n\n"); + } + buffer += seprintf(buffer, last, "Crash at: %s", asctime(gmtime(&cur_time))); YearMonthDay ymd; @@ -536,6 +544,22 @@ bool CrashLog::MakeCrashLog() const if (VideoDriver::GetInstance() != NULL) VideoDriver::GetInstance()->Stop(); } +/* static */ const char *CrashLog::GetAbortCrashlogReason() +{ + if (_settings_client.gui.developer > 0) return NULL; + + if (GamelogTestEmergency()) { + return "As you loaded an emergency savegame no crash information will be generated.\n"; + } + + if (SaveloadCrashWithMissingNewGRFs()) { + return "As you loaded an savegame for which you do not have the required NewGRFs\n" \ + "no crash information will be generated.\n"; + } + + return NULL; +} + #if defined(WITH_BFD) sym_info_bfd::sym_info_bfd(bfd_vma addr_) : addr(addr_), abfd(NULL), syms(NULL), sym_count(0), file_name(NULL), function_name(NULL), function_addr(0), line(0), found(false) {} diff --git a/src/crashlog.h b/src/crashlog.h index c59f73aba8..8b9cd3aae1 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -138,6 +138,8 @@ public: static void AfterCrashLogCleanup(); inline const char *GetMessage() const { return this->message; } + + static const char *GetAbortCrashlogReason(); }; #endif /* CRASHLOG_H */ diff --git a/src/os/macosx/crashlog_osx.cpp b/src/os/macosx/crashlog_osx.cpp index ad258bbc91..c3f6ea5fef 100644 --- a/src/os/macosx/crashlog_osx.cpp +++ b/src/os/macosx/crashlog_osx.cpp @@ -226,16 +226,10 @@ void CDECL HandleCrash(int signum) signal(*i, SIG_DFL); } - if (GamelogTestEmergency()) { + const char *abort_reason = CrashLog::GetAbortCrashlogReason(); + if (abort_reason != NULL) { ShowMacDialog("A serious fault condition occurred in the game. The game will shut down.", - "As you loaded an emergency savegame no crash information will be generated.\n", - "Quit"); - abort(); - } - - if (SaveloadCrashWithMissingNewGRFs()) { - ShowMacDialog("A serious fault condition occurred 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", + abort_reason, "Quit"); abort(); } diff --git a/src/os/unix/crashlog_unix.cpp b/src/os/unix/crashlog_unix.cpp index 8816b70dd1..3b1204874f 100644 --- a/src/os/unix/crashlog_unix.cpp +++ b/src/os/unix/crashlog_unix.cpp @@ -565,16 +565,10 @@ static void CDECL HandleCrash(int signum) signal(*i, SIG_DFL); } - if (GamelogTestEmergency()) { + const char *abort_reason = CrashLog::GetAbortCrashlogReason(); + if (abort_reason != NULL) { printf("A serious fault condition occurred in the game. The game will shut down.\n"); - printf("As you loaded an emergency savegame no crash information will be generated.\n"); - abort(); - } - - if (SaveloadCrashWithMissingNewGRFs()) { - printf("A serious fault condition occurred 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"); + printf(abort_reason); abort(); } diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 9c77c878db..5552b30119 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -540,23 +540,15 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep) ExitProcess(2); } - if (GamelogTestEmergency()) { - static const TCHAR _emergency_crash[] = - _T("A serious fault condition occurred in the game. The game will shut down.\n") - _T("As you loaded an emergency savegame no crash information will be generated.\n"); + const char *abort_reason = CrashLog::GetAbortCrashlogReason(); + if (abort_reason != NULL) { + TCHAR _emergency_crash[512]; + _sntprintf(_emergency_crash, lengthof(_emergency_crash), + _T("A serious fault condition occurred in the game. The game will shut down.\n"), OTTD2FS(abort_reason)); MessageBox(NULL, _emergency_crash, _T("Fatal Application Failure"), MB_ICONERROR); ExitProcess(3); } - if (SaveloadCrashWithMissingNewGRFs()) { - static const TCHAR _saveload_crash[] = - _T("A serious fault condition occurred 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; char *buf = log->FillCrashLog(log->crashlog, lastof(log->crashlog));