From 31a6ce56432f31a973d9adbf60c76f01d8dc4a9a Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 22 Aug 2009 20:20:20 +0000 Subject: (svn r17267) -Change [FS#3139]: mention the MD5 checksum of the original NewGRF in the "saveload failed horribly"-error message and make it more clear that the filename is of the current NewGRF --- src/saveload/afterload.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index de5916370..2730e17d9 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -18,6 +18,7 @@ #include "../train.h" #include "../string_func.h" #include "../gamelog.h" +#include "../gamelog_internal.h" #include "../network/network.h" #include "../gfxinit.h" #include "../functions.h" @@ -274,6 +275,24 @@ static void ResetSignalHandlers() signal(SIGFPE, _prev_fpe); } +/** + * Try to find the overridden GRF identifier of the given GRF. + * @param c the GRF to get the 'previous' version of. + * @return the GRF identifier or \a c if none could be found. + */ +static const GRFIdentifier *GetOverriddenIdentifier(const GRFConfig *c) +{ + const LoggedAction *la = &_gamelog_action[_gamelog_actions - 1]; + if (la->at != GLAT_LOAD) return c; + + const LoggedChange *lcend = &la->change[la->changes]; + for (const LoggedChange *lc = la->change; lc != lcend; lc++) { + if (lc->ct == GLCT_GRFCOMPAT && lc->grfcompat.grfid == c->grfid) return &lc->grfcompat; + } + + return c; +} + /** * 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 @@ -299,16 +318,17 @@ static void CDECL HandleSavegameLoadCrash(int signum) "savegame still crashes when all NewGRFs are found you should file a\n" "bug report. The missing NewGRFs are:\n"); - for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) { + for (const GRFConfig *c = _grfconfig; c != NULL; c = c->next) { if (HasBit(c->flags, GCF_COMPATIBLE)) { + const GRFIdentifier *replaced = GetOverriddenIdentifier(c); char buf[40]; - md5sumToString(buf, lastof(buf), c->md5sum); - p += seprintf(p, lastof(buffer), "NewGRF %08X (%s) not found; checksum %s. Tried another NewGRF with same GRF ID\n", BSWAP32(c->grfid), c->filename, buf); + 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); } 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); + p += seprintf(p, lastof(buffer), "NewGRF %08X (%s) not found; checksum %s.\n", BSWAP32(c->grfid), c->filename, buf); } } -- cgit v1.2.3-70-g09d2