diff --git a/Classes/TBall/TBall.cpp b/Classes/TBall/TBall.cpp index a4b29d9..7e94a60 100644 --- a/Classes/TBall/TBall.cpp +++ b/Classes/TBall/TBall.cpp @@ -5,199 +5,197 @@ #include "TBall.h" //----- (0100B072) -------------------------------------------------------- -bool __thiscall TBall::already_hit(TBall *this, struct TEdgeSegment *a2) +bool __thiscall TBall::already_hit(TBall* this, struct TEdgeSegment* a2) { -int v2; // esi -bool result; // al + int v2; // esi + bool result; // al -v2 = *(DWORD *)((char *)this + 134); -if ( !v2 ) -return 0; -result = 1; -if ( *(struct TEdgeSegment **)((char *)this + 114) != a2 ) -{ -if ( v2 == 1 ) -return 0; -if ( *(struct TEdgeSegment **)((char *)this + 118) == a2 ) -return result; -if ( v2 == 2 ) -return 0; -if ( *(struct TEdgeSegment **)((char *)this + 122) == a2 ) -return result; -if ( v2 == 3 ) -return 0; -if ( *(struct TEdgeSegment **)((char *)this + 126) == a2 ) -return result; -if ( v2 == 4 ) -return 0; -if ( *(struct TEdgeSegment **)((char *)this + 130) != a2 ) -{ -result = 0; -if ( v2 != 5 ) -result = v2 == (DWORD)a2; -} -} -return result; + v2 = *(DWORD*)((char*)this + 134); + if (!v2) + return 0; + result = 1; + if (*(struct TEdgeSegment**)((char*)this + 114) != a2) + { + if (v2 == 1) + return 0; + if (*(struct TEdgeSegment**)((char*)this + 118) == a2) + return result; + if (v2 == 2) + return 0; + if (*(struct TEdgeSegment**)((char*)this + 122) == a2) + return result; + if (v2 == 3) + return 0; + if (*(struct TEdgeSegment**)((char*)this + 126) == a2) + return result; + if (v2 == 4) + return 0; + if (*(struct TEdgeSegment**)((char*)this + 130) != a2) + { + result = 0; + if (v2 != 5) + result = v2 == (DWORD)a2; + } + } + return result; } //----- (0101590F) -------------------------------------------------------- -void __thiscall TBall::not_again(TBall *this, struct TEdgeSegment *a2) +void __thiscall TBall::not_again(TBall* this, struct TEdgeSegment* a2) { -signed int v2; // edx + signed int v2; // edx -v2 = *(DWORD *)((char *)this + 134); -if ( v2 < 5 ) -{ -*(DWORD *)((char *)this + 4 * v2 + 114) = a2; -++*(DWORD *)((char *)this + 134); -} + v2 = *(DWORD*)((char*)this + 134); + if (v2 < 5) + { + *(DWORD*)((char*)this + 4 * v2 + 114) = a2; + ++* (DWORD*)((char*)this + 134); + } } //----- (01015B9C) -------------------------------------------------------- -int __thiscall TBall::Message(TBall *this, int a2, float a3) +int __thiscall TBall::Message(TBall* this, int a2, float a3) { -TBall *v3; // esi -int v4; // eax + TBall* v3; // esi + int v4; // eax -v3 = this; -if ( a2 == 1024 ) -{ -render_ball_set(*(DWORD *)((char *)this + 26), 0, 0.0, 0, 0); -v4 = *(DWORD *)((char *)v3 + 154); -*(float *)((char *)v3 + 42) = 0.0; -*(DWORD *)((char *)v3 + 106) = 0; -*(float *)((char *)v3 + 46) = 0.0; -*((_BYTE *)v3 + 5) = 0; -*(DWORD *)((char *)v3 + 150) = 0; -*(DWORD *)((char *)v3 + 110) = 1; -*(float *)((char *)v3 + 58) = 0.0; -*(DWORD *)((char *)v3 + 50) = v4; -*(float *)((char *)v3 + 54) = 0.0; -*(float *)((char *)v3 + 66) = 0.0; -*(float *)((char *)v3 + 70) = 0.0; -} -return 0; + v3 = this; + if (a2 == 1024) + { + render_ball_set(*(DWORD*)((char*)this + 26), 0, 0.0, 0, 0); + v4 = *(DWORD*)((char*)v3 + 154); + *(float*)((char*)v3 + 42) = 0.0; + *(DWORD*)((char*)v3 + 106) = 0; + *(float*)((char*)v3 + 46) = 0.0; + *((_BYTE*)v3 + 5) = 0; + *(DWORD*)((char*)v3 + 150) = 0; + *(DWORD*)((char*)v3 + 110) = 1; + *(float*)((char*)v3 + 58) = 0.0; + *(DWORD*)((char*)v3 + 50) = v4; + *(float*)((char*)v3 + 54) = 0.0; + *(float*)((char*)v3 + 66) = 0.0; + *(float*)((char*)v3 + 70) = 0.0; + } + return 0; } //----- (01015C08) -------------------------------------------------------- -void __thiscall TBall::Repaint(TBall *this) +void __thiscall TBall::Repaint(TBall* this) { -TBall *v1; // esi -double v2; // st7 -int v3; // edx -int v4; // edi -float *v5; // ebx -int v6; // ecx -float v7; // ST08_4 -int v8; // [esp+14h] [ebp-8h] -int v9; // [esp+18h] [ebp-4h] + TBall* v1; // esi + double v2; // st7 + int v3; // edx + int v4; // edi + float* v5; // ebx + int v6; // ecx + float v7; // ST08_4 + int v8; // [esp+14h] [ebp-8h] + int v9; // [esp+18h] [ebp-4h] -v1 = this; -if ( *(DWORD *)((char *)this + 150) ) -*(float *)((char *)this + 50) = *(float *)((char *)this + 142) * *(float *)((char *)this + 46) -+ *(float *)((char *)this + 138) * *(float *)((char *)this + 42) -+ *(float *)((char *)this + 154) -+ *(float *)((char *)this + 146); -proj_xform_to_2d((float *)((char *)this + 42), &v8); -v2 = proj_z_distance((char *)v1 + 42); -v3 = *(DWORD *)(*(DWORD *)((char *)v1 + 34) + 4); -v4 = 0; -if ( *(DWORD *)(v3 + 4) - 1 > 0 ) -{ -v5 = (float *)((char *)v1 + 162); -do -{ -if ( v2 >= *v5 ) -break; -++v4; -++v5; -} -while ( v4 < *(DWORD *)(v3 + 4) - 1 ); -} -v6 = *(DWORD *)(v3 + 4 * v4 + 8); -v8 += *(DWORD *)(v6 + 12) / -2; -v9 += *(DWORD *)(v6 + 16) / -2; -v7 = v2; -render_ball_set(*(DWORD *)((char *)v1 + 26), v6, v7, v8, v9); + v1 = this; + if (*(DWORD*)((char*)this + 150)) + * (float*)((char*)this + 50) = *(float*)((char*)this + 142) * *(float*)((char*)this + 46) + + *(float*)((char*)this + 138) * *(float*)((char*)this + 42) + + *(float*)((char*)this + 154) + + *(float*)((char*)this + 146); + proj_xform_to_2d((float*)((char*)this + 42), &v8); + v2 = proj_z_distance((char*)v1 + 42); + v3 = *(DWORD*)(*(DWORD*)((char*)v1 + 34) + 4); + v4 = 0; + if (*(DWORD*)(v3 + 4) - 1 > 0) + { + v5 = (float*)((char*)v1 + 162); + do + { + if (v2 >= *v5) + break; + ++v4; + ++v5; + } while (v4 < *(DWORD*)(v3 + 4) - 1); + } + v6 = *(DWORD*)(v3 + 4 * v4 + 8); + v8 += *(DWORD*)(v6 + 12) / -2; + v9 += *(DWORD*)(v6 + 16) / -2; + v7 = v2; + render_ball_set(*(DWORD*)((char*)v1 + 26), v6, v7, v8, v9); } // 1008ED8: using guessed type double proj_z_distance(DWORD); //----- (01019309) -------------------------------------------------------- -TBall *__thiscall TBall::TBall(TBall *this, struct TPinballTable *a2) +TBall* __thiscall TBall::TBall(TBall* this, struct TPinballTable* a2) { -TBall *v2; // esi -objlist_class *v3; // eax -objlist_class *v4; // ebx -objlist_class *v5; // eax -int v6; // ebx -objlist_class *v7; // ecx -int v8; // eax -double v9; // st7 -int v10; // eax -int v11; // ecx -char v13; // [esp+Ch] [ebp-50h] -void *v14; // [esp+4Ch] [ebp-10h] -int v15; // [esp+54h] [ebp-8h] -float *v16; // [esp+58h] [ebp-4h] -struct TPinballTable *v17; // [esp+64h] [ebp+8h] + TBall* v2; // esi + objlist_class* v3; // eax + objlist_class* v4; // ebx + objlist_class* v5; // eax + int v6; // ebx + objlist_class* v7; // ecx + int v8; // eax + double v9; // st7 + int v10; // eax + int v11; // ecx + char v13; // [esp+Ch] [ebp-50h] + void* v14; // [esp+4Ch] [ebp-10h] + int v15; // [esp+54h] [ebp-8h] + float* v16; // [esp+58h] [ebp-4h] + struct TPinballTable* v17; // [esp+64h] [ebp+8h] -v2 = this; -TPinballComponent::TPinballComponent(this, a2, -1, 0); -*(float *)((char *)v2 + 78) = 0.0; -*(DWORD *)v2 = &TBall::vftable; -*(float *)((char *)v2 + 70) = 0.0; -*((_BYTE *)v2 + 5) = 1; -*(DWORD *)((char *)v2 + 106) = 0; -*(DWORD *)((char *)v2 + 134) = 0; -*(float *)((char *)v2 + 74) = 0.0; -*(DWORD *)((char *)v2 + 110) = 1; -*(DWORD *)((char *)v2 + 150) = 0; -*(float *)((char *)v2 + 66) = 0.0; -*(float *)((char *)v2 + 58) = 0.0; -*(float *)((char *)v2 + 54) = 0.0; -*(float *)((char *)v2 + 86) = 1000000000.0; -*(float *)((char *)v2 + 82) = 1000000000.0; -*(float *)((char *)v2 + 42) = 0.0; -*(float *)((char *)v2 + 46) = 0.0; -v3 = (objlist_class *)operator new(8u); -v4 = v3; -if ( v3 ) -{ -objlist_class::objlist_class(v3, 0, 4); -v5 = v4; -} -else -{ -v5 = 0; -} -*(DWORD *)((char *)v2 + 34) = v5; -v6 = loader_query_handle("ball"); -*(DWORD *)((char *)v2 + 154) = *(DWORD *)loader_query_float_attribute(v6, 0, 500); -v15 = loader_query_visual_states(v6); -v17 = 0; -if ( v15 > 0 ) -{ -v16 = (float *)((char *)v2 + 162); -do -{ -loader_query_visual(v6, (signed int)v17, &v13); -v7 = *(objlist_class **)((char *)v2 + 34); -if ( v7 ) -objlist_class::Add(v7, v14); -v8 = loader_query_float_attribute(v6, (signed int)v17, 501); -v9 = proj_z_distance(v8); -v17 = (struct TPinballTable *)((char *)v17 + 1); -*v16 = v9; -++v16; -} -while ( (signed int)v17 < v15 ); -} -v10 = render_create_sprite(2, 0, 0, 0, 0, 0); -v11 = *(DWORD *)((char *)v2 + 154); -*(DWORD *)((char *)v2 + 26) = v10; -*(DWORD *)(*(DWORD *)((char *)v2 + 30) + 282) = v11; -*(DWORD *)((char *)v2 + 50) = *(DWORD *)((char *)v2 + 154); -return v2; + v2 = this; + TPinballComponent::TPinballComponent(this, a2, -1, 0); + *(float*)((char*)v2 + 78) = 0.0; + *(DWORD*)v2 = &TBall::vftable; + *(float*)((char*)v2 + 70) = 0.0; + *((_BYTE*)v2 + 5) = 1; + *(DWORD*)((char*)v2 + 106) = 0; + *(DWORD*)((char*)v2 + 134) = 0; + *(float*)((char*)v2 + 74) = 0.0; + *(DWORD*)((char*)v2 + 110) = 1; + *(DWORD*)((char*)v2 + 150) = 0; + *(float*)((char*)v2 + 66) = 0.0; + *(float*)((char*)v2 + 58) = 0.0; + *(float*)((char*)v2 + 54) = 0.0; + *(float*)((char*)v2 + 86) = 1000000000.0; + *(float*)((char*)v2 + 82) = 1000000000.0; + *(float*)((char*)v2 + 42) = 0.0; + *(float*)((char*)v2 + 46) = 0.0; + v3 = (objlist_class*)component_create(8u); + v4 = v3; + if (v3) + { + objlist_class::objlist_class(v3, 0, 4); + v5 = v4; + } + else + { + v5 = 0; + } + *(DWORD*)((char*)v2 + 34) = v5; + v6 = loader_query_handle("ball"); + *(DWORD*)((char*)v2 + 154) = *(DWORD*)loader_query_float_attribute(v6, 0, 500); + v15 = loader_query_visual_states(v6); + v17 = 0; + if (v15 > 0) + { + v16 = (float*)((char*)v2 + 162); + do + { + loader_query_visual(v6, (signed int)v17, &v13); + v7 = *(objlist_class * *)((char*)v2 + 34); + if (v7) + objlist_class::Add(v7, v14); + v8 = loader_query_float_attribute(v6, (signed int)v17, 501); + v9 = proj_z_distance(v8); + v17 = (struct TPinballTable*)((char*)v17 + 1); + *v16 = v9; + ++v16; + } while ((signed int)v17 < v15); + } + v10 = render_create_sprite(2, 0, 0, 0, 0, 0); + v11 = *(DWORD*)((char*)v2 + 154); + *(DWORD*)((char*)v2 + 26) = v10; + *(DWORD*)(*(DWORD*)((char*)v2 + 30) + 282) = v11; + *(DWORD*)((char*)v2 + 50) = *(DWORD*)((char*)v2 + 154); + return v2; } // 1002554: using guessed type void *TBall::vftable; // 1008ED8: using guessed type double proj_z_distance(DWORD); diff --git a/Classes/TCollisionComponent/TCollisionComponent.cpp b/Classes/TCollisionComponent/TCollisionComponent.cpp index 3767497..59cb244 100644 --- a/Classes/TCollisionComponent/TCollisionComponent.cpp +++ b/Classes/TCollisionComponent/TCollisionComponent.cpp @@ -1,415 +1,410 @@ #include "TCollisionComponent.h" //----- (01015A9A) -------------------------------------------------------- -void __thiscall TCollisionComponent::port_draw(TCollisionComponent *this) +void TCollisionComponent::port_draw(TCollisionComponent* this) { -TCollisionComponent *v1; // edi -int v2; // eax -int v3; // esi -int v4; // ebx + TCollisionComponent* v1; // edi + int v2; // eax + int v3; // esi + int v4; // ebx -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 -{ -(*(void (**)(void))(**(DWORD **)(v3 + *(DWORD *)((char *)v1 + 46)) + 4))(); -v3 -= 4; ---v4; -} -while ( v4 ); -} + 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 + { + (*(void (**)(void))(**(DWORD * *)(v3 + *(DWORD*)((char*)v1 + 46)) + 4))(); + v3 -= 4; + --v4; + } while (v4); + } } //----- (01017883) -------------------------------------------------------- -double basic_collision(struct TBall *a1, struct vector_type *a2, struct vector_type *a3, float a4, float a5, float a6, float a7) +double basic_collision(TBall* a1, vector_type* a2, vector_type* a3, float a4, float a5, float a6, float a7) { -int v7; // ST30_4 -float *v8; // esi -double v9; // st7 -unsigned __int8 v11; // c0 -unsigned __int8 v12; // c3 -double v13; // st7 -double v14; // st6 -float v15; // ST1C_4 -float v16; // ST20_4 -float v17; // ST10_4 -float v18; // ST20_4 -double v19; // st7 -float v21; // [esp+24h] [ebp-Ch] -float v22; // [esp+28h] [ebp-8h] -float v23; // [esp+3Ch] [ebp+Ch] -float v24; // [esp+3Ch] [ebp+Ch] + int v7; // ST30_4 + float* v8; // esi + double v9; // st7 + unsigned __int8 v11; // c0 + unsigned __int8 v12; // c3 + double v13; // st7 + double v14; // st6 + float v15; // ST1C_4 + float v16; // ST20_4 + float v17; // ST10_4 + float v18; // ST20_4 + double v19; // st7 + float v21; // [esp+24h] [ebp-Ch] + float v22; // [esp+28h] [ebp-8h] + float v23; // [esp+3Ch] [ebp+Ch] + float v24; // [esp+3Ch] [ebp+Ch] -*(float *)((char *)a1 + 42) = *(float *)a2; -*(DWORD *)((char *)a1 + 46) = *((DWORD *)a2 + 1); -v21 = *(float *)a3; -v22 = *((float *)a3 + 1); -v7 = *((DWORD *)a3 + 2); -v8 = (float *)((char *)a1 + 54); -v9 = -(v22 * *(float *)((char *)a1 + 58) + *(float *)a3 * *(float *)((char *)a1 + 54)); -v23 = v9; -if ( v11 | v12 ) -{ -v23 = -v9; -} -else -{ -v13 = v9 * v21; -v14 = v22 * v23; -v15 = v13 + *v8; -v16 = v14 + *(float *)((char *)a1 + 58); -v17 = v13 * a4; -v18 = v16 * a5; -*v8 = v15 * a5 + v17; -*(float *)((char *)a1 + 58) = v18 + v14 * a4; -normalize_2d((float *)((char *)a1 + 54)); -} -v24 = v23 * *(float *)((char *)a1 + 66); -v19 = *(float *)((char *)a1 + 66) - (1.0 - a4) * v24; -*(float *)((char *)a1 + 66) = v19; -if ( v24 >= (double)a6 ) -{ -*v8 = v19 * *v8 + v21 * a7; -*(float *)((char *)a1 + 58) = v19 * *(float *)((char *)a1 + 58) + v22 * a7; -*(float *)((char *)a1 + 66) = normalize_2d((float *)((char *)a1 + 54)); -} -return v24; + *(float*)((char*)a1 + 42) = *(float*)a2; + *(DWORD*)((char*)a1 + 46) = *((DWORD*)a2 + 1); + v21 = *(float*)a3; + v22 = *((float*)a3 + 1); + v7 = *((DWORD*)a3 + 2); + v8 = (float*)((char*)a1 + 54); + v9 = -(v22 * *(float*)((char*)a1 + 58) + *(float*)a3 * *(float*)((char*)a1 + 54)); + v23 = v9; + if (v11 | v12) + { + v23 = -v9; + } + else + { + v13 = v9 * v21; + v14 = v22 * v23; + v15 = v13 + *v8; + v16 = v14 + *(float*)((char*)a1 + 58); + v17 = v13 * a4; + v18 = v16 * a5; + *v8 = v15 * a5 + v17; + *(float*)((char*)a1 + 58) = v18 + v14 * a4; + normalize_2d((float*)((char*)a1 + 54)); + } + v24 = v23 * *(float*)((char*)a1 + 66); + v19 = *(float*)((char*)a1 + 66) - (1.0 - a4) * v24; + *(float*)((char*)a1 + 66) = v19; + if (v24 >= (double)a6) + { + *v8 = v19 * *v8 + v21 * a7; + *(float*)((char*)a1 + 58) = v19 * *(float*)((char*)a1 + 58) + v22 * a7; + *(float*)((char*)a1 + 66) = normalize_2d((float*)((char*)a1 + 54)); + } + return v24; } //----- (010179A9) -------------------------------------------------------- -struct TEdgeSegment *install_wall(float *a1, struct TCollisionComponent *a2, char *a3, unsigned int a4, float a5, void *a6) +struct TEdgeSegment* install_wall(float* a1, TCollisionComponent* a2, char* a3, int a4, float a5, void* a6) { -signed __int64 v6; // rax -float *v7; // esi -float *v8; // ecx -TCircle *v9; // eax -struct TCollisionComponent *v10; // edi -float v11; // ST14_4 -TCircle *v12; // esi -TLine *v13; // eax -double v14; // st7 -float v15; // eax -double v16; // st6 -float v17; // eax -TCircle *v18; // eax -float v19; // ST10_4 -TCircle *v20; // edi -int v21; // ebx -TLine *v22; // eax -TLine *v23; // esi -char v25; // [esp+10h] [ebp-6Ch] -float v26; // [esp+18h] [ebp-64h] -float v27; // [esp+20h] [ebp-5Ch] -float v28; // [esp+28h] [ebp-54h] -float v29; // [esp+2Ch] [ebp-50h] -float v30; // [esp+30h] [ebp-4Ch] -float v31; // [esp+34h] [ebp-48h] -float v32; // [esp+38h] [ebp-44h] -float v33; // [esp+3Ch] [ebp-40h] -float v34; // [esp+40h] [ebp-3Ch] -float v35; // [esp+44h] [ebp-38h] -int v36; // [esp+48h] [ebp-34h] -int v37; // [esp+4Ch] [ebp-30h] -int v38; // [esp+50h] [ebp-2Ch] -int v39; // [esp+58h] [ebp-24h] -int v40; // [esp+5Ch] [ebp-20h] -int v41; // [esp+64h] [ebp-18h] -float v42; // [esp+68h] [ebp-14h] -int v43; // [esp+6Ch] [ebp-10h] -float *v44; // [esp+70h] [ebp-Ch] -int v45; // [esp+74h] [ebp-8h] -TCircle *v46; // [esp+78h] [ebp-4h] -float *v47; // [esp+84h] [ebp+8h] + signed __int64 v6; // rax + float* v7; // esi + float* v8; // ecx + TCircle* v9; // eax + TCollisionComponent* v10; // edi + float v11; // ST14_4 + TCircle* v12; // esi + TLine* v13; // eax + double v14; // st7 + float v15; // eax + double v16; // st6 + float v17; // eax + TCircle* v18; // eax + float v19; // ST10_4 + TCircle* v20; // edi + int v21; // ebx + TLine* v22; // eax + TLine* v23; // esi + char v25; // [esp+10h] [ebp-6Ch] + float v26; // [esp+18h] [ebp-64h] + float v27; // [esp+20h] [ebp-5Ch] + float v28; // [esp+28h] [ebp-54h] + float v29; // [esp+2Ch] [ebp-50h] + float v30; // [esp+30h] [ebp-4Ch] + float v31; // [esp+34h] [ebp-48h] + float v32; // [esp+38h] [ebp-44h] + float v33; // [esp+3Ch] [ebp-40h] + float v34; // [esp+40h] [ebp-3Ch] + float v35; // [esp+44h] [ebp-38h] + int v36; // [esp+48h] [ebp-34h] + int v37; // [esp+4Ch] [ebp-30h] + int v38; // [esp+50h] [ebp-2Ch] + int v39; // [esp+58h] [ebp-24h] + int v40; // [esp+5Ch] [ebp-20h] + int v41; // [esp+64h] [ebp-18h] + float v42; // [esp+68h] [ebp-14h] + int v43; // [esp+6Ch] [ebp-10h] + float* v44; // [esp+70h] [ebp-Ch] + int v45; // [esp+74h] [ebp-8h] + TCircle* v46; // [esp+78h] [ebp-4h] + float* v47; // [esp+84h] [ebp+8h] -v6 = (signed __int64)(_floor(*a1) - 1.0); -v7 = a1 + 1; -v8 = a1 + 1; -v45 = v6; -v44 = a1 + 1; -if ( !(DWORD)v6 ) -{ -v41 = *(int *)v7; -v42 = a1[2]; -v9 = (TCircle *)operator new(0x25u); -v10 = a2; -if ( v9 ) -{ -v11 = a5 + a1[3]; -v12 = TCircle::TCircle(v9, a2, a3, a4, (struct vector_type *)&v41, v11); -} -else -{ -v12 = 0; -} -v46 = v12; -if ( !v12 ) -goto LABEL_14; -*(DWORD *)((char *)v12 + 13) = a6; -LABEL_13: -(*(void (__thiscall **)(TCircle *))(*(DWORD *)v12 + 8))(v12); -LABEL_14: -objlist_class::Add((struct TCollisionComponent *)((char *)v10 + 42), (void *)v12); -return v46; -} -if ( (DWORD)v6 == 1 ) -{ -v37 = *(DWORD *)v7; -v38 = *((DWORD *)a1 + 2); -v39 = *((DWORD *)a1 + 3); -v40 = *((DWORD *)a1 + 4); -v13 = (TLine *)operator new(0x55u); -v10 = a2; -if ( v13 ) -v12 = TLine::TLine(v13, a2, a3, a4, (struct vector_type *)&v37, (struct vector_type *)&v39); -else -v12 = 0; -v46 = v12; -if ( v12 ) -{ -*(DWORD *)((char *)v12 + 13) = a6; -TLine::Offset(v12, a5); -goto LABEL_13; -} -} -else -{ -*((float *)&v6 + 1) = v7[2 * (DWORD)v6 - 2]; -v47 = 0; -v33 = 0.0; -v34 = *((float *)&v6 + 1); -v30 = 0.0; -v35 = v7[2 * (DWORD)v6 - 1]; -if ( (signed int)v6 > 0 ) -{ -while ( 1 ) -{ -if ( (signed int)v47 >= (signed int)v6 - 1 ) -{ -v14 = *v8; -v15 = v8[1]; -} -else -{ -v14 = v7[2]; -v15 = v7[3]; -} -v16 = *v7; -v27 = v15; -v17 = v7[1]; -*(float *)&v41 = v16; -v42 = v17; -if ( 0.0 != a5 ) -{ -if ( (v28 = v16 - v34, -v29 = v42 - v35, -v31 = v14 - v16, -v32 = v27 - v42, -cross(&v28, &v31, (float *)&v25), -v26 > 0.0) -&& a5 > 0.0 -|| v26 < 0.0 && a5 < 0.0 ) -{ -v18 = (TCircle *)operator new(0x25u); -if ( v18 ) -{ -v19 = a5 * 1.001; -v20 = TCircle::TCircle(v18, a2, a3, a4, (struct vector_type *)&v41, v19); -} -else -{ -v20 = 0; -} -if ( v20 ) -{ -*(DWORD *)((char *)v20 + 13) = a6; -(*(void (__thiscall **)(TCircle *))(*(DWORD *)v20 + 8))(v20); -objlist_class::Add((struct TCollisionComponent *)((char *)a2 + 42), (void *)v20); -} -} -} -v37 = *(DWORD *)v7; -v38 = *((DWORD *)v7 + 1); -v21 = (int)(v7 + 2); -v39 = *((DWORD *)v7 + 2); -v40 = *((DWORD *)v7 + 3); -v22 = (TLine *)operator new(0x55u); -if ( v22 ) -v23 = TLine::TLine(v22, a2, a3, a4, (struct vector_type *)&v37, (struct vector_type *)&v39); -else -v23 = 0; -v46 = v23; -if ( v23 ) -{ -*(DWORD *)((char *)v23 + 13) = a6; -TLine::Offset(v23, a5); -(*(void (__thiscall **)(TLine *))(*(DWORD *)v23 + 8))(v23); -objlist_class::Add((struct TCollisionComponent *)((char *)a2 + 42), (void *)v23); -} -v47 = (float *)((char *)v47 + 1); -v34 = *(float *)&v41; -v35 = v42; -v36 = v43; -v7 = (float *)v21; -if ( (signed int)v47 >= v45 ) -break; -v8 = v44; -LODWORD(v6) = v45; -} -} -} -return v46; + v6 = (signed __int64)(_floor(*a1) - 1.0); + v7 = a1 + 1; + v8 = a1 + 1; + v45 = v6; + v44 = a1 + 1; + if (!(DWORD)v6) + { + v41 = *(int*)v7; + v42 = a1[2]; + v9 = (TCircle*)component_create(0x25u); + v10 = a2; + if (v9) + { + v11 = a5 + a1[3]; + v12 = TCircle::TCircle(v9, a2, a3, a4, (struct vector_type*) & v41, v11); + } + else + { + v12 = 0; + } + v46 = v12; + if (!v12) + goto LABEL_14; + *(DWORD*)((char*)v12 + 13) = a6; + LABEL_13: + (*(void(__thiscall * *)(TCircle*))(*(DWORD*)v12 + 8))(v12); + LABEL_14: + objlist_class::Add((TCollisionComponent*)((char*)v10 + 42), (void*)v12); + return v46; + } + if ((DWORD)v6 == 1) + { + v37 = *(DWORD*)v7; + v38 = *((DWORD*)a1 + 2); + v39 = *((DWORD*)a1 + 3); + v40 = *((DWORD*)a1 + 4); + v13 = (TLine*)component_create(0x55u); + v10 = a2; + if (v13) + v12 = TLine::TLine(v13, a2, a3, a4, (struct vector_type*) & v37, (struct vector_type*) & v39); + else + v12 = 0; + v46 = v12; + if (v12) + { + *(DWORD*)((char*)v12 + 13) = a6; + TLine::Offset(v12, a5); + goto LABEL_13; + } + } + else + { + *((float*)& v6 + 1) = v7[2 * (DWORD)v6 - 2]; + v47 = 0; + v33 = 0.0; + v34 = *((float*)& v6 + 1); + v30 = 0.0; + v35 = v7[2 * (DWORD)v6 - 1]; + if ((signed int)v6 > 0) + { + while (1) + { + if ((signed int)v47 >= (signed int)v6 - 1) + { + v14 = *v8; + v15 = v8[1]; + } + else + { + v14 = v7[2]; + v15 = v7[3]; + } + v16 = *v7; + v27 = v15; + v17 = v7[1]; + *(float*)& v41 = v16; + v42 = v17; + if (0.0 != a5) + { + if ((v28 = v16 - v34, + v29 = v42 - v35, + v31 = v14 - v16, + v32 = v27 - v42, + cross(&v28, &v31, (float*)& v25), + v26 > 0.0) + && a5 > 0.0 + || v26 < 0.0 && a5 < 0.0) + { + v18 = (TCircle*)component_create(0x25u); + if (v18) + { + v19 = a5 * 1.001; + v20 = TCircle::TCircle(v18, a2, a3, a4, (struct vector_type*) & v41, v19); + } + else + { + v20 = 0; + } + if (v20) + { + *(DWORD*)((char*)v20 + 13) = a6; + (*(void(__thiscall * *)(TCircle*))(*(DWORD*)v20 + 8))(v20); + objlist_class::Add((struct TCollisionComponent*)((char*)a2 + 42), (void*)v20); + } + } + } + v37 = *(DWORD*)v7; + v38 = *((DWORD*)v7 + 1); + v21 = (int)(v7 + 2); + v39 = *((DWORD*)v7 + 2); + v40 = *((DWORD*)v7 + 3); + v22 = (TLine*)component_create(0x55u); + if (v22) + v23 = TLine::TLine(v22, a2, a3, a4, (vector_type*) & v37, (vector_type*) & v39); + else + v23 = 0; + v46 = v23; + if (v23) + { + *(DWORD*)((char*)v23 + 13) = a6; + TLine::Offset(v23, a5); + (*(void(__thiscall * *)(TLine*))(*(DWORD*)v23 + 8))(v23); + objlist_class::Add((TCollisionComponent*)((char*)a2 + 42), (void*)v23); + } + v47 = (float*)((char*)v47 + 1); + v34 = *(float*)& v41; + v35 = v42; + v36 = v43; + v7 = (float*)v21; + if ((signed int)v47 >= v45) + break; + v8 = v44; + LODWORD(v6) = v45; + } + } + } + return v46; } //----- (01017E85) -------------------------------------------------------- -void __thiscall TCollisionComponent::Collision(TCollisionComponent *this, struct TBall *a2, struct vector_type *a3, struct vector_type *a4, float a5, struct TEdgeSegment *a6) +void TCollisionComponent::Collision(TBall* a2, vector_type* a3, vector_type* a4, float a5, TEdgeSegment* a6) { -TCollisionComponent *v6; // esi -double v7; // st7 -int v8; // esi + double collision; // st7 + int sound_id; // esi -v6 = this; -if ( *(DWORD *)(*(DWORD *)((char *)this + 30) + 370) ) -{ -basic_collision(a2, a3, a4, *(float *)((char *)this + 54), *(float *)((char *)this + 58), 1000000000.0, 0.0); -return; -} -v7 = basic_collision( -a2, -a3, -a4, -*(float *)((char *)this + 54), -*(float *)((char *)this + 58), -*(float *)((char *)this + 66), -*(float *)((char *)this + 62)); -if ( v7 <= *(float *)((char *)v6 + 66) ) -{ -if ( v7 <= 0.2 ) -return; -v8 = *(DWORD *)((char *)v6 + 70); -} -else -{ -v8 = *(DWORD *)((char *)v6 + 74); -} -if ( v8 ) -loader_play_sound(v8); + if (*(DWORD*)(*(DWORD*)((char*)this + 30) + 370)) + { + basic_collision(a2, a3, a4, *(float*)((char*)this + 54), *(float*)((char*)this + 58), 1000000000.0, 0.0); + return; + } + collision = basic_collision( + a2, + a3, + a4, + *(float*)((char*)this + 54), + *(float*)((char*)this + 58), + *(float*)((char*)this + 66), + *(float*)((char*)this + 62)); + if (collision <= *(float*)((char*)this + 66)) + { + if (collision <= 0.2) + return; + sound_id = *(DWORD*)((char*)this + 70); + } + else + { + sound_id = *(DWORD*)((char*)this + 74); + } + if (sound_id) + loader_play_sound(sound_id); } //----- (01017F29) -------------------------------------------------------- -int __thiscall TCollisionComponent::DefaultCollision(TCollisionComponent *this, struct TBall *a2, struct vector_type *a3, struct vector_type *a4) +int TCollisionComponent::DefaultCollision(TBall* a2, vector_type* a3, vector_type* a4) { -TCollisionComponent *v4; // esi -double v5; // st7 -int v6; // esi -int v8; // esi + double collision; // st7 + int sound_id; // esi + int v8; // esi -v4 = this; -if ( *(DWORD *)(*(DWORD *)((char *)this + 30) + 370) ) -{ -basic_collision(a2, a3, a4, *(float *)((char *)this + 54), *(float *)((char *)this + 58), 1000000000.0, 0.0); -return 0; -} -v5 = basic_collision( -a2, -a3, -a4, -*(float *)((char *)this + 54), -*(float *)((char *)this + 58), -*(float *)((char *)this + 66), -*(float *)((char *)this + 62)); -if ( v5 <= *(float *)((char *)v4 + 66) ) -{ -if ( v5 > 0.2 ) -{ -v8 = *(DWORD *)((char *)v4 + 70); -if ( v8 ) -loader_play_sound(v8); -} -return 0; -} -v6 = *(DWORD *)((char *)v4 + 74); -if ( v6 ) -loader_play_sound(v6); -return 1; + if (*(DWORD*)(*(DWORD*)((char*)this + 30) + 370)) + { + basic_collision(a2, a3, a4, *(float*)((char*)this + 54), *(float*)((char*)this + 58), 1000000000.0, 0.0); + return 0; + } + collision = basic_collision( + a2, + a3, + a4, + *(float*)((char*)this + 54), + *(float*)((char*)this + 58), + *(float*)((char*)this + 66), + *(float*)((char*)this + 62)); + if (collision <= *(float*)((char*)this + 66)) + { + if (collision > 0.2) + { + v8 = *(DWORD*)((char*)this + 70); + if (v8) + loader_play_sound(v8); + } + return 0; + } + sound_id = *(DWORD*)((char*)this + 74); + if (sound_id) + loader_play_sound(sound_id); + return 1; } //----- (010190B3) -------------------------------------------------------- -TCollisionComponent *__thiscall TCollisionComponent::TCollisionComponent(TCollisionComponent *this, struct TPinballTable *a2, int a3, int a4) +TCollisionComponent* TCollisionComponent::TCollisionComponent(TCollisionComponent* this, struct TPinballTable* a2, int a3, int a4) { -TCollisionComponent *v4; // esi -bool v5; // zf -float v6; // ST18_4 -unsigned int v7; // ST14_4 -float *v8; // eax -int v10; // [esp+14h] [ebp-48h] -int v11; // [esp+18h] [ebp-44h] -int v12; // [esp+24h] [ebp-38h] -int v13; // [esp+28h] [ebp-34h] -int v14; // [esp+2Ch] [ebp-30h] -int v15; // [esp+44h] [ebp-18h] -unsigned int v16; // [esp+48h] [ebp-14h] + TCollisionComponent* v4; // esi + bool v5; // zf + float v6; // ST18_4 + unsigned int v7; // ST14_4 + float* v8; // eax + int v10; // [esp+14h] [ebp-48h] + int v11; // [esp+18h] [ebp-44h] + int v12; // [esp+24h] [ebp-38h] + int v13; // [esp+28h] [ebp-34h] + int v14; // [esp+2Ch] [ebp-30h] + int v15; // [esp+44h] [ebp-18h] + unsigned int v16; // [esp+48h] [ebp-14h] -v4 = this; -TPinballComponent::TPinballComponent(this, a2, a3, 1); -*(DWORD *)v4 = &TCollisionComponent::vftable; -objlist_class::objlist_class((TCollisionComponent *)((char *)v4 + 42), 4, 4); -v5 = *(DWORD *)((char *)v4 + 10) == 0; -*((_BYTE *)v4 + 5) = 1; -if ( !v5 ) -*((_BYTE *)v4 + 4) = 1; -if ( a3 <= 0 ) -{ -loader_default_vsi(&v10); -} -else -{ -loader_query_visual(a3, 0, &v10); -if ( a4 ) -{ -v6 = *(float *)((char *)a2 + 282); -v7 = v16; -v8 = (float *)loader_query_float_attribute(a3, 0, 600); -install_wall(v8, v4, (char *)v4 + 5, v7, v6, 0); -} -} -*(DWORD *)((char *)v4 + 66) = v13; -*(DWORD *)((char *)v4 + 54) = v11; -*(DWORD *)((char *)v4 + 58) = v10; -*(DWORD *)((char *)v4 + 62) = v14; -*(DWORD *)((char *)v4 + 74) = v15; -*(DWORD *)((char *)v4 + 70) = v12; -*(DWORD *)((char *)v4 + 22) = a3; -return v4; + v4 = this; + TPinballComponent::TPinballComponent(this, a2, a3, 1); + *(DWORD*)v4 = &TCollisionComponent::vftable; + objlist_class::objlist_class((TCollisionComponent*)((char*)v4 + 42), 4, 4); + v5 = *(DWORD*)((char*)v4 + 10) == 0; + *((_BYTE*)v4 + 5) = 1; + if (!v5) + * ((_BYTE*)v4 + 4) = 1; + if (a3 <= 0) + { + loader_default_vsi(&v10); + } + else + { + loader_query_visual(a3, 0, &v10); + if (a4) + { + v6 = *(float*)((char*)a2 + 282); + v7 = v16; + v8 = (float*)loader_query_float_attribute(a3, 0, 600); + install_wall(v8, v4, (char*)v4 + 5, v7, v6, 0); + } + } + *(DWORD*)((char*)v4 + 66) = v13; + *(DWORD*)((char*)v4 + 54) = v11; + *(DWORD*)((char*)v4 + 58) = v10; + *(DWORD*)((char*)v4 + 62) = v14; + *(DWORD*)((char*)v4 + 74) = v15; + *(DWORD*)((char*)v4 + 70) = v12; + *(DWORD*)((char*)v4 + 22) = a3; + return v4; } // 10024EC: using guessed type void *TCollisionComponent::vftable; //----- (01019172) -------------------------------------------------------- -TZmapList *__thiscall TCollisionComponent::~TCollisionComponent(TCollisionComponent *this) +TZmapList* TCollisionComponent::~TCollisionComponent() { -TCollisionComponent *v1; // esi -int v2; // eax -int v3; // eax -void *v4; // edi + TCollisionComponent* v1; // esi + int v2; // eax + int v3; // eax + void* v4; // edi -v1 = this; -v2 = *(DWORD *)((char *)this + 46); -*(DWORD *)this = &TCollisionComponent::vftable; -if ( *(DWORD *)(v2 + 4) ) -{ -do -{ -v3 = *(DWORD *)((char *)v1 + 46); -v4 = *(void **)(v3 + 8); -objlist_delete_object(*(DWORD *)((char *)v1 + 46), *(DWORD *)(v3 + 8)); -operator delete(v4); -} -while ( *(DWORD *)(*(DWORD *)((char *)v1 + 46) + 4) ); -} -objlist_destroy(*(DWORD *)((char *)v1 + 46)); -return TPinballComponent::~TPinballComponent(v1); + v2 = *(DWORD*)((char*)this + 46); + *(DWORD*)this = &TCollisionComponent::vftable; + if (*(DWORD*)(v2 + 4)) + { + do + { + v3 = *(DWORD*)((char*)this + 46); + v4 = *(void**)(v3 + 8); + objlist_delete_object(*(DWORD*)((char*)this + 46), *(DWORD*)(v3 + 8)); + component_delete(v4); + } while (*(DWORD*)(*(DWORD*)((char*)this + 46) + 4)); + } + objlist_destroy(*(DWORD*)((char*)this + 46)); + + // TODO: FIXME: needs to be called on an object + return TPinballComponent::~TPinballComponent(this); } // 10024EC: using guessed type void *TCollisionComponent::vftable; diff --git a/Classes/TComponentGroup/TComponentGroup.cpp b/Classes/TComponentGroup/TComponentGroup.cpp index de3798e..172cf85 100644 --- a/Classes/TComponentGroup/TComponentGroup.cpp +++ b/Classes/TComponentGroup/TComponentGroup.cpp @@ -1,60 +1,59 @@ #include "TComponentGroup.h" //----- (010159DC) -------------------------------------------------------- -void TComponentGroup::NotifyTimerExpired(int a1, struct TPinballComponent *a2) +void TComponentGroup::NotifyTimerExpired(int a1, struct TPinballComponent* a2) { -*(DWORD *)((char *)a2 + 50) = 0; -control_handler(61, a2); + *(DWORD*)((char*)a2 + 50) = 0; + control_handler(61, a2); } //----- (010159F9) -------------------------------------------------------- -int __thiscall TComponentGroup::Message(TComponentGroup *this, int a2, float a3) +int __thiscall TComponentGroup::Message(TComponentGroup* this, int a2, float a3) { -TComponentGroup *v3; // esi -int v4; // eax -int v5; // edi -int v6; // ebx + TComponentGroup* v3; // esi + int v4; // eax + int v5; // edi + int v6; // ebx -v3 = this; -if ( a2 == 48 ) -{ -if ( *(DWORD *)((char *)this + 50) ) -{ -timer_kill(*(DWORD *)((char *)this + 50)); -*(DWORD *)((char *)v3 + 50) = 0; -} -if ( a3 > 0.0 ) -*(DWORD *)((char *)v3 + 50) = timer_set(a3, (int)v3, (int)TComponentGroup::NotifyTimerExpired); -} -else if ( a2 <= 1007 || a2 > 1011 && a2 != 1020 && a2 != 1022 ) -{ -v4 = *(DWORD *)(*(DWORD *)((char *)this + 46) + 4) - 1; -if ( v4 >= 0 ) -{ -v5 = 4 * v4 + 8; -v6 = *(DWORD *)(*(DWORD *)((char *)this + 46) + 4); -do -{ -(***(void (****)(int, DWORD))(v5 + *(DWORD *)((char *)v3 + 46)))(a2, LODWORD(a3)); -v5 -= 4; ---v6; -} -while ( v6 ); -} -} -return 0; + v3 = this; + if (a2 == 48) + { + if (*(DWORD*)((char*)this + 50)) + { + timer_kill(*(DWORD*)((char*)this + 50)); + *(DWORD*)((char*)v3 + 50) = 0; + } + if (a3 > 0.0) + * (DWORD*)((char*)v3 + 50) = timer_set(a3, (int)v3, (int)TComponentGroup::NotifyTimerExpired); + } + else if (a2 <= 1007 || a2 > 1011 && a2 != 1020 && a2 != 1022) + { + v4 = *(DWORD*)(*(DWORD*)((char*)this + 46) + 4) - 1; + if (v4 >= 0) + { + v5 = 4 * v4 + 8; + v6 = *(DWORD*)(*(DWORD*)((char*)this + 46) + 4); + do + { + (***(void (****)(int, DWORD))(v5 + *(DWORD*)((char*)v3 + 46)))(a2, LODWORD(a3)); + v5 -= 4; + --v6; + } while (v6); + } + } + return 0; } //----- (0101AA81) -------------------------------------------------------- -TComponentGroup *__thiscall TComponentGroup::destroy(TComponentGroup *this, char a2) +TComponentGroup* __thiscall TComponentGroup::destroy(TComponentGroup* this, char a2) { -TComponentGroup *v2; // esi + TComponentGroup* v2; // esi -v2 = this; -TComponentGroup::~TComponentGroup(this); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + TComponentGroup::~TComponentGroup(this); + if (a2 & 1) + component_delete((void*)v2); + return v2; } //----- (01018FFD) -------------------------------------------------------- diff --git a/Classes/TEdgeBox/TEdgeBox.cpp b/Classes/TEdgeBox/TEdgeBox.cpp index 3576da4..d0694d3 100644 --- a/Classes/TEdgeBox/TEdgeBox.cpp +++ b/Classes/TEdgeBox/TEdgeBox.cpp @@ -5,50 +5,50 @@ #include "TEdgeBox.h" //----- (0100B0D1) -------------------------------------------------------- -TEdgeBox *__thiscall TEdgeBox::TEdgeBox(TEdgeBox *this) +TEdgeBox* __thiscall TEdgeBox::TEdgeBox(TEdgeBox* this) { - TEdgeBox *v1; // esi + TEdgeBox* v1; // esi - v1 = this; - objlist_class::objlist_class(this, 0, 4); - objlist_class::objlist_class((TEdgeBox *)((char *)v1 + 8), 0, 1); - return v1; + v1 = this; + objlist_class::objlist_class(this, 0, 4); + objlist_class::objlist_class((TEdgeBox*)((char*)v1 + 8), 0, 1); + return v1; } //----- (0100B2C9) -------------------------------------------------------- -void __thiscall TEdgeBox::~TEdgeBox(TEdgeBox *this) +void __thiscall TEdgeBox::~TEdgeBox(TEdgeBox* this) { - TEdgeBox *v1; // esi + TEdgeBox* v1; // esi - v1 = this; - objlist_destroy(*((DWORD *)this + 3)); - objlist_destroy(*((DWORD *)v1 + 1)); + v1 = this; + objlist_destroy(*((DWORD*)this + 3)); + objlist_destroy(*((DWORD*)v1 + 1)); } //----- (0100B90E) -------------------------------------------------------- -TEdgeBox *__thiscall TEdgeBox::`vector deleting destructor'(TEdgeBox *this, char a2) +TEdgeBox* __thiscall TEdgeBox::destroy(TEdgeBox* this, char a2) { -TEdgeBox *v2; // edi -TEdgeBox *result; // eax + TEdgeBox* v2; // edi + TEdgeBox* result; // eax -v2 = this; -if ( a2 & 2 ) -{ -destroy( -(void *)this, -0x10u, -*((DWORD *)this - 1), -(void (__thiscall *)(void *))TEdgeBox::~TEdgeBox); -if ( a2 & 1 ) -operator delete((char *)v2 - 4); -result = (TEdgeBox *)((char *)v2 - 4); -} -else -{ -TEdgeBox::~TEdgeBox(this); -if ( a2 & 1 ) -operator delete((void *)v2); -result = v2; -} -return result; + v2 = this; + if (a2 & 2) + { + destroy( + (void*)this, + 0x10u, + *((DWORD*)this - 1), + (void(__thiscall*)(void*))TEdgeBox::~TEdgeBox); + if (a2 & 1) + component_delete((char*)v2 - 4); + result = (TEdgeBox*)((char*)v2 - 4); + } + else + { + TEdgeBox::~TEdgeBox(this); + if (a2 & 1) + component_delete((void*)v2); + result = v2; + } + return result; } diff --git a/Classes/TEdgeBox/TEdgeBox.h b/Classes/TEdgeBox/TEdgeBox.h index f52717a..6f7f690 100644 --- a/Classes/TEdgeBox/TEdgeBox.h +++ b/Classes/TEdgeBox/TEdgeBox.h @@ -12,7 +12,7 @@ struct TEdgeBox; TEdgeBox* __thiscall TEdgeBox::TEdgeBox(TEdgeBox* this); void __thiscall TEdgeBox::~TEdgeBox(TEdgeBox* this); -TEdgeBox* __thiscall TEdgeBox::`vector deleting destructor`(TEdgeBox *this, char a2); +TEdgeBox* __thiscall TEdgeBox::destroy(TEdgeBox *this, char a2); #endif //PINBALL_TEDGEBOX_H diff --git a/Classes/TEdgeManager/TEdgeManager.cpp b/Classes/TEdgeManager/TEdgeManager.cpp index ac17eae..4bb63c6 100644 --- a/Classes/TEdgeManager/TEdgeManager.cpp +++ b/Classes/TEdgeManager/TEdgeManager.cpp @@ -5,537 +5,528 @@ #include "TEdgeManager.h" //----- (0100B0F4) -------------------------------------------------------- -signed __int64 __thiscall TEdgeManager::box_x(TEdgeManager *this, float a2) +signed __int64 __thiscall TEdgeManager::box_x(TEdgeManager* this, float a2) { -TEdgeManager *v2; // esi -double v3; // st7 -double v4; // st7 -double v6; // [esp+Ch] [ebp-8h] -double v7; // [esp+Ch] [ebp-8h] + TEdgeManager* v2; // esi + double v3; // st7 + double v4; // st7 + double v6; // [esp+Ch] [ebp-8h] + double v7; // [esp+Ch] [ebp-8h] -v2 = this; -v6 = (double)(*((DWORD *)this + 4) - 1); -if ( _floor((a2 - *((float *)this + 6)) * *((float *)this + 2)) >= v6 ) -v3 = v6; -else -v3 = _floor((a2 - *((float *)v2 + 6)) * *((float *)v2 + 2)); -if ( v3 <= 0.0 ) -{ -v4 = 0.0; -} -else -{ -v7 = (double)(*((DWORD *)v2 + 4) - 1); -if ( _floor((a2 - *((float *)v2 + 6)) * *((float *)v2 + 2)) >= v7 ) -v4 = v7; -else -v4 = _floor((a2 - *((float *)v2 + 6)) * *((float *)v2 + 2)); -} -return (signed __int64)v4; + v2 = this; + v6 = (double)(*((DWORD*)this + 4) - 1); + if (_floor((a2 - *((float*)this + 6)) * *((float*)this + 2)) >= v6) + v3 = v6; + else + v3 = _floor((a2 - *((float*)v2 + 6)) * *((float*)v2 + 2)); + if (v3 <= 0.0) + { + v4 = 0.0; + } + else + { + v7 = (double)(*((DWORD*)v2 + 4) - 1); + if (_floor((a2 - *((float*)v2 + 6)) * *((float*)v2 + 2)) >= v7) + v4 = v7; + else + v4 = _floor((a2 - *((float*)v2 + 6)) * *((float*)v2 + 2)); + } + return (signed __int64)v4; } //----- (0100B1AE) -------------------------------------------------------- -signed __int64 __thiscall TEdgeManager::box_y(TEdgeManager *this, float a2) +signed __int64 __thiscall TEdgeManager::box_y(TEdgeManager* this, float a2) { -TEdgeManager *v2; // esi -double v3; // st7 -double v4; // st7 -double v6; // [esp+Ch] [ebp-8h] -double v7; // [esp+Ch] [ebp-8h] + TEdgeManager* v2; // esi + double v3; // st7 + double v4; // st7 + double v6; // [esp+Ch] [ebp-8h] + double v7; // [esp+Ch] [ebp-8h] -v2 = this; -v6 = (double)(*((DWORD *)this + 5) - 1); -if ( _floor((a2 - *((float *)this + 7)) * *((float *)this + 3)) >= v6 ) -v3 = v6; -else -v3 = _floor((a2 - *((float *)v2 + 7)) * *((float *)v2 + 3)); -if ( v3 <= 0.0 ) -{ -v4 = 0.0; -} -else -{ -v7 = (double)(*((DWORD *)v2 + 5) - 1); -if ( _floor((a2 - *((float *)v2 + 7)) * *((float *)v2 + 3)) >= v7 ) -v4 = v7; -else -v4 = _floor((a2 - *((float *)v2 + 7)) * *((float *)v2 + 3)); -} -return (signed __int64)v4; + v2 = this; + v6 = (double)(*((DWORD*)this + 5) - 1); + if (_floor((a2 - *((float*)this + 7)) * *((float*)this + 3)) >= v6) + v3 = v6; + else + v3 = _floor((a2 - *((float*)v2 + 7)) * *((float*)v2 + 3)); + if (v3 <= 0.0) + { + v4 = 0.0; + } + else + { + v7 = (double)(*((DWORD*)v2 + 5) - 1); + if (_floor((a2 - *((float*)v2 + 7)) * *((float*)v2 + 3)) >= v7) + v4 = v7; + else + v4 = _floor((a2 - *((float*)v2 + 7)) * *((float*)v2 + 3)); + } + return (signed __int64)v4; } //----- (0100B268) -------------------------------------------------------- -int __thiscall TEdgeManager::increment_box_x(TEdgeManager *this, int a2) +int __thiscall TEdgeManager::increment_box_x(TEdgeManager* this, int a2) { -int result; // eax + int result; // eax -result = *((DWORD *)this + 4) - 1; -if ( a2 + 1 < result ) -result = a2 + 1; -return result; + result = *((DWORD*)this + 4) - 1; + if (a2 + 1 < result) + result = a2 + 1; + return result; } //----- (0100B284) -------------------------------------------------------- -int __thiscall TEdgeManager::increment_box_y(TEdgeManager *this, int a2) +int __thiscall TEdgeManager::increment_box_y(TEdgeManager* this, int a2) { -int result; // eax + int result; // eax -result = *((DWORD *)this + 5) - 1; -if ( a2 + 1 < result ) -result = a2 + 1; -return result; + result = *((DWORD*)this + 5) - 1; + if (a2 + 1 < result) + result = a2 + 1; + return result; } //----- (0100B2A0) -------------------------------------------------------- -void create(void *a1, unsigned int a2, int a3, void *(__thiscall *a4)(void *)) +void create(void* a1, unsigned int a2, int a3, void* (__thiscall* a4)(void*)) { -char *v4; // esi -int v5; // edi + char* v4; // esi + int v5; // edi -if ( a3 - 1 >= 0 ) -{ -v4 = (char *)a1; -v5 = a3; -do -{ -a4(v4); -v4 += a2; ---v5; -} -while ( v5 ); -} + if (a3 - 1 >= 0) + { + v4 = (char*)a1; + v5 = a3; + do + { + a4(v4); + v4 += a2; + --v5; + } while (v5); + } } //----- (0100B2E5) -------------------------------------------------------- -void destroy(void *a1, unsigned int a2, int a3, void (__thiscall *a4)(void *)) +void destroy(void* a1, unsigned int a2, int a3, void(__thiscall* a4)(void*)) { -char *v4; // edi -int v5; // esi + char* v4; // edi + int v5; // esi -v4 = (char *)a1 + a3 * a2; -if ( a3 - 1 >= 0 ) -{ -v5 = a3; -do -{ -v4 -= a2; -a4(v4); ---v5; -} -while ( v5 ); -} + v4 = (char*)a1 + a3 * a2; + if (a3 - 1 >= 0) + { + v5 = a3; + do + { + v4 -= a2; + a4(v4); + --v5; + } while (v5); + } } //----- (0100B316) -------------------------------------------------------- -void __thiscall TEdgeManager::FieldEffects(TEdgeManager *this, struct TBall *a2, struct vector_type *a3) +void __thiscall TEdgeManager::FieldEffects(TEdgeManager* this, struct TBall* a2, struct vector_type* a3) { -struct TBall *v3; // ebx -TEdgeManager *v4; // edi -int v5; // eax -int v6; // esi -int v7; // eax -int v8; // edi -int v9; // eax -char v10; // [esp+10h] [ebp-Ch] -struct TBall *v11; // [esp+24h] [ebp+8h] + struct TBall* v3; // ebx + TEdgeManager* v4; // edi + int v5; // eax + int v6; // esi + int v7; // eax + int v8; // edi + int v9; // eax + char v10; // [esp+10h] [ebp-Ch] + struct TBall* v11; // [esp+24h] [ebp+8h] -v3 = a2; -v4 = this; -v5 = TEdgeManager::box_x(this, *(float *)((char *)a2 + 42)); -v6 = *((DWORD *)v4 + 8) - + 16 * (v5 + (unsigned __int64)TEdgeManager::box_y(v4, *(float *)((char *)a2 + 46)) * *((DWORD *)v4 + 4)); -v7 = *(DWORD *)(*(DWORD *)(v6 + 12) + 4) - 1; -if ( v7 >= 0 ) -{ -v8 = 4 * v7 + 8; -v11 = *(struct TBall **)(*(DWORD *)(v6 + 12) + 4); -do -{ -v9 = *(DWORD *)(v8 + *(DWORD *)(v6 + 12)); -if ( **(_BYTE **)v9 && *(DWORD *)((_BYTE *)v3 + 110) & *(DWORD *)(v9 + 4) ) -{ -if ( (*(int (__thiscall **)(DWORD, struct TBall *, char *))(**(DWORD **)(v9 + 8) + 24))( -*(DWORD *)(v9 + 8), -v3, -&v10) ) -{ -vector_add(a3, (struct vector_type *)&v10); -} -} -v8 -= 4; -v11 = (struct TBall *)((char *)v11 - 1); -} -while ( v11 ); -} + v3 = a2; + v4 = this; + v5 = TEdgeManager::box_x(this, *(float*)((char*)a2 + 42)); + v6 = *((DWORD*)v4 + 8) + + 16 * (v5 + (unsigned __int64)TEdgeManager::box_y(v4, *(float*)((char*)a2 + 46)) * *((DWORD*)v4 + 4)); + v7 = *(DWORD*)(*(DWORD*)(v6 + 12) + 4) - 1; + if (v7 >= 0) + { + v8 = 4 * v7 + 8; + v11 = *(struct TBall**)(*(DWORD*)(v6 + 12) + 4); + do + { + v9 = *(DWORD*)(v8 + *(DWORD*)(v6 + 12)); + if (**(_BYTE * *)v9 && *(DWORD*)((_BYTE*)v3 + 110) & *(DWORD*)(v9 + 4)) + { + if ((*(int(__thiscall * *)(DWORD, struct TBall*, char*))(**(DWORD * *)(v9 + 8) + 24))( + *(DWORD*)(v9 + 8), + v3, + &v10)) + { + vector_add(a3, (struct vector_type*) & v10); + } + } + v8 -= 4; + v11 = (struct TBall*)((char*)v11 - 1); + } while (v11); + } } //----- (0100B3AE) -------------------------------------------------------- -int TEdgeManager::TestGridBox(TEdgeManager *this, double a2@, int a3, int a4, float *a5, struct TEdgeSegment **a6, struct ray_type *a7, struct TBall *a8, int a9) +int TEdgeManager::TestGridBox(TEdgeManager* this, double a2@ , int a3, int a4, float* a5, struct TEdgeSegment** a6, struct ray_type* a7, struct TBall* a8, int a9) { -int v9; // edi -int v10; // eax -int **v11; // ebx -int *v12; // esi -int v13; // eax -int v14; // eax -int v16; // [esp+8h] [ebp+8h] -int v17; // [esp+Ch] [ebp+Ch] + int v9; // edi + int v10; // eax + int** v11; // ebx + int* v12; // esi + int v13; // eax + int v14; // eax + int v16; // [esp+8h] [ebp+8h] + int v17; // [esp+Ch] [ebp+Ch] -if ( a3 >= 0 && a3 < 10 && a4 >= 0 && a4 < 15 ) -{ -v9 = *((DWORD *)this + 8) + 16 * (a3 + a4 * *((DWORD *)this + 4)); -v10 = *(DWORD *)(*(DWORD *)(v9 + 4) + 4) - 1; -if ( v10 >= 0 ) -{ -v17 = 4 * v10 + 8; -v11 = (int **)((char *)this + 4 * a9 + 36); -v16 = *(DWORD *)(*(DWORD *)(v9 + 4) + 4); -do -{ -v12 = *(int **)(v17 + *(DWORD *)(v9 + 4)); -if ( !*((_BYTE *)v12 + 12) ) -{ -if ( *(_BYTE *)v12[2] ) -{ -if ( *(int *)((char *)v12 + 17) & *((DWORD *)a7 + 10) ) -{ -LOBYTE(v13) = TBall::already_hit(a8, (struct TEdgeSegment *)v12); -if ( !v13 ) -{ -++a9; -*v11 = v12; -v14 = *v12; -++v11; -*((_BYTE *)v12 + 12) = 1; -(*(void (__thiscall **)(int *, struct ray_type *))(v14 + 12))(v12, a7); -if ( a2 < *a5 ) -{ -*a5 = a2; -*a6 = (struct TEdgeSegment *)v12; -} -} -} -} -} -v17 -= 4; ---v16; -} -while ( v16 ); -} -} -return a9; + if (a3 >= 0 && a3 < 10 && a4 >= 0 && a4 < 15) + { + v9 = *((DWORD*)this + 8) + 16 * (a3 + a4 * *((DWORD*)this + 4)); + v10 = *(DWORD*)(*(DWORD*)(v9 + 4) + 4) - 1; + if (v10 >= 0) + { + v17 = 4 * v10 + 8; + v11 = (int**)((char*)this + 4 * a9 + 36); + v16 = *(DWORD*)(*(DWORD*)(v9 + 4) + 4); + do + { + v12 = *(int**)(v17 + *(DWORD*)(v9 + 4)); + if (!*((_BYTE*)v12 + 12)) + { + if (*(_BYTE*)v12[2]) + { + if (*(int*)((char*)v12 + 17) & *((DWORD*)a7 + 10)) + { + LOBYTE(v13) = TBall::already_hit(a8, (struct TEdgeSegment*)v12); + if (!v13) + { + ++a9; + *v11 = v12; + v14 = *v12; + ++v11; + *((_BYTE*)v12 + 12) = 1; + (*(void(__thiscall * *)(int*, struct ray_type*))(v14 + 12))(v12, a7); + if (a2 < *a5) + { + *a5 = a2; + *a6 = (struct TEdgeSegment*)v12; + } + } + } + } + } + v17 -= 4; + --v16; + } while (v16); + } + } + return a9; } //----- (0100B486) -------------------------------------------------------- -double __thiscall TEdgeManager::FindCollisionDistance(TEdgeManager *this, struct ray_type *a2, struct TBall *a3, struct TEdgeSegment **a4) +double __thiscall TEdgeManager::FindCollisionDistance(TEdgeManager* this, struct ray_type* a2, struct TBall* a3, struct TEdgeSegment** a4) { -struct ray_type *v4; // esi -float *v5; // edi -int v6; // ebx -double v7; // st7 -float v8; // ST18_4 -double v9; // st7 -float v10; // ST18_4 -double v11; // st7 -int v12; // eax -int v13; // eax -int v14; // eax -int v15; // ecx -int v16; // eax -int v17; // eax -double v18; // st7 -double v19; // st7 -double v20; // st7 -double v21; // st7 -double v22; // st6 -double v23; // st7 -double v24; // st6 -double v25; // st7 -double v26; // st6 -double v27; // st7 -double v28; // st6 -int *v29; // eax -int v30; // ecx -signed int v32; // [esp+10h] [ebp-28h] -float v33; // [esp+14h] [ebp-24h] -float v34; // [esp+14h] [ebp-24h] -signed int v35; // [esp+18h] [ebp-20h] -float v36; // [esp+1Ch] [ebp-1Ch] -float v37; // [esp+1Ch] [ebp-1Ch] -int v38; // [esp+20h] [ebp-18h] -int v39; // [esp+20h] [ebp-18h] -int v40; // [esp+20h] [ebp-18h] -int v41; // [esp+20h] [ebp-18h] -int v42; // [esp+24h] [ebp-14h] -int v43; // [esp+24h] [ebp-14h] -int v44; // [esp+28h] [ebp-10h] -int v45; // [esp+2Ch] [ebp-Ch] -float v46; // [esp+30h] [ebp-8h] -int v47; // [esp+34h] [ebp-4h] -float v48; // [esp+40h] [ebp+8h] -struct ray_type *v49; // [esp+40h] [ebp+8h] -struct ray_type *v50; // [esp+40h] [ebp+8h] -struct ray_type *v51; // [esp+40h] [ebp+8h] + struct ray_type* v4; // esi + float* v5; // edi + int v6; // ebx + double v7; // st7 + float v8; // ST18_4 + double v9; // st7 + float v10; // ST18_4 + double v11; // st7 + int v12; // eax + int v13; // eax + int v14; // eax + int v15; // ecx + int v16; // eax + int v17; // eax + double v18; // st7 + double v19; // st7 + double v20; // st7 + double v21; // st7 + double v22; // st6 + double v23; // st7 + double v24; // st6 + double v25; // st7 + double v26; // st6 + double v27; // st7 + double v28; // st6 + int* v29; // eax + int v30; // ecx + signed int v32; // [esp+10h] [ebp-28h] + float v33; // [esp+14h] [ebp-24h] + float v34; // [esp+14h] [ebp-24h] + signed int v35; // [esp+18h] [ebp-20h] + float v36; // [esp+1Ch] [ebp-1Ch] + float v37; // [esp+1Ch] [ebp-1Ch] + int v38; // [esp+20h] [ebp-18h] + int v39; // [esp+20h] [ebp-18h] + int v40; // [esp+20h] [ebp-18h] + int v41; // [esp+20h] [ebp-18h] + int v42; // [esp+24h] [ebp-14h] + int v43; // [esp+24h] [ebp-14h] + int v44; // [esp+28h] [ebp-10h] + int v45; // [esp+2Ch] [ebp-Ch] + float v46; // [esp+30h] [ebp-8h] + int v47; // [esp+34h] [ebp-4h] + float v48; // [esp+40h] [ebp+8h] + struct ray_type* v49; // [esp+40h] [ebp+8h] + struct ray_type* v50; // [esp+40h] [ebp+8h] + struct ray_type* v51; // [esp+40h] [ebp+8h] -v4 = a2; -v48 = *(float *)a2; -v5 = (float *)this; -v46 = 1000000000.0; -v6 = 0; -v42 = TEdgeManager::box_x(this, v48); -v47 = *((int *)v4 + 1); -v38 = TEdgeManager::box_y((TEdgeManager *)v5, *(float *)&v47); -v7 = *((float *)v4 + 3) * *((float *)v4 + 6) + *(float *)v4; -v36 = v7; -v8 = v7; -v45 = TEdgeManager::box_x((TEdgeManager *)v5, v8); -v9 = *((float *)v4 + 4) * *((float *)v4 + 6) + *((float *)v4 + 1); -v33 = v9; -v10 = v9; -v44 = TEdgeManager::box_y((TEdgeManager *)v5, v10); -if ( v48 >= (double)v36 ) -v32 = -1; -else -v32 = 1; -v11 = *(float *)&v47; -if ( *(float *)&v47 >= (double)v33 ) -v35 = -1; -else -v35 = 1; -v12 = v38; -if ( v38 == v44 ) -{ -v49 = (struct ray_type *)v42; -if ( v32 == 1 ) -{ -if ( v42 <= v45 ) -{ -while ( 1 ) -{ -v13 = TEdgeManager::TestGridBox((TEdgeManager *)v5, v11, (int)v49, v12, &v46, a4, v4, a3, v6); -v49 = (struct ray_type *)((char *)v49 + 1); -v6 = v13; -if ( (signed int)v49 > v45 ) -break; -v12 = v38; -} -} -} -else if ( v42 >= v45 ) -{ -while ( 1 ) -{ -v14 = TEdgeManager::TestGridBox((TEdgeManager *)v5, v11, (int)v49, v12, &v46, a4, v4, a3, v6); -v49 = (struct ray_type *)((char *)v49 - 1); -v6 = v14; -if ( (signed int)v49 < v45 ) -break; -v12 = v38; -} -} -} -else -{ -v15 = v42; -if ( v42 == v45 ) -{ -v50 = (struct ray_type *)v38; -if ( v35 == 1 ) -{ -if ( v38 <= v44 ) -{ -while ( 1 ) -{ -v16 = TEdgeManager::TestGridBox((TEdgeManager *)v5, v11, v15, (int)v50, &v46, a4, v4, a3, v6); -v50 = (struct ray_type *)((char *)v50 + 1); -v6 = v16; -if ( (signed int)v50 > v44 ) -break; -v15 = v42; -} -} -} -else if ( v38 >= v44 ) -{ -while ( 1 ) -{ -v17 = TEdgeManager::TestGridBox((TEdgeManager *)v5, v11, v15, (int)v50, &v46, a4, v4, a3, v6); -v50 = (struct ray_type *)((char *)v50 - 1); -v6 = v17; -if ( (signed int)v50 < v44 ) -break; -v15 = v42; -} -} -} -else -{ -v18 = (*(float *)&v47 - v33) / (v48 - v36); -v37 = v18; -v19 = v18 * v48; -v51 = (struct ray_type *)v42; -v20 = *(float *)&v47 - v19; -v47 = v38; -v34 = v20; -v6 = TEdgeManager::TestGridBox((TEdgeManager *)v5, v20, v42, v38, &v46, a4, v4, a3, 0); -if ( v32 == 1 ) -{ -if ( v35 == 1 ) -{ -v43 = v42 + 1; -v39 = v38 + 1; -do -{ -v21 = (double)v39 * v5[1] + v5[7]; -v22 = ((double)v43 * *v5 + v5[6]) * v37 + v34; -if ( v22 >= v21 ) -{ -if ( v22 == v21 ) -{ -v51 = (struct ray_type *)((char *)v51 + 1); -++v43; -} -++v47; -++v39; -} -else -{ -v51 = (struct ray_type *)((char *)v51 + 1); -++v43; -} -v6 = TEdgeManager::TestGridBox((TEdgeManager *)v5, v21, (int)v51, v47, &v46, a4, v4, a3, v6); -} -while ( (signed int)v51 < v45 || v47 < v44 ); -} -else -{ -v40 = v42 + 1; -do -{ -v23 = (double)v47 * v5[1] + v5[7]; -v24 = ((double)v40 * *v5 + v5[6]) * v37 + v34; -if ( v24 <= v23 ) -{ -if ( v24 == v23 ) -{ -v51 = (struct ray_type *)((char *)v51 + 1); -++v40; -} ---v47; -} -else -{ -v51 = (struct ray_type *)((char *)v51 + 1); -++v40; -} -v6 = TEdgeManager::TestGridBox((TEdgeManager *)v5, v23, (int)v51, v47, &v46, a4, v4, a3, v6); -} -while ( (signed int)v51 < v45 || v47 > v44 ); -} -} -else if ( v35 == 1 ) -{ -v41 = v38 + 1; -do -{ -v25 = (double)v41 * v5[1] + v5[7]; -v26 = ((double)(signed int)v51 * *v5 + v5[6]) * v37 + v34; -if ( v26 >= v25 ) -{ -if ( v26 == v25 ) -v51 = (struct ray_type *)((char *)v51 - 1); -++v47; -++v41; -} -else -{ -v51 = (struct ray_type *)((char *)v51 - 1); -} -v6 = TEdgeManager::TestGridBox((TEdgeManager *)v5, v25, (int)v51, v47, &v46, a4, v4, a3, v6); -} -while ( (signed int)v51 > v45 || v47 < v44 ); -} -else -{ -do -{ -v27 = (double)v47 * v5[1] + v5[7]; -v28 = ((double)(signed int)v51 * *v5 + v5[6]) * v37 + v34; -if ( v28 <= v27 ) -{ -if ( v28 == v27 ) -v51 = (struct ray_type *)((char *)v51 - 1); ---v47; -} -else -{ -v51 = (struct ray_type *)((char *)v51 - 1); -} -v6 = TEdgeManager::TestGridBox((TEdgeManager *)v5, v27, (int)v51, v47, &v46, a4, v4, a3, v6); -} -while ( (signed int)v51 > v45 || v47 > v44 ); -} -} -} -if ( v6 > 0 ) -{ -v29 = (int *)(v5 + 9); -do -{ -v30 = *v29; -++v29; ---v6; -*(_BYTE *)(v30 + 12) = 0; -} -while ( v6 ); -} -return v46; + v4 = a2; + v48 = *(float*)a2; + v5 = (float*)this; + v46 = 1000000000.0; + v6 = 0; + v42 = TEdgeManager::box_x(this, v48); + v47 = *((int*)v4 + 1); + v38 = TEdgeManager::box_y((TEdgeManager*)v5, *(float*)& v47); + v7 = *((float*)v4 + 3) * *((float*)v4 + 6) + *(float*)v4; + v36 = v7; + v8 = v7; + v45 = TEdgeManager::box_x((TEdgeManager*)v5, v8); + v9 = *((float*)v4 + 4) * *((float*)v4 + 6) + *((float*)v4 + 1); + v33 = v9; + v10 = v9; + v44 = TEdgeManager::box_y((TEdgeManager*)v5, v10); + if (v48 >= (double)v36) + v32 = -1; + else + v32 = 1; + v11 = *(float*)& v47; + if (*(float*)& v47 >= (double)v33) + v35 = -1; + else + v35 = 1; + v12 = v38; + if (v38 == v44) + { + v49 = (struct ray_type*)v42; + if (v32 == 1) + { + if (v42 <= v45) + { + while (1) + { + v13 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v11, (int)v49, v12, &v46, a4, v4, a3, v6); + v49 = (struct ray_type*)((char*)v49 + 1); + v6 = v13; + if ((signed int)v49 > v45) + break; + v12 = v38; + } + } + } + else if (v42 >= v45) + { + while (1) + { + v14 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v11, (int)v49, v12, &v46, a4, v4, a3, v6); + v49 = (struct ray_type*)((char*)v49 - 1); + v6 = v14; + if ((signed int)v49 < v45) + break; + v12 = v38; + } + } + } + else + { + v15 = v42; + if (v42 == v45) + { + v50 = (struct ray_type*)v38; + if (v35 == 1) + { + if (v38 <= v44) + { + while (1) + { + v16 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v11, v15, (int)v50, &v46, a4, v4, a3, v6); + v50 = (struct ray_type*)((char*)v50 + 1); + v6 = v16; + if ((signed int)v50 > v44) + break; + v15 = v42; + } + } + } + else if (v38 >= v44) + { + while (1) + { + v17 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v11, v15, (int)v50, &v46, a4, v4, a3, v6); + v50 = (struct ray_type*)((char*)v50 - 1); + v6 = v17; + if ((signed int)v50 < v44) + break; + v15 = v42; + } + } + } + else + { + v18 = (*(float*)& v47 - v33) / (v48 - v36); + v37 = v18; + v19 = v18 * v48; + v51 = (struct ray_type*)v42; + v20 = *(float*)& v47 - v19; + v47 = v38; + v34 = v20; + v6 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v20, v42, v38, &v46, a4, v4, a3, 0); + if (v32 == 1) + { + if (v35 == 1) + { + v43 = v42 + 1; + v39 = v38 + 1; + do + { + v21 = (double)v39 * v5[1] + v5[7]; + v22 = ((double)v43 * *v5 + v5[6]) * v37 + v34; + if (v22 >= v21) + { + if (v22 == v21) + { + v51 = (struct ray_type*)((char*)v51 + 1); + ++v43; + } + ++v47; + ++v39; + } + else + { + v51 = (struct ray_type*)((char*)v51 + 1); + ++v43; + } + v6 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v21, (int)v51, v47, &v46, a4, v4, a3, v6); + } while ((signed int)v51 < v45 || v47 < v44); + } + else + { + v40 = v42 + 1; + do + { + v23 = (double)v47 * v5[1] + v5[7]; + v24 = ((double)v40 * *v5 + v5[6]) * v37 + v34; + if (v24 <= v23) + { + if (v24 == v23) + { + v51 = (struct ray_type*)((char*)v51 + 1); + ++v40; + } + --v47; + } + else + { + v51 = (struct ray_type*)((char*)v51 + 1); + ++v40; + } + v6 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v23, (int)v51, v47, &v46, a4, v4, a3, v6); + } while ((signed int)v51 < v45 || v47 > v44); + } + } + else if (v35 == 1) + { + v41 = v38 + 1; + do + { + v25 = (double)v41 * v5[1] + v5[7]; + v26 = ((double)(signed int)v51 * *v5 + v5[6]) * v37 + v34; + if (v26 >= v25) + { + if (v26 == v25) + v51 = (struct ray_type*)((char*)v51 - 1); + ++v47; + ++v41; + } + else + { + v51 = (struct ray_type*)((char*)v51 - 1); + } + v6 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v25, (int)v51, v47, &v46, a4, v4, a3, v6); + } while ((signed int)v51 > v45 || v47 < v44); + } + else + { + do + { + v27 = (double)v47 * v5[1] + v5[7]; + v28 = ((double)(signed int)v51 * *v5 + v5[6]) * v37 + v34; + if (v28 <= v27) + { + if (v28 == v27) + v51 = (struct ray_type*)((char*)v51 - 1); + --v47; + } + else + { + v51 = (struct ray_type*)((char*)v51 - 1); + } + v6 = TEdgeManager::TestGridBox((TEdgeManager*)v5, v27, (int)v51, v47, &v46, a4, v4, a3, v6); + } while ((signed int)v51 > v45 || v47 > v44); + } + } + } + if (v6 > 0) + { + v29 = (int*)(v5 + 9); + do + { + v30 = *v29; + ++v29; + --v6; + *(_BYTE*)(v30 + 12) = 0; + } while (v6); + } + return v46; } //----- (0100B883) -------------------------------------------------------- -TEdgeManager *__thiscall TEdgeManager::TEdgeManager(TEdgeManager *this, float a2, float a3, float a4, float a5) +TEdgeManager* __thiscall TEdgeManager::TEdgeManager(TEdgeManager* this, float a2, float a3, float a4, float a5) { -double v5; // st7 -TEdgeManager *v6; // esi -double v7; // st6 -DWORD *v8; // eax -int v9; // edi + double v5; // st7 + TEdgeManager* v6; // esi + double v7; // st6 + DWORD* v8; // eax + int v9; // edi -v5 = a4 * 0.1; -v6 = this; -*((float *)this + 6) = a2; -*(float *)this = v5; -v7 = a5 * 0.06666667; -*((float *)this + 7) = a3; -*((DWORD *)this + 4) = 10; -*((float *)this + 1) = v7; -*((DWORD *)this + 5) = 15; -*((float *)this + 2) = 1.0 / v5; -*((float *)this + 3) = 1.0 / v7; -v8 = operator new(0x964u); -if ( v8 ) -{ -v9 = (int)(v8 + 1); -*v8 = 150; -create(v8 + 1, 0x10u, 150, (void *(__thiscall *)(void *))TEdgeBox::TEdgeBox); -} -else -{ -v9 = 0; -} -*((DWORD *)v6 + 8) = v9; -return v6; + v5 = a4 * 0.1; + v6 = this; + *((float*)this + 6) = a2; + *(float*)this = v5; + v7 = a5 * 0.06666667; + *((float*)this + 7) = a3; + *((DWORD*)this + 4) = 10; + *((float*)this + 1) = v7; + *((DWORD*)this + 5) = 15; + *((float*)this + 2) = 1.0 / v5; + *((float*)this + 3) = 1.0 / v7; + v8 = component_create(0x964u); + if (v8) + { + v9 = (int)(v8 + 1); + *v8 = 150; + create(v8 + 1, 0x10u, 150, (void* (__thiscall*)(void*))TEdgeBox::TEdgeBox); + } + else + { + v9 = 0; + } + *((DWORD*)v6 + 8) = v9; + return v6; } //----- (01017441) -------------------------------------------------------- -TEdgeManager *__thiscall TEdgeManager::destroy(TEdgeManager *this, char a2) +TEdgeManager* __thiscall TEdgeManager::destroy(TEdgeManager* this, char a2) { -TEdgeManager *v2; // esi + TEdgeManager* v2; // esi -v2 = this; -TEdgeManager::~TEdgeManager(this); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + TEdgeManager::~TEdgeManager(this); + if (a2 & 1) + component_delete((void*)v2); + return v2; } diff --git a/Classes/TFlagSpinner/TFlagSpinner.cpp b/Classes/TFlagSpinner/TFlagSpinner.cpp index a3463d9..d543f2d 100644 --- a/Classes/TFlagSpinner/TFlagSpinner.cpp +++ b/Classes/TFlagSpinner/TFlagSpinner.cpp @@ -156,7 +156,7 @@ v15 = *v13; v16 = v13[1]; v17 = v13[2]; v18 = v13[3]; -v4 = (TLine *)operator new(0x55u); +v4 = (TLine *)component_create(0x55u); if ( v4 ) v5 = TLine::TLine(v4, v3, (char *)v3 + 5, v14, (struct vector_type *)&v17, (struct vector_type *)&v15); else @@ -166,7 +166,7 @@ if ( v5 ) (*(void (__thiscall **)(TLine *))(*(DWORD *)v5 + 8))(v5); objlist_class::Add((TFlagSpinner *)((char *)v3 + 42), (void *)v5); } -v6 = (TLine *)operator new(0x55u); +v6 = (TLine *)component_create(0x55u); if ( v6 ) v7 = TLine::TLine(v6, v3, (char *)v3 + 5, v14, (struct vector_type *)&v15, (struct vector_type *)&v17); else diff --git a/Classes/TFlipper/TFlipper.cpp b/Classes/TFlipper/TFlipper.cpp index ce2a765..1754527 100644 --- a/Classes/TFlipper/TFlipper.cpp +++ b/Classes/TFlipper/TFlipper.cpp @@ -2,260 +2,260 @@ //----- (0101C047) -------------------------------------------------------- -TZmapList *__thiscall TFlipper::~TFlipper(TFlipper *this) +TZmapList* __thiscall TFlipper::~TFlipper(TFlipper* this) { -TCollisionComponent *v1; // esi -void *v2; // ST00_4 + TCollisionComponent* v1; // esi + void* v2; // ST00_4 -v1 = this; -v2 = *(void **)((char *)this + 82); -*(DWORD *)this = &TFlipper::vftable; -operator delete(v2); -return TCollisionComponent::~TCollisionComponent(v1); + v1 = this; + v2 = *(void**)((char*)this + 82); + *(DWORD*)this = &TFlipper::vftable; + component_delete(v2); + return TCollisionComponent::~TCollisionComponent(v1); } // 1002838: using guessed type void *TFlipper::vftable; //----- (0101C070) -------------------------------------------------------- -void TFlipper::TimerExpired(int a1, void *a2) +void TFlipper::TimerExpired(int a1, void* a2) { -char *v2; // esi -double v3; // st7 -int v4; // edi -signed __int64 v5; // rax -int v6; // ebx -int v7; // ecx -int v8; // eax -int v9; // ecx -int v10; // edx -int v11; // ecx -int v12; // eax -signed int v13; // [esp+14h] [ebp-4h] -float v14; // [esp+24h] [ebp+Ch] + char* v2; // esi + double v3; // st7 + int v4; // edi + signed __int64 v5; // rax + int v6; // ebx + int v7; // ecx + int v8; // eax + int v9; // ecx + int v10; // edx + int v11; // ecx + int v12; // eax + signed int v13; // [esp+14h] [ebp-4h] + float v14; // [esp+24h] [ebp+Ch] -v2 = (char *)a2; -v13 = 0; -v3 = _floor((time_now - *(float *)((char *)a2 + 102)) / *(float *)((char *)a2 + 98) + 0.5); -v4 = *(DWORD *)((char *)a2 + 34); -v14 = (double)*(signed int *)(*(DWORD *)(v4 + 4) + 4); -if ( v3 > v14 ) -v3 = v14; -if ( v3 < 0.0 ) -v3 = 0.0; -v5 = (signed __int64)v3; -if ( !(unsigned int)(signed __int64)v3 ) -LODWORD(v5) = 1; -v6 = *(DWORD *)(v2 + 6); -if ( v6 == 1 ) -{ -*(DWORD *)(v2 + 78) += v5; -v7 = *(DWORD *)(*(DWORD *)(v4 + 4) + 4) - 1; -if ( *(DWORD *)(v2 + 78) >= v7 ) -{ -*(DWORD *)(v2 + 78) = v7; -v13 = 1; -} -} -if ( v6 == 2 ) -{ -*(DWORD *)(v2 + 78) -= v5; -v8 = 0; -if ( *(DWORD *)(v2 + 78) <= 0 ) -{ -*(DWORD *)(v2 + 78) = 0; -v13 = 1; -} -} -else -{ -v8 = 0; -} -if ( v13 ) -*(DWORD *)(v2 + 6) = 0; -else -v8 = timer_set(*(float *)(v2 + 98), (int)v2, (int)TFlipper::TimerExpired); -v9 = *(DWORD *)(v2 + 78); -v10 = *(DWORD *)(v2 + 30); -*(DWORD *)(v2 + 86) = v8; -v11 = 4 * v9 + 8; -v12 = *(DWORD *)(v11 + *(DWORD *)(*(DWORD *)(v2 + 34) + 4)); -render_sprite_set( -*(DWORD **)(v2 + 26), -*(DWORD *)(v11 + *(DWORD *)(*(DWORD *)(v2 + 34) + 4)), -*(DWORD *)(*(DWORD *)(*(DWORD *)(v2 + 38) + 4) + v11), -*(DWORD *)(v12 + 29) - *(DWORD *)(v10 + 234), -*(DWORD *)(v12 + 33) - *(DWORD *)(v10 + 238)); + v2 = (char*)a2; + v13 = 0; + v3 = _floor((time_now - *(float*)((char*)a2 + 102)) / *(float*)((char*)a2 + 98) + 0.5); + v4 = *(DWORD*)((char*)a2 + 34); + v14 = (double) * (signed int*)(*(DWORD*)(v4 + 4) + 4); + if (v3 > v14) + v3 = v14; + if (v3 < 0.0) + v3 = 0.0; + v5 = (signed __int64)v3; + if (!(unsigned int)(signed __int64)v3) + LODWORD(v5) = 1; + v6 = *(DWORD*)(v2 + 6); + if (v6 == 1) + { + *(DWORD*)(v2 + 78) += v5; + v7 = *(DWORD*)(*(DWORD*)(v4 + 4) + 4) - 1; + if (*(DWORD*)(v2 + 78) >= v7) + { + *(DWORD*)(v2 + 78) = v7; + v13 = 1; + } + } + if (v6 == 2) + { + *(DWORD*)(v2 + 78) -= v5; + v8 = 0; + if (*(DWORD*)(v2 + 78) <= 0) + { + *(DWORD*)(v2 + 78) = 0; + v13 = 1; + } + } + else + { + v8 = 0; + } + if (v13) + * (DWORD*)(v2 + 6) = 0; + else + v8 = timer_set(*(float*)(v2 + 98), (int)v2, (int)TFlipper::TimerExpired); + v9 = *(DWORD*)(v2 + 78); + v10 = *(DWORD*)(v2 + 30); + *(DWORD*)(v2 + 86) = v8; + v11 = 4 * v9 + 8; + v12 = *(DWORD*)(v11 + *(DWORD*)(*(DWORD*)(v2 + 34) + 4)); + render_sprite_set( + *(DWORD * *)(v2 + 26), + *(DWORD*)(v11 + *(DWORD*)(*(DWORD*)(v2 + 34) + 4)), + *(DWORD*)(*(DWORD*)(*(DWORD*)(v2 + 38) + 4) + v11), + *(DWORD*)(v12 + 29) - *(DWORD*)(v10 + 234), + *(DWORD*)(v12 + 33) - *(DWORD*)(v10 + 238)); } // 1025630: using guessed type float time_now; //----- (0101C178) -------------------------------------------------------- -int __thiscall TFlipper::Message(TFlipper *this, int a2, float a3) +int __thiscall TFlipper::Message(TFlipper* this, int a2, float a3) { -signed int v3; // ebx -TFlipper *v4; // esi -int v5; // ST04_4 -int v6; // eax -double v7; // st7 -double v8; // ST14_8 -float v9; // ST00_4 + signed int v3; // ebx + TFlipper* v4; // esi + int v5; // ST04_4 + int v6; // eax + double v7; // st7 + double v8; // ST14_8 + float v9; // ST00_4 -v3 = a2; -v4 = this; -if ( a2 == 1 ) -{ -control_handler(1, this); -*(DWORD *)((char *)v4 + 98) = *(DWORD *)((char *)v4 + 90); -v6 = *(DWORD *)((char *)v4 + 74); -LABEL_15: -if ( v6 ) -loader_play_sound(v6); -goto LABEL_17; -} -if ( a2 == 2 ) -{ -*(DWORD *)((char *)this + 98) = *(DWORD *)((char *)this + 94); -v6 = *(DWORD *)((char *)this + 70); -goto LABEL_15; -} -if ( a2 <= 1008 ) -return 0; -if ( a2 <= 1011 ) -{ -LABEL_12: -v3 = 2; -*(DWORD *)((char *)this + 98) = *(DWORD *)((char *)this + 94); -LABEL_17: -if ( *(DWORD *)((char *)v4 + 86) ) -{ -timer_kill(*(DWORD *)((char *)v4 + 86)); -*(DWORD *)((char *)v4 + 86) = 0; -} -if ( *(DWORD *)((char *)v4 + 6) ) -{ -v8 = a3 - *(float *)(*(DWORD *)((char *)v4 + 82) + 201); -v7 = v8 - _floor(v8 / *(float *)((char *)v4 + 98)) * *(float *)((char *)v4 + 98); -if ( v7 < 0.0 ) -v7 = 0.0; -} -else -{ -v7 = *(float *)((char *)v4 + 98); -} -v9 = v7; -*(DWORD *)((char *)v4 + 6) = v3; -*(float *)((char *)v4 + 102) = a3; -*(DWORD *)((char *)v4 + 86) = timer_set(v9, (int)v4, (int)TFlipper::TimerExpired); -goto LABEL_24; -} -if ( a2 != 1020 ) -{ -if ( a2 != 1022 ) -{ -if ( a2 != 1024 ) -return 0; -goto LABEL_8; -} -goto LABEL_12; -} + v3 = a2; + v4 = this; + if (a2 == 1) + { + control_handler(1, this); + *(DWORD*)((char*)v4 + 98) = *(DWORD*)((char*)v4 + 90); + v6 = *(DWORD*)((char*)v4 + 74); + LABEL_15: + if (v6) + loader_play_sound(v6); + goto LABEL_17; + } + if (a2 == 2) + { + *(DWORD*)((char*)this + 98) = *(DWORD*)((char*)this + 94); + v6 = *(DWORD*)((char*)this + 70); + goto LABEL_15; + } + if (a2 <= 1008) + return 0; + if (a2 <= 1011) + { + LABEL_12: + v3 = 2; + *(DWORD*)((char*)this + 98) = *(DWORD*)((char*)this + 94); + LABEL_17: + if (*(DWORD*)((char*)v4 + 86)) + { + timer_kill(*(DWORD*)((char*)v4 + 86)); + *(DWORD*)((char*)v4 + 86) = 0; + } + if (*(DWORD*)((char*)v4 + 6)) + { + v8 = a3 - *(float*)(*(DWORD*)((char*)v4 + 82) + 201); + v7 = v8 - _floor(v8 / *(float*)((char*)v4 + 98)) * *(float*)((char*)v4 + 98); + if (v7 < 0.0) + v7 = 0.0; + } + else + { + v7 = *(float*)((char*)v4 + 98); + } + v9 = v7; + *(DWORD*)((char*)v4 + 6) = v3; + *(float*)((char*)v4 + 102) = a3; + *(DWORD*)((char*)v4 + 86) = timer_set(v9, (int)v4, (int)TFlipper::TimerExpired); + goto LABEL_24; + } + if (a2 != 1020) + { + if (a2 != 1022) + { + if (a2 != 1024) + return 0; + goto LABEL_8; + } + goto LABEL_12; + } LABEL_8: -if ( *(DWORD *)((char *)this + 6) ) -{ -if ( *(DWORD *)((char *)this + 86) ) -timer_kill(*(DWORD *)((char *)this + 86)); -*(DWORD *)((char *)v4 + 78) = -1; -v5 = *(DWORD *)((char *)v4 + 86); -*(DWORD *)((char *)v4 + 6) = 2; -TFlipper::TimerExpired(v5, (void *)v4); -LABEL_24: -TFlipperEdge::SetMotion(*(TFlipperEdge **)((char *)v4 + 82), v3, a3); -} -return 0; + if (*(DWORD*)((char*)this + 6)) + { + if (*(DWORD*)((char*)this + 86)) + timer_kill(*(DWORD*)((char*)this + 86)); + *(DWORD*)((char*)v4 + 78) = -1; + v5 = *(DWORD*)((char*)v4 + 86); + *(DWORD*)((char*)v4 + 6) = 2; + TFlipper::TimerExpired(v5, (void*)v4); + LABEL_24: + TFlipperEdge::SetMotion(*(TFlipperEdge * *)((char*)v4 + 82), v3, a3); + } + return 0; } //----- (0101C2AD) -------------------------------------------------------- -void __thiscall TFlipper::port_draw(TFlipper *this) +void __thiscall TFlipper::port_draw(TFlipper* this) { -(*(void (**)(void))(**(DWORD **)((char *)this + 82) + 4))(); + (*(void (**)(void))(**(DWORD * *)((char*)this + 82) + 4))(); } //----- (0101C59D) -------------------------------------------------------- -TFlipper *__thiscall TFlipper::TFlipper(TFlipper *this, struct TPinballTable *a2, int a3) +TFlipper* __thiscall TFlipper::TFlipper(TFlipper* this, struct TPinballTable* a2, int a3) { -int v3; // ebx -TFlipper *v4; // esi -int v5; // eax -float *v6; // eax -float v7; // ST2C_4 -float v8; // ST28_4 -float v9; // ST24_4 -float v10; // ST20_4 -float v11; // ST1C_4 -struct vector_type *v12; // ST18_4 -struct vector_type *v13; // ST14_4 -struct vector_type *v14; // eax -TFlipperEdge *v15; // eax -int v16; // ecx -int v18; // [esp+20h] [ebp-50h] -int v19; // [esp+24h] [ebp-4Ch] -unsigned int v20; // [esp+54h] [ebp-1Ch] -int v21; // [esp+58h] [ebp-18h] -int v22; // [esp+5Ch] [ebp-14h] -TFlipperEdge *v23; // [esp+68h] [ebp-8h] -float *v24; // [esp+6Ch] [ebp-4h] -float *v25; // [esp+7Ch] [ebp+Ch] + int v3; // ebx + TFlipper* v4; // esi + int v5; // eax + float* v6; // eax + float v7; // ST2C_4 + float v8; // ST28_4 + float v9; // ST24_4 + float v10; // ST20_4 + float v11; // ST1C_4 + struct vector_type* v12; // ST18_4 + struct vector_type* v13; // ST14_4 + struct vector_type* v14; // eax + TFlipperEdge* v15; // eax + int v16; // ecx + int v18; // [esp+20h] [ebp-50h] + int v19; // [esp+24h] [ebp-4Ch] + unsigned int v20; // [esp+54h] [ebp-1Ch] + int v21; // [esp+58h] [ebp-18h] + int v22; // [esp+5Ch] [ebp-14h] + TFlipperEdge* v23; // [esp+68h] [ebp-8h] + float* v24; // [esp+6Ch] [ebp-4h] + float* v25; // [esp+7Ch] [ebp+Ch] -v3 = a3; -v4 = this; -TCollisionComponent::TCollisionComponent(this, a2, a3, 0); -*(DWORD *)v4 = &TFlipper::vftable; -loader_query_visual(a3, 0, &v18); -*(DWORD *)((char *)v4 + 74) = v21; -*(DWORD *)((char *)v4 + 70) = v22; -*(DWORD *)((char *)v4 + 54) = v19; -v5 = v18; -*(DWORD *)((char *)v4 + 86) = 0; -*(DWORD *)((char *)v4 + 58) = v5; -v23 = (TFlipperEdge *)operator new(0xE9u); -if ( v23 ) -{ -v25 = (float *)loader_query_float_attribute(a3, 0, 803); -v24 = (float *)loader_query_float_attribute(v3, 0, 805); -v6 = (float *)loader_query_float_attribute(v3, 0, 804); -v7 = *(float *)((char *)v4 + 58); -v8 = *(float *)((char *)v4 + 54); -v9 = *v25; -v10 = *v24; -v11 = *v6; -v12 = (struct vector_type *)loader_query_float_attribute(v3, 0, 802); -v13 = (struct vector_type *)loader_query_float_attribute(v3, 0, 801); -v14 = (struct vector_type *)loader_query_float_attribute(v3, 0, 800); -v15 = TFlipperEdge::TFlipperEdge(v23, v4, (char *)v4 + 5, v20, a2, v14, v13, v12, v11, v10, v9, v8, v7); -} -else -{ -v15 = 0; -} -*(DWORD *)((char *)v4 + 82) = v15; -if ( v15 ) -{ -v16 = *(DWORD *)((char *)v4 + 34); -*(float *)((char *)v4 + 90) = *(float *)((char *)v15 + 213) / (double)(*(DWORD *)(*(DWORD *)(v16 + 4) + 4) - 1); -*(float *)((char *)v4 + 94) = *(float *)((char *)v15 + 217) / (double)(*(DWORD *)(*(DWORD *)(v16 + 4) + 4) - 1); -} -*(DWORD *)((char *)v4 + 78) = 0; -*(float *)((char *)v4 + 102) = 0.0; -return v4; + v3 = a3; + v4 = this; + TCollisionComponent::TCollisionComponent(this, a2, a3, 0); + *(DWORD*)v4 = &TFlipper::vftable; + loader_query_visual(a3, 0, &v18); + *(DWORD*)((char*)v4 + 74) = v21; + *(DWORD*)((char*)v4 + 70) = v22; + *(DWORD*)((char*)v4 + 54) = v19; + v5 = v18; + *(DWORD*)((char*)v4 + 86) = 0; + *(DWORD*)((char*)v4 + 58) = v5; + v23 = (TFlipperEdge*)operator new(0xE9u); + if (v23) + { + v25 = (float*)loader_query_float_attribute(a3, 0, 803); + v24 = (float*)loader_query_float_attribute(v3, 0, 805); + v6 = (float*)loader_query_float_attribute(v3, 0, 804); + v7 = *(float*)((char*)v4 + 58); + v8 = *(float*)((char*)v4 + 54); + v9 = *v25; + v10 = *v24; + v11 = *v6; + v12 = (struct vector_type*)loader_query_float_attribute(v3, 0, 802); + v13 = (struct vector_type*)loader_query_float_attribute(v3, 0, 801); + v14 = (struct vector_type*)loader_query_float_attribute(v3, 0, 800); + v15 = TFlipperEdge::TFlipperEdge(v23, v4, (char*)v4 + 5, v20, a2, v14, v13, v12, v11, v10, v9, v8, v7); + } + else + { + v15 = 0; + } + *(DWORD*)((char*)v4 + 82) = v15; + if (v15) + { + v16 = *(DWORD*)((char*)v4 + 34); + *(float*)((char*)v4 + 90) = *(float*)((char*)v15 + 213) / (double)(*(DWORD*)(*(DWORD*)(v16 + 4) + 4) - 1); + *(float*)((char*)v4 + 94) = *(float*)((char*)v15 + 217) / (double)(*(DWORD*)(*(DWORD*)(v16 + 4) + 4) - 1); + } + *(DWORD*)((char*)v4 + 78) = 0; + *(float*)((char*)v4 + 102) = 0.0; + return v4; } // 1002838: using guessed type void *TFlipper::vftable; //----- (0101C6D7) -------------------------------------------------------- -TFlipper *__thiscall TFlipper::`vector deleting destructor`(TFlipper *this, char a2) +TFlipper* __thiscall TFlipper::destroy(TFlipper* this, char a2) { -TFlipper *v2; // esi + TFlipper* v2; // esi -v2 = this; -TFlipper::~TFlipper(this); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + TFlipper::~TFlipper(this); + if (a2 & 1) + component_delete((void*)v2); + return v2; } diff --git a/Classes/TFlipper/TFlipper.h b/Classes/TFlipper/TFlipper.h index b462d4c..69ed789 100644 --- a/Classes/TFlipper/TFlipper.h +++ b/Classes/TFlipper/TFlipper.h @@ -15,7 +15,7 @@ void TFlipper::TimerExpired(int, void*); // idb int __thiscall TFlipper::Message(TFlipper* this, int, float); // idb void __thiscall TFlipper::port_draw(TFlipper* __hidden this); // idb TFlipper* __thiscall TFlipper::TFlipper(TFlipper* this, struct TPinballTable* a2, int a3); -TFlipper* __thiscall TFlipper::`vector deleting destructor`(TFlipper *this, char a2); +TFlipper* __thiscall TFlipper::destroy(TFlipper *this, char a2); void* TFlipper::vftable = &TFlipper::Message; // weak diff --git a/Classes/TLightBargraph/TLightBargraph.cpp b/Classes/TLightBargraph/TLightBargraph.cpp index fed85a9..d2fead5 100644 --- a/Classes/TLightBargraph/TLightBargraph.cpp +++ b/Classes/TLightBargraph/TLightBargraph.cpp @@ -4,192 +4,191 @@ #include "TLightBargraph.h" //----- (0100AA81) -------------------------------------------------------- -TZmapList *__thiscall TLightBargraph::~TLightBargraph(TLightBargraph *this) +TZmapList* __thiscall TLightBargraph::~TLightBargraph(TLightBargraph* this) { - TLightGroup *v1; // esi - int v2; // eax + 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); + 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) +void __thiscall TLightBargraph::Reset(TLightBargraph* this) { - TLightBargraph *v1; // edi - DWORD *v2; // esi + 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); + 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 TLightBargraph::BargraphTimerExpired(int a1, void *a2) +void TLightBargraph::BargraphTimerExpired(int a1, void* a2) { - int v2; // eax - float v3; // ST04_4 + 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); - } + 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) +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] + 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; + 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* __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 + 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; + 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* __thiscall TLightBargraph::destroy(TLightBargraph* this, char a2) { -TLightBargraph *v2; // esi + TLightBargraph* v2; // esi -v2 = this; -TLightBargraph::~TLightBargraph(this); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + TLightBargraph::~TLightBargraph(this); + if (a2 & 1) + component_delete((void*)v2); + return v2; } diff --git a/Classes/TLightBargraph/TLightBargraph.h b/Classes/TLightBargraph/TLightBargraph.h index 6485115..5cccc77 100644 --- a/Classes/TLightBargraph/TLightBargraph.h +++ b/Classes/TLightBargraph/TLightBargraph.h @@ -15,7 +15,7 @@ void __thiscall TLightBargraph::Reset(TLightBargraph* this); // idb void TLightBargraph::BargraphTimerExpired(int, void*); // idb int __thiscall TLightBargraph::Message(TLightBargraph* this, int, float); // idb TLightBargraph* __thiscall TLightBargraph::TLightBargraph(TLightBargraph* this, struct TPinballTable* a2, int a3); -TLightBargraph* __thiscall TLightBargraph::`vector deleting destructor'(TLightBargraph *this, char a2); +TLightBargraph* __thiscall TLightBargraph::destroy(TLightBargraph *this, char a2); void* TLightBargraph::vftable = &TLightBargraph::Message; // weak diff --git a/Classes/TOneWay/TOneWay.cpp b/Classes/TOneWay/TOneWay.cpp index ea40365..2a6ab25 100644 --- a/Classes/TOneWay/TOneWay.cpp +++ b/Classes/TOneWay/TOneWay.cpp @@ -1,131 +1,131 @@ #include "TOneWay.h" //----- (01015B61) -------------------------------------------------------- -int __thiscall TOneway::get_scoring(TOneway *this, int a2) +int __thiscall TOneway::get_scoring(TOneway* this, int a2) { -int result; // eax + int result; // eax -if ( a2 >= 6 ) -result = 0; -else -result = *(DWORD *)((char *)this + 4 * a2 + 86); -return result; + if (a2 >= 6) + result = 0; + else + result = *(DWORD*)((char*)this + 4 * a2 + 86); + return result; } //----- (01015B7F) -------------------------------------------------------- -void __thiscall TOneway::put_scoring(TOneway *this, int a2, int a3) +void __thiscall TOneway::put_scoring(TOneway* this, int a2, int a3) { -if ( a2 < 6 ) -*(DWORD *)((char *)this + 4 * a2 + 86) = a3; + if (a2 < 6) + * (DWORD*)((char*)this + 4 * a2 + 86) = a3; } //----- (01018032) -------------------------------------------------------- -void __thiscall TOneway::Collision(TOneway *this, struct TBall *a2, struct vector_type *a3, struct vector_type *a4, float a5, struct TEdgeSegment *a6) +void __thiscall TOneway::Collision(TOneway* this, struct TBall* a2, struct vector_type* a3, struct vector_type* a4, float a5, struct TEdgeSegment* a6) { -TOneway *v6; // edi -int v7; // edi -double v8; // st7 -int v9; // eax + TOneway* v6; // edi + int v7; // edi + double v8; // st7 + int v9; // eax -v6 = this; -if ( a6 == *(struct TEdgeSegment **)((char *)this + 82) ) -{ -TBall::not_again(a2, a6); -v8 = *(float *)((char *)a2 + 70) - a5; -*(DWORD *)((char *)a2 + 42) = *(DWORD *)a3; -v9 = *((DWORD *)a3 + 1); -*(float *)((char *)a2 + 70) = v8; -*(DWORD *)((char *)a2 + 46) = v9; -if ( !*(DWORD *)(*(DWORD *)((char *)v6 + 30) + 370) ) -{ -if ( *(DWORD *)((char *)v6 + 74) ) -loader_play_sound(*(DWORD *)((char *)v6 + 74)); -control_handler(63, v6); -} -} -else if ( *(DWORD *)(*(DWORD *)((char *)this + 30) + 370) ) -{ -basic_collision(a2, a3, a4, *(float *)((char *)this + 54), *(float *)((char *)this + 58), 1000000000.0, 0.0); -} -else if ( basic_collision( -a2, -a3, -a4, -*(float *)((char *)this + 54), -*(float *)((char *)this + 58), -*(float *)((char *)this + 66), -*(float *)((char *)this + 62)) > 0.2 ) -{ -v7 = *(DWORD *)((char *)v6 + 70); -if ( v7 ) -loader_play_sound(v7); -} + v6 = this; + if (a6 == *(struct TEdgeSegment**)((char*)this + 82)) + { + TBall::not_again(a2, a6); + v8 = *(float*)((char*)a2 + 70) - a5; + *(DWORD*)((char*)a2 + 42) = *(DWORD*)a3; + v9 = *((DWORD*)a3 + 1); + *(float*)((char*)a2 + 70) = v8; + *(DWORD*)((char*)a2 + 46) = v9; + if (!*(DWORD*)(*(DWORD*)((char*)v6 + 30) + 370)) + { + if (*(DWORD*)((char*)v6 + 74)) + loader_play_sound(*(DWORD*)((char*)v6 + 74)); + control_handler(63, v6); + } + } + else if (*(DWORD*)(*(DWORD*)((char*)this + 30) + 370)) + { + basic_collision(a2, a3, a4, *(float*)((char*)this + 54), *(float*)((char*)this + 58), 1000000000.0, 0.0); + } + else if (basic_collision( + a2, + a3, + a4, + *(float*)((char*)this + 54), + *(float*)((char*)this + 58), + *(float*)((char*)this + 66), + *(float*)((char*)this + 62)) > 0.2) + { + v7 = *(DWORD*)((char*)v6 + 70); + if (v7) + loader_play_sound(v7); + } } //----- (01019204) -------------------------------------------------------- -TOneway *__thiscall TOneway::TOneway(TOneway *this, struct TPinballTable *a2, int a3) +TOneway* __thiscall TOneway::TOneway(TOneway* this, struct TPinballTable* a2, int a3) { -TLine *v3; // edi -TOneway *v4; // esi -TLine *v5; // eax -TLine *v6; // eax -TLine *v7; // eax -float v8; // ST10_4 -char v10; // [esp+10h] [ebp-60h] -int v11; // [esp+18h] [ebp-58h] -int *v12; // [esp+1Ch] [ebp-54h] -unsigned int v13; // [esp+44h] [ebp-2Ch] -int v14; // [esp+58h] [ebp-18h] -int v15; // [esp+5Ch] [ebp-14h] -int v16; // [esp+64h] [ebp-Ch] -int v17; // [esp+68h] [ebp-8h] + TLine* v3; // edi + TOneway* v4; // esi + TLine* v5; // eax + TLine* v6; // eax + TLine* v7; // eax + float v8; // ST10_4 + char v10; // [esp+10h] [ebp-60h] + int v11; // [esp+18h] [ebp-58h] + int* v12; // [esp+1Ch] [ebp-54h] + unsigned int v13; // [esp+44h] [ebp-2Ch] + int v14; // [esp+58h] [ebp-18h] + int v15; // [esp+5Ch] [ebp-14h] + int v16; // [esp+64h] [ebp-Ch] + int v17; // [esp+68h] [ebp-8h] -v3 = 0; -v4 = this; -TCollisionComponent::TCollisionComponent(this, a2, a3, 0); -*(DWORD *)v4 = &TOneway::vftable; -loader_query_visual(a3, 0, &v10); -if ( v11 == 2 ) -{ -v16 = *v12; -v17 = v12[1]; -v14 = v12[2]; -v15 = v12[3]; -v5 = (TLine *)operator new(0x55u); -if ( v5 ) -v3 = TLine::TLine(v5, v4, (char *)v4 + 5, v13, (struct vector_type *)&v16, (struct vector_type *)&v14); -if ( v3 ) -{ -TLine::Offset(v3, *(float *)((char *)a2 + 282)); -(*(void (__thiscall **)(TLine *))(*(DWORD *)v3 + 8))(v3); -objlist_class::Add((TOneway *)((char *)v4 + 42), (void *)v3); -} -v6 = (TLine *)operator new(0x55u); -if ( v6 ) -v7 = TLine::TLine(v6, v4, (char *)v4 + 5, v13, (struct vector_type *)&v14, (struct vector_type *)&v16); -else -v7 = 0; -*(DWORD *)((char *)v4 + 82) = v7; -if ( v7 ) -{ -v8 = -(*(float *)((char *)a2 + 282) * 0.8); -TLine::Offset(v7, v8); -(*(void (**)(void))(**(DWORD **)((char *)v4 + 82) + 8))(); -objlist_class::Add((TOneway *)((char *)v4 + 42), *(void **)((char *)v4 + 82)); -} -} -return v4; + v3 = 0; + v4 = this; + TCollisionComponent::TCollisionComponent(this, a2, a3, 0); + *(DWORD*)v4 = &TOneway::vftable; + loader_query_visual(a3, 0, &v10); + if (v11 == 2) + { + v16 = *v12; + v17 = v12[1]; + v14 = v12[2]; + v15 = v12[3]; + v5 = (TLine*)operator new(0x55u); + if (v5) + v3 = TLine::TLine(v5, v4, (char*)v4 + 5, v13, (struct vector_type*) & v16, (struct vector_type*) & v14); + if (v3) + { + TLine::Offset(v3, *(float*)((char*)a2 + 282)); + (*(void(__thiscall * *)(TLine*))(*(DWORD*)v3 + 8))(v3); + objlist_class::Add((TOneway*)((char*)v4 + 42), (void*)v3); + } + v6 = (TLine*)operator new(0x55u); + if (v6) + v7 = TLine::TLine(v6, v4, (char*)v4 + 5, v13, (struct vector_type*) & v14, (struct vector_type*) & v16); + else + v7 = 0; + *(DWORD*)((char*)v4 + 82) = v7; + if (v7) + { + v8 = -(*(float*)((char*)a2 + 282) * 0.8); + TLine::Offset(v7, v8); + (*(void (**)(void))(**(DWORD * *)((char*)v4 + 82) + 8))(); + objlist_class::Add((TOneway*)((char*)v4 + 42), *(void**)((char*)v4 + 82)); + } + } + return v4; } // 1002530: using guessed type void *TOneway::vftable; //----- (0101AAA7) -------------------------------------------------------- -TOneway *__thiscall TOneway::destroy(TOneway *this, char a2) +TOneway* __thiscall TOneway::destroy(TOneway* this, char a2) { -TOneway *v2; // esi + TOneway* v2; // esi -v2 = this; -TCollisionComponent::~TCollisionComponent(this); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + TCollisionComponent::~TCollisionComponent(this); + if (a2 & 1) + component_delete((void*)v2); + return v2; } diff --git a/Classes/TPinballComponent/TPinballComponent.cpp b/Classes/TPinballComponent/TPinballComponent.cpp index d3a7b78..0c390f8 100644 --- a/Classes/TPinballComponent/TPinballComponent.cpp +++ b/Classes/TPinballComponent/TPinballComponent.cpp @@ -13,9 +13,9 @@ void* TPinballComponent::operator new(size_t SizeOfElements) //----- (010159A9) -------------------------------------------------------- int TPinballComponent::Message(int a2, float a3) { - *(_DWORD*)((char*)this + 6) = a2; + *(DWORD*)((char*)this + 6) = a2; if (a2 == 1024) - * (_DWORD*)((char*)this + 6) = 0; + * (DWORD*)((char*)this + 6) = 0; return 0; } @@ -38,20 +38,20 @@ TPinballComponent* TPinballComponent::TPinballComponent(TPinballTable* a2, int a objlist_class* v11; // ecx int v12; // eax int v13; // ecx - _DWORD* v14; // eax + DWORD* v14; // eax signed int v15; // ebx - _DWORD* v16; // eax + DWORD* v16; // eax int v17; // eax - * (_DWORD*)((char*)this + 6) = 0; + * (DWORD*)((char*)this + 6) = 0; *((_BYTE*)this + 4) = 0; *((_BYTE*)this + 5) = 0; - *(_DWORD*)((char*)this + 30) = a2; - *(_DWORD*)((char*)this + 26) = 0; + *(DWORD*)((char*)this + 30) = a2; + *(DWORD*)((char*)this + 26) = 0; if (a2) objlist_class::Add((struct TPinballTable*)((char*)a2 + 250), (void*)this); if (a3 >= 0) - * (_DWORD*)((char*)this + 10) = loader_query_name(a3); + * (DWORD*)((char*)this + 10) = loader_query_name(a3); if (a4 && a3 >= 0) { this.v33 = loader_query_visual_states(a3); @@ -63,14 +63,14 @@ TPinballComponent* TPinballComponent::TPinballComponent(TPinballTable* a2, int a loader_query_visual(a3, (signed int)this.v31, &v19); if (this.v20) { - if (!*(_DWORD*)((char*)this + 34)) + if (!*(DWORD*)((char*)this + 34)) { v6 = (TZmapList*)operator new(8u); if (v6) v7 = TZmapList::TZmapList(v6, this.v33, 4); else v7 = 0; - *(_DWORD*)((char*)this + 34) = v7; + *(DWORD*)((char*)this + 34) = v7; } v8 = *(objlist_class * *)((char*)this + 34); if (v8) @@ -78,14 +78,14 @@ TPinballComponent* TPinballComponent::TPinballComponent(TPinballTable* a2, int a } if (this.v21) { - if (!*(_DWORD*)((char*)this + 38)) + if (!*(DWORD*)((char*)this + 38)) { v9 = (TZmapList*)operator new(8u); if (v9) v10 = TZmapList::TZmapList(v9, v33, 4); else v10 = 0; - *(_DWORD*)((char*)this + 38) = v10; + *(DWORD*)((char*)this + 38) = v10; } v11 = *(objlist_class * *)((char*)this + 38); if (v11) @@ -94,44 +94,44 @@ TPinballComponent* TPinballComponent::TPinballComponent(TPinballTable* a2, int a this.v31 = (struct TPinballTable*)((char*)v31 + 1); } while (this.v31 < this.v33); } - v12 = *(_DWORD*)((char*)this + 38); + v12 = *(DWORD*)((char*)this + 38); if (v12) - v30 = *(_DWORD*)(*(_DWORD*)(v12 + 4) + 8); - v13 = *(_DWORD*)((char*)this + 34); + v30 = *(DWORD*)(*(DWORD*)(v12 + 4) + 8); + v13 = *(DWORD*)((char*)this + 34); if (v13) { - v14 = *(_DWORD * *)(*(_DWORD*)(v13 + 4) + 8); - this.v26 = *(_DWORD*)((char*)v14 + 29) - *(_DWORD*)((char*)a2 + 234); + v14 = *(DWORD * *)(*(DWORD*)(v13 + 4) + 8); + this.v26 = *(DWORD*)((char*)v14 + 29) - *(DWORD*)((char*)a2 + 234); v15 = 1; - this.v27 = *(_DWORD*)((char*)v14 + 33) - *(_DWORD*)((char*)a2 + 238); + this.v27 = *(DWORD*)((char*)v14 + 33) - *(DWORD*)((char*)a2 + 238); this.v28 = v14[3]; this.v29 = v14[4]; - if (*(_DWORD*)(*(_DWORD*)(v13 + 4) + 4) > 1) + if (*(DWORD*)(*(DWORD*)(v13 + 4) + 4) > 1) { this.v32 = (struct TPinballTable*)12; do { - v16 = *(_DWORD * *)((char*)v32 + *(_DWORD*)(*(_DWORD*)((char*)this + 34) + 4)); - this.v22 = *(_DWORD*)((char*)v16 + 29) - *(_DWORD*)((char*)a2 + 234); - this.v23 = *(_DWORD*)((char*)v16 + 33) - *(_DWORD*)((char*)a2 + 238); + v16 = *(DWORD * *)((char*)v32 + *(DWORD*)(*(DWORD*)((char*)this + 34) + 4)); + this.v22 = *(DWORD*)((char*)v16 + 29) - *(DWORD*)((char*)a2 + 234); + this.v23 = *(DWORD*)((char*)v16 + 33) - *(DWORD*)((char*)a2 + 238); this.v24 = v16[3]; this.v25 = v16[4]; enclosing_box(&v26, &v22, &v26); this.v32 = (struct TPinballTable*)((char*)v32 + 4); ++v15; - } while (v15 < *(_DWORD*)(*(_DWORD*)(*(_DWORD*)((char*)this + 34) + 4) + 4)); + } while (v15 < *(DWORD*)(*(DWORD*)(*(DWORD*)((char*)this + 34) + 4) + 4)); } - v17 = *(_DWORD*)(*(_DWORD*)(*(_DWORD*)((char*)this + 34) + 4) + 8); - *(_DWORD*)((char*)this + 26) = render_create_sprite( + v17 = *(DWORD*)(*(DWORD*)(*(DWORD*)((char*)this + 34) + 4) + 8); + *(DWORD*)((char*)this + 26) = render_create_sprite( this.v33 > 0, - *(_DWORD*)(*(_DWORD*)(*(_DWORD*)((char*)this + 34) + 4) + 8), + *(DWORD*)(*(DWORD*)(*(DWORD*)((char*)this + 34) + 4) + 8), this.v30, - *(_DWORD*)(v17 + 29) - *(_DWORD*)((char*)a2 + 234), - *(_DWORD*)(v17 + 33) - *(_DWORD*)((char*)a2 + 238), + *(DWORD*)(v17 + 29) - *(DWORD*)((char*)a2 + 234), + *(DWORD*)(v17 + 33) - *(DWORD*)((char*)a2 + 238), &this.v26); } } - *(_DWORD*)((char*)this + 22) = a3; + *(DWORD*)((char*)this + 22) = a3; return this; } // 10024A8: using guessed type void *TPinballComponent::vftable; @@ -146,9 +146,9 @@ TZmapList* TPinballComponent::~TPinballComponent(TPinballComponent* this) v1 = this; result = *(TZmapList * *)((char*)this + 30); - *(_DWORD*)this = &TPinballComponent::vftable; + *(DWORD*)this = &TPinballComponent::vftable; if (result) - result = (TZmapList*)objlist_delete_object(*(_DWORD*)((char*)result + 254), (int)this); + result = (TZmapList*)objlist_delete_object(*(DWORD*)((char*)result + 254), (int)this); v3 = *(TZmapList * *)((char*)v1 + 34); if (v3) result = TZmapList::destroy(v3, 1); diff --git a/Classes/TPinballTable/TPinballTable.cpp b/Classes/TPinballTable/TPinballTable.cpp index ff0c497..a48221f 100644 --- a/Classes/TPinballTable/TPinballTable.cpp +++ b/Classes/TPinballTable/TPinballTable.cpp @@ -1,995 +1,984 @@ #include "TPinballTable.h" //----- (01017467) -------------------------------------------------------- -void TPinballTable::LightShow_timeout(int a1, void *a2) +void TPinballTable::LightShow_timeout(int a1, void* a2) { -void (**v2)(signed int, DWORD); // eax + void (**v2)(signed int, DWORD); // eax -v2 = *(void (***)(signed int, DWORD))a2; -*(DWORD *)((char *)a2 + 90) = 0; -(*v2)(1013, 0.0); + v2 = *(void (***)(signed int, DWORD))a2; + *(DWORD*)((char*)a2 + 90) = 0; + (*v2)(1013, 0.0); } //----- (0101748B) -------------------------------------------------------- -void TPinballTable::EndGame_timeout(int a1, void *a2) +void TPinballTable::EndGame_timeout(int a1, void* a2) { -char *v2; // esi -int v3; // eax -int v4; // edi -void (__thiscall ***v5)(DWORD, signed int, DWORD); // esi -char *v6; // eax -char *v7; // [esp+28h] [ebp+Ch] + char* v2; // esi + int v3; // eax + int v4; // edi + void(__thiscall * **v5)(DWORD, signed int, DWORD); // esi + char* v6; // eax + char* v7; // [esp+28h] [ebp+Ch] -v2 = (char *)a2; -*(DWORD *)((char *)a2 + 94) = 0; -pb_end_game(); -v3 = *(DWORD *)(*(DWORD *)((char *)a2 + 254) + 4) - 1; -if ( v3 >= 0 ) -{ -v4 = 4 * v3 + 8; -v7 = *(char **)(*(DWORD *)((char *)a2 + 254) + 4); -do -{ -(***(void (****)(signed int, DWORD))(v4 + *(DWORD *)(v2 + 254)))(1022, 0.0); -v4 -= 4; ---v7; -} -while ( v7 ); -} -v5 = *(void (__thiscall ****)(DWORD, signed int, DWORD))(v2 + 230); -if ( v5 ) -(**v5)(v5, 1022, 0.0); -control_handler(67, MissTextBox); -v6 = get_rc_string(24, 0); -TTextBox::Display(InfoTextBox, 1022, v6, -1.0); + v2 = (char*)a2; + *(DWORD*)((char*)a2 + 94) = 0; + pb_end_game(); + v3 = *(DWORD*)(*(DWORD*)((char*)a2 + 254) + 4) - 1; + if (v3 >= 0) + { + v4 = 4 * v3 + 8; + v7 = *(char**)(*(DWORD*)((char*)a2 + 254) + 4); + do + { + (***(void (****)(signed int, DWORD))(v4 + *(DWORD*)(v2 + 254)))(1022, 0.0); + v4 -= 4; + --v7; + } while (v7); + } + v5 = *(void(__thiscall * ***)(DWORD, signed int, DWORD))(v2 + 230); + if (v5) + (**v5)(v5, 1022, 0.0); + control_handler(67, MissTextBox); + v6 = get_rc_string(24, 0); + TTextBox::Display(InfoTextBox, 1022, v6, -1.0); } //----- (01017526) -------------------------------------------------------- -int __thiscall TPinballTable::AddScore(TPinballTable *this, int a2) +int __thiscall TPinballTable::AddScore(TPinballTable* this, int a2) { -DWORD *v2; // eax -DWORD *v3; // eax -int v4; // esi -int *v5; // eax -signed int v6; // edx + DWORD* v2; // eax + DWORD* v3; // eax + int v4; // esi + int* v5; // eax + signed int v6; // edx -if ( *(DWORD *)((char *)this + 318) ) -{ -v2 = (DWORD *)((char *)this + 314); -*v2 += a2; -if ( *(DWORD *)((char *)this + 314) > 5000000 ) -*v2 = 5000000; -} -if ( *(DWORD *)((char *)this + 310) ) -{ -v3 = (DWORD *)((char *)this + 306); -*v3 += a2; -if ( *(DWORD *)((char *)this + 306) > 5000000 ) -*v3 = 5000000; -} -v4 = *(DWORD *)((char *)this + 298) + a2 * dword_1024758[*(DWORD *)((char *)this + 294)]; -v5 = (int *)((char *)this + 82); -*v5 += v4; -v6 = *(DWORD *)((char *)this + 82); -if ( v6 > 1000000000 ) -{ -++*(DWORD *)((char *)this + 86); -*v5 = v6 - 1000000000; -} -score_set(*(DWORD **)((char *)this + 50), *v5); -return v4; + if (*(DWORD*)((char*)this + 318)) + { + v2 = (DWORD*)((char*)this + 314); + *v2 += a2; + if (*(DWORD*)((char*)this + 314) > 5000000) + * v2 = 5000000; + } + if (*(DWORD*)((char*)this + 310)) + { + v3 = (DWORD*)((char*)this + 306); + *v3 += a2; + if (*(DWORD*)((char*)this + 306) > 5000000) + * v3 = 5000000; + } + v4 = *(DWORD*)((char*)this + 298) + a2 * dword_1024758[*(DWORD*)((char*)this + 294)]; + v5 = (int*)((char*)this + 82); + *v5 += v4; + v6 = *(DWORD*)((char*)this + 82); + if (v6 > 1000000000) + { + ++* (DWORD*)((char*)this + 86); + *v5 = v6 - 1000000000; + } + score_set(*(DWORD * *)((char*)this + 50), *v5); + return v4; } //----- (010175AA) -------------------------------------------------------- -void TPinballTable::ChangeBallCount(TPinballTable *this, int a2, int a3) +void TPinballTable::ChangeBallCount(TPinballTable* this, int a2, int a3) { -TPinballTable *v3; // esi + TPinballTable* v3; // esi -v3 = this; -*(DWORD *)((char *)this + 326) = a3; -if ( a3 <= 0 ) -{ -score_erase(a2, *(DWORD **)((char *)this + 54), 1); -} -else -{ -score_set(*(DWORD **)((char *)this + 54), *(DWORD *)((char *)this + 330) - a3 + 1); -score_update(a2, *(int **)((char *)v3 + 54)); -} + v3 = this; + *(DWORD*)((char*)this + 326) = a3; + if (a3 <= 0) + { + score_erase(a2, *(DWORD * *)((char*)this + 54), 1); + } + else + { + score_set(*(DWORD * *)((char*)this + 54), *(DWORD*)((char*)this + 330) - a3 + 1); + score_update(a2, *(int**)((char*)v3 + 54)); + } } //----- (010175EF) -------------------------------------------------------- -void TPinballTable::replay_timer_callback(int a1, void *a2) +void TPinballTable::replay_timer_callback(int a1, void* a2) { -*(DWORD *)((char *)a2 + 354) = 0; -*(DWORD *)((char *)a2 + 358) = 0; + *(DWORD*)((char*)a2 + 354) = 0; + *(DWORD*)((char*)a2 + 358) = 0; } //----- (0101760E) -------------------------------------------------------- -void __thiscall TPinballTable::port_draw(TPinballTable *this) +void __thiscall TPinballTable::port_draw(TPinballTable* this) { -TPinballTable *v1; // edi -int v2; // eax -int v3; // esi -int v4; // ebx + TPinballTable* v1; // edi + int v2; // eax + int v3; // esi + int v4; // ebx -v1 = this; -v2 = *(DWORD *)(*(DWORD *)((char *)this + 254) + 4) - 1; -if ( v2 >= 0 ) -{ -v3 = 4 * v2 + 8; -v4 = *(DWORD *)(*(DWORD *)((char *)this + 254) + 4); -do -{ -(*(void (**)(void))(**(DWORD **)(v3 + *(DWORD *)((char *)v1 + 254)) + 4))(); -v3 -= 4; ---v4; -} -while ( v4 ); -} + v1 = this; + v2 = *(DWORD*)(*(DWORD*)((char*)this + 254) + 4) - 1; + if (v2 >= 0) + { + v3 = 4 * v2 + 8; + v4 = *(DWORD*)(*(DWORD*)((char*)this + 254) + 4); + do + { + (*(void (**)(void))(**(DWORD * *)(v3 + *(DWORD*)((char*)v1 + 254)) + 4))(); + v3 -= 4; + --v4; + } while (v4); + } } //----- (01017648) -------------------------------------------------------- -struct TPinballComponent *__thiscall TPinballTable::find_component(TPinballTable *this, char *lpString2) +struct TPinballComponent* __thiscall TPinballTable::find_component(TPinballTable* this, char* lpString2) { -TPinballTable *v2; // edi -signed int v3; // ebx -int v4; // esi -const CHAR *v5; // eax -struct TPinballComponent *result; // eax -int v7; // [esp+Ch] [ebp-8h] -int v8; // [esp+10h] [ebp-4h] + TPinballTable* v2; // edi + signed int v3; // ebx + int v4; // esi + const CHAR* v5; // eax + struct TPinballComponent* result; // eax + int v7; // [esp+Ch] [ebp-8h] + int v8; // [esp+10h] [ebp-4h] -v8 = 0; -v2 = this; -v7 = *(DWORD *)(*(DWORD *)((char *)this + 254) + 4); -if ( *(DWORD *)(*(DWORD *)((char *)this + 254) + 4) <= 0 ) -{ -LABEL_6: -MessageBoxA(0, "Table cant find:", lpString2, 0x2000u); -result = 0; -} -else -{ -v3 = 8; -while ( 1 ) -{ -v4 = *(DWORD *)(v3 + *(DWORD *)((char *)v2 + 254)); -v5 = *(const CHAR **)(v4 + 10); -if ( v5 ) -{ -if ( !lstrcmpA(v5, lpString2) ) -break; -} -++v8; -v3 += 4; -if ( v8 >= v7 ) -goto LABEL_6; -} -result = (struct TPinballComponent *)v4; -} -return result; + v8 = 0; + v2 = this; + v7 = *(DWORD*)(*(DWORD*)((char*)this + 254) + 4); + if (*(DWORD*)(*(DWORD*)((char*)this + 254) + 4) <= 0) + { + LABEL_6: + MessageBoxA(0, "Table cant find:", lpString2, 0x2000u); + result = 0; + } + else + { + v3 = 8; + while (1) + { + v4 = *(DWORD*)(v3 + *(DWORD*)((char*)v2 + 254)); + v5 = *(const CHAR * *)(v4 + 10); + if (v5) + { + if (!lstrcmpA(v5, lpString2)) + break; + } + ++v8; + v3 += 4; + if (v8 >= v7) + goto LABEL_6; + } + result = (struct TPinballComponent*)v4; + } + return result; } //----- (010176BE) -------------------------------------------------------- -struct TPinballComponent *__thiscall TPinballTable::find_component(TPinballTable *this, int Val) +struct TPinballComponent* __thiscall TPinballTable::find_component(TPinballTable* this, int Val) { -int v2; // eax -int v3; // ecx -int v4; // esi -int v5; // edx -struct TPinballComponent *result; // eax -char DstBuf; // [esp+8h] [ebp-CCh] + int v2; // eax + int v3; // ecx + int v4; // esi + int v5; // edx + struct TPinballComponent* result; // eax + char DstBuf; // [esp+8h] [ebp-CCh] -v2 = *(DWORD *)((char *)this + 254); -v3 = *(DWORD *)(v2 + 4); -v4 = 0; -if ( v3 <= 0 ) -{ -LABEL_5: -__itoa(Val, &DstBuf, 10); -MessageBoxA(0, "Table cant find (lh):", &DstBuf, 0x2000u); -result = 0; -} -else -{ -v5 = v2 + 8; -while ( 1 ) -{ -result = *(struct TPinballComponent **)v5; -if ( Val == *(DWORD *)(*(DWORD *)v5 + 22) ) -break; -++v4; -v5 += 4; -if ( v4 >= v3 ) -goto LABEL_5; -} -} -return result; + v2 = *(DWORD*)((char*)this + 254); + v3 = *(DWORD*)(v2 + 4); + v4 = 0; + if (v3 <= 0) + { + LABEL_5: + __itoa(Val, &DstBuf, 10); + MessageBoxA(0, "Table cant find (lh):", &DstBuf, 0x2000u); + result = 0; + } + else + { + v5 = v2 + 8; + while (1) + { + result = *(struct TPinballComponent**)v5; + if (Val == *(DWORD*)(*(DWORD*)v5 + 22)) + break; + ++v4; + v5 += 4; + if (v4 >= v3) + goto LABEL_5; + } + } + return result; } //----- (01017738) -------------------------------------------------------- -void TPinballTable::tilt_timeout(int a1, void *a2) +void TPinballTable::tilt_timeout(int a1, void* a2) { -int v2; // eax -DWORD *v3; // edi -int v4; // ebx -char v5; // [esp+14h] [ebp-Ch] + int v2; // eax + DWORD* v3; // edi + int v4; // ebx + char v5; // [esp+14h] [ebp-Ch] -*(DWORD *)((char *)a2 + 98) = 0; -if ( *(DWORD *)((char *)a2 + 370) ) -{ -v2 = *(DWORD *)((char *)a2 + 262); -v3 = (DWORD *)(v2 + 8); -if ( *(DWORD *)(v2 + 4) > 0 ) -{ -v4 = *(DWORD *)(v2 + 4); -do -{ -(*(void (**)(DWORD, char *, char *, DWORD, DWORD))(**(DWORD **)((char *)a2 + 226) + 20))( -*v3, -&v5, -&v5, -0.0, -0); -++v3; ---v4; -} -while ( v4 ); -} -} + *(DWORD*)((char*)a2 + 98) = 0; + if (*(DWORD*)((char*)a2 + 370)) + { + v2 = *(DWORD*)((char*)a2 + 262); + v3 = (DWORD*)(v2 + 8); + if (*(DWORD*)(v2 + 4) > 0) + { + v4 = *(DWORD*)(v2 + 4); + do + { + (*(void (**)(DWORD, char*, char*, DWORD, DWORD))(**(DWORD * *)((char*)a2 + 226) + 20))( + *v3, + &v5, + &v5, + 0.0, + 0); + ++v3; + --v4; + } while (v4); + } + } } //----- (01017791) -------------------------------------------------------- -void TPinballTable::tilt(TPinballTable *this, int a2, float a3) +void TPinballTable::tilt(TPinballTable* this, int a2, float a3) { -TPinballTable *v3; // esi -int v4; // ST14_4 -char *v5; // eax -int v6; // ebx -signed int v7; // ebx -int v8; // [esp+20h] [ebp-4h] + TPinballTable* v3; // esi + int v4; // ST14_4 + char* v5; // eax + int v6; // ebx + signed int v7; // ebx + int v8; // [esp+20h] [ebp-4h] -v3 = this; -if ( !*(DWORD *)((char *)this + 370) && !*(DWORD *)((char *)this + 78) ) -{ -v4 = a2; -TTextBox::Clear(InfoTextBox, a2); -TTextBox::Clear(MissTextBox, a2); -v5 = get_rc_string(35, 0); -TTextBox::Display(InfoTextBox, a2, v5, -1.0); -loader_play_sound(*(DWORD *)((char *)v3 + 74)); -*(DWORD *)((char *)v3 + 98) = timer_set(30.0, (int)v3, (int)TPinballTable::tilt_timeout); -v6 = *(DWORD *)(*(DWORD *)((char *)v3 + 254) + 4); -v8 = *(DWORD *)(*(DWORD *)((char *)v3 + 254) + 4); -(**(void (__thiscall ***)(TPinballTable *, signed int, DWORD, int))v3)(v3, 1011, -1.0, v4); -if ( v6 > 0 ) -{ -v7 = 8; -do -{ -(***(void (****)(signed int, DWORD))(v7 + *(DWORD *)((char *)v3 + 254)))(1011, LODWORD(a3)); -v7 += 4; ---v8; -} -while ( v8 ); -} -(***(void (****)(signed int))((char *)v3 + 266))(8); -*(DWORD *)((char *)v3 + 370) = 1; -table_control_handler(1011); -} + v3 = this; + if (!*(DWORD*)((char*)this + 370) && !*(DWORD*)((char*)this + 78)) + { + v4 = a2; + TTextBox::Clear(InfoTextBox, a2); + TTextBox::Clear(MissTextBox, a2); + v5 = get_rc_string(35, 0); + TTextBox::Display(InfoTextBox, a2, v5, -1.0); + loader_play_sound(*(DWORD*)((char*)v3 + 74)); + *(DWORD*)((char*)v3 + 98) = timer_set(30.0, (int)v3, (int)TPinballTable::tilt_timeout); + v6 = *(DWORD*)(*(DWORD*)((char*)v3 + 254) + 4); + v8 = *(DWORD*)(*(DWORD*)((char*)v3 + 254) + 4); + (**(void(__thiscall * **)(TPinballTable*, signed int, DWORD, int))v3)(v3, 1011, -1.0, v4); + if (v6 > 0) + { + v7 = 8; + do + { + (***(void (****)(signed int, DWORD))(v7 + *(DWORD*)((char*)v3 + 254)))(1011, LODWORD(a3)); + v7 += 4; + --v8; + } while (v8); + } + (***(void (****)(signed int))((char*)v3 + 266))(8); + *(DWORD*)((char*)v3 + 370) = 1; + table_control_handler(1011); + } } //----- (010187D6) -------------------------------------------------------- -int TPinballTable::Message(TPinballTable *this, int a2, int a3, float a4) +int TPinballTable::Message(TPinballTable* this, int a2, int a3, float a4) { -TPinballTable *v4; // esi -int v5; // eax -int v6; // edi -int v7; // ebx -int v8; // eax -int v9; // eax -signed __int64 v10; // rax -DWORD *v11; // ST14_4 -bool v12; // zf -bool v13; // sf -unsigned __int8 v14; // of -DWORD *v15; // edi -signed int v16; // eax -int v17; // edi -float v18; // ST10_4 -char *v19; // eax -void (__thiscall ***v20)(DWORD, signed int, DWORD); // esi -float v21; // ST10_4 -signed int v22; // ebx -int v23; // ecx -int v24; // eax -int v25; // ST18_4 -DWORD *v26; // ST14_4 -int v27; // edi -float v28; // ST28_4 -char *v29; // eax -char *v30; // eax -void (__thiscall ***v31)(DWORD, signed int, DWORD); // esi -void (__thiscall ***v32)(DWORD, signed int, DWORD); // esi -int v33; // eax -int v34; // edi -int v35; // ebx -char *v36; // eax -float v38; // [esp+18h] [ebp-18h] -int v39; // [esp+2Ch] [ebp-4h] -signed int v40; // [esp+3Ch] [ebp+Ch] -DWORD **v41; // [esp+3Ch] [ebp+Ch] -signed int v42; // [esp+3Ch] [ebp+Ch] + TPinballTable* v4; // esi + int v5; // eax + int v6; // edi + int v7; // ebx + int v8; // eax + int v9; // eax + signed __int64 v10; // rax + DWORD* v11; // ST14_4 + bool v12; // zf + bool v13; // sf + unsigned __int8 v14; // of + DWORD* v15; // edi + signed int v16; // eax + int v17; // edi + float v18; // ST10_4 + char* v19; // eax + void(__thiscall * **v20)(DWORD, signed int, DWORD); // esi + float v21; // ST10_4 + signed int v22; // ebx + int v23; // ecx + int v24; // eax + int v25; // ST18_4 + DWORD* v26; // ST14_4 + int v27; // edi + float v28; // ST28_4 + char* v29; // eax + char* v30; // eax + void(__thiscall * **v31)(DWORD, signed int, DWORD); // esi + void(__thiscall * **v32)(DWORD, signed int, DWORD); // esi + int v33; // eax + int v34; // edi + int v35; // ebx + char* v36; // eax + float v38; // [esp+18h] [ebp-18h] + int v39; // [esp+2Ch] [ebp-4h] + signed int v40; // [esp+3Ch] [ebp+Ch] + DWORD** v41; // [esp+3Ch] [ebp+Ch] + signed int v42; // [esp+3Ch] [ebp+Ch] -v4 = this; -switch ( a3 ) -{ -case 1000: -if ( !*(DWORD *)((char *)this + 370) ) -{ -v32 = *(void (__thiscall ****)(DWORD, signed int, DWORD))((char *)this + 42); -goto LABEL_73; -} -goto LABEL_81; -case 1001: -if ( !*(DWORD *)((char *)this + 370) ) -{ -v31 = *(void (__thiscall ****)(DWORD, signed int, DWORD))((char *)this + 42); -goto LABEL_70; -} -goto LABEL_81; -case 1002: -if ( !*(DWORD *)((char *)this + 370) ) -{ -v32 = *(void (__thiscall ****)(DWORD, signed int, DWORD))((char *)this + 46); -LABEL_73: -(**v32)(v32, 1, LODWORD(a4)); -} -goto LABEL_81; -case 1003: -if ( !*(DWORD *)((char *)this + 370) ) -{ -v31 = *(void (__thiscall ****)(DWORD, signed int, DWORD))((char *)this + 46); -LABEL_70: -(**v31)(v31, 2, LODWORD(a4)); -} -goto LABEL_81; -case 1004: -case 1005: -(***(void (__thiscall ****)(DWORD, int, DWORD))((char *)this + 222))( -*(DWORD *)((char *)this + 222), -a3, -LODWORD(a4)); -goto LABEL_81; -case 1008: -case 1009: -case 1010: -v33 = *(DWORD *)(*(DWORD *)((char *)this + 254) + 4) - 1; -if ( v33 >= 0 ) -{ -v34 = 4 * v33 + 8; -v35 = *(DWORD *)(*(DWORD *)((char *)this + 254) + 4); -do -{ -(***(void (****)(int, DWORD))(v34 + *(DWORD *)((char *)v4 + 254)))(a3, LODWORD(a4)); -v34 -= 4; ---v35; -} -while ( v35 ); -} -goto LABEL_81; -case 1012: -(***(void (****)(signed int, DWORD))((char *)this + 266))(14, 0.0); -if ( *(DWORD *)((char *)v4 + 370) ) -{ -*(DWORD *)((char *)v4 + 370) = 0; -if ( *(DWORD *)((char *)v4 + 98) ) -timer_kill(*(DWORD *)((char *)v4 + 98)); -*(DWORD *)((char *)v4 + 98) = 0; -} -goto LABEL_81; -case 1013: -(***(void (****)(signed int, DWORD))((char *)this + 266))(34, 0.0); -(***(void (****)(signed int, DWORD))((char *)v4 + 266))(20, 0.0); -(***(void (****)(signed int, DWORD))((char *)v4 + 222))(1016, 0.0); -if ( *(_BYTE *)(*(DWORD *)((char *)v4 + 230) + 5) ) -v19 = get_rc_string(30, 0); -else -v19 = get_rc_string(26, 0); -TTextBox::Display(InfoTextBox, 0, v19, -1.0); -v20 = *(void (__thiscall ****)(DWORD, signed int, DWORD))((char *)v4 + 230); -if ( v20 ) -(**v20)(v20, 1014, 0.0); -goto LABEL_81; -case 1014: -if ( *(DWORD *)((char *)this + 94) ) -{ -timer_kill(*(DWORD *)((char *)this + 94)); -TPinballTable::EndGame_timeout(0, (void *)v4); -pb_mode_change(1); -} -if ( *(DWORD *)((char *)v4 + 90) ) -{ -timer_kill(*(DWORD *)((char *)v4 + 90)); -*(DWORD *)((char *)v4 + 90) = 0; -TPinballTable::Message(v4, 1013, 0.0); -} -else -{ -*(DWORD *)((char *)v4 + 62) = 0; -TPinballTable::Message(v4, 1024, 0.0); -v9 = *(DWORD *)(*(DWORD *)((char *)v4 + 262) + 8); -*(float *)(v9 + 46) = 0.0; -*(float *)(v9 + 42) = 0.0; -*(DWORD *)(v9 + 50) = -1085485875; -v10 = (signed __int64)_floor(a4); -*(DWORD *)((char *)v4 + 214) = v10; -if ( (signed int)v10 >= 1 ) -{ -if ( (signed int)v10 > 4 ) -*(DWORD *)((char *)v4 + 214) = 4; -} -else -{ -*(DWORD *)((char *)v4 + 214) = 1; -} -v11 = *(DWORD **)((char *)v4 + 102); -*(DWORD *)((char *)v4 + 218) = 0; -*(DWORD *)((char *)v4 + 50) = v11; -*(DWORD *)((char *)v4 + 82) = 0; -score_set(v11, 0); -v14 = __OFSUB__(*(DWORD *)((char *)v4 + 214), 1); -v12 = *(DWORD *)((char *)v4 + 214) == 1; -v13 = *(DWORD *)((char *)v4 + 214) - 1 < 0; -*(DWORD *)((char *)v4 + 294) = 0; -v40 = 1; -if ( !((unsigned __int8)(v13 ^ v14) | v12) ) -{ -v15 = (DWORD *)((char *)v4 + 134); -do -{ -score_set((DWORD *)*(v15 - 1), 0); -++v40; -*v15 = 0; -v15[1] = 0; -v15[3] = *(DWORD *)((char *)v4 + 330); -v15[4] = *(DWORD *)((char *)v4 + 334); -v15[5] = *(DWORD *)((char *)v4 + 342); -v15[2] = *(DWORD *)((char *)v4 + 314); -v15 += 7; -} -while ( v40 < *(DWORD *)((char *)v4 + 214) ); -} -*(DWORD *)((char *)v4 + 326) = *(DWORD *)((char *)v4 + 330); -Sound_Idle(); -TPinballTable::ChangeBallCount(v4, 0, *(DWORD *)((char *)v4 + 326)); -score_set(*(DWORD **)((char *)v4 + 58), *(DWORD *)((char *)v4 + 218) + 1); -score_update(0, *(int **)((char *)v4 + 58)); -Sound_Idle(); -v16 = *(DWORD *)((char *)v4 + 214); -if ( v16 < 4 ) -{ -v41 = (DWORD **)((char *)v4 + 28 * v16 + 102); -v17 = 4 - v16; -do -{ -score_set(*v41, -1); -v41 += 7; ---v17; -} -while ( v17 ); -} -Sound_Idle(); -*(DWORD *)((char *)v4 + 318) = 0; -*(DWORD *)((char *)v4 + 310) = 0; -*(DWORD *)((char *)v4 + 322) = 0; -TTextBox::Clear(InfoTextBox, 0); -Sound_Idle(); -TTextBox::Clear(MissTextBox, 0); -Sound_Idle(); -(***(void (****)(signed int, DWORD))((char *)v4 + 266))(28, 0.2); -v18 = loader_play_sound(*(DWORD *)((char *)v4 + 66)); -*(DWORD *)((char *)v4 + 90) = timer_set(v18, (int)v4, (int)TPinballTable::LightShow_timeout); -} -goto LABEL_81; -case 1018: -if ( *(DWORD *)((char *)this + 358) ) -timer_kill(*(DWORD *)((char *)this + 358)); -v21 = _floor(a4); -*(DWORD *)((char *)v4 + 358) = timer_set(v21, (int)v4, (int)TPinballTable::replay_timer_callback); -*(DWORD *)((char *)v4 + 354) = 1; -goto LABEL_81; -case 1021: -v22 = *(DWORD *)((char *)this + 214); -if ( v22 > 1 ) -{ -v23 = *(DWORD *)((char *)this + 218); -v39 = (v23 + 1) % v22; -v24 = (int)v4 + 28 * v39; -if ( *(DWORD *)(v24 + 118) <= 0 ) -goto LABEL_81; -*(DWORD *)((char *)v4 + 28 * v23 + 106) = *(DWORD *)((char *)v4 + 82); -*(DWORD *)((char *)v4 + 28 * *(DWORD *)((char *)v4 + 218) + 110) = *(DWORD *)((char *)v4 + 86); -*(DWORD *)((char *)v4 + 28 * *(DWORD *)((char *)v4 + 218) + 118) = *(DWORD *)((char *)v4 + 326); -*(DWORD *)((char *)v4 + 28 * *(DWORD *)((char *)v4 + 218) + 122) = *(DWORD *)((char *)v4 + 334); -*(DWORD *)((char *)v4 + 28 * *(DWORD *)((char *)v4 + 218) + 126) = *(DWORD *)((char *)v4 + 342); -*(DWORD *)((char *)v4 + 28 * *(DWORD *)((char *)v4 + 218) + 114) = *(DWORD *)((char *)v4 + 314); -*(DWORD *)((char *)v4 + 82) = *(DWORD *)(v24 + 106); -v25 = *(DWORD *)((char *)v4 + 82); -*(DWORD *)((char *)v4 + 86) = *(DWORD *)(v24 + 110); -*(DWORD *)((char *)v4 + 326) = *(DWORD *)(v24 + 118); -*(DWORD *)((char *)v4 + 334) = *(DWORD *)(v24 + 122); -*(DWORD *)((char *)v4 + 342) = *(DWORD *)(v24 + 126); -*(DWORD *)((char *)v4 + 314) = *(DWORD *)(v24 + 114); -v26 = *(DWORD **)(v24 + 102); -*(DWORD *)((char *)v4 + 50) = v26; -score_set(v26, v25); -*(DWORD *)(*(DWORD *)((char *)v4 + 50) + 4) = 1; -TPinballTable::ChangeBallCount(v4, 0, *(DWORD *)((char *)v4 + 326)); -score_set(*(DWORD **)((char *)v4 + 58), v39 + 1); -score_update(0, *(int **)((char *)v4 + 58)); -v27 = 0; -if ( *(DWORD *)(*(DWORD *)((char *)v4 + 254) + 4) > 0 ) -{ -v42 = 8; -do -{ -v28 = (double)v39; -(***(void (****)(signed int, DWORD))(v42 + *(DWORD *)((char *)v4 + 254)))(1020, LODWORD(v28)); -v42 += 4; -++v27; -} -while ( v27 < *(DWORD *)(*(DWORD *)((char *)v4 + 254) + 4) ); -} -if ( v39 ) -{ -switch ( v39 ) -{ -case 1: -v38 = -1.0; -if ( *(_BYTE *)(*(DWORD *)((char *)v4 + 230) + 5) ) -v29 = get_rc_string(31, 0); -else -v29 = get_rc_string(27, 0); -break; -case 2: -v38 = -1.0; -if ( *(_BYTE *)(*(DWORD *)((char *)v4 + 230) + 5) ) -v29 = get_rc_string(32, 0); -else -v29 = get_rc_string(28, 0); -break; -case 3: -v38 = -1.0; -if ( *(_BYTE *)(*(DWORD *)((char *)v4 + 230) + 5) ) -v29 = get_rc_string(33, 0); -else -v29 = get_rc_string(29, 0); -break; -default: -LABEL_59: -*(DWORD *)((char *)v4 + 318) = 0; -*(DWORD *)((char *)v4 + 310) = 0; -*(DWORD *)((char *)v4 + 322) = 0; -*(DWORD *)((char *)v4 + 218) = v39; -goto LABEL_81; -} -} -else -{ -v38 = -1.0; -if ( *(_BYTE *)(*(DWORD *)((char *)v4 + 230) + 5) ) -v29 = get_rc_string(30, 0); -else -v29 = get_rc_string(26, 0); -} -TTextBox::Display(InfoTextBox, 0, v29, v38); -goto LABEL_59; -} -if ( *(_BYTE *)(*(DWORD *)((char *)this + 230) + 5) ) -v30 = get_rc_string(30, 0); -else -v30 = get_rc_string(26, 0); -TTextBox::Display(InfoTextBox, 0, v30, -1.0); -LABEL_81: -table_control_handler(a3); -return 0; -case 1022: -loader_play_sound(*(DWORD *)((char *)this + 70)); -TTextBox::Clear(MissTextBox, a2); -v36 = get_rc_string(34, 0); -TTextBox::Display(InfoTextBox, a2, v36, -1.0); -*(DWORD *)((char *)v4 + 94) = timer_set(3.0, (int)v4, (int)TPinballTable::EndGame_timeout); -goto LABEL_81; -case 1024: -v5 = *(DWORD *)(*(DWORD *)((char *)this + 254) + 4) - 1; -if ( v5 >= 0 ) -{ -v6 = 4 * v5 + 8; -v7 = *(DWORD *)(*(DWORD *)((char *)this + 254) + 4); -do -{ -(***(void (****)(signed int, DWORD))(v6 + *(DWORD *)((char *)v4 + 254)))(1024, 0.0); -v6 -= 4; ---v7; -} -while ( v7 ); -} -if ( *(DWORD *)((char *)v4 + 358) ) -timer_kill(*(DWORD *)((char *)v4 + 358)); -v8 = *(DWORD *)((char *)v4 + 90); -*(DWORD *)((char *)v4 + 358) = 0; -if ( v8 ) -{ -timer_kill(v8); -(***(void (****)(signed int, DWORD))((char *)v4 + 266))(34, 0.0); -} -*(DWORD *)((char *)v4 + 90) = 0; -*(DWORD *)((char *)v4 + 294) = 0; -*(DWORD *)((char *)v4 + 298) = 0; -*(DWORD *)((char *)v4 + 302) = 0; -*(DWORD *)((char *)v4 + 306) = 10000; -*(DWORD *)((char *)v4 + 310) = 0; -*(DWORD *)((char *)v4 + 314) = 20000; -*(DWORD *)((char *)v4 + 318) = 0; -*(DWORD *)((char *)v4 + 322) = 0; -*(DWORD *)((char *)v4 + 334) = 0; -*(DWORD *)((char *)v4 + 338) = 0; -*(DWORD *)((char *)v4 + 342) = 0; -*(DWORD *)((char *)v4 + 346) = 0; -*(DWORD *)((char *)v4 + 350) = 0; -*(DWORD *)((char *)v4 + 354) = 0; -*(DWORD *)((char *)v4 + 358) = 0; -*(DWORD *)((char *)v4 + 370) = 0; -goto LABEL_81; -default: -goto LABEL_81; -} + v4 = this; + switch (a3) + { + case 1000: + if (!*(DWORD*)((char*)this + 370)) + { + v32 = *(void(__thiscall * ***)(DWORD, signed int, DWORD))((char*)this + 42); + goto LABEL_73; + } + goto LABEL_81; + case 1001: + if (!*(DWORD*)((char*)this + 370)) + { + v31 = *(void(__thiscall * ***)(DWORD, signed int, DWORD))((char*)this + 42); + goto LABEL_70; + } + goto LABEL_81; + case 1002: + if (!*(DWORD*)((char*)this + 370)) + { + v32 = *(void(__thiscall * ***)(DWORD, signed int, DWORD))((char*)this + 46); + LABEL_73: + (**v32)(v32, 1, LODWORD(a4)); + } + goto LABEL_81; + case 1003: + if (!*(DWORD*)((char*)this + 370)) + { + v31 = *(void(__thiscall * ***)(DWORD, signed int, DWORD))((char*)this + 46); + LABEL_70: + (**v31)(v31, 2, LODWORD(a4)); + } + goto LABEL_81; + case 1004: + case 1005: + (***(void(__thiscall * ***)(DWORD, int, DWORD))((char*)this + 222))( + *(DWORD*)((char*)this + 222), + a3, + LODWORD(a4)); + goto LABEL_81; + case 1008: + case 1009: + case 1010: + v33 = *(DWORD*)(*(DWORD*)((char*)this + 254) + 4) - 1; + if (v33 >= 0) + { + v34 = 4 * v33 + 8; + v35 = *(DWORD*)(*(DWORD*)((char*)this + 254) + 4); + do + { + (***(void (****)(int, DWORD))(v34 + *(DWORD*)((char*)v4 + 254)))(a3, LODWORD(a4)); + v34 -= 4; + --v35; + } while (v35); + } + goto LABEL_81; + case 1012: + (***(void (****)(signed int, DWORD))((char*)this + 266))(14, 0.0); + if (*(DWORD*)((char*)v4 + 370)) + { + *(DWORD*)((char*)v4 + 370) = 0; + if (*(DWORD*)((char*)v4 + 98)) + timer_kill(*(DWORD*)((char*)v4 + 98)); + *(DWORD*)((char*)v4 + 98) = 0; + } + goto LABEL_81; + case 1013: + (***(void (****)(signed int, DWORD))((char*)this + 266))(34, 0.0); + (***(void (****)(signed int, DWORD))((char*)v4 + 266))(20, 0.0); + (***(void (****)(signed int, DWORD))((char*)v4 + 222))(1016, 0.0); + if (*(_BYTE*)(*(DWORD*)((char*)v4 + 230) + 5)) + v19 = get_rc_string(30, 0); + else + v19 = get_rc_string(26, 0); + TTextBox::Display(InfoTextBox, 0, v19, -1.0); + v20 = *(void(__thiscall * ***)(DWORD, signed int, DWORD))((char*)v4 + 230); + if (v20) + (**v20)(v20, 1014, 0.0); + goto LABEL_81; + case 1014: + if (*(DWORD*)((char*)this + 94)) + { + timer_kill(*(DWORD*)((char*)this + 94)); + TPinballTable::EndGame_timeout(0, (void*)v4); + pb_mode_change(1); + } + if (*(DWORD*)((char*)v4 + 90)) + { + timer_kill(*(DWORD*)((char*)v4 + 90)); + *(DWORD*)((char*)v4 + 90) = 0; + TPinballTable::Message(v4, 1013, 0.0); + } + else + { + *(DWORD*)((char*)v4 + 62) = 0; + TPinballTable::Message(v4, 1024, 0.0); + v9 = *(DWORD*)(*(DWORD*)((char*)v4 + 262) + 8); + *(float*)(v9 + 46) = 0.0; + *(float*)(v9 + 42) = 0.0; + *(DWORD*)(v9 + 50) = -1085485875; + v10 = (signed __int64)_floor(a4); + *(DWORD*)((char*)v4 + 214) = v10; + if ((signed int)v10 >= 1) + { + if ((signed int)v10 > 4) + * (DWORD*)((char*)v4 + 214) = 4; + } + else + { + *(DWORD*)((char*)v4 + 214) = 1; + } + v11 = *(DWORD * *)((char*)v4 + 102); + *(DWORD*)((char*)v4 + 218) = 0; + *(DWORD*)((char*)v4 + 50) = v11; + *(DWORD*)((char*)v4 + 82) = 0; + score_set(v11, 0); + v14 = __OFSUB__(*(DWORD*)((char*)v4 + 214), 1); + v12 = *(DWORD*)((char*)v4 + 214) == 1; + v13 = *(DWORD*)((char*)v4 + 214) - 1 < 0; + *(DWORD*)((char*)v4 + 294) = 0; + v40 = 1; + if (!((unsigned __int8)(v13 ^ v14) | v12)) + { + v15 = (DWORD*)((char*)v4 + 134); + do + { + score_set((DWORD*) * (v15 - 1), 0); + ++v40; + *v15 = 0; + v15[1] = 0; + v15[3] = *(DWORD*)((char*)v4 + 330); + v15[4] = *(DWORD*)((char*)v4 + 334); + v15[5] = *(DWORD*)((char*)v4 + 342); + v15[2] = *(DWORD*)((char*)v4 + 314); + v15 += 7; + } while (v40 < *(DWORD*)((char*)v4 + 214)); + } + *(DWORD*)((char*)v4 + 326) = *(DWORD*)((char*)v4 + 330); + Sound_Idle(); + TPinballTable::ChangeBallCount(v4, 0, *(DWORD*)((char*)v4 + 326)); + score_set(*(DWORD * *)((char*)v4 + 58), *(DWORD*)((char*)v4 + 218) + 1); + score_update(0, *(int**)((char*)v4 + 58)); + Sound_Idle(); + v16 = *(DWORD*)((char*)v4 + 214); + if (v16 < 4) + { + v41 = (DWORD * *)((char*)v4 + 28 * v16 + 102); + v17 = 4 - v16; + do + { + score_set(*v41, -1); + v41 += 7; + --v17; + } while (v17); + } + Sound_Idle(); + *(DWORD*)((char*)v4 + 318) = 0; + *(DWORD*)((char*)v4 + 310) = 0; + *(DWORD*)((char*)v4 + 322) = 0; + TTextBox::Clear(InfoTextBox, 0); + Sound_Idle(); + TTextBox::Clear(MissTextBox, 0); + Sound_Idle(); + (***(void (****)(signed int, DWORD))((char*)v4 + 266))(28, 0.2); + v18 = loader_play_sound(*(DWORD*)((char*)v4 + 66)); + *(DWORD*)((char*)v4 + 90) = timer_set(v18, (int)v4, (int)TPinballTable::LightShow_timeout); + } + goto LABEL_81; + case 1018: + if (*(DWORD*)((char*)this + 358)) + timer_kill(*(DWORD*)((char*)this + 358)); + v21 = _floor(a4); + *(DWORD*)((char*)v4 + 358) = timer_set(v21, (int)v4, (int)TPinballTable::replay_timer_callback); + *(DWORD*)((char*)v4 + 354) = 1; + goto LABEL_81; + case 1021: + v22 = *(DWORD*)((char*)this + 214); + if (v22 > 1) + { + v23 = *(DWORD*)((char*)this + 218); + v39 = (v23 + 1) % v22; + v24 = (int)v4 + 28 * v39; + if (*(DWORD*)(v24 + 118) <= 0) + goto LABEL_81; + *(DWORD*)((char*)v4 + 28 * v23 + 106) = *(DWORD*)((char*)v4 + 82); + *(DWORD*)((char*)v4 + 28 * *(DWORD*)((char*)v4 + 218) + 110) = *(DWORD*)((char*)v4 + 86); + *(DWORD*)((char*)v4 + 28 * *(DWORD*)((char*)v4 + 218) + 118) = *(DWORD*)((char*)v4 + 326); + *(DWORD*)((char*)v4 + 28 * *(DWORD*)((char*)v4 + 218) + 122) = *(DWORD*)((char*)v4 + 334); + *(DWORD*)((char*)v4 + 28 * *(DWORD*)((char*)v4 + 218) + 126) = *(DWORD*)((char*)v4 + 342); + *(DWORD*)((char*)v4 + 28 * *(DWORD*)((char*)v4 + 218) + 114) = *(DWORD*)((char*)v4 + 314); + *(DWORD*)((char*)v4 + 82) = *(DWORD*)(v24 + 106); + v25 = *(DWORD*)((char*)v4 + 82); + *(DWORD*)((char*)v4 + 86) = *(DWORD*)(v24 + 110); + *(DWORD*)((char*)v4 + 326) = *(DWORD*)(v24 + 118); + *(DWORD*)((char*)v4 + 334) = *(DWORD*)(v24 + 122); + *(DWORD*)((char*)v4 + 342) = *(DWORD*)(v24 + 126); + *(DWORD*)((char*)v4 + 314) = *(DWORD*)(v24 + 114); + v26 = *(DWORD * *)(v24 + 102); + *(DWORD*)((char*)v4 + 50) = v26; + score_set(v26, v25); + *(DWORD*)(*(DWORD*)((char*)v4 + 50) + 4) = 1; + TPinballTable::ChangeBallCount(v4, 0, *(DWORD*)((char*)v4 + 326)); + score_set(*(DWORD * *)((char*)v4 + 58), v39 + 1); + score_update(0, *(int**)((char*)v4 + 58)); + v27 = 0; + if (*(DWORD*)(*(DWORD*)((char*)v4 + 254) + 4) > 0) + { + v42 = 8; + do + { + v28 = (double)v39; + (***(void (****)(signed int, DWORD))(v42 + *(DWORD*)((char*)v4 + 254)))(1020, LODWORD(v28)); + v42 += 4; + ++v27; + } while (v27 < *(DWORD*)(*(DWORD*)((char*)v4 + 254) + 4)); + } + if (v39) + { + switch (v39) + { + case 1: + v38 = -1.0; + if (*(_BYTE*)(*(DWORD*)((char*)v4 + 230) + 5)) + v29 = get_rc_string(31, 0); + else + v29 = get_rc_string(27, 0); + break; + case 2: + v38 = -1.0; + if (*(_BYTE*)(*(DWORD*)((char*)v4 + 230) + 5)) + v29 = get_rc_string(32, 0); + else + v29 = get_rc_string(28, 0); + break; + case 3: + v38 = -1.0; + if (*(_BYTE*)(*(DWORD*)((char*)v4 + 230) + 5)) + v29 = get_rc_string(33, 0); + else + v29 = get_rc_string(29, 0); + break; + default: + LABEL_59: + *(DWORD*)((char*)v4 + 318) = 0; + *(DWORD*)((char*)v4 + 310) = 0; + *(DWORD*)((char*)v4 + 322) = 0; + *(DWORD*)((char*)v4 + 218) = v39; + goto LABEL_81; + } + } + else + { + v38 = -1.0; + if (*(_BYTE*)(*(DWORD*)((char*)v4 + 230) + 5)) + v29 = get_rc_string(30, 0); + else + v29 = get_rc_string(26, 0); + } + TTextBox::Display(InfoTextBox, 0, v29, v38); + goto LABEL_59; + } + if (*(_BYTE*)(*(DWORD*)((char*)this + 230) + 5)) + v30 = get_rc_string(30, 0); + else + v30 = get_rc_string(26, 0); + TTextBox::Display(InfoTextBox, 0, v30, -1.0); + LABEL_81: + table_control_handler(a3); + return 0; + case 1022: + loader_play_sound(*(DWORD*)((char*)this + 70)); + TTextBox::Clear(MissTextBox, a2); + v36 = get_rc_string(34, 0); + TTextBox::Display(InfoTextBox, a2, v36, -1.0); + *(DWORD*)((char*)v4 + 94) = timer_set(3.0, (int)v4, (int)TPinballTable::EndGame_timeout); + goto LABEL_81; + case 1024: + v5 = *(DWORD*)(*(DWORD*)((char*)this + 254) + 4) - 1; + if (v5 >= 0) + { + v6 = 4 * v5 + 8; + v7 = *(DWORD*)(*(DWORD*)((char*)this + 254) + 4); + do + { + (***(void (****)(signed int, DWORD))(v6 + *(DWORD*)((char*)v4 + 254)))(1024, 0.0); + v6 -= 4; + --v7; + } while (v7); + } + if (*(DWORD*)((char*)v4 + 358)) + timer_kill(*(DWORD*)((char*)v4 + 358)); + v8 = *(DWORD*)((char*)v4 + 90); + *(DWORD*)((char*)v4 + 358) = 0; + if (v8) + { + timer_kill(v8); + (***(void (****)(signed int, DWORD))((char*)v4 + 266))(34, 0.0); + } + *(DWORD*)((char*)v4 + 90) = 0; + *(DWORD*)((char*)v4 + 294) = 0; + *(DWORD*)((char*)v4 + 298) = 0; + *(DWORD*)((char*)v4 + 302) = 0; + *(DWORD*)((char*)v4 + 306) = 10000; + *(DWORD*)((char*)v4 + 310) = 0; + *(DWORD*)((char*)v4 + 314) = 20000; + *(DWORD*)((char*)v4 + 318) = 0; + *(DWORD*)((char*)v4 + 322) = 0; + *(DWORD*)((char*)v4 + 334) = 0; + *(DWORD*)((char*)v4 + 338) = 0; + *(DWORD*)((char*)v4 + 342) = 0; + *(DWORD*)((char*)v4 + 346) = 0; + *(DWORD*)((char*)v4 + 350) = 0; + *(DWORD*)((char*)v4 + 354) = 0; + *(DWORD*)((char*)v4 + 358) = 0; + *(DWORD*)((char*)v4 + 370) = 0; + goto LABEL_81; + default: + goto LABEL_81; + } } //----- (0101A951) -------------------------------------------------------- -TZmapList *__thiscall TPinballTable::~TPinballTable(TPinballTable *this) +TZmapList* __thiscall TPinballTable::~TPinballTable(TPinballTable* this) { -TPinballTable *v1; // esi -int *v2; // edi -int i; // ecx -signed int v5; // [esp+Ch] [ebp-4h] + TPinballTable* v1; // esi + int* v2; // edi + int i; // ecx + signed int v5; // [esp+Ch] [ebp-4h] -v1 = this; -*(DWORD *)this = &TPinballTable::vftable; -v2 = (int *)((char *)this + 102); -v5 = 4; -do -{ -if ( *v2 ) -{ -objlist_destroy(*v2); -*v2 = 0; -} -v2 += 7; ---v5; -} -while ( v5 ); -if ( *(DWORD *)((char *)v1 + 58) ) -{ -objlist_destroy(*(DWORD *)((char *)v1 + 58)); -*(DWORD *)((char *)v1 + 58) = 0; -} -if ( *(DWORD *)((char *)v1 + 54) ) -{ -objlist_destroy(*(DWORD *)((char *)v1 + 54)); -*(DWORD *)((char *)v1 + 54) = 0; -} -for ( i = *(DWORD *)((char *)v1 + 266); ; i = *(DWORD *)(*(DWORD *)((char *)v1 + 254) + 8) ) -{ -if ( i ) -(*(void (**)(signed int))(*(DWORD *)i + 16))(1); -if ( !*(DWORD *)(*(DWORD *)((char *)v1 + 254) + 4) ) -break; -} -objlist_destroy(*(DWORD *)((char *)v1 + 262)); -objlist_destroy(*(DWORD *)((char *)v1 + 254)); -return TPinballComponent::~TPinballComponent(v1); + v1 = this; + *(DWORD*)this = &TPinballTable::vftable; + v2 = (int*)((char*)this + 102); + v5 = 4; + do + { + if (*v2) + { + objlist_destroy(*v2); + *v2 = 0; + } + v2 += 7; + --v5; + } while (v5); + if (*(DWORD*)((char*)v1 + 58)) + { + objlist_destroy(*(DWORD*)((char*)v1 + 58)); + *(DWORD*)((char*)v1 + 58) = 0; + } + if (*(DWORD*)((char*)v1 + 54)) + { + objlist_destroy(*(DWORD*)((char*)v1 + 54)); + *(DWORD*)((char*)v1 + 54) = 0; + } + for (i = *(DWORD*)((char*)v1 + 266); ; i = *(DWORD*)(*(DWORD*)((char*)v1 + 254) + 8)) + { + if (i) + (*(void (**)(signed int))(*(DWORD*)i + 16))(1); + if (!*(DWORD*)(*(DWORD*)((char*)v1 + 254) + 4)) + break; + } + objlist_destroy(*(DWORD*)((char*)v1 + 262)); + objlist_destroy(*(DWORD*)((char*)v1 + 254)); + return TPinballComponent::~TPinballComponent(v1); } // 1002790: using guessed type void *TPinballTable::vftable; //----- (0101A9F2) -------------------------------------------------------- -TPinballTable *__thiscall TPinballTable::`vector deleting destructor`(TPinballTable *this, char a2) +TPinballTable* __thiscall TPinballTable::destroy(TPinballTable* this, char a2) { -TPinballTable *v2; // esi + TPinballTable* v2; // esi -v2 = this; -TPinballTable::~TPinballTable(this); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + TPinballTable::~TPinballTable(this); + if (a2 & 1) + component_delete((void*)v2); + return v2; } //----- (0101AAF3) -------------------------------------------------------- -TPinballTable *__thiscall TPinballTable::TPinballTable(TPinballTable *this) +TPinballTable* __thiscall TPinballTable::TPinballTable(TPinballTable* this) { -TBall *v1; // ebx -TPinballTable *v2; // esi -TBall *v3; // eax -TTableLayer *v4; // eax -TLightGroup *v5; // eax -TLightGroup *v6; // eax -DWORD *v7; // eax -int v8; // ebx -void **v9; // edi -int v10; // eax -int *v11; // ebx -int v12; // ax -signed int *v13; // ebx -int v14; // edi -TWall *v15; // eax -TOneway *v16; // eax -TPlunger *v17; // eax -TPlunger *v18; // eax -TLight *v19; // eax -TLight *v20; // eax -TLightGroup *v21; // eax -TComponentGroup *v22; // eax -TFlipper *v23; // eax -TFlipper *v24; // eax -TFlipper *v25; // eax -TFlipper *v26; // eax -TBumper *v27; // eax -TPopupTarget *v28; // eax -TSoloTarget *v29; // eax -TBlocker *v30; // eax -TGate *v31; // eax -TSink *v32; // eax -TKickback *v33; // eax -TTripwire *v34; // eax -TRollover *v35; // eax -TLightRollover *v36; // eax -TDrain *v37; // eax -TDrain *v38; // eax -TFlagSpinner *v39; // eax -TKickout *v40; // eax -TKickout *v41; // eax -TRamp *v42; // eax -THole *v43; // eax -TDemo *v44; // eax -TLightBargraph *v45; // eax -TSound *v46; // eax -TTimer *v47; // eax -TTextBox *v48; // eax -int v50; // [esp+Ch] [ebp-8h] -int i; // [esp+10h] [ebp-4h] + TBall* v1; // ebx + TPinballTable* v2; // esi + TBall* v3; // eax + TTableLayer* v4; // eax + TLightGroup* v5; // eax + TLightGroup* v6; // eax + DWORD* v7; // eax + int v8; // ebx + void** v9; // edi + int v10; // eax + int* v11; // ebx + int v12; // ax + signed int* v13; // ebx + int v14; // edi + TWall* v15; // eax + TOneway* v16; // eax + TPlunger* v17; // eax + TPlunger* v18; // eax + TLight* v19; // eax + TLight* v20; // eax + TLightGroup* v21; // eax + TComponentGroup* v22; // eax + TFlipper* v23; // eax + TFlipper* v24; // eax + TFlipper* v25; // eax + TFlipper* v26; // eax + TBumper* v27; // eax + TPopupTarget* v28; // eax + TSoloTarget* v29; // eax + TBlocker* v30; // eax + TGate* v31; // eax + TSink* v32; // eax + TKickback* v33; // eax + TTripwire* v34; // eax + TRollover* v35; // eax + TLightRollover* v36; // eax + TDrain* v37; // eax + TDrain* v38; // eax + TFlagSpinner* v39; // eax + TKickout* v40; // eax + TKickout* v41; // eax + TRamp* v42; // eax + THole* v43; // eax + TDemo* v44; // eax + TLightBargraph* v45; // eax + TSound* v46; // eax + TTimer* v47; // eax + TTextBox* v48; // eax + int v50; // [esp+Ch] [ebp-8h] + int i; // [esp+10h] [ebp-4h] -v1 = 0; -v2 = this; -TPinballComponent::TPinballComponent(this, 0, -1, 0); -*(DWORD *)v2 = &TPinballTable::vftable; -objlist_class::objlist_class((TPinballTable *)((char *)v2 + 250), 32, 16); -objlist_class::objlist_class((TPinballTable *)((char *)v2 + 258), 3, 1); -*(DWORD *)((char *)v2 + 50) = 0; -*(DWORD *)((char *)v2 + 54) = 0; -*(DWORD *)((char *)v2 + 58) = 0; -*(DWORD *)((char *)v2 + 78) = 0; -*((_BYTE *)v2 + 5) = 1; -*(DWORD *)((char *)v2 + 370) = 0; -*(DWORD *)((char *)v2 + 94) = 0; -*(DWORD *)((char *)v2 + 90) = 0; -*(DWORD *)((char *)v2 + 358) = 0; -*(DWORD *)((char *)v2 + 98) = 0; -*(DWORD *)((char *)v2 + 346) = 0; -v3 = (TBall *)TPinballComponent::operator new(0x16Au); -if ( v3 ) -v1 = TBall::TBall(v3, v2); -objlist_class::Add((TPinballTable *)((char *)v2 + 258), (void *)v1); -if ( v1 ) -*((_BYTE *)v1 + 5) = 0; -v4 = (TTableLayer *)TPinballComponent::operator new(0x7Eu); -if ( v4 ) -TTableLayer::TTableLayer(v4, v2); -v5 = (TLightGroup *)TPinballComponent::operator new(0x8Au); -if ( v5 ) -v6 = TLightGroup::TLightGroup(v5, v2, 0); -else -v6 = 0; -*(DWORD *)((char *)v2 + 266) = v6; -v7 = score_create("score1", render_background_bitmap); -*(DWORD *)((char *)v2 + 50) = v7; -*(DWORD *)((char *)v2 + 102) = v7; -v8 = 1; -v9 = (void **)((char *)v2 + 130); -do -{ -*v9 = score_dup(*(const void **)((char *)v2 + 50), v8++); -v9 += 7; -} -while ( v8 < 4 ); -*(DWORD *)((char *)v2 + 218) = 0; -*(DWORD *)((char *)v2 + 330) = 3; -*(DWORD *)((char *)v2 + 54) = score_create("ballcount1", render_background_bitmap); -*(DWORD *)((char *)v2 + 58) = score_create("player_number1", render_background_bitmap); -v10 = loader_query_handle("table_objects"); -v11 = (int *)loader_query_iattribute(v10, 1025, &v50); -if ( v50 > 0 ) -{ -for ( i = 0; i < v50 / 2; ++i ) -{ -v12 = *v11; -v13 = v11 + 1; -v14 = *v13; -v11 = v13 + 1; -switch ( v12 ) -{ -case 1000: -case 1010: -v15 = (TWall *)TPinballComponent::operator new(0x5Au); -if ( v15 ) -TWall::TWall(v15, v2, v14); -break; -case 1001: -v17 = (TPlunger *)TPinballComponent::operator new(0x6Au); -if ( v17 ) -v18 = TPlunger::TPlunger(v17, v2, v14); -else -v18 = 0; -*(DWORD *)((char *)v2 + 222) = v18; -break; -case 1002: -v19 = (TLight *)TPinballComponent::operator new(0xDEu); -if ( v19 ) -v20 = TLight::TLight(v19, v2, v14); -else -v20 = 0; -objlist_class::Add((objlist_class *)(*(DWORD *)((char *)v2 + 266) + 42), (void *)v20); -break; -case 1003: -v23 = (TFlipper *)TPinballComponent::operator new(0x6Au); -if ( v23 ) -v24 = TFlipper::TFlipper(v23, v2, v14); -else -v24 = 0; -*(DWORD *)((char *)v2 + 42) = v24; -break; -case 1004: -v25 = (TFlipper *)TPinballComponent::operator new(0x6Au); -if ( v25 ) -v26 = TFlipper::TFlipper(v25, v2, v14); -else -v26 = 0; -*(DWORD *)((char *)v2 + 46) = v26; -break; -case 1005: -v27 = (TBumper *)TPinballComponent::operator new(0x96u); -if ( v27 ) -TBumper::TBumper(v27, v2, v14); -break; -case 1006: -v28 = (TPopupTarget *)TPinballComponent::operator new(0x72u); -if ( v28 ) -TPopupTarget::TPopupTarget(v28, v2, v14); -break; -case 1007: -v37 = (TDrain *)TPinballComponent::operator new(0x5Au); -if ( v37 ) -v38 = TDrain::TDrain(v37, v2, v14); -else -v38 = 0; -*(DWORD *)((char *)v2 + 226) = v38; -break; -case 1011: -v30 = (TBlocker *)TPinballComponent::operator new(0x72u); -if ( v30 ) -TBlocker::TBlocker(v30, v2, v14); -break; -case 1012: -v40 = (TKickout *)TPinballComponent::operator new(0xEAu); -if ( v40 ) -TKickout::TKickout(v40, v2, v14, (struct vector_type *)1); -break; -case 1013: -v31 = (TGate *)TPinballComponent::operator new(0x66u); -if ( v31 ) -TGate::TGate(v31, v2, v14); -break; -case 1014: -v33 = (TKickback *)TPinballComponent::operator new(0x5Eu); -if ( v33 ) -TKickback::TKickback(v33, v2, v14); -break; -case 1015: -v35 = (TRollover *)TPinballComponent::operator new(0x57u); -if ( v35 ) -TRollover::TRollover(v35, v2, v14); -break; -case 1016: -v16 = (TOneway *)TPinballComponent::operator new(0x6Eu); -if ( v16 ) -TOneway::TOneway(v16, v2, v14); -break; -case 1017: -v32 = (TSink *)TPinballComponent::operator new(0x9Eu); -if ( v32 ) -TSink::TSink(v32, v2, v14); -break; -case 1018: -v39 = (TFlagSpinner *)TPinballComponent::operator new(0x76u); -if ( v39 ) -TFlagSpinner::TFlagSpinner(v39, v2, v14); -break; -case 1019: -v29 = (TSoloTarget *)TPinballComponent::operator new(0x62u); -if ( v29 ) -TSoloTarget::TSoloTarget(v29, v2, v14); -break; -case 1020: -v36 = (TLightRollover *)TPinballComponent::operator new(0x5Fu); -if ( v36 ) -TLightRollover::TLightRollover(v36, v2, v14); -break; -case 1021: -v42 = (TRamp *)TPinballComponent::operator new(0x9Au); -if ( v42 ) -TRamp::TRamp(v42, v2, (void *)v14); -break; -case 1022: -v43 = (THole *)TPinballComponent::operator new(0x8Eu); -if ( v43 ) -THole::THole(v43, v2, v14); -break; -case 1023: -v44 = (TDemo *)TPinballComponent::operator new(0x82u); -if ( v44 ) -TDemo::TDemo(v44, v2, v14); -break; -case 1024: -v34 = (TTripwire *)TPinballComponent::operator new(0x57u); -if ( v34 ) -TTripwire::TTripwire(v34, v2, v14); -break; -case 1026: -v21 = (TLightGroup *)TPinballComponent::operator new(0x8Au); -if ( v21 ) -TLightGroup::TLightGroup(v21, v2, v14); -break; -case 1028: -v22 = (TComponentGroup *)TPinballComponent::operator new(0x36u); -if ( v22 ) -TComponentGroup::TComponentGroup(v22, v2, v14); -break; -case 1029: -v41 = (TKickout *)TPinballComponent::operator new(0xEAu); -if ( v41 ) -TKickout::TKickout(v41, v2, v14, 0); -break; -case 1030: -v45 = (TLightBargraph *)TPinballComponent::operator new(0xA6u); -if ( v45 ) -TLightBargraph::TLightBargraph(v45, v2, v14); -break; -case 1031: -v46 = (TSound *)TPinballComponent::operator new(0x2Eu); -if ( v46 ) -TSound::TSound(v46, v2, v14); -break; -case 1032: -v47 = (TTimer *)TPinballComponent::operator new(0x2Eu); -if ( v47 ) -TTimer::TTimer(v47, v2, v14); -break; -case 1033: -v48 = (TTextBox *)TPinballComponent::operator new(0x4Eu); -if ( v48 ) -TTextBox::TTextBox(v48, v2, v14); -break; -default: -continue; -} -} -} -build_occlude_list(); -InfoTextBox = TPinballTable::find_component(v2, "info_text_box"); -MissTextBox = TPinballTable::find_component(v2, "mission_text_box"); -control_make_links(v2); -return v2; + v1 = 0; + v2 = this; + TPinballComponent::TPinballComponent(this, 0, -1, 0); + *(DWORD*)v2 = &TPinballTable::vftable; + objlist_class::objlist_class((TPinballTable*)((char*)v2 + 250), 32, 16); + objlist_class::objlist_class((TPinballTable*)((char*)v2 + 258), 3, 1); + *(DWORD*)((char*)v2 + 50) = 0; + *(DWORD*)((char*)v2 + 54) = 0; + *(DWORD*)((char*)v2 + 58) = 0; + *(DWORD*)((char*)v2 + 78) = 0; + *((_BYTE*)v2 + 5) = 1; + *(DWORD*)((char*)v2 + 370) = 0; + *(DWORD*)((char*)v2 + 94) = 0; + *(DWORD*)((char*)v2 + 90) = 0; + *(DWORD*)((char*)v2 + 358) = 0; + *(DWORD*)((char*)v2 + 98) = 0; + *(DWORD*)((char*)v2 + 346) = 0; + v3 = (TBall*)TPinballComponent::operator new(0x16Au); + if (v3) + v1 = TBall::TBall(v3, v2); + objlist_class::Add((TPinballTable*)((char*)v2 + 258), (void*)v1); + if (v1) + * ((_BYTE*)v1 + 5) = 0; + v4 = (TTableLayer*)TPinballComponent::operator new(0x7Eu); + if (v4) + TTableLayer::TTableLayer(v4, v2); + v5 = (TLightGroup*)TPinballComponent::operator new(0x8Au); + if (v5) + v6 = TLightGroup::TLightGroup(v5, v2, 0); + else + v6 = 0; + *(DWORD*)((char*)v2 + 266) = v6; + v7 = score_create("score1", render_background_bitmap); + *(DWORD*)((char*)v2 + 50) = v7; + *(DWORD*)((char*)v2 + 102) = v7; + v8 = 1; + v9 = (void**)((char*)v2 + 130); + do + { + *v9 = score_dup(*(const void**)((char*)v2 + 50), v8++); + v9 += 7; + } while (v8 < 4); + *(DWORD*)((char*)v2 + 218) = 0; + *(DWORD*)((char*)v2 + 330) = 3; + *(DWORD*)((char*)v2 + 54) = score_create("ballcount1", render_background_bitmap); + *(DWORD*)((char*)v2 + 58) = score_create("player_number1", render_background_bitmap); + v10 = loader_query_handle("table_objects"); + v11 = (int*)loader_query_iattribute(v10, 1025, &v50); + if (v50 > 0) + { + for (i = 0; i < v50 / 2; ++i) + { + v12 = *v11; + v13 = v11 + 1; + v14 = *v13; + v11 = v13 + 1; + switch (v12) + { + case 1000: + case 1010: + v15 = (TWall*)TPinballComponent::operator new(0x5Au); + if (v15) + TWall::TWall(v15, v2, v14); + break; + case 1001: + v17 = (TPlunger*)TPinballComponent::operator new(0x6Au); + if (v17) + v18 = TPlunger::TPlunger(v17, v2, v14); + else + v18 = 0; + *(DWORD*)((char*)v2 + 222) = v18; + break; + case 1002: + v19 = (TLight*)TPinballComponent::operator new(0xDEu); + if (v19) + v20 = TLight::TLight(v19, v2, v14); + else + v20 = 0; + objlist_class::Add((objlist_class*)(*(DWORD*)((char*)v2 + 266) + 42), (void*)v20); + break; + case 1003: + v23 = (TFlipper*)TPinballComponent::operator new(0x6Au); + if (v23) + v24 = TFlipper::TFlipper(v23, v2, v14); + else + v24 = 0; + *(DWORD*)((char*)v2 + 42) = v24; + break; + case 1004: + v25 = (TFlipper*)TPinballComponent::operator new(0x6Au); + if (v25) + v26 = TFlipper::TFlipper(v25, v2, v14); + else + v26 = 0; + *(DWORD*)((char*)v2 + 46) = v26; + break; + case 1005: + v27 = (TBumper*)TPinballComponent::operator new(0x96u); + if (v27) + TBumper::TBumper(v27, v2, v14); + break; + case 1006: + v28 = (TPopupTarget*)TPinballComponent::operator new(0x72u); + if (v28) + TPopupTarget::TPopupTarget(v28, v2, v14); + break; + case 1007: + v37 = (TDrain*)TPinballComponent::operator new(0x5Au); + if (v37) + v38 = TDrain::TDrain(v37, v2, v14); + else + v38 = 0; + *(DWORD*)((char*)v2 + 226) = v38; + break; + case 1011: + v30 = (TBlocker*)TPinballComponent::operator new(0x72u); + if (v30) + TBlocker::TBlocker(v30, v2, v14); + break; + case 1012: + v40 = (TKickout*)TPinballComponent::operator new(0xEAu); + if (v40) + TKickout::TKickout(v40, v2, v14, (struct vector_type*)1); + break; + case 1013: + v31 = (TGate*)TPinballComponent::operator new(0x66u); + if (v31) + TGate::TGate(v31, v2, v14); + break; + case 1014: + v33 = (TKickback*)TPinballComponent::operator new(0x5Eu); + if (v33) + TKickback::TKickback(v33, v2, v14); + break; + case 1015: + v35 = (TRollover*)TPinballComponent::operator new(0x57u); + if (v35) + TRollover::TRollover(v35, v2, v14); + break; + case 1016: + v16 = (TOneway*)TPinballComponent::operator new(0x6Eu); + if (v16) + TOneway::TOneway(v16, v2, v14); + break; + case 1017: + v32 = (TSink*)TPinballComponent::operator new(0x9Eu); + if (v32) + TSink::TSink(v32, v2, v14); + break; + case 1018: + v39 = (TFlagSpinner*)TPinballComponent::operator new(0x76u); + if (v39) + TFlagSpinner::TFlagSpinner(v39, v2, v14); + break; + case 1019: + v29 = (TSoloTarget*)TPinballComponent::operator new(0x62u); + if (v29) + TSoloTarget::TSoloTarget(v29, v2, v14); + break; + case 1020: + v36 = (TLightRollover*)TPinballComponent::operator new(0x5Fu); + if (v36) + TLightRollover::TLightRollover(v36, v2, v14); + break; + case 1021: + v42 = (TRamp*)TPinballComponent::operator new(0x9Au); + if (v42) + TRamp::TRamp(v42, v2, (void*)v14); + break; + case 1022: + v43 = (THole*)TPinballComponent::operator new(0x8Eu); + if (v43) + THole::THole(v43, v2, v14); + break; + case 1023: + v44 = (TDemo*)TPinballComponent::operator new(0x82u); + if (v44) + TDemo::TDemo(v44, v2, v14); + break; + case 1024: + v34 = (TTripwire*)TPinballComponent::operator new(0x57u); + if (v34) + TTripwire::TTripwire(v34, v2, v14); + break; + case 1026: + v21 = (TLightGroup*)TPinballComponent::operator new(0x8Au); + if (v21) + TLightGroup::TLightGroup(v21, v2, v14); + break; + case 1028: + v22 = (TComponentGroup*)TPinballComponent::operator new(0x36u); + if (v22) + TComponentGroup::TComponentGroup(v22, v2, v14); + break; + case 1029: + v41 = (TKickout*)TPinballComponent::operator new(0xEAu); + if (v41) + TKickout::TKickout(v41, v2, v14, 0); + break; + case 1030: + v45 = (TLightBargraph*)TPinballComponent::operator new(0xA6u); + if (v45) + TLightBargraph::TLightBargraph(v45, v2, v14); + break; + case 1031: + v46 = (TSound*)TPinballComponent::operator new(0x2Eu); + if (v46) + TSound::TSound(v46, v2, v14); + break; + case 1032: + v47 = (TTimer*)TPinballComponent::operator new(0x2Eu); + if (v47) + TTimer::TTimer(v47, v2, v14); + break; + case 1033: + v48 = (TTextBox*)TPinballComponent::operator new(0x4Eu); + if (v48) + TTextBox::TTextBox(v48, v2, v14); + break; + default: + continue; + } + } + } + build_occlude_list(); + InfoTextBox = TPinballTable::find_component(v2, "info_text_box"); + MissTextBox = TPinballTable::find_component(v2, "mission_text_box"); + control_make_links(v2); + return v2; } // 1002790: using guessed type void *TPinballTable::vftable; diff --git a/Classes/TPinballTable/TPinballTable.h b/Classes/TPinballTable/TPinballTable.h index ac5490a..e0c2900 100644 --- a/Classes/TPinballTable/TPinballTable.h +++ b/Classes/TPinballTable/TPinballTable.h @@ -20,7 +20,7 @@ void TPinballTable::tilt_timeout(int, void*); // idb // void TPinballTable::tilt(TPinballTable *this, int a2, float a3); // int TPinballTable::Message(TPinballTable *this, int a2, int a3, float a4); TZmapList* __thiscall TPinballTable::~TPinballTable(TPinballTable* this); -TPinballTable* __thiscall TPinballTable::`vector deleting destructor'(TPinballTable *this, char a2); +TPinballTable* __thiscall TPinballTable::destroy(TPinballTable *this, char a2); TPinballTable* __thiscall TPinballTable::TPinballTable(TPinballTable* this); TPinballComponent* __thiscall TPinballTable::find_component(TPinballTable* this, char*); // idb TPinballComponent* __thiscall TPinballTable::find_component(TPinballTable* this, int); // idb diff --git a/Classes/TSound/TSound.cpp b/Classes/TSound/TSound.cpp index dda4262..b0ae6ba 100644 --- a/Classes/TSound/TSound.cpp +++ b/Classes/TSound/TSound.cpp @@ -5,36 +5,36 @@ #include "TSound.h" //----- (0100AD8B) -------------------------------------------------------- -TSound *__thiscall TSound::`vector deleting destructor`(TSound *this, char a2) +TSound* __thiscall TSound::destroy(TSound* this, char a2) { -TSound *v2; // esi + TSound* v2; // esi -v2 = this; -TPinballComponent::~TPinballComponent(this); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + TPinballComponent::~TPinballComponent(this); + if (a2 & 1) + component_delete((void*)v2); + return v2; } //----- (0101797E) -------------------------------------------------------- -double __thiscall TSound::Play(TSound *this) +double __thiscall TSound::Play(TSound* this) { -return loader_play_sound(*(DWORD *)((char *)this + 42)); + return loader_play_sound(*(DWORD*)((char*)this + 42)); } //----- (0101AA18) -------------------------------------------------------- -TSound *__thiscall TSound::TSound(TSound *this, struct TPinballTable *a2, int a3) +TSound* __thiscall TSound::TSound(TSound* this, struct TPinballTable* a2, int a3) { -TSound *v3; // esi -char v5; // [esp+4h] [ebp-48h] -int v6; // [esp+3Ch] [ebp-10h] + TSound* v3; // esi + char v5; // [esp+4h] [ebp-48h] + int v6; // [esp+3Ch] [ebp-10h] -v3 = this; -TPinballComponent::TPinballComponent(this, a2, a3, 1); -*(DWORD *)v3 = &TSound::vftable; -loader_query_visual(a3, 0, &v5); -*(DWORD *)((char *)v3 + 42) = v6; -return v3; + v3 = this; + TPinballComponent::TPinballComponent(this, a2, a3, 1); + *(DWORD*)v3 = &TSound::vftable; + loader_query_visual(a3, 0, &v5); + *(DWORD*)((char*)v3 + 42) = v6; + return v3; } // 10027A4: using guessed type void *TSound::vftable; diff --git a/Classes/TSound/TSound.h b/Classes/TSound/TSound.h index eb3a0b2..45a6dae 100644 --- a/Classes/TSound/TSound.h +++ b/Classes/TSound/TSound.h @@ -10,7 +10,7 @@ /* 132 */ struct TSound; -TSound* __thiscall TSound::`vector deleting destructor`(TSound *this, char a2); +TSound* __thiscall TSound::destroy(TSound *this, char a2); double __thiscall TSound::Play(TSound* this); TSound* __thiscall TSound::TSound(TSound* this, struct TPinballTable* a2, int a3); diff --git a/Classes/TTableLayer/TTableLayer.cpp b/Classes/TTableLayer/TTableLayer.cpp index 5f2122a..882086b 100644 --- a/Classes/TTableLayer/TTableLayer.cpp +++ b/Classes/TTableLayer/TTableLayer.cpp @@ -1,258 +1,258 @@ #include "TTableLayer.h" //----- (010173E7) -------------------------------------------------------- -int __thiscall TTableLayer::FieldEffect(TTableLayer *this, struct TBall *a2, struct vector_type *a3) +int __thiscall TTableLayer::FieldEffect(TTableLayer* this, struct TBall* a2, struct vector_type* a3) { -TTableLayer *v3; // esi -struct TBall *v4; // edi -double v5; // ST08_8 + TTableLayer* v3; // esi + struct TBall* v4; // edi + double v5; // ST08_8 -v3 = this; -v4 = a2; -v5 = *(float *)((char *)this + 98); -*(float *)a3 = v5 -- (0.5 - (double)_rand() * 0.00003051850947599719 + *(float *)((char *)v4 + 54)) -* *(float *)((char *)v4 + 66) -* *(float *)((char *)this + 110); -*((float *)a3 + 1) = *(float *)((char *)v3 + 102) -- *(float *)((char *)v4 + 58) * *(float *)((char *)v4 + 66) * *(float *)((char *)v3 + 110); -return 1; + v3 = this; + v4 = a2; + v5 = *(float*)((char*)this + 98); + *(float*)a3 = v5 + - (0.5 - (double)_rand() * 0.00003051850947599719 + *(float*)((char*)v4 + 54)) + * *(float*)((char*)v4 + 66) + * *(float*)((char*)this + 110); + *((float*)a3 + 1) = *(float*)((char*)v3 + 102) + - *(float*)((char*)v4 + 58) * *(float*)((char*)v4 + 66) * *(float*)((char*)v3 + 110); + return 1; } //----- (0101A5AB) -------------------------------------------------------- -TTableLayer *__thiscall TTableLayer::TTableLayer(TTableLayer *this, struct TPinballTable *a2) +TTableLayer* __thiscall TTableLayer::TTableLayer(TTableLayer* this, struct TPinballTable* a2) { -struct TPinballTable *v2; // edi -TTableLayer *v3; // esi -float *v4; // eax -int v5; // eax -DWORD *v6; // eax -int v7; // eax -DWORD *v8; // eax -DWORD *v9; // eax -float *v10; // ecx -float *v11; // edi -double v12; // st7 -double v13; // st7 -double v14; // st7 -double v15; // st7 -double v16; // st7 -double v17; // st7 -double v18; // st7 -double v19; // st7 -TEdgeManager *v20; // eax -float v21; // ST18_4 -float v22; // ST14_4 -TLine *v23; // eax -TLine *v24; // edi -double v25; // st7 -float v26; // ST10_4 -double v27; // st7 -float v28; // ST0C_4 -char v30; // [esp+24h] [ebp-5Ch] -int v31; // [esp+2Ch] [ebp-54h] -float *v32; // [esp+30h] [ebp-50h] -int v33; // [esp+38h] [ebp-48h] -int v34; // [esp+54h] [ebp-2Ch] -unsigned int v35; // [esp+58h] [ebp-28h] -int v36; // [esp+5Ch] [ebp-24h] -int v37; // [esp+60h] [ebp-20h] -DWORD *v38; // [esp+64h] [ebp-1Ch] -struct zmap_header_type *v39; // [esp+68h] [ebp-18h] -int v40; // [esp+6Ch] [ebp-14h] -int v41; // [esp+70h] [ebp-10h] -int v42; // [esp+74h] [ebp-Ch] -int v43; // [esp+78h] [ebp-8h] -int v44; // [esp+7Ch] [ebp-4h] -struct TPinballTable *v45; // [esp+88h] [ebp+8h] -struct TPinballTable *v46; // [esp+88h] [ebp+8h] + struct TPinballTable* v2; // edi + TTableLayer* v3; // esi + float* v4; // eax + int v5; // eax + DWORD* v6; // eax + int v7; // eax + DWORD* v8; // eax + DWORD* v9; // eax + float* v10; // ecx + float* v11; // edi + double v12; // st7 + double v13; // st7 + double v14; // st7 + double v15; // st7 + double v16; // st7 + double v17; // st7 + double v18; // st7 + double v19; // st7 + TEdgeManager* v20; // eax + float v21; // ST18_4 + float v22; // ST14_4 + TLine* v23; // eax + TLine* v24; // edi + double v25; // st7 + float v26; // ST10_4 + double v27; // st7 + float v28; // ST0C_4 + char v30; // [esp+24h] [ebp-5Ch] + int v31; // [esp+2Ch] [ebp-54h] + float* v32; // [esp+30h] [ebp-50h] + int v33; // [esp+38h] [ebp-48h] + int v34; // [esp+54h] [ebp-2Ch] + unsigned int v35; // [esp+58h] [ebp-28h] + int v36; // [esp+5Ch] [ebp-24h] + int v37; // [esp+60h] [ebp-20h] + DWORD* v38; // [esp+64h] [ebp-1Ch] + struct zmap_header_type* v39; // [esp+68h] [ebp-18h] + int v40; // [esp+6Ch] [ebp-14h] + int v41; // [esp+70h] [ebp-10h] + int v42; // [esp+74h] [ebp-Ch] + int v43; // [esp+78h] [ebp-8h] + int v44; // [esp+7Ch] [ebp-4h] + struct TPinballTable* v45; // [esp+88h] [ebp+8h] + struct TPinballTable* v46; // [esp+88h] [ebp+8h] -v2 = a2; -v3 = this; -TCollisionComponent::TCollisionComponent(this, a2, -1, 0); -*(DWORD *)v3 = &TTableLayer::vftable; -v45 = (struct TPinballTable *)loader_query_handle("table"); -loader_query_visual((int)v45, 0, &v30); -v4 = (float *)loader_query_float_attribute((int)v45, 0, 700); -proj_recenter(COERCE_INT(*v4), COERCE_INT(v4[1])); -render_set_background_zmap(v39, 0, 0); -v5 = (int)v38; -*(DWORD *)((char *)v3 + 78) = v38; -v40 = 0; -v41 = 0; -v42 = *(DWORD *)(v5 + 12); -v43 = *(DWORD *)(v5 + 16); -render_create_sprite(0, v5, (int)v39, 0, 0, &v40); -*(DWORD *)(*(DWORD *)((char *)v3 + 30) + 66) = v36; -*(DWORD *)(*(DWORD *)((char *)v3 + 30) + 70) = v37; -*(DWORD *)(*(DWORD *)((char *)v3 + 30) + 74) = v34; -v6 = (DWORD *)loader_query_float_attribute((int)v45, 0, 305); -if ( v6 ) -{ -*(DWORD *)(*(DWORD *)((char *)v3 + 30) + 270) = *v6; -*(DWORD *)(*(DWORD *)((char *)v3 + 30) + 274) = v6[1]; -*(DWORD *)(*(DWORD *)((char *)v3 + 30) + 278) = v6[2]; -} -else -{ -*(DWORD *)(*(DWORD *)((char *)v3 + 30) + 270) = 1103626240; -*(DWORD *)(*(DWORD *)((char *)v3 + 30) + 274) = 1056964608; -*(DWORD *)(*(DWORD *)((char *)v3 + 30) + 278) = 1070141400; -} -v7 = *(DWORD *)((char *)v3 + 30); -*(float *)((char *)v3 + 98) = cos(*(float *)(v7 + 278)) * sin(*(float *)(v7 + 274)) * *(float *)(v7 + 270); -*(float *)((char *)v3 + 102) = sin(*(float *)(v7 + 278)) * sin(*(float *)(v7 + 274)) * *(float *)(v7 + 270); -v8 = (DWORD *)loader_query_float_attribute((int)v45, 0, 701); -if ( v8 ) -*(DWORD *)((char *)v3 + 110) = *v8; -else -*(DWORD *)((char *)v3 + 110) = 1045220557; -v9 = v38; -*(DWORD *)((char *)v2 + 234) = *(DWORD *)((char *)v38 + 29); -*(DWORD *)((char *)v2 + 238) = *(DWORD *)((char *)v9 + 33); -*(DWORD *)((char *)v2 + 242) = v9[3]; -v10 = v32; -*(DWORD *)((char *)v2 + 246) = v9[4]; -v44 = v31; -*(DWORD *)((char *)v3 + 66) = v33; -*(DWORD *)((char *)v3 + 62) = 1097859072; -v11 = v10; -v46 = (struct TPinballTable *)v10; -if ( v10[2] >= (double)v10[4] ) -v12 = v10[4]; -else -v12 = v10[2]; -if ( v12 >= *v10 ) -{ -v13 = *v10; -} -else if ( v10[2] >= (double)v10[4] ) -{ -v13 = v10[4]; -} -else -{ -v13 = v10[2]; -} -*(float *)((char *)v3 + 82) = v13; -if ( v10[2] <= (double)v10[4] ) -v14 = v10[4]; -else -v14 = v10[2]; -if ( v14 <= *v10 ) -{ -v15 = *v10; -} -else if ( v10[2] <= (double)v10[4] ) -{ -v15 = v10[4]; -} -else -{ -v15 = v10[2]; -} -*(float *)((char *)v3 + 90) = v15; -if ( v10[3] >= (double)v10[5] ) -v16 = v10[5]; -else -v16 = v10[3]; -if ( v16 >= v10[1] ) -{ -v17 = v10[1]; -} -else if ( v10[3] >= (double)v10[5] ) -{ -v17 = v10[5]; -} -else -{ -v17 = v10[3]; -} -*(float *)((char *)v3 + 86) = v17; -if ( v10[3] <= (double)v10[5] ) -v18 = v10[5]; -else -v18 = v10[3]; -if ( v18 <= v10[1] ) -{ -v19 = v10[1]; -} -else if ( v10[3] <= (double)v10[5] ) -{ -v19 = v10[5]; -} -else -{ -v19 = v10[3]; -} -*(float *)((char *)v3 + 94) = v19; -v20 = (TEdgeManager *)operator new(0xFC4u); -if ( v20 ) -{ -v21 = *(float *)((char *)v3 + 94) - *(float *)((char *)v3 + 86); -v22 = *(float *)((char *)v3 + 90) - *(float *)((char *)v3 + 82); -edge_manager = TEdgeManager::TEdgeManager(v20, *(float *)((char *)v3 + 82), *(float *)((char *)v3 + 86), v22, v21); -} -else -{ -edge_manager = 0; -} -if ( v44 > 0 ) -{ -while ( 1 ) -{ -v23 = (TLine *)operator new(0x55u); -v24 = v23 ? TLine::TLine(v23, v3, (char *)v3 + 5, v35, v11[2], v11[3], *v11, v11[1]) : 0; -if ( v24 ) -{ -(*(void (__thiscall **)(TLine *))(*(DWORD *)v24 + 8))(v24); -objlist_class::Add((TTableLayer *)((char *)v3 + 42), (void *)v24); -} -v46 = (struct TPinballTable *)((char *)v46 + 8); -if ( !--v44 ) -break; -v11 = (float *)v46; -} -} -v25 = *(float *)((char *)v3 + 90); -*(DWORD *)((char *)v3 + 118) = -1; -v26 = v25; -v27 = *(float *)((char *)v3 + 94); -*(DWORD *)((char *)v3 + 114) = (char *)v3 + 5; -v28 = v27; -*(DWORD *)((char *)v3 + 122) = v3; -edges_insert_square( -*(float *)((char *)v3 + 86), -*(float *)((char *)v3 + 82), -v28, -v26, -0, -(TTableLayer *)((char *)v3 + 114)); -return v3; + v2 = a2; + v3 = this; + TCollisionComponent::TCollisionComponent(this, a2, -1, 0); + *(DWORD*)v3 = &TTableLayer::vftable; + v45 = (struct TPinballTable*)loader_query_handle("table"); + loader_query_visual((int)v45, 0, &v30); + v4 = (float*)loader_query_float_attribute((int)v45, 0, 700); + proj_recenter(COERCE_INT(*v4), COERCE_INT(v4[1])); + render_set_background_zmap(v39, 0, 0); + v5 = (int)v38; + *(DWORD*)((char*)v3 + 78) = v38; + v40 = 0; + v41 = 0; + v42 = *(DWORD*)(v5 + 12); + v43 = *(DWORD*)(v5 + 16); + render_create_sprite(0, v5, (int)v39, 0, 0, &v40); + *(DWORD*)(*(DWORD*)((char*)v3 + 30) + 66) = v36; + *(DWORD*)(*(DWORD*)((char*)v3 + 30) + 70) = v37; + *(DWORD*)(*(DWORD*)((char*)v3 + 30) + 74) = v34; + v6 = (DWORD*)loader_query_float_attribute((int)v45, 0, 305); + if (v6) + { + *(DWORD*)(*(DWORD*)((char*)v3 + 30) + 270) = *v6; + *(DWORD*)(*(DWORD*)((char*)v3 + 30) + 274) = v6[1]; + *(DWORD*)(*(DWORD*)((char*)v3 + 30) + 278) = v6[2]; + } + else + { + *(DWORD*)(*(DWORD*)((char*)v3 + 30) + 270) = 1103626240; + *(DWORD*)(*(DWORD*)((char*)v3 + 30) + 274) = 1056964608; + *(DWORD*)(*(DWORD*)((char*)v3 + 30) + 278) = 1070141400; + } + v7 = *(DWORD*)((char*)v3 + 30); + *(float*)((char*)v3 + 98) = cos(*(float*)(v7 + 278)) * sin(*(float*)(v7 + 274)) * *(float*)(v7 + 270); + *(float*)((char*)v3 + 102) = sin(*(float*)(v7 + 278)) * sin(*(float*)(v7 + 274)) * *(float*)(v7 + 270); + v8 = (DWORD*)loader_query_float_attribute((int)v45, 0, 701); + if (v8) + * (DWORD*)((char*)v3 + 110) = *v8; + else + *(DWORD*)((char*)v3 + 110) = 1045220557; + v9 = v38; + *(DWORD*)((char*)v2 + 234) = *(DWORD*)((char*)v38 + 29); + *(DWORD*)((char*)v2 + 238) = *(DWORD*)((char*)v9 + 33); + *(DWORD*)((char*)v2 + 242) = v9[3]; + v10 = v32; + *(DWORD*)((char*)v2 + 246) = v9[4]; + v44 = v31; + *(DWORD*)((char*)v3 + 66) = v33; + *(DWORD*)((char*)v3 + 62) = 1097859072; + v11 = v10; + v46 = (struct TPinballTable*)v10; + if (v10[2] >= (double)v10[4]) + v12 = v10[4]; + else + v12 = v10[2]; + if (v12 >= *v10) + { + v13 = *v10; + } + else if (v10[2] >= (double)v10[4]) + { + v13 = v10[4]; + } + else + { + v13 = v10[2]; + } + *(float*)((char*)v3 + 82) = v13; + if (v10[2] <= (double)v10[4]) + v14 = v10[4]; + else + v14 = v10[2]; + if (v14 <= *v10) + { + v15 = *v10; + } + else if (v10[2] <= (double)v10[4]) + { + v15 = v10[4]; + } + else + { + v15 = v10[2]; + } + *(float*)((char*)v3 + 90) = v15; + if (v10[3] >= (double)v10[5]) + v16 = v10[5]; + else + v16 = v10[3]; + if (v16 >= v10[1]) + { + v17 = v10[1]; + } + else if (v10[3] >= (double)v10[5]) + { + v17 = v10[5]; + } + else + { + v17 = v10[3]; + } + *(float*)((char*)v3 + 86) = v17; + if (v10[3] <= (double)v10[5]) + v18 = v10[5]; + else + v18 = v10[3]; + if (v18 <= v10[1]) + { + v19 = v10[1]; + } + else if (v10[3] <= (double)v10[5]) + { + v19 = v10[5]; + } + else + { + v19 = v10[3]; + } + *(float*)((char*)v3 + 94) = v19; + v20 = (TEdgeManager*)operator new(0xFC4u); + if (v20) + { + v21 = *(float*)((char*)v3 + 94) - *(float*)((char*)v3 + 86); + v22 = *(float*)((char*)v3 + 90) - *(float*)((char*)v3 + 82); + edge_manager = TEdgeManager::TEdgeManager(v20, *(float*)((char*)v3 + 82), *(float*)((char*)v3 + 86), v22, v21); + } + else + { + edge_manager = 0; + } + if (v44 > 0) + { + while (1) + { + v23 = (TLine*)operator new(0x55u); + v24 = v23 ? TLine::TLine(v23, v3, (char*)v3 + 5, v35, v11[2], v11[3], *v11, v11[1]) : 0; + if (v24) + { + (*(void(__thiscall * *)(TLine*))(*(DWORD*)v24 + 8))(v24); + objlist_class::Add((TTableLayer*)((char*)v3 + 42), (void*)v24); + } + v46 = (struct TPinballTable*)((char*)v46 + 8); + if (!--v44) + break; + v11 = (float*)v46; + } + } + v25 = *(float*)((char*)v3 + 90); + *(DWORD*)((char*)v3 + 118) = -1; + v26 = v25; + v27 = *(float*)((char*)v3 + 94); + *(DWORD*)((char*)v3 + 114) = (char*)v3 + 5; + v28 = v27; + *(DWORD*)((char*)v3 + 122) = v3; + edges_insert_square( + *(float*)((char*)v3 + 86), + *(float*)((char*)v3 + 82), + v28, + v26, + 0, + (TTableLayer*)((char*)v3 + 114)); + return v3; } // 100276C: using guessed type void *TTableLayer::vftable; //----- (0101A928) -------------------------------------------------------- -TZmapList *__thiscall TTableLayer::~TTableLayer(TTableLayer *this) +TZmapList* __thiscall TTableLayer::~TTableLayer(TTableLayer* this) { -TCollisionComponent *v1; // esi + TCollisionComponent* v1; // esi -v1 = this; -*(DWORD *)this = &TTableLayer::vftable; -if ( edge_manager ) -TEdgeManager::destroy(edge_manager, 1); -return TCollisionComponent::~TCollisionComponent(v1); + v1 = this; + *(DWORD*)this = &TTableLayer::vftable; + if (edge_manager) + TEdgeManager::destroy(edge_manager, 1); + return TCollisionComponent::~TCollisionComponent(v1); } // 100276C: using guessed type void *TTableLayer::vftable; //----- (0101AACD) -------------------------------------------------------- -TTableLayer *__thiscall TTableLayer::destroy(TTableLayer *this, char a2) +TTableLayer* __thiscall TTableLayer::destroy(TTableLayer* this, char a2) { -TTableLayer *v2; // esi + TTableLayer* v2; // esi -v2 = this; -TTableLayer::~TTableLayer(this); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + TTableLayer::~TTableLayer(this); + if (a2 & 1) + component_delete((void*)v2); + return v2; } diff --git a/Classes/TTextBox/TTextBox.cpp b/Classes/TTextBox/TTextBox.cpp index 3edf307..cb93a87 100644 --- a/Classes/TTextBox/TTextBox.cpp +++ b/Classes/TTextBox/TTextBox.cpp @@ -1,399 +1,398 @@ #include "TTextbox.h" //----- (01014092) -------------------------------------------------------- -TTextBox *__thiscall TTextBox::TTextBox(TTextBox *this, struct TPinballTable *a2, int a3) +TTextBox* __thiscall TTextBox::TTextBox(TTextBox* this, struct TPinballTable* a2, int a3) { -TTextBox *v3; // esi -bool v4; // zf -bool v5; // sf -signed int *v6; // eax -int v7; // ecx -int v8; // ecx + TTextBox* v3; // esi + bool v4; // zf + bool v5; // sf + signed int* v6; // eax + int v7; // ecx + int v8; // ecx -v3 = this; -TPinballComponent::TPinballComponent(this, a2, a3, 1); -v4 = a3 == 0; -v5 = a3 < 0; -*(DWORD *)v3 = &TTextBox::vftable; -*(DWORD *)((char *)v3 + 42) = 0; -*(DWORD *)((char *)v3 + 46) = 0; -*(DWORD *)((char *)v3 + 50) = 0; -*(DWORD *)((char *)v3 + 54) = 0; -*(DWORD *)((char *)v3 + 62) = render_background_bitmap; -*(DWORD *)((char *)v3 + 66) = score_msg_fontp; -*(DWORD *)((char *)v3 + 70) = 0; -*(DWORD *)((char *)v3 + 74) = 0; -*(DWORD *)((char *)v3 + 58) = 0; -if ( !v5 && !v4 ) -{ -v6 = (signed int *)loader_query_iattribute(a3, 1500, &a2); -v7 = *v6; -++v6; -*(DWORD *)((char *)v3 + 42) = v7; -v8 = *v6; -++v6; -*(DWORD *)((char *)v3 + 46) = v8; -*(DWORD *)((char *)v3 + 50) = *v6; -*(DWORD *)((char *)v3 + 54) = v6[1]; -} -return v3; + v3 = this; + TPinballComponent::TPinballComponent(this, a2, a3, 1); + v4 = a3 == 0; + v5 = a3 < 0; + *(DWORD*)v3 = &TTextBox::vftable; + *(DWORD*)((char*)v3 + 42) = 0; + *(DWORD*)((char*)v3 + 46) = 0; + *(DWORD*)((char*)v3 + 50) = 0; + *(DWORD*)((char*)v3 + 54) = 0; + *(DWORD*)((char*)v3 + 62) = render_background_bitmap; + *(DWORD*)((char*)v3 + 66) = score_msg_fontp; + *(DWORD*)((char*)v3 + 70) = 0; + *(DWORD*)((char*)v3 + 74) = 0; + *(DWORD*)((char*)v3 + 58) = 0; + if (!v5 && !v4) + { + v6 = (signed int*)loader_query_iattribute(a3, 1500, &a2); + v7 = *v6; + ++v6; + *(DWORD*)((char*)v3 + 42) = v7; + v8 = *v6; + ++v6; + *(DWORD*)((char*)v3 + 46) = v8; + *(DWORD*)((char*)v3 + 50) = *v6; + *(DWORD*)((char*)v3 + 54) = v6[1]; + } + return v3; } // 10023B4: using guessed type void *TTextBox::vftable; // 10253C4: using guessed type struct score_msg_font_type *score_msg_fontp; //----- (01014143) -------------------------------------------------------- -void TTextBox::Clear(TTextBox *this, int a2) +void TTextBox::Clear(TTextBox* this, int a2) { -TTextBox *v2; // esi -DWORD *v3; // edx -int v4; // eax -TTextBoxMessage *v5; // ecx -int v6; // edi + TTextBox* v2; // esi + DWORD* v3; // edx + int v4; // eax + TTextBoxMessage* v5; // ecx + int v6; // edi -v2 = this; -v3 = *(DWORD **)((char *)this + 62); -if ( v3 ) -gdrv_copy_bitmap( -&vscreen, -*(DWORD *)((char *)this + 50), -*(DWORD *)((char *)this + 54), -*(DWORD *)((char *)this + 42), -*(DWORD *)((char *)this + 46), -v3, -*(DWORD *)((char *)this + 42), -*(DWORD *)((char *)this + 46)); -else -gdrv_fill_bitmap( -a2, -&vscreen, -*(DWORD *)((char *)this + 50), -*(DWORD *)((char *)this + 54), -*(DWORD *)((char *)this + 42), -*(DWORD *)((char *)this + 46), -0); -gdrv_blit( -(int)&vscreen, -*(DWORD *)((char *)v2 + 42), -*(DWORD *)((char *)v2 + 46), -*(DWORD *)((char *)v2 + 42) + xDest, -*(DWORD *)((char *)v2 + 46) + yDest, -*(DWORD *)((char *)v2 + 50), -*(DWORD *)((char *)v2 + 54)); -v4 = *(DWORD *)((char *)v2 + 58); -if ( v4 ) -{ -if ( v4 != -1 ) -timer_kill(*(DWORD *)((char *)v2 + 58)); -*(DWORD *)((char *)v2 + 58) = 0; -} -while ( *(DWORD *)((char *)v2 + 70) ) -{ -v5 = *(TTextBoxMessage **)((char *)v2 + 70); -v6 = *(DWORD *)v5; -if ( v5 ) -TTextBoxMessage::destroy(v5, 1); -*(DWORD *)((char *)v2 + 70) = v6; -} + v2 = this; + v3 = *(DWORD * *)((char*)this + 62); + if (v3) + gdrv_copy_bitmap( + &vscreen, + *(DWORD*)((char*)this + 50), + *(DWORD*)((char*)this + 54), + *(DWORD*)((char*)this + 42), + *(DWORD*)((char*)this + 46), + v3, + *(DWORD*)((char*)this + 42), + *(DWORD*)((char*)this + 46)); + else + gdrv_fill_bitmap( + a2, + &vscreen, + *(DWORD*)((char*)this + 50), + *(DWORD*)((char*)this + 54), + *(DWORD*)((char*)this + 42), + *(DWORD*)((char*)this + 46), + 0); + gdrv_blit( + (int)& vscreen, + *(DWORD*)((char*)v2 + 42), + *(DWORD*)((char*)v2 + 46), + *(DWORD*)((char*)v2 + 42) + xDest, + *(DWORD*)((char*)v2 + 46) + yDest, + *(DWORD*)((char*)v2 + 50), + *(DWORD*)((char*)v2 + 54)); + v4 = *(DWORD*)((char*)v2 + 58); + if (v4) + { + if (v4 != -1) + timer_kill(*(DWORD*)((char*)v2 + 58)); + *(DWORD*)((char*)v2 + 58) = 0; + } + while (*(DWORD*)((char*)v2 + 70)) + { + v5 = *(TTextBoxMessage * *)((char*)v2 + 70); + v6 = *(DWORD*)v5; + if (v5) + TTextBoxMessage::destroy(v5, 1); + *(DWORD*)((char*)v2 + 70) = v6; + } } //----- (010141E1) -------------------------------------------------------- -void TTextBox::TimerExpired(int a1, int a2, TTextBox *a3) +void TTextBox::TimerExpired(int a1, int a2, TTextBox* a3) { -TTextBoxMessage *v3; // ecx -int v4; // edi + TTextBoxMessage* v3; // ecx + int v4; // edi -v3 = *(TTextBoxMessage **)((char *)a3 + 70); -*(DWORD *)((char *)a3 + 58) = 0; -if ( v3 ) -{ -v4 = *(DWORD *)v3; -TTextBoxMessage::destroy(v3, 1); -*(DWORD *)((char *)a3 + 70) = v4; -TTextBox::Draw(a3, a1); -control_handler(60, a3); -} + v3 = *(TTextBoxMessage * *)((char*)a3 + 70); + *(DWORD*)((char*)a3 + 58) = 0; + if (v3) + { + v4 = *(DWORD*)v3; + TTextBoxMessage::destroy(v3, 1); + *(DWORD*)((char*)a3 + 70) = v4; + TTextBox::Draw(a3, a1); + control_handler(60, a3); + } } //----- (0101421C) -------------------------------------------------------- -TZmapList *__thiscall TTextBox::~TTextBox(TTextBox *this) +TZmapList* __thiscall TTextBox::~TTextBox(TTextBox* this) { -TTextBox *v1; // esi -int v2; // eax -TTextBoxMessage *v3; // ecx -int v4; // edi + TTextBox* v1; // esi + int v2; // eax + TTextBoxMessage* v3; // ecx + int v4; // edi -v1 = this; -v2 = *(DWORD *)((char *)this + 58); -*(DWORD *)this = &TTextBox::vftable; -if ( v2 ) -{ -if ( v2 != -1 ) -timer_kill(v2); -*(DWORD *)((char *)v1 + 58) = 0; -} -if ( *(DWORD *)((char *)v1 + 70) ) -{ -do -{ -v3 = *(TTextBoxMessage **)((char *)v1 + 70); -v4 = *(DWORD *)v3; -if ( v3 ) -TTextBoxMessage::destroy(v3, 1); -*(DWORD *)((char *)v1 + 70) = v4; -} -while ( v4 ); -} -return TPinballComponent::~TPinballComponent(v1); + v1 = this; + v2 = *(DWORD*)((char*)this + 58); + *(DWORD*)this = &TTextBox::vftable; + if (v2) + { + if (v2 != -1) + timer_kill(v2); + *(DWORD*)((char*)v1 + 58) = 0; + } + if (*(DWORD*)((char*)v1 + 70)) + { + do + { + v3 = *(TTextBoxMessage * *)((char*)v1 + 70); + v4 = *(DWORD*)v3; + if (v3) + TTextBoxMessage::destroy(v3, 1); + *(DWORD*)((char*)v1 + 70) = v4; + } while (v4); + } + return TPinballComponent::~TPinballComponent(v1); } // 10023B4: using guessed type void *TTextBox::vftable; //----- (01014269) -------------------------------------------------------- -void TTextBox::Draw(TTextBox *this, int a2) +void TTextBox::Draw(TTextBox* this, int a2) { -TTextBox *v2; // esi -DWORD *v3; // edx -float *v4; // edi -int v5; // ebx -double v6; // st7 -int v7; // eax -float v8; // ST14_4 -DWORD *v9; // ecx -_BYTE *v10; // ebx -int v11; // edi -int v12; // eax -int v13; // eax -char *v14; // edx -char v15; // al -int v16; // eax -DWORD *v17; // edi -int v18; // [esp-10h] [ebp-34h] -int v19; // [esp-Ch] [ebp-30h] -_BYTE *v20; // [esp+18h] [ebp-Ch] -int v21; // [esp+18h] [ebp-Ch] -int i; // [esp+1Ch] [ebp-8h] -_BYTE *v23; // [esp+20h] [ebp-4h] + TTextBox* v2; // esi + DWORD* v3; // edx + float* v4; // edi + int v5; // ebx + double v6; // st7 + int v7; // eax + float v8; // ST14_4 + DWORD* v9; // ecx + _BYTE* v10; // ebx + int v11; // edi + int v12; // eax + int v13; // eax + char* v14; // edx + char v15; // al + int v16; // eax + DWORD* v17; // edi + int v18; // [esp-10h] [ebp-34h] + int v19; // [esp-Ch] [ebp-30h] + _BYTE* v20; // [esp+18h] [ebp-Ch] + int v21; // [esp+18h] [ebp-Ch] + int i; // [esp+1Ch] [ebp-8h] + _BYTE* v23; // [esp+20h] [ebp-4h] -v2 = this; -v3 = *(DWORD **)((char *)this + 62); -if ( v3 ) -gdrv_copy_bitmap( -&vscreen, -*(DWORD *)((char *)this + 50), -*(DWORD *)((char *)this + 54), -*(DWORD *)((char *)this + 42), -*(DWORD *)((char *)this + 46), -v3, -*(DWORD *)((char *)this + 42), -*(DWORD *)((char *)this + 46)); -else -gdrv_fill_bitmap( -a2, -&vscreen, -*(DWORD *)((char *)this + 50), -*(DWORD *)((char *)this + 54), -*(DWORD *)((char *)this + 42), -*(DWORD *)((char *)this + 46), -0); -while ( *(DWORD *)((char *)v2 + 70) ) -{ -v4 = *(float **)((char *)v2 + 70); -if ( v4[2] == -1.0 ) -{ -v5 = *(DWORD *)v4; -if ( !*(DWORD *)v4 ) -{ -*(DWORD *)((char *)v2 + 58) = -1; -LABEL_18: -v9 = *(DWORD **)((char *)v2 + 66); -if ( !v9 ) -{ -gdrv_blit( -(int)&vscreen, -*(DWORD *)((char *)v2 + 42), -*(DWORD *)((char *)v2 + 46), -*(DWORD *)((char *)v2 + 42) + xDest, -*(DWORD *)((char *)v2 + 46) + yDest, -*(DWORD *)((char *)v2 + 50), -*(DWORD *)((char *)v2 + 54)); -grtext_draw_ttext_in_box( -*(LPCSTR *)(*(DWORD *)((char *)v2 + 70) + 4), -xDest + *(DWORD *)((char *)v2 + 42), -yDest + *(DWORD *)((char *)v2 + 46), -*(DWORD *)((char *)v2 + 50), -*(DWORD *)((char *)v2 + 54), -255); -return; -} -v10 = *(_BYTE **)(*(DWORD *)((char *)v2 + 70) + 4); -for ( i = *(DWORD *)((char *)v2 + 46); ; i += v9[1] ) -{ -v15 = *v10; -if ( !*v10 || i + v9[1] > *(DWORD *)((char *)v2 + 46) + *(DWORD *)((char *)v2 + 54) ) -break; -v11 = 0; -v20 = 0; -v23 = v10; -while ( 1 ) -{ -v16 = v15 & 0x7F; -if ( !v16 || v16 == 10 ) -break; -v12 = v9[v16 + 2]; -if ( v12 ) -{ -v13 = *(DWORD *)(v12 + 12) + *v9 + v11; -if ( v13 > *(DWORD *)((char *)v2 + 50) ) -{ -if ( v20 ) -v23 = v20; -break; -} -if ( *v23 == 32 ) -v20 = v23; -v14 = v23 + 1; -v11 = v13; -++v23; -} -else -{ -v14 = v23; -} -v15 = *v14; -} -v21 = *(DWORD *)((char *)v2 + 42); -while ( v10 < v23 ) -{ -v17 = (DWORD *)v9[(*v10++ & 0x7F) + 2]; -if ( v17 ) -{ -v19 = v17[4]; -v18 = v17[3]; -if ( render_background_bitmap ) -gdrv_copy_bitmap_w_transparency(&vscreen, v18, v19, v21, i, v17, 0, 0); -else -gdrv_copy_bitmap(&vscreen, v18, v19, v21, i, v17, 0, 0); -v9 = *(DWORD **)((char *)v2 + 66); -v21 += v17[3] + *v9; -} -} -while ( (*v10 & 0x7F) == 32 ) -++v10; -if ( (*v10 & 0x7F) == 10 ) -++v10; -v9 = *(DWORD **)((char *)v2 + 66); -} -break; -} -} -else -{ -v6 = TTextBoxMessage::TimeLeft((TTextBoxMessage *)*(DWORD *)((char *)v2 + 70)); -if ( v6 >= -2.0 ) -{ -if ( v6 >= 0.25 ) -{ -v8 = v6; -v7 = timer_set(v8, (int)v2, (int)TTextBox::TimerExpired); -} -else -{ -v7 = timer_set(0.25, (int)v2, (int)TTextBox::TimerExpired); -} -*(DWORD *)((char *)v2 + 58) = v7; -goto LABEL_18; -} -v5 = *(DWORD *)v4; -} -if ( v4 ) -TTextBoxMessage::destroy((TTextBoxMessage *)v4, 1); -*(DWORD *)((char *)v2 + 70) = v5; -} -gdrv_blit( -(int)&vscreen, -*(DWORD *)((char *)v2 + 42), -*(DWORD *)((char *)v2 + 46), -*(DWORD *)((char *)v2 + 42) + xDest, -*(DWORD *)((char *)v2 + 46) + yDest, -*(DWORD *)((char *)v2 + 50), -*(DWORD *)((char *)v2 + 54)); + v2 = this; + v3 = *(DWORD * *)((char*)this + 62); + if (v3) + gdrv_copy_bitmap( + &vscreen, + *(DWORD*)((char*)this + 50), + *(DWORD*)((char*)this + 54), + *(DWORD*)((char*)this + 42), + *(DWORD*)((char*)this + 46), + v3, + *(DWORD*)((char*)this + 42), + *(DWORD*)((char*)this + 46)); + else + gdrv_fill_bitmap( + a2, + &vscreen, + *(DWORD*)((char*)this + 50), + *(DWORD*)((char*)this + 54), + *(DWORD*)((char*)this + 42), + *(DWORD*)((char*)this + 46), + 0); + while (*(DWORD*)((char*)v2 + 70)) + { + v4 = *(float**)((char*)v2 + 70); + if (v4[2] == -1.0) + { + v5 = *(DWORD*)v4; + if (!*(DWORD*)v4) + { + *(DWORD*)((char*)v2 + 58) = -1; + LABEL_18: + v9 = *(DWORD * *)((char*)v2 + 66); + if (!v9) + { + gdrv_blit( + (int)& vscreen, + *(DWORD*)((char*)v2 + 42), + *(DWORD*)((char*)v2 + 46), + *(DWORD*)((char*)v2 + 42) + xDest, + *(DWORD*)((char*)v2 + 46) + yDest, + *(DWORD*)((char*)v2 + 50), + *(DWORD*)((char*)v2 + 54)); + grtext_draw_ttext_in_box( + *(LPCSTR*)(*(DWORD*)((char*)v2 + 70) + 4), + xDest + *(DWORD*)((char*)v2 + 42), + yDest + *(DWORD*)((char*)v2 + 46), + *(DWORD*)((char*)v2 + 50), + *(DWORD*)((char*)v2 + 54), + 255); + return; + } + v10 = *(_BYTE * *)(*(DWORD*)((char*)v2 + 70) + 4); + for (i = *(DWORD*)((char*)v2 + 46); ; i += v9[1]) + { + v15 = *v10; + if (!*v10 || i + v9[1] > * (DWORD*)((char*)v2 + 46) + *(DWORD*)((char*)v2 + 54)) + break; + v11 = 0; + v20 = 0; + v23 = v10; + while (1) + { + v16 = v15 & 0x7F; + if (!v16 || v16 == 10) + break; + v12 = v9[v16 + 2]; + if (v12) + { + v13 = *(DWORD*)(v12 + 12) + *v9 + v11; + if (v13 > * (DWORD*)((char*)v2 + 50)) + { + if (v20) + v23 = v20; + break; + } + if (*v23 == 32) + v20 = v23; + v14 = v23 + 1; + v11 = v13; + ++v23; + } + else + { + v14 = v23; + } + v15 = *v14; + } + v21 = *(DWORD*)((char*)v2 + 42); + while (v10 < v23) + { + v17 = (DWORD*)v9[(*v10++ & 0x7F) + 2]; + if (v17) + { + v19 = v17[4]; + v18 = v17[3]; + if (render_background_bitmap) + gdrv_copy_bitmap_w_transparency(&vscreen, v18, v19, v21, i, v17, 0, 0); + else + gdrv_copy_bitmap(&vscreen, v18, v19, v21, i, v17, 0, 0); + v9 = *(DWORD * *)((char*)v2 + 66); + v21 += v17[3] + *v9; + } + } + while ((*v10 & 0x7F) == 32) + ++v10; + if ((*v10 & 0x7F) == 10) + ++v10; + v9 = *(DWORD * *)((char*)v2 + 66); + } + break; + } + } + else + { + v6 = TTextBoxMessage::TimeLeft((TTextBoxMessage*) * (DWORD*)((char*)v2 + 70)); + if (v6 >= -2.0) + { + if (v6 >= 0.25) + { + v8 = v6; + v7 = timer_set(v8, (int)v2, (int)TTextBox::TimerExpired); + } + else + { + v7 = timer_set(0.25, (int)v2, (int)TTextBox::TimerExpired); + } + *(DWORD*)((char*)v2 + 58) = v7; + goto LABEL_18; + } + v5 = *(DWORD*)v4; + } + if (v4) + TTextBoxMessage::destroy((TTextBoxMessage*)v4, 1); + *(DWORD*)((char*)v2 + 70) = v5; + } + gdrv_blit( + (int)& vscreen, + *(DWORD*)((char*)v2 + 42), + *(DWORD*)((char*)v2 + 46), + *(DWORD*)((char*)v2 + 42) + xDest, + *(DWORD*)((char*)v2 + 46) + yDest, + *(DWORD*)((char*)v2 + 50), + *(DWORD*)((char*)v2 + 54)); } //----- (010144B7) -------------------------------------------------------- -void TTextBox::Display(TTextBox *this, int a2, char *a3, float a4) +void TTextBox::Display(TTextBox* this, int a2, char* a3, float a4) { -TTextBox *v4; // esi -const char **v5; // ecx -int v6; // ST08_4 -int v7; // eax -int v8; // eax -TTextBoxMessage *v9; // eax -TTextBoxMessage *v10; // eax -bool v11; // zf + TTextBox* v4; // esi + const char** v5; // ecx + int v6; // ST08_4 + int v7; // eax + int v8; // eax + TTextBoxMessage* v9; // eax + TTextBoxMessage* v10; // eax + bool v11; // zf -v4 = this; -if ( a3 ) -{ -if ( !*(DWORD *)((char *)this + 70) -|| (v5 = *(const char ***)((char *)this + 74), v6 = a2, v7 = strcmp(a3, v5[1]), a2 = v6, v7) ) -{ -if ( *(DWORD *)((char *)v4 + 58) == -1 ) -TTextBox::Clear(v4, a2); -v9 = (TTextBoxMessage *)operator new(0x10u); -if ( v9 ) -v10 = TTextBoxMessage::TTextBoxMessage(v9, a3, a4); -else -v10 = 0; -if ( v10 ) -{ -if ( *((DWORD *)v10 + 1) ) -{ -if ( *(DWORD *)((char *)v4 + 70) ) -**(DWORD **)((char *)v4 + 74) = v10; -else -*(DWORD *)((char *)v4 + 70) = v10; -v11 = *(DWORD *)((char *)v4 + 58) == 0; -*(DWORD *)((char *)v4 + 74) = v10; -if ( v11 ) -TTextBox::Draw(v4, a2); -} -else -{ -TTextBoxMessage::destroy(v10, 1); -} -} -} -else -{ -TTextBoxMessage::Refresh((TTextBoxMessage *)v5, a4); -if ( *(DWORD *)((char *)v4 + 74) == *(DWORD *)((char *)v4 + 70) ) -{ -v8 = *(DWORD *)((char *)v4 + 58); -if ( v8 && v8 != -1 ) -timer_kill(*(DWORD *)((char *)v4 + 58)); -if ( a4 == -1.0 ) -*(DWORD *)((char *)v4 + 58) = -1; -else -*(DWORD *)((char *)v4 + 58) = timer_set(a4, (int)v4, (int)TTextBox::TimerExpired); -} -} -} + v4 = this; + if (a3) + { + if (!*(DWORD*)((char*)this + 70) + || (v5 = *(const char***)((char*)this + 74), v6 = a2, v7 = strcmp(a3, v5[1]), a2 = v6, v7)) + { + if (*(DWORD*)((char*)v4 + 58) == -1) + TTextBox::Clear(v4, a2); + v9 = (TTextBoxMessage*)operator new(0x10u); + if (v9) + v10 = TTextBoxMessage::TTextBoxMessage(v9, a3, a4); + else + v10 = 0; + if (v10) + { + if (*((DWORD*)v10 + 1)) + { + if (*(DWORD*)((char*)v4 + 70)) + ** (DWORD * *)((char*)v4 + 74) = v10; + else + *(DWORD*)((char*)v4 + 70) = v10; + v11 = *(DWORD*)((char*)v4 + 58) == 0; + *(DWORD*)((char*)v4 + 74) = v10; + if (v11) + TTextBox::Draw(v4, a2); + } + else + { + TTextBoxMessage::destroy(v10, 1); + } + } + } + else + { + TTextBoxMessage::Refresh((TTextBoxMessage*)v5, a4); + if (*(DWORD*)((char*)v4 + 74) == *(DWORD*)((char*)v4 + 70)) + { + v8 = *(DWORD*)((char*)v4 + 58); + if (v8 && v8 != -1) + timer_kill(*(DWORD*)((char*)v4 + 58)); + if (a4 == -1.0) + * (DWORD*)((char*)v4 + 58) = -1; + else + *(DWORD*)((char*)v4 + 58) = timer_set(a4, (int)v4, (int)TTextBox::TimerExpired); + } + } + } } //----- (010145CF) -------------------------------------------------------- -TTextBox *__thiscall TTextBox::destroy(TTextBox *this, char a2) +TTextBox* __thiscall TTextBox::destroy(TTextBox* this, char a2) { -TTextBox *v2; // esi + TTextBox* v2; // esi -v2 = this; -TTextBox::~TTextBox(this); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + TTextBox::~TTextBox(this); + if (a2 & 1) + component_delete((void*)v2); + return v2; } //----- (01019168) -------------------------------------------------------- int TTextBox::Message(int a2, float a3) { -return 0; + return 0; } diff --git a/Classes/TTextBoxMessage/TTextBoxMessage.cpp b/Classes/TTextBoxMessage/TTextBoxMessage.cpp index 48b7b07..45514a3 100644 --- a/Classes/TTextBoxMessage/TTextBoxMessage.cpp +++ b/Classes/TTextBoxMessage/TTextBoxMessage.cpp @@ -1,50 +1,50 @@ #include "TTextBoxMessage.h" //----- (01013AF1) -------------------------------------------------------- -TTextBoxMessage *__thiscall TTextBoxMessage::TTextBoxMessage(TTextBoxMessage *this, char *a2, float a3) +TTextBoxMessage* __thiscall TTextBoxMessage::TTextBoxMessage(TTextBoxMessage* this, char* a2, float a3) { -TTextBoxMessage *v3; // esi -char *v4; // edx + TTextBoxMessage* v3; // esi + char* v4; // edx -v3 = this; -*(DWORD *)this = 0; -*((float *)this + 2) = a3; -*((DWORD *)this + 3) = time_ticks - (unsigned __int64)(signed __int64)(a3 * -1000.0); -if ( a2 ) -*((DWORD *)this + 1) = memoryallocate(strlen(a2) + 1); -else -*((DWORD *)this + 1) = 0; -v4 = (char *)*((DWORD *)v3 + 1); -if ( v4 ) -strcpy(v4, a2); -return v3; + v3 = this; + *(DWORD*)this = 0; + *((float*)this + 2) = a3; + *((DWORD*)this + 3) = time_ticks - (unsigned __int64)(signed __int64)(a3 * -1000.0); + if (a2) + * ((DWORD*)this + 1) = memoryallocate(strlen(a2) + 1); + else + *((DWORD*)this + 1) = 0; + v4 = (char*) * ((DWORD*)v3 + 1); + if (v4) + strcpy(v4, a2); + return v3; } // 1024F84: using guessed type int time_ticks; //----- (01013B60) -------------------------------------------------------- -double __thiscall TTextBoxMessage::TimeLeft(TTextBoxMessage *this) +double __thiscall TTextBoxMessage::TimeLeft(TTextBoxMessage* this) { -return (double)(*((DWORD *)this + 3) - time_ticks) * 0.001; + return (double)(*((DWORD*)this + 3) - time_ticks) * 0.001; } // 1024F84: using guessed type int time_ticks; //----- (01013B82) -------------------------------------------------------- -void __thiscall TTextBoxMessage::Refresh(TTextBoxMessage *this, float a2) +void __thiscall TTextBoxMessage::Refresh(TTextBoxMessage* this, float a2) { -*((float *)this + 2) = a2; -*((DWORD *)this + 3) = time_ticks - (unsigned __int64)(signed __int64)(a2 * -1000.0); + *((float*)this + 2) = a2; + *((DWORD*)this + 3) = time_ticks - (unsigned __int64)(signed __int64)(a2 * -1000.0); } // 1024F84: using guessed type int time_ticks; //----- (01014115) -------------------------------------------------------- -TTextBoxMessage *__thiscall TTextBoxMessage::destroy(TTextBoxMessage *this, char a2) +TTextBoxMessage* __thiscall TTextBoxMessage::destroy(TTextBoxMessage* this, char a2) { -TTextBoxMessage *v2; // esi + TTextBoxMessage* v2; // esi -v2 = this; -if ( *((DWORD *)this + 1) ) -memoryfree(*((DWORD *)this + 1)); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + if (*((DWORD*)this + 1)) + memoryfree(*((DWORD*)this + 1)); + if (a2 & 1) + component_delete((void*)v2); + return v2; } diff --git a/Classes/TZmapList/TZmapList.cpp b/Classes/TZmapList/TZmapList.cpp index e78f9b9..aad14f4 100644 --- a/Classes/TZmapList/TZmapList.cpp +++ b/Classes/TZmapList/TZmapList.cpp @@ -1,22 +1,22 @@ #include "TZmaplist.h" //----- (010158F0) -------------------------------------------------------- -TZmapList *__thiscall TZmapList::TZmapList(TZmapList *this, int a2, int a3) +TZmapList* __thiscall TZmapList::TZmapList(TZmapList* this, int a2, int a3) { -TZmapList *v3; // esi + TZmapList* v3; // esi -v3 = this; -objlist_class::objlist_class(this, a2, a3); -return v3; + v3 = this; + objlist_class::objlist_class(this, a2, a3); + return v3; } //----- (01017E5C) -------------------------------------------------------- -TZmapList *__thiscall TZmapList::destroy(TZmapList *this, char a2) +TZmapList* __thiscall TZmapList::destroy(TZmapList* this, char a2) { -TZmapList *v2; // esi + TZmapList* v2; // esi -v2 = this; -objlist_destroy(*((DWORD *)this + 1)); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + objlist_destroy(*((DWORD*)this + 1)); + if (a2 & 1) + component_delete((void*)v2); + return v2; } diff --git a/Classes/TlightGroup/TLightGroup.cpp b/Classes/TlightGroup/TLightGroup.cpp index 25d332d..86d314e 100644 --- a/Classes/TlightGroup/TLightGroup.cpp +++ b/Classes/TlightGroup/TLightGroup.cpp @@ -5,798 +5,785 @@ #include "TLightGroup.h" //----- (01009FD1) -------------------------------------------------------- -TZmapList *__thiscall TLightGroup::~TLightGroup(TLightGroup *this) +TZmapList* __thiscall TLightGroup::~TLightGroup(TLightGroup* this) { - TLightGroup *v1; // esi + TLightGroup* v1; // esi - v1 = this; - objlist_destroy(*(DWORD *)((char *)this + 46)); - return TPinballComponent::~TPinballComponent(v1); + v1 = this; + objlist_destroy(*(DWORD*)((char*)this + 46)); + return TPinballComponent::~TPinballComponent(v1); } //----- (01009FEB) -------------------------------------------------------- -void __thiscall TLightGroup::Reset(TLightGroup *this) +void __thiscall TLightGroup::Reset(TLightGroup* this) { - TLightGroup *v1; // esi - int v2; // eax - int v3; // eax + 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; + 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 TLightGroup::TimerExpired(int a1, void *a2) +void TLightGroup::TimerExpired(int a1, void* a2) { - double v2; // st7 - void (**v3)(DWORD, DWORD); // eax - float v4; // ST04_4 + double v2; // st7 + void (**v3)(DWORD, DWORD); // eax + float v4; // ST04_4 - v2 = *(float *)((char *)a2 + 50); - v3 = *(void (***)(DWORD, DWORD))a2; - *(DWORD *)((char *)a2 + 70) = 0; - v4 = v2; - (*v3)(*(DWORD *)((char *)a2 + 58), LODWORD(v4)); + v2 = *(float*)((char*)a2 + 50); + v3 = *(void (***)(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) +void __thiscall TLightGroup::reschedule_animation(TLightGroup* this, float a2) { -TLightGroup *v2; // esi + 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; + 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 __thiscall TLightGroup::next_light_up(TLightGroup* this) { - int v1; // ecx - int v2; // edx - int result; // eax - int v4; // ecx + 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; + 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 __thiscall TLightGroup::next_light_down(TLightGroup* this) { - int v1; // ecx - int result; // eax - int v3; // ecx + 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; + 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) +void __thiscall TLightGroup::start_animation(TLightGroup* this) { - TLightGroup *v1; // edi - int v2; // eax - int v3; // esi - int v4; // ebx - int v5; // ecx - void (**v6)(signed int, float); // eax - float v7; // [esp+0h] [ebp-10h] + TLightGroup* v1; // edi + int v2; // eax + int v3; // esi + int v4; // ebx + int v5; // ecx + void (**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 (***)(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 ); - } + 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 (***)(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 TLightGroup::NotifyTimerExpired(int a1, void *a2) +void TLightGroup::NotifyTimerExpired(int a1, void* a2) { - *(DWORD *)((char *)a2 + 66) = 0; - control_handler(61, (struct TPinballComponent *)a2); + *(DWORD*)((char*)a2 + 66) = 0; + control_handler(61, (struct TPinballComponent*)a2); } //----- (0100A166) -------------------------------------------------------- -int __thiscall TLightGroup::Message(TLightGroup *this, int a2, float a3) +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 (***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] + 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 (***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 (****)(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 (****)(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 (****)(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 (****)(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 (****)(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 (****)(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 (****)(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 (***)(DWORD, DWORD))v71)(0, 0.0); -(***(void (****)(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 (****)(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; + 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 (****)(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 (****)(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 (****)(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 (****)(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 (****)(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 (****)(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 (****)(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 (***)(DWORD, DWORD))v71)(0, 0.0); + (***(void (****)(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 (****)(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* __thiscall TLightGroup::TLightGroup(TLightGroup* this, struct TPinballTable* a2, int a3) { -TLightGroup *v3; // esi -signed int *v4; // ebx -struct TPinballComponent *v5; // eax -int v7; // [esp+Ch] [ebp-4h] -int i; // [esp+1Ch] [ebp+Ch] + TLightGroup* v3; // esi + signed int* 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 int *)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; + 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 int*)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* __thiscall TLightGroup::destroy(TLightGroup* this, char a2) { -TLightGroup *v2; // esi + TLightGroup* v2; // esi -v2 = this; -TLightGroup::~TLightGroup(this); -if ( a2 & 1 ) -operator delete((void *)v2); -return v2; + v2 = this; + TLightGroup::~TLightGroup(this); + if (a2 & 1) + component_delete((void*)v2); + return v2; } diff --git a/Classes/TlightGroup/TLightGroup.h b/Classes/TlightGroup/TLightGroup.h index 5eb3a32..380c4ca 100644 --- a/Classes/TlightGroup/TLightGroup.h +++ b/Classes/TlightGroup/TLightGroup.h @@ -20,7 +20,7 @@ void __thiscall TLightGroup::start_animation(TLightGroup* __hidden this); // idb void TLightGroup::NotifyTimerExpired(int, void*); // idb int __thiscall TLightGroup::Message(TLightGroup* this, int, float); // idb TLightGroup* __thiscall TLightGroup::TLightGroup(TLightGroup* this, struct TPinballTable* a2, int a3); -TLightGroup* __thiscall TLightGroup::`vector deleting destructor`(TLightGroup *this, char a2); +TLightGroup* __thiscall TLightGroup::destroy(TLightGroup *this, char a2); void* TLightGroup::vftable = &TLightGroup::Message; // weak diff --git a/pinball.h b/pinball.h index 4ae8f0f..369d38f 100644 --- a/pinball.h +++ b/pinball.h @@ -59,7 +59,7 @@ LONG fullscrn_shutdown(); BOOL fullscrn_activate(int a1); int fullscrn_convert_mouse_pos(int a1); DWORD *fullscrn_getminmaxinfo(DWORD *a1); -// HBRUSH sub_1003F10(LONG a1, LONG a2, int a3, int a4); +HBRUSH sub_1003F10(LONG a1, LONG a2, int a3, int a4); void fullscrn_paint(); signed int rectangle_clip(int *a1, int *a2, DWORD *a3); int enclosing_box(DWORD *a1, DWORD *a2, DWORD *a3); @@ -77,13 +77,13 @@ int gdrv_blit_sequence(int, int xSrc, int, int xDest, int yDest, int DestWidth, int gdrv_end_blit_sequence(); HDC gdrv_blit(int a1, int xSrc, int a3, int xDest, int yDest, int DestWidth, int DestHeight); int gdrv_blat(int, int xDest, int yDest); // idb -// int gdrv_fill_bitmap(int a1, DWORD *a2, unsigned int a3, int a4, int a5, int a6, char a7); +int gdrv_fill_bitmap(int a1, DWORD *a2, unsigned int a3, int a4, int a5, int a6, char a7); char *gdrv_copy_bitmap(DWORD *a1, int a2, int a3, int a4, int a5, DWORD *a6, int a7, int a8); _BYTE *gdrv_copy_bitmap_w_transparency(DWORD *a1, int a2, int a3, int a4, int a5, DWORD *a6, int a7, int a8); int zdrv_pad(int a1); signed int zdrv_create_zmap(int a1, int a2, int a3); signed int zdrv_destroy_zmap(DWORD *a1); -// int zdrv_fill(int a1, int a2, unsigned int a3, int a4, int a5, int a6, int a7); +int zdrv_fill(int a1, int a2, unsigned int a3, int a4, int a5, int a6, int a7); WORD *zdrv_paint(int a1, int a2, DWORD *a3, int a4, int a5, int a6, int a7, int a8, DWORD *a9, int a10, int a11, int a12, int a13, int a14); unsigned int *zdrv_paint_flat(int a1, int a2, DWORD *a3, int a4, int a5, int a6, int a7, int a8, DWORD *a9, int a10, int a11, unsigned int a12); int high_score_clear_table(int a1); @@ -150,9 +150,9 @@ int make_path_name(LPSTR lpFilename, LPCSTR lpString2, DWORD nSize); // idb void help_introduction(int a1, int a2); BOOL center_in(HWND hWnd, HWND a2); INT a_dialog(HINSTANCE hInstance, HWND hWnd, int a3); -// void winmain_pause(int a1); -// void winmain_end_pause(int a1); -// HCURSOR winmain_new_game(int a1); +void winmain_pause(int a1); +void winmain_end_pause(int a1); +HCURSOR winmain_new_game(int a1); void winmain_memalloc_failure(); // idb HANDLE adjust_priority(int a1); LRESULT message_handler(HWND hWnd, UINT Msg, WPARAM wParam, int a4); @@ -200,14 +200,14 @@ struct TPinballComponent *make_component_link(struct component_tag *); // idb void control_make_links(struct TPinballTable *); // idb BOOL light_on(struct component_tag *a1); void table_control_handler(int); // idb -// void table_set_replay(int a1, float a2); -// void table_set_multiball(int a1); -// void table_set_jackpot(int a1); -// void table_set_bonus(int a1); -// void table_set_flag_lights(int a1); -// void table_set_bonus_hold(int a1); -// void table_bump_ball_sink_lock(int a1); -// void table_add_extra_ball(int a1, float a2); +void table_set_replay(int a1, float a2); +void table_set_multiball(int a1); +void table_set_jackpot(int a1); +void table_set_bonus(int a1); +void table_set_flag_lights(int a1); +void table_set_bonus_hold(int a1); +void table_bump_ball_sink_lock(int a1); +void table_add_extra_ball(int a1, float a2); int SpecialAddScore(int); // idb void AdvanceWormHoleDestination(int); // idb void FlipperRebounderControl1(int, struct TPinballComponent *); // idb @@ -218,42 +218,42 @@ void LeftKickerControl(int, struct TPinballComponent *); // idb void RightKickerControl(int, struct TPinballComponent *); // idb void LeftKickerGateControl(int, struct TPinballComponent *); // idb void RightKickerGateControl(int, struct TPinballComponent *); // idb -// void DeploymentChuteToEscapeChuteOneWayControl(int a1, int a2, int a3, struct TPinballComponent *a4); +void DeploymentChuteToEscapeChuteOneWayControl(int a1, int a2, int a3, struct TPinballComponent *a4); void DeploymentChuteToTableOneWayControl(int, struct TPinballComponent *); // idb void DrainBallBlockerControl(int, struct TPinballComponent *); // idb -// void LaunchRampControl(int a1, int a2, struct TPinballComponent *a3); +void LaunchRampControl(int a1, int a2, struct TPinballComponent *a3); void LaunchRampHoleControl(int, struct TPinballComponent *); // idb void SpaceWarpRolloverControl(int, struct TPinballComponent *); // idb -// void ReentryLanesRolloverControl(int a1, int a2, int a3, int a4, struct TPinballComponent *a5); +void ReentryLanesRolloverControl(int a1, int a2, int a3, int a4, struct TPinballComponent *a5); void BumperGroupControl(int, struct TPinballComponent *); // idb -// void LaunchLanesRolloverControl(int a1, int a2, int a3, int a4, struct TPinballComponent *a5); -// void OutLaneRolloverControl(int a1, int a2, int a3, struct TPinballComponent *a4); +void LaunchLanesRolloverControl(int a1, int a2, int a3, int a4, struct TPinballComponent *a5); +void OutLaneRolloverControl(int a1, int a2, int a3, struct TPinballComponent *a4); void ExtraBallLightControl(int, struct TPinballComponent *); // idb -// void ReturnLaneRolloverControl(int a1, int a2, struct TPinballComponent *a3); -// void BonusLaneRolloverControl(int a1, int a2, struct TPinballComponent *a3); -// void FuelRollover1Control(int a1, int a2, struct TPinballComponent *a3); -// void FuelRollover2Control(int a1, int a2, struct TPinballComponent *a3); -// void FuelRollover3Control(int a1, int a2, struct TPinballComponent *a3); -// void FuelRollover4Control(int a1, int a2, struct TPinballComponent *a3); -// void FuelRollover5Control(int a1, int a2, struct TPinballComponent *a3); -// void FuelRollover6Control(int a1, int a2, struct TPinballComponent *a3); +void ReturnLaneRolloverControl(int a1, int a2, struct TPinballComponent *a3); +void BonusLaneRolloverControl(int a1, int a2, struct TPinballComponent *a3); +void FuelRollover1Control(int a1, int a2, struct TPinballComponent *a3); +void FuelRollover2Control(int a1, int a2, struct TPinballComponent *a3); +void FuelRollover3Control(int a1, int a2, struct TPinballComponent *a3); +void FuelRollover4Control(int a1, int a2, struct TPinballComponent *a3); +void FuelRollover5Control(int a1, int a2, struct TPinballComponent *a3); +void FuelRollover6Control(int a1, int a2, struct TPinballComponent *a3); void HyperspaceLightGroupControl(int, struct TPinballComponent *); // idb -// void WormHoleControl(int a1, int a2, int a3, int a4, struct TPinballComponent *a5); +void WormHoleControl(int a1, int a2, int a3, int a4, struct TPinballComponent *a5); void LeftFlipperControl(int, struct TPinballComponent *); // idb void RightFlipperControl(int, struct TPinballComponent *); // idb void JackpotLightControl(int, struct TPinballComponent *); // idb void BonusLightControl(int, struct TPinballComponent *); // idb void BoosterTargetControl(int, struct TPinballComponent *); // idb void MedalLightGroupControl(int, struct TPinballComponent *); // idb -// void MultiplierLightGroupControl(int a1, int a2, struct TPinballComponent *a3); -// void FuelSpotTargetControl(int a1, int a2, struct TPinballComponent *a3); -// void MissionSpotTargetControl(int a1, int a2, struct TPinballComponent *a3); +void MultiplierLightGroupControl(int a1, int a2, struct TPinballComponent *a3); +void FuelSpotTargetControl(int a1, int a2, struct TPinballComponent *a3); +void MissionSpotTargetControl(int a1, int a2, struct TPinballComponent *a3); void LeftHazardSpotTargetControl(int, struct TPinballComponent *); // idb void RightHazardSpotTargetControl(int, struct TPinballComponent *); // idb -// void WormHoleDestinationControl(int a1, int a2, struct TPinballComponent *a3); -// void BlackHoleKickoutControl(int a1, int a2, struct TPinballComponent *a3); +void WormHoleDestinationControl(int a1, int a2, struct TPinballComponent *a3); +void BlackHoleKickoutControl(int a1, int a2, struct TPinballComponent *a3); void FlagControl(int, struct TPinballComponent *); // idb -// void GravityWellKickoutControl(int a1, int a2, struct TPinballComponent *a3); +void GravityWellKickoutControl(int a1, int a2, struct TPinballComponent *a3); void SkillShotGate1Control(int, struct TPinballComponent *); // idb void SkillShotGate2Control(int, struct TPinballComponent *); // idb void SkillShotGate3Control(int, struct TPinballComponent *); // idb @@ -262,48 +262,48 @@ void SkillShotGate5Control(int, struct TPinballComponent *); // idb void SkillShotGate6Control(int, struct TPinballComponent *); // idb void ShootAgainLightControl(int, struct TPinballComponent *); // idb void EscapeChuteSinkControl(int, struct TPinballComponent *); // idb -// int cheat_bump_rank(int a1); -// void pbctrl_bdoor_controller(int a1, int a2); +int cheat_bump_rank(int a1); +void pbctrl_bdoor_controller(int a1, int a2); int AddRankProgress(int); // idb -// void WaitingDeploymentController(int a1, int a2, struct TPinballComponent *a3); +void WaitingDeploymentController(int a1, int a2, struct TPinballComponent *a3); void SelectMissionController(int, struct TPinballComponent *); // idb -// void PracticeMissionController(int a1, int a2, struct TPinballComponent *a3); -// void LaunchTrainingController(int a1, int a2, struct TPinballComponent *a3); -// void ReentryTrainingController(int a1, int a2, struct TPinballComponent *a3); -// void ScienceMissionController(int a1, int a2, struct TPinballComponent *a3); -// void StrayCometController(int a1, int a2, struct TPinballComponent *a3); -// void SpaceRadiationController(int a1, int a2, struct TPinballComponent *a3); -// void BlackHoleThreatController(int a1, int a2, struct TPinballComponent *a3); -// void BugHuntController(int a1, int a2, struct TPinballComponent *a3); -// void RescueMissionController(int a1, int a2, struct TPinballComponent *a3); -// void AlienMenaceController(int a1, int a2, struct TPinballComponent *a3); -// void AlienMenacePartTwoController(int a1, int a2, struct TPinballComponent *a3); -// void SatelliteController(int a1, int a2, struct TPinballComponent *a3); -// void ReconnaissanceController(int a1, int a2, struct TPinballComponent *a3); -// void DoomsdayMachineController(int a1, int a2, struct TPinballComponent *a3); -// void CosmicPlagueController(int a1, int a2, struct TPinballComponent *a3); -// void CosmicPlaguePartTwoController(int a1, int a2, struct TPinballComponent *a3); -// void SecretMissionYellowController(int a1, int a2, struct TPinballComponent *a3); -// void SecretMissionRedController(int a1, int a2, struct TPinballComponent *a3); -// void SecretMissionGreenController(int a1, int a2, struct TPinballComponent *a3); -// void TimeWarpController(int a1, int a2, struct TPinballComponent *a3); -// void TimeWarpPartTwoController(int a1, int a2, struct TPinballComponent *a3); -// void MaelstromController(int a1, int a2, struct TPinballComponent *a3); -// void MaelstromPartTwoController(int a1, int a2, struct TPinballComponent *a3); -// void MaelstromPartThreeController(int a1, int a2, struct TPinballComponent *a3); -// void MaelstromPartFourController(int a1, int a2, struct TPinballComponent *a3); -// void MaelstromPartFiveController(int a1, int a2, struct TPinballComponent *a3); -// void MaelstromPartSixController(int a1, int a2, struct TPinballComponent *a3); -// void MaelstromPartSevenController(int a1, int a2, struct TPinballComponent *a3); -// void MaelstromPartEightController(int a1, int a2, struct TPinballComponent *a3); +void PracticeMissionController(int a1, int a2, struct TPinballComponent *a3); +void LaunchTrainingController(int a1, int a2, struct TPinballComponent *a3); +void ReentryTrainingController(int a1, int a2, struct TPinballComponent *a3); +void ScienceMissionController(int a1, int a2, struct TPinballComponent *a3); +void StrayCometController(int a1, int a2, struct TPinballComponent *a3); +void SpaceRadiationController(int a1, int a2, struct TPinballComponent *a3); +void BlackHoleThreatController(int a1, int a2, struct TPinballComponent *a3); +void BugHuntController(int a1, int a2, struct TPinballComponent *a3); +void RescueMissionController(int a1, int a2, struct TPinballComponent *a3); +void AlienMenaceController(int a1, int a2, struct TPinballComponent *a3); +void AlienMenacePartTwoController(int a1, int a2, struct TPinballComponent *a3); +void SatelliteController(int a1, int a2, struct TPinballComponent *a3); +void ReconnaissanceController(int a1, int a2, struct TPinballComponent *a3); +void DoomsdayMachineController(int a1, int a2, struct TPinballComponent *a3); +void CosmicPlagueController(int a1, int a2, struct TPinballComponent *a3); +void CosmicPlaguePartTwoController(int a1, int a2, struct TPinballComponent *a3); +void SecretMissionYellowController(int a1, int a2, struct TPinballComponent *a3); +void SecretMissionRedController(int a1, int a2, struct TPinballComponent *a3); +void SecretMissionGreenController(int a1, int a2, struct TPinballComponent *a3); +void TimeWarpController(int a1, int a2, struct TPinballComponent *a3); +void TimeWarpPartTwoController(int a1, int a2, struct TPinballComponent *a3); +void MaelstromController(int a1, int a2, struct TPinballComponent *a3); +void MaelstromPartTwoController(int a1, int a2, struct TPinballComponent *a3); +void MaelstromPartThreeController(int a1, int a2, struct TPinballComponent *a3); +void MaelstromPartFourController(int a1, int a2, struct TPinballComponent *a3); +void MaelstromPartFiveController(int a1, int a2, struct TPinballComponent *a3); +void MaelstromPartSixController(int a1, int a2, struct TPinballComponent *a3); +void MaelstromPartSevenController(int a1, int a2, struct TPinballComponent *a3); +void MaelstromPartEightController(int a1, int a2, struct TPinballComponent *a3); void GameoverController(int, struct TPinballComponent *); // idb void UnselectMissionController(int, struct TPinballComponent *); // idb void MissionControl(int, struct TPinballComponent *); // idb void control_handler(int, struct TPinballComponent *); // idb void HyperspaceKickOutControl(int, struct TPinballComponent *); // idb -// void PlungerControl(int a1, int a2, struct TPinballComponent *a3); -// void MedalTargetControl(int a1, int a2, int a3, int a4, struct TPinballComponent *a5); -// void MultiplierTargetControl(int a1, int a2, int a3, int a4, struct TPinballComponent *a5); +void PlungerControl(int a1, int a2, struct TPinballComponent *a3); +void MedalTargetControl(int a1, int a2, int a3, int a4, struct TPinballComponent *a5); +void MultiplierTargetControl(int a1, int a2, int a3, int a4, struct TPinballComponent *a5); void BallDrainControl(int, struct TPinballComponent *); // idb int objlist_add_object(DWORD *a1, int a2); signed int objlist_delete_object(int a1, int a2); @@ -331,8 +331,8 @@ DWORD *score_create(LPCSTR lpString, int a2); void *score_dup(const void *a1, int a2); void objlist_destroy(int a1); DWORD *score_set(DWORD *a1, int a2); -// void *score_erase(int a1, DWORD *a2, int a3); -// HDC score_update(int a1, int *a2); +void *score_erase(int a1, DWORD *a2, int a3); +HDC score_update(int a1, int *a2); signed int score_init(); void score_unload_msg_font(); HRSRC score_load_msg_font(LPCSTR lpName); @@ -343,9 +343,9 @@ int pb_end_game(); signed int pb_chk_highscore(); long double pb_collide(struct TEdgeSegment *a1, float a2, struct TBall *a3); void pb_timed_frame(float, float, int); // idb -// signed int pb_frame(int a1, int a2); +signed int pb_frame(int a1, int a2); void pb_firsttime_setup(); -// struct TPinballTable *pb_tilt_no_more(int a1); +struct TPinballTable *pb_tilt_no_more(int a1); void pb_ballset(signed int a1, signed int a2); void nudge(float, float); // idb void un_nudge_left(int, void *); // idb @@ -362,10 +362,10 @@ DWORD *pb_window_size(DWORD *a1, DWORD *a2); int pb_init(); int pb_uninit(); int pb_loose_focus(); -// void pb_pause_continue(int a1); +void pb_pause_continue(int a1); int pb_launch_ball(); int pb_reset_table(); -// void pb_toggle_demo(int a1); +void pb_toggle_demo(int a1); DWORD gdrv_get_focus(); // idb void throw_ball(struct TBall *, struct vector_type *, float, float, float); // idb void find_closest_edge(struct ramp_plane_type *, int, struct wall_point_type *, struct vector_type **, struct vector_type **); // idb @@ -451,9 +451,9 @@ int WaveMixConfigureInit(WORD *a1); int WaveMixInit(); HLOCAL WaveMixCloseSession(HLOCAL hMem); int WinMainCRTStartup(); -// void __cdecl operator delete(void *); idb -// void *__cdecl operator new(unsigned int); idb -// int __cdecl _initterm(DWORD, DWORD); weak +void component_delete(void *); idb +void *component_create(unsigned int); idb +int _initterm(DWORD, DWORD); weak unsigned int _setdefaultprecision(); int check_expiration_date(); // unsigned int __cdecl _controlfp(unsigned int NewValue, unsigned int Mask); diff --git a/sound/wavemix.cpp b/sound/wavemix.cpp index 48e47c2..a2350a8 100644 --- a/sound/wavemix.cpp +++ b/sound/wavemix.cpp @@ -1,328 +1,322 @@ #include "../pinball.h" //----- (0101CFD0) -------------------------------------------------------- -WORD *SessionToGlobalDataPtr(WORD *a1) +WORD* SessionToGlobalDataPtr(WORD* a1) { -if ( a1 && *a1 == 21554 && a1[222] == 21554 ) -return a1; -MessageBeep(0xFFFFFFFF); -_wsprintfA(aWavemixV23ByAn, "Invalid session handle 0x%04X passed to WaveMix API", a1); -MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u); -return 0; + if (a1 && *a1 == 21554 && a1[222] == 21554) + return a1; + MessageBeep(0xFFFFFFFF); + _wsprintfA(aWavemixV23ByAn, "Invalid session handle 0x%04X passed to WaveMix API", a1); + MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u); + return 0; } //----- (0101D02C) -------------------------------------------------------- BOOL IsValidLPMIXWAVE(int a1) { -BOOL result; // eax + BOOL result; // eax -result = a1; -if ( a1 ) -result = *(WORD *)(a1 + 64) == 21554; -return result; + result = a1; + if (a1) + result = *(WORD*)(a1 + 64) == 21554; + return result; } //----- (0101D04E) -------------------------------------------------------- -bool HasCurrentOutputFormat(const void *a1) +bool HasCurrentOutputFormat(const void* a1) { -return memcmp(a1, (const void *)(hMem + 380), 0x10u) == 0; + return memcmp(a1, (const void*)(hMem + 380), 0x10u) == 0; } //----- (0101D079) -------------------------------------------------------- int DefaultPauseBlocks(int a1) { -int result; // eax + int result; // eax -if ( GetVersion() < 0x80000000 || (unsigned __int8)GetVersion() < 4u ) -result = a1; -else -result = 0; -return result; + if (GetVersion() < 0x80000000 || (unsigned __int8)GetVersion() < 4u) + result = a1; + else + result = 0; + return result; } //----- (0101D0A5) -------------------------------------------------------- unsigned int DefaultGoodWavePos(UINT_PTR uDeviceID) { -signed int v1; // eax -unsigned int result; // eax -struct tagWAVEOUTCAPSA pwoc; // [esp+0h] [ebp-38h] + signed int v1; // eax + unsigned int result; // eax + struct tagWAVEOUTCAPSA pwoc; // [esp+0h] [ebp-38h] -v1 = waveOutGetNumDevs(); -if ( (signed int)uDeviceID > v1 || (uDeviceID & 0x80000000) != 0 || !v1 || waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u) ) -result = 0; -else -result = ((unsigned int)LOBYTE(pwoc.dwSupport) >> 5) & 1; -return result; + v1 = waveOutGetNumDevs(); + if ((signed int)uDeviceID > v1 || (uDeviceID & 0x80000000) != 0 || !v1 || waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u)) + result = 0; + else + result = ((unsigned int)LOBYTE(pwoc.dwSupport) >> 5) & 1; + return result; } //----- (0101D0FC) -------------------------------------------------------- DWORD MyWaveOutGetPosition(HWAVEOUT hwo, int a2) { -struct mmtime_tag pmmt; // [esp+0h] [ebp-10h] + struct mmtime_tag pmmt; // [esp+0h] [ebp-10h] -if ( !a2 ) -return (timeGetTime() - *(DWORD *)(hMem + 416)) * *(DWORD *)(hMem + 388) / 0x3E8 & 0xFFFFFFF8; -pmmt.wType = 4; -waveOutGetPosition(hwo, &pmmt, 0xCu); -return (*(int (**)(DWORD, DWORD))(hMem + 436))(pmmt.u.ms, *(DWORD *)(hMem + 424)); + if (!a2) + return (timeGetTime() - *(DWORD*)(hMem + 416)) * *(DWORD*)(hMem + 388) / 0x3E8 & 0xFFFFFFF8; + pmmt.wType = 4; + waveOutGetPosition(hwo, &pmmt, 0xCu); + return (*(int (**)(DWORD, DWORD))(hMem + 436))(pmmt.u.ms, *(DWORD*)(hMem + 424)); } //----- (0101D178) -------------------------------------------------------- int AddFactor(int a1, int a2) { -return a1 + a2; + return a1 + a2; } //----- (0101D18E) -------------------------------------------------------- int SubFactor(int a1, int a2) { -return a1 - a2; + return a1 - a2; } //----- (0101D1A2) -------------------------------------------------------- unsigned int SetWaveOutPosition(unsigned int a1) { -LPARAM v1; // eax -HWAVEOUT v2; // ecx -DWORD v3; // ecx -DWORD v4; // eax -LPARAM v5; // ecx -DWORD v6; // edi -unsigned int result; // eax -struct mmtime_tag pmmt; // [esp+0h] [ebp-10h] + LPARAM v1; // eax + HWAVEOUT v2; // ecx + DWORD v3; // ecx + DWORD v4; // eax + LPARAM v5; // ecx + DWORD v6; // edi + unsigned int result; // eax + struct mmtime_tag pmmt; // [esp+0h] [ebp-10h] -v1 = hMem; -v2 = *(HWAVEOUT *)(hMem + 12); -pmmt.wType = 4; -if ( v2 ) -{ -waveOutGetPosition(v2, &pmmt, 0xCu); -v3 = pmmt.u.ms; -v1 = hMem; -} -else -{ -v3 = 0; -pmmt.u.ms = 0; -} -if ( v3 < a1 ) -{ -*(DWORD *)(v1 + 424) = a1 - v3; -*(DWORD *)(v1 + 436) = AddFactor; -} -else -{ -*(DWORD *)(v1 + 424) = v3 - a1; -*(DWORD *)(v1 + 436) = SubFactor; -} -v4 = timeGetTime(); -v5 = hMem; -v6 = v4; -result = 1000 * a1 / *(DWORD *)(hMem + 388); -*(DWORD *)(hMem + 412) = a1; -*(DWORD *)(v5 + 416) = v6 - result; -return result; + v1 = hMem; + v2 = *(HWAVEOUT*)(hMem + 12); + pmmt.wType = 4; + if (v2) + { + waveOutGetPosition(v2, &pmmt, 0xCu); + v3 = pmmt.u.ms; + v1 = hMem; + } + else + { + v3 = 0; + pmmt.u.ms = 0; + } + if (v3 < a1) + { + *(DWORD*)(v1 + 424) = a1 - v3; + *(DWORD*)(v1 + 436) = AddFactor; + } + else + { + *(DWORD*)(v1 + 424) = v3 - a1; + *(DWORD*)(v1 + 436) = SubFactor; + } + v4 = timeGetTime(); + v5 = hMem; + v6 = v4; + result = 1000 * a1 / *(DWORD*)(hMem + 388); + *(DWORD*)(hMem + 412) = a1; + *(DWORD*)(v5 + 416) = v6 - result; + return result; } //----- (0101D251) -------------------------------------------------------- unsigned int MyWaveOutReset(HWAVEOUT hwo) { -unsigned int v1; // esi + unsigned int v1; // esi -v1 = MyWaveOutGetPosition(hwo, *(DWORD *)(hMem + 420)); -waveOutReset(hwo); -return SetWaveOutPosition(v1); + v1 = MyWaveOutGetPosition(hwo, *(DWORD*)(hMem + 420)); + waveOutReset(hwo); + return SetWaveOutPosition(v1); } //----- (0101D285) -------------------------------------------------------- -int cmixit(_BYTE *a1, char *a2, char *a3, int a4, unsigned int a5) +int cmixit(_BYTE* a1, char* a2, char* a3, int a4, unsigned int a5) { -int v5; // eax -unsigned __int8 *v6; // esi -_BYTE *v7; // edi -int v8; // ecx -int v9; // edx -_BYTE *v10; // edi -unsigned __int8 *v11; // esi -int v12; // edx -int v13; // ebx -unsigned int *v14; // eax -int v15; // ecx -unsigned __int8 *v16; // ecx -int v17; // ecx -bool v18; // zf -unsigned __int8 *v19; // esi -int v20; // edi -_BYTE *v21; // ecx -int v22; // ebx -unsigned int *v23; // ecx -int v24; // eax -int v26; // [esp+10h] [ebp-8h] -int v27; // [esp+10h] [ebp-8h] -unsigned int v28; // [esp+14h] [ebp-4h] -unsigned int v29; // [esp+14h] [ebp-4h] -int v30; // [esp+30h] [ebp+18h] -int v31; // [esp+30h] [ebp+18h] + int v5; // eax + unsigned __int8* v6; // esi + _BYTE* v7; // edi + int v8; // ecx + int v9; // edx + _BYTE* v10; // edi + unsigned __int8* v11; // esi + int v12; // edx + int v13; // ebx + unsigned int* v14; // eax + int v15; // ecx + unsigned __int8* v16; // ecx + int v17; // ecx + bool v18; // zf + unsigned __int8* v19; // esi + int v20; // edi + _BYTE* v21; // ecx + int v22; // ebx + unsigned int* v23; // ecx + int v24; // eax + int v26; // [esp+10h] [ebp-8h] + int v27; // [esp+10h] [ebp-8h] + unsigned int v28; // [esp+14h] [ebp-4h] + unsigned int v29; // [esp+14h] [ebp-4h] + int v30; // [esp+30h] [ebp+18h] + int v31; // [esp+30h] [ebp+18h] -LOWORD(v5) = hMem; -if ( *(WORD *)(hMem + 382) == 2 ) -{ -if ( a4 == 1 ) -{ -v6 = *(unsigned __int8 **)a2; -LOWORD(v5) = (WORD)a3; -if ( a5 ) -{ -v7 = a1; -v5 = *(unsigned int *)a3 << 8; -v8 = *((unsigned int *)a3 + 1) << 8; -v9 = (unsigned int)(((unsigned int)(a5 - 1) >> 1) + 1); -do -{ -*v7 = byte_1025970[*v6 + v5]; -v10 = v7 + 1; -v11 = v6 + 1; -*v10 = byte_1025970[*v11 + v8]; -v7 = v10 + 1; -v6 = v11 + 1; ---v9; -} -while ( v9 ); -} -} -else -{ -v28 = 0; -LOWORD(v5) = a5; -if ( a5 ) -{ -v26 = (unsigned int)(((unsigned int)(a5 - 1) >> 1) + 1); -do -{ -v12 = 128; -v13 = 128; -if ( a4 > 0 ) -{ -v14 = (unsigned int *)a3; -v15 = a2 - a3; -v30 = a4; -while ( 1 ) -{ -v16 = (unsigned __int8 *)(*(DWORD *)((char *)v14 + v15) + v28); -v13 = v13 + (unsigned __int8)byte_1025970[256 * *v14 + *v16] - 128; -v17 = (unsigned __int8)byte_1025970[256 * v14[1] + v16[1]]; -v14 += 2; -v18 = v30-- == 1; -v12 = v12 + v17 - 128; -if ( v18 ) -break; -v15 = a2 - a3; -} -if ( v13 >= 0 ) -{ -if ( v13 > 255 ) -LOBYTE(v13) = -1; -} -else -{ -LOBYTE(v13) = 0; -} -if ( v12 >= 0 ) -{ -if ( v12 > 255 ) -LOBYTE(v12) = -1; -} -else -{ -LOBYTE(v12) = 0; -} -} -v28 += 2; -*a1 = v13; -a1[1] = v12; -LOWORD(v5) = (WORD)a1 + 2; -v18 = v26-- == 1; -a1 += 2; -} -while ( !v18 ); -} -} -} -else if ( a4 == 1 ) -{ -v19 = *(unsigned __int8 **)a2; -v5 = (*(unsigned int *)a3 + *((unsigned int *)a3 + 1)) / 2; -if ( a5 ) -{ -v20 = a5; -v21 = a1; -v5 = (unsigned int)v5 << 8; -do -{ -*v21++ = byte_1025970[*v19++ + v5]; ---v20; -} -while ( v20 ); -} -} -else -{ -v29 = 0; -if ( a5 ) -{ -v27 = a5; -do -{ -v22 = 128; -if ( a4 > 0 ) -{ -v23 = (unsigned int *)a3; -v31 = a4; -do -{ -v24 = (unsigned __int8)byte_1025970[256 * (unsigned int)((*v23 + v23[1]) / 2) -+ *(unsigned __int8 *)(*(DWORD *)((char *)v23 + a2 - a3) + v29)]; -v23 += 2; -v18 = v31-- == 1; -v22 = v22 + v24 - 128; -} -while ( !v18 ); -if ( v22 >= 0 ) -{ -if ( v22 > 255 ) -LOBYTE(v22) = -1; -} -else -{ -LOBYTE(v22) = 0; -} -} -v5 = (int)a1++; -++v29; -v18 = v27-- == 1; -*(_BYTE *)v5 = v22; -} -while ( !v18 ); -} -} -return v5; + LOWORD(v5) = hMem; + if (*(WORD*)(hMem + 382) == 2) + { + if (a4 == 1) + { + v6 = *(unsigned __int8**)a2; + LOWORD(v5) = (WORD)a3; + if (a5) + { + v7 = a1; + v5 = *(unsigned int*)a3 << 8; + v8 = *((unsigned int*)a3 + 1) << 8; + v9 = (unsigned int)(((unsigned int)(a5 - 1) >> 1) + 1); + do + { + *v7 = byte_1025970[*v6 + v5]; + v10 = v7 + 1; + v11 = v6 + 1; + *v10 = byte_1025970[*v11 + v8]; + v7 = v10 + 1; + v6 = v11 + 1; + --v9; + } while (v9); + } + } + else + { + v28 = 0; + LOWORD(v5) = a5; + if (a5) + { + v26 = (unsigned int)(((unsigned int)(a5 - 1) >> 1) + 1); + do + { + v12 = 128; + v13 = 128; + if (a4 > 0) + { + v14 = (unsigned int*)a3; + v15 = a2 - a3; + v30 = a4; + while (1) + { + v16 = (unsigned __int8*)(*(DWORD*)((char*)v14 + v15) + v28); + v13 = v13 + (unsigned __int8)byte_1025970[256 * *v14 + *v16] - 128; + v17 = (unsigned __int8)byte_1025970[256 * v14[1] + v16[1]]; + v14 += 2; + v18 = v30-- == 1; + v12 = v12 + v17 - 128; + if (v18) + break; + v15 = a2 - a3; + } + if (v13 >= 0) + { + if (v13 > 255) + LOBYTE(v13) = -1; + } + else + { + LOBYTE(v13) = 0; + } + if (v12 >= 0) + { + if (v12 > 255) + LOBYTE(v12) = -1; + } + else + { + LOBYTE(v12) = 0; + } + } + v28 += 2; + *a1 = v13; + a1[1] = v12; + LOWORD(v5) = (WORD)a1 + 2; + v18 = v26-- == 1; + a1 += 2; + } while (!v18); + } + } + } + else if (a4 == 1) + { + v19 = *(unsigned __int8**)a2; + v5 = (*(unsigned int*)a3 + *((unsigned int*)a3 + 1)) / 2; + if (a5) + { + v20 = a5; + v21 = a1; + v5 = (unsigned int)v5 << 8; + do + { + *v21++ = byte_1025970[*v19++ + v5]; + --v20; + } while (v20); + } + } + else + { + v29 = 0; + if (a5) + { + v27 = a5; + do + { + v22 = 128; + if (a4 > 0) + { + v23 = (unsigned int*)a3; + v31 = a4; + do + { + v24 = (unsigned __int8)byte_1025970[256 * (unsigned int)((*v23 + v23[1]) / 2) + + *(unsigned __int8*)(*(DWORD*)((char*)v23 + a2 - a3) + v29)]; + v23 += 2; + v18 = v31-- == 1; + v22 = v22 + v24 - 128; + } while (!v18); + if (v22 >= 0) + { + if (v22 > 255) + LOBYTE(v22) = -1; + } + else + { + LOBYTE(v22) = 0; + } + } + v5 = (int)a1++; + ++v29; + v18 = v27-- == 1; + *(_BYTE*)v5 = v22; + } while (!v18); + } + } + return v5; } //----- (0101D491) -------------------------------------------------------- -DWORD *InitChannelNodes() +DWORD* InitChannelNodes() { -DWORD *result; // eax + DWORD* result; // eax -result = &unk_1026470; -do -{ -*result = result + 15; -result += 15; -} -while ( (signed int)result < (signed int)&unk_1027B68 ); -dword_1027BA4 = 0; -dword_1025964 = (int)&unk_1026470; -return result; + result = &unk_1026470; + do + { + *result = result + 15; + result += 15; + } while ((signed int)result < (signed int)& unk_1027B68); + dword_1027BA4 = 0; + dword_1025964 = (int)& unk_1026470; + return result; } // 1025964: using guessed type int dword_1025964; // 1027BA4: using guessed type int dword_1027BA4; @@ -330,594 +324,584 @@ return result; //----- (0101D4B9) -------------------------------------------------------- int GetChannelNode() { -int result; // eax -int v1; // ecx + int result; // eax + int v1; // ecx -result = dword_1025964; -if ( dword_1025964 ) -{ -v1 = *(DWORD *)dword_1025964; -*(DWORD *)dword_1025964 = 0; -dword_1025964 = v1; -} -return result; + result = dword_1025964; + if (dword_1025964) + { + v1 = *(DWORD*)dword_1025964; + *(DWORD*)dword_1025964 = 0; + dword_1025964 = v1; + } + return result; } // 1025964: using guessed type int dword_1025964; //----- (0101D4D4) -------------------------------------------------------- -DWORD *FreeChannelNode(DWORD *a1) +DWORD* FreeChannelNode(DWORD* a1) { -DWORD *result; // eax + DWORD* result; // eax -result = a1; -if ( a1 ) -{ -*a1 = dword_1025964; -dword_1025964 = (int)a1; -} -return result; + result = a1; + if (a1) + { + *a1 = dword_1025964; + dword_1025964 = (int)a1; + } + return result; } // 1025964: using guessed type int dword_1025964; //----- (0101D4F6) -------------------------------------------------------- -struct wavehdr_tag *FreeWaveBlocks(HWAVEOUT hwo, int a2) +struct wavehdr_tag* FreeWaveBlocks(HWAVEOUT hwo, int a2) { -signed int v2; // ebx -LPCVOID *v3; // esi -struct wavehdr_tag *result; // eax -HGLOBAL v5; // eax -HGLOBAL v6; // eax + signed int v2; // ebx + LPCVOID* v3; // esi + struct wavehdr_tag* result; // eax + HGLOBAL v5; // eax + HGLOBAL v6; // eax -v2 = 0; -do -{ -v3 = (LPCVOID *)(a2 + 4 * v2); -result = (struct wavehdr_tag *)*v3; -if ( *v3 ) -{ -waveOutUnprepareHeader(hwo, result, 0x20u); -v5 = GlobalHandle(*v3); -GlobalUnlock(v5); -v6 = GlobalHandle(*v3); -result = (struct wavehdr_tag *)GlobalFree(v6); -*v3 = 0; -} -++v2; -} -while ( v2 < 10 ); -return result; + v2 = 0; + do + { + v3 = (LPCVOID*)(a2 + 4 * v2); + result = (struct wavehdr_tag*) * v3; + if (*v3) + { + waveOutUnprepareHeader(hwo, result, 0x20u); + v5 = GlobalHandle(*v3); + GlobalUnlock(v5); + v6 = GlobalHandle(*v3); + result = (struct wavehdr_tag*)GlobalFree(v6); + *v3 = 0; + } + ++v2; + } while (v2 < 10); + return result; } //----- (0101D549) -------------------------------------------------------- int AllocWaveBlocks(HWAVEOUT hwo, int a2) { -signed int v2; // edi -HGLOBAL v3; // eax -DWORD *v4; // eax -int v5; // ecx -signed int v6; // edi -int i; // edi -HGLOBAL v9; // eax -HGLOBAL v10; // eax + signed int v2; // edi + HGLOBAL v3; // eax + DWORD* v4; // eax + int v5; // ecx + signed int v6; // edi + int i; // edi + HGLOBAL v9; // eax + HGLOBAL v10; // eax -v2 = 0; -do -{ -v3 = GlobalAlloc(0x2000u, 0x2B41u); -v4 = GlobalLock(v3); -v5 = a2 + 4 * v2; -*(DWORD *)v5 = v4; -if ( !v4 ) -{ -if ( dword_1027BE4 ) -MessageBoxA( -0, -"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", -"WavMix32", -0x30u); -for ( i = v2 - 1; i >= 0; --i ) -{ -v9 = GlobalHandle(*(LPCVOID *)(a2 + 4 * i)); -GlobalUnlock(v9); -v10 = GlobalHandle(*(LPCVOID *)(a2 + 4 * i)); -GlobalFree(v10); -*(DWORD *)(a2 + 4 * i) = 0; -} -return 0; -} -*v4 = v4 + 12; -*(DWORD *)(*(DWORD *)v5 + 4) = *(DWORD *)(hMem + 396); -*(DWORD *)(*(DWORD *)v5 + 16) = 0; -*(DWORD *)(*(DWORD *)v5 + 20) = 0; -*(DWORD *)(*(DWORD *)v5 + 32) = 1; -++v2; -*(DWORD *)(*(DWORD *)v5 + 36) = 0; -} -while ( v2 < 10 ); -v6 = 0; -while ( !waveOutPrepareHeader(hwo, *(LPWAVEHDR *)(a2 + 4 * v6), 0x20u) ) -{ -*(DWORD *)(*(DWORD *)(a2 + 4 * v6++) + 16) |= 1u; -if ( v6 >= 10 ) -return 1; -} -if ( dword_1027BE4 ) -MessageBoxA(0, "Unable to prepare wave header.", "WavMix32", 0x30u); -FreeWaveBlocks(hwo, a2); -return 0; + v2 = 0; + do + { + v3 = GlobalAlloc(0x2000u, 0x2B41u); + v4 = GlobalLock(v3); + v5 = a2 + 4 * v2; + *(DWORD*)v5 = v4; + if (!v4) + { + if (dword_1027BE4) + MessageBoxA( + 0, + "Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", + "WavMix32", + 0x30u); + for (i = v2 - 1; i >= 0; --i) + { + v9 = GlobalHandle(*(LPCVOID*)(a2 + 4 * i)); + GlobalUnlock(v9); + v10 = GlobalHandle(*(LPCVOID*)(a2 + 4 * i)); + GlobalFree(v10); + *(DWORD*)(a2 + 4 * i) = 0; + } + return 0; + } + *v4 = v4 + 12; + *(DWORD*)(*(DWORD*)v5 + 4) = *(DWORD*)(hMem + 396); + *(DWORD*)(*(DWORD*)v5 + 16) = 0; + *(DWORD*)(*(DWORD*)v5 + 20) = 0; + *(DWORD*)(*(DWORD*)v5 + 32) = 1; + ++v2; + *(DWORD*)(*(DWORD*)v5 + 36) = 0; + } while (v2 < 10); + v6 = 0; + while (!waveOutPrepareHeader(hwo, *(LPWAVEHDR*)(a2 + 4 * v6), 0x20u)) + { + *(DWORD*)(*(DWORD*)(a2 + 4 * v6++) + 16) |= 1u; + if (v6 >= 10) + return 1; + } + if (dword_1027BE4) + MessageBoxA(0, "Unable to prepare wave header.", "WavMix32", 0x30u); + FreeWaveBlocks(hwo, a2); + return 0; } // 1027BE4: using guessed type int dword_1027BE4; //----- (0101D649) -------------------------------------------------------- -DWORD *SwapWaveBlocks() +DWORD* SwapWaveBlocks() { -DWORD *result; // eax + DWORD* result; // eax -result = (DWORD *)(hMem + 408); -if ( *(_UNKNOWN **)(hMem + 408) == &unk_10257E4 ) -*result = &unk_1025770; -else -*result = &unk_10257E4; -return result; + result = (DWORD*)(hMem + 408); + if (*(_UNKNOWN * *)(hMem + 408) == &unk_10257E4) + * result = &unk_1025770; + else + *result = &unk_10257E4; + return result; } //----- (0101D66B) -------------------------------------------------------- -DWORD *GetWaveBlock() +DWORD* GetWaveBlock() { -int v0; // edx -int v1; // eax -int v2; // esi -DWORD *result; // eax -int v4; // ecx + int v0; // edx + int v1; // eax + int v2; // esi + DWORD* result; // eax + int v4; // ecx -v0 = *(DWORD *)(hMem + 400); -v1 = 0; -if ( v0 > 0 ) -{ -v2 = *(DWORD *)(hMem + 408); -do -{ -if ( *(DWORD *)(*(DWORD *)v2 + 32) ) -break; -++v1; -v2 += 4; -} -while ( v1 < v0 ); -} -if ( v1 >= v0 ) -return 0; -v4 = *(DWORD *)(hMem + 396); -result = *(DWORD **)(*(DWORD *)(hMem + 408) + 4 * v1); -result[8] = 0; -result[1] = v4; -*result = result + 12; -result[10] = dword_1025798; -return result; + v0 = *(DWORD*)(hMem + 400); + v1 = 0; + if (v0 > 0) + { + v2 = *(DWORD*)(hMem + 408); + do + { + if (*(DWORD*)(*(DWORD*)v2 + 32)) + break; + ++v1; + v2 += 4; + } while (v1 < v0); + } + if (v1 >= v0) + return 0; + v4 = *(DWORD*)(hMem + 396); + result = *(DWORD * *)(*(DWORD*)(hMem + 408) + 4 * v1); + result[8] = 0; + result[1] = v4; + *result = result + 12; + result[10] = dword_1025798; + return result; } // 1025798: using guessed type int dword_1025798; //----- (0101D6C8) -------------------------------------------------------- -struct wavehdr_tag *RemoveFromPlayingQueue(struct wavehdr_tag *a1) +struct wavehdr_tag* RemoveFromPlayingQueue(struct wavehdr_tag* a1) { -struct wavehdr_tag *result; // eax -LPWAVEHDR v2; // edx -DWORD v3; // ecx -bool v4; // zf + struct wavehdr_tag* result; // eax + LPWAVEHDR v2; // edx + DWORD v3; // ecx + bool v4; // zf -if ( !pwh ) -return 0; -result = a1; -if ( a1 != pwh ) -{ -v2 = pwh; -v3 = pwh[1].dwUser; -if ( v3 ) -{ -do -{ -if ( (struct wavehdr_tag *)v3 == a1 ) -break; -v2 = (LPWAVEHDR)v3; -v3 = *(DWORD *)(v3 + 44); -} -while ( v3 ); -if ( v3 ) -{ -v4 = v3 == dword_1027BF0; -v2[1].dwUser = *(DWORD *)(v3 + 44); -if ( v4 ) -dword_1027BF0 = (int)v2; -goto LABEL_12; -} -} -return 0; -} -pwh = (LPWAVEHDR)a1[1].dwUser; -if ( !pwh ) -dword_1027BF0 = 0; + if (!pwh) + return 0; + result = a1; + if (a1 != pwh) + { + v2 = pwh; + v3 = pwh[1].dwUser; + if (v3) + { + do + { + if ((struct wavehdr_tag*)v3 == a1) + break; + v2 = (LPWAVEHDR)v3; + v3 = *(DWORD*)(v3 + 44); + } while (v3); + if (v3) + { + v4 = v3 == dword_1027BF0; + v2[1].dwUser = *(DWORD*)(v3 + 44); + if (v4) + dword_1027BF0 = (int)v2; + goto LABEL_12; + } + } + return 0; + } + pwh = (LPWAVEHDR)a1[1].dwUser; + if (!pwh) + dword_1027BF0 = 0; LABEL_12: -a1[1].dwUser = 0; -return result; + a1[1].dwUser = 0; + return result; } // 1027BF0: using guessed type int dword_1027BF0; //----- (0101D734) -------------------------------------------------------- LPWAVEHDR DestroyPlayQueue() { -struct wavehdr_tag *v0; // ST00_4 -LPWAVEHDR result; // eax + struct wavehdr_tag* v0; // ST00_4 + LPWAVEHDR result; // eax -while ( 1 ) -{ -result = pwh; -if ( !pwh ) -break; -v0 = pwh; -pwh[1].lpData = (LPSTR)1; -RemoveFromPlayingQueue(v0); -} -return result; + while (1) + { + result = pwh; + if (!pwh) + break; + v0 = pwh; + pwh[1].lpData = (LPSTR)1; + RemoveFromPlayingQueue(v0); + } + return result; } //----- (0101D752) -------------------------------------------------------- int ReleaseWaveDevice(int a1) { -int result; // eax -HWND v2; // ST04_4 + int result; // eax + HWND v2; // ST04_4 -if ( *(DWORD *)(a1 + 16) ) -{ -result = *(DWORD *)(a1 + 12); -if ( result ) -{ -MyWaveOutReset(*(HWAVEOUT *)(a1 + 12)); -DestroyPlayQueue(); -FreeWaveBlocks(*(HWAVEOUT *)(a1 + 12), (int)&unk_10257E4); -FreeWaveBlocks(*(HWAVEOUT *)(a1 + 12), (int)&unk_1025770); -waveOutClose(*(HWAVEOUT *)(a1 + 12)); -v2 = *(HWND *)(a1 + 4); -*(DWORD *)(a1 + 12) = 0; -result = DestroyWindow(v2); -*(DWORD *)(a1 + 4) = 0; -} -} -return result; + if (*(DWORD*)(a1 + 16)) + { + result = *(DWORD*)(a1 + 12); + if (result) + { + MyWaveOutReset(*(HWAVEOUT*)(a1 + 12)); + DestroyPlayQueue(); + FreeWaveBlocks(*(HWAVEOUT*)(a1 + 12), (int)& unk_10257E4); + FreeWaveBlocks(*(HWAVEOUT*)(a1 + 12), (int)& unk_1025770); + waveOutClose(*(HWAVEOUT*)(a1 + 12)); + v2 = *(HWND*)(a1 + 4); + *(DWORD*)(a1 + 12) = 0; + result = DestroyWindow(v2); + *(DWORD*)(a1 + 4) = 0; + } + } + return result; } //----- (0101D7B1) -------------------------------------------------------- signed int GetWaveDevice() { -HWND v0; // eax -LPARAM v1; // ecx -MMRESULT v2; // edi -HWND v4; // ST2C_4 -WAVEFORMATEX pwfx; // [esp+Ch] [ebp-14h] + HWND v0; // eax + LPARAM v1; // ecx + MMRESULT v2; // edi + HWND v4; // ST2C_4 + WAVEFORMATEX pwfx; // [esp+Ch] [ebp-14h] -if ( *(DWORD *)(hMem + 12) ) -return 0; -v0 = CreateWindowExA(0, "WavMix32", WindowName, 0x8000000u, 0, 0, 0, 0, 0, 0, dword_10257E0, 0); -v1 = hMem; -*(DWORD *)(hMem + 4) = v0; -if ( !v0 ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "Failed to create callback window.", "WavMix32", 0x30u); -return 1; -} -pwfx.wFormatTag = *(WORD *)(v1 + 380); -pwfx.nChannels = *(WORD *)(v1 + 382); -pwfx.nSamplesPerSec = *(DWORD *)(v1 + 384); -pwfx.nAvgBytesPerSec = *(DWORD *)(v1 + 388); -pwfx.nBlockAlign = *(WORD *)(v1 + 392); -pwfx.wBitsPerSample = *(WORD *)(v1 + 394); -pwfx.cbSize = 0; -v2 = waveOutOpen((LPHWAVEOUT)(v1 + 12), 0xFFFFFFFF, &pwfx, *(DWORD *)(v1 + 4), 0, 0x10000u); -if ( v2 ) -{ -DestroyWindow(*(HWND *)(hMem + 4)); -*(DWORD *)(hMem + 4) = 0; -return v2; -} -if ( AllocWaveBlocks(*(HWAVEOUT *)(hMem + 12), (int)&unk_10257E4) -&& AllocWaveBlocks(*(HWAVEOUT *)(hMem + 12), (int)&unk_1025770) ) -{ -*(DWORD *)(hMem + 408) = &unk_10257E4; -return 0; -} -FreeWaveBlocks(*(HWAVEOUT *)(hMem + 12), (int)&unk_10257E4); -FreeWaveBlocks(*(HWAVEOUT *)(hMem + 12), (int)&unk_1025770); -waveOutClose(*(HWAVEOUT *)(hMem + 12)); -v4 = *(HWND *)(hMem + 4); -*(DWORD *)(hMem + 12) = 0; -DestroyWindow(v4); -return 1; + if (*(DWORD*)(hMem + 12)) + return 0; + v0 = CreateWindowExA(0, "WavMix32", WindowName, 0x8000000u, 0, 0, 0, 0, 0, 0, dword_10257E0, 0); + v1 = hMem; + *(DWORD*)(hMem + 4) = v0; + if (!v0) + { + if (dword_1027BE4) + MessageBoxA(0, "Failed to create callback window.", "WavMix32", 0x30u); + return 1; + } + pwfx.wFormatTag = *(WORD*)(v1 + 380); + pwfx.nChannels = *(WORD*)(v1 + 382); + pwfx.nSamplesPerSec = *(DWORD*)(v1 + 384); + pwfx.nAvgBytesPerSec = *(DWORD*)(v1 + 388); + pwfx.nBlockAlign = *(WORD*)(v1 + 392); + pwfx.wBitsPerSample = *(WORD*)(v1 + 394); + pwfx.cbSize = 0; + v2 = waveOutOpen((LPHWAVEOUT)(v1 + 12), 0xFFFFFFFF, &pwfx, *(DWORD*)(v1 + 4), 0, 0x10000u); + if (v2) + { + DestroyWindow(*(HWND*)(hMem + 4)); + *(DWORD*)(hMem + 4) = 0; + return v2; + } + if (AllocWaveBlocks(*(HWAVEOUT*)(hMem + 12), (int)& unk_10257E4) + && AllocWaveBlocks(*(HWAVEOUT*)(hMem + 12), (int)& unk_1025770)) + { + *(DWORD*)(hMem + 408) = &unk_10257E4; + return 0; + } + FreeWaveBlocks(*(HWAVEOUT*)(hMem + 12), (int)& unk_10257E4); + FreeWaveBlocks(*(HWAVEOUT*)(hMem + 12), (int)& unk_1025770); + waveOutClose(*(HWAVEOUT*)(hMem + 12)); + v4 = *(HWND*)(hMem + 4); + *(DWORD*)(hMem + 12) = 0; + DestroyWindow(v4); + return 1; } // 1027BE4: using guessed type int dword_1027BE4; //----- (0101D918) -------------------------------------------------------- -signed int WaveMixOpenChannel(WORD *a1, signed int a2, unsigned int a3) +signed int WaveMixOpenChannel(WORD* a1, signed int a2, unsigned int a3) { -WORD *v3; // eax -signed int v4; // ecx -int v6; // ecx -DWORD *v7; // edx -int v8; // ecx -DWORD *v9; // edx + WORD* v3; // eax + signed int v4; // ecx + int v6; // ecx + DWORD* v7; // edx + int v8; // ecx + DWORD* v9; // edx -v3 = SessionToGlobalDataPtr(a1); -hMem = (LPARAM)v3; -if ( !v3 ) -return 5; -if ( a3 > 2 ) -return 10; -v4 = a2; -if ( a3 ) -{ -if ( a3 == 2 && (a2 > 16 || a2 < 1) ) -return 11; -} -else if ( a2 >= 16 ) -{ -return 11; -} -if ( a3 ) -{ -if ( a3 == 1 ) -{ -v4 = 16; -} -else if ( a3 != 2 ) -{ -return 10; -} -v6 = v4 - 1; -if ( v6 >= 0 ) -{ -v7 = &v3[2 * v6 + 122]; -v8 = v6 + 1; -do -{ -if ( *v7 == -1 ) -{ -*v7 = 0; -*((WORD *)v7 - 32) = v3[88]; -*((WORD *)v7 - 31) = v3[89]; -++*((DWORD *)v3 + 77); -} ---v7; ---v8; -} -while ( v8 ); -} -} -else -{ -v9 = &v3[2 * a2 + 122]; -if ( *v9 != -1 ) -return 4; -*v9 = 0; -v3[2 * a2 + 90] = v3[88]; -v3[2 * a2 + 91] = v3[89]; -++*((DWORD *)v3 + 77); -} -return 0; + v3 = SessionToGlobalDataPtr(a1); + hMem = (LPARAM)v3; + if (!v3) + return 5; + if (a3 > 2) + return 10; + v4 = a2; + if (a3) + { + if (a3 == 2 && (a2 > 16 || a2 < 1)) + return 11; + } + else if (a2 >= 16) + { + return 11; + } + if (a3) + { + if (a3 == 1) + { + v4 = 16; + } + else if (a3 != 2) + { + return 10; + } + v6 = v4 - 1; + if (v6 >= 0) + { + v7 = &v3[2 * v6 + 122]; + v8 = v6 + 1; + do + { + if (*v7 == -1) + { + *v7 = 0; + *((WORD*)v7 - 32) = v3[88]; + *((WORD*)v7 - 31) = v3[89]; + ++* ((DWORD*)v3 + 77); + } + --v7; + --v8; + } while (v8); + } + } + else + { + v9 = &v3[2 * a2 + 122]; + if (*v9 != -1) + return 4; + *v9 = 0; + v3[2 * a2 + 90] = v3[88]; + v3[2 * a2 + 91] = v3[89]; + ++* ((DWORD*)v3 + 77); + } + return 0; } //----- (0101D9E7) -------------------------------------------------------- -LPWAVEHDR AddToPlayingQueue(struct wavehdr_tag *a1) +LPWAVEHDR AddToPlayingQueue(struct wavehdr_tag* a1) { -LPWAVEHDR result; // eax + LPWAVEHDR result; // eax -result = pwh; -a1[1].dwUser = 0; -if ( result ) -{ -*(DWORD *)(dword_1027BF0 + 44) = a1; -} -else -{ -result = a1; -pwh = a1; -} -dword_1027BF0 = (int)a1; -return result; + result = pwh; + a1[1].dwUser = 0; + if (result) + { + *(DWORD*)(dword_1027BF0 + 44) = a1; + } + else + { + result = a1; + pwh = a1; + } + dword_1027BF0 = (int)a1; + return result; } // 1027BF0: using guessed type int dword_1027BF0; //----- (0101DA1D) -------------------------------------------------------- int MixerPlay(LPWAVEHDR pwh, int a2) { -LPWAVEHDR v2; // edi -LPARAM v4; // esi -DWORD *v5; // ecx -signed int v6; // ebx -DWORD *v7; // eax -int v8; // edx -unsigned int v9; // ebx -int v10; // eax -unsigned int v11; // ecx -int v12; // edi -unsigned int v13; // eax -unsigned int v14; // edx -unsigned int v15; // ebx -int v16; // eax -unsigned int v17; // eax -int v18; // eax -int v19; // edx -int v20; // edi -unsigned int v21; // edx -int *v22; // eax -int v23; // ecx -bool v24; // zf -unsigned int v25; // [esp+4h] [ebp-1Ch] -unsigned int v26; // [esp+8h] [ebp-18h] -int v27; // [esp+Ch] [ebp-14h] -LPSTR v28; // [esp+10h] [ebp-10h] -int v29; // [esp+14h] [ebp-Ch] -unsigned int v30; // [esp+18h] [ebp-8h] -unsigned int v31; // [esp+1Ch] [ebp-4h] + LPWAVEHDR v2; // edi + LPARAM v4; // esi + DWORD* v5; // ecx + signed int v6; // ebx + DWORD* v7; // eax + int v8; // edx + unsigned int v9; // ebx + int v10; // eax + unsigned int v11; // ecx + int v12; // edi + unsigned int v13; // eax + unsigned int v14; // edx + unsigned int v15; // ebx + int v16; // eax + unsigned int v17; // eax + int v18; // eax + int v19; // edx + int v20; // edi + unsigned int v21; // edx + int* v22; // eax + int v23; // ecx + bool v24; // zf + unsigned int v25; // [esp+4h] [ebp-1Ch] + unsigned int v26; // [esp+8h] [ebp-18h] + int v27; // [esp+Ch] [ebp-14h] + LPSTR v28; // [esp+10h] [ebp-10h] + int v29; // [esp+14h] [ebp-Ch] + unsigned int v30; // [esp+18h] [ebp-8h] + unsigned int v31; // [esp+1Ch] [ebp-4h] -v2 = pwh; -if ( !pwh ) -return 0; -v30 = -1; -v31 = 0; -v4 = hMem; -v5 = (DWORD *)(hMem + 244); -v6 = 16; -do -{ -v7 = (DWORD *)*v5; -if ( *v5 != -1 && v7 ) -{ -do -{ -if ( v7[11] > *(DWORD *)(v4 + 412) ) -break; -v7 = (DWORD *)*v7; -} -while ( v7 ); -if ( v7 ) -{ -if ( v7[10] < v30 ) -v30 = v7[10]; -v8 = v31++; -dword_1025730[v8] = (int)v7; -} -} -++v5; ---v6; -} -while ( v6 ); -if ( !v31 ) -{ -if ( a2 ) -pwh[1].lpData = (LPSTR)1; -return 0; -} -v9 = *(DWORD *)(v4 + 412); -v28 = pwh->lpData; -LOWORD(v10) = *(WORD *)(v4 + 396); -v25 = *(DWORD *)(v4 + 412); -v27 = *(unsigned int *)(v4 + 396); -while ( (WORD)v10 ) -{ -if ( v9 >= v30 ) -{ -v26 = 0; -v29 = 0; -v11 = v9 + (unsigned int)v10; -if ( !v31 ) -goto LABEL_47; -do -{ -v12 = dword_1025730[v26]; -v13 = *(DWORD *)(v12 + 40); -if ( v13 <= v9 ) -{ -if ( *(DWORD *)(v12 + 44) < v11 ) -v11 = *(DWORD *)(v12 + 44); -v14 = v9 - v13; -if ( *(WORD *)(v12 + 26) ) -{ -v15 = *(DWORD *)(v12 + 36); -v14 %= v15; -v16 = v15 - v14; -v9 = v25; -v17 = v25 + v16; -if ( v17 < v11 ) -v11 = v17; -} -v18 = v14 + *(DWORD *)(v12 + 48); -v19 = v29++; -dword_10257A0[v19] = v18; -word_1025810[2 * v19] = *(WORD *)(v12 + 56); -word_1025812[2 * v19] = *(WORD *)(v12 + 58); -} -else if ( v13 < v11 ) -{ -v11 = *(DWORD *)(v12 + 40); -} -++v26; -} -while ( v26 < v31 ); -if ( v29 ) -{ -v20 = v11 - v9; -(*(void (**)(LPSTR, int *, int *, int, unsigned int))(v4 + 428))( -v28, -dword_10257A0, -word_1025810, -v29, -v11 - v9); -v28 += v20; -v27 -= v20; -v30 = -1; -v9 += v20; -v25 = v9; -v21 = 0; -v22 = dword_1025730; -do -{ -if ( !*v22 ) -goto LABEL_57; -do -{ -if ( *(DWORD *)(*v22 + 44) > v9 ) -break; -v23 = *(DWORD *)*v22; -*v22 = v23; -} -while ( v23 ); -if ( *v22 ) -{ -if ( *(DWORD *)(*v22 + 40) < v30 ) -v30 = *(DWORD *)(*v22 + 40); -++v21; -++v22; -} -else -{ -LABEL_57: -v24 = v31-- == 1; -*v22 = dword_1025730[v31]; -if ( v24 ) -break; -} -} -while ( v21 < v31 ); -v4 = hMem; -} -} -else -{ -v10 = (unsigned int)v10; -if ( (unsigned int)v10 + v9 >= v30 ) -v10 = v30 - v9; -memset(v28, 0x80u, (unsigned int)v10); -v28 += v10; -v9 += v10; -v27 -= v10; -v25 = v9; -} -v2 = pwh; -LABEL_47: -LOWORD(v10) = v27; -} -v2[1].dwBufferLength = *(DWORD *)(v4 + 412); -*(DWORD *)(v4 + 412) += *(DWORD *)(v4 + 396); -if ( a2 ) -{ -AddToPlayingQueue(v2); -if ( waveOutWrite(*(HWAVEOUT *)(v4 + 12), v2, 0x20u) ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "Failed to write block to device", "WavMix32", 0x30u); -v2[1].lpData = (LPSTR)1; -RemoveFromPlayingQueue(v2); -} -} -return 1; + v2 = pwh; + if (!pwh) + return 0; + v30 = -1; + v31 = 0; + v4 = hMem; + v5 = (DWORD*)(hMem + 244); + v6 = 16; + do + { + v7 = (DWORD*)* v5; + if (*v5 != -1 && v7) + { + do + { + if (v7[11] > * (DWORD*)(v4 + 412)) + break; + v7 = (DWORD*)* v7; + } while (v7); + if (v7) + { + if (v7[10] < v30) + v30 = v7[10]; + v8 = v31++; + dword_1025730[v8] = (int)v7; + } + } + ++v5; + --v6; + } while (v6); + if (!v31) + { + if (a2) + pwh[1].lpData = (LPSTR)1; + return 0; + } + v9 = *(DWORD*)(v4 + 412); + v28 = pwh->lpData; + LOWORD(v10) = *(WORD*)(v4 + 396); + v25 = *(DWORD*)(v4 + 412); + v27 = *(unsigned int*)(v4 + 396); + while ((WORD)v10) + { + if (v9 >= v30) + { + v26 = 0; + v29 = 0; + v11 = v9 + (unsigned int)v10; + if (!v31) + goto LABEL_47; + do + { + v12 = dword_1025730[v26]; + v13 = *(DWORD*)(v12 + 40); + if (v13 <= v9) + { + if (*(DWORD*)(v12 + 44) < v11) + v11 = *(DWORD*)(v12 + 44); + v14 = v9 - v13; + if (*(WORD*)(v12 + 26)) + { + v15 = *(DWORD*)(v12 + 36); + v14 %= v15; + v16 = v15 - v14; + v9 = v25; + v17 = v25 + v16; + if (v17 < v11) + v11 = v17; + } + v18 = v14 + *(DWORD*)(v12 + 48); + v19 = v29++; + dword_10257A0[v19] = v18; + word_1025810[2 * v19] = *(WORD*)(v12 + 56); + word_1025812[2 * v19] = *(WORD*)(v12 + 58); + } + else if (v13 < v11) + { + v11 = *(DWORD*)(v12 + 40); + } + ++v26; + } while (v26 < v31); + if (v29) + { + v20 = v11 - v9; + (*(void (**)(LPSTR, int*, int*, int, unsigned int))(v4 + 428))( + v28, + dword_10257A0, + word_1025810, + v29, + v11 - v9); + v28 += v20; + v27 -= v20; + v30 = -1; + v9 += v20; + v25 = v9; + v21 = 0; + v22 = dword_1025730; + do + { + if (!*v22) + goto LABEL_57; + do + { + if (*(DWORD*)(*v22 + 44) > v9) + break; + v23 = *(DWORD*)* v22; + *v22 = v23; + } while (v23); + if (*v22) + { + if (*(DWORD*)(*v22 + 40) < v30) + v30 = *(DWORD*)(*v22 + 40); + ++v21; + ++v22; + } + else + { + LABEL_57: + v24 = v31-- == 1; + *v22 = dword_1025730[v31]; + if (v24) + break; + } + } while (v21 < v31); + v4 = hMem; + } + } + else + { + v10 = (unsigned int)v10; + if ((unsigned int)v10 + v9 >= v30) + v10 = v30 - v9; + memset(v28, 0x80u, (unsigned int)v10); + v28 += v10; + v9 += v10; + v27 -= v10; + v25 = v9; + } + v2 = pwh; + LABEL_47: + LOWORD(v10) = v27; + } + v2[1].dwBufferLength = *(DWORD*)(v4 + 412); + *(DWORD*)(v4 + 412) += *(DWORD*)(v4 + 396); + if (a2) + { + AddToPlayingQueue(v2); + if (waveOutWrite(*(HWAVEOUT*)(v4 + 12), v2, 0x20u)) + { + if (dword_1027BE4) + MessageBoxA(0, "Failed to write block to device", "WavMix32", 0x30u); + v2[1].lpData = (LPSTR)1; + RemoveFromPlayingQueue(v2); + } + } + return 1; } // 1025810: using guessed type int word_1025810[]; // 1027BE4: using guessed type int dword_1027BE4; @@ -925,2702 +909,2675 @@ return 1; //----- (0101DC8C) -------------------------------------------------------- DWORD FreePlayedBlocks() { -DWORD result; // eax -LPARAM v1; // esi -signed int v2; // ebx -DWORD *v3; // edi -HWND v4; // eax -signed int v5; // edi -DWORD v6; // [esp+Ch] [ebp-8h] -WPARAM wParam; // [esp+10h] [ebp-4h] + DWORD result; // eax + LPARAM v1; // esi + signed int v2; // ebx + DWORD* v3; // edi + HWND v4; // eax + signed int v5; // edi + DWORD v6; // [esp+Ch] [ebp-8h] + WPARAM wParam; // [esp+10h] [ebp-4h] -result = MyWaveOutGetPosition(*(HWAVEOUT *)(hMem + 12), *(DWORD *)(hMem + 420)); -wParam = 0; -v1 = hMem; -v6 = result; -v2 = 244; -do -{ -v3 = *(DWORD **)(v2 + v1); -if ( v3 && v3 != (DWORD *)-1 ) -{ -do -{ -result = v6; -if ( v6 < v3[11] ) -break; -*(DWORD *)(v2 + v1) = *v3; -v4 = *(HWND *)((char *)v3 + 18); -if ( v4 ) -{ -PostMessageA(v4, 0x3BDu, wParam, v3[8]); -v1 = hMem; -} -result = (DWORD)FreeChannelNode(v3); -v3 = *(DWORD **)(v2 + v1); -} -while ( v3 ); -} -++wParam; -v2 += 4; -} -while ( v2 < 308 ); -if ( !*(DWORD *)(v1 + 420) && !pwh ) -{ -v5 = 244; -do -{ -result = *(DWORD *)(v5 + v1); -if ( result ) -{ -if ( result != -1 ) -{ -result = PostMessageA(*(HWND *)(v1 + 4), 0x400u, 0, v1); -v1 = hMem; -} -} -v5 += 4; -} -while ( v5 < 308 ); -} -return result; + result = MyWaveOutGetPosition(*(HWAVEOUT*)(hMem + 12), *(DWORD*)(hMem + 420)); + wParam = 0; + v1 = hMem; + v6 = result; + v2 = 244; + do + { + v3 = *(DWORD * *)(v2 + v1); + if (v3 && v3 != (DWORD*)-1) + { + do + { + result = v6; + if (v6 < v3[11]) + break; + *(DWORD*)(v2 + v1) = *v3; + v4 = *(HWND*)((char*)v3 + 18); + if (v4) + { + PostMessageA(v4, 0x3BDu, wParam, v3[8]); + v1 = hMem; + } + result = (DWORD)FreeChannelNode(v3); + v3 = *(DWORD * *)(v2 + v1); + } while (v3); + } + ++wParam; + v2 += 4; + } while (v2 < 308); + if (!*(DWORD*)(v1 + 420) && !pwh) + { + v5 = 244; + do + { + result = *(DWORD*)(v5 + v1); + if (result) + { + if (result != -1) + { + result = PostMessageA(*(HWND*)(v1 + 4), 0x400u, 0, v1); + v1 = hMem; + } + } + v5 += 4; + } while (v5 < 308); + } + return result; } //----- (0101DD5D) -------------------------------------------------------- int WaveMixPump() { -int result; // eax -LPWAVEHDR i; // esi -struct wavehdr_tag *v2; // eax + int result; // eax + LPWAVEHDR i; // esi + struct wavehdr_tag* v2; // eax -result = dword_1025798; -hMem = dword_1025798; -if ( dword_1025798 ) -{ -LABEL_5: -for ( i = pwh; i; i = (LPWAVEHDR)i[1].dwUser ) -{ -if ( i->dwFlags & 1 ) -{ -RemoveFromPlayingQueue(i); -i[1].lpData = (LPSTR)1; -goto LABEL_5; -} -} -FreePlayedBlocks(); -do -{ -v2 = (struct wavehdr_tag *)GetWaveBlock(); -result = MixerPlay(v2, 1); -} -while ( result ); -} -return result; + result = dword_1025798; + hMem = dword_1025798; + if (dword_1025798) + { + LABEL_5: + for (i = pwh; i; i = (LPWAVEHDR)i[1].dwUser) + { + if (i->dwFlags & 1) + { + RemoveFromPlayingQueue(i); + i[1].lpData = (LPSTR)1; + goto LABEL_5; + } + } + FreePlayedBlocks(); + do + { + v2 = (struct wavehdr_tag*)GetWaveBlock(); + result = MixerPlay(v2, 1); + } while (result); + } + return result; } // 1025798: using guessed type int dword_1025798; //----- (0101DDAD) -------------------------------------------------------- LRESULT WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { -if ( Msg != 957 && Msg != 1024 ) -return DefWindowProcA(hWnd, Msg, wParam, lParam); -WaveMixPump(); -return 0; + if (Msg != 957 && Msg != 1024) + return DefWindowProcA(hWnd, Msg, wParam, lParam); + WaveMixPump(); + return 0; } //----- (0101DDD8) -------------------------------------------------------- signed int NoResetRemix(int a1, int a2) { -WaveMixPump(); -return 1; + WaveMixPump(); + return 1; } //----- (0101DDE8) -------------------------------------------------------- signed int ResetRemix(int a1, int a2) { -struct wavehdr_tag *v2; // eax -struct wavehdr_tag *v3; // esi -int v4; // esi -LPARAM v5; // eax -bool v6; // zf -bool v7; // sf -LPWAVEHDR i; // esi -signed int v10; // [esp+Ch] [ebp-8h] -int v11; // [esp+10h] [ebp-4h] + struct wavehdr_tag* v2; // eax + struct wavehdr_tag* v3; // esi + int v4; // esi + LPARAM v5; // eax + bool v6; // zf + bool v7; // sf + LPWAVEHDR i; // esi + signed int v10; // [esp+Ch] [ebp-8h] + int v11; // [esp+10h] [ebp-4h] -v10 = 0; -v11 = 0; -*(DWORD *)(hMem + 412) = a1; -DestroyPlayQueue(); -SwapWaveBlocks(); -while ( 1 ) -{ -v2 = (struct wavehdr_tag *)GetWaveBlock(); -v3 = v2; -if ( !v2 ) -break; -if ( !MixerPlay(v2, 0) ) -{ -v3[1].lpData = (LPSTR)1; -break; -} -AddToPlayingQueue(v3); -} -v4 = *(DWORD *)(hMem + 412); -MyWaveOutReset(*(HWAVEOUT *)(hMem + 12)); -v5 = hMem; -v6 = *(DWORD *)(hMem + 404) == 0; -v7 = *(DWORD *)(hMem + 404) < 0; -*(DWORD *)(hMem + 412) = v4; -if ( !v7 && !v6 ) -{ -waveOutPause(*(HWAVEOUT *)(v5 + 12)); -v5 = hMem; -v10 = 1; -v11 = 0; -} -for ( i = pwh; i; i = (LPWAVEHDR)i[1].dwUser ) -{ -if ( waveOutWrite(*(HWAVEOUT *)(v5 + 12), i, 0x20u) ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "Failed to write block to device", "WavMix32", 0x30u); -i[1].lpData = (LPSTR)1; -RemoveFromPlayingQueue(i); -} -v5 = hMem; -if ( v10 ) -{ -if ( ++v11 >= *(DWORD *)(hMem + 404) ) -{ -waveOutRestart(*(HWAVEOUT *)(hMem + 12)); -v5 = hMem; -v10 = 0; -} -} -} -if ( v10 ) -waveOutRestart(*(HWAVEOUT *)(v5 + 12)); -return 1; + v10 = 0; + v11 = 0; + *(DWORD*)(hMem + 412) = a1; + DestroyPlayQueue(); + SwapWaveBlocks(); + while (1) + { + v2 = (struct wavehdr_tag*)GetWaveBlock(); + v3 = v2; + if (!v2) + break; + if (!MixerPlay(v2, 0)) + { + v3[1].lpData = (LPSTR)1; + break; + } + AddToPlayingQueue(v3); + } + v4 = *(DWORD*)(hMem + 412); + MyWaveOutReset(*(HWAVEOUT*)(hMem + 12)); + v5 = hMem; + v6 = *(DWORD*)(hMem + 404) == 0; + v7 = *(DWORD*)(hMem + 404) < 0; + *(DWORD*)(hMem + 412) = v4; + if (!v7 && !v6) + { + waveOutPause(*(HWAVEOUT*)(v5 + 12)); + v5 = hMem; + v10 = 1; + v11 = 0; + } + for (i = pwh; i; i = (LPWAVEHDR)i[1].dwUser) + { + if (waveOutWrite(*(HWAVEOUT*)(v5 + 12), i, 0x20u)) + { + if (dword_1027BE4) + MessageBoxA(0, "Failed to write block to device", "WavMix32", 0x30u); + i[1].lpData = (LPSTR)1; + RemoveFromPlayingQueue(i); + } + v5 = hMem; + if (v10) + { + if (++v11 >= *(DWORD*)(hMem + 404)) + { + waveOutRestart(*(HWAVEOUT*)(hMem + 12)); + v5 = hMem; + v10 = 0; + } + } + } + if (v10) + waveOutRestart(*(HWAVEOUT*)(v5 + 12)); + return 1; } // 1027BE4: using guessed type int dword_1027BE4; //----- (0101DF07) -------------------------------------------------------- void ResetWavePosIfNoChannelData() { -signed int v0; // edx -DWORD *v1; // eax + signed int v0; // edx + DWORD* v1; // eax -if ( !pwh ) -{ -v0 = 0; -v1 = (DWORD *)(hMem + 244); -while ( !*v1 || *v1 == -1 ) -{ -++v0; -++v1; -if ( v0 >= 16 ) -{ -SetWaveOutPosition(0); -return; -} -} -} + if (!pwh) + { + v0 = 0; + v1 = (DWORD*)(hMem + 244); + while (!*v1 || *v1 == -1) + { + ++v0; + ++v1; + if (v0 >= 16) + { + SetWaveOutPosition(0); + return; + } + } + } } //----- (0101DF3D) -------------------------------------------------------- signed int WaveMixPlay(int a1) { -WORD *v1; // ebx -const void *v2; // edi -int v3; // eax -signed int v4; // edx -signed int v5; // ecx -DWORD *v6; // eax -bool v7; // zf -int v8; // eax -int v9; // edx -int v10; // ecx -int v11; // ecx -int v12; // esi -DWORD **v13; // ebx -LPARAM v14; // esi -DWORD v15; // eax -DWORD *v16; // eax -DWORD *v17; // edi -int v18; // ecx -int v19; // eax -int v20; // bx -DWORD **v21; // ebx -DWORD *i; // eax -DWORD *v23; // ST24_4 -DWORD v24; // eax -DWORD *v25; // ecx -DWORD *v26; // eax -DWORD v27; // eax -unsigned int v28; // ax -int v29; // ebx -signed int v30; // edi -struct wavehdr_tag *v31; // eax -int j; // eax -struct wavehdr_tag *v33; // eax -const CHAR *v35; // [esp-14h] [ebp-24h] -signed int v36; // [esp+8h] [ebp-8h] -signed int v37; // [esp+Ch] [ebp-4h] -DWORD v38; // [esp+18h] [ebp+8h] + WORD* v1; // ebx + const void* v2; // edi + int v3; // eax + signed int v4; // edx + signed int v5; // ecx + DWORD* v6; // eax + bool v7; // zf + int v8; // eax + int v9; // edx + int v10; // ecx + int v11; // ecx + int v12; // esi + DWORD** v13; // ebx + LPARAM v14; // esi + DWORD v15; // eax + DWORD* v16; // eax + DWORD* v17; // edi + int v18; // ecx + int v19; // eax + int v20; // bx + DWORD** v21; // ebx + DWORD* i; // eax + DWORD* v23; // ST24_4 + DWORD v24; // eax + DWORD* v25; // ecx + DWORD* v26; // eax + DWORD v27; // eax + unsigned int v28; // ax + int v29; // ebx + signed int v30; // edi + struct wavehdr_tag* v31; // eax + int j; // eax + struct wavehdr_tag* v33; // eax + const CHAR* v35; // [esp-14h] [ebp-24h] + signed int v36; // [esp+8h] [ebp-8h] + signed int v37; // [esp+Ch] [ebp-4h] + DWORD v38; // [esp+18h] [ebp+8h] -++dword_1027BF8; -v37 = 12; -v36 = 0; -if ( dword_1027BF8 > 1 ) -goto LABEL_97; -if ( !a1 ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "NULL parameters pointer passed to WaveMixPlay!", "WavMix32", 0x30u); -v37 = 5; -goto LABEL_97; -} -v1 = SessionToGlobalDataPtr(*(WORD **)(a1 + 2)); -hMem = (LPARAM)v1; -if ( !v1 ) -{ -if ( !dword_1027BE4 ) -{ -LABEL_10: -v37 = 5; -goto LABEL_97; -} -v35 = "Invalid session handle passed to WaveMixPlay"; -LABEL_9: -MessageBoxA(0, v35, "WavMix32", 0x30u); -goto LABEL_10; -} -v2 = *(const void **)(a1 + 10); -if ( !IsValidLPMIXWAVE(*(DWORD *)(a1 + 10)) ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "Invalid or NULL wave pointer passed to WaveMixPlay!", "WavMix32", 0x30u); -goto LABEL_10; -} -LOBYTE(v3) = HasCurrentOutputFormat(v2); -if ( !v3 ) -{ -_wsprintfA( -aWavemixV23ByAn, -"The LPMIXWAVE 0x%lx is not in the current output format, close the wave and reopen it.", -v2); -if ( dword_1027BE4 ) -MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u); -v37 = 8; -goto LABEL_97; -} -if ( *((DWORD *)v1 + 4) ) -{ -if ( !*((DWORD *)v1 + 77) ) -{ -if ( !dword_1027BE4 ) -goto LABEL_10; -v35 = "You must open a channel before you can play a wave!"; -goto LABEL_9; -} -if ( *(_BYTE *)(a1 + 18) & 2 ) -{ -v4 = 0; -v5 = 0; -v6 = v1 + 156; -do -{ -if ( *(v6 - 17) != -1 ) -{ -if ( !*(DWORD *)&v1[2 * v4 + 122] ) -break; -if ( v5 != v4 && *v6 < *(DWORD *)&v1[2 * v4 + 156] ) -v4 = v5; -} -++v5; -++v6; -} -while ( v5 < 16 ); -*(DWORD *)(a1 + 6) = v4; -} -else -{ -v4 = *(DWORD *)(a1 + 6); -} -++*((DWORD *)v1 + 94); -v7 = *(DWORD *)&v1[2 * v4 + 122] == -1; -*(DWORD *)&v1[2 * v4 + 156] = *((DWORD *)v1 + 94); -if ( v7 ) -goto LABEL_10; -v8 = GetChannelNode(); -if ( !v8 ) -goto LABEL_97; -qmemcpy((void *)(v8 + 4), (const void *)a1, 0x1Cu); -v10 = *(DWORD *)(v8 + 14); -*(DWORD *)(v8 + 32) = v10; -*(DWORD *)(v8 + 36) = *(DWORD *)(v10 + 20); -v11 = *(DWORD *)(v10 + 16); -*(DWORD *)(v8 + 48) = v11; -v12 = (unsigned int)v1[196]; -v13 = (DWORD **)(v1 + 220); -*(DWORD *)(v8 + 52) = *(DWORD *)(v8 + 36) + v11 - v12; -*(DWORD *)(v8 + 10) = v9; -if ( *v13 ) -{ -*(DWORD *)v8 = **v13; -**v13 = v8; -*v13 = (DWORD *)v8; -} -else -{ -*v13 = (DWORD *)v8; -*(DWORD *)v8 = v8; -} -if ( !(*(_BYTE *)(v8 + 22) & 8) ) -{ -ResetWavePosIfNoChannelData(); -v14 = hMem; -if ( *(signed int (**)(int, int))(hMem + 432) == ResetRemix ) -{ -v15 = MyWaveOutGetPosition(*(HWAVEOUT *)(hMem + 12), *(DWORD *)(hMem + 420)); -v14 = hMem; -} -else -{ -v15 = *(DWORD *)(hMem + 412); -} -v38 = v15; -if ( !*(DWORD *)(v14 + 440) ) -goto LABEL_84; -do -{ -v16 = *(DWORD **)(v14 + 440); -v17 = (DWORD *)*v16; -if ( (DWORD *)*v16 == v16 ) -*(DWORD *)(v14 + 440) = 0; -else -*v16 = *v17; -v18 = *(DWORD *)((char *)v17 + 22); -v19 = *(DWORD *)((char *)v17 + 10); -*v17 = 0; -if ( v18 & 0x10 ) -{ -*((WORD *)v17 + 28) = *((WORD *)v17 + 14); -v20 = *((WORD *)v17 + 15); -} -else -{ -*((WORD *)v17 + 28) = *(WORD *)(v14 + 4 * v19 + 180); -v20 = *(WORD *)(v14 + 4 * v19 + 182); -} -*((WORD *)v17 + 29) = v20; -if ( *((WORD *)v17 + 28) > 0xAu ) -*((WORD *)v17 + 28) = 10; -if ( *((WORD *)v17 + 29) > 0xAu ) -*((WORD *)v17 + 29) = 10; -if ( v18 & 1 ) -{ -v21 = (DWORD **)(v14 + 4 * v19 + 244); -for ( i = *v21; i; i = v23 ) -{ -v23 = (DWORD *)*i; -FreeChannelNode(i); -} -v7 = pwh == 0; -*v21 = v17; -if ( !v7 ) -v36 = 1; -if ( *((_BYTE *)v17 + 22) & 4 ) -v24 = v38; -else -v24 = *(DWORD *)(v14 + 412); -v17[10] = v24; -} -else -{ -v25 = (DWORD *)(v14 + 4 * v19 + 244); -v26 = (DWORD *)*v25; -if ( *v25 ) -{ -while ( *v26 ) -v26 = (DWORD *)*v26; -*v26 = v17; -v27 = v26[11]; -if ( *((_BYTE *)v17 + 22) & 4 ) -{ -if ( v27 <= v38 ) -v27 = v38; -} -else if ( *(DWORD *)(v14 + 412) > v27 ) -{ -v27 = *(DWORD *)(v14 + 412); -} -} -else -{ -v27 = v38; -*v25 = v17; -if ( !(*((_BYTE *)v17 + 22) & 4) ) -v27 = *(DWORD *)(v14 + 412); -} -v17[10] = v27; -if ( *(DWORD *)(v14 + 412) > v17[10] ) -v36 = 1; -} -v28 = *((WORD *)v17 + 13); -if ( v28 == -1 ) -v17[11] = -1; -else -v17[11] = v17[10] + v17[9] * (v28 + 1) - *(unsigned int *)(v14 + 392); -} -while ( *(DWORD *)(v14 + 440) ); -if ( !v36 ) -goto LABEL_84; -if ( !(*(int (**)(DWORD, DWORD))(v14 + 432))(v38, 0) ) -{ -v14 = hMem; -LABEL_84: -v29 = 0; -if ( pwh || *(DWORD *)(v14 + 404) <= 0 ) -{ -v30 = 0; -} -else -{ -waveOutPause(*(HWAVEOUT *)(v14 + 12)); -v30 = 1; -} -v31 = (struct wavehdr_tag *)GetWaveBlock(); -for ( j = MixerPlay(v31, 1); j; j = MixerPlay(v33, 1) ) -{ -if ( v30 ) -{ -if ( ++v29 >= *(DWORD *)(hMem + 404) ) -{ -waveOutRestart(*(HWAVEOUT *)(hMem + 12)); -v30 = 0; -} -} -v33 = (struct wavehdr_tag *)GetWaveBlock(); -} -if ( v30 ) -waveOutRestart(*(HWAVEOUT *)(hMem + 12)); -goto LABEL_96; -} -} -LABEL_96: -v37 = 0; -goto LABEL_97; -} -if ( dword_1027BE4 ) -MessageBoxA(0, "Wave device not allocated, call WaveMixActivate(hMixSession,TRUE)", "WavMix32", 0x30u); -v37 = 4; + ++dword_1027BF8; + v37 = 12; + v36 = 0; + if (dword_1027BF8 > 1) + goto LABEL_97; + if (!a1) + { + if (dword_1027BE4) + MessageBoxA(0, "NULL parameters pointer passed to WaveMixPlay!", "WavMix32", 0x30u); + v37 = 5; + goto LABEL_97; + } + v1 = SessionToGlobalDataPtr(*(WORD * *)(a1 + 2)); + hMem = (LPARAM)v1; + if (!v1) + { + if (!dword_1027BE4) + { + LABEL_10: + v37 = 5; + goto LABEL_97; + } + v35 = "Invalid session handle passed to WaveMixPlay"; + LABEL_9: + MessageBoxA(0, v35, "WavMix32", 0x30u); + goto LABEL_10; + } + v2 = *(const void**)(a1 + 10); + if (!IsValidLPMIXWAVE(*(DWORD*)(a1 + 10))) + { + if (dword_1027BE4) + MessageBoxA(0, "Invalid or NULL wave pointer passed to WaveMixPlay!", "WavMix32", 0x30u); + goto LABEL_10; + } + LOBYTE(v3) = HasCurrentOutputFormat(v2); + if (!v3) + { + _wsprintfA( + aWavemixV23ByAn, + "The LPMIXWAVE 0x%lx is not in the current output format, close the wave and reopen it.", + v2); + if (dword_1027BE4) + MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u); + v37 = 8; + goto LABEL_97; + } + if (*((DWORD*)v1 + 4)) + { + if (!*((DWORD*)v1 + 77)) + { + if (!dword_1027BE4) + goto LABEL_10; + v35 = "You must open a channel before you can play a wave!"; + goto LABEL_9; + } + if (*(_BYTE*)(a1 + 18) & 2) + { + v4 = 0; + v5 = 0; + v6 = v1 + 156; + do + { + if (*(v6 - 17) != -1) + { + if (!*(DWORD*)& v1[2 * v4 + 122]) + break; + if (v5 != v4 && *v6 < *(DWORD*)& v1[2 * v4 + 156]) + v4 = v5; + } + ++v5; + ++v6; + } while (v5 < 16); + *(DWORD*)(a1 + 6) = v4; + } + else + { + v4 = *(DWORD*)(a1 + 6); + } + ++* ((DWORD*)v1 + 94); + v7 = *(DWORD*)& v1[2 * v4 + 122] == -1; + *(DWORD*)& v1[2 * v4 + 156] = *((DWORD*)v1 + 94); + if (v7) + goto LABEL_10; + v8 = GetChannelNode(); + if (!v8) + goto LABEL_97; + qmemcpy((void*)(v8 + 4), (const void*)a1, 0x1Cu); + v10 = *(DWORD*)(v8 + 14); + *(DWORD*)(v8 + 32) = v10; + *(DWORD*)(v8 + 36) = *(DWORD*)(v10 + 20); + v11 = *(DWORD*)(v10 + 16); + *(DWORD*)(v8 + 48) = v11; + v12 = (unsigned int)v1[196]; + v13 = (DWORD * *)(v1 + 220); + *(DWORD*)(v8 + 52) = *(DWORD*)(v8 + 36) + v11 - v12; + *(DWORD*)(v8 + 10) = v9; + if (*v13) + { + *(DWORD*)v8 = **v13; + **v13 = v8; + *v13 = (DWORD*)v8; + } + else + { + *v13 = (DWORD*)v8; + *(DWORD*)v8 = v8; + } + if (!(*(_BYTE*)(v8 + 22) & 8)) + { + ResetWavePosIfNoChannelData(); + v14 = hMem; + if (*(signed int (**)(int, int))(hMem + 432) == ResetRemix) + { + v15 = MyWaveOutGetPosition(*(HWAVEOUT*)(hMem + 12), *(DWORD*)(hMem + 420)); + v14 = hMem; + } + else + { + v15 = *(DWORD*)(hMem + 412); + } + v38 = v15; + if (!*(DWORD*)(v14 + 440)) + goto LABEL_84; + do + { + v16 = *(DWORD * *)(v14 + 440); + v17 = (DWORD*)* v16; + if ((DWORD*)* v16 == v16) + * (DWORD*)(v14 + 440) = 0; + else + *v16 = *v17; + v18 = *(DWORD*)((char*)v17 + 22); + v19 = *(DWORD*)((char*)v17 + 10); + *v17 = 0; + if (v18 & 0x10) + { + *((WORD*)v17 + 28) = *((WORD*)v17 + 14); + v20 = *((WORD*)v17 + 15); + } + else + { + *((WORD*)v17 + 28) = *(WORD*)(v14 + 4 * v19 + 180); + v20 = *(WORD*)(v14 + 4 * v19 + 182); + } + *((WORD*)v17 + 29) = v20; + if (*((WORD*)v17 + 28) > 0xAu) + * ((WORD*)v17 + 28) = 10; + if (*((WORD*)v17 + 29) > 0xAu) + * ((WORD*)v17 + 29) = 10; + if (v18 & 1) + { + v21 = (DWORD * *)(v14 + 4 * v19 + 244); + for (i = *v21; i; i = v23) + { + v23 = (DWORD*)* i; + FreeChannelNode(i); + } + v7 = pwh == 0; + *v21 = v17; + if (!v7) + v36 = 1; + if (*((_BYTE*)v17 + 22) & 4) + v24 = v38; + else + v24 = *(DWORD*)(v14 + 412); + v17[10] = v24; + } + else + { + v25 = (DWORD*)(v14 + 4 * v19 + 244); + v26 = (DWORD*)* v25; + if (*v25) + { + while (*v26) + v26 = (DWORD*)* v26; + *v26 = v17; + v27 = v26[11]; + if (*((_BYTE*)v17 + 22) & 4) + { + if (v27 <= v38) + v27 = v38; + } + else if (*(DWORD*)(v14 + 412) > v27) + { + v27 = *(DWORD*)(v14 + 412); + } + } + else + { + v27 = v38; + *v25 = v17; + if (!(*((_BYTE*)v17 + 22) & 4)) + v27 = *(DWORD*)(v14 + 412); + } + v17[10] = v27; + if (*(DWORD*)(v14 + 412) > v17[10]) + v36 = 1; + } + v28 = *((WORD*)v17 + 13); + if (v28 == -1) + v17[11] = -1; + else + v17[11] = v17[10] + v17[9] * (v28 + 1) - *(unsigned int*)(v14 + 392); + } while (*(DWORD*)(v14 + 440)); + if (!v36) + goto LABEL_84; + if (!(*(int (**)(DWORD, DWORD))(v14 + 432))(v38, 0)) + { + v14 = hMem; + LABEL_84: + v29 = 0; + if (pwh || *(DWORD*)(v14 + 404) <= 0) + { + v30 = 0; + } + else + { + waveOutPause(*(HWAVEOUT*)(v14 + 12)); + v30 = 1; + } + v31 = (struct wavehdr_tag*)GetWaveBlock(); + for (j = MixerPlay(v31, 1); j; j = MixerPlay(v33, 1)) + { + if (v30) + { + if (++v29 >= *(DWORD*)(hMem + 404)) + { + waveOutRestart(*(HWAVEOUT*)(hMem + 12)); + v30 = 0; + } + } + v33 = (struct wavehdr_tag*)GetWaveBlock(); + } + if (v30) + waveOutRestart(*(HWAVEOUT*)(hMem + 12)); + goto LABEL_96; + } + } + LABEL_96: + v37 = 0; + goto LABEL_97; + } + if (dword_1027BE4) + MessageBoxA(0, "Wave device not allocated, call WaveMixActivate(hMixSession,TRUE)", "WavMix32", 0x30u); + v37 = 4; LABEL_97: ---dword_1027BF8; -return v37; + --dword_1027BF8; + return v37; } // 1027BE4: using guessed type int dword_1027BE4; // 1027BF8: using guessed type int dword_1027BF8; //----- (0101E373) -------------------------------------------------------- -signed int WaveMixFlushChannel(WORD *a1, signed int a2, char a3) +signed int WaveMixFlushChannel(WORD* a1, signed int a2, char a3) { -DWORD *v3; // ebx -WORD *v4; // eax -WORD *v5; // esi -signed int v6; // ecx -int v7; // eax -DWORD **v8; // edi -DWORD *v9; // eax -DWORD v10; // eax -signed int v13; // [esp+8h] [ebp-4h] -int v14; // [esp+14h] [ebp+8h] + DWORD* v3; // ebx + WORD* v4; // eax + WORD* v5; // esi + signed int v6; // ecx + int v7; // eax + DWORD** v8; // edi + DWORD* v9; // eax + DWORD v10; // eax + signed int v13; // [esp+8h] [ebp-4h] + int v14; // [esp+14h] [ebp+8h] -v3 = 0; -v13 = 0; -v4 = SessionToGlobalDataPtr(a1); -v5 = v4; -hMem = (LPARAM)v4; -if ( v4 ) -{ -if ( a3 & 1 ) -{ -v6 = 0; -v7 = 16; -goto LABEL_9; -} -v6 = a2; -if ( a2 < 0 || a2 >= 16 ) -return 11; -if ( *(DWORD *)&v4[2 * a2 + 122] != -1 ) -{ -v7 = a2 + 1; -if ( !(__OFSUB__(a2, a2 + 1) ^ 1) ) -return 0; -LABEL_9: -v8 = (DWORD **)&v5[2 * v6 + 122]; -v14 = v7 - v6; -do -{ -v9 = *v8; -if ( *v8 != (DWORD *)-1 ) -{ -*v8 = v3; -if ( v9 != v3 ) -{ -v13 = 1; -do -{ -v3 = (DWORD *)*v9; -FreeChannelNode(v9); -v9 = v3; -} -while ( v3 ); -} -} -++v8; ---v14; -} -while ( v14 ); -if ( (DWORD *)v13 != v3 && !(a3 & 2) && *((DWORD **)v5 + 4) != v3 ) -{ -v10 = MyWaveOutGetPosition(*((HWAVEOUT *)v5 + 3), *((DWORD *)v5 + 105)); -(*((void (**)(DWORD, DWORD *))v5 + 108))(v10, v3); -} -return 0; -} -} -return 5; + v3 = 0; + v13 = 0; + v4 = SessionToGlobalDataPtr(a1); + v5 = v4; + hMem = (LPARAM)v4; + if (v4) + { + if (a3 & 1) + { + v6 = 0; + v7 = 16; + goto LABEL_9; + } + v6 = a2; + if (a2 < 0 || a2 >= 16) + return 11; + if (*(DWORD*)& v4[2 * a2 + 122] != -1) + { + v7 = a2 + 1; + if (!(__OFSUB__(a2, a2 + 1) ^ 1)) + return 0; + LABEL_9: + v8 = (DWORD * *)& v5[2 * v6 + 122]; + v14 = v7 - v6; + do + { + v9 = *v8; + if (*v8 != (DWORD*)-1) + { + *v8 = v3; + if (v9 != v3) + { + v13 = 1; + do + { + v3 = (DWORD*)* v9; + FreeChannelNode(v9); + v9 = v3; + } while (v3); + } + } + ++v8; + --v14; + } while (v14); + if ((DWORD*)v13 != v3 && !(a3 & 2) && *((DWORD * *)v5 + 4) != v3) + { + v10 = MyWaveOutGetPosition(*((HWAVEOUT*)v5 + 3), *((DWORD*)v5 + 105)); + (*((void (**)(DWORD, DWORD*))v5 + 108))(v10, v3); + } + return 0; + } + } + return 5; } //----- (0101E434) -------------------------------------------------------- -signed int WaveMixCloseChannel(WORD *a1, signed int a2, char a3) +signed int WaveMixCloseChannel(WORD* a1, signed int a2, char a3) { -signed int result; // eax -signed int v4; // esi -int v5; // ecx -LPARAM v6; // eax -DWORD *v7; // edx -int v8; // ecx + signed int result; // eax + signed int v4; // esi + int v5; // ecx + LPARAM v6; // eax + DWORD* v7; // edx + int v8; // ecx -hMem = (LPARAM)SessionToGlobalDataPtr(a1); -if ( !hMem ) -return 5; -v4 = a2; -result = WaveMixFlushChannel(a1, a2, a3 | 2); -if ( !result ) -{ -if ( a3 & 1 ) -{ -v4 = 0; -v5 = 16; -} -else -{ -v5 = a2 + 1; -if ( !(__OFSUB__(a2, a2 + 1) ^ 1) ) -return 0; -} -v6 = hMem; -v7 = (DWORD *)(hMem + 4 * v4 + 244); -v8 = v5 - v4; -do -{ -if ( *v7 != -1 ) -{ -*v7 = -1; ---*(DWORD *)(v6 + 308); -} -++v7; ---v8; -} -while ( v8 ); -return 0; -} -return result; + hMem = (LPARAM)SessionToGlobalDataPtr(a1); + if (!hMem) + return 5; + v4 = a2; + result = WaveMixFlushChannel(a1, a2, a3 | 2); + if (!result) + { + if (a3 & 1) + { + v4 = 0; + v5 = 16; + } + else + { + v5 = a2 + 1; + if (!(__OFSUB__(a2, a2 + 1) ^ 1)) + return 0; + } + v6 = hMem; + v7 = (DWORD*)(hMem + 4 * v4 + 244); + v8 = v5 - v4; + do + { + if (*v7 != -1) + { + *v7 = -1; + --* (DWORD*)(v6 + 308); + } + ++v7; + --v8; + } while (v8); + return 0; + } + return result; } //----- (0101E4A9) -------------------------------------------------------- int WaveMixFreeWave(int a1, LPCVOID pMem) { -WORD *v2; // ebx -LPCVOID *v4; // edi -DWORD **v5; // ebx -DWORD *v6; // esi -HGLOBAL v7; // eax -HGLOBAL v8; // eax -HGLOBAL v9; // eax -HGLOBAL v10; // eax -DWORD *v11; // [esp+Ch] [ebp+8h] -char *pMema; // [esp+10h] [ebp+Ch] + WORD* v2; // ebx + LPCVOID* v4; // edi + DWORD** v5; // ebx + DWORD* v6; // esi + HGLOBAL v7; // eax + HGLOBAL v8; // eax + HGLOBAL v9; // eax + HGLOBAL v10; // eax + DWORD* v11; // [esp+Ch] [ebp+8h] + char* pMema; // [esp+10h] [ebp+Ch] -v2 = SessionToGlobalDataPtr((WORD *)a1); -if ( !v2 ) -return 5; -v4 = (LPCVOID *)pMem; -if ( !IsValidLPMIXWAVE((int)pMem) ) -return 5; -v5 = (DWORD **)(v2 + 122); -pMema = (char *)16; -do -{ -v6 = *v5; -if ( *v5 != (DWORD *)-1 ) -{ -v11 = 0; -while ( v6 ) -{ -if ( (LPCVOID *)v6[8] == v4 ) -{ -if ( v11 ) -{ -*v11 = *v6; -FreeChannelNode(v6); -v6 = (DWORD *)*v11; -} -else -{ -v6 = (DWORD *)*v6; -FreeChannelNode(*v5); -*v5 = v6; -} -} -else -{ -v11 = v6; -v6 = (DWORD *)*v6; -} -} -} -++v5; ---pMema; -} -while ( pMema ); -if ( v4[4] ) -{ -v7 = GlobalHandle(v4[4]); -GlobalUnlock(v7); -v8 = GlobalHandle(v4[4]); -GlobalFree(v8); -} -*((WORD *)v4 + 32) = 0; -v9 = GlobalHandle(v4); -GlobalUnlock(v9); -v10 = GlobalHandle(v4); -GlobalFree(v10); -return 0; + v2 = SessionToGlobalDataPtr((WORD*)a1); + if (!v2) + return 5; + v4 = (LPCVOID*)pMem; + if (!IsValidLPMIXWAVE((int)pMem)) + return 5; + v5 = (DWORD * *)(v2 + 122); + pMema = (char*)16; + do + { + v6 = *v5; + if (*v5 != (DWORD*)-1) + { + v11 = 0; + while (v6) + { + if ((LPCVOID*)v6[8] == v4) + { + if (v11) + { + *v11 = *v6; + FreeChannelNode(v6); + v6 = (DWORD*)* v11; + } + else + { + v6 = (DWORD*)* v6; + FreeChannelNode(*v5); + *v5 = v6; + } + } + else + { + v11 = v6; + v6 = (DWORD*)* v6; + } + } + } + ++v5; + --pMema; + } while (pMema); + if (v4[4]) + { + v7 = GlobalHandle(v4[4]); + GlobalUnlock(v7); + v8 = GlobalHandle(v4[4]); + GlobalFree(v8); + } + *((WORD*)v4 + 32) = 0; + v9 = GlobalHandle(v4); + GlobalUnlock(v9); + v10 = GlobalHandle(v4); + GlobalFree(v10); + return 0; } //----- (0101E579) -------------------------------------------------------- -WORD *BitsPerSampleAlign(int a1, LPCVOID pMem, int a3, int a4, int a5) +WORD* BitsPerSampleAlign(int a1, LPCVOID pMem, int a3, int a4, int a5) { -WORD *v6; // edi -int v7; // edi -unsigned int v8; // esi -SIZE_T v9; // eax -HGLOBAL v10; // eax -WORD *v11; // eax -WORD *v12; // ecx -WORD *v13; // ebx -_BYTE *v14; // edi -char *i; // edx -HGLOBAL v16; // eax -HGLOBAL v17; // eax -int v18; // [esp+Ch] [ebp+Ch] + WORD* v6; // edi + int v7; // edi + unsigned int v8; // esi + SIZE_T v9; // eax + HGLOBAL v10; // eax + WORD* v11; // eax + WORD* v12; // ecx + WORD* v13; // ebx + _BYTE* v14; // edi + char* i; // edx + HGLOBAL v16; // eax + HGLOBAL v17; // eax + int v18; // [esp+Ch] [ebp+Ch] -if ( (WORD)a3 == a4 ) -return pMem; -if ( ((WORD)a3 == 8 || (WORD)a3 == 16) && (a4 == 8 || a4 == 16) ) -{ -LOWORD(a1) = (unsigned int)a3 >> 3; -v7 = a1; -v8 = *(DWORD *)a5 / (unsigned int)((unsigned int)a3 >> 3); -v9 = v8 * ((unsigned int)a4 >> 3); -*(DWORD *)a5 = v9; -v10 = GlobalAlloc(0x2002u, v9); -v11 = GlobalLock(v10); -v12 = v11; -if ( v11 ) -{ -if ( (unsigned int)v7 <= (unsigned int)((unsigned int)a4 >> 3) ) -{ -for ( i = (char *)pMem; v8; --v8 ) -{ -LOWORD(v7) = *i; -v7 = (v7 - 128) << 8; -*v11 = v7; -++v11; -++i; -} -} -else -{ -v13 = pMem; -v14 = v11; -if ( v8 ) -{ -v18 = v8; -do -{ -*v14++ = *v13 / 256 + -128; -++v13; ---v18; -} -while ( v18 ); -} -} -v6 = v12; -} -else -{ -if ( dword_1027BE4 ) -MessageBoxA( -0, -"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", -"WavMix32", -0x40u); -v6 = 0; -} -} -else -{ -v6 = 0; -} -v16 = GlobalHandle(pMem); -GlobalUnlock(v16); -v17 = GlobalHandle(pMem); -GlobalFree(v17); -return v6; + if ((WORD)a3 == a4) + return pMem; + if (((WORD)a3 == 8 || (WORD)a3 == 16) && (a4 == 8 || a4 == 16)) + { + LOWORD(a1) = (unsigned int)a3 >> 3; + v7 = a1; + v8 = *(DWORD*)a5 / (unsigned int)((unsigned int)a3 >> 3); + v9 = v8 * ((unsigned int)a4 >> 3); + *(DWORD*)a5 = v9; + v10 = GlobalAlloc(0x2002u, v9); + v11 = GlobalLock(v10); + v12 = v11; + if (v11) + { + if ((unsigned int)v7 <= (unsigned int)((unsigned int)a4 >> 3)) + { + for (i = (char*)pMem; v8; --v8) + { + LOWORD(v7) = *i; + v7 = (v7 - 128) << 8; + *v11 = v7; + ++v11; + ++i; + } + } + else + { + v13 = pMem; + v14 = v11; + if (v8) + { + v18 = v8; + do + { + *v14++ = *v13 / 256 + -128; + ++v13; + --v18; + } while (v18); + } + } + v6 = v12; + } + else + { + if (dword_1027BE4) + MessageBoxA( + 0, + "Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", + "WavMix32", + 0x40u); + v6 = 0; + } + } + else + { + v6 = 0; + } + v16 = GlobalHandle(pMem); + GlobalUnlock(v16); + v17 = GlobalHandle(pMem); + GlobalFree(v17); + return v6; } // 1027BE4: using guessed type int dword_1027BE4; //----- (0101E686) -------------------------------------------------------- -_BYTE *ChannelAlign(LPCVOID pMem, int a2, int a3, int a4, int a5) +_BYTE* ChannelAlign(LPCVOID pMem, int a2, int a3, int a4, int a5) { -unsigned int v6; // edi -SIZE_T v7; // eax -HGLOBAL v8; // eax -_BYTE *v9; // eax -_BYTE *v10; // ebx -unsigned __int8 *v11; // ecx -_BYTE *v12; // eax -WORD *v13; // eax -WORD *v14; // esi -HGLOBAL v15; // eax -HGLOBAL v16; // eax + unsigned int v6; // edi + SIZE_T v7; // eax + HGLOBAL v8; // eax + _BYTE* v9; // eax + _BYTE* v10; // ebx + unsigned __int8* v11; // ecx + _BYTE* v12; // eax + WORD* v13; // eax + WORD* v14; // esi + HGLOBAL v15; // eax + HGLOBAL v16; // eax -if ( a2 == a3 ) -return pMem; -v6 = *(DWORD *)a5 / (unsigned int)(unsigned int)a4 / (unsigned int)a2; -v7 = v6 * (unsigned int)a4 * (unsigned int)a3; -*(DWORD *)a5 = v7; -v8 = GlobalAlloc(0x2002u, v7); -v9 = GlobalLock(v8); -v10 = v9; -if ( v9 ) -{ -v11 = (unsigned __int8 *)pMem; -if ( (unsigned int)a2 >= (unsigned int)a3 ) -{ -v14 = v9; -if ( a4 == 1 ) -{ -for ( ; v6; --v6 ) -{ -*(_BYTE *)v14 = (*v11 + v11[1]) / 2; -v14 = (WORD *)((char *)v14 + 1); -v11 += 2; -} -} -else -{ -for ( ; v6; --v6 ) -{ -*v14 = (*(signed int *)v11 + *((signed int *)v11 + 1)) / 2; -++v14; -v11 += 4; -} -} -} -else if ( a4 == 1 ) -{ -for ( ; v6; --v6 ) -{ -*v9 = *v11; -v12 = v9 + 1; -*v12 = *v11; -v9 = v12 + 1; -++v11; -} -} -else -{ -for ( ; v6; --v6 ) -{ -*(WORD *)v9 = *(WORD *)v11; -v13 = v9 + 2; -*v13 = *(WORD *)v11; -v9 = v13 + 1; -v11 += 2; -} -} -} -else -{ -if ( dword_1027BE4 ) -MessageBoxA( -0, -"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", -"WavMix32", -0x40u); -v10 = 0; -} -v15 = GlobalHandle(pMem); -GlobalUnlock(v15); -v16 = GlobalHandle(pMem); -GlobalFree(v16); -return v10; + if (a2 == a3) + return pMem; + v6 = *(DWORD*)a5 / (unsigned int)(unsigned int)a4 / (unsigned int)a2; + v7 = v6 * (unsigned int)a4 * (unsigned int)a3; + *(DWORD*)a5 = v7; + v8 = GlobalAlloc(0x2002u, v7); + v9 = GlobalLock(v8); + v10 = v9; + if (v9) + { + v11 = (unsigned __int8*)pMem; + if ((unsigned int)a2 >= (unsigned int)a3) + { + v14 = v9; + if (a4 == 1) + { + for (; v6; --v6) + { + *(_BYTE*)v14 = (*v11 + v11[1]) / 2; + v14 = (WORD*)((char*)v14 + 1); + v11 += 2; + } + } + else + { + for (; v6; --v6) + { + *v14 = (*(signed int*)v11 + *((signed int*)v11 + 1)) / 2; + ++v14; + v11 += 4; + } + } + } + else if (a4 == 1) + { + for (; v6; --v6) + { + *v9 = *v11; + v12 = v9 + 1; + *v12 = *v11; + v9 = v12 + 1; + ++v11; + } + } + else + { + for (; v6; --v6) + { + *(WORD*)v9 = *(WORD*)v11; + v13 = v9 + 2; + *v13 = *(WORD*)v11; + v9 = v13 + 1; + v11 += 2; + } + } + } + else + { + if (dword_1027BE4) + MessageBoxA( + 0, + "Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", + "WavMix32", + 0x40u); + v10 = 0; + } + v15 = GlobalHandle(pMem); + GlobalUnlock(v15); + v16 = GlobalHandle(pMem); + GlobalFree(v16); + return v10; } // 1027BE4: using guessed type int dword_1027BE4; //----- (0101E7B0) -------------------------------------------------------- -void AvgSample(WORD *a1, unsigned __int8 *a2, int a3, int a4, int a5) +void AvgSample(WORD* a1, unsigned __int8* a2, int a3, int a4, int a5) { -int v5; // edi -_BYTE *v6; // esi -unsigned __int8 *v7; // ecx -int v8; // eax -int v9; // edx -int v10; // ebx -int v11; // edx -signed int *v12; // edi -signed int *v13; // ecx -int v14; // eax -int v15; // esi -int v16; // edx -bool v17; // zf -int v18; // [esp+18h] [ebp+Ch] + int v5; // edi + _BYTE* v6; // esi + unsigned __int8* v7; // ecx + int v8; // eax + int v9; // edx + int v10; // ebx + int v11; // edx + signed int* v12; // edi + signed int* v13; // ecx + int v14; // eax + int v15; // esi + int v16; // edx + bool v17; // zf + int v18; // [esp+18h] [ebp+Ch] -if ( a4 == 1 ) -{ -v5 = a5; -if ( a5 > 0 ) -{ -v6 = a1; -do -{ -v7 = a2++; -v8 = 0; -if ( a3 > 0 ) -{ -v9 = a3; -do -{ -v10 = *v7; -v7 += a5; ---v9; -v8 = v8 + v10 - 128; -} -while ( v9 ); -} -*v6++ = (unsigned int)(v8 / a3) + -128; ---v5; -} -while ( v5 ); -} -} -else -{ -v11 = a5; -v12 = (signed int *)a2; -if ( a5 > 0 ) -{ -v18 = a5; -while ( 1 ) -{ -v13 = v12; -v14 = 0; -++v12; -if ( a3 > 0 ) -{ -v15 = a3; -v16 = 2 * v11; -do -{ -v14 += *v13; -v13 = (signed int *)((char *)v13 + v16); ---v15; -} -while ( v15 ); -} -v17 = v18-- == 1; -*a1 = v14 / a3; -if ( v17 ) -break; -v11 = a5; -} -} -} + if (a4 == 1) + { + v5 = a5; + if (a5 > 0) + { + v6 = a1; + do + { + v7 = a2++; + v8 = 0; + if (a3 > 0) + { + v9 = a3; + do + { + v10 = *v7; + v7 += a5; + --v9; + v8 = v8 + v10 - 128; + } while (v9); + } + *v6++ = (unsigned int)(v8 / a3) + -128; + --v5; + } while (v5); + } + } + else + { + v11 = a5; + v12 = (signed int*)a2; + if (a5 > 0) + { + v18 = a5; + while (1) + { + v13 = v12; + v14 = 0; + ++v12; + if (a3 > 0) + { + v15 = a3; + v16 = 2 * v11; + do + { + v14 += *v13; + v13 = (signed int*)((char*)v13 + v16); + --v15; + } while (v15); + } + v17 = v18-- == 1; + *a1 = v14 / a3; + if (v17) + break; + v11 = a5; + } + } + } } //----- (0101E83A) -------------------------------------------------------- -int RepSample(_BYTE *a1, unsigned __int8 *a2, signed int a3, int a4, int a5) +int RepSample(_BYTE* a1, unsigned __int8* a2, signed int a3, int a4, int a5) { -int v5; // ebx -int result; // eax -unsigned __int8 *v7; // edi -char v8; // cl -_BYTE *v9; // esi -_BYTE *v10; // esi -int v11; // edx -int v12; // ebx -WORD *v13; // esi -WORD *v14; // edi -int v15; // ecx -int v16; // edx -int v17; // [esp+14h] [ebp+8h] -WORD *v18; // [esp+18h] [ebp+Ch] -unsigned __int8 *v19; // [esp+20h] [ebp+14h] + int v5; // ebx + int result; // eax + unsigned __int8* v7; // edi + char v8; // cl + _BYTE* v9; // esi + _BYTE* v10; // esi + int v11; // edx + int v12; // ebx + WORD* v13; // esi + WORD* v14; // edi + int v15; // ecx + int v16; // edx + int v17; // [esp+14h] [ebp+8h] + WORD* v18; // [esp+18h] [ebp+Ch] + unsigned __int8* v19; // [esp+20h] [ebp+14h] -if ( a4 == 1 ) -{ -v5 = a5; -result = (int)a1; -if ( a5 > 0 ) -{ -v7 = a2; -do -{ -v8 = *v7; -v9 = a1++; -result = (v7[v5] - *v7) / a3; -*v9 = *v7; -v10 = &v9[v5]; -if ( a3 > 1 ) -{ -v11 = a3 - 1; -do -{ -v8 += result; -*v10 = v8; -v10 += v5; ---v11; -} -while ( v11 ); -} -++v7; ---a5; -} -while ( a5 ); -} -} -else -{ -v19 = a2; -v18 = a1; -result = a5; -if ( a5 > 0 ) -{ -v12 = a5; -v17 = a5; -do -{ -v13 = v18; -LOWORD(v15) = *(WORD *)v19; -++v18; -v14 = &v13[v12]; -result = ((signed int)v13[v12] - *(signed int *)v19) / a3; -*v13 = *(WORD *)v19; -v15 = (signed int)v15; -if ( a3 > 1 ) -{ -v16 = a3 - 1; -do -{ -v15 += result; -*v14 = v15; -v14 = (WORD *)((char *)v14 + v12 * 2); ---v16; -} -while ( v16 ); -} -v19 += 2; ---v17; -} -while ( v17 ); -} -} -return result; + if (a4 == 1) + { + v5 = a5; + result = (int)a1; + if (a5 > 0) + { + v7 = a2; + do + { + v8 = *v7; + v9 = a1++; + result = (v7[v5] - *v7) / a3; + *v9 = *v7; + v10 = &v9[v5]; + if (a3 > 1) + { + v11 = a3 - 1; + do + { + v8 += result; + *v10 = v8; + v10 += v5; + --v11; + } while (v11); + } + ++v7; + --a5; + } while (a5); + } + } + else + { + v19 = a2; + v18 = a1; + result = a5; + if (a5 > 0) + { + v12 = a5; + v17 = a5; + do + { + v13 = v18; + LOWORD(v15) = *(WORD*)v19; + ++v18; + v14 = &v13[v12]; + result = ((signed int)v13[v12] - *(signed int*)v19) / a3; + *v13 = *(WORD*)v19; + v15 = (signed int)v15; + if (a3 > 1) + { + v16 = a3 - 1; + do + { + v15 += result; + *v14 = v15; + v14 = (WORD*)((char*)v14 + v12 * 2); + --v16; + } while (v16); + } + v19 += 2; + --v17; + } while (v17); + } + } + return result; } //----- (0101E8F5) -------------------------------------------------------- LPCVOID SamplesPerSecAlign(LPCVOID pMem, int a2, int a3, int a4, int a5, int a6) { -LPCVOID result; // eax -DWORD *v7; // ecx -int v8; // edi -unsigned int v9; // eax -int v10; // esi -unsigned int v11; // eax -HGLOBAL v12; // eax -_BYTE *v13; // ebx -HGLOBAL v14; // eax -HGLOBAL v15; // eax -int v16; // ecx -_BYTE *v17; // eax -int v18; // esi -_BYTE *v19; // eax -HGLOBAL v20; // eax -HGLOBAL v21; // eax -int v22; // [esp+8h] [ebp-8h] -LPCVOID v23; // [esp+Ch] [ebp-4h] -int v24; // [esp+1Ch] [ebp+Ch] -int v25; // [esp+1Ch] [ebp+Ch] -int v26; // [esp+20h] [ebp+10h] -int v27; // [esp+20h] [ebp+10h] -unsigned int v28; // [esp+2Ch] [ebp+1Ch] + LPCVOID result; // eax + DWORD* v7; // ecx + int v8; // edi + unsigned int v9; // eax + int v10; // esi + unsigned int v11; // eax + HGLOBAL v12; // eax + _BYTE* v13; // ebx + HGLOBAL v14; // eax + HGLOBAL v15; // eax + int v16; // ecx + _BYTE* v17; // eax + int v18; // esi + _BYTE* v19; // eax + HGLOBAL v20; // eax + HGLOBAL v21; // eax + int v22; // [esp+8h] [ebp-8h] + LPCVOID v23; // [esp+Ch] [ebp-4h] + int v24; // [esp+1Ch] [ebp+Ch] + int v25; // [esp+1Ch] [ebp+Ch] + int v26; // [esp+20h] [ebp+10h] + int v27; // [esp+20h] [ebp+10h] + unsigned int v28; // [esp+2Ch] [ebp+1Ch] -if ( a2 == a3 ) -return pMem; -v7 = (DWORD *)a6; -v8 = (unsigned int)a4 * (unsigned int)a5; -v28 = *(DWORD *)a6 / (unsigned int)v8; -if ( a3 <= (unsigned int)a2 ) -{ -v11 = a2 / (unsigned int)a3; -v24 = 0; -v26 = v11; -v10 = v28 / v11; -} -else -{ -v9 = a3 / (unsigned int)a2; -v26 = 0; -v24 = v9; -v10 = v28 * v9; -} -*v7 = v8 * v10; -v12 = GlobalAlloc(0x2002u, v8 * v10); -v13 = GlobalLock(v12); -if ( v13 ) -{ -v23 = pMem; -v22 = (int)v13; -if ( v24 <= 0 ) -{ -if ( v10 != 1 ) -{ -v25 = v10 - 1; -do -{ -AvgSample(v13, (unsigned __int8 *)pMem, v26, (unsigned int)a4, (unsigned int)a5); -pMem = (char *)pMem + v8 * v26; -v13 += v8; ---v25; -} -while ( v25 ); -} -if ( v8 > 0 ) -{ -v19 = pMem; -do -{ -*v13++ = *v19++; ---v8; -} -while ( v8 ); -} -} -else -{ -if ( v28 != 1 ) -{ -v27 = v28 - 1; -do -{ -RepSample(v13, (unsigned __int8 *)pMem, v24, (unsigned int)a4, (unsigned int)a5); -pMem = (char *)pMem + v8; -v13 += v8 * v24; ---v27; -} -while ( v27 ); -} -v16 = v24; -if ( v24 > 0 ) -{ -do -{ -v17 = pMem; -if ( v8 > 0 ) -{ -v18 = (unsigned int)a4 * (unsigned int)a5; -do -{ -*v13++ = *v17++; ---v18; -} -while ( v18 ); -} ---v16; -} -while ( v16 ); -} -} -v20 = GlobalHandle(v23); -GlobalUnlock(v20); -v21 = GlobalHandle(v23); -GlobalFree(v21); -result = (LPCVOID)v22; -} -else -{ -if ( dword_1027BE4 ) -MessageBoxA( -0, -"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", -"WavMix32", -0x40u); -v14 = GlobalHandle(pMem); -GlobalUnlock(v14); -v15 = GlobalHandle(pMem); -GlobalFree(v15); -result = 0; -} -return result; + if (a2 == a3) + return pMem; + v7 = (DWORD*)a6; + v8 = (unsigned int)a4 * (unsigned int)a5; + v28 = *(DWORD*)a6 / (unsigned int)v8; + if (a3 <= (unsigned int)a2) + { + v11 = a2 / (unsigned int)a3; + v24 = 0; + v26 = v11; + v10 = v28 / v11; + } + else + { + v9 = a3 / (unsigned int)a2; + v26 = 0; + v24 = v9; + v10 = v28 * v9; + } + *v7 = v8 * v10; + v12 = GlobalAlloc(0x2002u, v8 * v10); + v13 = GlobalLock(v12); + if (v13) + { + v23 = pMem; + v22 = (int)v13; + if (v24 <= 0) + { + if (v10 != 1) + { + v25 = v10 - 1; + do + { + AvgSample(v13, (unsigned __int8*)pMem, v26, (unsigned int)a4, (unsigned int)a5); + pMem = (char*)pMem + v8 * v26; + v13 += v8; + --v25; + } while (v25); + } + if (v8 > 0) + { + v19 = pMem; + do + { + *v13++ = *v19++; + --v8; + } while (v8); + } + } + else + { + if (v28 != 1) + { + v27 = v28 - 1; + do + { + RepSample(v13, (unsigned __int8*)pMem, v24, (unsigned int)a4, (unsigned int)a5); + pMem = (char*)pMem + v8; + v13 += v8 * v24; + --v27; + } while (v27); + } + v16 = v24; + if (v24 > 0) + { + do + { + v17 = pMem; + if (v8 > 0) + { + v18 = (unsigned int)a4 * (unsigned int)a5; + do + { + *v13++ = *v17++; + --v18; + } while (v18); + } + --v16; + } while (v16); + } + } + v20 = GlobalHandle(v23); + GlobalUnlock(v20); + v21 = GlobalHandle(v23); + GlobalFree(v21); + result = (LPCVOID)v22; + } + else + { + if (dword_1027BE4) + MessageBoxA( + 0, + "Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", + "WavMix32", + 0x40u); + v14 = GlobalHandle(pMem); + GlobalUnlock(v14); + v15 = GlobalHandle(pMem); + GlobalFree(v15); + result = 0; + } + return result; } // 1027BE4: using guessed type int dword_1027BE4; //----- (0101EA82) -------------------------------------------------------- LPCVOID WaveFormatConvert(int a1, int a2, LPCVOID pMem, int a4) { -LPCVOID result; // eax -WORD *v5; // eax -_BYTE *v6; // eax + LPCVOID result; // eax + WORD* v5; // eax + _BYTE* v6; // eax -if ( *(WORD *)(a2 + 2) == *(WORD *)(a1 + 2) -&& *(DWORD *)(a2 + 4) == *(DWORD *)(a1 + 4) -&& *(WORD *)(a2 + 14) == *(WORD *)(a1 + 14) ) -{ -return pMem; -} -v5 = BitsPerSampleAlign(*(unsigned int *)(a2 + 14), pMem, *(unsigned int *)(a2 + 14), *(WORD *)(a1 + 14), a4); -if ( v5 && (v6 = ChannelAlign(v5, *(WORD *)(a2 + 2), *(WORD *)(a1 + 2), *(WORD *)(a1 + 14) >> 3, a4)) != 0 ) -result = SamplesPerSecAlign( -v6, -*(DWORD *)(a2 + 4), -*(DWORD *)(a1 + 4), -*(WORD *)(a1 + 14) >> 3, -*(WORD *)(a1 + 2), -a4); -else -result = 0; -return result; + if (*(WORD*)(a2 + 2) == *(WORD*)(a1 + 2) + && *(DWORD*)(a2 + 4) == *(DWORD*)(a1 + 4) + && *(WORD*)(a2 + 14) == *(WORD*)(a1 + 14)) + { + return pMem; + } + v5 = BitsPerSampleAlign(*(unsigned int*)(a2 + 14), pMem, *(unsigned int*)(a2 + 14), *(WORD*)(a1 + 14), a4); + if (v5 && (v6 = ChannelAlign(v5, *(WORD*)(a2 + 2), *(WORD*)(a1 + 2), *(WORD*)(a1 + 14) >> 3, a4)) != 0) + result = SamplesPerSecAlign( + v6, + *(DWORD*)(a2 + 4), + *(DWORD*)(a1 + 4), + *(WORD*)(a1 + 14) >> 3, + *(WORD*)(a1 + 2), + a4); + else + result = 0; + return result; } //----- (0101EB23) -------------------------------------------------------- -CHAR *WaveMixOpenWave(LPCVOID pMem, LPCSTR lpName, HMODULE hModule, LONG cch) +CHAR* WaveMixOpenWave(LPCVOID pMem, LPCSTR lpName, HMODULE hModule, LONG cch) { -WORD *v4; // eax -WORD v5; // cx -HGLOBAL v7; // eax -CHAR *v8; // edi -HRSRC v9; // eax -HRSRC v10; // esi -HGLOBAL v11; // eax -HGLOBAL v12; // eax -HGLOBAL v13; // eax -HGLOBAL v14; // eax -HGLOBAL v15; // eax -void *v16; // eax -const void *v17; // esi -LONG v18; // eax -LPCVOID v19; // esi -const void *v20; // ST08_4 -int v21; // eax -int v22; // eax -const CHAR *v23; // [esp-10h] [ebp-A4h] -UINT v24; // [esp-Ch] [ebp-A0h] -struct _MMIOINFO pmmioinfo; // [esp+4h] [ebp-90h] -struct _MMCKINFO pmmcki; // [esp+4Ch] [ebp-48h] -HWAVEOUT phwo; // [esp+60h] [ebp-34h] -struct _MMCKINFO v28; // [esp+64h] [ebp-30h] -WAVEFORMATEX pwfx; // [esp+78h] [ebp-1Ch] -LPCVOID v30; // [esp+8Ch] [ebp-8h] -HGLOBAL hResData; // [esp+90h] [ebp-4h] -HMMIO hModulea; // [esp+A4h] [ebp+10h] + WORD* v4; // eax + WORD v5; // cx + HGLOBAL v7; // eax + CHAR* v8; // edi + HRSRC v9; // eax + HRSRC v10; // esi + HGLOBAL v11; // eax + HGLOBAL v12; // eax + HGLOBAL v13; // eax + HGLOBAL v14; // eax + HGLOBAL v15; // eax + void* v16; // eax + const void* v17; // esi + LONG v18; // eax + LPCVOID v19; // esi + const void* v20; // ST08_4 + int v21; // eax + int v22; // eax + const CHAR* v23; // [esp-10h] [ebp-A4h] + UINT v24; // [esp-Ch] [ebp-A0h] + struct _MMIOINFO pmmioinfo; // [esp+4h] [ebp-90h] + struct _MMCKINFO pmmcki; // [esp+4Ch] [ebp-48h] + HWAVEOUT phwo; // [esp+60h] [ebp-34h] + struct _MMCKINFO v28; // [esp+64h] [ebp-30h] + WAVEFORMATEX pwfx; // [esp+78h] [ebp-1Ch] + LPCVOID v30; // [esp+8Ch] [ebp-8h] + HGLOBAL hResData; // [esp+90h] [ebp-4h] + HMMIO hModulea; // [esp+A4h] [ebp+10h] -hResData = 0; -v30 = 0; -v4 = SessionToGlobalDataPtr(pMem); -pwfx.wFormatTag = v4[190]; -pwfx.nChannels = v4[191]; -pwfx.nSamplesPerSec = *((DWORD *)v4 + 96); -pwfx.nAvgBytesPerSec = *((DWORD *)v4 + 97); -v5 = v4[196]; -hMem = (LPARAM)v4; -pwfx.nBlockAlign = v5; -pwfx.wBitsPerSample = v4[197]; -pwfx.cbSize = 0; -if ( waveOutOpen(&phwo, 0xFFFFFFFF, &pwfx, 0, 0, 1u) ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "The waveform device can't play this format.", "WavMix32", 0x30u); -return 0; -} -v7 = GlobalAlloc(0x2040u, 0x42u); -v8 = (CHAR *)GlobalLock(v7); -if ( !v8 ) -{ -if ( dword_1027BE4 ) -MessageBoxA( -0, -"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", -"WavMix32", -0x40u); -return 0; -} -if ( cch & 2 ) -{ -v9 = FindResourceA(hModule, lpName, "WAVE"); -v10 = v9; -if ( !v9 || (hResData = LoadResource(hModule, v9)) == 0 ) -{ -if ( HIWORD(lpName) ) -_wsprintfA(aWavemixV23ByAn, "Failed to open 'WAVE' resource '%s'.", lpName); -else -_wsprintfA(aWavemixV23ByAn, "Failed to open 'WAVE' resource %u.", (unsigned int)lpName); -if ( dword_1027BE4 ) -MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u); -goto LABEL_31; -} -memset(&pmmioinfo, 0, sizeof(pmmioinfo)); -pmmioinfo.pchBuffer = (HPSTR)LockResource(hResData); -if ( !pmmioinfo.pchBuffer ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "Failed to lock 'WAVE' resource", "WavMix32", 0x30u); -FreeResource(hResData); -hResData = 0; -LABEL_31: -v11 = GlobalHandle(v8); -GlobalUnlock(v11); -v12 = GlobalHandle(v8); -GlobalFree(v12); -if ( v30 ) -{ -v13 = GlobalHandle(v30); -GlobalUnlock(v13); -v14 = GlobalHandle(v30); -GlobalFree(v14); -} -if ( hResData ) -FreeResource(hResData); -return 0; -} -pmmioinfo.cchBuffer = SizeofResource(hModule, v10); -pmmioinfo.fccIOProc = 541934925; -pmmioinfo.adwInfo[0] = 0; -hModulea = mmioOpenA(0, &pmmioinfo, 0); -if ( !hModulea ) -{ -if ( !dword_1027BE4 ) -goto LABEL_29; -v24 = pmmioinfo.wErrorRet; -v23 = "Failed to open resource, mmioOpen error=%u.\nMay need to make sure resource is marked read-write"; -goto LABEL_28; -} -} -else if ( cch & 4 ) -{ -qmemcpy(&pmmioinfo, lpName, sizeof(pmmioinfo)); -hModulea = mmioOpenA(0, &pmmioinfo, 0); -if ( !hModulea ) -{ -if ( !dword_1027BE4 ) -goto LABEL_29; -v24 = pmmioinfo.wErrorRet; -v23 = "Failed to open memory file, mmioOpen error=%u.\nMay need to make sure memory is read-write"; -LABEL_28: -_wsprintfA(aWavemixV23ByAn, v23, v24); -MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u); -LABEL_29: -if ( hModulea ) -mmioClose(hModulea, 0); -goto LABEL_31; -} -} -else -{ -hModulea = mmioOpenA((LPSTR)lpName, 0, 0x10000u); -if ( !hModulea ) -{ -if ( dword_1027BE4 ) -{ -_wsprintfA(aWavemixV23ByAn, "Failed to open wave file %s.", lpName); -MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u); -} -goto LABEL_29; -} -} -pmmcki.fccType = 1163280727; -if ( mmioDescend(hModulea, &pmmcki, 0, 0x20u) ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "This is not a WAVE file.", "WavMix32", 0x30u); -goto LABEL_29; -} -v28.ckid = 544501094; -if ( mmioDescend(hModulea, &v28, &pmmcki, 0x10u) ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "WAVE file is corrupted.", "WavMix32", 0x30u); -goto LABEL_29; -} -if ( mmioRead(hModulea, v8, 16) != 16 ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "Failed to read format chunk.", "WavMix32", 0x30u); -goto LABEL_29; -} -if ( *(WORD *)v8 != 1 ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "The file is not a PCM file.", "WavMix32", 0x30u); -goto LABEL_29; -} -mmioAscend(hModulea, &v28, 0); -v28.ckid = 1635017060; -if ( mmioDescend(hModulea, &v28, &pmmcki, 0x10u) ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "WAVE file has no data chunk.", "WavMix32", 0x30u); -goto LABEL_29; -} -cch = v28.cksize; -if ( !v28.cksize ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "The data chunk has no data.", "WavMix32", 0x30u); -goto LABEL_29; -} -v15 = GlobalAlloc(0x2002u, v28.cksize); -v16 = GlobalLock(v15); -v17 = v16; -v30 = v16; -if ( !v16 ) -{ -if ( dword_1027BE4 ) -MessageBoxA( -0, -"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", -"WavMix32", -0x40u); -goto LABEL_29; -} -v18 = mmioRead(hModulea, (HPSTR)v16, cch); -if ( v18 != cch ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "Failed to read data chunk.", "WavMix32", 0x30u); -goto LABEL_29; -} -v19 = WaveFormatConvert(hMem + 380, (int)v8, v17, (int)&cch); -v30 = v19; -if ( !v19 ) -{ -if ( dword_1027BE4 ) -MessageBoxA(0, "Failed to convert wave format.", "WavMix32", 0x30u); -goto LABEL_29; -} -mmioClose(hModulea, 0); -if ( hResData ) -FreeResource(hResData); -*((DWORD *)v8 + 5) = cch; -v20 = (const void *)(hMem + 380); -*((DWORD *)v8 + 4) = v19; -*((DWORD *)v8 + 8) = 0; -*((DWORD *)v8 + 9) = 0; -*((DWORD *)v8 + 7) = 0; -*((WORD *)v8 + 32) = 21554; -_memmove(v8, v20, 0x10u); -if ( HIWORD(lpName) ) -{ -v21 = lstrlenA(lpName); -if ( v21 > 15 ) -v22 = v21 - 15; -else -v22 = 0; -lstrcpyA(v8 + 48, &lpName[v22]); -} -else -{ -_wsprintfA(v8 + 48, "res#%u", (unsigned int)lpName); -} -return v8; + hResData = 0; + v30 = 0; + v4 = SessionToGlobalDataPtr(pMem); + pwfx.wFormatTag = v4[190]; + pwfx.nChannels = v4[191]; + pwfx.nSamplesPerSec = *((DWORD*)v4 + 96); + pwfx.nAvgBytesPerSec = *((DWORD*)v4 + 97); + v5 = v4[196]; + hMem = (LPARAM)v4; + pwfx.nBlockAlign = v5; + pwfx.wBitsPerSample = v4[197]; + pwfx.cbSize = 0; + if (waveOutOpen(&phwo, 0xFFFFFFFF, &pwfx, 0, 0, 1u)) + { + if (dword_1027BE4) + MessageBoxA(0, "The waveform device can't play this format.", "WavMix32", 0x30u); + return 0; + } + v7 = GlobalAlloc(0x2040u, 0x42u); + v8 = (CHAR*)GlobalLock(v7); + if (!v8) + { + if (dword_1027BE4) + MessageBoxA( + 0, + "Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", + "WavMix32", + 0x40u); + return 0; + } + if (cch & 2) + { + v9 = FindResourceA(hModule, lpName, "WAVE"); + v10 = v9; + if (!v9 || (hResData = LoadResource(hModule, v9)) == 0) + { + if (HIWORD(lpName)) + _wsprintfA(aWavemixV23ByAn, "Failed to open 'WAVE' resource '%s'.", lpName); + else + _wsprintfA(aWavemixV23ByAn, "Failed to open 'WAVE' resource %u.", (unsigned int)lpName); + if (dword_1027BE4) + MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u); + goto LABEL_31; + } + memset(&pmmioinfo, 0, sizeof(pmmioinfo)); + pmmioinfo.pchBuffer = (HPSTR)LockResource(hResData); + if (!pmmioinfo.pchBuffer) + { + if (dword_1027BE4) + MessageBoxA(0, "Failed to lock 'WAVE' resource", "WavMix32", 0x30u); + FreeResource(hResData); + hResData = 0; + LABEL_31: + v11 = GlobalHandle(v8); + GlobalUnlock(v11); + v12 = GlobalHandle(v8); + GlobalFree(v12); + if (v30) + { + v13 = GlobalHandle(v30); + GlobalUnlock(v13); + v14 = GlobalHandle(v30); + GlobalFree(v14); + } + if (hResData) + FreeResource(hResData); + return 0; + } + pmmioinfo.cchBuffer = SizeofResource(hModule, v10); + pmmioinfo.fccIOProc = 541934925; + pmmioinfo.adwInfo[0] = 0; + hModulea = mmioOpenA(0, &pmmioinfo, 0); + if (!hModulea) + { + if (!dword_1027BE4) + goto LABEL_29; + v24 = pmmioinfo.wErrorRet; + v23 = "Failed to open resource, mmioOpen error=%u.\nMay need to make sure resource is marked read-write"; + goto LABEL_28; + } + } + else if (cch & 4) + { + qmemcpy(&pmmioinfo, lpName, sizeof(pmmioinfo)); + hModulea = mmioOpenA(0, &pmmioinfo, 0); + if (!hModulea) + { + if (!dword_1027BE4) + goto LABEL_29; + v24 = pmmioinfo.wErrorRet; + v23 = "Failed to open memory file, mmioOpen error=%u.\nMay need to make sure memory is read-write"; + LABEL_28: + _wsprintfA(aWavemixV23ByAn, v23, v24); + MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u); + LABEL_29: + if (hModulea) + mmioClose(hModulea, 0); + goto LABEL_31; + } + } + else + { + hModulea = mmioOpenA((LPSTR)lpName, 0, 0x10000u); + if (!hModulea) + { + if (dword_1027BE4) + { + _wsprintfA(aWavemixV23ByAn, "Failed to open wave file %s.", lpName); + MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u); + } + goto LABEL_29; + } + } + pmmcki.fccType = 1163280727; + if (mmioDescend(hModulea, &pmmcki, 0, 0x20u)) + { + if (dword_1027BE4) + MessageBoxA(0, "This is not a WAVE file.", "WavMix32", 0x30u); + goto LABEL_29; + } + v28.ckid = 544501094; + if (mmioDescend(hModulea, &v28, &pmmcki, 0x10u)) + { + if (dword_1027BE4) + MessageBoxA(0, "WAVE file is corrupted.", "WavMix32", 0x30u); + goto LABEL_29; + } + if (mmioRead(hModulea, v8, 16) != 16) + { + if (dword_1027BE4) + MessageBoxA(0, "Failed to read format chunk.", "WavMix32", 0x30u); + goto LABEL_29; + } + if (*(WORD*)v8 != 1) + { + if (dword_1027BE4) + MessageBoxA(0, "The file is not a PCM file.", "WavMix32", 0x30u); + goto LABEL_29; + } + mmioAscend(hModulea, &v28, 0); + v28.ckid = 1635017060; + if (mmioDescend(hModulea, &v28, &pmmcki, 0x10u)) + { + if (dword_1027BE4) + MessageBoxA(0, "WAVE file has no data chunk.", "WavMix32", 0x30u); + goto LABEL_29; + } + cch = v28.cksize; + if (!v28.cksize) + { + if (dword_1027BE4) + MessageBoxA(0, "The data chunk has no data.", "WavMix32", 0x30u); + goto LABEL_29; + } + v15 = GlobalAlloc(0x2002u, v28.cksize); + v16 = GlobalLock(v15); + v17 = v16; + v30 = v16; + if (!v16) + { + if (dword_1027BE4) + MessageBoxA( + 0, + "Unable to allocate memory for waveform data. Try making more memory available by closing other applications.", + "WavMix32", + 0x40u); + goto LABEL_29; + } + v18 = mmioRead(hModulea, (HPSTR)v16, cch); + if (v18 != cch) + { + if (dword_1027BE4) + MessageBoxA(0, "Failed to read data chunk.", "WavMix32", 0x30u); + goto LABEL_29; + } + v19 = WaveFormatConvert(hMem + 380, (int)v8, v17, (int)& cch); + v30 = v19; + if (!v19) + { + if (dword_1027BE4) + MessageBoxA(0, "Failed to convert wave format.", "WavMix32", 0x30u); + goto LABEL_29; + } + mmioClose(hModulea, 0); + if (hResData) + FreeResource(hResData); + *((DWORD*)v8 + 5) = cch; + v20 = (const void*)(hMem + 380); + *((DWORD*)v8 + 4) = v19; + *((DWORD*)v8 + 8) = 0; + *((DWORD*)v8 + 9) = 0; + *((DWORD*)v8 + 7) = 0; + *((WORD*)v8 + 32) = 21554; + _memmove(v8, v20, 0x10u); + if (HIWORD(lpName)) + { + v21 = lstrlenA(lpName); + if (v21 > 15) + v22 = v21 - 15; + else + v22 = 0; + lstrcpyA(v8 + 48, &lpName[v22]); + } + else + { + _wsprintfA(v8 + 48, "res#%u", (unsigned int)lpName); + } + return v8; } // 1027BE4: using guessed type int dword_1027BE4; //----- (0101F093) -------------------------------------------------------- unsigned int FigureOutDMABufferSize(unsigned int a1, int a2) { -unsigned int result; // eax -signed int v3; // ecx + unsigned int result; // eax + signed int v3; // ecx -result = a1; -if ( !a1 ) -result = *(DWORD *)(a2 + 4) * *(unsigned int *)(a2 + 2) * ((unsigned int)*(unsigned int *)(a2 + 14) >> 3) >> 4; -v3 = 344; -if ( result < 0x158 || (v3 = 11025, result > 0x2B11) ) -result = v3; -return result; + result = a1; + if (!a1) + result = *(DWORD*)(a2 + 4) * *(unsigned int*)(a2 + 2) * ((unsigned int) * (unsigned int*)(a2 + 14) >> 3) >> 4; + v3 = 344; + if (result < 0x158 || (v3 = 11025, result > 0x2B11)) + result = v3; + return result; } //----- (0101F0D4) -------------------------------------------------------- int RemoveInvalidIniNameCharacters(LPCSTR lpString) { -CHAR *v1; // esi + CHAR* v1; // esi -v1 = (CHAR *)lpString; -if ( !lpString || !*lpString ) -return 0; -do -{ -if ( !_isalnum(*v1) && !_isspace(*v1) ) -break; -++v1; -} -while ( *v1 ); -do -*v1-- = 0; -while ( v1 >= lpString && _isspace(*v1) ); -return lstrlenA(lpString); + v1 = (CHAR*)lpString; + if (!lpString || !*lpString) + return 0; + do + { + if (!_isalnum(*v1) && !_isspace(*v1)) + break; + ++v1; + } while (*v1); + do + *v1-- = 0; + while (v1 >= lpString && _isspace(*v1)); + return lstrlenA(lpString); } //----- (0101F13D) -------------------------------------------------------- UINT ShowWaveOutDevices() { -UINT result; // eax -signed int v1; // [esp+0h] [ebp-40h] -signed int uDeviceID; // [esp+4h] [ebp-3Ch] -struct tagWAVEOUTCAPSA pwoc; // [esp+8h] [ebp-38h] + UINT result; // eax + signed int v1; // [esp+0h] [ebp-40h] + signed int uDeviceID; // [esp+4h] [ebp-3Ch] + struct tagWAVEOUTCAPSA pwoc; // [esp+8h] [ebp-38h] -result = waveOutGetNumDevs(); -v1 = result; -if ( result ) -{ -_wsprintfA(aWavemixV23ByAn, "%d waveOut Devices have been detected on your system.", result); -result = MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); -for ( uDeviceID = 0; uDeviceID < v1; result = uDeviceID ) -{ -if ( !waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u) && RemoveInvalidIniNameCharacters(pwoc.szPname) ) -_wsprintfA( -aWavemixV23ByAn, -"Device %i: %s\n\tVersion %u.%u", -uDeviceID, -pwoc.szPname, -BYTE1(pwoc.vDriverVersion), -LOBYTE(pwoc.vDriverVersion)); -else -_wsprintfA(aWavemixV23ByAn, "waveOutGetDevCaps failed (err %u) for device %d", 1, uDeviceID); -MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); -++uDeviceID; -} -} -return result; + result = waveOutGetNumDevs(); + v1 = result; + if (result) + { + _wsprintfA(aWavemixV23ByAn, "%d waveOut Devices have been detected on your system.", result); + result = MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); + for (uDeviceID = 0; uDeviceID < v1; result = uDeviceID) + { + if (!waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u) && RemoveInvalidIniNameCharacters(pwoc.szPname)) + _wsprintfA( + aWavemixV23ByAn, + "Device %i: %s\n\tVersion %u.%u", + uDeviceID, + pwoc.szPname, + BYTE1(pwoc.vDriverVersion), + LOBYTE(pwoc.vDriverVersion)); + else + _wsprintfA(aWavemixV23ByAn, "waveOutGetDevCaps failed (err %u) for device %d", 1, uDeviceID); + MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); + ++uDeviceID; + } + } + return result; } //----- (0101F20F) -------------------------------------------------------- -const char *GetOperatingSystemPrefix() +const char* GetOperatingSystemPrefix() { -const char *result; // eax -bool v1; // cf + const char* result; // eax + bool v1; // cf -if ( GetVersion() < 0x80000000 ) -return "WinNT:"; -if ( GetVersion() >= 0x80000000 && (unsigned __int8)GetVersion() >= 4u ) -return "Win95:"; -if ( GetVersion() < 0x80000000 || (v1 = (unsigned __int8)GetVersion() < 4u, result = "Win31:", !v1) ) -result = "OS_X:"; -return result; + if (GetVersion() < 0x80000000) + return "WinNT:"; + if (GetVersion() >= 0x80000000 && (unsigned __int8)GetVersion() >= 4u) + return "Win95:"; + if (GetVersion() < 0x80000000 || (v1 = (unsigned __int8)GetVersion() < 4u, result = "Win31:", !v1)) + result = "OS_X:"; + return result; } //----- (0101F25C) -------------------------------------------------------- int ReadRegistryToGetMachineSpecificInfSection(int a1, LPSTR lpString1, int a3) { -const char *v3; // eax -int v4; // esi -const char *v6; // eax -LONG cbData; // [esp+Ch] [ebp-44h] -int v8; // [esp+10h] [ebp-40h] -HKEY phkResult; // [esp+14h] [ebp-3Ch] -CHAR SubKey; // [esp+18h] [ebp-38h] + const char* v3; // eax + int v4; // esi + const char* v6; // eax + LONG cbData; // [esp+Ch] [ebp-44h] + int v8; // [esp+10h] [ebp-40h] + HKEY phkResult; // [esp+14h] [ebp-3Ch] + CHAR SubKey; // [esp+18h] [ebp-38h] -v8 = 0; -v3 = GetOperatingSystemPrefix(); -v4 = lstrlenA(v3); -if ( a3 < v4 + 10 ) -return 0; -_wsprintfA(&SubKey, "Device%u", a1); -if ( RegOpenKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\WaveMix", &phkResult) ) -return 0; -v6 = GetOperatingSystemPrefix(); -lstrcpyA(lpString1, v6); -cbData = a3 - v4; -if ( !RegQueryValueA(phkResult, &SubKey, &lpString1[v4], &cbData) && cbData > 0 ) -v8 = 1; -RegCloseKey(phkResult); -return v8; + v8 = 0; + v3 = GetOperatingSystemPrefix(); + v4 = lstrlenA(v3); + if (a3 < v4 + 10) + return 0; + _wsprintfA(&SubKey, "Device%u", a1); + if (RegOpenKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\WaveMix", &phkResult)) + return 0; + v6 = GetOperatingSystemPrefix(); + lstrcpyA(lpString1, v6); + cbData = a3 - v4; + if (!RegQueryValueA(phkResult, &SubKey, &lpString1[v4], &cbData) && cbData > 0) + v8 = 1; + RegCloseKey(phkResult); + return v8; } //----- (0101F315) -------------------------------------------------------- int ReadRegistryInt(HKEY hKey, LPCSTR lpSubKey, int a3) { -int result; // eax -LONG cbData; // [esp+0h] [ebp-14h] -CHAR Data; // [esp+4h] [ebp-10h] + int result; // eax + LONG cbData; // [esp+0h] [ebp-14h] + CHAR Data; // [esp+4h] [ebp-10h] -if ( !hKey || (cbData = 10, RegQueryValueA(hKey, lpSubKey, &Data, &cbData)) ) -result = a3; -else -result = _atol(&Data); -return result; + if (!hKey || (cbData = 10, RegQueryValueA(hKey, lpSubKey, &Data, &cbData))) + result = a3; + else + result = _atol(&Data); + return result; } //----- (0101F36B) -------------------------------------------------------- signed int ReadRegistryForAppSpecificConfigs(int a1) { -int v1; // ebx -int v3; // eax -int v4; // eax -struct tagWAVEOUTCAPSA *v5; // ST04_4 -UINT_PTR v6; // ST00_4 -HKEY phkResult; // [esp+8h] [ebp-3Ch] -CHAR SubKey; // [esp+Ch] [ebp-38h] + int v1; // ebx + int v3; // eax + int v4; // eax + struct tagWAVEOUTCAPSA* v5; // ST04_4 + UINT_PTR v6; // ST00_4 + HKEY phkResult; // [esp+8h] [ebp-3Ch] + CHAR SubKey; // [esp+Ch] [ebp-38h] -v1 = *(DWORD *)(a1 + 2); -if ( !(v1 & 0x400) || !*(DWORD *)(a1 + 26) ) -return 0; -if ( (v1 & 0x80u) == 0 ) -{ -*(WORD *)(a1 + 20) = *(WORD *)(hMem + 24); -} -else if ( *(unsigned int *)(a1 + 20) >= waveOutGetNumDevs() ) -{ -*(WORD *)(a1 + 20) = 0; -} -_wsprintfA(&SubKey, "WaveMix\\Device%u", *(unsigned int *)(a1 + 20)); -if ( RegOpenKeyA(*(HKEY *)(a1 + 26), &SubKey, &phkResult) ) -return 0; -if ( !(v1 & 1) ) -*(WORD *)(a1 + 6) = ReadRegistryInt(phkResult, "Channels", 1); -if ( !(v1 & 2) ) -*(WORD *)(a1 + 8) = ReadRegistryInt(phkResult, "SamplesPerSec", 11); -if ( !(v1 & 4) ) -*(WORD *)(a1 + 10) = ReadRegistryInt(phkResult, "WaveBlocks", 3); -if ( !(v1 & 8) ) -*(WORD *)(a1 + 12) = ReadRegistryInt(phkResult, "WaveBlockLen", 0); -*(WORD *)(a1 + 14) = 1; -if ( !(v1 & 0x20) ) -*(WORD *)(a1 + 16) = (unsigned int)ReadRegistryInt(phkResult, "Remix", 1) != 2; -if ( !(v1 & 0x40) ) -{ -v3 = DefaultGoodWavePos(*(unsigned int *)(a1 + 20)); -*(WORD *)(a1 + 18) = (unsigned int)ReadRegistryInt(phkResult, "GoodWavePos", v3) != 0; -} -if ( !(v1 & 0x100) ) -*(WORD *)(a1 + 24) = ReadRegistryInt(phkResult, "ShowDebugDialogs", 0); -if ( !(v1 & 0x200) ) -{ -v4 = DefaultPauseBlocks(*(unsigned int *)(a1 + 10)); -*(WORD *)(a1 + 22) = ReadRegistryInt(phkResult, "PauseBlocks", v4); -} -v5 = (struct tagWAVEOUTCAPSA *)(hMem + 124); -v6 = *(unsigned int *)(a1 + 20); -*(DWORD *)(a1 + 2) = 1023; -waveOutGetDevCapsA(v6, v5, 0x34u); -RegCloseKey(phkResult); -return 1; + v1 = *(DWORD*)(a1 + 2); + if (!(v1 & 0x400) || !*(DWORD*)(a1 + 26)) + return 0; + if ((v1 & 0x80u) == 0) + { + *(WORD*)(a1 + 20) = *(WORD*)(hMem + 24); + } + else if (*(unsigned int*)(a1 + 20) >= waveOutGetNumDevs()) + { + *(WORD*)(a1 + 20) = 0; + } + _wsprintfA(&SubKey, "WaveMix\\Device%u", *(unsigned int*)(a1 + 20)); + if (RegOpenKeyA(*(HKEY*)(a1 + 26), &SubKey, &phkResult)) + return 0; + if (!(v1 & 1)) + * (WORD*)(a1 + 6) = ReadRegistryInt(phkResult, "Channels", 1); + if (!(v1 & 2)) + * (WORD*)(a1 + 8) = ReadRegistryInt(phkResult, "SamplesPerSec", 11); + if (!(v1 & 4)) + * (WORD*)(a1 + 10) = ReadRegistryInt(phkResult, "WaveBlocks", 3); + if (!(v1 & 8)) + * (WORD*)(a1 + 12) = ReadRegistryInt(phkResult, "WaveBlockLen", 0); + *(WORD*)(a1 + 14) = 1; + if (!(v1 & 0x20)) + * (WORD*)(a1 + 16) = (unsigned int)ReadRegistryInt(phkResult, "Remix", 1) != 2; + if (!(v1 & 0x40)) + { + v3 = DefaultGoodWavePos(*(unsigned int*)(a1 + 20)); + *(WORD*)(a1 + 18) = (unsigned int)ReadRegistryInt(phkResult, "GoodWavePos", v3) != 0; + } + if (!(v1 & 0x100)) + * (WORD*)(a1 + 24) = ReadRegistryInt(phkResult, "ShowDebugDialogs", 0); + if (!(v1 & 0x200)) + { + v4 = DefaultPauseBlocks(*(unsigned int*)(a1 + 10)); + *(WORD*)(a1 + 22) = ReadRegistryInt(phkResult, "PauseBlocks", v4); + } + v5 = (struct tagWAVEOUTCAPSA*)(hMem + 124); + v6 = *(unsigned int*)(a1 + 20); + *(DWORD*)(a1 + 2) = 1023; + waveOutGetDevCapsA(v6, v5, 0x34u); + RegCloseKey(phkResult); + return 1; } //----- (0101F50B) -------------------------------------------------------- int ShowCurrentSettings() { -const char *v0; // esi -const char *v1; // edx -const char *v2; // ecx -struct tagWAVEOUTCAPSA pwoc; // [esp+0h] [ebp-38h] + const char* v0; // esi + const char* v1; // edx + const char* v2; // ecx + struct tagWAVEOUTCAPSA pwoc; // [esp+0h] [ebp-38h] -if ( waveOutGetDevCapsA(*(DWORD *)(hMem + 24), &pwoc, 0x34u) || !RemoveInvalidIniNameCharacters(pwoc.szPname) ) -lstrcpyA(pwoc.szPname, "Unknown Device"); -v0 = "cmixit"; -if ( *(int (**)(_BYTE *, char *, char *, int, unsigned int))(hMem + 428) != cmixit ) -v0 = "386 mixit"; -v1 = "TRUE"; -if ( !*(DWORD *)(hMem + 420) ) -v1 = "FALSE"; -v2 = "Reset"; -if ( *(signed int (**)(int, int))(hMem + 432) != ResetRemix ) -v2 = "NoReset"; -_wsprintfA( -aWavemixV23ByAn, -"Using:\t%s.\n" -"\tRemix = %s\n" -"\tGoodGetPos=%s\n" -"\t%d ping pong wave blocks\n" -"\tWave block len = %lu bytes\n" -"\tpfnMixit=%s\n" -"\tSamplesPerSec=%lu,\n" -"\tChannels=%d\n" -"\tPauseBlocks=%d", -pwoc.szPname, -v2, -v1, -*(DWORD *)(hMem + 400), -*(DWORD *)(hMem + 396), -v0, -*(DWORD *)(hMem + 384), -*(unsigned int *)(hMem + 382), -*(DWORD *)(hMem + 404)); -return MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); + if (waveOutGetDevCapsA(*(DWORD*)(hMem + 24), &pwoc, 0x34u) || !RemoveInvalidIniNameCharacters(pwoc.szPname)) + lstrcpyA(pwoc.szPname, "Unknown Device"); + v0 = "cmixit"; + if (*(int (**)(_BYTE*, char*, char*, int, unsigned int))(hMem + 428) != cmixit) + v0 = "386 mixit"; + v1 = "TRUE"; + if (!*(DWORD*)(hMem + 420)) + v1 = "FALSE"; + v2 = "Reset"; + if (*(signed int (**)(int, int))(hMem + 432) != ResetRemix) + v2 = "NoReset"; + _wsprintfA( + aWavemixV23ByAn, + "Using:\t%s.\n" + "\tRemix = %s\n" + "\tGoodGetPos=%s\n" + "\t%d ping pong wave blocks\n" + "\tWave block len = %lu bytes\n" + "\tpfnMixit=%s\n" + "\tSamplesPerSec=%lu,\n" + "\tChannels=%d\n" + "\tPauseBlocks=%d", + pwoc.szPname, + v2, + v1, + *(DWORD*)(hMem + 400), + *(DWORD*)(hMem + 396), + v0, + *(DWORD*)(hMem + 384), + *(unsigned int*)(hMem + 382), + *(DWORD*)(hMem + 404)); + return MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); } //----- (0101F5F1) -------------------------------------------------------- int Settings_OnInitDialog(HWND hWnd, int a2, int a3) { -BOOL v3; // ST0C_4 -HWND v4; // eax -BOOL v5; // ST0C_4 -HWND v6; // eax -BOOL v7; // ST0C_4 -HWND v8; // eax -BOOL v9; // ST0C_4 -HWND v10; // eax -BOOL v11; // ST0C_4 -HWND v12; // eax -HWND v13; // eax -HWND v14; // eax -HWND v15; // eax -HWND v16; // eax -HWND v17; // eax -HWND v18; // eax -HWND v19; // eax -HWND v20; // eax -HWND v21; // eax -HWND v22; // eax -HWND v23; // eax -HWND v24; // eax -HWND v25; // eax -HWND v26; // eax -HWND v27; // eax -HWND v28; // eax -HWND v29; // eax -MMRESULT v30; // eax -HWND v31; // eax -WPARAM v32; // ST0C_4 -HWND v33; // eax -signed int v35; // [esp+Ch] [ebp-148h] -signed int uDeviceID; // [esp+10h] [ebp-144h] -struct tagWAVEOUTCAPSA pwoc; // [esp+1Ch] [ebp-138h] -CHAR String; // [esp+50h] [ebp-104h] + BOOL v3; // ST0C_4 + HWND v4; // eax + BOOL v5; // ST0C_4 + HWND v6; // eax + BOOL v7; // ST0C_4 + HWND v8; // eax + BOOL v9; // ST0C_4 + HWND v10; // eax + BOOL v11; // ST0C_4 + HWND v12; // eax + HWND v13; // eax + HWND v14; // eax + HWND v15; // eax + HWND v16; // eax + HWND v17; // eax + HWND v18; // eax + HWND v19; // eax + HWND v20; // eax + HWND v21; // eax + HWND v22; // eax + HWND v23; // eax + HWND v24; // eax + HWND v25; // eax + HWND v26; // eax + HWND v27; // eax + HWND v28; // eax + HWND v29; // eax + MMRESULT v30; // eax + HWND v31; // eax + WPARAM v32; // ST0C_4 + HWND v33; // eax + signed int v35; // [esp+Ch] [ebp-148h] + signed int uDeviceID; // [esp+10h] [ebp-144h] + struct tagWAVEOUTCAPSA pwoc; // [esp+1Ch] [ebp-138h] + CHAR String; // [esp+50h] [ebp-104h] -GetWindowTextA(hWnd, &String, 256); -_wsprintfA(aWavemixV23ByAn, &String, 2, 81); -SetWindowTextA(hWnd, aWavemixV23ByAn); -SetWindowLongA(hWnd, -21, a3); -v3 = *(WORD *)(a3 + 6) > 1u; -v4 = GetDlgItem(hWnd, 1000); -SendMessageA(v4, 0xF1u, v3, 0); -v5 = *(WORD *)(a3 + 16) != 0; -v6 = GetDlgItem(hWnd, 1001); -SendMessageA(v6, 0xF1u, v5, 0); -v7 = *(WORD *)(a3 + 18) != 0; -v8 = GetDlgItem(hWnd, 1004); -SendMessageA(v8, 0xF1u, v7, 0); -v9 = *(WORD *)(a3 + 14) != 0; -v10 = GetDlgItem(hWnd, 1005); -SendMessageA(v10, 0xF1u, v9, 0); -v11 = *(WORD *)(a3 + 24) != 0; -v12 = GetDlgItem(hWnd, 1010); -SendMessageA(v12, 0xF1u, v11, 0); -v13 = GetDlgItem(hWnd, 1005); -EnableWindow(v13, 0); -v14 = GetDlgItem(hWnd, 1003); -SendMessageA(v14, 0xC5u, 2u, 0); -v15 = GetDlgItem(hWnd, 1007); -SendMessageA(v15, 0xC5u, 4u, 0); -v16 = GetDlgItem(hWnd, 1008); -SendMessageA(v16, 0xC5u, 2u, 0); -v17 = GetDlgItem(hWnd, 1011); -SendMessageA(v17, 0xC5u, 2u, 0); -v18 = GetDlgItem(hWnd, 1012); -GetWindowTextA(v18, &String, 100); -_wsprintfA(aWavemixV23ByAn, &String, 2, 10); -v19 = GetDlgItem(hWnd, 1012); -SetWindowTextA(v19, aWavemixV23ByAn); -v20 = GetDlgItem(hWnd, 1013); -GetWindowTextA(v20, &String, 100); -_wsprintfA(aWavemixV23ByAn, &String, 344, 11025); -v21 = GetDlgItem(hWnd, 1013); -SetWindowTextA(v21, aWavemixV23ByAn); -v22 = GetDlgItem(hWnd, 1014); -GetWindowTextA(v22, &String, 100); -_wsprintfA(aWavemixV23ByAn, &String, 0, 10); -v23 = GetDlgItem(hWnd, 1014); -SetWindowTextA(v23, aWavemixV23ByAn); -v24 = GetDlgItem(hWnd, 1015); -GetWindowTextA(v24, &String, 100); -_wsprintfA(aWavemixV23ByAn, &String, 16); -v25 = GetDlgItem(hWnd, 1015); -SetWindowTextA(v25, aWavemixV23ByAn); -_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int *)(a3 + 10)); -v26 = GetDlgItem(hWnd, 1003); -SetWindowTextA(v26, aWavemixV23ByAn); -_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int *)(a3 + 12)); -v27 = GetDlgItem(hWnd, 1007); -SetWindowTextA(v27, aWavemixV23ByAn); -_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int *)(a3 + 8)); -v28 = GetDlgItem(hWnd, 1008); -SetWindowTextA(v28, aWavemixV23ByAn); -_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int *)(a3 + 22)); -v29 = GetDlgItem(hWnd, 1011); -SetWindowTextA(v29, aWavemixV23ByAn); -uDeviceID = 0; -v35 = waveOutGetNumDevs(); -if ( v35 > 0 ) -{ -do -{ -v30 = waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u); -if ( v30 ) -{ -_wsprintfA(aWavemixV23ByAn, "waveOutGetDevCaps failed (err %u) for device %d", v30, uDeviceID); -MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); -} -else -{ -_wsprintfA(aWavemixV23ByAn, "%d: %s", uDeviceID, pwoc.szPname); -v31 = GetDlgItem(hWnd, 1009); -SendMessageA(v31, 0x143u, 0, (LPARAM)aWavemixV23ByAn); -} -++uDeviceID; -} -while ( uDeviceID < v35 ); -} -v32 = *(unsigned int *)(a3 + 20); -v33 = GetDlgItem(hWnd, 1009); -SendMessageA(v33, 0x14Eu, v32, 0); -return 1; + GetWindowTextA(hWnd, &String, 256); + _wsprintfA(aWavemixV23ByAn, &String, 2, 81); + SetWindowTextA(hWnd, aWavemixV23ByAn); + SetWindowLongA(hWnd, -21, a3); + v3 = *(WORD*)(a3 + 6) > 1u; + v4 = GetDlgItem(hWnd, 1000); + SendMessageA(v4, 0xF1u, v3, 0); + v5 = *(WORD*)(a3 + 16) != 0; + v6 = GetDlgItem(hWnd, 1001); + SendMessageA(v6, 0xF1u, v5, 0); + v7 = *(WORD*)(a3 + 18) != 0; + v8 = GetDlgItem(hWnd, 1004); + SendMessageA(v8, 0xF1u, v7, 0); + v9 = *(WORD*)(a3 + 14) != 0; + v10 = GetDlgItem(hWnd, 1005); + SendMessageA(v10, 0xF1u, v9, 0); + v11 = *(WORD*)(a3 + 24) != 0; + v12 = GetDlgItem(hWnd, 1010); + SendMessageA(v12, 0xF1u, v11, 0); + v13 = GetDlgItem(hWnd, 1005); + EnableWindow(v13, 0); + v14 = GetDlgItem(hWnd, 1003); + SendMessageA(v14, 0xC5u, 2u, 0); + v15 = GetDlgItem(hWnd, 1007); + SendMessageA(v15, 0xC5u, 4u, 0); + v16 = GetDlgItem(hWnd, 1008); + SendMessageA(v16, 0xC5u, 2u, 0); + v17 = GetDlgItem(hWnd, 1011); + SendMessageA(v17, 0xC5u, 2u, 0); + v18 = GetDlgItem(hWnd, 1012); + GetWindowTextA(v18, &String, 100); + _wsprintfA(aWavemixV23ByAn, &String, 2, 10); + v19 = GetDlgItem(hWnd, 1012); + SetWindowTextA(v19, aWavemixV23ByAn); + v20 = GetDlgItem(hWnd, 1013); + GetWindowTextA(v20, &String, 100); + _wsprintfA(aWavemixV23ByAn, &String, 344, 11025); + v21 = GetDlgItem(hWnd, 1013); + SetWindowTextA(v21, aWavemixV23ByAn); + v22 = GetDlgItem(hWnd, 1014); + GetWindowTextA(v22, &String, 100); + _wsprintfA(aWavemixV23ByAn, &String, 0, 10); + v23 = GetDlgItem(hWnd, 1014); + SetWindowTextA(v23, aWavemixV23ByAn); + v24 = GetDlgItem(hWnd, 1015); + GetWindowTextA(v24, &String, 100); + _wsprintfA(aWavemixV23ByAn, &String, 16); + v25 = GetDlgItem(hWnd, 1015); + SetWindowTextA(v25, aWavemixV23ByAn); + _wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(a3 + 10)); + v26 = GetDlgItem(hWnd, 1003); + SetWindowTextA(v26, aWavemixV23ByAn); + _wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(a3 + 12)); + v27 = GetDlgItem(hWnd, 1007); + SetWindowTextA(v27, aWavemixV23ByAn); + _wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(a3 + 8)); + v28 = GetDlgItem(hWnd, 1008); + SetWindowTextA(v28, aWavemixV23ByAn); + _wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(a3 + 22)); + v29 = GetDlgItem(hWnd, 1011); + SetWindowTextA(v29, aWavemixV23ByAn); + uDeviceID = 0; + v35 = waveOutGetNumDevs(); + if (v35 > 0) + { + do + { + v30 = waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u); + if (v30) + { + _wsprintfA(aWavemixV23ByAn, "waveOutGetDevCaps failed (err %u) for device %d", v30, uDeviceID); + MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); + } + else + { + _wsprintfA(aWavemixV23ByAn, "%d: %s", uDeviceID, pwoc.szPname); + v31 = GetDlgItem(hWnd, 1009); + SendMessageA(v31, 0x143u, 0, (LPARAM)aWavemixV23ByAn); + } + ++uDeviceID; + } while (uDeviceID < v35); + } + v32 = *(unsigned int*)(a3 + 20); + v33 = GetDlgItem(hWnd, 1009); + SendMessageA(v33, 0x14Eu, v32, 0); + return 1; } //----- (0101FA63) -------------------------------------------------------- int Settings_OnCommand(HWND hWnd, int a2, int a3, int a4) { -WORD *v4; // ebx -HWND v6; // eax -HWND v7; // eax -HWND v8; // eax -HWND v9; // eax -HWND v10; // eax -HWND v11; // eax -HWND v12; // eax -HWND v13; // eax -HWND v14; // eax -HWND v15; // eax -int v16; // ax + WORD* v4; // ebx + HWND v6; // eax + HWND v7; // eax + HWND v8; // eax + HWND v9; // eax + HWND v10; // eax + HWND v11; // eax + HWND v12; // eax + HWND v13; // eax + HWND v14; // eax + HWND v15; // eax + int v16; // ax -v4 = (WORD *)GetWindowLongA(hWnd, -21); -if ( a2 == 1 ) -{ -if ( v4 ) -{ -v6 = GetDlgItem(hWnd, 1000); -v4[3] = (SendMessageA(v6, 0xF0u, 0, 0) != 0) + 1; -v7 = GetDlgItem(hWnd, 1001); -v4[8] = SendMessageA(v7, 0xF0u, 0, 0) != 0; -v8 = GetDlgItem(hWnd, 1004); -v4[9] = SendMessageA(v8, 0xF0u, 0, 0) != 0; -v9 = GetDlgItem(hWnd, 1010); -v4[12] = SendMessageA(v9, 0xF0u, 0, 0) != 0; -v10 = GetDlgItem(hWnd, 1005); -v4[7] = SendMessageA(v10, 0xF0u, 0, 0) != 0; -v11 = GetDlgItem(hWnd, 1003); -GetWindowTextA(v11, aWavemixV23ByAn, 10); -v4[5] = _atoi(aWavemixV23ByAn); -v12 = GetDlgItem(hWnd, 1007); -GetWindowTextA(v12, aWavemixV23ByAn, 10); -v4[6] = _atoi(aWavemixV23ByAn); -v13 = GetDlgItem(hWnd, 1008); -GetWindowTextA(v13, aWavemixV23ByAn, 10); -v4[4] = _atoi(aWavemixV23ByAn); -v14 = GetDlgItem(hWnd, 1011); -GetWindowTextA(v14, aWavemixV23ByAn, 10); -v4[11] = _atoi(aWavemixV23ByAn); -v15 = GetDlgItem(hWnd, 1009); -GetWindowTextA(v15, aWavemixV23ByAn, 10); -if ( _isdigit(aWavemixV23ByAn[0]) ) -v16 = _atoi(aWavemixV23ByAn); -else -v16 = 0; -v4[10] = v16; -EndDialog(hWnd, 1); -} -} -else -{ -if ( a2 != 2 ) -return 0; -EndDialog(hWnd, 0); -} -return 1; + v4 = (WORD*)GetWindowLongA(hWnd, -21); + if (a2 == 1) + { + if (v4) + { + v6 = GetDlgItem(hWnd, 1000); + v4[3] = (SendMessageA(v6, 0xF0u, 0, 0) != 0) + 1; + v7 = GetDlgItem(hWnd, 1001); + v4[8] = SendMessageA(v7, 0xF0u, 0, 0) != 0; + v8 = GetDlgItem(hWnd, 1004); + v4[9] = SendMessageA(v8, 0xF0u, 0, 0) != 0; + v9 = GetDlgItem(hWnd, 1010); + v4[12] = SendMessageA(v9, 0xF0u, 0, 0) != 0; + v10 = GetDlgItem(hWnd, 1005); + v4[7] = SendMessageA(v10, 0xF0u, 0, 0) != 0; + v11 = GetDlgItem(hWnd, 1003); + GetWindowTextA(v11, aWavemixV23ByAn, 10); + v4[5] = _atoi(aWavemixV23ByAn); + v12 = GetDlgItem(hWnd, 1007); + GetWindowTextA(v12, aWavemixV23ByAn, 10); + v4[6] = _atoi(aWavemixV23ByAn); + v13 = GetDlgItem(hWnd, 1008); + GetWindowTextA(v13, aWavemixV23ByAn, 10); + v4[4] = _atoi(aWavemixV23ByAn); + v14 = GetDlgItem(hWnd, 1011); + GetWindowTextA(v14, aWavemixV23ByAn, 10); + v4[11] = _atoi(aWavemixV23ByAn); + v15 = GetDlgItem(hWnd, 1009); + GetWindowTextA(v15, aWavemixV23ByAn, 10); + if (_isdigit(aWavemixV23ByAn[0])) + v16 = _atoi(aWavemixV23ByAn); + else + v16 = 0; + v4[10] = v16; + EndDialog(hWnd, 1); + } + } + else + { + if (a2 != 2) + return 0; + EndDialog(hWnd, 0); + } + return 1; } //----- (0101FC24) -------------------------------------------------------- BOOL SettingsDlgProc(HWND hWnd, UINT a2, WPARAM a3, LPARAM a4) { -if ( a2 == 272 ) -return Settings_OnInitDialog(hWnd, a3, a4); -if ( a2 != 273 ) -return 0; -Settings_OnCommand(hWnd, (unsigned int)a3, a4, a3 >> 16); -return 1; + if (a2 == 272) + return Settings_OnInitDialog(hWnd, a3, a4); + if (a2 != 273) + return 0; + Settings_OnCommand(hWnd, (unsigned int)a3, a4, a3 >> 16); + return 1; } //----- (0101FC6D) -------------------------------------------------------- -DWORD *MakeDlgTemplate(int a1, int a2, int a3, int a4, int a5, int a6, wchar_t *Str) +DWORD* MakeDlgTemplate(int a1, int a2, int a3, int a4, int a5, int a6, wchar_t* Str) { -size_t v7; // eax -HGLOBAL v8; // eax -DWORD *v9; // ebx + size_t v7; // eax + HGLOBAL v8; // eax + DWORD* v9; // ebx -v7 = 2 * _wcslen(Str) + 24; -*(DWORD *)a1 = v7; -if ( v7 & 3 ) -*(DWORD *)a1 = v7 - (v7 & 3) + 4; -v8 = GlobalAlloc(0x42u, *(DWORD *)a1); -v9 = GlobalLock(v8); -if ( v9 ) -{ -v9[1] = 0; -*((WORD *)v9 + 4) = 0; -*v9 = a2 | 0x10000000; -*((WORD *)v9 + 5) = a3; -*((WORD *)v9 + 6) = a4; -*((WORD *)v9 + 7) = a5; -*((WORD *)v9 + 8) = a6; -qmemcpy((char *)v9 + 22, Str, 2 * _wcslen(Str) + 2); -} -return v9; + v7 = 2 * _wcslen(Str) + 24; + *(DWORD*)a1 = v7; + if (v7 & 3) + * (DWORD*)a1 = v7 - (v7 & 3) + 4; + v8 = GlobalAlloc(0x42u, *(DWORD*)a1); + v9 = GlobalLock(v8); + if (v9) + { + v9[1] = 0; + *((WORD*)v9 + 4) = 0; + *v9 = a2 | 0x10000000; + *((WORD*)v9 + 5) = a3; + *((WORD*)v9 + 6) = a4; + *((WORD*)v9 + 7) = a5; + *((WORD*)v9 + 8) = a6; + qmemcpy((char*)v9 + 22, Str, 2 * _wcslen(Str) + 2); + } + return v9; } //----- (0101FD0E) -------------------------------------------------------- -WORD *AddDlgControl(int a1, LPCVOID pMem, int a3, int a4, int a5, int a6, int a7, int a8, int a9, wchar_t *Str) +WORD* AddDlgControl(int a1, LPCVOID pMem, int a3, int a4, int a5, int a6, int a7, int a8, int a9, wchar_t* Str) { -const void *v10; // edi -HGLOBAL v11; // eax -SIZE_T v12; // ST04_4 -HGLOBAL v13; // eax -HGLOBAL v14; // eax -int v15; // eax -char *pMema; // [esp+10h] [ebp+Ch] + const void* v10; // edi + HGLOBAL v11; // eax + SIZE_T v12; // ST04_4 + HGLOBAL v13; // eax + HGLOBAL v14; // eax + int v15; // eax + char* pMema; // [esp+10h] [ebp+Ch] -v10 = pMem; -if ( pMem ) -{ -pMema = *(char **)a1; -*(DWORD *)a1 += 2 * _wcslen(Str) + 25; -if ( *(DWORD *)a1 & 3 ) -*(DWORD *)a1 = *(DWORD *)a1 - (*(DWORD *)a1 & 3) + 4; -v11 = GlobalHandle(v10); -GlobalUnlock(v11); -v12 = *(DWORD *)a1; -v13 = GlobalHandle(v10); -v14 = GlobalReAlloc(v13, v12, 0x42u); -v10 = GlobalLock(v14); -if ( v10 ) -{ -v15 = (int)&pMema[(DWORD)v10]; -*(DWORD *)(v15 + 4) = 0; -*(DWORD *)v15 = a4 | 0x50000000; -*(WORD *)(v15 + 8) = a6; -*(WORD *)(v15 + 10) = a7; -*(WORD *)(v15 + 12) = a8; -*(WORD *)(v15 + 14) = a9; -*(WORD *)(v15 + 16) = a5; -*(DWORD *)(v15 + 18) = ((unsigned int)a3 << 16) | 0xFFFF; -_wcscpy((wchar_t *)&pMema[(DWORD)v10 + 22], Str); -++*((WORD *)v10 + 4); -} -} -return v10; + v10 = pMem; + if (pMem) + { + pMema = *(char**)a1; + *(DWORD*)a1 += 2 * _wcslen(Str) + 25; + if (*(DWORD*)a1 & 3) + * (DWORD*)a1 = *(DWORD*)a1 - (*(DWORD*)a1 & 3) + 4; + v11 = GlobalHandle(v10); + GlobalUnlock(v11); + v12 = *(DWORD*)a1; + v13 = GlobalHandle(v10); + v14 = GlobalReAlloc(v13, v12, 0x42u); + v10 = GlobalLock(v14); + if (v10) + { + v15 = (int)& pMema[(DWORD)v10]; + *(DWORD*)(v15 + 4) = 0; + *(DWORD*)v15 = a4 | 0x50000000; + *(WORD*)(v15 + 8) = a6; + *(WORD*)(v15 + 10) = a7; + *(WORD*)(v15 + 12) = a8; + *(WORD*)(v15 + 14) = a9; + *(WORD*)(v15 + 16) = a5; + *(DWORD*)(v15 + 18) = ((unsigned int)a3 << 16) | 0xFFFF; + _wcscpy((wchar_t*)& pMema[(DWORD)v10 + 22], Str); + ++* ((WORD*)v10 + 4); + } + } + return v10; } //----- (0101FDE1) -------------------------------------------------------- -WORD *MakeSettingsDlgTemplate() +WORD* MakeSettingsDlgTemplate() { -DWORD *v0; // eax -WORD *v1; // eax -WORD *v2; // eax -WORD *v3; // eax -WORD *v4; // eax -WORD *v5; // eax -WORD *v6; // eax -WORD *v7; // eax -WORD *v8; // eax -WORD *v9; // eax -WORD *v10; // eax -WORD *v11; // eax -WORD *v12; // eax -WORD *v13; // eax -WORD *v14; // eax -WORD *v15; // eax -WORD *v16; // eax -WORD *v17; // eax -int v19; // [esp+Ch] [ebp-4h] + DWORD* v0; // eax + WORD* v1; // eax + WORD* v2; // eax + WORD* v3; // eax + WORD* v4; // eax + WORD* v5; // eax + WORD* v6; // eax + WORD* v7; // eax + WORD* v8; // eax + WORD* v9; // eax + WORD* v10; // eax + WORD* v11; // eax + WORD* v12; // eax + WORD* v13; // eax + WORD* v14; // eax + WORD* v15; // eax + WORD* v16; // eax + WORD* v17; // eax + int v19; // [esp+Ch] [ebp-4h] -v19 = 0; -v0 = MakeDlgTemplate((int)&v19, -2134376320, 0, 0, 212, 132, L"WavMix32 Settings (Ver %X.%X Static)"); -v1 = AddDlgControl((int)&v19, v0, 128, 65537, 1, 155, 5, 50, 14, L"&Ok"); -v2 = AddDlgControl((int)&v19, v1, 128, 0x10000, 2, 155, 25, 50, 14, L"&Cancel"); -v3 = AddDlgControl((int)&v19, v2, 130, 0, 1012, 5, 5, 115, 8, L"Number of WaveBlocks (%d-%d):"); -v4 = AddDlgControl((int)&v19, v3, 130, 0, 1013, 5, 20, 115, 8, L"Size of WaveBlocks (%d-%d):"); -v5 = AddDlgControl((int)&v19, v4, 130, 0, 0xFFFF, 5, 35, 102, 8, L"Playback Frequency (11,22,44):"); -v6 = AddDlgControl((int)&v19, v5, 130, 0, 0xFFFF, 5, 80, 57, 8, L"Playback Device:"); -v7 = AddDlgControl((int)&v19, v6, 130, 0, 1014, 5, 50, 115, 8, L"Number of Pause Blocks (%d-%d):"); -v8 = AddDlgControl((int)&v19, v7, 130, 0, 1015, 5, 65, 63, 8, L"Max Channels = %d"); -v9 = AddDlgControl((int)&v19, v8, 129, 8454272, 1003, 125, 5, 25, 12, L"-1"); -v10 = AddDlgControl((int)&v19, v9, 129, 8454272, 1007, 125, 20, 25, 12, L"-1"); -v11 = AddDlgControl((int)&v19, v10, 129, 8454272, 1008, 125, 35, 25, 12, L"-1"); -v12 = AddDlgControl((int)&v19, v11, 129, 8454272, 1011, 125, 50, 25, 12, L"-1"); -v13 = AddDlgControl((int)&v19, v12, 133, 2162946, 1009, 65, 80, 140, 60, L"No Devices"); -v14 = AddDlgControl((int)&v19, v13, 128, 65539, 1000, 5, 101, 40, 10, L"Stereo"); -v15 = AddDlgControl((int)&v19, v14, 128, 65539, 1001, 55, 101, 60, 10, L"Reset Remix"); -v16 = AddDlgControl((int)&v19, v15, 128, 65539, 1010, 125, 101, 78, 10, L"Show Debug Dialogs"); -v17 = AddDlgControl((int)&v19, v16, 128, 65539, 1005, 5, 117, 40, 10, L"CMixit"); -return AddDlgControl((int)&v19, v17, 128, 65539, 1004, 55, 117, 75, 10, L"Good Get Position"); + v19 = 0; + v0 = MakeDlgTemplate((int)& v19, -2134376320, 0, 0, 212, 132, L"WavMix32 Settings (Ver %X.%X Static)"); + v1 = AddDlgControl((int)& v19, v0, 128, 65537, 1, 155, 5, 50, 14, L"&Ok"); + v2 = AddDlgControl((int)& v19, v1, 128, 0x10000, 2, 155, 25, 50, 14, L"&Cancel"); + v3 = AddDlgControl((int)& v19, v2, 130, 0, 1012, 5, 5, 115, 8, L"Number of WaveBlocks (%d-%d):"); + v4 = AddDlgControl((int)& v19, v3, 130, 0, 1013, 5, 20, 115, 8, L"Size of WaveBlocks (%d-%d):"); + v5 = AddDlgControl((int)& v19, v4, 130, 0, 0xFFFF, 5, 35, 102, 8, L"Playback Frequency (11,22,44):"); + v6 = AddDlgControl((int)& v19, v5, 130, 0, 0xFFFF, 5, 80, 57, 8, L"Playback Device:"); + v7 = AddDlgControl((int)& v19, v6, 130, 0, 1014, 5, 50, 115, 8, L"Number of Pause Blocks (%d-%d):"); + v8 = AddDlgControl((int)& v19, v7, 130, 0, 1015, 5, 65, 63, 8, L"Max Channels = %d"); + v9 = AddDlgControl((int)& v19, v8, 129, 8454272, 1003, 125, 5, 25, 12, L"-1"); + v10 = AddDlgControl((int)& v19, v9, 129, 8454272, 1007, 125, 20, 25, 12, L"-1"); + v11 = AddDlgControl((int)& v19, v10, 129, 8454272, 1008, 125, 35, 25, 12, L"-1"); + v12 = AddDlgControl((int)& v19, v11, 129, 8454272, 1011, 125, 50, 25, 12, L"-1"); + v13 = AddDlgControl((int)& v19, v12, 133, 2162946, 1009, 65, 80, 140, 60, L"No Devices"); + v14 = AddDlgControl((int)& v19, v13, 128, 65539, 1000, 5, 101, 40, 10, L"Stereo"); + v15 = AddDlgControl((int)& v19, v14, 128, 65539, 1001, 55, 101, 60, 10, L"Reset Remix"); + v16 = AddDlgControl((int)& v19, v15, 128, 65539, 1010, 125, 101, 78, 10, L"Show Debug Dialogs"); + v17 = AddDlgControl((int)& v19, v16, 128, 65539, 1005, 5, 117, 40, 10, L"CMixit"); + return AddDlgControl((int)& v19, v17, 128, 65539, 1004, 55, 117, 75, 10, L"Good Get Position"); } //----- (01020059) -------------------------------------------------------- void DestroySettingsDlgTemplate(LPCVOID pMem) { -HGLOBAL v1; // eax -HGLOBAL v2; // eax + HGLOBAL v1; // eax + HGLOBAL v2; // eax -if ( pMem ) -{ -v1 = GlobalHandle(pMem); -GlobalUnlock(v1); -v2 = GlobalHandle(pMem); -GlobalFree(v2); -} + if (pMem) + { + v1 = GlobalHandle(pMem); + GlobalUnlock(v1); + v2 = GlobalHandle(pMem); + GlobalFree(v2); + } } //----- (0102008D) -------------------------------------------------------- -signed int WaveMixGetConfig(WORD *a1, int a2) +signed int WaveMixGetConfig(WORD* a1, int a2) { -WORD *v2; // eax -int v4; // ebx + WORD* v2; // eax + int v4; // ebx -v2 = SessionToGlobalDataPtr(a1); -hMem = (LPARAM)v2; -if ( !v2 ) -return 5; -if ( !a2 ) -return 11; -v4 = *(DWORD *)(a2 + 2); -if ( v4 & 1 ) -*(WORD *)(a2 + 6) = v2[191]; -if ( v4 & 2 ) -*(WORD *)(a2 + 8) = 11 * (*((DWORD *)v2 + 96) / 0x2B11u); -if ( v4 & 4 ) -*(WORD *)(a2 + 10) = v2[200]; -if ( v4 & 8 ) -*(WORD *)(a2 + 12) = v2[198]; -if ( v4 & 0x10 ) -*(WORD *)(a2 + 14) = *((DWORD *)v2 + 107) == (DWORD)cmixit; -if ( v4 & 0x20 ) -*(WORD *)(a2 + 16) = *((DWORD *)v2 + 108) == (DWORD)ResetRemix; -if ( v4 & 0x40 ) -*(WORD *)(a2 + 18) = v2[210]; -if ( (v4 & 0x80u) != 0 ) -*(WORD *)(a2 + 20) = v2[12]; -if ( v4 & 0x100 ) -*(WORD *)(a2 + 24) = dword_1027BE4 != 0; -if ( v4 & 0x200 ) -*(WORD *)(a2 + 22) = v2[202]; -return 0; + v2 = SessionToGlobalDataPtr(a1); + hMem = (LPARAM)v2; + if (!v2) + return 5; + if (!a2) + return 11; + v4 = *(DWORD*)(a2 + 2); + if (v4 & 1) + * (WORD*)(a2 + 6) = v2[191]; + if (v4 & 2) + * (WORD*)(a2 + 8) = 11 * (*((DWORD*)v2 + 96) / 0x2B11u); + if (v4 & 4) + * (WORD*)(a2 + 10) = v2[200]; + if (v4 & 8) + * (WORD*)(a2 + 12) = v2[198]; + if (v4 & 0x10) + * (WORD*)(a2 + 14) = *((DWORD*)v2 + 107) == (DWORD)cmixit; + if (v4 & 0x20) + * (WORD*)(a2 + 16) = *((DWORD*)v2 + 108) == (DWORD)ResetRemix; + if (v4 & 0x40) + * (WORD*)(a2 + 18) = v2[210]; + if ((v4 & 0x80u) != 0) + * (WORD*)(a2 + 20) = v2[12]; + if (v4 & 0x100) + * (WORD*)(a2 + 24) = dword_1027BE4 != 0; + if (v4 & 0x200) + * (WORD*)(a2 + 22) = v2[202]; + return 0; } // 1027BE4: using guessed type int dword_1027BE4; //----- (0102018C) -------------------------------------------------------- BOOL SaveConfigSettings(int a1) { -BOOL result; // eax + BOOL result; // eax -if ( (a1 & 0x80u) != 0 ) -{ -_wsprintfA(aWavemixV23ByAn, "%d", *(DWORD *)(hMem + 24)); -result = WritePrivateProfileStringA("general", "WaveOutDevice", aWavemixV23ByAn, FileName); -} -if ( a1 & 1 ) -{ -_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int *)(hMem + 382)); -result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "Channels", aWavemixV23ByAn, FileName); -} -if ( a1 & 2 ) -{ -_wsprintfA(aWavemixV23ByAn, "%d", (unsigned int)(11 * (*(DWORD *)(hMem + 384) / 0x2B11u))); -result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "SamplesPerSec", aWavemixV23ByAn, FileName); -} -if ( a1 & 4 ) -{ -_wsprintfA(aWavemixV23ByAn, "%d", *(DWORD *)(hMem + 400)); -result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "WaveBlocks", aWavemixV23ByAn, FileName); -} -if ( a1 & 8 ) -{ -_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int *)(hMem + 396)); -result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "WaveBlockLen", aWavemixV23ByAn, FileName); -} -if ( a1 & 0x10 ) -{ -_wsprintfA(aWavemixV23ByAn, "%d", *(DWORD *)(hMem + 428) == (DWORD)cmixit); -result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "CMixit", aWavemixV23ByAn, FileName); -} -if ( a1 & 0x20 ) -{ -_wsprintfA(aWavemixV23ByAn, "%d", (*(DWORD *)(hMem + 432) != (DWORD)ResetRemix) + 1); -result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "Remix", aWavemixV23ByAn, FileName); -} -if ( a1 & 0x40 ) -{ -_wsprintfA(aWavemixV23ByAn, "%d", *(DWORD *)(hMem + 420) == 0); -result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "GoodWavePos", aWavemixV23ByAn, FileName); -} -if ( a1 & 0x100 ) -{ -_wsprintfA(aWavemixV23ByAn, "%d", dword_1027BE4 != 0); -result = WritePrivateProfileStringA("general", "ShowDebugDialogs", aWavemixV23ByAn, FileName); -} -if ( a1 & 0x200 ) -{ -_wsprintfA(aWavemixV23ByAn, "%d", *(DWORD *)(hMem + 404)); -result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "PauseBlocks", aWavemixV23ByAn, FileName); -} -return result; + if ((a1 & 0x80u) != 0) + { + _wsprintfA(aWavemixV23ByAn, "%d", *(DWORD*)(hMem + 24)); + result = WritePrivateProfileStringA("general", "WaveOutDevice", aWavemixV23ByAn, FileName); + } + if (a1 & 1) + { + _wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(hMem + 382)); + result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "Channels", aWavemixV23ByAn, FileName); + } + if (a1 & 2) + { + _wsprintfA(aWavemixV23ByAn, "%d", (unsigned int)(11 * (*(DWORD*)(hMem + 384) / 0x2B11u))); + result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "SamplesPerSec", aWavemixV23ByAn, FileName); + } + if (a1 & 4) + { + _wsprintfA(aWavemixV23ByAn, "%d", *(DWORD*)(hMem + 400)); + result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "WaveBlocks", aWavemixV23ByAn, FileName); + } + if (a1 & 8) + { + _wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(hMem + 396)); + result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "WaveBlockLen", aWavemixV23ByAn, FileName); + } + if (a1 & 0x10) + { + _wsprintfA(aWavemixV23ByAn, "%d", *(DWORD*)(hMem + 428) == (DWORD)cmixit); + result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "CMixit", aWavemixV23ByAn, FileName); + } + if (a1 & 0x20) + { + _wsprintfA(aWavemixV23ByAn, "%d", (*(DWORD*)(hMem + 432) != (DWORD)ResetRemix) + 1); + result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "Remix", aWavemixV23ByAn, FileName); + } + if (a1 & 0x40) + { + _wsprintfA(aWavemixV23ByAn, "%d", *(DWORD*)(hMem + 420) == 0); + result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "GoodWavePos", aWavemixV23ByAn, FileName); + } + if (a1 & 0x100) + { + _wsprintfA(aWavemixV23ByAn, "%d", dword_1027BE4 != 0); + result = WritePrivateProfileStringA("general", "ShowDebugDialogs", aWavemixV23ByAn, FileName); + } + if (a1 & 0x200) + { + _wsprintfA(aWavemixV23ByAn, "%d", *(DWORD*)(hMem + 404)); + result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "PauseBlocks", aWavemixV23ByAn, FileName); + } + return result; } // 1027BE4: using guessed type int dword_1027BE4; //----- (010203CD) -------------------------------------------------------- DWORD SetIniFileName(HMODULE hModule) { -DWORD result; // eax -CHAR *i; // eax + DWORD result; // eax + CHAR* i; // eax -result = GetModuleFileNameA(hModule, FileName, 0x104u); -if ( result ) -{ -for ( i = &FileName[result]; *i != 92; --i ) -; -*i = 0; -lstrcpyA(i, "\\WAVEMIX.INF"); -result = 1; -} -return result; + result = GetModuleFileNameA(hModule, FileName, 0x104u); + if (result) + { + for (i = &FileName[result]; *i != 92; --i) + ; + *i = 0; + lstrcpyA(i, "\\WAVEMIX.INF"); + result = 1; + } + return result; } //----- (01020412) -------------------------------------------------------- int InitVolumeTable() { -char *v0; // edi -signed int v1; // esi -int result; // eax -int v3; // [esp+Ch] [ebp-Ch] -int v4; // [esp+10h] [ebp-8h] -int v5; // [esp+14h] [ebp-4h] + char* v0; // edi + signed int v1; // esi + int result; // eax + int v3; // [esp+Ch] [ebp-Ch] + int v4; // [esp+10h] [ebp-8h] + int v5; // [esp+14h] [ebp-4h] -v4 = 0; -v3 = 0; -v0 = (char *)&unk_10259F0; -do -{ -v1 = -128; -v5 = v3; -do -{ -v0[v1] = v5 / 10 + -128; -result = v4; -v5 += v4; -++v1; -} -while ( v1 < 128 ); -++v4; -v3 -= 128; -v0 += 256; -} -while ( (signed int)v0 <= (signed int)&unk_10263F0 ); -return result; + v4 = 0; + v3 = 0; + v0 = (char*)& unk_10259F0; + do + { + v1 = -128; + v5 = v3; + do + { + v0[v1] = v5 / 10 + -128; + result = v4; + v5 += v4; + ++v1; + } while (v1 < 128); + ++v4; + v3 -= 128; + v0 += 256; + } while ((signed int)v0 <= (signed int)& unk_10263F0); + return result; } //----- (0102046F) -------------------------------------------------------- int WaveMixStartup(HMODULE hModule) { -WNDCLASSA WndClass; // [esp+4h] [ebp-28h] + WNDCLASSA WndClass; // [esp+4h] [ebp-28h] -if ( dword_1027BF4 ) -return 1; -if ( !SetIniFileName(hModule) ) -return 0; -InitVolumeTable(); -dword_1027BE8 = GetPrivateProfileIntA("general", "debug", 0, FileName); -dword_1025968 = (int)cmixit; -dword_10257E0 = hModule; -WndClass.hCursor = LoadCursorA(0, (LPCSTR)0x7F00); -WndClass.hIcon = 0; -WndClass.lpszMenuName = 0; -WndClass.lpszClassName = "WavMix32"; -WndClass.hbrBackground = (HBRUSH)GetStockObject(1); -WndClass.hInstance = dword_10257E0; -WndClass.style = 0; -WndClass.lpfnWndProc = WndProc; -WndClass.cbWndExtra = 0; -WndClass.cbClsExtra = 0; -if ( !RegisterClassA(&WndClass) ) -return 0; -InitChannelNodes(); -dword_1027BF4 = 1; -return 1; + if (dword_1027BF4) + return 1; + if (!SetIniFileName(hModule)) + return 0; + InitVolumeTable(); + dword_1027BE8 = GetPrivateProfileIntA("general", "debug", 0, FileName); + dword_1025968 = (int)cmixit; + dword_10257E0 = hModule; + WndClass.hCursor = LoadCursorA(0, (LPCSTR)0x7F00); + WndClass.hIcon = 0; + WndClass.lpszMenuName = 0; + WndClass.lpszClassName = "WavMix32"; + WndClass.hbrBackground = (HBRUSH)GetStockObject(1); + WndClass.hInstance = dword_10257E0; + WndClass.style = 0; + WndClass.lpfnWndProc = WndProc; + WndClass.cbWndExtra = 0; + WndClass.cbClsExtra = 0; + if (!RegisterClassA(&WndClass)) + return 0; + InitChannelNodes(); + dword_1027BF4 = 1; + return 1; } // 1025968: using guessed type int dword_1025968; // 1027BE8: using guessed type int dword_1027BE8; // 1027BF4: using guessed type int dword_1027BF4; //----- (0102053B) -------------------------------------------------------- -signed int WaveMixActivate(WORD *a1, int a2) +signed int WaveMixActivate(WORD* a1, int a2) { -WORD *v2; // eax -int v3; // ecx -signed int result; // eax -unsigned int v5; // ST04_4 -struct wavehdr_tag *v6; // eax -DWORD v7; // eax -bool v8; // zf + WORD* v2; // eax + int v3; // ecx + signed int result; // eax + unsigned int v5; // ST04_4 + struct wavehdr_tag* v6; // eax + DWORD v7; // eax + bool v8; // zf -v2 = SessionToGlobalDataPtr(a1); -v3 = (int)v2; -hMem = (LPARAM)v2; -if ( !v2 ) -return 5; -if ( a2 ) -{ -if ( dword_1025798 ) -return dword_1025798 != (DWORD)v2 ? 4 : 0; -if ( *((DWORD *)v2 + 5) ) -return 12; -dword_1025798 = (int)v2; -sndPlaySoundA(0, 0); -result = GetWaveDevice(); -if ( result ) -{ -dword_1025798 = 0; -return result; -} -v5 = *(DWORD *)(hMem + 412); -*(DWORD *)(hMem + 16) = 1; -SetWaveOutPosition(v5); -do -v6 = (struct wavehdr_tag *)GetWaveBlock(); -while ( MixerPlay(v6, 1) ); -} -else -{ -if ( *((DWORD *)v2 + 4) ) -{ -v7 = MyWaveOutGetPosition(*((HWAVEOUT *)v2 + 3), *((DWORD *)v2 + 105)); -v3 = hMem; -*(DWORD *)(hMem + 412) = v7; -} -ReleaseWaveDevice(v3); -v8 = hMem == dword_1025798; -*(DWORD *)(hMem + 16) = 0; -if ( v8 ) -dword_1025798 = 0; -} -return 0; + v2 = SessionToGlobalDataPtr(a1); + v3 = (int)v2; + hMem = (LPARAM)v2; + if (!v2) + return 5; + if (a2) + { + if (dword_1025798) + return dword_1025798 != (DWORD)v2 ? 4 : 0; + if (*((DWORD*)v2 + 5)) + return 12; + dword_1025798 = (int)v2; + sndPlaySoundA(0, 0); + result = GetWaveDevice(); + if (result) + { + dword_1025798 = 0; + return result; + } + v5 = *(DWORD*)(hMem + 412); + *(DWORD*)(hMem + 16) = 1; + SetWaveOutPosition(v5); + do + v6 = (struct wavehdr_tag*)GetWaveBlock(); + while (MixerPlay(v6, 1)); + } + else + { + if (*((DWORD*)v2 + 4)) + { + v7 = MyWaveOutGetPosition(*((HWAVEOUT*)v2 + 3), *((DWORD*)v2 + 105)); + v3 = hMem; + *(DWORD*)(hMem + 412) = v7; + } + ReleaseWaveDevice(v3); + v8 = hMem == dword_1025798; + *(DWORD*)(hMem + 16) = 0; + if (v8) + dword_1025798 = 0; + } + return 0; } // 1025798: using guessed type int dword_1025798; //----- (01020615) -------------------------------------------------------- MMRESULT WaveMixConfigure(int a1, HWND hWndParent, int a3, int a4, int a5) { -WORD *v5; // esi -WORD *v6; // eax -const DLGTEMPLATE *v7; // esi -INT_PTR v8; // edi -LPARAM v9; // eax -MMRESULT result; // eax -WORD *v11; // esi -LPARAM *v12; // edi -UINT_PTR v13; // eax -LPARAM v14; // eax -bool v15; // zf -int v16; // ecx -const char *v17; // eax -int v18; // eax -int v19; // eax -int v20; // eax -DWORD *v21; // eax -int v22; // eax -signed int v23; // eax -signed int v24; // ecx -DWORD *v25; // eax -int v26; // ecx -int v27; // edx -unsigned int v28; // ax -unsigned int v29; // edx -signed int v30; // ecx -int v31; // cx -signed int (*v32)(int, int); // eax -int v33; // ecx -DWORD *v34; // eax -int v35; // esi -LPARAM dwInitParam; // [esp+Ch] [ebp-6Ch] -unsigned int v38; // [esp+18h] [ebp-60h] -DWORD *v39; // [esp+2Ch] [ebp-4Ch] -WORD *v40; // [esp+30h] [ebp-48h] -int v41; // [esp+34h] [ebp-44h] -LPARAM *v42; // [esp+38h] [ebp-40h] -int v43; // [esp+3Ch] [ebp-3Ch] -struct tagWAVEOUTCAPSA pwoc; // [esp+40h] [ebp-38h] + WORD* v5; // esi + WORD* v6; // eax + const DLGTEMPLATE* v7; // esi + INT_PTR v8; // edi + LPARAM v9; // eax + MMRESULT result; // eax + WORD* v11; // esi + LPARAM* v12; // edi + UINT_PTR v13; // eax + LPARAM v14; // eax + bool v15; // zf + int v16; // ecx + const char* v17; // eax + int v18; // eax + int v19; // eax + int v20; // eax + DWORD* v21; // eax + int v22; // eax + signed int v23; // eax + signed int v24; // ecx + DWORD* v25; // eax + int v26; // ecx + int v27; // edx + unsigned int v28; // ax + unsigned int v29; // edx + signed int v30; // ecx + int v31; // cx + signed int (*v32)(int, int); // eax + int v33; // ecx + DWORD* v34; // eax + int v35; // esi + LPARAM dwInitParam; // [esp+Ch] [ebp-6Ch] + unsigned int v38; // [esp+18h] [ebp-60h] + DWORD* v39; // [esp+2Ch] [ebp-4Ch] + WORD* v40; // [esp+30h] [ebp-48h] + int v41; // [esp+34h] [ebp-44h] + LPARAM* v42; // [esp+38h] [ebp-40h] + int v43; // [esp+3Ch] [ebp-3Ch] + struct tagWAVEOUTCAPSA pwoc; // [esp+40h] [ebp-38h] -v5 = (WORD *)a1; -v42 = (LPARAM *)a3; -v40 = (WORD *)a1; -v39 = (DWORD *)a4; -v43 = 0; -v6 = SessionToGlobalDataPtr((WORD *)a1); -hMem = (LPARAM)v6; -if ( !v6 ) -return 5; -if ( *((DWORD *)v6 + 4) ) -return 4; -if ( *((DWORD *)v6 + 5) ) -return 12; -WaveMixFlushChannel((WORD *)a1, -1, 1); -if ( !v42 ) -{ -LOWORD(dwInitParam) = 30; -*(LPARAM *)((char *)&dwInitParam + 2) = 1023; -WaveMixGetConfig((WORD *)a1, (int)&dwInitParam); -v7 = (const DLGTEMPLATE *)MakeSettingsDlgTemplate(); -if ( !v7 ) -return 1; -*(DWORD *)(hMem + 20) = 1; -v8 = DialogBoxIndirectParamA(dword_10257E0, v7, hWndParent, SettingsDlgProc, (LPARAM)&dwInitParam); -DestroySettingsDlgTemplate(v7); -v9 = hMem; -*(DWORD *)(hMem + 20) = 0; -if ( v8 != 1 ) -return 1; -if ( *(DWORD *)(v9 + 396) == v38 ) -*(LPARAM *)((char *)&dwInitParam + 2) &= 0xFFFFFFF7; -v5 = v40; -v42 = &dwInitParam; -} -if ( !*(LPARAM *)((char *)v42 + 2) ) -return 1; -v11 = SessionToGlobalDataPtr(v5); -hMem = (LPARAM)v11; -if ( !v11 ) -return 5; -v12 = v42; -v41 = *(LPARAM *)((char *)v42 + 2); -if ( v41 & 0x100 ) -dword_1027BE4 = *((WORD *)v42 + 12) != 0; -if ( (v41 & 0x80u) != 0 ) -{ -v13 = *((unsigned int *)v42 + 10); -if ( v13 != *((DWORD *)v11 + 6) ) -{ -result = waveOutGetDevCapsA(v13, &pwoc, 0x34u); -if ( result ) -return result; -v14 = hMem; -qmemcpy((void *)(hMem + 124), &pwoc, 0x34u); -v15 = *(WORD *)(v14 + 168) == 1; -*(DWORD *)(v14 + 24) = *((unsigned int *)v42 + 10); -if ( v15 && *(WORD *)(v14 + 382) == 2 ) -{ -*(WORD *)(v14 + 382) = 1; -v16 = *(DWORD *)(v14 + 384); -v43 = 1; -*(WORD *)(v14 + 392) = 1; -*(DWORD *)(v14 + 388) = v16; -} -lstrcpyA((LPSTR)(v14 + 28), pwoc.szPname); -if ( !RemoveInvalidIniNameCharacters((LPCSTR)(hMem + 28)) ) -lstrcpyA((LPSTR)(hMem + 28), "Unkown Device"); -if ( !ReadRegistryToGetMachineSpecificInfSection(*(DWORD *)(hMem + 24), (LPSTR)(hMem + 28), 96) ) -{ -v17 = GetOperatingSystemPrefix(); -lstrcpyA((LPSTR)(hMem + 28), v17); -lstrcatA((LPSTR)(hMem + 28), (LPCSTR)(hMem + 132)); -} -v11 = (WORD *)hMem; -v12 = v42; -} -} -if ( v41 & 1 ) -{ -if ( *((WORD *)v12 + 3) <= 1u ) -{ -if ( v11[191] == 2 ) -v43 = 1; -v11[191] = 1; -v19 = *((DWORD *)v11 + 96); -v11[196] = 1; -goto LABEL_39; -} -if ( v11[84] > 1u ) -{ -if ( v11[191] == 1 ) -v43 = 1; -v11[191] = 2; -v18 = *((DWORD *)v11 + 96); -v11[196] = 2; -v19 = 2 * v18; -LABEL_39: -*((DWORD *)v11 + 97) = v19; -goto LABEL_40; -} -} + v5 = (WORD*)a1; + v42 = (LPARAM*)a3; + v40 = (WORD*)a1; + v39 = (DWORD*)a4; + v43 = 0; + v6 = SessionToGlobalDataPtr((WORD*)a1); + hMem = (LPARAM)v6; + if (!v6) + return 5; + if (*((DWORD*)v6 + 4)) + return 4; + if (*((DWORD*)v6 + 5)) + return 12; + WaveMixFlushChannel((WORD*)a1, -1, 1); + if (!v42) + { + LOWORD(dwInitParam) = 30; + *(LPARAM*)((char*)& dwInitParam + 2) = 1023; + WaveMixGetConfig((WORD*)a1, (int)& dwInitParam); + v7 = (const DLGTEMPLATE*)MakeSettingsDlgTemplate(); + if (!v7) + return 1; + *(DWORD*)(hMem + 20) = 1; + v8 = DialogBoxIndirectParamA(dword_10257E0, v7, hWndParent, SettingsDlgProc, (LPARAM)& dwInitParam); + DestroySettingsDlgTemplate(v7); + v9 = hMem; + *(DWORD*)(hMem + 20) = 0; + if (v8 != 1) + return 1; + if (*(DWORD*)(v9 + 396) == v38) + * (LPARAM*)((char*)& dwInitParam + 2) &= 0xFFFFFFF7; + v5 = v40; + v42 = &dwInitParam; + } + if (!*(LPARAM*)((char*)v42 + 2)) + return 1; + v11 = SessionToGlobalDataPtr(v5); + hMem = (LPARAM)v11; + if (!v11) + return 5; + v12 = v42; + v41 = *(LPARAM*)((char*)v42 + 2); + if (v41 & 0x100) + dword_1027BE4 = *((WORD*)v42 + 12) != 0; + if ((v41 & 0x80u) != 0) + { + v13 = *((unsigned int*)v42 + 10); + if (v13 != *((DWORD*)v11 + 6)) + { + result = waveOutGetDevCapsA(v13, &pwoc, 0x34u); + if (result) + return result; + v14 = hMem; + qmemcpy((void*)(hMem + 124), &pwoc, 0x34u); + v15 = *(WORD*)(v14 + 168) == 1; + *(DWORD*)(v14 + 24) = *((unsigned int*)v42 + 10); + if (v15 && *(WORD*)(v14 + 382) == 2) + { + *(WORD*)(v14 + 382) = 1; + v16 = *(DWORD*)(v14 + 384); + v43 = 1; + *(WORD*)(v14 + 392) = 1; + *(DWORD*)(v14 + 388) = v16; + } + lstrcpyA((LPSTR)(v14 + 28), pwoc.szPname); + if (!RemoveInvalidIniNameCharacters((LPCSTR)(hMem + 28))) + lstrcpyA((LPSTR)(hMem + 28), "Unkown Device"); + if (!ReadRegistryToGetMachineSpecificInfSection(*(DWORD*)(hMem + 24), (LPSTR)(hMem + 28), 96)) + { + v17 = GetOperatingSystemPrefix(); + lstrcpyA((LPSTR)(hMem + 28), v17); + lstrcatA((LPSTR)(hMem + 28), (LPCSTR)(hMem + 132)); + } + v11 = (WORD*)hMem; + v12 = v42; + } + } + if (v41 & 1) + { + if (*((WORD*)v12 + 3) <= 1u) + { + if (v11[191] == 2) + v43 = 1; + v11[191] = 1; + v19 = *((DWORD*)v11 + 96); + v11[196] = 1; + goto LABEL_39; + } + if (v11[84] > 1u) + { + if (v11[191] == 1) + v43 = 1; + v11[191] = 2; + v18 = *((DWORD*)v11 + 96); + v11[196] = 2; + v19 = 2 * v18; + LABEL_39: + *((DWORD*)v11 + 97) = v19; + goto LABEL_40; + } + } LABEL_40: -if ( v41 & 2 ) -{ -v20 = *((unsigned int *)v12 + 4); -if ( v20 == 22 ) -{ -if ( *((DWORD *)v11 + 96) != 22050 ) -v43 = 1; -*((DWORD *)v11 + 96) = 22050; -v22 = 22050 * (unsigned int)v11[191]; -} -else -{ -v15 = v20 == 44; -v21 = v11 + 192; -if ( v15 ) -{ -if ( *v21 != 44100 ) -v43 = 1; -*v21 = 44100; -v22 = 44100 * (unsigned int)v11[191]; -} -else -{ -if ( *v21 != 11025 ) -v43 = 1; -*v21 = 11025; -v22 = 11025 * (unsigned int)v11[191]; -} -} -*((DWORD *)v11 + 97) = v22; -} -if ( v41 & 4 ) -{ -v23 = *((unsigned int *)v12 + 5); -v24 = 2; -*((DWORD *)v11 + 100) = v23; -if ( v23 < 2 || (v24 = 10, v23 > 10) ) -*((DWORD *)v11 + 100) = v24; -v25 = v11 + 202; -v26 = *((DWORD *)v11 + 101); -if ( v26 >= 0 ) -{ -v27 = *((DWORD *)v11 + 100); -if ( v26 > v27 ) -*v25 = v27; -} -else -{ -*v25 = 0; -} -} -if ( v43 ) -*((DWORD *)v11 + 99) = FigureOutDMABufferSize(0, (int)(v11 + 190)); -if ( v41 & 8 ) -{ -v28 = *((WORD *)v12 + 6); -if ( v28 ) -*((DWORD *)v11 + 99) = v28; -} -v29 = *((DWORD *)v11 + 99); -v30 = 344; -if ( v29 < 0x158 || (v30 = 11025, v29 > 0x2B11) ) -*((DWORD *)v11 + 99) = v30; -v31 = v41; -if ( v41 & 0x10 ) -*((DWORD *)v11 + 107) = cmixit; -if ( v31 & 0x20 ) -{ -v32 = ResetRemix; -if ( !*((WORD *)v12 + 8) ) -v32 = NoResetRemix; -*((DWORD *)v11 + 108) = v32; -} -if ( v31 & 0x40 ) -*((DWORD *)v11 + 105) = *((WORD *)v12 + 9) != 0; -if ( v31 & 0x200 ) -{ -v33 = *((unsigned int *)v12 + 11); -v34 = v11 + 202; -*((DWORD *)v11 + 101) = v33; -if ( v33 >= 0 ) -{ -v35 = *((DWORD *)v11 + 100); -if ( v33 > v35 ) -*v34 = v35; -} -else -{ -*v34 = 0; -} -} -WaveMixGetConfig(v40, (int)v12); -if ( v39 ) -*v39 = v43; -if ( a5 ) -SaveConfigSettings(v41); -if ( dword_1027BE4 ) -ShowCurrentSettings(); -return 0; + if (v41 & 2) + { + v20 = *((unsigned int*)v12 + 4); + if (v20 == 22) + { + if (*((DWORD*)v11 + 96) != 22050) + v43 = 1; + *((DWORD*)v11 + 96) = 22050; + v22 = 22050 * (unsigned int)v11[191]; + } + else + { + v15 = v20 == 44; + v21 = v11 + 192; + if (v15) + { + if (*v21 != 44100) + v43 = 1; + *v21 = 44100; + v22 = 44100 * (unsigned int)v11[191]; + } + else + { + if (*v21 != 11025) + v43 = 1; + *v21 = 11025; + v22 = 11025 * (unsigned int)v11[191]; + } + } + *((DWORD*)v11 + 97) = v22; + } + if (v41 & 4) + { + v23 = *((unsigned int*)v12 + 5); + v24 = 2; + *((DWORD*)v11 + 100) = v23; + if (v23 < 2 || (v24 = 10, v23 > 10)) + * ((DWORD*)v11 + 100) = v24; + v25 = v11 + 202; + v26 = *((DWORD*)v11 + 101); + if (v26 >= 0) + { + v27 = *((DWORD*)v11 + 100); + if (v26 > v27) + * v25 = v27; + } + else + { + *v25 = 0; + } + } + if (v43) + * ((DWORD*)v11 + 99) = FigureOutDMABufferSize(0, (int)(v11 + 190)); + if (v41 & 8) + { + v28 = *((WORD*)v12 + 6); + if (v28) + * ((DWORD*)v11 + 99) = v28; + } + v29 = *((DWORD*)v11 + 99); + v30 = 344; + if (v29 < 0x158 || (v30 = 11025, v29 > 0x2B11)) + * ((DWORD*)v11 + 99) = v30; + v31 = v41; + if (v41 & 0x10) + * ((DWORD*)v11 + 107) = cmixit; + if (v31 & 0x20) + { + v32 = ResetRemix; + if (!*((WORD*)v12 + 8)) + v32 = NoResetRemix; + *((DWORD*)v11 + 108) = v32; + } + if (v31 & 0x40) + * ((DWORD*)v11 + 105) = *((WORD*)v12 + 9) != 0; + if (v31 & 0x200) + { + v33 = *((unsigned int*)v12 + 11); + v34 = v11 + 202; + *((DWORD*)v11 + 101) = v33; + if (v33 >= 0) + { + v35 = *((DWORD*)v11 + 100); + if (v33 > v35) + * v34 = v35; + } + else + { + *v34 = 0; + } + } + WaveMixGetConfig(v40, (int)v12); + if (v39) + * v39 = v43; + if (a5) + SaveConfigSettings(v41); + if (dword_1027BE4) + ShowCurrentSettings(); + return 0; } // 1027BE4: using guessed type int dword_1027BE4; //----- (01020A36) -------------------------------------------------------- signed int ReadConfigSettings(int a1) { -UINT v2; // eax -UINT_PTR *v3; // ebx -const char *v4; // eax -unsigned int v5; // eax -UINT v6; // eax -signed int (*v7)(int, int); // ecx -LPARAM v8; // eax -UINT v9; // ecx -LPARAM v10; // eax -signed int v11; // eax -LPARAM v12; // ecx -signed int v13; // edx -int v14; // eax -signed int v15; // eax -LPARAM v16; // ecx -signed int v17; // edx -unsigned int v18; // ax -LPARAM v19; // ecx -int v20; // eax -int v21; // eax -unsigned int v22; // eax -int v23; // esi -const CHAR *v24; // [esp-10h] [ebp-24h] -int v25; // [esp-Ch] [ebp-20h] -UINT v26; // [esp+4h] [ebp-10h] -UINT v27; // [esp+8h] [ebp-Ch] -UINT v28; // [esp+Ch] [ebp-8h] -unsigned int nDefault; // [esp+10h] [ebp-4h] -UINT nDefaulta; // [esp+10h] [ebp-4h] -INT nDefaultb; // [esp+10h] [ebp-4h] + UINT v2; // eax + UINT_PTR* v3; // ebx + const char* v4; // eax + unsigned int v5; // eax + UINT v6; // eax + signed int (*v7)(int, int); // ecx + LPARAM v8; // eax + UINT v9; // ecx + LPARAM v10; // eax + signed int v11; // eax + LPARAM v12; // ecx + signed int v13; // edx + int v14; // eax + signed int v15; // eax + LPARAM v16; // ecx + signed int v17; // edx + unsigned int v18; // ax + LPARAM v19; // ecx + int v20; // eax + int v21; // eax + unsigned int v22; // eax + int v23; // esi + const CHAR* v24; // [esp-10h] [ebp-24h] + int v25; // [esp-Ch] [ebp-20h] + UINT v26; // [esp+4h] [ebp-10h] + UINT v27; // [esp+8h] [ebp-Ch] + UINT v28; // [esp+Ch] [ebp-8h] + unsigned int nDefault; // [esp+10h] [ebp-4h] + UINT nDefaulta; // [esp+10h] [ebp-4h] + INT nDefaultb; // [esp+10h] [ebp-4h] -nDefault = waveOutGetNumDevs(); -if ( !nDefault ) -return 0; -if ( *(_BYTE *)(a1 + 3) & 4 && ReadRegistryForAppSpecificConfigs(a1) ) -{ -WaveMixConfigure(hMem, 0, a1, 0, 0); -return 1; -} -if ( *(_BYTE *)(a1 + 2) >= 0 ) -{ -v3 = (UINT_PTR *)(hMem + 24); -v2 = GetPrivateProfileIntA("general", "WaveOutDevice", 0, FileName); -} -else -{ -v2 = *(unsigned int *)(a1 + 20); -v3 = (UINT_PTR *)(hMem + 24); -} -*v3 = v2; -if ( *v3 >= nDefault ) -*v3 = 0; -if ( waveOutGetDevCapsA(*v3, (LPWAVEOUTCAPSA)(hMem + 124), 0x34u) -|| !RemoveInvalidIniNameCharacters((LPCSTR)(hMem + 132)) ) -{ -lstrcpyA((LPSTR)(hMem + 132), "Unkown Device"); -} -if ( !ReadRegistryToGetMachineSpecificInfSection(*(DWORD *)(hMem + 24), (LPSTR)(hMem + 28), 96) ) -{ -v4 = GetOperatingSystemPrefix(); -lstrcpyA((LPSTR)(hMem + 28), v4); -lstrcatA((LPSTR)(hMem + 28), (LPCSTR)(hMem + 132)); -} -nDefaulta = GetPrivateProfileIntA("default", "Remix", 1, FileName); -v5 = DefaultGoodWavePos(*(DWORD *)(hMem + 24)); -v28 = GetPrivateProfileIntA("default", "GoodWavePos", v5, FileName); -v27 = GetPrivateProfileIntA("default", "WaveBlocks", 3, FileName); -v26 = GetPrivateProfileIntA("default", "SamplesPerSec", 11, FileName); -if ( *(_BYTE *)(hMem + 172) & 0x10 ) -{ -if ( !dword_1027BE4 ) -return 0; -v25 = hMem + 132; -v24 = "%s is a syncronous (blocking) wave output device. This will not permit audio to play while other applications are running."; -LABEL_19: -_wsprintfA(aWavemixV23ByAn, v24, v25); -MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); -return 0; -} -if ( GetPrivateProfileIntA("not compatible", (LPCSTR)(hMem + 28), 0, FileName) ) -{ -if ( !dword_1027BE4 ) -return 0; -v25 = hMem + 28; -v24 = "%s is not compatible with the realtime wavemixer."; -goto LABEL_19; -} -v6 = GetPrivateProfileIntA((LPCSTR)(hMem + 28), "Remix", nDefaulta, FileName); -v7 = NoResetRemix; -if ( v6 != 2 ) -v7 = ResetRemix; -v8 = hMem; -*(DWORD *)(hMem + 432) = v7; -v9 = GetPrivateProfileIntA((LPCSTR)(v8 + 28), "GoodWavePos", v28, FileName); -v10 = hMem; -*(DWORD *)(hMem + 420) = v9 != 0; -v11 = GetPrivateProfileIntA((LPCSTR)(v10 + 28), "WaveBlocks", v27, FileName); -v12 = hMem; -v13 = 2; -*(DWORD *)(hMem + 400) = v11; -if ( v11 < 2 || (v13 = 10, v11 > 10) ) -*(DWORD *)(v12 + 400) = v13; -v14 = DefaultPauseBlocks(*(DWORD *)(v12 + 400)); -v15 = GetPrivateProfileIntA((LPCSTR)(hMem + 28), "PauseBlocks", v14, FileName); -v16 = hMem; -*(DWORD *)(hMem + 404) = v15; -if ( v15 >= 0 ) -{ -v17 = *(DWORD *)(v16 + 400); -if ( v15 > v17 ) -*(DWORD *)(v16 + 404) = v17; -} -else -{ -*(DWORD *)(v16 + 404) = 0; -} -nDefaultb = GetPrivateProfileIntA((LPCSTR)(v16 + 28), "SamplesPerSec", v26, FileName); -v18 = GetPrivateProfileIntA((LPCSTR)(hMem + 28), "Channels", 1, FileName); -v19 = hMem; -*(WORD *)(hMem + 382) = v18; -if ( v18 >= 1u ) -{ -if ( v18 > 2u ) -*(WORD *)(v19 + 382) = 2; -} -else -{ -*(WORD *)(v19 + 382) = 1; -} -v20 = *(unsigned int *)(v19 + 382); -if ( nDefaultb == 22 ) -{ -*(DWORD *)(v19 + 384) = 22050; -v21 = 22050 * v20; -} -else if ( nDefaultb == 44 ) -{ -*(DWORD *)(v19 + 384) = 44100; -v21 = 44100 * v20; -} -else -{ -v21 = 11025 * v20; -} -*(DWORD *)(v19 + 388) = v21; -v22 = GetPrivateProfileIntA("default", "WaveBlockLen", 0, FileName); -v23 = hMem; -*(DWORD *)(v23 + 396) = FigureOutDMABufferSize(v22, hMem + 380); -WaveMixConfigure(v23, 0, a1, 0, 0); -return 1; + nDefault = waveOutGetNumDevs(); + if (!nDefault) + return 0; + if (*(_BYTE*)(a1 + 3) & 4 && ReadRegistryForAppSpecificConfigs(a1)) + { + WaveMixConfigure(hMem, 0, a1, 0, 0); + return 1; + } + if (*(_BYTE*)(a1 + 2) >= 0) + { + v3 = (UINT_PTR*)(hMem + 24); + v2 = GetPrivateProfileIntA("general", "WaveOutDevice", 0, FileName); + } + else + { + v2 = *(unsigned int*)(a1 + 20); + v3 = (UINT_PTR*)(hMem + 24); + } + *v3 = v2; + if (*v3 >= nDefault) + * v3 = 0; + if (waveOutGetDevCapsA(*v3, (LPWAVEOUTCAPSA)(hMem + 124), 0x34u) + || !RemoveInvalidIniNameCharacters((LPCSTR)(hMem + 132))) + { + lstrcpyA((LPSTR)(hMem + 132), "Unkown Device"); + } + if (!ReadRegistryToGetMachineSpecificInfSection(*(DWORD*)(hMem + 24), (LPSTR)(hMem + 28), 96)) + { + v4 = GetOperatingSystemPrefix(); + lstrcpyA((LPSTR)(hMem + 28), v4); + lstrcatA((LPSTR)(hMem + 28), (LPCSTR)(hMem + 132)); + } + nDefaulta = GetPrivateProfileIntA("default", "Remix", 1, FileName); + v5 = DefaultGoodWavePos(*(DWORD*)(hMem + 24)); + v28 = GetPrivateProfileIntA("default", "GoodWavePos", v5, FileName); + v27 = GetPrivateProfileIntA("default", "WaveBlocks", 3, FileName); + v26 = GetPrivateProfileIntA("default", "SamplesPerSec", 11, FileName); + if (*(_BYTE*)(hMem + 172) & 0x10) + { + if (!dword_1027BE4) + return 0; + v25 = hMem + 132; + v24 = "%s is a syncronous (blocking) wave output device. This will not permit audio to play while other applications are running."; + LABEL_19: + _wsprintfA(aWavemixV23ByAn, v24, v25); + MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); + return 0; + } + if (GetPrivateProfileIntA("not compatible", (LPCSTR)(hMem + 28), 0, FileName)) + { + if (!dword_1027BE4) + return 0; + v25 = hMem + 28; + v24 = "%s is not compatible with the realtime wavemixer."; + goto LABEL_19; + } + v6 = GetPrivateProfileIntA((LPCSTR)(hMem + 28), "Remix", nDefaulta, FileName); + v7 = NoResetRemix; + if (v6 != 2) + v7 = ResetRemix; + v8 = hMem; + *(DWORD*)(hMem + 432) = v7; + v9 = GetPrivateProfileIntA((LPCSTR)(v8 + 28), "GoodWavePos", v28, FileName); + v10 = hMem; + *(DWORD*)(hMem + 420) = v9 != 0; + v11 = GetPrivateProfileIntA((LPCSTR)(v10 + 28), "WaveBlocks", v27, FileName); + v12 = hMem; + v13 = 2; + *(DWORD*)(hMem + 400) = v11; + if (v11 < 2 || (v13 = 10, v11 > 10)) + * (DWORD*)(v12 + 400) = v13; + v14 = DefaultPauseBlocks(*(DWORD*)(v12 + 400)); + v15 = GetPrivateProfileIntA((LPCSTR)(hMem + 28), "PauseBlocks", v14, FileName); + v16 = hMem; + *(DWORD*)(hMem + 404) = v15; + if (v15 >= 0) + { + v17 = *(DWORD*)(v16 + 400); + if (v15 > v17) + * (DWORD*)(v16 + 404) = v17; + } + else + { + *(DWORD*)(v16 + 404) = 0; + } + nDefaultb = GetPrivateProfileIntA((LPCSTR)(v16 + 28), "SamplesPerSec", v26, FileName); + v18 = GetPrivateProfileIntA((LPCSTR)(hMem + 28), "Channels", 1, FileName); + v19 = hMem; + *(WORD*)(hMem + 382) = v18; + if (v18 >= 1u) + { + if (v18 > 2u) + * (WORD*)(v19 + 382) = 2; + } + else + { + *(WORD*)(v19 + 382) = 1; + } + v20 = *(unsigned int*)(v19 + 382); + if (nDefaultb == 22) + { + *(DWORD*)(v19 + 384) = 22050; + v21 = 22050 * v20; + } + else if (nDefaultb == 44) + { + *(DWORD*)(v19 + 384) = 44100; + v21 = 44100 * v20; + } + else + { + v21 = 11025 * v20; + } + *(DWORD*)(v19 + 388) = v21; + v22 = GetPrivateProfileIntA("default", "WaveBlockLen", 0, FileName); + v23 = hMem; + *(DWORD*)(v23 + 396) = FigureOutDMABufferSize(v22, hMem + 380); + WaveMixConfigure(v23, 0, a1, 0, 0); + return 1; } // 1027BE4: using guessed type int dword_1027BE4; //----- (01020D99) -------------------------------------------------------- -int WaveMixConfigureInit(WORD *a1) +int WaveMixConfigureInit(WORD* a1) { -unsigned int v1; // ecx -HMODULE v2; // eax -int result; // eax -BOOL v4; // eax -DWORD *v5; // eax -WORD *v6; // eax -void *v7; // ST0C_4 -int v8; // [esp+8h] [ebp-20h] -char v9; // [esp+Bh] [ebp-1Dh] -int v10; // [esp+20h] [ebp-8h] -int v11; // [esp+24h] [ebp-4h] + unsigned int v1; // ecx + HMODULE v2; // eax + int result; // eax + BOOL v4; // eax + DWORD* v5; // eax + WORD* v6; // eax + void* v7; // ST0C_4 + int v8; // [esp+8h] [ebp-20h] + char v9; // [esp+Bh] [ebp-1Dh] + int v10; // [esp+20h] [ebp-8h] + int v11; // [esp+24h] [ebp-4h] -memset(&v8, 0, 0x1Cu); -v1 = 30; -v11 = 0; -v8 = 30; -if ( a1 ) -{ -if ( *a1 < 0x1Eu ) -v1 = (unsigned int)*a1; -qmemcpy(&v8, a1, v1); -} -if ( dword_1027BF4 || (v2 = GetModuleHandleA(0), (result = WaveMixStartup(v2)) != 0) ) -{ -if ( v9 & 1 ) -v4 = v10 != 0; -else -v4 = GetPrivateProfileIntA("general", "ShowDebugDialogs", 0, FileName) != 0; -dword_1027BE4 = v4; -if ( !waveOutGetNumDevs() ) -{ -if ( dword_1027BE4 ) -{ -_wsprintfA(aWavemixV23ByAn, "This system does not have a valid wave output device."); -MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); -} -return 0; -} -if ( GetPrivateProfileIntA("general", "ShowDevices", 0, FileName) ) -ShowWaveOutDevices(); -v5 = LocalAlloc(0x40u, 0x1C0u); -hMem = (LPARAM)v5; -if ( !v5 ) -return 0; -v5[107] = dword_1025968; -*((WORD *)v5 + 222) = 21554; -*(WORD *)v5 = 21554; -v5[102] = 0; -v5[5] = 0; -*((WORD *)v5 + 88) = 10; -*((WORD *)v5 + 89) = 10; -memset(v5 + 61, 0xFFu, 0x40u); -_memmove(v5 + 95, gpFormat, 0x10u); -if ( !ReadConfigSettings((int)&v8) ) -{ -v6 = (WORD *)hMem; -v7 = (void *)hMem; -*(WORD *)(hMem + 444) = 0; -*v6 = 0; -LocalFree(v7); -hMem = 0; -} -result = hMem; -} -return result; + memset(&v8, 0, 0x1Cu); + v1 = 30; + v11 = 0; + v8 = 30; + if (a1) + { + if (*a1 < 0x1Eu) + v1 = (unsigned int)* a1; + qmemcpy(&v8, a1, v1); + } + if (dword_1027BF4 || (v2 = GetModuleHandleA(0), (result = WaveMixStartup(v2)) != 0)) + { + if (v9 & 1) + v4 = v10 != 0; + else + v4 = GetPrivateProfileIntA("general", "ShowDebugDialogs", 0, FileName) != 0; + dword_1027BE4 = v4; + if (!waveOutGetNumDevs()) + { + if (dword_1027BE4) + { + _wsprintfA(aWavemixV23ByAn, "This system does not have a valid wave output device."); + MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u); + } + return 0; + } + if (GetPrivateProfileIntA("general", "ShowDevices", 0, FileName)) + ShowWaveOutDevices(); + v5 = LocalAlloc(0x40u, 0x1C0u); + hMem = (LPARAM)v5; + if (!v5) + return 0; + v5[107] = dword_1025968; + *((WORD*)v5 + 222) = 21554; + *(WORD*)v5 = 21554; + v5[102] = 0; + v5[5] = 0; + *((WORD*)v5 + 88) = 10; + *((WORD*)v5 + 89) = 10; + memset(v5 + 61, 0xFFu, 0x40u); + _memmove(v5 + 95, gpFormat, 0x10u); + if (!ReadConfigSettings((int)& v8)) + { + v6 = (WORD*)hMem; + v7 = (void*)hMem; + *(WORD*)(hMem + 444) = 0; + *v6 = 0; + LocalFree(v7); + hMem = 0; + } + result = hMem; + } + return result; } // 10028C0: using guessed type int gpFormat[4]; // 1025968: using guessed type int dword_1025968; @@ -3630,26 +3587,26 @@ return result; //----- (01020F2D) -------------------------------------------------------- int WaveMixInit() { -return WaveMixConfigureInit(0); + return WaveMixConfigureInit(0); } //----- (01020F3A) -------------------------------------------------------- HLOCAL WaveMixCloseSession(HLOCAL hMem) { -void *v1; // edi -HLOCAL result; // eax + void* v1; // edi + HLOCAL result; // eax -::hMem = (LPARAM)SessionToGlobalDataPtr(hMem); -if ( !::hMem -|| (WaveMixActivate(hMem, 0), -WaveMixCloseChannel(hMem, 0, 1), -v1 = (void *)::hMem, -::hMem = 0, -memset(v1, 0, 0x1C0u), -!hMem) -|| (result = LocalFree(hMem)) != 0 ) -{ -result = (HLOCAL)5; -} -return result; + ::hMem = (LPARAM)SessionToGlobalDataPtr(hMem); + if (!::hMem + || (WaveMixActivate(hMem, 0), + WaveMixCloseChannel(hMem, 0, 1), + v1 = (void*)::hMem, + ::hMem = 0, + memset(v1, 0, 0x1C0u), + !hMem) + || (result = LocalFree(hMem)) != 0) + { + result = (HLOCAL)5; + } + return result; }