195 lines
5.8 KiB
C++
195 lines
5.8 KiB
C++
#include "TFlagSpinner.h"
|
|
|
|
//----- (01015F34) --------------------------------------------------------
|
|
void __stdcall TFlagSpinner::SpinTimer(int a1, void *a2)
|
|
{
|
|
*(_DWORD *)((char *)a2 + 102) = 0;
|
|
TFlagSpinner::NextFrame((TFlagSpinner *)a2);
|
|
}
|
|
|
|
//----- (01015F4E) --------------------------------------------------------
|
|
void __thiscall TFlagSpinner::NextFrame(TFlagSpinner *this)
|
|
{
|
|
TFlagSpinner *v1; // esi
|
|
int v2; // eax
|
|
int v3; // edx
|
|
int v4; // ecx
|
|
int v5; // edi
|
|
double v6; // st7
|
|
int v7; // et1
|
|
char v9; // c0
|
|
float v10; // ST0C_4
|
|
|
|
v1 = this;
|
|
*(_DWORD *)((char *)v1 + 98) += *(_DWORD *)((char *)this + 94);
|
|
v2 = *(_DWORD *)((char *)this + 34);
|
|
v3 = *(_DWORD *)((char *)this + 98);
|
|
v4 = *(_DWORD *)(*(_DWORD *)(v2 + 4) + 4);
|
|
if ( v3 < v4 )
|
|
{
|
|
if ( v3 < 0 )
|
|
*(_DWORD *)((char *)v1 + 98) = v4 - 1;
|
|
}
|
|
else
|
|
{
|
|
*(_DWORD *)((char *)v1 + 98) = 0;
|
|
}
|
|
v5 = *(_DWORD *)(*(_DWORD *)(v2 + 4) + 4 * *(_DWORD *)((char *)v1 + 98) + 8);
|
|
if ( !*(_DWORD *)(*(_DWORD *)((char *)v1 + 30) + 370) )
|
|
{
|
|
control_handler(63, v1);
|
|
if ( *(_DWORD *)((char *)v1 + 70) )
|
|
loader_play_sound(*(_DWORD *)((char *)v1 + 70));
|
|
if ( !*(_DWORD *)((char *)v1 + 98) )
|
|
control_handler(62, v1);
|
|
}
|
|
render_sprite_set(
|
|
*(_DWORD **)((char *)v1 + 26),
|
|
v5,
|
|
*(_DWORD *)(*(_DWORD *)(*(_DWORD *)((char *)v1 + 38) + 4) + 4 * *(_DWORD *)((char *)v1 + 98) + 8),
|
|
*(_DWORD *)(v5 + 29) - *(_DWORD *)(*(_DWORD *)((char *)v1 + 30) + 234),
|
|
*(_DWORD *)(v5 + 33) - *(_DWORD *)(*(_DWORD *)((char *)v1 + 30) + 238));
|
|
v6 = *(float *)((char *)v1 + 90) * *(float *)((char *)v1 + 78);
|
|
v7 = *(_DWORD *)((char *)v1 + 86);
|
|
*(float *)((char *)v1 + 78) = v6;
|
|
if ( !v9 )
|
|
{
|
|
v10 = 1.0 / v6;
|
|
timer_set(v10, (int)v1, (int)TFlagSpinner::SpinTimer);
|
|
}
|
|
}
|
|
|
|
//----- (01016014) --------------------------------------------------------
|
|
int __thiscall TFlagSpinner::Message(TFlagSpinner *this, int a2, float a3)
|
|
{
|
|
TFlagSpinner *v3; // esi
|
|
int v4; // eax
|
|
|
|
v3 = this;
|
|
if ( a2 == 1024 )
|
|
{
|
|
if ( *(_DWORD *)((char *)this + 102) )
|
|
{
|
|
timer_kill(*(_DWORD *)((char *)this + 102));
|
|
*(_DWORD *)((char *)v3 + 102) = 0;
|
|
}
|
|
*(_DWORD *)((char *)v3 + 98) = 0;
|
|
v4 = *(_DWORD *)(*(_DWORD *)(*(_DWORD *)((char *)v3 + 34) + 4) + 8);
|
|
render_sprite_set(
|
|
*(_DWORD **)((char *)v3 + 26),
|
|
*(_DWORD *)(*(_DWORD *)(*(_DWORD *)((char *)v3 + 34) + 4) + 8),
|
|
*(_DWORD *)(*(_DWORD *)(*(_DWORD *)((char *)v3 + 38) + 4) + 8),
|
|
*(_DWORD *)(v4 + 29) - *(_DWORD *)(*(_DWORD *)((char *)v3 + 30) + 234),
|
|
*(_DWORD *)(v4 + 33) - *(_DWORD *)(*(_DWORD *)((char *)v3 + 30) + 238));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//----- (01016078) --------------------------------------------------------
|
|
int __thiscall TFlagSpinner::get_scoring(TFlagSpinner *this, int a2)
|
|
{
|
|
int result; // eax
|
|
|
|
if ( a2 >= 2 )
|
|
result = 0;
|
|
else
|
|
result = *(_DWORD *)((char *)this + 4 * a2 + 110);
|
|
return result;
|
|
}
|
|
|
|
//----- (01016096) --------------------------------------------------------
|
|
void __thiscall TFlagSpinner::put_scoring(TFlagSpinner *this, int a2, int a3)
|
|
{
|
|
if ( a2 < 2 )
|
|
*(_DWORD *)((char *)this + 4 * a2 + 110) = a3;
|
|
}
|
|
|
|
//----- (01018150) --------------------------------------------------------
|
|
void __thiscall TFlagSpinner::Collision(TFlagSpinner *this, struct TBall *a2, struct vector_type *a3, struct vector_type *a4, float a5, struct TEdgeSegment *a6)
|
|
{
|
|
int v6; // eax
|
|
TFlagSpinner *v7; // edi
|
|
|
|
*(float *)((char *)a2 + 42) = *(float *)a3;
|
|
v6 = *((_DWORD *)a3 + 1);
|
|
v7 = this;
|
|
*(float *)((char *)a2 + 70) = *(float *)((char *)a2 + 70) - a5;
|
|
*(_DWORD *)((char *)a2 + 46) = v6;
|
|
TBall::not_again(a2, a6);
|
|
*(_DWORD *)((char *)v7 + 94) = 2 * (*(_DWORD *)((char *)v7 + 106) != (_DWORD)a6) - 1;
|
|
if ( *(float *)((char *)a2 + 66) == 0.0 )
|
|
*(_DWORD *)((char *)v7 + 78) = *(_DWORD *)((char *)v7 + 86);
|
|
else
|
|
*(float *)((char *)v7 + 78) = *(float *)((char *)a2 + 66) * 20.0;
|
|
if ( *(float *)((char *)v7 + 78) < (double)*(float *)((char *)v7 + 86) )
|
|
*(_DWORD *)((char *)v7 + 78) = *(_DWORD *)((char *)v7 + 86);
|
|
if ( *(float *)((char *)v7 + 78) > (double)*(float *)((char *)v7 + 82) )
|
|
*(_DWORD *)((char *)v7 + 78) = *(_DWORD *)((char *)v7 + 82);
|
|
TFlagSpinner::NextFrame(v7);
|
|
}
|
|
|
|
//----- (010194B0) --------------------------------------------------------
|
|
TFlagSpinner *__thiscall TFlagSpinner::TFlagSpinner(TFlagSpinner *this, struct TPinballTable *a2, int a3)
|
|
{
|
|
TFlagSpinner *v3; // esi
|
|
TLine *v4; // eax
|
|
TLine *v5; // edi
|
|
TLine *v6; // eax
|
|
TLine *v7; // eax
|
|
_DWORD *v8; // eax
|
|
_DWORD *v9; // eax
|
|
_DWORD *v10; // eax
|
|
char v12; // [esp+Ch] [ebp-60h]
|
|
int *v13; // [esp+18h] [ebp-54h]
|
|
unsigned int v14; // [esp+40h] [ebp-2Ch]
|
|
int v15; // [esp+54h] [ebp-18h]
|
|
int v16; // [esp+58h] [ebp-14h]
|
|
int v17; // [esp+60h] [ebp-Ch]
|
|
int v18; // [esp+64h] [ebp-8h]
|
|
|
|
v3 = this;
|
|
TCollisionComponent::TCollisionComponent(this, a2, a3, 0);
|
|
*(_DWORD *)v3 = &TFlagSpinner::vftable;
|
|
*(_DWORD *)((char *)v3 + 102) = 0;
|
|
loader_query_visual(a3, 0, &v12);
|
|
v15 = *v13;
|
|
v16 = v13[1];
|
|
v17 = v13[2];
|
|
v18 = v13[3];
|
|
v4 = (TLine *)operator new(0x55u);
|
|
if ( v4 )
|
|
v5 = TLine::TLine(v4, v3, (char *)v3 + 5, v14, (struct vector_type *)&v17, (struct vector_type *)&v15);
|
|
else
|
|
v5 = 0;
|
|
if ( v5 )
|
|
{
|
|
(*(void (__thiscall **)(TLine *))(*(_DWORD *)v5 + 8))(v5);
|
|
objlist_class::Add((TFlagSpinner *)((char *)v3 + 42), (void *)v5);
|
|
}
|
|
v6 = (TLine *)operator new(0x55u);
|
|
if ( v6 )
|
|
v7 = TLine::TLine(v6, v3, (char *)v3 + 5, v14, (struct vector_type *)&v15, (struct vector_type *)&v17);
|
|
else
|
|
v7 = 0;
|
|
*(_DWORD *)((char *)v3 + 106) = v7;
|
|
if ( v7 )
|
|
{
|
|
(*(void (__thiscall **)(TLine *))(*(_DWORD *)v7 + 8))(v7);
|
|
objlist_class::Add((TFlagSpinner *)((char *)v3 + 42), *(void **)((char *)v3 + 106));
|
|
}
|
|
*(_DWORD *)((char *)v3 + 90) = 1059481190;
|
|
*(_DWORD *)((char *)v3 + 82) = 1195593728;
|
|
*(_DWORD *)((char *)v3 + 86) = 1084227584;
|
|
v8 = (_DWORD *)loader_query_float_attribute(a3, 0, 1202);
|
|
if ( v8 )
|
|
*(_DWORD *)((char *)v3 + 90) = *v8;
|
|
v9 = (_DWORD *)loader_query_float_attribute(a3, 0, 1200);
|
|
if ( v9 )
|
|
*(_DWORD *)((char *)v3 + 82) = *v9;
|
|
v10 = (_DWORD *)loader_query_float_attribute(a3, 0, 1201);
|
|
if ( v10 )
|
|
*(_DWORD *)((char *)v3 + 86) = *v10;
|
|
return v3;
|
|
}
|
|
// 1002588: using guessed type void *TFlagSpinner::vftable;
|