packages feed

roguestar-engine-0.4.0.1: src/Construction.hs

-- | 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