#include "UI/Enchant/EnchantUI.h" #include "Contents/EnchantMgr.h" #include "Render/Renderer.h" #include "UI/Buttons/UIRadioButton.h" #include "UI/Lists/UIVScrollBar.h" #include "UI/Text/UITextViewerControl.h" #include #include #include #include // GLOBAL: gl_24882 template <> CEnchantMgr* Singleton::s_instance = nullptr; // OFFSET: 0x009F9B40 // OFFSET: 0x009F9C10 // FUNCTION: fn_14814 // FUNCTION: fn_14815 template void CUIListBoxEx::Slot15(int width, int height) { this->scrollBar = new CUIVScrollBar(*this->m_context); this->scrollBar->Show(0); this->scrollBar->SetOnChange([this](int position) { this->OnScroll(position); }); this->AddChild(this->scrollBar); } template void CUIListBoxEx::Slot15(int, int); template void CUIListBoxEx::Slot15(int, int); template void CUIListBoxEx::Paint(); template void CUIListBoxEx::Paint(); template void CUIListBoxEx::Slot35(int); template void CUIListBoxEx::Slot35(int); template void CUIListBoxEx::OnScroll(int); template void CUIListBoxEx::OnScroll(int); template void CUIListBoxEx::ClearItems(); template void CUIListBoxEx::ClearItems(); template int CUIListBoxEx::AddData(const EnchantUI::CEnchantItemData&, bool); template void CUIListBoxEx::ClearData(); template void CUIListBoxEx::UpdateScrollBar(); // OFFSET: 0x006863F0 // FUNCTION: fn_05565 template <> CEnchantMgr* Singleton::GetInstance() { if (!s_instance) { s_instance = new (std::nothrow) CEnchantMgr; } return s_instance; } namespace EnchantUI { // OFFSET: 0x009F9880 // FUNCTION: fn_14809 void CUIEnchantPage::Slot58(int) { } // OFFSET: 0x009F99B0 // FUNCTION: fn_14812 CUIIngredient* CUIEnchantPage::CreateIngredient() { CUIIngredient* ingredient = new CUIIngredient(*this->m_context); ingredient->SetSize(70, 50); ingredient->Move(4, 200); this->AddChild(ingredient); return ingredient; } // OFFSET: 0x009F9B30 // FUNCTION: fn_14813 void CUIEnchantPage::Slot54(int argument1, int argument2) { } } // OFFSET: 0x00A021D0 // FUNCTION: fn_14838 void CUIRadioButton::SetOnSelect(std::function callback) { this->onSelect = callback; } namespace EnchantUI { // OFFSET: 0x00A02D80 // FUNCTION: fn_14845 void CUIEnchantPage::Slot59(int value) { this->unknown_00B0 = value; } // OFFSET: 0x00A05190 // FUNCTION: fn_14970 void CUIUpgradeEnchantPage::Slot58(int value) { if (CUIMainPage* mainPage = dynamic_cast(this->parent)) { mainPage->firstPage->Slot59(value); mainPage->secondPage->Slot59(value); } } // OFFSET: 0x00A05290 // FUNCTION: fn_14972 int CUIEnchantPage::FindEmptySlot() { const std::vector& slots = this->enchantInfo->slots; auto it = std::find_if(slots.begin(), slots.end(), [item = *this->gameItem->GetItemInfo()](int slot) { if (slot >= 4) { return true; } int card; std::memcpy(&card, item.unknown_001C + slot * 4, sizeof(card)); return card == 0; }); if (it == slots.end()) { return -1; } return *it; } // OFFSET: 0x00A053D0 // FUNCTION: fn_14973 ITEM_INFO* CUITargetItem::GetItemInfo() { return this->itemIcon->GetItemInfo(); } // OFFSET: 0x00A053E0 // FUNCTION: fn_14974 std::optional CUIEnchantPage::FindOption(uint32_t key) { if (this->enchantInfo == nullptr) { return std::nullopt; } auto it = this->enchantInfo->options.find(key); if (it != this->enchantInfo->options.end()) { return &it->second; } return std::nullopt; } // OFFSET: 0x00A05CE0 // FUNCTION: fn_14980 void CUISlot::Paint() { this->ClearSurface(0xFFFF00FF); } } // OFFSET: 0x00A05DF0 // FUNCTION: fn_14983 void CUIEnchantUI::Slot16() { this->Move((g_renderer->viewport.width - this->geometry.width) / 2, (g_renderer->viewport.height - this->geometry.height) / 2); } namespace EnchantUI { // OFFSET: 0x00A06050 // FUNCTION: fn_14988 void CUISlot0::Slot16() { CUISlot::Slot16(); this->radioButton->SetId(0); } // OFFSET: 0x00A06090 // FUNCTION: fn_14989 void CUISlot1::Slot16() { CUISlot::Slot16(); this->radioButton->SetId(1); } // OFFSET: 0x00A060D0 // FUNCTION: fn_14990 void CUISlot2::Slot16() { CUISlot::Slot16(); this->radioButton->SetId(2); } // OFFSET: 0x00A06110 // FUNCTION: fn_14991 void CUISlot3::Slot16() { CUISlot::Slot16(); this->radioButton->SetId(3); } // OFFSET: 0x00A06150 // FUNCTION: fn_14992 void CUISlot::Slot16() { this->itemIcon->hitEnabled = 0; this->description->scrollBar->SetHidden(1); } } // OFFSET: 0x00A06190 // FUNCTION: fn_14994 void CUIEnchantUI::Slot25(int x, int y) { if (this->titleBar->IsPointInside(x, y)) { CUIFrameWnd::Slot25(x, y); } } namespace EnchantUI { // OFFSET: 0x00A061C0 // FUNCTION: fn_14995 void CUIEnchantItem::Slot28(int x, int y) { this->itemIcon->Slot28(x - this->itemIcon->geometry.x, y - this->itemIcon->geometry.y); } // OFFSET: 0x00A061F0 // FUNCTION: fn_14996 void CUITargetItem::Slot28(int x, int y) { this->itemIcon->Slot28(x - this->itemIcon->geometry.x, y - this->itemIcon->geometry.y); } // OFFSET: 0x00A06220 // FUNCTION: fn_14997 void CUIEnchantItem::Slot32(int x, int y) { this->itemIcon->Slot32(x - this->itemIcon->geometry.x, y - this->itemIcon->geometry.y); } // OFFSET: 0x00A06250 // FUNCTION: fn_14998 void CUISlot::Slot32(int x, int y) { if (this->itemIcon->IsPointInside(x, y)) { this->itemIcon->Slot32(x - this->itemIcon->geometry.x, y - this->itemIcon->geometry.y); } } // OFFSET: 0x00A06290 // FUNCTION: fn_14999 void CUITargetItem::Slot32(int x, int y) { this->itemIcon->Slot32(x - this->itemIcon->geometry.x, y - this->itemIcon->geometry.y); } // OFFSET: 0x00A062C0 // FUNCTION: fn_15000 void CUISlot::SelectSlot(UIWindow* button) { if (CUIEnchantPage* page = dynamic_cast(this->parent)) { page->Slot58(button->geometry.id); } } // OFFSET: 0x00A06A50 // FUNCTION: fn_15005 void CUITargetItem::SetSelected(bool selected) { if (selected) { if (this->selected != 1) { this->itemIcon->Move(this->itemIcon->geometry.x + 1, this->itemIcon->geometry.y + 1); this->unknown_00EC->Move(this->unknown_00EC->geometry.x + 1, this->unknown_00EC->geometry.y + 1); this->unknown_00F0->Move(this->unknown_00F0->geometry.x + 1, this->unknown_00F0->geometry.y + 1); } } else if (this->selected == 1) { this->itemIcon->Move(this->itemIcon->geometry.x - 1, this->itemIcon->geometry.y - 1); this->unknown_00EC->Move(this->unknown_00EC->geometry.x - 1, this->unknown_00EC->geometry.y - 1); this->unknown_00F0->Move(this->unknown_00F0->geometry.x - 1, this->unknown_00F0->geometry.y - 1); } CUIListItem::SetSelected(selected); } // OFFSET: 0x00A04D70 // FUNCTION: fn_14965 void CUINormalPerfect::Slot55() { CUIListBoxEx* list = this->enchantList; if (static_cast(list->selected) >= 0 && list->selected < list->data.size()) { auto it = std::next(list->data.begin(), list->selected); CEnchantMgr::GetInstance()->RequestPerfectEnchant( this->group, static_cast(this->gameItem->GetItemInfo()->unknown_0000[1]), static_cast(this->unknown_00B0), it->itemId ); } } // OFFSET: 0x00A04E60 // FUNCTION: fn_14966 void CUINormalRandom::Slot55() { CEnchantMgr::GetInstance()->RequestRandomEnchant( this->group, static_cast(this->gameItem->GetItemInfo()->unknown_0000[1]), static_cast(this->unknown_00B0) ); } // OFFSET: 0x00A04F10 // FUNCTION: fn_14967 void CUIReset::Slot55() { CEnchantMgr::GetInstance()->RequestResetEnchant(this->group, static_cast(this->gameItem->GetItemInfo()->unknown_0000[1])); } // OFFSET: 0x00A04FB0 // FUNCTION: fn_14968 void CUIUpgradePerfect::Slot55() { if (this->unknown_00B8) { CEnchantMgr::GetInstance()->RequestUpgradeEnchant( this->group, static_cast(this->gameItem->GetItemInfo()->unknown_0000[1]), static_cast(this->unknown_00B0) ); return; } CUIListBoxEx* list = this->enchantList; if (static_cast(list->selected) >= 0 && list->selected < list->data.size()) { auto it = std::next(list->data.begin(), list->selected); CEnchantMgr::GetInstance()->RequestUpgradePerfectEnchant( this->group, static_cast(this->gameItem->GetItemInfo()->unknown_0000[1]), static_cast(this->unknown_00B0), it->itemId ); } } // OFFSET: 0x00A050E0 // FUNCTION: fn_14969 void CUIUpgradeRandom::Slot55() { CEnchantMgr::GetInstance()->RequestUpgradeRandomEnchant( this->group, static_cast(this->gameItem->GetItemInfo()->unknown_0000[1]), static_cast(this->unknown_00B0) ); } } // OFFSET: 0x00A08110 // FUNCTION: fn_15017 bool CUIEnchantUI::CanHitTest() { return !CEnchantMgr::GetInstance()->m_unknown_0030; }