From 2ce4236ea704e13ffc197815b26070a119f24d8d Mon Sep 17 00:00:00 2001 From: Jon Thysell Date: Fri, 15 Oct 2021 17:29:07 -0700 Subject: [PATCH] Proper event loop, menus, and more * Added a proper event loop * Added minimal menu bars * Added about menu * GameWindow initializes a GameEngine (even if you can't play it yet) * Updated variable naming conventions --- src/GameEngine.c | 54 ++++++------ src/GameEngine.h | 12 +-- src/GameWindow.c | 25 ++++-- src/GameWindow.h | 8 +- src/MacCommon.c | 12 +-- src/MacCommon.h | 10 +-- src/MacLO.c | 187 +++++++++++++++++++++++++++++++++++++++++- src/MacLO.h | 4 +- src/MacLO.pi.bin | Bin 11520 -> 11520 bytes src/MacLO.pi.rsrc.bin | Bin 3200 -> 3712 bytes src/main.c | 4 +- 11 files changed, 251 insertions(+), 65 deletions(-) diff --git a/src/GameEngine.c b/src/GameEngine.c index 915c164..c22248a 100644 --- a/src/GameEngine.c +++ b/src/GameEngine.c @@ -12,53 +12,55 @@ const uint8_t MinHalfStars = 1; const uint16_t PerfectScore = 300; // LevelCount * MaxHalfStars -void GameEngine_LoadLevel(GameEngine *engine, const int8_t level, const bool setB) +void GameEngine_ToggleSingleLight(GameEngine *pGameEngine, const int8_t x, const int8_t y); + +void GameEngine_LoadLevel(GameEngine *pGameEngine, const int8_t level, const bool setB) { - engine->Level = Levels_BoundLevel(level); - engine->Lights = Levels_GetLightsForLevel(engine->Level, setB); - engine->Par = Levels_GetParForLevel(engine->Level); - engine->Moves = 0; + pGameEngine->Level = Levels_BoundLevel(level); + pGameEngine->Lights = Levels_GetLightsForLevel(pGameEngine->Level, setB); + pGameEngine->Par = Levels_GetParForLevel(pGameEngine->Level); + pGameEngine->Moves = 0; } -bool GameEngine_GetLight(const GameEngine *engine, const int8_t x, const int8_t y) +bool GameEngine_GetLight(const GameEngine *pGameEngine, const int8_t x, const int8_t y) { if (x >= 0 && x < PuzzleSize && y >= 0 && y < PuzzleSize) { - return bitRead(engine->Lights, y * PuzzleSize + x); + return bitRead(pGameEngine->Lights, y * PuzzleSize + x); } return false; } -bool GameEngine_IsCompleted(const GameEngine *engine) +bool GameEngine_IsCompleted(const GameEngine *pGameEngine) { - return engine->Lights == 0; + return pGameEngine->Lights == 0; } -uint8_t GameEngine_GetHalfStars(const GameEngine *engine) +uint8_t GameEngine_GetHalfStars(const GameEngine *pGameEngine) { - uint8_t halfStarsLost = engine->Moves <= engine->Par ? 0 : max(0, (1 + engine->Moves - engine->Par) / 2); + uint8_t halfStarsLost = pGameEngine->Moves <= pGameEngine->Par ? 0 : max(0, (1 + pGameEngine->Moves - pGameEngine->Par) / 2); return max(MinHalfStars, MaxHalfStars - halfStarsLost); } -void GameEngine_ToggleSingleLight(GameEngine *engine, const int8_t x, const int8_t y) -{ - if (x >= 0 && x < PuzzleSize && y >= 0 && y < PuzzleSize) - { - bitToggle(engine->Lights, y * PuzzleSize + x); - } -} - -void GameEngine_ToggleLights(GameEngine *engine, const int8_t x, const int8_t y) +void GameEngine_ToggleLights(GameEngine *pGameEngine, const int8_t x, const int8_t y) { int8_t targetX = max(0, min(x, PuzzleSize - 1)); int8_t targetY = max(0, min(y, PuzzleSize - 1)); - GameEngine_ToggleSingleLight(engine, targetX, targetY); - GameEngine_ToggleSingleLight(engine, targetX + 1, targetY); - GameEngine_ToggleSingleLight(engine, targetX, targetY + 1); - GameEngine_ToggleSingleLight(engine, targetX - 1, targetY); - GameEngine_ToggleSingleLight(engine, targetX, targetY - 1); + GameEngine_ToggleSingleLight(pGameEngine, targetX, targetY); + GameEngine_ToggleSingleLight(pGameEngine, targetX + 1, targetY); + GameEngine_ToggleSingleLight(pGameEngine, targetX, targetY + 1); + GameEngine_ToggleSingleLight(pGameEngine, targetX - 1, targetY); + GameEngine_ToggleSingleLight(pGameEngine, targetX, targetY - 1); - engine->Moves++; + pGameEngine->Moves++; +} + +void GameEngine_ToggleSingleLight(GameEngine *pGameEngine, const int8_t x, const int8_t y) +{ + if (x >= 0 && x < PuzzleSize && y >= 0 && y < PuzzleSize) + { + bitToggle(pGameEngine->Lights, y * PuzzleSize + x); + } } diff --git a/src/GameEngine.h b/src/GameEngine.h index ebd84ef..6d0233b 100644 --- a/src/GameEngine.h +++ b/src/GameEngine.h @@ -16,20 +16,20 @@ extern const uint16_t PerfectScore; typedef struct GameEngine { - int8_t Level; + int8_t Level; uint32_t Lights; uint16_t Par; uint16_t Moves; } GameEngine; -void GameEngine_LoadLevel(GameEngine *engine, const int8_t level, const bool setB); +void GameEngine_LoadLevel(GameEngine *pGameEngine, const int8_t level, const bool setB); -bool GameEngine_GetLight(const GameEngine *engine, const int8_t x, const int8_t y); +bool GameEngine_GetLight(const GameEngine *pGameEngine, const int8_t x, const int8_t y); -bool GameEngine_IsCompleted(const GameEngine *engine); +bool GameEngine_IsCompleted(const GameEngine *pGameEngine); -uint8_t GameEngine_GetHalfStars(const GameEngine *engine); +uint8_t GameEngine_GetHalfStars(const GameEngine *pGameEngine); -void GameEngine_ToggleLights(GameEngine *engine, const int8_t x, const int8_t y); +void GameEngine_ToggleLights(GameEngine *pGameEngine, const int8_t x, const int8_t y); #endif diff --git a/src/GameWindow.c b/src/GameWindow.c index fd6e848..acd0212 100644 --- a/src/GameWindow.c +++ b/src/GameWindow.c @@ -3,27 +3,34 @@ #include "GameWindow.h" -void GameWindow_Init(GameWindow *gameWindow) +void GameWindow_Init(GameWindow *pGameWindow) { - if (gameWindow->Window != nil) + if (pGameWindow->Window != nil) { ShowError("\pGameWindow already initialized!", false); } - gameWindow->Window = GetNewWindow(kBaseResID, nil, kMoveToFront); + pGameWindow->Window = GetNewWindow(BaseResID, nil, MoveToFront); - if (gameWindow->Window == nil) + if (pGameWindow->Window == nil) { - ShowError("\pGameWindow resource WIND kBaseResID missing!", true); + ShowError("\pGameWindow resource WIND BaseResID missing!", true); } - CenterWindow(gameWindow->Window); + GameEngine_LoadLevel(&(pGameWindow->Engine), 0, false); - ShowWindow(gameWindow->Window); - SetPort(gameWindow->Window); + CenterWindow(pGameWindow->Window); +} + +void GameWindow_Draw(GameWindow *pGameWindow) +{ + SetPort(pGameWindow->Window); MoveTo(10, 20); DrawString("\pHello MacLO"); } - +void GameWindow_Show(GameWindow *pGameWindow) +{ + ShowWindow(pGameWindow->Window); +} diff --git a/src/GameWindow.h b/src/GameWindow.h index 42a9034..1c13da6 100644 --- a/src/GameWindow.h +++ b/src/GameWindow.h @@ -5,12 +5,16 @@ #define GAMEWINDOW_H #include "MacCommon.h" +#include "GameEngine.h" typedef struct GameWindow { - WindowPtr Window; + WindowPtr Window; + GameEngine Engine; } GameWindow; -void GameWindow_Init(GameWindow *gameWindow); +void GameWindow_Init(GameWindow *pGameWindow); +void GameWindow_Draw(GameWindow *pGameWindow); +void GameWindow_Show(GameWindow *pGameWindow); #endif diff --git a/src/MacCommon.c b/src/MacCommon.c index 8a0d4ba..f1a9e82 100644 --- a/src/MacCommon.c +++ b/src/MacCommon.c @@ -5,19 +5,13 @@ void CenterWindow(WindowPtr window) { - -} - -Boolean IsCompactDisplay() -{ - return screenBits.bounds.right == 512 - && screenBits.bounds.bottom == 342; + // TODO } void ShowError(Str255 message, Boolean isFatal) { - ParamText(message, kEmptyString, kEmptyString, kEmptyString); - StopAlert(kErrorAlertID, kNilFilterProc); + ParamText(message, EmptyString, EmptyString, EmptyString); + StopAlert(ErrorAlertResID, NilFilterProc); if (isFatal) { diff --git a/src/MacCommon.h b/src/MacCommon.h index c7b5ec9..3159031 100644 --- a/src/MacCommon.h +++ b/src/MacCommon.h @@ -4,13 +4,13 @@ #ifndef MACCOMMON_H #define MACCOMMON_H -#define kBaseResID 128 -#define kMoveToFront (WindowPtr)-1L +#define BaseResID 128 +#define MoveToFront (WindowPtr)-1L -#define kEmptyString "\p" -#define kNilFilterProc nil +#define EmptyString "\p" +#define NilFilterProc nil -#define kErrorAlertID kBaseResID +#define ErrorAlertResID BaseResID void CenterWindow(WindowPtr window); Boolean IsCompactDisplay(); diff --git a/src/MacLO.c b/src/MacLO.c index 71f0ee6..bb2c920 100644 --- a/src/MacLO.c +++ b/src/MacLO.c @@ -4,10 +4,33 @@ #include "GameWindow.h" #include "MacLO.h" -GameWindow gGameWindow; +#define AppleMenuResID BaseResID +#define AboutMenuItemID 1 -void MacLO_InitToolBox() +#define GameMenuResID BaseResID+1 +#define QuitMenuItemID 1 + +#define AboutDialogResID BaseResID +#define AboutDialogOKID 1 + +GameWindow gGameWindow; +Boolean gExitApp; + +void MacLO_HandleUpdate(const EventRecord *pEvent); +void MacLO_HandleMouseDown(const EventRecord *pEvent); + +void MacLO_HandleMenuChoice(const long menuChoice); +void MacLO_HandleAppleMenuChoice(const short item); + +void MacLO_ShowAboutDialog(); +void MacLO_LaunchAppleMenuItem(const short item); + +void MacLO_HandleGameMenuChoice(const short item); + +void MacLO_ToolBoxInit() { + MaxApplZone(); + InitGraf(&thePort); InitFonts(); InitWindows(); @@ -18,13 +41,169 @@ void MacLO_InitToolBox() InitCursor(); } -void MacLO_InitWindows() +void MacLO_AppInit() { + Handle menuBar; + MenuHandle appleMenu; + + // Add the menu bar + menuBar = GetNewMBar(BaseResID); + SetMenuBar(menuBar); + + // Populate the apple menu + appleMenu = GetMHandle(AppleMenuResID); + AddResMenu(appleMenu, 'DRVR'); + + DrawMenuBar(); + + // Setup the game window GameWindow_Init(&gGameWindow); + GameWindow_Draw(&gGameWindow); + GameWindow_Show(&gGameWindow); } void MacLO_MainLoop() { - while (!Button()) { } + EventRecord event; + char cmdChar; + + while (!gExitApp) + { + if (WaitNextEvent(everyEvent, &event, LONG_MAX, nil)) + { + switch (event.what) + { + case updateEvt: + MacLO_HandleUpdate(&event); + break; + case mouseDown: + MacLO_HandleMouseDown(&event); + break; + case keyDown: + case autoKey: + // Translate command key combos to menu items + cmdChar = event.message & charCodeMask; + if ((event.modifiers & cmdKey) != 0) + { + MacLO_HandleMenuChoice(MenuKey(cmdChar)); + } + break; + } + } + } } +void MacLO_HandleUpdate(const EventRecord *pEvent) +{ + WindowPtr window; + + window = (WindowPtr)pEvent->message; + + BeginUpdate(window); + + if (window == gGameWindow.Window) + { + GameWindow_Draw(&gGameWindow); + } + + EndUpdate(window); +} + +void MacLO_HandleMouseDown(const EventRecord *pEvent) +{ + WindowPtr window; + long windowPart; + long menuChoice; + + windowPart = FindWindow(pEvent->where, &window); + + switch (windowPart) + { + case inMenuBar: + menuChoice = MenuSelect(pEvent->where); + MacLO_HandleMenuChoice(menuChoice); + case inSysWindow: + SystemClick(pEvent, window); + break; + case inDrag: + DragWindow(window, pEvent->where, &((*GetGrayRgn())->rgnBBox)); + break; + } +} + +void MacLO_HandleMenuChoice(const long menuChoice) +{ + short menu; + short item; + + if (menuChoice != 0) + { + menu = HiWord(menuChoice); + item = LoWord(menuChoice); + + switch (menu) + { + case AppleMenuResID: + MacLO_HandleAppleMenuChoice(item); + break; + case GameMenuResID: + MacLO_HandleGameMenuChoice(item); + break; + } + + HiliteMenu(0); + } +} + +void MacLO_HandleAppleMenuChoice(const short item) +{ + MenuHandle appleMenu; + Str255 accName; + short accNumber; + + switch (item) + { + case AboutMenuItemID: + MacLO_ShowAboutDialog(); + break; + default: + MacLO_LaunchAppleMenuItem(item); + break; + } +} + +void MacLO_ShowAboutDialog() +{ + DialogPtr dialog; + int itemHit; + + dialog = GetNewDialog(AboutDialogResID, nil, MoveToFront); + + SetPort(dialog); + ShowWindow(dialog); + + ModalDialog(nil, &itemHit); + + DisposDialog(dialog); +} + +void MacLO_LaunchAppleMenuItem(const short item) +{ + MenuHandle appleMenu; + Str255 accName; + + appleMenu = GetMHandle(AppleMenuResID); + GetItem(appleMenu, item, accName); + OpenDeskAcc(accName); + +} + +void MacLO_HandleGameMenuChoice(const short item) +{ + switch (item) + { + case QuitMenuItemID: + gExitApp = true; + break; + } +} diff --git a/src/MacLO.h b/src/MacLO.h index 7e9e1c6..d4d7924 100644 --- a/src/MacLO.h +++ b/src/MacLO.h @@ -4,8 +4,8 @@ #ifndef MACLO_H #define MACLO_H -void MacLO_InitToolBox(); -void MacLO_InitWindows(); +void MacLO_ToolBoxInit(); +void MacLO_AppInit(); void MacLO_MainLoop(); #endif diff --git a/src/MacLO.pi.bin b/src/MacLO.pi.bin index 2684838f668969b9da564d3bb3f041306df8c9d5..48b9363ca43ec38cbdbf1cb386dfb36244b1ca6c 100644 GIT binary patch delta 4214 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�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 diff --git a/src/MacLO.pi.rsrc.bin b/src/MacLO.pi.rsrc.bin index 6d5ece67b6bb1eb5c4445fe79e6e8dbce3690779..b7a39ac125ab3859394c803e9ac5d48e247cf23b 100644 GIT binary patch delta 804 zcmYjQOK1~O6umE#RFgJsg`%~zI7Cp9c3MLO3o5jkHYA-SHbliup$VlkCGC`CQmnsB zDncn}8UrHeqKJ!#(gEvAqze~<=t|sHTv#b0UAj>i&&;IagE!~g`_BEm#~uB!-m`ke z=ilDC^F6jzk)`T^LkG*{jeCT}uv?B2HDj~4)zv=srn-5$xiWLaIwkUN*BD!B1M8#{ z?Zr^J`M;EPA6d0)ADCW(LW5zg812vm3%Fg$G28Z0 zg3htPa@g*JUl`^^X87_MThUS4lTb7~PyP@v6bka>in)!6Te; z>xRSG7-wATC1&Ya1+j9&{}ujH-7!4h5b)UH`*u*Q)8YGna>muqXd=jycOHBVycc{4 znx~kAV?6nuBT?GXd+X3FH~33v+No?6_FBb|pSqxDX!N0@Y4ROMM=xrzmaai(L_}pW hr%rq9aq*1g^J?Dt&Z={QOa*dn-Q5-THs%`tz+cd1*UJC^ delta 412 zcmZpWZIGN0$;JKaZtF9zyS=Y8CJKs+H8#4OWB>w2Am&=Zz`zN_j6oA8=rYcqxX+Zk z@Aq+#ECU1gugQ#zP5eNX1cL?x6Jr459|ji2&HaqCIqOmNGOw>@;M)XLD8s14z!UE2 z=K^GB`8xaf1L-m+KNlY$-Q*VJ>IS6yJe~cNf%L4*7JOI8lDLN&kkbm diff --git a/src/main.c b/src/main.c index d982b44..4208c59 100644 --- a/src/main.c +++ b/src/main.c @@ -5,7 +5,7 @@ void main(void) { - MacLO_InitToolBox(); - MacLO_InitWindows(); + MacLO_ToolBoxInit(); + MacLO_AppInit(); MacLO_MainLoop(); }