(svn r4632) - NewGRF: support loading of helicopter rotor sprites (mart3p)

This commit is contained in:
peter1138 2006-04-30 18:41:16 +00:00
parent 967752fe7c
commit ddbb61199b
3 changed files with 64 additions and 2 deletions

View File

@ -1742,8 +1742,14 @@ static void NewVehicle_SpriteGroupMapping(byte *buf, int len)
}
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 @@ static void ResetNewGRFData(void)
// Unload sprite group data
UnloadWagonOverrides();
UnloadRotorOverrideSprites();
UnloadCustomEngineSprites();
UnloadCustomEngineNames();
ResetEngineListOrder();

View File

@ -125,6 +125,32 @@ void UnloadCustomEngineSprites(void)
}
}
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 GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction dire
}
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

View File

@ -16,7 +16,11 @@ VARDEF const uint32 cargo_classes[16];
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 @@ void SetCustomEngineName(EngineID engine, StringID name);
StringID GetCustomEngineName(EngineID engine);
void UnloadWagonOverrides(void);
void UnloadRotorOverrideSprites(void);
void UnloadCustomEngineSprites(void);
void UnloadCustomEngineNames(void);