// // Created by neo on 2019-08-15. // #include "TBall.h" //----- (0100B072) -------------------------------------------------------- bool __thiscall TBall::already_hit(TBall *this, struct TEdgeSegment *a2) { 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; } //----- (0101590F) -------------------------------------------------------- void __thiscall TBall::not_again(TBall *this, struct TEdgeSegment *a2) { signed int v2; // edx 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) { 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; } //----- (01015C08) -------------------------------------------------------- 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] 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 __stdcall proj_z_distance(_DWORD); //----- (01019309) -------------------------------------------------------- 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] 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; } // 1002554: using guessed type void *TBall::vftable; // 1008ED8: using guessed type double __stdcall proj_z_distance(_DWORD);