-- | All construction (terrain clearing, etc) actions that a creature might take.
module Construction
(modifyFacingTerrain,
clearTerrain)
where
import DB
import Plane
import TerrainData
import Facing
import Control.Monad
import Control.Monad.Maybe
import Control.Monad.Trans
import Position
import Data.Maybe
-- | Modifies terrain in the specified walking direction, returning
-- True iff any terrain modification actually occured.
modifyFacingTerrain :: (TerrainPatch -> TerrainPatch) -> Facing -> CreatureRef -> DB Bool
modifyFacingTerrain f face creature_ref = liftM (fromMaybe False) $ runMaybeT $
do (plane_ref,position) <- MaybeT $ liftM extractLocation $ dbWhere creature_ref
let target_position = offsetPosition (facingToRelative face) position
prev_terrain <- lift $ terrainAt plane_ref target_position
let new_terrain = f prev_terrain
when (new_terrain == prev_terrain) $ fail ""
lift $ setTerrainAt plane_ref target_position new_terrain
return True
clearTerrain :: TerrainPatch -> TerrainPatch
clearTerrain RockFace = Rubble
clearTerrain Forest = Grass
clearTerrain DeepForest = Grass
clearTerrain Lava = Glass
clearTerrain x = x