diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -790,7 +790,7 @@ static uint32 VehicleGetVariable(Vehicle case 0x1C: return v->y_pos; case 0x1D: return GB(v->y_pos, 8, 8); case 0x1E: return v->z_pos; - case 0x1F: return object->info_view ? DIR_W : v->direction; + case 0x1F: return object->rotor_in_gui ? DIR_W : v->direction; // for rotors the spriteset contains animation frames, so NewGRF need a different way to tell the helicopter orientation. case 0x20: break; // not implemented case 0x21: break; // not implemented case 0x22: break; // not implemented @@ -1041,17 +1041,17 @@ static const GRFFile *GetEngineGrfFile(E * @param engine_type Engine type * @param v %Vehicle being resolved. * @param wagon_override Application of wagon overrides. - * @param info_view Indicates if the item is being drawn in an info window. + * @param rotor_in_gui Helicopter rotor is drawn in GUI. * @param callback Callback ID. * @param callback_param1 First parameter (var 10) of the callback. * @param callback_param2 Second parameter (var 18) of the callback. */ -VehicleResolverObject::VehicleResolverObject(EngineID engine_type, const Vehicle *v, WagonOverride wagon_override, bool info_view, +VehicleResolverObject::VehicleResolverObject(EngineID engine_type, const Vehicle *v, WagonOverride wagon_override, bool rotor_in_gui, CallbackID callback, uint32 callback_param1, uint32 callback_param2) : ResolverObject(GetEngineGrfFile(engine_type), callback, callback_param1, callback_param2), - self_scope(*this, engine_type, v, info_view), - parent_scope(*this, engine_type, ((v != nullptr) ? v->First() : v), info_view), - relative_scope(*this, engine_type, v, info_view), + self_scope(*this, engine_type, v, rotor_in_gui), + parent_scope(*this, engine_type, ((v != nullptr) ? v->First() : v), rotor_in_gui), + relative_scope(*this, engine_type, v, rotor_in_gui), cached_relative_count(0) { if (wagon_override == WO_SELF) { @@ -1111,10 +1111,14 @@ void GetRotorOverrideSprite(EngineID eng assert(e->type == VEH_AIRCRAFT); assert(!(e->u.air.subtype & AIR_CTOL)); - bool info_view = image_type != EIT_ON_MAP; - VehicleResolverObject object(engine, v, VehicleResolverObject::WO_SELF, info_view, CBID_NO_CALLBACK); + /* We differ from TTDPatch by resolving the sprite using the primary vehicle 'v', and not using the rotor vehicle 'v->Next()->Next()'. + * TTDPatch copies some variables between the vehicles each time, to somehow synchronize the rotor vehicle with the primary vehicle. + * We use 'rotor_in_gui' to replicate when the variables differ. + * But some other variables like 'rotor state' and 'rotor speed' are not available in OpenTTD, while they are in TTDPatch. */ + bool rotor_in_gui = image_type != EIT_ON_MAP; + VehicleResolverObject object(engine, v, VehicleResolverObject::WO_SELF, rotor_in_gui, CBID_NO_CALLBACK); result->Clear(); - uint rotor_pos = v == nullptr || info_view ? 0 : v->Next()->Next()->state; + uint rotor_pos = v == nullptr || rotor_in_gui ? 0 : v->Next()->Next()->state; bool sprite_stack = HasBit(e->info.misc_flags, EF_SPRITE_STACK); uint max_stack = sprite_stack ? lengthof(result->seq) : 1;