| 1133 | } |
| 1134 | |
| 1135 | static void GetRotorOverrideSprite(EngineID engine, const struct Aircraft *v, EngineImageType image_type, VehicleSpriteSeq *result) |
| 1136 | { |
| 1137 | const Engine *e = Engine::Get(engine); |
| 1138 | |
| 1139 | /* Only valid for helicopters */ |
| 1140 | assert(e->type == VEH_AIRCRAFT); |
| 1141 | assert(!(e->VehInfo<AircraftVehicleInfo>().subtype & AIR_CTOL)); |
| 1142 | |
| 1143 | /* We differ from TTDPatch by resolving the sprite using the primary vehicle 'v', and not using the rotor vehicle 'v->Next()->Next()'. |
| 1144 | * TTDPatch copies some variables between the vehicles each time, to somehow synchronize the rotor vehicle with the primary vehicle. |
| 1145 | * We use 'rotor_in_gui' to replicate when the variables differ. |
| 1146 | * But some other variables like 'rotor state' and 'rotor speed' are not available in OpenTTD, while they are in TTDPatch. */ |
| 1147 | bool rotor_in_gui = image_type != EIT_ON_MAP; |
| 1148 | VehicleResolverObject object(engine, v, VehicleResolverObject::WO_SELF, rotor_in_gui, CBID_NO_CALLBACK); |
| 1149 | result->Clear(); |
| 1150 | uint rotor_pos = v == nullptr || rotor_in_gui ? 0 : v->Next()->Next()->state; |
| 1151 | |
| 1152 | bool sprite_stack = e->info.misc_flags.Test(EngineMiscFlag::SpriteStack); |
| 1153 | uint max_stack = sprite_stack ? static_cast<uint>(std::size(result->seq)) : 1; |
| 1154 | for (uint stack = 0; stack < max_stack; ++stack) { |
| 1155 | object.callback_param1 = image_type | (stack << 8); |
| 1156 | const auto *group = object.Resolve<ResultSpriteGroup>(); |
| 1157 | int32_t reg100 = sprite_stack ? object.GetRegister(0x100) : 0; |
| 1158 | if (group != nullptr && group->num_sprites != 0) { |
| 1159 | result->seq[result->count].sprite = group->sprite + (rotor_pos % group->num_sprites); |
| 1160 | result->seq[result->count].pal = GB(reg100, 0, 16); // zero means default recolouring |
| 1161 | result->count++; |
| 1162 | } |
| 1163 | if (!HasBit(reg100, 31)) break; |
| 1164 | } |
| 1165 | } |
| 1166 | |
| 1167 | void GetCustomRotorSprite(const struct Aircraft *v, EngineImageType image_type, VehicleSpriteSeq *result) |
| 1168 | { |