Slow your turn when moving and not aiming

This commit is contained in:
jgk
2021-06-06 16:33:25 +02:00
parent 0b8ac97fe9
commit eb7c4a8067
3 changed files with 40 additions and 6 deletions
+34 -3
View File
@@ -8,12 +8,11 @@ import Geometry
import Data.Maybe
import qualified Data.IntMap.Strict as IM
import Control.Lens
{- | Creature attempts to moves under its own steam.
The idea is that this may or may not work, depending on the status of the creature.
For now, though, this cannot fail. -}
crMvBy
:: Point2 -- ^ Movement translation vector
crMvBy
:: Point2 -- ^ Movement translation vector, will be made relative to creature direction
-> Creature
-> Creature
crMvBy p' cr = advanceStepCounter (magV p) $ over crPos (+.+ p) cr
@@ -28,6 +27,22 @@ crMvBy p' cr = advanceStepCounter (magV p) $ over crPos (+.+ p) cr
| otherwise = 1
it = _crInv cr IM.! _crInvSel cr
crMvAbsolute
:: Point2 -- ^ Movement translation vector
-> Creature
-> Creature
crMvAbsolute p' cr = advanceStepCounter (magV p) $ over crPos (+.+ p) cr
where
p = (*.*) (equipFactor * aimingFactor) p'
equipFactor
| _posture (_crStance cr) == Aiming
= product $ map equipAimSpeed $ IM.elems $ _crInv cr
| otherwise = product $ map equipSpeed $ IM.elems $ _crInv cr
aimingFactor
| _posture (_crStance cr) == Aiming = fromMaybe 1 $ it ^? itAimingSpeed
| otherwise = 1
it = _crInv cr IM.! _crInvSel cr
crMvForward
:: Float -- ^ Speed
-> Creature
@@ -46,6 +61,7 @@ advanceStepCounter speed = crStance . carriage %~ f
creatureTurn :: Float -> Creature -> Creature
creatureTurn a = crDir +~ a
creatureTurnTo :: Point2 -> Creature -> Creature
creatureTurnTo p cr
| vToTarg == (0,0) = cr -- this should deal with the angleVV error
@@ -54,6 +70,21 @@ creatureTurnTo p cr
vToTarg = p -.- _crPos cr
dirToTarget = argV vToTarg
creatureTurnTowardDir
:: Float -- ^ Angle
-> Float -- ^ Turn speed
-> Creature
-> Creature
creatureTurnTowardDir a turnSpeed cr
| vToTarg == (0,0) = cr -- this should deal with the angleVV error
| errorAngleVV 3 vToTarg (unitVectorAtAngle (_crDir cr)) <= turnSpeed
= cr & crDir .~ dirToTarget
| isLeftOfA (normalizeAngle dirToTarget) (normalizeAngle $ _crDir cr) = cr & crDir +~ turnSpeed
| otherwise = cr & crDir -~ turnSpeed
where
vToTarg = rotateV a (1,0)
dirToTarget = argV vToTarg
creatureTurnToward :: Point2 -> Float -> Creature -> Creature
creatureTurnToward p turnSpeed cr
| vToTarg == (0,0) = cr -- this should deal with the angleVV error
+4 -1
View File
@@ -34,11 +34,14 @@ wasdWithAiming
-> Creature
wasdWithAiming w speed i cr
| isAiming = set crDir mouseDir $ crMvBy (speed *.* mov) cr
| isMoving = crMvForward speed $ over crDir (`fromMaybe` dir) cr
| isMoving = crMvAbsolute (speed *.* movAbs) $ turnAction cr
-- | isMoving = crMvForward speed $ over crDir (`fromMaybe` dir) cr
| otherwise = cr
where
(mov',dir') = wasdComp (view keys w) w
dir = fmap (_cameraRot w +) dir'
turnAction cr' = maybe cr (\d -> creatureTurnTowardDir d 0.2 cr') dir
movAbs = rotateV (_cameraRot w) mov'
mov = rotateV (negate $ _crDir cr - _cameraRot w) mov'
isAiming = _posture (_crStance cr) == Aiming
isMoving = mov' /= (0,0)
+2 -2
View File
@@ -17,7 +17,7 @@ import Control.Monad.State
import Data.List
--import Data.Maybe
import System.Random
import qualified Data.IntMap.Strict as IM
--import qualified Data.IntMap.Strict as IM
import Control.Lens
makePoisonExplosionAt
@@ -36,7 +36,7 @@ makeTeslaExplosionAt
:: Point2 -- ^ Position
-> World
-> World
makeTeslaExplosionAt pos w = undefined
makeTeslaExplosionAt pos w = undefined pos w
-- soundOncePos grenadeBang pos $ foldr ($) w listOfFunctions -- a bit shorter
-- where
-- xs = randomRs (0, 2*pi) $ _randGen w