From 2a93b7f733eac1d9b1a52116bae5320e6e0d6f57 Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 3 Aug 2025 23:23:55 +0100 Subject: [PATCH] Start implementing wider grenade movement --- src/Dodge/Base/Collide.hs | 67 ++++++++++---- src/Dodge/Data/Object.hs | 2 + src/Dodge/Projectile/Update.hs | 107 ++++++++++++--------- src/Dodge/Prop/Moving.hs | 4 +- src/Geometry/Intersect.hs | 2 +- tags | 164 ++++++++++++++++----------------- 6 files changed, 200 insertions(+), 146 deletions(-) diff --git a/src/Dodge/Base/Collide.hs b/src/Dodge/Base/Collide.hs index 026bdb29f..d754a55a7 100644 --- a/src/Dodge/Base/Collide.hs +++ b/src/Dodge/Base/Collide.hs @@ -33,10 +33,11 @@ module Dodge.Base.Collide ( canSeeIndirect, isWalkable, anythingHitCirc, + collide3WallsFloor, collide3, ) where ---import qualified Data.IntMap.Strict as IM +import Dodge.Data.Object import Control.Monad import Dodge.Creature.Radius import Control.Lens @@ -48,6 +49,7 @@ import Dodge.Data.World import Dodge.Zoning import FoldableHelp import Geometry +import Linear.Metric collidePoint :: Point2 -> Point2 -> [Wall] -> (Point2, Maybe Wall) {-# INLINE collidePoint #-} @@ -83,36 +85,63 @@ bouncePoint :: (Wall -> Bool) -> Float -> Point2 -> Point2 -> World -> Maybe (Po {-# INLINE bouncePoint #-} bouncePoint t x sp ep = doBounce x sp ep . collidePointWallsFilter t sp ep -collide3 :: Point3 -> Point3 -> World -> (Point3, Maybe Point3) -collide3 sp ep w = collide3Floors sp (w ^. cWorld . chasms) +type MPO = Maybe (Point3,Object) + +collide3WallsFloor :: Point3 -> Point3 -> World -> (Point3, MPO) +collide3WallsFloor sp ep w = collide3Floors sp (w ^. cWorld . chasms) $ collide3Walls sp w (ep,Nothing) --- Just (hitpoint,normaltosurface) -collide3Walls :: Point3 -> World -> (Point3, Maybe Point3) -> (Point3, Maybe Point3) -collide3Walls sp w (ep,mn) = collide3Part sp wsfs (ep,mn) +collide3 :: Point3 -> Point3 -> World -> (Point3,MPO) +collide3 sp ep w = foldl' (flip $ collide3Creature sp) (p,m) + $ crsNearSeg (xyV3 sp) (xyV3 p) w where - wsfs = f <$> wlsNearSeg (xyV3 sp) (xyV3 ep) w - f wl = (g x, g $ vNormal (x-y), [(g x,g (y-x)),(g y,g (x-y))]) - where - g = (`v2z` 0) - (x,y) = _wlLine wl + (p,m) = collide3WallsFloor sp ep w -collide3Floors :: Point3 -> [[Point2]] -> (Point3, Maybe Point3) -> (Point3, Maybe Point3) -collide3Floors sp cs (ep,mn) = maybe (ep,mn) (,Just (V3 0 0 1)) mp +-- Just (hitpoint,normaltosurface) +collide3Walls :: Point3 -> World -> (Point3, MPO) -> (Point3, MPO) +collide3Walls sp w ex@(ep,_) = foldl' f ex wls + where + f x wl = collide3Wall sp wl x + wls = wlsNearSeg (xyV3 sp) (xyV3 ep) w + +collide3Floors :: Point3 -> [[Point2]] -> (Point3, Maybe (Point3,Object)) + -> (Point3, Maybe (Point3,Object)) +collide3Floors sp cs (ep,mn) = maybe (ep,mn) (,Just (V3 0 0 1,OFloor)) mp where mp = do V3 x y z <- intersectSegPlane sp ep (V3 0 0 0) (V3 0 0 1) let g (a,b) = isRHS a b (V2 x y) f = any g guard (all (f . loopPairs) cs) - return $ V3 x y z + return $ (V3 x y z) -collide3Part :: Point3 -> [(Point3,Point3,[(Point3,Point3)])] - -> (Point3, Maybe Point3) - -> (Point3, Maybe Point3) -collide3Part sp = flip $ foldl' findPoint +collide3Wall :: Point3 -> Wall -> (Point3, MPO) -> (Point3, MPO) +collide3Wall sp wl (ep,mo) = maybe (ep,mo) (,Just (n,OWall wl)) $ intersectSegSurface sp ep p n ss where - findPoint (x,mn) (p,n,ss) = maybe (x,mn) (,Just n) $ intersectSegSurface sp x p n ss + (p,n,ss) = wallToSurface wl + +collide3Creature :: Point3 -> Creature -> (Point3, MPO) -> (Point3, MPO) +collide3Creature sp cr (ep,m) = fromMaybe (ep,m) $ do + (sp',ep') <- restrictSeg 0 (V3 0 0 1) (sp,ep) >>= restrictSeg (V3 0 0 25) (V3 0 0 (-1)) + p <- listToMaybe $ intersectCircSeg cpos (crRad $ cr ^. crType) (xyV3 sp') (xyV3 ep') + let z = 0 + return (p `v2z` z,Just (normalize $ (p - cpos) `v2z` 0, OCreature cr)) + where + cpos = cr ^. crPos + +restrictSeg :: Point3 -> Point3 -> (Point3,Point3) -> Maybe (Point3,Point3) +restrictSeg p n (sp,ep) + | isNHS p n sp + , isNHS p n ep = Just (sp,ep) + | isNHS p n sp = (sp,) <$> intersectSegPlane sp ep p n + | otherwise = (,ep) <$> intersectSegPlane sp ep p n + -- note if both sp & ep are not NHS, this returns Nothing + +wallToSurface :: Wall -> (Point3,Point3,[(Point3,Point3)]) +wallToSurface wl = (g x, g $ vNormal (x-y), [(g x,g (y-x)),(g y,g (x-y))]) + where + g = (`v2z` 0) + (x,y) = _wlLine wl -- this COULD be written in terms of collidePointWallsFilterStream, TODO test -- whether this is actually faster diff --git a/src/Dodge/Data/Object.hs b/src/Dodge/Data/Object.hs index dad76d6b0..8eadc84e7 100644 --- a/src/Dodge/Data/Object.hs +++ b/src/Dodge/Data/Object.hs @@ -11,3 +11,5 @@ data Object = OPulseBall PulseBall | OCreature Creature | OWall Wall + | OFloor + | OChasmWall diff --git a/src/Dodge/Projectile/Update.hs b/src/Dodge/Projectile/Update.hs index 7d8f53a12..dbde2c8e6 100644 --- a/src/Dodge/Projectile/Update.hs +++ b/src/Dodge/Projectile/Update.hs @@ -1,10 +1,9 @@ {-# LANGUAGE LambdaCase #-} --{-# OPTIONS_GHC -Wno-unused-imports #-} -module Dodge.Projectile.Update ( - updateProjectile, -) where +module Dodge.Projectile.Update (updateProjectile) where +import Dodge.Data.Object import Control.Monad import Data.List (delete) import Data.Maybe @@ -17,7 +16,7 @@ import Dodge.Payload import Dodge.SoundLogic import Dodge.WorldEvent.Cloud import Dodge.WorldEvent.Sound -import Dodge.WorldEvent.ThingsHit +--import Dodge.WorldEvent.ThingsHit import Geometry import qualified IntMapHelp as IM import LensHelp @@ -27,7 +26,7 @@ import RandomHelp updateProjectile :: Projectile -> World -> World updateProjectile pj w = (cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjTimer -~ 1) - . shellCollisionCheck pj + . shellExplosionCheck pj . moveProjectile pj $ doGravityPU pj w @@ -66,25 +65,51 @@ applyGravityPU pj w newz = pj ^. pjZ + pj ^. pjZVel -- consider pushing any hit creature back -shellCollisionCheck :: Projectile -> World -> World -shellCollisionCheck pj w +shellExplosionCheck :: Projectile -> World -> World +shellExplosionCheck pj w | RetiredProjectile <- pj ^. pjType , time <= 0 = destroyProjectile (pj ^. pjScreenID) (_pjID pj) w | time <= 0 = explodeShell pj w | RetiredProjectile <- pj ^. pjType = w - | Just thit <- thingHit oldpos (oldpos + _pjVel pj) w = tryShellBounce thit pj w | otherwise = w where time = _pjTimer pj - oldpos = _pjPos pj --- note this doesn't take into account moving walls, which may break the --- bouncing in some way -tryShellBounce :: (Point2, Either Creature Wall) -> Projectile -> World -> World -tryShellBounce (p, Right wl) pj w - | Just GStuckCreature{} <- pj ^? pjType . gnHitEffect = w - | Just GStuckWall{} <- pj ^? pjType . gnHitEffect = w +---- note this doesn't take into account moving walls, which may break the +---- bouncing in some way +--tryShellBounce :: (Point2, Either Creature Wall) -> Projectile -> World -> World +--tryShellBounce (p, Right wl) pj w +-- | Just GStick <- pj ^? pjType . gnHitEffect = +-- w +-- & cWorld . lWorld . projectiles . ix (_pjID pj) . pjType +-- .~ Grenade (GStuckWall (wl ^. wlStructure)) +-- & soundOriginIDsAt (ShellSound (pj ^. pjID)) [slapS, slap1S] (pj ^. pjPos) +-- | Just x <- pj ^? pjType . gnHitEffect . bounceTolerance +-- , abs (dotV (pj ^. pjVel) (vNormal hitline)) < x = +-- w +-- & cWorld . lWorld . projectiles . ix (_pjID pj) . pjVel +-- %~ reflectIn hitline +-- & cWorld . lWorld . projectiles . ix (_pjID pj) . pjPos +-- .~ p - normalizeV (pj ^. pjVel) +-- & soundStart (ShellSound (pj ^. pjID)) (pj ^. pjPos) click1S Nothing +-- where +-- hitline = normalizeV $ uncurry (-) $ _wlLine wl +--tryShellBounce (p, Left cr) pj w +-- | Just GStick <- pj ^? pjType . gnHitEffect = +-- w +-- & cWorld . lWorld . projectiles . ix (_pjID pj) . pjType +-- .~ Grenade +-- ( GStuckCreature +-- (cr ^. crID) +-- (rotateV (- cr ^. crDir) (p - cr ^. crPos)) +-- (pj ^. pjDir - cr ^. crDir) +-- ) +-- & soundOriginIDsAt (ShellSound (pj ^. pjID)) [slapS, slap1S] (pj ^. pjPos) +--tryShellBounce _ pj w = explodeShell pj w + +tryShellBounce' :: Point3 -> (Point3, Object ) -> Projectile -> World -> World +tryShellBounce' p' (n, OWall wl) pj w | Just GStick <- pj ^? pjType . gnHitEffect = w & cWorld . lWorld . projectiles . ix (_pjID pj) . pjType @@ -98,13 +123,10 @@ tryShellBounce (p, Right wl) pj w & cWorld . lWorld . projectiles . ix (_pjID pj) . pjPos .~ p - normalizeV (pj ^. pjVel) & soundStart (ShellSound (pj ^. pjID)) (pj ^. pjPos) click1S Nothing - | isJust $ pj ^? pjType . gnHitEffect . bounceTolerance = - explodeShell pj w where + p = xyV3 p' hitline = normalizeV $ uncurry (-) $ _wlLine wl -tryShellBounce (p, Left cr) pj w - | Just GStuckCreature{} <- pj ^? pjType . gnHitEffect = w - | Just GStuckWall{} <- pj ^? pjType . gnHitEffect = w +tryShellBounce' p' (n,OCreature cr) pj w | Just GStick <- pj ^? pjType . gnHitEffect = w & cWorld . lWorld . projectiles . ix (_pjID pj) . pjType @@ -115,7 +137,10 @@ tryShellBounce (p, Left cr) pj w (pj ^. pjDir - cr ^. crDir) ) & soundOriginIDsAt (ShellSound (pj ^. pjID)) [slapS, slap1S] (pj ^. pjPos) -tryShellBounce _ pj w = explodeShell pj w + where + p = xyV3 p' +tryShellBounce' _ _ pj w = w +tryShellBounce' _ _ pj w = explodeShell pj w destroyProjectile :: Maybe (NewInt ItmInt) -> Int -> World -> World destroyProjectile mitid pjid w = @@ -130,11 +155,11 @@ destroyProjectile mitid pjid w = trySpin :: Projectile -> World -> World trySpin pj = fromMaybe id $ do guard (pj ^. pjTimer == 335) - (cid,s) <- pj ^? pjBarrelSpin . _Just + (cid, s) <- pj ^? pjBarrelSpin . _Just return $ doBarrelSpin cid s pj tryThrust :: Projectile -> World -> World -tryThrust pj = fromMaybe id $ do +tryThrust pj = fromMaybe id $ do Rocket y x <- pj ^? pjType guard $ pj ^. pjTimer <= 330 && pj ^. pjTimer >= 0 return $ doThrust pj x . pjRemoteSetDirection (Just y) pj @@ -145,9 +170,9 @@ doThrust pj smoke w = & randGen .~ g & cWorld . lWorld . projectiles . ix i . pjVel %~ (\v -> accel +.+ frict *.* v) & soundContinue (ShellSound i) newPos missileLaunchS (Just 1) - -- & makeFlamelet (oldPos -.- vel) (vel + 2 * rotateV (pi + sparkD) accel) 3 10 & makeFlamelet (oldPos -.- vel) (vel +.+ rotateV (pi + sparkD) accel) 3 10 - & makeCloudAt RocketSmoke + & makeCloudAt + RocketSmoke lifetime (addZ 20 (oldPos +.+ r1 +.+ 30 *.* normalizeV (oldPos -.- newPos))) where @@ -155,7 +180,7 @@ doThrust pj smoke w = lt | smoke == Just ReducedRocketSmoke = (50, 200) | otherwise = (300, 500) --- trailfadetime = fst . randomR (100, 300) $ _randGen w + -- trailfadetime = fst . randomR (100, 300) $ _randGen w accel = rotateV (pj ^. pjDir) (V2 3 0) i = _pjID pj oldPos = _pjPos pj @@ -170,11 +195,12 @@ doThrust pj smoke w = doBarrelSpin :: Int -> Float -> Projectile -> World -> World doBarrelSpin cid i pj w = w & cWorld . lWorld . projectiles . ix pjid . pjSpin .~ newSpin - & cWorld . lWorld . projectiles . ix pjid . pjBarrelSpin .~ Nothing --- & cWorld . lWorld . projectiles . ix pjid . pjUpdates %~ deleteBy f (StartSpinPU 0 0 0) + & cWorld . lWorld . projectiles . ix pjid . pjBarrelSpin .~ Nothing where --- f _ StartSpinPU{} = True --- f _ _ = False + -- & cWorld . lWorld . projectiles . ix pjid . pjUpdates %~ deleteBy f (StartSpinPU 0 0 0) + + -- f _ StartSpinPU{} = True + -- f _ _ = False pjid = _pjID pj dir = argV $ _pjVel pj newSpin = case w ^? cWorld . lWorld . creatures . ix cid of @@ -207,20 +233,21 @@ pjRemoteSetDirection ph pj w = case ph of moveProjectile :: Projectile -> World -> World moveProjectile pj w | Just GStuckWall{} <- pj ^? pjType . gnHitEffect = w - | Just (GStuckCreature crid p d) <- pj ^? pjType . gnHitEffect + | Just (GStuckCreature crid poff d) <- pj ^? pjType . gnHitEffect , Just cr <- w ^? cWorld . lWorld . creatures . ix crid = let cpos = cr ^. crPos cdir = cr ^. crDir vel = cpos - cr ^. crOldPos in w & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjPos - .~ cpos + rotateV cdir p - & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjDir - .~ d + cdir - & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjVel - .~ vel + .~ cpos + rotateV cdir poff + & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjDir .~ d + cdir + & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjVel .~ vel | Just GStuckCreature{} <- pj ^? pjType . gnHitEffect = w & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjType .~ Grenade GStick +-- | Just thit <- thingHit p (p + _pjVel pj) w = tryShellBounce thit pj w + | (p,Just po) <- collide3 (p `v2z` (_pjZ pj)) ((p + _pjVel pj)`v2z` (_pjZ pj + _pjZVel pj) ) w + = tryShellBounce' p po pj w | otherwise = w & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjSpin *~ 0.99 @@ -228,14 +255,12 @@ moveProjectile pj w & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjDir +~ _pjSpin pj & tryThrust pj & trySpin pj + where + p = _pjPos pj -explodeShell :: - Projectile -> - World -> - World +explodeShell :: Projectile -> World -> World explodeShell pj w = w --- & cWorld . lWorld . projectiles . ix pjid . pjUpdates .~ [] & cWorld . lWorld . projectiles . ix pjid . pjType .~ RetiredProjectile & cWorld . lWorld . projectiles . ix pjid . pjVel .~ 0 & cWorld . lWorld . projectiles . ix pjid . pjTimer .~ 30 diff --git a/src/Dodge/Prop/Moving.hs b/src/Dodge/Prop/Moving.hs index 895094cc7..0d499677f 100644 --- a/src/Dodge/Prop/Moving.hs +++ b/src/Dodge/Prop/Moving.hs @@ -22,11 +22,11 @@ updateDebrisChunk w db = (w, mdb) sv = db ^. dbVel sp = _dbPos db np = sp + sv - cdb = case collide3 sp np w of + cdb = case collide3WallsFloor sp np w of (p,Nothing) -> db & dbPos .~ p & dbVel -~ V3 0 0 1 & dbRot %~ dospin - (p,Just n) -> db & dbPos .~ p + (0.0001 * normalize n) + (p,Just (n,_)) -> db & dbPos .~ p + (0.0001 * normalize n) & dbVel .~ (0.7 * reflectInNormal n sv) - V3 0 0 1 dospin = (_dbSpin db *) mdb = do diff --git a/src/Geometry/Intersect.hs b/src/Geometry/Intersect.hs index 16a98b827..44d1d35f1 100644 --- a/src/Geometry/Intersect.hs +++ b/src/Geometry/Intersect.hs @@ -49,7 +49,7 @@ intersectSegSurface sp ep p n ss = do return xp isNHS :: Point3 -> Point3 -> Point3 -> Bool -isNHS p n x = 0 < dot n (x - p) +isNHS p n x = 0 > dot (p - x) n intersectSegSegErrorTest :: Point2 -> Point2 -> Point2 -> Point2 -> Maybe Point2 {-# INLINE intersectSegSegErrorTest #-} diff --git a/tags b/tags index fd7b31650..60000360a 100644 --- a/tags +++ b/tags @@ -489,16 +489,16 @@ FullShadowFidelity src/Shape/Data.hs 24;" C FullSize src/Dodge/Data/Item/Params.hs 28;" C FullyVisible src/Dodge/Data/CamouflageStatus.hs 6;" C FunctionChangeSF src/Dodge/Data/ComposedItem.hs 34;" C -GBounce src/Dodge/Data/Projectile.hs 58;" C +GBounce src/Dodge/Data/Projectile.hs 50;" C GEqC src/SameConstr.hs 20;" c GIMBAL src/Dodge/Data/Item/Combine.hs 97;" C GLASSSHARD src/Dodge/Data/Item/Combine.hs 61;" C GLAUNCHER src/Dodge/Data/Item/Combine.hs 173;" C GRAPECANNON src/Dodge/Data/Item/Combine.hs 151;" C GREEN src/Color/Data.hs 16;" C -GStick src/Dodge/Data/Projectile.hs 59;" C -GStuckCreature src/Dodge/Data/Projectile.hs 60;" C -GStuckWall src/Dodge/Data/Projectile.hs 61;" C +GStick src/Dodge/Data/Projectile.hs 51;" C +GStuckCreature src/Dodge/Data/Projectile.hs 52;" C +GStuckWall src/Dodge/Data/Projectile.hs 53;" C GYROSCOPE src/Dodge/Data/Item/Combine.hs 98;" C GadgetPlatformSF src/Dodge/Data/ComposedItem.hs 18;" C GameOverOptions src/Dodge/Data/Universe.hs 72;" C @@ -526,8 +526,8 @@ GoesOnLegs src/Dodge/Data/Equipment/Misc.hs 16;" C GoesOnWrist src/Dodge/Data/Equipment/Misc.hs 15;" C Government src/Dodge/Data/Scenario.hs 43;" C GovernmentScope src/Dodge/Data/Scenario.hs 49;" t -Grenade src/Dodge/Data/Projectile.hs 42;" C -GrenadeHitEffect src/Dodge/Data/Projectile.hs 57;" t +Grenade src/Dodge/Data/Projectile.hs 35;" C +GrenadeHitEffect src/Dodge/Data/Projectile.hs 49;" t GrenadeHitEffectSF src/Dodge/Data/ComposedItem.hs 37;" C Gust src/Dodge/Data/Gust.hs 13;" t GymSS src/Dodge/Data/Scenario.hs 104;" C @@ -549,8 +549,8 @@ HeavySmokeFlare src/Dodge/Data/Muzzle.hs 29;" C HeldItemType src/Dodge/Data/Item/Combine.hs 140;" t HeldPlatformSF src/Dodge/Data/ComposedItem.hs 14;" C HiddenGoal src/Dodge/Data/Scenario.hs 14;" C -HomeUsingRemoteScreen src/Dodge/Data/Projectile.hs 53;" C -HomeUsingTargeting src/Dodge/Data/Projectile.hs 54;" C +HomeUsingRemoteScreen src/Dodge/Data/Projectile.hs 45;" C +HomeUsingTargeting src/Dodge/Data/Projectile.hs 46;" C Hospital src/Dodge/Data/Scenario.hs 69;" C Hotkey src/Dodge/Data/Equipment/Misc.hs 32;" t Hotkey0 src/Dodge/Data/Equipment/Misc.hs 49;" C @@ -734,6 +734,7 @@ MODStringOption src/Dodge/Data/Universe.hs 100;" C MOTOR src/Dodge/Data/Item/Combine.hs 64;" C MP2Ac src/Dodge/Data/CreatureEffect.hs 56;" t MP2NoAction src/Dodge/Data/CreatureEffect.hs 56;" C +MPO src/Dodge/Base/Collide.hs 88;" t MTRS src/Dodge/Annotation/Data.hs 12;" t MTree src/Dodge/Data/MetaTree.hs 9;" C Machine src/Dodge/Data/Machine.hs 31;" t @@ -856,7 +857,7 @@ NoDebugInfo src/Dodge/Data/Universe.hs 58;" C NoEscapeMenuOption src/Dodge/Data/Universe.hs 79;" C NoFaction src/Dodge/Data/Creature/State.hs 20;" C NoFlare src/Dodge/Data/Muzzle.hs 25;" C -NoHoming src/Dodge/Data/Projectile.hs 52;" C +NoHoming src/Dodge/Data/Projectile.hs 44;" C NoIntImp src/Dodge/Data/CreatureEffect.hs 20;" C NoItTargeting src/Dodge/Data/Item.hs 56;" C NoItemScroll src/Dodge/Data/Item.hs 52;" C @@ -914,7 +915,9 @@ NumShadowCasters6 src/Dodge/Data/Config.hs 21;" C NumShadowCasters7 src/Dodge/Data/Config.hs 22;" C NumShadowCasters8 src/Dodge/Data/Config.hs 23;" C NumShadowCasters9 src/Dodge/Data/Config.hs 24;" C +OChasmWall src/Dodge/Data/Object.hs 15;" C OCreature src/Dodge/Data/Object.hs 12;" C +OFloor src/Dodge/Data/Object.hs 14;" C OItem src/Dodge/Data/ComposedItem.hs 50;" t OPulseBall src/Dodge/Data/Object.hs 11;" C ORANGE src/Color/Data.hs 26;" C @@ -1043,8 +1046,7 @@ Prison src/Dodge/Data/Scenario.hs 65;" C Projectile src/Dodge/Data/Projectile.hs 17;" t ProjectileParams src/Dodge/Data/Item/Use.hs 53;" C ProjectileStabiliserSF src/Dodge/Data/ComposedItem.hs 36;" C -ProjectileType src/Dodge/Data/Projectile.hs 41;" t -ProjectileUpdate src/Dodge/Data/Projectile.hs 35;" t +ProjectileType src/Dodge/Data/Projectile.hs 34;" t Prop src/Dodge/Data/Prop.hs 18;" t PropDoubleLampCover src/Dodge/Data/Prop.hs 63;" C PropDraw src/Dodge/Data/Prop.hs 58;" t @@ -1130,12 +1132,11 @@ RandomTurn src/Dodge/Data/ActionPlan.hs 31;" C ReactorSS src/Dodge/Data/Scenario.hs 111;" C RecRoomSS src/Dodge/Data/Scenario.hs 103;" C RectRoomType src/Dodge/Data/Room.hs 32;" C -ReducedRocketSmoke src/Dodge/Data/Projectile.hs 65;" C +ReducedRocketSmoke src/Dodge/Data/Projectile.hs 57;" C ReigonalGovernment src/Dodge/Data/Scenario.hs 50;" C Religion src/Dodge/Data/Scenario.hs 47;" C Reload src/Dodge/Data/ActionPlan.hs 190;" C RemoteDetonatorSF src/Dodge/Data/ComposedItem.hs 27;" C -RemoteDirectionPU src/Dodge/Data/Projectile.hs 38;" C RemoteScreenSF src/Dodge/Data/ComposedItem.hs 25;" C RemoveEquipment src/Dodge/Data/RightButtonOptions.hs 36;" C Remove_LOS src/Dodge/Data/Config.hs 77;" C @@ -1148,7 +1149,7 @@ ResFactor src/Dodge/Data/Config.hs 97;" t ResearchFacility src/Dodge/Data/Scenario.hs 62;" C ResourceFailure src/Dodge/Data/Scenario.hs 29;" C RetailFacility src/Dodge/Data/Scenario.hs 67;" C -RetiredProjectile src/Dodge/Data/Projectile.hs 48;" C +RetiredProjectile src/Dodge/Data/Projectile.hs 40;" C Revenge src/Dodge/Data/Scenario.hs 6;" C RewindLeftClick src/Dodge/Data/World.hs 73;" C RezBaySS src/Dodge/Data/Scenario.hs 105;" C @@ -1156,9 +1157,9 @@ RightButtonOptions src/Dodge/Data/RightButtonOptions.hs 13;" t RightForward src/Dodge/Data/Creature/Stance.hs 33;" C RightwardDT src/Dodge/Data/DoubleTree.hs 93;" C RightwardLDT src/Dodge/Data/DoubleTree.hs 52;" C -Rocket src/Dodge/Data/Projectile.hs 43;" C -RocketHoming src/Dodge/Data/Projectile.hs 51;" t -RocketSmoke src/Dodge/Data/Projectile.hs 64;" t +Rocket src/Dodge/Data/Projectile.hs 36;" C +RocketHoming src/Dodge/Data/Projectile.hs 43;" t +RocketSmoke src/Dodge/Data/Projectile.hs 56;" t RocketSmoke src/Dodge/Data/Cloud.hs 24;" C Room src/Dodge/Data/GenWorld.hs 95;" t RoomClipping src/Dodge/Data/Config.hs 107;" t @@ -1291,7 +1292,6 @@ Stance src/Dodge/Data/Creature/Stance.hs 13;" t StandaloneWall src/Dodge/Data/Wall/Structure.hs 13;" C Standing src/Dodge/Data/Creature/Stance.hs 25;" C StartSentinelPost src/Dodge/Data/ActionPlan.hs 153;" C -StartSpinPU src/Dodge/Data/Projectile.hs 37;" C StayInArea src/Dodge/Data/Scenario.hs 13;" C Stone src/Dodge/Data/Material.hs 11;" C StorageSS src/Dodge/Data/Scenario.hs 94;" C @@ -1375,7 +1375,6 @@ TeslaBeamCombine src/Dodge/Data/Beam.hs 41;" C TeslaGunFlare src/Dodge/Data/Muzzle.hs 31;" C TextShad src/Picture/Data.hs 37;" C ThermalSensor src/Dodge/Data/Machine/Sensor/Type.hs 13;" C -ThrustPU src/Dodge/Data/Projectile.hs 36;" C Tile src/Data/Tile.hs 16;" t Tiled src/Data/Tile.hs 14;" C TimeFlowStatus src/Dodge/Data/World.hs 58;" t @@ -1618,7 +1617,7 @@ _bmRange src/Dodge/Data/Beam.hs 26;" f _bmType src/Dodge/Data/Beam.hs 29;" f _boffEff src/Dodge/Data/Button.hs 23;" f _bonEff src/Dodge/Data/Button.hs 22;" f -_bounceTolerance src/Dodge/Data/Projectile.hs 58;" f +_bounceTolerance src/Dodge/Data/Projectile.hs 50;" f _bpColor src/Dodge/Data/Button.hs 19;" f _bpEff src/Dodge/Data/Button.hs 18;" f _bsColor1 src/Dodge/Data/Button.hs 24;" f @@ -1909,7 +1908,7 @@ _gfMax src/Dodge/Data/GenFloat.hs 12;" f _gfMin src/Dodge/Data/GenFloat.hs 12;" f _gibColor src/Dodge/Data/Prop.hs 44;" f _gibSize src/Dodge/Data/Prop.hs 43;" f -_gnHitEffect src/Dodge/Data/Projectile.hs 42;" f +_gnHitEffect src/Dodge/Data/Projectile.hs 35;" f _grBound src/Dodge/GameRoom.hs 18;" f _grDir src/Dodge/GameRoom.hs 20;" f _grLinkDirs src/Dodge/GameRoom.hs 21;" f @@ -2156,31 +2155,25 @@ _peZoning src/Dodge/Data/World.hs 52;" f _penEnd src/Dodge/Data/PathGraph.hs 35;" f _penPathEdge src/Dodge/Data/PathGraph.hs 36;" f _penStart src/Dodge/Data/PathGraph.hs 34;" f -_phRemoteID src/Dodge/Data/Projectile.hs 53;" f -_phTargetingID src/Dodge/Data/Projectile.hs 54;" f +_phRemoteID src/Dodge/Data/Projectile.hs 45;" f +_phTargetingID src/Dodge/Data/Projectile.hs 46;" f _pickUpLevel src/Dodge/Layout/Generate.hs 14;" f _pickUps src/Dodge/Layout/Generate.hs 15;" f _pictureShaders src/Data/Preload/Render.hs 28;" f _piercedPoints src/Dodge/Data/Creature/Misc.hs 89;" f -_pjDetonatorID src/Dodge/Data/Projectile.hs 30;" f +_pjBarrelSpin src/Dodge/Data/Projectile.hs 27;" f +_pjDetonatorID src/Dodge/Data/Projectile.hs 29;" f _pjDir src/Dodge/Data/Projectile.hs 20;" f -_pjID src/Dodge/Data/Projectile.hs 23;" f -_pjPayload src/Dodge/Data/Projectile.hs 24;" f +_pjID src/Dodge/Data/Projectile.hs 22;" f +_pjPayload src/Dodge/Data/Projectile.hs 23;" f _pjPos src/Dodge/Data/Projectile.hs 18;" f -_pjScreenID src/Dodge/Data/Projectile.hs 31;" f +_pjScreenID src/Dodge/Data/Projectile.hs 30;" f _pjSpin src/Dodge/Data/Projectile.hs 21;" f -_pjSpinFactor src/Dodge/Data/Projectile.hs 22;" f -_pjTimer src/Dodge/Data/Projectile.hs 25;" f -_pjType src/Dodge/Data/Projectile.hs 29;" f -_pjUpdates src/Dodge/Data/Projectile.hs 28;" f +_pjTimer src/Dodge/Data/Projectile.hs 24;" f +_pjType src/Dodge/Data/Projectile.hs 28;" f _pjVel src/Dodge/Data/Projectile.hs 19;" f -_pjZ src/Dodge/Data/Projectile.hs 26;" f -_pjZVel src/Dodge/Data/Projectile.hs 27;" f -_pjuCID src/Dodge/Data/Projectile.hs 37;" f -_pjuEnd src/Dodge/Data/Projectile.hs 36;" f -_pjuSpinAmound src/Dodge/Data/Projectile.hs 37;" f -_pjuStart src/Dodge/Data/Projectile.hs 36;" f -_pjuTime src/Dodge/Data/Projectile.hs 37;" f +_pjZ src/Dodge/Data/Projectile.hs 25;" f +_pjZVel src/Dodge/Data/Projectile.hs 26;" f _plIDCont src/Dodge/Data/GenWorld.hs 82;" f _plMID src/Dodge/Data/GenWorld.hs 81;" f _plOrder src/Dodge/Data/GenWorld.hs 78;" f @@ -2272,8 +2265,8 @@ _renderData src/Data/Preload.hs 11;" f _reverseAmount src/Dodge/Data/World.hs 64;" f _reverseAmount src/Dodge/Data/World.hs 70;" f _reverseAmount src/Dodge/Data/World.hs 74;" f -_rkHoming src/Dodge/Data/Projectile.hs 44;" f -_rkSmoke src/Dodge/Data/Projectile.hs 45;" f +_rkHoming src/Dodge/Data/Projectile.hs 37;" f +_rkSmoke src/Dodge/Data/Projectile.hs 38;" f _rlDir src/Dodge/Data/Room.hs 26;" f _rlPos src/Dodge/Data/Room.hs 25;" f _rlType src/Dodge/Data/Room.hs 24;" f @@ -2411,10 +2404,10 @@ _ssShownItems src/Dodge/Data/SelectionList.hs 32;" f _ssShownLength src/Dodge/Data/SelectionList.hs 33;" f _strideAmount src/Dodge/Data/Creature/Stance.hs 22;" f _strideLength src/Dodge/Data/Creature/Stance.hs 16;" f -_stuckCrID src/Dodge/Data/Projectile.hs 60;" f -_stuckCrOffset src/Dodge/Data/Projectile.hs 60;" f -_stuckCrRot src/Dodge/Data/Projectile.hs 60;" f -_stuckWlID src/Dodge/Data/Projectile.hs 61;" f +_stuckCrID src/Dodge/Data/Projectile.hs 52;" f +_stuckCrOffset src/Dodge/Data/Projectile.hs 52;" f +_stuckCrRot src/Dodge/Data/Projectile.hs 52;" f +_stuckWlID src/Dodge/Data/Projectile.hs 53;" f _subInventory src/Dodge/Data/HUD.hs 20;" f _swColor src/Dodge/Data/Shockwave.hs 18;" f _swDam src/Dodge/Data/Shockwave.hs 23;" f @@ -2670,7 +2663,7 @@ airlockDoor src/Dodge/Room/Airlock.hs 51;" f airlockDoubleDoor src/Dodge/Room/Airlock.hs 54;" f airlockSimple src/Dodge/Room/Airlock.hs 66;" f airlockZ src/Dodge/Room/Airlock.hs 91;" f -allVisibleWalls src/Dodge/Base/Collide.hs 154;" f +allVisibleWalls src/Dodge/Base/Collide.hs 183;" f alongSegBy src/Geometry.hs 41;" f alteRifle src/Dodge/Item/Held/Cane.hs 22;" f ammoMagInfo src/Dodge/Item/Info.hs 49;" f @@ -2684,11 +2677,11 @@ angleVV src/Geometry/Vector.hs 57;" f angleVV3 src/Geometry/Vector3D.hs 122;" f annoToRoomTree src/Dodge/Annotation.hs 17;" f anyUnusedSpot src/Dodge/PlacementSpot.hs 66;" f -anythingHitCirc src/Dodge/Base/Collide.hs 269;" f +anythingHitCirc src/Dodge/Base/Collide.hs 298;" f applyCME src/Dodge/HeldUse.hs 378;" f applyCreatureDamage src/Dodge/Creature/Damage.hs 13;" f applyEventIO src/Loop.hs 89;" f -applyGravityPU src/Dodge/Projectile/Update.hs 57;" f +applyGravityPU src/Dodge/Projectile/Update.hs 39;" f applyIndividualDamage src/Dodge/Creature/Damage.hs 16;" f applyInvLock src/Dodge/HeldUse.hs 444;" f applyMagnetsToBul src/Dodge/Bullet.hs 30;" f @@ -2834,7 +2827,7 @@ blunderbuss src/Dodge/Item/Held/Cone.hs 14;" f bossKeyItems src/Dodge/LockAndKey.hs 12;" f bossRoom src/Dodge/Room/Boss.hs 60;" f bounceDir src/Dodge/Bullet.hs 108;" f -bouncePoint src/Dodge/Base/Collide.hs 82;" f +bouncePoint src/Dodge/Base/Collide.hs 84;" f boundPoints src/Bound.hs 10;" f boundedGrid src/Grid.hs 19;" f boxABC src/Polyhedra.hs 108;" f @@ -2866,8 +2859,8 @@ cFilledRect src/Dodge/CharacterEnums.hs 6;" f cWireRect src/Dodge/CharacterEnums.hs 10;" f calcSmoothScroll src/Dodge/SmoothScroll.hs 11;" f calcTexCoord src/Tile.hs 19;" f -canSee src/Dodge/Base/Collide.hs 255;" f -canSeeIndirect src/Dodge/Base/Collide.hs 262;" f +canSee src/Dodge/Base/Collide.hs 284;" f +canSeeIndirect src/Dodge/Base/Collide.hs 291;" f cancelExamineInventory src/Dodge/Item/BackgroundEffect.hs 22;" f capacitor src/Dodge/Item/Ammo.hs 69;" f cardEightVec src/Dodge/Base/CardinalPoint.hs 16;" f @@ -2919,12 +2912,12 @@ chooseMovementPistol src/Dodge/Humanoid.hs 203;" f chooseMovementPistol' src/Dodge/Humanoid.hs 208;" f chooseMovementSpreadGun src/Dodge/CreatureEffect.hs 88;" f circCollisionDebugItem src/Dodge/Debug.hs 63;" f -circHitWall src/Dodge/Base/Collide.hs 171;" f +circHitWall src/Dodge/Base/Collide.hs 200;" f circInPolygon src/Geometry/Polygon.hs 70;" f -circOnAnyCr src/Dodge/Base/Collide.hs 219;" f +circOnAnyCr src/Dodge/Base/Collide.hs 248;" f circOnSeg src/Geometry.hs 102;" f circOnSegNoEndpoints src/Geometry.hs 92;" f -circOnSomeWall src/Dodge/Base/Collide.hs 213;" f +circOnSomeWall src/Dodge/Base/Collide.hs 242;" f circle src/Picture/Base.hs 180;" f circleDecoration src/Dodge/Placement/TopDecoration.hs 56;" f circleSolid src/Picture/Base.hs 164;" f @@ -2972,14 +2965,16 @@ colCrWall src/Dodge/WallCreatureCollisions.hs 28;" f colCrsWalls src/Dodge/WallCreatureCollisions.hs 18;" f collectDamageTypes src/Dodge/Damage.hs 53;" f collectInvItems src/Dodge/Update/Input/InGame.hs 298;" f -collide3 src/Dodge/Base/Collide.hs 86;" f -collide3Floors src/Dodge/Base/Collide.hs 100;" f -collide3Part src/Dodge/Base/Collide.hs 110;" f -collide3Walls src/Dodge/Base/Collide.hs 91;" f -collideCircWalls src/Dodge/Base/Collide.hs 181;" f -collidePoint src/Dodge/Base/Collide.hs 52;" f -collidePointTestFilter src/Dodge/Base/Collide.hs 119;" f -collidePointWallsFilter src/Dodge/Base/Collide.hs 133;" f +collide3 src/Dodge/Base/Collide.hs 94;" f +collide3Creature src/Dodge/Base/Collide.hs 123;" f +collide3Floors src/Dodge/Base/Collide.hs 107;" f +collide3Wall src/Dodge/Base/Collide.hs 118;" f +collide3Walls src/Dodge/Base/Collide.hs 101;" f +collide3WallsFloor src/Dodge/Base/Collide.hs 90;" f +collideCircWalls src/Dodge/Base/Collide.hs 210;" f +collidePoint src/Dodge/Base/Collide.hs 54;" f +collidePointTestFilter src/Dodge/Base/Collide.hs 148;" f +collidePointWallsFilter src/Dodge/Base/Collide.hs 162;" f collisionDebugItem src/Dodge/Debug.hs 47;" f color src/Picture/Base.hs 108;" f colorLamp src/Dodge/Creature/Lamp.hs 10;" f @@ -3262,7 +3257,7 @@ destroyMatS src/Dodge/Material/Sound.hs 7;" f destroyMcType src/Dodge/Machine/Destroy.hs 21;" f destroyMount src/Dodge/Block.hs 100;" f destroyMounts src/Dodge/Block.hs 97;" f -destroyProjectile src/Dodge/Projectile/Update.hs 137;" f +destroyProjectile src/Dodge/Projectile/Update.hs 144;" f detV src/Geometry/Vector.hs 93;" f detector src/Dodge/Item/Held/Utility.hs 27;" f detectorColor src/Dodge/Item/Draw/SPic.hs 465;" f @@ -3300,9 +3295,10 @@ doAfterPlacements src/Dodge/Layout.hs 83;" f doAimTwist src/Dodge/Creature/YourControl.hs 140;" f doAnyEquipmentEffect src/Dodge/Creature/State.hs 223;" f doBackspace src/Dodge/Update/Input/Text.hs 31;" f +doBarrelSpin src/Dodge/Projectile/Update.hs 194;" f doBlBl src/Dodge/BlBl.hs 5;" f doBlSh src/Dodge/Block/Draw.hs 14;" f -doBounce src/Dodge/Base/Collide.hs 64;" f +doBounce src/Dodge/Base/Collide.hs 66;" f doButtonEvent src/Dodge/Button/Event.hs 10;" f doConLoop src/Loop.hs 137;" f doConLoop' src/Loop.hs 226;" f @@ -3330,7 +3326,7 @@ doDrawing src/Dodge/Render.hs 35;" f doDrawing' src/Dodge/Render.hs 46;" f doFloatFloat src/Dodge/FloatFunction.hs 5;" f doGenFloat src/Dodge/HeldUse.hs 1212;" f -doGravityPU src/Dodge/Projectile/Update.hs 51;" f +doGravityPU src/Dodge/Projectile/Update.hs 33;" f doHeldUseEffect src/Dodge/HeldUse.hs 354;" f doInPlacements src/Dodge/Layout.hs 92;" f doIndividualPlacements src/Dodge/Layout.hs 117;" f @@ -3366,7 +3362,7 @@ doTerminalCommandEffect src/Dodge/Terminal.hs 135;" f doTestDrawing src/Dodge/Render.hs 42;" 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 153;" f +doThrust src/Dodge/Projectile/Update.hs 166;" f doTimeScroll src/Dodge/Update.hs 208;" f doTmTm src/Dodge/TmTm.hs 6;" f doTmWdWd src/Dodge/WorldEffect.hs 99;" f @@ -3596,7 +3592,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 186;" f -explodeShell src/Dodge/Projectile/Update.hs 249;" f +explodeShell src/Dodge/Projectile/Update.hs 260;" 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 @@ -3817,11 +3813,11 @@ handleResizeEvent src/Dodge/Event.hs 53;" f handleTextInput src/Dodge/Event/Input.hs 18;" f handleWindowMoveEvent src/Dodge/Event.hs 44;" f hardQuit src/Dodge/Concurrent.hs 32;" f -hasButtonLOS src/Dodge/Base/Collide.hs 233;" f +hasButtonLOS src/Dodge/Base/Collide.hs 262;" f hasCaneGunDim src/Dodge/Item/InvSize.hs 48;" f hasFrontArmour src/Dodge/Creature/Test.hs 118;" f -hasLOS src/Dodge/Base/Collide.hs 226;" f -hasLOSIndirect src/Dodge/Base/Collide.hs 241;" f +hasLOS src/Dodge/Base/Collide.hs 255;" f +hasLOSIndirect src/Dodge/Base/Collide.hs 270;" f hat src/Dodge/Item/Equipment.hs 76;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 79;" f @@ -3989,7 +3985,7 @@ isUnusedLnkType src/Dodge/PlacementSpot.hs 186;" f isUsedLnkUnplaced src/Dodge/PlacementSpot.hs 172;" f isValidCommand src/Dodge/Debug/Terminal.hs 131;" f isVowel src/StringHelp.hs 8;" f -isWalkable src/Dodge/Base/Collide.hs 248;" f +isWalkable src/Dodge/Base/Collide.hs 277;" f isoMatrix src/MatrixHelper.hs 30;" f isotriBWH src/Geometry/Polygon.hs 20;" f itDim src/Dodge/Item/InvSize.hs 21;" f @@ -4345,7 +4341,7 @@ moveCombineSel src/Dodge/Update/Scroll.hs 114;" f moveInverseShockwave src/Dodge/Shockwave/Update.hs 44;" f moveLSThen src/Dodge/Placement/Instance/LightSource.hs 30;" f movePenBullet src/Dodge/Bullet.hs 201;" f -moveProjectile src/Dodge/Projectile/Update.hs 224;" f +moveProjectile src/Dodge/Projectile/Update.hs 232;" f moveRoomBy src/Dodge/Room/Link.hs 53;" f moveShockwave src/Dodge/Shockwave/Update.hs 15;" f moveToSideFirstOutLink src/Dodge/Room/Warning.hs 55;" f @@ -4455,10 +4451,10 @@ overPos src/Picture/Base.hs 303;" f overPosObj src/Shape.hs 277;" f overPosSH src/Shape.hs 261;" f overPosSP src/ShapePicture.hs 41;" f -overlapCircWalls src/Dodge/Base/Collide.hs 160;" f -overlapCircWallsClosest src/Dodge/Base/Collide.hs 199;" f -overlapSegCrs src/Dodge/Base/Collide.hs 58;" f -overlapSegWalls src/Dodge/Base/Collide.hs 142;" f +overlapCircWalls src/Dodge/Base/Collide.hs 189;" f +overlapCircWallsClosest src/Dodge/Base/Collide.hs 228;" f +overlapSegCrs src/Dodge/Base/Collide.hs 60;" f +overlapSegWalls src/Dodge/Base/Collide.hs 171;" f overrideInternal src/Dodge/Creature/ReaderUpdate.hs 174;" f overrideMeleeCloseTarget src/Dodge/Creature/ReaderUpdate.hs 35;" f overwriteLabel src/Dodge/Tree/Compose.hs 31;" f @@ -4511,7 +4507,7 @@ pipe src/Dodge/Item/Craftable.hs 32;" f pistol src/Dodge/Item/Held/Stick.hs 40;" f pistolCrit src/Dodge/Creature/PistolCrit.hs 12;" f pistolerRoom src/Dodge/Room/Room.hs 321;" f -pjRemoteSetDirection src/Dodge/Projectile/Update.hs 203;" f +pjRemoteSetDirection src/Dodge/Projectile/Update.hs 211;" 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 @@ -4815,6 +4811,7 @@ restrictInLinks src/Dodge/RoomLink.hs 42;" f restrictLinkType src/Dodge/RoomLink.hs 32;" f restrictOutLinks src/Dodge/RoomLink.hs 45;" f restrictRMInLinksPD src/Dodge/Room/Link.hs 25;" f +restrictSeg src/Dodge/Base/Collide.hs 132;" f resumeSound src/Dodge/SoundLogic.hs 48;" f retreatActionsPistol src/Dodge/Humanoid.hs 249;" f retreatFireLauncher src/Dodge/Humanoid.hs 270;" f @@ -5041,7 +5038,7 @@ shapeVerxSize src/Shape/Parameters.hs 10;" f shatterGun src/Dodge/Item/Held/Weapons.hs 8;" f shatterGunSPic src/Dodge/Item/Draw/SPic.hs 324;" f shatterWall src/Dodge/Item/Weapon/Shatter.hs 26;" f -shellCollisionCheck src/Dodge/Projectile/Update.hs 86;" f +shellExplosionCheck src/Dodge/Projectile/Update.hs 68;" f shellMag src/Dodge/Item/Ammo.hs 49;" f shellModule src/Dodge/Item/Scope.hs 123;" f shellShape src/Dodge/Projectile/Draw.hs 34;" f @@ -5439,10 +5436,11 @@ tryPutFloorItemIDInInv src/Dodge/Inventory/Add.hs 26;" f tryPutItemInInv src/Dodge/Inventory/Add.hs 42;" f tryPutItemInInvAt src/Dodge/Inventory/Add.hs 32;" f trySeedFromClipboard src/Dodge/Menu.hs 91;" f -tryShellBounce src/Dodge/Projectile/Update.hs 101;" f -trySpinByCID src/Dodge/Projectile/Update.hs 181;" f +tryShellBounce src/Dodge/Projectile/Update.hs 81;" f +tryShellBounce' src/Dodge/Projectile/Update.hs 111;" f +trySpin src/Dodge/Projectile/Update.hs 154;" f trySynthBullet src/Dodge/Creature/State.hs 249;" f -tryThrust src/Dodge/Projectile/Update.hs 147;" f +tryThrust src/Dodge/Projectile/Update.hs 160;" f tryUseParent src/Dodge/Creature/State.hs 227;" f turnTo src/Dodge/Movement/Turn.hs 8;" f turret src/Dodge/Placement/Instance/Turret.hs 35;" f @@ -5477,7 +5475,6 @@ unusedOffPathAwayFromLink src/Dodge/PlacementSpot.hs 133;" f unusedSpotAwayFromInLink src/Dodge/PlacementSpot.hs 139;" f unusedSpotAwayFromLink src/Dodge/PlacementSpot.hs 122;" f unusedSpotNearInLink src/Dodge/PlacementSpot.hs 191;" f -upProjectile src/Dodge/Projectile/Update.hs 36;" f updateAimPos src/Dodge/Update.hs 321;" f updateAllNodes src/TreeHelp.hs 85;" f updateArc src/Dodge/Tesla.hs 44;" f @@ -5548,7 +5545,7 @@ updateObjCatMaybes src/Dodge/Update.hs 578;" f updateObjMapMaybe src/Dodge/Update.hs 571;" f updatePastWorlds src/Dodge/Update.hs 441;" f updatePreload src/Preload/Update.hs 20;" f -updateProjectile src/Dodge/Projectile/Update.hs 28;" f +updateProjectile src/Dodge/Projectile/Update.hs 26;" f updateProp src/Dodge/Prop/Update.hs 11;" f updatePulse src/Dodge/Creature/Update.hs 39;" f updatePulseBall src/Dodge/Update.hs 467;" f @@ -5653,7 +5650,7 @@ viewClipBounds src/Dodge/Debug/Picture.hs 318;" f viewDistanceFromItems src/Dodge/Update/Camera.hs 186;" f viewTarget src/Dodge/Creature/ReaderUpdate.hs 146;" f violet src/Color.hs 21;" f -visibleWalls src/Dodge/Base/Collide.hs 146;" f +visibleWalls src/Dodge/Base/Collide.hs 175;" f 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 @@ -5665,6 +5662,7 @@ wallBlips src/Dodge/RadarSweep.hs 98;" f wallBuffer src/Dodge/WallCreatureCollisions.hs 52;" f wallIsZeroLength src/Dodge/LevelGen/StaticWalls.hs 179;" f wallLine src/Dodge/Placement/Instance/Wall.hs 71;" f +wallToSurface src/Dodge/Base/Collide.hs 140;" f wallsFromRooms src/Dodge/Layout.hs 146;" f wallsToDraw src/Dodge/Render/Walls.hs 17;" f warmupSound src/Dodge/HeldUse.hs 1454;" f