196 lines
4.8 KiB
C++
196 lines
4.8 KiB
C++
//
|
|
// Created by neo on 2019-08-15.
|
|
|
|
#include "TLightBargraph.h"
|
|
|
|
//----- (0100AA81) --------------------------------------------------------
|
|
TZmapList *__thiscall TLightBargraph::~TLightBargraph(TLightBargraph *this)
|
|
{
|
|
TLightGroup *v1; // esi
|
|
int v2; // eax
|
|
|
|
v1 = this;
|
|
v2 = *(_DWORD *)((char *)this + 138);
|
|
*(_DWORD *)this = &TLightBargraph::vftable;
|
|
if ( v2 )
|
|
memoryfree(v2);
|
|
return TLightGroup::~TLightGroup(v1);
|
|
}
|
|
// 1001A30: using guessed type void *TLightBargraph::vftable;
|
|
|
|
//----- (0100AAA9) --------------------------------------------------------
|
|
void __thiscall TLightBargraph::Reset(TLightBargraph *this)
|
|
{
|
|
TLightBargraph *v1; // edi
|
|
_DWORD *v2; // esi
|
|
|
|
v1 = this;
|
|
v2 = (_DWORD *)((char *)this + 142);
|
|
if ( *(_DWORD *)((char *)this + 142) )
|
|
{
|
|
timer_kill(*(_DWORD *)((char *)this + 142));
|
|
*v2 = 0;
|
|
}
|
|
*(_DWORD *)((char *)v1 + 146) = 0;
|
|
TLightGroup::Reset(v1);
|
|
}
|
|
|
|
//----- (0100AAD9) --------------------------------------------------------
|
|
void __stdcall TLightBargraph::BargraphTimerExpired(int a1, void *a2)
|
|
{
|
|
int v2; // eax
|
|
float v3; // ST04_4
|
|
|
|
v2 = *(_DWORD *)((char *)a2 + 146);
|
|
*(_DWORD *)((char *)a2 + 142) = 0;
|
|
if ( v2 )
|
|
{
|
|
v3 = (double)(v2 - 1);
|
|
(**(void (__thiscall ***)(void *, signed int, _DWORD))a2)(a2, 45, LODWORD(v3));
|
|
control_handler(60, (struct TPinballComponent *)a2);
|
|
}
|
|
else
|
|
{
|
|
(**(void (__thiscall ***)(void *, signed int, _DWORD))a2)(a2, 20, 0.0);
|
|
control_handler(47, (struct TPinballComponent *)a2);
|
|
}
|
|
}
|
|
|
|
//----- (0100AB28) --------------------------------------------------------
|
|
int __thiscall TLightBargraph::Message(TLightBargraph *this, int a2, float a3)
|
|
{
|
|
TLightBargraph *v3; // esi
|
|
int v4; // ecx
|
|
_DWORD *v5; // eax
|
|
_DWORD *v6; // edi
|
|
float v7; // ST0C_4
|
|
int v8; // ebx
|
|
int v9; // eax
|
|
float v10; // ST08_4
|
|
int v11; // eax
|
|
signed int v13; // [esp+20h] [ebp+Ch]
|
|
|
|
v3 = this;
|
|
switch ( a2 )
|
|
{
|
|
case 37:
|
|
return *(_DWORD *)((char *)this + 146);
|
|
case 45:
|
|
if ( *(_DWORD *)((char *)this + 142) )
|
|
{
|
|
timer_kill(*(_DWORD *)((char *)this + 142));
|
|
*(_DWORD *)((char *)v3 + 142) = 0;
|
|
}
|
|
v8 = (signed __int64)_floor(a3);
|
|
v9 = 2 * *(_DWORD *)(*(_DWORD *)((char *)v3 + 46) + 4);
|
|
if ( v8 >= v9 )
|
|
v8 = v9 - 1;
|
|
if ( v8 >= 0 )
|
|
{
|
|
v10 = (double)(v8 / 2);
|
|
TLightGroup::Message(v3, 45, v10);
|
|
if ( !(v8 & 1) )
|
|
TLightGroup::Message(v3, 46, 0.0);
|
|
v11 = *(_DWORD *)((char *)v3 + 138);
|
|
if ( v11 )
|
|
*(_DWORD *)((char *)v3 + 142) = timer_set(
|
|
*(float *)(v11 + 4 * v8),
|
|
(int)v3,
|
|
(int)TLightBargraph::BargraphTimerExpired);
|
|
*(_DWORD *)((char *)v3 + 146) = v8;
|
|
}
|
|
else
|
|
{
|
|
TLightGroup::Message(v3, 20, 0.0);
|
|
*(_DWORD *)((char *)v3 + 146) = 0;
|
|
}
|
|
break;
|
|
case 1011:
|
|
(*(void (**)(void))(*(_DWORD *)this + 20))();
|
|
break;
|
|
case 1020:
|
|
v6 = (_DWORD *)((char *)this + 142);
|
|
if ( *(_DWORD *)((char *)this + 142) )
|
|
{
|
|
timer_kill(*(_DWORD *)((char *)this + 142));
|
|
*v6 = 0;
|
|
}
|
|
*(_DWORD *)((char *)v3 + 4 * *(_DWORD *)(*(_DWORD *)((char *)v3 + 30) + 218) + 150) = *(_DWORD *)((char *)v3 + 146);
|
|
(*(void (__thiscall **)(TLightBargraph *))(*(_DWORD *)v3 + 20))(v3);
|
|
v13 = *(_DWORD *)((char *)v3 + 4 * (unsigned __int64)(signed __int64)_floor(a3) + 150);
|
|
*(_DWORD *)((char *)v3 + 146) = v13;
|
|
if ( v13 )
|
|
{
|
|
v7 = (double)v13;
|
|
TLightBargraph::Message(v3, 45, v7);
|
|
}
|
|
break;
|
|
case 1024:
|
|
(*(void (**)(void))(*(_DWORD *)this + 20))();
|
|
v4 = 0;
|
|
if ( *(_DWORD *)(*(_DWORD *)((char *)v3 + 30) + 214) > 0 )
|
|
{
|
|
v5 = (_DWORD *)((char *)v3 + 150);
|
|
do
|
|
{
|
|
*v5 = *(_DWORD *)((char *)v3 + 146);
|
|
++v4;
|
|
++v5;
|
|
}
|
|
while ( v4 < *(_DWORD *)(*(_DWORD *)((char *)v3 + 30) + 214) );
|
|
}
|
|
TLightGroup::Message(v3, 1024, a3);
|
|
break;
|
|
default:
|
|
TLightGroup::Message(this, a2, a3);
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//----- (0100AE72) --------------------------------------------------------
|
|
TLightBargraph *__thiscall TLightBargraph::TLightBargraph(TLightBargraph *this, struct TPinballTable *a2, int a3)
|
|
{
|
|
TLightBargraph *v3; // esi
|
|
float *v4; // ebx
|
|
int v5; // edi
|
|
int v6; // eax
|
|
int i; // eax
|
|
|
|
v3 = this;
|
|
TLightGroup::TLightGroup(this, a2, a3);
|
|
*(_DWORD *)v3 = &TLightBargraph::vftable;
|
|
*(_DWORD *)((char *)v3 + 138) = 0;
|
|
TLightBargraph::Reset(v3);
|
|
if ( a3 > 0 )
|
|
{
|
|
v4 = (float *)loader_query_float_attribute(a3, 0, 904);
|
|
if ( v4 )
|
|
{
|
|
v5 = 2 * *(_DWORD *)(*(_DWORD *)((char *)v3 + 46) + 4);
|
|
v6 = memoryallocate(8 * *(_DWORD *)(*(_DWORD *)((char *)v3 + 46) + 4));
|
|
*(_DWORD *)((char *)v3 + 138) = v6;
|
|
if ( v6 )
|
|
{
|
|
for ( i = 0; i < v5; ++v4 )
|
|
*(float *)(*(_DWORD *)((char *)v3 + 138) + 4 * i++) = *v4;
|
|
}
|
|
}
|
|
}
|
|
return v3;
|
|
}
|
|
// 1001A30: using guessed type void *TLightBargraph::vftable;
|
|
|
|
//----- (0100AEF9) --------------------------------------------------------
|
|
TLightBargraph *__thiscall TLightBargraph::`vector deleting destructor'(TLightBargraph *this, char a2)
|
|
{
|
|
TLightBargraph *v2; // esi
|
|
|
|
v2 = this;
|
|
TLightBargraph::~TLightBargraph(this);
|
|
if ( a2 & 1 )
|
|
operator delete((void *)v2);
|
|
return v2;
|
|
}
|
|
|