# HG changeset patch # User peter1138 # Date 1146422476 0 # Node ID e1d5608f4d32edc3f4dbb3884b6fc53dcb66175e # Parent c53e605f23ce5495da7b8c12e55516350f18faec (svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p) diff -r c53e605f23ce -r e1d5608f4d32 newgrf.c --- 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(); diff -r c53e605f23ce -r e1d5608f4d32 newgrf_engine.c --- 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 diff -r c53e605f23ce -r e1d5608f4d32 newgrf_engine.h --- 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);