From d3e2a4eadcd63b6a1329552c87d34f5ed5d58c69 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Mon, 2 Nov 2026 18:13:08 +0000 Subject: [PATCH] Decompile fn_12344 (UIExchangeWnd::SendMsg) Batch #10160 by KWDev: 0 byte-identical, 1 confirmed by peer review. - fn_12344 UIExchangeWnd::SendMsg: logic confirmed by peer review Peer-reviewed-by: ragnarok-clanker, gordaoprogramas, cremane Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/UI/Acceptance/UIChooseSellBuyWnd.cpp | 198 ++++++++++++++++++++ Source/UI/Dialogs/UITipboxWnd.h | 15 +- Source/UI/Party/UIPartySettingWnd.h | 11 +- 3 files changed, 215 insertions(+), 9 deletions(-) diff --git a/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp b/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp index 1c9b35ec8..c13033036 100644 --- a/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp +++ b/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp @@ -139,6 +139,7 @@ #include "Contents/NavigationManager.h" #include "UI/Text/NavigationLink.h" #include "Utility/Text/GroupedInteger.h" +#include "Utility/Math/Int64Math.h" #include "Client/Mode/ModeTooltip.h" #include "Script/LuaScript.h" #include "Utility/Text/StringUtil.h" @@ -4023,6 +4024,8 @@ void UISkillNameChangeWnd::Slot15(int, int) { this->m_message0 = 184; } +// OFFSET: 0x008E9C90 + // OFFSET: 0x008EA780 // FUNCTION: fn_12205 void UIToolTipWnd::Slot15(int width, int height) { @@ -5000,6 +5003,199 @@ int UISayDialogWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std: } } +// OFFSET: 0x008FAF50 +// FUNCTION: fn_12344 +int UIExchangeWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::intptr_t b, std::intptr_t c, std::intptr_t d) { + switch (message) { + case 6: { + CMode* mode = g_modeMgr.GetGameMode(); + switch (a) { + case 184: + if (this->unknown_00D4 != 0) { + return 0; + } + if (this->unknown_00C0) { + char text[24]; + std::sprintf(text, "%s ", this->unknown_00C0->Text()); + if (!g_session.IsNumberWithCommas(text)) { + reinterpret_cast(g_windowMgr).Confirm(LookupMessage(602), 0, true, false, 0, "Message", 280, 120, 0); + return 0; + } + + std::int64_t money = _atoi64(text); + if (money > 0x7FFFFFFF) { + money = 0x7FFFFFFF; + } + int amount = static_cast(MaxInt64(money, 0)); + if (amount < 0) { + amount = 0; + } + if (amount > g_session.m_zeny) { + amount = g_session.m_zeny; + } + mode->SendMsg(51, 0, g_session.unknown_5210 + amount, 0, 0); + this->CancelInput(); + } + mode->SendMsg(52, 0, 0, 0, 0); + this->unknown_00D4 = 1; + return 0; + case 185: + if (this->unknown_00DC != 0) { + return 0; + } + mode->SendMsg(53, 0, 0, 0, 0); + this->unknown_00DC = 1; + return 0; + case 213: + this->unknown_011C = b != 0; + return 0; + case 226: { + if (!this->unknown_00C0) { + return 0; + } + int amount = std::atoi(this->unknown_00C0->Text()); + if (amount < 0) { + amount = 0; + } + if (amount > g_session.m_zeny) { + amount = g_session.m_zeny; + } + mode->SendMsg(51, 0, g_session.unknown_5210 + amount, 0, 0); + this->CancelInput(); + return 0; + } + case 230: + if (this->unknown_00D8 != 0) { + return 0; + } + if (this->unknown_011C) { + const std::string text = FormatOwnedString(LookupMessage(1832), this->unknown_00F0.c_str()); + g_modeMgr.gameMode->SendMsg(68, reinterpret_cast(text.c_str()), 0, 0, 0); + } + mode->SendMsg(54, 0, 0, 0, 0); + this->unknown_00D8 = 1; + this->LayoutButtons(); + return 0; + } + return 0; + } + case 7: + return 0; + case 23: + this->m_myItems.erase(this->m_myItems.begin(), this->m_myItems.end()); + this->m_otherItems.erase(this->m_otherItems.begin(), this->m_otherItems.end()); + for (int index = 0; index < 10; ++index) { + ITEM_INFO item = g_session.GetExchangeItem(index); + if (item.quantity != 0) { + this->m_myItems.push_back(item); + } + ITEM_INFO slot = g_session.GetItemSlot(index); + if (slot.quantity != 0) { + this->m_otherItems.push_back(slot); + } + } + this->Invalidate(); + return 0; + case 38: { + CGameMode* mode = static_cast(g_modeMgr.GetGameMode()); + mode->SendMsg(51, mode->drag.id, mode->drag.quantity, 0, 0); + mode->SendMsg(18, 0, 0, 0, 0); + return 0; + } + case 50: + this->unknown_00F0 = reinterpret_cast(a); + this->unknown_0108 = static_cast(b); + this->unknown_010C = static_cast(c); + return 0; + case 51: + this->unknown_00CC = 1; + this->CancelInput(); + this->LayoutButtons(); + return 0; + case 52: + this->unknown_00D0 = 1; + this->CancelInput(); + this->LayoutButtons(); + return 0; + case 123: { + const unsigned char* records = reinterpret_cast(a); + FramedMessageHeader header{}; + std::memcpy(&header, records, sizeof(header)); + if (header.type == 20600) { + unsigned int position = sizeof(header); + int number = 0; + short level = 0; + while (position < static_cast(b)) { + std::memcpy(&header, records + position, sizeof(header)); + position += sizeof(header); + switch (header.type) { + case 20601: + this->SendMsg(nullptr, 23, 0, 0, 0, 0); + return 0; + case 20602: { + char name[260]; + std::memset(name, 0, sizeof(name)); + std::memcpy(name, records + position, header.length); + position += header.length; + this->SendMsg(nullptr, 50, reinterpret_cast(name), number, level, 0); + break; + } + case 20603: + std::memcpy(&number, records + position, header.length); + position += header.length; + break; + case 20604: + std::memcpy(&level, records + position, header.length); + position += header.length; + break; + case 20605: + std::memcpy(&this->unknown_00CC, records + position, header.length); + position += header.length; + if (this->unknown_00CC != 0) { + this->SendMsg(nullptr, 51, 0, 0, 0, 0); + } + break; + case 20606: + std::memcpy(&this->unknown_00D0, records + position, header.length); + position += header.length; + if (this->unknown_00D0 != 0) { + this->SendMsg(nullptr, 52, 0, 0, 0, 0); + } + break; + case 20607: + std::memcpy(&this->unknown_00D4, records + position, header.length); + position += header.length; + if (this->unknown_00D4 != 0) { + this->SendMsg(nullptr, 6, 184, 0, 0, 0); + } + break; + case 20608: + std::memcpy(&this->unknown_00D8, records + position, header.length); + position += header.length; + if (this->unknown_00D8 != 0) { + this->SendMsg(nullptr, 6, 230, 0, 0, 0); + } + break; + case 20609: + std::memcpy(&this->unknown_00DC, records + position, header.length); + position += header.length; + if (this->unknown_00DC != 0) { + this->SendMsg(nullptr, 6, 185, 0, 0, 0); + } + break; + default: + position += header.length; + break; + } + } + } + return 0; + } + default: + return UIFrameWnd::SendMsg(sender, message, a, b, c, d); + } +} + // OFFSET: 0x008FB850 // FUNCTION: fn_12345 int UIGraffiStrboxWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::intptr_t b, std::intptr_t c, std::intptr_t d) { @@ -6588,6 +6784,8 @@ void UIPartyInvitationToWnd::Slot15(int, int) { focus.Set(this->m_edit); } +// OFFSET: 0x008E60A0 + // OFFSET: 0x008F95F0 // FUNCTION: fn_12339 int UICoupleAcceptWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::intptr_t b, std::intptr_t c, std::intptr_t d) { diff --git a/Source/UI/Dialogs/UITipboxWnd.h b/Source/UI/Dialogs/UITipboxWnd.h index f15882272..0fcdc9aa7 100644 --- a/Source/UI/Dialogs/UITipboxWnd.h +++ b/Source/UI/Dialogs/UITipboxWnd.h @@ -11,7 +11,9 @@ class UIStaticText; class UIEditCtrl; class UIListBoxID; class UITagTextViewer; -class UIButton; +class UIBitmapButton; +struct UIButtonContext; +struct UIEditContext; struct TipBoxAnimation { /* 0000 */ std::uint32_t moveStart; @@ -46,6 +48,7 @@ public: void Search(std::string& keyword); void RefreshTip(); int SendMsg(UIWindow* sender, int message, std::intptr_t a, std::intptr_t b, std::intptr_t c, std::intptr_t d) override; + void Slot15(int width, int height) override; void Slot19() override; void Paint() override; @@ -56,15 +59,19 @@ public: /* 00C4 */ UIStaticText* unknown_00C4; /* 00C8 */ UIStaticText* m_pageText; /* 00CC */ UIStaticText* m_pageTotalText; - /* 00D0 */ UIButton* unknown_00D0; - /* 00D4 */ UIButton* unknown_00D4; - /* 00D8 */ UIButton* unknown_00D8; + /* 00D0 */ UIBitmapButton* unknown_00D0; + /* 00D4 */ UIBitmapButton* unknown_00D4; + /* 00D8 */ UIBitmapButton* unknown_00D8; /* 00DC */ std::vector m_animations; /* 00E8 */ std::vector m_dots; /* 00F4 */ std::uint32_t m_buildTime; /* 00F8 */ std::uint32_t m_frameTime; /* 00FC */ bool unknown_00FC; /* 0100 */ int unknown_0100; + +protected: + UIButtonContext* m_controls; + UIEditContext* m_editContext; }; #if defined(_WIN32) && !defined(_WIN64) diff --git a/Source/UI/Party/UIPartySettingWnd.h b/Source/UI/Party/UIPartySettingWnd.h index d4f75de5f..af718fdf3 100644 --- a/Source/UI/Party/UIPartySettingWnd.h +++ b/Source/UI/Party/UIPartySettingWnd.h @@ -30,6 +30,12 @@ public: protected: UIButtonContext* m_controls; + +public: + /* 00E0 */ UIEditCtrl* m_edit; + +protected: + UIEditContext* m_editContext; }; class UIPartyInvitationToWnd : public UIPartySettingWnd { @@ -39,11 +45,6 @@ public: int SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) override; void Slot15(int width, int height) override; - - /* 00E0 */ UIEditCtrl* m_edit; - -protected: - UIEditContext* m_editContext; }; #endif