399 lines
9.0 KiB
C++
399 lines
9.0 KiB
C++
#include "TTextbox.h"
|
|
|
|
//----- (01014092) --------------------------------------------------------
|
|
TTextBox* TTextBox::TTextBox(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(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* TTextBox::~TTextBox()
|
|
{
|
|
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* TTextBox::destroy(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;
|
|
}
|
|
|