diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index f9bf25a3de..746748d393 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -1622,7 +1622,9 @@ void AnalyseEngineCallbacks() void DumpVehicleSpriteGroup(const Vehicle *v, DumpSpriteGroupPrinter print) { char buffer[512]; + const Engine *e = Engine::Get(v->engine_type); const SpriteGroup *root_spritegroup = nullptr; + if (v->IsGroundVehicle()) { root_spritegroup = GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->GetGroundVehicleCache()->first_engine); if (root_spritegroup != nullptr) { @@ -1632,7 +1634,6 @@ void DumpVehicleSpriteGroup(const Vehicle *v, DumpSpriteGroupPrinter print) } if (root_spritegroup == nullptr) { - const Engine *e = Engine::Get(v->engine_type); CargoID cargo = v->cargo_type; assert(cargo < lengthof(e->grf_prop.spritegroup)); if (e->grf_prop.spritegroup[cargo] != nullptr) { @@ -1644,5 +1645,33 @@ void DumpVehicleSpriteGroup(const Vehicle *v, DumpSpriteGroupPrinter print) } print(nullptr, DSGPO_PRINT, 0, buffer); } - DumpSpriteGroup(root_spritegroup, std::move(print)); + + SpriteGroupDumper dumper(print); + dumper.DumpSpriteGroup(root_spritegroup, 0, 0); + + for (uint i = 0; i < NUM_CARGO + 2; i++) { + if (e->grf_prop.spritegroup[i] != root_spritegroup && e->grf_prop.spritegroup[i] != nullptr) { + print(nullptr, DSGPO_PRINT, 0, ""); + switch (i) { + case CT_DEFAULT: + seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: CT_DEFAULT"); + break; + case CT_PURCHASE: + seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: CT_PURCHASE"); + break; + default: + seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: Cargo: %u", i); + break; + } + print(nullptr, DSGPO_PRINT, 0, buffer); + dumper.DumpSpriteGroup(e->grf_prop.spritegroup[i], 0, 0); + } + } + for (const WagonOverride &wo : e->overrides) { + if (wo.group != root_spritegroup && wo.group != nullptr) { + print(nullptr, DSGPO_PRINT, 0, ""); + print(nullptr, DSGPO_PRINT, 0, "OTHER SPRITE GROUP: Wagon override"); + dumper.DumpSpriteGroup(wo.group, 0, 0); + } + } } diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index 2796f44cca..b94460a8c6 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -609,24 +609,6 @@ const DrawTileSprites *TileLayoutSpriteGroup::ProcessRegisters(uint8 *stage) con return &result; } -struct SpriteGroupDumper { -private: - char buffer[1024]; - DumpSpriteGroupPrinter print_fn; - - const SpriteGroup *top_default_group = nullptr; - btree::btree_set seen_dsgs; - - enum SpriteGroupDumperFlags { - SGDF_DEFAULT = 1 << 0, - }; - -public: - SpriteGroupDumper(DumpSpriteGroupPrinter print) : print_fn(print) {} - - void DumpSpriteGroup(const SpriteGroup *sg, int padding, uint flags); -}; - static const char *_dsg_op_names[] { "ADD", "SUB", diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index e2dd4e0d0e..d87e75a862 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -587,6 +587,24 @@ enum DumpSpriteGroupPrintOp { using DumpSpriteGroupPrinter = std::function; +struct SpriteGroupDumper { +private: + char buffer[1024]; + DumpSpriteGroupPrinter print_fn; + + const SpriteGroup *top_default_group = nullptr; + btree::btree_set seen_dsgs; + + enum SpriteGroupDumperFlags { + SGDF_DEFAULT = 1 << 0, + }; + +public: + SpriteGroupDumper(DumpSpriteGroupPrinter print) : print_fn(print) {} + + void DumpSpriteGroup(const SpriteGroup *sg, int padding, uint flags); +}; + void DumpSpriteGroup(const SpriteGroup *sg, DumpSpriteGroupPrinter print); uint32 EvaluateDeterministicSpriteGroupAdjust(DeterministicSpriteGroupSize size, const DeterministicSpriteGroupAdjust &adjust, ScopeResolver *scope, uint32 last_value, uint32 value);