37 lines
1.3 KiB
Haskell
37 lines
1.3 KiB
Haskell
module RPGEngine.Data.Game
|
|
( isLegalMove
|
|
, isPlayerAtExit
|
|
, isPlayerDead
|
|
) where
|
|
|
|
import RPGEngine.Data
|
|
( Player(..),
|
|
Direction,
|
|
Physical(Exit, Walkable, Entrance),
|
|
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
|
|
where legality = physical `elem` [Walkable, Entrance, Exit]
|
|
physical = findAt newPos lvl
|
|
newPos = (x + xD, y + yD)
|
|
(xD, yD) = directionOffsets dir
|
|
isLegalMove _ _ = False
|
|
|
|
-- Check if a player is standing on an exit
|
|
isPlayerAtExit :: Game -> Bool
|
|
isPlayerAtExit g@Game{ state = Playing{ player = player, level = level }} = atExit
|
|
where playerPos = position player
|
|
atPos = findAt playerPos level
|
|
atExit = atPos == Exit
|
|
isPlayerAtExit _ = False
|
|
|
|
-- Check if the players health is <= 0, which means the player is dead.
|
|
isPlayerDead :: Game -> Bool
|
|
isPlayerDead g@Game{ state = Playing{ player = Player{ playerHp = (Just hp)}}} = hp <= 0
|
|
isPlayerDead _ = False
|