From fe66d33768f039d3c02ca8615ec72999a51f8fcd Mon Sep 17 00:00:00 2001 From: oz Date: Thu, 3 Dec 2020 17:47:36 +0300 Subject: [PATCH] TTextBoxMessage v1, ready. TTextBox v1. --- Doc/FuncStats.xlsx | Bin 31972 -> 31983 bytes SpaceCadetPinball/SpaceCadetPinball.cpp | 9 +- SpaceCadetPinball/SpaceCadetPinball.vcxproj | 2 + .../SpaceCadetPinball.vcxproj.filters | 6 + SpaceCadetPinball/TPinballComponent.cpp | 10 +- SpaceCadetPinball/TPinballComponent.h | 3 +- SpaceCadetPinball/TTextBox.cpp | 217 +++++++++++++++++- SpaceCadetPinball/TTextBox.h | 21 +- SpaceCadetPinball/TTextBoxMessage.cpp | 37 +++ SpaceCadetPinball/TTextBoxMessage.h | 14 ++ SpaceCadetPinball/gdrv.cpp | 31 +++ SpaceCadetPinball/gdrv.h | 8 +- SpaceCadetPinball/options.cpp | 5 +- SpaceCadetPinball/pb.cpp | 4 +- SpaceCadetPinball/pinball.cpp | 8 +- SpaceCadetPinball/pinball.h | 2 - SpaceCadetPinball/score.cpp | 1 + SpaceCadetPinball/score.h | 6 + SpaceCadetPinball/timer.cpp | 10 + SpaceCadetPinball/timer.h | 2 + SpaceCadetPinball/winmain.cpp | 78 ++++--- SpaceCadetPinball/winmain.h | 2 + 22 files changed, 419 insertions(+), 57 deletions(-) create mode 100644 SpaceCadetPinball/TTextBoxMessage.cpp create mode 100644 SpaceCadetPinball/TTextBoxMessage.h diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index 11912f7620cb12ae843cc73162e50011715b9ac2..f815ea92ca4f8003f9a74577d3faa26d0fc9a246 100644 GIT binary patch delta 23239 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 XAXKS^61@;6)WwM{2tfvT5E=G=Rg(-| diff --git a/SpaceCadetPinball/SpaceCadetPinball.cpp b/SpaceCadetPinball/SpaceCadetPinball.cpp index 4c5b028..8f7d047 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.cpp +++ b/SpaceCadetPinball/SpaceCadetPinball.cpp @@ -17,15 +17,16 @@ #include "winmain.h" int main() -{ - std::cout << "Hello World!\n"; +{ { // Testing with UI char cmdLine[1]{}; pb::init(); - WinMain(pinball::hinst, 0, cmdLine, 10); + WinMain(winmain::hinst, 0, cmdLine, 10); + return 0; } - + + std::cout << "Hello World!\n"; gdrv::init(0, 0); auto dib = gdrv::DibCreate(8, 1, 1); gdrv::DibSetUsage(dib, 0, 1); diff --git a/SpaceCadetPinball/SpaceCadetPinball.vcxproj b/SpaceCadetPinball/SpaceCadetPinball.vcxproj index a394ae6..1a1a3c5 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.vcxproj +++ b/SpaceCadetPinball/SpaceCadetPinball.vcxproj @@ -206,6 +206,7 @@ + @@ -271,6 +272,7 @@ + diff --git a/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters b/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters index 1876e8d..146dbad 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters +++ b/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters @@ -207,6 +207,9 @@ Header Files + + Header Files\TPinballComponent + @@ -380,6 +383,9 @@ Source Files + + Source Files\TPinballComponent + diff --git a/SpaceCadetPinball/TPinballComponent.cpp b/SpaceCadetPinball/TPinballComponent.cpp index 982e5d9..a8ba002 100644 --- a/SpaceCadetPinball/TPinballComponent.cpp +++ b/SpaceCadetPinball/TPinballComponent.cpp @@ -87,10 +87,10 @@ TPinballComponent::~TPinballComponent() } -int TPinballComponent::Message(int message1, float message2) +int TPinballComponent::Message(int code, float value) { - MessageField = message1; - if (message1 == 1024) + MessageField = code; + if (code == 1024) MessageField = 0; return 0; } @@ -108,3 +108,7 @@ int TPinballComponent::get_scoring(int score1) { return 0; } + +void TPinballComponent::control_handler(int code, TPinballComponent* cmp) +{ +} diff --git a/SpaceCadetPinball/TPinballComponent.h b/SpaceCadetPinball/TPinballComponent.h index 3bdc99f..875eda7 100644 --- a/SpaceCadetPinball/TPinballComponent.h +++ b/SpaceCadetPinball/TPinballComponent.h @@ -9,10 +9,11 @@ class TPinballComponent public: TPinballComponent(TPinballTable* table, int groupIndex, bool loadVisuals); virtual ~TPinballComponent(); - virtual int Message(int message1, float message2); + virtual int Message(int code, float value); virtual void port_draw(); virtual void put_scoring(int score1, int score2); virtual int get_scoring(int score1); + static void control_handler(int code, TPinballComponent* cmp); int VfTable; __int8 UnknownBaseFlag1; diff --git a/SpaceCadetPinball/TTextBox.cpp b/SpaceCadetPinball/TTextBox.cpp index 6eb2a78..53b9d89 100644 --- a/SpaceCadetPinball/TTextBox.cpp +++ b/SpaceCadetPinball/TTextBox.cpp @@ -1,16 +1,231 @@ #include "pch.h" #include "TTextBox.h" +#include "loader.h" +#include "score.h" +#include "timer.h" -int TTextBox::Message(int a2, float a3) +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) + { + int arrLength; + auto dimensions = loader::query_iattribute(groupIndex, 1500, &arrLength); + 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) { return 0; } +void TTextBox::TimerExpired(int a2, TTextBox* tb) +{ + TTextBoxMessage* message = tb->Message1; + tb->Timer = 0; + if (message) + { + TTextBoxMessage* nextMessage = message->NextMessage; + delete message; + tb->Message1 = nextMessage; + tb->Draw(); + control_handler(60, tb); + } +} + void TTextBox::Clear() { + gdrv_bitmap8* bmp = BgBmp; + if (bmp) + gdrv::copy_bitmap( + &render::vscreen, + Width, + Height, + OffsetX, + OffsetY, + bmp, + OffsetX, + OffsetY); + else + gdrv::fill_bitmap(&render::vscreen, Width, Height, OffsetX, OffsetY, 0); + gdrv::blit( + &render::vscreen, + OffsetX, + OffsetY, + OffsetX + render::vscreen.XPosition, + OffsetY + render::vscreen.YPosition, + Width, + Height); + if (Timer) + { + if (Timer != -1) + timer::kill(Timer); + Timer = 0; + } + while (Message1) + { + TTextBoxMessage* message = Message1; + TTextBoxMessage* nextMessage = message->NextMessage; + delete message; + Message1 = nextMessage; + } } void TTextBox::Display(char* text, float time) { + if (!text) + return; + + if (Message1 && !strcmp(text, Message2->Text)) + { + Message2->Refresh(time); + if (Message2 == Message1) + { + if (Timer && Timer != -1) + timer::kill(Timer); + if (time == -1.0) + Timer = -1; + else + Timer = timer::set(time, (int)this, (int)TimerExpired); + } + } + 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() +{ + TTextBoxMessage* nextMessage = nullptr; + auto this2 = this; + + auto bmp = BgBmp; + if (bmp) + gdrv::copy_bitmap( + &render::vscreen, + Width, + Height, + OffsetX, + OffsetY, + bmp, + OffsetX, + OffsetY); + else + gdrv::fill_bitmap(&render::vscreen, Width, Height, OffsetX, OffsetY, 0); + + while (this2->Message1) + { + auto message = this2->Message1; + if (message->Time == -1.0) + { + nextMessage = message->NextMessage; + if (!message->NextMessage) + { + this2->Timer = -1; + LABEL_18: + auto font = this2->Font; + if (!font) + { + gdrv::blit( + &render::vscreen, + this2->OffsetX, + this2->OffsetY, + this2->OffsetX + render::vscreen.XPosition, + this2->OffsetY + render::vscreen.YPosition, + this2->Width, + this2->Height); + gdrv::grtext_draw_ttext_in_box( + this2->Message1->Text, + render::vscreen.XPosition + this2->OffsetX, + render::vscreen.YPosition + this2->OffsetY, + this2->Width, + this2->Height, + 255); + return; + } + } + } + else + { + auto timeLeft = (this2->Message1->TimeLeft()); + if (timeLeft >= -2.0f) + { + int timer; + if (timeLeft >= 0.25f) + { + timer = timer::set(timeLeft, (int)this2, (int)TimerExpired); + } + else + { + timer = timer::set(0.25, (int)this2, (int)TimerExpired); + } + this2->Timer = timer; + goto LABEL_18; + } + nextMessage = message->NextMessage; + } + delete message; + this2->Message1 = nextMessage; + } + + gdrv::blit( + &render::vscreen, + this2->OffsetX, + this2->OffsetY, + this2->OffsetX + render::vscreen.XPosition, + this2->OffsetY + render::vscreen.YPosition, + this2->Width, + this2->Height); } diff --git a/SpaceCadetPinball/TTextBox.h b/SpaceCadetPinball/TTextBox.h index bd85f56..da54dea 100644 --- a/SpaceCadetPinball/TTextBox.h +++ b/SpaceCadetPinball/TTextBox.h @@ -1,15 +1,28 @@ #pragma once +#include "score.h" #include "TPinballComponent.h" +#include "TTextBoxMessage.h" class TTextBox : public TPinballComponent { public: - TTextBox(TPinballTable* table, int groupIndex) : TPinballComponent(table, groupIndex, true) - { - } + int OffsetX; + int OffsetY; + int Width; + int Height; + int Timer; + gdrv_bitmap8* BgBmp; + score_msg_font_type* Font; + TTextBoxMessage* Message1; + TTextBoxMessage* Message2; - int Message(int a2, float a3) override; + TTextBox(TPinballTable* table, int groupIndex); + ~TTextBox() override; + int Message(int code, float value) override; void Clear(); void Display(char* text, float time); + void Draw(); + + static void TimerExpired(int a2, TTextBox* tb); }; diff --git a/SpaceCadetPinball/TTextBoxMessage.cpp b/SpaceCadetPinball/TTextBoxMessage.cpp new file mode 100644 index 0000000..7f3b9b5 --- /dev/null +++ b/SpaceCadetPinball/TTextBoxMessage.cpp @@ -0,0 +1,37 @@ +#include "pch.h" +#include "TTextBoxMessage.h" +#include "memory.h" +#include "pb.h" + +TTextBoxMessage::TTextBoxMessage(char* text, float time) +{ + NextMessage = nullptr; + Time = time; + EndTicks = pb::time_ticks + static_cast(time * 1000.0f); + if (text) + { + const auto textLen = strlen(text) + 1; + Text = memory::allocate(textLen); + if (Text) + strcpy_s(Text, textLen, text); + } + else + Text = nullptr; +} + +TTextBoxMessage::~TTextBoxMessage() +{ + if (Text) + memory::free(Text); +} + +float TTextBoxMessage::TimeLeft() const +{ + return static_cast(EndTicks - pb::time_ticks) * 0.001f; +} + +void TTextBoxMessage::Refresh(float time) +{ + this->Time = time; + this->EndTicks = pb::time_ticks + static_cast(time * 1000.0f); +} diff --git a/SpaceCadetPinball/TTextBoxMessage.h b/SpaceCadetPinball/TTextBoxMessage.h new file mode 100644 index 0000000..25b71e7 --- /dev/null +++ b/SpaceCadetPinball/TTextBoxMessage.h @@ -0,0 +1,14 @@ +#pragma once +class TTextBoxMessage +{ +public: + TTextBoxMessage* NextMessage; + char* Text; + float Time; + int EndTicks; + + TTextBoxMessage(char* text, float time); + ~TTextBoxMessage(); + float TimeLeft() const; + void Refresh(float time); +}; diff --git a/SpaceCadetPinball/gdrv.cpp b/SpaceCadetPinball/gdrv.cpp index 0145dc7..7173603 100644 --- a/SpaceCadetPinball/gdrv.cpp +++ b/SpaceCadetPinball/gdrv.cpp @@ -1,6 +1,7 @@ #include "pch.h" #include "gdrv.h" #include "memory.h" +#include "pinball.h" #include "winmain.h" HPALETTE gdrv::palette_handle = nullptr; @@ -10,6 +11,9 @@ LOGPALETTEx256 gdrv::current_palette{}; int gdrv::sequence_handle; HDC gdrv::sequence_hdc; int gdrv::use_wing = 0; +int gdrv::grtext_blue = 0; +int gdrv::grtext_green = 0; +int gdrv::grtext_red = -1; int gdrv::init(HINSTANCE hInst, HWND hWnd) @@ -390,3 +394,30 @@ void gdrv::copy_bitmap_w_transparency(gdrv_bitmap8* dstBmp, int width, int heigh dstPtr += dstBmp->Stride - width; } } + + +void gdrv::grtext_draw_ttext_in_box(LPCSTR text, int xOff, int yOff, int width, int height, int a6) +{ + tagRECT rc{}; + + HDC dc = GetDC(hwnd); + rc.left = xOff; + rc.right = width + xOff; + rc.top = yOff; + rc.bottom = height + yOff; + if (grtext_red < 0) + { + grtext_blue = 255; + grtext_green = 255; + grtext_red = 255; + const char* fontColor = pinball::get_rc_string(189, 0); + if (fontColor) + sscanf_s(fontColor, "%d %d %d", &grtext_red, &grtext_green, &grtext_blue); + } + int prevMode = SetBkMode(dc, 1); + COLORREF color = SetTextColor(dc, (grtext_red) | (grtext_green << 8) | (grtext_blue << 16)); + DrawTextA(dc, text, lstrlenA(text), &rc, 0x810u); + SetBkMode(dc, prevMode); + SetTextColor(dc, color); + ReleaseDC(hwnd, dc); +} diff --git a/SpaceCadetPinball/gdrv.h b/SpaceCadetPinball/gdrv.h index 697e84e..d1cd47f 100644 --- a/SpaceCadetPinball/gdrv.h +++ b/SpaceCadetPinball/gdrv.h @@ -42,8 +42,6 @@ class gdrv { public: static HPALETTE palette_handle; - static HINSTANCE hinst; - static HWND hwnd; static LOGPALETTEx256 current_palette; static int sequence_handle; static HDC sequence_hdc; @@ -70,5 +68,11 @@ public: int srcXOff, int srcYOff); static void copy_bitmap_w_transparency(gdrv_bitmap8* dstBmp, int width, int height, int xOff, int yOff, gdrv_bitmap8* srcBmp, int srcXOff, int srcYOff); + static void grtext_draw_ttext_in_box(LPCSTR text, int xOff, int yOff, int width, int height, int a6); private: + static HWND hwnd; + static HINSTANCE hinst; + static int grtext_blue; + static int grtext_green; + static int grtext_red; }; diff --git a/SpaceCadetPinball/options.cpp b/SpaceCadetPinball/options.cpp index d9fcb62..d591afa 100644 --- a/SpaceCadetPinball/options.cpp +++ b/SpaceCadetPinball/options.cpp @@ -6,6 +6,7 @@ #include "midi.h" #include "pinball.h" #include "Sound.h" +#include "winmain.h" LPCSTR options::OptionsRegPath; LPSTR options::OptionsRegPathCur; @@ -68,7 +69,7 @@ void options::init(HMENU menuHandle) if (MenuHandle) { DeleteMenu(MenuHandle, 0x195u, 0); - DrawMenuBar(pinball::hwnd_frame); + DrawMenuBar(winmain::hwnd_frame); } } memory::free(tmpBuf); @@ -240,7 +241,7 @@ void options::toggle(UINT uIDCheckItem) void options::keyboard() { - DialogBoxParamA(pinball::hinst, "KEYMAPPER", pinball::hwnd_frame, KeyMapDlgProc, 0); + DialogBoxParamA(winmain::hinst, "KEYMAPPER", winmain::hwnd_frame, KeyMapDlgProc, 0); } INT_PTR _stdcall options::KeyMapDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) diff --git a/SpaceCadetPinball/pb.cpp b/SpaceCadetPinball/pb.cpp index 0f766c6..b1e1cca 100644 --- a/SpaceCadetPinball/pb.cpp +++ b/SpaceCadetPinball/pb.cpp @@ -58,7 +58,7 @@ int pb::init() } render::init(nullptr, zMin, zScaler, tableSize[0], tableSize[1]); - gdrv::fill_bitmap(&render::vscreen, render::vscreen.Width, render::vscreen.Height, 0, 0, 0xff); // temp + gdrv::fill_bitmap(&render::vscreen, render::vscreen.Width, render::vscreen.Height, 0, 0, (char)0xff); // temp gdrv::copy_bitmap( &render::vscreen, backgroundBmp->Width, @@ -323,7 +323,7 @@ void pb::keydown(int key) case 'M': char buffer[20]; sprintf_s(buffer, "%ld", memory::use_total); - MessageBoxA(pinball::hwnd_frame, buffer, "Mem:", 0x2000u); + MessageBoxA(winmain::hwnd_frame, buffer, "Mem:", 0x2000u); break; case 'R': cheat_bump_rank(); diff --git a/SpaceCadetPinball/pinball.cpp b/SpaceCadetPinball/pinball.cpp index 23001b2..2554b0f 100644 --- a/SpaceCadetPinball/pinball.cpp +++ b/SpaceCadetPinball/pinball.cpp @@ -1,6 +1,7 @@ #include "pch.h" #include "pinball.h" #include "memory.h" +#include "winmain.h" int pinball::quickFlag = 0; @@ -8,17 +9,14 @@ TTextBox* pinball::InfoTextBox; TTextBox* pinball::MissTextBox; char pinball::getRcBuffer[6 * 256]; int pinball::rc_string_slot = 0; -HINSTANCE pinball::hinst; char pinball::WindowName[2]{}; int pinball::LeftShift = -1; int pinball::RightShift = -1; -HWND pinball::hwnd_frame = nullptr; - char* pinball::get_rc_string(int uID, int a2) { char* result = &getRcBuffer[256 * rc_string_slot]; - if (!LoadStringA(hinst, uID, &getRcBuffer[256 * rc_string_slot], 255)) + if (!LoadStringA(winmain::hinst, uID, &getRcBuffer[256 * rc_string_slot], 255)) *result = 0; if (++rc_string_slot >= 6) rc_string_slot = 0; @@ -28,7 +26,7 @@ char* pinball::get_rc_string(int uID, int a2) int pinball::get_rc_int(int uID, int* dst) { char buffer[50]; - int result = LoadStringA(hinst, uID, buffer, 255); + int result = LoadStringA(winmain::hinst, uID, buffer, 255); if (!result) return result; *dst = atoi(buffer); diff --git a/SpaceCadetPinball/pinball.h b/SpaceCadetPinball/pinball.h index c794450..403a43b 100644 --- a/SpaceCadetPinball/pinball.h +++ b/SpaceCadetPinball/pinball.h @@ -7,11 +7,9 @@ public: static int quickFlag; static TTextBox* InfoTextBox; static TTextBox* MissTextBox; - static HINSTANCE hinst; static char WindowName[2]; static int RightShift; static int LeftShift; - static HWND hwnd_frame; static char* get_rc_string(int uID, int a2); static int get_rc_int(int uID, int* dst); diff --git a/SpaceCadetPinball/score.cpp b/SpaceCadetPinball/score.cpp index e6c42ab..5f5a2eb 100644 --- a/SpaceCadetPinball/score.cpp +++ b/SpaceCadetPinball/score.cpp @@ -4,6 +4,7 @@ #include "memory.h" #include "partman.h" +score_msg_font_type* score::msg_fontp; int score::init() { diff --git a/SpaceCadetPinball/score.h b/SpaceCadetPinball/score.h index 50e22eb..0424d9f 100644 --- a/SpaceCadetPinball/score.h +++ b/SpaceCadetPinball/score.h @@ -22,9 +22,15 @@ struct scoreStruct char* Bitmap8Bit10; }; +struct score_msg_font_type +{ + +}; + class score { public: + static score_msg_font_type* msg_fontp; static int init(); static scoreStruct* create(LPCSTR fieldName, gdrv_bitmap8* renderBgBmp); static scoreStruct* dup(scoreStruct* score, int scoreIndex); diff --git a/SpaceCadetPinball/timer.cpp b/SpaceCadetPinball/timer.cpp index b277614..636ee58 100644 --- a/SpaceCadetPinball/timer.cpp +++ b/SpaceCadetPinball/timer.cpp @@ -36,3 +36,13 @@ int timer::init(int count) timer_struct.buffer2 = buf; return 0; } + +int timer::kill(int timer) +{ + return 0; +} + +int timer::set(float time, int caller, int callback) +{ + return 0; +} diff --git a/SpaceCadetPinball/timer.h b/SpaceCadetPinball/timer.h index 3c596a1..0e427e5 100644 --- a/SpaceCadetPinball/timer.h +++ b/SpaceCadetPinball/timer.h @@ -14,6 +14,8 @@ class timer { public: static int init(int count); + static int kill(int timer); + static int set(float time, int caller, int callback); private: static timer_struct timer_struct; diff --git a/SpaceCadetPinball/winmain.cpp b/SpaceCadetPinball/winmain.cpp index 1aa2b94..d1d046e 100644 --- a/SpaceCadetPinball/winmain.cpp +++ b/SpaceCadetPinball/winmain.cpp @@ -9,15 +9,30 @@ #include "pb.h" #include "Sound.h" -int winmain::return_value = 0, winmain::bQuit = 0, winmain::activated; -DWORD winmain::then, winmain::now; -UINT winmain::iFrostUniqueMsg; -gdrv_bitmap8 winmain::gfr_display{}; -int winmain::DispFrameRate = 1, winmain::DispGRhistory = 1, winmain::single_step = 0; -int winmain::has_focus = 1, winmain::last_mouse_x, winmain::last_mouse_y, winmain::mouse_down, winmain::no_time_loss; -char winmain::DatFileName[300]{}; +HINSTANCE winmain::hinst = nullptr; +HWND winmain::hwnd_frame = nullptr; HCURSOR winmain::mouse_hsave; +int winmain::return_value = 0; +int winmain::bQuit = 0; +int winmain::activated; +int winmain::DispFrameRate = 1; +int winmain::DispGRhistory = 0; +int winmain::single_step = 0; +int winmain::has_focus = 1; +int winmain::last_mouse_x; +int winmain::last_mouse_y; +int winmain::mouse_down; +int winmain::no_time_loss; + +DWORD winmain::then; +DWORD winmain::now; +UINT winmain::iFrostUniqueMsg; + +gdrv_bitmap8 winmain::gfr_display{}; +char winmain::DatFileName[300]{}; + + int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { return winmain::WinMain(hInstance, hPrevInstance, lpCmdLine, nShowCmd); @@ -41,7 +56,7 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi } options::set_int(regSpaceCadet, "Table Version", 1u); - GetModuleFileNameA(pinball::hinst, tmpBuf, 0x1F4u); + GetModuleFileNameA(hinst, tmpBuf, 0x1F4u); options::set_string(regSpaceCadet, "Table Exe", tmpBuf); options::set_string(regSpaceCadet, "Table Name", pinball::get_rc_string(169, 0)); options::set_string(nullptr, "Last Table Played", regSpaceCadet); @@ -92,7 +107,7 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi --memory::critical_allocation; pinball::quickFlag = strstr(lpCmdLine, "-quick") != nullptr; - pinball::hinst = hInstance; + hinst = hInstance; options::get_string(regSpaceCadet, "Pinball Data", DatFileName, pinball::get_rc_string(168, 0), 300); iFrostUniqueMsg = RegisterWindowMessageA("PinballThemeSwitcherUniqueMsgString"); @@ -132,7 +147,7 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi lstrcpyA(windowName, pinball::get_rc_string(38, 0)); windowHandle = CreateWindowExA(0, windowClass, windowName, 0x3CA0000u, 0, 0, 640, 480, nullptr, nullptr, hInstance, nullptr); - pinball::hwnd_frame = windowHandle; + hwnd_frame = windowHandle; if (!windowHandle) { PostQuitMessage(0); @@ -150,9 +165,9 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi options::menu_check(0x193u, 1); } - ShowWindow(pinball::hwnd_frame, nShowCmd); + ShowWindow(hwnd_frame, nShowCmd); fullscrn::set_screen_mode(options::Options.FullScreen); - UpdateWindow(pinball::hwnd_frame); + UpdateWindow(hwnd_frame); /*if (tmpBuf) //Close splash { @@ -163,8 +178,8 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi pinball::adjust_priority(options::Options.PriorityAdj); const auto startTime = timeGetTime(); MSG wndMessage{}; - while (timeGetTime() >= startTime && timeGetTime() - startTime < 2000) - PeekMessageA(&wndMessage, pinball::hwnd_frame, 0, 0, 1u); + while (timeGetTime() >= startTime && timeGetTime() - startTime < 0)// Don't wait for now, was 2000 + PeekMessageA(&wndMessage, hwnd_frame, 0, 0, 1u); if (strstr(lpCmdLine, "-demo")) pb::toggle_demo(); @@ -185,7 +200,7 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi { char buf[60]; sprintf_s(buf, "Frames/sec = %02.02f", 300.0f / (static_cast(curTime - prevTime) * 0.001f)); - SetWindowTextA(pinball::hwnd_frame, buf); + SetWindowTextA(hwnd_frame, buf); if (DispGRhistory) { @@ -326,10 +341,10 @@ LRESULT CALLBACK winmain::message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LP pb::window_size(&width, &height); auto prevCursor = SetCursor(LoadCursorA(nullptr, (LPCSTR)IDC_WAIT)); - gdrv::init(pinball::hinst, hWnd); + gdrv::init(hinst, hWnd); auto voiceCount = options::get_int(nullptr, "Voices", 8); - if (!Sound::Init(pinball::hinst, voiceCount, nullptr)) + if (!Sound::Init(hinst, voiceCount, nullptr)) options::menu_set(0xC9u, 0); Sound::Activate(); @@ -417,10 +432,10 @@ LRESULT CALLBACK winmain::message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LP case VK_ESCAPE: if (options::Options.FullScreen) options::toggle(0x193u); - SendMessageA(pinball::hwnd_frame, 0x112u, 0xF020u, 0); + SendMessageA(hwnd_frame, 0x112u, 0xF020u, 0); break; case VK_F1: - help_introduction(pinball::hinst, hWnd); + help_introduction(hinst, hWnd); break; case VK_F2: new_game(); @@ -465,6 +480,7 @@ LRESULT CALLBACK winmain::message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LP case SC_MOVE: if (fullscrn::screen_mode) return 0; + break; case SC_MINIMIZE: if (!single_step) pause(); @@ -513,20 +529,20 @@ LRESULT CALLBACK winmain::message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LP "%s %s%lX %s%lX", tmpBuf, "select=", - (int)pinball::hwnd_frame, + (int)hwnd_frame, "confirm=", - (int)pinball::hwnd_frame - * (int)pinball::hwnd_frame - * (int)pinball::hwnd_frame - * (int)pinball::hwnd_frame - * (int)pinball::hwnd_frame - * (int)pinball::hwnd_frame - * (int)pinball::hwnd_frame); + (int)hwnd_frame + * (int)hwnd_frame + * (int)hwnd_frame + * (int)hwnd_frame + * (int)hwnd_frame + * (int)hwnd_frame + * (int)hwnd_frame); if (static_cast(WinExec(cmdLine, 5u)) < 32) { auto caption = pinball::get_rc_string(170, 0); auto text = pinball::get_rc_string(171, 0); - MessageBoxA(pinball::hwnd_frame, text, caption, 0x2010u); + MessageBoxA(hwnd_frame, text, caption, 0x2010u); } memory::free(tmpBuf); } @@ -547,7 +563,7 @@ LRESULT CALLBACK winmain::message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LP case 301: if (!single_step) pause(); - help_introduction(pinball::hinst, hWnd); + help_introduction(hinst, hWnd); return DefWindowProcA(hWnd, Msg, wParam, lParam); case 0x6A: pb::end_game(); @@ -572,7 +588,7 @@ LRESULT CALLBACK winmain::message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LP case 0x66u: if (!single_step) pause(); - a_dialog(pinball::hinst, hWnd); + a_dialog(hinst, hWnd); return DefWindowProcA(hWnd, Msg, wParam, lParam); case 0x67u: if (!single_step) @@ -655,7 +671,7 @@ int winmain::ProcessWindowMessages() } return 1; } - GetMessageA(&Msg, pinball::hwnd_frame, 0, 0); + GetMessageA(&Msg, hwnd_frame, 0, 0); TranslateMessage(&Msg); DispatchMessageA(&Msg); if (Msg.message == 18) diff --git a/SpaceCadetPinball/winmain.h b/SpaceCadetPinball/winmain.h index b916b28..83019ed 100644 --- a/SpaceCadetPinball/winmain.h +++ b/SpaceCadetPinball/winmain.h @@ -6,6 +6,8 @@ class winmain public: static char DatFileName[300]; static int single_step; + static HINSTANCE hinst; + static HWND hwnd_frame; static int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd); static LRESULT CALLBACK message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);