// // sub_180006A40 from 0x180006a40 to 0x180006eb9 (1145 bytes) // // 2 xrefs: // > sub_180008050 @ 0x18000824e // > @ 0x1801f633c // // 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 // _DWORD *__fastcall sub_180006A40(__int64 a1, __int64 a2, __int64 *a3, _DWORD *a4) { int *v6; // rsi __int64 v7; // r15 int v8; // r13d unsigned int v9; // ebx int v10; // edx unsigned int v11; // eax int v12; // edx int v13; // eax int v14; // r10d int v15; // r12d __int64 v16; // r8 __int64 v17; // rcx int v18; // edi __int64 v19; // rax __int64 v20; // rdx __int64 v21; // r9 char v22; // r12 __int64 v23; // r13 int v24; // esi __int64 v25; // r8 __int64 v26; // r10 __int64 v27; // rdx __int64 v28; // rdi __int64 v29; // rsi __int64 v30; // r12 int v31; // eax int v32; // eax int v33; // eax __int64 v34; // rdx __int64 v35; // r10 __int64 v36; // rax __int64 v37; // rdi __int64 v38; // rsi int v39; // eax int v40; // eax __int64 v41; // rbx __int64 v42; // rcx __int64 v43; // rax __int64 v44; // rdx _DWORD *v45; // rsi int v46; // eax __int64 v47; // rdi __int64 v48; // rcx __int64 v49; // r8 int v50; // ebx int v51; // r11d int v52; // eax int v53; // ecx int v54; // ebx int v55; // eax int v56; // edx int v57; // ecx int v58; // eax __int64 v59; // rcx __int64 v60; // rcx int v62; // [rsp+20h] [rbp-68h] int v63; // [rsp+28h] [rbp-60h] __int64 v64; // [rsp+30h] [rbp-58h] __int64 v65; // [rsp+38h] [rbp-50h] __int64 v66; // [rsp+40h] [rbp-48h] __int64 v67; // [rsp+48h] [rbp-40h] int v68; // [rsp+90h] [rbp+8h] v6 = (int *)a3; v7 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)a1 + 32LL) + 72LL); v8 = dword_1801A4200[*((int *)a3 + 14) - 1]; v63 = v8; if ( (unsigned int)sub_180001340(a2, 1) != 1 ) return nullptr; v9 = v8 - 1; v10 = 0; v11 = v8 - 1; if ( v8 == 1 ) { *a4 = sub_180001340(a2, 0); v12 = 0; } else { do { ++v10; v11 >>= 1; } while ( v11 ); *a4 = sub_180001340(a2, v10); v12 = 0; do { ++v12; v9 >>= 1; } while ( v9 ); } v13 = sub_180001340(a2, v12); v14 = 0; a4[1] = v13; v15 = 2; v62 = 0; LODWORD(v16) = 2; v68 = 2; if ( v6[12] > 0 ) { v17 = 0; v65 = 0; while ( 1 ) { v18 = 0; v19 = *(_QWORD *)v6; v20 = 11LL * *(char *)(*((_QWORD *)v6 + 1) + v17); v21 = v20 + *(_QWORD *)v6 + 3LL; v64 = v21; v22 = *(_BYTE *)(v20 + *(_QWORD *)v6 + 1); v23 = *(char *)(v20 + *(_QWORD *)v6); v24 = 1 << v22; if ( *(_BYTE *)(v20 + v19 + 1) ) { v18 = sub_1800013B0(v7 + 120LL * *(unsigned __int8 *)(v20 + v19 + 2), a2); if ( v18 == -1 ) return nullptr; v21 = v64; LODWORD(v16) = v68; v14 = v62; } if ( (_DWORD)v23 == 4 ) break; if ( (_DWORD)v23 == 3 ) { v34 = v24 - 1LL; v35 = *(unsigned __int8 *)((v18 & (unsigned __int64)v34) + v21); v36 = (__int64)v18 >> v22; v37 = *(unsigned __int8 *)((v34 & v36) + v21); v38 = *(unsigned __int8 *)((v34 & (v36 >> v22)) + v21); if ( (_BYTE)v35 == 0xFF ) v39 = 0; else v39 = sub_1800013B0(v7 + 120 * v35, a2); a4[v68] = v39; if ( (_BYTE)v37 == 0xFF ) v40 = 0; else v40 = sub_1800013B0(v7 + 120 * v37, a2); a4[v68 + 1] = v40; if ( (_BYTE)v38 == 0xFF ) a4[v68 + 2] = 0; else a4[v68 + 2] = sub_1800013B0(v7 + 120 * v38, a2); goto LABEL_43; } if ( v23 > 0 ) { v41 = 0; v42 = v24 - 1LL; v16 = (int)v16; v67 = v42; v66 = (int)v16; do { v43 = v42 & v18; v18 >>= v22; v44 = *(unsigned __int8 *)(v43 + v21); v45 = &a4[v16 + v41]; if ( (_BYTE)v44 == 0xFF ) { *v45 = 0; } else { v46 = sub_1800013B0(v7 + 120 * v44, a2); *v45 = v46; if ( v46 == -1 ) return nullptr; v21 = v64; v16 = v66; } v42 = v67; ++v41; } while ( v41 < v23 ); goto LABEL_43; } LABEL_44: LODWORD(v16) = v23 + v16; v6 = (int *)a3; ++v14; v17 = v65 + 1; v68 = v16; v62 = v14; ++v65; if ( v14 >= *((_DWORD *)a3 + 12) ) { v8 = v63; v15 = 2; goto LABEL_46; } } v25 = v24 - 1LL; v26 = *(unsigned __int8 *)((v25 & v18) + v21); v27 = v18 >> v22; v28 = *(unsigned __int8 *)((v27 & v25) + v21); v29 = *(unsigned __int8 *)((v25 & (v27 >> v22)) + v21); v30 = *(unsigned __int8 *)((v25 & (v27 >> v22 >> v22)) + v21); if ( (_BYTE)v26 == 0xFF ) v31 = 0; else v31 = sub_1800013B0(v7 + 120 * v26, a2); a4[v68] = v31; if ( (_BYTE)v28 == 0xFF ) v32 = 0; else v32 = sub_1800013B0(v7 + 120 * v28, a2); a4[v68 + 1] = v32; if ( (_BYTE)v29 == 0xFF ) v33 = 0; else v33 = sub_1800013B0(v7 + 120 * v29, a2); a4[v68 + 2] = v33; if ( (_DWORD)v30 == 255 ) a4[v68 + 3] = 0; else a4[v68 + 3] = sub_1800013B0(v7 + 120 * v30, a2); LABEL_43: LODWORD(v16) = v68; v14 = v62; goto LABEL_44; } LABEL_46: if ( v6[13] > 2 ) { v47 = 2; do { v48 = *(char *)(v47 + *((_QWORD *)v6 + 5) - 2); v49 = *(char *)(*((_QWORD *)v6 + 4) + v47 - 2); v50 = a4[v48] & 0x7FFF; v51 = (a4[v49] & 0x7FFF) - v50; v52 = (int)((*(unsigned __int16 *)(*((_QWORD *)v6 + 2) + 2 * v47) - *(unsigned __int16 *)(*((_QWORD *)v6 + 2) + 2 * v48)) * abs32(v51)) / (*(unsigned __int16 *)(*((_QWORD *)v6 + 2) + 2 * v49) - *(unsigned __int16 *)(*((_QWORD *)v6 + 2) + 2 * v48)); v53 = v52 + v50; v54 = v50 - v52; v55 = a4[v47]; if ( v51 >= 0 ) v54 = v53; v56 = v8 - v54; if ( v55 ) { v57 = v54; if ( v56 < v54 ) v57 = v8 - v54; if ( v55 < 2 * v57 ) { if ( (v55 & 1) != 0 ) v58 = -((v55 + 1) >> 1); else v58 = v55 >> 1; } else if ( v56 <= v54 ) { v58 = v56 - v55 - 1; } else { v58 = v55 - v54; } a4[v47] = v54 + v58; v59 = *(char *)(v47 + *((_QWORD *)v6 + 5) - 2); a4[v59] &= 0x7FFFu; v60 = *(char *)(*((_QWORD *)v6 + 4) + v47 - 2); a4[v60] &= 0x7FFFu; } else { a4[v47] = v54 | 0x8000; } ++v15; ++v47; } while ( v15 < v6[13] ); } return a4; }