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 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