文章性质:学习纯笔记
引擎代码无法独立使用
IDA9生成的伪代码:
// positive sp value has been detected, the output may be wrong!
BOOL __cdecl Item::AdjustDarkSkill(Item *const this)
{
BOOL IsDark; // eax
BOOL v2; // edx
_ITEM *m_pItem; // eax
unsigned int m_Level; // ecx
int v6; // ebx
int v7; // ecx
INT v8; // ebx
int v9; // edx
char *v10; // eax
BOOL IsEquip; // eax
unsigned __int8 v12; // dl
_ITEM *v13; // eax
EQUIP_TB *EquipTB; // ebx
UINT m_ReqLevel; // esi
int v16; // eax
int j; // edx
int v18; // esi
int v19; // ecx
_DARK_SKILL_STRUCT *v20; // edx
int v21; // eax
int v22; // [esp+14h] [ebp-90h]
unsigned int v23; // [esp+20h] [ebp-84h]
int v24; // [esp+24h] [ebp-80h]
INT v25; // [esp+38h] [ebp-6Ch]
float v26; // [esp+3Ch] [ebp-68h]
INT i; // [esp+40h] [ebp-64h]
_DARK_SKILL_STRUCT sDarkSkillTmp; // [esp+4Ch] [ebp-58h] BYREF
// 是否是暗器
IsDark = Item::IsDark(this);
v2 = 0;
if ( !IsDark )
return v2;
if ( Item::IsDark(this) )
{
m_pItem = this->m_pItem;
if ( m_pItem )
{
m_Level = m_pItem->m_DarksInfo.m_Level;
goto LABEL_6;
}
}
// 是否是装备
IsEquip = Item::IsEquip(this);
v12 = -1;
if ( !IsEquip )
goto LABEL_22;
v13 = this->m_pItem;
if ( !v13 )
__assert__("./Item/Item.inl", 0x21u, "UINT Item::GetItemTableIndex() const", "m_pItem");
EquipTB = ItemTable::GetEquipTB(&g_ItemTable, v13->m_ItemIndex);
if ( EquipTB )
{
if ( Item::IsDark(this) )
{
m_ReqLevel = EquipTB->m_ReqLevel;
if ( m_ReqLevel <= Item::GetDarkLevel(this) )
{
m_Level = (unsigned __int8)Item::GetDarkLevel(this);
goto LABEL_6;
}
}
v12 = EquipTB->m_ReqLevel;
LABEL_22:
m_Level = v12;
goto LABEL_6;
}
m_Level = 255;
LABEL_6:
v2 = 0;
if ( m_Level - 40 <= 0x78 )
{
i = 0;
v23 = m_Level / 0xA;
do
{
if ( Item::GetDarkSkillId(this, i) > 0 )
{
v6 = g_DarkSkillStudyTbl.m_DarkRateBase[i];
v26 = (float)v6;
v22 = (int)((long double)rand() * 4.6566129e-10 * v26);
if ( v22 == v6 )
--v22;
v7 = 0;
v8 = 0;
if ( g_DarkSkillStudyTbl.m_Count > 0 )
{
v9 = 0;
while ( 1 )
{
v10 = (char *)&g_DarkSkillStudyTbl.m_Table->m_Index + 4 * i + v9;
v7 += *((_DWORD *)v10 + 4);
if ( v22 <= v7 )
break;
++v8;
v9 += 28;
if ( g_DarkSkillStudyTbl.m_Count <= v8 )
goto LABEL_15;
}
v16 = *((_DWORD *)v10 + 1);
for ( j = 0; j <= 15; ++j )
sDarkSkillTmp.m_SkillIdOnLevel[j] = 0;
if ( g_DarkSkillTbl.m_Table )
{
v25 = 0;
if ( g_DarkSkillTbl.m_Count > 0 )
{
v24 = 0;
v18 = 0;
while ( 2 )
{
v19 = 0;
v20 = &g_DarkSkillTbl.m_Table[v18];
do
{
if ( v20->m_SkillIdOnLevel[0] == v16 )
{
qmemcpy(&sDarkSkillTmp, &g_DarkSkillTbl.m_Table[v24], sizeof(sDarkSkillTmp));
goto LABEL_35;
}
++v19;
v20 = (_DARK_SKILL_STRUCT *)((char *)v20 + 4);
}
while ( v19 <= 15 );
++v25;
++v18;
++v24;
if ( g_DarkSkillTbl.m_Count > v25 )
continue;
break;
}
}
}
LABEL_35:
v21 = v23 - 1;
if ( (int)(v23 - 1) < 0 )
{
v21 = 0;
}
else if ( v21 > 15 )
{
v21 = 15;
}
Item::SetDarkSkillId(this, i, sDarkSkillTmp.m_SkillIdOnLevel[v21]);
}
}
LABEL_15:
++i;
}
while ( i <= 2 );
return 1;
}
return v2;
}
转换为C++代码
初步测试可运行,未校验错误、没有对代码进行任何优化,保持IDA结构,仅仅排查了错误
***付费内容***
剩余 54% 内容需要支付 200.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|