// // sub_521D8 from 0x521d8 to 0x52448 (624 bytes) // // 1 xrefs: // > @ 0x10c058 // // This function is hookable on this platform! // // Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA // Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings // __int64 __fastcall sub_521D8(__int64 a1, int a2) { __int64 result; // x0 __int64 v5; // x0 __int64 v6; // x21 _QWORD *v7; // x10 __int64 v8; // x8 int v9; // w8 __int64 v10; // x10 int v11; // w9 __int64 v12; // x10 float v13; // s0 unsigned int v14; // w11 unsigned int v15; // w12 int v16; // w13 unsigned int v17; // w11 int v18; // w11 unsigned int v19; // w8 int v20; // w8 unsigned int v21; // w8 int v22; // w9 _BYTE v23[4]; // [xsp+4h] [xbp-2Ch] BYREF __int64 v24; // [xsp+8h] [xbp-28h] BYREF unsigned __int64 v25; // [xsp+18h] [xbp-18h] BYREF result = ((__int64 (*)(void))loc_5251C)(); if ( (_DWORD)result ) return result; if ( (*(_DWORD *)(a1 + 60) & 0x60) != 0x40 ) return 0; v5 = *(_QWORD *)(a1 + 24); if ( (*(_DWORD *)(v5 + 72) & 0x30000) == 0x10000 || (*(_DWORD *)(a1 + 56) & 0x80000000) != 0 ) return 0; v25 = 0; v24 = 0; v23[0] = 0; v6 = *(_QWORD *)(v5 + 96); result = (*(__int64 (__fastcall **)(__int64, unsigned __int64 *, __int64 *, _BYTE *))(*(_QWORD *)v5 + 232LL))( v5, &v25, &v24, v23); if ( (_DWORD)result ) return result; if ( v24 | v25 ) { if ( v6 ) { v7 = *(_QWORD **)(v6 + 56); if ( v7 ) v7 = (_QWORD *)*v7; } else { v7 = nullptr; } if ( (unsigned __int64)v7 < v25 ) { LABEL_12: a2 = 0; if ( !v6 ) goto LABEL_20; goto LABEL_18; } if ( v24 - 1 < (unsigned __int64)v7 ) { if ( !v23[0] ) goto LABEL_12; a2 = 0; *(_DWORD *)(a1 + 60) &= ~0x40u; } } if ( !v6 ) goto LABEL_20; LABEL_18: if ( *(_BYTE *)(v6 + 49) ) *(_DWORD *)(a1 + 60) &= ~0x40u; LABEL_20: if ( a2 ) { v8 = *(_QWORD *)(a1 + 24); if ( *(_DWORD *)(a1 + 80) == 1 ) v9 = a2 * (int)(float)(*(float *)(v8 + 52) * (float)((float)(*(float *)(v8 + 556) * (float)((float)(1.0 - *(float *)(v8 + 240)) + (float)(*(float *)(v8 + 124) * *(float *)(v8 + 240)))) * *(float *)(*(_QWORD *)(v8 + 32) + 504LL))) / -1000; else v9 = a2 * (int)(float)(*(float *)(v8 + 52) * (float)((float)(*(float *)(v8 + 556) * (float)((float)(1.0 - *(float *)(v8 + 240)) + (float)(*(float *)(v8 + 124) * *(float *)(v8 + 240)))) * *(float *)(*(_QWORD *)(v8 + 32) + 504LL))) / 1000; *(_DWORD *)(a1 + 76) += v9; } else { v9 = 0; } v10 = *(_QWORD *)(a1 + 40); if ( !v10 ) return 0; v11 = *(_DWORD *)(a1 + 56); if ( (v11 & 2) != 0 || (v11 & 4) != 0 && *(_DWORD *)(a1 + 84) ) { v12 = *(_QWORD *)(a1 + 24); while ( 1 ) { v13 = *(float *)(v12 + 556); if ( v13 <= 0.0 || (v14 = *(_DWORD *)(a1 + 88), v15 = *(_DWORD *)(a1 + 76), v15 < *(_DWORD *)(a1 + 92) + v14) ) { if ( v13 >= 0.0 ) return 0; v15 = *(_DWORD *)(a1 + 76); v14 = *(_DWORD *)(a1 + 88); if ( v15 > v14 ) return 0; } v16 = *(_DWORD *)(a1 + 84); if ( !v16 ) { if ( !*(_DWORD *)(a1 + 80) && v13 > 0.0 ) v14 += *(_DWORD *)(a1 + 92); v20 = *(_DWORD *)(a1 + 60); result = 0; *(_DWORD *)(a1 + 76) = v14; v21 = v20 & 0xFFFFFFBF; goto LABEL_53; } if ( (v11 & 2) != 0 ) break; if ( (v11 & 4) != 0 ) { *(_DWORD *)(a1 + 80) = *(_DWORD *)(a1 + 80) == 0; v17 = v15 - v9; LABEL_42: *(_DWORD *)(a1 + 76) = v17; } if ( (v16 & 0x80000000) == 0 ) *(_DWORD *)(a1 + 84) = v16 - 1; } v18 = *(_DWORD *)(a1 + 92); if ( v13 <= 0.0 ) v17 = v15 + v18; else v17 = v15 - v18; goto LABEL_42; } v19 = *(_DWORD *)(v10 + 68); if ( *(_DWORD *)(a1 + 76) < v19 ) return 0; v22 = *(_DWORD *)(a1 + 60); result = 0; *(_DWORD *)(a1 + 76) = v19; v21 = v22 & 0xFFFFFFBF; LABEL_53: *(_DWORD *)(a1 + 60) = v21; return result; }