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]]