#include "TRamp.h" //----- (01016AEC) -------------------------------------------------------- int __thiscall TRamp::get_scoring(TRamp *this, int a2) { int result; // eax if ( a2 >= 4 ) result = 0; else result = *(_DWORD *)((char *)this + 4 * a2 + 78); return result; } //----- (01016B0A) -------------------------------------------------------- void __thiscall TRamp::put_scoring(TRamp *this, int a2, int a3) { if ( a2 < 4 ) *(_DWORD *)((char *)this + 4 * a2 + 78) = a3; } //----- (01016C24) -------------------------------------------------------- void __thiscall TRamp::Collision(TRamp *this, struct TBall *a2, struct vector_type *a3, struct vector_type *a4, float a5, struct TEdgeSegment *a6) { TRamp *v6; // edi double v7; // st7 int v8; // eax _DWORD *v9; // eax double v10; // st7 double v11; // st6 double v12; // st6 double v13; // st7 v6 = this; TBall::not_again(a2, a6); v7 = *(float *)((char *)a2 + 70) - a5; *(_DWORD *)((char *)a2 + 42) = *(_DWORD *)a3; v8 = *((_DWORD *)a3 + 1); *(float *)((char *)a2 + 70) = v7; *(_DWORD *)((char *)a2 + 46) = v8; v9 = *(_DWORD **)((char *)a6 + 13); if ( v9 ) { *(_DWORD *)((char *)a2 + 150) = 1; *(_DWORD *)((char *)a2 + 138) = *v9; v10 = *(float *)((char *)a2 + 138) * *(float *)((char *)a2 + 42); v11 = *(float *)((char *)a2 + 46); *(_DWORD *)((char *)a2 + 142) = v9[1]; v12 = v11 * *(float *)((char *)a2 + 142); *(_DWORD *)((char *)a2 + 146) = v9[2]; *(_DWORD *)((char *)a2 + 94) = v9[11]; *(_DWORD *)((char *)a2 + 98) = v9[12]; *(float *)((char *)a2 + 50) = v10 + v12 + *(float *)((char *)a2 + 154) + *(float *)((char *)a2 + 146); *(_DWORD *)((char *)a2 + 110) = *(_DWORD *)((char *)v6 + 106); return; } if ( a6 == *(struct TEdgeSegment **)((char *)v6 + 134) ) { if ( !*(_DWORD *)(*(_DWORD *)((char *)v6 + 30) + 370) ) { loader_play_sound(*(_DWORD *)((char *)v6 + 70)); control_handler(63, v6); } } else { *(_DWORD *)((char *)a2 + 150) = 0; if ( a6 == *(struct TEdgeSegment **)((char *)v6 + 126) ) { *(_DWORD *)((char *)a2 + 110) = *(_DWORD *)((char *)v6 + 138); if ( !*(_DWORD *)((char *)v6 + 110) ) return; v13 = *(float *)((char *)a2 + 154) + *(float *)((char *)v6 + 146); } else { *(_DWORD *)((char *)a2 + 110) = *(_DWORD *)((char *)v6 + 142); if ( !*(_DWORD *)((char *)v6 + 110) ) return; v13 = *(float *)((char *)a2 + 154) + *(float *)((char *)v6 + 150); } *(float *)((char *)a2 + 50) = v13; } } //----- (01016D2E) -------------------------------------------------------- int __thiscall TRamp::FieldEffect(TRamp *this, struct TBall *a2, struct vector_type *a3) { int result; // eax *(float *)a3 = *(float *)((char *)a2 + 94) - *(float *)((char *)a2 + 54) * *(float *)((char *)a2 + 66) * *(float *)((char *)this + 118); result = 1; *((float *)a3 + 1) = *(float *)((char *)a2 + 98) - *(float *)((char *)a2 + 58) * *(float *)((char *)a2 + 66) * *(float *)((char *)this + 118); return result; } //----- (01019BB8) -------------------------------------------------------- TRamp *__thiscall TRamp::TRamp(TRamp *this, struct TPinballTable *a2, void *a3) { void *v3; // ebx TRamp *v4; // esi _DWORD *v5; // eax float *v6; // eax float *v7; // edi signed __int64 v8; // rax void *v9; // ST0C_4 int v10; // edi double v11; // st7 TLine *v12; // eax TLine *v13; // edi int v14; // eax int v15; // edi double v16; // st7 int v17; // ecx TLine *v18; // eax TLine *v19; // edi int v20; // eax int v21; // edi double v22; // st7 int v23; // ecx TLine *v24; // eax TLine *v25; // edi int v26; // eax bool v27; // zf bool v28; // sf int v29; // ecx int v30; // eax int v31; // ebx int v32; // edi int v33; // ecx double v34; // st7 double v35; // st7 double v36; // st7 double v37; // st7 float v38; // eax double v39; // st7 double v40; // st7 float v41; // eax double v42; // st7 double v43; // st7 double v44; // st7 double v45; // st7 float v46; // eax double v47; // st7 double v48; // st7 double v49; // st7 double v50; // st7 float v51; // eax double v52; // st7 void *v53; // eax TLine *v54; // eax void *v55; // ecx void *v56; // eax TLine *v57; // eax void *v58; // ecx void *v59; // eax TLine *v60; // eax TLine *v61; // edi int v62; // ecx float *v63; // eax int v64; // ecx long double v65; // st7 float v66; // ST0C_4 double v67; // st7 int v68; // ecx float v69; // ST08_4 double v70; // st7 float v71; // ST04_4 char v73; // [esp+24h] [ebp-84h] void *v74; // [esp+58h] [ebp-50h] int v75; // [esp+6Ch] [ebp-3Ch] int v76; // [esp+70h] [ebp-38h] int v77; // [esp+78h] [ebp-30h] int v78; // [esp+7Ch] [ebp-2Ch] struct vector_type *v79; // [esp+80h] [ebp-28h] struct vector_type *v80; // [esp+84h] [ebp-24h] struct vector_type *v81; // [esp+88h] [ebp-20h] int v82; // [esp+8Ch] [ebp-1Ch] int v83; // [esp+90h] [ebp-18h] struct vector_type *v84; // [esp+94h] [ebp-14h] float v85; // [esp+98h] [ebp-10h] float v86; // [esp+9Ch] [ebp-Ch] float v87; // [esp+A0h] [ebp-8h] float v88; // [esp+A4h] [ebp-4h] v3 = a3; v4 = this; TCollisionComponent::TCollisionComponent(this, a2, (int)a3, 0); *(_DWORD *)v4 = &TRamp::vftable; *(_DWORD *)((char *)v4 + 6) = 0; *((_BYTE *)v4 + 4) = 1; loader_query_visual((int)v3, 0, &v73); *(_DWORD *)((char *)v4 + 106) = v74; v5 = (_DWORD *)loader_query_float_attribute((int)v3, 0, 701); if ( v5 ) *(_DWORD *)((char *)v4 + 118) = *v5; else *(_DWORD *)((char *)v4 + 118) = 1045220557; v6 = (float *)loader_query_float_attribute((int)v3, 0, 1305); if ( v6 ) *(_DWORD *)((char *)v4 + 110) = (signed __int64)_floor(*v6); else *(_DWORD *)((char *)v4 + 110) = 0; v7 = (float *)loader_query_float_attribute((int)a3, 0, 1300); v8 = (signed __int64)_floor(*v7); v9 = a3; *(_DWORD *)((char *)v4 + 114) = v8; *(_DWORD *)((char *)v4 + 122) = v7 + 1; v10 = loader_query_float_attribute((int)v9, 0, 1303); v11 = _floor(*(float *)v10); v75 = *(_DWORD *)(v10 + 8); v76 = *(_DWORD *)(v10 + 12); v86 = *(float *)(v10 + 16); v87 = *(float *)(v10 + 20); v12 = (TLine *)operator new(0x55u); if ( v12 ) v13 = TLine::TLine( v12, v4, (char *)v4 + 5, 1 << (signed __int64)v11, (struct vector_type *)&v86, (struct vector_type *)&v75); else v13 = 0; *(_DWORD *)((char *)v4 + 134) = v13; objlist_class::Add((TRamp *)((char *)v4 + 42), (void *)v13); if ( v13 ) { v14 = *(_DWORD *)v13; *(_DWORD *)((char *)v13 + 13) = 0; (*(void (__thiscall **)(TLine *))(v14 + 8))(v13); } v15 = loader_query_float_attribute((int)a3, 0, 1301); *(_DWORD *)((char *)v4 + 138) = (signed __int64)_floor(*(float *)v15); v16 = _floor(*(float *)(v15 + 4)); v17 = *(_DWORD *)((char *)v4 + 138); v78 = (signed __int64)v16; v15 += 12; *(_DWORD *)((char *)v4 + 138) = 1 << v17; *(_DWORD *)((char *)v4 + 146) = *(_DWORD *)(v15 + 16); find_closest_edge( *(struct ramp_plane_type **)((char *)v4 + 122), *(_DWORD *)((char *)v4 + 114), (struct wall_point_type *)v15, &a2, &v80); v18 = (TLine *)operator new(0x55u); if ( v18 ) v19 = TLine::TLine(v18, v4, (char *)v4 + 5, *(_DWORD *)((char *)v4 + 106), v80, a2); else v19 = 0; *(_DWORD *)((char *)v4 + 126) = v19; objlist_class::Add((TRamp *)((char *)v4 + 42), (void *)v19); if ( v19 ) { v20 = *(_DWORD *)v19; *(_DWORD *)((char *)v19 + 13) = 0; (*(void (__thiscall **)(TLine *))(v20 + 8))(v19); } v21 = loader_query_float_attribute((int)a3, 0, 1302); *(_DWORD *)((char *)v4 + 142) = (signed __int64)_floor(*(float *)v21); v22 = _floor(*(float *)(v21 + 4)); v23 = *(_DWORD *)((char *)v4 + 142); v77 = (signed __int64)v22; v21 += 12; *(_DWORD *)((char *)v4 + 142) = 1 << v23; *(_DWORD *)((char *)v4 + 150) = *(_DWORD *)(v21 + 16); find_closest_edge( *(struct ramp_plane_type **)((char *)v4 + 122), *(_DWORD *)((char *)v4 + 114), (struct wall_point_type *)v21, &v81, &v84); v24 = (TLine *)operator new(0x55u); if ( v24 ) v25 = TLine::TLine(v24, v4, (char *)v4 + 5, *(_DWORD *)((char *)v4 + 106), v84, v81); else v25 = 0; *(_DWORD *)((char *)v4 + 130) = v25; objlist_class::Add((TRamp *)((char *)v4 + 42), (void *)v25); if ( v25 ) { v26 = *(_DWORD *)v25; *(_DWORD *)((char *)v25 + 13) = 0; (*(void (__thiscall **)(TLine *))(v26 + 8))(v25); } v27 = *(_DWORD *)((char *)v4 + 114) == 0; v28 = *(_DWORD *)((char *)v4 + 114) < 0; v86 = 1000000000.0; v82 = 0; v85 = 1000000000.0; v88 = -1000000000.0; v87 = -1000000000.0; if ( !v28 && !v27 ) { do { v29 = *(_DWORD *)((char *)v4 + 122); v83 = 52 * v82; v30 = v29 + 52 * v82; v31 = v30 + 28; v32 = v30 + 12; v33 = v30 + 20; v34 = *(float *)(v30 + 28); v79 = (struct vector_type *)(v30 + 20); if ( v34 >= *(float *)(v30 + 12) ) v35 = *(float *)v32; else v35 = *(float *)v31; if ( v35 <= *(float *)v33 ) { if ( *(float *)v31 >= (double)*(float *)v32 ) v36 = *(float *)v32; else v36 = *(float *)v31; } else { v36 = *(float *)v33; } if ( v85 >= v36 ) { if ( *(float *)v31 >= (double)*(float *)v32 ) v37 = *(float *)v32; else v37 = *(float *)v31; if ( v37 <= *(float *)v33 ) { if ( *(float *)v31 >= (double)*(float *)v32 ) v38 = *(float *)v32; else v38 = *(float *)v31; } else { v38 = *(float *)v33; } v85 = v38; } if ( *(float *)(v31 + 4) >= (double)*(float *)(v32 + 4) ) v39 = *(float *)(v32 + 4); else v39 = *(float *)(v31 + 4); if ( v39 <= *(float *)(v33 + 4) ) { if ( *(float *)(v31 + 4) >= (double)*(float *)(v32 + 4) ) v40 = *(float *)(v32 + 4); else v40 = *(float *)(v31 + 4); } else { v40 = *(float *)(v33 + 4); } if ( v85 >= v40 ) { if ( *(float *)(v31 + 4) >= (double)*(float *)(v32 + 4) ) v42 = *(float *)(v32 + 4); else v42 = *(float *)(v31 + 4); if ( v42 <= *(float *)(v33 + 4) ) { if ( *(float *)(v31 + 4) >= (double)*(float *)(v32 + 4) ) v41 = *(float *)(v32 + 4); else v41 = *(float *)(v31 + 4); } else { v41 = *(float *)(v33 + 4); } } else { v41 = v85; } v43 = *(float *)v31; v86 = v41; if ( v43 <= *(float *)v32 ) v44 = *(float *)v32; else v44 = *(float *)v31; if ( v44 >= *(float *)v33 ) { if ( *(float *)v31 <= (double)*(float *)v32 ) v45 = *(float *)v32; else v45 = *(float *)v31; } else { v45 = *(float *)v33; } if ( v85 <= v45 ) { if ( *(float *)v31 <= (double)*(float *)v32 ) v47 = *(float *)v32; else v47 = *(float *)v31; if ( v47 >= *(float *)v33 ) { if ( *(float *)v31 <= (double)*(float *)v32 ) v46 = *(float *)v32; else v46 = *(float *)v31; } else { v46 = *(float *)v33; } } else { v46 = v85; } v48 = *(float *)(v31 + 4); v87 = v46; if ( v48 <= *(float *)(v32 + 4) ) v49 = *(float *)(v32 + 4); else v49 = *(float *)(v31 + 4); if ( v49 >= *(float *)(v33 + 4) ) { if ( *(float *)(v31 + 4) <= (double)*(float *)(v32 + 4) ) v50 = *(float *)(v32 + 4); else v50 = *(float *)(v31 + 4); } else { v50 = *(float *)(v33 + 4); } if ( v85 <= v50 ) { if ( *(float *)(v31 + 4) <= (double)*(float *)(v32 + 4) ) v52 = *(float *)(v32 + 4); else v52 = *(float *)(v31 + 4); if ( v52 >= *(float *)(v33 + 4) ) { if ( *(float *)(v31 + 4) <= (double)*(float *)(v32 + 4) ) v51 = *(float *)(v32 + 4); else v51 = *(float *)(v31 + 4); } else { v51 = *(float *)(v33 + 4); } } else { v51 = v85; } v88 = v51; if ( (struct TPinballTable *)v32 != a2 || (struct vector_type *)v33 != v80 ) { if ( (struct vector_type *)v32 != v81 || (struct vector_type *)v33 != v84 ) { v53 = v74; goto LABEL_105; } if ( v77 ) { v53 = *(void **)((char *)v4 + 142); goto LABEL_105; } } else if ( v78 ) { v53 = *(void **)((char *)v4 + 138); LABEL_105: a3 = v53; goto LABEL_106; } a3 = 0; LABEL_106: if ( a3 ) { v54 = (TLine *)operator new(0x55u); a3 = (void *)(v54 ? TLine::TLine(v54, v4, (char *)v4 + 5, (unsigned int)a3, (struct vector_type *)v32, v79) : 0); objlist_class::Add((TRamp *)((char *)v4 + 42), a3); if ( a3 ) { v55 = a3; *(_DWORD *)((char *)a3 + 13) = v83 + *(_DWORD *)((char *)v4 + 122); (*(void (**)(void))(*(_DWORD *)v55 + 8))(); } } if ( v79 != a2 || (struct vector_type *)v31 != v80 ) { if ( v79 != v81 || (struct vector_type *)v31 != v84 ) { v56 = v74; goto LABEL_122; } if ( v77 ) { v56 = *(void **)((char *)v4 + 142); goto LABEL_122; } } else if ( v78 ) { v56 = *(void **)((char *)v4 + 138); LABEL_122: a3 = v56; goto LABEL_123; } a3 = 0; LABEL_123: if ( a3 ) { v57 = (TLine *)operator new(0x55u); a3 = (void *)(v57 ? TLine::TLine(v57, v4, (char *)v4 + 5, (unsigned int)a3, v79, (struct vector_type *)v31) : 0); objlist_class::Add((TRamp *)((char *)v4 + 42), a3); if ( a3 ) { v58 = a3; *(_DWORD *)((char *)a3 + 13) = v83 + *(_DWORD *)((char *)v4 + 122); (*(void (**)(void))(*(_DWORD *)v58 + 8))(); } } if ( (struct TPinballTable *)v31 != a2 || (struct vector_type *)v32 != v80 ) { if ( (struct vector_type *)v31 != v81 || (struct vector_type *)v32 != v84 ) { v59 = v74; goto LABEL_139; } if ( v77 ) { v59 = *(void **)((char *)v4 + 142); goto LABEL_139; } } else if ( v78 ) { v59 = *(void **)((char *)v4 + 138); LABEL_139: a3 = v59; goto LABEL_140; } a3 = 0; LABEL_140: if ( a3 ) { v60 = (TLine *)operator new(0x55u); if ( v60 ) v61 = TLine::TLine( v60, v4, (char *)v4 + 5, (unsigned int)a3, (struct vector_type *)v31, (struct vector_type *)v32); else v61 = 0; objlist_class::Add((TRamp *)((char *)v4 + 42), (void *)v61); if ( v61 ) { *(_DWORD *)((char *)v61 + 13) = v83 + *(_DWORD *)((char *)v4 + 122); (*(void (__thiscall **)(TLine *))(*(_DWORD *)v61 + 8))(v61); } } v62 = v83; *(float *)(v83 + *(_DWORD *)((char *)v4 + 122) + 44) = cos(*(float *)(v83 + *(_DWORD *)((char *)v4 + 122) + 40)) * sin(*(float *)(v83 + *(_DWORD *)((char *)v4 + 122) + 36)) * *(float *)(*(_DWORD *)((char *)v4 + 30) + 270); v63 = (float *)(v62 + *(_DWORD *)((char *)v4 + 122)); v64 = *(_DWORD *)((char *)v4 + 30); v65 = sin(v63[10]); ++v82; v63[12] = v65 * sin(v63[9]) * *(float *)(v64 + 270); } while ( v82 < *(_DWORD *)((char *)v4 + 114) ); } v66 = v87; v67 = v88; *(_DWORD *)((char *)v4 + 94) = (char *)v4 + 5; v68 = (int)v74; v69 = v67; v70 = v85; *(_DWORD *)((char *)v4 + 102) = v4; v71 = v70; *(_DWORD *)((char *)v4 + 98) = v68; edges_insert_square(v86, v71, v69, v66, 0, (TRamp *)((char *)v4 + 94)); return v4; } // 10026CC: using guessed type void *TRamp::vftable;