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);
};