Decompile fn_05537 (CEnchantMgr::AddPerfectEnchant)
Batch #5665 by eAthena: 0 byte-identical, 1 confirmed by peer review. - fn_05537 CEnchantMgr::AddPerfectEnchant: logic confirmed by peer review Peer-reviewed-by: ragnarok-clanker, Yommy, sherollyner Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
This commit is contained in:
parent
16af7106c9
commit
66056bebc0
2 changed files with 82 additions and 17 deletions
|
|
@ -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<std::string, int>& 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
|
||||
|
|
|
|||
|
|
@ -11,22 +11,27 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
struct EnchantPerfectInfo {
|
||||
/* 0000 */ uint64_t cost;
|
||||
/* 0008 */ std::map<int, int> materials;
|
||||
};
|
||||
|
||||
struct EnchantRandomUpgradeInfo {
|
||||
/* 0000 */ uint64_t unknown_0000;
|
||||
/* 0008 */ std::map<int, int> unknown_0008;
|
||||
/* 0000 */ uint64_t cost;
|
||||
/* 0008 */ std::map<int, int> materials;
|
||||
/* 0010 */ std::map<int, uint64_t> rates;
|
||||
};
|
||||
|
||||
struct EnchantOptionInfo {
|
||||
/* 0000 */ int64_t unknown_0000;
|
||||
/* 0008 */ std::map<int, int> unknown_0008;
|
||||
/* 0000 */ uint64_t requireCost;
|
||||
/* 0008 */ std::map<int, int> requireMaterials;
|
||||
/* 0010 */ uint64_t successRate;
|
||||
/* 0018 */ std::map<uint32_t, uint64_t> gradeBonus;
|
||||
/* 0020 */ std::map<int, std::array<uint8_t, 0x8>> unknown_0020;
|
||||
/* 0028 */ std::map<int, std::array<uint8_t, 0x14>> unknown_0028;
|
||||
/* 0020 */ std::map<uint32_t, std::map<int, uint64_t>> enchants;
|
||||
/* 0028 */ std::map<int, EnchantPerfectInfo> perfectEnchants;
|
||||
/* 0030 */ std::map<int, EnchantRandomUpgradeInfo> randomUpgrades;
|
||||
/* 0038 */ std::map<int, std::array<uint8_t, 0x8>> unknown_0038;
|
||||
/* 0040 */ bool unknown_0040 = false;
|
||||
/* 0038 */ std::map<int, std::map<int, EnchantPerfectInfo>> perfectUpgrades;
|
||||
/* 0040 */ bool isUpgrade = false;
|
||||
};
|
||||
|
||||
struct EnchantInfo {
|
||||
|
|
@ -35,8 +40,11 @@ struct EnchantInfo {
|
|||
/* 0010 */ uint32_t condition2;
|
||||
/* 0014 */ bool approveRandomOption;
|
||||
/* 0018 */ std::vector<int> slots;
|
||||
/* 0024 */ uint8_t unknown_0024[0x1C];
|
||||
/* 0040 */ std::map<int, int> unknown_0040;
|
||||
/* 0024 */ uint8_t unknown_0024[0x4];
|
||||
/* 0028 */ bool resetEnabled;
|
||||
/* 0030 */ uint64_t resetRate;
|
||||
/* 0038 */ uint64_t resetCost;
|
||||
/* 0040 */ std::map<int, int> resetMaterials;
|
||||
/* 0048 */ std::string caution;
|
||||
/* 0060 */ std::map<uint32_t, EnchantOptionInfo> 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<std::string, int>& materials);
|
||||
void AddPerfectUpgradeEnchant(uint64_t group, uint32_t optionKey, const std::string& baseItemName, const std::string& itemName, uint64_t cost,
|
||||
const std::map<std::string, int>& materials);
|
||||
bool CallScript(const std::string& name);
|
||||
EnchantInfo* GetEnchantInfo(uint64_t group);
|
||||
std::map<int, int> ConvertMaterials(std::map<std::string, int> materials);
|
||||
bool Init();
|
||||
void SetEnchant(uint64_t group, uint32_t optionKey, uint32_t slot, const std::map<std::string, uint64_t>& 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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue