1
0
Fork 0

Codechange: Move SpriteGroup cast from callers into Resolve.

pull/14148/head
frosch 2025-04-28 15:58:35 +02:00 committed by frosch
parent af25eecc15
commit 010b944173
15 changed files with 59 additions and 50 deletions

View File

@ -258,7 +258,7 @@ AirportResolverObject::AirportResolverObject(TileIndex tile, Station *st, const
SpriteID GetCustomAirportSprite(const AirportSpec *as, uint8_t layout) SpriteID GetCustomAirportSprite(const AirportSpec *as, uint8_t layout)
{ {
AirportResolverObject object(INVALID_TILE, nullptr, as, layout); AirportResolverObject object(INVALID_TILE, nullptr, as, layout);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
if (group == nullptr || group->GetNumResults() == 0) return as->preview_sprite; if (group == nullptr || group->GetNumResults() == 0) return as->preview_sprite;
return group->GetResult(); return group->GetResult();

View File

@ -273,13 +273,12 @@ bool DrawNewAirportTile(TileInfo *ti, Station *st, const AirportTileSpec *airts)
} }
AirportTileResolverObject object(airts, ti->tile, st); AirportTileResolverObject object(airts, ti->tile, st);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<TileLayoutSpriteGroup>();
if (group == nullptr || group->type != SGT_TILELAYOUT) { if (group == nullptr) {
return false; return false;
} }
const TileLayoutSpriteGroup *tlgroup = (const TileLayoutSpriteGroup *)group; AirportDrawTileLayout(ti, group, Company::Get(st->owner)->colour);
AirportDrawTileLayout(ti, tlgroup, Company::Get(st->owner)->colour);
return true; return true;
} }

View File

