mirror of https://github.com/OpenTTD/OpenTTD
Fix #14216, d030d17: RealSpriteGroups referencing CallbackResultSpriteGroups were always treated as callback-failure. (#14218)
parent
e23de03a99
commit
13349254ea
|
@ -998,14 +998,14 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec
|
|||
}
|
||||
|
||||
|
||||
/* virtual */ ResolverResult VehicleResolverObject::ResolveReal(const RealSpriteGroup &group) const
|
||||
/* virtual */ const SpriteGroup *VehicleResolverObject::ResolveReal(const RealSpriteGroup &group) const
|
||||
{
|
||||
const Vehicle *v = this->self_scope.v;
|
||||
|
||||
if (v == nullptr) {
|
||||
if (!group.loading.empty()) return group.loading[0];
|
||||
if (!group.loaded.empty()) return group.loaded[0];
|
||||
return std::monostate{};
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const Order &order = v->First()->current_order;
|
||||
|
@ -1014,7 +1014,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec
|
|||
|
||||
uint totalsets = static_cast<uint>(in_motion ? group.loaded.size() : group.loading.size());
|
||||
|
||||
if (totalsets == 0) return std::monostate{};
|
||||
if (totalsets == 0) return nullptr;
|
||||
|
||||
uint set = (v->cargo.StoredCount() * totalsets) / std::max<uint16_t>(1u, v->cargo_cap);
|
||||
set = std::min(set, totalsets - 1);
|
||||
|
|
|
@ -64,7 +64,7 @@ struct VehicleResolverObject : public SpecializedResolverObject<VehicleRandomTri
|
|||
|
||||
ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, uint8_t relative = 0) override;
|
||||
|
||||
ResolverResult ResolveReal(const RealSpriteGroup &group) const override;
|
||||
const SpriteGroup *ResolveReal(const RealSpriteGroup &group) const override;
|
||||
|
||||
GrfSpecFeature GetFeature() const override;
|
||||
uint32_t GetDebugID() const override;
|
||||
|
|
|
@ -120,12 +120,12 @@ static inline uint32_t GetVariable(const ResolverObject &object, ScopeResolver *
|
|||
* @param group Group to get.
|
||||
* @return The available sprite group.
|
||||
*/
|
||||
/* virtual */ ResolverResult ResolverObject::ResolveReal(const RealSpriteGroup &group) const
|
||||
/* virtual */ const SpriteGroup *ResolverObject::ResolveReal(const RealSpriteGroup &group) const
|
||||
{
|
||||
if (!group.loaded.empty()) return group.loaded[0];
|
||||
if (!group.loading.empty()) return group.loading[0];
|
||||
|
||||
return std::monostate{};
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -274,7 +274,10 @@ static bool RangeHighComparator(const DeterministicSpriteGroupRange &range, uint
|
|||
|
||||
/* virtual */ ResolverResult RealSpriteGroup::Resolve(ResolverObject &object) const
|
||||
{
|
||||
return object.ResolveReal(*this);
|
||||
/* Call the feature specific evaluation via ResultSpriteGroup::ResolveReal.
|
||||
* The result is either ResultSpriteGroup, CallbackResultSpriteGroup, or nullptr.
|
||||
*/
|
||||
return SpriteGroup::Resolve(object.ResolveReal(*this), object, false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -381,7 +381,7 @@ public:
|
|||
return value != nullptr ? *value : CALLBACK_FAILED;
|
||||
}
|
||||
|
||||
virtual ResolverResult ResolveReal(const RealSpriteGroup &group) const;
|
||||
virtual const SpriteGroup *ResolveReal(const RealSpriteGroup &group) const;
|
||||
|
||||
virtual ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, uint8_t relative = 0);
|
||||
|
||||
|
|
|
@ -519,11 +519,11 @@ uint32_t Waypoint::GetNewGRFVariable(const ResolverObject &, uint8_t variable, [
|
|||
return UINT_MAX;
|
||||
}
|
||||
|
||||
/* virtual */ ResolverResult StationResolverObject::ResolveReal(const RealSpriteGroup &group) const
|
||||
/* virtual */ const SpriteGroup *StationResolverObject::ResolveReal(const RealSpriteGroup &group) const
|
||||
{
|
||||
if (this->station_scope.st == nullptr || !Station::IsExpected(this->station_scope.st)) {
|
||||
if (!group.loading.empty()) return group.loading[0];
|
||||
return std::monostate{};
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
uint cargo = 0;
|
||||
|
@ -566,7 +566,7 @@ uint32_t Waypoint::GetNewGRFVariable(const ResolverObject &, uint8_t variable, [
|
|||
}
|
||||
|
||||
if (!group.loading.empty()) return group.loading[0];
|
||||
return std::monostate{};
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
GrfSpecFeature StationResolverObject::GetFeature() const
|
||||
|
|
|
@ -75,7 +75,7 @@ struct StationResolverObject : public SpecializedResolverObject<StationRandomTri
|
|||
}
|
||||
}
|
||||
|
||||
ResolverResult ResolveReal(const RealSpriteGroup &group) const override;
|
||||
const SpriteGroup *ResolveReal(const RealSpriteGroup &group) const override;
|
||||
|
||||
GrfSpecFeature GetFeature() const override;
|
||||
uint32_t GetDebugID() const override;
|
||||
|
|
Loading…
Reference in New Issue