// // sub_5470C from 0x5470c to 0x54a54 (840 bytes) // // 1 xrefs: // > @ 0x10c3d8 // // 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_5470C(__int64 a1, unsigned int a2, unsigned int a3, char a4) { __int64 v4; // x21 unsigned int v6; // w8 unsigned int v10; // w24 __int64 v11; // x0 __int64 v12; // x8 int v13; // w25 __int64 v14; // x0 unsigned int v15; // w24 __int64 v16; // x0 unsigned int v17; // w21 __int64 v18; // x0 char v19; // w8 char v20; // w8 __int64 v21; // x0 __int64 v22; // x19 __int64 v23; // x9 __int64 v24; // x8 __int64 v25; // x9 __int64 v27; // x0 __int64 v28; // x0 __int64 v29; // x0 __int64 v30; // [xsp+0h] [xbp-50h] BYREF char v31; // [xsp+8h] [xbp-48h] if ( (*(_BYTE *)(a1 + 60) & 0x80) != 0 ) return 30; v4 = *(_QWORD *)(a1 + 40); if ( !v4 ) return 31; v6 = atomic_load((unsigned int *)(v4 + 272)); if ( v6 == 7 && (a4 & 1) == 0 ) return 46; v11 = sub_54C9C(a1); v12 = *(_QWORD *)(a1 + 24); if ( v12 ) v13 = *(_DWORD *)(v12 + 72); else v13 = 0; v14 = sub_54CB8(v11); if ( !*(_QWORD *)(a1 + 24) ) return 0; if ( (v13 & 0x40000) != 0 && a3 == 2 && a2 && (v13 & 0x200000) == 0 ) { v15 = *(_DWORD *)(v4 + 64) - *(_DWORD *)(*(_QWORD *)(v4 + 384) + 68LL); if ( v15 <= a2 && *(_DWORD *)(v4 + 396) + v15 > a2 ) { sub_54C9C(v14); v16 = *(_QWORD *)(a1 + 192); v17 = a2 - v15; if ( v16 ) v16 = sub_54D00(); sub_54CB8(v16); v10 = 0; *(_DWORD *)(a1 + 144) = 0; *(_DWORD *)(a1 + 148) = v17; *(_DWORD *)(a1 + 72) = 0; *(_DWORD *)(a1 + 76) = a2; return v10; } } else if ( a3 == 16 ) { sub_54C9C(v14); v18 = *(_QWORD *)(a1 + 192); if ( v18 ) v18 = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, _QWORD))(*(_QWORD *)v18 + 216LL))(v18, a2, 16, 0); sub_54CB8(v18); return 0; } v19 = atomic_load((unsigned int *)(v4 + 88)); if ( v19 < 0 ) { if ( !*(_QWORD *)(a1 + 192) || (v10 = sub_54D00()) == 0 ) { v10 = 0; *(_DWORD *)(a1 + 72) = 0; *(_DWORD *)(a1 + 76) = a2; *(_DWORD *)(a1 + 144) = 0; *(_DWORD *)(a1 + 148) = a2; *(_DWORD *)(a1 + 160) = 0; *(_QWORD *)(a1 + 152) = 0; } } else { if ( a3 == 2 && *(_DWORD *)(v4 + 192) == *(_DWORD *)(*(_QWORD *)(v4 + 96) + 284LL) ) { v20 = atomic_load((unsigned int *)(v4 + 88)); if ( (v20 & 0x10) == 0 ) { v10 = 0; if ( (v13 & 0x10000) != 0 || (*(_DWORD *)(a1 + 60) & 0x40) == 0 ) return v10; } } if ( (*(_BYTE *)(v4 + 46) & 1) != 0 && (a4 & 1) == 0 ) { sub_54C9C(v14); v21 = *(_QWORD *)(a1 + 8); *(_DWORD *)(a1 + 60) |= 0x4000u; sub_7B9F0(v21, 8); if ( *(_QWORD *)(a1 + 192) ) sub_54CA8(); sub_67F54(*(_QWORD *)(v4 + 384), 0, *(unsigned int *)(*(_QWORD *)(v4 + 384) + 68LL)); v22 = *(_QWORD *)(*(_QWORD *)(v4 + 264) + 16LL); v30 = *(_QWORD *)(v22 + 360); FMOD_OS_CriticalSection_Enter(v30); v31 = 1; atomic_store(7u, (unsigned int *)(v4 + 272)); v23 = *(_QWORD *)(v4 + 184); if ( v23 ) atomic_store(7u, (unsigned int *)(v23 + 272)); v24 = *(_QWORD *)(v4 + 264); *(_DWORD *)(v24 + 284) = a2; *(_DWORD *)(v24 + 288) = a3; *(_QWORD *)(v24 + 40) = v4; v25 = *(_QWORD *)(v22 + 344); *(_QWORD *)(v24 + 24) = v22 + 336; v24 += 24; *(_QWORD *)(v24 + 8) = v25; *(_QWORD *)(v22 + 344) = v24; **(_QWORD **)(v24 + 8) = v24; sub_52090((__int64)&v30); sub_54C8C(v22); return 0; } LOBYTE(v30) = 0; if ( (a4 & 1) == 0 ) { sub_54CE8(v14); v29 = (*(__int64 (__fastcall **)(_QWORD, __int64 *))(**(_QWORD **)(a1 + 192) + 96LL))(*(_QWORD *)(a1 + 192), &v30); if ( (_DWORD)v29 ) { v10 = v29; LABEL_58: sub_54CF4(v29); return v10; } if ( *(_QWORD *)(a1 + 192) ) sub_54CA8(); } v27 = sub_66E18(v4, a2, a3); v10 = v27; if ( !(_DWORD)v27 ) { sub_54C9C(v27); v28 = *(_QWORD *)(a1 + 192); if ( v28 ) v28 = sub_54D00(); sub_54CB8(v28); *(_QWORD *)(a1 + 144) = 0; *(_QWORD *)(a1 + 152) = 0; *(_DWORD *)(a1 + 160) = 0; if ( a3 == 2 ) *(_DWORD *)(a1 + 76) = a2; else sub_D2CC8(*(_QWORD *)(v4 + 96), a1 + 76, 2); v10 = sub_66D84(v4); } if ( (a4 & 1) == 0 ) { v29 = *(_QWORD *)(a1 + 192); if ( v29 ) v29 = (*(__int64 (__fastcall **)(__int64, _QWORD))(*(_QWORD *)v29 + 88LL))(v29, (unsigned __int8)v30); goto LABEL_58; } } return v10; }