95 lines
3.7 KiB
Haskell
95 lines
3.7 KiB
Haskell
{-# LANGUAGE LambdaCase #-}
|
|
--{-# LANGUAGE TupleSections #-}
|
|
|
|
module Dodge.Creature.Impulse (followImpulse) where
|
|
|
|
import Control.Monad.Trans.State.Lazy
|
|
--import Control.Monad.State -- moving from mtl to transformers
|
|
import Data.Maybe
|
|
import Dodge.Creature.Impulse.Movement
|
|
import Dodge.Creature.MoveType
|
|
--import Dodge.Creature.Impulse.UseItem
|
|
import Dodge.Creature.Vocalization
|
|
import Dodge.CreatureEffect
|
|
import Dodge.Data.World
|
|
import Dodge.FloatFunction
|
|
import Dodge.RandImpulse
|
|
import Dodge.SoundLogic
|
|
import Geometry
|
|
import LensHelp
|
|
import Linear
|
|
import System.Random
|
|
|
|
-- note SwitchToItem doesn't necessarily update the root item correctly
|
|
followImpulse :: Int -> World -> Impulse -> World
|
|
followImpulse cid w = \case
|
|
ImpulseNothing -> w
|
|
RandomImpulse rimp ->
|
|
let (newimp, newgen) = runState (doRandImpulse rimp) (_randGen w)
|
|
in randGen .~ newgen $ followImpulse cid w newimp
|
|
Bark sid ->
|
|
soundStart (CrMouth cid) cpos sid Nothing $
|
|
w & clens %~ resetCrVocCoolDown w
|
|
Move p -> crup $ crMvBy p (w ^. cWorld . lWorld)
|
|
Walk p -> crup $ crWalk p (w ^. cWorld . lWorld)
|
|
MoveForward x -> crup $ crMvForward x (w ^. cWorld . lWorld)
|
|
MoveNoStride p -> crup $ crMvByNoStride p (w ^. cWorld . lWorld)
|
|
Turn a -> crup $ crDir +~ a
|
|
TurnToward p a -> crup $ creatureTurnToward p a
|
|
TurnTo p -> crup $ creatureTurnTo p
|
|
ChangePosture post -> crup $ crStance . posture .~ post
|
|
UseItem -> undefined
|
|
-- SwitchToItem i -> crup $ crManipulation . manObject .~ SelectedItem (NInt i) (NInt i) mempty
|
|
Melee cid' ->
|
|
hitCr cid' $
|
|
crup
|
|
( crMvAbsolute (w ^. cWorld . lWorld) (10 *.* normalizeV (posFromID cid' -.- cpos)) . (crType . meleeCooldown .~ 20)
|
|
)
|
|
MeleeL cid' ->
|
|
hitCrd (-pi/2) cid' $
|
|
crup
|
|
-- ( crMvAbsolute (w ^. cWorld . lWorld) (vNormal $ 10 *.* normalizeV (posFromID cid' -.- cpos))
|
|
-- .
|
|
(crType . meleeCooldownL .~ 20)
|
|
-- )
|
|
MeleeR cid' ->
|
|
hitCrd (pi/2) cid' $
|
|
crup
|
|
--( crMvAbsolute (w ^. cWorld . lWorld) (vNormal $ (-10) *.* normalizeV (posFromID cid' -.- cpos)) .
|
|
(crType . meleeCooldownR .~ 20)
|
|
--)
|
|
RandomTurn a ->
|
|
let (aa, g) = rr a
|
|
in (randGen .~ g) (crup (crDir +~ aa))
|
|
MakeSound sid -> soundStart (CrSound (_crID cr)) (cr ^. crPos . _xy) sid Nothing w
|
|
DropItem -> undefined
|
|
ChangeStrategy strat -> crup $ crActionPlan . apStrategy .~ strat
|
|
AddGoal gl -> crup $ crActionPlan . apGoal .:~ gl
|
|
ImpulseUseTarget f -> fromMaybe w $ do
|
|
i <- cr ^? crIntention . targetCr . _Just
|
|
tcr <- w ^? cWorld . lWorld . creatures . ix i
|
|
return $ followImpulse cid w (doCrImp f tcr)
|
|
MvForward -> crup $ crMvForward speed (w ^. cWorld . lWorld)
|
|
MvTurnToward p ->
|
|
crup $
|
|
creatureTurnToward p (turnRad $ safeAngleVV (p -.- cpos) (unitVectorAtAngle cdir))
|
|
where
|
|
clens = cWorld . lWorld . creatures . ix cid
|
|
cr = w ^?! cWorld . lWorld . creatures . ix cid
|
|
crup f = over clens f w
|
|
mvType = crMvType cr
|
|
speed = _mvSpeed mvType
|
|
turnRad = doFloatFloat $ _mvTurnRad mvType
|
|
cpos = cr ^. crPos . _xy
|
|
cdir = _crDir cr
|
|
posFromID cid' = w ^?! cWorld . lWorld . creatures . ix cid' . crPos . _xy
|
|
rr a = randomR (- a, a) $ _randGen w
|
|
hitCr i =
|
|
cWorld . lWorld . creatures . ix i . crDamage
|
|
.:~ Blunt 100 (posFromID i) (posFromID i - cpos)
|
|
hitCrd a i =
|
|
cWorld . lWorld . creatures . ix i . crDamage
|
|
<>~ [Blunt 100 (posFromID i) (posFromID i - cpos)
|
|
, Inertial 0 (posFromID i) (50 * unitVectorAtAngle (cr ^. crDir + a))
|
|
]
|