diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index 8031207..11912f7 100644 Binary files a/Doc/FuncStats.xlsx and b/Doc/FuncStats.xlsx differ diff --git a/SpaceCadetPinball/Sound.cpp b/SpaceCadetPinball/Sound.cpp index 9c4df2e..422a790 100644 --- a/SpaceCadetPinball/Sound.cpp +++ b/SpaceCadetPinball/Sound.cpp @@ -1,6 +1,11 @@ #include "pch.h" #include "Sound.h" +int Sound::Init(HINSTANCE hInstance, int voices, void(__stdcall* someFuncPtr)(int, int, int)) +{ + return 1; +} + void Sound::Enable(int a1, int a2, int a3) { } @@ -12,3 +17,15 @@ void Sound::nullsub_1(int a1, int a2, int a3) void Sound::Idle() { } + +void Sound::Activate() +{ +} + +void Sound::Deactivate() +{ +} + +void Sound::Close() +{ +} diff --git a/SpaceCadetPinball/Sound.h b/SpaceCadetPinball/Sound.h index 1fca981..f25c162 100644 --- a/SpaceCadetPinball/Sound.h +++ b/SpaceCadetPinball/Sound.h @@ -2,7 +2,11 @@ class Sound { public: + static int Init(HINSTANCE hInstance, int voices, void (__stdcall* someFuncPtr)(int, int, int)); static void Enable(int a1, int a2, int a3); static void nullsub_1(int a1, int a2, int a3); static void Idle(); + static void Activate(); + static void Deactivate(); + static void Close(); }; diff --git a/SpaceCadetPinball/SpaceCadetPinball.cpp b/SpaceCadetPinball/SpaceCadetPinball.cpp index 92292a6..4c5b028 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.cpp +++ b/SpaceCadetPinball/SpaceCadetPinball.cpp @@ -14,17 +14,16 @@ #include "score.h" #include "TPinballTable.h" #include "TTextBox.h" +#include "winmain.h" int main() { std::cout << "Hello World!\n"; { // Testing with UI - /* lstrcpyA(pinball::DatFileName, "PINBALL.DAT"); - pinball::hinst = GetModuleHandleA(nullptr); char cmdLine[1]{}; pb::init(); - WinMain(pinball::hinst, 0, cmdLine, 10);*/ + WinMain(pinball::hinst, 0, cmdLine, 10); } gdrv::init(0, 0); @@ -40,7 +39,7 @@ int main() auto xx = sizeof(datFileHeader); - lstrcpyA(pinball::DatFileName, "PINBALL.DAT"); + lstrcpyA(winmain::DatFileName, "PINBALL.DAT"); pb::init(); auto datFile = pb::record_table; diff --git a/SpaceCadetPinball/SpaceCadetPinball.vcxproj b/SpaceCadetPinball/SpaceCadetPinball.vcxproj index 5350bc3..a394ae6 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.vcxproj +++ b/SpaceCadetPinball/SpaceCadetPinball.vcxproj @@ -96,7 +96,7 @@ Console true - Comctl32.lib;Winmm.lib;%(AdditionalDependencies) + Comctl32.lib;Winmm.lib;Htmlhelp.lib;%(AdditionalDependencies) @@ -131,6 +131,7 @@ true true true + Comctl32.lib;Winmm.lib;Htmlhelp.lib;%(AdditionalDependencies) @@ -159,6 +160,8 @@ + + @@ -217,6 +220,8 @@ + + diff --git a/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters b/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters index 56254e7..1876e8d 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters +++ b/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters @@ -201,6 +201,12 @@ Header Files + + Header Files + + + Header Files + @@ -368,6 +374,12 @@ Source Files + + Source Files + + + Source Files + diff --git a/SpaceCadetPinball/fullscrn.h b/SpaceCadetPinball/fullscrn.h index 7969d64..bb1a9df 100644 --- a/SpaceCadetPinball/fullscrn.h +++ b/SpaceCadetPinball/fullscrn.h @@ -28,6 +28,7 @@ public: static int convert_mouse_pos(unsigned int mouseXY); static void getminmaxinfo(MINMAXINFO* maxMin); static void paint(); + static bool set_menu_mode(int menuEnabled); private : static int MenuEnabled; static HMENU MenuHandle; @@ -37,6 +38,5 @@ private : static int setWindowFlagsDisDlg(); static int enableFullscreen(); static int disableFullscreen(); - static bool set_menu_mode(int menuEnabled); static void fillRect(int right, int bottom); }; diff --git a/SpaceCadetPinball/gdrv.cpp b/SpaceCadetPinball/gdrv.cpp index d1915ad..0145dc7 100644 --- a/SpaceCadetPinball/gdrv.cpp +++ b/SpaceCadetPinball/gdrv.cpp @@ -206,9 +206,10 @@ int gdrv::display_palette(PALETTEENTRY* plt) { if (plt) { - pltDst->peRed = pltSrc->peRed; + // Todo: verify RGB order + pltDst->peRed = pltSrc->peBlue; pltDst->peGreen = pltSrc->peGreen; - pltDst->peBlue = pltSrc->peBlue; + pltDst->peBlue = pltSrc->peRed; } pltDst->peFlags = 4; pltSrc++; diff --git a/SpaceCadetPinball/midi.cpp b/SpaceCadetPinball/midi.cpp new file mode 100644 index 0000000..61a4478 --- /dev/null +++ b/SpaceCadetPinball/midi.cpp @@ -0,0 +1,22 @@ +#include "pch.h" +#include "midi.h" + +MCIERROR midi::play_pb_theme(int flag) +{ + return MCIERROR(); +} + +MCIERROR midi::music_stop() +{ + return MCIERROR(); +} + +int midi::music_init(HWND hwnd) +{ + return 1; +} + +MCIERROR midi::restart_midi_seq(int param) +{ + return MCIERROR(); +} diff --git a/SpaceCadetPinball/midi.h b/SpaceCadetPinball/midi.h new file mode 100644 index 0000000..335574e --- /dev/null +++ b/SpaceCadetPinball/midi.h @@ -0,0 +1,9 @@ +#pragma once +class midi +{ +public: + static MCIERROR play_pb_theme(int flag); + static MCIERROR music_stop(); + static int music_init(HWND hwnd); + static MCIERROR restart_midi_seq(int param); +}; diff --git a/SpaceCadetPinball/nudge.cpp b/SpaceCadetPinball/nudge.cpp new file mode 100644 index 0000000..410202c --- /dev/null +++ b/SpaceCadetPinball/nudge.cpp @@ -0,0 +1,26 @@ +#include "pch.h" +#include "nudge.h" + +void nudge::un_nudge_right(int x, int y) +{ +} + +void nudge::un_nudge_left(int x, int y) +{ +} + +void nudge::un_nudge_up(int x, int y) +{ +} + +void nudge::nudge_right() +{ +} + +void nudge::nudge_left() +{ +} + +void nudge::nudge_up() +{ +} diff --git a/SpaceCadetPinball/nudge.h b/SpaceCadetPinball/nudge.h new file mode 100644 index 0000000..7301902 --- /dev/null +++ b/SpaceCadetPinball/nudge.h @@ -0,0 +1,12 @@ +#pragma once +class nudge +{ +public : + + static void un_nudge_right(int x, int y); + static void un_nudge_left(int x, int y); + static void un_nudge_up(int x, int y); + static void nudge_right(); + static void nudge_left(); + static void nudge_up(); +}; diff --git a/SpaceCadetPinball/options.cpp b/SpaceCadetPinball/options.cpp index 1313bd6..d9fcb62 100644 --- a/SpaceCadetPinball/options.cpp +++ b/SpaceCadetPinball/options.cpp @@ -1,6 +1,9 @@ #include "pch.h" #include "options.h" + +#include "fullscrn.h" #include "memory.h" +#include "midi.h" #include "pinball.h" #include "Sound.h" @@ -185,10 +188,62 @@ void options::set_string(LPCSTR optPath, LPCSTR lpValueName, LPCSTR value) } -HMENU options::menu_check(UINT uIDCheckItem, int value) +void options::menu_check(UINT uIDCheckItem, int check) { - HMENU result = MenuHandle; if (MenuHandle) - result = (HMENU)CheckMenuItem(MenuHandle, uIDCheckItem, value != 0 ? 8 : 0); - return result; + CheckMenuItem(MenuHandle, uIDCheckItem, check != 0 ? 8 : 0); +} + +void options::menu_set(UINT uIDEnableItem, int enable) +{ + if (MenuHandle) + EnableMenuItem(MenuHandle, uIDEnableItem, enable == 0); +} + + +void options::toggle(UINT uIDCheckItem) +{ + int newValue; + switch (uIDCheckItem) + { + case 0xC9u: + newValue = Options.Sounds == 0; + Options.Sounds = Options.Sounds == 0; + Sound::Enable(0, 7, newValue); + menu_check(uIDCheckItem, newValue); + return; + case 0xCAu: + newValue = Options.Music == 0; + Options.Music = Options.Music == 0; + if (!newValue) + midi::music_stop(); + else + midi::play_pb_theme(0); + menu_check(uIDCheckItem, newValue); + return; + case 0x193u: + newValue = Options.FullScreen == 0; + Options.FullScreen = Options.FullScreen == 0; + fullscrn::set_screen_mode(newValue); + menu_check(uIDCheckItem, newValue); + return; + } + if (uIDCheckItem > 407 && uIDCheckItem <= 411) + { + Options.Players = uIDCheckItem - 407; + menu_check(0x198u, uIDCheckItem == 408); + menu_check(0x199u, Options.Players == 2); + menu_check(0x19Au, Options.Players == 3); + menu_check(0x19Bu, Options.Players == 4); + } +} + +void options::keyboard() +{ + DialogBoxParamA(pinball::hinst, "KEYMAPPER", pinball::hwnd_frame, KeyMapDlgProc, 0); +} + +INT_PTR _stdcall options::KeyMapDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + return 0; } diff --git a/SpaceCadetPinball/options.h b/SpaceCadetPinball/options.h index e9b9d80..19cc41a 100644 --- a/SpaceCadetPinball/options.h +++ b/SpaceCadetPinball/options.h @@ -33,8 +33,12 @@ public: static void set_int(LPCSTR optPath, LPCSTR lpValueName, int data); static void get_string(LPCSTR optPath, LPCSTR lpValueName, LPSTR lpString1, LPCSTR lpString2, int iMaxLength); static void set_string(LPCSTR optPath, LPCSTR lpValueName, LPCSTR value); - static HMENU menu_check(UINT uIDCheckItem, int value); - + static void menu_check(UINT uIDCheckItem, int check); + static void menu_set(UINT uIDEnableItem, int enable); + static void toggle(UINT uIDCheckItem); + static void keyboard(); + static INT_PTR _stdcall KeyMapDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); + static optionsStruct Options; private: static LPCSTR OptionsRegPath; diff --git a/SpaceCadetPinball/pb.cpp b/SpaceCadetPinball/pb.cpp index a566fef..0f766c6 100644 --- a/SpaceCadetPinball/pb.cpp +++ b/SpaceCadetPinball/pb.cpp @@ -6,12 +6,17 @@ #include "proj.h" #include "render.h" #include "loader.h" +#include "midi.h" +#include "nudge.h" #include "options.h" #include "timer.h" +#include "winmain.h" TPinballTable* pb::MainTable = nullptr; datFileStruct* pb::record_table = nullptr; -int pb::time_ticks = 0, pb::demo_mode = 0; +int pb::time_ticks = 0, pb::demo_mode = 0, pb::cheat_mode = 0, pb::game_mode = 2, pb::mode_countdown_, pb:: + ball_speed_limit; +float pb::time_now, pb::time_next; int pb::init() { @@ -20,7 +25,7 @@ int pb::init() CHAR dataFilePath[300]; ++memory::critical_allocation; - lstrcpyA(datFileName, pinball::DatFileName); + lstrcpyA(datFileName, winmain::DatFileName); pinball::make_path_name(dataFilePath, datFileName, 300); record_table = partman::load_records(dataFilePath); @@ -53,6 +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::copy_bitmap( &render::vscreen, backgroundBmp->Width, @@ -130,15 +136,249 @@ void pb::replay_level(int demoMode) demo_mode = demoMode; mode_change(1); //if (options::Options.Music) - //midi_play_pb_theme(0); + midi::play_pb_theme(0); MainTable->Message(1014, static_cast(options::Options.Players)); } void pb::ballset(int x, int y) -{ +{ } int pb::frame(int time) { + if (time > 100) + time = 100; + float timeMul = time * 0.001f; + if (!mode_countdown(time)) + { + time_next = time_now + timeMul; + //pb::timed_frame(time_now, timeMul, 1); + time_now = time_next; + time_ticks += time; + /*if (nudged_left || nudged_right || nudged_up) + { + nudge_count = timeMul * 4.0 + nudge_count; + } + else + { + v2 = nudge_count - timeMul; + if (v2 <= 0.0) + v2 = 0.0; + nudge_count = v2; + }*/ + //timer::check(); + render::update(); + //score::update(MainTable->Score1); + /*if (!MainTable->UnknownP83) + { + if (nudge_count > 0.5) + { + v3 = pinball:: get_rc_string(25, 0); + pinball::InfoTextBox->Display( v3, 2.0); + } + if (nudge_count > 1.0) + TPinballTable::tilt(MainTable, v1, time_now); + }*/ + } return 1; -} \ No newline at end of file +} + +void pb::window_size(int* width, int* height) +{ + *width = 600; + *height = 416; +} + +void pb::pause_continue() +{ + winmain::single_step = winmain::single_step == 0; + pinball::InfoTextBox->Clear(); + pinball::MissTextBox->Clear(); + if (winmain::single_step) + { + if (MainTable) + MainTable->Message(1008, time_now); + pinball::InfoTextBox->Display(pinball::get_rc_string(22, 0), -1.0); + midi::music_stop(); + } + else + { + if (MainTable) + MainTable->Message(1009, 0.0); + if (!demo_mode) + { + char* text; + float textTime; + if (game_mode == 2) + { + textTime = -1.0; + text = pinball::get_rc_string(24, 0); + } + else + { + textTime = 5.0; + text = pinball::get_rc_string(23, 0); + } + pinball::InfoTextBox->Display(text, textTime); + } + if (options::Options.Music && !winmain::single_step) + midi::play_pb_theme(0); + } +} + +void pb::loose_focus() +{ + if (MainTable) + MainTable->Message(1010, time_now); +} + +void pb::keyup(int key) +{ + if (game_mode == 1 && !winmain::single_step && !demo_mode) + { + if (key == options::Options.LeftFlipperKey) + { + MainTable->Message(1001, time_now); + } + else if (key == options::Options.RightFlipperKey) + { + MainTable->Message(1003, time_now); + } + else if (key == options::Options.PlungerKey) + { + MainTable->Message(1005, time_now); + } + else if (key == options::Options.LeftTableBumpKey) + { + nudge::un_nudge_right(0, 0); + } + else if (key == options::Options.RightTableBumpKey) + { + nudge::un_nudge_left(0, 0); + } + else if (key == options::Options.BottomTableBumpKey) + { + nudge::un_nudge_up(0, 0); + } + } +} + +void pb::keydown(int key) +{ + if (winmain::single_step || demo_mode) + return; + if (game_mode != 1) + { + mode_countdown(-1); + return; + } + ctrl_bdoor_controller(key); + if (key == options::Options.LeftFlipperKey) + { + MainTable->Message(1000, time_now); + return; + } + if (key == options::Options.RightFlipperKey) + { + MainTable->Message(1002, time_now); + } + else + { + if (key == options::Options.PlungerKey) + { + MainTable->Message(1004, time_now); + return; + } + if (key == options::Options.LeftTableBumpKey) + { + if (!MainTable->UnknownP83) + nudge::nudge_right(); + return; + } + if (key == options::Options.RightTableBumpKey) + { + if (!MainTable->UnknownP83) + nudge::nudge_left(); + return; + } + if (key == options::Options.BottomTableBumpKey) + { + if (!MainTable->UnknownP83) + nudge::nudge_up(); + return; + } + } + if (cheat_mode) + { + switch (key) + { + case 'B': + /**/ + break; + case 'H': + /*auto v1 = get_rc_string(26, 0); + lstrcpyA(&String1, v1); + show_and_set_high_score_dialog(highscore_table, 1000000000, 1, &String1);*/ + break; + case 'M': + char buffer[20]; + sprintf_s(buffer, "%ld", memory::use_total); + MessageBoxA(pinball::hwnd_frame, buffer, "Mem:", 0x2000u); + break; + case 'R': + cheat_bump_rank(); + break; + case VK_F11: + gdrv::get_focus(); + break; + case VK_F12: + MainTable->port_draw(); + break; + } + } +} + +void pb::ctrl_bdoor_controller(int key) +{ +} + +int pb::mode_countdown(int time) +{ + if (!game_mode || game_mode <= 0) + return 1; + if (game_mode > 2) + { + if (game_mode == 3) + { + mode_countdown_ -= time; + if (mode_countdown_ < 0 || time < 0) + mode_change(4); + } + else if (game_mode == 4) + { + mode_countdown_ -= time; + if (mode_countdown_ < 0 || time < 0) + mode_change(1); + } + return 1; + } + return 0; +} + +int pb::cheat_bump_rank() +{ + return 0; +} + +void pb::launch_ball() +{ +} + +int pb::end_game() +{ + return 0; +} + +void pb::high_scores() +{ +} diff --git a/SpaceCadetPinball/pb.h b/SpaceCadetPinball/pb.h index 31b3d62..8a644bd 100644 --- a/SpaceCadetPinball/pb.h +++ b/SpaceCadetPinball/pb.h @@ -7,6 +7,7 @@ class pb public: static int time_ticks; static int ball_speed_limit; + static int cheat_mode, game_mode; static datFileStruct* record_table; static TPinballTable* MainTable; @@ -19,6 +20,18 @@ public: static void replay_level(int demoMode); static void ballset(int x, int y); static int frame(int time); + static void window_size(int* width, int* height); + static void pause_continue(); + static void loose_focus(); + static void keyup(int key); + static void keydown(int key); + static void ctrl_bdoor_controller(int key); + static int mode_countdown(int time); + static int cheat_bump_rank(); + static void launch_ball(); + static int end_game(); + static void high_scores(); private : - static int demo_mode; + static int demo_mode, mode_countdown_; + static float time_now, time_next; }; diff --git a/SpaceCadetPinball/pch.h b/SpaceCadetPinball/pch.h index abc1f98..6b6ed30 100644 --- a/SpaceCadetPinball/pch.h +++ b/SpaceCadetPinball/pch.h @@ -15,6 +15,7 @@ #include #include #include +#include //#include // Use (void) to silent unused warnings. diff --git a/SpaceCadetPinball/pinball.cpp b/SpaceCadetPinball/pinball.cpp index 8c9ff66..23001b2 100644 --- a/SpaceCadetPinball/pinball.cpp +++ b/SpaceCadetPinball/pinball.cpp @@ -10,7 +10,6 @@ char pinball::getRcBuffer[6 * 256]; int pinball::rc_string_slot = 0; HINSTANCE pinball::hinst; char pinball::WindowName[2]{}; -char pinball::DatFileName[300]{}; int pinball::LeftShift = -1; int pinball::RightShift = -1; HWND pinball::hwnd_frame = nullptr; diff --git a/SpaceCadetPinball/pinball.h b/SpaceCadetPinball/pinball.h index f15c00b..c794450 100644 --- a/SpaceCadetPinball/pinball.h +++ b/SpaceCadetPinball/pinball.h @@ -9,7 +9,6 @@ public: static TTextBox* MissTextBox; static HINSTANCE hinst; static char WindowName[2]; - static char DatFileName[300]; static int RightShift; static int LeftShift; static HWND hwnd_frame; diff --git a/SpaceCadetPinball/winmain.cpp b/SpaceCadetPinball/winmain.cpp index 3f9c6ca..1aa2b94 100644 --- a/SpaceCadetPinball/winmain.cpp +++ b/SpaceCadetPinball/winmain.cpp @@ -3,16 +3,20 @@ #include "fullscrn.h" #include "memory.h" +#include "midi.h" #include "pinball.h" #include "options.h" #include "pb.h" #include "Sound.h" -int winmain::iFrostUniqueMsg, winmain::return_value = 0, winmain::bQuit = 0; +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]{}; +HCURSOR winmain::mouse_hsave; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { @@ -89,7 +93,7 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi pinball::quickFlag = strstr(lpCmdLine, "-quick") != nullptr; pinball::hinst = hInstance; - options::get_string(regSpaceCadet, "Pinball Data", pinball::DatFileName, pinball::get_rc_string(168, 0), 300); + options::get_string(regSpaceCadet, "Pinball Data", DatFileName, pinball::get_rc_string(168, 0), 300); iFrostUniqueMsg = RegisterWindowMessageA("PinballThemeSwitcherUniqueMsgString"); auto windowHandle = FindWindowA(pinball::get_rc_string(167, 0), nullptr); @@ -272,6 +276,364 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi LRESULT CALLBACK winmain::message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { + if (Msg == iFrostUniqueMsg) + { + if (IsIconic(hWnd)) + ShowWindow(hWnd, 9); + SetForegroundWindow(hWnd); + return 0; + } + + if (Msg <= WM_ACTIVATEAPP) + { + switch (Msg) + { + case WM_ACTIVATEAPP: + if (wParam) + { + activated = 1; + Sound::Activate(); + if (options::Options.Music && !single_step) + midi::play_pb_theme(0); + no_time_loss = 1; + pinball::adjust_priority(options::Options.PriorityAdj); + } + else + { + activated = 0; + fullscrn::activate(0); + options::menu_check(0x193u, 0); + options::Options.FullScreen = 0; + SetThreadPriority(GetCurrentThread(), 0); + Sound::Deactivate(); + midi::music_stop(); + } + + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_KILLFOCUS: + has_focus = 0; + gdrv::get_focus(); + pb::loose_focus(); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_CREATE: + { + RECT rect{}; + ++memory::critical_allocation; + + GetWindowRect(GetDesktopWindow(), &rect); + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + pb::window_size(&width, &height); + + auto prevCursor = SetCursor(LoadCursorA(nullptr, (LPCSTR)IDC_WAIT)); + gdrv::init(pinball::hinst, hWnd); + + auto voiceCount = options::get_int(nullptr, "Voices", 8); + if (!Sound::Init(pinball::hinst, voiceCount, nullptr)) + options::menu_set(0xC9u, 0); + Sound::Activate(); + + if (!pinball::quickFlag && !midi::music_init(hWnd)) + options::menu_set(0xCAu, 0); + + if (pb::init()) + _exit(0); + SetCursor(prevCursor); + auto changeDisplayFg = options::get_int(nullptr, "Change Display", 1); + auto menuHandle = GetMenu(hWnd); + fullscrn::init(width, static_cast(height), options::Options.FullScreen, hWnd, menuHandle, + changeDisplayFg); + + --memory::critical_allocation; + return DefWindowProcA(hWnd, Msg, wParam, lParam); + } + case WM_MOVE: + no_time_loss = 1; + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_SETFOCUS: + has_focus = 1; + no_time_loss = 1; + gdrv::get_focus(); + fullscrn::force_redraw(); + pb::paint(); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_PAINT: + { + PAINTSTRUCT paint{}; + _BeginPaint(hWnd, &paint); + fullscrn::paint(); + EndPaint(hWnd, &paint); + break; + } + case WM_CLOSE: + case WM_QUIT: + case WM_DESTROY: + end_pause(); + bQuit = 1; + PostQuitMessage(0); + fullscrn::shutdown(); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_ERASEBKGND: + break; + default: + return DefWindowProcA(hWnd, Msg, wParam, lParam); + } + return 0; + } + + if (Msg <= WM_MENUSELECT) + { + switch (Msg) + { + case WM_MENUSELECT: + if (lParam) + return DefWindowProcA(hWnd, Msg, wParam, lParam); + if (fullscrn::screen_mode) + fullscrn::set_menu_mode(0); + return 0; + case WM_SYSKEYDOWN: + no_time_loss = 1; + if (fullscrn::screen_mode) + fullscrn::set_menu_mode(1); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_GETMINMAXINFO: + fullscrn::getminmaxinfo((MINMAXINFO*)lParam); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_DISPLAYCHANGE: + if (fullscrn::displaychange()) + { + options::Options.FullScreen = 0; + options::menu_check(0x193u, 0); + } + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_KEYUP: + pb::keyup(wParam); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_KEYDOWN: + if (!(lParam & 0x40000000)) + pb::keydown(wParam); + switch (wParam) + { + case VK_ESCAPE: + if (options::Options.FullScreen) + options::toggle(0x193u); + SendMessageA(pinball::hwnd_frame, 0x112u, 0xF020u, 0); + break; + case VK_F1: + help_introduction(pinball::hinst, hWnd); + break; + case VK_F2: + new_game(); + break; + case VK_F3: + pause(); + break; + case VK_F4: + options::toggle(0x193u); + break; + case VK_F8: + if (!single_step) + pause(); + options::keyboard(); + break; + } + if (!pb::cheat_mode) + return DefWindowProcA(hWnd, Msg, wParam, lParam); + switch (wParam) + { + case 'H': + DispGRhistory = 1; + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case 'Y': + SetWindowTextA(hWnd, "Pinball"); + DispFrameRate = DispFrameRate == 0; + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case VK_F1: + pb::frame(10); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case VK_F15: + single_step = single_step == 0; + if (single_step == 0) + no_time_loss = 1; + return DefWindowProcA(hWnd, Msg, wParam, lParam); + default: + return DefWindowProcA(hWnd, Msg, wParam, lParam); + } + case WM_SYSCOMMAND: + switch (wParam & 0xFFF0) + { + case SC_MOVE: + if (fullscrn::screen_mode) + return 0; + case SC_MINIMIZE: + if (!single_step) + pause(); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case SC_SCREENSAVE: + fullscrn::activate(0); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + default: break; + } + end_pause(); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_INITMENU: + no_time_loss = 1; + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_COMMAND: + no_time_loss = 1; + switch (wParam) + { + case 0x191u: + end_pause(); + pb::launch_ball(); + break; + case 0x192u: + pause(); + break; + case 0x193u: + if (!single_step) + pause(); + options::toggle(wParam); + break; + case 0x194u: + end_pause(); + pb::toggle_demo(); + break; + case 0x195u: + { + if (!single_step) + pause(); + auto tmpBuf = memory::allocate(0x1F4u); + if (tmpBuf) + { + char cmdLine[0x1F4u]; + options::get_string(nullptr, "Shell Exe", tmpBuf, pinball::WindowName, 500); + sprintf_s( + cmdLine, + "%s %s%lX %s%lX", + tmpBuf, + "select=", + (int)pinball::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); + 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); + } + memory::free(tmpBuf); + } + break; + } + case 0x196u: + if (!single_step) + pause(); + options::keyboard(); + break; + case 0x198u: + case 0x199u: + case 0x19Au: + case 0x19Bu: + options::toggle(wParam); + new_game(); + break; + case 301: + if (!single_step) + pause(); + help_introduction(pinball::hinst, hWnd); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case 0x6A: + pb::end_game(); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case 201: + case 202: + if (!single_step) + pause(); + options::toggle(wParam); + break; + case 204: + if (!single_step) + pause(); + options::keyboard(); + break; + case 0x69u: + PostMessageA(hWnd, 0x12u, 0, 0); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case 0x65u: + new_game(); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case 0x66u: + if (!single_step) + pause(); + a_dialog(pinball::hinst, hWnd); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case 0x67u: + if (!single_step) + pause(); + pb::high_scores(); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case 1: + midi::restart_midi_seq(lParam); + default: + break; + } + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_LBUTTONDOWN: + if (pb::game_mode) + { + if (pb::cheat_mode) + { + mouse_down = 1; + mouse_hsave = SetCursor(nullptr); + auto lParam2 = fullscrn::convert_mouse_pos(lParam); + last_mouse_x = static_cast(lParam2); + last_mouse_y = static_cast(lParam2) >> 16; + SetCapture(hWnd); + } + return DefWindowProcA(hWnd, Msg, wParam, lParam); + } + break; + case WM_LBUTTONUP: + if (mouse_down) + { + mouse_down = 0; + SetCursor(mouse_hsave); + ReleaseCapture(); + } + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + if (pb::game_mode) + return DefWindowProcA(hWnd, Msg, wParam, lParam); + break; + case WM_POWERBROADCAST: + if (wParam == 4 && options::Options.FullScreen) + { + options::Options.FullScreen = 0; + options::menu_check(0x193u, 0); + fullscrn::set_screen_mode(options::Options.FullScreen); + } + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_PALETTECHANGED: + InvalidateRect(hWnd, nullptr, 0); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + case WM_POINTERDEVICEINRANGE | LB_ADDSTRING: + if (wParam == 1) + midi::restart_midi_seq(lParam); + return DefWindowProcA(hWnd, Msg, wParam, lParam); + default: + return DefWindowProcA(hWnd, Msg, wParam, lParam); + } + } + + pb::mode_countdown(-1); return DefWindowProcA(hWnd, Msg, wParam, lParam); } @@ -306,8 +668,8 @@ int winmain::ProcessWindowMessages() void winmain::memalloc_failure() { - /*midi_music_stop(); - Sound_Close();*/ + midi::music_stop(); + Sound::Close(); gdrv::uninit(); char* caption = pinball::get_rc_string(170, 0); char* text = pinball::get_rc_string(179, 0); @@ -347,3 +709,57 @@ int winmain::a_dialog(HINSTANCE hInstance, HWND hWnd) auto icon = LoadIconA(hInstance, "ICON_1"); return ShellAboutA(hWnd, appName, szOtherStuff, icon); } + +void winmain::end_pause() +{ + if (single_step) + { + if (fullscrn::screen_mode) + fullscrn::set_menu_mode(0); + pb::pause_continue(); + no_time_loss = 1; + } +} + +void winmain::new_game() +{ + end_pause(); + HCURSOR prevCursor = SetCursor(LoadCursorA(nullptr, (LPCSTR)IDC_WAIT)); + pb::replay_level(0); + SetCursor(prevCursor); +} + +void winmain::pause() +{ + if (fullscrn::screen_mode) + { + if (single_step) + fullscrn::set_menu_mode(0); + else + fullscrn::set_menu_mode(1); + } + pb::pause_continue(); + no_time_loss = 1; +} + +void winmain::help_introduction(HINSTANCE a1, HWND a2) +{ + char* buf1 = memory::allocate(0x1F4u); + if (buf1) + { + char* buf2 = memory::allocate(0x1F4u); + if (buf2) + { + options::get_string(nullptr, "HelpFile", buf1, pinball::get_rc_string(178, 0), 500); + options::get_string(pinball::get_rc_string(166, 0), "HelpFile", buf1, buf1, 500); + lstrcpyA(buf2, buf1); + memory::free(buf1); + HtmlHelpA(GetDesktopWindow(), buf2, 0, 0); + memory::free(buf2); + } + else + { + memory::free(buf1); + } + } +} diff --git a/SpaceCadetPinball/winmain.h b/SpaceCadetPinball/winmain.h index c424130..b916b28 100644 --- a/SpaceCadetPinball/winmain.h +++ b/SpaceCadetPinball/winmain.h @@ -4,6 +4,9 @@ class winmain { public: + static char DatFileName[300]; + static int single_step; + static int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd); static LRESULT CALLBACK message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); static void memalloc_failure(); @@ -11,11 +14,17 @@ public: static int check_expiration_date(); static HDC _GetDC(HWND hWnd); static int a_dialog(HINSTANCE hInstance, HWND hWnd); + static void end_pause(); + static void new_game(); + static void pause(); + static void help_introduction(HINSTANCE a1, HWND a2); private: - static int iFrostUniqueMsg, return_value, bQuit, DispFrameRate, DispGRhistory; - static int has_focus, single_step, mouse_down, last_mouse_x, last_mouse_y, no_time_loss; + static int return_value, bQuit, DispFrameRate, DispGRhistory, activated; + static int has_focus, mouse_down, last_mouse_x, last_mouse_y, no_time_loss; static DWORD then, now; + static UINT iFrostUniqueMsg; static gdrv_bitmap8 gfr_display; + static HCURSOR mouse_hsave; static HDC _BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint); };