changeset 14676:353df593bee0 draft

(svn r19255) -Codechange: encapsulate GRFIdentifier in GRFConfig instead of subclassing it
author yexo <yexo@openttd.org>
date Thu, 25 Feb 2010 20:05:31 +0000
parents 9ab896cb4e0c
children 96bf81ef9c9e
files src/gamelog.cpp src/network/core/udp.cpp src/network/network_client.cpp src/network/network_gamelist.cpp src/network/network_gui.cpp src/network/network_server.cpp src/network/network_udp.cpp src/newgrf.cpp src/newgrf_config.cpp src/newgrf_config.h src/newgrf_gui.cpp src/saveload/afterload.cpp src/saveload/newgrf_sl.cpp src/saveload/oldloader_sl.cpp src/settings.cpp
diffstat 15 files changed, 75 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/src/gamelog.cpp
+++ b/src/gamelog.cpp
@@ -643,10 +643,10 @@
 		const GRFConfig *og = ol->grf[o];
 		const GRFConfig *ng = nl->grf[n];
 
-		if (og->grfid != ng->grfid) {
+		if (og->ident.grfid != ng->ident.grfid) {
 			uint oi, ni;
 			for (oi = 0; oi < ol->n; oi++) {
-				if (ol->grf[oi]->grfid == nl->grf[n]->grfid) break;
+				if (ol->grf[oi]->ident.grfid == nl->grf[n]->ident.grfid) break;
 			}
 			if (oi < o) {
 				/* GRF was moved, this change has been logged already */
@@ -659,7 +659,7 @@
 				continue;
 			}
 			for (ni = 0; ni < nl->n; ni++) {
-				if (nl->grf[ni]->grfid == ol->grf[o]->grfid) break;
+				if (nl->grf[ni]->ident.grfid == ol->grf[o]->ident.grfid) break;
 			}
 			if (ni < n) {
 				/* GRF was moved, this change has been logged already */
@@ -668,7 +668,7 @@
 			}
 			if (ni == nl->n) {
 				/* GRF couldn't be found in the NEW list, GRF was REMOVED */
-				GamelogGRFRemove(ol->grf[o++]->grfid);
+				GamelogGRFRemove(ol->grf[o++]->ident.grfid);
 				continue;
 			}
 
@@ -682,18 +682,18 @@
 
 			if (ni >= oi) { // prefer the one that is moved further
 				/* GRF was moved down */
-				GamelogGRFMove(ol->grf[o++]->grfid, ni);
+				GamelogGRFMove(ol->grf[o++]->ident.grfid, ni);
 			} else {
-				GamelogGRFMove(nl->grf[n++]->grfid, -(int)oi);
+				GamelogGRFMove(nl->grf[n++]->ident.grfid, -(int)oi);
 			}
 		} else {
-			if (memcmp(og->md5sum, ng->md5sum, sizeof(og->md5sum)) != 0) {
+			if (memcmp(og->ident.md5sum, ng->ident.md5sum, sizeof(og->ident.md5sum)) != 0) {
 				/* md5sum changed, probably loading 'compatible' GRF */
-				GamelogGRFCompatible(nl->grf[n]);
+				GamelogGRFCompatible(&nl->grf[n]->ident);
 			}
 
 			if (og->num_params != ng->num_params || memcmp(og->param, ng->param, og->num_params * sizeof(og->param[0])) != 0) {
-				GamelogGRFParameters(ol->grf[o]->grfid);
+				GamelogGRFParameters(ol->grf[o]->ident.grfid);
 			}
 
 			o++;
@@ -701,8 +701,8 @@
 		}
 	}
 
-	while (o < ol->n) GamelogGRFRemove(ol->grf[o++]->grfid); // remaining GRFs were removed ...
-	while (n < nl->n) GamelogGRFAdd   (nl->grf[n++]);    // ... or added
+	while (o < ol->n) GamelogGRFRemove(ol->grf[o++]->ident.grfid); // remaining GRFs were removed ...
+	while (n < nl->n) GamelogGRFAdd   (nl->grf[n++]);              // ... or added
 
 	free(ol);
 	free(nl);
--- a/src/network/core/udp.cpp
+++ b/src/network/core/udp.cpp
@@ -181,7 +181,7 @@
 
 		/* Send actual GRF Identifications */
 		for (c = info->grfconfig; c != NULL; c = c->next) {
-			if (!HasBit(c->flags, GCF_STATIC)) this->Send_GRFIdentifier(p, c);
+			if (!HasBit(c->flags, GCF_STATIC)) this->Send_GRFIdentifier(p, &c->ident);
 		}
 	}
 
