(svn r6795) - NewGRF: Add support for cargo-specific wagon overrides.
authorpeter1138
Tue, 17 Oct 2006 14:52:55 +0000
changeset 4869 cded5f3a83c9
parent 4868 e9478d949505
child 4870 0ee22ed51ada
(svn r6795) - NewGRF: Add support for cargo-specific wagon overrides.
newgrf.c
newgrf_engine.c
newgrf_engine.h
--- a/newgrf.c	Tue Oct 17 07:33:05 2006 +0000
+++ b/newgrf.c	Tue Oct 17 14:52:55 2006 +0000
@@ -1870,8 +1870,7 @@
 			if (ctype == GC_INVALID) ctype = GC_PURCHASE;
 
 			if (wagover) {
-				// TODO: No multiple cargo types per vehicle yet. --pasky
-				SetWagonOverrideSprites(engine, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
+				SetWagonOverrideSprites(engine, ctype, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
 			} else {
 				SetCustomEngineSprites(engine, ctype, _cur_grffile->spritegroups[groupid]);
 				last_engines[i] = engine;
@@ -1901,7 +1900,7 @@
 					SetRotorOverrideSprites(engine, _cur_grffile->spritegroups[groupid]);
 				} else {
 					// TODO: No multiple cargo types per vehicle yet. --pasky
-					SetWagonOverrideSprites(engine, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
+					SetWagonOverrideSprites(engine, GC_DEFAULT, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
 				}
 			} else {
 				SetCustomEngineSprites(engine, GC_DEFAULT, _cur_grffile->spritegroups[groupid]);
--- a/newgrf_engine.c	Tue Oct 17 07:33:05 2006 +0000
+++ b/newgrf_engine.c	Tue Oct 17 14:52:55 2006 +0000
@@ -58,11 +58,10 @@
 int _traininfo_vehicle_pitch = 0;
 int _traininfo_vehicle_width = 29;
 
-// TODO: We don't support cargo-specific wagon overrides. Pretty exotic... ;-) --pasky
-
 typedef struct WagonOverride {
 	byte *train_id;
 	int trains;
+	CargoID cargo;
 	const SpriteGroup *group;
 } WagonOverride;
 
@@ -73,7 +72,7 @@
 
 static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES];
 
-void SetWagonOverrideSprites(EngineID engine, const SpriteGroup *group, byte *train_id, int trains)
+void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, byte *train_id, int trains)
 {
 	WagonOverrides *wos;
 	WagonOverride *wo;
@@ -88,12 +87,13 @@
 	 * to prevent leaks. But first we need to refcount the SpriteGroup.
 	 * --pasky */
 	wo->group = group;
+	wo->cargo = cargo;
 	wo->trains = trains;
 	wo->train_id = malloc(trains);
 	memcpy(wo->train_id, train_id, trains);
 }
 
-static const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, byte overriding_engine)
+static const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine)
 {
 	const WagonOverrides *wos = &_engine_wagon_overrides[engine];
 	int i;
@@ -108,7 +108,7 @@
 		int j;
 
 		for (j = 0; j < wo->trains; j++) {
-			if (wo->train_id[j] == overriding_engine) return wo->group;
+			if (wo->train_id[j] == overriding_engine && (wo->cargo == cargo || wo->cargo == GC_DEFAULT)) return wo->group;
 		}
 	}
 	return NULL;
@@ -872,7 +872,7 @@
 	group = engine_custom_sprites[engine][cargo];
 
 	if (v != NULL && v->type == VEH_Train) {
-		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
+		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
 
 		if (overset != NULL) group = overset;
 	}
@@ -919,7 +919,7 @@
 bool UsesWagonOverride(const Vehicle* v)
 {
 	assert(v->type == VEH_Train);
-	return GetWagonOverrideSpriteSet(v->engine_type, v->u.rail.first_engine) != NULL;
+	return GetWagonOverrideSpriteSet(v->engine_type, _global_cargo_id[_opt.landscape][v->cargo_type], v->u.rail.first_engine) != NULL;
 }
 
 /**
@@ -949,7 +949,7 @@
 	group = engine_custom_sprites[engine][cargo];
 
 	if (v != NULL && v->type == VEH_Train) {
-		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
+		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
 
 		if (overset != NULL) group = overset;
 	}
@@ -991,7 +991,7 @@
 	group = engine_custom_sprites[engine][cargo];
 
 	if (v != NULL && v->type == VEH_Train) {
-		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
+		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
 
 		if (overset != NULL) group = overset;
 	}
@@ -1023,7 +1023,7 @@
 	group = engine_custom_sprites[v->engine_type][cargo];
 
 	if (v->type == VEH_Train) {
-		const SpriteGroup *overset = GetWagonOverrideSpriteSet(v->engine_type, v->u.rail.first_engine);
+		const SpriteGroup *overset = GetWagonOverrideSpriteSet(v->engine_type, cargo, v->u.rail.first_engine);
 		if (overset != NULL) group = overset;
 	}
 
--- a/newgrf_engine.h	Tue Oct 17 07:33:05 2006 +0000
+++ b/newgrf_engine.h	Tue Oct 17 14:52:55 2006 +0000
@@ -19,7 +19,7 @@
 extern const CargoID _local_cargo_id_ctype[NUM_GLOBAL_CID];
 extern const uint32 cargo_classes[16];
 
-void SetWagonOverrideSprites(EngineID engine, const struct SpriteGroup *group, byte *train_id, int trains);
+void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const struct SpriteGroup *group, byte *train_id, int trains);
 void SetCustomEngineSprites(EngineID engine, byte cargo, const struct SpriteGroup *group);
 void SetRotorOverrideSprites(EngineID engine, const struct SpriteGroup *group);
 SpriteID GetCustomEngineSprite(EngineID engine, const Vehicle* v, Direction direction);