From b7278d6afcf2aff3ee0823a980a2ed4fca49b74d Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Thu, 22 Dec 2022 09:43:17 +0100 Subject: [PATCH] Jumpbacks and continue --- lib/RPGEngine/Data.hs | 30 ++++++++++++++------------ lib/RPGEngine/Data/Game.hs | 6 +++--- lib/RPGEngine/Input/Paused.hs | 11 +++++++--- lib/RPGEngine/Input/Playing.hs | 13 ++++++----- lib/RPGEngine/Render.hs | 9 ++++---- lib/RPGEngine/Render/LevelSelection.hs | 4 ++-- lib/RPGEngine/Render/Lose.hs | 4 ++-- lib/RPGEngine/Render/Menu.hs | 4 ++-- lib/RPGEngine/Render/Paused.hs | 9 ++++---- lib/RPGEngine/Render/Playing.hs | 9 +++++--- lib/RPGEngine/Render/Win.hs | 4 ++-- 11 files changed, 59 insertions(+), 44 deletions(-) diff --git a/lib/RPGEngine/Data.hs b/lib/RPGEngine/Data.hs index 23b25c8..a47cded 100644 --- a/lib/RPGEngine/Data.hs +++ b/lib/RPGEngine/Data.hs @@ -11,35 +11,37 @@ import RPGEngine.Render.Core ( Renderer ) -- A game is the base data container. data Game = Game { - state :: State, - levels :: [Level], - player :: Player + state :: State } ------------------------------- State -------------------------------- -- Code reusability data StateBase = StateBase { - renderer :: Renderer Game, + renderer :: Renderer State, inputHandler :: InputHandler Game } -- Main menu -data State = Menu { base :: StateBase } +data State = Menu { base :: StateBase } -- Select the level you want to play - | LevelSelection { base :: StateBase, - levelList :: [FilePath], - selector :: ListSelector } + | LevelSelection { base :: StateBase, + levelList :: [FilePath], + selector :: ListSelector } -- Playing a level - | Playing { base :: StateBase, - level :: Level } + | Playing { base :: StateBase, + levels :: [Level], + level :: Level, + player :: Player, + restart :: State } -- Paused while playing a level - | Paused { base :: StateBase, - level :: Level } + | Paused { base :: StateBase, + continue :: State } -- Won a level - | Win { base :: StateBase } + | Win { base :: StateBase } -- Lost a level - | Lose { base :: StateBase } + | Lose { base :: StateBase, + restart :: State } ------------------------------- Level -------------------------------- diff --git a/lib/RPGEngine/Data/Game.hs b/lib/RPGEngine/Data/Game.hs index 2b21cd5..37fe826 100644 --- a/lib/RPGEngine/Data/Game.hs +++ b/lib/RPGEngine/Data/Game.hs @@ -6,15 +6,15 @@ import RPGEngine.Data ( Player(Player, position), Direction, Physical(Exit, Walkable, Entrance), - State(Playing, level), - Game(Game, state, player) ) + State(..), + Game(..) ) import RPGEngine.Data.Level (findAt, directionOffsets) ------------------------------ Exported ------------------------------ -- Check if a move is legal by checking what is located at the new position. isLegalMove :: Direction -> Game -> Bool -isLegalMove dir g@Game{ state = Playing { level = lvl }, player = p@Player{ position = (x, y) }} = legality +isLegalMove dir g@Game{ state = Playing { level = lvl, player = p@Player{ position = (x, y) }}} = legality where legality = physical `elem` [Walkable, Entrance, Exit] physical = findAt newPos lvl newPos = (x + xD, y + yD) diff --git a/lib/RPGEngine/Input/Paused.hs b/lib/RPGEngine/Input/Paused.hs index 03522dd..5420296 100644 --- a/lib/RPGEngine/Input/Paused.hs +++ b/lib/RPGEngine/Input/Paused.hs @@ -2,11 +2,16 @@ module RPGEngine.Input.Paused ( handleInputPaused ) where -import RPGEngine.Input.Core ( InputHandler ) +import RPGEngine.Input.Core ( InputHandler, handleAnyKey ) -import RPGEngine.Data ( Game ) +import RPGEngine.Data ( Game (..), State (..) ) ------------------------------ Exported ------------------------------ handleInputPaused :: InputHandler Game -handleInputPaused = undefined +handleInputPaused = handleAnyKey continueGame + +continueGame :: Game -> Game +continueGame g@Game{ state = Paused{ continue = state }} = newGame + where newGame = g{ state = state } +continueGame g = g \ No newline at end of file diff --git a/lib/RPGEngine/Input/Playing.hs b/lib/RPGEngine/Input/Playing.hs index b2638e0..c02a548 100644 --- a/lib/RPGEngine/Input/Playing.hs +++ b/lib/RPGEngine/Input/Playing.hs @@ -15,7 +15,7 @@ import RPGEngine.Data Level(Level, layout), State(..), StateBase(StateBase, renderer, inputHandler), - Game(Game, state, player) ) + Game(..) ) import RPGEngine.Data.Level ( findFirstOf, directionOffsets ) import RPGEngine.Data.Game ( isLegalMove ) import RPGEngine.Input.Paused ( handleInputPaused ) @@ -53,19 +53,22 @@ spawnPlayer l@Level{ layout = lay } p@Player{ position = prevPos } = p{ position ---------------------------------------------------------------------- pauseGame :: Game -> Game -pauseGame g@Game{ state = Playing{ level = level } } = pausedGame +pauseGame g@Game{ state = playing@Playing{} } = pausedGame where pausedGame = g{ state = pausedState } - pausedState = Paused{ base = newBase, level = level } + pausedState = Paused{ base = newBase, continue = playing } newBase = StateBase { renderer = renderPaused, inputHandler = handleInputPaused } +pauseGame g = g -- Move a player in a direction if possible. movePlayer :: Direction -> Game -> Game -movePlayer dir g@Game{ player = p@Player{ position = (x, y) }} = newGame - where newGame = g{ player = newPlayer } +movePlayer dir g@Game{ state = s@Playing{ player = p@Player{ position = (x, y) }}} = newGame + where newGame = g{ state = newState } + newState = s{ player = newPlayer } newPlayer = p{ position = newCoord } newCoord | isLegalMove dir g = (x + xD, y + yD) | otherwise = (x, y) (xD, yD) = directionOffsets dir +movePlayer _ g = g -- TODO goToNextLevel :: Game -> Game diff --git a/lib/RPGEngine/Render.hs b/lib/RPGEngine/Render.hs index fb9152b..0699d29 100644 --- a/lib/RPGEngine/Render.hs +++ b/lib/RPGEngine/Render.hs @@ -26,13 +26,14 @@ initWindow = InWindow -- Initialize the game initGame :: Game initGame = Game { - state = Menu{ base = StateBase{ renderer = renderMenu, inputHandler = handleInputMenu }}, - levels = [defaultLevel], - player = spawnPlayer defaultLevel defaultPlayer + state = Menu{ base = StateBase{ + renderer = renderMenu, + inputHandler = handleInputMenu + }} } -- Render all different states render :: Game -> Picture -render g@Game{ state = state } = renderFunc g +render g@Game{ state = state } = renderFunc state where stateBase = base state renderFunc = renderer stateBase \ No newline at end of file diff --git a/lib/RPGEngine/Render/LevelSelection.hs b/lib/RPGEngine/Render/LevelSelection.hs index ee3da56..f00e157 100644 --- a/lib/RPGEngine/Render/LevelSelection.hs +++ b/lib/RPGEngine/Render/LevelSelection.hs @@ -15,8 +15,8 @@ import Graphics.Gloss.Data.Color (red) ------------------------------ Exported ------------------------------ -renderLevelSelection :: Renderer Game -renderLevelSelection Game{ state = state } = result +renderLevelSelection :: Renderer State +renderLevelSelection state = result where result = renderLevelList state ---------------------------------------------------------------------- diff --git a/lib/RPGEngine/Render/Lose.hs b/lib/RPGEngine/Render/Lose.hs index b3266e9..3154bea 100644 --- a/lib/RPGEngine/Render/Lose.hs +++ b/lib/RPGEngine/Render/Lose.hs @@ -4,11 +4,11 @@ module RPGEngine.Render.Lose import RPGEngine.Render.Core ( Renderer ) -import RPGEngine.Data ( Game ) +import RPGEngine.Data ( State ) import Graphics.Gloss ( text ) ---------------------------------------------------------------------- -- TODO -renderLose :: Renderer Game +renderLose :: Renderer State renderLose _ = text "Win" \ No newline at end of file diff --git a/lib/RPGEngine/Render/Menu.hs b/lib/RPGEngine/Render/Menu.hs index 26ec414..6905814 100644 --- a/lib/RPGEngine/Render/Menu.hs +++ b/lib/RPGEngine/Render/Menu.hs @@ -4,11 +4,11 @@ module RPGEngine.Render.Menu import RPGEngine.Render.Core ( Renderer ) -import RPGEngine.Data ( Game ) +import RPGEngine.Data ( State ) import Graphics.Gloss (text) ---------------------------------------------------------------------- -- TODO -renderMenu :: Renderer Game +renderMenu :: Renderer State renderMenu _ = text "[Press any key to start]" \ No newline at end of file diff --git a/lib/RPGEngine/Render/Paused.hs b/lib/RPGEngine/Render/Paused.hs index 3a49a64..bc54169 100644 --- a/lib/RPGEngine/Render/Paused.hs +++ b/lib/RPGEngine/Render/Paused.hs @@ -4,7 +4,7 @@ module RPGEngine.Render.Paused import RPGEngine.Render.Core ( Renderer, overlay ) -import RPGEngine.Data ( Game ) +import RPGEngine.Data ( State (..) ) import Graphics.Gloss ( pictures, scale, text ) import RPGEngine.Render.Playing ( renderPlaying ) import Graphics.Gloss.Data.Picture (color) @@ -12,9 +12,10 @@ import Graphics.Gloss.Data.Color (white) ------------------------------ Exported ------------------------------ -renderPaused :: Renderer Game -renderPaused g = pictures [renderPlaying g, pause] - where pause = pictures [ +renderPaused :: Renderer State +renderPaused state = pictures [playing, pause] + where playing = renderPlaying $ continue state + pause = pictures [ overlay, color white $ scale 0.5 0.5 $ text "[Press any key to continue]" ] \ No newline at end of file diff --git a/lib/RPGEngine/Render/Playing.hs b/lib/RPGEngine/Render/Playing.hs index 0f075ba..dd9f739 100644 --- a/lib/RPGEngine/Render/Playing.hs +++ b/lib/RPGEngine/Render/Playing.hs @@ -16,14 +16,17 @@ import RPGEngine.Data import Graphics.Gloss ( Picture, pictures ) import Graphics.Gloss.Data.Picture (translate) import RPGEngine.Config (resolution, zoom) +import Graphics.Gloss (text) +import Graphics.Gloss (blank) ------------------------------ Exported ------------------------------ -renderPlaying :: Renderer Game -renderPlaying g@Game{ state = Playing { level = lvl }, player = player } = pictures [ +renderPlaying :: Renderer State +renderPlaying Playing { level = lvl, player = player } = pictures [ renderLevel lvl, renderPlayer player ] +renderPlaying _ = blank ------------------------------- Player ------------------------------- @@ -35,7 +38,7 @@ renderPlayer Player{ position = (x, y) } = move picture -- Center the player in the middle of the screen. -- Not in use at the moment, might be useful later. focusPlayer :: Game -> Picture -> Picture -focusPlayer Game{ player = Player{ position = (x, y)}} = move +focusPlayer Game{ state = Playing{ player = Player{ position = (x, y) }}} = move where move = translate centerX centerY centerX = resolution * zoom * fromIntegral (negate x) centerY = resolution * zoom * fromIntegral (negate y) diff --git a/lib/RPGEngine/Render/Win.hs b/lib/RPGEngine/Render/Win.hs index 55d893b..62c93b5 100644 --- a/lib/RPGEngine/Render/Win.hs +++ b/lib/RPGEngine/Render/Win.hs @@ -4,11 +4,11 @@ module RPGEngine.Render.Win import RPGEngine.Render.Core ( Renderer ) -import RPGEngine.Data ( Game ) +import RPGEngine.Data ( State ) import Graphics.Gloss (text) ---------------------------------------------------------------------- -- TODO -renderWin :: Renderer Game +renderWin :: Renderer State renderWin _ = text "Win" \ No newline at end of file