changeset 4901:5888e7640e33 draft

(svn r6870) - Codechange: (re-)unify the code to retrieve the sprite group for a vehicle.
author peter1138 <peter1138@openttd.org>
date Sat, 21 Oct 2006 14:53:57 +0000
parents dbfe4eddd72c
children 42828252498d
files newgrf_engine.c
diffstat 1 files changed, 37 insertions(+), 55 deletions(-) [+]
line wrap: on
line diff
--- a/newgrf_engine.c
+++ b/newgrf_engine.c
@@ -858,27 +858,47 @@
 }
 
 
+/** Retrieve the SpriteGroup for the specified vehicle.
+ * If the vehicle is not specified, the purchase list group for the engine is
+ * chosen. For trains, an additional engine override lookup is performed.
+ * @param engine Engine type of the vehicle.
+ * @param v      The vehicle itself.
+ * @returns      The selected SpriteGroup for the vehicle.
+ */
+static const SpriteGroup *GetVehicleSpriteGroup(EngineID engine, const Vehicle *v)
+{
+	const SpriteGroup *group;
+	CargoID cargo;
+
+	if (v == NULL) {
+		cargo = GC_PURCHASE;
+	} else {
+		cargo = _global_cargo_id[_opt.landscape][v->cargo_type];
+		assert(cargo != GC_INVALID);
+
+		if (v->type == VEH_Train) {
+			group = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
+
+			if (group != NULL) return group;
+		}
+	}
+
+	group = engine_custom_sprites[engine][cargo];
+	if (group != NULL) return group;
+
+	/* Fall back to the default set if the selected cargo type is not defined */
+	return engine_custom_sprites[engine][GC_DEFAULT];
+}
+
+
 SpriteID GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction)
 {
 	const SpriteGroup *group;
 	ResolverObject object;
-	CargoID cargo;
 
 	NewVehicleResolver(&object, engine, v);
 
-	cargo = (v == NULL) ? GC_PURCHASE : _global_cargo_id[_opt.landscape][v->cargo_type];
-	assert(cargo != GC_INVALID);
-
-	group = engine_custom_sprites[engine][cargo];
-
-	if (v != NULL && v->type == VEH_Train) {
-		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
-
-		if (overset != NULL) group = overset;
-	}
-
-	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
-	group = Resolve(group, &object);
+	group = Resolve(GetVehicleSpriteGroup(engine, v), &object);
 	if (group == NULL || group->type != SGT_RESULT) return 0;
 
 	return group->g.result.sprite + (direction % group->g.result.num_sprites);
@@ -935,7 +955,6 @@
 {
 	const SpriteGroup *group;
 	ResolverObject object;
-	CargoID cargo;
 
 	NewVehicleResolver(&object, engine, v);
 
@@ -943,19 +962,7 @@
 	object.callback_param1 = param1;
 	object.callback_param2 = param2;
 
-	cargo = (v == NULL) ? GC_PURCHASE : _global_cargo_id[_opt.landscape][v->cargo_type];
-	assert(cargo != GC_INVALID);
-
-	group = engine_custom_sprites[engine][cargo];
-
-	if (v != NULL && v->type == VEH_Train) {
-		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
-
-		if (overset != NULL) group = overset;
-	}
-
-	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
-	group = Resolve(group, &object);
+	group = Resolve(GetVehicleSpriteGroup(engine, v), &object);
 	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
 
 	return group->g.callback.result;
@@ -975,7 +982,6 @@
 {
 	const SpriteGroup *group;
 	ResolverObject object;
-	CargoID cargo;
 
 	NewVehicleResolver(&object, engine, v);
 
@@ -985,19 +991,7 @@
 
 	object.u.vehicle.parent = parent;
 
-	cargo = (v == NULL) ? GC_PURCHASE : _global_cargo_id[_opt.landscape][v->cargo_type];
-	assert(cargo != GC_INVALID);
-
-	group = engine_custom_sprites[engine][cargo];
-
-	if (v != NULL && v->type == VEH_Train) {
-		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
-
-		if (overset != NULL) group = overset;
-	}
-
-	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
-	group = Resolve(group, &object);
+	group = Resolve(GetVehicleSpriteGroup(engine, v), &object);
 	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
 
 	return group->g.callback.result;
@@ -1007,7 +1001,6 @@
 {
 	const SpriteGroup *group;
 	ResolverObject object;
-	CargoID cargo;
 	byte new_random_bits;
 
 	/* We can't trigger a non-existent vehicle... */
@@ -1017,18 +1010,7 @@
 
 	object.trigger = trigger;
 
-	cargo = _global_cargo_id[_opt.landscape][v->cargo_type];
-	assert(cargo != GC_INVALID);
-
-	group = engine_custom_sprites[v->engine_type][cargo];
-
-	if (v->type == VEH_Train) {
-		const SpriteGroup *overset = GetWagonOverrideSpriteSet(v->engine_type, cargo, v->u.rail.first_engine);
-		if (overset != NULL) group = overset;
-	}
-
-	if (group == NULL) group = engine_custom_sprites[v->engine_type][GC_DEFAULT];
-	group = Resolve(group, &object);
+	group = Resolve(GetVehicleSpriteGroup(v->engine_type, v), &object);
 
 	new_random_bits = Random();
 	v->random_bits &= ~object.reseed;