Work on weapon positioning

This commit is contained in:
2026-04-01 10:04:22 +01:00
parent ecdc19fb5e
commit aea7e6434e
10 changed files with 95 additions and 84 deletions
+6 -2
View File
@@ -65,8 +65,8 @@ rightHandPQ cr
| oneH cr = (V3 11 (-3) 20, Q.qID)
| twists cr = (V3 0 5 20, Q.qz (-1)) `Q.comp` (V3 4 (-10) 0, Q.qz 1)
| twoFlat cr = (V3 4 (-8) 12, Q.qID)
-- | Just dt <- yourRootItemDT w
-- , Just as <- itemAimStance
| Just TwoHandTwist <- cr ^? crManipulation . manObject . imAimStance
= (V3 8 (-6) 10, Q.qID)
| Just p <- crRightHandWall cr = (20 & _xy .~ p, Q.qID)
| otherwise = (handWalkingPos LeftForward (-8) cr, Q.qID)
@@ -116,6 +116,10 @@ leftHandPQ :: Creature -> Point3Q
leftHandPQ cr
| twists cr = (V3 0 5 20, Q.qz (-1)) `Q.comp` (V3 12 4 0, Q.qz 0.4)
| twoFlat cr = (V3 4 8 12, Q.qID)
| Just TwoHandTwist <- cr ^? crManipulation . manObject . imAimStance
= (V3 10 8 20, Q.qID)
| Just TwoHandFlat <- cr ^? crManipulation . manObject . imAimStance
= (V3 10 8 20, Q.qID)
| Just p <- crLeftHandWall cr = (20 & _xy .~ p, Q.qID)
| oneH cr = (V3 0 8 10, Q.qz 0.4)
| otherwise = (handWalkingPos RightForward 8 cr, Q.qID)
+2 -3
View File
@@ -102,7 +102,7 @@ twoFlat :: Creature -> Bool
twoFlat = crInAimStance TwoHandFlat
twists :: Creature -> Bool
twists cr = crInAimStance TwoHandUnder cr || crInAimStance TwoHandOver cr
twists cr = crInAimStance TwoHandTwist cr
-- the use of crOldPos is because the damage position is calculated on the
-- previous frame
@@ -120,8 +120,7 @@ crIsArmouredFrom m p cr = fromMaybe False $ do
-- even though angleVV can generate NaN, the comparison seems to deal with it
frontarmdirection
| crInAimStance OneHand cr = 0.5
| crInAimStance TwoHandUnder cr = negate 1
| crInAimStance TwoHandOver cr = negate 1
| crInAimStance TwoHandTwist cr = negate 1
| otherwise = 0
--crOnSeg :: Point2 -> Point2 -> Creature -> Bool
+1 -4
View File
@@ -116,9 +116,6 @@ wasdWithAiming w cr = wasdAim inp w $ wasdMovement (w ^. cWorld . lWorld) inp ca
wasdAim :: Input -> World -> Creature -> Creature
wasdAim inp w cr
-- | Just 0 <- inp ^? mouseButtons . ix SDL.ButtonRight
-- , Nothing <- inp ^? mouseButtons . ix SDL.ButtonLeft =
-- setAimPosture cr
| SDL.ButtonRight `M.member` _mouseButtons inp
, AtEase <- cr ^. crStance . posture =
setAimPosture cr
@@ -137,7 +134,7 @@ setAimPosture cr =
doAimTwist :: Maybe AimStance -> Float -> Creature -> Creature
doAimTwist as x
| as == Just TwoHandOver || as == Just TwoHandUnder = crDir +~ x
| as == Just TwoHandTwist = crDir +~ x
| otherwise = id
removeAimPosture :: Creature -> Creature
+1 -2
View File
@@ -8,8 +8,7 @@ import Data.Aeson
import Data.Aeson.TH
data AimStance
= TwoHandUnder
| TwoHandOver
= TwoHandTwist
| TwoHandFlat
| OneHand
deriving (Eq, Ord, Show, Read) --Generic, Flat)
+23 -23
View File
@@ -34,33 +34,33 @@ heldAimStance = \case
PISTOL -> OneHand
MACHINEPISTOL -> OneHand
AUTOPISTOL -> OneHand
SMG -> TwoHandUnder
SMG -> TwoHandTwist
BANGCONE -> OneHand
BLUNDERBUSS -> TwoHandUnder
GRAPECANNON{} -> TwoHandUnder
MINIGUNX{} -> TwoHandUnder
BLUNDERBUSS -> TwoHandTwist
GRAPECANNON{} -> TwoHandTwist
MINIGUNX{} -> TwoHandTwist
VOLLEYGUN{} -> TwoHandFlat
RIFLE -> TwoHandUnder
ALTERIFLE -> TwoHandUnder
AUTORIFLE -> TwoHandUnder
BURSTRIFLE -> TwoHandUnder
BANGROD -> TwoHandUnder
ELEPHANTGUN -> TwoHandUnder
AMR -> TwoHandUnder
AUTOAMR -> TwoHandUnder
SNIPERRIFLE -> TwoHandUnder
RIFLE -> TwoHandTwist
ALTERIFLE -> TwoHandTwist
AUTORIFLE -> TwoHandTwist
BURSTRIFLE -> TwoHandTwist
BANGROD -> TwoHandTwist
ELEPHANTGUN -> TwoHandTwist
AMR -> TwoHandTwist
AUTOAMR -> TwoHandTwist
SNIPERRIFLE -> TwoHandTwist
FLAMESPITTER -> OneHand
FLAMETHROWER -> TwoHandUnder
FLAMETORRENT -> TwoHandUnder
FLAMEWALL -> TwoHandUnder
BLOWTORCH -> TwoHandUnder
FLAMETHROWER -> TwoHandTwist
FLAMETORRENT -> TwoHandTwist
FLAMEWALL -> TwoHandTwist
BLOWTORCH -> TwoHandTwist
TESLACOIL -> TwoHandFlat
TRACTORGUN -> TwoHandUnder
RLAUNCHER -> TwoHandOver
RLAUNCHERX{} -> TwoHandOver
GLAUNCHER -> TwoHandUnder
POISONSPRAYER -> TwoHandUnder
SHATTERGUN -> TwoHandUnder
TRACTORGUN -> TwoHandTwist
RLAUNCHER -> TwoHandTwist
RLAUNCHERX{} -> TwoHandTwist
GLAUNCHER -> TwoHandTwist
POISONSPRAYER -> TwoHandTwist
SHATTERGUN -> TwoHandTwist
LED -> OneHand
FLATSHIELD -> TwoHandFlat
KEYCARD {} -> OneHand
+1 -1
View File
@@ -102,7 +102,7 @@ extraWeaponLinks itm = case itm ^. itType of
extraWeaponLinksBelow :: Item -> [ItemSF]
extraWeaponLinksBelow itm
| TwoHandUnder <- itemBaseStance itm = [UnderBarrelSlotSF]
| TwoHandTwist <- itemBaseStance itm = [UnderBarrelSlotSF]
| otherwise = []
getAmmoLinks :: Item -> [ItemSF]
+3 -6
View File
@@ -51,14 +51,11 @@ handleOrient loc = case loc ^. locDT . dtValue . _1 . itType of
handOrient :: Creature -> AimStance -> Point3Q
handOrient cr = \case
TwoHandUnder ->
TwoHandTwist ->
let (rp,_) = rightHandPQ cr
(lp,_) = leftHandPQ cr
in (rp,Q.qz (argV $ (lp - rp) ^. _xy))
TwoHandOver ->
let (rp,_) = rightHandPQ cr
(lp,_) = leftHandPQ cr
in (rp,Q.qz (argV $ (lp - rp) ^. _xy))
-- in (rp,Q.qz (argV $ (lp - rp) ^. _xy))
in (rp,Q.qNoRoll (lp - rp))
OneHand -> rightHandPQ cr
TwoHandFlat ->
let (rp,_) = rightHandPQ cr
+1 -2
View File
@@ -242,8 +242,7 @@ heldPositionInfo = aimStanceInfo . itemBaseStance
aimStanceInfo :: AimStance -> String
aimStanceInfo as = case as of
TwoHandUnder -> "It is held using two hands, tucked under the shoulder."
TwoHandOver -> "It is held using two hands, resting over the shoulder."
TwoHandTwist -> "It is held using two hands alongside the body."
TwoHandFlat -> "It is held using two hands in front of the body."
OneHand -> "It is held in one hand."
+14
View File
@@ -16,6 +16,7 @@ module Quaternion (
comp,
prePos,
module Linear.Quaternion,
qNoRoll,
) where
import Geometry.Vector
@@ -24,6 +25,8 @@ import Geometry.Data
import Geometry.Vector3D
import Linear.Quaternion
import qualified Linear.Quaternion as Q
import Control.Lens
import Linear
instance ToJSON a => ToJSON (Q.Quaternion a) where
toEncoding = genericToEncoding defaultOptions
@@ -46,6 +49,17 @@ vToQuat a b
where
cprod = crossProd a b
qNoRoll :: Point3 -> Q.Quaternion Float
--qNoRoll x = qz (argV $ x ^. _xy) * Q.axisAngle (V3 0 (-1) 0) (argV (V2 (x ^. _z) (norm (x ^. _xy))))
qNoRoll x = qNoRoll2 x * qNoRoll1 x
--qNoRoll x = Q.axisAngle (V3 0 1 0) (argV (V2 (x ^. _z) (norm (x ^. _xy)))) * qz (argV $ x ^. _xy)
--
qNoRoll1 :: Point3 -> Q.Quaternion Float
qNoRoll1 x = Q.axisAngle (V3 0 (-1) 0) . argV $ V2 (norm (x ^. _xy)) (x ^. _z)
qNoRoll2 :: Point3 -> Q.Quaternion Float
qNoRoll2 x = qz (argV $ x ^. _xy)
qToV3 :: Q.Quaternion Float -> Point3
qToV3 q = Q.rotate q (V3 1 0 0)