From 31cf3f5cc2f62181f5940d5e8cb5a38c78612a4a Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Wed, 28 Oct 2026 22:59:58 +0000 Subject: [PATCH] Decompile 3 functions in Source/UI/Acceptance/UIChooseSellBuyWnd.cpp, Source/UI/Dialogs/UIPetTamingDeceiveWnd.h, ... Batch #1859 by Yommy: 0 byte-identical, 3 confirmed by peer review. - fn_12255 UITipOfTheDayWnd::Paint: logic confirmed by peer review - fn_12298 UIPetTamingDeceiveWnd::Slot19: logic confirmed by peer review - fn_12322 UISayDialogWnd::Resize: logic confirmed by peer review Reviewed-by: ragnarok-clanker --- Source/UI/Acceptance/UIChooseSellBuyWnd.cpp | 77 +++++++++++++++++++++ Source/UI/Dialogs/UIPetTamingDeceiveWnd.h | 9 +-- Source/UI/Dialogs/UISayDialogWnd.h | 6 ++ Source/UI/Dialogs/UITipOfTheDayWnd.h | 16 +++++ 4 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 Source/UI/Dialogs/UITipOfTheDayWnd.h diff --git a/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp b/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp index 517ab96..e1be2e6 100644 --- a/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp +++ b/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp @@ -25,6 +25,7 @@ #include "UI/Dialogs/UIRestartWnd.h" #include "UI/Dialogs/UISayDialogWnd.h" #include "UI/Dialogs/UISelectCartWnd.h" +#include "UI/Dialogs/UITipOfTheDayWnd.h" #include "UI/Dialogs/UIWaitWnd.h" #include "UI/Items/UIEquipWnd.h" #include "UI/Items/UIExchangeWnd.h" @@ -34,6 +35,7 @@ #include "UI/Lists/UIComboBoxWnd.h" #include "UI/Lists/UIListBox.h" #include "UI/Party/UIPartySettingWnd.h" +#include "UI/Shop/ItemDrawing.h" #include "UI/Shop/UInCash_CallWnd.h" #include "UI/Skill/UISkillDescribeWnd.h" #include "UI/Status/UIStatusWnd.h" @@ -244,6 +246,44 @@ void UISkillDescribeWnd::Paint() { DrawRoundedBorder(*this, 2, 2, this->geometry.width - 4, this->geometry.height - 4, 0xFFFFFF); } +// OFFSET: 0x008F2460 +// FUNCTION: fn_12255 +void UITipOfTheDayWnd::Paint() { + auto& controls = *this->m_controls; + this->DrawTitleBar(controls.fonts, controls.locale, true, controls.services.MessageText(174), 0); + + if (this->geometry.height == 17) { + return; + } + + int rows = (this->geometry.height - 38) / 8 + ((this->geometry.height - 38) % 8 != 0); + for (int y = 17; rows > 0; --rows, y += 8) { + const auto* left = static_cast(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\basic_interface\\itemwin_left.bmp"))); + this->DrawBitmap(0, y, &left->image, false); + } + + rows = (this->geometry.height - 38) / 8 + ((this->geometry.height - 38) % 8 != 0); + for (int y = 17; rows > 0; --rows, y += 8) { + const auto* right = static_cast(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\basic_interface\\itemwin_right.bmp"))); + this->DrawBitmap(this->geometry.width - right->image.width, y, &right->image, false); + } + + unsigned red, green, blue; + SkinPaletteChannels(ResourceMgr::Instance(), 2, 2, red, green, blue); + this->FillRegion(20, 17, (this->geometry.width - 60) % 32, this->geometry.height - 38, RGB(red, green, blue)); + this->FillRegion(20, (this->geometry.height - 38) / 32 * 32 + 17, this->geometry.width - 24, (this->geometry.height - 38) % 32, RGB(red, green, blue)); + this->DrawButtonBar(2, 0, 1); + + const int columns = (this->geometry.width - 40) / 32; + const int slots = (this->geometry.height - 38) / 32; + for (int i = 0, y = 17; i < slots; ++i, y += 32) { + DrawItemSlotBackground(*this, 40, y); + } + + SkinPaletteChannels(ResourceMgr::Instance(), 2, 2, red, green, blue); + this->FillRegion(72, 17, columns * 32 - 32, slots * 32, RGB(red, green, blue)); +} + // OFFSET: 0x008F2A90 // FUNCTION: fn_12258 void UIWaitWnd::Paint() { @@ -472,6 +512,21 @@ void UINotifyItemObtainWnd::Slot19() { } } +// OFFSET: 0x008F4FF0 +// FUNCTION: fn_12298 +void UIPetTamingDeceiveWnd::Slot19() { + this->Invalidate(); + const int frame = this->m_tick / this->m_delay; + + if (this->m_finishTime == 0xFFFFFFFF) { + if (this->m_frame == frame && this->m_delay <= this->m_maxDelay) { + this->m_finishTime = timeGetTime(); + } + } else if (this->m_frame == frame && this->m_delay <= this->m_maxDelay && timeGetTime() - this->m_finishTime >= 2000) { + this->m_frameContext->windows.CloseWindow(91); + } +} + // OFFSET: 0x008F50B0 // FUNCTION: fn_12300 void UISayDialogWnd::Slot19() { @@ -529,6 +584,28 @@ void UIComboBoxWnd::Resize(int width, int height) { this->m_list->Invalidate(); } +// OFFSET: 0x008F6750 +// FUNCTION: fn_12322 +void UISayDialogWnd::Resize(int width, int height) { + this->UIFrameWnd::Resize(width, height); + this->m_viewer->Resize(width - 20, height - 40); + + for (UIWindow* button : this->m_buttons) { + if (button == nullptr) { + continue; + } + + int x = this->geometry.width - 4; + const int y = this->geometry.height - 24; + for (UIWindow* other : this->m_buttons) { + if (button != other) { + x += -4 - other->geometry.width; + } + } + button->Move(x - button->geometry.width, y); + } +} + // OFFSET: 0x008F8860 // FUNCTION: fn_12332 int UIChooseSellBuyWnd::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/UIPetTamingDeceiveWnd.h b/Source/UI/Dialogs/UIPetTamingDeceiveWnd.h index c136440..fda767e 100644 --- a/Source/UI/Dialogs/UIPetTamingDeceiveWnd.h +++ b/Source/UI/Dialogs/UIPetTamingDeceiveWnd.h @@ -5,15 +5,16 @@ class UIPetTamingDeceiveWnd : public UIFrameWnd { public: - /* 00B4 */ std::uint32_t unknown_00B4; + /* 00B4 */ int m_delay; /* 00B8 */ int m_state; - /* 00BC */ std::uint32_t unknown_00BC; + /* 00BC */ int m_tick; /* 00C0 */ int m_target; /* 00C4 */ int m_frame; - /* 00C8 */ std::uint32_t unknown_00C8; - /* 00CC */ std::uint32_t unknown_00CC; + /* 00C8 */ int m_maxDelay; + /* 00CC */ std::uint32_t m_finishTime; /* 00D0 */ int m_started; + void Slot19() override; void Slot25(int x, int y) override; }; diff --git a/Source/UI/Dialogs/UISayDialogWnd.h b/Source/UI/Dialogs/UISayDialogWnd.h index 6667826..ec2deda 100644 --- a/Source/UI/Dialogs/UISayDialogWnd.h +++ b/Source/UI/Dialogs/UISayDialogWnd.h @@ -3,8 +3,14 @@ #include "UI/Window/UIFrameWnd.h" +#include + class UISayDialogWnd : public UIFrameWnd { public: + /* 00B4 */ UIWindow* m_viewer; + /* 00B8 */ std::list m_buttons; + + void Resize(int width, int height) override; void Slot19() override; }; diff --git a/Source/UI/Dialogs/UITipOfTheDayWnd.h b/Source/UI/Dialogs/UITipOfTheDayWnd.h new file mode 100644 index 0000000..b665b6c --- /dev/null +++ b/Source/UI/Dialogs/UITipOfTheDayWnd.h @@ -0,0 +1,16 @@ +#ifndef RAGNAROK_SOURCE_UI_DIALOGS_UITIPOFTHEDAYWND_H +#define RAGNAROK_SOURCE_UI_DIALOGS_UITIPOFTHEDAYWND_H + +#include "UI/Window/UIFrameWnd.h" + +struct UIButtonContext; + +class UITipOfTheDayWnd : public UIFrameWnd { +public: + void Paint() override; + +protected: + UIButtonContext* m_controls; +}; + +#endif