From 33de1f79b60cd438c54d9da2be03b24ddaab2fc5 Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 12 Oct 2025 00:26:48 +0100 Subject: [PATCH] Add check to cylinder segment collision, break rocket projectiles --- saveSlot/seed | 2 +- src/Dodge/HeldUse.hs | 13 +++- src/Dodge/Item/HeldOffset.hs | 5 +- src/Dodge/Projectile/Create.hs | 10 ++- src/Dodge/Projectile/Draw.hs | 2 +- src/Dodge/Projectile/Update.hs | 49 ++++++++++-- src/Geometry/Intersect.hs | 15 ++-- src/ShortShow.hs | 4 + tags | 138 +++++++++++++++++---------------- 9 files changed, 147 insertions(+), 91 deletions(-) diff --git a/saveSlot/seed b/saveSlot/seed index 335495db1..2f0d3ff35 100644 --- a/saveSlot/seed +++ b/saveSlot/seed @@ -1 +1 @@ -5641590692396144028 \ No newline at end of file +7114951007332849727 \ No newline at end of file diff --git a/src/Dodge/HeldUse.hs b/src/Dodge/HeldUse.hs index 5e2fd49da..791b6034d 100644 --- a/src/Dodge/HeldUse.hs +++ b/src/Dodge/HeldUse.hs @@ -732,7 +732,8 @@ useLoadedAmmo loc cr mz m w = MuzzleRLauncher -> createProjectileR loc magtree mz cr w MuzzleGLauncher -> createProjectile - (itmtree ^. dtValue . _3) + pq +-- (itmtree ^. dtValue . _3) (Grenade (getGrenadeHitEffect itmtree)) magtree (getPJStabiliser itmtree) @@ -754,11 +755,21 @@ useLoadedAmmo loc cr mz m w = MuzzleStopper -> useStopWatch itm cr w MuzzleScroller -> useTimeScrollGun itm cr w where + pq = muzzlePos loc cr mz itmtree = loc ^. locDT mitid = magtree ^. dtValue . _1 . itID itm = itmtree ^. dtValue . _1 (x, magtree) = fromJust m +muzzlePos :: LocationDT OItem -> Creature -> Muzzle -> Point3Q +muzzlePos m cr muz = (p1,q1) `Q.comp` pq `Q.comp` (p3,q3) + where + pq = locOrient m cr + p1 = cr ^. crPos + q1 = Q.qz $ cr ^. crDir + p3 = addZ 0 $ muz ^. mzPos + q3 = Q.qz $ muz ^. mzRot + getAttachedSFLink :: ItemSF -> DTree OItem -> Maybe (NewInt ItmInt) getAttachedSFLink sf = (^? dtRight . folding (find f) . dtValue . _1 . itID) where diff --git a/src/Dodge/Item/HeldOffset.hs b/src/Dodge/Item/HeldOffset.hs index 3e945ac8a..193d6369a 100644 --- a/src/Dodge/Item/HeldOffset.hs +++ b/src/Dodge/Item/HeldOffset.hs @@ -61,10 +61,9 @@ locOrient loc cr = handHandleOrient :: LocationDT CItem -> Creature -> Point3Q handHandleOrient loc cr = - handOrient cr (itemAimStance (loc' ^. locDT)) - `Q.comp` handleOrient loc' + handOrient cr (itemAimStance (l ^. locDT)) `Q.comp` handleOrient l where - loc' = locToTop loc + l = locToTop loc shoulderHeight :: Float shoulderHeight = 18 diff --git a/src/Dodge/Projectile/Create.hs b/src/Dodge/Projectile/Create.hs index a2031ecc7..0935f96e3 100644 --- a/src/Dodge/Projectile/Create.hs +++ b/src/Dodge/Projectile/Create.hs @@ -36,10 +36,13 @@ createShell (p,q) mdetonator mscreen stab pjtype payload muz cr w = & updatedetonator & cWorld . lWorld . projectiles . at i ?~ Shell - { _pjPos = pos - , _pjVel = (rotateV dir' (V2 speed 0) + crvelcomponent) `v2z` 0 +-- { _pjPos = pos + { _pjPos = p +-- , _pjVel = (rotateV dir' (V2 speed 0) + crvelcomponent) `v2z` 0 + , _pjVel = (rotateV ddd (V2 speed 0) + crvelcomponent) `v2z` 0 , _pjID = i - , _pjDir = dir' +-- , _pjDir = dir' + , _pjDir = ddd , _pjSpin = 0 , _pjPayload = payload , _pjTimer = lifespan @@ -49,6 +52,7 @@ createShell (p,q) mdetonator mscreen stab pjtype payload muz cr w = , _pjScreenID = mscreen } where + ddd = Q.qToAng q crvelcomponent = case stab of Just StabOrthReduce -> projV (cr ^. crPos . _xy - cr ^. crOldPos . _xy) (unitVectorAtAngle dir) _ -> (cr ^. crPos - cr ^. crOldPos) ^. _xy diff --git a/src/Dodge/Projectile/Draw.hs b/src/Dodge/Projectile/Draw.hs index 4ec097078..803f0cc15 100644 --- a/src/Dodge/Projectile/Draw.hs +++ b/src/Dodge/Projectile/Draw.hs @@ -33,7 +33,7 @@ drawShell mcol pj = mcol shellShape :: Shape -shellShape = colorSH black $ upperPrismPoly Small Typical 4 $ map toV2 [(-6, 4), (-6, -4), (6, -4), (8, 0), (6, 4)] +shellShape = colorSH (greyN 0.5) $ upperPrismPoly Small Typical 4 $ map toV2 [(-6, 4), (-6, -4), (6, -4), (8, 0), (6, 4)] drawRemoteShell :: Projectile -> SPic drawRemoteShell pj diff --git a/src/Dodge/Projectile/Update.hs b/src/Dodge/Projectile/Update.hs index 7c8f5e13a..1ebc9320f 100644 --- a/src/Dodge/Projectile/Update.hs +++ b/src/Dodge/Projectile/Update.hs @@ -2,6 +2,11 @@ --{-# OPTIONS_GHC -Wno-unused-imports #-} module Dodge.Projectile.Update (updateProjectile) where +import Linear +import Dodge.Render.List +import Dodge.Render.Label +import ShortShow +import Picture.Base import Control.Monad import Data.List (delete) import Data.Maybe @@ -18,8 +23,6 @@ import Dodge.WorldEvent.Sound import Geometry import qualified IntMapHelp as IM import LensHelp -import Linear.Metric -import Linear.V3 import NewInt import RandomHelp @@ -257,16 +260,28 @@ moveStuckGrenade cid poff d pj w w & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjType .~ Grenade GStick moveProjectile :: Projectile -> World -> World -moveProjectile pj w +moveProjectile pj w = moveProjectile' pj w + & cWorld . lWorld . flares <>~ + (setLayer DebugLayer + $ color red $ line [p, (p +v)] + ) + where + p = pj^. pjPos . _xy + v = pj^. pjVel . _xy + + +moveProjectile' :: Projectile -> World -> World +moveProjectile' pj w | Just GStuckWall{} <- pj ^? pjType . gnHitEffect = w | Just (GStuckCreature crid poff d) <- pj ^? pjType . gnHitEffect = moveStuckGrenade crid poff d pj w - | (p, Just (n, OWall wl)) <- collide3 sp (sp + _pjVel pj) w = + | (p, Just (n, OWall wl)) <- collide3 sp (sp + 2 *^ _pjVel pj) w = shellHitWall p n wl pj w - | (p, Just (_, OFloor)) <- collide3 sp (sp + _pjVel pj) w = + | (p, Just (_, OFloor)) <- collide3 sp (sp + 2*^ _pjVel pj) w = shellHitFloor p pj w | (p, Just (_, OCreature cr)) <- collide3 sp (sp + _pjVel pj) w = shellHitCreature p cr pj w + & cWorld . lWorld . flares <>~ test p cr w sp (_pjVel pj) | (_, Just (_, OChasmWall)) <- collide3 sp (sp + _pjVel pj) w = -- no stick or bounce for now w & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjTimer .~ 0 @@ -278,6 +293,30 @@ moveProjectile pj w where sp = _pjPos pj +test p cr w sp v = + (setLayer FixedCoordLayer + $ uncurryV translate (worldPosToScreen (w ^. wCam) (p ^. _xy)) + $ drawList [text (shortShow p),text $shortShow sp, text $ shortShow $ sp + 2*v, text $ shortShow v] + <> color white (crossPic 5) + ) <> + (setLayer DebugLayer + $ uncurryV translate (p ^. _xy) + $ ( scale 0.1 0.1 + $ stackPicturesAt + [ text $ shortShow p + , text $ shortShow sp + , text $ shortShow (sp + v) + ] + ) <> color green (crossPic 5) + ) <> + setLayer DebugLayer + (uncurryV translate (cr ^. crPos . _xy) + $ circle 10 + ) <> + (setLayer DebugLayer + $ color red $ line [sp^. _xy, (sp +v)^._xy] + ) + explodeShell :: Projectile -> World -> World explodeShell pj w = w diff --git a/src/Geometry/Intersect.hs b/src/Geometry/Intersect.hs index 36614162e..e866650b1 100644 --- a/src/Geometry/Intersect.hs +++ b/src/Geometry/Intersect.hs @@ -360,24 +360,21 @@ intersectCircLine c r x y = f :: Float -> Point2 f a = x + (a *.* (y - x)) -intersectCylSeg :: - Point3 -> - Float -> - Float -> - Point3 -> - Point3 -> +intersectCylSeg :: Point3 -> Float -> Float -> Point3 -> Point3 -> (Maybe (Point3, Point3), Maybe (Point3, Point3)) intersectCylSeg p r h s e = fromMaybe (Nothing, Nothing) $ do (a, b) <- intersectCircLineAlong (p ^. _xy) r (s ^. _xy) (e ^. _xy) return (f min a, f max b) where - mtopx = intersectLinePlaneAlong s e (V3 0 0 h) (V3 0 0 1) - mbotx = intersectLinePlaneAlong s e (V3 0 0 0) (V3 0 0 1) + mtopx = intersectLinePlaneAlong s e (V3 0 0 (h + p ^. _z)) (V3 0 0 1) + mbotx = intersectLinePlaneAlong s e (V3 0 0 (p^._z)) (V3 0 0 1) v = e - s f mm a = do let x = s + a *.*.* v if x ^. _z < (h + p ^. _z) && x ^. _z > (p ^. _z) - then return (x, v & _xy %~ reflectInNormal (x ^. _xy - p ^. _xy)) + then do + guard $ a >= 0 && a < 1 + return (x, v & _xy %~ reflectInNormal (x ^. _xy - p ^. _xy)) else do topx <- mtopx botx <- mbotx diff --git a/src/ShortShow.hs b/src/ShortShow.hs index 06b103d24..14af8fc0b 100644 --- a/src/ShortShow.hs +++ b/src/ShortShow.hs @@ -9,6 +9,10 @@ class ShortShow a where instance ShortShow a => ShortShow (V2 a) where shortShow (V2 x y) = shortShow x ++ "#" ++ shortShow y +instance ShortShow a => ShortShow (V3 a) where + shortShow (V3 x y z) = shortShow x ++ "#" ++ shortShow y + ++ "#" ++ shortShow z + newtype ShortString = SString String instance ShortShow ShortString where diff --git a/tags b/tags index 850d9fd1c..02e773847 100644 --- a/tags +++ b/tags @@ -1184,7 +1184,7 @@ SPEEDLEGS src/Dodge/Data/Item/Combine.hs 130;" C SPRING src/Dodge/Data/Item/Combine.hs 54;" C SPic src/ShapePicture/Data.hs 7;" t SQUARE src/Dodge/Data/GenParams.hs 20;" C -SString src/ShortShow.hs 12;" C +SString src/ShortShow.hs 16;" C ST src/Dodge/Data/MetaTree.hs 20;" C STEELDRUM src/Dodge/Data/Item/Combine.hs 59;" C STICKYMOD src/Dodge/Data/Item/Combine.hs 24;" C @@ -1231,7 +1231,7 @@ Shockwave src/Dodge/Data/Shockwave.hs 17;" t ShockwaveDirection src/Dodge/Data/Shockwave.hs 14;" t ShootAt src/Dodge/Data/ActionPlan.hs 181;" C ShortShow src/ShortShow.hs 6;" c -ShortString src/ShortShow.hs 12;" t +ShortString src/ShortShow.hs 16;" t Show_bound_box src/Dodge/Data/Config.hs 80;" C Show_dda_test src/Dodge/Data/Config.hs 83;" C Show_far_wall_detect src/Dodge/Data/Config.hs 86;" C @@ -2634,7 +2634,7 @@ anythingHitCirc src/Dodge/Base/Collide.hs 337;" f applyCME src/Dodge/HeldUse.hs 362;" f applyCreatureDamage src/Dodge/Creature/Damage.hs 14;" f applyEventIO src/Loop.hs 89;" f -applyGravityPU src/Dodge/Projectile/Update.hs 41;" f +applyGravityPU src/Dodge/Projectile/Update.hs 42;" f applyIndividualDamage src/Dodge/Creature/Damage.hs 17;" f applyInvLock src/Dodge/HeldUse.hs 421;" f applyMagnetsToBul src/Dodge/Bullet.hs 32;" f @@ -3036,16 +3036,16 @@ createHeadLamp src/Dodge/Euse.hs 58;" f createItemYou src/Dodge/Inventory/Add.hs 61;" f createLightMap src/Render.hs 26;" f createPathGrid src/Dodge/Room/Path.hs 20;" f -createProjectile src/Dodge/HeldUse.hs 1309;" f -createProjectileR src/Dodge/HeldUse.hs 1258;" f +createProjectile src/Dodge/HeldUse.hs 1320;" f +createProjectileR src/Dodge/HeldUse.hs 1269;" f createShell src/Dodge/Projectile/Create.hs 22;" f createShieldWall src/Dodge/Item/BackgroundEffect.hs 40;" f createUnusedLinkPos src/Dodge/Tree/Shift.hs 124;" f createWall src/Dodge/Wall/Create.hs 8;" f creatureDisplayText src/Dodge/Creature/Picture/Awareness.hs 12;" f -creatureShootLaser src/Dodge/HeldUse.hs 816;" f -creatureShootPulseBall src/Dodge/HeldUse.hs 893;" f -creatureShootPulseLaser src/Dodge/HeldUse.hs 860;" f +creatureShootLaser src/Dodge/HeldUse.hs 827;" f +creatureShootPulseBall src/Dodge/HeldUse.hs 904;" f +creatureShootPulseLaser src/Dodge/HeldUse.hs 871;" f creatureTurnTo src/Dodge/Creature/Impulse/Movement.hs 54;" f creatureTurnToward src/Dodge/Creature/Impulse/Movement.hs 75;" f creatureTurnTowardDir src/Dodge/Creature/Impulse/Movement.hs 64;" f @@ -3211,12 +3211,12 @@ destroyMatS src/Dodge/Material/Sound.hs 7;" f destroyMcType src/Dodge/Machine/Destroy.hs 22;" f destroyMount src/Dodge/Block.hs 100;" f destroyMounts src/Dodge/Block.hs 97;" f -destroyProjectile src/Dodge/Projectile/Update.hs 159;" f +destroyProjectile src/Dodge/Projectile/Update.hs 160;" f detV src/Geometry/Vector.hs 94;" f detector src/Dodge/Item/Held/Utility.hs 27;" f detectorColor src/Dodge/Item/Draw/SPic.hs 453;" f detectorInfo src/Dodge/Item/Info.hs 224;" f -determineProjectileTracking src/Dodge/HeldUse.hs 1229;" f +determineProjectileTracking src/Dodge/HeldUse.hs 1240;" f diagonalLinesRect src/Dodge/Room/Foreground.hs 52;" f did src/Dodge/Item/InvSize.hs 54;" f diffAngles src/Geometry.hs 205;" f @@ -3246,7 +3246,7 @@ dmType src/Dodge/Damage.hs 38;" f doAimTwist src/Dodge/Creature/YourControl.hs 154;" f doAnyEquipmentEffect src/Dodge/Creature/State.hs 141;" f doBackspace src/Dodge/Update/Input/Text.hs 31;" f -doBarrelSpin src/Dodge/Projectile/Update.hs 211;" f +doBarrelSpin src/Dodge/Projectile/Update.hs 212;" f doBlBl src/Dodge/BlBl.hs 5;" f doBlSh src/Dodge/Block/Draw.hs 14;" f doBounce src/Dodge/Base/Collide.hs 67;" f @@ -3276,8 +3276,8 @@ doDrag src/Dodge/Update/Input/InGame.hs 127;" f doDrawing src/Dodge/Render.hs 34;" f doDrawing' src/Dodge/Render.hs 45;" f doFloatFloat src/Dodge/FloatFunction.hs 5;" f -doGenFloat src/Dodge/HeldUse.hs 1185;" f -doGravityPU src/Dodge/Projectile/Update.hs 35;" f +doGenFloat src/Dodge/HeldUse.hs 1196;" f +doGravityPU src/Dodge/Projectile/Update.hs 36;" f doHeldUseEffect src/Dodge/HeldUse.hs 344;" f doInPlacements src/Dodge/Layout.hs 82;" f doIndividualPlacements src/Dodge/Layout.hs 96;" f @@ -3308,7 +3308,7 @@ doStrategyActions src/Dodge/Creature/ReaderUpdate.hs 167;" f doTestDrawing src/Dodge/Render.hs 41;" f doTextInputOver src/Dodge/Update/Input/Text.hs 15;" f doTextInputOverUniverse src/Dodge/Update/Input/Text.hs 12;" f -doThrust src/Dodge/Projectile/Update.hs 181;" f +doThrust src/Dodge/Projectile/Update.hs 182;" f doTimeScroll src/Dodge/Update.hs 196;" f doTmWdWd src/Dodge/WorldEffect.hs 89;" f doWallRotate src/Dodge/Update/Camera.hs 220;" f @@ -3467,7 +3467,7 @@ drawZoneCol src/Dodge/Debug/Picture.hs 149;" f drawZoneNearPointCursor src/Dodge/Debug/Picture.hs 285;" f dropAll src/Dodge/Creature/Update.hs 129;" f dropExcept src/Dodge/Creature/Action.hs 168;" f -dropInventoryPath src/Dodge/HeldUse.hs 1397;" f +dropInventoryPath src/Dodge/HeldUse.hs 1408;" f dropItem src/Dodge/Creature/Action.hs 175;" f dropper src/Dodge/Item/Scope.hs 76;" f drumMag src/Dodge/Item/Ammo.hs 34;" f @@ -3544,7 +3544,7 @@ expandPolyByFixed src/Dodge/LevelGen/StaticWalls.hs 97;" f expandPolyCorners src/Dodge/LevelGen/StaticWalls.hs 103;" f expandToSquare src/Dodge/LevelGen/StaticWalls/Deprecated.hs 83;" f expireAndDamage src/Dodge/Bullet.hs 187;" f -explodeShell src/Dodge/Projectile/Update.hs 281;" f +explodeShell src/Dodge/Projectile/Update.hs 285;" f explosionS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 556;" f explosiveBarrel src/Dodge/Creature/Inanimate.hs 25;" f extTrigLitPos src/Dodge/Placement/Instance/Button.hs 84;" f @@ -3556,7 +3556,7 @@ extractRoomPos src/Dodge/RoomPos.hs 6;" f faceEdges src/Polyhedra.hs 65;" f facesToVF src/Polyhedra/Geodesic.hs 69;" f farWallDistDirection src/Dodge/Update/Camera.hs 241;" f -fdiv src/ShortShow.hs 37;" f +fdiv src/ShortShow.hs 41;" f feet src/Dodge/Creature/Picture.hs 51;" f ffoldM src/Framebuffer/Update.hs 79;" f filter3 src/FoldableHelp.hs 76;" f @@ -3645,7 +3645,7 @@ fusePairs src/Dodge/Path.hs 153;" f fusePoint src/Dodge/LevelGen/StaticWalls.hs 158;" f fuseWall src/Dodge/LevelGen/StaticWalls.hs 165;" f fuseWallsWith src/Dodge/LevelGen/StaticWalls.hs 172;" f -g src/ShortShow.hs 44;" f +g src/ShortShow.hs 48;" f gLauncher src/Dodge/Item/Held/Launcher.hs 24;" f gRandify src/Dodge/Randify.hs 11;" f gadgetEffect src/Dodge/HeldUse.hs 47;" f @@ -3655,7 +3655,7 @@ gameRoomViewpoints src/Dodge/Viewpoints.hs 35;" f gameRoomsFromRooms src/Dodge/Layout.hs 144;" f gameplayMenu src/Dodge/Menu.hs 155;" f gameplayMenuOptions src/Dodge/Menu.hs 158;" f -gasType src/Dodge/HeldUse.hs 1142;" f +gasType src/Dodge/HeldUse.hs 1153;" f generateGenParams src/Dodge/LevelGen/LevelStructure.hs 23;" f generateGraphs src/Dodge/Menu.hs 149;" f generateLayout src/Dodge/Layout/Generate.hs 10;" f @@ -3668,11 +3668,11 @@ geometryUnitTests test/Spec.hs 22;" f geqConstr src/SameConstr.hs 21;" f getAimZoom src/Dodge/Update/Camera.hs 143;" f getAmmoLinks src/Dodge/Item/Grammar.hs 104;" f -getAttachedSFLink src/Dodge/HeldUse.hs 762;" f +getAttachedSFLink src/Dodge/HeldUse.hs 773;" f getAutoSpringLinks src/Dodge/Item/Grammar.hs 85;" f getAvailableListLines src/Dodge/SelectionList.hs 10;" f getBulHitDams src/Dodge/Bullet.hs 172;" f -getBulletType src/Dodge/HeldUse.hs 925;" f +getBulletType src/Dodge/HeldUse.hs 936;" f getCloseObj src/Dodge/Update/Input/InGame.hs 533;" f getCommand src/Dodge/Terminal.hs 52;" f getCommands src/Dodge/Terminal.hs 49;" f @@ -3680,7 +3680,7 @@ getCrMoveSpeed src/Dodge/Creature/Statistics.hs 50;" f getCrsFromRooms src/Dodge/Room/Tutorial.hs 323;" f getCrsFromRooms' src/Dodge/Room/Tutorial.hs 310;" f getDistortions src/Dodge/Render.hs 435;" f -getGrenadeHitEffect src/Dodge/HeldUse.hs 1297;" f +getGrenadeHitEffect src/Dodge/HeldUse.hs 1308;" f getInventoryPath src/Dodge/Inventory/Path.hs 9;" f getItemValue src/Dodge/Inventory/SelectionList.hs 147;" f getLaserColor src/Dodge/HeldUse.hs 704;" f @@ -3690,7 +3690,7 @@ getLinksOfType src/Dodge/RoomLink.hs 41;" f getMaxLinesTM src/Dodge/Terminal/Type.hs 6;" f getMenuMouseContext src/Dodge/Update.hs 372;" f getNodePos src/Dodge/Path.hs 31;" f -getPJStabiliser src/Dodge/HeldUse.hs 1284;" f +getPJStabiliser src/Dodge/HeldUse.hs 1295;" f getPretty src/AesonHelp.hs 8;" f getPromptTM src/Dodge/Terminal/Type.hs 3;" f getRoomsFromInts src/Dodge/Room/Tutorial.hs 306;" f @@ -3759,7 +3759,7 @@ handleMouseButtonEvent src/Dodge/Event/Input.hs 61;" f handleMouseMotionEvent src/Dodge/Event/Input.hs 47;" f handleMouseWheelEvent src/Dodge/Event/Input.hs 56;" f handleOrient src/Dodge/Item/HeldOffset.hs 31;" f -handlePos src/Dodge/Item/HeldOffset.hs 84;" f +handlePos src/Dodge/Item/HeldOffset.hs 83;" f handleResizeEvent src/Dodge/Event.hs 53;" f handleTextInput src/Dodge/Event/Input.hs 19;" f handleWindowMoveEvent src/Dodge/Event.hs 44;" f @@ -3782,14 +3782,14 @@ heldAimStance src/Dodge/Item/AimStance.hs 24;" f heldAimZoom src/Dodge/Update/Camera.hs 149;" f heldEffect src/Dodge/HeldUse.hs 60;" f heldEffectMuzzles src/Dodge/HeldUse.hs 131;" f -heldHandlePos src/Dodge/Item/HeldOffset.hs 90;" f +heldHandlePos src/Dodge/Item/HeldOffset.hs 89;" f heldInfo src/Dodge/Item/Info.hs 92;" f heldItemAmmoSlots src/Dodge/Item/AmmoSlots.hs 19;" f heldItemBulkiness src/Dodge/Creature/YourControl.hs 194;" f heldItemInvLock src/Dodge/HeldUse.hs 435;" f -heldItemMuzVel src/Dodge/HeldUse.hs 1022;" f +heldItemMuzVel src/Dodge/HeldUse.hs 1033;" f heldItemMuzzles src/Dodge/HeldUse.hs 176;" f -heldItemRifling src/Dodge/HeldUse.hs 1065;" f +heldItemRifling src/Dodge/HeldUse.hs 1076;" f heldItemSPic src/Dodge/Item/Draw/SPic.hs 233;" f heldItemWeight src/Dodge/Creature/Statistics.hs 80;" f heldPositionInfo src/Dodge/Item/Info.hs 240;" f @@ -3949,7 +3949,7 @@ itemBlips src/Dodge/RadarSweep.hs 94;" f itemBulkiness src/Dodge/Creature/YourControl.hs 188;" f itemCombinations src/Dodge/Combine/Combinations.hs 56;" f itemCombinationsEdges src/Dodge/Combine/Graph.hs 61;" f -itemDetectorEffect src/Dodge/HeldUse.hs 768;" f +itemDetectorEffect src/Dodge/HeldUse.hs 779;" f itemDisplay src/Dodge/Inventory/SelectionList.hs 50;" f itemEquipPict src/Dodge/Item/Draw.hs 18;" f itemExternalValue src/Dodge/Inventory/SelectionList.hs 85;" f @@ -3998,8 +3998,8 @@ jsps0J src/Dodge/LevelGen/PlacementHelper.hs 48;" f jspsJ src/Dodge/LevelGen/PlacementHelper.hs 45;" f jumpLegs src/Dodge/Item/Equipment.hs 93;" f justify src/Justify.hs 9;" f -k src/ShortShow.hs 44;" f -k' src/ShortShow.hs 44;" f +k src/ShortShow.hs 48;" f +k' src/ShortShow.hs 48;" f keyCard src/Dodge/Item/Held/Utility.hs 20;" f keyCardAnalyserByDoor src/Dodge/Room/LasTurret.hs 78;" f keyCardRoomRunPast src/Dodge/Room/LasTurret.hs 66;" f @@ -4125,13 +4125,13 @@ lsColPosRad src/Dodge/LightSource.hs 29;" f lsPosCol src/Dodge/LightSource.hs 26;" f lsPosRad src/Dodge/LightSource.hs 17;" f ltAutoCrit src/Dodge/Creature/LtAutoCrit.hs 12;" f -m src/ShortShow.hs 44;" f +m src/ShortShow.hs 48;" f mAT src/Dodge/Item/MagAmmoType.hs 19;" f machineAddSound src/Dodge/Machine.hs 50;" f machinePistol src/Dodge/Item/Held/Stick.hs 52;" f machineUpdateDeathEff src/Dodge/Machine.hs 35;" f machineUpdateLiveDieEff src/Dodge/Machine.hs 17;" f -magAmmoParams src/Dodge/HeldUse.hs 946;" f +magAmmoParams src/Dodge/HeldUse.hs 957;" f magAmmoType src/Dodge/Item/MagAmmoType.hs 11;" f magShield src/Dodge/Item/Equipment.hs 27;" f magV src/Geometry/Vector.hs 172;" f @@ -4146,7 +4146,7 @@ makeAttach src/Dodge/Item/Attach.hs 10;" f makeBlip src/Dodge/RadarSweep.hs 70;" f makeBlockDebris src/Dodge/Block/Debris.hs 34;" f makeBoolOption src/Dodge/Menu/OptionType.hs 8;" f -makeBullet src/Dodge/HeldUse.hs 1003;" f +makeBullet src/Dodge/HeldUse.hs 1014;" f makeButton src/Dodge/LevelGen/Switch.hs 16;" f makeByteStringShaderUsingVAO src/Shader/Compile.hs 128;" f makeCloudAt src/Dodge/WorldEvent/Cloud.hs 7;" f @@ -4224,11 +4224,11 @@ mcProxSensorUpdate src/Dodge/Machine/Update.hs 139;" f mcProxTest src/Dodge/Machine/Update.hs 203;" f mcProximitySensorUpdate src/Dodge/Machine/Update.hs 171;" f mcSPic src/Dodge/Render/ShapePicture.hs 135;" f -mcShootAuto src/Dodge/HeldUse.hs 1196;" f -mcShootLaser src/Dodge/HeldUse.hs 1189;" f +mcShootAuto src/Dodge/HeldUse.hs 1207;" f +mcShootLaser src/Dodge/HeldUse.hs 1200;" f mcTriggerVal src/Dodge/Machine/Update.hs 110;" f mcTypeUpdate src/Dodge/Machine/Update.hs 32;" f -mcUseHeld src/Dodge/HeldUse.hs 1108;" f +mcUseHeld src/Dodge/HeldUse.hs 1119;" f mcUseItem src/Dodge/Machine/Update.hs 89;" f megaBattery src/Dodge/Item/Ammo.hs 55;" f megaShellMag src/Dodge/Item/Ammo.hs 44;" f @@ -4298,10 +4298,10 @@ moveCombineSel src/Dodge/Update/Scroll.hs 121;" f moveInverseShockwave src/Dodge/Shockwave/Update.hs 44;" f moveLSThen src/Dodge/Placement/Instance/LightSource.hs 43;" f movePenBullet src/Dodge/Bullet.hs 202;" f -moveProjectile src/Dodge/Projectile/Update.hs 259;" f +moveProjectile src/Dodge/Projectile/Update.hs 260;" f moveRoomBy src/Dodge/Room/Link.hs 53;" f moveShockwave src/Dodge/Shockwave/Update.hs 13;" f -moveStuckGrenade src/Dodge/Projectile/Update.hs 245;" f +moveStuckGrenade src/Dodge/Projectile/Update.hs 246;" f moveToSideNthOutLink src/Dodge/Room/Warning.hs 69;" f moveWall src/Dodge/Wall/Move.hs 29;" f moveWallID src/Dodge/Wall/Move.hs 24;" f @@ -4318,6 +4318,7 @@ multiLookupTrie src/SimpleTrie.hs 57;" f multiLookupTrieI src/SimpleTrie.hs 66;" f muout src/Dodge/RoomLink.hs 144;" f muzFlareAt src/Dodge/HeldUse.hs 675;" f +muzzlePos src/Dodge/HeldUse.hs 764;" f mvButton src/Dodge/Placement/PlaceSpot.hs 181;" f mvCr src/Dodge/Placement/PlaceSpot.hs 187;" f mvFS src/Dodge/Placement/PlaceSpot.hs 193;" f @@ -4417,7 +4418,7 @@ overlapSegWalls src/Dodge/Base/Collide.hs 202;" f overrideInternal src/Dodge/Creature/ReaderUpdate.hs 175;" f overrideMeleeCloseTarget src/Dodge/Creature/ReaderUpdate.hs 36;" f overwriteLabel src/Dodge/Tree/Compose.hs 31;" f -p src/ShortShow.hs 44;" f +p src/ShortShow.hs 48;" f pContID src/Dodge/LevelGen/PlacementHelper.hs 15;" f pairInPolys src/Dodge/Room/Path.hs 45;" f pairPolyPointsIntersect src/Geometry/ConvexPoly.hs 70;" f @@ -4466,7 +4467,7 @@ pingPongBetween src/Render.hs 221;" f pipe src/Dodge/Item/Craftable.hs 32;" f pistol src/Dodge/Item/Held/Stick.hs 40;" f pistolerRoom src/Dodge/Room/Room.hs 330;" f -pjRemoteSetDirection src/Dodge/Projectile/Update.hs 224;" f +pjRemoteSetDirection src/Dodge/Projectile/Update.hs 225;" f plBlock src/Dodge/Placement/PlaceSpot/Block.hs 18;" f plDoor src/Dodge/Placement/PlaceSpot/TriggerDoor.hs 22;" f plLineBlock src/Dodge/Placement/PlaceSpot/Block.hs 50;" f @@ -4748,8 +4749,8 @@ rememberSounds src/Dodge/Creature/Perception.hs 178;" f remoteDetonator src/Dodge/Item/Scope.hs 144;" f remoteScreen src/Dodge/Item/Scope.hs 139;" f removeAimPosture src/Dodge/Creature/YourControl.hs 159;" f -removeAmmoFromMag src/Dodge/HeldUse.hs 921;" f -removeDot src/ShortShow.hs 40;" f +removeAmmoFromMag src/Dodge/HeldUse.hs 932;" f +removeDot src/ShortShow.hs 44;" f removeInverseWalls src/Dodge/LevelGen/StaticWalls.hs 25;" f removeLights src/Dodge/Room/Tutorial.hs 224;" f removeShieldWall src/Dodge/Item/BackgroundEffect.hs 58;" f @@ -5003,10 +5004,10 @@ shapeVerxSize src/Shape/Parameters.hs 10;" f shatterGun src/Dodge/Item/Held/Weapons.hs 8;" f shatterGunSPic src/Dodge/Item/Draw/SPic.hs 312;" f shatterWall src/Dodge/Item/Weapon/Shatter.hs 27;" f -shellExplosionCheck src/Dodge/Projectile/Update.hs 55;" f -shellHitCreature src/Dodge/Projectile/Update.hs 83;" f -shellHitFloor src/Dodge/Projectile/Update.hs 99;" f -shellHitWall src/Dodge/Projectile/Update.hs 66;" f +shellExplosionCheck src/Dodge/Projectile/Update.hs 56;" f +shellHitCreature src/Dodge/Projectile/Update.hs 84;" f +shellHitFloor src/Dodge/Projectile/Update.hs 100;" f +shellHitWall src/Dodge/Projectile/Update.hs 67;" f shellMag src/Dodge/Item/Ammo.hs 49;" f shellModule src/Dodge/Item/Scope.hs 123;" f shellShape src/Dodge/Projectile/Draw.hs 35;" f @@ -5032,16 +5033,16 @@ shiftRoomShiftToLink src/Dodge/Room/Link.hs 70;" f shiftedGrid src/Grid.hs 25;" f shineTargetLaser src/Dodge/Creature/State.hs 201;" f shineTorch src/Dodge/Creature/State.hs 238;" f -shootBullet src/Dodge/HeldUse.hs 988;" f -shootBullets src/Dodge/HeldUse.hs 978;" f +shootBullet src/Dodge/HeldUse.hs 999;" f +shootBullets src/Dodge/HeldUse.hs 989;" f shootFirstMiss src/Dodge/Creature/Volition.hs 34;" f -shootLaser src/Dodge/HeldUse.hs 839;" f -shootPulseBall src/Dodge/HeldUse.hs 907;" f -shootPulseLaser src/Dodge/HeldUse.hs 880;" f +shootLaser src/Dodge/HeldUse.hs 850;" f +shootPulseBall src/Dodge/HeldUse.hs 918;" f +shootPulseLaser src/Dodge/HeldUse.hs 891;" f shootShatter src/Dodge/Item/Weapon/Shatter.hs 12;" f -shootTeslaArc src/Dodge/HeldUse.hs 1212;" f +shootTeslaArc src/Dodge/HeldUse.hs 1223;" f shootTillEmpty src/Dodge/Creature/Volition.hs 19;" f -shootTractorBeam src/Dodge/HeldUse.hs 795;" f +shootTractorBeam src/Dodge/HeldUse.hs 806;" f shootersRoom src/Dodge/Room/Room.hs 324;" f shootersRoom' src/Dodge/Room/Room.hs 291;" f shootersRoom1 src/Dodge/Room/Room.hs 314;" f @@ -5049,7 +5050,7 @@ shootingRange src/Dodge/Room/Room.hs 341;" f shortPoint2 src/Dodge/ShortShow.hs 4;" f shortShow src/ShortShow.hs 7;" f shotgunS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 708;" f -shoulderHeight src/Dodge/Item/HeldOffset.hs 69;" f +shoulderHeight src/Dodge/Item/HeldOffset.hs 68;" f shoulderSH src/Dodge/Creature/Picture.hs 124;" f showAttachItem src/Dodge/Item/Display.hs 92;" f showEnabledDebugs src/Dodge/Debug/Picture.hs 156;" f @@ -5195,7 +5196,7 @@ strFromEquipment src/Dodge/Creature/Statistics.hs 53;" f strFromHeldItem src/Dodge/Creature/Statistics.hs 67;" f strengthFactor src/Dodge/Creature/Impulse/Movement.hs 37;" f strictify src/MaybeHelp.hs 37;" f -strideRot src/Dodge/Item/HeldOffset.hs 72;" f +strideRot src/Dodge/Item/HeldOffset.hs 71;" f stringToList src/Picture/Base.hs 313;" f stringToListGrad src/Picture/Text.hs 12;" f stripZ src/Geometry/Vector3D.hs 97;" f @@ -5211,7 +5212,7 @@ swarmCrit src/Dodge/Creature/SwarmCrit.hs 10;" f swarmUsingCenter src/Dodge/Creature/Boid.hs 176;" f switchDoor src/Dodge/Placement/Instance/Door.hs 104;" f switchWallCol src/Dodge/Default/Door.hs 12;" f -t src/ShortShow.hs 44;" f +t src/ShortShow.hs 48;" f tEast src/Dodge/Room/Corridor.hs 90;" f tToBTree src/Dodge/Tree/Compose.hs 92;" f tWest src/Dodge/Room/Corridor.hs 115;" f @@ -5255,6 +5256,7 @@ terminalWheelEvent src/Dodge/Update/Scroll.hs 131;" f teslaGun src/Dodge/Item/Held/BatteryGuns.hs 19;" f teslaGunPic src/Dodge/Item/Draw/SPic.hs 409;" f teslaParams src/Dodge/Item/Held/BatteryGuns.hs 25;" f +test src/Dodge/Projectile/Update.hs 283;" f testCrossWalls src/Dodge/Room/Path.hs 41;" f testEvent src/Dodge/Event/Test.hs 9;" f testInventory src/Dodge/Creature.hs 292;" f @@ -5338,7 +5340,7 @@ torqueCr src/Dodge/WorldEffect.hs 72;" f torso src/Dodge/Creature/Picture.hs 102;" f tractCr src/Dodge/TractorBeam/Update.hs 28;" f tractFlIt src/Dodge/TractorBeam/Update.hs 23;" f -tractorBeamAt src/Dodge/HeldUse.hs 807;" f +tractorBeamAt src/Dodge/HeldUse.hs 818;" f tractorGun src/Dodge/Item/Held/BatteryGuns.hs 53;" f tractorGunPic src/Dodge/Item/Draw/SPic.hs 437;" f tractorPullPos src/Dodge/TractorBeam/Update.hs 33;" f @@ -5398,9 +5400,9 @@ tryPlay src/Sound.hs 84;" f tryPutItemInInv src/Dodge/Inventory/Add.hs 24;" f tryPutItemInInvAt src/Dodge/Inventory/Add.hs 53;" f trySeedFromClipboard src/Dodge/Menu.hs 96;" f -trySpin src/Dodge/Projectile/Update.hs 169;" f +trySpin src/Dodge/Projectile/Update.hs 170;" f trySynthBullet src/Dodge/Creature/State.hs 167;" f -tryThrust src/Dodge/Projectile/Update.hs 175;" f +tryThrust src/Dodge/Projectile/Update.hs 176;" f tryUseParent src/Dodge/Creature/State.hs 145;" f turnTo src/Dodge/Movement/Turn.hs 8;" f turret src/Dodge/Placement/Instance/Turret.hs 37;" f @@ -5417,7 +5419,7 @@ twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 81;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 29;" f twists src/Dodge/Creature/Test.hs 100;" f twoFlat src/Dodge/Creature/Test.hs 97;" f -twoFlatHRot src/Dodge/Item/HeldOffset.hs 81;" f +twoFlatHRot src/Dodge/Item/HeldOffset.hs 80;" f twoHandTwistAmount src/Dodge/Creature/YourControl.hs 166;" f twoRoomPoss src/Dodge/PlacementSpot.hs 146;" f twoStep1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 544;" f @@ -5516,7 +5518,7 @@ updateObjCatMaybes src/Dodge/Update.hs 533;" f updateObjMapMaybe src/Dodge/Update.hs 526;" f updatePastWorlds src/Dodge/Update.hs 408;" f updatePreload src/Preload/Update.hs 20;" f -updateProjectile src/Dodge/Projectile/Update.hs 26;" f +updateProjectile src/Dodge/Projectile/Update.hs 27;" f updateProp src/Dodge/Prop/Update.hs 11;" f updatePulse src/Dodge/Creature/Update.hs 146;" f updatePulseBall src/Dodge/Update.hs 433;" f @@ -5578,9 +5580,9 @@ upperPrismPolySU src/Shape.hs 114;" f upperPrismPolyTS src/Shape.hs 120;" f upperRounded src/Shape.hs 185;" f useBulletPayload src/Dodge/Bullet.hs 116;" f -useGasParams src/Dodge/HeldUse.hs 1113;" f +useGasParams src/Dodge/HeldUse.hs 1124;" f useHotkey src/Dodge/Creature/YourControl.hs 77;" f -useInventoryPath src/Dodge/HeldUse.hs 1428;" f +useInventoryPath src/Dodge/HeldUse.hs 1439;" f useItem src/Dodge/Creature/Impulse/UseItem.hs 19;" f useItemLoc src/Dodge/Creature/Impulse/UseItem.hs 26;" f useLnkRoomPos src/Dodge/PlacementSpot.hs 255;" f @@ -5588,11 +5590,11 @@ useLoadedAmmo src/Dodge/HeldUse.hs 717;" f useMagShield src/Dodge/Euse.hs 30;" f useNormalCamera src/Dodge/Camera.hs 6;" f usePayload src/Dodge/Payload.hs 18;" f -useRewindGun src/Dodge/HeldUse.hs 1388;" f +useRewindGun src/Dodge/HeldUse.hs 1399;" f useRoomPosCond src/Dodge/PlacementSpot.hs 180;" f useRoomPosRoomCond src/Dodge/PlacementSpot.hs 183;" f -useStopWatch src/Dodge/HeldUse.hs 1369;" f -useTimeScrollGun src/Dodge/HeldUse.hs 1377;" f +useStopWatch src/Dodge/HeldUse.hs 1380;" f +useTimeScrollGun src/Dodge/HeldUse.hs 1388;" f useUnusedLnk src/Dodge/PlacementSpot.hs 171;" f usedRoomInLinkPoss src/Dodge/PlacementSpot.hs 202;" f usedRoomLinkPoss src/Dodge/PlacementSpot.hs 209;" f @@ -5626,7 +5628,7 @@ visionCheck src/Dodge/Creature/Perception.hs 153;" f vocalizationTest src/Dodge/Creature/Vocalization.hs 42;" f volleyGun src/Dodge/Item/Held/Cane.hs 15;" f volleyGunShape src/Dodge/Item/Draw/SPic.hs 357;" f -walkNozzle src/Dodge/HeldUse.hs 783;" f +walkNozzle src/Dodge/HeldUse.hs 794;" f walkableNodeNear src/Dodge/Path.hs 48;" f wallBlips src/Dodge/RadarSweep.hs 99;" f wallBuffer src/Dodge/WallCreatureCollisions.hs 53;" f @@ -5635,7 +5637,7 @@ wallLine src/Dodge/Placement/Instance/Wall.hs 71;" f wallToSurface src/Dodge/Base/Collide.hs 171;" f wallsFromRooms src/Dodge/Layout.hs 132;" f wallsToDraw src/Dodge/Render/Walls.hs 17;" f -warmupSound src/Dodge/HeldUse.hs 1422;" f +warmupSound src/Dodge/HeldUse.hs 1433;" f warningRooms src/Dodge/Room/Warning.hs 30;" f wasdAim src/Dodge/Creature/YourControl.hs 133;" f wasdDir src/Dodge/WASD.hs 17;" f