module Dodge.Creature.LauncherCrit ( launcherCrit ) where import Dodge.Data import Dodge.Default import Dodge.Creature.Picture import Dodge.Creature.Test import Dodge.Creature.Volition import Dodge.Creature.ActionRat --import Dodge.Creature.ChooseTarget import Dodge.Creature.ReaderUpdate import Dodge.Creature.Rationality import Dodge.Creature.AlertLevel import Dodge.Creature.State --import Dodge.Creature.State.Data import Dodge.Item.Weapon.Launcher --import Dodge.Item.Consumable import Geometry.Data import Picture import qualified Data.IntMap.Strict as IM import Control.Lens import Control.Monad.Reader launcherCrit :: Creature launcherCrit = defaultCreature { _crPict = basicCrPict red , _crUpdate = stateUpdate $ impulsiveAIR $ performActionsR >=> watchUpdateStratR [ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0) [retreatFire]) , (crAwayFromPost, goToPostStrat) ] >=> basicPerceptionUpdateR [0] >=> doStrategyActionsR >=> reloadOverrideR >=> targetYouWhenCognizantR >=> overrideInternalR (onBoth (&&) crHasTarget (crStratConMatches (GetTo (V2 0 0)))) (\ _ -> crActionPlan . crStrategy .~ WatchAndWait) , _crActionPlan = ActionPlan { _crImpulse = [] , _crAction = [] , _crStrategy = StrategyActions WatchAndWait [StartSentinelPost] , _crGoal = [] } , _crInv = IM.fromList [(0,launcher)] , _crInvSel = 0 , _crRad = 10 , _crState = defaultState , _crHP = 300 } retreatFire :: Action retreatFire = ImpulsesList ( [ UseItem ] : replicate 20 [ Turn 0.16 ]) `DoActionThen` holsterWeapon `DoActionThen` ImpulsesList ( replicate 30 [ MoveForward 3 ]) `DoActionThen` drawWeapon `DoActionThen` ImpulsesList ( [UseItem] : replicate 20 [ Turn $ negate 0.16 ] ) `DoActionThen` holsterWeapon `DoActionThen` ImpulsesList ( replicate 15 [ MoveForward 3 ] ) `DoActionThen` drawWeapon `DoActionThen` ImpulsesList ( replicate 100 [UseItem, ImpulseUseTarget $ \tcr -> TurnToward (_crPos tcr) (pi/16) ] ) `DoActionThen` 20 `WaitThen` holsterWeapon `DoActionThen` ImpulsesList ( replicate 15 [ MoveForward 3 ] ) `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]