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

204 lines
5.1 KiB
C++

//
// Created by neo on 2019-08-15.
//
#include "TBall.h"
//----- (0100B072) --------------------------------------------------------
bool __thiscall TBall::already_hit(TBall *this, struct TEdgeSegment *a2)
{
int v2; // esi
bool result; // al
v2 = *(_DWORD *)((char *)this + 134);
if ( !v2 )
return 0;
result = 1;
if ( *(struct TEdgeSegment **)((char *)this + 114) != a2 )
{
if ( v2 == 1 )
return 0;
if ( *(struct TEdgeSegment **)((char *)this + 118) == a2 )
return result;
if ( v2 == 2 )
return 0;
if ( *(struct TEdgeSegment **)((char *)this + 122) == a2 )
return result;
if ( v2 == 3 )
return 0;
if ( *(struct TEdgeSegment **)((char *)this + 126) == a2 )
return result;
if ( v2 == 4 )
return 0;
if ( *(struct TEdgeSegment **)((char *)this + 130) != a2 )
{
result = 0;
if ( v2 != 5 )
result = v2 == (_DWORD)a2;
}
}
return result;
}
//----- (0101590F) --------------------------------------------------------
void __thiscall TBall::not_again(TBall *this, struct TEdgeSegment *a2)
{
signed int v2; // edx
v2 = *(_DWORD *)((char *)this + 134);
if ( v2 < 5 )
{
*(_DWORD *)((char *)this + 4 * v2 + 114) = a2;
++*(_DWORD *)((char *)this + 134);
}
}
//----- (01015B9C) --------------------------------------------------------
int __thiscall TBall::Message(TBall *this, int a2, float a3)
{
TBall *v3; // esi
int v4; // eax
v3 = this;
if ( a2 == 1024 )
{
render_ball_set(*(_DWORD *)((char *)this + 26), 0, 0.0, 0, 0);
v4 = *(_DWORD *)((char *)v3 + 154);
*(float *)((char *)v3 + 42) = 0.0;
*(_DWORD *)((char *)v3 + 106) = 0;
*(float *)((char *)v3 + 46) = 0.0;
*((_BYTE *)v3 + 5) = 0;
*(_DWORD *)((char *)v3 + 150) = 0;
*(_DWORD *)((char *)v3 + 110) = 1;
*(float *)((char *)v3 + 58) = 0.0;
*(_DWORD *)((char *)v3 + 50) = v4;
*(float *)((char *)v3 + 54) = 0.0;
*(float *)((char *)v3 + 66) = 0.0;
*(float *)((char *)v3 + 70) = 0.0;
}
return 0;
}
//----- (01015C08) --------------------------------------------------------
void __thiscall TBall::Repaint(TBall *this)
{
TBall *v1; // esi
double v2; // st7
int v3; // edx
int v4; // edi
float *v5; // ebx
int v6; // ecx
float v7; // ST08_4
int v8; // [esp+14h] [ebp-8h]
int v9; // [esp+18h] [ebp-4h]
v1 = this;
if ( *(_DWORD *)((char *)this + 150) )
*(float *)((char *)this + 50) = *(float *)((char *)this + 142) * *(float *)((char *)this + 46)
+ *(float *)((char *)this + 138) * *(float *)((char *)this + 42)
+ *(float *)((char *)this + 154)
+ *(float *)((char *)this + 146);
proj_xform_to_2d((float *)((char *)this + 42), &v8);
v2 = proj_z_distance((char *)v1 + 42);
v3 = *(_DWORD *)(*(_DWORD *)((char *)v1 + 34) + 4);
v4 = 0;
if ( *(_DWORD *)(v3 + 4) - 1 > 0 )
{
v5 = (float *)((char *)v1 + 162);
do
{
if ( v2 >= *v5 )
break;
++v4;
++v5;
}
while ( v4 < *(_DWORD *)(v3 + 4) - 1 );
}
v6 = *(_DWORD *)(v3 + 4 * v4 + 8);
v8 += *(_DWORD *)(v6 + 12) / -2;
v9 += *(_DWORD *)(v6 + 16) / -2;
v7 = v2;
render_ball_set(*(_DWORD *)((char *)v1 + 26), v6, v7, v8, v9);
}
// 1008ED8: using guessed type double __stdcall proj_z_distance(_DWORD);
//----- (01019309) --------------------------------------------------------
TBall *__thiscall TBall::TBall(TBall *this, struct TPinballTable *a2)
{
TBall *v2; // esi
objlist_class *v3; // eax
objlist_class *v4; // ebx
objlist_class *v5; // eax
int v6; // ebx
objlist_class *v7; // ecx
int v8; // eax
double v9; // st7
int v10; // eax
int v11; // ecx
char v13; // [esp+Ch] [ebp-50h]
void *v14; // [esp+4Ch] [ebp-10h]
int v15; // [esp+54h] [ebp-8h]
float *v16; // [esp+58h] [ebp-4h]
struct TPinballTable *v17; // [esp+64h] [ebp+8h]
v2 = this;
TPinballComponent::TPinballComponent(this, a2, -1, 0);
*(float *)((char *)v2 + 78) = 0.0;
*(_DWORD *)v2 = &TBall::vftable;
*(float *)((char *)v2 + 70) = 0.0;
*((_BYTE *)v2 + 5) = 1;
*(_DWORD *)((char *)v2 + 106) = 0;
*(_DWORD *)((char *)v2 + 134) = 0;
*(float *)((char *)v2 + 74) = 0.0;
*(_DWORD *)((char *)v2 + 110) = 1;
*(_DWORD *)((char *)v2 + 150) = 0;
*(float *)((char *)v2 + 66) = 0.0;
*(float *)((char *)v2 + 58) = 0.0;
*(float *)((char *)v2 + 54) = 0.0;
*(float *)((char *)v2 + 86) = 1000000000.0;
*(float *)((char *)v2 + 82) = 1000000000.0;
*(float *)((char *)v2 + 42) = 0.0;
*(float *)((char *)v2 + 46) = 0.0;
v3 = (objlist_class *)operator new(8u);
v4 = v3;
if ( v3 )
{
objlist_class::objlist_class(v3, 0, 4);
v5 = v4;
}
else
{
v5 = 0;
}
*(_DWORD *)((char *)v2 + 34) = v5;
v6 = loader_query_handle("ball");
*(_DWORD *)((char *)v2 + 154) = *(_DWORD *)loader_query_float_attribute(v6, 0, 500);
v15 = loader_query_visual_states(v6);
v17 = 0;
if ( v15 > 0 )
{
v16 = (float *)((char *)v2 + 162);
do
{
loader_query_visual(v6, (signed int)v17, &v13);
v7 = *(objlist_class **)((char *)v2 + 34);
if ( v7 )
objlist_class::Add(v7, v14);
v8 = loader_query_float_attribute(v6, (signed int)v17, 501);
v9 = proj_z_distance(v8);
v17 = (struct TPinballTable *)((char *)v17 + 1);
*v16 = v9;
++v16;
}
while ( (signed int)v17 < v15 );
}
v10 = render_create_sprite(2, 0, 0, 0, 0, 0);
v11 = *(_DWORD *)((char *)v2 + 154);
*(_DWORD *)((char *)v2 + 26) = v10;
*(_DWORD *)(*(_DWORD *)((char *)v2 + 30) + 282) = v11;
*(_DWORD *)((char *)v2 + 50) = *(_DWORD *)((char *)v2 + 154);
return v2;
}
// 1002554: using guessed type void *TBall::vftable;
// 1008ED8: using guessed type double __stdcall proj_z_distance(_DWORD);