module Dodge.Creature.SentinelAI ( sentinelAI , sentinelFireType , sentinelExtraWatchUpdate ) where import Dodge.Data import Dodge.Creature.ChainUpdates 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.Perception import Geometry.Data import Data.Maybe import Control.Lens sentinelAI :: World -> Creature -> Creature sentinelAI w = reloadOverride . sentinelExtraWatchUpdate [ (crHasTargetLOS , \ _ cr -> StrategyActions (ShootAt (fromJust $ tcid cr)) [ DoActionIf (const $ 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 } ] ) ] w 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) --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 , const reloadOverride , targetYouWhenCognizant , const $ overrideInternal (\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr) (crActionPlan . apStrategy .~ WatchAndWait) ] where drawwp = DoActionIfElse NoAction (const 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]]