diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index f815ea9..91b9aa8 100644 Binary files a/Doc/FuncStats.xlsx and b/Doc/FuncStats.xlsx differ diff --git a/SpaceCadetPinball/Sound.cpp b/SpaceCadetPinball/Sound.cpp index 422a790..a3686cf 100644 --- a/SpaceCadetPinball/Sound.cpp +++ b/SpaceCadetPinball/Sound.cpp @@ -1,9 +1,9 @@ #include "pch.h" #include "Sound.h" -int Sound::Init(HINSTANCE hInstance, int voices, void(__stdcall* someFuncPtr)(int, int, int)) +int Sound::Init(HINSTANCE hInstance, int voices, void (__stdcall* someFuncPtr)(int, int, int)) { - return 1; + return 1; } void Sound::Enable(int a1, int a2, int a3) @@ -29,3 +29,13 @@ void Sound::Deactivate() void Sound::Close() { } + +int Sound::SubFactor(int a1, int a2) +{ + return a1 - a2; +} + +int Sound::AddFactor(int a1, int a2) +{ + return a1 + a2; +} diff --git a/SpaceCadetPinball/Sound.h b/SpaceCadetPinball/Sound.h index f25c162..a79b01f 100644 --- a/SpaceCadetPinball/Sound.h +++ b/SpaceCadetPinball/Sound.h @@ -9,4 +9,6 @@ public: static void Activate(); static void Deactivate(); static void Close(); + static int SubFactor(int a1, int a2); + static int AddFactor(int a1, int a2); }; diff --git a/SpaceCadetPinball/SpaceCadetPinball.rc b/SpaceCadetPinball/SpaceCadetPinball.rc index 3f6e72c..a2b5c32 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.rc +++ b/SpaceCadetPinball/SpaceCadetPinball.rc @@ -64,36 +64,36 @@ MENU_1 MENU BEGIN POPUP "&Game" BEGIN - MENUITEM "&New Game\tF2", 101 - MENUITEM "&Launch Ball", 401 - MENUITEM "&Pause/Resume Game\tF3", 402 + MENUITEM "&New Game\tF2", Menu1_New_Game + MENUITEM "&Launch Ball", Menu1_Launch_Ball + MENUITEM "&Pause/Resume Game\tF3", Menu1_Pause_Resume_Game MENUITEM SEPARATOR - MENUITEM "&High Scores...", 103 - MENUITEM "&Demo", 404 - MENUITEM "E&xit", 105 + MENUITEM "&High Scores...", Menu1_High_Scores + MENUITEM "&Demo", Menu1_Demo + MENUITEM "E&xit", Menu1_Exit END POPUP "&Options" BEGIN - MENUITEM "&Full Screen\tF4", 403 - MENUITEM "Select &Table", 405 + MENUITEM "&Full Screen\tF4", Menu1_Full_Screen + MENUITEM "Select &Table", Menu1_Select_Table POPUP "Select &Players" BEGIN - MENUITEM "&1 Player", 408 - MENUITEM "&2 Players", 409 - MENUITEM "&3 Players", 410 - MENUITEM "&4 Players", 411 + MENUITEM "&1 Player", Menu1_1Player + MENUITEM "&2 Players", Menu1_2Players + MENUITEM "&3 Players", Menu1_3Players + MENUITEM "&4 Players", Menu1_4Players END MENUITEM SEPARATOR - MENUITEM "&Sounds", 201 - MENUITEM "&Music", 202 + MENUITEM "&Sounds", Menu1_Sounds + MENUITEM "&Music", Menu1_Music MENUITEM SEPARATOR - MENUITEM "P&layer Controls...\tF8", 406 + MENUITEM "P&layer Controls...\tF8", Menu1_Player_Controls END POPUP "&Help" BEGIN - MENUITEM "&Help Topics\tF1", 301 + MENUITEM "&Help Topics\tF1", Menu1_Help_Topics MENUITEM SEPARATOR - MENUITEM "&About Pinball", 102 + MENUITEM "&About Pinball", Menu1_About_Pinball END END diff --git a/SpaceCadetPinball/SpaceCadetPinball.vcxproj b/SpaceCadetPinball/SpaceCadetPinball.vcxproj index 1a1a3c5..80735c1 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.vcxproj +++ b/SpaceCadetPinball/SpaceCadetPinball.vcxproj @@ -72,6 +72,7 @@ true + false true diff --git a/SpaceCadetPinball/TPinballTable.cpp b/SpaceCadetPinball/TPinballTable.cpp index a12da8b..ce72c42 100644 --- a/SpaceCadetPinball/TPinballTable.cpp +++ b/SpaceCadetPinball/TPinballTable.cpp @@ -219,7 +219,7 @@ TPinballTable::~TPinballTable() { //if (i) //(*(void(__thiscall**)(TLightGroup*, int))(*(_DWORD*)i + 16))(i, 1); - if (!ListP1->Count()) + //if (!ListP1->Count()) break; } delete ListP2; diff --git a/SpaceCadetPinball/TRamp.cpp b/SpaceCadetPinball/TRamp.cpp index 5143142..6357994 100644 --- a/SpaceCadetPinball/TRamp.cpp +++ b/SpaceCadetPinball/TRamp.cpp @@ -1,2 +1,8 @@ #include "pch.h" #include "TRamp.h" + + +void TRamp::port_draw() +{ + TCollisionComponent::port_draw(); +} diff --git a/SpaceCadetPinball/TRamp.h b/SpaceCadetPinball/TRamp.h index bf57c9f..ca5b7f0 100644 --- a/SpaceCadetPinball/TRamp.h +++ b/SpaceCadetPinball/TRamp.h @@ -8,4 +8,6 @@ public: TRamp(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, false) { } + + void port_draw() override; }; diff --git a/SpaceCadetPinball/TTextBox.cpp b/SpaceCadetPinball/TTextBox.cpp index 53b9d89..04cffb3 100644 --- a/SpaceCadetPinball/TTextBox.cpp +++ b/SpaceCadetPinball/TTextBox.cpp @@ -50,8 +50,9 @@ int TTextBox::Message(int code, float value) return 0; } -void TTextBox::TimerExpired(int a2, TTextBox* tb) +void TTextBox::TimerExpired(int timerId, void* caller) { + auto tb = static_cast(caller); TTextBoxMessage* message = tb->Message1; tb->Timer = 0; if (message) @@ -117,7 +118,7 @@ void TTextBox::Display(char* text, float time) if (time == -1.0) Timer = -1; else - Timer = timer::set(time, (int)this, (int)TimerExpired); + Timer = timer::set(time, this, TimerExpired); } } else @@ -205,11 +206,11 @@ void TTextBox::Draw() int timer; if (timeLeft >= 0.25f) { - timer = timer::set(timeLeft, (int)this2, (int)TimerExpired); + timer = timer::set(timeLeft, this2, TimerExpired); } else { - timer = timer::set(0.25, (int)this2, (int)TimerExpired); + timer = timer::set(0.25, this2, TimerExpired); } this2->Timer = timer; goto LABEL_18; diff --git a/SpaceCadetPinball/TTextBox.h b/SpaceCadetPinball/TTextBox.h index da54dea..505f9fa 100644 --- a/SpaceCadetPinball/TTextBox.h +++ b/SpaceCadetPinball/TTextBox.h @@ -24,5 +24,5 @@ public: void Display(char* text, float time); void Draw(); - static void TimerExpired(int a2, TTextBox* tb); + static void TimerExpired(int timerId, void* tb); }; diff --git a/SpaceCadetPinball/midi.cpp b/SpaceCadetPinball/midi.cpp index 61a4478..2ea232f 100644 --- a/SpaceCadetPinball/midi.cpp +++ b/SpaceCadetPinball/midi.cpp @@ -3,20 +3,25 @@ MCIERROR midi::play_pb_theme(int flag) { - return MCIERROR(); + return MCIERROR(); } MCIERROR midi::music_stop() { - return MCIERROR(); + return MCIERROR(); } int midi::music_init(HWND hwnd) { - return 1; + return 1; } MCIERROR midi::restart_midi_seq(int param) { - return MCIERROR(); + return MCIERROR(); +} + +MCIERROR midi::music_shutdown() +{ + return MCIERROR(); } diff --git a/SpaceCadetPinball/midi.h b/SpaceCadetPinball/midi.h index 335574e..79a1ca1 100644 --- a/SpaceCadetPinball/midi.h +++ b/SpaceCadetPinball/midi.h @@ -6,4 +6,5 @@ public: static MCIERROR music_stop(); static int music_init(HWND hwnd); static MCIERROR restart_midi_seq(int param); + static MCIERROR music_shutdown(); }; diff --git a/SpaceCadetPinball/options.cpp b/SpaceCadetPinball/options.cpp index d591afa..5fe9486 100644 --- a/SpaceCadetPinball/options.cpp +++ b/SpaceCadetPinball/options.cpp @@ -5,6 +5,7 @@ #include "memory.h" #include "midi.h" #include "pinball.h" +#include "resource.h" #include "Sound.h" #include "winmain.h" @@ -68,7 +69,7 @@ void options::init(HMENU menuHandle) { if (MenuHandle) { - DeleteMenu(MenuHandle, 0x195u, 0); + DeleteMenu(MenuHandle, Menu1_Select_Table, 0); DrawMenuBar(winmain::hwnd_frame); } } @@ -76,6 +77,20 @@ void options::init(HMENU menuHandle) } } +void options::uninit() +{ + set_int(nullptr, "Sounds", Options.Sounds); + set_int(nullptr, "Music", Options.Music); + set_int(nullptr, "FullScreen", Options.FullScreen); + set_int(nullptr, "Players", Options.Players); + set_int(nullptr, "Left Flippper key", Options.LeftFlipperKey); + set_int(nullptr, "Right Flipper key", Options.RightFlipperKey); + set_int(nullptr, "Plunger key", Options.PlungerKey); + set_int(nullptr, "Left Table Bump key", Options.LeftTableBumpKey); + set_int(nullptr, "Right Table Bump key", Options.RightTableBumpKey); + set_int(nullptr, "Bottom Table Bump key", Options.BottomTableBumpKey); +} + void options::path_init(LPCSTR regPath) { char* buf = memory::allocate(lstrlenA(regPath) + 1); @@ -207,13 +222,13 @@ void options::toggle(UINT uIDCheckItem) int newValue; switch (uIDCheckItem) { - case 0xC9u: + case Menu1_Sounds: newValue = Options.Sounds == 0; Options.Sounds = Options.Sounds == 0; Sound::Enable(0, 7, newValue); menu_check(uIDCheckItem, newValue); return; - case 0xCAu: + case Menu1_Music: newValue = Options.Music == 0; Options.Music = Options.Music == 0; if (!newValue) @@ -222,7 +237,7 @@ void options::toggle(UINT uIDCheckItem) midi::play_pb_theme(0); menu_check(uIDCheckItem, newValue); return; - case 0x193u: + case Menu1_Full_Screen: newValue = Options.FullScreen == 0; Options.FullScreen = Options.FullScreen == 0; fullscrn::set_screen_mode(newValue); @@ -232,7 +247,7 @@ void options::toggle(UINT uIDCheckItem) if (uIDCheckItem > 407 && uIDCheckItem <= 411) { Options.Players = uIDCheckItem - 407; - menu_check(0x198u, uIDCheckItem == 408); + menu_check(0x198u, Options.Players == 1); menu_check(0x199u, Options.Players == 2); menu_check(0x19Au, Options.Players == 3); menu_check(0x19Bu, Options.Players == 4); diff --git a/SpaceCadetPinball/options.h b/SpaceCadetPinball/options.h index 19cc41a..95037ae 100644 --- a/SpaceCadetPinball/options.h +++ b/SpaceCadetPinball/options.h @@ -27,6 +27,7 @@ class options { public: static void init(HMENU menuHandle); + static void uninit(); static void path_init(LPCSTR regPath); static void path_uninit(); static int get_int(LPCSTR optPath, LPCSTR lpValueName, int defaultValue); diff --git a/SpaceCadetPinball/pb.cpp b/SpaceCadetPinball/pb.cpp index b1e1cca..5d161d4 100644 --- a/SpaceCadetPinball/pb.cpp +++ b/SpaceCadetPinball/pb.cpp @@ -58,7 +58,8 @@ 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, (char)0xff); // temp + gdrv::fill_bitmap(&render::vscreen, render::vscreen.Width, render::vscreen.Height, 0, 0, + static_cast(0xff)); // temp gdrv::copy_bitmap( &render::vscreen, backgroundBmp->Width, @@ -91,6 +92,21 @@ int pb::init() return 0; } +int pb::uninit() +{ + score::unload_msg_font(); + loader::unload(); + partman::unload_records(record_table); + //high_score_write(highscore_table, (int)&pb_state); + if (MainTable) + delete MainTable; + MainTable = nullptr; + gdrv::get_focus(); + timer::uninit(); + render::uninit(); + return 0; +} + void pb::reset_table() { if (MainTable) @@ -166,7 +182,7 @@ int pb::frame(int time) v2 = 0.0; nudge_count = v2; }*/ - //timer::check(); + timer::check(); render::update(); //score::update(MainTable->Score1); /*if (!MainTable->UnknownP83) diff --git a/SpaceCadetPinball/pb.h b/SpaceCadetPinball/pb.h index 8a644bd..f103533 100644 --- a/SpaceCadetPinball/pb.h +++ b/SpaceCadetPinball/pb.h @@ -12,6 +12,7 @@ public: static TPinballTable* MainTable; static int init(); + static int uninit(); static void reset_table(); static void firsttime_setup(); static void paint(); diff --git a/SpaceCadetPinball/pinball.cpp b/SpaceCadetPinball/pinball.cpp index 2554b0f..92cf9e3 100644 --- a/SpaceCadetPinball/pinball.cpp +++ b/SpaceCadetPinball/pinball.cpp @@ -25,7 +25,7 @@ char* pinball::get_rc_string(int uID, int a2) int pinball::get_rc_int(int uID, int* dst) { - char buffer[50]; + char buffer[255]; int result = LoadStringA(winmain::hinst, uID, buffer, 255); if (!result) return result; @@ -38,7 +38,7 @@ void pinball::FindShiftKeys() { signed int i; // esi int rightShift; // eax - CHAR stringBuf[10]; // [esp+Ch] [ebp-18h] + CHAR stringBuf[20]; // [esp+Ch] [ebp-18h] RightShift = -1; LeftShift = -1; diff --git a/SpaceCadetPinball/resource.h b/SpaceCadetPinball/resource.h index 608d062..8cb7725 100644 --- a/SpaceCadetPinball/resource.h +++ b/SpaceCadetPinball/resource.h @@ -104,10 +104,14 @@ #define IDS_STRING200 99 #define IDS_STRING201 100 #define IDS_STRING202 101 +#define Menu1_New_Game 101 #define IDS_STRING203 102 +#define Menu1_About_Pinball 102 #define IDS_STRING204 103 +#define Menu1_High_Scores 103 #define IDS_STRING205 104 #define IDS_STRING206 105 +#define Menu1_Exit 105 #define IDS_STRING207 106 #define IDS_STRING208 107 #define IDS_STRING209 108 @@ -191,13 +195,27 @@ #define IDS_STRING287 187 #define IDS_STRING288 188 #define IDS_STRING289 189 +#define Menu1_Sounds 201 +#define Menu1_Music 202 +#define Menu1_Help_Topics 301 +#define Menu1_Launch_Ball 401 +#define Menu1_Pause_Resume_Game 402 +#define Menu1_Full_Screen 403 +#define Menu1_Demo 404 +#define Menu1_Select_Table 405 +#define Menu1_Player_Controls 406 +#define Menu1_1Player 408 +#define Menu1_2Players 409 +#define Menu1_3Players 410 +#define Menu1_4Players 411 +#define ID_GAME_D 40003 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 201 -#define _APS_NEXT_COMMAND_VALUE 40002 +#define _APS_NEXT_COMMAND_VALUE 40004 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/SpaceCadetPinball/score.cpp b/SpaceCadetPinball/score.cpp index 5f5a2eb..177f210 100644 --- a/SpaceCadetPinball/score.cpp +++ b/SpaceCadetPinball/score.cpp @@ -54,3 +54,7 @@ HRSRC score::load_msg_font(LPCSTR lpName) { return nullptr; } + +void score::unload_msg_font() +{ +} diff --git a/SpaceCadetPinball/score.h b/SpaceCadetPinball/score.h index 0424d9f..a991324 100644 --- a/SpaceCadetPinball/score.h +++ b/SpaceCadetPinball/score.h @@ -24,7 +24,6 @@ struct scoreStruct struct score_msg_font_type { - }; class score @@ -35,4 +34,5 @@ public: static scoreStruct* create(LPCSTR fieldName, gdrv_bitmap8* renderBgBmp); static scoreStruct* dup(scoreStruct* score, int scoreIndex); static HRSRC load_msg_font(LPCSTR lpName); + static void unload_msg_font(); }; diff --git a/SpaceCadetPinball/timer.cpp b/SpaceCadetPinball/timer.cpp index 636ee58..2280e70 100644 --- a/SpaceCadetPinball/timer.cpp +++ b/SpaceCadetPinball/timer.cpp @@ -2,47 +2,152 @@ #include "timer.h" #include "memory.h" +#include "pb.h" -timer_struct timer::timer_struct; -int timer::setCount; +timer_struct timer::timerStruct{}; +int timer::set_count; int timer::init(int count) { - char* buf; // eax - int index; // edx - int* v4; // ecx - - buf = memory::allocate(20 * count); - timer_struct.buffer1 = buf; + auto buf = (timer_sub_struct*)memory::allocate(sizeof(timer_sub_struct) * count); + timerStruct.TimerMem = buf; if (!buf) return 1; - timer_struct.target = 0; - index = count - 1; - timer_struct.count = count; - setCount = 1; - if (count - 1 > 0) + timerStruct.Count = 0; + timerStruct.MaxCount = count; + set_count = 1; + + for (int index = 0; index < count - 1; index++) + buf[index].NextTimer = &buf[index + 1]; + buf[count - 1].NextTimer = nullptr; + + timerStruct.NextTimer = nullptr; + timerStruct.LastTimer = buf; + return 0; +} + +void timer::uninit() +{ + if (timerStruct.TimerMem) + memory::free(timerStruct.TimerMem); + timerStruct.TimerMem = nullptr; +} + +int timer::kill(int timerId) +{ + timer_sub_struct* next = timerStruct.NextTimer; + int index = 0; + timer_sub_struct* current = nullptr; + if (timerStruct.Count <= 0) + return 0; + while (timerId != next->TimerId) { - v4 = (int*)(buf + 12); - do - { - *v4 = (int)(v4 + 2); - v4 += 5; - --index; - } - while (index); + ++index; + current = next; + next = next->NextTimer; + if (index >= timerStruct.Count) + return 0; } - *(int*)&buf[20 * count - 8] = 0; - timer_struct.target2 = 0; - timer_struct.buffer2 = buf; - return 0; + if (current) + current->NextTimer = next->NextTimer; + else + timerStruct.NextTimer = next->NextTimer; + + --timerStruct.Count; + next->NextTimer = timerStruct.LastTimer; + timerStruct.LastTimer = next; + return timerId; } -int timer::kill(int timer) +int timer::set(float time, void* caller, void (* callback)(int, void*)) { - return 0; + if (timerStruct.Count >= timerStruct.MaxCount) + return 0; + + /*timerStruct.LastTimer->NextTimer = nullptr; + timerStruct.LastTimer = timerStruct.LastTimer->NextTimer;*/ + + auto lastNext = timerStruct.LastTimer->NextTimer; + timerStruct.LastTimer->NextTimer = nullptr; + timerStruct.LastTimer = lastNext; + + auto prev = timerStruct.NextTimer; + auto current = timerStruct.NextTimer; + + auto targetTime = pb::time_ticks + static_cast(time * 1000.0f); + for (int index = 0; index < timerStruct.Count && targetTime >= current->TargetTime; ++index) + { + prev = current; + current = current->NextTimer; + } + + auto last = timerStruct.LastTimer; + if (current != prev) + { + timerStruct.LastTimer->NextTimer = prev->NextTimer; + prev->NextTimer = last; + } + else + { + timerStruct.LastTimer->NextTimer = timerStruct.NextTimer; + timerStruct.NextTimer = last; + } + + last->Caller = caller; + last->Callback = callback; + last->TimerId = set_count; + last->TargetTime = targetTime; + timerStruct.Count++; + + set_count++; + if (set_count <= 0) + set_count = 1; + return last->TimerId; } -int timer::set(float time, int caller, int callback) +int timer::check() { - return 0; + timer_sub_struct curCopy{}; + timer_sub_struct* current = timerStruct.NextTimer; + int index = 0; + if (timerStruct.NextTimer) + { + while (pb::time_ticks >= current->TargetTime) + { + --timerStruct.Count; + memcpy(&curCopy, current, sizeof curCopy); + timer_sub_struct** nextPtr = ¤t->NextTimer; + current = current->NextTimer; + timerStruct.NextTimer = current; + *nextPtr = timerStruct.LastTimer; + timerStruct.LastTimer = current; + if (curCopy.Callback != nullptr) + { + curCopy.Callback(curCopy.TimerId, curCopy.Caller); + current = timerStruct.NextTimer; + } + ++index; + if (index > 1) + break; + if (!current) + return index; + } + while (current && pb::time_ticks >= current->TargetTime + 100) + { + --timerStruct.Count; + memcpy(&curCopy, current, sizeof curCopy); + timer_sub_struct** nextPtr = ¤t->NextTimer; + current = current->NextTimer; + timerStruct.NextTimer = current; + *nextPtr = timerStruct.LastTimer; + timerStruct.LastTimer = current; + if (curCopy.Callback != nullptr) + { + curCopy.Callback(curCopy.TimerId, curCopy.Caller); + current = timerStruct.NextTimer; + } + ++index; + } + } + return index; } diff --git a/SpaceCadetPinball/timer.h b/SpaceCadetPinball/timer.h index 0e427e5..2834896 100644 --- a/SpaceCadetPinball/timer.h +++ b/SpaceCadetPinball/timer.h @@ -1,12 +1,21 @@ #pragma once +struct __declspec(align(4)) timer_sub_struct +{ + int TargetTime; + void* Caller; + void (* Callback)(int, void*); + timer_sub_struct* NextTimer; + int TimerId; +}; + struct __declspec(align(4)) timer_struct { - int target2; - int count; - int target; - char* buffer2; - char* buffer1; + timer_sub_struct* NextTimer; + int MaxCount; + int Count; + timer_sub_struct* LastTimer; + timer_sub_struct* TimerMem; }; @@ -14,10 +23,12 @@ class timer { public: static int init(int count); - static int kill(int timer); - static int set(float time, int caller, int callback); + static void uninit(); + static int kill(int timerId); + static int set(float time, void* caller, void (* callback)(int, void*)); + static int check(); private: - static timer_struct timer_struct; - static int setCount; + static timer_struct timerStruct; + static int set_count; }; diff --git a/SpaceCadetPinball/winmain.cpp b/SpaceCadetPinball/winmain.cpp index d1d046e..ec8631d 100644 --- a/SpaceCadetPinball/winmain.cpp +++ b/SpaceCadetPinball/winmain.cpp @@ -8,6 +8,7 @@ #include "options.h" #include "pb.h" #include "Sound.h" +#include "resource.h" HINSTANCE winmain::hinst = nullptr; HWND winmain::hwnd_frame = nullptr; @@ -68,6 +69,7 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi if (tmpBuf2) { char Buffer[40]; + bool setOption = false; for (int i = 0; i < 32700; ++i) { sprintf_s(Buffer, "Table%d", i); @@ -76,12 +78,15 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi break; options::get_string(tmpBuf, "Table Name", tmpBuf2, pinball::WindowName, 500); if (!lstrcmpA(tmpBuf2, pinball::get_rc_string(169, 0))) - goto LABEL_15; + { + setOption = false; + break; + } if (!*tmpBuf2) break; } - options::set_string(nullptr, Buffer, regSpaceCadet); - LABEL_15: + if (setOption) + options::set_string(nullptr, Buffer, regSpaceCadet); memory::free(tmpBuf2); } memory::free(tmpBuf); @@ -111,7 +116,8 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi 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); + auto windowClass = pinball::get_rc_string(167, 0); + auto windowHandle = FindWindowA(windowClass, nullptr); if (windowHandle) { SendMessageA(windowHandle, iFrostUniqueMsg, 0, 0); @@ -125,8 +131,7 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi picce.dwSize = 8; picce.dwICC = 5885; InitCommonControlsEx(&picce); - - auto windowClass = pinball::get_rc_string(167, 0); + WNDCLASSA WndClass{}; WndClass.style = 4104; WndClass.lpfnWndProc = message_handler; @@ -178,7 +183,7 @@ 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 < 0)// Don't wait for now, was 2000 + while (timeGetTime() >= startTime && timeGetTime() - startTime < 0) // Don't wait for now, was 2000 PeekMessageA(&wndMessage, hwnd_frame, 0, 0, 1u); if (strstr(lpCmdLine, "-demo")) @@ -277,7 +282,7 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi { fillChar = -7; } - gdrv::fill_bitmap(&gfr_display, 1, 10, 299u - someTimeCounter, 0, fillChar); + gdrv::fill_bitmap(&gfr_display, 1, 10, 299 - someTimeCounter, 0, fillChar); } --someTimeCounter; then = now; @@ -286,6 +291,15 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi } } + gdrv::destroy_bitmap(&gfr_display); + options::uninit(); + midi::music_shutdown(); + pb::uninit(); + Sound::Close(); + gdrv::uninit(); + DestroyWindow(hwnd_frame); + options::path_uninit(); + UnregisterClassA(windowClass, hinst); return return_value; } @@ -499,23 +513,18 @@ LRESULT CALLBACK winmain::message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LP no_time_loss = 1; switch (wParam) { - case 0x191u: + case Menu1_Launch_Ball: end_pause(); pb::launch_ball(); break; - case 0x192u: + case Menu1_Pause_Resume_Game: pause(); break; - case 0x193u: - if (!single_step) - pause(); - options::toggle(wParam); - break; - case 0x194u: + case Menu1_Demo: end_pause(); pb::toggle_demo(); break; - case 0x195u: + case Menu1_Select_Table: { if (!single_step) pause(); @@ -548,55 +557,53 @@ LRESULT CALLBACK winmain::message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LP } break; } - case 0x196u: - if (!single_step) - pause(); - options::keyboard(); - break; - case 0x198u: - case 0x199u: - case 0x19Au: - case 0x19Bu: + case Menu1_1Player: + case Menu1_2Players: + case Menu1_3Players: + case Menu1_4Players: options::toggle(wParam); new_game(); break; - case 301: + case Menu1_Help_Topics: if (!single_step) pause(); help_introduction(hinst, hWnd); - return DefWindowProcA(hWnd, Msg, wParam, lParam); - case 0x6A: + break; + case 106: // End game button? pb::end_game(); - return DefWindowProcA(hWnd, Msg, wParam, lParam); - case 201: - case 202: + break; + case Menu1_Full_Screen: + case Menu1_Sounds: + case Menu1_Music: if (!single_step) pause(); options::toggle(wParam); break; - case 204: + case Menu1_Player_Controls: + case 204: // Second controls button? if (!single_step) pause(); options::keyboard(); break; - case 0x69u: - PostMessageA(hWnd, 0x12u, 0, 0); - return DefWindowProcA(hWnd, Msg, wParam, lParam); - case 0x65u: + case Menu1_Exit: + PostMessageA(hWnd, WM_QUIT, 0, 0); + break; + case Menu1_New_Game: new_game(); - return DefWindowProcA(hWnd, Msg, wParam, lParam); - case 0x66u: + break; + case Menu1_About_Pinball: if (!single_step) pause(); a_dialog(hinst, hWnd); - return DefWindowProcA(hWnd, Msg, wParam, lParam); - case 0x67u: + break; + case Menu1_High_Scores: if (!single_step) pause(); pb::high_scores(); - return DefWindowProcA(hWnd, Msg, wParam, lParam); - case 1: + break; + case 1: // Unknown button midi::restart_midi_seq(lParam); + break; default: break; }