module Monster where import qualified Data.Set as S import Control.Monad.State.Strict import Types import World monsterPos :: Monster -> Pos monsterPos (Bug p) = p monsterPos (Mold p) = p moveMonster :: Monster -> Pos -> M () moveMonster m p = do removeMonster m addMonster $ case m of Bug _ -> Bug p Mold _ -> Mold p addMonster :: Monster -> M () addMonster m = do writeActor (monsterPos m) (AMonster m) changeMonsters (S.insert m) removeMonster :: Monster -> M () removeMonster m = do writeActor (monsterPos m) Empty changeMonsters (S.delete m) changeMonsters :: (S.Set Monster -> S.Set Monster) -> M () changeMonsters f = modify $ \s -> s { monsters = f (monsters s) }