From e00bb0b26ea29a4878ffc00858bcc5258ea163cd Mon Sep 17 00:00:00 2001 From: justin Date: Fri, 10 Oct 2025 11:21:40 +0100 Subject: [PATCH] Add intersection with cylinders --- saveSlot/seed | 2 +- src/Dodge/Base/Collide.hs | 29 ++-- src/Geometry.hs | 3 - src/Geometry/Intersect.hs | 98 ++++++++---- src/Geometry/Vector.hs | 5 + tags | 319 +++++++++++++++++++------------------- 6 files changed, 256 insertions(+), 200 deletions(-) diff --git a/saveSlot/seed b/saveSlot/seed index 51cdde7bf..63ae1b50b 100644 --- a/saveSlot/seed +++ b/saveSlot/seed @@ -1 +1 @@ -8840982665868093329 \ No newline at end of file +3392801227273840162 \ No newline at end of file diff --git a/src/Dodge/Base/Collide.hs b/src/Dodge/Base/Collide.hs index 6e9474c8c..55cb27546 100644 --- a/src/Dodge/Base/Collide.hs +++ b/src/Dodge/Base/Collide.hs @@ -152,23 +152,28 @@ collide3Wall sp wl (ep, mo) = maybe (ep, mo) (,Just (n, OWall wl)) $ intersectSe 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)) - (zmin,zmax) <- crZBounds cr - 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)) +-- (sp', ep') <- restrictSeg 0 (V3 0 0 1) (sp, ep) +-- >>= restrictSeg (V3 0 0 25) (V3 0 0 (-1)) + h <- crHeight cr + (p,n) <- fst $ intersectCylSeg + (addZ (cr ^. crZ) cpos) + (crRad $ cr ^. crType) + h + sp + ep + return (p, Just (n,OCreature cr)) +-- 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 -crZBounds :: Creature -> Maybe (Float,Float) -crZBounds cr = f <$> case cr ^. crHP of - HP {} -> Just (0,25) - CrIsCorpse {} -> Just (0,5) +crHeight :: Creature -> Maybe Float +crHeight cr = case cr ^. crHP of + HP {} -> Just 25 + CrIsCorpse {} -> Just 5 CrIsGibs -> Nothing CrIsPitted -> Nothing - where - f (a,b) = (a + cr ^. crZ,b + cr ^. crZ) restrictSeg :: Point3 -> Point3 -> (Point3, Point3) -> Maybe (Point3, Point3) restrictSeg p n (sp, ep) diff --git a/src/Geometry.hs b/src/Geometry.hs index 4cd92d932..0ab2984a8 100644 --- a/src/Geometry.hs +++ b/src/Geometry.hs @@ -32,7 +32,6 @@ import Geometry.Triangulate import Geometry.Vector import Geometry.Vector3D import ListHelp -import Linear.Metric {- | Return a point a distance away from a first point towards a second point. Does not go past the second point. @@ -137,8 +136,6 @@ difference x y reflectIn :: Point2 -> Point2 -> Point2 reflectIn line vec = rotateV (2 * angleBetween line vec) vec -reflectInNormal :: Point3 -> Point3 -> Point3 -reflectInNormal n v = v - (2 * project n v) -- takes an angle of entry (measured from x axis) and two wall points and gives a -- reflected angle (from x axis) diff --git a/src/Geometry/Intersect.hs b/src/Geometry/Intersect.hs index 08ff3b6a3..8b13cd257 100644 --- a/src/Geometry/Intersect.hs +++ b/src/Geometry/Intersect.hs @@ -4,16 +4,16 @@ {- Testing for and finding intersection points. -} module Geometry.Intersect where -import Linear -import Control.Lens import Control.Applicative +import Control.Lens +import Control.Monad import Data.List import Data.Maybe import Geometry.Data import Geometry.LHS import Geometry.Vector import Geometry.Vector3D -import Control.Monad +import Linear -- | If two lines intersect, return 'Just' that point. intersectLineLine :: Point2 -> Point2 -> Point2 -> Point2 -> Maybe Point2 @@ -25,11 +25,17 @@ intersectLineLine (V2 x1 y1) (V2 x2 y2) (V2 x3 y3) (V2 x4 y4) den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4) t' = (x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4) --- note that the second argument is a vector, not the second point of the line -intersectLinePlane :: Point3 -> Point3 -> Point3 -> Point3 -> Maybe Point3 -intersectLinePlane l v p n = case dot v n of - 0 -> Nothing - x -> Just $ l + (dot (p - l) n / x) *.*.* v +---- note that the second argument is a vector, not the second point of the line +--intersectLinePlane :: Point3 -> Point3 -> Point3 -> Point3 -> Maybe Point3 +--intersectLinePlane l v p n = case dot v n of +-- 0 -> Nothing +-- x -> Just $ l + (dot (p - l) n / x) *.*.* v + +intersectLinePlaneAlong :: Point3 -> Point3 -> Point3 -> Point3 -> Maybe Float +intersectLinePlaneAlong x y p n = do + let den = dot (y - x) n + guard $ den /= 0 + return $ dot (p - x) n / den -- this needs to be checked intersectSegPlane :: Point3 -> Point3 -> Point3 -> Point3 -> Maybe Point3 @@ -41,11 +47,16 @@ intersectSegPlane sp ep p n = case dot v n of where v = ep - sp -intersectSegSurface :: Point3 -> Point3 -> Point3 -> Point3 - -> [(Point3,Point3)] -> Maybe Point3 +intersectSegSurface :: + Point3 -> + Point3 -> + Point3 -> + Point3 -> + [(Point3, Point3)] -> + Maybe Point3 intersectSegSurface sp ep p n ss = do xp <- intersectSegPlane sp ep p n - let f (a,b) = isNHS a b xp + let f (a, b) = isNHS a b xp guard $ all f ss return xp @@ -117,9 +128,10 @@ intersectSegLineext (V2 x1 y1) (V2 x2 y2) (V2 x3 y3) (V2 x4 y4) t' = (x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4) u' = (y1 - y2) * (x1 - x3) - (x1 - x2) * (y1 - y3) --- | Intersect a segment with a line. --- the line intersects with the first endpoint of the segment --- but NOT the second +{- | Intersect a segment with a line. + the line intersects with the first endpoint of the segment + but NOT the second +-} intersectSegLine :: Point2 -> Point2 -> Point2 -> Point2 -> Maybe Point2 {-# INLINE intersectSegLine #-} intersectSegLine (V2 x1 y1) (V2 x2 y2) (V2 x3 y3) (V2 x4 y4) @@ -220,8 +232,8 @@ myIntersectLineLine a@(V2 ax _) b c@(V2 cx _) d Just 0 -> Nothing _ -> liftA2 V2 newx ((linGrad a b ^*^ newx) ^+^ axisInt a b) where --- (^-^) = liftA2 (-) --- (^+^) = liftA2 (+) + -- (^-^) = liftA2 (-) + -- (^+^) = liftA2 (+) (^/^) = liftA2 (/) (^*^) = liftA2 (*) newx = (axisInt c d ^-^ axisInt a b) ^/^ (linGrad a b ^-^ linGrad c d) @@ -345,7 +357,7 @@ intersectCircSeg c r a b where d = closestPointOnLine a b c x = dist d c - y = r ^ (2::Int) - x ^ (2::Int) + y = r ^ (2 :: Int) - x ^ (2 :: Int) z = sqrt y v = z *.* normalizeV (b -.- a) @@ -353,20 +365,52 @@ intersectCircLineAlong :: Point2 -> Float -> Point2 -> Point2 -> Maybe (Float, F intersectCircLineAlong p r x y = do let d = y - x f = p - x - dis = (dot d f / dot d d) ** 2 + (dot f f - r ** 2)/dot d d - guard $ dis > 0 + dsc = (dot d f / dot d d) ** 2 - (dot f f - r ** 2) / dot d d + guard $ dsc > 0 let a = dot d f / dot d d - return (a - dis, a + dis) + return (a - sqrt dsc, a + sqrt dsc) -intersectCylSeg :: Point3 -> Float -> Float -> Point3 -> Point3 -> Maybe (Point3, Point3) -intersectCylSeg p r h x y = do - (a,b) <- intersectCircLineAlong (p ^. _xy) r (x ^. _xy) (y ^. _xy) - Nothing +intersectCircLine :: Point2 -> Float -> Point2 -> Point2 -> Maybe (Point2, Point2) +intersectCircLine c r x y = + intersectCircLineAlong c r x y + & _Just . _1 %~ f + & _Just . _2 %~ f + where + f :: Float -> Point2 + f a = x + (a *.* (y - x)) + +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) + 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)) + else do + topx <- mtopx + botx <- mbotx + let d = mm topx botx + guard $ d > 0 && d < 1 + let int = s + d *.*.* v + guard $ dist (int ^. _xy) (p ^. _xy) <= r + return (int, reflectInNormal (V3 0 0 1) v) intersectCircSegTest :: Point2 -> Float -> Point2 -> Point2 -> Bool -intersectCircSegTest c r x y = intersectSegSegTest (c + z) (c - z) x y - || dist c x <= r - || dist c y <= r +intersectCircSegTest c r x y = + intersectSegSegTest (c + z) (c - z) x y + || dist c x <= r + || dist c y <= r where z = r *.* vNormal (normalizeV x - y) diff --git a/src/Geometry/Vector.hs b/src/Geometry/Vector.hs index 6e536a3eb..31b7da691 100644 --- a/src/Geometry/Vector.hs +++ b/src/Geometry/Vector.hs @@ -2,6 +2,7 @@ module Geometry.Vector where +import Linear import Geometry.Data -- | Moves from two to three dimensions, adding zero in z direction. @@ -218,3 +219,7 @@ xyzV4 (V4 x y z _) = V3 x y z xyV3 :: V3 a -> V2 a {-# INLINE xyV3 #-} xyV3 (V3 x y _) = V2 x y + +reflectInNormal :: (Metric v,Fractional a,Num (v a)) => v a -> v a -> v a +{-# INLINE reflectInNormal #-} +reflectInNormal n v = v - (2 * project n v) diff --git a/tags b/tags index 5e5395605..968d8d3c7 100644 --- a/tags +++ b/tags @@ -1,12 +1,12 @@ !_TAG_FILE_SORTED 1 // !? src/ListHelp.hs 59;" o -*.* src/Geometry/Vector.hs 35;" o +*.* src/Geometry/Vector.hs 36;" o *.*.* src/Geometry/Vector3D.hs 32;" o ++.~ src/LensHelp.hs 37;" o -+.+ src/Geometry/Vector.hs 17;" o ++.+ src/Geometry/Vector.hs 18;" o +.+.+ src/Geometry/Vector3D.hs 14;" o +.+.~ src/LensHelp.hs 28;" o --.- src/Geometry/Vector.hs 26;" o +-.- src/Geometry/Vector.hs 27;" o -.-.- src/Geometry/Vector3D.hs 23;" o .*.*~ src/LensHelp.hs 18;" o .++~ src/LensHelp.hs 33;" o @@ -2613,8 +2613,8 @@ airlockDoor src/Dodge/Room/Airlock.hs 93;" f airlockDoubleDoor src/Dodge/Room/Airlock.hs 96;" f airlockSimple src/Dodge/Room/Airlock.hs 108;" f airlockZ src/Dodge/Room/Airlock.hs 133;" f -allVisibleWalls src/Dodge/Base/Collide.hs 215;" f -alongSegBy src/Geometry.hs 41;" f +allVisibleWalls src/Dodge/Base/Collide.hs 226;" f +alongSegBy src/Geometry.hs 40;" f alteRifle src/Dodge/Item/Held/Cane.hs 22;" f ammoMagInfo src/Dodge/Item/Info.hs 49;" f ammoMagSPic src/Dodge/Item/Draw/SPic.hs 128;" f @@ -2627,15 +2627,15 @@ analyserByNthLink src/Dodge/Room/LasTurret.hs 84;" f analyserByNthLinkWithPrompt src/Dodge/Room/LasTurret.hs 99;" f analyserWithPrompt src/Dodge/Placement/Instance/Analyser.hs 15;" f andOrRegex src/Dodge/DisplayInventory.hs 78;" f -angleBetween src/Geometry.hs 161;" f -angleVV src/Geometry/Vector.hs 57;" f +angleBetween src/Geometry.hs 158;" f +angleVV src/Geometry/Vector.hs 58;" f angleVV3 src/Geometry/Vector3D.hs 122;" f anyUnusedSpot src/Dodge/PlacementSpot.hs 66;" f -anythingHitCirc src/Dodge/Base/Collide.hs 338;" f +anythingHitCirc src/Dodge/Base/Collide.hs 349;" f applyCME src/Dodge/HeldUse.hs 361;" 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 41;" f applyIndividualDamage src/Dodge/Creature/Damage.hs 16;" f applyInvLock src/Dodge/HeldUse.hs 420;" f applyMagnetsToBul src/Dodge/Bullet.hs 31;" f @@ -2662,11 +2662,11 @@ arc src/Picture/Base.hs 287;" f arcFull src/Picture/Arc.hs 11;" f arcPart src/Picture/Arc.hs 24;" f arcSolid src/Picture/Base.hs 276;" f -arcStepwise src/Geometry.hs 329;" f -arcStepwisePositive src/Geometry.hs 343;" f +arcStepwise src/Geometry.hs 326;" f +arcStepwisePositive src/Geometry.hs 340;" f arcTest src/Picture/Test.hs 9;" f arcTest' src/Picture/Test.hs 21;" f -argV src/Geometry/Vector.hs 80;" f +argV src/Geometry/Vector.hs 81;" f armourChaseCrit src/Dodge/Creature/ArmourChase.hs 35;" f armouredChasers src/Dodge/Room/Boss.hs 64;" f armouredCorridor src/Dodge/Room/RoadBlock.hs 20;" f @@ -2696,7 +2696,7 @@ autoGunS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 694;" f autoPistol src/Dodge/Item/Held/Stick.hs 49;" f autoRifle src/Dodge/Item/Held/Cane.hs 27;" f awakeLevelPerception src/Dodge/Creature/Perception.hs 163;" f -axisInt src/Geometry/Intersect.hs 262;" f +axisInt src/Geometry/Intersect.hs 275;" f azure src/Color.hs 22;" f bQuadToF src/Geometry/Bezier.hs 37;" f bQuadToLine src/Geometry/Bezier.hs 30;" f @@ -2814,8 +2814,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 324;" f -canSeeIndirect src/Dodge/Base/Collide.hs 331;" f +canSee src/Dodge/Base/Collide.hs 335;" f +canSeeIndirect src/Dodge/Base/Collide.hs 342;" f cancelExamineInventory src/Dodge/Item/BackgroundEffect.hs 22;" f capacitor src/Dodge/Item/Ammo.hs 69;" f cardEightVec src/Dodge/Base/CardinalPoint.hs 17;" f @@ -2831,7 +2831,7 @@ centerVaultRoom src/Dodge/Room/Procedural.hs 291;" f centroid src/Geometry/Polygon.hs 167;" f centroidNum src/Geometry/Polygon.hs 170;" f chainCreatureUpdates src/Dodge/Creature/ChainUpdates.hs 6;" f -chainPairs src/Geometry.hs 363;" f +chainPairs src/Geometry.hs 360;" f changeSwapOther src/Dodge/Inventory.hs 140;" f changeSwapSel src/Dodge/Inventory.hs 133;" f changeSwapWith src/Dodge/Inventory.hs 174;" f @@ -2870,12 +2870,12 @@ chooseMovementLtAuto src/Dodge/CreatureEffect.hs 105;" f chooseMovementPistol src/Dodge/Humanoid.hs 203;" f chooseMovementPistol' src/Dodge/Humanoid.hs 208;" f chooseMovementSpreadGun src/Dodge/CreatureEffect.hs 88;" f -circHitWall src/Dodge/Base/Collide.hs 232;" f +circHitWall src/Dodge/Base/Collide.hs 243;" f circInPolygon src/Geometry/Polygon.hs 101;" 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 281;" f +circOnAnyCr src/Dodge/Base/Collide.hs 298;" f +circOnSeg src/Geometry.hs 101;" f +circOnSegNoEndpoints src/Geometry.hs 91;" f +circOnSomeWall src/Dodge/Base/Collide.hs 292;" f circle src/Picture/Base.hs 180;" f circleDecoration src/Dodge/Placement/TopDecoration.hs 56;" f circleSolid src/Picture/Base.hs 164;" f @@ -2899,7 +2899,7 @@ cleatSide src/Dodge/Cleat.hs 27;" f click1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 582;" f clickGetCreature src/Dodge/Debug.hs 109;" f clicker src/Dodge/Item/Scope.hs 82;" f -clipV src/Geometry/Vector.hs 47;" f +clipV src/Geometry/Vector.hs 48;" f clipZoom src/Dodge/Update/Camera.hs 230;" f clockCycle src/Dodge/Clock.hs 7;" f closeButtonToSelectionItem src/Dodge/Inventory/SelectionList.hs 223;" f @@ -2907,9 +2907,9 @@ closeItemToSelectionItem src/Dodge/Inventory/SelectionList.hs 208;" f closeItemToTextPictures src/Dodge/Inventory/SelectionList.hs 243;" f closeObjectInfo src/Dodge/Render/HUD.hs 226;" f closestCreatureID src/Dodge/Debug.hs 118;" f -closestPointOnLine src/Geometry/Intersect.hs 286;" f -closestPointOnLineParam src/Geometry/Intersect.hs 302;" f -closestPointOnSeg src/Geometry/Intersect.hs 317;" f +closestPointOnLine src/Geometry/Intersect.hs 299;" f +closestPointOnLineParam src/Geometry/Intersect.hs 315;" f +closestPointOnSeg src/Geometry/Intersect.hs 330;" f cloudEffect src/Dodge/Update.hs 779;" f cloudPoisonDamage src/Dodge/Update/Cloud.hs 10;" f clsNearCirc src/Dodge/Zoning/Cloud.hs 18;" f @@ -2931,10 +2931,10 @@ 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 244;" f +collideCircWalls src/Dodge/Base/Collide.hs 255;" f collidePoint src/Dodge/Base/Collide.hs 54;" f -collidePointTestFilter src/Dodge/Base/Collide.hs 180;" f -collidePointWallsFilter src/Dodge/Base/Collide.hs 194;" f +collidePointTestFilter src/Dodge/Base/Collide.hs 191;" f +collidePointWallsFilter src/Dodge/Base/Collide.hs 205;" f color src/Picture/Base.hs 108;" f colorLamp src/Dodge/Creature/Lamp.hs 10;" f colorSH src/Shape.hs 237;" f @@ -2996,7 +2996,8 @@ crDisplayAwareness src/Dodge/Creature/Picture/Awareness.hs 38;" f crDisplayVigilance src/Dodge/Creature/Picture/Awareness.hs 52;" f crHasTarget src/Dodge/Creature/Test.hs 64;" f crHasTargetLOS src/Dodge/Creature/Test.hs 67;" f -crHit src/Dodge/WorldEvent/ThingsHit.hs 95;" f +crHeight src/Dodge/Base/Collide.hs 164;" f +crHit src/Dodge/WorldEvent/ThingsHit.hs 112;" f crIXsNearCirc src/Dodge/Zoning/Creature.hs 32;" f crIXsNearPoint src/Dodge/Zoning/Creature.hs 14;" f crInAimStance src/Dodge/Creature/Test.hs 90;" f @@ -3055,9 +3056,10 @@ critsRoom src/Dodge/Room/Room.hs 398;" f crixsNearSeg src/Dodge/Zoning/Creature.hs 29;" f crossPic src/Dodge/Render/Label.hs 27;" f crossProd src/Geometry/Vector3D.hs 41;" f -crossV src/Geometry/Vector.hs 178;" f +crossV src/Geometry/Vector.hs 179;" f crsHit src/Dodge/WorldEvent/ThingsHit.hs 60;" f -crsHitRadial src/Dodge/WorldEvent/ThingsHit.hs 130;" f +crsHitRadial src/Dodge/WorldEvent/ThingsHit.hs 147;" f +crsHitZ src/Dodge/WorldEvent/ThingsHit.hs 71;" f crsItmsUnused src/Dodge/Room/Containing.hs 45;" f crsNearCirc src/Dodge/Zoning/Creature.hs 35;" f crsNearPoint src/Dodge/Zoning/Creature.hs 17;" f @@ -3083,7 +3085,7 @@ cycleLT src/IntMapHelp.hs 96;" f cycleOptions src/Dodge/Menu/Option.hs 75;" f cycleR src/DoubleStack.hs 32;" f cylinderIndices src/Shader/Poke.hs 382;" f -cylinderOnSeg src/Geometry.hs 123;" f +cylinderOnSeg src/Geometry.hs 122;" f cylinderPoly src/Shape.hs 87;" f cylinderRoundIndices src/Shader/Poke.hs 389;" f dShadCol src/Dodge/Render/List.hs 214;" f @@ -3192,7 +3194,7 @@ defaultVision src/Dodge/Default/Creature.hs 85;" f defaultWall src/Dodge/Default/Wall.hs 17;" f defaultWindow src/Dodge/Default/Wall.hs 85;" f defaultWorld src/Dodge/Default/World.hs 31;" f -degToRad src/Geometry/Vector.hs 117;" f +degToRad src/Geometry/Vector.hs 118;" f deleteIMInZone src/Dodge/Base.hs 70;" f deleteWall src/Dodge/Wall/Delete.hs 21;" f deleteWallFromZones src/Dodge/Wall/Zone.hs 23;" f @@ -3211,18 +3213,18 @@ 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 160;" f -detV src/Geometry/Vector.hs 93;" f +destroyProjectile src/Dodge/Projectile/Update.hs 159;" 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 1228;" f diagonalLinesRect src/Dodge/Room/Foreground.hs 52;" f did src/Dodge/Item/InvSize.hs 54;" f -diffAngles src/Geometry.hs 208;" f -difference src/Geometry.hs 128;" f -digitalLine src/Geometry.hs 288;" f -digitalRect src/Geometry.hs 305;" f +diffAngles src/Geometry.hs 205;" f +difference src/Geometry.hs 127;" f +digitalLine src/Geometry.hs 285;" f +digitalRect src/Geometry.hs 302;" f dim src/Color.hs 112;" f dirtColor src/Dodge/Default/Wall.hs 81;" f dirtPoly src/Dodge/Room/RoadBlock.hs 74;" f @@ -3234,19 +3236,19 @@ displayFreeSlots src/Dodge/DisplayInventory.hs 192;" f displayIndents src/Dodge/DisplayInventory.hs 110;" f displayPulse src/Dodge/Inventory/SelectionList.hs 179;" f displayTerminalLineString src/Dodge/Update.hs 467;" f -dist src/Geometry/Vector.hs 190;" f +dist src/Geometry/Vector.hs 191;" f dist3 src/Geometry/Vector3D.hs 101;" f divTo src/Geometry/Zone.hs 6;" f -divideCircle src/Geometry.hs 324;" f +divideCircle src/Geometry.hs 321;" f divideDoorPane src/Dodge/Placement/Instance/Door.hs 59;" f -divideLine src/Geometry.hs 251;" f -divideLineExact src/Geometry.hs 279;" f -divideLineOddNumPoints src/Geometry.hs 264;" f +divideLine src/Geometry.hs 248;" f +divideLineExact src/Geometry.hs 276;" f +divideLineOddNumPoints src/Geometry.hs 261;" f dmType src/Dodge/Damage.hs 38;" f doAimTwist src/Dodge/Creature/YourControl.hs 153;" f doAnyEquipmentEffect src/Dodge/Creature/State.hs 140;" f doBackspace src/Dodge/Update/Input/Text.hs 31;" f -doBarrelSpin src/Dodge/Projectile/Update.hs 212;" f +doBarrelSpin src/Dodge/Projectile/Update.hs 211;" f doBlBl src/Dodge/BlBl.hs 5;" f doBlSh src/Dodge/Block/Draw.hs 14;" f doBounce src/Dodge/Base/Collide.hs 66;" f @@ -3277,7 +3279,7 @@ 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 1184;" f -doGravityPU src/Dodge/Projectile/Update.hs 36;" f +doGravityPU src/Dodge/Projectile/Update.hs 35;" f doHeldUseEffect src/Dodge/HeldUse.hs 343;" f doInPlacements src/Dodge/Layout.hs 82;" f doIndividualPlacements src/Dodge/Layout.hs 96;" f @@ -3308,7 +3310,7 @@ doStrategyActions src/Dodge/Creature/ReaderUpdate.hs 166;" 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 182;" f +doThrust src/Dodge/Projectile/Update.hs 181;" f doTimeScroll src/Dodge/Update.hs 196;" f doTmWdWd src/Dodge/WorldEffect.hs 89;" f doWallRotate src/Dodge/Update/Camera.hs 220;" f @@ -3323,7 +3325,7 @@ door src/Dodge/Room/Door.hs 14;" f doorBetween src/Dodge/Placement/Instance/Door.hs 39;" f doorMechanism src/Dodge/DrWdWd.hs 24;" f doorMechanismStepwise src/Dodge/DrWdWd.hs 59;" f -dotV src/Geometry/Vector.hs 75;" f +dotV src/Geometry/Vector.hs 76;" f dotV3 src/Geometry/Vector3D.hs 119;" f doubleCorridorBarrels src/Dodge/Room/Room.hs 276;" f doubleFindMax src/Dodge/Update/Scroll.hs 181;" f @@ -3331,10 +3333,10 @@ doubleFindMin src/Dodge/Update/Scroll.hs 160;" f doubleFindPred src/Dodge/Update/Scroll.hs 188;" f doubleFindSucc src/Dodge/Update/Scroll.hs 167;" f doubleLampCover src/Dodge/Placement/Instance/LightSource/Cover.hs 28;" f -doublePair src/Geometry.hs 165;" f -doublePairSet src/Geometry.hs 169;" f +doublePair src/Geometry.hs 162;" f +doublePairSet src/Geometry.hs 166;" f doubleTreeToIndentList src/Dodge/DoubleTree.hs 129;" f -doubleV2 src/Geometry.hs 172;" f +doubleV2 src/Geometry.hs 169;" f drawARHUD src/Dodge/Creature/State.hs 192;" f drawAimSweep src/Dodge/Render/Picture.hs 279;" f drawAllShadows src/Dodge/Shadows.hs 5;" f @@ -3529,13 +3531,13 @@ equipSitePQ src/Dodge/Creature/HandPos.hs 26;" f equipType src/Dodge/Data/EquipType.hs 10;" f equipmentDesignation src/Dodge/Inventory/RBList.hs 52;" f equipmentStrValue src/Dodge/Creature/Statistics.hs 56;" f -errorAngleVV src/Geometry.hs 60;" f -errorClosestPointOnLine src/Geometry.hs 72;" f -errorClosestPointOnLineParam src/Geometry.hs 78;" f +errorAngleVV src/Geometry.hs 59;" f +errorClosestPointOnLine src/Geometry.hs 71;" f +errorClosestPointOnLineParam src/Geometry.hs 77;" f errorHead src/ListHelp.hs 76;" f -errorIsLHS src/Geometry.hs 66;" f -errorNormalizeV src/Geometry.hs 55;" f -errorPointInPolygon src/Geometry.hs 47;" f +errorIsLHS src/Geometry.hs 65;" f +errorNormalizeV src/Geometry.hs 54;" f +errorPointInPolygon src/Geometry.hs 46;" f evenOddSplit src/Dodge/Base.hs 160;" f exitTerminalSubInv src/Dodge/WorldEffect.hs 116;" f expandLine src/Dodge/Picture.hs 30;" f @@ -3544,7 +3546,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 185;" f -explodeShell src/Dodge/Projectile/Update.hs 282;" f +explodeShell src/Dodge/Projectile/Update.hs 281;" 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 @@ -3677,8 +3679,8 @@ getCloseObj src/Dodge/Update/Input/InGame.hs 533;" f getCommand src/Dodge/Terminal.hs 52;" f getCommands src/Dodge/Terminal.hs 49;" f getCrMoveSpeed src/Dodge/Creature/Statistics.hs 50;" f -getCrsFromRooms src/Dodge/Room/Tutorial.hs 321;" f -getCrsFromRooms' src/Dodge/Room/Tutorial.hs 308;" 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 1296;" f getInventoryPath src/Dodge/Inventory/Path.hs 9;" f @@ -3693,7 +3695,7 @@ getNodePos src/Dodge/Path.hs 31;" f getPJStabiliser src/Dodge/HeldUse.hs 1283;" f getPretty src/AesonHelp.hs 8;" f getPromptTM src/Dodge/Terminal/Type.hs 3;" f -getRoomsFromInts src/Dodge/Room/Tutorial.hs 304;" f +getRoomsFromInts src/Dodge/Room/Tutorial.hs 306;" f getRootItemBounds src/Dodge/Render/HUD.hs 100;" f getRootItemInvID src/Dodge/Inventory/Location.hs 35;" f getSelectedCloseObj src/Dodge/SelectedClose.hs 14;" f @@ -3764,10 +3766,10 @@ handleResizeEvent src/Dodge/Event.hs 53;" f handleTextInput src/Dodge/Event/Input.hs 19;" f handleWindowMoveEvent src/Dodge/Event.hs 44;" f hardQuit src/Dodge/Concurrent.hs 32;" f -hasButtonLOS src/Dodge/Base/Collide.hs 301;" f +hasButtonLOS src/Dodge/Base/Collide.hs 312;" f hasCaneGunDim src/Dodge/Item/InvSize.hs 48;" f -hasLOS src/Dodge/Base/Collide.hs 294;" f -hasLOSIndirect src/Dodge/Base/Collide.hs 310;" f +hasLOS src/Dodge/Base/Collide.hs 305;" f +hasLOSIndirect src/Dodge/Base/Collide.hs 321;" f hat src/Dodge/Item/Equipment.hs 76;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 79;" f @@ -3797,7 +3799,7 @@ heldTorqueAmount src/Dodge/HeldUse.hs 578;" f heldTriggerType src/Dodge/BaseTriggerType.hs 27;" f helpPara src/Dodge/Terminal.hs 90;" f helpPoly3D src/Polyhedra.hs 125;" f -heron src/Geometry.hs 221;" f +heron src/Geometry.hs 218;" f hiToFloat src/Dodge/Room/Modify/Girder.hs 171;" f highBar src/Dodge/Room/Foreground.hs 89;" f highDiagonalMesh src/Dodge/Room/Foreground.hs 35;" f @@ -3819,7 +3821,7 @@ icosohedronFaces src/Polyhedra/Geodesic.hs 19;" f ildtPropagate src/Dodge/DoubleTree.hs 111;" f impulsiveAIBefore src/Dodge/Creature/Impulse.hs 24;" f inLink src/Dodge/RoomLink.hs 128;" f -inSegArea src/Geometry/Intersect.hs 333;" f +inSegArea src/Geometry/Intersect.hs 346;" f inSimplePoly src/Geometry/Polygon.hs 89;" f inTextInputFocus src/Dodge/InputFocus.hs 8;" f incidenceToFunction src/Dodge/Graph.hs 26;" f @@ -3851,26 +3853,29 @@ insertWithNewKeys src/IntMapHelp.hs 70;" f intAnno src/Dodge/Floor.hs 111;" f interactWithCloseObj src/Dodge/SelectedClose.hs 9;" f interpWith src/Dodge/Creature/Boid.hs 11;" f -intersectCircSeg src/Geometry/Intersect.hs 340;" f -intersectCircSegFirst src/Geometry/Intersect.hs 358;" f -intersectCircSegTest src/Geometry/Intersect.hs 351;" f -intersectLineLine src/Geometry/Intersect.hs 18;" f -intersectLinePlane src/Geometry/Intersect.hs 28;" f +intersectCircLine src/Geometry/Intersect.hs 373;" f +intersectCircLineAlong src/Geometry/Intersect.hs 364;" f +intersectCircSeg src/Geometry/Intersect.hs 353;" f +intersectCircSegFirst src/Geometry/Intersect.hs 415;" f +intersectCircSegTest src/Geometry/Intersect.hs 407;" f +intersectCylSeg src/Geometry/Intersect.hs 382;" f +intersectLineLine src/Geometry/Intersect.hs 19;" f +intersectLinePlaneAlong src/Geometry/Intersect.hs 34;" f intersectLinefromScreen src/Dodge/Debug/Picture.hs 95;" f -intersectSegBezquad src/Geometry/Intersect.hs 271;" f -intersectSegLine src/Geometry/Intersect.hs 122;" f -intersectSegLineext src/Geometry/Intersect.hs 105;" f -intersectSegPlane src/Geometry/Intersect.hs 34;" f -intersectSegPolyFirst src/Geometry/Intersect.hs 278;" f -intersectSegRay src/Geometry/Intersect.hs 90;" f -intersectSegSeg src/Geometry/Intersect.hs 69;" f -intersectSegSegErrorTest src/Geometry/Intersect.hs 54;" f -intersectSegSegFullTest src/Geometry/Intersect.hs 138;" f -intersectSegSegPreTest src/Geometry/Intersect.hs 171;" f -intersectSegSegTest src/Geometry/Intersect.hs 157;" f -intersectSegSurface src/Geometry/Intersect.hs 43;" f -intersectSegsSeg src/Geometry/Intersect.hs 267;" f -intervalList src/Geometry.hs 315;" f +intersectSegBezquad src/Geometry/Intersect.hs 284;" f +intersectSegLine src/Geometry/Intersect.hs 135;" f +intersectSegLineext src/Geometry/Intersect.hs 117;" f +intersectSegPlane src/Geometry/Intersect.hs 41;" f +intersectSegPolyFirst src/Geometry/Intersect.hs 291;" f +intersectSegRay src/Geometry/Intersect.hs 102;" f +intersectSegSeg src/Geometry/Intersect.hs 81;" f +intersectSegSegErrorTest src/Geometry/Intersect.hs 66;" f +intersectSegSegFullTest src/Geometry/Intersect.hs 151;" f +intersectSegSegPreTest src/Geometry/Intersect.hs 184;" f +intersectSegSegTest src/Geometry/Intersect.hs 170;" f +intersectSegSurface src/Geometry/Intersect.hs 50;" f +intersectSegsSeg src/Geometry/Intersect.hs 280;" f +intervalList src/Geometry.hs 312;" f interweave src/Justify.hs 17;" f introScan src/Dodge/Item/Scope.hs 57;" f introScanValue src/Dodge/Inventory/SelectionList.hs 80;" f @@ -3913,12 +3918,12 @@ isGroupSelectableSection src/Dodge/Update/Input/InGame.hs 197;" f isInLnk src/Dodge/PlacementSpot.hs 161;" f isJust' src/MaybeHelp.hs 29;" f isLHS src/Geometry/LHS.hs 11;" f -isLeftOf src/Geometry.hs 202;" f -isLeftOfA src/Geometry.hs 196;" f +isLeftOf src/Geometry.hs 199;" f +isLeftOfA src/Geometry.hs 193;" f isMidEdgeLink src/Dodge/RoomLink.hs 56;" f -isNHS src/Geometry/Intersect.hs 51;" f +isNHS src/Geometry/Intersect.hs 63;" f isNothing' src/MaybeHelp.hs 33;" f -isOnSeg src/Geometry.hs 240;" f +isOnSeg src/Geometry.hs 237;" f isOutLnk src/Dodge/PlacementSpot.hs 166;" f isOverTerminalScreen src/Dodge/Update.hs 383;" f isPulseLaser src/Dodge/IsPulseLaser.hs 10;" f @@ -3929,7 +3934,7 @@ isUnusedLnkType src/Dodge/PlacementSpot.hs 190;" f isUsedLnkUnplaced src/Dodge/PlacementSpot.hs 174;" f isValidCommand src/Dodge/Debug/Terminal.hs 134;" f isVowel src/StringHelp.hs 8;" f -isWalkable src/Dodge/Base/Collide.hs 317;" f +isWalkable src/Dodge/Base/Collide.hs 328;" f isoMatrix src/MatrixHelper.hs 30;" f isotriBWH src/Geometry/Polygon.hs 21;" f itDim src/Dodge/Item/InvSize.hs 21;" f @@ -4054,7 +4059,7 @@ lightSensInsideDoor src/Dodge/Room/LasTurret.hs 39;" f lightSensor src/Dodge/Placement/Instance/Sensor.hs 42;" f lightsToRender src/Dodge/Render/Lights.hs 14;" f lightx4 src/Color.hs 145;" f -linGrad src/Geometry/Intersect.hs 255;" f +linGrad src/Geometry/Intersect.hs 268;" f line src/Picture/Base.hs 226;" f lineCol src/Picture/Base.hs 230;" f lineGeom src/Dodge/Base.hs 32;" f @@ -4132,7 +4137,7 @@ machineUpdateLiveDieEff src/Dodge/Machine.hs 16;" f magAmmoParams src/Dodge/HeldUse.hs 945;" f magAmmoType src/Dodge/Item/MagAmmoType.hs 11;" f magShield src/Dodge/Item/Equipment.hs 27;" f -magV src/Geometry/Vector.hs 171;" f +magV src/Geometry/Vector.hs 172;" f magV3 src/Geometry/Vector3D.hs 78;" f magazineCombinations src/Dodge/Combine/Combinations.hs 43;" f magenta src/Color.hs 19;" f @@ -4259,7 +4264,7 @@ midBounds src/Dodge/Room/Foreground.hs 151;" f midChasm src/Dodge/Room/Tutorial.hs 138;" f midPad src/Padding.hs 27;" f midPadL src/Padding.hs 33;" f -midPoint src/Geometry.hs 84;" f +midPoint src/Geometry.hs 83;" f midWall src/Dodge/Placement/Instance/Wall.hs 27;" f minAndMax src/FoldableHelp.hs 109;" f minCrIXOn src/Dodge/Zoning/Creature.hs 47;" f @@ -4296,10 +4301,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 200;" f -moveProjectile src/Dodge/Projectile/Update.hs 260;" f +moveProjectile src/Dodge/Projectile/Update.hs 259;" f moveRoomBy src/Dodge/Room/Link.hs 53;" f moveShockwave src/Dodge/Shockwave/Update.hs 13;" f -moveStuckGrenade src/Dodge/Projectile/Update.hs 246;" f +moveStuckGrenade src/Dodge/Projectile/Update.hs 245;" 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 @@ -4329,18 +4334,18 @@ mvPointToward src/Dodge/Base.hs 136;" f mvPointTowardAtSpeed src/Dodge/Base.hs 105;" f mvProp src/Dodge/Placement/PlaceSpot.hs 177;" f mvPs src/Dodge/Wall/Move.hs 58;" f -myIntersectLineLine src/Geometry/Intersect.hs 212;" f -myIntersectSegSeg src/Geometry/Intersect.hs 190;" f +myIntersectLineLine src/Geometry/Intersect.hs 225;" f +myIntersectSegSeg src/Geometry/Intersect.hs 203;" f myParams src/Dodge/Combine/Graph.hs 103;" f -nRays src/Geometry.hs 185;" f -nRaysRad src/Geometry.hs 189;" f +nRays src/Geometry.hs 182;" f +nRaysRad src/Geometry.hs 186;" f nearCollinear src/Dodge/LevelGen/StaticWalls/Deprecated.hs 19;" f nearParallel src/Dodge/LevelGen/StaticWalls/Deprecated.hs 14;" f nearPoint src/Dodge/Zoning/Common.hs 8;" f nearRect src/Dodge/Zoning/Common.hs 16;" f nearSeg src/Dodge/Zoning/Common.hs 12;" f -nearZeroAngle src/Geometry/Vector.hs 137;" f -nearestAngleRep src/Geometry.hs 151;" f +nearZeroAngle src/Geometry/Vector.hs 138;" f +nearestAngleRep src/Geometry.hs 148;" f newExtraAwareness src/Dodge/Creature/Perception.hs 138;" f newKey src/IntMapHelp.hs 60;" f newSounds src/Dodge/Creature/Perception.hs 171;" f @@ -4353,10 +4358,10 @@ noShape src/ShapePicture.hs 29;" f noclipCheck src/Dodge/WallCreatureCollisions.hs 22;" f nodeFormatting src/Dodge/Combine/Graph.hs 147;" f normalGait src/Dodge/Creature/State/WalkCycle.hs 29;" f -normalizeAngle src/Geometry/Vector.hs 127;" f +normalizeAngle src/Geometry/Vector.hs 128;" f normalizeAnglePi src/Dodge/Base.hs 154;" f normalizeColor src/Color.hs 76;" f -normalizeV src/Geometry/Vector.hs 43;" f +normalizeV src/Geometry/Vector.hs 44;" f normalizeV3 src/Geometry/Vector3D.hs 84;" f notLink src/Dodge/Data/Room.hs 72;" f nulgate src/Dodge/Item/Scope.hs 95;" f @@ -4395,7 +4400,7 @@ orderPolygonAround src/Geometry/Polygon.hs 107;" f orientAttachment src/Dodge/Item/Orientation.hs 68;" f orientByParentChSF src/Dodge/Item/Orientation.hs 34;" f orientChild src/Dodge/Item/Orientation.hs 18;" f -orthogonalPointOnSeg src/Geometry/Intersect.hs 326;" f +orthogonalPointOnSeg src/Geometry/Intersect.hs 339;" f outLink src/Dodge/RoomLink.hs 120;" f outsideScreenPolygon src/Dodge/Debug/Picture.hs 43;" f outwardIntegers src/Dodge/Base.hs 181;" f @@ -4408,10 +4413,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 221;" f -overlapCircWallsClosest src/Dodge/Base/Collide.hs 267;" f +overlapCircWalls src/Dodge/Base/Collide.hs 232;" f +overlapCircWallsClosest src/Dodge/Base/Collide.hs 278;" f overlapSegCrs src/Dodge/Base/Collide.hs 60;" f -overlapSegWalls src/Dodge/Base/Collide.hs 203;" f +overlapSegWalls src/Dodge/Base/Collide.hs 214;" 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 @@ -4435,7 +4440,7 @@ pauseMenuOptions src/Dodge/Menu.hs 66;" f pauseSound src/Dodge/SoundLogic.hs 42;" f pauseTime src/Dodge/Update.hs 180;" f pbFlicker src/Dodge/Update.hs 453;" f -pbsHit src/Dodge/WorldEvent/ThingsHit.hs 71;" f +pbsHit src/Dodge/WorldEvent/ThingsHit.hs 88;" f peZoneSize src/Dodge/Zoning/Pathing.hs 46;" f pedestalRoom src/Dodge/Room/Containing.hs 50;" f penThing src/Dodge/Bullet.hs 208;" f @@ -4464,7 +4469,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 225;" f +pjRemoteSetDirection src/Dodge/Projectile/Update.hs 224;" 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 @@ -4507,10 +4512,10 @@ pnsNearPoint src/Dodge/Zoning/Pathing.hs 12;" f pnsNearRect src/Dodge/Zoning/Pathing.hs 18;" f pnsNearSeg src/Dodge/Zoning/Pathing.hs 15;" f pointIfNotClose src/Dodge/LevelGen/StaticWalls/Deprecated.hs 68;" f -pointInCircle src/Geometry.hs 212;" f +pointInCircle src/Geometry.hs 209;" f pointInOrOnPolygon src/Geometry/Polygon.hs 77;" f pointInPoly src/Geometry/Polygon.hs 85;" f -pointIsInCone src/Geometry.hs 378;" f +pointIsInCone src/Geometry.hs 375;" f pointIsOnScreen src/Dodge/Base/Window.hs 59;" f pointTowardsImpulse src/Dodge/Path.hs 63;" f pointerToItem src/Dodge/Item/Location.hs 39;" f @@ -4569,7 +4574,7 @@ polyToEdges src/Polyhedra.hs 133;" f polyToGeoRender src/Polyhedra.hs 142;" f polyToPics src/Polyhedra.hs 122;" f polyToTris src/Geometry/Triangulate.hs 7;" f -polyToTris' src/Geometry.hs 175;" f +polyToTris' src/Geometry.hs 172;" f polyToTris'' src/Geometry/Triangulate.hs 15;" f polygon src/Picture/Base.hs 72;" f polygonCol src/Picture/Base.hs 78;" f @@ -4596,7 +4601,7 @@ preCritStart src/Dodge/Room/Start.hs 83;" f prePos src/Quaternion.hs 68;" f preloadRender src/Preload/Render.hs 30;" f premapMaybe src/FoldlHelp.hs 26;" f -prependTwo src/Geometry.hs 180;" f +prependTwo src/Geometry.hs 177;" f prettyDT src/Dodge/DoubleTree.hs 258;" f prettyLDT src/Dodge/DoubleTree.hs 263;" f prettyShort src/AesonHelp.hs 11;" f @@ -4610,7 +4615,7 @@ printPoint src/Dodge/Debug/Picture.hs 34;" f printRotPoint src/Dodge/Debug/Picture.hs 37;" f prismBox src/Shape.hs 73;" f prismPoly src/Shape.hs 59;" f -projV src/Geometry/Vector.hs 182;" f +projV src/Geometry/Vector.hs 183;" f projV3 src/Geometry/Vector3D.hs 127;" f propDrawToggle src/Dodge/Prop/Draw.hs 50;" f propLSThen src/Dodge/Placement/Instance/LightSource.hs 29;" f @@ -4677,7 +4682,7 @@ rLauncher src/Dodge/Item/Held/Launcher.hs 14;" f rLauncherX src/Dodge/Item/Held/Launcher.hs 30;" f rToOnward src/Dodge/Cleat.hs 21;" f radBounds src/Dodge/Room/Foreground.hs 154;" f -radToDeg src/Geometry/Vector.hs 122;" f +radToDeg src/Geometry/Vector.hs 123;" f randBlockBreakWeapon src/Dodge/Item/Random.hs 7;" f randC1 src/Dodge/Placement/Instance/Creature.hs 8;" f randDirPS src/Dodge/PlacementSpot.hs 56;" f @@ -4714,7 +4719,7 @@ randomTank src/Dodge/Room/Tanks.hs 19;" f randomTreeStructure src/Dodge/Layout/Generate.hs 18;" f randsOnCirc src/RandomHelp.hs 127;" f randsSpread src/RandomHelp.hs 120;" f -ratIntersectLineLine src/Geometry/Intersect.hs 230;" f +ratIntersectLineLine src/Geometry/Intersect.hs 243;" f readSaveSlot src/Dodge/Save.hs 45;" f recoilAmount src/Dodge/HeldUse.hs 459;" f rectNSWE src/Geometry/Polygon.hs 14;" f @@ -4729,10 +4734,10 @@ reduceLocLDT src/Dodge/DoubleTree.hs 393;" f reflDirWall src/Dodge/Base/Wall.hs 16;" f reflVelWall src/Dodge/Base/Wall.hs 24;" f reflVelWallDamp src/Dodge/Base/Wall.hs 20;" f -reflectAngle src/Geometry.hs 145;" f -reflectIn src/Geometry.hs 137;" f -reflectInNormal src/Geometry.hs 140;" f -reflectInParam src/Geometry.hs 233;" f +reflectAngle src/Geometry.hs 142;" f +reflectIn src/Geometry.hs 136;" f +reflectInNormal src/Geometry/Vector.hs 223;" f +reflectInParam src/Geometry.hs 230;" f reflectLaserAlong src/Dodge/Item/Weapon/LaserPath.hs 16;" f reflectPulseLaserAlong src/Dodge/Item/Weapon/LaserPath.hs 69;" f refract src/Dodge/Item/Weapon/LaserPath.hs 43;" f @@ -4749,7 +4754,7 @@ removeAimPosture src/Dodge/Creature/YourControl.hs 158;" f removeAmmoFromMag src/Dodge/HeldUse.hs 920;" f removeDot src/ShortShow.hs 40;" f removeInverseWalls src/Dodge/LevelGen/StaticWalls.hs 25;" f -removeLights src/Dodge/Room/Tutorial.hs 222;" f +removeLights src/Dodge/Room/Tutorial.hs 224;" f removeShieldWall src/Dodge/Item/BackgroundEffect.hs 57;" f removeWallsInPolygon src/Dodge/LevelGen/StaticWalls.hs 182;" f renderDataResizeUpdate src/Preload/Update.hs 26;" f @@ -4774,7 +4779,7 @@ restrictInLinks src/Dodge/RoomLink.hs 44;" f restrictLinkType src/Dodge/RoomLink.hs 34;" f restrictOutLinks src/Dodge/RoomLink.hs 47;" f restrictRMInLinksPD src/Dodge/Room/Link.hs 25;" f -restrictSeg src/Dodge/Base/Collide.hs 162;" f +restrictSeg src/Dodge/Base/Collide.hs 173;" f resumeSound src/Dodge/SoundLogic.hs 48;" f retreatActionsPistol src/Dodge/Humanoid.hs 249;" f retreatFireLauncher src/Dodge/Humanoid.hs 270;" f @@ -4845,10 +4850,10 @@ rotateSP src/ShapePicture.hs 57;" f rotateTo src/Polyhedra/Geodesic.hs 64;" f rotateToOverlappingWall src/Dodge/Update/Camera.hs 209;" f rotateToZ src/Quaternion.hs 39;" f -rotateV src/Geometry/Vector.hs 105;" f -rotateVAround src/Geometry/Vector.hs 112;" f +rotateV src/Geometry/Vector.hs 106;" f +rotateVAround src/Geometry/Vector.hs 113;" f rotateXY src/Polyhedra.hs 31;" f -roundPoint2 src/Geometry/Intersect.hs 251;" f +roundPoint2 src/Geometry/Intersect.hs 264;" f roundTank src/Dodge/Placement/Instance/Tank.hs 25;" f roundTankCross src/Dodge/Placement/Instance/Tank.hs 31;" f rpIsOffGrid src/Dodge/PlacementSpot.hs 81;" f @@ -4861,15 +4866,15 @@ rsObjectColor src/Dodge/RadarSweep/Draw.hs 34;" f runPastStart src/Dodge/Room/Start.hs 72;" f runStateWorld src/Dodge/Randify.hs 17;" f sPS src/Dodge/LevelGen/PlacementHelper.hs 27;" f -safeAngleVV src/Geometry/Vector.hs 68;" f -safeArgV src/Geometry/Vector.hs 87;" f +safeAngleVV src/Geometry/Vector.hs 69;" f +safeArgV src/Geometry/Vector.hs 88;" f safeHead src/ListHelp.hs 68;" f safeMinMaybeL src/FoldableHelp.hs 48;" f safeMinimumOn src/FoldableHelp.hs 26;" f safeMinimumOnMaybe src/FoldableHelp.hs 67;" f safeMinimumOnMaybeF src/FoldableHelp.hs 39;" f safeMinimumOnMaybeL src/FoldableHelp.hs 57;" f -safeNormalizeV src/Geometry/Vector.hs 164;" f +safeNormalizeV src/Geometry/Vector.hs 165;" f safeSwapKeys src/IntMapHelp.hs 77;" f safeUncons src/ListHelp.hs 72;" f safeUpdateSingleNode src/TreeHelp.hs 116;" f @@ -4916,7 +4921,7 @@ sectionsDesiredLines src/Dodge/DisplayInventory.hs 198;" f sectionsSizes src/Dodge/DisplayInventory.hs 201;" f seedStartMenu src/Dodge/Menu.hs 87;" f seedStartOptions src/Dodge/Menu.hs 90;" f -segOnCirc src/Geometry.hs 114;" f +segOnCirc src/Geometry.hs 113;" f selNumPos src/Dodge/Render/HUD.hs 447;" f selNumPosCardinal src/Dodge/Render/HUD.hs 470;" f selSecDrawCursor src/Dodge/Render/List.hs 125;" f @@ -4933,7 +4938,7 @@ sensorReqToString src/Dodge/Machine/Update.hs 196;" f sensorRoom src/Dodge/Room/SensorDoor.hs 26;" f sensorRoomRunPast src/Dodge/Room/SensorDoor.hs 46;" f sensorSPic src/Dodge/Machine/Draw.hs 81;" f -sensorTut src/Dodge/Room/Tutorial.hs 330;" f +sensorTut src/Dodge/Room/Tutorial.hs 332;" f sensorTypeDamages src/Dodge/Machine/Update.hs 233;" f sentinelAI src/Dodge/Creature/SentinelAI.hs 20;" f sentinelExtraWatchUpdate src/Dodge/Creature/SentinelAI.hs 83;" f @@ -5002,10 +5007,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 26;" 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 +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 shellMag src/Dodge/Item/Ammo.hs 49;" f shellModule src/Dodge/Item/Scope.hs 123;" f shellShape src/Dodge/Projectile/Draw.hs 35;" f @@ -5149,7 +5154,7 @@ sps0 src/Dodge/LevelGen/PlacementHelper.hs 42;" f square src/Geometry/Polygon.hs 47;" f squareDecoration src/Dodge/Placement/TopDecoration.hs 41;" f squashIntersectCirclePoint src/Dodge/WallCreatureCollisions.hs 112;" f -squashNormalizeV src/Geometry/Vector.hs 157;" f +squashNormalizeV src/Geometry/Vector.hs 158;" f ssLookupDown src/Dodge/SelectionSections.hs 82;" f ssLookupGE' src/Dodge/SelectionSections.hs 136;" f ssLookupGT src/Dodge/SelectionSections.hs 123;" f @@ -5279,10 +5284,10 @@ thickCircle src/Picture/Base.hs 272;" f thickLine src/Picture/Base.hs 244;" f thickLineCol src/Picture/Base.hs 255;" f thinHighBar src/Dodge/Room/Foreground.hs 77;" f -thingHit src/Dodge/WorldEvent/ThingsHit.hs 92;" f -thingHitFilt src/Dodge/WorldEvent/ThingsHit.hs 80;" f +thingHit src/Dodge/WorldEvent/ThingsHit.hs 109;" f +thingHitFilt src/Dodge/WorldEvent/ThingsHit.hs 97;" f thingsHit src/Dodge/WorldEvent/ThingsHit.hs 35;" f -thingsHitExceptCr src/Dodge/WorldEvent/ThingsHit.hs 101;" f +thingsHitExceptCr src/Dodge/WorldEvent/ThingsHit.hs 118;" f thingsHitZ src/Dodge/WorldEvent/ThingsHit.hs 43;" f threeLineDecoration src/Dodge/Placement/TopDecoration.hs 61;" f throwItem src/Dodge/Creature/Action.hs 211;" f @@ -5397,21 +5402,21 @@ tryPlay src/Sound.hs 84;" f tryPutItemInInv src/Dodge/Inventory/Add.hs 23;" f tryPutItemInInvAt src/Dodge/Inventory/Add.hs 52;" f trySeedFromClipboard src/Dodge/Menu.hs 96;" f -trySpin src/Dodge/Projectile/Update.hs 170;" f +trySpin src/Dodge/Projectile/Update.hs 169;" f trySynthBullet src/Dodge/Creature/State.hs 166;" f -tryThrust src/Dodge/Projectile/Update.hs 176;" f +tryThrust src/Dodge/Projectile/Update.hs 175;" f tryUseParent src/Dodge/Creature/State.hs 144;" f turnTo src/Dodge/Movement/Turn.hs 8;" f turret src/Dodge/Placement/Instance/Turret.hs 37;" f turretItemOffset src/Dodge/Item/HeldOffset.hs 21;" f tutAnoTree src/Dodge/Room/Tutorial.hs 40;" f tutDrop src/Dodge/Room/Tutorial.hs 72;" f -tutHub src/Dodge/Room/Tutorial.hs 229;" f +tutHub src/Dodge/Room/Tutorial.hs 231;" f tutLight src/Dodge/Room/Tutorial.hs 196;" f -tutRezBox src/Dodge/Room/Tutorial.hs 341;" f +tutRezBox src/Dodge/Room/Tutorial.hs 343;" f tutRoomTree src/Dodge/Floor.hs 21;" f -tutorialMessage1 src/Dodge/Room/Tutorial.hs 365;" f -tweenAngles src/Geometry/Vector.hs 195;" f +tutorialMessage1 src/Dodge/Room/Tutorial.hs 367;" f +tweenAngles src/Geometry/Vector.hs 196;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 81;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 29;" f twists src/Dodge/Creature/Test.hs 99;" f @@ -5428,7 +5433,7 @@ uncurryV src/Geometry/Data.hs 66;" f underBarrelSlot src/Dodge/Item/Scope.hs 159;" f unfoldrMID src/MonadHelp.hs 33;" f unigate src/Dodge/Item/Scope.hs 102;" f -unitVectorAtAngle src/Geometry/Vector.hs 100;" f +unitVectorAtAngle src/Geometry/Vector.hs 101;" f unlockInv src/Dodge/Inventory/Lock.hs 12;" f unpause src/Dodge/Menu.hs 213;" f unsafeBlinkAction src/Dodge/Creature/Action/Blink.hs 56;" f @@ -5515,7 +5520,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 27;" f +updateProjectile src/Dodge/Projectile/Update.hs 26;" f updateProp src/Dodge/Prop/Update.hs 11;" f updatePulse src/Dodge/Creature/Update.hs 145;" f updatePulseBall src/Dodge/Update.hs 433;" f @@ -5597,8 +5602,8 @@ usedRoomInLinkPoss src/Dodge/PlacementSpot.hs 202;" f usedRoomLinkPoss src/Dodge/PlacementSpot.hs 209;" f v2z src/Geometry/Vector3D.hs 93;" f vCen3 src/Geometry/Vector3D.hs 115;" f -vInverse src/Geometry/Vector.hs 153;" f -vNormal src/Geometry/Vector.hs 148;" f +vInverse src/Geometry/Vector.hs 154;" f +vNormal src/Geometry/Vector.hs 149;" f vNormaly src/Geometry/Vector3D.hs 72;" f vShape src/Dodge/Placement/Instance/LightSource.hs 127;" f vToL src/MatrixHelper.hs 46;" f @@ -5620,7 +5625,7 @@ viewClipBounds src/Dodge/Debug/Picture.hs 329;" f viewDistanceFromItems src/Dodge/Update/Camera.hs 194;" f viewTarget src/Dodge/Creature/ReaderUpdate.hs 146;" f violet src/Color.hs 21;" f -visibleWalls src/Dodge/Base/Collide.hs 207;" f +visibleWalls src/Dodge/Base/Collide.hs 218;" 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 @@ -5631,7 +5636,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 172;" f +wallToSurface src/Dodge/Base/Collide.hs 183;" f wallsFromRooms src/Dodge/Layout.hs 132;" f wallsToDraw src/Dodge/Render/Walls.hs 17;" f warmupSound src/Dodge/HeldUse.hs 1421;" f @@ -5686,8 +5691,8 @@ wlOpaqueDraw src/Dodge/Render/Walls.hs 45;" f wlSeeThroughDraw src/Dodge/Render/Walls.hs 48;" f wlZoneSize src/Dodge/Zoning/Wall.hs 52;" f wlsFromIXs src/Dodge/Zoning/Wall.hs 35;" f -wlsHit src/Dodge/WorldEvent/ThingsHit.hs 115;" f -wlsHitRadial src/Dodge/WorldEvent/ThingsHit.hs 123;" f +wlsHit src/Dodge/WorldEvent/ThingsHit.hs 132;" f +wlsHitRadial src/Dodge/WorldEvent/ThingsHit.hs 140;" f wlsNearCirc src/Dodge/Zoning/Wall.hs 49;" f wlsNearPoint src/Dodge/Zoning/Wall.hs 39;" f wlsNearRect src/Dodge/Zoning/Wall.hs 46;" f @@ -5705,11 +5710,11 @@ writeSaveSlot src/Dodge/Save.hs 34;" f xCylinder src/Shape.hs 137;" f xCylinderST src/Shape.hs 134;" f xIntercepts src/Dodge/Zoning/Base.hs 60;" f -xV2 src/Geometry/Vector.hs 206;" f -xyV3 src/Geometry/Vector.hs 218;" f -xyzV4 src/Geometry/Vector.hs 214;" f +xV2 src/Geometry/Vector.hs 207;" f +xyV3 src/Geometry/Vector.hs 219;" f +xyzV4 src/Geometry/Vector.hs 215;" f yIntercepts' src/Dodge/Zoning/Base.hs 76;" f -yV2 src/Geometry/Vector.hs 210;" f +yV2 src/Geometry/Vector.hs 211;" f yellow src/Color.hs 17;" f you src/Dodge/Base/You.hs 13;" f youDropItem src/Dodge/Creature/Action.hs 196;" f @@ -5725,7 +5730,7 @@ zChasm src/Dodge/Room/Tutorial.hs 126;" f zConnect src/Dodge/Render/Connectors.hs 17;" f zConnectCol src/Dodge/Render/Connectors.hs 28;" f zConnectColMidX src/Dodge/Render/Connectors.hs 31;" f -zeroZ src/Geometry/Vector.hs 8;" f +zeroZ src/Geometry/Vector.hs 9;" f zipArcs src/Dodge/Tesla.hs 52;" f zipCount src/Dodge/Tree/Shift.hs 136;" f zipCountDown src/Dodge/Room/Procedural.hs 121;" f