packages feed

layers-game-0.3: src/Entity/Update.hs

module Entity.Update where
import qualified Gamgine.Math.Vect as V
import Gamgine.Control ((?))
import qualified GameData.Entity as E
import qualified GameData.Animation as A


data UpdateState = UpdateState {
   gravity :: Double
   } deriving Show


update :: UpdateState -> E.Entity -> E.Entity
update _ pf@E.Platform {E.platformPosition = (Right ani)} =
   pf {E.platformPosition = Right $ A.update ani}


update _ e@E.Enemy {E.enemyPosition = Right ani, E.enemyWalkCycle = wc} =
   e {E.enemyPosition = Right $ A.update ani, E.enemyWalkCycle = updateWalkCycle wc}


update UpdateState {gravity = g} pl@E.Player {E.playerPosition = pos, E.playerVelocity = velo, E.playerWalkCycle = wc} =
   pl {E.playerPosition = pos + velo', E.playerVelocity = velo',
       E.playerOnBottom = False, E.playerWalkCycle = wc'}
   where
      velo' = velo + V.v3 0 (-g) 0
      wc'   = updateWalkCycle wc


update _ e = e


updateWalkCycle :: (Int, Double) -> (Int, Double)
updateWalkCycle (step, angle) = wc'
   where
      wc'     = (step' > maxStep ? 0 $ step', angle')
      angle'  = step' > maxStep ? negate angle $ angle
      step'   = step + 1
      maxStep = 20