From c19b4ffce4ca5d8f8bc91ebd09609f245782bf2b Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Sat, 31 Oct 2026 12:33:27 +0000 Subject: [PATCH] Decompile fn_13432 (UIMerchantMirrorItemWnd::SendMsg) Batch #7909 by eAthena: 0 byte-identical, 1 confirmed by peer review. - fn_13432 UIMerchantMirrorItemWnd::SendMsg: logic confirmed by peer review Peer-reviewed-by: secret, Snow, Tanke, Montyla, pedrao Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/UI/Edit/UIEditCtrl.cpp | 110 ++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/Source/UI/Edit/UIEditCtrl.cpp b/Source/UI/Edit/UIEditCtrl.cpp index 5af42d8e..b2ea36e5 100644 --- a/Source/UI/Edit/UIEditCtrl.cpp +++ b/Source/UI/Edit/UIEditCtrl.cpp @@ -3647,6 +3647,116 @@ int UIMerchantItemWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, s } // OFFSET: 0x00991C40 +// FUNCTION: fn_13432 +int UIMerchantMirrorItemWnd::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: + break; + case 14: + if (a == 7) { + int width = b <= 320 ? b : 320; + int height = c <= 240 ? c : 240; + if (width < 232) { + width = 232; + } + if (height < 120) { + height = 120; + } + + const int newWidth = (width - 280) / 32 * 32 + 280; + const int newHeight = (height - 120) / 32 * 32 + 120; + if (newWidth != this->geometry.width || newHeight != this->geometry.height) { + this->Resize(newWidth, newHeight); + this->columns = (newWidth - 40) / 32; + this->visibleRows = (newHeight - 38) / 32; + this->resizer->Move(this->geometry.width - 15, this->geometry.height - 15); + this->scrollBar->Move(this->geometry.width - 15, 14); + this->scrollBar->Resize(this->scrollBar->geometry.width, this->geometry.height - 38); + this->UpdateScrollBar(); + } + + this->m_frameContext->snapping.Store(this); + return 0; + } + break; + case 23: { + this->items.erase(this->items.begin(), this->items.end()); + const int size = reinterpret_cast(&g_session)->GetList8Size(); + for (int i = 0; i < size; ++i) { + ITEM_INFO item = g_session.GetItem1750At(i); + if (item.unknown_0000[1] != 0) { + this->items.push_back(item); + } + } + + this->Invalidate(); + this->UpdateScrollBar(); + return 0; + } + case 34: + this->saved = reinterpret_cast(a); + if (!this->saved->IsValid()) { + this->saved->Reset(); + } + + this->SendMsg(nullptr, 14, 7, this->saved->width, this->saved->height, 0); + this->Move(this->saved->x, this->saved->y); + return 0; + case 38: { + CGameMode* mode = static_cast(g_modeMgr.GetGameMode()); + ModeDragState& drag = mode->drag; + ITEM_INFO item; + item.Assign(reinterpret_cast(drag)); + ClientItemLists* lists = reinterpret_cast(&g_session); + + switch (drag.source) { + case 10: + if (g_session.GetItem1768Quantity(drag.id)) { + lists->AddItem1750(item, 0, 1); + lists->RemoveItem1768(item, 0); + } + break; + case 19: + if (lists->AddItem1750(item, this->unknown_00F4, 1)) { + lists->RemoveItem1768(item, this->unknown_00F4 != 0); + } + break; + case 21: + lists->AddItem1750(item, this->unknown_00F4, 1); + lists->RemoveItem1760(item); + if (g_windowMgr.unknown_041C) { + reinterpret_cast(g_windowMgr.unknown_041C)->SendMsg(nullptr, 23, 0, 0, 0, 0); + } + break; + } + + mode->SendMsg(18, 0, 0, 0, 0); + return 0; + } + case 123: { + const auto* bytes = reinterpret_cast(a); + ItemListChunkHeader header = *reinterpret_cast(bytes); + unsigned offset = 6; + if (header.type == 21400) { + while (static_cast(b) > offset) { + header = *reinterpret_cast(bytes + offset); + offset += 6; + if (header.type == 21401) { + this->SendMsg(nullptr, 23, 0, 0, 0, 0); + break; + } + + offset += header.size; + } + } + break; + } + default: + return UIItemBaseWnd::SendMsg(sender, message, a, b, c, d); + } + + return 0; +} // OFFSET: 0x0098C5A0 // FUNCTION: fn_13421