| 1103 | } |
| 1104 | |
| 1105 | static void GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) |
| 1106 | { |
| 1107 | VehicleResolverObject object(engine, v, VehicleResolverObject::WO_CACHED, false, CBID_NO_CALLBACK); |
| 1108 | result->Clear(); |
| 1109 | |
| 1110 | bool sprite_stack = EngInfo(engine)->misc_flags.Test(EngineMiscFlag::SpriteStack); |
| 1111 | uint max_stack = sprite_stack ? static_cast<uint>(std::size(result->seq)) : 1; |
| 1112 | for (uint stack = 0; stack < max_stack; ++stack) { |
| 1113 | object.callback_param1 = image_type | (stack << 8); |
| 1114 | const auto *group = object.Resolve<ResultSpriteGroup>(); |
| 1115 | int32_t reg100 = sprite_stack ? object.GetRegister(0x100) : 0; |
| 1116 | if (group != nullptr && group->num_sprites != 0) { |
| 1117 | result->seq[result->count].sprite = group->sprite + (direction % group->num_sprites); |
| 1118 | result->seq[result->count].pal = GB(reg100, 0, 16); // zero means default recolouring |
| 1119 | result->count++; |
| 1120 | } |
| 1121 | if (!HasBit(reg100, 31)) break; |
| 1122 | } |
| 1123 | } |
| 1124 | |
| 1125 | void GetCustomVehicleSprite(const Vehicle *v, Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) |
| 1126 | { |