LambdaHack-0.1.20110117: src/Actor.hs
module Actor where
import Level
import Monster
import State
data Actor = AMonster Int -- offset in monster list
| APlayer
deriving (Show, Eq)
getActor :: State -> Actor -> Monster
getActor (State { slevel = lvl, splayer = p }) a =
case a of
AMonster n -> lmonsters lvl !! n
APlayer -> p
updateActor :: (Monster -> Monster) -> -- the update
(Monster -> State -> IO a) -> -- continuation
Actor -> -- who to update
State -> IO a -- transformed continuation
updateActor f k (AMonster n) state@(State { slevel = lvl, splayer = p }) =
let (m,ms) = updateMonster f n (lmonsters lvl)
in k m (updateLevel (updateMonsters (const ms)) state)
updateActor f k APlayer state@(State { slevel = lvl, splayer = p }) =
k p (updatePlayer f state)
updateMonster :: (Monster -> Monster) -> Int -> [Monster] ->
(Monster, [Monster])
updateMonster f n ms =
case splitAt n ms of
(pre, x : post) -> let m = f x
mtimeChanged = mtime x /= mtime m
in (m, if mtimeChanged then snd (insertMonster m (pre ++ post))
else pre ++ [m] ++ post)
xs -> error "updateMonster"