diff --git a/Source/Contents/EnchantMgr.cpp b/Source/Contents/EnchantMgr.cpp index d9ca249a..5cfd332e 100644 --- a/Source/Contents/EnchantMgr.cpp +++ b/Source/Contents/EnchantMgr.cpp @@ -433,3 +433,40 @@ int L_SetSuccessRate(lua_State* L) { CEnchantMgr::GetInstance()->m_enchants[id].options[optionKey].successRate = rate; return 2; } + +// OFFSET: 0x006821B0 +// FUNCTION: fn_05537 +void CEnchantMgr::AddPerfectEnchant(uint64_t group, uint32_t optionKey, const std::string& itemName, uint64_t cost, + const std::map& materials) { + int itemId = CItemDBToIDMgr::GetInstance()->GetItemID(itemName); + if (itemId != 0) { + m_enchants[group].options[optionKey].perfectEnchants[itemId].cost = cost; + m_enchants[group].options[optionKey].perfectEnchants[itemId].materials = ConvertMaterials(materials); + } +} + +// OFFSET: 0x00682310 + +// OFFSET: 0x006827B0 + +// OFFSET: 0x006829A0 + +// OFFSET: 0x00682A00 + +// OFFSET: 0x00682D10 + +// OFFSET: 0x006845C0 + +// OFFSET: 0x006864D0 + +// OFFSET: 0x00686830 + +// OFFSET: 0x006871E0 + +// OFFSET: 0x00687BB0 + +// OFFSET: 0x00688290 + +// OFFSET: 0x006886E0 + +// OFFSET: 0x00688A70 diff --git a/Source/Contents/EnchantMgr.h b/Source/Contents/EnchantMgr.h index 2b772b62..806568a0 100644 --- a/Source/Contents/EnchantMgr.h +++ b/Source/Contents/EnchantMgr.h @@ -11,22 +11,27 @@ #include #include +struct EnchantPerfectInfo { + /* 0000 */ uint64_t cost; + /* 0008 */ std::map materials; +}; + struct EnchantRandomUpgradeInfo { - /* 0000 */ uint64_t unknown_0000; - /* 0008 */ std::map unknown_0008; + /* 0000 */ uint64_t cost; + /* 0008 */ std::map materials; /* 0010 */ std::map rates; }; struct EnchantOptionInfo { - /* 0000 */ int64_t unknown_0000; - /* 0008 */ std::map unknown_0008; + /* 0000 */ uint64_t requireCost; + /* 0008 */ std::map requireMaterials; /* 0010 */ uint64_t successRate; /* 0018 */ std::map gradeBonus; - /* 0020 */ std::map> unknown_0020; - /* 0028 */ std::map> unknown_0028; + /* 0020 */ std::map> enchants; + /* 0028 */ std::map perfectEnchants; /* 0030 */ std::map randomUpgrades; - /* 0038 */ std::map> unknown_0038; - /* 0040 */ bool unknown_0040 = false; + /* 0038 */ std::map> perfectUpgrades; + /* 0040 */ bool isUpgrade = false; }; struct EnchantInfo { @@ -35,8 +40,11 @@ struct EnchantInfo { /* 0010 */ uint32_t condition2; /* 0014 */ bool approveRandomOption; /* 0018 */ std::vector slots; - /* 0024 */ uint8_t unknown_0024[0x1C]; - /* 0040 */ std::map unknown_0040; + /* 0024 */ uint8_t unknown_0024[0x4]; + /* 0028 */ bool resetEnabled; + /* 0030 */ uint64_t resetRate; + /* 0038 */ uint64_t resetCost; + /* 0040 */ std::map resetMaterials; /* 0048 */ std::string caution; /* 0060 */ std::map options; }; @@ -60,6 +68,14 @@ public: CEnchantMgr(); virtual ~CEnchantMgr(); + void AddPerfectEnchant(uint64_t group, uint32_t optionKey, const std::string& itemName, uint64_t cost, const std::map& materials); + void AddPerfectUpgradeEnchant(uint64_t group, uint32_t optionKey, const std::string& baseItemName, const std::string& itemName, uint64_t cost, + const std::map& materials); + bool CallScript(const std::string& name); + EnchantInfo* GetEnchantInfo(uint64_t group); + std::map ConvertMaterials(std::map materials); + bool Init(); + void SetEnchant(uint64_t group, uint32_t optionKey, uint32_t slot, const std::map& enchants); void SendCloseEnchant(); void RequestPerfectEnchant(uint64_t group, int16_t index, int16_t slot, int32_t itemId); void RequestRandomEnchant(uint64_t group, int16_t index, int16_t slot); @@ -69,35 +85,47 @@ public: void RequestUpgradeRandomEnchant(uint64_t group, int16_t index, int16_t slot); }; +int L_AddPerfectEnchant(lua_State* L); +int L_AddPerfectUpgradeEnchant(lua_State* L); int L_AddRandomUpgradeEnchant(lua_State* L); int L_AddTargetItem(lua_State* L); +int L_AddUpgradeEnchant(lua_State* L); int L_ApproveRandomOption(lua_State* L); int L_GetSlotCount(lua_State* L); int L_SetCaution(lua_State* L); int L_SetCondition(lua_State* L); +int L_SetEnchant(lua_State* L); int L_SetGradeBonus(lua_State* L); +int L_SetRandomUpgradeRequire(lua_State* L); +int L_SetRequire(lua_State* L); +int L_SetReset(lua_State* L); int L_SetSlotOrder(lua_State* L); int L_SetSuccessRate(lua_State* L); #if defined(_WIN32) && !defined(_WIN64) static_assert(sizeof(EnchantRandomUpgradeInfo) == 0x18); -static_assert(offsetof(EnchantRandomUpgradeInfo, unknown_0008) == 0x08); +static_assert(sizeof(EnchantPerfectInfo) == 0x10); +static_assert(offsetof(EnchantPerfectInfo, materials) == 0x08); +static_assert(offsetof(EnchantRandomUpgradeInfo, materials) == 0x08); static_assert(offsetof(EnchantRandomUpgradeInfo, rates) == 0x10); static_assert(sizeof(EnchantOptionInfo) == 0x48); -static_assert(offsetof(EnchantOptionInfo, unknown_0008) == 0x08); +static_assert(offsetof(EnchantOptionInfo, requireMaterials) == 0x08); static_assert(offsetof(EnchantOptionInfo, successRate) == 0x10); static_assert(offsetof(EnchantOptionInfo, gradeBonus) == 0x18); -static_assert(offsetof(EnchantOptionInfo, unknown_0020) == 0x20); -static_assert(offsetof(EnchantOptionInfo, unknown_0028) == 0x28); +static_assert(offsetof(EnchantOptionInfo, enchants) == 0x20); +static_assert(offsetof(EnchantOptionInfo, perfectEnchants) == 0x28); static_assert(offsetof(EnchantOptionInfo, randomUpgrades) == 0x30); -static_assert(offsetof(EnchantOptionInfo, unknown_0038) == 0x38); -static_assert(offsetof(EnchantOptionInfo, unknown_0040) == 0x40); +static_assert(offsetof(EnchantOptionInfo, perfectUpgrades) == 0x38); +static_assert(offsetof(EnchantOptionInfo, isUpgrade) == 0x40); static_assert(sizeof(EnchantInfo) == 0x68); static_assert(offsetof(EnchantInfo, condition1) == 0x0C); static_assert(offsetof(EnchantInfo, condition2) == 0x10); static_assert(offsetof(EnchantInfo, approveRandomOption) == 0x14); static_assert(offsetof(EnchantInfo, slots) == 0x18); -static_assert(offsetof(EnchantInfo, unknown_0040) == 0x40); +static_assert(offsetof(EnchantInfo, resetEnabled) == 0x28); +static_assert(offsetof(EnchantInfo, resetRate) == 0x30); +static_assert(offsetof(EnchantInfo, resetCost) == 0x38); +static_assert(offsetof(EnchantInfo, resetMaterials) == 0x40); static_assert(offsetof(EnchantInfo, caution) == 0x48); static_assert(offsetof(EnchantInfo, options) == 0x60); static_assert(sizeof(CEnchantMgr) == 0x38);