Files
3d-pinball-space-cadet/Classes/TRamp/TRamp.cpp
T

594 lines
13 KiB
C++

#include "TRamp.h"
//----- (01016AEC) --------------------------------------------------------
int __thiscall TRamp::get_scoring(TRamp *this, int a2)
{
int result; // eax
if ( a2 >= 4 )
result = 0;
else
result = *(_DWORD *)((char *)this + 4 * a2 + 78);
return result;
}
//----- (01016B0A) --------------------------------------------------------
void __thiscall TRamp::put_scoring(TRamp *this, int a2, int a3)
{
if ( a2 < 4 )
*(_DWORD *)((char *)this + 4 * a2 + 78) = a3;
}
//----- (01016C24) --------------------------------------------------------
void __thiscall TRamp::Collision(TRamp *this, struct TBall *a2, struct vector_type *a3, struct vector_type *a4, float a5, struct TEdgeSegment *a6)
{
TRamp *v6; // edi
double v7; // st7
int v8; // eax
_DWORD *v9; // eax
double v10; // st7
double v11; // st6
double v12; // st6
double v13; // st7
v6 = this;
TBall::not_again(a2, a6);
v7 = *(float *)((char *)a2 + 70) - a5;
*(_DWORD *)((char *)a2 + 42) = *(_DWORD *)a3;
v8 = *((_DWORD *)a3 + 1);
*(float *)((char *)a2 + 70) = v7;
*(_DWORD *)((char *)a2 + 46) = v8;
v9 = *(_DWORD **)((char *)a6 + 13);
if ( v9 )
{
*(_DWORD *)((char *)a2 + 150) = 1;
*(_DWORD *)((char *)a2 + 138) = *v9;
v10 = *(float *)((char *)a2 + 138) * *(float *)((char *)a2 + 42);
v11 = *(float *)((char *)a2 + 46);
*(_DWORD *)((char *)a2 + 142) = v9[1];
v12 = v11 * *(float *)((char *)a2 + 142);
*(_DWORD *)((char *)a2 + 146) = v9[2];
*(_DWORD *)((char *)a2 + 94) = v9[11];
*(_DWORD *)((char *)a2 + 98) = v9[12];
*(float *)((char *)a2 + 50) = v10 + v12 + *(float *)((char *)a2 + 154) + *(float *)((char *)a2 + 146);
*(_DWORD *)((char *)a2 + 110) = *(_DWORD *)((char *)v6 + 106);
return;
}
if ( a6 == *(struct TEdgeSegment **)((char *)v6 + 134) )
{
if ( !*(_DWORD *)(*(_DWORD *)((char *)v6 + 30) + 370) )
{
loader_play_sound(*(_DWORD *)((char *)v6 + 70));
control_handler(63, v6);
}
}
else
{
*(_DWORD *)((char *)a2 + 150) = 0;
if ( a6 == *(struct TEdgeSegment **)((char *)v6 + 126) )
{
*(_DWORD *)((char *)a2 + 110) = *(_DWORD *)((char *)v6 + 138);
if ( !*(_DWORD *)((char *)v6 + 110) )
return;
v13 = *(float *)((char *)a2 + 154) + *(float *)((char *)v6 + 146);
}
else
{
*(_DWORD *)((char *)a2 + 110) = *(_DWORD *)((char *)v6 + 142);
if ( !*(_DWORD *)((char *)v6 + 110) )
return;
v13 = *(float *)((char *)a2 + 154) + *(float *)((char *)v6 + 150);
}
*(float *)((char *)a2 + 50) = v13;
}
}
//----- (01016D2E) --------------------------------------------------------
int __thiscall TRamp::FieldEffect(TRamp *this, struct TBall *a2, struct vector_type *a3)
{
int result; // eax
*(float *)a3 = *(float *)((char *)a2 + 94)
- *(float *)((char *)a2 + 54) * *(float *)((char *)a2 + 66) * *(float *)((char *)this + 118);
result = 1;
*((float *)a3 + 1) = *(float *)((char *)a2 + 98)
- *(float *)((char *)a2 + 58) * *(float *)((char *)a2 + 66) * *(float *)((char *)this + 118);
return result;
}
//----- (01019BB8) --------------------------------------------------------
TRamp *__thiscall TRamp::TRamp(TRamp *this, struct TPinballTable *a2, void *a3)
{
void *v3; // ebx
TRamp *v4; // esi
_DWORD *v5; // eax
float *v6; // eax
float *v7; // edi
signed __int64 v8; // rax
void *v9; // ST0C_4
int v10; // edi
double v11; // st7
TLine *v12; // eax
TLine *v13; // edi
int v14; // eax
int v15; // edi
double v16; // st7
int v17; // ecx
TLine *v18; // eax
TLine *v19; // edi
int v20; // eax
int v21; // edi
double v22; // st7
int v23; // ecx
TLine *v24; // eax
TLine *v25; // edi
int v26; // eax
bool v27; // zf
bool v28; // sf
int v29; // ecx
int v30; // eax
int v31; // ebx
int v32; // edi
int v33; // ecx
double v34; // st7
double v35; // st7
double v36; // st7
double v37; // st7
float v38; // eax
double v39; // st7
double v40; // st7
float v41; // eax
double v42; // st7
double v43; // st7
double v44; // st7
double v45; // st7
float v46; // eax
double v47; // st7
double v48; // st7
double v49; // st7
double v50; // st7
float v51; // eax
double v52; // st7
void *v53; // eax
TLine *v54; // eax
void *v55; // ecx
void *v56; // eax
TLine *v57; // eax
void *v58; // ecx
void *v59; // eax
TLine *v60; // eax
TLine *v61; // edi
int v62; // ecx
float *v63; // eax
int v64; // ecx
long double v65; // st7
float v66; // ST0C_4
double v67; // st7
int v68; // ecx
float v69; // ST08_4
double v70; // st7
float v71; // ST04_4
char v73; // [esp+24h] [ebp-84h]
void *v74; // [esp+58h] [ebp-50h]
int v75; // [esp+6Ch] [ebp-3Ch]
int v76; // [esp+70h] [ebp-38h]
int v77; // [esp+78h] [ebp-30h]
int v78; // [esp+7Ch] [ebp-2Ch]
struct vector_type *v79; // [esp+80h] [ebp-28h]
struct vector_type *v80; // [esp+84h] [ebp-24h]
struct vector_type *v81; // [esp+88h] [ebp-20h]
int v82; // [esp+8Ch] [ebp-1Ch]
int v83; // [esp+90h] [ebp-18h]
struct vector_type *v84; // [esp+94h] [ebp-14h]
float v85; // [esp+98h] [ebp-10h]
float v86; // [esp+9Ch] [ebp-Ch]
float v87; // [esp+A0h] [ebp-8h]
float v88; // [esp+A4h] [ebp-4h]
v3 = a3;
v4 = this;
TCollisionComponent::TCollisionComponent(this, a2, (int)a3, 0);
*(_DWORD *)v4 = &TRamp::vftable;
*(_DWORD *)((char *)v4 + 6) = 0;
*((_BYTE *)v4 + 4) = 1;
loader_query_visual((int)v3, 0, &v73);
*(_DWORD *)((char *)v4 + 106) = v74;
v5 = (_DWORD *)loader_query_float_attribute((int)v3, 0, 701);
if ( v5 )
*(_DWORD *)((char *)v4 + 118) = *v5;
else
*(_DWORD *)((char *)v4 + 118) = 1045220557;
v6 = (float *)loader_query_float_attribute((int)v3, 0, 1305);
if ( v6 )
*(_DWORD *)((char *)v4 + 110) = (signed __int64)_floor(*v6);
else
*(_DWORD *)((char *)v4 + 110) = 0;
v7 = (float *)loader_query_float_attribute((int)a3, 0, 1300);
v8 = (signed __int64)_floor(*v7);
v9 = a3;
*(_DWORD *)((char *)v4 + 114) = v8;
*(_DWORD *)((char *)v4 + 122) = v7 + 1;
v10 = loader_query_float_attribute((int)v9, 0, 1303);
v11 = _floor(*(float *)v10);
v75 = *(_DWORD *)(v10 + 8);
v76 = *(_DWORD *)(v10 + 12);
v86 = *(float *)(v10 + 16);
v87 = *(float *)(v10 + 20);
v12 = (TLine *)operator new(0x55u);
if ( v12 )
v13 = TLine::TLine(
v12,
v4,
(char *)v4 + 5,
1 << (signed __int64)v11,
(struct vector_type *)&v86,
(struct vector_type *)&v75);
else
v13 = 0;
*(_DWORD *)((char *)v4 + 134) = v13;
objlist_class::Add((TRamp *)((char *)v4 + 42), (void *)v13);
if ( v13 )
{
v14 = *(_DWORD *)v13;
*(_DWORD *)((char *)v13 + 13) = 0;
(*(void (__thiscall **)(TLine *))(v14 + 8))(v13);
}
v15 = loader_query_float_attribute((int)a3, 0, 1301);
*(_DWORD *)((char *)v4 + 138) = (signed __int64)_floor(*(float *)v15);
v16 = _floor(*(float *)(v15 + 4));
v17 = *(_DWORD *)((char *)v4 + 138);
v78 = (signed __int64)v16;
v15 += 12;
*(_DWORD *)((char *)v4 + 138) = 1 << v17;
*(_DWORD *)((char *)v4 + 146) = *(_DWORD *)(v15 + 16);
find_closest_edge(
*(struct ramp_plane_type **)((char *)v4 + 122),
*(_DWORD *)((char *)v4 + 114),
(struct wall_point_type *)v15,
&a2,
&v80);
v18 = (TLine *)operator new(0x55u);
if ( v18 )
v19 = TLine::TLine(v18, v4, (char *)v4 + 5, *(_DWORD *)((char *)v4 + 106), v80, a2);
else
v19 = 0;
*(_DWORD *)((char *)v4 + 126) = v19;
objlist_class::Add((TRamp *)((char *)v4 + 42), (void *)v19);
if ( v19 )
{
v20 = *(_DWORD *)v19;
*(_DWORD *)((char *)v19 + 13) = 0;
(*(void (__thiscall **)(TLine *))(v20 + 8))(v19);
}
v21 = loader_query_float_attribute((int)a3, 0, 1302);
*(_DWORD *)((char *)v4 + 142) = (signed __int64)_floor(*(float *)v21);
v22 = _floor(*(float *)(v21 + 4));
v23 = *(_DWORD *)((char *)v4 + 142);
v77 = (signed __int64)v22;
v21 += 12;
*(_DWORD *)((char *)v4 + 142) = 1 << v23;
*(_DWORD *)((char *)v4 + 150) = *(_DWORD *)(v21 + 16);
find_closest_edge(
*(struct ramp_plane_type **)((char *)v4 + 122),
*(_DWORD *)((char *)v4 + 114),
(struct wall_point_type *)v21,
&v81,
&v84);
v24 = (TLine *)operator new(0x55u);
if ( v24 )
v25 = TLine::TLine(v24, v4, (char *)v4 + 5, *(_DWORD *)((char *)v4 + 106), v84, v81);
else
v25 = 0;
*(_DWORD *)((char *)v4 + 130) = v25;
objlist_class::Add((TRamp *)((char *)v4 + 42), (void *)v25);
if ( v25 )
{
v26 = *(_DWORD *)v25;
*(_DWORD *)((char *)v25 + 13) = 0;
(*(void (__thiscall **)(TLine *))(v26 + 8))(v25);
}
v27 = *(_DWORD *)((char *)v4 + 114) == 0;
v28 = *(_DWORD *)((char *)v4 + 114) < 0;
v86 = 1000000000.0;
v82 = 0;
v85 = 1000000000.0;
v88 = -1000000000.0;
v87 = -1000000000.0;
if ( !v28 && !v27 )
{
do
{
v29 = *(_DWORD *)((char *)v4 + 122);
v83 = 52 * v82;
v30 = v29 + 52 * v82;
v31 = v30 + 28;
v32 = v30 + 12;
v33 = v30 + 20;
v34 = *(float *)(v30 + 28);
v79 = (struct vector_type *)(v30 + 20);
if ( v34 >= *(float *)(v30 + 12) )
v35 = *(float *)v32;
else
v35 = *(float *)v31;
if ( v35 <= *(float *)v33 )
{
if ( *(float *)v31 >= (double)*(float *)v32 )
v36 = *(float *)v32;
else
v36 = *(float *)v31;
}
else
{
v36 = *(float *)v33;
}
if ( v85 >= v36 )
{
if ( *(float *)v31 >= (double)*(float *)v32 )
v37 = *(float *)v32;
else
v37 = *(float *)v31;
if ( v37 <= *(float *)v33 )
{
if ( *(float *)v31 >= (double)*(float *)v32 )
v38 = *(float *)v32;
else
v38 = *(float *)v31;
}
else
{
v38 = *(float *)v33;
}
v85 = v38;
}
if ( *(float *)(v31 + 4) >= (double)*(float *)(v32 + 4) )
v39 = *(float *)(v32 + 4);
else
v39 = *(float *)(v31 + 4);
if ( v39 <= *(float *)(v33 + 4) )
{
if ( *(float *)(v31 + 4) >= (double)*(float *)(v32 + 4) )
v40 = *(float *)(v32 + 4);
else
v40 = *(float *)(v31 + 4);
}
else
{
v40 = *(float *)(v33 + 4);
}
if ( v85 >= v40 )
{
if ( *(float *)(v31 + 4) >= (double)*(float *)(v32 + 4) )
v42 = *(float *)(v32 + 4);
else
v42 = *(float *)(v31 + 4);
if ( v42 <= *(float *)(v33 + 4) )
{
if ( *(float *)(v31 + 4) >= (double)*(float *)(v32 + 4) )
v41 = *(float *)(v32 + 4);
else
v41 = *(float *)(v31 + 4);
}
else
{
v41 = *(float *)(v33 + 4);
}
}
else
{
v41 = v85;
}
v43 = *(float *)v31;
v86 = v41;
if ( v43 <= *(float *)v32 )
v44 = *(float *)v32;
else
v44 = *(float *)v31;
if ( v44 >= *(float *)v33 )
{
if ( *(float *)v31 <= (double)*(float *)v32 )
v45 = *(float *)v32;
else
v45 = *(float *)v31;
}
else
{
v45 = *(float *)v33;
}
if ( v85 <= v45 )
{
if ( *(float *)v31 <= (double)*(float *)v32 )
v47 = *(float *)v32;
else
v47 = *(float *)v31;
if ( v47 >= *(float *)v33 )
{
if ( *(float *)v31 <= (double)*(float *)v32 )
v46 = *(float *)v32;
else
v46 = *(float *)v31;
}
else
{
v46 = *(float *)v33;
}
}
else
{
v46 = v85;
}
v48 = *(float *)(v31 + 4);
v87 = v46;
if ( v48 <= *(float *)(v32 + 4) )
v49 = *(float *)(v32 + 4);
else
v49 = *(float *)(v31 + 4);
if ( v49 >= *(float *)(v33 + 4) )
{
if ( *(float *)(v31 + 4) <= (double)*(float *)(v32 + 4) )
v50 = *(float *)(v32 + 4);
else
v50 = *(float *)(v31 + 4);
}
else
{
v50 = *(float *)(v33 + 4);
}
if ( v85 <= v50 )
{
if ( *(float *)(v31 + 4) <= (double)*(float *)(v32 + 4) )
v52 = *(float *)(v32 + 4);
else
v52 = *(float *)(v31 + 4);
if ( v52 >= *(float *)(v33 + 4) )
{
if ( *(float *)(v31 + 4) <= (double)*(float *)(v32 + 4) )
v51 = *(float *)(v32 + 4);
else
v51 = *(float *)(v31 + 4);
}
else
{
v51 = *(float *)(v33 + 4);
}
}
else
{
v51 = v85;
}
v88 = v51;
if ( (struct TPinballTable *)v32 != a2 || (struct vector_type *)v33 != v80 )
{
if ( (struct vector_type *)v32 != v81 || (struct vector_type *)v33 != v84 )
{
v53 = v74;
goto LABEL_105;
}
if ( v77 )
{
v53 = *(void **)((char *)v4 + 142);
goto LABEL_105;
}
}
else if ( v78 )
{
v53 = *(void **)((char *)v4 + 138);
LABEL_105:
a3 = v53;
goto LABEL_106;
}
a3 = 0;
LABEL_106:
if ( a3 )
{
v54 = (TLine *)operator new(0x55u);
a3 = (void *)(v54 ? TLine::TLine(v54, v4, (char *)v4 + 5, (unsigned int)a3, (struct vector_type *)v32, v79) : 0);
objlist_class::Add((TRamp *)((char *)v4 + 42), a3);
if ( a3 )
{
v55 = a3;
*(_DWORD *)((char *)a3 + 13) = v83 + *(_DWORD *)((char *)v4 + 122);
(*(void (**)(void))(*(_DWORD *)v55 + 8))();
}
}
if ( v79 != a2 || (struct vector_type *)v31 != v80 )
{
if ( v79 != v81 || (struct vector_type *)v31 != v84 )
{
v56 = v74;
goto LABEL_122;
}
if ( v77 )
{
v56 = *(void **)((char *)v4 + 142);
goto LABEL_122;
}
}
else if ( v78 )
{
v56 = *(void **)((char *)v4 + 138);
LABEL_122:
a3 = v56;
goto LABEL_123;
}
a3 = 0;
LABEL_123:
if ( a3 )
{
v57 = (TLine *)operator new(0x55u);
a3 = (void *)(v57 ? TLine::TLine(v57, v4, (char *)v4 + 5, (unsigned int)a3, v79, (struct vector_type *)v31) : 0);
objlist_class::Add((TRamp *)((char *)v4 + 42), a3);
if ( a3 )
{
v58 = a3;
*(_DWORD *)((char *)a3 + 13) = v83 + *(_DWORD *)((char *)v4 + 122);
(*(void (**)(void))(*(_DWORD *)v58 + 8))();
}
}
if ( (struct TPinballTable *)v31 != a2 || (struct vector_type *)v32 != v80 )
{
if ( (struct vector_type *)v31 != v81 || (struct vector_type *)v32 != v84 )
{
v59 = v74;
goto LABEL_139;
}
if ( v77 )
{
v59 = *(void **)((char *)v4 + 142);
goto LABEL_139;
}
}
else if ( v78 )
{
v59 = *(void **)((char *)v4 + 138);
LABEL_139:
a3 = v59;
goto LABEL_140;
}
a3 = 0;
LABEL_140:
if ( a3 )
{
v60 = (TLine *)operator new(0x55u);
if ( v60 )
v61 = TLine::TLine(
v60,
v4,
(char *)v4 + 5,
(unsigned int)a3,
(struct vector_type *)v31,
(struct vector_type *)v32);
else
v61 = 0;
objlist_class::Add((TRamp *)((char *)v4 + 42), (void *)v61);
if ( v61 )
{
*(_DWORD *)((char *)v61 + 13) = v83 + *(_DWORD *)((char *)v4 + 122);
(*(void (__thiscall **)(TLine *))(*(_DWORD *)v61 + 8))(v61);
}
}
v62 = v83;
*(float *)(v83 + *(_DWORD *)((char *)v4 + 122) + 44) = cos(*(float *)(v83 + *(_DWORD *)((char *)v4 + 122) + 40))
* sin(*(float *)(v83 + *(_DWORD *)((char *)v4 + 122) + 36))
* *(float *)(*(_DWORD *)((char *)v4 + 30) + 270);
v63 = (float *)(v62 + *(_DWORD *)((char *)v4 + 122));
v64 = *(_DWORD *)((char *)v4 + 30);
v65 = sin(v63[10]);
++v82;
v63[12] = v65 * sin(v63[9]) * *(float *)(v64 + 270);
}
while ( v82 < *(_DWORD *)((char *)v4 + 114) );
}
v66 = v87;
v67 = v88;
*(_DWORD *)((char *)v4 + 94) = (char *)v4 + 5;
v68 = (int)v74;
v69 = v67;
v70 = v85;
*(_DWORD *)((char *)v4 + 102) = v4;
v71 = v70;
*(_DWORD *)((char *)v4 + 98) = v68;
edges_insert_square(v86, v71, v69, v66, 0, (TRamp *)((char *)v4 + 94));
return v4;
}
// 10026CC: using guessed type void *TRamp::vftable;