module Game.Entities.Tracker (mkTracker) where import Game.Entities.Const import Game.Entities.Runner import Game.Entities.Types import qualified Game.Sprites as S mkTracker :: S.SpriteSheet -> Int -> Int -> Dir -> Collision -> Collision -> IsBlocked -> IO Entity mkTracker sprites x y d playerCollision facingPlayerLower isBlocked = do s <- S.get sprites "tracker" runner <- mkRunner sprites x y d playerCollision isBlocked pure runner {sprite = s, update = updateTracker runner.update facingPlayerLower isBlocked} updateTracker :: (Entity -> IO Entity) -> Collision -> IsBlocked -> Entity -> IO Entity updateTracker updateRunner facingPlayerLower isBlocked ent = do e <- updateRunner ent facing <- facingPlayerLower e pure $ if facing && e.gravity == gravityOff && not (isBlocked (ent.x + 8) (ent.y - 1)) && isBlocked (ent.x + 8) ent.y then e { gravity = gravityUp, frame = jumpFrame, actions = [ActionAddEffect ent.x (ent.y + 8) "dust"] } else e