Jumpbacks and continue
This commit is contained in:
parent
dab6fadad4
commit
b7278d6afc
11 changed files with 59 additions and 44 deletions
|
@ -11,35 +11,37 @@ import RPGEngine.Render.Core ( Renderer )
|
||||||
|
|
||||||
-- A game is the base data container.
|
-- A game is the base data container.
|
||||||
data Game = Game {
|
data Game = Game {
|
||||||
state :: State,
|
state :: State
|
||||||
levels :: [Level],
|
|
||||||
player :: Player
|
|
||||||
}
|
}
|
||||||
|
|
||||||
------------------------------- State --------------------------------
|
------------------------------- State --------------------------------
|
||||||
|
|
||||||
-- Code reusability
|
-- Code reusability
|
||||||
data StateBase = StateBase {
|
data StateBase = StateBase {
|
||||||
renderer :: Renderer Game,
|
renderer :: Renderer State,
|
||||||
inputHandler :: InputHandler Game
|
inputHandler :: InputHandler Game
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Main menu
|
-- Main menu
|
||||||
data State = Menu { base :: StateBase }
|
data State = Menu { base :: StateBase }
|
||||||
-- Select the level you want to play
|
-- Select the level you want to play
|
||||||
| LevelSelection { base :: StateBase,
|
| LevelSelection { base :: StateBase,
|
||||||
levelList :: [FilePath],
|
levelList :: [FilePath],
|
||||||
selector :: ListSelector }
|
selector :: ListSelector }
|
||||||
-- Playing a level
|
-- Playing a level
|
||||||
| Playing { base :: StateBase,
|
| Playing { base :: StateBase,
|
||||||
level :: Level }
|
levels :: [Level],
|
||||||
|
level :: Level,
|
||||||
|
player :: Player,
|
||||||
|
restart :: State }
|
||||||
-- Paused while playing a level
|
-- Paused while playing a level
|
||||||
| Paused { base :: StateBase,
|
| Paused { base :: StateBase,
|
||||||
level :: Level }
|
continue :: State }
|
||||||
-- Won a level
|
-- Won a level
|
||||||
| Win { base :: StateBase }
|
| Win { base :: StateBase }
|
||||||
-- Lost a level
|
-- Lost a level
|
||||||
| Lose { base :: StateBase }
|
| Lose { base :: StateBase,
|
||||||
|
restart :: State }
|
||||||
|
|
||||||
------------------------------- Level --------------------------------
|
------------------------------- Level --------------------------------
|
||||||
|
|
||||||
|
|
|
@ -6,15 +6,15 @@ import RPGEngine.Data
|
||||||
( Player(Player, position),
|
( Player(Player, position),
|
||||||
Direction,
|
Direction,
|
||||||
Physical(Exit, Walkable, Entrance),
|
Physical(Exit, Walkable, Entrance),
|
||||||
State(Playing, level),
|
State(..),
|
||||||
Game(Game, state, player) )
|
Game(..) )
|
||||||
import RPGEngine.Data.Level (findAt, directionOffsets)
|
import RPGEngine.Data.Level (findAt, directionOffsets)
|
||||||
|
|
||||||
------------------------------ Exported ------------------------------
|
------------------------------ Exported ------------------------------
|
||||||
|
|
||||||
-- Check if a move is legal by checking what is located at the new position.
|
-- Check if a move is legal by checking what is located at the new position.
|
||||||
isLegalMove :: Direction -> Game -> Bool
|
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]
|
where legality = physical `elem` [Walkable, Entrance, Exit]
|
||||||
physical = findAt newPos lvl
|
physical = findAt newPos lvl
|
||||||
newPos = (x + xD, y + yD)
|
newPos = (x + xD, y + yD)
|
||||||
|
|
|
@ -2,11 +2,16 @@ module RPGEngine.Input.Paused
|
||||||
( handleInputPaused
|
( handleInputPaused
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import RPGEngine.Input.Core ( InputHandler )
|
import RPGEngine.Input.Core ( InputHandler, handleAnyKey )
|
||||||
|
|
||||||
import RPGEngine.Data ( Game )
|
import RPGEngine.Data ( Game (..), State (..) )
|
||||||
|
|
||||||
------------------------------ Exported ------------------------------
|
------------------------------ Exported ------------------------------
|
||||||
|
|
||||||
handleInputPaused :: InputHandler Game
|
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
|
|
@ -15,7 +15,7 @@ import RPGEngine.Data
|
||||||
Level(Level, layout),
|
Level(Level, layout),
|
||||||
State(..),
|
State(..),
|
||||||
StateBase(StateBase, renderer, inputHandler),
|
StateBase(StateBase, renderer, inputHandler),
|
||||||
Game(Game, state, player) )
|
Game(..) )
|
||||||
import RPGEngine.Data.Level ( findFirstOf, directionOffsets )
|
import RPGEngine.Data.Level ( findFirstOf, directionOffsets )
|
||||||
import RPGEngine.Data.Game ( isLegalMove )
|
import RPGEngine.Data.Game ( isLegalMove )
|
||||||
import RPGEngine.Input.Paused ( handleInputPaused )
|
import RPGEngine.Input.Paused ( handleInputPaused )
|
||||||
|
@ -53,19 +53,22 @@ spawnPlayer l@Level{ layout = lay } p@Player{ position = prevPos } = p{ position
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
pauseGame :: Game -> Game
|
pauseGame :: Game -> Game
|
||||||
pauseGame g@Game{ state = Playing{ level = level } } = pausedGame
|
pauseGame g@Game{ state = playing@Playing{} } = pausedGame
|
||||||
where pausedGame = g{ state = pausedState }
|
where pausedGame = g{ state = pausedState }
|
||||||
pausedState = Paused{ base = newBase, level = level }
|
pausedState = Paused{ base = newBase, continue = playing }
|
||||||
newBase = StateBase { renderer = renderPaused, inputHandler = handleInputPaused }
|
newBase = StateBase { renderer = renderPaused, inputHandler = handleInputPaused }
|
||||||
|
pauseGame g = g
|
||||||
|
|
||||||
-- Move a player in a direction if possible.
|
-- Move a player in a direction if possible.
|
||||||
movePlayer :: Direction -> Game -> Game
|
movePlayer :: Direction -> Game -> Game
|
||||||
movePlayer dir g@Game{ player = p@Player{ position = (x, y) }} = newGame
|
movePlayer dir g@Game{ state = s@Playing{ player = p@Player{ position = (x, y) }}} = newGame
|
||||||
where newGame = g{ player = newPlayer }
|
where newGame = g{ state = newState }
|
||||||
|
newState = s{ player = newPlayer }
|
||||||
newPlayer = p{ position = newCoord }
|
newPlayer = p{ position = newCoord }
|
||||||
newCoord | isLegalMove dir g = (x + xD, y + yD)
|
newCoord | isLegalMove dir g = (x + xD, y + yD)
|
||||||
| otherwise = (x, y)
|
| otherwise = (x, y)
|
||||||
(xD, yD) = directionOffsets dir
|
(xD, yD) = directionOffsets dir
|
||||||
|
movePlayer _ g = g
|
||||||
|
|
||||||
-- TODO
|
-- TODO
|
||||||
goToNextLevel :: Game -> Game
|
goToNextLevel :: Game -> Game
|
||||||
|
|
|
@ -26,13 +26,14 @@ initWindow = InWindow
|
||||||
-- Initialize the game
|
-- Initialize the game
|
||||||
initGame :: Game
|
initGame :: Game
|
||||||
initGame = Game {
|
initGame = Game {
|
||||||
state = Menu{ base = StateBase{ renderer = renderMenu, inputHandler = handleInputMenu }},
|
state = Menu{ base = StateBase{
|
||||||
levels = [defaultLevel],
|
renderer = renderMenu,
|
||||||
player = spawnPlayer defaultLevel defaultPlayer
|
inputHandler = handleInputMenu
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Render all different states
|
-- Render all different states
|
||||||
render :: Game -> Picture
|
render :: Game -> Picture
|
||||||
render g@Game{ state = state } = renderFunc g
|
render g@Game{ state = state } = renderFunc state
|
||||||
where stateBase = base state
|
where stateBase = base state
|
||||||
renderFunc = renderer stateBase
|
renderFunc = renderer stateBase
|
|
@ -15,8 +15,8 @@ import Graphics.Gloss.Data.Color (red)
|
||||||
|
|
||||||
------------------------------ Exported ------------------------------
|
------------------------------ Exported ------------------------------
|
||||||
|
|
||||||
renderLevelSelection :: Renderer Game
|
renderLevelSelection :: Renderer State
|
||||||
renderLevelSelection Game{ state = state } = result
|
renderLevelSelection state = result
|
||||||
where result = renderLevelList state
|
where result = renderLevelList state
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
|
|
|
@ -4,11 +4,11 @@ module RPGEngine.Render.Lose
|
||||||
|
|
||||||
import RPGEngine.Render.Core ( Renderer )
|
import RPGEngine.Render.Core ( Renderer )
|
||||||
|
|
||||||
import RPGEngine.Data ( Game )
|
import RPGEngine.Data ( State )
|
||||||
import Graphics.Gloss ( text )
|
import Graphics.Gloss ( text )
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
-- TODO
|
-- TODO
|
||||||
renderLose :: Renderer Game
|
renderLose :: Renderer State
|
||||||
renderLose _ = text "Win"
|
renderLose _ = text "Win"
|
|
@ -4,11 +4,11 @@ module RPGEngine.Render.Menu
|
||||||
|
|
||||||
import RPGEngine.Render.Core ( Renderer )
|
import RPGEngine.Render.Core ( Renderer )
|
||||||
|
|
||||||
import RPGEngine.Data ( Game )
|
import RPGEngine.Data ( State )
|
||||||
import Graphics.Gloss (text)
|
import Graphics.Gloss (text)
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
-- TODO
|
-- TODO
|
||||||
renderMenu :: Renderer Game
|
renderMenu :: Renderer State
|
||||||
renderMenu _ = text "[Press any key to start]"
|
renderMenu _ = text "[Press any key to start]"
|
|
@ -4,7 +4,7 @@ module RPGEngine.Render.Paused
|
||||||
|
|
||||||
import RPGEngine.Render.Core ( Renderer, overlay )
|
import RPGEngine.Render.Core ( Renderer, overlay )
|
||||||
|
|
||||||
import RPGEngine.Data ( Game )
|
import RPGEngine.Data ( State (..) )
|
||||||
import Graphics.Gloss ( pictures, scale, text )
|
import Graphics.Gloss ( pictures, scale, text )
|
||||||
import RPGEngine.Render.Playing ( renderPlaying )
|
import RPGEngine.Render.Playing ( renderPlaying )
|
||||||
import Graphics.Gloss.Data.Picture (color)
|
import Graphics.Gloss.Data.Picture (color)
|
||||||
|
@ -12,9 +12,10 @@ import Graphics.Gloss.Data.Color (white)
|
||||||
|
|
||||||
------------------------------ Exported ------------------------------
|
------------------------------ Exported ------------------------------
|
||||||
|
|
||||||
renderPaused :: Renderer Game
|
renderPaused :: Renderer State
|
||||||
renderPaused g = pictures [renderPlaying g, pause]
|
renderPaused state = pictures [playing, pause]
|
||||||
where pause = pictures [
|
where playing = renderPlaying $ continue state
|
||||||
|
pause = pictures [
|
||||||
overlay,
|
overlay,
|
||||||
color white $ scale 0.5 0.5 $ text "[Press any key to continue]"
|
color white $ scale 0.5 0.5 $ text "[Press any key to continue]"
|
||||||
]
|
]
|
|
@ -16,14 +16,17 @@ import RPGEngine.Data
|
||||||
import Graphics.Gloss ( Picture, pictures )
|
import Graphics.Gloss ( Picture, pictures )
|
||||||
import Graphics.Gloss.Data.Picture (translate)
|
import Graphics.Gloss.Data.Picture (translate)
|
||||||
import RPGEngine.Config (resolution, zoom)
|
import RPGEngine.Config (resolution, zoom)
|
||||||
|
import Graphics.Gloss (text)
|
||||||
|
import Graphics.Gloss (blank)
|
||||||
|
|
||||||
------------------------------ Exported ------------------------------
|
------------------------------ Exported ------------------------------
|
||||||
|
|
||||||
renderPlaying :: Renderer Game
|
renderPlaying :: Renderer State
|
||||||
renderPlaying g@Game{ state = Playing { level = lvl }, player = player } = pictures [
|
renderPlaying Playing { level = lvl, player = player } = pictures [
|
||||||
renderLevel lvl,
|
renderLevel lvl,
|
||||||
renderPlayer player
|
renderPlayer player
|
||||||
]
|
]
|
||||||
|
renderPlaying _ = blank
|
||||||
|
|
||||||
------------------------------- Player -------------------------------
|
------------------------------- Player -------------------------------
|
||||||
|
|
||||||
|
@ -35,7 +38,7 @@ renderPlayer Player{ position = (x, y) } = move picture
|
||||||
-- Center the player in the middle of the screen.
|
-- Center the player in the middle of the screen.
|
||||||
-- Not in use at the moment, might be useful later.
|
-- Not in use at the moment, might be useful later.
|
||||||
focusPlayer :: Game -> Picture -> Picture
|
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
|
where move = translate centerX centerY
|
||||||
centerX = resolution * zoom * fromIntegral (negate x)
|
centerX = resolution * zoom * fromIntegral (negate x)
|
||||||
centerY = resolution * zoom * fromIntegral (negate y)
|
centerY = resolution * zoom * fromIntegral (negate y)
|
||||||
|
|
|
@ -4,11 +4,11 @@ module RPGEngine.Render.Win
|
||||||
|
|
||||||
import RPGEngine.Render.Core ( Renderer )
|
import RPGEngine.Render.Core ( Renderer )
|
||||||
|
|
||||||
import RPGEngine.Data ( Game )
|
import RPGEngine.Data ( State )
|
||||||
import Graphics.Gloss (text)
|
import Graphics.Gloss (text)
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
-- TODO
|
-- TODO
|
||||||
renderWin :: Renderer Game
|
renderWin :: Renderer State
|
||||||
renderWin _ = text "Win"
|
renderWin _ = text "Win"
|
Reference in a new issue