From 07c6298743a3d51d2b17557601e1b64c5547df7c Mon Sep 17 00:00:00 2001 From: justin Date: Sat, 5 Jul 2025 15:01:21 +0100 Subject: [PATCH] Hand/handle position refactor --- src/Dodge/Creature/Picture.hs | 2 +- src/Dodge/Creature/Test.hs | 3 ++- src/Dodge/Item/AimStance.hs | 2 +- src/Dodge/Item/Draw.hs | 5 +++-- src/Dodge/Item/Draw/SPic.hs | 6 +++--- src/Dodge/Item/HeldOffset.hs | 16 +++++++++++----- tags | 24 +++++++++++++----------- 7 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/Dodge/Creature/Picture.hs b/src/Dodge/Creature/Picture.hs index b7f9655d7..53a71dc84 100644 --- a/src/Dodge/Creature/Picture.hs +++ b/src/Dodge/Creature/Picture.hs @@ -135,4 +135,4 @@ shoulderSH = translateSHz 20 drawEquipment :: Creature -> SPic {-# INLINE drawEquipment #-} -drawEquipment cr = foldMap (itemEquipPict cr) (invLDT $ _crInv cr) +drawEquipment cr = foldMap (itemEquipPict cr) (invLDT' $ _crInv cr) diff --git a/src/Dodge/Creature/Test.hs b/src/Dodge/Creature/Test.hs index 383d23031..4e98e7121 100644 --- a/src/Dodge/Creature/Test.hs +++ b/src/Dodge/Creature/Test.hs @@ -95,7 +95,8 @@ crInAimStance as cr = crIsAiming cr && mitstance == Just as where mitstance = do i <- cr ^? crManipulation . manObject . imRootSelectedItem - itm <- invRootTrees' (cr ^. crInv) ^? ix i + --itm <- invRootTrees' (cr ^. crInv) ^? ix i + itm <- invRootTrees (cr ^. crInv) ^? ix i return $ aimStance itm --cr ^? crInv . ix i . itUse . heldAim . aimStance diff --git a/src/Dodge/Item/AimStance.hs b/src/Dodge/Item/AimStance.hs index b0ab53a9e..f9e672c2c 100644 --- a/src/Dodge/Item/AimStance.hs +++ b/src/Dodge/Item/AimStance.hs @@ -10,7 +10,7 @@ import Dodge.Data.AimStance --aStance :: LocationLDT ItemLink CItem -> AimStance --aStance loc = case loc ^. locLDT . ldtValue . _1 . itType of -- -aimStance :: LDTree ItemLink CItem -> AimStance +aimStance :: LDTree ItemLink OItem -> AimStance aimStance ldt = itemBaseStance $ ldt ^. ldtValue . _1 diff --git a/src/Dodge/Item/Draw.hs b/src/Dodge/Item/Draw.hs index 7d0374a75..b926f2b70 100644 --- a/src/Dodge/Item/Draw.hs +++ b/src/Dodge/Item/Draw.hs @@ -15,17 +15,18 @@ import Dodge.Item.Draw.SPic import Dodge.Item.HeldOffset import ShapePicture -itemEquipPict :: Creature -> LDTree ItemLink CItem -> SPic +itemEquipPict :: Creature -> LDTree ItemLink OItem -> SPic itemEquipPict cr itmtree | Just i <- itm ^? itLocation . ilInvID , Just esite <- cr ^? crInv . ix i . itLocation . ilEquipSite . _Just , Just attachpos <- equipAttachPos <$> itm ^? itType . ibtEquip = equipPosition esite cr attachpos (itemSPic itm) | itm ^? itLocation . ilInvID == cr ^? crManipulation . manObject . imRootSelectedItem - = overPosSP (heldItemOffset itm cr) (itemTreeSPic itmtree) + = overPosSP (heldItemOffset loc cr) (itemTreeSPic itmtree) | otherwise = mempty where itm = itmtree ^. ldtValue . _1 + loc = LocLDT TopLDT itmtree equipAttachPos :: EquipItemType -> Point3 equipAttachPos = \case diff --git a/src/Dodge/Item/Draw/SPic.hs b/src/Dodge/Item/Draw/SPic.hs index 0988197f5..f3b1dc760 100644 --- a/src/Dodge/Item/Draw/SPic.hs +++ b/src/Dodge/Item/Draw/SPic.hs @@ -21,10 +21,10 @@ import Picture import Shape import ShapePicture -itemTreeSPic :: LDTree ItemLink CItem -> SPic -itemTreeSPic (LDT (itm,_) l r) = itemSPic itm <> foldMap (itemRotTreeSPic itm) (l <> r) +itemTreeSPic :: LDTree ItemLink OItem -> SPic +itemTreeSPic (LDT (itm,_,_) l r) = itemSPic itm <> foldMap (itemRotTreeSPic itm) (l <> r) -itemRotTreeSPic :: Item -> (ItemLink, LDTree ItemLink CItem) -> SPic +itemRotTreeSPic :: Item -> (ItemLink, LDTree ItemLink OItem) -> SPic itemRotTreeSPic par (il, t) = translateSP p . overPosSP (Q.rotate q) $ itemTreeSPic t where (p, q) = orientAttachment par il itm diff --git a/src/Dodge/Item/HeldOffset.hs b/src/Dodge/Item/HeldOffset.hs index d963a8115..53d85c4a3 100644 --- a/src/Dodge/Item/HeldOffset.hs +++ b/src/Dodge/Item/HeldOffset.hs @@ -72,20 +72,20 @@ heldItemRelativeOrient itm cr (p, q) sLen = _strideLength $ _crStance cr handleOrient :: LocationLDT ItemLink OItem -> Point3Q -handleOrient _ = (V3 3 0 0, Q.qID) +handleOrient _ = (V3 (-3) 0 0, Q.qID) -- note this is relative to the creature handOrient :: Creature -> AimStance -> Point3Q handOrient cr = case cr ^. crStance . posture of Aiming -> \case - TwoHandUnder -> (V3 1 0 shoulderHeight, Q.qID) + TwoHandUnder -> (V3 (-3) 0 shoulderHeight, Q.qID) TwoHandOver -> (V3 0 0 shoulderHeight, Q.qID) OneHand -> (V3 13 (-2) shoulderHeight, Q.qID) TwoHandFlat -> (V3 13 0 shoulderHeight, Q.qID) AtEase -> \case OneHand -> (V3 (10 + walkhandp) (-7) 15, Q.qID) TwoHandFlat -> (V3 10 0 15, Q.axisAngle (V3 0 0 1) $ twoFlatHRot cr) - TwoHandUnder -> (V3 10 0 15, Q.axisAngle (V3 0 0 1) (strideRot cr + 1.2)) + TwoHandUnder -> (V3 7 (-8) 15, Q.axisAngle (V3 0 0 1) (strideRot cr + 1.2)) TwoHandOver -> (V3 10 0 15, Q.axisAngle (V3 0 0 1) (strideRot cr + 1.2)) where walkhandp = case cr ^? crStance . carriage of @@ -112,8 +112,14 @@ aimStanceHandlePos _ it = case itemBaseStance it of OneHand -> V2 10 (-2) TwoHandFlat -> V2 10 0 -heldItemOffset :: Item -> Creature -> Point3 -> Point3 -heldItemOffset itm cr p = fst (heldItemRelativeOrient itm cr (p, Q.qID)) +heldItemOffset :: LocationLDT ItemLink OItem -> Creature -> Point3 -> Point3 +heldItemOffset loc cr p = x + Q.rotate q p + where + (x,q) = handOrient cr (aimStance (loc ^. locLDT)) + `Q.comp` handleOrient loc + +heldItemOffset' :: Item -> Creature -> Point3 -> Point3 +heldItemOffset' itm cr p = fst (heldItemRelativeOrient itm cr (p, Q.qID)) shoulderHeight :: Float shoulderHeight = 18 diff --git a/tags b/tags index 90159e597..fcc1acaef 100644 --- a/tags +++ b/tags @@ -3354,10 +3354,10 @@ advanceSmoothScroll src/Dodge/SmoothScroll.hs 33;" f advanceStepCounter src/Dodge/Creature/Impulse/Movement.hs 44;" f aimDelaySweep src/Dodge/Render/Picture.hs 264;" f aimStance src/Dodge/Item/AimStance.hs 13;" f -aimStanceHandlePos src/Dodge/Item/HeldOffset.hs 105;" f +aimStanceHandlePos src/Dodge/Item/HeldOffset.hs 108;" f aimStanceInfo src/Dodge/Item/Info.hs 243;" f aimTurn src/Dodge/Creature/YourControl.hs 165;" f -aimingWeaponZeroPos src/Dodge/Item/HeldOffset.hs 101;" f +aimingWeaponZeroPos src/Dodge/Item/HeldOffset.hs 104;" f airlock src/Dodge/Room/Airlock.hs 19;" f airlock0 src/Dodge/Room/Airlock.hs 25;" f airlock90 src/Dodge/Room/Airlock.hs 122;" f @@ -4528,14 +4528,15 @@ halfHeight src/Dodge/Base/Window.hs 48;" f halfWidth src/Dodge/Base/Window.hs 48;" f haltSound src/Dodge/SoundLogic.hs 38;" f hammerCheck src/Dodge/HeldUse.hs 63;" f -handOrient src/Dodge/Item/HeldOffset.hs 75;" f +handOrient src/Dodge/Item/HeldOffset.hs 78;" f handleEvent src/Dodge/Event.hs 27;" f handleHotkeys src/Dodge/Creature/YourControl.hs 45;" f handleKeyboardEvent src/Dodge/Event/Input.hs 22;" f handleMouseButtonEvent src/Dodge/Event/Input.hs 63;" f handleMouseMotionEvent src/Dodge/Event/Input.hs 47;" f handleMouseWheelEvent src/Dodge/Event/Input.hs 58;" f -handlePos src/Dodge/Item/HeldOffset.hs 130;" f +handleOrient src/Dodge/Item/HeldOffset.hs 74;" f +handlePos src/Dodge/Item/HeldOffset.hs 136;" f handleResizeEvent src/Dodge/Event.hs 53;" f handleTextInput src/Dodge/Event/Input.hs 18;" f handleWindowMoveEvent src/Dodge/Event.hs 44;" f @@ -4560,14 +4561,15 @@ heldAimStance src/Dodge/Item/AimStance.hs 22;" f heldAimZoom src/Dodge/Update/Camera.hs 140;" f heldEffect src/Dodge/HeldUse.hs 60;" f heldEffectMuzzles src/Dodge/HeldUse.hs 127;" f -heldHandlePos src/Dodge/Item/HeldOffset.hs 135;" f +heldHandlePos src/Dodge/Item/HeldOffset.hs 141;" f heldInfo src/Dodge/Item/Info.hs 90;" f heldItemAmmoSlots src/Dodge/Item/AmmoSlots.hs 18;" f heldItemBulkiness src/Dodge/Creature/YourControl.hs 177;" f heldItemInvLock src/Dodge/HeldUse.hs 474;" f heldItemMuzVel src/Dodge/HeldUse.hs 1055;" f heldItemMuzzles src/Dodge/HeldUse.hs 156;" f -heldItemOffset src/Dodge/Item/HeldOffset.hs 112;" f +heldItemOffset src/Dodge/Item/HeldOffset.hs 115;" f +heldItemOffset' src/Dodge/Item/HeldOffset.hs 118;" f heldItemOrient2D src/Dodge/Item/HeldOffset.hs 37;" f heldItemOrient2D' src/Dodge/Item/HeldOffset.hs 42;" f heldItemRelativeOrient src/Dodge/Item/HeldOffset.hs 47;" f @@ -4743,7 +4745,7 @@ itemInvColor src/Dodge/Item/InventoryColor.hs 9;" f itemInvLock src/Dodge/HeldUse.hs 469;" f itemMuzzles src/Dodge/HeldUse.hs 141;" f itemRandomOffset src/Dodge/HeldUse.hs 992;" f -itemRelativeOrient src/Dodge/Item/HeldOffset.hs 179;" f +itemRelativeOrient src/Dodge/Item/HeldOffset.hs 185;" f itemRooms src/Dodge/LockAndKey.hs 39;" f itemRotTreeSPic src/Dodge/Item/Draw/SPic.hs 27;" f itemSPic src/Dodge/Item/Draw/SPic.hs 33;" f @@ -4865,7 +4867,7 @@ locGoHelp src/Dodge/DoubleTree.hs 273;" f locGoLeft src/Dodge/DoubleTree.hs 262;" f locGoRight src/Dodge/DoubleTree.hs 267;" f locLeftmost src/Dodge/DoubleTree.hs 255;" f -locOrientation src/Dodge/Item/HeldOffset.hs 94;" f +locOrientation src/Dodge/Item/HeldOffset.hs 97;" f locRightmost src/Dodge/DoubleTree.hs 258;" f locToTop src/Dodge/DoubleTree.hs 250;" f locUp src/Dodge/DoubleTree.hs 237;" f @@ -5809,7 +5811,7 @@ shootingRange src/Dodge/Room/Room.hs 332;" f shortPoint2 src/Dodge/ShortShow.hs 4;" f shortShow src/ShortShow.hs 9;" f shotgunS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 693;" f -shoulderHeight src/Dodge/Item/HeldOffset.hs 115;" f +shoulderHeight src/Dodge/Item/HeldOffset.hs 121;" f shoulderSH src/Dodge/Creature/Picture.hs 133;" f shoulderSP src/Dodge/Creature/HandPos.hs 170;" f showAttachItem src/Dodge/Item/Display.hs 91;" f @@ -5959,7 +5961,7 @@ strFromEquipment src/Dodge/Creature/Statistics.hs 48;" f strFromHeldItem src/Dodge/Creature/Statistics.hs 60;" f strengthFactor src/Dodge/Creature/Impulse/Movement.hs 35;" f strictify src/MaybeHelp.hs 37;" f -strideRot src/Dodge/Item/HeldOffset.hs 118;" f +strideRot src/Dodge/Item/HeldOffset.hs 124;" f stringToList src/Picture/Base.hs 313;" f stringToListGrad src/Picture/Text.hs 12;" f stripZ src/Geometry/Vector3D.hs 97;" f @@ -6183,7 +6185,7 @@ twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 80;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 28;" f twists src/Dodge/Creature/Test.hs 108;" f twoFlat src/Dodge/Creature/Test.hs 105;" f -twoFlatHRot src/Dodge/Item/HeldOffset.hs 127;" f +twoFlatHRot src/Dodge/Item/HeldOffset.hs 133;" f twoHandTwistAmount src/Dodge/Creature/YourControl.hs 150;" f twoRoomPoss src/Dodge/PlacementSpot.hs 147;" f twoStep1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 533;" f