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

803 lines
19 KiB
C++

//
// Created by neo on 2019-08-15.
//
#include "TLightGroup.h"
//----- (01009FD1) --------------------------------------------------------
TZmapList *__thiscall TLightGroup::~TLightGroup(TLightGroup *this)
{
TLightGroup *v1; // esi
v1 = this;
objlist_destroy(*(_DWORD *)((char *)this + 46));
return TPinballComponent::~TPinballComponent(v1);
}
//----- (01009FEB) --------------------------------------------------------
void __thiscall TLightGroup::Reset(TLightGroup *this)
{
TLightGroup *v1; // esi
int v2; // eax
int v3; // eax
v1 = this;
if ( *(_DWORD *)((char *)this + 70) )
timer_kill(*(_DWORD *)((char *)this + 70));
v2 = *(_DWORD *)((char *)v1 + 66);
*(_DWORD *)((char *)v1 + 70) = 0;
if ( v2 )
timer_kill(v2);
v3 = *(_DWORD *)((char *)v1 + 54);
*(_DWORD *)((char *)v1 + 66) = 0;
*(_DWORD *)((char *)v1 + 58) = 0;
*(_DWORD *)((char *)v1 + 62) = 0;
*(_DWORD *)((char *)v1 + 50) = v3;
}
//----- (0100A027) --------------------------------------------------------
void __stdcall TLightGroup::TimerExpired(int a1, void *a2)
{
double v2; // st7
void (__stdcall **v3)(_DWORD, _DWORD); // eax
float v4; // ST04_4
v2 = *(float *)((char *)a2 + 50);
v3 = *(void (__stdcall ***)(_DWORD, _DWORD))a2;
*(_DWORD *)((char *)a2 + 70) = 0;
v4 = v2;
(*v3)(*(_DWORD *)((char *)a2 + 58), LODWORD(v4));
}
//----- (0100A04A) --------------------------------------------------------
void __thiscall TLightGroup::reschedule_animation(TLightGroup *this, float a2)
{
TLightGroup *v2; // esi
v2 = this;
if ( *(_DWORD *)((char *)this + 70) )
timer_kill(*(_DWORD *)((char *)this + 70));
*(_DWORD *)((char *)v2 + 70) = 0;
if ( a2 > 0.0 )
{
*(float *)((char *)v2 + 50) = a2;
LABEL_7:
*(_DWORD *)((char *)v2 + 70) = timer_set(*(float *)((char *)v2 + 50), (int)v2, (int)TLightGroup::TimerExpired);
return;
}
if ( a2 < 0.0 )
{
*(_DWORD *)((char *)v2 + 50) = *(_DWORD *)((char *)v2 + 54);
goto LABEL_7;
}
*(_DWORD *)((char *)v2 + 58) = 0;
*(_DWORD *)((char *)v2 + 62) = 0;
}
//----- (0100A0B4) --------------------------------------------------------
int __thiscall TLightGroup::next_light_up(TLightGroup *this)
{
int v1; // ecx
int v2; // edx
int result; // eax
int v4; // ecx
v1 = *(_DWORD *)((char *)this + 46);
v2 = *(_DWORD *)(v1 + 4);
result = 0;
if ( v2 <= 0 )
return -1;
v4 = v1 + 8;
while ( *(_DWORD *)(*(_DWORD *)v4 + 78) )
{
++result;
v4 += 4;
if ( result >= v2 )
return -1;
}
return result;
}
//----- (0100A0DE) --------------------------------------------------------
int __thiscall TLightGroup::next_light_down(TLightGroup *this)
{
int v1; // ecx
int result; // eax
int v3; // ecx
v1 = *(_DWORD *)((char *)this + 46);
result = *(_DWORD *)(v1 + 4) - 1;
if ( result < 0 )
return -1;
v3 = v1 + 4 * result + 8;
while ( !*(_DWORD *)(*(_DWORD *)v3 + 78) )
{
--result;
v3 -= 4;
if ( result < 0 )
return -1;
}
return result;
}
//----- (0100A104) --------------------------------------------------------
void __thiscall TLightGroup::start_animation(TLightGroup *this)
{
TLightGroup *v1; // edi
int v2; // eax
int v3; // esi
int v4; // ebx
int v5; // ecx
void (__stdcall **v6)(signed int, float); // eax
float v7; // [esp+0h] [ebp-10h]
v1 = this;
v2 = *(_DWORD *)(*(_DWORD *)((char *)this + 46) + 4) - 1;
if ( v2 >= 0 )
{
v3 = 4 * v2 + 8;
v4 = *(_DWORD *)(*(_DWORD *)((char *)this + 46) + 4);
do
{
v5 = *(_DWORD *)(v3 + *(_DWORD *)((char *)v1 + 46));
v6 = *(void (__stdcall ***)(signed int, float))v5;
v7 = 0.0;
if ( *(_DWORD *)(v5 + 78) )
(*v6)(9, COERCE_FLOAT(LODWORD(v7)));
else
(*v6)(8, COERCE_FLOAT(LODWORD(v7)));
v3 -= 4;
--v4;
}
while ( v4 );
}
}
//----- (0100A149) --------------------------------------------------------
void __stdcall TLightGroup::NotifyTimerExpired(int a1, void *a2)
{
*(_DWORD *)((char *)a2 + 66) = 0;
control_handler(61, (struct TPinballComponent *)a2);
}
//----- (0100A166) --------------------------------------------------------
int __thiscall TLightGroup::Message(TLightGroup *this, int a2, float a3)
{
int v3; // ebx
TLightGroup *v4; // esi
int v5; // esi
int result; // eax
int v7; // ecx
int v8; // edx
int v9; // ecx
int v10; // eax
int v11; // ecx
int v12; // eax
int v13; // eax
int v14; // ebx
int v15; // ST28_4
int v16; // ebx
int v17; // eax
int v18; // ecx
int v19; // edx
int v20; // eax
int v21; // eax
int v22; // eax
int v23; // ebx
int v24; // ST24_4
bool v25; // zf
int v26; // eax
int v27; // ecx
int j; // ebx
double v29; // st7
int v30; // eax
void (__stdcall ***v31)(int, _DWORD); // ecx
int v32; // eax
int v33; // ecx
signed int v34; // ebx
float v35; // ST10_4
int v36; // eax
int v37; // eax
void (__thiscall ***v38)(_DWORD, signed int, _DWORD); // edi
void (__thiscall **v39)(_DWORD, signed int, _DWORD); // ST24_4
float v40; // ST10_4
int v41; // eax
int v42; // eax
void (__thiscall ***v43)(_DWORD, signed int, _DWORD); // edi
void (__thiscall **v44)(_DWORD, signed int, _DWORD); // ebx
float v45; // ST10_4
int v46; // ecx
int v47; // ebx
int v48; // eax
int v49; // ecx
int v50; // eax
int v51; // eax
int v52; // ecx
signed __int64 v53; // rax
int v54; // ebx
int v55; // ecx
int v56; // ebx
int v57; // eax
int v58; // ecx
int v59; // eax
int v60; // eax
int v61; // ecx
signed __int64 v62; // rax
int v63; // ebx
int v64; // eax
int v65; // ebx
int v66; // eax
int v67; // ebx
int v68; // eax
int v69; // eax
int v70; // ebx
int v71; // ecx
signed __int64 v72; // rax
signed int v73; // ecx
int v74; // ebx
int v75; // edi
int v76; // ebx
int v77; // eax
int v78; // eax
int v79; // edi
int v80; // ecx
_DWORD *v81; // eax
char *v82; // eax
char *v83; // eax
int v84; // [esp+20h] [ebp-14h]
int v85; // [esp+28h] [ebp-Ch]
int v86; // [esp+28h] [ebp-Ch]
int v87; // [esp+28h] [ebp-Ch]
int v88; // [esp+28h] [ebp-Ch]
int v89; // [esp+2Ch] [ebp-8h]
int v90; // [esp+30h] [ebp-4h]
int i; // [esp+30h] [ebp-4h]
int v92; // [esp+30h] [ebp-4h]
signed int v93; // [esp+30h] [ebp-4h]
int v94; // [esp+30h] [ebp-4h]
int v95; // [esp+3Ch] [ebp+8h]
int v96; // [esp+3Ch] [ebp+8h]
int v97; // [esp+3Ch] [ebp+8h]
int v98; // [esp+3Ch] [ebp+8h]
int v99; // [esp+3Ch] [ebp+8h]
int v100; // [esp+3Ch] [ebp+8h]
int v101; // [esp+3Ch] [ebp+8h]
int v102; // [esp+3Ch] [ebp+8h]
int v103; // [esp+40h] [ebp+Ch]
int v104; // [esp+40h] [ebp+Ch]
int v105; // [esp+40h] [ebp+Ch]
v3 = a2;
v4 = this;
if ( a2 > 1009 )
{
if ( a2 != 1011 )
{
if ( a2 == 1020 )
{
v82 = (char *)this + 16 * *(_DWORD *)(*(_DWORD *)((char *)this + 30) + 218);
*(_DWORD *)(v82 + 74) = *(_DWORD *)((char *)this + 6);
*(_DWORD *)(v82 + 78) = *(_DWORD *)((char *)this + 58);
*(_DWORD *)(v82 + 82) = *(_DWORD *)((char *)this + 50);
(*(void (**)(void))(*(_DWORD *)this + 20))();
v83 = (char *)v4 + 16 * (unsigned __int64)(signed __int64)_floor(a3);
*(_DWORD *)((char *)v4 + 6) = *(_DWORD *)(v83 + 74);
*(_DWORD *)((char *)v4 + 58) = *(_DWORD *)(v83 + 78);
v25 = *(_DWORD *)((char *)v4 + 6) == 0;
*(_DWORD *)((char *)v4 + 50) = *(_DWORD *)(v83 + 82);
if ( !v25 )
TLightGroup::TimerExpired(0, (void *)v4);
}
else if ( a2 != 1022 )
{
if ( a2 == 1024 )
{
(*(void (**)(void))(*(_DWORD *)this + 20))();
v80 = 0;
if ( *(_DWORD *)(*(_DWORD *)((char *)v4 + 30) + 214) > 0 )
{
v81 = (_DWORD *)((char *)v4 + 78);
do
{
*(v81 - 1) = *(_DWORD *)((char *)v4 + 6);
*v81 = *(_DWORD *)((char *)v4 + 58);
v81[1] = *(_DWORD *)((char *)v4 + 50);
++v80;
v81 += 4;
}
while ( v80 < *(_DWORD *)(*(_DWORD *)((char *)v4 + 30) + 214) );
}
}
else
{
LABEL_145:
v78 = *(_DWORD *)(*(_DWORD *)((char *)this + 46) + 4) - 1;
if ( v78 >= 0 )
{
v79 = 4 * v78 + 8;
v102 = *(_DWORD *)(*(_DWORD *)((char *)this + 46) + 4);
do
{
(***(void (__stdcall ****)(int, _DWORD))(v79 + *(_DWORD *)((char *)v4 + 46)))(v3, LODWORD(a3));
v79 -= 4;
--v102;
}
while ( v102 );
}
}
}
}
}
else if ( a2 < 1008 )
{
switch ( a2 )
{
case 24:
v10 = *(_DWORD *)((char *)this + 46);
v11 = *(_DWORD *)(v10 + 4);
v12 = *(_DWORD *)(v10 + 4 * v11 + 4);
v90 = v11;
v95 = v12;
if ( *(_DWORD *)(v12 + 82) || *(_DWORD *)(v12 + 90) || *(_DWORD *)(v12 + 86) )
return 0;
if ( *(_DWORD *)((char *)v4 + 58) )
{
TLightGroup::Message(v4, 34, 0.0);
v12 = v95;
v11 = v90;
}
*(_DWORD *)((char *)v4 + 62) = 1;
*(_DWORD *)((char *)v4 + 58) = v3;
v89 = *(_DWORD *)(v12 + 6);
v96 = *(_DWORD *)(v12 + 78);
for ( i = v11 - 1; i > 0; *(_DWORD *)(v14 + 6) = *(_DWORD *)(v15 + 6) )
{
v13 = *(_DWORD *)((char *)v4 + 46);
v14 = *(_DWORD *)(4 * i + v13 + 8);
v15 = *(_DWORD *)(4 * i + v13 + 4);
(**(void (__thiscall ***)(int, bool, _DWORD))v14)(v14, *(_DWORD *)(v15 + 78) != 0, 0.0);
--i;
}
v16 = *(_DWORD *)(*(_DWORD *)((char *)v4 + 46) + 8);
goto LABEL_19;
case 25:
v17 = *(_DWORD *)((char *)this + 46);
v18 = *(_DWORD *)(v17 + 4);
v19 = 4 * *(_DWORD *)(v17 + 4);
v20 = *(_DWORD *)(v19 + v17 + 4);
v92 = v18;
v84 = v19;
if ( *(_DWORD *)(v20 + 82) || *(_DWORD *)(v20 + 90) || *(_DWORD *)(v20 + 86) )
return 0;
if ( *(_DWORD *)((char *)v4 + 58) )
{
TLightGroup::Message(v4, 34, 0.0);
v18 = v92;
}
v21 = *(_DWORD *)(*(_DWORD *)((char *)v4 + 46) + 8);
*(_DWORD *)((char *)v4 + 62) = 1;
*(_DWORD *)((char *)v4 + 58) = a2;
v89 = *(_DWORD *)(v21 + 6);
v96 = *(_DWORD *)(v21 + 78);
if ( v18 - 1 > 0 )
{
v93 = 12;
v85 = v18 - 1;
do
{
v22 = *(_DWORD *)((char *)v4 + 46);
v23 = *(_DWORD *)(v93 + v22 - 4);
v24 = *(_DWORD *)(v93 + v22);
(**(void (__thiscall ***)(int, bool, _DWORD))v23)(v23, *(_DWORD *)(v24 + 78) != 0, 0.0);
v93 += 4;
v25 = v85-- == 1;
*(_DWORD *)(v23 + 6) = *(_DWORD *)(v24 + 6);
}
while ( !v25 );
}
v16 = *(_DWORD *)(v84 + *(_DWORD *)((char *)v4 + 46) + 4);
LABEL_19:
(**(void (__thiscall ***)(int, bool, _DWORD))v16)(v16, v96 != 0, 0.0);
*(_DWORD *)(v16 + 6) = v89;
goto LABEL_20;
case 26:
if ( *(_DWORD *)((char *)this + 62) || !*(_DWORD *)((char *)this + 58) )
TLightGroup::start_animation(this);
v26 = *(_DWORD *)((char *)v4 + 46);
*(_DWORD *)((char *)v4 + 58) = a2;
*(_DWORD *)((char *)v4 + 62) = 0;
v27 = *(_DWORD *)(v26 + 4);
v97 = *(_DWORD *)(*(_DWORD *)(v26 + 4 * v27 + 4) + 90);
for ( j = v27 - 1; ; --j )
{
v29 = 0.0;
v30 = *(_DWORD *)((char *)v4 + 46);
if ( j <= 0 )
break;
(***(void (__thiscall ****)(_DWORD, int, _DWORD))(v30 + 4 * j + 8))(
*(_DWORD *)(v30 + 4 * j + 8),
(*(_DWORD *)(*(_DWORD *)(v30 + 4 * j + 4) + 90) != 0) + 8,
0.0);
}
v31 = *(void (__stdcall ****)(int, _DWORD))(v30 + 8);
goto LABEL_44;
case 27:
if ( *(_DWORD *)((char *)this + 62) || !*(_DWORD *)((char *)this + 58) )
TLightGroup::start_animation(this);
v32 = *(_DWORD *)((char *)v4 + 46);
*(_DWORD *)((char *)v4 + 58) = a2;
*(_DWORD *)((char *)v4 + 62) = 0;
v33 = *(_DWORD *)(v32 + 4);
v97 = *(_DWORD *)(*(_DWORD *)(v32 + 8) + 90);
v94 = *(_DWORD *)(v32 + 4);
if ( v33 - 1 > 0 )
{
v34 = 12;
v86 = v33 - 1;
do
{
(***(void (__thiscall ****)(_DWORD, int, _DWORD))(v34 + *(_DWORD *)((char *)v4 + 46) - 4))(
*(_DWORD *)(v34 + *(_DWORD *)((char *)v4 + 46) - 4),
(*(_DWORD *)(*(_DWORD *)(v34 + *(_DWORD *)((char *)v4 + 46)) + 90) != 0) + 8,
0.0);
v34 += 4;
--v86;
}
while ( v86 );
}
v29 = 0.0;
v31 = *(void (__stdcall ****)(int, _DWORD))(*(_DWORD *)((char *)v4 + 46) + 4 * v94 + 4);
LABEL_44:
v35 = v29;
(**v31)((v97 != 0) + 8, LODWORD(v35));
goto LABEL_20;
case 28:
if ( *(_DWORD *)((char *)this + 62) || !*(_DWORD *)((char *)this + 58) )
TLightGroup::start_animation(this);
v36 = *(_DWORD *)((char *)v4 + 46);
*(_DWORD *)((char *)v4 + 58) = a2;
*(_DWORD *)((char *)v4 + 62) = 0;
v37 = *(_DWORD *)(v36 + 4) - 1;
if ( v37 > 0 )
{
v98 = 8;
v87 = v37;
do
{
if ( _rand() % 100 > 70 )
{
v38 = *(void (__thiscall ****)(_DWORD, signed int, _DWORD))(v98 + *(_DWORD *)((char *)v4 + 46));
v39 = *v38;
v40 = (double)_rand() * 0.00003051850947599719 * a3 * 3.0 + 0.1;
(*v39)(v38, 9, LODWORD(v40));
}
v98 += 4;
--v87;
}
while ( v87 );
}
goto LABEL_20;
case 29:
if ( *(_DWORD *)((char *)this + 62) || !*(_DWORD *)((char *)this + 58) )
TLightGroup::start_animation(this);
v41 = *(_DWORD *)((char *)v4 + 46);
*(_DWORD *)((char *)v4 + 58) = a2;
*(_DWORD *)((char *)v4 + 62) = 0;
v42 = *(_DWORD *)(v41 + 4) - 1;
if ( v42 > 0 )
{
v99 = 8;
v88 = v42;
do
{
v43 = *(void (__thiscall ****)(_DWORD, signed int, _DWORD))(v99 + *(_DWORD *)((char *)v4 + 46));
v44 = *v43;
v45 = (double)(_rand() % 100 > 70);
(*v44)(v43, 18, LODWORD(v45));
v99 += 4;
--v88;
}
while ( v88 );
}
LABEL_20:
TLightGroup::reschedule_animation(v4, a3);
return 0;
case 30:
v46 = *(_DWORD *)((char *)this + 46);
v47 = 0;
v48 = *(_DWORD *)(v46 + 4) - 1;
if ( v48 < 0 )
return 0;
v49 = v46 + 4 * v48 + 8;
v50 = v48 + 1;
do
{
if ( !*(_DWORD *)(*(_DWORD *)v49 + 78) )
++v47;
v49 -= 4;
--v50;
}
while ( v50 );
if ( !v47 )
return 0;
v51 = _rand();
v52 = *(_DWORD *)((char *)v4 + 46);
HIDWORD(v53) = v51 % v47;
LODWORD(v53) = *(_DWORD *)(v52 + 4) - 1;
if ( (signed int)v53 < 0 )
goto LABEL_74;
v103 = v52 + 4 * v53 + 8;
while ( 1 )
{
if ( !*(_DWORD *)(*(_DWORD *)v103 + 78) )
{
v54 = HIDWORD(v53)--;
if ( !v54 )
break;
}
v103 -= 4;
LODWORD(v53) = v53 - 1;
if ( (signed int)v53 < 0 )
goto LABEL_74;
}
LABEL_73:
(***(void (__fastcall ****)(_DWORD, _DWORD, signed int, _DWORD))(v52 + 4 * v53 + 8))(
*(_DWORD *)(v52 + 4 * v53 + 8),
HIDWORD(v53),
1,
0.0);
goto LABEL_74;
case 31:
v55 = *(_DWORD *)((char *)this + 46);
v56 = 0;
v57 = *(_DWORD *)(v55 + 4) - 1;
if ( v57 < 0 )
return 0;
v58 = v55 + 4 * v57 + 8;
v59 = v57 + 1;
do
{
if ( *(_DWORD *)(*(_DWORD *)v58 + 78) )
++v56;
v58 -= 4;
--v59;
}
while ( v59 );
if ( !v56 )
return 0;
v60 = _rand();
v61 = *(_DWORD *)((char *)v4 + 46);
HIDWORD(v62) = v60 % v56;
LODWORD(v62) = *(_DWORD *)(v61 + 4) - 1;
if ( (signed int)v62 < 0 )
goto LABEL_74;
v104 = v61 + 4 * v62 + 8;
break;
case 32:
v64 = TLightGroup::next_light_up(this);
if ( v64 < 0 )
return 0;
(***(void (__stdcall ****)(signed int, _DWORD))(*(_DWORD *)((char *)v4 + 46) + 4 * v64 + 8))(1, 0.0);
goto LABEL_90;
case 33:
v66 = TLightGroup::next_light_down(this);
if ( v66 < 0 )
return 0;
(***(void (__stdcall ****)(_DWORD, _DWORD))(*(_DWORD *)((char *)v4 + 46) + 4 * v66 + 8))(0, 0.0);
LABEL_90:
if ( *(_DWORD *)((char *)v4 + 58) )
TLightGroup::start_animation(v4);
return 1;
case 34:
if ( *(_DWORD *)((char *)this + 70) )
timer_kill(*(_DWORD *)((char *)this + 70));
v68 = *(_DWORD *)((char *)v4 + 58);
*(_DWORD *)((char *)v4 + 70) = 0;
if ( v68 == 26 || v68 == 27 || v68 == 28 )
TLightGroup::Message(v4, 14, 0.0);
*(_DWORD *)((char *)v4 + 58) = 0;
*(_DWORD *)((char *)v4 + 62) = 0;
return 0;
case 35:
v53 = (signed __int64)_floor(a3);
v52 = *(_DWORD *)((char *)v4 + 46);
if ( (signed int)v53 < *(_DWORD *)(v52 + 4) && (signed int)v53 >= 0 )
goto LABEL_73;
return 0;
case 36:
v62 = (signed __int64)_floor(a3);
v61 = *(_DWORD *)((char *)v4 + 46);
if ( (signed int)v62 < *(_DWORD *)(v61 + 4) && (signed int)v62 >= 0 )
goto LABEL_117;
return 0;
case 37:
v5 = *(_DWORD *)((char *)this + 46);
result = 0;
v7 = *(_DWORD *)(v5 + 4) - 1;
if ( v7 >= 0 )
{
v8 = v5 + 4 * v7 + 8;
v9 = *(_DWORD *)(v5 + 4);
do
{
if ( *(_DWORD *)(*(_DWORD *)v8 + 78) )
++result;
v8 -= 4;
--v9;
}
while ( v9 );
}
return result;
case 38:
return *(_DWORD *)(*(_DWORD *)((char *)this + 46) + 4);
case 39:
return *(_DWORD *)((char *)this + 58);
case 40:
return *(_DWORD *)((char *)this + 62);
case 41:
v65 = TLightGroup::next_light_up(this);
if ( v65 < 0 )
return 0;
if ( *(_DWORD *)((char *)v4 + 58) || *(_DWORD *)((char *)v4 + 62) )
TLightGroup::Message(v4, 34, 0.0);
(***(void (__stdcall ****)(signed int, _DWORD))(*(_DWORD *)((char *)v4 + 46) + 4 * v65 + 8))(15, LODWORD(a3));
return 1;
case 42:
v67 = TLightGroup::next_light_down(this);
if ( v67 < 0 )
return 0;
if ( *(_DWORD *)((char *)v4 + 58) || *(_DWORD *)((char *)v4 + 62) )
TLightGroup::Message(v4, 34, 0.0);
(***(void (__stdcall ****)(signed int, _DWORD))(*(_DWORD *)((char *)v4 + 46) + 4 * v67 + 8))(16, LODWORD(a3));
return 1;
case 43:
if ( *(_DWORD *)((char *)this + 66) )
timer_kill(*(_DWORD *)((char *)this + 66));
*(_DWORD *)((char *)v4 + 66) = 0;
if ( a3 > 0.0 )
*(_DWORD *)((char *)v4 + 66) = timer_set(a3, (int)v4, (int)TLightGroup::NotifyTimerExpired);
return 0;
case 44:
v69 = *(_DWORD *)(*(_DWORD *)((char *)this + 46) + 4) - 1;
if ( v69 >= 0 )
{
v70 = 4 * v69 + 8;
v100 = *(_DWORD *)(*(_DWORD *)((char *)this + 46) + 4);
do
{
v71 = *(_DWORD *)(v70 + *(_DWORD *)((char *)v4 + 46));
if ( *(_DWORD *)(v71 + 78) )
{
(**(void (__stdcall ***)(_DWORD, _DWORD))v71)(0, 0.0);
(***(void (__stdcall ****)(signed int, _DWORD))(v70 + *(_DWORD *)((char *)v4 + 46)))(16, LODWORD(a3));
}
v70 -= 4;
--v100;
}
while ( v100 );
}
return 0;
case 45:
control_handler(a2, this);
v72 = (signed __int64)_floor(a3);
if ( (signed int)v72 >= 0 )
{
v73 = *(_DWORD *)(*(_DWORD *)((char *)v4 + 46) + 4);
if ( (signed int)v72 <= v73 )
{
v74 = v73 - 1;
if ( v73 - 1 > (signed int)v72 )
{
v105 = 4 * v74 + 8;
v101 = v74 - v72;
v74 = v72;
do
{
(***(void (__fastcall ****)(_DWORD, _DWORD, signed int, _DWORD))(v105 + *(_DWORD *)((char *)v4 + 46)))(
*(_DWORD *)(v105 + *(_DWORD *)((char *)v4 + 46)),
HIDWORD(v72),
20,
0.0);
v105 -= 4;
--v101;
}
while ( v101 );
}
if ( v74 >= 0 )
{
v75 = 4 * v74 + 8;
v76 = v74 + 1;
do
{
(***(void (__fastcall ****)(_DWORD, _DWORD, signed int, _DWORD))(v75 + *(_DWORD *)((char *)v4 + 46)))(
*(_DWORD *)(v75 + *(_DWORD *)((char *)v4 + 46)),
HIDWORD(v72),
19,
0.0);
v75 -= 4;
--v76;
}
while ( v76 );
}
}
}
return 0;
case 46:
v77 = TLightGroup::next_light_down(this);
if ( v77 >= 0 )
(***(void (__stdcall ****)(signed int, _DWORD))(*(_DWORD *)((char *)v4 + 46) + 4 * v77 + 8))(4, 0.0);
return 0;
default:
goto LABEL_145;
}
while ( 1 )
{
if ( *(_DWORD *)(*(_DWORD *)v104 + 78) )
{
v63 = HIDWORD(v62)--;
if ( !v63 )
break;
}
v104 -= 4;
LODWORD(v62) = v62 - 1;
if ( (signed int)v62 < 0 )
goto LABEL_74;
}
LABEL_117:
(***(void (__fastcall ****)(_DWORD, _DWORD, _DWORD, _DWORD))(v61 + 4 * v62 + 8))(
*(_DWORD *)(v61 + 4 * v62 + 8),
HIDWORD(v62),
0,
0.0);
LABEL_74:
if ( *(_DWORD *)((char *)v4 + 58) )
TLightGroup::start_animation(v4);
}
return 0;
}
//----- (0100ADB1) --------------------------------------------------------
TLightGroup *__thiscall TLightGroup::TLightGroup(TLightGroup *this, struct TPinballTable *a2, int a3)
{
TLightGroup *v3; // esi
signed __int16 *v4; // ebx
struct TPinballComponent *v5; // eax
int v7; // [esp+Ch] [ebp-4h]
int i; // [esp+1Ch] [ebp+Ch]
v3 = this;
TPinballComponent::TPinballComponent(this, a2, a3, 0);
*(_DWORD *)v3 = &TLightGroup::vftable;
objlist_class::objlist_class((TLightGroup *)((char *)v3 + 42), 4, 4);
*(_DWORD *)((char *)v3 + 70) = 0;
*(_DWORD *)((char *)v3 + 66) = 0;
TLightGroup::Reset(v3);
if ( a3 > 0 )
{
*(_DWORD *)((char *)v3 + 54) = *(_DWORD *)loader_query_float_attribute(a3, 0, 903);
v4 = (signed __int16 *)loader_query_iattribute(a3, 1027, &v7);
for ( i = 0; i < v7; ++v4 )
{
v5 = TPinballTable::find_component(a2, *v4);
if ( v5 )
objlist_class::Add((TLightGroup *)((char *)v3 + 42), (void *)v5);
++i;
}
}
return v3;
}
// 1001A60: using guessed type void *TLightGroup::vftable;
//----- (0100AE4C) --------------------------------------------------------
TLightGroup *__thiscall TLightGroup::`vector deleting destructor'(TLightGroup *this, char a2)
{
TLightGroup *v2; // esi
v2 = this;
TLightGroup::~TLightGroup(this);
if ( a2 & 1 )
operator delete((void *)v2);
return v2;
}