diff --git a/src/Dodge/Base/Collide.hs b/src/Dodge/Base/Collide.hs index d754a55a7..fe2071027 100644 --- a/src/Dodge/Base/Collide.hs +++ b/src/Dodge/Base/Collide.hs @@ -18,7 +18,7 @@ module Dodge.Base.Collide ( collideCircWalls, overlapSegWalls, overlapSegCrs, --- bounceBall, + -- bounceBall, bouncePoint, circOnSomeWall, circOnAnyCr, @@ -37,14 +37,14 @@ module Dodge.Base.Collide ( collide3, ) where -import Dodge.Data.Object -import Control.Monad -import Dodge.Creature.Radius import Control.Lens +import Control.Monad import qualified Data.IntSet as IS import Data.List (sortOn) import Data.Maybe import Dodge.Base.Wall +import Dodge.Creature.Radius +import Dodge.Data.Object import Dodge.Data.World import Dodge.Zoning import FoldableHelp @@ -85,63 +85,95 @@ bouncePoint :: (Wall -> Bool) -> Float -> Point2 -> Point2 -> World -> Maybe (Po {-# INLINE bouncePoint #-} bouncePoint t x sp ep = doBounce x sp ep . collidePointWallsFilter t sp ep -type MPO = Maybe (Point3,Object) +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) +collide3WallsFloor sp ep w = + collide3Floors sp (w ^. cWorld . chasms) $ + collide3Walls sp w (ep, Nothing) -collide3 :: Point3 -> Point3 -> World -> (Point3,MPO) -collide3 sp ep w = foldl' (flip $ collide3Creature sp) (p,m) - $ crsNearSeg (xyV3 sp) (xyV3 p) w +-- could check the line is at least below z=0 at some point +collide3Chasms :: Point3 -> World -> (Point3, MPO) -> (Point3, MPO) +collide3Chasms sp w m = + foldl' + (flip (collide3Chasm sp)) + m + (foldMap loopPairs $ w ^. cWorld . chasms) + +collide3Chasm :: Point3 -> (Point2, Point2) -> (Point3, MPO) -> (Point3, MPO) +collide3Chasm sp ab (ep, m) = + maybe (ep, m) (,Just (n, OChasmWall)) $ + intersectSegSurface sp ep p n ss where - (p,m) = collide3WallsFloor sp ep w + (p, n, ss) = chasmWallToSurface ab + +chasmWallToSurface :: (Point2, Point2) -> (Point3, Point3, [(Point3, Point3)]) +chasmWallToSurface (x, y) = + ( g x + , g $ vNormal (x - y) + , [(g x, g (y - x)), (g y, g (x - y)), (0, V3 0 0 (-1))] + ) + where + g = (`v2z` 0) + +collide3 :: Point3 -> Point3 -> World -> (Point3, MPO) +collide3 sp ep w = + collide3Chasms sp w + . foldl' (flip $ collide3Creature sp) (p, m) + $ crsNearSeg (xyV3 sp) (xyV3 p) w + where + (p, m) = collide3WallsFloor sp ep w -- Just (hitpoint,normaltosurface) collide3Walls :: Point3 -> World -> (Point3, MPO) -> (Point3, MPO) -collide3Walls sp w ex@(ep,_) = foldl' f ex wls +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 +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) + let g (a, b) = isRHS a b (V2 x y) f = any g guard (all (f . loopPairs) cs) return $ (V3 x y z) 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 +collide3Wall sp wl (ep, mo) = maybe (ep, mo) (,Just (n, OWall wl)) $ intersectSegSurface sp ep p n ss where - (p,n,ss) = wallToSurface wl + (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)) +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)) + 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) +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 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 +-- 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 @@ -198,9 +230,11 @@ overlapCircWalls p r = mapMaybe dointersect f (a, b) = intersectSegSeg p (p +.+ r *.* normalizeV ((0.5 *.* (a +.+ b)) -.- p)) a b circHitWall :: Point2 -> Point2 -> Float -> World -> Bool -circHitWall sp ep r w = any (uncurry (intersectSegSegTest xsp xep) . _wlLine) +circHitWall sp ep r w = + any + (uncurry (intersectSegSegTest xsp xep) . _wlLine) (wlsNearSeg xsp xep w) - || circOnSomeWall ep r w + || circOnSomeWall ep r w where x = r *.* normalizeV (ep - sp) xsp = sp - x @@ -213,12 +247,17 @@ collideCircWalls sp ep rad = foldl' findPoint (ep, Nothing) where findPoint (p, mwl) wl = maybe (p, mwl) (,Just wl) . uncurry (intersectSegSeg sp p) - . shiftbyrad . _wlLine $ wl --- shiftbyrad (a, b) = --- ( a +.+ rad *.* normalizeV (a -.- b) --- , b +.+ rad *.* normalizeV (b -.- a) --- ) - shiftbyrad (a, b) = bimap f f + . shiftbyrad + . _wlLine + $ wl + -- shiftbyrad (a, b) = + -- ( a +.+ rad *.* normalizeV (a -.- b) + -- , b +.+ rad *.* normalizeV (b -.- a) + -- ) + shiftbyrad (a, b) = + bimap + f + f ( a +.+ rad *.* normalizeV (a -.- b) , b +.+ rad *.* normalizeV (b -.- a) ) @@ -262,6 +301,7 @@ hasLOS p1 p2 = hasButtonLOS :: Point2 -> Point2 -> World -> Bool {-# INLINE hasButtonLOS #-} hasButtonLOS _ _ = const True + --hasButtonLOS p1 p2 = -- not -- . collidePointTestFilter (not . _wlTouchThrough) p1 p2 diff --git a/src/Dodge/Projectile/Update.hs b/src/Dodge/Projectile/Update.hs index 2e60c31b3..72ac95a9f 100644 --- a/src/Dodge/Projectile/Update.hs +++ b/src/Dodge/Projectile/Update.hs @@ -64,7 +64,7 @@ shellExplosionCheck pj w time = _pjTimer pj shellHitWall :: Point3 -> Point3 -> Wall -> Projectile -> World -> World -shellHitWall p' n wl pj w +shellHitWall p' _ wl pj w | Just GStick <- pj ^? pjType . gnHitEffect = w & cWorld . lWorld . projectiles . ix (_pjID pj) . pjType @@ -84,28 +84,27 @@ shellHitWall p' n wl pj w p = xyV3 p' hitline = normalizeV $ uncurry (-) $ _wlLine wl -shellHitCreature :: Point3 -> Point3 -> Creature -> Projectile -> World -> World -shellHitCreature p' n cr pj w +shellHitCreature :: Point3 -> Creature -> Projectile -> World -> World +shellHitCreature p cr pj w | Just GStick <- pj ^? pjType . gnHitEffect = w & cWorld . lWorld . projectiles . ix (_pjID pj) . pjType .~ Grenade ( GStuckCreature (cr ^. crID) - (rotate3z (- cr ^. crDir) (p' - ((cr ^. crPos)`v2z`0))) + (rotate3z (- cr ^. crDir) (p - ((cr ^. crPos)`v2z`0))) (pj ^. pjDir - cr ^. crDir) ) & soundOriginIDsAt (ShellSound (pj ^. pjID)) [slapS, slap1S] (pj ^. pjPos . _xy) - | otherwise = w & cWorld . lWorld . projectiles . ix (_pjID pj) . pjPos .~ p' + | otherwise = w & cWorld . lWorld . projectiles . ix (_pjID pj) . pjTimer .~ 0 - where - p = xyV3 p' -shellHitFloor :: Point3 -> Point3 -> Projectile -> World -> World -shellHitFloor p' n pj w +shellHitFloor :: Point3 -> Projectile -> World -> World +shellHitFloor p' pj w | z < 1 && norm (_pjVel pj) < 1 = w | otherwise = - w & topj . pjPos . _z .~ 0.1 + w + & topj . pjPos .~ (p' & _z .~ 0.1) & topj . pjVel . _z %~ bouncez & topj . pjVel . _xy %~ decvel & topj . pjSpin %~ decspin @@ -244,14 +243,9 @@ pjRemoteSetDirection ph pj w = case ph of where lw = w ^. cWorld . lWorld -moveStuckGrenade :: Creature -> Point3 -> Float -> Projectile -> World -> World -moveStuckGrenade cr p d pj w = w - -moveProjectile :: Projectile -> World -> World -moveProjectile pj w - | Just GStuckWall{} <- pj ^? pjType . gnHitEffect = w - | Just (GStuckCreature crid poff d) <- pj ^? pjType . gnHitEffect - , Just cr <- w ^? cWorld . lWorld . creatures . ix crid = +moveStuckGrenade :: Int -> Point3 -> Float -> Projectile -> World -> World +moveStuckGrenade cid poff d pj w + | Just cr <- w ^? cWorld . lWorld . creatures . ix cid = let cpos = cr ^. crPos cdir = cr ^. crDir vel = cpos - cr ^. crOldPos @@ -260,21 +254,30 @@ moveProjectile pj w .~ xyV3 ((cpos `v2z` 0) + rotate3z cdir poff) & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjDir .~ d + cdir & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjVel . _xy .~ vel - | Just GStuckCreature{} <- pj ^? pjType . gnHitEffect = + | otherwise = w & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjType .~ Grenade GStick - | (p,Just (n,OWall wl)) <- collide3 p (p + _pjVel pj) w + +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 = shellHitWall p n wl pj w - | (p,Just (n,OFloor)) <- collide3 p (p + _pjVel pj) w - = shellHitFloor p n pj w - | (p,Just (n,OCreature cr)) <- collide3 p (p + _pjVel pj) w - = shellHitCreature p n cr pj w + | (p,Just (_,OFloor)) <- collide3 sp (sp + _pjVel pj) w + = shellHitFloor p pj w + | (p,Just (_,OCreature cr)) <- collide3 sp (sp + _pjVel pj) w + = shellHitCreature p cr pj w + | (_,Just (_,OChasmWall)) <- collide3 sp (sp + _pjVel pj) w + -- no stick or bounce for now + = w & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjTimer .~ 0 | otherwise = w & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjSpin *~ 0.99 & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjPos +~ _pjVel pj & cWorld . lWorld . projectiles . ix (pj ^. pjID) . pjDir +~ _pjSpin pj where - p = _pjPos pj + sp = _pjPos pj explodeShell :: Projectile -> World -> World explodeShell pj w = diff --git a/src/Dodge/WorldEvent/Explosion.hs b/src/Dodge/WorldEvent/Explosion.hs index 28adb0caa..015c0da3b 100644 --- a/src/Dodge/WorldEvent/Explosion.hs +++ b/src/Dodge/WorldEvent/Explosion.hs @@ -71,7 +71,7 @@ makeFlameExplosionAt p w = makeExplosionAt :: Point2 -> Point2 -> World -> World makeExplosionAt p vel w = w - & soundStart (Explosion (w ^. cWorld . lWorld . lClock)) p bangS Nothing + & soundStart (Explosion (w ^. cWorld . lWorld . lClock)) (p) bangS Nothing & addFlames & cWorld . lWorld . worldEvents .:~ MakeTempLight (LSParam (addZ 20 p) 150 (V3 1 0.5 0)) 20 diff --git a/tags b/tags index 8aa3c807e..8ff63a8e1 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 50;" C +GBounce src/Dodge/Data/Projectile.hs 48;" 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 51;" C -GStuckCreature src/Dodge/Data/Projectile.hs 52;" C -GStuckWall src/Dodge/Data/Projectile.hs 53;" C +GStick src/Dodge/Data/Projectile.hs 49;" C +GStuckCreature src/Dodge/Data/Projectile.hs 50;" C +GStuckWall src/Dodge/Data/Projectile.hs 51;" 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 35;" C -GrenadeHitEffect src/Dodge/Data/Projectile.hs 49;" t +Grenade src/Dodge/Data/Projectile.hs 33;" C +GrenadeHitEffect src/Dodge/Data/Projectile.hs 47;" 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 45;" C -HomeUsingTargeting src/Dodge/Data/Projectile.hs 46;" C +HomeUsingRemoteScreen src/Dodge/Data/Projectile.hs 43;" C +HomeUsingTargeting src/Dodge/Data/Projectile.hs 44;" 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 @@ -857,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 44;" C +NoHoming src/Dodge/Data/Projectile.hs 42;" 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 @@ -1046,7 +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 34;" t +ProjectileType src/Dodge/Data/Projectile.hs 32;" 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 @@ -1132,7 +1132,7 @@ 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 57;" C +ReducedRocketSmoke src/Dodge/Data/Projectile.hs 55;" 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 @@ -1149,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 40;" C +RetiredProjectile src/Dodge/Data/Projectile.hs 38;" 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 @@ -1157,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 36;" C -RocketHoming src/Dodge/Data/Projectile.hs 43;" t -RocketSmoke src/Dodge/Data/Projectile.hs 56;" t +Rocket src/Dodge/Data/Projectile.hs 34;" C +RocketHoming src/Dodge/Data/Projectile.hs 41;" t +RocketSmoke src/Dodge/Data/Projectile.hs 54;" 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 @@ -1617,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 50;" f +_bounceTolerance src/Dodge/Data/Projectile.hs 48;" 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 @@ -1908,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 35;" f +_gnHitEffect src/Dodge/Data/Projectile.hs 33;" f _grBound src/Dodge/GameRoom.hs 18;" f _grDir src/Dodge/GameRoom.hs 20;" f _grLinkDirs src/Dodge/GameRoom.hs 21;" f @@ -2155,25 +2155,23 @@ _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 45;" f -_phTargetingID src/Dodge/Data/Projectile.hs 46;" f +_phRemoteID src/Dodge/Data/Projectile.hs 43;" f +_phTargetingID src/Dodge/Data/Projectile.hs 44;" 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 -_pjBarrelSpin src/Dodge/Data/Projectile.hs 27;" f -_pjDetonatorID src/Dodge/Data/Projectile.hs 29;" f -_pjDir src/Dodge/Data/Projectile.hs 21;" f -_pjID src/Dodge/Data/Projectile.hs 23;" f -_pjPayload src/Dodge/Data/Projectile.hs 24;" f +_pjBarrelSpin src/Dodge/Data/Projectile.hs 25;" f +_pjDetonatorID src/Dodge/Data/Projectile.hs 27;" f +_pjDir src/Dodge/Data/Projectile.hs 20;" 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 30;" f -_pjSpin src/Dodge/Data/Projectile.hs 22;" f -_pjTimer src/Dodge/Data/Projectile.hs 25;" f -_pjType src/Dodge/Data/Projectile.hs 28;" f -_pjVel src/Dodge/Data/Projectile.hs 20;" f -_pjZ src/Dodge/Data/Projectile.hs 19;" f -_pjZVel src/Dodge/Data/Projectile.hs 26;" f +_pjScreenID src/Dodge/Data/Projectile.hs 28;" f +_pjSpin src/Dodge/Data/Projectile.hs 21;" f +_pjTimer src/Dodge/Data/Projectile.hs 24;" f +_pjType src/Dodge/Data/Projectile.hs 26;" f +_pjVel src/Dodge/Data/Projectile.hs 19;" 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 @@ -2265,8 +2263,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 37;" f -_rkSmoke src/Dodge/Data/Projectile.hs 38;" f +_rkHoming src/Dodge/Data/Projectile.hs 35;" f +_rkSmoke src/Dodge/Data/Projectile.hs 36;" 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 @@ -2404,10 +2402,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 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 +_stuckCrID src/Dodge/Data/Projectile.hs 50;" f +_stuckCrOffset src/Dodge/Data/Projectile.hs 50;" f +_stuckCrRot src/Dodge/Data/Projectile.hs 50;" f +_stuckWlID src/Dodge/Data/Projectile.hs 51;" 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 @@ -2663,7 +2661,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 183;" f +allVisibleWalls src/Dodge/Base/Collide.hs 215;" f alongSegBy src/Geometry.hs 41;" f alteRifle src/Dodge/Item/Held/Cane.hs 22;" f ammoMagInfo src/Dodge/Item/Info.hs 49;" f @@ -2677,11 +2675,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 298;" f +anythingHitCirc src/Dodge/Base/Collide.hs 338;" 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 42;" f +applyGravityPU src/Dodge/Projectile/Update.hs 43;" f applyIndividualDamage src/Dodge/Creature/Damage.hs 16;" f applyInvLock src/Dodge/HeldUse.hs 444;" f applyMagnetsToBul src/Dodge/Bullet.hs 30;" f @@ -2757,7 +2755,7 @@ bangS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 668;" f bangStick src/Dodge/Item/Held/Stick.hs 15;" f barPP src/Dodge/Room/Foreground.hs 236;" f barrel src/Dodge/Creature/Inanimate.hs 17;" f -barrelShape src/Dodge/Render/ShapePicture.hs 66;" f +barrelShape src/Dodge/Render/ShapePicture.hs 67;" f baseAMRShape src/Dodge/Item/Draw/SPic.hs 418;" f baseBlockPane src/Dodge/Placement/Instance/Wall.hs 86;" f baseCI src/Dodge/Item/Grammar.hs 157;" f @@ -2841,7 +2839,7 @@ branchRectWith src/Dodge/Room/Branch.hs 15;" f branchWith src/Dodge/Room/Room.hs 67;" f bright src/Color.hs 120;" f brightX src/Color.hs 116;" f -btSPic src/Dodge/Render/ShapePicture.hs 126;" f +btSPic src/Dodge/Render/ShapePicture.hs 127;" f btText src/Dodge/Inventory/SelectionList.hs 234;" f bufferEBO src/Shader/Bind.hs 28;" f bufferPokedVBO src/Shader/Bind.hs 19;" f @@ -2859,8 +2857,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 284;" f -canSeeIndirect src/Dodge/Base/Collide.hs 291;" f +canSee src/Dodge/Base/Collide.hs 324;" f +canSeeIndirect src/Dodge/Base/Collide.hs 331;" 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 @@ -2889,6 +2887,7 @@ chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 114;" f chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 31;" f chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 37;" f chasmTest src/Dodge/Creature/Update.hs 26;" f +chasmWallToSurface src/Dodge/Base/Collide.hs 110;" f checkCombineSelectionExists src/Dodge/DisplayInventory.hs 100;" f checkConnection src/Dodge/Inventory/Swap.hs 64;" f checkDeath src/Dodge/Creature/State.hs 77;" f @@ -2912,12 +2911,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 200;" f +circHitWall src/Dodge/Base/Collide.hs 232;" f circInPolygon src/Geometry/Polygon.hs 70;" f -circOnAnyCr src/Dodge/Base/Collide.hs 248;" f +circOnAnyCr src/Dodge/Base/Collide.hs 287;" f circOnSeg src/Geometry.hs 102;" f circOnSegNoEndpoints src/Geometry.hs 92;" f -circOnSomeWall src/Dodge/Base/Collide.hs 242;" f +circOnSomeWall src/Dodge/Base/Collide.hs 281;" f circle src/Picture/Base.hs 180;" f circleDecoration src/Dodge/Placement/TopDecoration.hs 56;" f circleSolid src/Picture/Base.hs 164;" f @@ -2942,7 +2941,7 @@ click1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 582;" f clickGetCreature src/Dodge/Debug.hs 107;" f clicker src/Dodge/Item/Scope.hs 82;" f clipV src/Geometry/Vector.hs 47;" f -clipZoom src/Dodge/Update/Camera.hs 222;" f +clipZoom src/Dodge/Update/Camera.hs 223;" f clockCycle src/Dodge/Clock.hs 9;" f closeButtonToSelectionItem src/Dodge/Inventory/SelectionList.hs 220;" f closeItemToSelectionItem src/Dodge/Inventory/SelectionList.hs 205;" f @@ -2965,16 +2964,18 @@ 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 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 +collide3 src/Dodge/Base/Collide.hs 119;" f +collide3Chasm src/Dodge/Base/Collide.hs 103;" f +collide3Chasms src/Dodge/Base/Collide.hs 96;" f +collide3Creature src/Dodge/Base/Collide.hs 153;" f +collide3Floors src/Dodge/Base/Collide.hs 134;" f +collide3Wall src/Dodge/Base/Collide.hs 148;" f +collide3Walls src/Dodge/Base/Collide.hs 128;" f collide3WallsFloor src/Dodge/Base/Collide.hs 90;" f -collideCircWalls src/Dodge/Base/Collide.hs 210;" f +collideCircWalls src/Dodge/Base/Collide.hs 244;" 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 +collidePointTestFilter src/Dodge/Base/Collide.hs 180;" f +collidePointWallsFilter src/Dodge/Base/Collide.hs 194;" f collisionDebugItem src/Dodge/Debug.hs 47;" f color src/Picture/Base.hs 108;" f colorLamp src/Dodge/Creature/Lamp.hs 10;" f @@ -3108,7 +3109,7 @@ crsNearRect src/Dodge/Zoning/Creature.hs 38;" f crsNearSeg src/Dodge/Zoning/Creature.hs 23;" f crystalLine src/Dodge/Placement/Instance/Wall.hs 55;" f cubeShape src/Dodge/Block/Debris.hs 103;" f -cullPoint src/Dodge/Render/ShapePicture.hs 88;" f +cullPoint src/Dodge/Render/ShapePicture.hs 89;" f cullPretty src/AesonHelp.hs 14;" f cutPoly src/Dodge/LevelGen/StaticWalls.hs 77;" f cutWall src/Dodge/LevelGen/StaticWalls.hs 124;" f @@ -3257,7 +3258,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 175;" f +destroyProjectile src/Dodge/Projectile/Update.hs 163;" 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 @@ -3295,7 +3296,7 @@ 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 225;" f +doBarrelSpin src/Dodge/Projectile/Update.hs 213;" f doBlBl src/Dodge/BlBl.hs 5;" f doBlSh src/Dodge/Block/Draw.hs 14;" f doBounce src/Dodge/Base/Collide.hs 66;" f @@ -3326,7 +3327,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 36;" f +doGravityPU src/Dodge/Projectile/Update.hs 37;" f doHeldUseEffect src/Dodge/HeldUse.hs 354;" f doInPlacements src/Dodge/Layout.hs 92;" f doIndividualPlacements src/Dodge/Layout.hs 117;" f @@ -3362,11 +3363,11 @@ 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 197;" f +doThrust src/Dodge/Projectile/Update.hs 185;" f doTimeScroll src/Dodge/Update.hs 208;" f doTmTm src/Dodge/TmTm.hs 6;" f doTmWdWd src/Dodge/WorldEffect.hs 99;" f -doWallRotate src/Dodge/Update/Camera.hs 212;" f +doWallRotate src/Dodge/Update/Camera.hs 213;" f doWdBl src/Dodge/WorldBool.hs 10;" f doWdCrBl src/Dodge/CreatureEffect.hs 37;" f doWdCrCr src/Dodge/CreatureEffect.hs 12;" f @@ -3397,9 +3398,9 @@ drawBoundingBox src/Dodge/Debug/Picture.hs 336;" f drawBul src/Dodge/Bullet/Draw.hs 9;" f drawButton src/Dodge/Button/Draw.hs 10;" f drawCPUShadows src/Dodge/Render/Shadow.hs 19;" f -drawChasm src/Dodge/Render/ShapePicture.hs 43;" f +drawChasm src/Dodge/Render/ShapePicture.hs 44;" f drawCircCollisionTest src/Dodge/Debug/Picture.hs 116;" f -drawCliff src/Dodge/Render/ShapePicture.hs 46;" f +drawCliff src/Dodge/Render/ShapePicture.hs 47;" f drawCollisionTest src/Dodge/Debug/Picture.hs 103;" f drawCombFilter src/Dodge/Render/Picture.hs 244;" f drawCombineInventory src/Dodge/Render/HUD.hs 179;" f @@ -3407,7 +3408,7 @@ drawConcurrentMessage src/Dodge/Render/Picture.hs 68;" f drawCoord src/Dodge/Debug/Picture.hs 364;" f drawCorpse src/Dodge/Corpse/Draw.hs 6;" f drawCrInfo src/Dodge/Debug/Picture.hs 385;" f -drawCreature src/Dodge/Render/ShapePicture.hs 59;" f +drawCreature src/Dodge/Render/ShapePicture.hs 60;" f drawCreatureDisplayTexts src/Dodge/Debug/Picture.hs 197;" f drawCross src/Dodge/Render/Label.hs 24;" f drawCrossCol src/Dodge/Render/Label.hs 21;" f @@ -3470,10 +3471,10 @@ drawPlus src/Dodge/Render/Picture.hs 144;" f drawPointLabel src/Dodge/Render/Label.hs 13;" f drawProjectile src/Dodge/Projectile/Draw.hs 13;" f drawProp src/Dodge/Prop/Draw.hs 26;" f -drawPulseBall src/Dodge/Render/ShapePicture.hs 51;" f +drawPulseBall src/Dodge/Render/ShapePicture.hs 52;" f drawRBOptions src/Dodge/Render/HUD.hs 249;" f drawRadarSweep src/Dodge/RadarSweep/Draw.hs 14;" f -drawRemoteShell src/Dodge/Projectile/Draw.hs 37;" f +drawRemoteShell src/Dodge/Projectile/Draw.hs 38;" f drawReturn src/Dodge/Render/Picture.hs 131;" f drawRootCursor src/Dodge/Render/HUD.hs 72;" f drawSSCursor src/Dodge/SelectionSections/Draw.hs 35;" f @@ -3592,26 +3593,26 @@ 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 297;" f +explodeShell src/Dodge/Projectile/Update.hs 282;" 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 extendAway src/Dodge/Placement/Instance/LightSource.hs 200;" f extendConeToScreenEdge src/Dodge/Debug/Picture.hs 82;" f -extraPics src/Dodge/Render/ShapePicture.hs 93;" f +extraPics src/Dodge/Render/ShapePicture.hs 94;" f extraWeaponLinks src/Dodge/Item/Grammar.hs 89;" f extraWeaponLinksBelow src/Dodge/Item/Grammar.hs 98;" f 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 233;" f +farWallDistDirection src/Dodge/Update/Camera.hs 234;" f fdiv src/ShortShow.hs 26;" f feet src/Dodge/Creature/Picture.hs 49;" f ffoldM src/Framebuffer/Update.hs 79;" f filter3 src/FoldableHelp.hs 76;" f filterSectionsPair src/Dodge/DisplayInventory.hs 167;" f findBlips src/Dodge/RadarSweep.hs 62;" f -findBoundDists src/Dodge/Update/Camera.hs 240;" f +findBoundDists src/Dodge/Update/Camera.hs 241;" f findClosePoint src/Dodge/LevelGen/StaticWalls.hs 155;" f findClosePoint src/Dodge/LevelGen/StaticWalls/Deprecated.hs 74;" f findIndex src/IntMapHelp.hs 85;" f @@ -3656,7 +3657,7 @@ flockPointTargetR src/Dodge/Creature/Boid.hs 267;" f flockToPointUsing src/Dodge/Creature/Boid.hs 215;" f flockToPointUsing' src/Dodge/Creature/Boid.hs 228;" f floorItemPickupInfo src/Dodge/Render/HUD.hs 228;" f -floorItemSPic src/Dodge/Render/ShapePicture.hs 119;" f +floorItemSPic src/Dodge/Render/ShapePicture.hs 120;" f floorWire src/Dodge/Wire.hs 13;" f foamSprayFadeOutS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 558;" f foamSprayLoopS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 554;" f @@ -3714,7 +3715,7 @@ geometryQuickCheckTests test/Spec.hs 55;" f geometryTests test/Spec.hs 17;" f geometryUnitTests test/Spec.hs 22;" f geqConstr src/SameConstr.hs 21;" f -getAimZoom src/Dodge/Update/Camera.hs 135;" f +getAimZoom src/Dodge/Update/Camera.hs 136;" f getAmmoLinks src/Dodge/Item/Grammar.hs 103;" f getArguments src/Dodge/Update/Scroll.hs 178;" f getArguments' src/Dodge/Update/Scroll.hs 166;" f @@ -3813,11 +3814,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 262;" f +hasButtonLOS src/Dodge/Base/Collide.hs 301;" f hasCaneGunDim src/Dodge/Item/InvSize.hs 48;" f hasFrontArmour src/Dodge/Creature/Test.hs 118;" f -hasLOS src/Dodge/Base/Collide.hs 255;" f -hasLOSIndirect src/Dodge/Base/Collide.hs 270;" f +hasLOS src/Dodge/Base/Collide.hs 294;" f +hasLOSIndirect src/Dodge/Base/Collide.hs 310;" f hat src/Dodge/Item/Equipment.hs 76;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 79;" f @@ -3828,7 +3829,7 @@ healthAnalyserByDoor src/Dodge/Room/LasTurret.hs 74;" f healthTest src/Dodge/Room/LasTurret.hs 95;" f heightWallPS src/Dodge/Placement/Instance/Wall.hs 13;" f heldAimStance src/Dodge/Item/AimStance.hs 24;" f -heldAimZoom src/Dodge/Update/Camera.hs 141;" f +heldAimZoom src/Dodge/Update/Camera.hs 142;" f heldEffect src/Dodge/HeldUse.hs 61;" f heldEffectMuzzles src/Dodge/HeldUse.hs 139;" f heldHandlePos src/Dodge/Item/HeldOffset.hs 89;" f @@ -3985,7 +3986,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 277;" f +isWalkable src/Dodge/Base/Collide.hs 317;" f isoMatrix src/MatrixHelper.hs 30;" f isotriBWH src/Geometry/Polygon.hs 20;" f itDim src/Dodge/Item/InvSize.hs 21;" f @@ -4061,7 +4062,7 @@ lShape src/Dodge/Placement/Instance/LightSource.hs 76;" f lamp src/Dodge/Creature/Lamp.hs 21;" f lampCover src/Dodge/Placement/Instance/LightSource/Cover.hs 8;" f lampCoverWhen src/Dodge/Placement/Instance/LightSource/Cover.hs 19;" f -lampCrSPic src/Dodge/Render/ShapePicture.hs 71;" f +lampCrSPic src/Dodge/Render/ShapePicture.hs 72;" f lasCenSensEdge src/Dodge/Room/LasTurret.hs 114;" f lasGunPic src/Dodge/Item/Draw/SPic.hs 424;" f lasPulseS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 526;" f @@ -4262,7 +4263,7 @@ mcKillTerm src/Dodge/Machine/Destroy.hs 26;" f mcPlaySound src/Dodge/Machine/Update.hs 104;" f mcProxTest src/Dodge/Machine/Update.hs 152;" f mcProximitySensorUpdate src/Dodge/Machine/Update.hs 130;" f -mcSPic src/Dodge/Render/ShapePicture.hs 131;" f +mcSPic src/Dodge/Render/ShapePicture.hs 132;" f mcSensorTriggerUpdate src/Dodge/Machine/Update.hs 93;" f mcSensorUpdate src/Dodge/Machine/Update.hs 125;" f mcShootAuto src/Dodge/HeldUse.hs 1223;" f @@ -4341,16 +4342,16 @@ 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 266;" f +moveProjectile src/Dodge/Projectile/Update.hs 250;" f moveRoomBy src/Dodge/Room/Link.hs 53;" f moveShockwave src/Dodge/Shockwave/Update.hs 15;" f -moveStuckGrenade src/Dodge/Projectile/Update.hs 263;" f +moveStuckGrenade src/Dodge/Projectile/Update.hs 247;" f moveToSideFirstOutLink src/Dodge/Room/Warning.hs 55;" f moveWall src/Dodge/Wall/Move.hs 29;" f moveWallID src/Dodge/Wall/Move.hs 24;" f moveWallIDToward src/Dodge/Wall/Move.hs 47;" f moveWallIDUnsafe src/Dodge/Wall/Move.hs 19;" f -moveZoomCamera src/Dodge/Update/Camera.hs 86;" f +moveZoomCamera src/Dodge/Update/Camera.hs 87;" f mtTopLabels src/Dodge/Tree/Compose.hs 49;" f mtUnderLabels src/Dodge/Tree/Compose.hs 52;" f muchWlDustAt src/Dodge/Wall/Dust.hs 10;" f @@ -4452,10 +4453,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 189;" f -overlapCircWallsClosest src/Dodge/Base/Collide.hs 228;" f +overlapCircWalls src/Dodge/Base/Collide.hs 221;" f +overlapCircWallsClosest src/Dodge/Base/Collide.hs 267;" f overlapSegCrs src/Dodge/Base/Collide.hs 60;" f -overlapSegWalls src/Dodge/Base/Collide.hs 171;" f +overlapSegWalls src/Dodge/Base/Collide.hs 203;" 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 @@ -4508,7 +4509,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 242;" f +pjRemoteSetDirection src/Dodge/Projectile/Update.hs 226;" 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 @@ -4633,7 +4634,7 @@ powlist src/Multiset.hs 61;" f powlistUpToN src/Multiset.hs 23;" f powlistUpToN' src/Multiset.hs 12;" f powlistUpToN'' src/Multiset.hs 31;" f -ppDraw src/Dodge/Render/ShapePicture.hs 116;" f +ppDraw src/Dodge/Render/ShapePicture.hs 117;" f ppEvents src/Dodge/Update.hs 779;" f ppLevelReset src/Dodge/PressPlate.hs 13;" f preCritStart src/Dodge/Room/Start.hs 82;" f @@ -4812,7 +4813,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 +restrictSeg src/Dodge/Base/Collide.hs 162;" f resumeSound src/Dodge/SoundLogic.hs 48;" f retreatActionsPistol src/Dodge/Humanoid.hs 249;" f retreatFireLauncher src/Dodge/Humanoid.hs 270;" f @@ -4871,7 +4872,7 @@ rotate3 src/Geometry/Vector3D.hs 48;" f rotate3x src/Geometry/Vector3D.hs 60;" f rotate3y src/Geometry/Vector3D.hs 66;" f rotate3z src/Geometry/Vector3D.hs 54;" f -rotateCamera src/Dodge/Update/Camera.hs 189;" f +rotateCamera src/Dodge/Update/Camera.hs 190;" f rotateList src/Padding.hs 49;" f rotateProp src/Dodge/Prop/Update.hs 47;" f rotateSH src/Shape.hs 257;" f @@ -4879,7 +4880,7 @@ rotateSHq src/Shape.hs 166;" f rotateSHx src/Shape.hs 265;" f rotateSP src/ShapePicture.hs 57;" f rotateTo src/Polyhedra/Geodesic.hs 64;" f -rotateToOverlappingWall src/Dodge/Update/Camera.hs 201;" f +rotateToOverlappingWall src/Dodge/Update/Camera.hs 202;" f rotateToZ src/Quaternion.hs 38;" f rotateV src/Geometry/Vector.hs 105;" f rotateVAround src/Geometry/Vector.hs 112;" f @@ -5007,7 +5008,7 @@ setTargetMv src/Dodge/Creature/ReaderUpdate.hs 76;" f setTile src/Dodge/Layout.hs 68;" f setTiles src/Dodge/Layout.hs 65;" f setToggle src/Dodge/Prop/Update.hs 44;" f -setViewDistance src/Dodge/Update/Camera.hs 228;" f +setViewDistance src/Dodge/Update/Camera.hs 229;" f setViewPos src/Dodge/Creature/ReaderUpdate.hs 63;" f setViewport src/Dodge/Render.hs 429;" f setVol src/Dodge/Config/Update.hs 30;" f @@ -5039,18 +5040,18 @@ 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 -shellExplosionCheck src/Dodge/Projectile/Update.hs 63;" f -shellHitCreature src/Dodge/Projectile/Update.hs 95;" f -shellHitFloor src/Dodge/Projectile/Update.hs 116;" f -shellHitWall src/Dodge/Projectile/Update.hs 74;" f +shellExplosionCheck src/Dodge/Projectile/Update.hs 55;" f +shellHitCreature src/Dodge/Projectile/Update.hs 87;" f +shellHitFloor src/Dodge/Projectile/Update.hs 104;" f +shellHitWall src/Dodge/Projectile/Update.hs 66;" 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 +shellShape src/Dodge/Projectile/Draw.hs 35;" f shieldWall src/Dodge/Item/BackgroundEffect.hs 77;" f shiftByV2 src/Dodge/PlacementSpot.hs 239;" f shiftChildren src/Dodge/Tree/Compose.hs 43;" f -shiftDraw src/Dodge/Render/ShapePicture.hs 76;" f -shiftDraw' src/Dodge/Render/ShapePicture.hs 82;" f +shiftDraw src/Dodge/Render/ShapePicture.hs 77;" f +shiftDraw' src/Dodge/Render/ShapePicture.hs 83;" f shiftInBy src/Dodge/PlacementSpot.hs 236;" f shiftInvItems src/Dodge/Update/Input/InGame.hs 308;" f shiftInvItemsDown src/Dodge/Update/Input/InGame.hs 347;" f @@ -5381,8 +5382,8 @@ transMat src/MatrixHelper.hs 73;" f transToHandle src/Dodge/Item/HeldOffset.hs 26;" f translate src/Picture/Base.hs 116;" f translate3 src/Picture/Base.hs 120;" f -translateFloatingCamera src/Dodge/Update/Camera.hs 45;" f -translateFloatingCameraKeys src/Dodge/Update/Camera.hs 62;" f +translateFloatingCamera src/Dodge/Update/Camera.hs 46;" f +translateFloatingCameraKeys src/Dodge/Update/Camera.hs 63;" f translateH src/Picture/Base.hs 112;" f translatePointToHead src/Dodge/Creature/HandPos.hs 147;" f translatePointToLeftHand src/Dodge/Creature/HandPos.hs 75;" f @@ -5440,10 +5441,9 @@ 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 141;" f -trySpin src/Dodge/Projectile/Update.hs 185;" f +trySpin src/Dodge/Projectile/Update.hs 173;" f trySynthBullet src/Dodge/Creature/State.hs 249;" f -tryThrust src/Dodge/Projectile/Update.hs 191;" f +tryThrust src/Dodge/Projectile/Update.hs 179;" 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 @@ -5485,11 +5485,11 @@ updateBackspaceRegex src/Dodge/Update/Input/InGame.hs 453;" f updateBarrel src/Dodge/Barreloid.hs 41;" f updateBarreloid src/Dodge/Barreloid.hs 15;" f updateBaseWheelEvent src/Dodge/Update/Scroll.hs 29;" f -updateBounds src/Dodge/Update/Camera.hs 250;" f +updateBounds src/Dodge/Update/Camera.hs 251;" f updateBulVel src/Dodge/Bullet.hs 55;" f updateBullet src/Dodge/Bullet.hs 20;" f updateBullets src/Dodge/Update.hs 594;" f -updateCamera src/Dodge/Update/Camera.hs 29;" f +updateCamera src/Dodge/Update/Camera.hs 30;" f updateCloseObjects src/Dodge/Inventory.hs 116;" f updateCloud src/Dodge/Update.hs 826;" f updateClouds src/Dodge/Update.hs 698;" f @@ -5516,14 +5516,14 @@ updateFBOTO src/Framebuffer/Update.hs 97;" f updateFBOTO3 src/Framebuffer/Update.hs 131;" f updateFlame src/Dodge/Flame.hs 19;" f updateFlames src/Dodge/Update.hs 686;" f -updateFloatingCamera src/Dodge/Update/Camera.hs 34;" f +updateFloatingCamera src/Dodge/Update/Camera.hs 35;" f updateFunctionKey src/Dodge/Update/Input/InGame.hs 364;" f updateFunctionKeys src/Dodge/Update/Input/InGame.hs 357;" f updateGusts src/Dodge/Update.hs 809;" f updateHumanoid src/Dodge/Humanoid.hs 13;" f updateIMl src/Dodge/Update.hs 556;" f updateIMl' src/Dodge/Update.hs 561;" f -updateInGameCamera src/Dodge/Update/Camera.hs 78;" f +updateInGameCamera src/Dodge/Update/Camera.hs 79;" f updateInitialPressInGame src/Dodge/Update/Input/InGame.hs 400;" f updateInt2Map src/Dodge/Zoning/Base.hs 92;" f updateInventoryPositioning src/Dodge/DisplayInventory.hs 86;" f @@ -5548,7 +5548,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 27;" f +updateProjectile src/Dodge/Projectile/Update.hs 28;" f updateProp src/Dodge/Prop/Update.hs 11;" f updatePulse src/Dodge/Creature/Update.hs 39;" f updatePulseBall src/Dodge/Update.hs 467;" f @@ -5650,10 +5650,10 @@ verticalWire src/Dodge/Wire.hs 24;" f vgunMuzzles src/Dodge/HeldUse.hs 343;" f viewBoundaries src/Dodge/Debug/Picture.hs 309;" f viewClipBounds src/Dodge/Debug/Picture.hs 318;" f -viewDistanceFromItems src/Dodge/Update/Camera.hs 186;" f +viewDistanceFromItems src/Dodge/Update/Camera.hs 187;" f viewTarget src/Dodge/Creature/ReaderUpdate.hs 146;" f violet src/Color.hs 21;" f -visibleWalls src/Dodge/Base/Collide.hs 175;" f +visibleWalls src/Dodge/Base/Collide.hs 207;" 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,7 +5665,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 +wallToSurface src/Dodge/Base/Collide.hs 172;" f wallsFromRooms src/Dodge/Layout.hs 146;" f wallsToDraw src/Dodge/Render/Walls.hs 17;" f warmupSound src/Dodge/HeldUse.hs 1454;" f @@ -5728,7 +5728,7 @@ wlsNearRect src/Dodge/Zoning/Wall.hs 46;" f wlsNearSeg src/Dodge/Zoning/Wall.hs 42;" f wordsBy src/ListHelp.hs 116;" f worldPosToScreen src/Dodge/Base/Coordinate.hs 28;" f -worldSPic src/Dodge/Render/ShapePicture.hs 21;" f +worldSPic src/Dodge/Render/ShapePicture.hs 22;" f worldToGenWorld src/Dodge/LevelGen/LevelStructure.hs 14;" f wpAdd src/Dodge/Room/RezBox.hs 137;" f wrench1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 546;" f @@ -5786,7 +5786,7 @@ zonePn src/Dodge/Zoning/Pathing.hs 30;" f zoneWall src/Dodge/Zoning/Wall.hs 65;" f zonesAroundPoint src/Dodge/Zoning/Base.hs 96;" f zonesExtract src/Dodge/Zoning/Base.hs 56;" f -zoomFloatingCamera src/Dodge/Update/Camera.hs 70;" f +zoomFloatingCamera src/Dodge/Update/Camera.hs 71;" f zoomInLongGun src/Dodge/Update/Scroll.hs 98;" f zoomOutLongGun src/Dodge/Update/Scroll.hs 106;" f zoomScope src/Dodge/Item/Scope.hs 33;" f