#include "TTextbox.h" //----- (01014092) -------------------------------------------------------- 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 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) { 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; } } //----- (010141E1) -------------------------------------------------------- void TTextBox::TimerExpired(int a1, int a2, TTextBox* a3) { 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); } } //----- (0101421C) -------------------------------------------------------- TZmapList* __thiscall TTextBox::~TTextBox(TTextBox* this) { 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); } // 10023B4: using guessed type void *TTextBox::vftable; //----- (01014269) -------------------------------------------------------- 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] 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) { 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); } } } } //----- (010145CF) -------------------------------------------------------- TTextBox* __thiscall TTextBox::destroy(TTextBox* this, char a2) { TTextBox* v2; // esi v2 = this; TTextBox::~TTextBox(this); if (a2 & 1) component_delete((void*)v2); return v2; } //----- (01019168) -------------------------------------------------------- int TTextBox::Message(int a2, float a3) { return 0; }