114 lines
3.6 KiB
Haskell
114 lines
3.6 KiB
Haskell
module Dodge.Creature.PistolCrit
|
|
( pistolCrit
|
|
) where
|
|
import Dodge.Data
|
|
import Dodge.Default
|
|
import Dodge.Creature.Picture
|
|
import Dodge.Creature.Update
|
|
import Dodge.Creature.Test
|
|
import Dodge.Creature.Action
|
|
import Dodge.Creature.Volition
|
|
import Dodge.Creature.Strategy
|
|
import Dodge.Creature.ReaderUpdate
|
|
import Dodge.Creature.Perception
|
|
--import Dodge.Creature.State.Data
|
|
import Dodge.Item.Weapon.BulletGuns
|
|
import Dodge.Item.Consumable
|
|
import Geometry
|
|
import Picture
|
|
import RandomHelp
|
|
|
|
import Data.Maybe
|
|
import qualified Data.IntMap.Strict as IM
|
|
import Control.Lens
|
|
|
|
pistolCrit :: Creature
|
|
pistolCrit = defaultCreature
|
|
{ _crPict = basicCrPict
|
|
, _crUpdate = defaultImpulsive
|
|
[ performActions
|
|
, watchUpdateStrat
|
|
[ (crHasTargetLOS, \w cr -> StrategyActions (ShootAt 0)
|
|
[DoActionIf (const $ not . crIsAiming) drawWeapon,chooseMovement cr w])
|
|
, (const crAwayFromPost, const goToPostStrat)
|
|
]
|
|
, perceptionUpdate [0]
|
|
, const doStrategyActions
|
|
, const reloadOverride
|
|
, targetYouWhenCognizant
|
|
, const $ overrideInternal
|
|
(\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
|
|
(crActionPlan . apStrategy .~ WatchAndWait)
|
|
]
|
|
, _crInv = IM.fromList [(0,pistol),(1,medkit 100)]
|
|
, _crRad = 10
|
|
, _crHP = 500
|
|
}
|
|
& crSkin . skinUpper .~ light4 red
|
|
chooseMovement :: Creature -> World -> Action
|
|
chooseMovement cr w = chooseMovement' cr w
|
|
`DoActionThen`
|
|
DoImpulses [ChangeStrategy WatchAndWait]
|
|
|
|
chooseMovement' :: Creature -> World -> Action
|
|
chooseMovement' cr w = takeOneWeighted [chargeProb,retreatProb,strafeProb,strafeProb]
|
|
[chargeActions
|
|
,retreatActions ycr cr
|
|
,strafeLeftActions
|
|
,strafeRightActions
|
|
] & evalState $ g
|
|
where
|
|
g = _randGen w
|
|
cpos = _crPos cr
|
|
ycr = _creatures w IM.! 0
|
|
ypos = _crPos ycr
|
|
chargeProb | dist cpos ypos > 300 = 5
|
|
| dist cpos ypos > 150 = 1
|
|
| otherwise = 0
|
|
strafeProb | dist cpos ypos > 150 = 1
|
|
| otherwise = 0
|
|
retreatProb | dist cpos ypos < 200 = 1 :: Float
|
|
| otherwise = 0
|
|
chargeActions =
|
|
[TurnToward ypos 0.1]
|
|
`DoImpulsesAlongside`
|
|
3
|
|
`DoReplicate`
|
|
ImpulsesList (replicate 9 [Move (V2 3 0)] ++ [[Move (V2 3 0),UseItem]])
|
|
strafeLeftActions =
|
|
DoImpulses [TurnToward yposr (2*pi)]
|
|
`DoActionThen`
|
|
3
|
|
`DoReplicate`
|
|
ImpulsesList (replicate 9 [Move (V2 0 3)] ++ [[Move (V2 0 3),UseItem]])
|
|
strafeRightActions =
|
|
DoImpulses [TurnToward yposl (2*pi)]
|
|
`DoActionThen`
|
|
3
|
|
`DoReplicate`
|
|
ImpulsesList (replicate 9 [Move (V2 0 (-3))] ++ [[Move (V2 0 (-3)),UseItem]])
|
|
yposl = ypos -.- 100 *.* vNormal (normalizeV $ ypos -.- cpos)
|
|
yposr = ypos +.+ 100 *.* vNormal (normalizeV $ ypos -.- cpos)
|
|
|
|
retreatActions :: Creature -> Creature -> Action
|
|
retreatActions tcr cr =
|
|
[TurnToward retreatOffset 0.2]
|
|
`DoImpulsesAlongside`
|
|
3
|
|
`DoReplicate`
|
|
ImpulsesList (replicate 9 [Move (V2 (-3) 0)] ++ [[UseItem]])
|
|
where
|
|
cpos = _crPos cr
|
|
tpos = _crPos tcr
|
|
retreatOffset =
|
|
let a | dist cpos tpos < 50 = 0
|
|
| isLeftOfA (_crDir cr) (argV $ tpos -.- cpos)
|
|
= -0.7
|
|
| otherwise = 0.7
|
|
in fromMaybe tpos $ intersectLineLine' cpos
|
|
(cpos +.+ rotateV a (tpos -.- cpos))
|
|
tpos
|
|
(tpos +.+ vNormal (cpos -.- tpos))
|
|
|
|
|