diff --git a/SpaceCadetPinball/DatParser.cpp b/SpaceCadetPinball/DatParser.cpp
index 6926527..03dfd3a 100644
--- a/SpaceCadetPinball/DatParser.cpp
+++ b/SpaceCadetPinball/DatParser.cpp
@@ -136,6 +136,7 @@ int main2(int argc, const char* argv[])
}
free(fdat);
+ return 0;
}
diff --git a/SpaceCadetPinball/Sound.cpp b/SpaceCadetPinball/Sound.cpp
new file mode 100644
index 0000000..13dfcfe
--- /dev/null
+++ b/SpaceCadetPinball/Sound.cpp
@@ -0,0 +1,6 @@
+#include "pch.h"
+#include "Sound.h"
+
+void Sound::Enable(int a1, int a2, int a3)
+{
+}
diff --git a/SpaceCadetPinball/Sound.h b/SpaceCadetPinball/Sound.h
new file mode 100644
index 0000000..48e5d77
--- /dev/null
+++ b/SpaceCadetPinball/Sound.h
@@ -0,0 +1,6 @@
+#pragma once
+class Sound
+{public:
+ static void Enable(int a1, int a2, int a3);
+};
+
diff --git a/SpaceCadetPinball/SpaceCadetPinball.cpp b/SpaceCadetPinball/SpaceCadetPinball.cpp
index dd7bdf6..2fb6f8d 100644
--- a/SpaceCadetPinball/SpaceCadetPinball.cpp
+++ b/SpaceCadetPinball/SpaceCadetPinball.cpp
@@ -19,7 +19,7 @@ int main()
pinball::hinst = GetModuleHandleA(nullptr);
char cmdLine[1];
- WinMain(pinball::hinst, 0, cmdLine, 0);
+ WinMain(pinball::hinst, 0, cmdLine, 10);
objlist_class d = objlist_class(2, 4);
for (int i = 0; i < 100; i++)
diff --git a/SpaceCadetPinball/SpaceCadetPinball.rc b/SpaceCadetPinball/SpaceCadetPinball.rc
index afeff73..3f6e72c 100644
--- a/SpaceCadetPinball/SpaceCadetPinball.rc
+++ b/SpaceCadetPinball/SpaceCadetPinball.rc
@@ -55,6 +55,49 @@ END
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+MENU_1 MENU
+BEGIN
+ POPUP "&Game"
+ BEGIN
+ MENUITEM "&New Game\tF2", 101
+ MENUITEM "&Launch Ball", 401
+ MENUITEM "&Pause/Resume Game\tF3", 402
+ MENUITEM SEPARATOR
+ MENUITEM "&High Scores...", 103
+ MENUITEM "&Demo", 404
+ MENUITEM "E&xit", 105
+ END
+ POPUP "&Options"
+ BEGIN
+ MENUITEM "&Full Screen\tF4", 403
+ MENUITEM "Select &Table", 405
+ POPUP "Select &Players"
+ BEGIN
+ MENUITEM "&1 Player", 408
+ MENUITEM "&2 Players", 409
+ MENUITEM "&3 Players", 410
+ MENUITEM "&4 Players", 411
+ END
+ MENUITEM SEPARATOR
+ MENUITEM "&Sounds", 201
+ MENUITEM "&Music", 202
+ MENUITEM SEPARATOR
+ MENUITEM "P&layer Controls...\tF8", 406
+ END
+ POPUP "&Help"
+ BEGIN
+ MENUITEM "&Help Topics\tF1", 301
+ MENUITEM SEPARATOR
+ MENUITEM "&About Pinball", 102
+ END
+END
+
+
/////////////////////////////////////////////////////////////////////////////
//
// String Table
@@ -62,195 +105,239 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
STRINGTABLE
BEGIN
- IDS_STRING101 "Replay Awarded"
- IDS_STRING102 "Ball Locked"
- IDS_STRING103 "Center Post\n%ld"
- IDS_STRING104 "Bonus Awarded\n%ld"
- IDS_STRING105 "Bonus Activated"
- IDS_STRING106 "Weapons Upgraded"
- IDS_STRING107 "Engine Upgraded"
- IDS_STRING108 "Bonus up 1 Million"
- IDS_STRING109 "Extra Ball Available\n%ld"
- IDS_STRING110 "Extra Ball"
- IDS_STRING111 "Reflex Shot Award\n%ld"
- IDS_STRING112 "Final Battle Won"
- IDS_STRING113 "Hyperspace Bonus\n%ld"
- IDS_STRING114 "Hyperspace Bonus Available"
- IDS_STRING115 "Jackpot Awarded\n%ld"
- IDS_STRING116 "Jackpot Activated"
- IDS_STRING117 "Multiball"
- IDS_STRING118 "Ramp Bonus Awarded"
- IDS_STRING119 "Light Added"
- IDS_STRING120 "Ramp Bonus On"
- IDS_STRING121 "Light Reset Off"
- IDS_STRING122 "Skill Shot\n%ld"
- IDS_STRING123 "Game Paused\nF3 to Resume"
- IDS_STRING124 "Continue Play"
- IDS_STRING125 "F2 Starts New Game"
- IDS_STRING126 "Careful..."
- IDS_STRING127 "Player 1"
- IDS_STRING128 "Player 2"
- IDS_STRING129 "Player 3"
- IDS_STRING130 "Player 4"
- IDS_STRING131 "Demo\nPlayer 1"
- IDS_STRING132 "Demo\nPlayer 2"
- IDS_STRING133 "Demo\nPlayer 3"
- IDS_STRING134 "Demo\nPlayer 4"
- IDS_STRING135 "Game Over"
- IDS_STRING136 "TILT!"
- IDS_STRING137 "This program requires an 80386 or later CPU."
- IDS_STRING138 "80386 Required"
- IDS_STRING139 "3D Pinball for Windows - Space Cadet"
- IDS_STRING140 "One or more of the player controls is set to the same key,\nfor best performance use unique keys for each control."
- IDS_STRING141 "Clear High Scores?"
- IDS_STRING142 "Confirm"
- IDS_STRING143 "WAVEMIX.INF is missing - it must be in the pinball directory!"
- IDS_STRING144 "Warning:"
- IDS_STRING145 "Ship Re-Fueled"
- IDS_STRING146 "Gravity Well"
- IDS_STRING147 "Time Warp Forward"
- IDS_STRING148 "Time Warp Backward"
- IDS_STRING149 "Maelstrom!"
- IDS_STRING150 "Wormhole"
- IDS_STRING151 "Awaiting Deployment"
- IDS_STRING152 "Flags Upgraded"
- IDS_STRING153 "Bonus Hold"
- IDS_STRING154 "Level One Commendation"
- IDS_STRING155 "Level Two Commendation"
- IDS_STRING156 "Level Three Commendation"
- IDS_STRING157 "Field Multiplier 2x"
- IDS_STRING158 "Field Multiplier 3x"
- IDS_STRING159 "Field Multiplier 5x"
- IDS_STRING160 "Field Multiplier 10x"
- IDS_STRING161 "Target Practice"
- IDS_STRING162 "Launch Training"
- IDS_STRING163 "Re-Entry Training"
- IDS_STRING164 "Science"
- IDS_STRING165 "Stray Comet"
- IDS_STRING166 "Black Hole"
- IDS_STRING167 "Space Radiation"
- IDS_STRING168 "Bug Hunt"
- IDS_STRING169 "Alien Menace"
- IDS_STRING170 "Rescue"
- IDS_STRING171 "Satellite Retrieval"
- IDS_STRING172 "Recon"
- IDS_STRING173 "Doomsday Machine"
- IDS_STRING174 "Cosmic Plague"
- IDS_STRING175 "Secret"
- IDS_STRING176 "Time Warp"
- IDS_STRING177 "Maelstrom"
- IDS_STRING178 "Mission Accepted\n%ld"
- IDS_STRING179 "Mission Completed\n%ld"
- IDS_STRING180 "%s Mission Selected"
- IDS_STRING181 "Black Hole\n%ld"
- IDS_STRING182 "Gravity Normalized\n%ld"
- IDS_STRING183 "Gravity Well\n%ld"
- IDS_STRING184 "Promotion to %s"
- IDS_STRING185 "Cadet"
- IDS_STRING186 "Ensign"
- IDS_STRING187 "Lieutenant"
- IDS_STRING188 "Captain"
- IDS_STRING189 "Lt Commander"
- IDS_STRING190 "Commander"
- IDS_STRING191 "Commodore"
- IDS_STRING192 "Admiral"
- IDS_STRING193 "Fleet Admiral"
- IDS_STRING194 "Wormhole Opened"
- IDS_STRING195 "Crash Bonus\n%ld"
- IDS_STRING196 "Replay Ball"
- IDS_STRING197 "Re-Deploy"
- IDS_STRING198 "Player 1 Shoot Again"
- IDS_STRING199 "Player 2 Shoot Again"
- IDS_STRING200 "Player 3 Shoot Again"
- IDS_STRING201 "Player 4 Shoot Again"
- IDS_STRING202 "This 3D Pinball Table was created for Microsoft by Maxis.\nFor more information call (800)-336-2947\n(US and Canadian customers only).\nCopyright (c) 1995 Maxis."
- IDS_STRING203 "3D Pinball Table created for Microsoft by Maxis. Copyright (c) 1995 Maxis."
- IDS_STRING204 "About 3D Pinball"
- IDS_STRING205 "Hit Mission Targets To Select Mission"
- IDS_STRING206 "Re-Fuel Ship"
- IDS_STRING207 "Launch Ramp To Accept %s Mission"
- IDS_STRING208 "Attack Bumpers Hits\nLeft: %d"
- IDS_STRING209 "Target Training Passed"
- IDS_STRING210 "Mission Aborted"
- IDS_STRING211 "Launches Left: %d"
- IDS_STRING212 "Launch Training Passed"
- IDS_STRING213 "Re-Entries Left: %d"
- IDS_STRING214 "Re-Entry Training Passed"
- IDS_STRING215 "Drop Targets\nLeft: %d"
- IDS_STRING216 "Science Mission Completed"
- IDS_STRING217 "Warning -- Low Fuel"
- IDS_STRING218 "Fill Right Hazard Banks"
- IDS_STRING219 "Hyperspace Launch"
- IDS_STRING220 "Comet Destroyed"
- IDS_STRING221 "Enter Wormhole"
- IDS_STRING222 "Radiation Eliminated"
- IDS_STRING223 "Upgrade Launch Bumpers"
- IDS_STRING224 "Enter Black Hole"
- IDS_STRING225 "Black Hole Eliminated"
- IDS_STRING226 "Targets\nLeft: %d"
- IDS_STRING227 "Xenomorphs Destroyed"
- IDS_STRING228 "Upgrade Flags"
- IDS_STRING229 "Hyperspace Launch"
- IDS_STRING230 "Survivors Rescued"
- IDS_STRING231 "Aliens Repelled"
- IDS_STRING232 "Hit Fuel Targets"
- IDS_STRING233 "Remote Attack Bumper Hits\nLeft: %d"
- IDS_STRING234 "Satellite Repaired"
- IDS_STRING235 "Lane Passes\nLeft: %d"
- IDS_STRING236 "Shoot Ball Up Fuel Chute"
- IDS_STRING237 "Survey Complete"
- IDS_STRING238 "Out Lane Passes\nLeft: %d"
- IDS_STRING239 "Doomsday Machine Destroyed"
- IDS_STRING240 "Roll Flags: %d"
- IDS_STRING241 "Hit Space Warp Rollover"
- IDS_STRING242 "Plague Eliminated"
- IDS_STRING243 "Hit Yellow Wormhole"
- IDS_STRING244 "Hit Red Wormhole"
- IDS_STRING245 "Hit Green Wormhole"
- IDS_STRING246 "Plans Recovered"
- IDS_STRING247 "Rebound Hits\nLeft: %d"
- IDS_STRING248 "Hit Hyperspace Chute or Launch Ramp"
- IDS_STRING249 "Drop Target Hits\nLeft: %d"
- IDS_STRING250 "Spot Target Hits\nLeft: %d"
- IDS_STRING251 "Lanes Passes\nLeft: %d"
- IDS_STRING252 "Shoot Ball Up Fuel Chute"
- IDS_STRING253 "Hit Launch Ramp"
- IDS_STRING254 "Hit Flags"
- IDS_STRING255 "Hit Worm Hole"
- IDS_STRING256 "Hyperspace Chute to end Maelstrom"
- IDS_STRING257 "pinball.mid"
- IDS_STRING258 "1 UseBitmapFont"
- IDS_STRING259 "90 Left Flipper Key"
- IDS_STRING260 "191 Right Flipper Key"
- IDS_STRING261 "32 Plunger Key"
- IDS_STRING262 "88 Bump Left Key"
- IDS_STRING263 "190 Bump Right Key"
- IDS_STRING264 "38 Bump Bottom Key"
- IDS_STRING265 "Software\\Microsoft\\Plus!\\Pinball"
- IDS_STRING266 "SpaceCadet"
- IDS_STRING267 "1c7c22a0-9576-11ce-bf80-444553540000"
- IDS_STRING268 "PINBALL.DAT"
- IDS_STRING269 "Space Cadet"
- IDS_STRING270 "Error:"
- IDS_STRING271 "Unable to find other tables."
- IDS_STRING272 "3D Pinball\nSpace Cadet"
- IDS_STRING273 "Promotion to %s"
- IDS_STRING274 "Demotion to %s"
- IDS_STRING275 "Upgrade Attack Bumpers"
- IDS_STRING276 "Fill Left Hazard Banks"
- IDS_STRING277 "HIGH SCORE"
- IDS_STRING278 "pinball.chm"
- IDS_STRING279 "Not enough memory to run 3D Pinball."
- IDS_STRING280 "Player 1's Score\n%ld"
- IDS_STRING281 "Player 2's Score\n%ld"
- IDS_STRING282 "Player 3's Score\n%ld"
- IDS_STRING283 "Player 4's Score\n%ld"
- IDS_STRING284 "High Score 1\n%ld"
- IDS_STRING285 "High Score 2\n%ld"
- IDS_STRING286 "High Score 3\n%ld"
- IDS_STRING287 "High Score 4\n%ld"
- IDS_STRING288 "High Score 5\n%ld"
- IDS_STRING289 "255 255 255 (R G B default font color)"
+ IDS_STRING101 "Replay Awarded"
+ IDS_STRING102 "Ball Locked"
+ IDS_STRING103 "Center Post\n%ld"
+ IDS_STRING104 "Bonus Awarded\n%ld"
+ IDS_STRING105 "Bonus Activated"
+ IDS_STRING106 "Weapons Upgraded"
+ IDS_STRING107 "Engine Upgraded"
+ IDS_STRING108 "Bonus up 1 Million"
+ IDS_STRING109 "Extra Ball Available\n%ld"
+ IDS_STRING110 "Extra Ball"
+ IDS_STRING111 "Reflex Shot Award\n%ld"
+ IDS_STRING112 "Final Battle Won"
+ IDS_STRING113 "Hyperspace Bonus\n%ld"
+ IDS_STRING114 "Hyperspace Bonus Available"
+ IDS_STRING115 "Jackpot Awarded\n%ld"
+ IDS_STRING116 "Jackpot Activated"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING117 "Multiball"
+ IDS_STRING118 "Ramp Bonus Awarded"
+ IDS_STRING119 "Light Added"
+ IDS_STRING120 "Ramp Bonus On"
+ IDS_STRING121 "Light Reset Off"
+ IDS_STRING122 "Skill Shot\n%ld"
+ IDS_STRING123 "Game Paused\nF3 to Resume"
+ IDS_STRING124 "Continue Play"
+ IDS_STRING125 "F2 Starts New Game"
+ IDS_STRING126 "Careful..."
+ IDS_STRING127 "Player 1"
+ IDS_STRING128 "Player 2"
+ IDS_STRING129 "Player 3"
+ IDS_STRING130 "Player 4"
+ IDS_STRING131 "Demo\nPlayer 1"
+ IDS_STRING132 "Demo\nPlayer 2"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING133 "Demo\nPlayer 3"
+ IDS_STRING134 "Demo\nPlayer 4"
+ IDS_STRING135 "Game Over"
+ IDS_STRING136 "TILT!"
+ IDS_STRING137 "This program requires an 80386 or later CPU."
+ IDS_STRING138 "80386 Required"
+ IDS_STRING139 "3D Pinball for Windows - Space Cadet"
+ IDS_STRING140 "One or more of the player controls is set to the same key,\nfor best performance use unique keys for each control."
+ IDS_STRING141 "Clear High Scores?"
+ IDS_STRING142 "Confirm"
+ IDS_STRING143 "WAVEMIX.INF is missing - it must be in the pinball directory!"
+ IDS_STRING144 "Warning:"
+ IDS_STRING145 "Ship Re-Fueled"
+ IDS_STRING146 "Gravity Well"
+ IDS_STRING147 "Time Warp Forward"
+ IDS_STRING148 "Time Warp Backward"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING149 "Maelstrom!"
+ IDS_STRING150 "Wormhole"
+ IDS_STRING151 "Awaiting Deployment"
+ IDS_STRING152 "Flags Upgraded"
+ IDS_STRING153 "Bonus Hold"
+ IDS_STRING154 "Level One Commendation"
+ IDS_STRING155 "Level Two Commendation"
+ IDS_STRING156 "Level Three Commendation"
+ IDS_STRING157 "Field Multiplier 2x"
+ IDS_STRING158 "Field Multiplier 3x"
+ IDS_STRING159 "Field Multiplier 5x"
+ IDS_STRING160 "Field Multiplier 10x"
+ IDS_STRING161 "Target Practice"
+ IDS_STRING162 "Launch Training"
+ IDS_STRING163 "Re-Entry Training"
+ IDS_STRING164 "Science"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING165 "Stray Comet"
+ IDS_STRING166 "Black Hole"
+ IDS_STRING167 "Space Radiation"
+ IDS_STRING168 "Bug Hunt"
+ IDS_STRING169 "Alien Menace"
+ IDS_STRING170 "Rescue"
+ IDS_STRING171 "Satellite Retrieval"
+ IDS_STRING172 "Recon"
+ IDS_STRING173 "Doomsday Machine"
+ IDS_STRING174 "Cosmic Plague"
+ IDS_STRING175 "Secret"
+ IDS_STRING176 "Time Warp"
+ IDS_STRING177 "Maelstrom"
+ IDS_STRING178 "Mission Accepted\n%ld"
+ IDS_STRING179 "Mission Completed\n%ld"
+ IDS_STRING180 "%s Mission Selected"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING181 "Black Hole\n%ld"
+ IDS_STRING182 "Gravity Normalized\n%ld"
+ IDS_STRING183 "Gravity Well\n%ld"
+ IDS_STRING184 "Promotion to %s"
+ IDS_STRING185 "Cadet"
+ IDS_STRING186 "Ensign"
+ IDS_STRING187 "Lieutenant"
+ IDS_STRING188 "Captain"
+ IDS_STRING189 "Lt Commander"
+ IDS_STRING190 "Commander"
+ IDS_STRING191 "Commodore"
+ IDS_STRING192 "Admiral"
+ IDS_STRING193 "Fleet Admiral"
+ IDS_STRING194 "Wormhole Opened"
+ IDS_STRING195 "Crash Bonus\n%ld"
+ IDS_STRING196 "Replay Ball"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING197 "Re-Deploy"
+ IDS_STRING198 "Player 1 Shoot Again"
+ IDS_STRING199 "Player 2 Shoot Again"
+ IDS_STRING200 "Player 3 Shoot Again"
+ IDS_STRING201 "Player 4 Shoot Again"
+ IDS_STRING202 "This 3D Pinball Table was created for Microsoft by Maxis.\nFor more information call (800)-336-2947\n(US and Canadian customers only).\nCopyright (c) 1995 Maxis."
+ IDS_STRING203 "3D Pinball Table created for Microsoft by Maxis. Copyright (c) 1995 Maxis."
+ IDS_STRING204 "About 3D Pinball"
+ IDS_STRING205 "Hit Mission Targets To Select Mission"
+ IDS_STRING206 "Re-Fuel Ship"
+ IDS_STRING207 "Launch Ramp To Accept %s Mission"
+ IDS_STRING208 "Attack Bumpers Hits\nLeft: %d"
+ IDS_STRING209 "Target Training Passed"
+ IDS_STRING210 "Mission Aborted"
+ IDS_STRING211 "Launches Left: %d"
+ IDS_STRING212 "Launch Training Passed"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING213 "Re-Entries Left: %d"
+ IDS_STRING214 "Re-Entry Training Passed"
+ IDS_STRING215 "Drop Targets\nLeft: %d"
+ IDS_STRING216 "Science Mission Completed"
+ IDS_STRING217 "Warning -- Low Fuel"
+ IDS_STRING218 "Fill Right Hazard Banks"
+ IDS_STRING219 "Hyperspace Launch"
+ IDS_STRING220 "Comet Destroyed"
+ IDS_STRING221 "Enter Wormhole"
+ IDS_STRING222 "Radiation Eliminated"
+ IDS_STRING223 "Upgrade Launch Bumpers"
+ IDS_STRING224 "Enter Black Hole"
+ IDS_STRING225 "Black Hole Eliminated"
+ IDS_STRING226 "Targets\nLeft: %d"
+ IDS_STRING227 "Xenomorphs Destroyed"
+ IDS_STRING228 "Upgrade Flags"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING229 "Hyperspace Launch"
+ IDS_STRING230 "Survivors Rescued"
+ IDS_STRING231 "Aliens Repelled"
+ IDS_STRING232 "Hit Fuel Targets"
+ IDS_STRING233 "Remote Attack Bumper Hits\nLeft: %d"
+ IDS_STRING234 "Satellite Repaired"
+ IDS_STRING235 "Lane Passes\nLeft: %d"
+ IDS_STRING236 "Shoot Ball Up Fuel Chute"
+ IDS_STRING237 "Survey Complete"
+ IDS_STRING238 "Out Lane Passes\nLeft: %d"
+ IDS_STRING239 "Doomsday Machine Destroyed"
+ IDS_STRING240 "Roll Flags: %d"
+ IDS_STRING241 "Hit Space Warp Rollover"
+ IDS_STRING242 "Plague Eliminated"
+ IDS_STRING243 "Hit Yellow Wormhole"
+ IDS_STRING244 "Hit Red Wormhole"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING245 "Hit Green Wormhole"
+ IDS_STRING246 "Plans Recovered"
+ IDS_STRING247 "Rebound Hits\nLeft: %d"
+ IDS_STRING248 "Hit Hyperspace Chute or Launch Ramp"
+ IDS_STRING249 "Drop Target Hits\nLeft: %d"
+ IDS_STRING250 "Spot Target Hits\nLeft: %d"
+ IDS_STRING251 "Lanes Passes\nLeft: %d"
+ IDS_STRING252 "Shoot Ball Up Fuel Chute"
+ IDS_STRING253 "Hit Launch Ramp"
+ IDS_STRING254 "Hit Flags"
+ IDS_STRING255 "Hit Worm Hole"
+ IDS_STRING256 "Hyperspace Chute to end Maelstrom"
+ IDS_STRING257 "pinball.mid"
+ IDS_STRING258 "1 UseBitmapFont"
+ IDS_STRING259 "90 Left Flipper Key"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING260 "191 Right Flipper Key"
+ IDS_STRING261 "32 Plunger Key"
+ IDS_STRING262 "88 Bump Left Key"
+ IDS_STRING263 "190 Bump Right Key"
+ IDS_STRING264 "38 Bump Bottom Key"
+ IDS_STRING265 "Software\\Microsoft\\Plus!\\Pinball"
+ IDS_STRING266 "SpaceCadet"
+ IDS_STRING267 "1c7c22a0-9576-11ce-bf80-444553540000"
+ IDS_STRING268 "PINBALL.DAT"
+ IDS_STRING269 "Space Cadet"
+ IDS_STRING270 "Error:"
+ IDS_STRING271 "Unable to find other tables."
+ IDS_STRING272 "3D Pinball\nSpace Cadet"
+ IDS_STRING273 "Promotion to %s"
+ IDS_STRING274 "Demotion to %s"
+ IDS_STRING275 "Upgrade Attack Bumpers"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_STRING276 "Fill Left Hazard Banks"
+ IDS_STRING277 "HIGH SCORE"
+ IDS_STRING278 "pinball.chm"
+ IDS_STRING279 "Not enough memory to run 3D Pinball."
+ IDS_STRING280 "Player 1's Score\n%ld"
+ IDS_STRING281 "Player 2's Score\n%ld"
+ IDS_STRING282 "Player 3's Score\n%ld"
+ IDS_STRING283 "Player 4's Score\n%ld"
+ IDS_STRING284 "High Score 1\n%ld"
+ IDS_STRING285 "High Score 2\n%ld"
+ IDS_STRING286 "High Score 3\n%ld"
+ IDS_STRING287 "High Score 4\n%ld"
+ IDS_STRING288 "High Score 5\n%ld"
+ IDS_STRING289 "255 255 255 (R G B default font color)"
END
#endif // English (United States) resources
diff --git a/SpaceCadetPinball/SpaceCadetPinball.vcxproj b/SpaceCadetPinball/SpaceCadetPinball.vcxproj
index 6656756..e6b0724 100644
--- a/SpaceCadetPinball/SpaceCadetPinball.vcxproj
+++ b/SpaceCadetPinball/SpaceCadetPinball.vcxproj
@@ -96,7 +96,7 @@
Console
true
- Comctl32.lib;%(AdditionalDependencies)
+ Comctl32.lib;Winmm.lib;%(AdditionalDependencies)
@@ -154,15 +154,19 @@
+
+
+
+
@@ -198,11 +202,13 @@
+
+
Create
Create
@@ -210,7 +216,9 @@
Create
+
+
diff --git a/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters b/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters
index bee9900..26cc806 100644
--- a/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters
+++ b/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters
@@ -147,6 +147,18 @@
Header Files
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
@@ -272,6 +284,18 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
diff --git a/SpaceCadetPinball/TPinballTable.h b/SpaceCadetPinball/TPinballTable.h
index 6e82dad..0c3a498 100644
--- a/SpaceCadetPinball/TPinballTable.h
+++ b/SpaceCadetPinball/TPinballTable.h
@@ -7,14 +7,14 @@
#include "TPinballComponent.h"
#include "TPlunger.h"
-class TPinballTable:TPinballComponent
+class TPinballTable : public TPinballComponent
{
public:
TPinballTable();
~TPinballTable();
TPinballComponent* find_component(LPCSTR componentName);
TPinballComponent* find_component(int groupIndex);
-
+
TFlipper* FlipperL;
TFlipper* FlipperR;
scoreStruct* Score1;
@@ -97,4 +97,3 @@ public:
int UnknownP82;
int UnknownP83;
};
-
diff --git a/SpaceCadetPinball/fullscrn.cpp b/SpaceCadetPinball/fullscrn.cpp
new file mode 100644
index 0000000..8eeeeb3
--- /dev/null
+++ b/SpaceCadetPinball/fullscrn.cpp
@@ -0,0 +1,159 @@
+#include "pch.h"
+#include "fullscrn.h"
+
+
+int fullscrn::screen_mode;
+HWND fullscrn::hWnd;
+tagRECT fullscrn::PubRect1;
+int fullscrn::fullscrn_flag1;
+int fullscrn::display_changed;
+int fullscrn::ChangeDisplay, fullscrn::SmthFullScrnFlag2;
+int fullscrn::trick;
+int fullscrn::MenuEnabled;
+HMENU fullscrn::MenuHandle;
+int fullscrn::xDest, fullscrn::yDest;
+
+int fullscrn::set_screen_mode(int isFullscreen)
+{
+ int result = isFullscreen;
+ if (isFullscreen == screen_mode)
+ return result;
+ screen_mode = isFullscreen;
+ if (isFullscreen)
+ {
+ if (IsWindowVisible(hWnd))
+ GetWindowRect(hWnd, &PubRect1);
+ enableFullscreen();
+ BYTE1(fullscrn_flag1) |= 0x80u;
+ InvalidateRect(hWnd, nullptr, 1);
+ set_menu_mode(0);
+ result = disableWindowFlagsDisDlg();
+ }
+ else
+ {
+ disableFullscreen();
+ BYTE1(fullscrn_flag1) |= 0x80u;
+ InvalidateRect(hWnd, nullptr, 1);
+ set_menu_mode(1);
+ result = RedrawWindow(nullptr, nullptr, nullptr, 0x185u);
+ }
+ return result;
+}
+
+
+int fullscrn::disableWindowFlagsDisDlg()
+{
+ long style = GetWindowLongA(hWnd, -16);
+ return SetWindowLongA(hWnd, -16, style & 0xFF3FFFFF);
+}
+
+int fullscrn::setWindowFlagsDisDlg()
+{
+ int style = GetWindowLongA(hWnd, -16);
+ return SetWindowLongA(hWnd, -16, style | 0xC00000);
+}
+
+int fullscrn::enableFullscreen()
+{
+ tagRECT Rect{}; // [esp+Ch] [ebp-B0h]
+ DEVMODEA DevMode{}; // [esp+1Ch] [ebp-A0h]
+
+ if (ChangeDisplay && !display_changed)
+ {
+ DevMode.dmSize = 156;
+ DevMode.dmFields = 1835008;
+ DevMode.dmPelsWidth = 640;
+ DevMode.dmPelsHeight = 480;
+ DevMode.dmBitsPerPel = 8;
+ disableWindowFlagsDisDlg();
+ if (trick)
+ {
+ GetWindowRect(GetDesktopWindow(), &Rect);
+ SetWindowPos(hWnd, (HWND)((int)HWND_MESSAGE | 0x2), 0, 0, Rect.right - Rect.left + 1,
+ Rect.bottom - Rect.top + 1, 8u);
+ }
+ SmthFullScrnFlag2 = 1;
+ LONG changeDispResult = ChangeDisplaySettingsA(&DevMode, 4u);
+ if (changeDispResult == 1)
+ {
+ BYTE2(DevMode.dmFields) &= 0xFBu;
+ SmthFullScrnFlag2 = 1;
+ changeDispResult = ChangeDisplaySettingsA(&DevMode, 4u);
+ }
+ display_changed = changeDispResult == 0;
+ if (changeDispResult == 0)
+ return 1;
+ }
+ GetWindowRect(GetDesktopWindow(), &Rect);
+ disableWindowFlagsDisDlg();
+ SetWindowPos(hWnd, (HWND)0xFFFFFFFE, 0, 0, Rect.right - Rect.left + 1, Rect.bottom - Rect.top + 1, 8u);
+ return 0;
+}
+
+int fullscrn::disableFullscreen()
+{
+ if (display_changed)
+ {
+ display_changed = 0;
+ SmthFullScrnFlag2 = 1;
+ ChangeDisplaySettingsA(nullptr, 4u);
+ if (trick)
+ SetWindowPos(hWnd, (HWND)0xFFFFFFFE, 0, 0, 0, 0, 0x13u);
+ }
+ setWindowFlagsDisDlg();
+ SetWindowPos(
+ hWnd,
+ nullptr,
+ PubRect1.left,
+ PubRect1.top,
+ PubRect1.right - PubRect1.left,
+ PubRect1.bottom - PubRect1.top,
+ 0x14u);
+ return 0;
+}
+
+bool fullscrn::set_menu_mode(int menuEnabled)
+{
+ BOOL result; // eax
+
+ MenuEnabled = menuEnabled;
+ GetWindowCenter();
+ if (MenuEnabled)
+ {
+ fullscrn_flag1 |= 2u;
+ InvalidateRect(hWnd, nullptr, 1);
+ result = SetMenu(hWnd, MenuHandle);
+ }
+ else
+ {
+ fullscrn_flag1 |= 1u;
+ InvalidateRect(hWnd, nullptr, 1);
+ result = SetMenu(hWnd, nullptr);
+ }
+ return result;
+}
+
+void fullscrn::GetWindowCenter()
+{
+ int yDestLoc; // eax
+ HWND v1; // eax
+ struct tagRECT Rect; // [esp+4h] [ebp-10h]
+
+ int dword_1025094 = 0, dword_1025098 = 0; // tmp, from render
+
+ if (screen_mode)
+ {
+ v1 = GetDesktopWindow();
+ GetWindowRect(v1, &Rect);
+ xDest = (Rect.right - dword_1025094 - Rect.left) / 2;
+ yDestLoc = (Rect.bottom - dword_1025098 - Rect.top) / 2;
+ }
+ else
+ {
+ xDest = 0;
+ yDestLoc = GetSystemMetrics(15);
+ }
+ yDest = yDestLoc;
+ if (MenuEnabled)
+ yDest -= GetSystemMetrics(15);
+}
diff --git a/SpaceCadetPinball/fullscrn.h b/SpaceCadetPinball/fullscrn.h
new file mode 100644
index 0000000..c245397
--- /dev/null
+++ b/SpaceCadetPinball/fullscrn.h
@@ -0,0 +1,31 @@
+#pragma once
+
+#define BYTEn(x, n) (*((unsigned char*)&(x)+n))
+#define BYTE1(x) BYTEn(x, 1) // byte 1 (counting from 0)
+#define BYTE2(x) BYTEn(x, 2)
+
+class fullscrn
+{
+public:
+
+ static int screen_mode;
+ static HWND hWnd;
+ static tagRECT PubRect1;
+ static int fullscrn_flag1;
+ static int display_changed;
+ static int ChangeDisplay, SmthFullScrnFlag2;
+ static int trick;
+
+ static int set_screen_mode(int isFullscreen);
+private :
+ static int MenuEnabled;
+ static HMENU MenuHandle;
+ static int xDest, yDest;
+
+ static void GetWindowCenter();
+ static int disableWindowFlagsDisDlg();
+ static int setWindowFlagsDisDlg();
+ static int enableFullscreen();
+ static int disableFullscreen();
+ static bool set_menu_mode(int menuEnabled);
+};
diff --git a/SpaceCadetPinball/options.cpp b/SpaceCadetPinball/options.cpp
index e39ef0a..1313bd6 100644
--- a/SpaceCadetPinball/options.cpp
+++ b/SpaceCadetPinball/options.cpp
@@ -1,9 +1,76 @@
#include "pch.h"
#include "options.h"
#include "memory.h"
+#include "pinball.h"
+#include "Sound.h"
LPCSTR options::OptionsRegPath;
LPSTR options::OptionsRegPathCur;
+HMENU options::MenuHandle;
+optionsStruct options::Options;
+
+void options::init(HMENU menuHandle)
+{
+ MenuHandle = menuHandle;
+ Options.Sounds = 1;
+ Options.Music = 0;
+ Options.FullScreen = 0;
+ Options.Average = 5;
+ Options.PriorityAdj = 2;
+ Options.LeftFlipperKey2 = 90;
+ Options.RightFlipperKey2 = 191;
+ Options.PlungerKey2 = 32;
+ Options.LeftTableBumpKey2 = 88;
+ Options.RightTableBumpKey2 = 190;
+ Options.BottomTableBumpKey2 = 38;
+ pinball::get_rc_int(159, &Options.LeftFlipperKey2);
+ pinball::get_rc_int(160, &Options.RightFlipperKey2);
+ pinball::get_rc_int(161, &Options.PlungerKey2);
+ pinball::get_rc_int(162, &Options.LeftTableBumpKey2);
+ pinball::get_rc_int(163, &Options.RightTableBumpKey2);
+ pinball::get_rc_int(164, &Options.BottomTableBumpKey2);
+ Options.LeftFlipperKey = Options.LeftFlipperKey2;
+ Options.RightFlipperKey = Options.RightFlipperKey2;
+ Options.PlungerKey = Options.PlungerKey2;
+ Options.LeftTableBumpKey = Options.LeftTableBumpKey2;
+ Options.RightTableBumpKey = Options.RightTableBumpKey2;
+ Options.Players = 1;
+ Options.BottomTableBumpKey = Options.BottomTableBumpKey2;
+ Options.Sounds = get_int(nullptr, "Sounds", Options.Sounds);
+ Options.Music = get_int(nullptr, "Music", Options.Music);
+ Options.Average = get_int(nullptr, "Average", Options.Average);
+ Options.FullScreen = get_int(nullptr, "FullScreen", Options.FullScreen);
+ Options.PriorityAdj = get_int(nullptr, "Priority_Adjustment", Options.PriorityAdj);
+ Options.Players = get_int(nullptr, "Players", Options.Players);
+ Options.LeftFlipperKey = get_int(nullptr, "Left Flippper key", Options.LeftFlipperKey);
+ Options.RightFlipperKey = get_int(nullptr, "Right Flipper key", Options.RightFlipperKey);
+ Options.PlungerKey = get_int(nullptr, "Plunger key", Options.PlungerKey);
+ Options.LeftTableBumpKey = get_int(nullptr, "Left Table Bump key", Options.LeftTableBumpKey);
+ Options.RightTableBumpKey = get_int(nullptr, "Right Table Bump key", Options.RightTableBumpKey);
+ Options.BottomTableBumpKey = get_int(nullptr, "Bottom Table Bump key", Options.BottomTableBumpKey);
+ menu_check(0xC9u, Options.Sounds);
+ Sound::Enable(0, 7, Options.Sounds);
+ menu_check(0xCAu, Options.Music);
+ menu_check(0x193u, Options.FullScreen);
+ menu_check(0x198u, Options.Players == 1);
+ menu_check(0x199u, Options.Players == 2);
+ menu_check(0x19Au, Options.Players == 3);
+ menu_check(0x19Bu, Options.Players == 4);
+ auto tmpBuf = memory::allocate(0x1F4u);
+ if (tmpBuf)
+ {
+ get_string(nullptr, "Shell Exe", tmpBuf, pinball::WindowName, 500);
+ if (!*tmpBuf)
+ {
+ if (MenuHandle)
+ {
+ DeleteMenu(MenuHandle, 0x195u, 0);
+ DrawMenuBar(pinball::hwnd_frame);
+ }
+ }
+ memory::free(tmpBuf);
+ }
+}
void options::path_init(LPCSTR regPath)
{
@@ -116,3 +183,12 @@ void options::set_string(LPCSTR optPath, LPCSTR lpValueName, LPCSTR value)
path_free();
}
}
+
+
+HMENU options::menu_check(UINT uIDCheckItem, int value)
+{
+ HMENU result = MenuHandle;
+ if (MenuHandle)
+ result = (HMENU)CheckMenuItem(MenuHandle, uIDCheckItem, value != 0 ? 8 : 0);
+ return result;
+}
diff --git a/SpaceCadetPinball/options.h b/SpaceCadetPinball/options.h
index f4b3375..e9b9d80 100644
--- a/SpaceCadetPinball/options.h
+++ b/SpaceCadetPinball/options.h
@@ -1,16 +1,45 @@
#pragma once
+
+struct __declspec(align(4)) optionsStruct
+{
+ int Sounds;
+ int Music;
+ int Average;
+ int FullScreen;
+ int PriorityAdj;
+ int Players;
+ int LeftFlipperKey;
+ int RightFlipperKey;
+ int PlungerKey;
+ int LeftTableBumpKey;
+ int RightTableBumpKey;
+ int BottomTableBumpKey;
+ int LeftFlipperKey2;
+ int RightFlipperKey2;
+ int PlungerKey2;
+ int LeftTableBumpKey2;
+ int RightTableBumpKey2;
+ int BottomTableBumpKey2;
+};
+
+
class options
{
public:
+ static void init(HMENU menuHandle);
static void path_init(LPCSTR regPath);
static void path_uninit();
static int get_int(LPCSTR optPath, LPCSTR lpValueName, int defaultValue);
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 optionsStruct Options;
private:
static LPCSTR OptionsRegPath;
static LPSTR OptionsRegPathCur;
static LPCSTR path(LPCSTR regPath);
static void path_free();
+ static HMENU MenuHandle;
};
diff --git a/SpaceCadetPinball/pb.cpp b/SpaceCadetPinball/pb.cpp
new file mode 100644
index 0000000..0973f0e
--- /dev/null
+++ b/SpaceCadetPinball/pb.cpp
@@ -0,0 +1,19 @@
+#include "pch.h"
+#include "pb.h"
+#include "render.h"
+
+TPinballTable* pb::MainTable = nullptr;
+
+void pb::reset_table()
+{
+ if (MainTable)
+ MainTable->Message(1024, 0.0);
+}
+
+
+void pb::firsttime_setup()
+{
+ render::blit = 0;
+ render::update();
+ render::blit = 1;
+}
diff --git a/SpaceCadetPinball/pb.h b/SpaceCadetPinball/pb.h
new file mode 100644
index 0000000..50b599c
--- /dev/null
+++ b/SpaceCadetPinball/pb.h
@@ -0,0 +1,12 @@
+#pragma once
+#include "TPinballTable.h"
+
+class pb
+{
+public:
+ static void reset_table();
+ static void firsttime_setup();
+private:
+ static TPinballTable* MainTable;
+};
+
diff --git a/SpaceCadetPinball/pinball.cpp b/SpaceCadetPinball/pinball.cpp
index a0ca96a..edd7b39 100644
--- a/SpaceCadetPinball/pinball.cpp
+++ b/SpaceCadetPinball/pinball.cpp
@@ -12,6 +12,11 @@ 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;
+int pinball::has_focus = 1;
+int pinball::single_step = 0;
char* pinball::get_rc_string(int uID, int a2)
@@ -23,3 +28,82 @@ char* pinball::get_rc_string(int uID, int a2)
rc_string_slot = 0;
return result;
}
+
+int pinball::get_rc_int(int uID, int* dst)
+{
+ char buffer[50];
+ int result = LoadStringA(pinball::hinst, uID, buffer, 255);
+ if (!result)
+ return result;
+ *dst = atoi(buffer);
+ return 1;
+}
+
+
+void pinball::FindShiftKeys()
+{
+ signed int i; // esi
+ int rightShift; // eax
+ CHAR stringBuf[10]; // [esp+Ch] [ebp-18h]
+
+ RightShift = -1;
+ LeftShift = -1;
+ for (i = 0; i < 256; ++i)
+ {
+ if (MapVirtualKeyA(i, 1u) == 16)
+ {
+ LeftShift = i;
+ break;
+ }
+ }
+ while (++i < 256)
+ {
+ if (MapVirtualKeyA(i, 1u) == 16)
+ {
+ RightShift = i;
+ break;
+ }
+ }
+ if (!GetKeyNameTextA(LeftShift << 16, stringBuf, 19) || !_strnicmp(stringBuf, "right", 5u))
+ {
+ rightShift = RightShift;
+ }
+ else
+ {
+ rightShift = LeftShift;
+ LeftShift = RightShift;
+ RightShift = rightShift;
+ }
+ if (GetKeyNameTextA(rightShift << 16, stringBuf, 19))
+ {
+ if (_strnicmp(stringBuf, "left", 4u) != 0)
+ {
+ auto tmp = LeftShift;
+ LeftShift = RightShift;
+ RightShift = tmp;
+ }
+ }
+}
+
+
+HANDLE pinball::adjust_priority(int priority)
+{
+ HANDLE result = GetCurrentThread();
+ switch (priority)
+ {
+ case -2:
+ return (HANDLE)SetThreadPriority(result, -2);
+ case -1:
+ return (HANDLE)SetThreadPriority(result, -1);
+ case 0:
+ return (HANDLE)SetThreadPriority(result, 0);
+ case 1:
+ return (HANDLE)SetThreadPriority(result, 1);
+ case 2:
+ return (HANDLE)SetThreadPriority(result, 2);
+ case 3:
+ result = (HANDLE)SetThreadPriority(result, 15);
+ break;
+ }
+ return result;
+}
diff --git a/SpaceCadetPinball/pinball.h b/SpaceCadetPinball/pinball.h
index cc90660..f9571c2 100644
--- a/SpaceCadetPinball/pinball.h
+++ b/SpaceCadetPinball/pinball.h
@@ -11,7 +11,16 @@ public:
static HINSTANCE hinst;
static char WindowName[2];
static char DatFileName[300];
+ static int RightShift;
+ static int LeftShift;
+ static HWND hwnd_frame;
+ static int has_focus;
+ static int single_step;
+
static char* get_rc_string(int uID, int a2);
+ static int get_rc_int(int uID, int* dst);
+ static void FindShiftKeys();
+ static HANDLE adjust_priority(int priority);
private:
static char getRcBuffer[256 * 6];
static int rc_string_slot;
diff --git a/SpaceCadetPinball/render.cpp b/SpaceCadetPinball/render.cpp
new file mode 100644
index 0000000..228cdc5
--- /dev/null
+++ b/SpaceCadetPinball/render.cpp
@@ -0,0 +1,8 @@
+#include "pch.h"
+#include "render.h"
+
+int render::blit = 0;
+
+void render::update()
+{
+}
diff --git a/SpaceCadetPinball/render.h b/SpaceCadetPinball/render.h
new file mode 100644
index 0000000..13ff8a5
--- /dev/null
+++ b/SpaceCadetPinball/render.h
@@ -0,0 +1,8 @@
+#pragma once
+class render
+{
+public:
+ static int blit;
+ static void update();
+};
+
diff --git a/SpaceCadetPinball/resource.h b/SpaceCadetPinball/resource.h
index bd549db..608d062 100644
--- a/SpaceCadetPinball/resource.h
+++ b/SpaceCadetPinball/resource.h
@@ -2,106 +2,106 @@
// Microsoft Visual C++ generated include file.
// Used by SpaceCadetPinball.rc
//
-#define IDS_STRING101 0
-#define IDS_STRING102 1
-#define IDS_STRING103 2
-#define IDS_STRING104 3
-#define IDS_STRING105 4
-#define IDS_STRING106 5
-#define IDS_STRING107 6
-#define IDS_STRING108 7
-#define IDS_STRING109 8
-#define IDS_STRING110 9
-#define IDS_STRING111 10
-#define IDS_STRING112 11
-#define IDS_STRING113 12
-#define IDS_STRING114 13
-#define IDS_STRING115 14
-#define IDS_STRING116 15
-#define IDS_STRING117 16
-#define IDS_STRING118 17
-#define IDS_STRING119 18
-#define IDS_STRING120 19
-#define IDS_STRING121 20
-#define IDS_STRING122 21
-#define IDS_STRING123 22
-#define IDS_STRING124 23
-#define IDS_STRING125 24
-#define IDS_STRING126 25
-#define IDS_STRING127 26
-#define IDS_STRING128 27
-#define IDS_STRING129 28
-#define IDS_STRING130 29
-#define IDS_STRING131 30
-#define IDS_STRING132 31
-#define IDS_STRING133 32
-#define IDS_STRING134 33
-#define IDS_STRING135 34
-#define IDS_STRING136 35
-#define IDS_STRING137 36
-#define IDS_STRING138 37
-#define IDS_STRING139 38
-#define IDS_STRING140 39
-#define IDS_STRING141 40
-#define IDS_STRING142 41
-#define IDS_STRING143 42
-#define IDS_STRING144 43
-#define IDS_STRING145 44
-#define IDS_STRING146 45
-#define IDS_STRING147 46
-#define IDS_STRING148 47
-#define IDS_STRING149 48
-#define IDS_STRING150 49
-#define IDS_STRING151 50
-#define IDS_STRING152 51
-#define IDS_STRING153 52
-#define IDS_STRING154 53
-#define IDS_STRING155 54
-#define IDS_STRING156 55
-#define IDS_STRING157 56
-#define IDS_STRING158 57
-#define IDS_STRING159 58
-#define IDS_STRING160 59
-#define IDS_STRING161 60
-#define IDS_STRING162 61
-#define IDS_STRING163 62
-#define IDS_STRING164 63
-#define IDS_STRING165 64
-#define IDS_STRING166 65
-#define IDS_STRING167 66
-#define IDS_STRING168 67
-#define IDS_STRING169 68
-#define IDS_STRING170 69
-#define IDS_STRING171 70
-#define IDS_STRING172 71
-#define IDS_STRING173 72
-#define IDS_STRING174 73
-#define IDS_STRING175 74
-#define IDS_STRING176 75
-#define IDS_STRING177 76
-#define IDS_STRING178 77
-#define IDS_STRING179 78
-#define IDS_STRING180 79
-#define IDS_STRING181 80
-#define IDS_STRING182 81
-#define IDS_STRING183 82
-#define IDS_STRING184 83
-#define IDS_STRING185 84
-#define IDS_STRING186 85
-#define IDS_STRING187 86
-#define IDS_STRING188 87
-#define IDS_STRING189 88
-#define IDS_STRING190 89
-#define IDS_STRING191 90
-#define IDS_STRING192 91
-#define IDS_STRING193 92
-#define IDS_STRING194 93
-#define IDS_STRING195 94
-#define IDS_STRING196 95
-#define IDS_STRING197 96
-#define IDS_STRING198 97
-#define IDS_STRING199 98
-#define IDS_STRING200 99
+#define IDS_STRING101 0
+#define IDS_STRING102 1
+#define IDS_STRING103 2
+#define IDS_STRING104 3
+#define IDS_STRING105 4
+#define IDS_STRING106 5
+#define IDS_STRING107 6
+#define IDS_STRING108 7
+#define IDS_STRING109 8
+#define IDS_STRING110 9
+#define IDS_STRING111 10
+#define IDS_STRING112 11
+#define IDS_STRING113 12
+#define IDS_STRING114 13
+#define IDS_STRING115 14
+#define IDS_STRING116 15
+#define IDS_STRING117 16
+#define IDS_STRING118 17
+#define IDS_STRING119 18
+#define IDS_STRING120 19
+#define IDS_STRING121 20
+#define IDS_STRING122 21
+#define IDS_STRING123 22
+#define IDS_STRING124 23
+#define IDS_STRING125 24
+#define IDS_STRING126 25
+#define IDS_STRING127 26
+#define IDS_STRING128 27
+#define IDS_STRING129 28
+#define IDS_STRING130 29
+#define IDS_STRING131 30
+#define IDS_STRING132 31
+#define IDS_STRING133 32
+#define IDS_STRING134 33
+#define IDS_STRING135 34
+#define IDS_STRING136 35
+#define IDS_STRING137 36
+#define IDS_STRING138 37
+#define IDS_STRING139 38
+#define IDS_STRING140 39
+#define IDS_STRING141 40
+#define IDS_STRING142 41
+#define IDS_STRING143 42
+#define IDS_STRING144 43
+#define IDS_STRING145 44
+#define IDS_STRING146 45
+#define IDS_STRING147 46
+#define IDS_STRING148 47
+#define IDS_STRING149 48
+#define IDS_STRING150 49
+#define IDS_STRING151 50
+#define IDS_STRING152 51
+#define IDS_STRING153 52
+#define IDS_STRING154 53
+#define IDS_STRING155 54
+#define IDS_STRING156 55
+#define IDS_STRING157 56
+#define IDS_STRING158 57
+#define IDS_STRING159 58
+#define IDS_STRING160 59
+#define IDS_STRING161 60
+#define IDS_STRING162 61
+#define IDS_STRING163 62
+#define IDS_STRING164 63
+#define IDS_STRING165 64
+#define IDS_STRING166 65
+#define IDS_STRING167 66
+#define IDS_STRING168 67
+#define IDS_STRING169 68
+#define IDS_STRING170 69
+#define IDS_STRING171 70
+#define IDS_STRING172 71
+#define IDS_STRING173 72
+#define IDS_STRING174 73
+#define IDS_STRING175 74
+#define IDS_STRING176 75
+#define IDS_STRING177 76
+#define IDS_STRING178 77
+#define IDS_STRING179 78
+#define IDS_STRING180 79
+#define IDS_STRING181 80
+#define IDS_STRING182 81
+#define IDS_STRING183 82
+#define IDS_STRING184 83
+#define IDS_STRING185 84
+#define IDS_STRING186 85
+#define IDS_STRING187 86
+#define IDS_STRING188 87
+#define IDS_STRING189 88
+#define IDS_STRING190 89
+#define IDS_STRING191 90
+#define IDS_STRING192 91
+#define IDS_STRING193 92
+#define IDS_STRING194 93
+#define IDS_STRING195 94
+#define IDS_STRING196 95
+#define IDS_STRING197 96
+#define IDS_STRING198 97
+#define IDS_STRING199 98
+#define IDS_STRING200 99
#define IDS_STRING201 100
#define IDS_STRING202 101
#define IDS_STRING203 102
@@ -192,13 +192,12 @@
#define IDS_STRING288 188
#define IDS_STRING289 189
-
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 102
-#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_RESOURCE_VALUE 201
+#define _APS_NEXT_COMMAND_VALUE 40002
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
diff --git a/SpaceCadetPinball/winmain.cpp b/SpaceCadetPinball/winmain.cpp
index 1ddd108..3eb2231 100644
--- a/SpaceCadetPinball/winmain.cpp
+++ b/SpaceCadetPinball/winmain.cpp
@@ -1,17 +1,13 @@
#include "pch.h"
#include "winmain.h"
+
+#include "fullscrn.h"
#include "memory.h"
#include "pinball.h"
#include "options.h"
+#include "pb.h"
-int iFrostUniqueMsg;
-
-//HWND, UINT, WPARAM, LPARAM
-//typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
-LRESULT CALLBACK message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM LPARAM)
-{
- return 0;
-}
+int iFrostUniqueMsg, return_value = 0, bQuit = 0;
int check_expiration_date()
{
@@ -86,12 +82,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
}
--memory::critical_allocation;
- pinball::quickFlag = strstr(lpCmdLine, "-quick") != 0;
+ pinball::quickFlag = strstr(lpCmdLine, "-quick") != nullptr;
pinball::hinst = hInstance;
options::get_string(regSpaceCadet, "Pinball Data", pinball::DatFileName, pinball::get_rc_string(168, 0), 300);
iFrostUniqueMsg = RegisterWindowMessageA("PinballThemeSwitcherUniqueMsgString");
- auto windowHandle= FindWindowA(pinball::get_rc_string(167, 0), nullptr);
+ auto windowHandle = FindWindowA(pinball::get_rc_string(167, 0), nullptr);
if (windowHandle)
{
SendMessageA(windowHandle, iFrostUniqueMsg, 0, 0);
@@ -106,19 +102,104 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
picce.dwICC = 5885;
InitCommonControlsEx(&picce);
- WNDCLASSA WndClass;
+ auto windowClass = pinball::get_rc_string(167, 0);
+ WNDCLASSA WndClass{};
WndClass.style = 4104;
WndClass.lpfnWndProc = message_handler;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIconA(hInstance, "ICON_1");
- WndClass.hCursor = LoadCursorA(0, (LPCSTR)0x7F00);
+ WndClass.hCursor = LoadCursorA(nullptr, (LPCSTR)0x7F00);
WndClass.hbrBackground = (HBRUSH)16;
WndClass.lpszMenuName = "MENU_1";
- WndClass.lpszClassName = pinball::get_rc_string(167, 0);
- //auto tmpBuf = splash_screen((int)hInstance, "splash_bitmap", "splash_bitmap");
+ WndClass.lpszClassName = windowClass;
+ //auto tmpBuf = splash_screen((int)hInstance, "splash_bitmap", "splash_bitmap"); // No splash for now
RegisterClassA(&WndClass);
+
+ pinball::FindShiftKeys();
+
+ char windowName[40];
+ lstrcpyA(windowName, pinball::get_rc_string(38, 0));
+ windowHandle = CreateWindowExA(0, windowClass, windowName, 0x3CA0000u, 0, 0, 640, 480, nullptr, nullptr, hInstance,
+ nullptr);
+ pinball::hwnd_frame = windowHandle;
+ if (!windowHandle)
+ {
+ PostQuitMessage(0);
+ return 0;
+ }
+
+ auto menuHandle = GetMenu(windowHandle);
+ options::init(menuHandle);
+ pb::reset_table();
+ pb::firsttime_setup();
+
+ if (strstr(lpCmdLine, "-fullscreen"))
+ {
+ options::Options.FullScreen = 1;
+ options::menu_check(0x193u, 1);
+ }
+
+ ShowWindow(pinball::hwnd_frame, nShowCmd);
+ fullscrn::set_screen_mode(options::Options.FullScreen);
+ UpdateWindow(pinball::hwnd_frame);
+
+ /*if (tmpBuf) //Close splash
+ {
+ splash_hide(tmpBuf);
+ splash_destroy(tmpBuf);
+ }*/
+
+ pinball::adjust_priority(options::Options.PriorityAdj);
+ auto getTimeFunc = timeGetTime;
+ const auto startTime = timeGetTime();
+ MSG wndMessage{};
+ while (timeGetTime() >= startTime && timeGetTime() - startTime < 2000)
+ PeekMessageA(&wndMessage, pinball::hwnd_frame, 0, 0, 1u);
+
+ while (true)
+ {
+ if (!ProcessWindowMessages() || bQuit)
+ break;
+ Sleep(8);
+ }
+
+ return return_value;
+}
+
+LRESULT CALLBACK message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ return DefWindowProcA(hWnd, Msg, wParam, lParam);
+}
+
+int ProcessWindowMessages()
+{
+ MSG Msg{}; // [esp+8h] [ebp-1Ch]
+
+ if (pinball::has_focus && !pinball::single_step)
+ {
+ while (PeekMessageA(&Msg, nullptr, 0, 0, 1u))
+ {
+ TranslateMessage(&Msg);
+ DispatchMessageA(&Msg);
+ if (Msg.message == 18)
+ {
+ return_value = Msg.wParam;
+ return 0;
+ }
+ }
+ return 1;
+ }
+ GetMessageA(&Msg, pinball::hwnd_frame, 0, 0);
+ TranslateMessage(&Msg);
+ DispatchMessageA(&Msg);
+ if (Msg.message == 18)
+ {
+ return_value = Msg.wParam;
+ return 0;
+ }
+ return 1;
}
void winmain_memalloc_failure()
diff --git a/SpaceCadetPinball/winmain.h b/SpaceCadetPinball/winmain.h
index c3b7628..12bf82f 100644
--- a/SpaceCadetPinball/winmain.h
+++ b/SpaceCadetPinball/winmain.h
@@ -1,4 +1,6 @@
#pragma once
-static int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);
+int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);
static void winmain_memalloc_failure();
+static LRESULT CALLBACK message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
+int ProcessWindowMessages();