Files
loop/src/Dodge/CreatureEffect.hs
T

99 lines
3.6 KiB
Haskell

module Dodge.CreatureEffect where
import Linear
--import Data.Maybe
import Dodge.Base.Collide
import Dodge.Creature.Test
import Dodge.Data.CreatureEffect
import Dodge.Data.World
--import Dodge.Path
import Geometry
import Control.Lens
doCrImp :: CrImp -> Creature -> Impulse
doCrImp ci = case ci of
NoCrImp -> const ImpulseNothing
TurnTowardCr x -> \cr -> TurnToward (cr ^. crPos . _xy) x
doWdCrBl :: WdCrBl -> World -> Creature -> Bool
doWdCrBl wcb = case wcb of
WdCrTrue -> const $ const True
WdCrBlfromCrBl cb -> \_ cr -> doCrBl cb cr
WdCrNegate wcb' -> \w -> not . doWdCrBl wcb' w
WdCrLOSTarget -> \w cr ->
maybe
False
(\cid -> canSee (_crID cr) cid w)
(_targetCr (_crIntention cr))
WdCrSafeDistFromTarget x -> (`crSafeDistFromTarg` x) -- currently ignores walls etc
doCrBl :: CrBl -> Creature -> Bool
doCrBl cb = case cb of
-- CrCanShoot -> crCanShoot
-- CrIsReloading -> crIsReloading
CrCanShoot -> error "got rid of crCanShoot"
CrIsAiming -> crIsAiming
CrIsAnimate -> isAnimate
CrOpenAutoDoor -> \cr -> isAnimate cr && hasAutoDoorBody cr
doCrAc :: CrAc -> Creature -> Action
doCrAc ca = case ca of
CrTurnAround -> \cr -> TurnToPoint
(cr ^. crPos . _xy -.- 10 *.* unitVectorAtAngle (_crDir cr))
-- CrFleeFromTarget -> fleeFromTarget
--fleeFromTarget :: Creature -> Action
--fleeFromTarget cr = fleeFrom cr (_targetCr (_crIntention cr))
doCrWdAc :: CrWdAc -> Creature -> World -> Action
doCrWdAc cw = case cw of
CrWdBFSThenReturn _ -> const $ const NoAction
-- CrWdBFSThenReturn t -> \cr w -> fromMaybe NoAction $ do
-- n <- walkableNodeNear w (cr ^. crPos . _xy)
-- let as = take 20 $ map PathTo $ bfsNodePoints n w
-- return $ DoActionThen (DoImpulses [ChangeStrategy Search])
-- $
-- DoReplicate t $
-- foldr DoActionThen NoAction as
-- ChooseMovementSpreadGun -> chooseMovementSpreadGun
ChooseMovementLtAuto -> chooseMovementLtAuto
--chooseMovementSpreadGun :: Creature -> World -> Action
--chooseMovementSpreadGun 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 = cr ^. crPos . _xy
-- --tcr = _creatures (_cWorld w) IM.! 0
-- tcr = w ^?! cWorld . lWorld . creatures . ix 0
-- p = tcr ^. crPos . _xy
chooseMovementLtAuto :: Creature -> World -> Action
chooseMovementLtAuto 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 = cr ^. crPos . _xy
tcr = w ^?! cWorld . lWorld . creatures . ix 0
p = tcr ^. crPos . _xy
v = vNormal $ p -.- cpos
p' = p +.+ 0.5 *.* (v -.- 20 *.* normalizeV v)
--fleeFrom :: Creature -> Maybe Creature -> Action
--fleeFrom cr mtcr = case mtcr of
-- Just tcr -> DoImpulses
-- [MoveForward 3
-- , TurnToward ((2 *.* (cr ^. crPos ._xy)) -.- (tcr ^. crPos . _xy)) (pi / 4)]
-- Nothing -> NoAction