// // Created by neo on 2019-08-15. // #include "TEdgeManager.h" //----- (0100B0F4) -------------------------------------------------------- signed __int64 __thiscall TEdgeManager::box_x(TEdgeManager* this, float a2) { TEdgeManager* v2; // esi double v3; // st7 double v4; // st7 double v6; // [esp+Ch] [ebp-8h] double v7; // [esp+Ch] [ebp-8h] v2 = this; v6 = (double)(*((DWORD*)this + 4) - 1); if (_floor((a2 - *((float*)this + 6)) * *((float*)this + 2)) >= v6) v3 = v6; else v3 = _floor((a2 - *((float*)v2 + 6)) * *((float*)v2 + 2)); if (v3 <= 0.0) { v4 = 0.0; } else { v7 = (double)(*((DWORD*)v2 + 4) - 1); if (_floor((a2 - *((float*)v2 + 6)) * *((float*)v2 + 2)) >= v7) v4 = v7; else v4 = _floor((a2 - *((float*)v2 + 6)) * *((float*)v2 + 2)); } return (signed __int64)v4; } //----- (0100B1AE) -------------------------------------------------------- signed __int64 __thiscall TEdgeManager::box_y(TEdgeManager* this, float a2) { TEdgeManager* v2; // esi double v3; // st7 double v4; // st7 double v6; // [esp+Ch] [ebp-8h] double v7; // [esp+Ch] [ebp-8h] v2 = this; v6 = (double)(*((DWORD*)this + 5) - 1); if (_floor((a2 - *((float*)this + 7)) * *((float*)this + 3)) >= v6) v3 = v6; else v3 = _floor((a2 - *((float*)v2 + 7)) * *((float*)v2 + 3)); if (v3 <= 0.0) { v4 = 0.0; } else { v7 = (double)(*((DWORD*)v2 + 5) - 1); if (_floor((a2 - *((float*)v2 + 7)) * *((float*)v2 + 3)) >= v7) v4 = v7; else v4 = _floor((a2 - *((float*)v2 + 7)) * *((float*)v2 + 3)); } return (signed __int64)v4; } //----- (0100B268) -------------------------------------------------------- int __thiscall TEdgeManager::increment_box_x(TEdgeManager* this, int a2) { int result; // eax result = *((DWORD*)this + 4) - 1; if (a2 + 1 < result) result = a2 + 1; return result; } //----- (0100B284) -------------------------------------------------------- int __thiscall TEdgeManager::increment_box_y(TEdgeManager* this, int a2) { int result; // eax result = *((DWORD*)this + 5) - 1; if (a2 + 1 < result) result = a2 + 1; return result; } //----- (0100B2A0) -------------------------------------------------------- void create(void* a1, unsigned int a2, int a3, void* (__thiscall* a4)(void*)) { char* v4; // esi int v5; // edi if (a3 - 1 >= 0) { v4 = (char*)a1; v5 = a3; do { a4(v4); v4 += a2; --v5; } while (v5); } } //----- (0100B2E5) -------------------------------------------------------- void destroy(void* a1, unsigned int a2, int a3, void(__thiscall* a4)(void*)) { char* v4; // edi int v5; // esi v4 = (char*)a1 + a3 * a2; if (a3 - 1 >= 0) { v5 = a3; do { v4 -= a2; a4(v4); --v5; } while (v5); } } //----- (0100B316) -------------------------------------------------------- void __thiscall TEdgeManager::FieldEffects(TEdgeManager* this, struct TBall* a2, struct vector_type* a3) { struct TBall* v3; // ebx TEdgeManager* v4; // edi int v5; // eax int v6; // esi int v7; // eax int v8; // edi int v9; // eax char v10; // [esp+10h] [ebp-Ch] struct TBall* v11; // [esp+24h] [ebp+8h] v3 = a2; v4 = this; v5 = TEdgeManager::box_x(this, *(float*)((char*)a2 + 42)); v6 = *((DWORD*)v4 + 8) + 16 * (v5 + (unsigned __int64)TEdgeManager::box_y(v4, *(float*)((char*)a2 + 46)) * *((DWORD*)v4 + 4)); v7 = *(DWORD*)(*(DWORD*)(v6 + 12) + 4) - 1; if (v7 >= 0) { v8 = 4 * v7 + 8; v11 = *(struct TBall**)(*(DWORD*)(v6 + 12) + 4); do { v9 = *(DWORD*)(v8 + *(DWORD*)(v6 + 12)); if (**(_BYTE * *)v9 && *(DWORD*)((_BYTE*)v3 + 110) & *(DWORD*)(v9 + 4)) { if ((*(int(__thiscall * *)(DWORD, struct TBall*, char*))(**(DWORD * *)(v9 + 8) + 24))( *(DWORD*)(v9 + 8), v3, &v10)) { vector_add(a3, (struct vector_type*) & v10); } } v8 -= 4; v11 = (struct TBall*)((char*)v11 - 1); } while (v11); } } //----- (0100B3AE) -------------------------------------------------------- int TEdgeManager::TestGridBox(TEdgeManager* this, double a2@ , int a3, int a4, float* a5, struct TEdgeSegment** a6, struct ray_type* a7, struct TBall* a8, int a9) { int v9; // edi int v10; // eax int** v11; // ebx int* v12; // esi int v13; // eax int v14; // eax int v16; // [esp+8h] [ebp+8h] int v17; // [esp+Ch] [ebp+Ch] if (a3 >= 0 && a3 < 10 && a4 >= 0 && a4 < 15) { v9 = *((DWORD*)this + 8) + 16 * (a3 + a4 * *((DWORD*)this + 4)); v10 = *(DWORD*)(*(DWORD*)(v9 + 4) + 4) - 1; if (v10 >= 0) { v17 = 4 * v10 + 8; v11 = (int**)((char*)this + 4 * a9 + 36); v16 = *(DWORD*)(*(DWORD*)(v9 + 4) + 4); do { v12 = *(int**)(v17 + *(DWORD*)(v9 + 4)); if (!*((_BYTE*)v12 + 12)) { if (*(_BYTE*)v12[2]) { if (*(int*)((char*)v12 + 17) & *((DWORD*)a7 + 10)) { LOBYTE(v13) = TBall::already_hit(a8, (struct TEdgeSegment*)v12); if (!v13) { ++a9; *v11 = v12; v14 = *v12; ++v11; *((_BYTE*)v12 + 12) = 1; (*(void(__thiscall * *)(int*, struct ray_type*))(v14 + 12))(v12, a7); if (a2 < *a5) { *a5 = a2; *a6 = (struct TEdgeSegment*)v12; } } } } } v17 -= 4; --v16; } while (v16); } } return a9; } //----- (0100B486) -------------------------------------------------------- double __thiscall TEdgeManager::FindCollisionDistance(TEdgeManager* this, struct ray_type* a2, struct TBall* a3, struct TEdgeSegment** a4) { struct ray_type* v4; // esi float* v5; // edi int v6; // ebx double v7; // st7 float v8; // ST18_4 double v9; // st7 float v10; // ST18_4 double v11; // st7 int v12; // eax int v13; // eax int v14; // eax int v15; // ecx int v16; // eax int v17; // eax double v18; // st7 double v19; // st7 double v20; // st7 double v21; // st7 double v22; // st6 double v23; // st7 double v24; // st6 double v25; // st7 double v26; // st6 double v27; // st7 double v28; // st6 int* v29; // eax int v30; // ecx signed int v32; // [esp+10h] [ebp-28h] float v33; // [esp+14h] [ebp-24h] float v34; // [esp+14h] [ebp-24h] signed int v35; // [esp+18h] [ebp-20h] float v36; // [esp+1Ch] [ebp-1Ch] float v37; // [esp+1Ch] [ebp-1Ch] int v38; // [esp+20h] [ebp-18h] int v39; // [esp+20h] [ebp-18h] int v40; // [esp+20h] [ebp-18h] int v41; // [esp+20h] [ebp-18h] int v42; // [esp+24h] [ebp-14h] int v43; // [esp+24h] [ebp-14h] int v44; // [esp+28h] [ebp-10h] int v45; // [esp+2Ch] [ebp-Ch] float v46; // [esp+30h] [ebp-8h] int v47; // [esp+34h] [ebp-4h] float v48; // [esp+40h] [ebp+8h] struct ray_type* v49; // [esp+40h] [ebp+8h] struct ray_type* v50; // [esp+40h] [ebp+8h] struct ray_type* v51; // [esp+40h] [ebp+8h] v4 = a2; v48 = *(float*)a2; v5 = (float*)this; v46 = 1000000000.0; v6 = 0; v42 = TEdgeManager::box_x(this, v48); v47 = *((int*)v4 + 1); v38 = TEdgeManager::box_y((TEdgeManager*)v5, *(float*)& v47); v7 = *((float*)v4 + 3) * *((float*)v4 + 6) + *(float*)v4; v36 = v7; v8 = v7; v45 = TEdgeManager::box_x((TEdgeManager*)v5, v8); v9 = *((float*)v4 + 4) * *((float*)v4 + 6) + *((float*)v4 + 1); v33 = v9; v10 = v9; v44 = TEdgeManager::box_y((TEdgeManager*)v5, v10); if (v48 >= (double)v36) v32 = -1; else v32 = 1; v11 = *(float*)& v47; if (*(float*)& v47 >= (double)v33) v35 = -1; else v35 = 1; v12 = v38; if (v38 == v44) { v49 = (struct ray_type*)v42; if (v32 == 1) { if (v42 <= v45) { while (1) { v13 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v11, (int)v49, v12, &v46, a4, v4, a3, v6); v49 = (struct ray_type*)((char*)v49 + 1); v6 = v13; if ((signed int)v49 > v45) break; v12 = v38; } } } else if (v42 >= v45) { while (1) { v14 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v11, (int)v49, v12, &v46, a4, v4, a3, v6); v49 = (struct ray_type*)((char*)v49 - 1); v6 = v14; if ((signed int)v49 < v45) break; v12 = v38; } } } else { v15 = v42; if (v42 == v45) { v50 = (struct ray_type*)v38; if (v35 == 1) { if (v38 <= v44) { while (1) { v16 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v11, v15, (int)v50, &v46, a4, v4, a3, v6); v50 = (struct ray_type*)((char*)v50 + 1); v6 = v16; if ((signed int)v50 > v44) break; v15 = v42; } } } else if (v38 >= v44) { while (1) { v17 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v11, v15, (int)v50, &v46, a4, v4, a3, v6); v50 = (struct ray_type*)((char*)v50 - 1); v6 = v17; if ((signed int)v50 < v44) break; v15 = v42; } } } else { v18 = (*(float*)& v47 - v33) / (v48 - v36); v37 = v18; v19 = v18 * v48; v51 = (struct ray_type*)v42; v20 = *(float*)& v47 - v19; v47 = v38; v34 = v20; v6 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v20, v42, v38, &v46, a4, v4, a3, 0); if (v32 == 1) { if (v35 == 1) { v43 = v42 + 1; v39 = v38 + 1; do { v21 = (double)v39 * v5[1] + v5[7]; v22 = ((double)v43 * *v5 + v5[6]) * v37 + v34; if (v22 >= v21) { if (v22 == v21) { v51 = (struct ray_type*)((char*)v51 + 1); ++v43; } ++v47; ++v39; } else { v51 = (struct ray_type*)((char*)v51 + 1); ++v43; } v6 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v21, (int)v51, v47, &v46, a4, v4, a3, v6); } while ((signed int)v51 < v45 || v47 < v44); } else { v40 = v42 + 1; do { v23 = (double)v47 * v5[1] + v5[7]; v24 = ((double)v40 * *v5 + v5[6]) * v37 + v34; if (v24 <= v23) { if (v24 == v23) { v51 = (struct ray_type*)((char*)v51 + 1); ++v40; } --v47; } else { v51 = (struct ray_type*)((char*)v51 + 1); ++v40; } v6 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v23, (int)v51, v47, &v46, a4, v4, a3, v6); } while ((signed int)v51 < v45 || v47 > v44); } } else if (v35 == 1) { v41 = v38 + 1; do { v25 = (double)v41 * v5[1] + v5[7]; v26 = ((double)(signed int)v51 * *v5 + v5[6]) * v37 + v34; if (v26 >= v25) { if (v26 == v25) v51 = (struct ray_type*)((char*)v51 - 1); ++v47; ++v41; } else { v51 = (struct ray_type*)((char*)v51 - 1); } v6 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v25, (int)v51, v47, &v46, a4, v4, a3, v6); } while ((signed int)v51 > v45 || v47 < v44); } else { do { v27 = (double)v47 * v5[1] + v5[7]; v28 = ((double)(signed int)v51 * *v5 + v5[6]) * v37 + v34; if (v28 <= v27) { if (v28 == v27) v51 = (struct ray_type*)((char*)v51 - 1); --v47; } else { v51 = (struct ray_type*)((char*)v51 - 1); } v6 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v27, (int)v51, v47, &v46, a4, v4, a3, v6); } while ((signed int)v51 > v45 || v47 > v44); } } } if (v6 > 0) { v29 = (int*)(v5 + 9); do { v30 = *v29; ++v29; --v6; *(_BYTE*)(v30 + 12) = 0; } while (v6); } return v46; } //----- (0100B883) -------------------------------------------------------- TEdgeManager* __thiscall TEdgeManager::TEdgeManager(TEdgeManager* this, float a2, float a3, float a4, float a5) { double v5; // st7 TEdgeManager* v6; // esi double v7; // st6 DWORD* v8; // eax int v9; // edi v5 = a4 * 0.1; v6 = this; *((float*)this + 6) = a2; *(float*)this = v5; v7 = a5 * 0.06666667; *((float*)this + 7) = a3; *((DWORD*)this + 4) = 10; *((float*)this + 1) = v7; *((DWORD*)this + 5) = 15; *((float*)this + 2) = 1.0 / v5; *((float*)this + 3) = 1.0 / v7; v8 = component_create(0x964u); if (v8) { v9 = (int)(v8 + 1); *v8 = 150; create(v8 + 1, 0x10u, 150, (void* (__thiscall*)(void*))TEdgeBox::TEdgeBox); } else { v9 = 0; } *((DWORD*)v6 + 8) = v9; return v6; } //----- (01017441) -------------------------------------------------------- TEdgeManager* __thiscall TEdgeManager::destroy(TEdgeManager* this, char a2) { TEdgeManager* v2; // esi v2 = this; TEdgeManager::~TEdgeManager(this); if (a2 & 1) component_delete((void*)v2); return v2; }