diff --git a/src/newgrf_callbacks.h b/src/newgrf_callbacks.h index a00f360b64..8bcb218a81 100644 --- a/src/newgrf_callbacks.h +++ b/src/newgrf_callbacks.h @@ -413,4 +413,6 @@ enum AirportTileCallbackMask { static const uint CALLBACK_FAILED = 0xFFFF; ///< Result of a failed callback. static const uint CALLBACK_HOUSEPRODCARGO_END = 0x20FF; ///< Sentinel indicating that the loop for CBID_HOUSE_PRODUCE_CARGO has ended +const char *GetNewGRFCallbackName(CallbackID cbid); + #endif /* NEWGRF_CALLBACKS_H */ diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 008b567d42..ef911673c3 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -1496,3 +1496,90 @@ void ShowSpriteAlignerWindow() { AllocateWindowDescFront(&_sprite_aligner_desc, 0); } + +const char *GetNewGRFCallbackName(CallbackID cbid) +{ + #define CBID(c) case c: return #c; + switch (cbid) { + CBID(CBID_RANDOM_TRIGGER) + CBID(CBID_VEHICLE_VISUAL_EFFECT) + CBID(CBID_VEHICLE_LENGTH) + CBID(CBID_VEHICLE_LOAD_AMOUNT) + CBID(CBID_STATION_AVAILABILITY) + CBID(CBID_STATION_SPRITE_LAYOUT) + CBID(CBID_VEHICLE_REFIT_CAPACITY) + CBID(CBID_VEHICLE_ARTIC_ENGINE) + CBID(CBID_HOUSE_ALLOW_CONSTRUCTION) + CBID(CBID_GENERIC_AI_PURCHASE_SELECTION) + CBID(CBID_VEHICLE_CARGO_SUFFIX) + CBID(CBID_HOUSE_ANIMATION_NEXT_FRAME) + CBID(CBID_HOUSE_ANIMATION_START_STOP) + CBID(CBID_HOUSE_CONSTRUCTION_STATE_CHANGE) + CBID(CBID_TRAIN_ALLOW_WAGON_ATTACH) + CBID(CBID_HOUSE_COLOUR) + CBID(CBID_HOUSE_CARGO_ACCEPTANCE) + CBID(CBID_HOUSE_ANIMATION_SPEED) + CBID(CBID_HOUSE_DESTRUCTION) + CBID(CBID_INDUSTRY_PROBABILITY) + CBID(CBID_VEHICLE_ADDITIONAL_TEXT) + CBID(CBID_STATION_TILE_LAYOUT) + CBID(CBID_INDTILE_ANIM_START_STOP) + CBID(CBID_INDTILE_ANIM_NEXT_FRAME) + CBID(CBID_INDTILE_ANIMATION_SPEED) + CBID(CBID_INDUSTRY_LOCATION) + CBID(CBID_INDUSTRY_PRODUCTION_CHANGE) + CBID(CBID_HOUSE_ACCEPT_CARGO) + CBID(CBID_INDTILE_CARGO_ACCEPTANCE) + CBID(CBID_INDTILE_ACCEPT_CARGO) + CBID(CBID_VEHICLE_COLOUR_MAPPING) + CBID(CBID_HOUSE_PRODUCE_CARGO) + CBID(CBID_INDTILE_SHAPE_CHECK) + CBID(CBID_INDTILE_DRAW_FOUNDATIONS) + CBID(CBID_VEHICLE_START_STOP_CHECK) + CBID(CBID_VEHICLE_32DAY_CALLBACK) + CBID(CBID_VEHICLE_SOUND_EFFECT) + CBID(CBID_VEHICLE_AUTOREPLACE_SELECTION) + CBID(CBID_INDUSTRY_MONTHLYPROD_CHANGE) + CBID(CBID_VEHICLE_MODIFY_PROPERTY) + CBID(CBID_INDUSTRY_CARGO_SUFFIX) + CBID(CBID_INDUSTRY_FUND_MORE_TEXT) + CBID(CBID_CARGO_PROFIT_CALC) + CBID(CBID_INDUSTRY_WINDOW_MORE_TEXT) + CBID(CBID_INDUSTRY_SPECIAL_EFFECT) + CBID(CBID_INDTILE_AUTOSLOPE) + CBID(CBID_INDUSTRY_REFUSE_CARGO) + CBID(CBID_STATION_ANIM_START_STOP) + CBID(CBID_STATION_ANIM_NEXT_FRAME) + CBID(CBID_STATION_ANIMATION_SPEED) + CBID(CBID_HOUSE_DENY_DESTRUCTION) + CBID(CBID_SOUNDS_AMBIENT_EFFECT) + CBID(CBID_CARGO_STATION_RATING_CALC) + CBID(CBID_NEW_SIGNALS_SPRITE_DRAW) + CBID(CBID_CANALS_SPRITE_OFFSET) + CBID(CBID_HOUSE_WATCHED_CARGO_ACCEPTED) + CBID(CBID_STATION_LAND_SLOPE_CHECK) + CBID(CBID_INDUSTRY_DECIDE_COLOUR) + CBID(CBID_INDUSTRY_INPUT_CARGO_TYPES) + CBID(CBID_INDUSTRY_OUTPUT_CARGO_TYPES) + CBID(CBID_HOUSE_CUSTOM_NAME) + CBID(CBID_HOUSE_DRAW_FOUNDATIONS) + CBID(CBID_HOUSE_AUTOSLOPE) + CBID(CBID_AIRPTILE_DRAW_FOUNDATIONS) + CBID(CBID_AIRPTILE_ANIM_START_STOP) + CBID(CBID_AIRPTILE_ANIM_NEXT_FRAME) + CBID(CBID_AIRPTILE_ANIMATION_SPEED) + CBID(CBID_AIRPORT_ADDITIONAL_TEXT) + CBID(CBID_AIRPORT_LAYOUT_NAME) + CBID(CBID_OBJECT_LAND_SLOPE_CHECK) + CBID(CBID_OBJECT_ANIMATION_NEXT_FRAME) + CBID(CBID_OBJECT_ANIMATION_START_STOP) + CBID(CBID_OBJECT_ANIMATION_SPEED) + CBID(CBID_OBJECT_COLOUR) + CBID(CBID_OBJECT_FUND_MORE_TEXT) + CBID(CBID_OBJECT_AUTOSLOPE) + CBID(CBID_VEHICLE_REFIT_COST) + CBID(CBID_INDUSTRY_PROD_CHANGE_BUILD) + CBID(CBID_VEHICLE_SPAWN_VISUAL_EFFECT) + default: return nullptr; + } +} diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index a86eb27bbe..a22118a0b1 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -889,6 +889,15 @@ void SpriteGroupDumper::DumpSpriteGroup(const SpriteGroup *sg, int padding, uint } } + bool is_callback_group = false; + if (adjusts->size() == 1 && !dsg->calculated_result) { + const DeterministicSpriteGroupAdjust &adjust = (*adjusts)[0]; + if (adjust.variable == 0xC && (adjust.operation == DSGA_OP_ADD || adjust.operation == DSGA_OP_RST) + && adjust.shift_num == 0 && (adjust.and_mask & 0xFF) == 0xFF && adjust.type == DSGA_TYPE_NONE) { + is_callback_group = true; + } + } + if (padding == 0 && !dsg->calculated_result && default_group != nullptr) { this->top_default_group = default_group; } @@ -932,7 +941,14 @@ void SpriteGroupDumper::DumpSpriteGroup(const SpriteGroup *sg, int padding, uint print(); } else { for (const auto &range : (*ranges)) { - seprintf(this->buffer, lastof(this->buffer), "%*srange: %X -> %X", padding, "", range.low, range.high); + char *p = this->buffer; + p += seprintf(p, lastof(this->buffer), "%*srange: %X -> %X", padding, "", range.low, range.high); + if (range.low == range.high && is_callback_group) { + const char *cb_name = GetNewGRFCallbackName((CallbackID)range.low); + if (cb_name != nullptr) { + p += seprintf(p, lastof(this->buffer), " (%s)", cb_name); + } + } print(); this->DumpSpriteGroup(range.group, padding + 2, 0); }