From c71b4dee4fbc1d131dcbe3a8ee80e31f30f0e6cc Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Thu, 29 Oct 2026 20:58:13 +0000 Subject: [PATCH] Decompile fn_11208 (UIListBoxNavi::SetLineColor) Batch #3214 by youko: 0 byte-identical, 1 confirmed by peer review. - fn_11208 UIListBoxNavi::SetLineColor: logic confirmed by peer review Peer-reviewed-by: eAthena, alisonrag, superintelligence Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/UI/Lists/UIListBoxNavi.h | 18 ++++ Source/UI/Text/UITextViewer.h | 1 + Source/UI/Text/UITextViewerLinks.cpp | 133 +++++---------------------- 3 files changed, 43 insertions(+), 109 deletions(-) create mode 100644 Source/UI/Lists/UIListBoxNavi.h diff --git a/Source/UI/Lists/UIListBoxNavi.h b/Source/UI/Lists/UIListBoxNavi.h new file mode 100644 index 00000000..1bd67866 --- /dev/null +++ b/Source/UI/Lists/UIListBoxNavi.h @@ -0,0 +1,18 @@ +#ifndef RAGNAROK_SOURCE_UI_LISTS_UILISTBOXNAVI_H +#define RAGNAROK_SOURCE_UI_LISTS_UILISTBOXNAVI_H + +#include "UI/Lists/UIListBox.h" + +#include +#include + +class UIListBoxNavi : public UIListBox { +public: + /* 00D4 */ std::uint32_t defaultLineColor; + /* 00D8 */ std::vector lineColors; + /* 00E4 */ int lineOffset; + + void SetLineColor(int line, std::uint32_t color); +}; + +#endif diff --git a/Source/UI/Text/UITextViewer.h b/Source/UI/Text/UITextViewer.h index 70fe7d2c..9428ac18 100644 --- a/Source/UI/Text/UITextViewer.h +++ b/Source/UI/Text/UITextViewer.h @@ -63,6 +63,7 @@ private: bool AddUrlLinks(std::string text, unsigned addedLines); bool AddNaviLinks(std::string text, unsigned addedLines); bool AddQuestLinks(std::string text, unsigned addedLines); + void AddTipLinks(std::string text, unsigned addedLines); void AppendText(char* text, int width, bool carriageReturns, bool pixels); void Activate(UITextButton* button, int id); }; diff --git a/Source/UI/Text/UITextViewerLinks.cpp b/Source/UI/Text/UITextViewerLinks.cpp index 94551bd4..3821934e 100644 --- a/Source/UI/Text/UITextViewerLinks.cpp +++ b/Source/UI/Text/UITextViewerLinks.cpp @@ -5,10 +5,12 @@ #include "UI/Text/PixelTextWrapping.h" #include "UI/Text/TextMarkup.h" #include "UI/Text/TextWrapping.h" +#include "UI/Lists/UIListBoxNavi.h" #include "UI/Lists/UIScrollBar.h" #include "UI/Buttons/UITextButton.h" #include "UI/Text/UITextViewer.h" +#include #include // INLINED @@ -137,6 +139,19 @@ bool UITextViewer::AddNaviLinks(std::string text, unsigned addedLines) { return true; } +// OFFSET: 0x00876FD0 +// FUNCTION: fn_11208 +void UIListBoxNavi::SetLineColor(int line, std::uint32_t color) { + const int index = this->lineOffset + line; + + if (index < 0 || this->lines.size() < static_cast(index)) { + return; + } + + this->lineColors[index] = color; + this->Invalidate(); +} + // OFFSET: 0x00877020 // FUNCTION: fn_11209 bool UITextViewer::AddQuestLinks(std::string text, unsigned addedLines) { @@ -181,6 +196,8 @@ bool UITextViewer::AddQuestLinks(std::string text, unsigned addedLines) { return true; } +// OFFSET: 0x00877B00 + // OFFSET: 0x00878750 // OFFSET: 0x00878750 // FUNCTION: fn_11212 @@ -233,122 +250,20 @@ void UITextViewer::AddLinks(const char* text, unsigned addedLines, int kind) { switch (kind) { case 0: this->AddItemLinks(text, addedLines); - return; + break; case 1: this->AddUrlLinks(text, addedLines); - return; + break; case 2: this->AddNaviLinks(text, addedLines); - return; + break; + case 3: + this->AddTipLinks(text, addedLines); + break; case 4: this->AddQuestLinks(text, addedLines); - return; + break; default: break; } - auto& owner = this->m_text->list; - std::string parsed = RemoveTextColors(text, owner.codePage); - - if (kind != 1) { - parsed = DisplayTextTag(std::move(parsed), "", ""); - } - - if (kind != 2) { - parsed = DisplayTextTag(std::move(parsed), "", ""); - } - - if (kind == 1 || kind == 2 || kind == 3) { - parsed = DisplayTextTag(std::move(parsed), "", ""); - } - - if (kind == 3) { - parsed = DisplayTextTag(std::move(parsed), "", ""); - } - - if (this->m_text->chatConversions) { - parsed = this->ConvertChat(std::move(parsed)); - } - - if (kind == 1 || kind == 2) { - parsed = DisplayTextTag(std::move(parsed), "", ""); - } - - std::string navigation; - DisplayNavigationLink(navigation, parsed); - parsed = std::move(navigation); - - if (kind == 0 || kind == 4) { - parsed = DisplayTextTag(std::move(parsed), "", ""); - } - - if (kind == 1 || kind == 2) { - parsed = DisplayTextTag(std::move(parsed), "", ""); - } - - const char* begins[] = {"", "", "", "", ""}; - const char* ends[] = {"", "", "", "", ""}; - const int ids[] = {464, 437, 438, 517, 539}; - std::vector extracted; - ExtractTextLinks(std::move(parsed), begins[kind], ends[kind], extracted); - - for (const auto& link : extracted) { - std::vector labels; - - if (kind == 3 && this->splitTipLinks == 1) { - const char* begin = link.display.c_str(); - const char* current = begin; - const char* end = begin + link.display.size(); - const char* breakAt = begin; - auto limit = reinterpret_cast(begin) + 32u - link.position; - - while (current < end) { - current = CharNextExA(owner.codePage, current, 0); - - while (*current == ' ') { - breakAt = ++current; - } - - if (reinterpret_cast(current) >= limit || *current == '\n') { - if (*current == '\n') { - breakAt = current++; - } - - const char* split = breakAt <= begin ? current : breakAt; - labels.emplace_back(begin, split); - begin = split; - limit = reinterpret_cast(begin) + 32u; - } - } - - if (begin < current) { - labels.emplace_back(begin, current); - } - } else { - labels.push_back(link.display); - } - - for (unsigned fragment = 0; fragment < labels.size(); ++fragment) { - if (kind == 1) { - labels[fragment] = RemoveTextLinkInfo(std::move(labels[fragment])); - } - - auto* button = new UITextButton(*this->m_context, this->m_text->buttons); - button->Configure(labels[fragment].c_str(), kind == 1 ? 0x00E6A300 : 0x00F4934A, 0, 12, 0, 1); - const int height = button->geometry.height; - const int width = this->TextWidth(owner.fonts, owner.locale, labels[fragment].c_str(), 0, 0, 12, 0, 0); - button->Resize(width + 1, height); - button->m_hoverColor = kind == 1 ? 0x00E6A300 : 0x00FF7864; - button->SetId(ids[kind]); - SplitTextLinkArguments(link.metadata, button->m_lines); - const auto position = this->LinkPosition(fragment == 0 ? link.position : 0, addedLines - fragment); - button->m_value = position.first; - button->Move(position.second, -100); - this->AddChild(button); - this->links.push_back(button); - } - } - - if (!extracted.empty()) { - this->SendMsg(nullptr, 7, 0, 0, 0, 0); - } }