// // 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; }