// // sub_59D94 from 0x59d94 to 0x59fec (600 bytes) // // 20 xrefs: // > sub_59AE8 @ 0x59bbc // > sub_5B0C4 @ 0x5b0d8 // > sub_5B530 @ 0x5b534 // > sub_5FD88 @ 0x5fe2c // > sub_5FF9C @ 0x5ffdc // > sub_601E4 @ 0x60230 // > sub_60858 @ 0x60860 // > sub_6E15C @ 0x6e290 // > sub_6E374 @ 0x6e410 // > sub_75F9C @ 0x76168 // > sub_76178 @ 0x762a0 // > sub_7A768 @ 0x7a914 // > sub_7C19C @ 0x7c244 // > sub_7C19C @ 0x7c41c // > sub_7C19C @ 0x7c524 // > sub_8D6F8 @ 0x8f180 // > sub_92230 @ 0x92248 // > sub_9663C @ 0x96644 // > sub_A1204 @ 0xa120c // > sub_A3828 @ 0xa38bc // // 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 // void sub_59D94() { __int64 v0; // x0 char v1; // w1 __int64 v2; // x8 __int64 v3; // x19 char v4; // w20 __int64 v5; // x0 __int64 v6; // x0 _QWORD *v7; // x21 __int64 v8; // x8 int v9; // w9 unsigned int v10; // w8 __int64 v11; // x0 __int64 v12; // x8 __int64 v13; // x1 __int64 v14; // x0 __int64 v15; // x0 __int64 v16; // x8 __int64 v17; // x0 __int64 v18; // x0 __int64 v19; // x8 int v20; // w8 _QWORD *v21; // x8 _QWORD *v22; // x22 __int64 v23; // x8 __int64 v24; // x1 __int64 v25; // x0 __int64 v26; // x1 int v27; // w0 v0 = sub_5C6DC(); if ( !v2 || (*(_BYTE *)(v2 + 60) & 0x80) != 0 ) return; v3 = v0; v4 = v1; if ( (v1 & 0x40) != 0 ) sub_5C6D0(); if ( (v4 & 4) == 0 ) { v11 = ((__int64 (*)(void))sub_5C66C)(); v14 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, _QWORD))(v12 + 224))(v11, v13, 0, 0); v15 = sub_5C66C(v14); v17 = (*(__int64 (__fastcall **)(__int64))(v16 + 256))(v15); if ( (_DWORD)v17 ) return; v18 = sub_5C66C(v17); if ( (*(unsigned int (__fastcall **)(__int64))(v19 + 280))(v18) ) return; if ( *(_QWORD *)(v3 + 96) ) { sub_5C500(); sub_CBB14(*(_QWORD *)(v3 + 96), 0, 1); } } v5 = (*(__int64 (__fastcall **)(_QWORD))(**(_QWORD **)(v3 + 472) + 80LL))(*(_QWORD *)(v3 + 472)); if ( (_DWORD)v5 ) return; if ( (v4 & 0x10) != 0 ) { v6 = sub_5C66C(v5); v5 = sub_5C618(v6); if ( (_DWORD)v5 ) return; } v7 = *(_QWORD **)(v3 + 472); v8 = v7[5]; if ( v8 ) { v9 = *(_DWORD *)(v8 + 312) - 1; *(_DWORD *)(v8 + 312) = v9; if ( !v9 ) *(_DWORD *)(v8 + 320) = *(_DWORD *)(*(_QWORD *)(v3 + 8) + 69864LL); } if ( (v4 & 2) != 0 ) { v5 = sub_59520((_QWORD *)v3); if ( (_DWORD)v5 ) return; v20 = *(_DWORD *)(v3 + 72); v7 = *(_QWORD **)(v3 + 472); *(_DWORD *)(v3 + 484) = -1; v10 = v20 & 0xFFFEFFFF; *(_DWORD *)(v3 + 72) = v10; } else { v10 = *(_DWORD *)(v3 + 72); } *(_DWORD *)(v3 + 72) = v10 & 0xFFFBFFFF; v21 = v7; if ( (v4 & 8) != 0 ) { v21 = v7; if ( *(_QWORD *)(v3 + 368) ) { v5 = sub_55C9C(v3, *(_QWORD *)(v3 + 80), 0, 0, 0, 0); if ( (_DWORD)v5 ) return; v21 = *(_QWORD **)(v3 + 472); } } if ( v7 == v21 && (*((_DWORD *)v21 + 15) & 0x40) != 0 ) { LABEL_32: if ( (v4 & 4) != 0 ) goto LABEL_37; goto LABEL_33; } v22 = v7 + 5; v5 = v7[5]; if ( !v5 || (v5 = (**(__int64 (__fastcall ***)(__int64))v5)(v5), (v5 & 1) == 0) ) { v7[3] = 0; *v22 = 0; v7[6] = 0; goto LABEL_32; } sub_7B9D0(*(_QWORD *)(v3 + 8), 8); v7[3] = 0; *v22 = 0; v7[6] = 0; v5 = sub_7B9F0(*(_QWORD *)(v3 + 8), 8); if ( (v4 & 4) != 0 ) goto LABEL_37; LABEL_33: v23 = *(_QWORD *)(v3 + 112); v24 = *(_QWORD *)(v3 + 64); *(_QWORD *)(v3 + 96) = v23; *(_QWORD *)(v3 + 104) = v23; if ( v24 ) { v5 = sub_5C578(v5); *(_QWORD *)(v3 + 64) = 0; } if ( *(_QWORD *)(v3 + 16) ) { v5 = sub_5C578(v5); *(_QWORD *)(v3 + 16) = 0; } LABEL_37: if ( *(_DWORD *)(v3 + 484) == -1 && !(*(_DWORD *)(v3 + 72) & 0x40000 | v4 & 0x80) ) { *(_QWORD *)(v3 + 472) = 0; if ( (v4 & 4) == 0 ) { v25 = sub_5C66C(v5); sub_560D4(v25, v26); if ( v27 ) return; *(_QWORD *)(v3 + 496) = 0; } if ( (v4 & 1) != 0 ) sub_59774(v3, 0); } }