packages feed

LambdaHack-0.1.20080413: Actor.hs

module Actor where

import Level
import Monster

data Actor = AMonster Int  -- offset in monster list
           | APlayer
  deriving (Show, Eq)

getActor :: Level -> Player -> Actor -> Monster
getActor lvl p (AMonster n) = lmonsters lvl !! n
getActor lvl p APlayer      = p

updateActor :: (Monster -> Monster) ->                  -- the update
               (Monster -> Level -> Player -> IO a) ->  -- continuation
               Actor ->                                 -- who to update
               Level -> Player -> IO a                  -- transformed continuation
updateActor f k (AMonster n) lvl p = 
  let (m,ms) = updateMonster f n (lmonsters lvl)
  in  k m (updateMonsters lvl (const ms)) p
updateActor f k APlayer      lvl p = k p lvl (f p)

updateMonster :: (Monster -> Monster) -> Int -> [Monster] -> (Monster, [Monster])
updateMonster f n ms =
  case splitAt n ms of
    (pre, x : post) -> let m = f x in (m, pre ++ [m] ++ post)
    xs              -> error "updateMonster"