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
+5 -4
View File
@@ -3,12 +3,13 @@ module Dodge.Creature.ArmourChase
) where
import Dodge.Data
import Dodge.Default
import Dodge.Creature.State
import Dodge.Creature.ChainUpdates
--import Dodge.Creature.State
import Dodge.Creature.Update
--import Dodge.Creature.ChainUpdates
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Perception
import Dodge.Creature.Picture
import Dodge.Creature.Impulse
--import Dodge.Creature.Impulse
import Dodge.Creature.Action
import Dodge.Item.Equipment
import Dodge.Item.Consumable
@@ -19,7 +20,7 @@ import Control.Lens
armourChaseCrit :: Creature
armourChaseCrit = defaultCreature
{ _crUpdate = stateUpdate $ impulsiveAI $ chainCreatureUpdates
{ _crUpdate = defaultImpulsive
[ watchUpdateStrat []
, const doStrategyActions
, performActions
+4 -3
View File
@@ -4,10 +4,11 @@ module Dodge.Creature.AutoCrit
import Dodge.Data
import Dodge.Default
import Dodge.Creature.Picture
import Dodge.Creature.Update
import Dodge.Creature.SentinelAI
--import Dodge.Creature.ChooseTarget
import Dodge.Creature.Impulse
import Dodge.Creature.State
--import Dodge.Creature.Impulse
--import Dodge.Creature.State
--import Dodge.Creature.State.Data
import Dodge.Item.Weapon.BulletGuns
import Dodge.Item.Consumable
@@ -21,7 +22,7 @@ import qualified Data.IntMap.Strict as IM
autoCrit :: Creature
autoCrit = defaultCreature
{ _crPict = basicCrPict red
, _crUpdate = stateUpdate $ impulsiveAI sentinelAI
, _crUpdate = defaultImpulsive [sentinelAI]
, _crActionPlan = ActionPlan
{ _crImpulse = []
, _crAction = []
+1 -1
View File
@@ -33,7 +33,7 @@ smallChaseCrit = chaseCrit
}
chaseCrit :: Creature
chaseCrit = defaultCreature
{ _crUpdate = stateUpdate $ impulsiveAI $ chainCreatureUpdates
{ _crUpdate = stateUpdate' $ impulsiveAI' $ chainCreatureUpdates
[ const doStrategyActions
, performActions
, const overrideMeleeCloseTarget
+3
View File
@@ -11,6 +11,9 @@ import Control.Monad.State
--import System.Random
import Data.List
applyNoDamage :: [Damage] -> Creature -> World -> World
applyNoDamage _ _ = id
defaultApplyDamage :: [Damage] -> Creature -> World -> World
defaultApplyDamage ds cr w = foldl' (applyIndividualDamage cr) w ds'
& creatures . ix (_crID cr) %~ doPoisonDam
+13
View File
@@ -1,8 +1,10 @@
{-# LANGUAGE TupleSections #-}
module Dodge.Creature.Impulse
( impulsiveAI
, impulsiveAI'
, followImpulses
, followThenClearImpulses
, followThenClearImpulses'
) where
import Dodge.Data
import Dodge.Creature.Vocalization
@@ -17,6 +19,12 @@ import System.Random
import Data.Bifunctor
--import Data.Maybe
impulsiveAI' :: (World -> Creature -> Creature)
-> Creature -> World -> World
impulsiveAI' f cr w = g w & creatures . ix (_crID cr) .~ cr'
where
(g,cr') = impulsiveAI f cr w
impulsiveAI
:: (World -> Creature -> Creature) -- | internal creature update
-> Creature
@@ -24,6 +32,11 @@ impulsiveAI
-> (World -> World , Creature)
impulsiveAI f cr w = followImpulses w $ f w cr
followThenClearImpulses' :: Creature -> World -> World
followThenClearImpulses' cr w = f w & creatures . ix (_crID cr) .~ cr'
where
(f,cr') = followThenClearImpulses w cr
followThenClearImpulses :: World -> Creature -> (World -> World, Creature)
followThenClearImpulses w = second f . followImpulses w
where
+5 -4
View File
@@ -5,15 +5,16 @@ module Dodge.Creature.LauncherCrit
import Dodge.Data
import Dodge.Default
import Dodge.Creature.Picture
import Dodge.Creature.ChainUpdates
--import Dodge.Creature.ChainUpdates
import Dodge.Creature.Test
import Dodge.Creature.Volition
import Dodge.Creature.Strategy
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Perception
import Dodge.Creature.State
--import Dodge.Creature.State
import Dodge.Creature.Update
import Dodge.Item.Weapon.Launcher
import Dodge.Creature.Impulse
--import Dodge.Creature.Impulse
import Dodge.Creature.Action
import Geometry.Data
import Picture
@@ -24,7 +25,7 @@ import Control.Lens
launcherCrit :: Creature
launcherCrit = defaultCreature
{ _crPict = basicCrPict red
, _crUpdate = stateUpdate $ impulsiveAI $ chainCreatureUpdates
, _crUpdate = defaultImpulsive
[ performActions
, watchUpdateStrat
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0) [retreatFire])
+1 -1
View File
@@ -26,7 +26,7 @@ import Control.Lens
ltAutoCrit :: Creature
ltAutoCrit = defaultCreature
{ _crPict = basicCrPict red
, _crUpdate = stateUpdate $ impulsiveAI $ chainCreatureUpdates
, _crUpdate = stateUpdate' $ impulsiveAI' $ chainCreatureUpdates
[ performActions
, watchUpdateStrat
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0)
+1 -1
View File
@@ -29,7 +29,7 @@ import Control.Monad.State
pistolCrit :: Creature
pistolCrit = defaultCreature
{ _crPict = basicCrPict red
, _crUpdate = stateUpdate $ impulsiveAI $ chainCreatureUpdates
, _crUpdate = stateUpdate' $ impulsiveAI' $ chainCreatureUpdates
[ performActions
, watchUpdateStrat
[ (crHasTargetLOS, \w cr -> StrategyActions (ShootAt 0)
+1 -1
View File
@@ -27,7 +27,7 @@ import Control.Lens
spreadGunCrit :: Creature
spreadGunCrit = defaultCreature
{ _crPict = basicCrPict red
, _crUpdate = stateUpdate $ impulsiveAI $ chainCreatureUpdates
, _crUpdate = stateUpdate' $ impulsiveAI' $ chainCreatureUpdates
[performActions
,watchUpdateStrat
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0)
+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
+6 -6
View File
@@ -1,16 +1,16 @@
module Dodge.Creature.SwarmCrit
( swarmCrit
)
where
) where
import Dodge.Data
import Dodge.Default
import Dodge.Creature.Picture
import Dodge.Creature.ChainUpdates
import Dodge.Creature.Update
--import Dodge.Creature.ChainUpdates
import Dodge.Creature.Boid
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Perception
import Dodge.Creature.Impulse
import Dodge.Creature.State
--import Dodge.Creature.Impulse
--import Dodge.Creature.State
import Dodge.Picture.Layer
import Picture
@@ -18,7 +18,7 @@ import Control.Lens
swarmCrit :: Creature
swarmCrit = defaultCreature
{ _crUpdate = stateUpdate $ impulsiveAI $ chainCreatureUpdates
{ _crUpdate = defaultImpulsive
[ flockToPointUsing' (encircleDistP 100) (meleeHeadingMove 0.1 0.1 (pi/4) 3.9)
, const (crMeleeCooldown %~ max 0 . subtract 1)
, perceptionUpdate [0]
+8 -1
View File
@@ -1,5 +1,6 @@
module Dodge.Creature.YourControl
( yourControl
(-- yourControl
yourControl'
) where
import Dodge.Data
import Dodge.Creature.Impulse.Movement
@@ -23,6 +24,12 @@ yourControl cr w =
)
where
speed = _mvSpeed $ _crMvType cr
yourControl' :: Creature -> World -> World
yourControl' cr w = w
& updateUsingInput
& creatures . ix (_crID cr) %~ (mouseActionsCr (_mouseButtons w) . wasdWithAiming w speed 0)
where
speed = _mvSpeed $ _crMvType cr
{- | Turn key presses into creature movement. -}
wasdWithAiming