1
0
Fork 0

Fix #14216, d030d17: RealSpriteGroups referencing CallbackResultSpriteGroups were always treated as callback-failure. (#14218)

pull/14221/head
frosch 2025-05-05 16:13:41 +02:00 committed by GitHub
parent e23de03a99
commit 13349254ea
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 15 additions and 12 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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);
}
/**

View File

@ -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);

View File

@ -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

View File

@ -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;