module Dodge.Creature.SpreadGunCrit ( spreadGunCrit ) where import Dodge.Data import Dodge.Default import Dodge.Creature.Picture import Dodge.Creature.Test import Dodge.Creature.ActionRat import Dodge.Creature.ChooseTarget import Dodge.Creature.SetTarget import Dodge.Creature.Rationality import Dodge.Creature.AlertLevel import Dodge.Creature.State import Dodge.Creature.State.Data import Dodge.Item.Weapon import Dodge.Item.Consumable import Geometry import Picture import Dodge.RandomHelp import Data.Maybe import qualified Data.IntMap.Strict as IM import Control.Lens import Control.Monad.State import System.Random spreadGunCrit :: Creature spreadGunCrit = defaultCreature { _crPict = basicCrPict red , _crUpdate = stateUpdate $ impulsiveAI $ composeInternalAIs [ performActions , watchUpdateStrat [ (crHasTargetLOS, \w cr -> StrategyActions (ShootAt 0) [DoActionIf (not . crIsAiming) DrawWeapon ,DoActionThen (DoActionWhile crHasTargetLOS $ ArbitraryAction chooseMovement) (DoImpulses [ChangeStrategy WatchAndWait]) ] ) , (crAwayFromPost, goToPostStrat) ] , basicPerceptionUpdate [0] , doStrategyActions , reloadOverride , targetYouWhenCognizant , overrideInternal (onBoth (&&) crHasTarget (crStratConMatches (GetTo (0,0)))) $ \ _ -> crActionPlan . crStrategy .~ WatchAndWait ] , _crActionPlan = ActionPlan { _crImpulse = [] , _crAction = [] , _crStrategy = StrategyActions WatchAndWait [StartSentinelPost] , _crGoal = [] } , _crInv = IM.fromList [(0,spreadGun),(1,medkit 100)] , _crInvSel = 0 , _crRad = 10 , _crHP = 500 } chooseMovement :: Creature -> World -> Action chooseMovement cr w | dist cpos p < 30 && safeAngleVV (p -.- cpos) (unitVectorAtAngle (_crDir cr)) > pi = DoImpulses [UseItem, MoveForward (-3)] | d < 30 = DoImpulses [UseItem,TurnToward p 0.06] | d < 60 = DoImpulses [UseItem,TurnToward p 0.06,MoveForward 3] | d < 100 = DoImpulses [TurnToward p 0.06, MoveForward 3 ] | d < 200 = DoImpulses [TurnToward p (0.06 + 0.002 *(d-100)), MoveForward 3 ] | otherwise = DoImpulses [TurnToward p 0.26, MoveForward 3] where d = dist cpos p cpos = _crPos cr tcr = _creatures w IM.! 0 p = _crPos tcr