137 lines
4.6 KiB
Haskell
137 lines
4.6 KiB
Haskell
module Dodge.Creature.SentinelAI (
|
|
sentinelAI,
|
|
sentinelFireType,
|
|
sentinelExtraWatchUpdate,
|
|
) where
|
|
|
|
import Control.Lens
|
|
import Data.Maybe
|
|
import Dodge.Creature.Action
|
|
import Dodge.Creature.ChainUpdates
|
|
import Dodge.Creature.Perception
|
|
import Dodge.Creature.ReaderUpdate
|
|
import Dodge.Creature.Strategy
|
|
import Dodge.Creature.Test
|
|
import Dodge.Creature.Volition
|
|
import Dodge.Data.CreatureEffect
|
|
import Dodge.Data.World
|
|
import Geometry.Data
|
|
|
|
sentinelAI :: World -> Creature -> Creature
|
|
--sentinelAI w =
|
|
sentinelAI =
|
|
sentinelExtraWatchUpdate
|
|
[
|
|
( crHasTargetLOS
|
|
, \_ cr ->
|
|
StrategyActions
|
|
(ShootAt (fromJust $ tcid cr))
|
|
[ DoActionIf
|
|
(WdCrNegate $ WdCrBlfromCrBl CrIsAiming)
|
|
(drawWeapon `DoActionThen` (50 `WaitThen` NoAction))
|
|
`DoActionThen` lostest
|
|
`DoActionWhile` advanceShoot
|
|
`DoActionThen` 75
|
|
`DoReplicate` advanceShoot
|
|
`DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]
|
|
, AimAt{_targetID = fromJust $ tcid cr, _targetSeenAt = V2 0 0}
|
|
]
|
|
)
|
|
]
|
|
-- w
|
|
where
|
|
advanceShoot = DoImpulses [UseItem, MoveForward 3]
|
|
tcid cr = _crID <$> _targetCr (_crIntention cr)
|
|
lostest = WdCrLOSTarget -- w' cr = maybe False (\cid -> canSee (_crID cr) cid w') (tcid cr)
|
|
|
|
--chainCreatureUpdates :: [World -> Creature -> Creature] -> World -> Creature -> Creature
|
|
--chainCreatureUpdates ls w cr = foldr (\f -> f w) cr ls
|
|
|
|
sentinelFireType :: (Int -> Action) -> World -> Creature -> Creature
|
|
sentinelFireType f =
|
|
chainCreatureUpdates
|
|
[ performActions
|
|
, watchUpdateStrat
|
|
[
|
|
( crHasTargetLOS
|
|
, \_ _ ->
|
|
StrategyActions
|
|
(ShootAt 0)
|
|
[ drawwp `DoActionThen` f 0 `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]
|
|
, aiming
|
|
]
|
|
)
|
|
, (const crAwayFromPost, const goToPostStrat)
|
|
]
|
|
, perceptionUpdate [0]
|
|
, -- , Left $ perceptionUp 0
|
|
const doStrategyActions
|
|
, targetYouWhenCognizant
|
|
, const $
|
|
overrideInternal
|
|
(\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
|
|
(crActionPlan . apStrategy .~ WatchAndWait)
|
|
]
|
|
where
|
|
drawwp = DoActionIfElse NoAction (WdCrBlfromCrBl CrIsAiming) (DoActionThen drawWeapon (WaitThen 50 NoAction))
|
|
aiming =
|
|
AimAt
|
|
{ _targetID = 0
|
|
, _targetSeenAt = V2 0 0 -- hack
|
|
}
|
|
|
|
sentinelExtraWatchUpdate ::
|
|
[(World -> Creature -> Bool, World -> Creature -> Strategy)] ->
|
|
World ->
|
|
Creature ->
|
|
Creature
|
|
sentinelExtraWatchUpdate xs =
|
|
chainCreatureUpdates
|
|
[ performActions
|
|
, watchUpdateStrat
|
|
(xs ++ [(const crAwayFromPost, const goToPostStrat)])
|
|
, perceptionUpdate [0]
|
|
, const doStrategyActions
|
|
, targetYouWhenCognizant
|
|
, const $
|
|
overrideInternal
|
|
(\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
|
|
(crActionPlan . apStrategy .~ WatchAndWait)
|
|
]
|
|
|
|
--shootAtAdvance :: Int -> [Action]
|
|
--shootAtAdvance tcid =
|
|
-- [ DoActionIfElse NoAction crIsAiming (DoActionThen drawWeapon (WaitThen 50 NoAction))
|
|
-- `DoActionThen`
|
|
-- lostest `DoActionWhile`
|
|
-- advanceShoot `DoActionThen`
|
|
-- 75 `DoReplicate`
|
|
-- advanceShoot `DoActionThen`
|
|
-- DoImpulses [ChangeStrategy WatchAndWait]
|
|
-- , AimAt
|
|
-- { _targetID = tcid
|
|
-- , _targetSeenAt = V2 0 0 -- hack
|
|
-- }
|
|
-- ]
|
|
-- where
|
|
-- lostest (w,cr') = canSee (_crID cr') tcid w
|
|
-- advanceShoot = ImpulsesList [[UseItem, MoveForward 3]]
|
|
--
|
|
--shootAtWhileContinueTime :: Int -> World -> Creature -> Strategy
|
|
--shootAtWhileContinueTime tcid _ _ = StrategyActions (ShootAt tcid)
|
|
-- [ DoActionIfElse NoAction crIsAiming (DoActionThen drawWeapon (WaitThen 50 NoAction))
|
|
-- `DoActionThen`
|
|
-- lostest `DoActionWhile`
|
|
-- advanceShoot `DoActionThen`
|
|
-- 75 `DoReplicate`
|
|
-- advanceShoot `DoActionThen`
|
|
-- DoImpulses [ChangeStrategy WatchAndWait]
|
|
-- , AimAt
|
|
-- { _targetID = tcid
|
|
-- , _targetSeenAt = V2 0 0 -- hack
|
|
-- }
|
|
-- ]
|
|
-- where
|
|
-- lostest (w,cr') = canSee (_crID cr') tcid w
|
|
-- advanceShoot = ImpulsesList [[UseItem, MoveForward 3]]
|