diff --git a/src/Dodge/Creature/Perception.hs b/src/Dodge/Creature/Perception.hs index 621380b96..c8b5161db 100644 --- a/src/Dodge/Creature/Perception.hs +++ b/src/Dodge/Creature/Perception.hs @@ -2,8 +2,10 @@ module Dodge.Creature.Perception ( perceptionUpdate, chaseCritPerceptionUpdate, + visionCheck, ) where +import Linear import Control.Lens import qualified Data.Map.Strict as M import Data.Maybe @@ -152,7 +154,8 @@ visionCheck cr tpos = doFloatFloat (_viFOV vi) ang * doFloatFloat (_viDist vi) d where vi = _cpVision $ _crPerception cr cpos = _crPos cr - ang = angleVV (unitVectorAtAngle (_crDir cr)) (tpos - cpos) + dirvec = unitVectorAtAngle (_crDir cr) + ang = angleVV dirvec (tpos - (cpos - _crRad cr *^ dirvec)) d = dist tpos cpos diff --git a/src/Dodge/Creature/ReaderUpdate.hs b/src/Dodge/Creature/ReaderUpdate.hs index 1b4e1d474..43f511a8d 100644 --- a/src/Dodge/Creature/ReaderUpdate.hs +++ b/src/Dodge/Creature/ReaderUpdate.hs @@ -14,6 +14,9 @@ module Dodge.Creature.ReaderUpdate ( setViewPos, ) where +import Dodge.Creature.Perception +import qualified IntMapHelp as IM +import Data.List (sortOn) import Control.Applicative import Control.Lens import Control.Monad @@ -51,11 +54,19 @@ setMvPos w cr = cr & crIntention . mvToPoint .~ mpos return $ tpos mpos = mtpos <|> _mvToPoint int -setViewPos :: Creature -> Creature -setViewPos cr = cr & crIntention . viewPoint %~ (<|> mpos) +setViewPos :: World -> Creature -> Creature +setViewPos w cr = cr & crIntention . viewPoint %~ ((<|> mpos) . (attentionViewPoint w cr <|>)) where mpos = listToMaybe (_soundsToInvestigate $ _crMemory cr) +attentionViewPoint :: World -> Creature -> Maybe Point2 +attentionViewPoint w cr = do + attention <- cr ^? crPerception . cpAttention . getAttentiveTo + cid <- (sortOn snd $ IM.toList attention) ^? ix 0 . _1 + tcr <- w ^? cWorld . lWorld . creatures . ix cid + guard $ visionCheck cr (_crPos tcr) > 0 + return (_crPos tcr) + setTargetMv :: -- | Function for determining target (World -> Creature -> Maybe Creature) -> @@ -120,9 +131,10 @@ viewTarget w cr = case cr ^? crIntention . viewPoint . _Just of | hasLOSIndirect p (_crPos cr) w -> cr & crActionPlan . apAction - %~ replaceNullWith - ( TurnToPoint p - ) + .~ [TurnToPoint p] +-- %~ replaceNullWith +-- ( TurnToPoint p +-- ) & crIntention . viewPoint .~ Nothing | otherwise -> cr & crActionPlan . apAction %~ replaceNullWith (PathTo p) Nothing -> cr diff --git a/src/Dodge/Data/FloatFunction.hs b/src/Dodge/Data/FloatFunction.hs index cbed9413f..4918f3a44 100644 --- a/src/Dodge/Data/FloatFunction.hs +++ b/src/Dodge/Data/FloatFunction.hs @@ -12,7 +12,7 @@ data FloatFloat = FloatID | FloatFOV Float | FloatLessCheck Float - | FloatDistLinearMaxMin Float Float Float + | FloatDistLinearNearFar Float Float Float | FloatAbsCheckGreaterLess Float Float Float | FloatConst Float deriving (Eq, Ord, Show, Read) --Generic, Flat) diff --git a/src/Dodge/Default/Creature.hs b/src/Dodge/Default/Creature.hs index fc7e4874f..2aa64e8c2 100644 --- a/src/Dodge/Default/Creature.hs +++ b/src/Dodge/Default/Creature.hs @@ -92,8 +92,7 @@ defaultVision :: Vision defaultVision = Eyes { _viFOV = FloatFOV 0.8 - --, _viDist = FloatLessCheck 500 - , _viDist = FloatDistLinearMaxMin 500 10 1 + , _viDist = FloatDistLinearNearFar 500 10 1 } defaultAudition :: Audition diff --git a/src/Dodge/FloatFunction.hs b/src/Dodge/FloatFunction.hs index 8a221044f..763b96481 100644 --- a/src/Dodge/FloatFunction.hs +++ b/src/Dodge/FloatFunction.hs @@ -12,7 +12,7 @@ doFloatFloat ff x = case ff of FloatLessCheck y | x > y -> 0 | otherwise -> 1 - FloatDistLinearMaxMin maxd a b + FloatDistLinearNearFar maxd a b | x > maxd -> 0 | otherwise -> (a * (maxd - x) + b * (x - maxd)) / maxd FloatAbsCheckGreaterLess a y1 y2 diff --git a/src/Dodge/Humanoid.hs b/src/Dodge/Humanoid.hs index af5c1e72f..96ba8fa5d 100644 --- a/src/Dodge/Humanoid.hs +++ b/src/Dodge/Humanoid.hs @@ -16,7 +16,7 @@ updateHumanoid cr = case cr ^?! crType . humanoidAI of [ const doStrategyActions , performActions , const overrideMeleeCloseTarget - , const setViewPos + , setViewPos , setMvPos , chaseCritMv , chaseCritPerceptionUpdate [0]