module Dodge.Creature.SentinelAI ( sentinelAI , sentinelFireType , sentinelFireTypeR , sentinelExtraWatchUpdate ) 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.Perception import Geometry.Data import Data.Maybe 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) --chainCreatureUpdates :: [World -> Creature -> Creature] -> World -> Creature -> Creature --chainCreatureUpdates ls w cr = foldr (\f -> f w) cr ls chainCreatureUpdatesLR :: [Either (World -> Creature -> Creature) (Creature -> Creature)] -> World -> Creature -> Creature chainCreatureUpdatesLR ls w cr = foldr unf cr ls where unf (Left g) = g w unf (Right g) = g sentinelFireType :: (Int -> Action) -> World -> Creature -> Creature sentinelFireType f = chainCreatureUpdatesLR [ Left performActions , Left $ watchUpdateStrat [ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0) [ drawwp `DoActionThen` f 0 `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait] , aiming ] ) , (crAwayFromPost, goToPostStrat) ] , Left $ perceptionUpdate' [0] -- , Left $ perceptionUp 0 , Right doStrategyActions , Right reloadOverride , Left targetYouWhenCognizant , Right $ overrideInternal (\cr -> crHasTarget' cr && crStratConMatches' (GetTo (V2 0 0)) cr) (crActionPlan . crStrategy .~ WatchAndWait) ] where drawwp = DoActionIfElse NoAction crIsAiming (DoActionThen drawWeapon (WaitThen 50 NoAction)) aiming = AimAt { _targetID = 0 , _targetSeenAt = V2 0 0 -- hack } sentinelFireTypeR :: (Int -> Action) -> Creature -> Reader World Creature sentinelFireTypeR 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]]