241 lines
6.8 KiB
C++
241 lines
6.8 KiB
C++
#include "../../pinball.h"
|
|
|
|
//----- (01016745) --------------------------------------------------------
|
|
void __thiscall TKickout::Collision(TKickout *this, struct TBall *a2, struct vector_type *a3, struct vector_type *a4, float a5, struct TEdgeSegment *a6)
|
|
{
|
|
struct TPinballComponent *v6; // esi
|
|
|
|
v6 = this;
|
|
if ( !*(_DWORD *)((char *)this + 78) )
|
|
{
|
|
*(_DWORD *)((char *)this + 102) = a2;
|
|
*(_DWORD *)((char *)this + 66) = 1315859240;
|
|
*(_DWORD *)((char *)this + 78) = 1;
|
|
*(_DWORD *)((char *)a2 + 106) = this;
|
|
*(_DWORD *)((char *)a2 + 42) = *(_DWORD *)((char *)this + 110);
|
|
*(_DWORD *)((char *)a2 + 46) = *(_DWORD *)((char *)this + 114);
|
|
*(_DWORD *)((char *)this + 126) = *(_DWORD *)((char *)a2 + 50);
|
|
*(_DWORD *)((char *)a2 + 50) = *(_DWORD *)((char *)this + 98);
|
|
if ( *(_DWORD *)(*(_DWORD *)((char *)this + 30) + 370) )
|
|
{
|
|
(**(void (__thiscall ***)(TKickout *, signed int, _DWORD))this)(this, 55, 0.1);
|
|
}
|
|
else
|
|
{
|
|
loader_play_sound(*(_DWORD *)((char *)this + 70));
|
|
control_handler(63, v6);
|
|
}
|
|
}
|
|
}
|
|
|
|
//----- (010167BE) --------------------------------------------------------
|
|
void __stdcall TKickout::ResetTimerExpired(int a1, void *a2)
|
|
{
|
|
if ( !*(_DWORD *)((char *)a2 + 82) )
|
|
*((_BYTE *)a2 + 5) = 1;
|
|
*(_DWORD *)((char *)a2 + 86) = 0;
|
|
}
|
|
|
|
//----- (010167DD) --------------------------------------------------------
|
|
void __stdcall TKickout::TimerExpired(int a1, void *a2)
|
|
{
|
|
double v2; // st7
|
|
float v3; // ST08_4
|
|
int v4; // eax
|
|
int v5; // ecx
|
|
int v6; // ST10_4
|
|
|
|
if ( *(_DWORD *)((char *)a2 + 78) )
|
|
{
|
|
v2 = *(float *)((char *)a2 + 94);
|
|
*(_DWORD *)((char *)a2 + 78) = 0;
|
|
v3 = v2;
|
|
*(_DWORD *)((char *)a2 + 86) = timer_set(v3, (int)a2, (int)TKickout::ResetTimerExpired);
|
|
v4 = *(_DWORD *)((char *)a2 + 102);
|
|
if ( v4 )
|
|
{
|
|
v5 = *(_DWORD *)((char *)a2 + 126);
|
|
*(_DWORD *)((char *)a2 + 102) = 0;
|
|
*(_DWORD *)(v4 + 50) = v5;
|
|
throw_ball(
|
|
(struct TBall *)v4,
|
|
(struct vector_type *)((char *)a2 + 130),
|
|
*(float *)((char *)a2 + 142),
|
|
*(float *)((char *)a2 + 146),
|
|
*(float *)((char *)a2 + 150));
|
|
v6 = *(_DWORD *)((char *)a2 + 74);
|
|
*((_BYTE *)a2 + 5) = 0;
|
|
loader_play_sound(v6);
|
|
}
|
|
}
|
|
}
|
|
|
|
//----- (0101685B) --------------------------------------------------------
|
|
int __thiscall TKickout::FieldEffect(TKickout *this, struct TBall *a2, struct vector_type *a3)
|
|
{
|
|
TKickout *v3; // edi
|
|
double v5; // st7
|
|
double v6; // st6
|
|
float v7; // [esp+4h] [ebp-Ch]
|
|
float v8; // [esp+8h] [ebp-8h]
|
|
|
|
v3 = this;
|
|
if ( *(_DWORD *)((char *)this + 78) )
|
|
return 0;
|
|
v5 = *(float *)((char *)this + 110) - *(float *)((char *)a2 + 42);
|
|
v7 = v5;
|
|
v6 = *(float *)((char *)this + 114) - *(float *)((char *)a2 + 46);
|
|
v8 = v6;
|
|
if ( v6 * v6 + v5 * v5 > *(float *)((char *)this + 122) )
|
|
return 0;
|
|
normalize_2d(&v7);
|
|
*(float *)a3 = v7 * *(float *)((char *)v3 + 106) - *(float *)((char *)a2 + 54) * *(float *)((char *)a2 + 66);
|
|
*((float *)a3 + 1) = v8 * *(float *)((char *)v3 + 106) - *(float *)((char *)a2 + 58) * *(float *)((char *)a2 + 66);
|
|
return 1;
|
|
}
|
|
|
|
//----- (010168E3) --------------------------------------------------------
|
|
int __thiscall TKickout::Message(TKickout *this, int a2, float a3)
|
|
{
|
|
TKickout *v3; // esi
|
|
|
|
v3 = this;
|
|
if ( a2 == 55 )
|
|
{
|
|
if ( *(_DWORD *)((char *)this + 78) )
|
|
{
|
|
if ( a3 < 0.0 )
|
|
a3 = *(float *)((char *)this + 90);
|
|
*(_DWORD *)((char *)this + 86) = timer_set(a3, (int)this, (int)TKickout::TimerExpired);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( a2 != 1011 )
|
|
{
|
|
if ( a2 != 1024 )
|
|
return 0;
|
|
if ( *(_DWORD *)((char *)this + 78) )
|
|
{
|
|
if ( *(_DWORD *)((char *)this + 86) )
|
|
timer_kill(*(_DWORD *)((char *)this + 86));
|
|
TKickout::TimerExpired(0, (void *)v3);
|
|
}
|
|
}
|
|
if ( *(_DWORD *)((char *)v3 + 82) )
|
|
*((_BYTE *)v3 + 5) = 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//----- (01016963) --------------------------------------------------------
|
|
int __thiscall TKickout::get_scoring(TKickout *this, int a2)
|
|
{
|
|
int result; // eax
|
|
|
|
if ( a2 >= 5 )
|
|
result = 0;
|
|
else
|
|
result = *(_DWORD *)((char *)this + 4 * a2 + 166);
|
|
return result;
|
|
}
|
|
|
|
//----- (01016984) --------------------------------------------------------
|
|
void __thiscall TKickout::put_scoring(TKickout *this, int a2, int a3)
|
|
{
|
|
if ( a2 < 5 )
|
|
*(_DWORD *)((char *)this + 4 * a2 + 166) = a3;
|
|
}
|
|
|
|
//----- (01019884) --------------------------------------------------------
|
|
TKickout *__thiscall TKickout::TKickout(TKickout *this, struct TPinballTable *a2, int a3, struct vector_type *a4)
|
|
{
|
|
TKickout *v4; // ebx
|
|
float *v5; // eax
|
|
float *v6; // esi
|
|
double v7; // st7
|
|
TCircle *v8; // eax
|
|
int v9; // eax
|
|
double v10; // st7
|
|
int v11; // eax
|
|
int v12; // eax
|
|
unsigned int v13; // ecx
|
|
char v15; // [esp+10h] [ebp-58h]
|
|
float *v16; // [esp+1Ch] [ebp-4Ch]
|
|
int v17; // [esp+20h] [ebp-48h]
|
|
int v18; // [esp+28h] [ebp-40h]
|
|
float v19; // [esp+2Ch] [ebp-3Ch]
|
|
int v20; // [esp+30h] [ebp-38h]
|
|
int v21; // [esp+34h] [ebp-34h]
|
|
int v22; // [esp+38h] [ebp-30h]
|
|
int v23; // [esp+3Ch] [ebp-2Ch]
|
|
int v24; // [esp+40h] [ebp-28h]
|
|
unsigned int v25; // [esp+44h] [ebp-24h]
|
|
int v26; // [esp+58h] [ebp-10h]
|
|
int v27; // [esp+5Ch] [ebp-Ch]
|
|
int v28; // [esp+60h] [ebp-8h]
|
|
int v29; // [esp+64h] [ebp-4h]
|
|
float v30; // [esp+70h] [ebp+8h]
|
|
TCircle *v31; // [esp+70h] [ebp+8h]
|
|
struct vector_type *v32; // [esp+78h] [ebp+10h]
|
|
|
|
v4 = this;
|
|
TCollisionComponent::TCollisionComponent(this, a2, a3, 0);
|
|
*(_DWORD *)v4 = &TKickout::vftable;
|
|
*(_DWORD *)((char *)v4 + 82) = a4 == 0;
|
|
if ( !a4 )
|
|
*((_BYTE *)v4 + 5) = 0;
|
|
*(_DWORD *)((char *)v4 + 90) = 1069547520;
|
|
*(_DWORD *)((char *)v4 + 94) = 1028443341;
|
|
*(_DWORD *)((char *)v4 + 6) = 0;
|
|
*(_DWORD *)((char *)v4 + 86) = 0;
|
|
*(_DWORD *)((char *)v4 + 78) = 0;
|
|
v30 = *(float *)loader_query_float_attribute(a3, 0, 306);
|
|
*(_DWORD *)((char *)v4 + 106) = *(_DWORD *)loader_query_float_attribute(a3, 0, 305);
|
|
loader_query_visual(a3, 0, &v15);
|
|
*(_DWORD *)((char *)v4 + 70) = v17;
|
|
*(_DWORD *)((char *)v4 + 74) = v24;
|
|
v5 = v16;
|
|
*(float *)((char *)v4 + 110) = *v16;
|
|
v6 = v5 + 2;
|
|
*(float *)((char *)v4 + 114) = v5[1];
|
|
v7 = v30 * v5[2];
|
|
v32 = (struct vector_type *)v5;
|
|
*(float *)((char *)v4 + 122) = v7;
|
|
if ( 0.0 == v7 )
|
|
*(_DWORD *)((char *)v4 + 122) = 981668463;
|
|
v8 = (TCircle *)operator new(0x25u);
|
|
if ( v8 )
|
|
v31 = TCircle::TCircle(v8, v4, (char *)v4 + 5, v25, v32, *(float *)((char *)v4 + 122));
|
|
else
|
|
v31 = 0;
|
|
if ( v31 )
|
|
{
|
|
(*(void (**)(void))(*(_DWORD *)v31 + 8))();
|
|
objlist_class::Add((TKickout *)((char *)v4 + 42), (void *)v31);
|
|
}
|
|
*(float *)((char *)v4 + 122) = *v6 * *v6;
|
|
v9 = loader_query_float_attribute(a3, 0, 408);
|
|
v10 = v19 * 0.01;
|
|
*(_DWORD *)((char *)v4 + 98) = *(_DWORD *)(v9 + 8);
|
|
v11 = v23;
|
|
*(float *)((char *)v4 + 150) = v10;
|
|
*(_DWORD *)((char *)v4 + 130) = v20;
|
|
*(_DWORD *)((char *)v4 + 134) = v21;
|
|
*(_DWORD *)((char *)v4 + 142) = v11;
|
|
v12 = v18;
|
|
*(_DWORD *)((char *)v4 + 138) = v22;
|
|
*(_DWORD *)((char *)v4 + 146) = v12;
|
|
v29 = *(_DWORD *)((char *)v4 + 122);
|
|
v26 = *(_DWORD *)((char *)v4 + 110);
|
|
v27 = *(_DWORD *)((char *)v4 + 114);
|
|
*(_DWORD *)((char *)v4 + 154) = (char *)v4 + 5;
|
|
v13 = v25;
|
|
v28 = *(_DWORD *)((char *)v4 + 118);
|
|
*(_DWORD *)((char *)v4 + 162) = v4;
|
|
*(_DWORD *)((char *)v4 + 158) = v13;
|
|
edges_insert_circle((struct circle_type *)&v26, 0, (TKickout *)((char *)v4 + 154));
|
|
return v4;
|
|
}
|
|
// 1002690: using guessed type void *TKickout::vftable;
|