@ -275,7 +275,7 @@ void ApplyBadgeFeaturesToClassBadges()
PalSpriteID GetBadgeSprite(const Badge &badge, GrfSpecFeature feature, std::optional<TimerGameCalendar::Date> introduction_date, PaletteID remap) PalSpriteID GetBadgeSprite(const Badge &badge, GrfSpecFeature feature, std::optional<TimerGameCalendar::Date> introduction_date, PaletteID remap)
{ {
BadgeResolverObject object(badge, feature, introduction_date); BadgeResolverObject object(badge, feature, introduction_date);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
if (group == nullptr || group->GetNumResults() == 0) return {0, PAL_NONE}; if (group == nullptr || group->GetNumResults() == 0) return {0, PAL_NONE};
PaletteID pal = badge.flags.Test(BadgeFlag::UseCompanyColour) ? remap : PAL_NONE; PaletteID pal = badge.flags.Test(BadgeFlag::UseCompanyColour) ? remap : PAL_NONE;

View File

@ -140,7 +140,7 @@ CanalResolverObject::CanalResolverObject(CanalFeature feature, TileIndex tile,
SpriteID GetCanalSprite(CanalFeature feature, TileIndex tile) SpriteID GetCanalSprite(CanalFeature feature, TileIndex tile)
{ {
CanalResolverObject object(feature, tile); CanalResolverObject object(feature, tile);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
if (group == nullptr || group->GetNumResults() == 0) return 0; if (group == nullptr || group->GetNumResults() == 0) return 0;
return group->GetResult(); return group->GetResult();

View File

@ -55,7 +55,7 @@ CargoResolverObject::CargoResolverObject(const CargoSpec *cs, CallbackID callbac
SpriteID GetCustomCargoSprite(const CargoSpec *cs) SpriteID GetCustomCargoSprite(const CargoSpec *cs)
{ {
CargoResolverObject object(cs); CargoResolverObject object(cs);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
if (group == nullptr || group->GetNumResults() == 0) return 0; if (group == nullptr || group->GetNumResults() == 0) return 0;
return group->GetResult(); return group->GetResult();

View File

@ -1101,7 +1101,7 @@ static void GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction d
for (uint stack = 0; stack < max_stack; ++stack) { for (uint stack = 0; stack < max_stack; ++stack) {
object.ResetState(); object.ResetState();
object.callback_param1 = image_type | (stack << 8); object.callback_param1 = image_type | (stack << 8);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
uint32_t reg100 = sprite_stack ? GetRegister(0x100) : 0; uint32_t reg100 = sprite_stack ? GetRegister(0x100) : 0;
if (group != nullptr && group->GetNumResults() != 0) { if (group != nullptr && group->GetNumResults() != 0) {
result->seq[result->count].sprite = group->GetResult() + (direction % group->GetNumResults()); result->seq[result->count].sprite = group->GetResult() + (direction % group->GetNumResults());
@ -1144,7 +1144,7 @@ static void GetRotorOverrideSprite(EngineID engine, const struct Aircraft *v, En
for (uint stack = 0; stack < max_stack; ++stack) { for (uint stack = 0; stack < max_stack; ++stack) {
object.ResetState(); object.ResetState();
object.callback_param1 = image_type | (stack << 8); object.callback_param1 = image_type | (stack << 8);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
uint32_t reg100 = sprite_stack ? GetRegister(0x100) : 0; uint32_t reg100 = sprite_stack ? GetRegister(0x100) : 0;
if (group != nullptr && group->GetNumResults() != 0) { if (group != nullptr && group->GetNumResults() != 0) {
result->seq[result->count].sprite = group->GetResult() + (rotor_pos % group->GetNumResults()); result->seq[result->count].sprite = group->GetResult() + (rotor_pos % group->GetNumResults());

View File

@ -505,12 +505,11 @@ void DrawNewHouseTile(TileInfo *ti, HouseID house_id)
HouseResolverObject object(house_id, ti->tile, Town::GetByTile(ti->tile)); HouseResolverObject object(house_id, ti->tile, Town::GetByTile(ti->tile));
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<TileLayoutSpriteGroup>();
if (group != nullptr && group->type == SGT_TILELAYOUT) { if (group != nullptr) {
/* Limit the building stage to the number of stages supplied. */ /* Limit the building stage to the number of stages supplied. */
const TileLayoutSpriteGroup *tlgroup = (const TileLayoutSpriteGroup *)group;
uint8_t stage = GetHouseBuildingStage(ti->tile); uint8_t stage = GetHouseBuildingStage(ti->tile);
DrawTileLayout(ti, tlgroup, stage, house_id); DrawTileLayout(ti, group, stage, house_id);
} }
} }
@ -525,11 +524,11 @@ void DrawNewHouseTile(TileInfo *ti, HouseID house_id)
void DrawNewHouseTileInGUI(int x, int y, const HouseSpec *spec, HouseID house_id, int view) void DrawNewHouseTileInGUI(int x, int y, const HouseSpec *spec, HouseID house_id, int view)
{ {
HouseResolverObject object(house_id, INVALID_TILE, nullptr, CBID_NO_CALLBACK, 0, 0, true, view); HouseResolverObject object(house_id, INVALID_TILE, nullptr, CBID_NO_CALLBACK, 0, 0, true, view);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<TileLayoutSpriteGroup>();
if (group == nullptr || group->type != SGT_TILELAYOUT) return; if (group == nullptr) return;
uint8_t stage = TOWN_HOUSE_COMPLETED; uint8_t stage = TOWN_HOUSE_COMPLETED;
const DrawTileSprites *dts = reinterpret_cast<const TileLayoutSpriteGroup *>(group)->ProcessRegisters(&stage); const DrawTileSprites *dts = group->ProcessRegisters(&stage);
PaletteID palette = GetColourPalette(spec->random_colour[0]); PaletteID palette = GetColourPalette(spec->random_colour[0]);
if (spec->callback_mask.Test(HouseCallbackMask::Colour)) { if (spec->callback_mask.Test(HouseCallbackMask::Colour)) {

View File

@ -629,9 +629,8 @@ void IndustryProductionCallback(Industry *ind, int reason)
} }
SB(object.callback_param2, 8, 16, loop); SB(object.callback_param2, 8, 16, loop);
const SpriteGroup *tgroup = object.Resolve(); const auto *group = object.Resolve<IndustryProductionSpriteGroup>();
if (tgroup == nullptr || tgroup->type != SGT_INDUSTRY_PRODUCTION) break; if (group == nullptr) break;
const IndustryProductionSpriteGroup *group = (const IndustryProductionSpriteGroup *)tgroup;
if (group->version == 0xFF) { if (group->version == 0xFF) {
/* Result was marked invalid on load, display error message */ /* Result was marked invalid on load, display error message */

View File

@ -205,13 +205,12 @@ bool DrawNewIndustryTile(TileInfo *ti, Industry *i, IndustryGfx gfx, const Indus
IndustryTileResolverObject object(gfx, ti->tile, i); IndustryTileResolverObject object(gfx, ti->tile, i);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<TileLayoutSpriteGroup>();
if (group == nullptr || group->type != SGT_TILELAYOUT) return false; if (group == nullptr) return false;
/* Limit the building stage to the number of stages supplied. */ /* Limit the building stage to the number of stages supplied. */
const TileLayoutSpriteGroup *tlgroup = (const TileLayoutSpriteGroup *)group;
uint8_t stage = GetIndustryConstructionStage(ti->tile); uint8_t stage = GetIndustryConstructionStage(ti->tile);
IndustryDrawTileLayout(ti, tlgroup, i->random_colour, stage); IndustryDrawTileLayout(ti, group, i->random_colour, stage);
return true; return true;
} }

View File

@ -473,10 +473,10 @@ void DrawNewObjectTile(TileInfo *ti, const ObjectSpec *spec)
Object *o = Object::GetByTile(ti->tile); Object *o = Object::GetByTile(ti->tile);
ObjectResolverObject object(spec, o, ti->tile); ObjectResolverObject object(spec, o, ti->tile);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<TileLayoutSpriteGroup>();
if (group == nullptr || group->type != SGT_TILELAYOUT) return; if (group == nullptr) return;
DrawTileLayout(ti, (const TileLayoutSpriteGroup *)group, spec); DrawTileLayout(ti, group, spec);
} }
/** /**
@ -489,10 +489,10 @@ void DrawNewObjectTile(TileInfo *ti, const ObjectSpec *spec)
void DrawNewObjectTileInGUI(int x, int y, const ObjectSpec *spec, uint8_t view) void DrawNewObjectTileInGUI(int x, int y, const ObjectSpec *spec, uint8_t view)
{ {
ObjectResolverObject object(spec, nullptr, INVALID_TILE, view); ObjectResolverObject object(spec, nullptr, INVALID_TILE, view);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<TileLayoutSpriteGroup>();
if (group == nullptr || group->type != SGT_TILELAYOUT) return; if (group == nullptr) return;
const DrawTileSprites *dts = ((const TileLayoutSpriteGroup *)group)->ProcessRegisters(nullptr); const DrawTileSprites *dts = group->ProcessRegisters(nullptr);
PaletteID palette; PaletteID palette;
if (Company::IsValidID(_local_company)) { if (Company::IsValidID(_local_company)) {

View File

@ -110,7 +110,7 @@ SpriteID GetCustomRailSprite(const RailTypeInfo *rti, TileIndex tile, RailTypeSp
if (rti->group[rtsg] == nullptr) return 0; if (rti->group[rtsg] == nullptr) return 0;
RailTypeResolverObject object(rti, tile, context, rtsg); RailTypeResolverObject object(rti, tile, context, rtsg);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
if (group == nullptr || group->GetNumResults() == 0) return 0; if (group == nullptr || group->GetNumResults() == 0) return 0;
if (num_results) *num_results = group->GetNumResults(); if (num_results) *num_results = group->GetNumResults();
@ -136,7 +136,7 @@ SpriteID GetCustomSignalSprite(const RailTypeInfo *rti, TileIndex tile, SignalTy
uint32_t param2 = (type << 16) | (var << 8) | state; uint32_t param2 = (type << 16) | (var << 8) | state;
RailTypeResolverObject object(rti, tile, TCX_NORMAL, RTSG_SIGNALS, param1, param2); RailTypeResolverObject object(rti, tile, TCX_NORMAL, RTSG_SIGNALS, param1, param2);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
if (group == nullptr || group->GetNumResults() == 0) return 0; if (group == nullptr || group->GetNumResults() == 0) return 0;
return group->GetResult(); return group->GetResult();

View File

@ -291,9 +291,9 @@ void DrawRoadStopTile(int x, int y, RoadType roadtype, const RoadStopSpec *spec,
const RoadTypeInfo *rti = GetRoadTypeInfo(roadtype); const RoadTypeInfo *rti = GetRoadTypeInfo(roadtype);
RoadStopResolverObject object(spec, nullptr, INVALID_TILE, roadtype, type, view); RoadStopResolverObject object(spec, nullptr, INVALID_TILE, roadtype, type, view);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<TileLayoutSpriteGroup>();
if (group == nullptr || group->type != SGT_TILELAYOUT) return; if (group == nullptr) return;
const DrawTileSprites *dts = ((const TileLayoutSpriteGroup *)group)->ProcessRegisters(nullptr); const DrawTileSprites *dts = group->ProcessRegisters(nullptr);
PaletteID palette = GetCompanyPalette(_local_company); PaletteID palette = GetCompanyPalette(_local_company);
@ -346,9 +346,7 @@ void DrawRoadStopTile(int x, int y, RoadType roadtype, const RoadStopSpec *spec,
const TileLayoutSpriteGroup *GetRoadStopLayout(TileInfo *ti, const RoadStopSpec *spec, BaseStation *st, StationType type, int view) const TileLayoutSpriteGroup *GetRoadStopLayout(TileInfo *ti, const RoadStopSpec *spec, BaseStation *st, StationType type, int view)
{ {
RoadStopResolverObject object(spec, st, ti->tile, INVALID_ROADTYPE, type, view); RoadStopResolverObject object(spec, st, ti->tile, INVALID_ROADTYPE, type, view);
const SpriteGroup *group = object.Resolve(); return object.Resolve<TileLayoutSpriteGroup>();
if (group == nullptr || group->type != SGT_TILELAYOUT) return nullptr;
return static_cast<const TileLayoutSpriteGroup *>(group);
} }
/** Wrapper for animation control, see GetRoadStopCallback. */ /** Wrapper for animation control, see GetRoadStopCallback. */

View File

@ -153,7 +153,7 @@ SpriteID GetCustomRoadSprite(const RoadTypeInfo *rti, TileIndex tile, RoadTypeSp
if (rti->group[rtsg] == nullptr) return 0; if (rti->group[rtsg] == nullptr) return 0;
RoadTypeResolverObject object(rti, tile, context, rtsg); RoadTypeResolverObject object(rti, tile, context, rtsg);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
if (group == nullptr || group->GetNumResults() == 0) return 0; if (group == nullptr || group->GetNumResults() == 0) return 0;
if (num_results) *num_results = group->GetNumResults(); if (num_results) *num_results = group->GetNumResults();

View File

@ -223,6 +223,8 @@ struct CallbackResultSpriteGroup : SpriteGroup {
/* A result sprite group returns the first SpriteID and the number of /* A result sprite group returns the first SpriteID and the number of
* sprites in the set */ * sprites in the set */
struct ResultSpriteGroup : SpriteGroup { struct ResultSpriteGroup : SpriteGroup {
static constexpr SpriteGroupType TYPE = SGT_RESULT;
/** /**
* Creates a spritegroup representing a sprite number result. * Creates a spritegroup representing a sprite number result.
* @param sprite The sprite number. * @param sprite The sprite number.
@ -230,7 +232,7 @@ struct ResultSpriteGroup : SpriteGroup {
* @return A spritegroup representing the sprite number result. * @return A spritegroup representing the sprite number result.
*/ */
ResultSpriteGroup(SpriteID sprite, uint8_t num_sprites) : ResultSpriteGroup(SpriteID sprite, uint8_t num_sprites) :
SpriteGroup(SGT_RESULT), SpriteGroup(TYPE),
num_sprites(num_sprites), num_sprites(num_sprites),
sprite(sprite) sprite(sprite)
{ {
@ -247,7 +249,9 @@ struct ResultSpriteGroup : SpriteGroup {
* Action 2 sprite layout for houses, industry tiles, objects and airport tiles. * Action 2 sprite layout for houses, industry tiles, objects and airport tiles.
*/ */
struct TileLayoutSpriteGroup : SpriteGroup { struct TileLayoutSpriteGroup : SpriteGroup {
TileLayoutSpriteGroup() : SpriteGroup(SGT_TILELAYOUT) {} static constexpr SpriteGroupType TYPE = SGT_TILELAYOUT;
TileLayoutSpriteGroup() : SpriteGroup(TYPE) {}
~TileLayoutSpriteGroup() {} ~TileLayoutSpriteGroup() {}
NewGRFSpriteLayout dts{}; NewGRFSpriteLayout dts{};
@ -256,7 +260,9 @@ struct TileLayoutSpriteGroup : SpriteGroup {
}; };
struct IndustryProductionSpriteGroup : SpriteGroup { struct IndustryProductionSpriteGroup : SpriteGroup {
IndustryProductionSpriteGroup() : SpriteGroup(SGT_INDUSTRY_PRODUCTION) {} static constexpr SpriteGroupType TYPE = SGT_INDUSTRY_PRODUCTION;
IndustryProductionSpriteGroup() : SpriteGroup(TYPE) {}
uint8_t version = 0; ///< Production callback version used, or 0xFF if marked invalid uint8_t version = 0; ///< Production callback version used, or 0xFF if marked invalid
uint8_t num_input = 0; ///< How many subtract_input values are valid uint8_t num_input = 0; ///< How many subtract_input values are valid
@ -310,6 +316,11 @@ struct ResolverObject {
virtual ~ResolverObject() = default; virtual ~ResolverObject() = default;
const SpriteGroup *DoResolve()
{
return SpriteGroup::Resolve(this->root_spritegroup, *this);
}
ScopeResolver default_scope; ///< Default implementation of the grf scope. ScopeResolver default_scope; ///< Default implementation of the grf scope.
CallbackID callback{}; ///< Callback being resolved. CallbackID callback{}; ///< Callback being resolved.
@ -330,10 +341,14 @@ public:
/** /**
* Resolve SpriteGroup. * Resolve SpriteGroup.
* @return Result spritegroup. * @return Result spritegroup.
* @tparam TSpriteGroup Sprite group type
*/ */
const SpriteGroup *Resolve() template <class TSpriteGroup>
inline const TSpriteGroup *Resolve()
{ {
return SpriteGroup::Resolve(this->root_spritegroup, *this); auto result = this->DoResolve();
if (result == nullptr || result->type != TSpriteGroup::TYPE) return nullptr;
return static_cast<const TSpriteGroup *>(result);
} }
/** /**
@ -343,20 +358,20 @@ public:
* - GetReseedSum: Bits to rerandomise for SELF scope, for features with broken-by-design PARENT randomisation. (all but industry tiles) * - GetReseedSum: Bits to rerandomise for SELF scope, for features with broken-by-design PARENT randomisation. (all but industry tiles)
* - GetUsedRandomTriggers: Consumed random triggers to be reset. * - GetUsedRandomTriggers: Consumed random triggers to be reset.
*/ */
void ResolveRerandomisation() inline void ResolveRerandomisation()
{ {
/* The Resolve result has no meaning. /* The Resolve result has no meaning.
* It can be a SpriteSet, a callback result, or even an invalid SpriteGroup reference (nullptr). */ * It can be a SpriteSet, a callback result, or even an invalid SpriteGroup reference (nullptr). */
this->Resolve(); this->DoResolve();
} }
/** /**
* Resolve callback. * Resolve callback.
* @return Callback result. * @return Callback result.
*/ */
uint16_t ResolveCallback() inline uint16_t ResolveCallback()
{ {
const SpriteGroup *result = this->Resolve(); const SpriteGroup *result = this->DoResolve();
return result != nullptr ? result->GetCallbackResult() : CALLBACK_FAILED; return result != nullptr ? result->GetCallbackResult() : CALLBACK_FAILED;
} }

View File

@ -640,7 +640,7 @@ StationResolverObject::StationResolverObject(const StationSpec *statspec, BaseSt
SpriteID GetCustomStationRelocation(const StationSpec *statspec, BaseStation *st, TileIndex tile, uint32_t var10) SpriteID GetCustomStationRelocation(const StationSpec *statspec, BaseStation *st, TileIndex tile, uint32_t var10)
{ {
StationResolverObject object(statspec, st, tile, CBID_NO_CALLBACK, var10); StationResolverObject object(statspec, st, tile, CBID_NO_CALLBACK, var10);
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
if (group == nullptr || group->GetNumResults() == 0) return 0; if (group == nullptr || group->GetNumResults() == 0) return 0;
return group->GetResult() - SPR_RAIL_PLATFORM_Y_FRONT; return group->GetResult() - SPR_RAIL_PLATFORM_Y_FRONT;
} }
@ -659,7 +659,7 @@ SpriteID GetCustomStationFoundationRelocation(const StationSpec *statspec, BaseS
/* callback_param1 == 2 means we are resolving the foundation sprites. */ /* callback_param1 == 2 means we are resolving the foundation sprites. */
StationResolverObject object(statspec, st, tile, CBID_NO_CALLBACK, 2, layout | (edge_info << 16)); StationResolverObject object(statspec, st, tile, CBID_NO_CALLBACK, 2, layout | (edge_info << 16));
const SpriteGroup *group = object.Resolve(); const auto *group = object.Resolve<ResultSpriteGroup>();
/* Note: SpriteGroup::Resolve zeroes all registers, so register 0x100 is initialised to 0. (compatibility) */ /* Note: SpriteGroup::Resolve zeroes all registers, so register 0x100 is initialised to 0. (compatibility) */
auto offset = GetRegister(0x100); auto offset = GetRegister(0x100);
if (group == nullptr || group->GetNumResults() <= offset) return 0; if (group == nullptr || group->GetNumResults() <= offset) return 0;