Вот эту функцию неплохо бы разобрать:
- Код: Выделить всё
int __userpurge sub_00423C80@<eax>(int a1@<ecx>, double a2@<st0>, int a3, _Hero_ *DHero, _Hero_ *AHero)
{
int v5; // ebx
signed int v7; // edi
int v8; // esi
int v9; // ecx
int v10; // [esp+Ch] [ebp+8h]
v5 = a1;
if ( !*(_DWORD *)(a1 + 64) )
return 0;
v7 = *(_DWORD *)(a3 + 12);
if ( v7 > 5 )
v7 = 5;
v8 = SpellTable_Offset->AIValue[*(_DWORD *)(a3 + 4) + 34 * *(_DWORD *)a3];
CalcSpellDamagePercentage(*(_DWORD *)a3, *(_DWORD *)(a1 + 4), DHero, AHero);
__asm { fstp [ebp+AHero]; Store Real and Pop }
v10 = *(_DWORD *)(v5 + 64) * v7 * v8;
__asm
{
fild [ebp+arg_0]; Load Integer
fstp [ebp+arg_0]; Store Real and Pop
fld [ebp+arg_0]; Load Real
fmul [ebp+AHero]; Multiply Real
fdiv ds:dbl_0063AC30; Divide Real
}
return _ftol(v9);
}
А именно интересно, что и откуда попадает в [ebp+AHero] после выполнения __asm { fstp [ebp+AHero]; }?
Я бы предположил, что CalcSpellDamagePercentage() возвращает совсем не __int16, а float или double, но нужна проверка
* * *
А вот уже нормальная декомпиляция с чистой базы:
- Код: Выделить всё
int __thiscall sub_423C80(_DWORD *this, _DWORD *a2, int a3, int a4)
{
_DWORD *v4; // ebx
signed __int64 v5; // rax
signed int v6; // edi
int v7; // esi
int v8; // edx
float v10; // [esp+Ch] [ebp+8h]
float v11; // [esp+14h] [ebp+10h]
v4 = this;
if ( this[16] )
{
v6 = a2[3];
if ( v6 > 5 )
v6 = 5;
v7 = *((_DWORD *)off_687FA8 + a2[1] + 34 * *a2 + 26);
v8 = this[1];
v11 = sub_44A1A0(a3, a4);
v10 = (double)(v4[16] * v6 * v7);
v5 = (signed __int64)(v10 * v11 / 500.0);
}
else
{
LODWORD(v5) = 0;
}
return v5;
}