Files

263 lines
4.8 KiB
C++
Raw Permalink Normal View History

2020-11-01 18:45:29 +03:00
#include "pch.h"
#include "TTextBox.h"
2020-12-25 16:46:06 +03:00
#include "control.h"
2021-02-06 16:53:47 +03:00
#include "fullscrn.h"
2020-12-03 17:47:36 +03:00
#include "loader.h"
2020-12-25 16:46:06 +03:00
#include "render.h"
2020-12-03 17:47:36 +03:00
#include "score.h"
#include "timer.h"
2020-11-07 18:41:14 +03:00
2020-12-03 17:47:36 +03:00
TTextBox::TTextBox(TPinballTable* table, int groupIndex) : TPinballComponent(table, groupIndex, true)
{
OffsetX = 0;
OffsetY = 0;
Width = 0;
Height = 0;
BgBmp = render::background_bitmap;
Font = score::msg_fontp;
Message1 = nullptr;
Message2 = nullptr;
Timer = 0;
if (groupIndex > 0)
{
2021-02-06 16:53:47 +03:00
/*Full tilt: text box dimensions index is offset by resolution*/
2021-02-15 18:55:54 +03:00
int arrLength;
2021-02-06 16:53:47 +03:00
auto dimensions = loader::query_iattribute(groupIndex + fullscrn::GetResolution(), 1500, &arrLength);
2020-12-03 17:47:36 +03:00
OffsetX = dimensions[0];
OffsetY = dimensions[1];
Width = dimensions[2];
Height = dimensions[3];
}
}
TTextBox::~TTextBox()
{
if (Timer)
{
if (Timer != -1)
timer::kill(Timer);
Timer = 0;
}
while (Message1)
{
TTextBoxMessage* message = Message1;
TTextBoxMessage* nextMessage = message->NextMessage;
delete message;
Message1 = nextMessage;
}
}
int TTextBox::Message(int code, float value)
2020-11-07 18:41:14 +03:00
{
return 0;
2020-11-29 18:50:49 +03:00
}
2020-12-04 18:35:47 +03:00
void TTextBox::TimerExpired(int timerId, void* caller)
2020-12-03 17:47:36 +03:00
{
2020-12-04 18:35:47 +03:00
auto tb = static_cast<TTextBox*>(caller);
2020-12-03 17:47:36 +03:00
TTextBoxMessage* message = tb->Message1;
tb->Timer = 0;
if (message)
{
TTextBoxMessage* nextMessage = message->NextMessage;
delete message;
tb->Message1 = nextMessage;
tb->Draw();
2020-12-19 17:49:31 +03:00
control::handler(60, tb);
2020-12-03 17:47:36 +03:00
}
}
2020-11-29 18:50:49 +03:00
void TTextBox::Clear()
{
2020-12-03 17:47:36 +03:00
gdrv_bitmap8* bmp = BgBmp;
if (bmp)
gdrv::copy_bitmap(
2021-10-02 17:45:31 +03:00
render::vscreen,
2020-12-03 17:47:36 +03:00
Width,
Height,
OffsetX,
OffsetY,
bmp,
OffsetX,
OffsetY);
else
2021-10-02 17:45:31 +03:00
gdrv::fill_bitmap(render::vscreen, Width, Height, OffsetX, OffsetY, 0);
2020-12-03 17:47:36 +03:00
if (Timer)
{
if (Timer != -1)
timer::kill(Timer);
Timer = 0;
}
while (Message1)
{
TTextBoxMessage* message = Message1;
TTextBoxMessage* nextMessage = message->NextMessage;
delete message;
Message1 = nextMessage;
}
2020-11-29 18:50:49 +03:00
}
void TTextBox::Display(const char* text, float time)
2020-11-29 18:50:49 +03:00
{
2020-12-03 17:47:36 +03:00
if (!text)
return;
if (Message1 && !strcmp(text, Message2->Text))
{
Message2->Refresh(time);
if (Message2 == Message1)
{
if (Timer && Timer != -1)
timer::kill(Timer);
2021-02-18 12:53:25 +03:00
if (time == -1.0f)
2020-12-03 17:47:36 +03:00
Timer = -1;
else
2020-12-04 18:35:47 +03:00
Timer = timer::set(time, this, TimerExpired);
2020-12-03 17:47:36 +03:00
}
}
else
{
if (Timer == -1)
Clear();
auto message = new TTextBoxMessage(text, time);
if (message)
{
if (message->Text)
{
if (Message1)
Message2->NextMessage = message;
else
Message1 = message;
Message2 = message;
if (Timer == 0)
Draw();
}
else
{
delete message;
}
}
}
}
void TTextBox::Draw()
{
auto bmp = BgBmp;
if (bmp)
gdrv::copy_bitmap(
2021-10-02 17:45:31 +03:00
render::vscreen,
2020-12-03 17:47:36 +03:00
Width,
Height,
OffsetX,
OffsetY,
bmp,
OffsetX,
OffsetY);
else
2021-10-02 17:45:31 +03:00
gdrv::fill_bitmap(render::vscreen, Width, Height, OffsetX, OffsetY, 0);
2020-12-03 17:47:36 +03:00
2021-02-15 18:55:54 +03:00
bool display = false;
2021-01-05 12:02:43 +03:00
while (Message1)
2020-12-03 17:47:36 +03:00
{
2021-02-18 12:53:25 +03:00
if (Message1->Time == -1.0f)
2020-12-03 17:47:36 +03:00
{
2021-02-15 18:55:54 +03:00
if (!Message1->NextMessage)
2020-12-03 17:47:36 +03:00
{
2021-01-05 12:02:43 +03:00
Timer = -1;
2021-02-15 18:55:54 +03:00
display = true;
2020-12-11 19:03:13 +03:00
break;
2020-12-03 17:47:36 +03:00
}
}
2021-02-15 18:55:54 +03:00
else if (Message1->TimeLeft() >= -2.0f)
2020-12-03 17:47:36 +03:00
{
Timer = timer::set(std::max(Message1->TimeLeft(), 0.25f), this, TimerExpired);
2021-02-15 18:55:54 +03:00
display = true;
break;
}
auto tmp = Message1;
Message1 = Message1->NextMessage;
delete tmp;
}
if (display)
{
auto font = Font;
if (!font)
{
gdrv::grtext_draw_ttext_in_box(
Message1->Text,
2021-10-02 17:45:31 +03:00
render::vscreen->XPosition + OffsetX,
render::vscreen->YPosition + OffsetY,
2021-02-15 18:55:54 +03:00
Width,
Height,
255);
return;
}
auto text = Message1->Text;
for (auto y = OffsetY; ; y += font->Height)
{
auto curChar = *text;
if (!curChar || y + font->Height > OffsetY + Height)
break;
auto totalWidth = 0;
char* textEndSpace = nullptr;
auto textEnd = text;
while (true)
2020-12-03 17:47:36 +03:00
{
2021-02-15 18:55:54 +03:00
auto maskedChar = curChar & 0x7F;
if (!maskedChar || maskedChar == '\n')
break;
auto charBmp = font->Chars[maskedChar];
if (charBmp)
2020-12-03 17:47:36 +03:00
{
2021-02-15 18:55:54 +03:00
auto width = charBmp->Width + font->GapWidth + totalWidth;
if (width > Width)
{
if (textEndSpace)
textEnd = textEndSpace;
break;
}
if (*textEnd == ' ')
textEndSpace = textEnd;
curChar = *(textEnd + 1);
totalWidth = width;
++textEnd;
2020-12-03 17:47:36 +03:00
}
else
{
2021-02-15 18:55:54 +03:00
curChar = *textEnd;
2020-12-03 17:47:36 +03:00
}
}
2021-02-15 18:55:54 +03:00
auto offX = OffsetX;
while (text < textEnd)
{
auto charBmp = font->Chars[*text++ & 0x7F];
if (charBmp)
{
auto height = charBmp->Height;
auto width = charBmp->Width;
if (render::background_bitmap)
2021-10-02 17:45:31 +03:00
gdrv::copy_bitmap_w_transparency(render::vscreen, width, height, offX, y, charBmp, 0,
2021-02-15 18:55:54 +03:00
0);
else
2021-10-02 17:45:31 +03:00
gdrv::copy_bitmap(render::vscreen, width, height, offX, y, charBmp, 0, 0);
2021-02-15 18:55:54 +03:00
font = Font;
offX += charBmp->Width + font->GapWidth;
}
}
while ((*text & 0x7F) == ' ')
++text;
if ((*text & 0x7F) == '\n')
++text;
2020-12-03 17:47:36 +03:00
}
}
2020-11-29 18:50:49 +03:00
}