diff options
Diffstat (limited to 'src/newgrf_engine.cpp')
-rw-r--r-- | src/newgrf_engine.cpp | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index ba8367c7d..8dd8d545a 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -1025,13 +1025,23 @@ VehicleResolverObject::VehicleResolverObject(EngineID engine_type, const Vehicle void GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) { - VehicleResolverObject object(engine, v, VehicleResolverObject::WO_CACHED, false, CBID_NO_CALLBACK, image_type); + VehicleResolverObject object(engine, v, VehicleResolverObject::WO_CACHED, false, CBID_NO_CALLBACK); result->Clear(); - const SpriteGroup *group = object.Resolve(); - if (group == NULL || group->GetNumResults() == 0) return; - - result->Set(group->GetResult() + (direction % group->GetNumResults())); + bool sprite_stack = HasBit(EngInfo(engine)->misc_flags, EF_SPRITE_STACK); + uint max_stack = sprite_stack ? lengthof(result->seq) : 1; + for (uint stack = 0; stack < max_stack; ++stack) { + object.ResetState(); + object.callback_param1 = image_type | (stack << 8); + const SpriteGroup *group = object.Resolve(); + uint32 reg100 = sprite_stack ? GetRegister(0x100) : 0; + if (group != NULL && group->GetNumResults() != 0) { + result->seq[result->count].sprite = group->GetResult() + (direction % group->GetNumResults()); + result->seq[result->count].pal = GB(reg100, 0, 16); // zero means default recolouring + result->count++; + } + if (!HasBit(reg100, 31)) break; + } } @@ -1043,15 +1053,24 @@ void GetRotorOverrideSprite(EngineID engine, const struct Aircraft *v, bool info assert(e->type == VEH_AIRCRAFT); assert(!(e->u.air.subtype & AIR_CTOL)); - VehicleResolverObject object(engine, v, VehicleResolverObject::WO_SELF, info_view, CBID_NO_CALLBACK, image_type); + VehicleResolverObject object(engine, v, VehicleResolverObject::WO_SELF, info_view, CBID_NO_CALLBACK); result->Clear(); uint rotor_pos = v == NULL || info_view ? 0 : v->Next()->Next()->state; - const SpriteGroup *group = object.Resolve(); - - if (group == NULL || group->GetNumResults() == 0) return; - - result->Set(group->GetResult() + (rotor_pos % group->GetNumResults())); + bool sprite_stack = HasBit(e->info.misc_flags, EF_SPRITE_STACK); + uint max_stack = sprite_stack ? lengthof(result->seq) : 1; + for (uint stack = 0; stack < max_stack; ++stack) { + object.ResetState(); + object.callback_param1 = image_type | (stack << 8); + const SpriteGroup *group = object.Resolve(); + uint32 reg100 = sprite_stack ? GetRegister(0x100) : 0; + if (group != NULL && group->GetNumResults() != 0) { + result->seq[result->count].sprite = group->GetResult() + (rotor_pos % group->GetNumResults()); + result->seq[result->count].pal = GB(reg100, 0, 16); // zero means default recolouring + result->count++; + } + if (!HasBit(reg100, 31)) break; + } } |