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 (..), StateBase (..), 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