diff --git a/src/GameWindow.c b/src/GameWindow.c index 0355174..7e599f1 100644 --- a/src/GameWindow.c +++ b/src/GameWindow.c @@ -3,6 +3,8 @@ #include "GameWindow.h" +void GameWindow_DrawPlayfield(const GameWindow *pGameWindow); + void GameWindow_Init(GameWindow *pGameWindow) { if (pGameWindow->Window != nil) @@ -17,18 +19,99 @@ void GameWindow_Init(GameWindow *pGameWindow) ShowError("\pGameWindow resource WIND BaseResID missing!", true); } + // Setup rects + pGameWindow->PlayfieldRect.left = PlayfieldMargin; + pGameWindow->PlayfieldRect.top = PlayfieldMargin; + pGameWindow->PlayfieldRect.right = (2 * PlayfieldMargin) + (PuzzleSize * (LightSize + LightMargin)) - LightMargin; + pGameWindow->PlayfieldRect.bottom = (2 * PlayfieldMargin) + (PuzzleSize * (LightSize + LightMargin)) - LightMargin;; + + // Load first level GameEngine_LoadLevel(&(pGameWindow->Engine), 0, false); + } -void GameWindow_Draw(GameWindow *pGameWindow) +void GameWindow_Draw(const GameWindow *pGameWindow, Boolean fullRefresh) { + const Rect *pContentRect = &(pGameWindow->Window->portRect); + SetPort(pGameWindow->Window); - MoveTo(10, 20); - DrawString("\pHello MacLO"); + if (fullRefresh) + { + // Fill background + ForeColor(blackColor); + PaintRect(pContentRect); + } + + GameWindow_DrawPlayfield(pGameWindow); } -void GameWindow_Show(GameWindow *pGameWindow) +void GameWindow_DrawPlayfield(const GameWindow *pGameWindow) +{ + int8_t r, c; + Rect lightRect; + + SetPort(pGameWindow->Window); + + // Draw lights + for (r = 0; r < PuzzleSize; r++) + { + lightRect.top = PlayfieldMargin + (r * (LightMargin + LightSize)); + lightRect.bottom = lightRect.top + LightSize; + + for (c = 0; c < PuzzleSize; c++) + { + lightRect.left = PlayfieldMargin + (c * (LightMargin + LightSize)); + lightRect.right = lightRect.left + LightSize; + + if (GameEngine_GetLight(&(pGameWindow->Engine), c, r)) + { + // Draw ON light + ForeColor(whiteColor); + PaintRoundRect(&lightRect, LightCornerSize, LightCornerSize); + } + else + { + // Draw OFF light + ForeColor(blackColor); + PaintRoundRect(&lightRect, LightCornerSize, LightCornerSize); + ForeColor(whiteColor); + FrameRoundRect(&lightRect, LightCornerSize, LightCornerSize); + } + } + } +} + +void GameWindow_Show(const GameWindow *pGameWindow) { ShowWindow(pGameWindow->Window); } + +void GameWindow_Click(GameWindow *pGameWindow, const Point *pPosition) +{ + int8_t r, c; + Rect lightRect; + + if (PtInRect(*pPosition, &(pGameWindow->PlayfieldRect))) + { + for (r = 0; r < PuzzleSize; r++) + { + lightRect.top = PlayfieldMargin + (r * (LightMargin + LightSize)); + lightRect.bottom = lightRect.top + LightSize; + + for (c = 0; c < PuzzleSize; c++) + { + lightRect.left = PlayfieldMargin + (c * (LightMargin + LightSize)); + lightRect.right = lightRect.left + LightSize; + + if (PtInRect(*pPosition, &lightRect)) + { + GameEngine_ToggleLights(&(pGameWindow->Engine), c, r); + GameWindow_DrawPlayfield(pGameWindow); + break; + } + } + } + + } +} diff --git a/src/GameWindow.h b/src/GameWindow.h index 1c13da6..7679f64 100644 --- a/src/GameWindow.h +++ b/src/GameWindow.h @@ -7,14 +7,23 @@ #include "MacCommon.h" #include "GameEngine.h" +#define PlayfieldMargin 5 +#define LightMargin 10 +#define LightSize 50 +#define LightCornerSize 10 + typedef struct GameWindow { - WindowPtr Window; + WindowPtr Window; GameEngine Engine; + Rect PlayfieldRect; } GameWindow; void GameWindow_Init(GameWindow *pGameWindow); -void GameWindow_Draw(GameWindow *pGameWindow); -void GameWindow_Show(GameWindow *pGameWindow); + +void GameWindow_Draw(const GameWindow *pGameWindow, Boolean fullRefresh); +void GameWindow_Show(const GameWindow *pGameWindow); + +void GameWindow_Click(GameWindow *pGameWindow, const Point *pPosition); #endif diff --git a/src/MacLO.c b/src/MacLO.c index 583c44c..4b5cf62 100644 --- a/src/MacLO.c +++ b/src/MacLO.c @@ -58,7 +58,7 @@ void MacLO_AppInit() // Setup the game window GameWindow_Init(&gGameWindow); - GameWindow_Draw(&gGameWindow); + GameWindow_Draw(&gGameWindow, true); GameWindow_Show(&gGameWindow); } @@ -103,7 +103,7 @@ void MacLO_HandleUpdate(const EventRecord *pEvent) if (window == gGameWindow.Window) { - GameWindow_Draw(&gGameWindow); + GameWindow_Draw(&gGameWindow, true); } EndUpdate(window); @@ -114,19 +114,25 @@ void MacLO_HandleMouseDown(const EventRecord *pEvent) WindowPtr window; long windowPart; long menuChoice; + Point mousePosition; windowPart = FindWindow(pEvent->where, &window); + mousePosition = pEvent->where; switch (windowPart) { case inMenuBar: - menuChoice = MenuSelect(pEvent->where); + menuChoice = MenuSelect(mousePosition); MacLO_HandleMenuChoice(menuChoice); case inSysWindow: SystemClick(pEvent, window); break; case inDrag: - DragWindow(window, pEvent->where, &((*GetGrayRgn())->rgnBBox)); + DragWindow(window, mousePosition, &((*GetGrayRgn())->rgnBBox)); + break; + case inContent: + GlobalToLocal(&mousePosition); + GameWindow_Click(&gGameWindow, &mousePosition); break; } } diff --git a/src/MacLO.pi.bin b/src/MacLO.pi.bin index 48b9363..743a81f 100644 Binary files a/src/MacLO.pi.bin and b/src/MacLO.pi.bin differ diff --git a/src/MacLO.pi.rsrc.bin b/src/MacLO.pi.rsrc.bin index 114a30e..7f5ddfb 100644 Binary files a/src/MacLO.pi.rsrc.bin and b/src/MacLO.pi.rsrc.bin differ