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} ] ) ] where advanceShoot = DoImpulses [UseItem, MoveForward 3] tcid cr = _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 _ = undefined --sentinelFireType f = -- chainCreatureUpdates -- [ 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 _ = undefined --sentinelExtraWatchUpdate xs = -- chainCreatureUpdates -- [ 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]]