Remove Reader monad from armour chase crit's ai

This commit is contained in:
2021-12-11 18:40:13 +00:00
parent 154abf0bad
commit e698695842
2 changed files with 72 additions and 12 deletions
+58
View File
@@ -3,9 +3,11 @@ module Dodge.Creature.ReaderUpdate
( doStrategyActionsR
, doStrategyActions
, setTargetMv
, setTargetMv'
, targetYouWhenCognizantR
, targetYouWhenCognizant
, overrideMeleeCloseTargetR
, overrideMeleeCloseTarget
, watchUpdateStratR
, watchUpdateStrat
, reloadOverrideR
@@ -13,7 +15,9 @@ module Dodge.Creature.ReaderUpdate
, overrideInternalRRR
, overrideInternal
, goToTarget
, goToTarget'
, flockACCR
, flockACC
, setMvPos
, setViewPos
)
@@ -37,6 +41,9 @@ overrideMeleeCloseTargetR
-> Reader World Creature
overrideMeleeCloseTargetR cr = return $ maybe cr (tryMeleeAttack cr) (_targetCr $ _crIntention cr)
overrideMeleeCloseTarget :: Creature -> Creature
overrideMeleeCloseTarget cr = maybe cr (tryMeleeAttack cr) (_targetCr $ _crIntention cr)
tryMeleeAttack :: Creature -> Creature -> Creature
tryMeleeAttack cr tcr
| _crMeleeCooldown cr == 0
@@ -70,6 +77,18 @@ setTargetMv targFunc cr = do
case targ of
Nothing -> pure cr
Just crTarg -> pure $ cr & crIntention . mvToPoint ?~ _crPos crTarg
setTargetMv'
:: (World -> Creature -> Maybe Creature) -- ^ Function for determining target
-> World
-> Creature
-> Creature
setTargetMv' targFunc w cr = maybe cr (\ctarg -> cr & crIntention . mvToPoint ?~ _crPos ctarg)
(targFunc w cr)
-- targ <- targFunc cr
-- case targ of
-- Nothing -> pure cr
-- Just crTarg -> pure $ cr & crIntention . mvToPoint ?~ _crPos crTarg
flockACCR :: Creature -> Reader World Creature
flockACCR cr = do
case cr ^? crIntention . targetCr . _Just of
@@ -93,12 +112,51 @@ flockACCR cr = do
else negate r *.* horDir
pure $ cr & crIntention . mvToPoint ?~ tpos +.+ horShift
-- fugly
flockACC :: World -> Creature -> Creature
flockACC w cr = case cr ^? crIntention . targetCr . _Just of
Nothing -> cr
Just tcr ->
let tpos = _crPos tcr
cpos = _crPos cr
isFarACC cr' = _crGroup cr' == _crGroup cr
&& _crID cr' /= _crID cr
&& dist (_crPos cr') tpos > dist cpos tpos
nearACCs = IM.filter isFarACC $ creaturesNearPointI 5 cpos w
macr = safeMinimumOn (dist cpos . _crPos) nearACCs
in case macr of
Nothing -> cr
Just acr ->
let r = _crRad acr + _crRad cr + 10
horDir = normalizeV (vNormal (cpos -.- tpos))
horShift = if isLHS tpos cpos (_crPos acr)
then r *.* horDir
else negate r *.* horDir
in cr & crIntention . mvToPoint ?~ tpos +.+ horShift
goToTarget :: Creature -> Reader World Creature
goToTarget cr = do
case cr ^? crIntention . mvToPoint . _Just of
Just p -> pure $ cr & crActionPlan . crAction .~ [PathTo p]
_ -> viewTarget cr
goToTarget' :: World -> Creature -> Creature
goToTarget' w cr =
case cr ^? crIntention . mvToPoint . _Just of
Just p -> cr & crActionPlan . crAction .~ [PathTo p]
_ -> viewTarget' w cr
viewTarget' :: World -> Creature -> Creature
viewTarget' w cr = do
case cr ^? crIntention . viewPoint . _Just of
Just p | hasLOSIndirect p (_crPos cr) w -> cr'
& crActionPlan . crAction %~ replaceNullWith (TurnToA p)
& crIntention . viewPoint .~ Nothing
| otherwise -> cr' & crActionPlan . crAction %~ replaceNullWith (PathTo p)
Nothing -> cr & crPerception . crAwakeLevel .~ Lethargic
where
cr' = cr & crPerception . crAwakeLevel .~ Vigilant
viewTarget :: Creature -> Reader World Creature
viewTarget cr = do
w <- ask