diff --git a/Source/Contents/Messenger/MessengerMember.cpp b/Source/Contents/Messenger/MessengerMember.cpp index 59c9dbcb..fcc45957 100644 --- a/Source/Contents/Messenger/MessengerMember.cpp +++ b/Source/Contents/Messenger/MessengerMember.cpp @@ -47,10 +47,6 @@ namespace { const char* sub_DDE770(const char* mapName); }; - class UIMessengerGroupDropWnd : public UIWindow { - public: - void sub_73A1C0(int x, int y, int unknown); - }; } class UIDragMiniPartyWnd : public UIFrameWnd { @@ -126,6 +122,7 @@ public: void Slot35(int delta) override; MessengerMember MemberAt(int x, int y); void OpenMiniPartyWnd(int cell, const MessengerMember& member); + void DropMember(int x, int y, int index); MessengerMember MemberAtIndex(int index); void UpdateScroll(); void LayoutButtons(); @@ -171,6 +168,10 @@ public: // GLOBAL: gl_24961 bool g_messengerGroupCollapsed; +// GLOBAL: gl_25219 +int g_messengerDropColumnWidth; +// GLOBAL: gl_25220 +int g_messengerDropRowHeight; #if defined(_WIN32) && !defined(_WIN64) static_assert(sizeof(MiniPartyIconPosition) == 12); @@ -443,9 +444,9 @@ void UIDragMiniPartyWnd::MoveGauge(int x, int y) { // OFFSET: 0x00738CE0 // FUNCTION: fn_07671 void UIDragMiniPartyWnd::Slot31(int argument1, int argument2) { - auto* window = static_cast(g_windowMgr.LookupWindow(34)); + auto* window = static_cast(g_windowMgr.LookupWindow(34)); if (window) { - window->sub_73A1C0(argument1 + this->geometry.x, argument2 + this->geometry.y, this->unknown_0108); + window->DropMember(argument1 + this->geometry.x, argument2 + this->geometry.y, this->unknown_0108); } } @@ -670,6 +671,8 @@ MiniPartyInfoEntry::MiniPartyInfoEntry(const char* text, int value) : text(text) // FUNCTION: fn_07700 UIMessengerGroupWnd::~UIMessengerGroupWnd() = default; +// OFFSET: 0x0073A1C0 + // OFFSET: 0x0073A3F0 // FUNCTION: fn_07704 MessengerMember UIMessengerGroupWnd::MemberAt(int x, int y) { @@ -695,7 +698,7 @@ MessengerMember UIMessengerGroupWnd::MemberAt(int x, int y) { // OFFSET: 0x0073A330 // FUNCTION: fn_07703 -void UIMessengerGroupWnd::OpenMiniPartyWnd(int cell, const MessengerMember& member) { +__declspec(noinline) void UIMessengerGroupWnd::OpenMiniPartyWnd(int cell, const MessengerMember& member) { UIMiniPartyWnd* window = new UIMiniPartyWnd(*this->m_context, *this->m_frameContext); window->SetSize(174, 52); window->m_cell = cell; @@ -706,7 +709,7 @@ void UIMessengerGroupWnd::OpenMiniPartyWnd(int cell, const MessengerMember& memb // OFFSET: 0x0073A540 // FUNCTION: fn_07705 -MessengerMember UIMessengerGroupWnd::MemberAtIndex(int index) { +__declspec(noinline) MessengerMember UIMessengerGroupWnd::MemberAtIndex(int index) { int position = 0; for (auto it = this->members.begin(); it != this->members.end(); ++it, ++position) { if (index == position) { @@ -973,7 +976,7 @@ void UIWindowMgr::MoveTransient(int x, int y) { // OFFSET: 0x00AA9E90 // FUNCTION: fn_17262 -void UIWindowMgr::RetireTransientWindow() { +__declspec(noinline) void UIWindowMgr::RetireTransientWindow() { UIDragMiniPartyWnd* transient = static_cast(this->window_4F250); if (transient && transient->member.valid) { transient->geometry.unknown_0030 = 1; diff --git a/Source/UI/Buttons/UITextButton.cpp b/Source/UI/Buttons/UITextButton.cpp index a3484675..89cc2227 100644 --- a/Source/UI/Buttons/UITextButton.cpp +++ b/Source/UI/Buttons/UITextButton.cpp @@ -3378,3 +3378,14 @@ UITVBitmapButton::UITVBitmapButton() } // OFFSET: 0x0086EC10 + +#include "Contents/Configuration/ServiceConfiguration.h" +#include "Contents/TipOfTheDay.h" + +// OFFSET: 0x0086DE10 + +// OFFSET: 0x008894B0 + +// OFFSET: 0x00889600 + +// OFFSET: 0x0088FDC0 diff --git a/Source/UI/Lists/UIMemberListBox.h b/Source/UI/Lists/UIMemberListBox.h index 3ea9cc22..99609a4c 100644 --- a/Source/UI/Lists/UIMemberListBox.h +++ b/Source/UI/Lists/UIMemberListBox.h @@ -9,6 +9,7 @@ class UIChatHisBox2 : public UIChatHisBox { public: UIChatHisBox2(UIWindowContext& windows, UIListBoxContext& list); bool Slot08() override; + void Paint() override; void Slot15(int width, int height) override; void Configure(int x, int y, int width, int height, unsigned char transparent) override; void Slot33(int x, int y) override; @@ -21,6 +22,7 @@ public: class UIChatHisBox3 : public UIChatHisBox2 { public: UIChatHisBox3(UIWindowContext& windows, UIListBoxContext& list); + void Paint() override; void Slot15(int width, int height) override; void Resize(int width, int height) override; @@ -30,6 +32,7 @@ public: class UIMemberListBox : public UIChatHisBox2 { public: + UIMemberListBox(UIWindowContext& windows, UIListBoxContext& list); void Paint() override; void Slot25(int x, int y) override; void Slot28(int x, int y) override; diff --git a/Source/UI/Lists/UITreeView.h b/Source/UI/Lists/UITreeView.h index efc265ea..60e3a93a 100644 --- a/Source/UI/Lists/UITreeView.h +++ b/Source/UI/Lists/UITreeView.h @@ -41,6 +41,7 @@ public: UITreeView(UIWindowContext& windows, UIEditContext& edit, UIButtonContext& controls); void Resize(int width, int height) override; void Slot15(int width, int height) override; + void Paint() override; void Slot25(int x, int y) override; void Slot27(int x, int y) override; void Slot31(int x, int y) override; diff --git a/Source/UI/Quest/UIOngoingQuestInfo.cpp b/Source/UI/Quest/UIOngoingQuestInfo.cpp index 7aa0addb..07d8094f 100644 --- a/Source/UI/Quest/UIOngoingQuestInfo.cpp +++ b/Source/UI/Quest/UIOngoingQuestInfo.cpp @@ -25,7 +25,7 @@ template <> void CUIListBoxEx::OnScroll(int position); - +template <> void CUIListBoxEx::AddNewItem(); template <> void CUIListBoxEx::Slot53(int resolveSkin); template <> void CUIListBoxEx::Resize(int width, int height); // OFFSET: 0x00A4F580 // FUNCTION: fn_16213 bool UnusedTrueA4F580() { @@ -704,3 +704,80 @@ CUIScrollWindow::CUIScrollWindow(UIWindowContext& context) : CUIControl(context), firstLine(nullptr), secondContents(nullptr), secondLine(nullptr), rewards(nullptr), scrollBar(nullptr), firstContents(nullptr) { } } + +// OFFSET: 0x00A53A90 +// FUNCTION: fn_16233 +template <> +void CUIListBoxEx::AddNewItem() { + if (this->itemWidth <= 0 || this->rowHeight <= 0) { + return; + } + + for (OngoingQuestInfo::CUIRewardItem* item : this->items) { + this->RemoveChild(item, 1); + } + this->items.clear(); + this->selected = static_cast(-1); + + if (this->rowHeight <= this->geometry.height) { + unsigned count = static_cast(this->geometry.height / this->rowHeight) + 1; + if (this->geometry.height % this->rowHeight > 1) { + ++count; + } + this->items.resize(count, nullptr); + for (OngoingQuestInfo::CUIRewardItem*& slot : this->items) { + OngoingQuestInfo::CUIRewardItem* item = new OngoingQuestInfo::CUIRewardItem(*this->m_context); + item->SetSize(this->itemWidth, this->rowHeight); + item->Show(0); + CResPtr* images = reinterpret_cast*>(reinterpret_cast(this) + 0x80); + item->SetImageResources(images[0], images[1], images[2], images[3]); + item->onHover = [this](CUIListItem* listItem) { + for (OngoingQuestInfo::CUIRewardItem* other : this->items) { + other->SetHighlighted(other == listItem); + } + }; + item->onPress = [this](CUIListItem* listItem) { + this->SelectItem(listItem); + }; + this->AddChild(item); + slot = item; + } + } + + this->scrollBar->SetTotal(this->geometry.height); + this->scrollBar->SetVisible(this->geometry.height); +} + +// OFFSET: 0x00A53CF0 +// FUNCTION: fn_16234 +template <> +void CUIListBoxEx::Slot53(int resolveSkin) { + CResPtr* images = reinterpret_cast*>(reinterpret_cast(this) + 0x80); + images[0] = CResPtr(this->LoadBitmapResource(this->imageNames[0], resolveSkin)); + images[1] = CResPtr(this->LoadBitmapResource(this->imageNames[1], resolveSkin)); + images[2] = CResPtr(this->LoadBitmapResource(this->imageNames[2], resolveSkin)); + images[3] = CResPtr(this->LoadBitmapResource(this->disabledName, resolveSkin)); + for (OngoingQuestInfo::CUIRewardItem* item : this->items) { + item->SetImageResources(images[0], images[1], images[2], images[3]); + } +} + +// OFFSET: 0x00A53F00 +// FUNCTION: fn_16235 +template <> +void CUIListBoxEx::Resize(int width, int height) { + UIWindow::Resize(width, height); + this->AddNewItem(); + this->scrollBar->Resize(this->scrollBar->geometry.width, height); + this->scrollBar->SetTotal(static_cast(this->data.size()) * this->rowHeight + this->itemY); + this->scrollBar->SetVisible(this->geometry.height); + this->scrollBar->SetPosition(this->scrollBar->position); + this->rebind = 1; +} + +namespace OngoingQuestInfo { +// OFFSET: 0x00A54EA0 +// FUNCTION: fn_16291 +CUIRewardItem::CUIRewardItem(UIWindowContext& context) : CUIListItem(context), background(nullptr), gameItem(nullptr), nameText(nullptr), countText(nullptr) { +} +} diff --git a/Source/UI/Quest/UIOngoingQuestInfo.h b/Source/UI/Quest/UIOngoingQuestInfo.h index b53150ec..5ed5225e 100644 --- a/Source/UI/Quest/UIOngoingQuestInfo.h +++ b/Source/UI/Quest/UIOngoingQuestInfo.h @@ -70,6 +70,7 @@ public: class CUIRewardItem : public CUIListItem { public: + explicit CUIRewardItem(UIWindowContext& context); void Slot15(int width, int height) override; void Slot16() override; void Paint() override;