533 lines
12 KiB
C++
533 lines
12 KiB
C++
//
|
|
// 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@<st0 > , 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;
|
|
}
|