From 5cc96cbdba190607634f1b17584b2cfe3350341b Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Thu, 22 Dec 2022 16:25:29 +0100 Subject: [PATCH] #6 Win/End state #8 End screen #9 level selection --- assets/gui/main.png | Bin 0 -> 5460 bytes lib/RPGEngine/Config.hs | 4 ++++ lib/RPGEngine/Data/Game.hs | 5 +++-- lib/RPGEngine/Input/Lose.hs | 11 ++++++++--- lib/RPGEngine/Input/Playing.hs | 2 +- lib/RPGEngine/Render/Core.hs | 1 + lib/RPGEngine/Render/LevelSelection.hs | 7 ++++--- lib/RPGEngine/Render/Lose.hs | 14 ++++++++++---- lib/RPGEngine/Render/Menu.hs | 17 ++++++++++++----- lib/RPGEngine/Render/Win.hs | 13 ++++++++++--- 10 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 assets/gui/main.png diff --git a/assets/gui/main.png b/assets/gui/main.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2ae6e88aba0dccbbd3024533d794ede19940bf GIT binary patch literal 5460 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 Bool -isPlayerDead _ = False \ No newline at end of file +isPlayerDead g@Game{ state = Playing{ player = Player{ playerHp = (Just hp)}}} = hp <= 0 +isPlayerDead _ = False diff --git a/lib/RPGEngine/Input/Lose.hs b/lib/RPGEngine/Input/Lose.hs index 007a25f..a7ff57e 100644 --- a/lib/RPGEngine/Input/Lose.hs +++ b/lib/RPGEngine/Input/Lose.hs @@ -2,11 +2,16 @@ module RPGEngine.Input.Lose ( handleInputLose ) where -import RPGEngine.Input.Core (InputHandler) +import RPGEngine.Input.Core (InputHandler, handleAnyKey) -import RPGEngine.Data (Game) +import RPGEngine.Data (Game(..), State(..)) ------------------------------ Exported ------------------------------ handleInputLose :: InputHandler Game -handleInputLose = undefined \ No newline at end of file +handleInputLose = handleAnyKey retry + +---------------------------------------------------------------------- + +retry :: Game -> Game +retry g@Game{ state = Lose{ restart = restart }} = g{ state = restart } \ No newline at end of file diff --git a/lib/RPGEngine/Input/Playing.hs b/lib/RPGEngine/Input/Playing.hs index 6ca8f47..3068d24 100644 --- a/lib/RPGEngine/Input/Playing.hs +++ b/lib/RPGEngine/Input/Playing.hs @@ -50,7 +50,7 @@ checkPlaying g@Game{ state = s@Playing{ restart = restart }} = newGame where newGame | isPlayerDead g = loseGame | isPlayerAtExit g = g{ state = goToNextLevel s } | otherwise = g - loseGame = g{ state = restart } + loseGame = g{ state = Lose{ restart = restart }} checkPlaying g = g pauseGame :: Game -> Game diff --git a/lib/RPGEngine/Render/Core.hs b/lib/RPGEngine/Render/Core.hs index e901243..0c6754c 100644 --- a/lib/RPGEngine/Render/Core.hs +++ b/lib/RPGEngine/Render/Core.hs @@ -44,6 +44,7 @@ allItems = [ allGui :: [(String, FilePath)] allGui = [ + ("main", "main.png"), ("health", "health.png") ] diff --git a/lib/RPGEngine/Render/LevelSelection.hs b/lib/RPGEngine/Render/LevelSelection.hs index 85dc81c..082a8a1 100644 --- a/lib/RPGEngine/Render/LevelSelection.hs +++ b/lib/RPGEngine/Render/LevelSelection.hs @@ -4,7 +4,7 @@ module RPGEngine.Render.LevelSelection import RPGEngine.Render.Core (Renderer) -import RPGEngine.Config (resolution, zoom, uizoom) +import RPGEngine.Config (resolution, zoom, uizoom, textColor, selectionColor ) import RPGEngine.Data (State (..)) import Graphics.Gloss ( pictures, color, text, translate, blank ) @@ -25,7 +25,8 @@ renderLevelList LevelSelection{ levelList = list, selector = selector } = everyt where everything = pictures $ map render entries sel = selection selector entries = zip [0::Int .. ] list - render (i, path) | i == sel = color red $ scale uizoom uizoom $ translate 0 (offset i) $ text path - | otherwise = scale uizoom uizoom $ translate 0 (offset i) $ text path + render (i, path) | i == sel = color selectionColor $ make (i, path) + | otherwise = color textColor $ make (i, path) + make (i, path) = scale uizoom uizoom $ translate 0 (offset i) $ text path offset i = negate (250 * uizoom * fromIntegral i) renderLevelList _ = blank \ No newline at end of file diff --git a/lib/RPGEngine/Render/Lose.hs b/lib/RPGEngine/Render/Lose.hs index 1e6d730..cd1cfad 100644 --- a/lib/RPGEngine/Render/Lose.hs +++ b/lib/RPGEngine/Render/Lose.hs @@ -1,15 +1,21 @@ module RPGEngine.Render.Lose ( renderLose ) where - import RPGEngine.Render.Core (Renderer) +import RPGEngine.Config (uizoom, textColor) import RPGEngine.Data (State) -import Graphics.Gloss (text) +import Graphics.Gloss (text, scale, color, translate) + +------------------------------ Constants ----------------------------- + +message :: String +message = "You lose! Press any key to retry." ------------------------------ Exported ------------------------------ --- TODO renderLose :: Renderer State -renderLose _ = text "You lose" \ No newline at end of file +renderLose _ = scaled $ center $ color textColor $ text message + where scaled = scale uizoom uizoom + center = translate (-1200) 0 \ No newline at end of file diff --git a/lib/RPGEngine/Render/Menu.hs b/lib/RPGEngine/Render/Menu.hs index 473c96c..e9251e4 100644 --- a/lib/RPGEngine/Render/Menu.hs +++ b/lib/RPGEngine/Render/Menu.hs @@ -2,16 +2,23 @@ module RPGEngine.Render.Menu ( renderMenu ) where -import RPGEngine.Render.Core (Renderer) +import RPGEngine.Render.Core (Renderer, getRender) import RPGEngine.Config ( uizoom, textColor ) import RPGEngine.Data (State) -import Graphics.Gloss (text, scale, color, white, translate) +import Graphics.Gloss (text, scale, color, translate, pictures) + +------------------------------ Constants ----------------------------- + +message :: String +message = "[Press any key to start]" ------------------------------ Exported ------------------------------ renderMenu :: Renderer State -renderMenu _ = scaled $ center $ color textColor $ text "[Press any key to start]" - where scaled = scale uizoom uizoom - center = translate (-750) 0 \ No newline at end of file +renderMenu _ = pictures [main, pressAny] + where pressAny = scaled $ center $ color textColor $ text message + scaled = scale uizoom uizoom + center = translate (-800) (-320) + main = getRender "main" \ No newline at end of file diff --git a/lib/RPGEngine/Render/Win.hs b/lib/RPGEngine/Render/Win.hs index 189cef8..abaa095 100644 --- a/lib/RPGEngine/Render/Win.hs +++ b/lib/RPGEngine/Render/Win.hs @@ -4,12 +4,19 @@ module RPGEngine.Render.Win import RPGEngine.Render.Core (Renderer) +import RPGEngine.Config (uizoom, textColor) import RPGEngine.Data (State) -import Graphics.Gloss (text) +import Graphics.Gloss (text, scale, color, translate) + +------------------------------ Constants ----------------------------- + +message :: String +message = "You win! Press any key to return to the menu." ------------------------------ Exported ------------------------------ --- TODO renderWin :: Renderer State -renderWin _ = text "You win!\nPress any key to return to the menu." \ No newline at end of file +renderWin _ = scaled $ center $ color textColor $ text message + where scaled = scale uizoom uizoom + center = translate (-1500) 0 \ No newline at end of file