(svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
authorpeter1138
Sun, 30 Apr 2006 18:41:16 +0000
changeset 3695 e1d5608f4d32
parent 3694 c53e605f23ce
child 3696 8bc4db454d1c
(svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)
newgrf.c
newgrf_engine.c
newgrf_engine.h
--- a/newgrf.c	Sun Apr 30 18:39:31 2006 +0000
+++ b/newgrf.c	Sun Apr 30 18:41:16 2006 +0000
@@ -1742,8 +1742,14 @@
 			}
 
 			if (wagover) {
-				// TODO: No multiple cargo types per vehicle yet. --pasky
-				SetWagonOverrideSprites(engine, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
+				/* If the ID for this action 3 is the same as the vehicle ID,
+				 * this indicates we have a helicopter rotor override. */
+				if (feature == GSF_AIRCRAFT && engine == last_engines[i]) {
+					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);
+				}
 			} else {
 				SetCustomEngineSprites(engine, GC_DEFAULT, _cur_grffile->spritegroups[groupid]);
 				last_engines[i] = engine;
@@ -2534,6 +2540,7 @@
 
 	// Unload sprite group data
 	UnloadWagonOverrides();
+	UnloadRotorOverrideSprites();
 	UnloadCustomEngineSprites();
 	UnloadCustomEngineNames();
 	ResetEngineListOrder();
--- a/newgrf_engine.c	Sun Apr 30 18:39:31 2006 +0000
+++ b/newgrf_engine.c	Sun Apr 30 18:41:16 2006 +0000
@@ -125,6 +125,32 @@
 	}
 }
 
+static const SpriteGroup *heli_rotor_custom_sprites[NUM_AIRCRAFT_ENGINES];
+
+/** Load a rotor override sprite group for an aircraft */
+void SetRotorOverrideSprites(EngineID engine, const SpriteGroup *group)
+{
+	assert(engine >= AIRCRAFT_ENGINES_INDEX);
+	assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
+
+	if (heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] != NULL) {
+		DEBUG(grf, 6)("SetRotorOverrideSprites: engine `%d' already has group -- replacing.", engine);
+	}
+	heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] = group;
+}
+
+/** Unload all rotor override sprite groups */
+void UnloadRotorOverrideSprites(void)
+{
+	EngineID engine;
+
+	/* Starting at AIRCRAFT_ENGINES_INDEX may seem pointless, but it means
+	 * the context of EngineID is correct */
+	for (engine = AIRCRAFT_ENGINES_INDEX; engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; engine++) {
+		heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] = NULL;
+	}
+}
+
 void SetEngineGRF(EngineID engine, uint32 grfid)
 {
 	assert(engine < TOTAL_NUM_ENGINES);
@@ -435,6 +461,30 @@
 }
 
 
+SpriteID GetRotorOverrideSprite(EngineID engine, const Vehicle *v)
+{
+	const SpriteGroup *group;
+	ResolverObject object;
+
+	assert(engine >= AIRCRAFT_ENGINES_INDEX);
+	assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
+
+	/* Only valid for helicopters */
+	assert((AircraftVehInfo(engine)->subtype & 1) == 0);
+
+	NewVehicleResolver(&object, v);
+
+	group = heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX];
+	group = Resolve(group, &object);
+
+	if (group == NULL || group->type != SGT_RESULT) return 0;
+
+	if (v == NULL) return group->g.result.sprite;
+
+	return group->g.result.sprite + v->next->next->u.air.state;
+}
+
+
 /**
  * Check if a wagon is currently using a wagon override
  * @param v The wagon to check
--- a/newgrf_engine.h	Sun Apr 30 18:39:31 2006 +0000
+++ b/newgrf_engine.h	Sun Apr 30 18:41:16 2006 +0000
@@ -16,7 +16,11 @@
 
 void SetWagonOverrideSprites(EngineID engine, 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);
+SpriteID GetRotorOverrideSprite(EngineID engine, const Vehicle* v);
+#define GetCustomRotorSprite(v) GetRotorOverrideSprite(v->engine_type, v)
+#define GetCustomRotorIcon(et) GetRotorOverrideSprite(et, NULL)
 
 void SetEngineGRF(EngineID engine, uint32 grfid);
 uint32 GetEngineGRFID(EngineID engine);
@@ -41,6 +45,7 @@
 StringID GetCustomEngineName(EngineID engine);
 
 void UnloadWagonOverrides(void);
+void UnloadRotorOverrideSprites(void);
 void UnloadCustomEngineSprites(void);
 void UnloadCustomEngineNames(void);