From c238bd501250d766310361e326a6de65bb6e0d5a Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 2 Jun 2022 19:34:19 +0100 Subject: [PATCH] Debug: Add temp store highlighting to sprite group dump window Add tooltip --- src/lang/english.txt | 1 + src/newgrf_debug_gui.cpp | 31 +++++++++++++++------ src/newgrf_spritegroup.cpp | 57 +++++++++++++++++++------------------- src/newgrf_spritegroup.h | 2 +- 4 files changed, 53 insertions(+), 38 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 50c47177cb..49ff1e0138 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -4207,6 +4207,7 @@ STR_NEWGRF_INSPECT_LOG_CONSOLE :{BLACK}L STR_NEWGRF_INSPECT_LOG_CONSOLE_TOOLTIP :{BLACK}Log text content of this window to the console STR_NEWGRF_INSPECT_SPRITE_DUMP :{BLACK}S STR_NEWGRF_INSPECT_SPRITE_DUMP_TOOLTIP :{BLACK}Display current sprite chain +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP :{BLACK}Click to highlight sprite group{}Ctrl+Click to highlight temporary storage register STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING1} at {HEX} STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Object diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index f80c7ab74b..8e41f29736 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -320,6 +320,8 @@ struct NewGRFInspectWindow : Window { btree::btree_map extra_info_click_flag_toggles; btree::btree_map sprite_group_lines; const SpriteGroup *selected_sprite_group = nullptr; + btree::btree_map highlight_tag_lines; + uint32 selected_highlight_tag = 0; /** * Check whether the given variable has a parameter. @@ -525,16 +527,18 @@ struct NewGRFInspectWindow : Window { }; const_cast(this)->sprite_group_lines.clear(); if (this->sprite_dump) { - nih->SpriteDump(index, [&](const SpriteGroup *group, const char *buf) { + nih->SpriteDump(index, [&](const SpriteGroup *group, uint32 highlight_tag, const char *buf) { if (this->log_console) DEBUG(misc, 0, " %s", buf); int offset = i++; int scroll_offset = offset - this->vscroll->GetPosition(); if (scroll_offset < 0 || scroll_offset >= this->vscroll->GetCapacity()) return; - const_cast(this)->sprite_group_lines[offset] = group; + if (group != nullptr) const_cast(this)->sprite_group_lines[offset] = group; + if (highlight_tag != 0) const_cast(this)->highlight_tag_lines[offset] = highlight_tag; TextColour colour = (this->selected_sprite_group == group) ? TC_LIGHT_BLUE : TC_BLACK; + if (highlight_tag != 0 && this->selected_highlight_tag == highlight_tag) colour = TC_YELLOW; ::DrawString(r.left + LEFT_OFFSET, r.right - RIGHT_OFFSET, r.top + TOP_OFFSET + (scroll_offset * this->resize.step_height), buf, colour); }); return; @@ -730,12 +734,22 @@ struct NewGRFInspectWindow : Window { if (line == INT_MAX) return; if (this->sprite_dump) { - const SpriteGroup *group = nullptr; - auto iter = this->sprite_group_lines.find(line); - if (iter != this->sprite_group_lines.end()) group = iter->second; - if (group != nullptr || this->selected_sprite_group != nullptr) { - this->selected_sprite_group = (group == this->selected_sprite_group) ? nullptr : group; - this->SetWidgetDirty(WID_NGRFI_MAINPANEL); + if (_ctrl_pressed) { + uint32 highlight_tag = 0; + auto iter = this->highlight_tag_lines.find(line); + if (iter != this->highlight_tag_lines.end()) highlight_tag = iter->second; + if (highlight_tag != 0 || this->selected_highlight_tag != 0) { + this->selected_highlight_tag = (highlight_tag == this->selected_highlight_tag) ? 0 : highlight_tag; + this->SetWidgetDirty(WID_NGRFI_MAINPANEL); + } + } else { + const SpriteGroup *group = nullptr; + auto iter = this->sprite_group_lines.find(line); + if (iter != this->sprite_group_lines.end()) group = iter->second; + if (group != nullptr || this->selected_sprite_group != nullptr) { + this->selected_sprite_group = (group == this->selected_sprite_group) ? nullptr : group; + this->SetWidgetDirty(WID_NGRFI_MAINPANEL); + } } return; } @@ -782,6 +796,7 @@ struct NewGRFInspectWindow : Window { case WID_NGRFI_SPRITE_DUMP: { this->sprite_dump = !this->sprite_dump; this->SetWidgetLoweredState(WID_NGRFI_SPRITE_DUMP, this->sprite_dump); + this->GetWidget(WID_NGRFI_MAINPANEL)->SetToolTip(this->sprite_dump ? STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP : STR_NULL); this->SetWidgetDirty(WID_NGRFI_SPRITE_DUMP); this->SetWidgetDirty(WID_NGRFI_MAINPANEL); this->SetWidgetDirty(WID_NGRFI_SCROLLBAR); diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index d2f4744ef2..75a6972737 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -682,8 +682,10 @@ static const char *GetAdjustOperationName(DeterministicSpriteGroupAdjustOperatio void SpriteGroupDumper::DumpSpriteGroup(const SpriteGroup *sg, int padding, uint flags) { + uint32 highlight_tag = 0; auto print = [&]() { - this->print_fn(sg, this->buffer); + this->print_fn(sg, highlight_tag, this->buffer); + highlight_tag = 0; }; if (sg == nullptr) { @@ -734,11 +736,19 @@ void SpriteGroupDumper::DumpSpriteGroup(const SpriteGroup *sg, int padding, uint padding += 2; for (const auto &adjust : dsg->adjusts) { char *p = this->buffer; + if (adjust.variable == 0x7D) { + /* Temp storage load */ + highlight_tag = (1 << 16) | (adjust.parameter & 0xFFFF); + } if (adjust.operation == DSGA_OP_TERNARY) { p += seprintf(p, lastof(this->buffer), "%*sTERNARY: true: %X, false: %X", padding, "", adjust.and_mask, adjust.add_val); print(); continue; } + if (adjust.operation == DSGA_OP_STO && adjust.type == DSGA_TYPE_NONE && adjust.variable == 0x1A && adjust.shift_num == 0) { + /* Temp storage store */ + highlight_tag = (1 << 16) | (adjust.and_mask & 0xFFFF); + } p += seprintf(p, lastof(this->buffer), "%*svar: %X", padding, "", adjust.variable); if (adjust.variable == A2VRI_VEHICLE_CURRENT_SPEED_SCALED) { p += seprintf(p, lastof(this->buffer), " (current_speed_scaled)"); @@ -815,34 +825,21 @@ void SpriteGroupDumper::DumpSpriteGroup(const SpriteGroup *sg, int padding, uint const TileLayoutRegisters *reg = registers + i; seprintf(this->buffer, lastof(this->buffer), "%*ssection: %X, register flags: %X", padding, "", (uint)i, reg->flags); print(); - if (reg->flags & TLF_DODRAW) { - seprintf(this->buffer, lastof(this->buffer), "%*sTLF_DODRAW reg: %X", padding + 2, "", reg->dodraw); - print(); - } - if (reg->flags & TLF_SPRITE) { - seprintf(this->buffer, lastof(this->buffer), "%*sTLF_SPRITE reg: %X", padding + 2, "", reg->sprite); - print(); - } - if (reg->flags & TLF_PALETTE) { - seprintf(this->buffer, lastof(this->buffer), "%*sTLF_PALETTE reg: %X", padding + 2, "", reg->palette); - print(); - } - if (reg->flags & TLF_BB_XY_OFFSET) { - seprintf(this->buffer, lastof(this->buffer), "%*sTLF_BB_XY_OFFSET reg: %X, %X", padding + 2, "", reg->delta.parent[0], reg->delta.parent[1]); - print(); - } - if (reg->flags & TLF_BB_Z_OFFSET) { - seprintf(this->buffer, lastof(this->buffer), "%*sTLF_BB_Z_OFFSET reg: %X", padding + 2, "", reg->delta.parent[2]); - print(); - } - if (reg->flags & TLF_CHILD_X_OFFSET) { - seprintf(this->buffer, lastof(this->buffer), "%*sTLF_CHILD_X_OFFSET reg: %X", padding + 2, "", reg->delta.child[0]); - print(); - } - if (reg->flags & TLF_CHILD_Y_OFFSET) { - seprintf(this->buffer, lastof(this->buffer), "%*sTLF_CHILD_Y_OFFSET reg: %X", padding + 2, "", reg->delta.child[1]); - print(); - } + auto log_reg = [&](TileLayoutFlags flag, const char *name, uint8 flag_reg) { + if (reg->flags & flag) { + highlight_tag = (1 << 16) | flag_reg; + seprintf(this->buffer, lastof(this->buffer), "%*s%s reg: %X", padding + 2, "", name, flag_reg); + print(); + } + }; + log_reg(TLF_DODRAW, "TLF_DODRAW", reg->dodraw); + log_reg(TLF_SPRITE, "TLF_SPRITE", reg->sprite); + log_reg(TLF_PALETTE, "TLF_PALETTE", reg->palette); + log_reg(TLF_BB_XY_OFFSET, "TLF_BB_XY_OFFSET x", reg->delta.parent[0]); + log_reg(TLF_BB_XY_OFFSET, "TLF_BB_XY_OFFSET y", reg->delta.parent[1]); + log_reg(TLF_BB_Z_OFFSET, "TLF_BB_Z_OFFSET", reg->delta.parent[2]); + log_reg(TLF_CHILD_X_OFFSET, "TLF_CHILD_X_OFFSET", reg->delta.child[0]); + log_reg(TLF_CHILD_Y_OFFSET, "TLF_CHILD_Y_OFFSET", reg->delta.child[1]); if (reg->flags & TLF_SPRITE_VAR10) { seprintf(this->buffer, lastof(this->buffer), "%*sTLF_SPRITE_VAR10 value: %X", padding + 2, "", reg->sprite_var10); print(); @@ -860,6 +857,7 @@ void SpriteGroupDumper::DumpSpriteGroup(const SpriteGroup *sg, int padding, uint seprintf(this->buffer, lastof(this->buffer), "%*sIndustry Production (version %X) [%u]", padding, "", ipsg->version, ipsg->nfo_line); print(); auto log_io = [&](const char *prefix, int i, int quantity, CargoID cargo) { + if (ipsg->version >= 1) highlight_tag = (1 << 16) | quantity; if (ipsg->version >= 2) { seprintf(this->buffer, lastof(this->buffer), "%*s%s %X: reg %X, cargo ID: %X", padding + 2, "", prefix, i, quantity, cargo); print(); @@ -875,6 +873,7 @@ void SpriteGroupDumper::DumpSpriteGroup(const SpriteGroup *sg, int padding, uint for (int i = 0; i < ipsg->num_output; i++) { log_io("Add input", i, ipsg->add_output[i], ipsg->cargo_output[i]); } + if (ipsg->version >= 1) highlight_tag = (1 << 16) | ipsg->again; seprintf(this->buffer, lastof(this->buffer), "%*sAgain: %s %X", padding + 2, "", (ipsg->version >= 1) ? "reg" : "value", ipsg->again); print(); break; diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index 8f227ce22a..1b3d273858 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -569,7 +569,7 @@ struct ResolverObject { virtual uint32 GetDebugID() const { return 0; } }; -using DumpSpriteGroupPrinter = std::function; +using DumpSpriteGroupPrinter = std::function; void DumpSpriteGroup(const SpriteGroup *sg, DumpSpriteGroupPrinter print); uint32 EvaluateDeterministicSpriteGroupAdjust(DeterministicSpriteGroupSize size, const DeterministicSpriteGroupAdjust &adjust, ScopeResolver *scope, uint32 last_value, uint32 value);