@@ -239,7 +239,7 @@
 
 			for (i = 0; i < num_grfs; i++) {
 				GRFConfig *c = CallocT<GRFConfig>(1);
-				this->Recv_GRFIdentifier(p, c);
+				this->Recv_GRFIdentifier(p, &c->ident);
 				this->HandleIncomingNetworkGameInfoGRFConfig(c);
 
 				/* Append GRFConfig to the list */
--- a/src/network/network_client.cpp
+++ b/src/network/network_client.cpp
@@ -512,15 +512,15 @@
 	/* Check all GRFs */
 	for (; grf_count > 0; grf_count--) {
 		GRFConfig c;
-		MY_CLIENT->Recv_GRFIdentifier(p, &c);
+		MY_CLIENT->Recv_GRFIdentifier(p, &c.ident);
 
 		/* Check whether we know this GRF */
-		const GRFConfig *f = FindGRFConfig(c.grfid, c.md5sum);
+		const GRFConfig *f = FindGRFConfig(c.ident.grfid, c.ident.md5sum);
 		if (f == NULL) {
 			/* We do not know this GRF, bail out of initialization */
-			char buf[sizeof(c.md5sum) * 2 + 1];
-			md5sumToString(buf, lastof(buf), c.md5sum);
-			DEBUG(grf, 0, "NewGRF %08X not found; checksum %s", BSWAP32(c.grfid), buf);
+			char buf[sizeof(c.ident.md5sum) * 2 + 1];
+			md5sumToString(buf, lastof(buf), c.ident.md5sum);
+			DEBUG(grf, 0, "NewGRF %08X not found; checksum %s", BSWAP32(c.ident.grfid), buf);
 			ret = NETWORK_RECV_STATUS_NEWGRF_MISMATCH;
 		}
 	}
--- a/src/network/network_gamelist.cpp
+++ b/src/network/network_gamelist.cpp
@@ -172,12 +172,12 @@
 		for (GRFConfig *c = item->info.grfconfig; c != NULL; c = c->next) {
 			assert(HasBit(c->flags, GCF_COPY));
 
-			const GRFConfig *f = FindGRFConfig(c->grfid, c->md5sum);
+			const GRFConfig *f = FindGRFConfig(c->ident.grfid, c->ident.md5sum);
 			if (f == NULL) {
 				/* Don't know the GRF, so mark game incompatible and the (possibly)
 				 * already resolved name for this GRF (another server has sent the
 				 * name of the GRF already */
-				c->name   = FindUnknownGRFName(c->grfid, c->md5sum, true);
+				c->name   = FindUnknownGRFName(c->ident.grfid, c->ident.md5sum, true);
 				c->status = GCS_NOT_FOUND;
 
 				/* If we miss a file, we're obviously incompatible */
--- a/src/network/network_gui.cpp
+++ b/src/network/network_gui.cpp
@@ -797,7 +797,7 @@
 					for (GRFConfig *c = item->info.grfconfig; c != NULL; c = c->next) {
 						if (c->status != GCS_NOT_FOUND) continue;
 
-						const GRFConfig *f = FindGRFConfig(c->grfid, c->md5sum);
+						const GRFConfig *f = FindGRFConfig(c->ident.grfid, c->ident.md5sum);
 						if (f == NULL) {
 							missing_grfs = true;
 							continue;
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -202,7 +202,7 @@
 
 	p->Send_uint8 (grf_count);
 	for (c = _grfconfig; c != NULL; c = c->next) {
-		if (!HasBit(c->flags, GCF_STATIC)) cs->Send_GRFIdentifier(p, c);
+		if (!HasBit(c->flags, GCF_STATIC)) cs->Send_GRFIdentifier(p, &c->ident);
 	}
 
 	cs->Send_Packet(p);
--- a/src/network/network_udp.cpp
+++ b/src/network/network_udp.cpp
@@ -180,16 +180,16 @@
 		GRFConfig c;
 		const GRFConfig *f;
 
-		this->Recv_GRFIdentifier(p, &c);
+		this->Recv_GRFIdentifier(p, &c.ident);
 
 		/* Find the matching GRF file */
-		f = FindGRFConfig(c.grfid, c.md5sum);
+		f = FindGRFConfig(c.ident.grfid, c.ident.md5sum);
 		if (f == NULL) continue; // The GRF is unknown to this server
 
 		/* If the reply might exceed the size of the packet, only reply
 		 * the current list and do not send the other data.
 		 * The name could be an empty string, if so take the filename. */
-		packet_len += sizeof(c.grfid) + sizeof(c.md5sum) +
+		packet_len += sizeof(c.ident.grfid) + sizeof(c.ident.md5sum) +
 				min(strlen((!StrEmpty(f->name)) ? f->name : f->filename) + 1, (size_t)NETWORK_GRF_NAME_LENGTH);
 		if (packet_len > SEND_MTU - 4) { // 4 is 3 byte header + grf count in reply
 			break;
@@ -207,7 +207,7 @@
 
 		/* The name could be an empty string, if so take the filename */
 		strecpy(name, (!StrEmpty(in_reply[i]->name)) ? in_reply[i]->name : in_reply[i]->filename, lastof(name));
-		this->Send_GRFIdentifier(&packet, in_reply[i]);
+		this->Send_GRFIdentifier(&packet, &in_reply[i]->ident);
 		packet.Send_string(name);
 	}
 
@@ -268,7 +268,7 @@
 
 			packet.Send_uint8(in_request_count);
 			for (i = 0; i < in_request_count; i++) {
-				this->Send_GRFIdentifier(&packet, in_request[i]);
+				this->Send_GRFIdentifier(&packet, &in_request[i]->ident);
 			}
 
 			this->SendPacket(&packet, &item->address);
@@ -343,7 +343,7 @@
 		char name[NETWORK_GRF_NAME_LENGTH];
 		GRFConfig c;
 
-		this->Recv_GRFIdentifier(p, &c);
+		this->Recv_GRFIdentifier(p, &c.ident);
 		p->Recv_string(name, sizeof(name));
 
 		/* An empty name is not possible under normal circumstances
@@ -353,7 +353,7 @@
 		/* Finds the fake GRFConfig for the just read GRF ID and MD5sum tuple.
 		 * If it exists and not resolved yet, then name of the fake GRF is
 		 * overwritten with the name from the reply. */
-		unknown_name = FindUnknownGRFName(c.grfid, c.md5sum, false);
+		unknown_name = FindUnknownGRFName(c.ident.grfid, c.ident.md5sum, false);
 		if (unknown_name != NULL && strcmp(unknown_name, UNKNOWN_GRF_NAME_PLACEHOLDER) == 0) {
 			ttd_strlcpy(unknown_name, name, NETWORK_GRF_NAME_LENGTH);
 		}
@@ -363,12 +363,12 @@
 void ClientNetworkUDPSocketHandler::HandleIncomingNetworkGameInfoGRFConfig(GRFConfig *config)
 {
 	/* Find the matching GRF file */
-	const GRFConfig *f = FindGRFConfig(config->grfid, config->md5sum);
+	const GRFConfig *f = FindGRFConfig(config->ident.grfid, config->ident.md5sum);
 	if (f == NULL) {
 		/* Don't know the GRF, so mark game incompatible and the (possibly)
 		 * already resolved name for this GRF (another server has sent the
 		 * name of the GRF already */
-		config->name   = FindUnknownGRFName(config->grfid, config->md5sum, true);
+		config->name   = FindUnknownGRFName(config->ident.grfid, config->ident.md5sum, true);
 		config->status = GCS_NOT_FOUND;
 	} else {
 		config->filename  = f->filename;
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -4258,7 +4258,7 @@
 		return;
 	}
 
-	GRFLocation location(_cur_grfconfig->grfid, _nfo_line + 1);
+	GRFLocation location(_cur_grfconfig->ident.grfid, _nfo_line + 1);
 	GRFLineToSpriteOverride::iterator it = _grf_line_to_action6_sprite_override.find(location);
 	if (it != _grf_line_to_action6_sprite_override.end()) {
 		free(preload_sprite);
@@ -4336,7 +4336,7 @@
 	c->error  = new GRFError(STR_NEWGRF_ERROR_MSG_FATAL, STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC);
 	c->error->data = strdup(_cur_grfconfig->name);
 
-	ClearTemporaryNewGRFData(GetFileByGRFID(c->grfid));
+	ClearTemporaryNewGRFData(GetFileByGRFID(c->ident.grfid));
 }
 
 /* Action 0x07
@@ -4510,7 +4510,7 @@
 	buf->ReadByte();
 	uint32 grfid  = buf->ReadDWord();
 
-	_cur_grfconfig->grfid = grfid;
+	_cur_grfconfig->ident.grfid = grfid;
 
 	/* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */
 	if (GB(grfid, 24, 8) == 0xFF) SetBit(_cur_grfconfig->flags, GCF_SYSTEM);
@@ -5177,7 +5177,7 @@
 		uint32 grfid = buf->ReadDWord();
 
 		/* GRF is unsafe it if tries to deactivate other GRFs */
-		if (grfid != _cur_grfconfig->grfid) {
+		if (grfid != _cur_grfconfig->ident.grfid) {
 			SetBit(_cur_grfconfig->flags, GCF_UNSAFE);
 
 			/* Skip remainder of GRF */
@@ -6304,7 +6304,7 @@
 		/* 0x13 */ { NULL,     NULL,      NULL,            NULL,           NULL,              TranslateGRFStrings, },
 	};
 
-	GRFLocation location(_cur_grfconfig->grfid, _nfo_line);
+	GRFLocation location(_cur_grfconfig->ident.grfid, _nfo_line);
 
 	GRFLineToSpriteOverride::iterator it = _grf_line_to_action6_sprite_override.find(location);
 	if (it == _grf_line_to_action6_sprite_override.end()) {
@@ -6722,7 +6722,7 @@
 				SetBit(c->flags, GCF_RESERVED);
 			} else if (stage == GLS_ACTIVATION) {
 				ClrBit(c->flags, GCF_RESERVED);
-				assert(GetFileByGRFID(c->grfid) == _cur_grffile);
+				assert(GetFileByGRFID(c->ident.grfid) == _cur_grffile);
 				ClearTemporaryNewGRFData(_cur_grffile);
 				BuildCargoTranslationMap();
 				DEBUG(sprite, 2, "LoadNewGRF: Currently %i sprites are loaded", _cur_spriteid);
--- a/src/newgrf_config.cpp
+++ b/src/newgrf_config.cpp
@@ -69,7 +69,7 @@
 		size -= len;
 		checksum.Append(buffer, len);
 	}
-	checksum.Finish(config->md5sum);
+	checksum.Finish(config->ident.md5sum);
 
 	FioFCloseFile(f);
 
@@ -89,7 +89,7 @@
 	LoadNewGRFFile(config, CONFIG_SLOT, GLS_FILESCAN);
 
 	/* Skip if the grfid is 0 (not read) or 0xFFFFFFFF (ttdp system grf) */
-	if (config->grfid == 0 || config->grfid == 0xFFFFFFFF || config->IsOpenTTDBaseGRF()) return false;
+	if (config->ident.grfid == 0 || config->ident.grfid == 0xFFFFFFFF || config->IsOpenTTDBaseGRF()) return false;
 
 	if (is_static) {
 		/* Perform a 'safety scan' for static GRFs */
@@ -200,7 +200,7 @@
 	if (list == NULL) return;
 
 	for (prev = list, cur = list->next; cur != NULL; prev = cur, cur = cur->next) {
-		if (cur->grfid != list->grfid) continue;
+		if (cur->ident.grfid != list->ident.grfid) continue;
 
 		prev->next = cur->next;
 		ClearGRFConfig(&cur);
@@ -257,35 +257,35 @@
 	GRFListCompatibility res = GLC_ALL_GOOD;
 
 	for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
-		const GRFConfig *f = FindGRFConfig(c->grfid, c->md5sum);
+		const GRFConfig *f = FindGRFConfig(c->ident.grfid, c->ident.md5sum);
 		if (f == NULL) {
 			char buf[256];
 
 			/* If we have not found the exactly matching GRF try to find one with the
 			 * same grfid, as it most likely is compatible */
-			f = FindGRFConfig(c->grfid);
+			f = FindGRFConfig(c->ident.grfid);
 			if (f != NULL) {
-				md5sumToString(buf, lastof(buf), c->md5sum);
-				DEBUG(grf, 1, "NewGRF %08X (%s) not found; checksum %s. Compatibility mode on", BSWAP32(c->grfid), c->filename, buf);
+				md5sumToString(buf, lastof(buf), c->ident.md5sum);
+				DEBUG(grf, 1, "NewGRF %08X (%s) not found; checksum %s. Compatibility mode on", BSWAP32(c->ident.grfid), c->filename, buf);
 				SetBit(c->flags, GCF_COMPATIBLE);
 
 				/* Non-found has precedence over compatibility load */
 				if (res != GLC_NOT_FOUND) res = GLC_COMPATIBLE;
-				GamelogGRFCompatible(f);
+				GamelogGRFCompatible(&f->ident);
 				goto compatible_grf;
 			}
 
 			/* No compatible grf was found, mark it as disabled */
-			md5sumToString(buf, lastof(buf), c->md5sum);
-			DEBUG(grf, 0, "NewGRF %08X (%s) not found; checksum %s", BSWAP32(c->grfid), c->filename, buf);
+			md5sumToString(buf, lastof(buf), c->ident.md5sum);
+			DEBUG(grf, 0, "NewGRF %08X (%s) not found; checksum %s", BSWAP32(c->ident.grfid), c->filename, buf);
 
-			GamelogGRFRemove(c->grfid);
+			GamelogGRFRemove(c->ident.grfid);
 
 			c->status = GCS_NOT_FOUND;
 			res = GLC_NOT_FOUND;
 		} else {
 compatible_grf:
-			DEBUG(grf, 1, "Loading GRF %08X from %s", BSWAP32(f->grfid), f->filename);
+			DEBUG(grf, 1, "Loading GRF %08X from %s", BSWAP32(f->ident.grfid), f->filename);
 			/* The filename could be the filename as in the savegame. As we need
 			 * to load the GRF here, we need the correct filename, so overwrite that
 			 * in any case and set the name and info when it is not set already.
@@ -294,7 +294,7 @@
 			if (!HasBit(c->flags, GCF_COPY)) {
 				free(c->filename);
 				c->filename = strdup(f->filename);
-				memcpy(c->md5sum, f->md5sum, sizeof(c->md5sum));
+				memcpy(c->ident.md5sum, f->ident.md5sum, sizeof(c->ident.md5sum));
 				if (c->name == NULL && f->name != NULL) c->name = strdup(f->name);
 				if (c->info == NULL && f->info != NULL) c->info = strdup(f->info);
 				c->error = NULL;
@@ -333,7 +333,7 @@
 			GRFConfig **pd, *d;
 			bool stop = false;
 			for (pd = &_all_grfs; (d = *pd) != NULL; pd = &d->next) {
-				if (c->grfid == d->grfid && memcmp(c->md5sum, d->md5sum, sizeof(c->md5sum)) == 0) added = false;
+				if (c->ident.grfid == d->ident.grfid && memcmp(c->ident.md5sum, d->ident.md5sum, sizeof(c->ident.md5sum)) == 0) added = false;
 				/* Because there can be multiple grfs with the same name, make sure we checked all grfs with the same name,
 				 *  before inserting the entry. So insert a new grf at the end of all grfs with the same name, instead of
 				 *  just after the first with the same name. Avoids doubles in the list. */
@@ -419,10 +419,10 @@
 const GRFConfig *FindGRFConfig(uint32 grfid, const uint8 *md5sum)
 {
 	for (const GRFConfig *c = _all_grfs; c != NULL; c = c->next) {
-		if (c->grfid == grfid) {
+		if (c->ident.grfid == grfid) {
 			if (md5sum == NULL) return c;
 
-			if (memcmp(md5sum, c->md5sum, sizeof(c->md5sum)) == 0) return c;
+			if (memcmp(md5sum, c->ident.md5sum, sizeof(c->ident.md5sum)) == 0) return c;
 		}
 	}
 
@@ -486,7 +486,7 @@
 	GRFConfig *c;
 
 	for (c = _grfconfig; c != NULL; c = c->next) {
-		if ((c->grfid & mask) == (grfid & mask)) return c;
+		if ((c->ident.grfid & mask) == (grfid & mask)) return c;
 	}
 
 	return NULL;
@@ -517,5 +517,5 @@
  */
 bool GRFConfig::IsOpenTTDBaseGRF() const
 {
-	return (this->grfid & 0x00FFFFFF) == OPENTTD_GRAPHICS_BASE_GRF_ID;
+	return (this->ident.grfid & 0x00FFFFFF) == OPENTTD_GRAPHICS_BASE_GRF_ID;
 }
--- a/src/newgrf_config.h
+++ b/src/newgrf_config.h
@@ -69,7 +69,8 @@
 };
 
 /** Information about GRF, used in the game and (part of it) in savegames */
-struct GRFConfig : public GRFIdentifier {
+struct GRFConfig {
+	GRFIdentifier ident; ///< grfid and md5sum to uniquely identify newgrfs
 	char *filename;     ///< Filename - either with or without full path
 	char *name;         ///< NOSAVE: GRF name (Action 0x08)
 	char *info;         ///< NOSAVE: GRF info (author, copyright, ...) (Action 0x08)
--- a/src/newgrf_gui.cpp
+++ b/src/newgrf_gui.cpp
@@ -100,12 +100,12 @@
 	}
 
 	/* Prepare and draw GRF ID */
-	snprintf(buff, lengthof(buff), "%08X", BSWAP32(c->grfid));
+	snprintf(buff, lengthof(buff), "%08X", BSWAP32(c->ident.grfid));
 	SetDParamStr(0, buff);
 	y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_GRF_ID);
 
 	/* Prepare and draw MD5 sum */
-	md5sumToString(buff, lastof(buff), c->md5sum);
+	md5sumToString(buff, lastof(buff), c->ident.md5sum);
 	SetDParamStr(0, buff);
 	y = DrawStringMultiLine(x, right, y, bottom, STR_NEWGRF_SETTINGS_MD5SUM);
 
@@ -369,7 +369,7 @@
 
 					/* Find last entry in the list, checking for duplicate grfid on the way */
 					for (list = this->list; *list != NULL; list = &(*list)->next) {
-						if ((*list)->grfid == src->grfid) {
+						if ((*list)->ident.grfid == src->ident.grfid) {
 							ShowErrorMessage(STR_NEWGRF_DUPLICATE_GRFID, INVALID_STRING_ID, WL_INFO);
 							return;
 						}
@@ -862,9 +862,9 @@
 						ci->type = CONTENT_TYPE_NEWGRF;
 						ci->state = ContentInfo::DOES_NOT_EXIST;
 						ttd_strlcpy(ci->name, c->name != NULL ? c->name : c->filename, lengthof(ci->name));
-						ci->unique_id = BSWAP32(c->grfid);
-						memcpy(ci->md5sum, c->md5sum, sizeof(ci->md5sum));
-						if (HasBit(c->flags, GCF_COMPATIBLE)) GamelogGetOriginalGRFMD5Checksum(c->grfid, ci->md5sum);
+						ci->unique_id = BSWAP32(c->ident.grfid);
+						memcpy(ci->md5sum, c->ident.md5sum, sizeof(ci->md5sum));
+						if (HasBit(c->flags, GCF_COMPATIBLE)) GamelogGetOriginalGRFMD5Checksum(c->ident.grfid, ci->md5sum);
 						*cv.Append() = ci;
 					}
 					ShowNetworkContentListWindow(cv.Length() == 0 ? NULL : &cv, CONTENT_TYPE_NEWGRF);
@@ -943,7 +943,7 @@
 				for (GRFConfig *c = this->list; c != NULL; c = c->next) {
 					if (c->status != GCS_NOT_FOUND) continue;
 
-					const GRFConfig *f = FindGRFConfig(c->grfid, c->md5sum);
+					const GRFConfig *f = FindGRFConfig(c->ident.grfid, c->ident.md5sum);
 					if (f == NULL) continue;
 
 					free(c->filename);
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -301,14 +301,14 @@
 static const GRFIdentifier *GetOverriddenIdentifier(const GRFConfig *c)
 {
 	const LoggedAction *la = &_gamelog_action[_gamelog_actions - 1];
-	if (la->at != GLAT_LOAD) return c;
+	if (la->at != GLAT_LOAD) return &c->ident;
 
 	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;
+		if (lc->ct == GLCT_GRFCOMPAT && lc->grfcompat.grfid == c->ident.grfid) return &lc->grfcompat;
 	}
 
-	return c;
+	return &c->ident;
 }
 
 /** Was the saveload crash because of missing NewGRFs? */
@@ -354,13 +354,13 @@
 			const GRFIdentifier *replaced = GetOverriddenIdentifier(c);
 			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);
+			p += seprintf(p, lastof(buffer), "NewGRF %08X (checksum %s) not found.\n  Loaded NewGRF \"%s\" with same GRF ID instead.\n", BSWAP32(c->ident.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);
+			md5sumToString(buf, lastof(buf), c->ident.md5sum);
+			p += seprintf(p, lastof(buffer), "NewGRF %08X (%s) not found; checksum %s.\n", BSWAP32(c->ident.grfid), c->filename, buf);
 			_saveload_crash_with_missing_newgrfs = true;
 		}
 	}
--- a/src/saveload/newgrf_sl.cpp
+++ b/src/saveload/newgrf_sl.cpp
@@ -19,8 +19,8 @@
 
 static const SaveLoad _grfconfig_desc[] = {
 	    SLE_STR(GRFConfig, filename,         SLE_STR,    0x40),
-	    SLE_VAR(GRFConfig, grfid,            SLE_UINT32),
-	    SLE_ARR(GRFConfig, md5sum,           SLE_UINT8,  16),
+	    SLE_VAR(GRFConfig, ident.grfid,      SLE_UINT32),
+	    SLE_ARR(GRFConfig, ident.md5sum,     SLE_UINT8,  16),
 	    SLE_ARR(GRFConfig, param,            SLE_UINT32, 0x80),
 	    SLE_VAR(GRFConfig, num_params,       SLE_UINT8),
 	SLE_CONDVAR(GRFConfig, windows_paletted, SLE_BOOL,   101, SL_MAX_VERSION),
--- a/src/saveload/oldloader_sl.cpp
+++ b/src/saveload/oldloader_sl.cpp
@@ -1520,11 +1520,11 @@
 
 					if (ReadByte(ls) == 1) {
 						GRFConfig *c = CallocT<GRFConfig>(1);
-						c->grfid = grfid;
+						c->ident.grfid = grfid;
 						c->filename = strdup("TTDP game, no information");
 
 						AppendToGRFConfigList(&_grfconfig, c);
-						DEBUG(oldloader, 3, "TTDPatch game using GRF file with GRFID %0X", BSWAP32(c->grfid));
+						DEBUG(oldloader, 3, "TTDPatch game using GRF file with GRFID %0X", BSWAP32(c->ident.grfid));
 					}
 					len -= 5;
 				};
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -1224,7 +1224,7 @@
 		/* Check for duplicate GRFID (will also check for duplicate filenames) */
 		bool duplicate = false;
 		for (const GRFConfig *gc = first; gc != NULL; gc = gc->next) {
-			if (gc->grfid == c->grfid) {
+			if (gc->ident.grfid == c->ident.grfid) {
 				ShowInfoF("ini: ignoring  NewGRF '%s': duplicate GRF ID with '%s'", item->name, gc->filename);
 				duplicate = true;
 				break;