77 lines
2.5 KiB
Haskell
77 lines
2.5 KiB
Haskell
module Dodge.Creature.LtAutoCrit
|
|
( ltAutoCrit
|
|
) where
|
|
import Dodge.Data
|
|
import Dodge.Default
|
|
import Dodge.Creature.Picture
|
|
import Dodge.Creature.Impulse
|
|
import Dodge.Creature.Action
|
|
import Dodge.Creature.Test
|
|
import Dodge.Creature.Volition
|
|
import Dodge.Creature.Strategy
|
|
--import Dodge.Creature.ChooseTarget
|
|
import Dodge.Creature.ReaderUpdate
|
|
import Dodge.Creature.Perception
|
|
import Dodge.Creature.State
|
|
--import Dodge.Creature.State.Data
|
|
import Dodge.Item.Weapon.BulletGuns
|
|
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.Reader
|
|
--import System.Random
|
|
|
|
ltAutoCrit :: Creature
|
|
ltAutoCrit = defaultCreature
|
|
{ _crPict = basicCrPict red
|
|
, _crUpdate = stateUpdate $ impulsiveAIR $
|
|
performActionsR
|
|
>=> watchUpdateStratR
|
|
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0)
|
|
[DoActionIf (not . crIsAiming) drawWeapon
|
|
,DoActionThen
|
|
(DoActionWhile crHasTargetLOS $ ArbitraryAction chooseMovement)
|
|
(DoImpulses [ChangeStrategy WatchAndWait])
|
|
]
|
|
)
|
|
, (crAwayFromPost, goToPostStrat)
|
|
]
|
|
>=> perceptionUpdate [0]
|
|
>=> doStrategyActionsR
|
|
>=> reloadOverrideR
|
|
>=> targetYouWhenCognizantR
|
|
>=> overrideInternalRRR
|
|
(\cr -> (&&) <$> crHasTargetR cr <*> crStratConMatchesR (GetTo (V2 0 0)) cr)
|
|
(pure . (crActionPlan . crStrategy .~ WatchAndWait))
|
|
, _crActionPlan = ActionPlan
|
|
{ _crImpulse = []
|
|
, _crAction = []
|
|
, _crStrategy = StrategyActions WatchAndWait [StartSentinelPost]
|
|
, _crGoal = []
|
|
}
|
|
, _crInv = IM.fromList [(0,ltAutoGun),(1,medkit 100)]
|
|
, _crInvSel = 0
|
|
, _crRad = 10
|
|
, _crHP = 500
|
|
}
|
|
|
|
chooseMovement :: Creature -> World -> Action
|
|
chooseMovement cr w
|
|
| dist cpos p > 200 = DoImpulses [UseItem,TurnToward p 0.05 , MoveForward 3]
|
|
| dist cpos p < 80 = DoImpulses [UseItem,TurnToward p 0.05, MoveForward (-3) ]
|
|
| errorAngleVV 22 (p' -.- cpos) (unitVectorAtAngle (_crDir cr)) < 0.4
|
|
= DoImpulses [UseItem,TurnToward p' 0.01, Move (V2 0 3)]
|
|
| otherwise
|
|
= DoImpulses [UseItem,TurnToward p' 0.05, Move (V2 0 3)]
|
|
where
|
|
cpos = _crPos cr
|
|
tcr = _creatures w IM.! 0
|
|
p = _crPos tcr
|
|
v = vNormal $ p -.- cpos
|
|
p' = p +.+ 0.5 *.* (v -.- 20 *.* normalizeV v)
|