Fix dependency loop

This commit is contained in:
Tibo De Peuter 2022-12-22 13:31:46 +01:00
parent b7278d6afc
commit f529fc5237
25 changed files with 251 additions and 199 deletions

View file

@ -6,6 +6,8 @@ module RPGEngine.Input.Core
, handle
, handleKey
, handleAnyKey
, SpecialKey(..)
) where
import Graphics.Gloss.Interface.Pure.Game

View file

@ -1,18 +1,13 @@
module RPGEngine.Input.LevelSelection
module RPGEngine.Input.LevelSelection
( handleInputLevelSelection
) where
import RPGEngine.Input.Core
( composeInputHandlers, handleKey, InputHandler, ListSelector (..) )
import RPGEngine.Input.Core (InputHandler, composeInputHandlers, handleKey, ListSelector (..))
import RPGEngine.Config ( levelFolder )
import RPGEngine.Data ( Game (..), Direction (..), State (..), StateBase (..) )
import Graphics.Gloss.Interface.IO.Game
( Key(SpecialKey), SpecialKey(KeySpace) )
import RPGEngine.Data (Game (..), State (..), Direction (..))
import Graphics.Gloss.Interface.IO.Game (Key(..))
import Graphics.Gloss.Interface.IO.Interact (SpecialKey(..))
import RPGEngine.Render.Playing (renderPlaying)
import RPGEngine.Input.Playing (handleInputPlaying)
import RPGEngine.Config (levelFolder)
import RPGEngine.Parse (parse)
------------------------------ Exported ------------------------------
@ -46,4 +41,4 @@ moveSelector dir game@Game{ state = state@LevelSelection{ levelList = list, sele
diff | dir == North = -1
| dir == South = 1
| otherwise = 0
moveSelector _ g = g
moveSelector _ g = g

View file

@ -2,12 +2,11 @@ module RPGEngine.Input.Lose
( handleInputLose
) where
import RPGEngine.Input.Core ( InputHandler )
import RPGEngine.Input.Core (InputHandler)
import RPGEngine.Data ( Game )
import RPGEngine.Data (Game)
------------------------------ Exported ------------------------------
-- TODO
handleInputLose :: InputHandler Game
handleInputLose = undefined

View file

@ -2,35 +2,22 @@ module RPGEngine.Input.Menu
( handleInputMenu
) where
import RPGEngine.Input.Core ( InputHandler, composeInputHandlers, handleAnyKey, ListSelector (..) )
import RPGEngine.Data ( Game (..), State (..), StateBase (..) )
import RPGEngine.Render.LevelSelection (renderLevelSelection)
import RPGEngine.Input.LevelSelection (handleInputLevelSelection)
import RPGEngine.Input.Core (InputHandler, composeInputHandlers, handleAnyKey)
import RPGEngine.Data (Game (state), State (..))
import RPGEngine.Data.Default (defaultSelector)
import RPGEngine.Data.Level (getLevelList)
------------------------------ Exported ------------------------------
handleInputMenu :: InputHandler Game
handleInputMenu = composeInputHandlers [
handleAnyKey selectLevel
handleAnyKey (\game -> game{ state = startLevelSelection })
]
----------------------------------------------------------------------
selectLevel :: Game -> Game
selectLevel g@Game{ state = state } = g{ state = defaultLevelSelection }
defaultLevelSelection :: State
defaultLevelSelection = LevelSelection { base = base, selector = defaultSelector, levelList = levels }
where base = StateBase {
renderer = renderLevelSelection,
inputHandler = handleInputLevelSelection
}
levels = getLevelList
defaultSelector :: ListSelector
defaultSelector = ListSelector {
selection = 0,
selected = False
startLevelSelection :: State
startLevelSelection = LevelSelection {
levelList = getLevelList,
selector = defaultSelector
}

View file

@ -1,16 +1,17 @@
module RPGEngine.Input.Paused
module RPGEngine.Input.Paused
( handleInputPaused
) where
import RPGEngine.Input.Core ( InputHandler, handleAnyKey )
import RPGEngine.Data ( Game (..), State (..) )
import RPGEngine.Input.Core (InputHandler, handleAnyKey)
import RPGEngine.Data (Game (..), State (continue, Paused))
------------------------------ Exported ------------------------------
handleInputPaused :: InputHandler Game
handleInputPaused = handleAnyKey continueGame
----------------------------------------------------------------------
continueGame :: Game -> Game
continueGame g@Game{ state = Paused{ continue = state }} = newGame
where newGame = g{ state = state }

View file

@ -1,28 +1,17 @@
module RPGEngine.Input.Playing
module RPGEngine.Input.Playing
( handleInputPlaying
, checkPlaying
, spawnPlayer
) where
import RPGEngine.Input.Core
( composeInputHandlers, handleKey, InputHandler )
import RPGEngine.Input.Core (InputHandler, handleKey, composeInputHandlers)
import RPGEngine.Data
( Player(Player, position),
Direction(West, North, East, South),
Physical(Entrance),
Y,
X,
Level(Level, layout),
State(..),
StateBase(StateBase, renderer, inputHandler),
Game(..) )
import RPGEngine.Data.Level ( findFirstOf, directionOffsets )
import RPGEngine.Data.Game ( isLegalMove )
import RPGEngine.Input.Paused ( handleInputPaused )
import RPGEngine.Render.Paused ( renderPaused )
import RPGEngine.Data (Game (..), Layout(..), Level(..), Physical(..), Player(..), State(..), X, Y, Direction (..))
import RPGEngine.Data.Game (isLegalMove, isPlayerDead, isPlayerAtExit)
import RPGEngine.Data.Level (directionOffsets, findFirstOf)
import Data.Maybe (fromJust, isNothing)
import Graphics.Gloss.Interface.IO.Game (Key(..))
import Graphics.Gloss.Interface.IO.Interact (SpecialKey(..))
import Data.Maybe (isNothing, fromJust)
------------------------------ Exported ------------------------------
@ -43,6 +32,8 @@ handleInputPlaying = composeInputHandlers [
handleKey (Char 'a') $ movePlayer West
]
----------------------------------------------------------------------
-- Set the initial position of the player in a given level.
spawnPlayer :: Level -> Player -> Player
spawnPlayer l@Level{ layout = lay } p@Player{ position = prevPos } = p{ position = newPos }
@ -50,15 +41,30 @@ spawnPlayer l@Level{ layout = lay } p@Player{ position = prevPos } = p{ position
newPos | isNothing try = prevPos
| otherwise = fromJust try
----------------------------------------------------------------------
checkPlaying :: Game -> Game
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 }
checkPlaying g = g
pauseGame :: Game -> Game
pauseGame g@Game{ state = playing@Playing{} } = pausedGame
where pausedGame = g{ state = pausedState }
pausedState = Paused{ base = newBase, continue = playing }
newBase = StateBase { renderer = renderPaused, inputHandler = handleInputPaused }
where pausedGame = g{ state = Paused playing }
pauseGame g = g
-- Go to next level if there is a next level, otherwise, initialize win state.
goToNextLevel :: State -> State
goToNextLevel s@Playing{ levels = levels, level = current, count = count, player = player } = nextState
where -- Either the next level or winState
nextState | (count + 1) < length levels = nextLevelState
| otherwise = Win
nextLevelState = s{ level = nextLevel, count = count + 1, player = movedPlayer }
nextLevel = levels !! (count + 1)
movedPlayer = spawnPlayer nextLevel player
goToNextLevel s = s
-- Move a player in a direction if possible.
movePlayer :: Direction -> Game -> Game
movePlayer dir g@Game{ state = s@Playing{ player = p@Player{ position = (x, y) }}} = newGame
@ -70,12 +76,6 @@ movePlayer dir g@Game{ state = s@Playing{ player = p@Player{ position = (x, y) }
(xD, yD) = directionOffsets dir
movePlayer _ g = g
-- TODO
goToNextLevel :: Game -> Game
goToNextLevel = undefined
----------------------------------------------------------------------
-- Map all Physicals onto coordinates
putCoords :: Level -> [(X, Y, Physical)]
putCoords l@Level{ layout = lay } = concatMap (\(a, bs) -> map (\(b, c) -> (b, a, c)) bs) numberedList

View file

@ -1,13 +1,16 @@
module RPGEngine.Input.Win
module RPGEngine.Input.Win
( handleInputWin
) where
import RPGEngine.Input.Core ( InputHandler )
import RPGEngine.Data ( Game )
import RPGEngine.Input.Core (InputHandler, handleAnyKey)
import RPGEngine.Data (Game (..), State (Menu))
------------------------------ Exported ------------------------------
-- TODO
handleInputWin :: InputHandler Game
handleInputWin = undefined
handleInputWin = handleAnyKey goToMenu
----------------------------------------------------------------------
goToMenu :: Game -> Game
goToMenu g = g{ state = Menu }