Simplify creature update

This commit is contained in:
2022-04-07 19:40:12 +01:00
parent 7ca9afeb5f
commit ac74ae0ed1
17 changed files with 104 additions and 45 deletions
+37 -9
View File
@@ -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