861 lines
24 KiB
C++
861 lines
24 KiB
C++
#include "TFlipperEdge.h"
|
|
|
|
//----- (0101B0D4) --------------------------------------------------------
|
|
void __thiscall TFlipperEdge::place_in_grid(TFlipperEdge *this)
|
|
{
|
|
double v1; // st7
|
|
double v2; // st6
|
|
double v3; // st6
|
|
double v4; // st6
|
|
double v5; // st6
|
|
float v6; // ST18_4
|
|
double v7; // st6
|
|
double v8; // st6
|
|
double v9; // st6
|
|
double v10; // st6
|
|
float v11; // ST18_4
|
|
float v12; // ST08_4
|
|
float v13; // [esp+1Ch] [ebp-Ch]
|
|
float v14; // [esp+20h] [ebp-8h]
|
|
float v15; // [esp+24h] [ebp-4h]
|
|
|
|
v14 = *(float *)((char *)this + 33) - *(float *)((char *)this + 45);
|
|
v13 = *(float *)((char *)this + 37) - *(float *)((char *)this + 45);
|
|
v15 = *(float *)((char *)this + 45) + *(float *)((char *)this + 33);
|
|
v1 = *(float *)((char *)this + 37) + *(float *)((char *)this + 45);
|
|
v2 = *(float *)((char *)this + 153) - *(float *)((char *)this + 49);
|
|
if ( v2 < v14 )
|
|
v14 = v2;
|
|
v3 = *(float *)((char *)this + 157) - *(float *)((char *)this + 49);
|
|
if ( v3 < v13 )
|
|
v13 = v3;
|
|
v4 = *(float *)((char *)this + 49) + *(float *)((char *)this + 153);
|
|
if ( v4 > v15 )
|
|
v15 = v4;
|
|
v5 = *(float *)((char *)this + 157) + *(float *)((char *)this + 49);
|
|
if ( v5 > v1 )
|
|
{
|
|
v6 = v5;
|
|
v1 = v6;
|
|
}
|
|
v7 = *(float *)((char *)this + 165) - *(float *)((char *)this + 49);
|
|
if ( v7 < v14 )
|
|
v14 = v7;
|
|
v8 = *(float *)((char *)this + 169) - *(float *)((char *)this + 49);
|
|
if ( v8 < v13 )
|
|
v13 = v8;
|
|
v9 = *(float *)((char *)this + 165) + *(float *)((char *)this + 49);
|
|
if ( v9 > v15 )
|
|
v15 = v9;
|
|
v10 = *(float *)((char *)this + 49) + *(float *)((char *)this + 169);
|
|
if ( v10 > v1 )
|
|
{
|
|
v11 = v10;
|
|
v1 = v11;
|
|
}
|
|
v12 = v1;
|
|
edges_insert_square(v13, v14, v12, v15, this, 0);
|
|
}
|
|
|
|
//----- (0101B1F7) --------------------------------------------------------
|
|
double __thiscall TFlipperEdge::flipper_angle(TFlipperEdge *this, float a2)
|
|
{
|
|
int v2; // edx
|
|
double v4; // st7
|
|
double v5; // st7
|
|
|
|
v2 = *(_DWORD *)((char *)this + 21);
|
|
if ( !v2 )
|
|
return *(float *)((char *)this + 77);
|
|
v4 = (*(float *)((char *)this + 77) - *(float *)((char *)this + 73))
|
|
/ *(float *)((char *)this + 69)
|
|
* *(float *)((char *)this + 209);
|
|
if ( v4 < 0.0 )
|
|
v4 = -v4;
|
|
if ( v4 >= 0.0000001 )
|
|
v5 = (a2 - *(float *)((char *)this + 201)) / v4;
|
|
else
|
|
v5 = 1.0;
|
|
if ( v5 < 0.0 )
|
|
v5 = 0.0;
|
|
if ( v5 > 1.0 )
|
|
v5 = 1.0;
|
|
if ( v2 == 2 )
|
|
v5 = 1.0 - v5;
|
|
return v5 * *(float *)((char *)this + 69);
|
|
}
|
|
|
|
//----- (0101B281) --------------------------------------------------------
|
|
void __thiscall TFlipperEdge::build_edges_in_motion(TFlipperEdge *this)
|
|
{
|
|
TFlipperEdge *v1; // esi
|
|
|
|
v1 = this;
|
|
line_init((int)&lineA, A1, flt_1025718, A2, flt_10256B8);
|
|
line_init((int)&lineB, B1, flt_10256F4, B2, flt_1025700);
|
|
dword_102566C = *(_DWORD *)((char *)v1 + 53);
|
|
circlebase = *(_DWORD *)((char *)v1 + 33);
|
|
dword_1025664 = *(_DWORD *)((char *)v1 + 37);
|
|
dword_102567C = *(_DWORD *)((char *)v1 + 57);
|
|
circleT1 = T1;
|
|
dword_1025674 = dword_102570C;
|
|
}
|
|
// 1025664: using guessed type int dword_1025664;
|
|
// 102566C: using guessed type int dword_102566C;
|
|
// 1025674: using guessed type int dword_1025674;
|
|
// 102567C: using guessed type int dword_102567C;
|
|
// 10256B8: using guessed type float flt_10256B8;
|
|
// 10256F4: using guessed type float flt_10256F4;
|
|
// 1025700: using guessed type float flt_1025700;
|
|
// 102570C: using guessed type int dword_102570C;
|
|
// 1025718: using guessed type float flt_1025718;
|
|
|
|
//----- (0101B327) --------------------------------------------------------
|
|
void __thiscall TFlipperEdge::set_control_points(TFlipperEdge *this, float a2)
|
|
{
|
|
TFlipperEdge *v2; // ebx
|
|
float v3; // ST04_4
|
|
double v4; // st7
|
|
float v5; // ST08_4
|
|
|
|
v2 = this;
|
|
v3 = TFlipperEdge::flipper_angle(this, a2);
|
|
SinCos(v3, &flipper_sin_angle, &flipper_cos_angle);
|
|
v4 = flipper_cos_angle;
|
|
A1 = *(_DWORD *)((char *)v2 + 101);
|
|
*((_DWORD *)&A1 + 1) = *(_DWORD *)((char *)v2 + 105);
|
|
*((_DWORD *)&A1 + 2) = *(_DWORD *)((char *)v2 + 109);
|
|
A2 = *(_DWORD *)((char *)v2 + 113);
|
|
*((_DWORD *)&A2 + 1) = *(_DWORD *)((char *)v2 + 117);
|
|
*((_DWORD *)&A2 + 2) = *(_DWORD *)((char *)v2 + 121);
|
|
B1 = *(_DWORD *)((char *)v2 + 125);
|
|
*((_DWORD *)&B1 + 1) = *(_DWORD *)((char *)v2 + 129);
|
|
*((_DWORD *)&B1 + 2) = *(_DWORD *)((char *)v2 + 133);
|
|
B2 = *(_DWORD *)((char *)v2 + 137);
|
|
*((_DWORD *)&B2 + 1) = *(_DWORD *)((char *)v2 + 141);
|
|
*((_DWORD *)&B2 + 2) = *(_DWORD *)((char *)v2 + 145);
|
|
T1 = *(_DWORD *)((char *)v2 + 153);
|
|
*((_DWORD *)&T1 + 1) = *(_DWORD *)((char *)v2 + 157);
|
|
*((_DWORD *)&T1 + 2) = *(_DWORD *)((char *)v2 + 161);
|
|
v5 = v4;
|
|
RotatePt((struct vector_type *)&A1, flipper_sin_angle, v5, (TFlipperEdge *)((char *)v2 + 33));
|
|
RotatePt((struct vector_type *)&A2, flipper_sin_angle, flipper_cos_angle, (TFlipperEdge *)((char *)v2 + 33));
|
|
RotatePt((struct vector_type *)&T1, flipper_sin_angle, flipper_cos_angle, (TFlipperEdge *)((char *)v2 + 33));
|
|
RotatePt((struct vector_type *)&B1, flipper_sin_angle, flipper_cos_angle, (TFlipperEdge *)((char *)v2 + 33));
|
|
RotatePt((struct vector_type *)&B2, flipper_sin_angle, flipper_cos_angle, (TFlipperEdge *)((char *)v2 + 33));
|
|
}
|
|
|
|
//----- (0101B5A8) --------------------------------------------------------
|
|
int __thiscall TFlipperEdge::is_ball_inside(TFlipperEdge *this, float a2, float a3)
|
|
{
|
|
float v3; // ST08_4
|
|
float v4; // ST04_4
|
|
double v5; // st6
|
|
double v7; // st5
|
|
char v8; // c0
|
|
double v9; // st4
|
|
double v10; // st3
|
|
int v11; // eax
|
|
int v12; // eax
|
|
double v13; // st6
|
|
double v14; // st6
|
|
double v15; // st5
|
|
double v16; // st4
|
|
double v17; // st5
|
|
int v19; // eax
|
|
double v20; // st6
|
|
double v21; // st6
|
|
double v22; // st5
|
|
double v23; // st4
|
|
bool v24; // c0
|
|
double v25; // st4
|
|
|
|
v5 = flt_10256F4;
|
|
v7 = B1;
|
|
if ( !v8
|
|
&& (v7 - A2) * (a3 - flt_10256B8) - (v5 - flt_10256B8) * (a2 - A2) >= 0.0
|
|
&& (B2 - v7) * (a3 - v5) - (flt_1025700 - v5) * (a2 - v7) >= 0.0
|
|
&& (A1 - B2) * (a3 - flt_1025700) - (flt_1025718 - flt_1025700) * (a2 - B2) >= 0.0
|
|
|| (v9 = *(float *)((char *)this + 33) - a2,
|
|
v10 = *(float *)((char *)this + 37) - a3,
|
|
v10 * v10 + v9 * v9 <= *(float *)((char *)this + 53))
|
|
|| (*(float *)&dword_102570C - a3) * (*(float *)&dword_102570C - a3) + (T1 - a2) * (T1 - a2) < *(float *)((char *)this + 57) )
|
|
{
|
|
v11 = *(_DWORD *)((char *)this + 21);
|
|
if ( *(float *)((char *)this + 69) < 0.0 )
|
|
{
|
|
v19 = v11 - 1;
|
|
if ( v19 )
|
|
{
|
|
v20 = *(float *)((char *)this + 33);
|
|
if ( v19 == 1 )
|
|
{
|
|
v21 = (v20 - A2) * (a3 - flt_10256B8);
|
|
v22 = *(float *)((char *)this + 37) - flt_10256B8;
|
|
v23 = a2 - A2;
|
|
}
|
|
else
|
|
{
|
|
v21 = (v20 - T1) * (a3 - *(float *)&dword_102570C);
|
|
v22 = *(float *)((char *)this + 37) - *(float *)&dword_102570C;
|
|
v23 = a2 - T1;
|
|
}
|
|
v24 = v21 - v22 * v23 < 0.0;
|
|
}
|
|
else
|
|
{
|
|
v25 = (*(float *)((char *)this + 33) - v7) * (a3 - v5) - (*(float *)((char *)this + 37) - v5) * (a2 - v7);
|
|
}
|
|
if ( v24 )
|
|
return 5;
|
|
return 4;
|
|
}
|
|
v12 = v11 - 1;
|
|
v13 = *(float *)((char *)this + 33);
|
|
if ( v12 )
|
|
{
|
|
if ( v12 == 1 )
|
|
{
|
|
v3 = a3 - flt_1025718;
|
|
v14 = (v13 - A1) * v3;
|
|
v4 = a2 - A1;
|
|
v17 = (*(float *)((char *)this + 37) - flt_1025718) * v4;
|
|
LABEL_12:
|
|
if ( v14 - v17 >= 0.0 )
|
|
return 5;
|
|
return 4;
|
|
}
|
|
v14 = (v13 - T1) * (a3 - *(float *)&dword_102570C);
|
|
v15 = *(float *)((char *)this + 37) - *(float *)&dword_102570C;
|
|
v16 = a2 - T1;
|
|
}
|
|
else
|
|
{
|
|
v14 = (v13 - B2) * (a3 - flt_1025700);
|
|
v15 = *(float *)((char *)this + 37) - flt_1025700;
|
|
v16 = a2 - B2;
|
|
}
|
|
v17 = v15 * v16;
|
|
goto LABEL_12;
|
|
}
|
|
return 0;
|
|
}
|
|
// 10256B8: using guessed type float flt_10256B8;
|
|
// 10256F4: using guessed type float flt_10256F4;
|
|
// 1025700: using guessed type float flt_1025700;
|
|
// 102570C: using guessed type int dword_102570C;
|
|
// 1025718: using guessed type float flt_1025718;
|
|
|
|
//----- (0101B825) --------------------------------------------------------
|
|
double __thiscall TFlipperEdge::FindCollisionDistance(TFlipperEdge *this, struct ray_type *a2)
|
|
{
|
|
struct ray_type *v2; // esi
|
|
TFlipperEdge *v3; // ebx
|
|
_DWORD *v4; // eax
|
|
double result; // st7
|
|
int v6; // eax
|
|
int v7; // ecx
|
|
float *v8; // esi
|
|
double v9; // st7
|
|
float *v10; // eax
|
|
_DWORD *v11; // edi
|
|
char *v12; // esi
|
|
float v13; // eax
|
|
char *v14; // esi
|
|
_DWORD *v15; // edi
|
|
_DWORD *v16; // edi
|
|
_DWORD *v17; // esi
|
|
double v18; // st7
|
|
float v19; // eax
|
|
double v20; // st7
|
|
int v21; // eax
|
|
int v22; // esi
|
|
int v23; // eax
|
|
int v24; // edx
|
|
_DWORD *v25; // esi
|
|
double v26; // st7
|
|
_DWORD *v27; // esi
|
|
double v28; // st7
|
|
_DWORD *v29; // edi
|
|
_DWORD *v30; // esi
|
|
double v31; // st7
|
|
double v32; // st7
|
|
float v33; // eax
|
|
double v34; // st7
|
|
double v35; // st6
|
|
double v36; // st5
|
|
double v37; // st4
|
|
__int16 v38; // fps
|
|
double v39; // st6
|
|
char v40; // ah
|
|
bool v41; // c0
|
|
bool v42; // c3
|
|
signed int v43; // eax
|
|
char v44; // [esp+14h] [ebp-70h]
|
|
int v45; // [esp+18h] [ebp-6Ch]
|
|
int v46; // [esp+1Ch] [ebp-68h]
|
|
char v47; // [esp+20h] [ebp-64h]
|
|
int v48; // [esp+24h] [ebp-60h]
|
|
int v49; // [esp+28h] [ebp-5Ch]
|
|
float v50; // [esp+40h] [ebp-44h]
|
|
float v51; // [esp+44h] [ebp-40h]
|
|
int v52; // [esp+48h] [ebp-3Ch]
|
|
float v53; // [esp+4Ch] [ebp-38h]
|
|
float v54; // [esp+50h] [ebp-34h]
|
|
int v55; // [esp+54h] [ebp-30h]
|
|
float v56; // [esp+58h] [ebp-2Ch]
|
|
int v57; // [esp+5Ch] [ebp-28h]
|
|
float v58; // [esp+6Ch] [ebp-18h]
|
|
float v59; // [esp+70h] [ebp-14h]
|
|
float v60; // [esp+74h] [ebp-10h]
|
|
float v61; // [esp+78h] [ebp-Ch]
|
|
float v62; // [esp+7Ch] [ebp-8h]
|
|
float v63; // [esp+80h] [ebp-4h]
|
|
|
|
v2 = a2;
|
|
v3 = this;
|
|
if ( *((float *)a2 + 8) > (double)*(float *)((char *)this + 205) )
|
|
*(_DWORD *)((char *)this + 21) = 0;
|
|
v4 = (_DWORD *)((char *)this + 197);
|
|
if ( *(_DWORD *)((char *)this + 197) )
|
|
{
|
|
*v4 = 0;
|
|
return 1000000000.0;
|
|
}
|
|
if ( *(_DWORD *)((char *)this + 21) )
|
|
{
|
|
v18 = *(float *)((char *)this + 181) * *((float *)a2 + 6);
|
|
v63 = *(float *)a2;
|
|
v62 = *((float *)a2 + 1);
|
|
v19 = *((float *)a2 + 8);
|
|
v60 = v18;
|
|
v20 = *(float *)((char *)this + 181);
|
|
v61 = v19;
|
|
v59 = v20 * *((float *)a2 + 3);
|
|
v58 = *((float *)a2 + 4) * *(float *)((char *)this + 181);
|
|
if ( *((float *)a2 + 9) + *((float *)a2 + 8) <= v19 )
|
|
return 1000000000.0;
|
|
while ( 1 )
|
|
{
|
|
TFlipperEdge::set_control_points(v3, v61);
|
|
TFlipperEdge::build_edges_in_motion(v3);
|
|
v21 = TFlipperEdge::is_ball_inside(v3, v63, v62);
|
|
if ( v21 )
|
|
break;
|
|
v22 = (int)v2 + 12;
|
|
v53 = *(float *)v22;
|
|
v22 += 4;
|
|
v54 = *(float *)v22;
|
|
v55 = *(_DWORD *)(v22 + 4);
|
|
v23 = *((_DWORD *)a2 + 7);
|
|
v50 = *(float *)a2;
|
|
v51 = *((float *)a2 + 1);
|
|
v52 = *((_DWORD *)a2 + 2);
|
|
v57 = v23;
|
|
v56 = v60;
|
|
result = distance_to_flipper((struct ray_type *)&v50, (struct ray_type *)&v44);
|
|
if ( result < 1000000000.0 )
|
|
{
|
|
*(_DWORD *)((char *)v3 + 221) = *(_DWORD *)&v44;
|
|
*(_DWORD *)((char *)v3 + 225) = v45;
|
|
*(_DWORD *)((char *)v3 + 229) = v46;
|
|
v35 = *(float *)((char *)v3 + 221) - v53 * 0.00001;
|
|
*(float *)((char *)v3 + 221) = v35;
|
|
v36 = *(float *)((char *)v3 + 225) - v54 * 0.00001;
|
|
*(float *)((char *)v3 + 225) = v36;
|
|
v37 = (*(float *)((char *)v3 + 33) - T1) * (v36 - *(float *)&dword_102570C)
|
|
- (*(float *)((char *)v3 + 37) - *(float *)&dword_102570C) * (v35 - T1);
|
|
v39 = *(float *)((char *)v3 + 69);
|
|
v40 = HIBYTE(v38);
|
|
v41 = v39 < 0.0;
|
|
v42 = v39 == 0.0;
|
|
if ( v40 & 1 )
|
|
{
|
|
if ( v41 || v42 )
|
|
goto LABEL_49;
|
|
LABEL_47:
|
|
v43 = 1;
|
|
}
|
|
else
|
|
{
|
|
if ( v41 || v42 )
|
|
goto LABEL_47;
|
|
LABEL_49:
|
|
v43 = 0;
|
|
}
|
|
v15 = (_DWORD *)((char *)v3 + 89);
|
|
if ( *(_DWORD *)((char *)v3 + 21) == 2 )
|
|
{
|
|
v14 = (char *)&lineB;
|
|
*(_DWORD *)((char *)v3 + 81) = v43 == 0;
|
|
}
|
|
else
|
|
{
|
|
*(_DWORD *)((char *)v3 + 81) = v43;
|
|
v14 = (char *)&lineA;
|
|
}
|
|
goto LABEL_25;
|
|
}
|
|
v61 = v61 + *(float *)((char *)v3 + 181);
|
|
v63 = v63 + v59;
|
|
v62 = v62 + v58;
|
|
if ( *((float *)a2 + 9) + *((float *)a2 + 8) <= v61 )
|
|
return 1000000000.0;
|
|
v2 = a2;
|
|
}
|
|
v24 = *(_DWORD *)((char *)v3 + 21);
|
|
if ( v24 != 1 || v21 == 5 )
|
|
{
|
|
if ( v24 != 2 || v21 == 4 )
|
|
{
|
|
v31 = *(float *)((char *)v3 + 33) - v63;
|
|
*(_DWORD *)((char *)v3 + 81) = 0;
|
|
*(_DWORD *)((char *)v3 + 85) = 1;
|
|
v53 = v31;
|
|
v54 = *(float *)((char *)v3 + 37) - v62;
|
|
normalize_2d(&v53);
|
|
v50 = v63 - v53 * 5.0;
|
|
v51 = v62 - v54 * 5.0;
|
|
v56 = *((float *)v2 + 6) + 10.0;
|
|
if ( distance_to_flipper((struct ray_type *)&v50, (struct ray_type *)&v44) < 1000000000.0 )
|
|
goto LABEL_20;
|
|
v32 = -v53;
|
|
*(float *)((char *)v3 + 221) = v63;
|
|
v33 = v62;
|
|
*(float *)((char *)v3 + 185) = v32;
|
|
v34 = v54;
|
|
*(float *)((char *)v3 + 225) = v33;
|
|
*(float *)((char *)v3 + 189) = -v34;
|
|
return 0.0;
|
|
}
|
|
v25 = &lineB;
|
|
v53 = -lineB;
|
|
v26 = flt_10256C4;
|
|
}
|
|
else
|
|
{
|
|
v25 = &lineA;
|
|
v53 = -lineA;
|
|
v26 = flt_1025684;
|
|
}
|
|
v54 = -v26;
|
|
*(_DWORD *)((char *)v3 + 89) = *v25;
|
|
v27 = v25 + 1;
|
|
*(_DWORD *)((char *)v3 + 93) = *v27;
|
|
*(_DWORD *)((char *)v3 + 97) = v27[1];
|
|
*(_DWORD *)((char *)v3 + 85) = 0;
|
|
*(_DWORD *)((char *)v3 + 81) = 1;
|
|
v57 = 990057071;
|
|
v50 = *(float *)a2 - v53 * 5.0;
|
|
v51 = *((float *)a2 + 1) - v54 * 5.0;
|
|
v56 = *((float *)a2 + 6) + 10.0;
|
|
v28 = distance_to_flipper((struct ray_type *)&v50, (struct ray_type *)&v44);
|
|
*(_DWORD *)((char *)v3 + 185) = *(_DWORD *)&v47;
|
|
*(_DWORD *)((char *)v3 + 189) = v48;
|
|
*(_DWORD *)((char *)v3 + 193) = v49;
|
|
if ( v28 >= 1000000000.0 )
|
|
return 1000000000.0;
|
|
v10 = (float *)((char *)v3 + 221);
|
|
v12 = &v44;
|
|
v11 = (_DWORD *)((char *)v3 + 221);
|
|
LABEL_41:
|
|
*v11 = *(_DWORD *)v12;
|
|
v30 = v12 + 4;
|
|
v29 = v11 + 1;
|
|
*v29 = *v30;
|
|
v29[1] = v30[1];
|
|
*v10 = *v10 - v53 * 0.00001;
|
|
*(float *)((char *)v3 + 225) = *(float *)((char *)v3 + 225) - v54 * 0.00001;
|
|
return 0.0;
|
|
}
|
|
*v4 = 0;
|
|
*(_DWORD *)((char *)this + 81) = 0;
|
|
*(_DWORD *)((char *)this + 85) = 0;
|
|
TFlipperEdge::set_control_points(this, *((float *)a2 + 8));
|
|
TFlipperEdge::build_edges_in_motion(v3);
|
|
*(float *)&v6 = COERCE_FLOAT(TFlipperEdge::is_ball_inside(v3, *(float *)a2, *((float *)a2 + 1)));
|
|
v7 = *((_DWORD *)a2 + 7);
|
|
v61 = *(float *)&v6;
|
|
v57 = v7;
|
|
if ( *(float *)&v6 != 0.0 )
|
|
{
|
|
if ( Distance_Squared(
|
|
*(float *)a2,
|
|
*((float *)a2 + 1),
|
|
*((_DWORD *)a2 + 2),
|
|
*(float *)((char *)v3 + 33),
|
|
*(float *)((char *)v3 + 37),
|
|
*(_DWORD *)((char *)v3 + 41)) >= *(float *)((char *)v3 + 61) )
|
|
{
|
|
if ( Distance_Squared(
|
|
*(float *)a2,
|
|
*((float *)a2 + 1),
|
|
*((_DWORD *)a2 + 2),
|
|
T1,
|
|
*((float *)&T1 + 1),
|
|
*((_DWORD *)&T1 + 2)) >= *(float *)((char *)v3 + 65) )
|
|
{
|
|
if ( LODWORD(v61) == 4 )
|
|
{
|
|
v53 = -lineA;
|
|
v9 = flt_1025684;
|
|
}
|
|
else
|
|
{
|
|
v53 = -lineB;
|
|
v9 = flt_10256C4;
|
|
}
|
|
v54 = -v9;
|
|
}
|
|
else
|
|
{
|
|
v53 = T1 - *(float *)a2;
|
|
v54 = *(float *)&dword_102570C - *((float *)a2 + 1);
|
|
normalize_2d(&v53);
|
|
}
|
|
v8 = (float *)a2;
|
|
}
|
|
else
|
|
{
|
|
v8 = (float *)a2;
|
|
v53 = *(float *)((char *)v3 + 33) - *(float *)a2;
|
|
v54 = *(float *)((char *)v3 + 37) - *((float *)a2 + 1);
|
|
normalize_2d(&v53);
|
|
}
|
|
v50 = *v8 - v53 * 5.0;
|
|
v51 = v8[1] - v54 * 5.0;
|
|
v56 = v8[6] + 10.0;
|
|
if ( distance_to_flipper((struct ray_type *)&v50, (struct ray_type *)&v44) >= 1000000000.0 )
|
|
{
|
|
v53 = *(float *)((char *)v3 + 33) - *v8;
|
|
v54 = *(float *)((char *)v3 + 37) - v8[1];
|
|
normalize_2d(&v53);
|
|
v50 = *v8 - v53 * 5.0;
|
|
v51 = v8[1] - v54 * 5.0;
|
|
if ( distance_to_flipper((struct ray_type *)&v50, (struct ray_type *)&v44) >= 1000000000.0 )
|
|
return 1000000000.0;
|
|
}
|
|
LABEL_20:
|
|
v10 = (float *)((char *)v3 + 221);
|
|
*(_DWORD *)((char *)v3 + 221) = *(_DWORD *)&v44;
|
|
*(_DWORD *)((char *)v3 + 225) = v45;
|
|
*(_DWORD *)((char *)v3 + 229) = v46;
|
|
v11 = (_DWORD *)((char *)v3 + 185);
|
|
v12 = &v47;
|
|
goto LABEL_41;
|
|
}
|
|
v53 = *((float *)a2 + 3);
|
|
v54 = *((float *)a2 + 4);
|
|
v55 = *((_DWORD *)a2 + 5);
|
|
v13 = *((float *)a2 + 6);
|
|
v50 = *(float *)a2;
|
|
v51 = *((float *)a2 + 1);
|
|
v52 = *((_DWORD *)a2 + 2);
|
|
v56 = v13;
|
|
result = distance_to_flipper((struct ray_type *)&v50, (struct ray_type *)&v44);
|
|
v14 = &v44;
|
|
if ( result == 0.0 )
|
|
{
|
|
*(_DWORD *)((char *)v3 + 221) = *(_DWORD *)&v44;
|
|
*(_DWORD *)((char *)v3 + 225) = v45;
|
|
*(_DWORD *)((char *)v3 + 229) = v46;
|
|
*(float *)((char *)v3 + 221) = *(float *)((char *)v3 + 221) - v53 * 0.00001;
|
|
*(float *)((char *)v3 + 225) = *(float *)((char *)v3 + 225) - v54 * 0.00001;
|
|
}
|
|
else
|
|
{
|
|
v15 = (_DWORD *)((char *)v3 + 221);
|
|
LABEL_25:
|
|
*v15 = *(_DWORD *)v14;
|
|
v17 = v14 + 4;
|
|
v16 = v15 + 1;
|
|
*v16 = *v17;
|
|
v16[1] = v17[1];
|
|
}
|
|
*(_DWORD *)((char *)v3 + 185) = *(_DWORD *)&v47;
|
|
*(_DWORD *)((char *)v3 + 189) = v48;
|
|
*(_DWORD *)((char *)v3 + 193) = v49;
|
|
return result;
|
|
}
|
|
// 1025684: using guessed type float flt_1025684;
|
|
// 10256C4: using guessed type float flt_10256C4;
|
|
// 102570C: using guessed type int dword_102570C;
|
|
|
|
//----- (0101BE06) --------------------------------------------------------
|
|
void __thiscall TFlipperEdge::EdgeCollision(TFlipperEdge *this, struct TBall *a2, float a3)
|
|
{
|
|
TFlipperEdge *v3; // esi
|
|
int v4; // eax
|
|
double v5; // st7
|
|
double v6; // st6
|
|
double v7; // st7
|
|
double v8; // st7
|
|
double v9; // st6
|
|
double v10; // st7
|
|
double v11; // st7
|
|
struct vector_type *v12; // ecx
|
|
double v13; // st7
|
|
double v14; // st6
|
|
double v15; // st7
|
|
long double v16; // st7
|
|
float v17; // ST0C_4
|
|
float v18; // ST18_4
|
|
float v19; // ST14_4
|
|
float v20; // [esp+14h] [ebp-4h]
|
|
|
|
v3 = this;
|
|
v4 = *(_DWORD *)((char *)this + 21);
|
|
*(_DWORD *)((char *)this + 197) = 1;
|
|
if ( !v4 )
|
|
goto LABEL_4;
|
|
if ( *(_DWORD *)((char *)this + 81) )
|
|
{
|
|
v5 = *(float *)((char *)this + 221) - *(float *)((char *)this + 33);
|
|
v6 = *(float *)((char *)this + 225) - *(float *)((char *)this + 37);
|
|
v7 = v6 * v6 + v5 * v5;
|
|
if ( *(float *)&dword_102566C * 1.01 < v7 )
|
|
{
|
|
v20 = sqrt(v7 / *(float *)((char *)this + 177))
|
|
* (fabs(*(float *)((char *)this + 69))
|
|
/ *(float *)((char *)this + 209));
|
|
v10 = DotProduct((TFlipperEdge *)((char *)this + 89), (TFlipperEdge *)((char *)this + 185));
|
|
if ( v10 >= 0.0 )
|
|
v11 = v10 * v20;
|
|
else
|
|
v11 = 0.0;
|
|
v8 = v11 * *(float *)((char *)v3 + 149);
|
|
goto LABEL_5;
|
|
}
|
|
LABEL_4:
|
|
v8 = 0.0;
|
|
LABEL_5:
|
|
if ( v8 <= 0.0 )
|
|
v9 = 1000000000.0;
|
|
else
|
|
v9 = -1.0;
|
|
v18 = v8;
|
|
v19 = v9;
|
|
basic_collision(
|
|
a2,
|
|
(TFlipperEdge *)((char *)v3 + 221),
|
|
(TFlipperEdge *)((char *)v3 + 185),
|
|
*(float *)((char *)v3 + 25),
|
|
*(float *)((char *)v3 + 29),
|
|
v19,
|
|
v18);
|
|
return;
|
|
}
|
|
if ( !v4 || !*(_DWORD *)((char *)this + 85) )
|
|
goto LABEL_4;
|
|
v12 = (TFlipperEdge *)((char *)this + 221);
|
|
v13 = *(float *)((char *)v3 + 221) - *(float *)((char *)v3 + 33);
|
|
v14 = *(float *)((char *)v3 + 225) - *(float *)((char *)v3 + 37);
|
|
v15 = v14 * v14 + v13 * v13;
|
|
if ( *(float *)&dword_102566C * 1.01 < v15 )
|
|
v16 = (1.0 - sqrt(v15 / *(float *)((char *)v3 + 177))) * *(float *)((char *)v3 + 25);
|
|
else
|
|
v16 = *(float *)((char *)v3 + 25);
|
|
v17 = v16;
|
|
basic_collision(a2, v12, (TFlipperEdge *)((char *)v3 + 185), v17, *(float *)((char *)v3 + 29), 1000000000.0, 0.0);
|
|
}
|
|
// 102566C: using guessed type int dword_102566C;
|
|
|
|
//----- (0101BF98) --------------------------------------------------------
|
|
void __thiscall TFlipperEdge::SetMotion(TFlipperEdge *this, int a2, float a3)
|
|
{
|
|
double v3; // st7
|
|
int v4; // eax
|
|
double v5; // st7
|
|
int v6; // eax
|
|
double v7; // st7
|
|
|
|
switch ( a2 )
|
|
{
|
|
case 1:
|
|
v5 = TFlipperEdge::flipper_angle(this, a3);
|
|
v6 = *(_DWORD *)((char *)this + 69);
|
|
*(float *)((char *)this + 73) = v5;
|
|
*(_DWORD *)((char *)this + 77) = v6;
|
|
v4 = *(_DWORD *)((char *)this + 213);
|
|
goto LABEL_7;
|
|
case 2:
|
|
v3 = TFlipperEdge::flipper_angle(this, a3);
|
|
v4 = *(_DWORD *)((char *)this + 217);
|
|
*(float *)((char *)this + 73) = v3;
|
|
*(float *)((char *)this + 77) = 0.0;
|
|
LABEL_7:
|
|
*(_DWORD *)((char *)this + 209) = v4;
|
|
break;
|
|
case 1024:
|
|
*(_DWORD *)((char *)this + 21) = 0;
|
|
*(float *)((char *)this + 77) = 0.0;
|
|
return;
|
|
}
|
|
if ( !*(_DWORD *)((char *)this + 21) )
|
|
*(float *)((char *)this + 201) = a3;
|
|
v7 = *(float *)((char *)this + 209);
|
|
*(_DWORD *)((char *)this + 21) = a2;
|
|
*(float *)((char *)this + 205) = v7 + *(float *)((char *)this + 201);
|
|
}
|
|
|
|
//----- (0101C026) --------------------------------------------------------
|
|
void __thiscall TFlipperEdge::port_draw(TFlipperEdge *this)
|
|
{
|
|
TFlipperEdge *v1; // esi
|
|
|
|
v1 = this;
|
|
TFlipperEdge::set_control_points(this, *(float *)((char *)this + 201));
|
|
TFlipperEdge::build_edges_in_motion(v1);
|
|
}
|
|
|
|
//----- (0101C2BA) --------------------------------------------------------
|
|
TFlipperEdge *__thiscall TFlipperEdge::TFlipperEdge(TFlipperEdge *this, struct TCollisionComponent *a2, char *a3, unsigned int a4, struct TPinballTable *a5, struct vector_type *a6, struct vector_type *a7, struct vector_type *a8, float a9, float a10, float a11, float a12, float a13)
|
|
{
|
|
TFlipperEdge *v13; // ebx
|
|
double v14; // st7
|
|
double v15; // st7
|
|
float v16; // eax
|
|
double v17; // st7
|
|
float v18; // eax
|
|
double v19; // st7
|
|
double v20; // st7
|
|
double v21; // st7
|
|
double v22; // st7
|
|
double v23; // st6
|
|
double v24; // st7
|
|
double v25; // st6
|
|
struct vector_type *v26; // ecx
|
|
double v27; // st7
|
|
double v28; // st6
|
|
long double v29; // st5
|
|
double v30; // st7
|
|
long double v31; // st7
|
|
TFlipperEdge *result; // eax
|
|
float v33; // [esp+Ch] [ebp-54h]
|
|
float v34; // [esp+10h] [ebp-50h]
|
|
float v35; // [esp+14h] [ebp-4Ch]
|
|
float v36; // [esp+18h] [ebp-48h]
|
|
float v37; // [esp+1Ch] [ebp-44h]
|
|
float v38; // [esp+20h] [ebp-40h]
|
|
float v39; // [esp+24h] [ebp-3Ch]
|
|
double v40; // [esp+28h] [ebp-38h]
|
|
float v41; // [esp+30h] [ebp-30h]
|
|
float v42; // [esp+34h] [ebp-2Ch]
|
|
float v43; // [esp+38h] [ebp-28h]
|
|
float v44; // [esp+3Ch] [ebp-24h]
|
|
float v45; // [esp+40h] [ebp-20h]
|
|
float v46; // [esp+48h] [ebp-18h]
|
|
float v47; // [esp+4Ch] [ebp-14h]
|
|
float v48; // [esp+50h] [ebp-10h]
|
|
float v49; // [esp+54h] [ebp-Ch]
|
|
double v50; // [esp+58h] [ebp-8h]
|
|
float v51; // [esp+6Ch] [ebp+Ch]
|
|
float v52; // [esp+70h] [ebp+10h]
|
|
float v53; // [esp+70h] [ebp+10h]
|
|
float v54; // [esp+70h] [ebp+10h]
|
|
|
|
v13 = this;
|
|
TEdgeSegment::TEdgeSegment(this, a2, a3, a4);
|
|
*(float *)((char *)v13 + 25) = a12;
|
|
*(float *)((char *)v13 + 29) = a13;
|
|
*(_DWORD *)v13 = &TFlipperEdge::vftable;
|
|
v46 = *(float *)a6;
|
|
v47 = *((float *)a6 + 1);
|
|
v48 = *((float *)a6 + 2);
|
|
v49 = *(float *)a7;
|
|
v50 = *(double *)((char *)a7 + 4);
|
|
v14 = *((float *)&v50 + 1);
|
|
v36 = *(float *)a8;
|
|
v37 = *((float *)a8 + 1);
|
|
v38 = *((float *)a8 + 2);
|
|
*(float *)((char *)v13 + 213) = a9;
|
|
*(float *)((char *)v13 + 217) = a10;
|
|
*(float *)((char *)v13 + 149) = a11;
|
|
*(float *)((char *)v13 + 49) = v14 + *(float *)((char *)a5 + 282);
|
|
v15 = v48 + *(float *)((char *)a5 + 282);
|
|
v16 = v46;
|
|
*(float *)((char *)v13 + 153) = v49;
|
|
v52 = v15;
|
|
*(_DWORD *)((char *)v13 + 157) = LODWORD(v50);
|
|
*(float *)((char *)v13 + 45) = v15;
|
|
v17 = *(float *)((char *)v13 + 49) * 1.01;
|
|
*(_DWORD *)((char *)v13 + 161) = HIDWORD(v50);
|
|
*(float *)((char *)v13 + 65) = v17 * v17;
|
|
*(float *)((char *)v13 + 165) = v36;
|
|
*(float *)((char *)v13 + 169) = v37;
|
|
*(float *)((char *)v13 + 61) = v52 * 1.01 * (v52 * 1.01);
|
|
*(float *)((char *)v13 + 33) = v16;
|
|
v18 = v47;
|
|
v19 = *(float *)((char *)v13 + 49);
|
|
*(float *)((char *)v13 + 173) = v38;
|
|
*(float *)((char *)v13 + 37) = v18;
|
|
*(float *)((char *)v13 + 57) = v19 * v19;
|
|
*(float *)((char *)v13 + 53) = *(float *)((char *)v13 + 45) * *(float *)((char *)v13 + 45);
|
|
v20 = v49 - v46;
|
|
v53 = v20;
|
|
v39 = v20;
|
|
v21 = *(float *)&v50 - v47;
|
|
v51 = v21;
|
|
*(float *)&v40 = v21;
|
|
normalize_2d(&v39);
|
|
v41 = v36 - v46;
|
|
v42 = v37 - v47;
|
|
normalize_2d(&v41);
|
|
v43 = 0.0;
|
|
*((float *)&v40 + 1) = 0.0;
|
|
*(float *)((char *)v13 + 69) = acos(DotProduct((const struct vector_type *)&v39, (const struct vector_type *)&v41));
|
|
cross(&v39, &v41, &v33);
|
|
if ( v35 < 0.0 )
|
|
*(float *)((char *)v13 + 69) = -*(float *)((char *)v13 + 69);
|
|
*(_DWORD *)((char *)v13 + 21) = 0;
|
|
*(float *)((char *)v13 + 77) = 0.0;
|
|
v44 = v53;
|
|
v45 = v51;
|
|
normalize_2d(&v44);
|
|
v22 = v44;
|
|
v23 = -v45;
|
|
*(float *)((char *)v13 + 113) = v23 * *(float *)((char *)v13 + 45) + v46;
|
|
*(float *)((char *)v13 + 117) = v22 * *(float *)((char *)v13 + 45) + v47;
|
|
*(float *)((char *)v13 + 101) = v23 * *(float *)((char *)v13 + 49) + v49;
|
|
*(float *)((char *)v13 + 105) = v22 * *(float *)((char *)v13 + 49) + *(float *)&v50;
|
|
v54 = v23;
|
|
v24 = -v22;
|
|
v25 = -v54;
|
|
v44 = v25;
|
|
v45 = v24;
|
|
*(float *)((char *)v13 + 125) = v25 * *(float *)((char *)v13 + 45) + v46;
|
|
*(float *)((char *)v13 + 129) = v24 * *(float *)((char *)v13 + 45) + v47;
|
|
*(float *)((char *)v13 + 137) = v25 * *(float *)((char *)v13 + 49) + v49;
|
|
*(float *)((char *)v13 + 141) = v24 * *(float *)((char *)v13 + 49) + *(float *)&v50;
|
|
if ( *(float *)((char *)v13 + 69) < 0.0 )
|
|
{
|
|
vswap((TFlipperEdge *)((char *)v13 + 101), (TFlipperEdge *)((char *)v13 + 125));
|
|
vswap(v26, (TFlipperEdge *)((char *)v13 + 137));
|
|
}
|
|
v27 = v49 - *(float *)((char *)v13 + 33);
|
|
v28 = *(float *)&v50 - *(float *)((char *)v13 + 37);
|
|
v39 = v49;
|
|
v40 = v50;
|
|
v33 = v36;
|
|
v34 = v37;
|
|
v35 = v38;
|
|
v29 = sqrt(v28 * v28 + v27 * v27) + *(float *)((char *)a5 + 282) + *((float *)&v50 + 1);
|
|
*(float *)((char *)v13 + 177) = v29 * v29;
|
|
if ( *(float *)((char *)v13 + 213) >= (double)*(float *)((char *)v13 + 217) )
|
|
v30 = *(float *)((char *)v13 + 217);
|
|
else
|
|
v30 = *(float *)((char *)v13 + 213);
|
|
v50 = v30;
|
|
v31 = Distance((struct vector_type *)&v39, (struct vector_type *)&v33);
|
|
*(float *)((char *)v13 + 181) = v50 / (v31 / *(float *)((char *)v13 + 49) + v31 / *(float *)((char *)v13 + 49));
|
|
TFlipperEdge::place_in_grid(v13);
|
|
*(_DWORD *)((char *)v13 + 197) = 0;
|
|
*(float *)((char *)v13 + 201) = 0.0;
|
|
*(_DWORD *)((char *)v13 + 81) = 0;
|
|
*(float *)((char *)v13 + 205) = 0.0;
|
|
result = v13;
|
|
*(float *)((char *)v13 + 209) = 0.0;
|
|
return result;
|
|
}
|
|
// 1002854: using guessed type void *TFlipperEdge::vftable;
|