module Game.Entities.Exit (mkExit) where import Game.Entities.Common import Game.Entities.Const import Game.Entities.Types import Game.Sprites qualified as S closingDoorSet :: Int closingDoorSet = 1 mkExit :: S.SpriteSheet -> Int -> Int -> Collision -> IO Entity mkExit sprites x y playerCollision = do s <- S.get sprites "exit" pure Entity { typ = TypePickup, x = x, y = y, delay = frameDelay, frame = 0, set = 0, jumping = False, gravity = gravityOff, dir = DirRight, sprite = s, update = updateExit playerCollision, destroy = False, actions = [], dat = NoData } updateExit :: Collision -> Entity -> IO Entity updateExit touchedPlayer e -- right is the set 0, left set 1 | e.set /= closingDoorSet = do touched <- if e.frame < fullyOpen then pure False else touchedPlayer e pure $ if touched then e {set = closingDoorSet, frame = 0, actions = [ActionExitStarted]} else updateLoop | otherwise = pure updateOnce where fullyOpen :: Int fullyOpen = 7 updateLoop :: Entity updateLoop | e.delay > 0 = e {delay = e.delay - 1} | e.frame + 1 < frameLimit e = e {delay = frameDelay, frame = e.frame + 1} | otherwise = e {delay = frameDelay, frame = fullyOpen} updateOnce :: Entity updateOnce | e.delay > 0 = e {delay = e.delay - 1} | e.frame + 1 < frameLimit e = e {delay = frameDelay, frame = e.frame + 1} | otherwise = e {destroy = True, actions = [ActionExitDone]}