packages feed

scroll-1.20150313: Monster.hs

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