(svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
authorpeter1138
Thu, 22 Sep 2005 20:35:20 +0000
changeset 2444 5998cd7b06e7
parent 2443 dd16304c477d
child 2445 6304552c6492
(svn r2970) - Newgrf: Allocate spritegroups dynamically; this allows a cargo ID to reference the previous definition of the same cargo ID, instead of causing loops.
newgrf.c
newgrf.h
--- a/newgrf.c	Thu Sep 22 10:31:09 2005 +0000
+++ b/newgrf.c	Thu Sep 22 20:35:20 2005 +0000
@@ -1240,6 +1240,11 @@
 	numloaded = buf[3];
 	numloading = buf[4];
 
+	if (setid >= _cur_grffile->spritegroups_count) {
+		_cur_grffile->spritegroups_count = setid + 1;
+		_cur_grffile->spritegroups = realloc(_cur_grffile->spritegroups, _cur_grffile->spritegroups_count * sizeof(*_cur_grffile->spritegroups));
+	}
+
 	if (numloaded == 0x81 || numloaded == 0x82) {
 		DeterministicSpriteGroup *dg;
 		uint16 groupid;
@@ -1253,13 +1258,7 @@
 		buf += 4; len -= 4;
 		check_length(len, 6, "NewSpriteGroup 0x81/0x82");
 
-		if (setid >= _cur_grffile->spritegroups_count) {
-			_cur_grffile->spritegroups_count = setid + 1;
-			_cur_grffile->spritegroups = realloc(_cur_grffile->spritegroups, _cur_grffile->spritegroups_count * sizeof(*_cur_grffile->spritegroups));
-		}
-
-		group = &_cur_grffile->spritegroups[setid];
-		memset(group, 0, sizeof(*group));
+		group = calloc(1, sizeof(*group));
 		group->type = SGT_DETERMINISTIC;
 		dg = &group->g.determ;
 
@@ -1295,7 +1294,7 @@
 			} else {
 			/* XXX: If multiple surreal sets attach a surreal
 			 * set this way, we are in trouble. */
-				dg->ranges[i].group = _cur_grffile->spritegroups[groupid];
+				dg->ranges[i].group = *_cur_grffile->spritegroups[groupid];
 			}
 
 			dg->ranges[i].low = grf_load_byte(&buf);
@@ -1313,9 +1312,10 @@
 			return;
 		} else {
 			dg->default_group = malloc(sizeof(*dg->default_group));
-			memcpy(dg->default_group, &_cur_grffile->spritegroups[groupid], sizeof(*dg->default_group));
+			memcpy(dg->default_group, _cur_grffile->spritegroups[groupid], sizeof(*dg->default_group));
 		}
 
+		_cur_grffile->spritegroups[setid] = group;
 		return;
 
 	} else if (numloaded == 0x80 || numloaded == 0x83) {
@@ -1329,13 +1329,7 @@
 		len -= 4;
 		check_length(len, 6, "NewSpriteGroup 0x80/0x83");
 
-		if (setid >= _cur_grffile->spritegroups_count) {
-			_cur_grffile->spritegroups_count = setid + 1;
-			_cur_grffile->spritegroups = realloc(_cur_grffile->spritegroups, _cur_grffile->spritegroups_count * sizeof(*_cur_grffile->spritegroups));
-		}
-
-		group = &_cur_grffile->spritegroups[setid];
-		memset(group, 0, sizeof(*group));
+		group = calloc(1, sizeof(*group));
 		group->type = SGT_RANDOMIZED;
 		rg = &group->g.random;
 
@@ -1364,9 +1358,10 @@
 			}
 			/* XXX: If multiple surreal sets attach a surreal
 			 * set this way, we are in trouble. */
-			rg->groups[i] = _cur_grffile->spritegroups[groupid];
+			rg->groups[i] = *_cur_grffile->spritegroups[groupid];
 		}
 
+		_cur_grffile->spritegroups[setid] = group;
 		return;
 	}
 
@@ -1395,12 +1390,7 @@
 		numloading = 16;
 	}
 
-	if (setid >= _cur_grffile->spritegroups_count) {
-		_cur_grffile->spritegroups_count = setid + 1;
-		_cur_grffile->spritegroups = realloc(_cur_grffile->spritegroups, _cur_grffile->spritegroups_count * sizeof(*_cur_grffile->spritegroups));
-	}
-	group = &_cur_grffile->spritegroups[setid];
-	memset(group, 0, sizeof(*group));
+	group = calloc(1, sizeof(*group));
 	group->type = SGT_REAL;
 	rg = &group->g.real;
 
@@ -1424,6 +1414,8 @@
 		rg->loading[i] = _cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents;
 		DEBUG(grf, 8) ("NewSpriteGroup: + rg->loading[%i] = %u (subset %u)", i, rg->loading[i], spriteset_id);
 	}
+
+	_cur_grffile->spritegroups[setid] = group;
 }
 
 /* Action 0x03 */
@@ -1494,7 +1486,7 @@
 					continue;
 				}
 
-				stat->spritegroup[1] = _cur_grffile->spritegroups[groupid];
+				stat->spritegroup[1] = *_cur_grffile->spritegroups[groupid];
 			}
 		}
 
@@ -1512,7 +1504,7 @@
 				uint8 stid = buf[3 + i];
 				StationSpec *stat = &_cur_grffile->stations[stid];
 
-				stat->spritegroup[0] = _cur_grffile->spritegroups[groupid];
+				stat->spritegroup[0] = *_cur_grffile->spritegroups[groupid];
 				stat->grfid = _cur_grffile->grfid;
 				SetCustomStation(stid, stat);
 				stat->sclass = STAT_CLASS_NONE;
@@ -1582,9 +1574,9 @@
 
 			if (wagover) {
 				// TODO: No multiple cargo types per vehicle yet. --pasky
-				SetWagonOverrideSprites(engine, &_cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
+				SetWagonOverrideSprites(engine, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
 			} else {
-				SetCustomEngineSprites(engine, ctype, &_cur_grffile->spritegroups[groupid]);
+				SetCustomEngineSprites(engine, ctype, _cur_grffile->spritegroups[groupid]);
 				last_engines[i] = engine;
 			}
 		}
@@ -1607,9 +1599,9 @@
 
 			if (wagover) {
 				// TODO: No multiple cargo types per vehicle yet. --pasky
-				SetWagonOverrideSprites(engine, &_cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
+				SetWagonOverrideSprites(engine, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
 			} else {
-				SetCustomEngineSprites(engine, GC_DEFAULT, &_cur_grffile->spritegroups[groupid]);
+				SetCustomEngineSprites(engine, GC_DEFAULT, _cur_grffile->spritegroups[groupid]);
 				last_engines[i] = engine;
 			}
 		}
--- a/newgrf.h	Thu Sep 22 10:31:09 2005 +0000
+++ b/newgrf.h	Thu Sep 22 20:35:20 2005 +0000
@@ -31,7 +31,7 @@
 	int spriteset_feature;
 
 	int spritegroups_count;
-	SpriteGroup *spritegroups;
+	SpriteGroup **spritegroups;
 
 	StationSpec stations[256];