diff --git a/src/Dodge/Creature/HandPos.hs b/src/Dodge/Creature/HandPos.hs index 03076841d..d605f65db 100644 --- a/src/Dodge/Creature/HandPos.hs +++ b/src/Dodge/Creature/HandPos.hs @@ -1,7 +1,5 @@ module Dodge.Creature.HandPos ( - aimingWeaponZeroPos, - aimingMuzzlePos, - aimingMuzzleLength, +-- aimingWeaponZeroPos, translatePointToLeftHand, translatePointToRightHand, translatePointToHead, @@ -21,30 +19,8 @@ import Data.Maybe import Dodge.Creature.Test import Dodge.Data.Creature import Geometry -import Linear import ShapePicture --- the position of a weapon handle -aimingWeaponHandlePos :: Creature -> Item -> Point2 -aimingWeaponHandlePos _ it = case it ^? itUse . heldAim . aimStance of - Just TwoHandUnder -> V2 (-2) 0 - Just TwoHandOver -> V2 (-7) 0 - Just OneHand -> V2 10 (-2) - Just TwoHandFlat -> V2 10 0 - Nothing -> 0 - -aimingWeaponZeroPos :: Creature -> Item -> Point2 -aimingWeaponZeroPos cr it = - aimingWeaponHandlePos cr it - - fromMaybe 0 (it ^? itUse . heldAim . aimHandlePos) - -aimingMuzzlePos :: Creature -> Item -> [Point2] -aimingMuzzlePos cr it = fmap ((+ zp) . _mzPos) (it ^.. itUse . heldAim . aimMuzzles . folded) - where - zp = aimingWeaponZeroPos cr it - -aimingMuzzleLength :: Creature -> Item -> Float -aimingMuzzleLength cr it = head (aimingMuzzlePos cr it) ^. _x translatePointToRightHand :: Creature -> Point3 -> Point3 translatePointToRightHand cr = translatePointToRightHand' cr . mirrorV3xz diff --git a/src/Dodge/HeldUse.hs b/src/Dodge/HeldUse.hs index b83a65de9..9b6cf3e5e 100644 --- a/src/Dodge/HeldUse.hs +++ b/src/Dodge/HeldUse.hs @@ -164,8 +164,9 @@ makeMuzzleFlare mz itmtree cr = case mz ^. mzFlareType of -- .:~ tlsTimeRadColPos 1 100 (V3 0 0 1) (pos `v2z` 10) where itm = itmtree ^. ldtValue - pos = _crPos cr + rotateV (_crDir cr) (_mzPos mz + aimingWeaponZeroPos cr itm) - dir = _crDir cr + _mzRot mz + (moff,mrot) = heldItemOrient2D itm cr (_mzPos mz) (_mzRot mz) + pos = _crPos cr + rotateV (_crDir cr) moff + dir = _crDir cr + mrot --{-# OPTIONS -Wno-incomplete-uni-patterns #-} muzFlareAt :: Color -> Point3 -> Float -> World -> World @@ -295,10 +296,11 @@ shootLaser itmtree cr mz w = } where itm = itmtree ^. ldtValue - pos = _crPos cr + rotateV (_crDir cr) (_mzPos mz + aimingWeaponZeroPos cr itm) + (moff,mrot) = heldItemOrient2D itm cr (_mzPos mz) (_mzRot mz) + pos = _crPos cr + rotateV (_crDir cr) moff + dir = _crDir cr + mrot + a (a, g) = randomR (- inacc, inacc) $ _randGen w inacc = _mzInaccuracy mz - dir = _crDir cr + _mzRot mz + a lasRayAt :: Color -> Int -> Float -> Point2 -> Float -> LaserStart lasRayAt col dam phasev pos dir = @@ -363,7 +365,10 @@ getBulletTrajectory mz itm bt tp cr w = case bt of BezierTrajectoryType -> BezierTrajectory bulpos tp (mouseWorldPos (w ^. input) (w ^. wCam)) MagnetTrajectoryType -> MagnetTrajectory tp where - bulpos = _crPos cr + rotateV (_crDir cr) (_mzPos mz + aimingWeaponZeroPos cr itm + V2 0 offset) + (moff,mrot) = heldItemOrient2D itm cr (_mzPos mz + V2 0 offset) (_mzRot mz) + bulpos = _crPos cr + rotateV (_crDir cr) moff +-- dir = _crDir cr + mrot + a +-- bulpos = _crPos cr + rotateV (_crDir cr) (_mzPos mz + aimingWeaponZeroPos cr itm + V2 0 offset) offset = case itm ^? itUse . heldParams . randomOffset of Just x | x /= 0 -> fst . randomR (- x, x) $ _randGen w _ -> 0 @@ -392,8 +397,6 @@ makeBullet thebullet itm cr mz w = & buDrag *~ drag ) where --- bulpos = _crPos cr --- + rotateV (_crDir cr) (_mzPos mz + aimingWeaponZeroPos cr itm + V2 0 offset) (moff,mrot) = heldItemOrient2D itm cr (_mzPos mz + V2 0 offset) (_mzRot mz) bulpos = _crPos cr + rotateV (_crDir cr) moff (a, g'') = randomR (- inacc, inacc) $ _randGen w @@ -438,10 +441,12 @@ useGasParams mmagid mz itm cr w = fueltype <- cr ^? crInv . ix magid . itUse . amagParams . ampCreateGas gc <- itm ^? itUse . heldParams . gasCreation return $ gasCreate fueltype gc - pos = _crPos cr + rotateV (_crDir cr) (_mzPos mz + aimingWeaponZeroPos cr itm) + --pos = _crPos cr + rotateV (_crDir cr) (_mzPos mz + aimingWeaponZeroPos cr itm) + (moff,mrot) = heldItemOrient2D itm cr (_mzPos mz) (_mzRot mz) + pos = _crPos cr + rotateV (_crDir cr) moff (a, g') = randomR (- inacc, inacc) g inacc = _mzInaccuracy mz - dir = _crDir cr + _mzRot mz + a + _nzCurrentWalkAngle (_mzEffect mz) + dir = _crDir cr + mrot + a + _nzCurrentWalkAngle (_mzEffect mz) gasCreate :: GasFuel -> GasCreate -> GasCreate gasCreate = const id @@ -487,8 +492,9 @@ shootTeslaArc itm cr mz w = -- use items item location instead itRef = cr ^?! crManipulation . manObject . imRootSelectedItem -- unsafe!! TODO change (w', ip) = makeTeslaArc (_itParams itm) pos dir w - pos = _crPos cr + rotateV (_crDir cr) (_mzPos mz + aimingWeaponZeroPos cr itm) - dir = _crDir cr + _mzRot mz + (moff,mrot) = heldItemOrient2D itm cr (_mzPos mz) (_mzRot mz) + pos = _crPos cr + rotateV (_crDir cr) moff + dir = _crDir cr + mrot determineProjectileTracking :: LabelDoubleTree ComposeLinkType Item -> diff --git a/src/Dodge/Item/HeldOffset.hs b/src/Dodge/Item/HeldOffset.hs index 8ce404cde..59adcdb5e 100644 --- a/src/Dodge/Item/HeldOffset.hs +++ b/src/Dodge/Item/HeldOffset.hs @@ -61,6 +61,21 @@ heldItemRelativeOrient itm cr (p,q) f i = 0.1 * fromIntegral (sLen - i) / fromIntegral sLen sLen = _strideLength $ _crStance cr +aimingWeaponZeroPos :: Creature -> Item -> Point2 +aimingWeaponZeroPos cr it = + aimingWeaponHandlePos cr it + - fromMaybe 0 (it ^? itUse . heldAim . aimHandlePos) + +-- the position of a weapon handle +aimingWeaponHandlePos :: Creature -> Item -> Point2 +aimingWeaponHandlePos _ it = case it ^? itUse . heldAim . aimStance of + Just TwoHandUnder -> V2 (-2) 0 + Just TwoHandOver -> V2 (-7) 0 + Just OneHand -> V2 10 (-2) + Just TwoHandFlat -> V2 10 0 + Nothing -> 0 + + heldItemOffset :: Item -> Creature -> Point3 -> Point3 heldItemOffset itm cr p = fst (heldItemRelativeOrient itm cr (p,Q.qID)) diff --git a/src/Dodge/Item/Weapon/Shatter.hs b/src/Dodge/Item/Weapon/Shatter.hs index b9c1d0294..c42e2e029 100644 --- a/src/Dodge/Item/Weapon/Shatter.hs +++ b/src/Dodge/Item/Weapon/Shatter.hs @@ -2,7 +2,6 @@ module Dodge.Item.Weapon.Shatter where import Dodge.Base.Collide import Dodge.Block.Debris -import Dodge.Creature.HandPos import Dodge.Data.World import Dodge.Wall.Damage import Geometry @@ -10,7 +9,7 @@ import LensHelp shootShatter :: Item -> Creature -> World -> World -shootShatter it cr w = +shootShatter _ cr w = maybe w (uncurry $ shatterWall w sp ep) $ sequence $ collidePointWallsFilter canshatter sp ep w @@ -19,7 +18,8 @@ shootShatter it cr w = Opaque {} -> True SeeThrough -> True _ -> False - sp = _crPos cr +.+ aimingMuzzleLength cr it *.* unitVectorAtAngle dir + sp = _crPos cr +.+ 10 *.* unitVectorAtAngle dir + -- the 10 is arbtrary and should be changed to a muzzle position dir = _crDir cr ep = sp +.+ 200 *.* unitVectorAtAngle dir