#ifndef RAGNAROK_SOURCE_UI_ENCHANT_ENCHANTUI_H #define RAGNAROK_SOURCE_UI_ENCHANT_ENCHANTUI_H #include "Contents/Items/ItemInfo.h" #include "UI/FrameSkin.h" #include "UI/Items/UIGameItem.h" #include "UI/Lists/UIListBoxTemplate.h" #include "UI/Window/UIWindowMgr.h" #include #include #include class CUIRadioButton; class CUIStaticText; class CUITextViewer; class CUITab; struct EnchantInfo; struct EnchantOptionInfo; struct EnchantPerfectInfo; namespace EnchantUI { class CUITargetItem; class CUIMainPage; class CUIReset; } class CUIEnchantUI : public CUIFrameWnd { public: /* 00D8 */ CUIStaticImage* background; /* 00DC */ CUITitleBar* titleBar; /* 00E0 */ CUIListBoxEx* targetList; /* 00E4 */ CUITab* tab; /* 00E8 */ EnchantUI::CUIMainPage* normalPage; /* 00EC */ EnchantUI::CUIMainPage* upgradePage; /* 00F0 */ EnchantUI::CUIReset* resetPage; /* 00F4 */ CUITextViewer* textViewer; /* 00F8 */ uint64_t group; /* 0100 */ EnchantInfo* enchantInfo; /* 0104 */ int unknown_0104; // INLINED CUIEnchantUI() : background(nullptr), titleBar(nullptr), targetList(nullptr), tab(nullptr), normalPage(nullptr), upgradePage(nullptr), resetPage(nullptr), textViewer(nullptr), group(0), enchantInfo(nullptr) { } ~CUIEnchantUI() override; bool CanHitTest() override; __declspec(noinline) void Slot15(int width, int height) override; void Slot16() override; void Slot25(int x, int y) override; virtual void Slot53(); void sub_A06C40(uint64_t group); void OnSelectTarget(EnchantUI::CUITargetItem* item, const ITEM_INFO& info); void OnClickClose(); }; namespace EnchantUI { class CEnchantItemData; class CUISlot; class CUIEnchantItem : public CUIListItem { public: // INLINED CUIEnchantItem() : itemIcon(nullptr), name(nullptr) { } /* 00E8 */ CUIGameItem* itemIcon; /* 00EC */ CUIStaticText* name; void Slot15(int width, int height) override; void Slot28(int x, int y) override; void Slot32(int x, int y) override; void SetFrozen(bool frozen) override; }; class CUITargetItem : public CUIListItem { public: // INLINED CUITargetItem() : itemIcon(nullptr), unknown_00EC(nullptr), unknown_00F0(nullptr) { } /* 00E8 */ CUIGameItem* itemIcon; /* 00EC */ CUIStaticImage* unknown_00EC; /* 00F0 */ CUIStaticText* unknown_00F0; void Slot15(int width, int height) override; void Slot28(int x, int y) override; void Slot32(int x, int y) override; void SetSelected(bool selected) override; ITEM_INFO* GetItemInfo(); }; class CUIIngredient : public CUIControl { public: explicit CUIIngredient() : CUIControl(), unknown_0080(nullptr), unknown_0084(nullptr), itemIcon(nullptr), ownedText(nullptr), requiredText(nullptr) { } /* 0080 */ CUIStaticImage* unknown_0080; /* 0084 */ CUIStaticImage* unknown_0084; /* 0088 */ CUIGameItem* itemIcon; /* 008C */ CUIStaticText* ownedText; /* 0090 */ CUIStaticText* requiredText; void Slot15(int width, int height) override; __declspec(noinline) void SetMaterial(int itemId, int required); }; #pragma pack(push, 4) class CUIEnchantPage : public CUIControl { public: CUIEnchantPage(); union { /* 0080 */ unsigned char unknown_0080[0x4]; /* 0080 */ CUIStaticImage* background; }; /* 0084 */ CUIGameItem* gameItem; /* 0088 */ std::map unknown_0088; /* 0090 */ std::list unknown_0090; /* 0098 */ CUIListBoxEx* enchantList; /* 009C */ CUIStaticText* unknown_009C; /* 00A0 */ CUIImageButton* unknown_00A0 = nullptr; /* 00A4 */ EnchantInfo* enchantInfo; /* 00A8 */ uint64_t group; /* 00B0 */ int unknown_00B0; void Slot15(int width, int height) override; void Slot16() override; virtual void Slot54(CUIEnchantItem* item, const CEnchantItemData& data); virtual void Slot55() = 0; virtual bool Slot56() = 0; virtual void Slot57(); virtual void Slot58(int value); virtual void Slot59(int value); __declspec(noinline) CUIIngredient* CreateIngredient(); void ResetSlots(); bool SetItem(const ITEM_INFO& item); // INLINED void LoadTarget(EnchantInfo* info, uint64_t targetGroup, const ITEM_INFO& item) { this->ResetSlots(); if (info && this->SetItem(item)) { this->group = targetGroup; this->enchantInfo = info; this->Slot57(); } } __declspec(noinline) int FindEmptySlot(); __declspec(noinline) std::optional FindOption(uint32_t key); __declspec(noinline) void SetCost(const EnchantPerfectInfo& info); }; #pragma pack(pop) class CUINormalRandom : public CUIEnchantPage { public: using CUIEnchantPage::CUIEnchantPage; void Slot15(int width, int height) override; void Slot16() override; void Slot55() override; bool Slot56() override; }; class CUINormalPerfect : public CUIEnchantPage { public: using CUIEnchantPage::CUIEnchantPage; void Slot15(int width, int height) override; void Slot16() override; void Slot54(CUIEnchantItem* item, const CEnchantItemData& data) override; void Slot55() override; bool Slot56() override; }; class CUIReset : public CUIEnchantPage { public: using CUIEnchantPage::CUIEnchantPage; void Slot15(int width, int height) override; void Slot16() override; void Slot55() override; bool Slot56() override; void Slot57() override; }; class CUIUpgradeEnchantPage : public CUIEnchantPage { public: using CUIEnchantPage::CUIEnchantPage; void Slot58(int value) override; void Slot59(int value) override; }; class CUIUpgradeRandom : public CUIUpgradeEnchantPage { public: using CUIUpgradeEnchantPage::CUIUpgradeEnchantPage; void Slot15(int width, int height) override; void Slot16() override; void Slot55() override; bool Slot56() override; }; class CUIUpgradePerfect : public CUIUpgradeEnchantPage { public: using CUIUpgradeEnchantPage::CUIUpgradeEnchantPage; /* 00B8 */ bool unknown_00B8 = false; void Slot15(int width, int height) override; void Slot54(CUIEnchantItem* item, const CEnchantItemData& data) override; void Slot55() override; bool Slot56() override; }; class CUIMainPage : public CUIControl { public: __declspec(noinline) CUIMainPage(); /* 0080 */ CUIEnchantPage* firstPage; /* 0084 */ CUIEnchantPage* secondPage; /* 0088 */ CUITab* tab; void Slot16() override; // INLINED void LoadTarget(EnchantInfo* info, uint64_t targetGroup, const ITEM_INFO& item) { this->firstPage->LoadTarget(info, targetGroup, item); this->secondPage->LoadTarget(info, targetGroup, item); } }; class CUINormal : public CUIMainPage { public: using CUIMainPage::CUIMainPage; void Slot15(int width, int height) override; }; class CUIUpgrade : public CUIMainPage { public: using CUIMainPage::CUIMainPage; void Slot15(int width, int height) override; }; class CEnchantItemData { public: /* 0000 */ int itemId; /* 0004 */ bool frozen; }; class CUISlot : public CUIControl { public: // INLINED explicit CUISlot() : CUIControl(), radioButton(nullptr), itemIcon(nullptr), description(nullptr) { } /* 0080 */ CUIRadioButton* radioButton; /* 0084 */ CUIGameItem* itemIcon; /* 0088 */ CUITextViewer* description; void Slot15(int width, int height) override; void Slot16() override; void Paint() override; void Slot32(int x, int y) override; void SelectSlot(UIWindow* button); }; class CUISlot0 : public CUISlot { public: using CUISlot::CUISlot; void Slot15(int width, int height) override; void Slot16() override; }; class CUISlot1 : public CUISlot { public: using CUISlot::CUISlot; void Slot15(int width, int height) override; void Slot16() override; }; class CUISlot2 : public CUISlot { public: using CUISlot::CUISlot; void Slot15(int width, int height) override; void Slot16() override; }; class CUISlot3 : public CUISlot { public: using CUISlot::CUISlot; void Slot15(int width, int height) override; void Slot16() override; }; } #endif