diff --git a/pinball.cpp b/pinball.cpp index 0a1ec07..21d6509 100644 --- a/pinball.cpp +++ b/pinball.cpp @@ -10,59 +10,59 @@ //----- (0101461A) -------------------------------------------------------- signed int __stdcall pb_mode_change(int a1) { -int v1; // eax -int v2; // eax + int v1; // eax + int v2; // eax -switch ( a1 ) -{ -case 1: -if ( dword_1025570 ) -{ -options_menu_set(0x191u, 0); -options_menu_set(0x67u, 0); -options_menu_check(0x194u, 1); -if ( MainTable ) -{ -v2 = *(_DWORD *)((char *)MainTable + 230); -if ( v2 ) -*(_BYTE *)(v2 + 5) = 1; -} -} -else -{ -options_menu_set(0x67u, 1); -options_menu_set(0x191u, 1); -options_menu_check(0x194u, 0); -if ( MainTable ) -{ -v1 = *(_DWORD *)((char *)MainTable + 230); -if ( v1 ) -*(_BYTE *)(v1 + 5) = 0; -} -} -break; -case 2: -options_menu_set(0x191u, 0); -if ( !dword_1025570 ) -{ -options_menu_set(0x67u, 1); -options_menu_check(0x194u, 0); -} -if ( MainTable && *(_DWORD *)((char *)MainTable + 266) ) -(***(void (__thiscall ****)(_DWORD, signed int, _DWORD))((char *)MainTable + 266))( -*(_DWORD *)((char *)MainTable + 266), -29, -1.4); -break; -case 3: -case 4: -options_menu_set(0x191u, 0); -options_menu_set(0x67u, 0); -dword_1025574 = 5000; -break; -} -dword_1025568 = a1; -return 1; + switch (a1) + { + case 1: + if (dword_1025570) + { + options_menu_set(0x191u, 0); + options_menu_set(0x67u, 0); + options_menu_check(0x194u, 1); + if (MainTable) + { + v2 = *(_DWORD*)((char*)MainTable + 230); + if (v2) + * (_BYTE*)(v2 + 5) = 1; + } + } + else + { + options_menu_set(0x67u, 1); + options_menu_set(0x191u, 1); + options_menu_check(0x194u, 0); + if (MainTable) + { + v1 = *(_DWORD*)((char*)MainTable + 230); + if (v1) + * (_BYTE*)(v1 + 5) = 0; + } + } + break; + case 2: + options_menu_set(0x191u, 0); + if (!dword_1025570) + { + options_menu_set(0x67u, 1); + options_menu_check(0x194u, 0); + } + if (MainTable && *(_DWORD*)((char*)MainTable + 266)) + (***(void(__thiscall * ***)(_DWORD, signed int, _DWORD))((char*)MainTable + 266))( + *(_DWORD*)((char*)MainTable + 266), + 29, + 1.4); + break; + case 3: + case 4: + options_menu_set(0x191u, 0); + options_menu_set(0x67u, 0); + dword_1025574 = 5000; + break; + } + dword_1025568 = a1; + return 1; } // 1025568: using guessed type int dword_1025568; // 1025570: using guessed type int dword_1025570; @@ -71,25 +71,25 @@ return 1; //----- (01014743) -------------------------------------------------------- signed int __stdcall pb_mode_countdown(int a1) { -if ( !dword_1025568 || dword_1025568 <= 0 ) -return 1; -if ( dword_1025568 > 2 ) -{ -if ( dword_1025568 == 3 ) -{ -dword_1025574 -= a1; -if ( dword_1025574 < 0 || a1 < 0 ) -pb_mode_change(4); -} -else if ( dword_1025568 == 4 ) -{ -dword_1025574 -= a1; -if ( dword_1025574 < 0 || a1 < 0 ) -pb_mode_change(1); -} -return 1; -} -return 0; + if (!dword_1025568 || dword_1025568 <= 0) + return 1; + if (dword_1025568 > 2) + { + if (dword_1025568 == 3) + { + dword_1025574 -= a1; + if (dword_1025574 < 0 || a1 < 0) + pb_mode_change(4); + } + else if (dword_1025568 == 4) + { + dword_1025574 -= a1; + if (dword_1025574 < 0 || a1 < 0) + pb_mode_change(1); + } + return 1; + } + return 0; } // 1025568: using guessed type int dword_1025568; // 1025574: using guessed type int dword_1025574; @@ -97,98 +97,95 @@ return 0; //----- (0101479B) -------------------------------------------------------- int __stdcall pb_end_game() { -struct TPinballTable *v0; // edx -int v1; // esi -int v2; // eax -int **v3; // ecx -int v4; // eax -int *v5; // esi -int v6; // eax -int *v7; // ecx -int v8; // edi -int *v9; // ecx -int *v10; // eax -int v11; // edx -int result; // eax -int v13; // edi -int v14; // ebx -CHAR *v15; // eax -int v16[4]; // [esp+Ch] [ebp-F8h] -int v17[4]; // [esp+1Ch] [ebp-E8h] -int v18; // [esp+2Ch] [ebp-D8h] -int v19; // [esp+30h] [ebp-D4h] -int i; // [esp+34h] [ebp-D0h] -CHAR String1; // [esp+38h] [ebp-CCh] + struct TPinballTable* v0; // edx + int v1; // esi + int v2; // eax + int** v3; // ecx + int v4; // eax + int* v5; // esi + int v6; // eax + int* v7; // ecx + int v8; // edi + int* v9; // ecx + int* v10; // eax + int v11; // edx + int result; // eax + int v13; // edi + int v14; // ebx + CHAR* v15; // eax + int v16[4]; // [esp+Ch] [ebp-F8h] + int v17[4]; // [esp+1Ch] [ebp-E8h] + int v18; // [esp+2Ch] [ebp-D8h] + int v19; // [esp+30h] [ebp-D4h] + int i; // [esp+34h] [ebp-D0h] + CHAR String1; // [esp+38h] [ebp-CCh] -pb_mode_change(2); -v0 = MainTable; -v2 = 0; -v18 = *(_DWORD *)((char *)MainTable + 214); -v1 = v18; -if ( v18 > 0 ) -{ -v3 = (int **)((char *)MainTable + 102); -do -{ -v16[v2] = **v3; -v17[v2] = v2; -++v2; -v3 += 7; -} -while ( v2 < v1 ); -} -v4 = 0; -for ( i = 0; i < v1; ++i ) -{ -v19 = v4; -if ( v4 < v1 ) -{ -v5 = &v16[v4]; -do -{ -v6 = v19; -v7 = &v16[v19]; -v8 = *v7; -if ( *v7 > (unsigned int)*v5 ) -{ -*v7 = *v5; -v9 = &v17[i]; -v10 = &v17[v6]; -v11 = *v10; -*v5 = v8; -*v10 = *v9; -*v9 = v11; -v0 = MainTable; -} -++v19; -} -while ( v19 < v18 ); -v1 = v18; -} -v4 = i + 1; -} -result = 0; -if ( !dword_1025570 && !*(_DWORD *)((char *)v0 + 62) ) -{ -i = 0; -if ( v1 > 0 ) -{ -do -{ -v13 = v16[i]; -v14 = high_score_get_score_position((int)byte_1025578, v16[i]); -if ( v14 >= 0 ) -{ -v15 = get_rc_string(LOWORD(v17[i]) + 26, 0); -lstrcpyA(&String1, v15); -show_and_set_high_score_dialog(byte_1025578, v13, v14, &String1); -} -result = ++i; -} -while ( i < v18 ); -} -} -return result; + pb_mode_change(2); + v0 = MainTable; + v2 = 0; + v18 = *(_DWORD*)((char*)MainTable + 214); + v1 = v18; + if (v18 > 0) + { + v3 = (int**)((char*)MainTable + 102); + do + { + v16[v2] = **v3; + v17[v2] = v2; + ++v2; + v3 += 7; + } while (v2 < v1); + } + v4 = 0; + for (i = 0; i < v1; ++i) + { + v19 = v4; + if (v4 < v1) + { + v5 = &v16[v4]; + do + { + v6 = v19; + v7 = &v16[v19]; + v8 = *v7; + if (*v7 > (unsigned int) * v5) + { + *v7 = *v5; + v9 = &v17[i]; + v10 = &v17[v6]; + v11 = *v10; + *v5 = v8; + *v10 = *v9; + *v9 = v11; + v0 = MainTable; + } + ++v19; + } while (v19 < v18); + v1 = v18; + } + v4 = i + 1; + } + result = 0; + if (!dword_1025570 && !*(_DWORD*)((char*)v0 + 62)) + { + i = 0; + if (v1 > 0) + { + do + { + v13 = v16[i]; + v14 = high_score_get_score_position((int)byte_1025578, v16[i]); + if (v14 >= 0) + { + v15 = get_rc_string(LOWORD(v17[i]) + 26, 0); + lstrcpyA(&String1, v15); + show_and_set_high_score_dialog(byte_1025578, v13, v14, &String1); + } + result = ++i; + } while (i < v18); + } + } + return result; } // 1025570: using guessed type int dword_1025570; // 101479B: using guessed type int var_F8[4]; @@ -197,252 +194,250 @@ return result; //----- (01014908) -------------------------------------------------------- signed int __stdcall pb_chk_highscore() { -int v0; // esi -int v1; // edi + int v0; // esi + int v1; // edi -if ( dword_1025570 ) -return 0; -v0 = *(_DWORD *)((char *)MainTable + 214) - 1; -if ( v0 < 0 ) -return 0; -v1 = 28 * v0; -while ( high_score_get_score_position((int)byte_1025578, **(_DWORD **)((char *)MainTable + v1 + 102)) < 0 ) -{ ---v0; -v1 -= 28; -if ( v0 < 0 ) -return 0; -} -return 1; + if (dword_1025570) + return 0; + v0 = *(_DWORD*)((char*)MainTable + 214) - 1; + if (v0 < 0) + return 0; + v1 = 28 * v0; + while (high_score_get_score_position((int)byte_1025578, **(_DWORD * *)((char*)MainTable + v1 + 102)) < 0) + { + --v0; + v1 -= 28; + if (v0 < 0) + return 0; + } + return 1; } // 1025570: using guessed type int dword_1025570; //----- (01014956) -------------------------------------------------------- -long double __stdcall pb_collide(struct TEdgeSegment *a1, float a2, struct TBall *a3) +long double __stdcall pb_collide(struct TEdgeSegment* a1, float a2, struct TBall* a3) { -struct TBall *v3; // ebx -double v4; // st7 -float v5; // eax -double v6; // st6 -double v7; // st5 -int v8; // eax -double v9; // st7 -double v11; // st7 -struct vector_type *v12; // ST0C_4 -int v13; // [esp+8h] [ebp-40h] -int v14; // [esp+Ch] [ebp-3Ch] -int v15; // [esp+10h] [ebp-38h] -int v16; // [esp+14h] [ebp-34h] -int v17; // [esp+18h] [ebp-30h] -int v18; // [esp+1Ch] [ebp-2Ch] -float v19; // [esp+20h] [ebp-28h] -int v20; // [esp+24h] [ebp-24h] -float v21; // [esp+28h] [ebp-20h] -float v22; // [esp+2Ch] [ebp-1Ch] -int v23; // [esp+30h] [ebp-18h] -float v24; // [esp+34h] [ebp-14h] -float v25; // [esp+38h] [ebp-10h] -float v26; // [esp+3Ch] [ebp-Ch] -struct vector_type *v27; // [esp+40h] [ebp-8h] -float v28; // [esp+44h] [ebp-4h] + struct TBall* v3; // ebx + double v4; // st7 + float v5; // eax + double v6; // st6 + double v7; // st5 + int v8; // eax + double v9; // st7 + double v11; // st7 + struct vector_type* v12; // ST0C_4 + int v13; // [esp+8h] [ebp-40h] + int v14; // [esp+Ch] [ebp-3Ch] + int v15; // [esp+10h] [ebp-38h] + int v16; // [esp+14h] [ebp-34h] + int v17; // [esp+18h] [ebp-30h] + int v18; // [esp+1Ch] [ebp-2Ch] + float v19; // [esp+20h] [ebp-28h] + int v20; // [esp+24h] [ebp-24h] + float v21; // [esp+28h] [ebp-20h] + float v22; // [esp+2Ch] [ebp-1Ch] + int v23; // [esp+30h] [ebp-18h] + float v24; // [esp+34h] [ebp-14h] + float v25; // [esp+38h] [ebp-10h] + float v26; // [esp+3Ch] [ebp-Ch] + struct vector_type* v27; // [esp+40h] [ebp-8h] + float v28; // [esp+44h] [ebp-4h] -v3 = a3; -if ( *((_BYTE *)a3 + 5) && !*(_DWORD *)((char *)a3 + 106) ) -{ -if ( ball_speed_limit < (double)*(float *)((char *)a3 + 66) ) -*(float *)((char *)a3 + 66) = ball_speed_limit; -v4 = a2; -v5 = *(float *)((char *)v3 + 66); -*(float *)((char *)v3 + 74) = a2; -v6 = v4 * *(float *)((char *)v3 + 66); -v27 = (struct TBall *)((char *)v3 + 42); -v13 = *(_DWORD *)((char *)v3 + 42); -*(float *)((char *)v3 + 70) = v6; -v7 = *(float *)&a1; -v14 = *(_DWORD *)((char *)v3 + 46); -*(float *)((char *)v3 + 78) = *(float *)&a1; -v15 = *(_DWORD *)((char *)v3 + 50); -v16 = *(_DWORD *)((char *)v3 + 54); -v17 = *(_DWORD *)((char *)v3 + 58); -v28 = v5; -v8 = *(_DWORD *)((char *)v3 + 110); -v18 = *(_DWORD *)((char *)v3 + 62); -v19 = v6; -v23 = v8; -v21 = v7; -v22 = v4; -v20 = 990057071; -v9 = TEdgeManager::FindCollisionDistance(edge_manager, (struct ray_type *)&v13, v3, &a1); -*(_DWORD *)((char *)v3 + 134) = 0; -*(float *)&a3 = v9; -if ( *(float *)&a3 >= 1000000000.0 ) -{ -v11 = a2 * *(float *)((char *)v3 + 66); -v12 = v27; -*(float *)((char *)v3 + 70) = v11; -v24 = v11 * *(float *)((char *)v3 + 54); -v25 = v11 * *(float *)((char *)v3 + 58); -v26 = 0.0; -vector_add(v12, (struct vector_type *)&v24); -} -else -{ -(**(void (__stdcall ***)(struct TBall *, struct TBall *))a1)(v3, a3); -if ( v28 > 0.000000001 ) -return fabs(*(float *)&a3 / v28); -} -} -return a2; + v3 = a3; + if (*((_BYTE*)a3 + 5) && !*(_DWORD*)((char*)a3 + 106)) + { + if (ball_speed_limit < (double) * (float*)((char*)a3 + 66)) + * (float*)((char*)a3 + 66) = ball_speed_limit; + v4 = a2; + v5 = *(float*)((char*)v3 + 66); + *(float*)((char*)v3 + 74) = a2; + v6 = v4 * *(float*)((char*)v3 + 66); + v27 = (struct TBall*)((char*)v3 + 42); + v13 = *(_DWORD*)((char*)v3 + 42); + *(float*)((char*)v3 + 70) = v6; + v7 = *(float*)& a1; + v14 = *(_DWORD*)((char*)v3 + 46); + *(float*)((char*)v3 + 78) = *(float*)& a1; + v15 = *(_DWORD*)((char*)v3 + 50); + v16 = *(_DWORD*)((char*)v3 + 54); + v17 = *(_DWORD*)((char*)v3 + 58); + v28 = v5; + v8 = *(_DWORD*)((char*)v3 + 110); + v18 = *(_DWORD*)((char*)v3 + 62); + v19 = v6; + v23 = v8; + v21 = v7; + v22 = v4; + v20 = 990057071; + v9 = TEdgeManager::FindCollisionDistance(edge_manager, (struct ray_type*) & v13, v3, &a1); + *(_DWORD*)((char*)v3 + 134) = 0; + *(float*)& a3 = v9; + if (*(float*)& a3 >= 1000000000.0) + { + v11 = a2 * *(float*)((char*)v3 + 66); + v12 = v27; + *(float*)((char*)v3 + 70) = v11; + v24 = v11 * *(float*)((char*)v3 + 54); + v25 = v11 * *(float*)((char*)v3 + 58); + v26 = 0.0; + vector_add(v12, (struct vector_type*) & v24); + } + else + { + (**(void(__stdcall * **)(struct TBall*, struct TBall*))a1)(v3, a3); + if (v28 > 0.000000001) + return fabs(*(float*)& a3 / v28); + } + } + return a2; } // 10253D0: using guessed type float ball_speed_limit; //----- (01014A68) -------------------------------------------------------- void __stdcall pb_timed_frame(float a1, float a2, int a3) { -int v3; // eax -int v4; // edi -int v5; // ebx -int v6; // esi -bool v7; // zf -int v8; // ecx -double v9; // st7 -double v10; // st7 -double v11; // st7 -long double v12; // st7 -int v13; // esi -char v14; // [esp+18h] [ebp-2Ch] -float v15; // [esp+24h] [ebp-20h] -float v16; // [esp+28h] [ebp-1Ch] -float v17; // [esp+2Ch] [ebp-18h] -int v18; // [esp+30h] [ebp-14h] -int v19; // [esp+34h] [ebp-10h] -int v20; // [esp+38h] [ebp-Ch] -float v21; // [esp+3Ch] [ebp-8h] -float v22; // [esp+40h] [ebp-4h] + int v3; // eax + int v4; // edi + int v5; // ebx + int v6; // esi + bool v7; // zf + int v8; // ecx + double v9; // st7 + double v10; // st7 + double v11; // st7 + long double v12; // st7 + int v13; // esi + char v14; // [esp+18h] [ebp-2Ch] + float v15; // [esp+24h] [ebp-20h] + float v16; // [esp+28h] [ebp-1Ch] + float v17; // [esp+2Ch] [ebp-18h] + int v18; // [esp+30h] [ebp-14h] + int v19; // [esp+34h] [ebp-10h] + int v20; // [esp+38h] [ebp-Ch] + float v21; // [esp+3Ch] [ebp-8h] + float v22; // [esp+40h] [ebp-4h] -v3 = *(_DWORD *)((char *)MainTable + 262); -v18 = *(_DWORD *)(v3 + 4); -v4 = v18; -v5 = v3 + 8; -if ( v18 > 0 ) -{ -v19 = v18; -do -{ -v6 = *(_DWORD *)v5; -v7 = *(_BYTE *)(*(_DWORD *)v5 + 5) == 0; -v22 = a2; -if ( !v7 ) -{ -v8 = *(_DWORD *)(v6 + 106); -if ( v8 ) -{ -*(float *)(v6 + 74) = a2; -(*(void (__stdcall **)(int, char *))(*(_DWORD *)v8 + 24))(v6, &v14); -} -else -{ -if ( *((_BYTE *)MainTable + 5) ) -{ -v15 = 0.0; -v16 = 0.0; -v17 = 0.0; -TEdgeManager::FieldEffects(edge_manager, (struct TBall *)v6, (struct vector_type *)&v15); -v15 = v15 * a2; -v16 = v16 * a2; -*(float *)(v6 + 54) = *(float *)(v6 + 66) * *(float *)(v6 + 54); -*(float *)(v6 + 58) = *(float *)(v6 + 66) * *(float *)(v6 + 58); -vector_add((struct vector_type *)(v6 + 54), (struct vector_type *)&v15); -*(float *)(v6 + 66) = normalize_2d((float *)(v6 + 54)); -if ( 0.0 == *(float *)(v6 + 54) ) -v9 = 1000000000.0; -else -v9 = 1.0 / *(float *)(v6 + 54); -*(float *)(v6 + 82) = v9; -if ( 0.0 == *(float *)(v6 + 58) ) -v10 = 1000000000.0; -else -v10 = 1.0 / *(float *)(v6 + 58); -v4 = v18; -*(float *)(v6 + 86) = v10; -} -v11 = a2; -v21 = a1; -v20 = 10; -while ( v11 > 0.000001 && v20 ) -{ -v12 = pb_collide((struct TEdgeSegment *)LODWORD(v21), v22, (struct TBall *)v6); ---v20; -v22 = v22 - v12; -v21 = v12 + v21; -v11 = v22; -} -} -} -v5 += 4; ---v19; -} -while ( v19 ); -} -if ( a3 ) -{ -v13 = *(_DWORD *)((char *)MainTable + 262) + 8; -if ( v4 > 0 ) -{ -do -{ -if ( *(_BYTE *)(*(_DWORD *)v13 + 5) ) -(*(void (**)(void))(**(_DWORD **)v13 + 20))(); -v13 += 4; ---v4; -} -while ( v4 ); -} -} + v3 = *(_DWORD*)((char*)MainTable + 262); + v18 = *(_DWORD*)(v3 + 4); + v4 = v18; + v5 = v3 + 8; + if (v18 > 0) + { + v19 = v18; + do + { + v6 = *(_DWORD*)v5; + v7 = *(_BYTE*)(*(_DWORD*)v5 + 5) == 0; + v22 = a2; + if (!v7) + { + v8 = *(_DWORD*)(v6 + 106); + if (v8) + { + *(float*)(v6 + 74) = a2; + (*(void(__stdcall * *)(int, char*))(*(_DWORD*)v8 + 24))(v6, &v14); + } + else + { + if (*((_BYTE*)MainTable + 5)) + { + v15 = 0.0; + v16 = 0.0; + v17 = 0.0; + TEdgeManager::FieldEffects(edge_manager, (struct TBall*)v6, (struct vector_type*) & v15); + v15 = v15 * a2; + v16 = v16 * a2; + *(float*)(v6 + 54) = *(float*)(v6 + 66) * *(float*)(v6 + 54); + *(float*)(v6 + 58) = *(float*)(v6 + 66) * *(float*)(v6 + 58); + vector_add((struct vector_type*)(v6 + 54), (struct vector_type*) & v15); + *(float*)(v6 + 66) = normalize_2d((float*)(v6 + 54)); + if (0.0 == *(float*)(v6 + 54)) + v9 = 1000000000.0; + else + v9 = 1.0 / *(float*)(v6 + 54); + *(float*)(v6 + 82) = v9; + if (0.0 == *(float*)(v6 + 58)) + v10 = 1000000000.0; + else + v10 = 1.0 / *(float*)(v6 + 58); + v4 = v18; + *(float*)(v6 + 86) = v10; + } + v11 = a2; + v21 = a1; + v20 = 10; + while (v11 > 0.000001 && v20) + { + v12 = pb_collide((struct TEdgeSegment*)LODWORD(v21), v22, (struct TBall*)v6); + --v20; + v22 = v22 - v12; + v21 = v12 + v21; + v11 = v22; + } + } + } + v5 += 4; + --v19; + } while (v19); + } + if (a3) + { + v13 = *(_DWORD*)((char*)MainTable + 262) + 8; + if (v4 > 0) + { + do + { + if (*(_BYTE*)(*(_DWORD*)v13 + 5)) + (*(void (**)(void))(**(_DWORD * *)v13 + 20))(); + v13 += 4; + --v4; + } while (v4); + } + } } //----- (01014BF9) -------------------------------------------------------- -signed int __userpurge pb_frame@(int a1@, int a2) +signed int __userpurge pb_frame@ (int a1@ , int a2) { -double v2; // st7 -char *v3; // eax -float v5; // [esp+10h] [ebp-4h] + double v2; // st7 + char* v3; // eax + float v5; // [esp+10h] [ebp-4h] -if ( a2 > 100 ) -a2 = 100; -v5 = (double)a2 * 0.001; -if ( !pb_mode_countdown(a2) ) -{ -time_next = time_now + v5; -pb_timed_frame(time_now, v5, 1); -time_now = time_next; -time_ticks += a2; -if ( nudged_left || nudged_right || nudged_up ) -{ -nudge_count = v5 * 4.0 + nudge_count; -} -else -{ -v2 = nudge_count - v5; -if ( v2 <= 0.0 ) -v2 = 0.0; -nudge_count = v2; -} -timer_check(); -render_update(); -score_update(a1, *(int **)((char *)MainTable + 50)); -if ( !*(_DWORD *)((char *)MainTable + 370) ) -{ -if ( nudge_count > 0.5 ) -{ -v3 = get_rc_string(25, 0); -TTextBox::Display(InfoTextBox, a1, v3, 2.0); -} -if ( nudge_count > 1.0 ) -TPinballTable::tilt(MainTable, a1, time_now); -} -} -return 1; + if (a2 > 100) + a2 = 100; + v5 = (double)a2 * 0.001; + if (!pb_mode_countdown(a2)) + { + time_next = time_now + v5; + pb_timed_frame(time_now, v5, 1); + time_now = time_next; + time_ticks += a2; + if (nudged_left || nudged_right || nudged_up) + { + nudge_count = v5 * 4.0 + nudge_count; + } + else + { + v2 = nudge_count - v5; + if (v2 <= 0.0) + v2 = 0.0; + nudge_count = v2; + } + timer_check(); + render_update(); + score_update(a1, *(int**)((char*)MainTable + 50)); + if (!*(_DWORD*)((char*)MainTable + 370)) + { + if (nudge_count > 0.5) + { + v3 = get_rc_string(25, 0); + TTextBox::Display(InfoTextBox, a1, v3, 2.0); + } + if (nudge_count > 1.0) + TPinballTable::tilt(MainTable, a1, time_now); + } + } + return 1; } // 1024F84: using guessed type int time_ticks; // 1025630: using guessed type float time_now; @@ -455,123 +450,122 @@ return 1; //----- (01014D3D) -------------------------------------------------------- void __stdcall pb_firsttime_setup() { -render_blit = 0; -render_update(); -render_blit = 1; + render_blit = 0; + render_update(); + render_blit = 1; } // 1024754: using guessed type int render_blit; //----- (01014D59) -------------------------------------------------------- -struct TPinballTable *__usercall pb_tilt_no_more@(int a1@) +struct TPinballTable* __usercall pb_tilt_no_more@ (int a1@ ) { -struct TPinballTable *result; // eax + struct TPinballTable* result; // eax -if ( *(_DWORD *)((char *)MainTable + 370) ) -TTextBox::Clear(InfoTextBox, a1); -result = MainTable; -*(_DWORD *)((char *)MainTable + 370) = 0; -nudge_count = -2.0; -return result; + if (*(_DWORD*)((char*)MainTable + 370)) + TTextBox::Clear(InfoTextBox, a1); + result = MainTable; + *(_DWORD*)((char*)MainTable + 370) = 0; + nudge_count = -2.0; + return result; } // 102564C: using guessed type float nudge_count; //----- (01014D8E) -------------------------------------------------------- void __stdcall pb_ballset(signed int a1, signed int a2) { -int v2; // esi + int v2; // esi -v2 = *(_DWORD *)(*(_DWORD *)((char *)MainTable + 262) + 8); -*(float *)(v2 + 54) = (double)a1 * 30.0; -*(float *)(v2 + 58) = (double)a2 * 30.0; -*(float *)(v2 + 66) = normalize_2d((float *)(v2 + 54)); + v2 = *(_DWORD*)(*(_DWORD*)((char*)MainTable + 262) + 8); + *(float*)(v2 + 54) = (double)a1 * 30.0; + *(float*)(v2 + 58) = (double)a2 * 30.0; + *(float*)(v2 + 66) = normalize_2d((float*)(v2 + 54)); } //----- (01014DCF) -------------------------------------------------------- void __stdcall nudge(float a1, float a2) { -struct TPinballTable *v2; // eax -int v3; // ecx -int v4; // edx -int v5; // ebx -int v6; // esi -double v7; // st7 -double v8; // st7 -int v9; // ST18_4 -int v10; // ST14_4 -int v11; // ST08_4 -double v12; // st7 -float v13; // [esp+20h] [ebp-10h] -float v14; // [esp+24h] [ebp-Ch] -int v15; // [esp+2Ch] [ebp-4h] + struct TPinballTable* v2; // eax + int v3; // ecx + int v4; // edx + int v5; // ebx + int v6; // esi + double v7; // st7 + double v8; // st7 + int v9; // ST18_4 + int v10; // ST14_4 + int v11; // ST08_4 + double v12; // st7 + float v13; // [esp+20h] [ebp-10h] + float v14; // [esp+24h] [ebp-Ch] + int v15; // [esp+2Ch] [ebp-4h] -v2 = MainTable; -v3 = *(_DWORD *)((char *)MainTable + 262); -v4 = *(_DWORD *)(v3 + 4); -v13 = a1 * 0.5; -v5 = v3 + 8; -v14 = a2 * 0.5; -if ( v4 > 0 ) -{ -v15 = v4; -do -{ -v6 = *(_DWORD *)v5; -if ( *(_BYTE *)(*(_DWORD *)v5 + 5) && !*(_DWORD *)(v6 + 106) ) -{ -*(float *)(v6 + 54) = *(float *)(v6 + 54) * *(float *)(v6 + 66); -*(float *)(v6 + 58) = *(float *)(v6 + 58) * *(float *)(v6 + 66); -vector_add((struct vector_type *)(v6 + 54), (struct vector_type *)&v13); -*(float *)(v6 + 66) = normalize_2d((float *)(v6 + 54)); -if ( 0.0 == *(float *)(v6 + 54) ) -v7 = 1000000000.0; -else -v7 = 1.0 / *(float *)(v6 + 54); -*(float *)(v6 + 82) = v7; -if ( 0.0 == *(float *)(v6 + 58) ) -v8 = 1000000000.0; -else -v8 = 1.0 / *(float *)(v6 + 58); -*(float *)(v6 + 86) = v8; -v2 = MainTable; -} -v5 += 4; ---v15; -} -while ( v15 ); -} -v9 = *(_DWORD *)((char *)v2 + 246); -v10 = *(_DWORD *)((char *)v2 + 242); -v11 = (signed __int64)_floor(0.5 - a2); -v12 = _floor(a1 + 0.5); -render_shift((signed __int64)v12, v11, 0, 0, v10, v9); + v2 = MainTable; + v3 = *(_DWORD*)((char*)MainTable + 262); + v4 = *(_DWORD*)(v3 + 4); + v13 = a1 * 0.5; + v5 = v3 + 8; + v14 = a2 * 0.5; + if (v4 > 0) + { + v15 = v4; + do + { + v6 = *(_DWORD*)v5; + if (*(_BYTE*)(*(_DWORD*)v5 + 5) && !*(_DWORD*)(v6 + 106)) + { + *(float*)(v6 + 54) = *(float*)(v6 + 54) * *(float*)(v6 + 66); + *(float*)(v6 + 58) = *(float*)(v6 + 58) * *(float*)(v6 + 66); + vector_add((struct vector_type*)(v6 + 54), (struct vector_type*) & v13); + *(float*)(v6 + 66) = normalize_2d((float*)(v6 + 54)); + if (0.0 == *(float*)(v6 + 54)) + v7 = 1000000000.0; + else + v7 = 1.0 / *(float*)(v6 + 54); + *(float*)(v6 + 82) = v7; + if (0.0 == *(float*)(v6 + 58)) + v8 = 1000000000.0; + else + v8 = 1.0 / *(float*)(v6 + 58); + *(float*)(v6 + 86) = v8; + v2 = MainTable; + } + v5 += 4; + --v15; + } while (v15); + } + v9 = *(_DWORD*)((char*)v2 + 246); + v10 = *(_DWORD*)((char*)v2 + 242); + v11 = (signed __int64)_floor(0.5 - a2); + v12 = _floor(a1 + 0.5); + render_shift((signed __int64)v12, v11, 0, 0, v10, v9); } //----- (01014EEE) -------------------------------------------------------- -void __stdcall un_nudge_left(int a1, void *a2) +void __stdcall un_nudge_left(int a1, void* a2) { -if ( nudged_left ) -nudge(2.0, -1.0); -nudged_left = 0; + if (nudged_left) + nudge(2.0, -1.0); + nudged_left = 0; } // 102563C: using guessed type int nudged_left; //----- (01014F20) -------------------------------------------------------- -void __stdcall un_nudge_right(int a1, void *a2) +void __stdcall un_nudge_right(int a1, void* a2) { -if ( nudged_right ) -nudge(-2.0, -1.0); -nudged_right = 0; + if (nudged_right) + nudge(-2.0, -1.0); + nudged_right = 0; } // 1025640: using guessed type int nudged_right; //----- (01014F52) -------------------------------------------------------- void __stdcall nudge_left() { -nudge(-2.0, 1.0); -if ( nudge_timer ) -timer_kill(nudge_timer); -nudge_timer = timer_set(0.40000001, 0, (int)un_nudge_left); -nudged_left = 1; + nudge(-2.0, 1.0); + if (nudge_timer) + timer_kill(nudge_timer); + nudge_timer = timer_set(0.40000001, 0, (int)un_nudge_left); + nudged_left = 1; } // 102563C: using guessed type int nudged_left; // 1025648: using guessed type int nudge_timer; @@ -579,32 +573,32 @@ nudged_left = 1; //----- (01014FA4) -------------------------------------------------------- void __stdcall nudge_right() { -nudge(2.0, 1.0); -if ( nudge_timer ) -timer_kill(nudge_timer); -nudge_timer = timer_set(0.40000001, 0, (int)un_nudge_right); -nudged_right = 1; + nudge(2.0, 1.0); + if (nudge_timer) + timer_kill(nudge_timer); + nudge_timer = timer_set(0.40000001, 0, (int)un_nudge_right); + nudged_right = 1; } // 1025640: using guessed type int nudged_right; // 1025648: using guessed type int nudge_timer; //----- (01014FF6) -------------------------------------------------------- -void __stdcall un_nudge_up(int a1, void *a2) +void __stdcall un_nudge_up(int a1, void* a2) { -if ( nudged_up ) -nudge(0.0, -1.0); -nudged_up = 0; + if (nudged_up) + nudge(0.0, -1.0); + nudged_up = 0; } // 1025644: using guessed type int nudged_up; //----- (01015024) -------------------------------------------------------- void __stdcall nudge_up() { -nudge(0.0, 1.0); -if ( nudge_timer ) -timer_kill(nudge_timer); -nudge_timer = timer_set(0.40000001, 0, (int)un_nudge_up); -nudged_up = 1; + nudge(0.0, 1.0); + if (nudge_timer) + timer_kill(nudge_timer); + nudge_timer = timer_set(0.40000001, 0, (int)un_nudge_up); + nudged_up = 1; } // 1025644: using guessed type int nudged_up; // 1025648: using guessed type int nudge_timer; @@ -612,123 +606,123 @@ nudged_up = 1; //----- (01015072) -------------------------------------------------------- void __stdcall pb_keydown(HKEY a1) { -CHAR *v1; // eax -int v2; // eax -int v3; // edx -int v4; // esi -int v5; // ecx -TBall *v6; // eax -TBall *v7; // eax -int v8; // ecx -CHAR String1; // [esp+Ch] [ebp-E0h] -char Dest; // [esp+D4h] [ebp-18h] + CHAR* v1; // eax + int v2; // eax + int v3; // edx + int v4; // esi + int v5; // ecx + TBall* v6; // eax + TBall* v7; // eax + int v8; // ecx + CHAR String1; // [esp+Ch] [ebp-E0h] + char Dest; // [esp+D4h] [ebp-18h] -if ( single_step || dword_1025570 ) -return; -if ( dword_1025568 != 1 ) -{ -pb_mode_countdown(-1); -return; -} -pbctrl_bdoor_controller(0, (int)a1); -if ( a1 == dword_1028238 ) -{ -(**(void (__stdcall ***)(signed int, _DWORD))MainTable)(1000, LODWORD(time_now)); -return; -} -if ( a1 == dword_102823C ) -{ -(**(void (__stdcall ***)(signed int, _DWORD))MainTable)(1002, LODWORD(time_now)); -} -else -{ -if ( a1 == dword_1028240 ) -{ -(**(void (__stdcall ***)(signed int, _DWORD))MainTable)(1004, LODWORD(time_now)); -return; -} -if ( a1 == dword_1028244 ) -{ -if ( !*(_DWORD *)((char *)MainTable + 370) ) -nudge_right(); -return; -} -if ( a1 == dword_1028248 ) -{ -if ( !*(_DWORD *)((char *)MainTable + 370) ) -nudge_left(); -return; -} -if ( a1 == dword_102824C ) -{ -if ( !*(_DWORD *)((char *)MainTable + 370) ) -nudge_up(); -return; -} -} -if ( cheat_mode ) -{ -if ( a1 == (HKEY)66 ) -{ -v2 = *(_DWORD *)((char *)MainTable + 262); -v3 = *(_DWORD *)(v2 + 4); -v4 = 0; -v5 = v2 + 8; -if ( v3 <= 0 ) -{ -LABEL_36: -v7 = (TBall *)TPinballComponent::operator new(0x16Au); -if ( v7 ) -v6 = TBall::TBall(v7, MainTable); -else -v6 = 0; -} -else -{ -while ( 1 ) -{ -v6 = *(TBall **)v5; -if ( !*(_BYTE *)(*(_DWORD *)v5 + 5) ) -break; -++v4; -v5 += 4; -if ( v4 >= v3 ) -goto LABEL_36; -} -} -v8 = *(_DWORD *)((char *)v6 + 154); -*(float *)((char *)v6 + 42) = 1.0; -*((_BYTE *)v6 + 5) = 1; -*(_DWORD *)((char *)v6 + 50) = v8; -*(float *)((char *)v6 + 46) = 1.0; -*(float *)((char *)v6 + 62) = 0.0; -*(float *)((char *)v6 + 58) = 0.0; -*(float *)((char *)v6 + 54) = 0.0; -} -else if ( a1 == (HKEY)72 ) -{ -v1 = get_rc_string(26, 0); -lstrcpyA(&String1, v1); -show_and_set_high_score_dialog(byte_1025578, 1000000000, 1, &String1); -} -else if ( a1 == (HKEY)77 ) -{ -_sprintf(&Dest, "%ld", memory_use_total); -MessageBoxA(hwnd_frame, &Dest, "Mem:", 0x2000u); -} -else if ( a1 == (HKEY)82 ) -{ -cheat_bump_rank(0); -} -else if ( a1 == (HKEY)122 ) -{ -gdrv_get_focus(); -} -else if ( (HKEY)((char *)a1 - 122) == (HKEY)1 ) -{ -(*(void (**)(void))(*(_DWORD *)MainTable + 4))(); -} -} + if (single_step || dword_1025570) + return; + if (dword_1025568 != 1) + { + pb_mode_countdown(-1); + return; + } + pbctrl_bdoor_controller(0, (int)a1); + if (a1 == dword_1028238) + { + (**(void(__stdcall * **)(signed int, _DWORD))MainTable)(1000, LODWORD(time_now)); + return; + } + if (a1 == dword_102823C) + { + (**(void(__stdcall * **)(signed int, _DWORD))MainTable)(1002, LODWORD(time_now)); + } + else + { + if (a1 == dword_1028240) + { + (**(void(__stdcall * **)(signed int, _DWORD))MainTable)(1004, LODWORD(time_now)); + return; + } + if (a1 == dword_1028244) + { + if (!*(_DWORD*)((char*)MainTable + 370)) + nudge_right(); + return; + } + if (a1 == dword_1028248) + { + if (!*(_DWORD*)((char*)MainTable + 370)) + nudge_left(); + return; + } + if (a1 == dword_102824C) + { + if (!*(_DWORD*)((char*)MainTable + 370)) + nudge_up(); + return; + } + } + if (cheat_mode) + { + if (a1 == (HKEY)66) + { + v2 = *(_DWORD*)((char*)MainTable + 262); + v3 = *(_DWORD*)(v2 + 4); + v4 = 0; + v5 = v2 + 8; + if (v3 <= 0) + { + LABEL_36: + v7 = (TBall*)TPinballComponent::operator new(0x16Au); + if (v7) + v6 = TBall::TBall(v7, MainTable); + else + v6 = 0; + } + else + { + while (1) + { + v6 = *(TBall * *)v5; + if (!*(_BYTE*)(*(_DWORD*)v5 + 5)) + break; + ++v4; + v5 += 4; + if (v4 >= v3) + goto LABEL_36; + } + } + v8 = *(_DWORD*)((char*)v6 + 154); + *(float*)((char*)v6 + 42) = 1.0; + *((_BYTE*)v6 + 5) = 1; + *(_DWORD*)((char*)v6 + 50) = v8; + *(float*)((char*)v6 + 46) = 1.0; + *(float*)((char*)v6 + 62) = 0.0; + *(float*)((char*)v6 + 58) = 0.0; + *(float*)((char*)v6 + 54) = 0.0; + } + else if (a1 == (HKEY)72) + { + v1 = get_rc_string(26, 0); + lstrcpyA(&String1, v1); + show_and_set_high_score_dialog(byte_1025578, 1000000000, 1, &String1); + } + else if (a1 == (HKEY)77) + { + _sprintf(&Dest, "%ld", memory_use_total); + MessageBoxA(hwnd_frame, &Dest, "Mem:", 0x2000u); + } + else if (a1 == (HKEY)82) + { + cheat_bump_rank(0); + } + else if (a1 == (HKEY)122) + { + gdrv_get_focus(); + } + else if ((HKEY)((char*)a1 - 122) == (HKEY)1) + { + (*(void (**)(void))(*(_DWORD*)MainTable + 4))(); + } + } } // 1024F00: using guessed type int memory_use_total; // 1024FD8: using guessed type int single_step; @@ -740,33 +734,33 @@ else if ( (HKEY)((char *)a1 - 122) == (HKEY)1 ) //----- (010152E4) -------------------------------------------------------- void __stdcall pb_keyup(HKEY a1) { -if ( dword_1025568 == 1 && !single_step && !dword_1025570 ) -{ -if ( a1 == dword_1028238 ) -{ -(**(void (__stdcall ***)(signed int, _DWORD))MainTable)(1001, LODWORD(time_now)); -} -else if ( a1 == dword_102823C ) -{ -(**(void (__stdcall ***)(signed int, _DWORD))MainTable)(1003, LODWORD(time_now)); -} -else if ( a1 == dword_1028240 ) -{ -(**(void (__stdcall ***)(signed int, _DWORD))MainTable)(1005, LODWORD(time_now)); -} -else if ( a1 == dword_1028244 ) -{ -un_nudge_right(0, 0); -} -else if ( a1 == dword_1028248 ) -{ -un_nudge_left(0, 0); -} -else if ( a1 == dword_102824C ) -{ -un_nudge_up(0, 0); -} -} + if (dword_1025568 == 1 && !single_step && !dword_1025570) + { + if (a1 == dword_1028238) + { + (**(void(__stdcall * **)(signed int, _DWORD))MainTable)(1001, LODWORD(time_now)); + } + else if (a1 == dword_102823C) + { + (**(void(__stdcall * **)(signed int, _DWORD))MainTable)(1003, LODWORD(time_now)); + } + else if (a1 == dword_1028240) + { + (**(void(__stdcall * **)(signed int, _DWORD))MainTable)(1005, LODWORD(time_now)); + } + else if (a1 == dword_1028244) + { + un_nudge_right(0, 0); + } + else if (a1 == dword_1028248) + { + un_nudge_left(0, 0); + } + else if (a1 == dword_102824C) + { + un_nudge_up(0, 0); + } + } } // 1024FD8: using guessed type int single_step; // 1025568: using guessed type int dword_1025568; @@ -776,125 +770,123 @@ un_nudge_up(0, 0); //----- (010153AE) -------------------------------------------------------- int __stdcall pb_replay_level(int a1) { -float v1; // ST04_4 + float v1; // ST04_4 -dword_1025570 = a1; -pb_mode_change(1); -if ( phkResult ) -midi_play_pb_theme(0); -v1 = (double)(signed int)dword_1028234; -return (**(int (__stdcall ***)(signed int, _DWORD))MainTable)(1014, LODWORD(v1)); + dword_1025570 = a1; + pb_mode_change(1); + if (phkResult) + midi_play_pb_theme(0); + v1 = (double)(signed int)dword_1028234; + return (**(int(__stdcall * **)(signed int, _DWORD))MainTable)(1014, LODWORD(v1)); } // 1025570: using guessed type int dword_1025570; //----- (010153F4) -------------------------------------------------------- INT_PTR __stdcall pb_high_scores() { -return show_high_score_dialog(byte_1025578); + return show_high_score_dialog(byte_1025578); } //----- (01015404) -------------------------------------------------------- -_DWORD *__stdcall pb_window_size(_DWORD *a1, _DWORD *a2) +_DWORD* __stdcall pb_window_size(_DWORD* a1, _DWORD* a2) { -_DWORD *result; // eax + _DWORD* result; // eax -*a1 = 600; -result = a2; -*a2 = 416; -return result; + *a1 = 600; + result = a2; + *a2 = 416; + return result; } //----- (01015424) -------------------------------------------------------- int __stdcall pb_init() { -int result; // eax -int v1; // eax -signed __int16 *v2; // ebx -_DWORD *v3; // edi -_DWORD *v4; // esi -char *v5; // eax -signed int v6; // ecx -double v7; // st7 -double v8; // st5 -int v9; // ST1C_4 -int v10; // ST18_4 -int v11; // ST14_4 -int *v12; // esi -TPinballTable *v13; // eax -double v14; // st7 -char v15; // [esp+1Ch] [ebp-294h] -float v16; // [esp+4Ch] [ebp-264h] -float v17; // [esp+50h] [ebp-260h] -CHAR String1; // [esp+54h] [ebp-25Ch] -CHAR Filename; // [esp+180h] [ebp-130h] + int result; // eax + int v1; // eax + signed __int16* v2; // ebx + _DWORD* v3; // edi + _DWORD* v4; // esi + char* v5; // eax + signed int v6; // ecx + double v7; // st7 + double v8; // st5 + int v9; // ST1C_4 + int v10; // ST18_4 + int v11; // ST14_4 + int* v12; // esi + TPinballTable* v13; // eax + double v14; // st7 + char v15; // [esp+1Ch] [ebp-294h] + float v16; // [esp+4Ch] [ebp-264h] + float v17; // [esp+50h] [ebp-260h] + CHAR String1; // [esp+54h] [ebp-25Ch] + CHAR Filename; // [esp+180h] [ebp-130h] -++memory_critical_allocation; -lstrcpyA(&String1, byte_102543C); -make_path_name(&Filename, &String1, 0x12Cu); -v17 = 0.0; -pb_record_table = (int)partman_load_records(&Filename); -get_rc_int(158, (int *)&v17); -if ( v17 != 0.0 ) -score_load_msg_font("pbmsg_ft"); -if ( !pb_record_table ) -return pb_record_table + 1; -v1 = partman_field_labeled(pb_record_table, "background", 5); -gdrv_display_palette(v1); -v2 = (signed __int16 *)partman_field_labeled(pb_record_table, "table_size", 10); -v3 = (_DWORD *)partman_field_labeled(pb_record_table, "background", 1); -v4 = (_DWORD *)partman_field_labeled(pb_record_table, "camera_info", 11); -if ( v4 ) -{ -v5 = &v15; -LODWORD(v17) = 3; -do -{ -v6 = 4; -do -{ -*(_DWORD *)v5 = *v4; -++v4; -v5 += 4; ---v6; -} -while ( v6 ); ---LODWORD(v17); -} -while ( v17 != 0.0 ); -v7 = *(float *)v4; -LODWORD(v17) = v2[1]; -v8 = (double)SLODWORD(v17); -LODWORD(v17) = *v2; -*(float *)&v9 = v8 * 0.5; -*(float *)&v10 = 0.5 * (double)SLODWORD(v17); -*(float *)&v11 = v7; -proj_init((int)&v15, v11, v10, v9); -v12 = v4 + 1; -v16 = *(float *)v12; -v17 = *((float *)v12 + 1); -} -render_init(0, v16, v17, *v2, v2[1]); -gdrv_copy_bitmap(&vscreen, v3[3], v3[4], *(_DWORD *)((char *)v3 + 29), *(_DWORD *)((char *)v3 + 33), v3, 0, 0); -gdrv_destroy_bitmap((int)v3); -loader_loadfrom((_WORD *)pb_record_table); -if ( play_midi_music ) -pb_mode_change(1); -else -pb_mode_change(3); -time_ticks = 0; -timer_init(150); -score_init(); -v13 = (TPinballTable *)TPinballComponent::operator new(0x176u); -if ( v13 ) -MainTable = TPinballTable::TPinballTable(v13); -else -MainTable = 0; -high_score_read((int)byte_1025578, (int)&pb_state); -v14 = *(float *)(*(_DWORD *)(*(_DWORD *)((char *)MainTable + 262) + 8) + 154); ---memory_critical_allocation; -result = 0; -ball_speed_limit = v14 * 200.0; -return result; + ++memory_critical_allocation; + lstrcpyA(&String1, byte_102543C); + make_path_name(&Filename, &String1, 0x12Cu); + v17 = 0.0; + pb_record_table = (int)partman_load_records(&Filename); + get_rc_int(158, (int*)& v17); + if (v17 != 0.0) + score_load_msg_font("pbmsg_ft"); + if (!pb_record_table) + return pb_record_table + 1; + v1 = partman_field_labeled(pb_record_table, "background", 5); + gdrv_display_palette(v1); + v2 = (signed __int16*)partman_field_labeled(pb_record_table, "table_size", 10); + v3 = (_DWORD*)partman_field_labeled(pb_record_table, "background", 1); + v4 = (_DWORD*)partman_field_labeled(pb_record_table, "camera_info", 11); + if (v4) + { + v5 = &v15; + LODWORD(v17) = 3; + do + { + v6 = 4; + do + { + *(_DWORD*)v5 = *v4; + ++v4; + v5 += 4; + --v6; + } while (v6); + --LODWORD(v17); + } while (v17 != 0.0); + v7 = *(float*)v4; + LODWORD(v17) = v2[1]; + v8 = (double)SLODWORD(v17); + LODWORD(v17) = *v2; + *(float*)& v9 = v8 * 0.5; + *(float*)& v10 = 0.5 * (double)SLODWORD(v17); + *(float*)& v11 = v7; + proj_init((int)& v15, v11, v10, v9); + v12 = v4 + 1; + v16 = *(float*)v12; + v17 = *((float*)v12 + 1); + } + render_init(0, v16, v17, *v2, v2[1]); + gdrv_copy_bitmap(&vscreen, v3[3], v3[4], *(_DWORD*)((char*)v3 + 29), *(_DWORD*)((char*)v3 + 33), v3, 0, 0); + gdrv_destroy_bitmap((int)v3); + loader_loadfrom((_WORD*)pb_record_table); + if (play_midi_music) + pb_mode_change(1); + else + pb_mode_change(3); + time_ticks = 0; + timer_init(150); + score_init(); + v13 = (TPinballTable*)TPinballComponent::operator new(0x176u); + if (v13) + MainTable = TPinballTable::TPinballTable(v13); + else + MainTable = 0; + high_score_read((int)byte_1025578, (int)& pb_state); + v14 = *(float*)(*(_DWORD*)(*(_DWORD*)((char*)MainTable + 262) + 8) + 154); + --memory_critical_allocation; + result = 0; + ball_speed_limit = v14 * 200.0; + return result; } // 1024F04: using guessed type int memory_critical_allocation; // 1024F84: using guessed type int time_ticks; @@ -904,69 +896,69 @@ return result; //----- (0101566E) -------------------------------------------------------- int __stdcall pb_uninit() { -score_unload_msg_font(); -loader_unload(); -partman_unload_records((_WORD *)pb_record_table); -high_score_write(byte_1025578, (int)&pb_state); -if ( MainTable ) -(*(void (__stdcall **)(signed int))(*(_DWORD *)MainTable + 16))(1); -MainTable = 0; -gdrv_get_focus(); -timer_uninit(); -render_uninit(); -return 0; + score_unload_msg_font(); + loader_unload(); + partman_unload_records((_WORD*)pb_record_table); + high_score_write(byte_1025578, (int)& pb_state); + if (MainTable) + (*(void(__stdcall * *)(signed int))(*(_DWORD*)MainTable + 16))(1); + MainTable = 0; + gdrv_get_focus(); + timer_uninit(); + render_uninit(); + return 0; } //----- (010156C1) -------------------------------------------------------- int __stdcall pb_loose_focus() { -int result; // eax + int result; // eax -if ( MainTable ) -result = (**(int (__stdcall ***)(signed int, _DWORD))MainTable)(1010, LODWORD(time_now)); -return result; + if (MainTable) + result = (**(int(__stdcall * **)(signed int, _DWORD))MainTable)(1010, LODWORD(time_now)); + return result; } // 1025630: using guessed type float time_now; //----- (010156E4) -------------------------------------------------------- -void __usercall pb_pause_continue(int a1@) +void __usercall pb_pause_continue(int a1@ ) { -char *v1; // eax -char *v2; // eax -float v3; // [esp+8h] [ebp-8h] + char* v1; // eax + char* v2; // eax + float v3; // [esp+8h] [ebp-8h] -single_step = single_step == 0; -TTextBox::Clear(InfoTextBox, a1); -TTextBox::Clear(MissTextBox, a1); -if ( single_step ) -{ -if ( MainTable ) -(**(void (__stdcall ***)(signed int, _DWORD))MainTable)(1008, LODWORD(time_now)); -v1 = get_rc_string(22, 0); -TTextBox::Display(InfoTextBox, a1, v1, -1.0); -midi_music_stop(); -} -else -{ -if ( MainTable ) -(**(void (__stdcall ***)(signed int, _DWORD))MainTable)(1009, 0.0); -if ( !dword_1025570 ) -{ -if ( dword_1025568 == 2 ) -{ -v3 = -1.0; -v2 = get_rc_string(24, 0); -} -else -{ -v3 = 5.0; -v2 = get_rc_string(23, 0); -} -TTextBox::Display(InfoTextBox, a1, v2, v3); -} -if ( phkResult && !single_step ) -midi_play_pb_theme(0); -} + single_step = single_step == 0; + TTextBox::Clear(InfoTextBox, a1); + TTextBox::Clear(MissTextBox, a1); + if (single_step) + { + if (MainTable) + (**(void(__stdcall * **)(signed int, _DWORD))MainTable)(1008, LODWORD(time_now)); + v1 = get_rc_string(22, 0); + TTextBox::Display(InfoTextBox, a1, v1, -1.0); + midi_music_stop(); + } + else + { + if (MainTable) + (**(void(__stdcall * **)(signed int, _DWORD))MainTable)(1009, 0.0); + if (!dword_1025570) + { + if (dword_1025568 == 2) + { + v3 = -1.0; + v2 = get_rc_string(24, 0); + } + else + { + v3 = 5.0; + v2 = get_rc_string(23, 0); + } + TTextBox::Display(InfoTextBox, a1, v2, v3); + } + if (phkResult && !single_step) + midi_play_pb_theme(0); + } } // 1024FD8: using guessed type int single_step; // 1025568: using guessed type int dword_1025568; @@ -976,44 +968,44 @@ midi_play_pb_theme(0); //----- (010157C3) -------------------------------------------------------- int __stdcall pb_launch_ball() { -return (***(int (__stdcall ****)(signed int, _DWORD))((char *)MainTable + 222))(1017, 0.0); + return (***(int(__stdcall * ***)(signed int, _DWORD))((char*)MainTable + 222))(1017, 0.0); } //----- (010157E3) -------------------------------------------------------- int __stdcall pb_reset_table() { -int result; // eax + int result; // eax -if ( MainTable ) -result = (**(int (__stdcall ***)(signed int, _DWORD))MainTable)(1024, 0.0); -return result; + if (MainTable) + result = (**(int(__stdcall * **)(signed int, _DWORD))MainTable)(1024, 0.0); + return result; } //----- (01015802) -------------------------------------------------------- -void __usercall pb_toggle_demo(int a1@) +void __usercall pb_toggle_demo(int a1@ ) { -char *v1; // eax + char* v1; // eax -if ( dword_1025570 ) -{ -dword_1025570 = 0; -(**(void (__stdcall ***)(signed int, _DWORD))MainTable)(1024, 0.0); -pb_mode_change(2); -TTextBox::Clear(MissTextBox, a1); -v1 = get_rc_string(24, 0); -TTextBox::Display(InfoTextBox, a1, v1, -1.0); -} -else -{ -pb_replay_level(1); -} + if (dword_1025570) + { + dword_1025570 = 0; + (**(void(__stdcall * **)(signed int, _DWORD))MainTable)(1024, 0.0); + pb_mode_change(2); + TTextBox::Clear(MissTextBox, a1); + v1 = get_rc_string(24, 0); + TTextBox::Display(InfoTextBox, a1, v1, -1.0); + } + else + { + pb_replay_level(1); + } } // 1025570: using guessed type int dword_1025570; //----- (010211D0) -------------------------------------------------------- int __stdcall check_expiration_date() { -return 0; + return 0; } // ALL OK, 648 function(s) have been successfully decompiled