diff --git a/src/Dodge/Creature/Impulse/Movement.hs b/src/Dodge/Creature/Impulse/Movement.hs index 061efa8e4..c60808e1a 100644 --- a/src/Dodge/Creature/Impulse/Movement.hs +++ b/src/Dodge/Creature/Impulse/Movement.hs @@ -1,5 +1,6 @@ module Dodge.Creature.Impulse.Movement where +import Dodge.Base import Control.Lens import Dodge.Creature.Statistics import Dodge.Data.World @@ -30,9 +31,9 @@ crMvAbsolute p' cr = strengthFactor :: Int -> Float strengthFactor i - | i > 9 = 1 + | i > 50 = 1 | i < 1 = 0 - | otherwise = 0.1 * fromIntegral i + | otherwise = 0.02 * fromIntegral i crMvForward :: -- | Speed @@ -74,15 +75,14 @@ creatureTurnTowardDir :: Creature -> Creature creatureTurnTowardDir a turnSpeed cr - | normalizeAngle (abs (a - cdir)) <= turnSpeed = - cr & crDir .~ dirToTarget - | isLeftOfA (normalizeAngle dirToTarget) (normalizeAngle $ _crDir cr) = - cr & crDir +~ turnSpeed - | otherwise = cr & crDir -~ turnSpeed + | abs (normalizeAnglePi (a - cdir)) <= turnSpeed = cr & crDir .~ dirToTarget + | otherwise = cr & crDir %~ addOrSub turnSpeed where + addOrSub | isLeftOfA dirToTarget cdir = (+) + | otherwise = subtract cdir = _crDir cr - vToTarg = rotateV a (V2 1 0) - dirToTarget = argV vToTarg + dirToTarget = argV $ rotateV a (V2 1 0) + creatureTurnToward :: Point2 -> Float -> Creature -> Creature creatureTurnToward p turnSpeed cr diff --git a/src/Dodge/Creature/YourControl.hs b/src/Dodge/Creature/YourControl.hs index a0e45fda0..c74ddeedd 100644 --- a/src/Dodge/Creature/YourControl.hs +++ b/src/Dodge/Creature/YourControl.hs @@ -2,6 +2,7 @@ module Dodge.Creature.YourControl ( yourControl, ) where +import Data.Maybe import Data.Foldable import qualified Data.Map.Strict as M import Dodge.Base.Coordinate @@ -38,7 +39,8 @@ wasdWithAiming :: Creature -> Creature wasdWithAiming w speed cr - | isAiming = addAnyTwist $ set crDir mouseDir $ theMovement cr +-- | isAiming = addAnyTwist $ set crDir mouseDir $ theMovement cr + | isAiming = addAnyTwist $ aimTurn mouseDir $ theMovement cr | crIsReloading cr && SDL.ButtonRight `M.member` _mouseButtons (_input w) = addAnyTwist $ set crDir (mouseDir + anytwist) $ theMovement cr | otherwise = theMovement $ theTurn $ removeTwist cr @@ -64,6 +66,11 @@ wasdWithAiming w speed cr Just _ -> argV $ mouseWorldPos (w ^. input) (w ^. cWorld . camPos) -.- _crPos cr _ -> argV (_mousePos (_input w)) + (w ^. cWorld . camPos . camRot) +aimTurn :: Float -> Creature -> Creature +aimTurn a cr = creatureTurnTowardDir a (x * 0.2) cr + where + x = fromMaybe 1 $ cr ^? crInv . ix (crSel cr) . itUse . heldAim . aimTurnSpeed + wasdM :: SDL.Scancode -> Point2 wasdM scancode = case scancode of SDL.ScancodeW -> V2 0 1 diff --git a/src/Dodge/Data/Item/Use.hs b/src/Dodge/Data/Item/Use.hs index 98a1ce373..e27f1d661 100644 --- a/src/Dodge/Data/Item/Use.hs +++ b/src/Dodge/Data/Item/Use.hs @@ -57,6 +57,7 @@ data ItemUse data AimParams = AimParams { _aimWeight :: Int + , _aimTurnSpeed :: Float , _aimRange :: Float , _aimZoom :: ItZoom , _aimStance :: AimStance diff --git a/src/Dodge/Debug/Terminal.hs b/src/Dodge/Debug/Terminal.hs index 59c297cf1..48c1f807c 100644 --- a/src/Dodge/Debug/Terminal.hs +++ b/src/Dodge/Debug/Terminal.hs @@ -42,7 +42,18 @@ applyTerminalCommandArguments command args u = case command of "ITEM" -> fromMaybe u $ do (ibt, n) <- parseItem args return $ u & uvWorld %~ flip (foldr ($)) (replicate n (snd . createPutItem (itemFromBase ibt))) + "DEX" -> fromMaybe u $ do + x <- readMaybe =<< args ^? _head + return $ u & ypoint . crStatistics . dexterity .~ x + "STR" -> fromMaybe u $ do + x <- readMaybe =<< args ^? _head + return $ u & ypoint . crStatistics . strength .~ x + "INT" -> fromMaybe u $ do + x <- readMaybe =<< args ^? _head + return $ u & ypoint . crStatistics . intelligence .~ x _ -> u + where + ypoint = uvWorld . cWorld . lWorld . creatures . ix 0 parseItem :: [String] -> Maybe (ItemBaseType, Int) parseItem (x : xs) = diff --git a/src/Dodge/Default/Creature.hs b/src/Dodge/Default/Creature.hs index 37b14f9f0..fe3f6a7f3 100644 --- a/src/Dodge/Default/Creature.hs +++ b/src/Dodge/Default/Creature.hs @@ -52,7 +52,7 @@ defaultCreature = , _crMvType = defaultAimMvType , _crHammerPosition = HammerUp , _crName = "DEFAULTCRNAME" - , _crStatistics = CreatureStatistics 10 10 10 + , _crStatistics = CreatureStatistics 50 50 50 , _crCamouflage = FullyVisible , _crTargeting = defaultCreatureTargeting } diff --git a/src/Dodge/Default/Item/Use/AimParams.hs b/src/Dodge/Default/Item/Use/AimParams.hs index 45d522d0f..047485f06 100644 --- a/src/Dodge/Default/Item/Use/AimParams.hs +++ b/src/Dodge/Default/Item/Use/AimParams.hs @@ -6,6 +6,7 @@ defaultAimParams :: AimParams defaultAimParams = AimParams { _aimWeight = 0 + , _aimTurnSpeed = 1 , _aimRange = 0 , _aimZoom = ItZoom 20 0.2 1 , _aimStance = OneHand diff --git a/src/Dodge/Inventory.hs b/src/Dodge/Inventory.hs index 9827fd492..9104bb791 100644 --- a/src/Dodge/Inventory.hs +++ b/src/Dodge/Inventory.hs @@ -250,9 +250,6 @@ setEquipAllocation w = case _rbOptions w of } _ -> w --- where --- curpos = invSelPos w - setEquipActivation :: World -> World setEquipActivation w = case w ^? rbOptions . opAllocateEquipment of Just DoNotMoveEquipment -> w diff --git a/src/Dodge/Item/Held/Cane.hs b/src/Dodge/Item/Held/Cane.hs index c16f191ab..8cb5548f1 100644 --- a/src/Dodge/Item/Held/Cane.hs +++ b/src/Dodge/Item/Held/Cane.hs @@ -131,6 +131,7 @@ miniGunX :: Int -> Item miniGunX i = autoRifle & itUse .~ miniGunUse i + & itUse . heldAim . aimTurnSpeed .~ 0.5 & itParams .~ BulletShooter { _muzVel = 1 diff --git a/src/Dodge/Item/Held/Utility.hs b/src/Dodge/Item/Held/Utility.hs index bba1cdd00..cec0a2726 100644 --- a/src/Dodge/Item/Held/Utility.hs +++ b/src/Dodge/Item/Held/Utility.hs @@ -10,15 +10,11 @@ flatShield :: Item flatShield = defaultHeldItem & itEffect . ieInv .~ EffectIfHeld CreateShieldWall RemoveShieldWall - & itUse . heldAim - .~ AimParams - { _aimWeight = 5 - , _aimRange = 0 - , _aimZoom = ItZoom 20 0.2 1 - , _aimStance = TwoHandFlat - , _aimHandlePos = 0 - , _aimMuzPos = 0 - } + & itUse . heldAim . aimWeight .~ 5 + & itUse . heldAim . aimTurnSpeed .~ 0.5 + & itUse . heldAim . aimStance .~ TwoHandFlat + & itUse . heldAim . aimHandlePos .~ 0 + & itUse . heldAim . aimMuzPos .~ 0 & itInvSize .~ 3 & itType . iyBase .~ HELD FLATSHIELD diff --git a/src/Dodge/Update.hs b/src/Dodge/Update.hs index 3b40f748e..d8cc307eb 100644 --- a/src/Dodge/Update.hs +++ b/src/Dodge/Update.hs @@ -335,7 +335,12 @@ menuWheelStep i u = fromMaybe u $ do -- where -- y = w ^. input . scrollAmount updateWheelEvents :: World -> World -updateWheelEvents w = updateWheelEvent (w ^. input . scrollAmount) w +updateWheelEvents w + | yi == 0 = w + | otherwise = updateWheelEvent yi w + where + yi = w ^. input . scrollAmount + advanceScrollAmount :: Universe -> Universe advanceScrollAmount u = diff --git a/src/Geometry.hs b/src/Geometry.hs index 35a2247e3..2aafe33ec 100644 --- a/src/Geometry.hs +++ b/src/Geometry.hs @@ -168,8 +168,9 @@ nRaysRad n x = take n $ iterate (rotateV (2*pi/fromIntegral n)) (V2 x 0) -- smallest change in rotation between them. -- This appears to sometimes fail if the angles are not normalized. isLeftOfA :: Float -> Float -> Bool -isLeftOfA angle1 angle2 = (angle1 - angle2 < pi && angle1 > angle2) - || (angle2 - angle1 > pi && angle2 > angle1) +--isLeftOfA angle1 angle2 = (angle1 - angle2 < pi && angle1 > angle2) +-- || (angle2 - angle1 > pi && angle2 > angle1) +isLeftOfA angle1 angle2 = normalizeAngle (angle1 - angle2) < pi -- | Test whether a vector is to the left of another, according to the smallest -- change of rotation between them. isLeftOf :: Point2 -> Point2 -> Bool