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