36 lines
No EOL
1.4 KiB
Haskell
36 lines
No EOL
1.4 KiB
Haskell
module RPGEngine.Data.Level
|
|
-- Everything is exported
|
|
where
|
|
|
|
import GHC.IO (unsafePerformIO)
|
|
import System.Directory (getDirectoryContents)
|
|
import RPGEngine.Input.Core (ListSelector(..))
|
|
import RPGEngine.Data (Level (..), Physical (..), Direction (..), Entity (..), Game (..), Item (..), Player (..), State (..), X, Y, Layout)
|
|
import RPGEngine.Config (levelFolder)
|
|
|
|
------------------------------ Exported ------------------------------
|
|
|
|
-- Find first position of a Physical
|
|
-- Graceful exit by giving Nothing if there is nothing found.
|
|
findFirstOf :: Level -> Physical -> Maybe (X, Y)
|
|
findFirstOf l@Level{ index = index } physical = try
|
|
where matches = filter (\(x, y, v) -> v == physical) index
|
|
try | not (null matches) = Just $ (\(x, y, _) -> (x, y)) $ head matches
|
|
| otherwise = Nothing
|
|
|
|
-- What is located at a given position in the level?
|
|
findAt :: (X, Y) -> Level -> Physical
|
|
findAt pos lvl@Level{ index = index } = try
|
|
where matches = map (\(_, _, v) -> v) $ filter (\(x, y, v) -> (x, y) == pos) index
|
|
try | not (null matches) = head matches
|
|
| otherwise = Void
|
|
|
|
directionOffsets :: Direction -> (X, Y)
|
|
directionOffsets North = ( 0, 1)
|
|
directionOffsets East = ( 1, 0)
|
|
directionOffsets South = ( 0, -1)
|
|
directionOffsets West = (-1, 0)
|
|
directionOffsets Stay = ( 0, 0)
|
|
|
|
getLevelList :: [FilePath]
|
|
getLevelList = drop 2 $ unsafePerformIO $ getDirectoryContents levelFolder |