packages feed

venzone-1.0.0.0: src/Screen/ProcessKeys.hs

module Screen.ProcessKeys where

-- .Decide, for players

import Input
import Meeple.Operate
import Screen.Check
import Screen.Primitives

import Terminal.Game
import Lens.Micro.Platform


processMovKeys :: HasScreen s => Input -> s -> Player -> Player
processMovKeys KLeft  _ p = agiMov p AGoW
processMovKeys KRight _ p = agiMov p AGoE
processMovKeys KUp    s p
        | canClimb s (MPlayer p)   = agiMov p AClimb & isClimbing .~ True
        | amGrounded s (MPlayer p) = jumpAct p
processMovKeys KDown  s p
        | canClimb s (MPlayer p)   ||
          canDescend s (MPlayer p)    = agiMov p ADescend & isClimbing .~ True
processMovKeys KSpace _ p = stopPlayer p
processMovKeys _      _ p = p

jumpAct :: Player -> Player
jumpAct p | ca == AGoW = p & action .~ AJumpL
          | ca == AGoE = p & action .~ AJumpR
          | otherwise  = p & action .~ AJumpX
    where
          ca = p ^. action

-----------------
-- ANCILLARIES --
-----------------

-- ~= Sierra AGI movement, tap once to start moving, tap again to stop.
agiMov :: Player -> PAction -> Player
agiMov p nc | oc == nc  = stop p
            | otherwise = p & action .~ nc
    where
          oc = p ^. action

          stop :: Player -> Player
          stop pw = pw & stopSpeed -- xxx [refactor] questo andrebbe in
                                   --     Decide
                       & action .~ ANoAction

          stopSpeed
            | elem nc [AClimb, ADescend] = speed . _1 .~ 0
            | otherwise                  = speed . _2 .~ 0

-- stop him in any case
stopPlayer :: Player -> Player
stopPlayer p = agiMov p (p ^. action)