// // sub_529D8 from 0x529d8 to 0x52c8c (692 bytes) // // 1 xrefs: // > @ 0x10c230 // // 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_529D8(__int64 a1) { __int64 v2; // x20 __int64 result; // x0 char v4; // w8 unsigned int *v5; // x8 unsigned int v6; // w9 __int64 v7; // x0 __int64 v8; // x0 __int64 v9; // x1 __int64 v10; // x1 __int64 v11; // x8 __int64 v12; // x0 __int64 v13; // x0 __int64 v14; // x1 __int64 v15; // x1 __int64 v16; // x1 unsigned int v17; // w20 __int64 v18; // [xsp+8h] [xbp-28h] BYREF __int64 v19; // [xsp+18h] [xbp-18h] BYREF v2 = *(_QWORD *)(*(_QWORD *)(a1 + 24) + 104LL); result = ((__int64 (*)(void))loc_524E4)(); if ( (_DWORD)result ) return result; if ( (*(_BYTE *)(a1 + 57) & 2) != 0 ) { if ( !*(_QWORD *)(a1 + 752) || (result = ((__int64 (*)(void))sub_53D58)(), !(_DWORD)result) ) { if ( !*(_QWORD *)(a1 + 760) || (result = ((__int64 (*)(void))sub_53D58)(), !(_DWORD)result) ) { if ( !*(_QWORD *)(a1 + 664) || (result = sub_53D58(a1 + 112), !(_DWORD)result) ) { result = sub_77B68( *(_QWORD *)(a1 + 8), *(unsigned int *)(*(_QWORD *)(*(_QWORD *)(a1 + 40) + 96LL) + 164LL), &v19); if ( !(_DWORD)result ) { result = sub_A7BD0(v19, &v18); if ( !(_DWORD)result ) { v13 = v18; v14 = *(_QWORD *)(a1 + 40); *(_QWORD *)(a1 + 744) = v18; result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(*(_QWORD *)v13 + 32LL))(v13, v14, a1); if ( !(_DWORD)result ) { if ( *(float *)(a1 + 104) < 100.0 ) *(_DWORD *)(a1 + 104) = 1120403456; if ( *(_QWORD *)(a1 + 752) ) { result = sub_53D88(v2); if ( (_DWORD)result ) return result; v15 = *(_QWORD *)(a1 + 760); if ( v15 ) { *(_QWORD *)(v15 + 512) = *(_QWORD *)(a1 + 24); result = sub_CB148(*(_QWORD *)(a1 + 752), v15, 0, 0, 0, 0); if ( (_DWORD)result ) return result; v16 = *(_QWORD *)(a1 + 744); *(_QWORD *)(v16 + 512) = *(_QWORD *)(a1 + 24); v12 = *(_QWORD *)(a1 + 760); } else { v16 = *(_QWORD *)(a1 + 744); *(_QWORD *)(v16 + 512) = *(_QWORD *)(a1 + 24); v12 = *(_QWORD *)(a1 + 752); } } else { v16 = *(_QWORD *)(a1 + 744); v12 = v2; *(_QWORD *)(v16 + 512) = *(_QWORD *)(a1 + 24); } LABEL_42: result = sub_53DFC(v12, v16, 0, 0); if ( (_DWORD)result ) return result; if ( (*(_BYTE *)(a1 + 62) & 1) == 0 ) { result = sub_53DAC(); if ( (_DWORD)result ) return result; v17 = 0; while ( v17 != 4 ) { result = sub_52C8C(a1, *(_QWORD *)(a1 + 768), v17++); if ( (_DWORD)result ) return result; } } return sub_53DDC(); } } } } } } } else { v4 = *(_BYTE *)(a1 + 62); *(_QWORD *)(a1 + 744) = 0; if ( (v4 & 1) != 0 ) { v5 = (unsigned int *)(a1 + 212); do v6 = __ldaxr(v5); while ( __stlxr(v6 | 0x100, v5) ); } v7 = *(_QWORD *)(a1 + 752); if ( !v7 || (result = sub_53D58(v7), !(_DWORD)result) ) { v8 = *(_QWORD *)(a1 + 760); if ( !v8 || (result = sub_53D58(v8), !(_DWORD)result) ) { result = sub_53D68(a1 + 112); if ( !(_DWORD)result ) { result = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(*(_QWORD *)a1 + 144LL))( a1, *(unsigned int *)(*(_QWORD *)(a1 + 40) + 76LL), *(unsigned int *)(*(_QWORD *)(a1 + 40) + 80LL)); if ( !(_DWORD)result ) { v9 = *(_QWORD *)(a1 + 40); *(float *)(a1 + 104) = -*(float *)(a1 + 100); sub_85D08(a1 + 112, v9, a1); if ( *(_QWORD *)(a1 + 752) ) sub_53D7C(); if ( *(_QWORD *)(a1 + 760) ) sub_53D7C(); if ( *(_QWORD *)(a1 + 752) ) { result = sub_53D88(v2); if ( (_DWORD)result ) return result; v10 = *(_QWORD *)(a1 + 760); v11 = *(_QWORD *)(a1 + 24); if ( v10 ) { *(_QWORD *)(v10 + 512) = v11; result = sub_53DFC(*(_QWORD *)(a1 + 752), v10, 0, 0); if ( (_DWORD)result ) return result; v11 = *(_QWORD *)(a1 + 24); v12 = *(_QWORD *)(a1 + 760); } else { v12 = *(_QWORD *)(a1 + 752); } *(_QWORD *)(a1 + 624) = v11; } else { *(_QWORD *)(a1 + 624) = *(_QWORD *)(a1 + 24); v12 = v2; } v16 = a1 + 112; goto LABEL_42; } } } } } return result; }