Simplify creature update
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
module Dodge.Creature.State
|
||||
( stateUpdate
|
||||
( stateUpdate'
|
||||
, stateUpdateDamage
|
||||
, doDamage
|
||||
, clearDamage
|
||||
@@ -8,6 +8,7 @@ module Dodge.Creature.State
|
||||
import Dodge.Data
|
||||
import Dodge.Hammer
|
||||
import Dodge.Reloading
|
||||
|
||||
import Dodge.Base
|
||||
import Dodge.Creature.State.WalkCycle
|
||||
--import Dodge.Creature.Test
|
||||
@@ -38,20 +39,47 @@ import System.Random
|
||||
--import qualified Data.Vector as V
|
||||
--import qualified Data.Vector.Mutable as MV
|
||||
|
||||
-- | The movement is updated before the ai in order to correctly set the oldpos.
|
||||
foldCr :: [Creature -> World -> World]
|
||||
-> Creature -> World -> World
|
||||
foldCr xs cr w = foldr ($ cr) w xs
|
||||
|
||||
-- | this seems to work, but I am not sure about the ordering:
|
||||
-- previously, the movement was updated before the ai in order to correctly set the oldpos.
|
||||
-- This should be made more sensible: should the movement side effects apply to
|
||||
-- the creature before or after it has moved?
|
||||
-- currently invSideEffects are applied after the creature moves, to correctly
|
||||
-- update shield positions
|
||||
stateUpdate :: (Creature -> World -> (World -> World, Creature))
|
||||
-> Creature -> World -> World
|
||||
stateUpdate = stateUpdateDamage doDamage
|
||||
-- at what point invSideEffects is applied wrt to when the creature moves
|
||||
-- may effect whether the shield moves correctly
|
||||
stateUpdate' :: (Creature -> World -> World) -> Creature -> World -> World
|
||||
stateUpdate' f = foldCr
|
||||
[ checkDeath
|
||||
, doDamage
|
||||
, invSideEff
|
||||
, movementSideEff
|
||||
, moveCrHammerUp
|
||||
, stepReloading'
|
||||
, updateMovement'
|
||||
, f
|
||||
]
|
||||
|
||||
checkDeath :: Creature -> World -> World
|
||||
checkDeath cr
|
||||
| _crHP cr < 1 = creatures . at (_crID cr) .~ Nothing -- TODO add corpse
|
||||
| otherwise = id
|
||||
moveCrHammerUp :: Creature -> World -> World
|
||||
moveCrHammerUp cr = creatures . ix (_crID cr) . crHammerPosition %~ moveHammerUp
|
||||
|
||||
stepReloading' :: Creature -> World -> World
|
||||
stepReloading' cr = creatures . ix (_crID cr) %~ stepReloading
|
||||
|
||||
updateMovement' :: Creature -> World -> World
|
||||
updateMovement' cr = creatures . ix (_crID cr) %~ updateMovement
|
||||
|
||||
stateUpdateDamage :: (Creature -> World -> World)
|
||||
-> (Creature -> World -> (World -> World, Creature))
|
||||
-> Creature -> World -> World
|
||||
stateUpdateDamage damageupdate u cr w = damageupdate cr $
|
||||
invSideEff upcr . movementSideEff cr . deathEff . f $ w
|
||||
stateUpdateDamage damageupdate u cr w = damageupdate cr
|
||||
$ invSideEff upcr . movementSideEff cr . deathEff . f
|
||||
$ w
|
||||
& creatures . at (_crID cr) .~ (mvcrhammerup . stepReloading <$> crOrCorpse upcr)
|
||||
where
|
||||
(f,upcr) = u (updateMovement cr) w
|
||||
|
||||
Reference in New Issue
Block a user