122 lines
3.9 KiB
Haskell
122 lines
3.9 KiB
Haskell
module Dodge.Creature.SentinelAI
|
|
where
|
|
import Dodge.Data
|
|
import Dodge.Base.Collide
|
|
import Dodge.Creature.Test
|
|
import Dodge.Creature.Volition
|
|
import Dodge.Creature.ReaderUpdate
|
|
import Dodge.Creature.Strategy
|
|
import Dodge.Creature.Action
|
|
--import Dodge.Creature.ChooseTarget
|
|
import Dodge.Creature.Perception
|
|
--import Dodge.Creature.State
|
|
--import Dodge.Creature.State.Data
|
|
import Geometry.Data
|
|
--import Picture
|
|
--import Dodge.RandomHelp
|
|
|
|
import Data.Maybe
|
|
--import qualified Data.IntMap.Strict as IM
|
|
import Control.Lens
|
|
import Control.Monad
|
|
import Control.Monad.Reader
|
|
|
|
sentinelAI :: Creature -> Reader World Creature
|
|
sentinelAI = sentinelExtraWatchUpdate
|
|
[ (crHasTargetLOS
|
|
, \ _ cr -> StrategyActions (ShootAt (fromJust $ tcid cr))
|
|
[ DoActionIf
|
|
(not . 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 }
|
|
]
|
|
)
|
|
]
|
|
>=> reloadOverrideR
|
|
where
|
|
advanceShoot = DoImpulses [UseItem, MoveForward 3]
|
|
tcid cr = _crID <$> _targetCr (_crIntention cr)
|
|
lostest (w,cr) = maybe False (\cid -> canSee (_crID cr) cid w) (tcid cr)
|
|
|
|
sentinelFireType
|
|
:: (Int -> Action)
|
|
-> Creature
|
|
-> Reader World Creature
|
|
sentinelFireType f = performActionsR
|
|
>=> watchUpdateStratR
|
|
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0)
|
|
[ drawwp `DoActionThen` f 0 `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]
|
|
, aiming
|
|
]
|
|
)
|
|
, (crAwayFromPost, goToPostStrat)
|
|
]
|
|
>=> perceptionUpdate [0]
|
|
>=> doStrategyActionsR
|
|
>=> reloadOverrideR
|
|
>=> targetYouWhenCognizantR
|
|
>=> overrideInternalRRR
|
|
(\cr -> (&&) <$> crHasTargetR cr <*> crStratConMatchesR (GetTo (V2 0 0)) cr)
|
|
(pure . (crActionPlan . crStrategy .~ WatchAndWait))
|
|
where
|
|
drawwp = DoActionIfElse NoAction crIsAiming (DoActionThen drawWeapon (WaitThen 50 NoAction))
|
|
aiming = AimAt
|
|
{ _targetID = 0
|
|
, _targetSeenAt = V2 0 0 -- hack
|
|
}
|
|
|
|
sentinelExtraWatchUpdate
|
|
:: [((World, Creature) -> Bool , World -> Creature -> Strategy)]
|
|
-> Creature
|
|
-> Reader World Creature
|
|
sentinelExtraWatchUpdate xs = performActionsR
|
|
>=> watchUpdateStratR
|
|
( xs ++ [(crAwayFromPost, goToPostStrat)] )
|
|
>=> perceptionUpdate [0]
|
|
>=> doStrategyActionsR
|
|
>=> targetYouWhenCognizantR
|
|
>=> overrideInternalRRR
|
|
(\cr -> (&&) <$> crHasTargetR cr <*> crStratConMatchesR (GetTo (V2 0 0)) cr)
|
|
(pure . (crActionPlan . crStrategy .~ 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]]
|