98 lines
3.5 KiB
Haskell
98 lines
3.5 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 -> \w -> crSafeDistFromTarg w 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
|
|
|
|
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 t -> \cr w -> fromMaybe NoAction $ do
|
|
n <- walkableNodeNear w (cr ^. crPos . _xy)
|
|
-- let as = take 20 $ map PathTo $ bfsNodePoints n w
|
|
let as = []
|
|
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
|