{-# LANGUAGE PatternSignatures, FlexibleContexts #-}
module Terrain
(terrainAt,
whatIsOccupying,
isTerrainPassable)
where
import TerrainData
import DB
import Control.Monad
import PlaneData
import Grids
import Data.Maybe
terrainAt :: (DBReadable db) => PlaneRef -> Position -> db TerrainPatch
terrainAt plane_ref (Position (x,y)) =
do terrain <- liftM plane_terrain $ dbGetPlane plane_ref
return $ gridAt terrain (x,y)
whatIsOccupying :: (DBReadable db,GenericReference a S) => PlaneRef -> Position -> db [a]
whatIsOccupying plane_ref position =
liftM (mapMaybe fromLocation . filter ((== position) . location) . map (asLocationTyped _nullary _position)) $ dbGetContents plane_ref
isTerrainPassable :: (DBReadable db) => PlaneRef -> CreatureRef -> Position -> db Bool
isTerrainPassable plane_ref creature_ref position =
do (critters :: [CreatureRef]) <- liftM (filter (/= creature_ref)) $ whatIsOccupying plane_ref position
terrain <- terrainAt plane_ref position
return $ not (terrain `elem` [RockFace,Forest,DeepForest]) && null critters