From 01b765300ebf56a3ef7854795790f3950725cae0 Mon Sep 17 00:00:00 2001 From: justin Date: Thu, 26 Mar 2026 19:21:10 +0000 Subject: [PATCH] Improve door crushing --- src/Dodge/Base/Collide.hs | 8 +- src/Dodge/Creature/Action/Blink.hs | 3 +- src/Dodge/Debug/Picture.hs | 2 +- src/Dodge/TestString.hs | 3 +- src/Dodge/Update.hs | 2 +- src/Dodge/Update/Camera.hs | 5 +- src/Dodge/WallCreatureCollisions.hs | 22 ++++- src/Dodge/WorldEvent/ThingsHit.hs | 4 +- src/Dodge/Zoning/Wall.hs | 13 ++- tags | 132 ++++++++++++++-------------- 10 files changed, 107 insertions(+), 87 deletions(-) diff --git a/src/Dodge/Base/Collide.hs b/src/Dodge/Base/Collide.hs index 581baec4c..b45720a7f 100644 --- a/src/Dodge/Base/Collide.hs +++ b/src/Dodge/Base/Collide.hs @@ -34,6 +34,7 @@ module Dodge.Base.Collide ( collide3, ) where +import qualified Data.IntMap.Strict as IM import Control.Lens import Control.Monad import qualified Data.IntSet as IS @@ -48,7 +49,7 @@ import FoldableHelp import Geometry import Linear -collidePoint :: Point2 -> Point2 -> [Wall] -> (Point2, Maybe Wall) +collidePoint :: Foldable t => Point2 -> Point2 -> t Wall -> (Point2, Maybe Wall) {-# INLINE collidePoint #-} collidePoint sp ep = foldl' f (ep, Nothing) where @@ -201,7 +202,7 @@ collidePointTestFilter t sp ep = collidePointWallsFilter :: (Wall -> Bool) -> Point2 -> Point2 -> World -> (Point2, Maybe Wall) {-# INLINE collidePointWallsFilter #-} -collidePointWallsFilter t sp ep = collidePoint sp ep . filter t . wlsNearSeg sp ep +collidePointWallsFilter t sp ep = collidePoint sp ep . IM.filter t . wlsNearSeg sp ep -- overlapSegWalls :: Point2 -> Point2 -> StreamOf Wall -- -> StreamOf (Point2,Wall) @@ -219,6 +220,7 @@ visibleWalls sp ep = takeUntil (wlIsOpaque . snd) . sortOn (dist sp . fst) . overlapSegWalls sp ep + . IM.elems . wlsNearSeg sp ep allVisibleWalls :: World -> [(Point2, Wall)] @@ -296,6 +298,7 @@ hasLOS :: Point2 -> Point2 -> World -> Bool hasLOS p1 p2 = not . collidePointTestFilter (const True) p1 p2 + . IM.elems . wlsNearSeg p1 p2 hasButtonLOS :: Point2 -> Point2 -> World -> Bool @@ -312,6 +315,7 @@ hasLOSIndirect :: Point2 -> Point2 -> World -> Bool hasLOSIndirect p1 p2 = not . collidePointTestFilter wlIsOpaque p1 p2 + . IM.elems . wlsNearSeg p1 p2 canSee :: Int -> Int -> World -> Bool diff --git a/src/Dodge/Creature/Action/Blink.hs b/src/Dodge/Creature/Action/Blink.hs index a080be667..ea98f6902 100644 --- a/src/Dodge/Creature/Action/Blink.hs +++ b/src/Dodge/Creature/Action/Blink.hs @@ -5,6 +5,7 @@ module Dodge.Creature.Action.Blink ( unsafeBlinkAction, ) where +import qualified Data.IntMap.Strict as IM import Linear import Dodge.Creature.Radius import Dodge.Zoning.Wall @@ -34,7 +35,7 @@ blinkActionMousePos cr w = p1 = w ^. cWorld . lWorld . lAimPos cpos = cr ^. crPos . _xy --p2 = bouncePoint (const True) 1 cpos p1 w - p2 = pushIntoMaybe $ collideCircWalls cpos p1 r (wlsNearSeg cpos p1 w) + p2 = pushIntoMaybe $ collideCircWalls cpos p1 r (IM.elems $ wlsNearSeg cpos p1 w) r = crRad $ cr ^. crType p3 = maybe p1 ((+.+ squashNormalizeV (cpos -.- p1)) . fst) p2 --p3 = maybe p1 (const 0) p2 diff --git a/src/Dodge/Debug/Picture.hs b/src/Dodge/Debug/Picture.hs index c3096c7a3..5fb297197 100644 --- a/src/Dodge/Debug/Picture.hs +++ b/src/Dodge/Debug/Picture.hs @@ -276,7 +276,7 @@ drawFarWallDetect w = ( \q -> line [ p - , fst $ collidePoint p q $ filter wlIsOpaque $ wlsNearSeg p q w + , fst $ collidePoint p q $ filter wlIsOpaque $ IM.elems $ wlsNearSeg p q w ] ) $ getViewpoints p (_cWorld w) diff --git a/src/Dodge/TestString.hs b/src/Dodge/TestString.hs index b512a37f8..3bd9f7a8e 100644 --- a/src/Dodge/TestString.hs +++ b/src/Dodge/TestString.hs @@ -33,8 +33,7 @@ import Data.Monoid import RandomHelp testStringInit :: Universe -> [String] -testStringInit _ = [] - --(fmap show $ u ^.. uvWorld . cWorld . lWorld . creatures . each . crHP . _HP) +testStringInit u = (fmap show $ u ^.. uvWorld . cWorld . lWorld . creatures . each . crWallTouch) -- <> (fmap show $ u ^.. uvWorld . cWorld . lWorld . machines . each . mcMaterial) --testStringInit u = map show (u ^.. uvWorld . cWorld . lWorld . machines . traverse . mcDir) --testStringInit u = map show diff --git a/src/Dodge/Update.hs b/src/Dodge/Update.hs index fbd4d4dd0..3e6e3f1f8 100644 --- a/src/Dodge/Update.hs +++ b/src/Dodge/Update.hs @@ -352,7 +352,7 @@ muzzleWallCheck w cr = fromMaybe cr $ do cp = cr ^. crPos . _xy -- cop = cr ^. crOldPos . _xy r <- boundPointsRect (cp : ps) - let wls = uncurry wlsNearRect r w & filter (not . _wlTouchThrough) + let wls = uncurry wlsNearRect r w & IM.elems & filter (not . _wlTouchThrough) vs = mapMaybe (g cp wls) ps return $ if null vs then cr diff --git a/src/Dodge/Update/Camera.hs b/src/Dodge/Update/Camera.hs index c571c153b..c00bb5173 100644 --- a/src/Dodge/Update/Camera.hs +++ b/src/Dodge/Update/Camera.hs @@ -26,6 +26,7 @@ import Geometry import LensHelp import SDL (MouseButton (..)) import qualified SDL +import qualified Data.IntMap.Strict as IM {- Update the screen camera rotation and position, including any in rold scope/remote camera modifiers; update where your avatar's view is from. -} @@ -220,7 +221,7 @@ rotateToOverlappingWall w = maybe id (doWallRotate . snd) - (overlapCircWallsClosest p r (filter _wlRotateTo $ wlsNearCirc p r w)) + (overlapCircWallsClosest p r (filter _wlRotateTo . IM.elems $ wlsNearCirc p r w)) w where r = crRad (cr ^. crType) + 10 @@ -245,7 +246,7 @@ farWallDistDirection :: Point2 -> World -> Maybe (Float, Float, Float, Float) farWallDistDirection p w = boundPoints $ map f $ getViewpoints p (_cWorld w) where f q = (rotateV (negate (w ^. wCam . camRot)) . (-.- p)) (foldl' findPoint q (wls q)) - wls q = filter wlIsOpaque $ wlsNearSeg p q w + wls q = filter wlIsOpaque . IM.elems $ wlsNearSeg p q w findPoint q = fromMaybe q . uncurry (intersectSegSeg p q) . _wlLine findBoundDists :: Config -> World -> (Float, Float, Float, Float) diff --git a/src/Dodge/WallCreatureCollisions.hs b/src/Dodge/WallCreatureCollisions.hs index 96f26d8e8..0bdc33c3c 100644 --- a/src/Dodge/WallCreatureCollisions.hs +++ b/src/Dodge/WallCreatureCollisions.hs @@ -1,6 +1,7 @@ -- | Deals with moving creature wall collisions. module Dodge.WallCreatureCollisions (colCrsWalls) where +import qualified Data.IntMap.Strict as IM import Control.Lens import Data.Foldable import qualified Data.IntSet as IS @@ -28,19 +29,23 @@ colCrWall w c = cornpush . wallpush $ pushthrough c r = crRad (c ^. crType) + wallBuffer p1 = c ^. crOldPos . _xy p2 = c ^. crPos . _xy - ls = _wlLine <$> wls + ls = _wlLine <$> IM.elems wls ls' = filter (uncurry $ isLHS p1) ls - wls = filter notff $ wlsNearCirc p2 r w + wls = IM.filter notff $ wlsNearCirc p2 (2*r) w notff x = x ^. wlMaterial /= ForceField -pushCr :: [Wall] -> Creature -> Creature +-- might want to check angled crushing +pushCr :: IM.IntMap Wall -> Creature -> Creature pushCr wls cr - | dist ep sp > r && dist ep ap > r = + | (dist ep sp > r && dist ep ap > r) + || wlsCrush twls + = ecr & crDamage <>~ [Crushing 1000 0] & crPos . _xy .~ ap | otherwise = ecr where + twls = IM.elems $ IM.restrictKeys wls (ecr ^. crWallTouch) ep = ecr ^. crPos . _xy ap = cr ^. crOldPos . _xy sp = cr ^. crPos . _xy @@ -50,6 +55,15 @@ pushCr wls cr Just p -> acr & crPos . _xy .~ p & crWallTouch %~ IS.insert (wl ^. wlID) Nothing -> acr +wlsCrush :: [Wall] -> Bool +wlsCrush [] = False +wlsCrush (x:xs) = any (wlWlCrush x) xs || wlsCrush xs + +wlWlCrush :: Wall -> Wall -> Bool +wlWlCrush w1 w2 = angleVV (f w1) (f w2) > 0.75 * pi + where + f = uncurry (-) . (^. wlLine) + -- the amount to push creatures out from walls, extra to their radius wallBuffer :: Float wallBuffer = 0 diff --git a/src/Dodge/WorldEvent/ThingsHit.hs b/src/Dodge/WorldEvent/ThingsHit.hs index 653cf708a..3c9acb24d 100644 --- a/src/Dodge/WorldEvent/ThingsHit.hs +++ b/src/Dodge/WorldEvent/ThingsHit.hs @@ -163,10 +163,10 @@ wlHitPos sp ep = maybe ep ((+ normalize (ep - sp)) . fst) . safeHead . wlsHit sp wlsHitUnsorted :: Point2 -> Point2 -> World -> [(Point2, Wall)] wlsHitUnsorted sp ep | sp == ep = const mempty - | otherwise = overlapSegWalls sp ep . wlsNearSeg sp ep + | otherwise = overlapSegWalls sp ep . IM.elems . wlsNearSeg sp ep wlsHitRadial :: Point2 -> Float -> World -> [(Point2, Wall)] -wlsHitRadial p r = mapMaybe f . wlsNearCirc p r +wlsHitRadial p r = mapMaybe f . IM.elems . wlsNearCirc p r where --f wl = uncurry (intersectSegSeg p (p - r *.* v)) (_wlLine wl) <&> (,wl) f wl = mhp <&> (,wl) diff --git a/src/Dodge/Zoning/Wall.hs b/src/Dodge/Zoning/Wall.hs index 6ab0281db..543d91d86 100644 --- a/src/Dodge/Zoning/Wall.hs +++ b/src/Dodge/Zoning/Wall.hs @@ -11,7 +11,6 @@ module Dodge.Zoning.Wall import Control.Lens import qualified Data.IntSet as IS -import Data.Maybe import Dodge.Data.World import Dodge.Zoning.Base import FoldableHelp @@ -32,21 +31,21 @@ wlIXsNearRect = nearRect wlZoneSize _wlZoning wlIXsNearCirc :: Point2 -> Float -> World -> IS.IntSet wlIXsNearCirc p r = wlIXsNearRect (p +.+ V2 r r) (p -.- V2 r r) -wlsFromIXs :: World -> IS.IntSet -> [Wall] +wlsFromIXs :: World -> IS.IntSet -> IM.IntMap Wall {-# INLINE wlsFromIXs #-} -wlsFromIXs w = mapMaybe (\wlid -> w ^? cWorld . lWorld . walls . ix wlid) . IS.toList +wlsFromIXs w = IM.restrictKeys (w ^. cWorld . lWorld . walls) -wlsNearPoint :: Point2 -> World -> [Wall] +wlsNearPoint :: Point2 -> World -> IM.IntMap Wall wlsNearPoint p w = wlsFromIXs w $ wlIXsNearPoint p w -wlsNearSeg :: Point2 -> Point2 -> World -> [Wall] +wlsNearSeg :: Point2 -> Point2 -> World -> IM.IntMap Wall {-# INLINE wlsNearSeg #-} wlsNearSeg sp ep w = wlsFromIXs w $ wlIXsNearSeg sp ep w -wlsNearRect :: Point2 -> Point2 -> World -> [Wall] +wlsNearRect :: Point2 -> Point2 -> World -> IM.IntMap Wall wlsNearRect sp ep w = wlsFromIXs w $ wlIXsNearRect sp ep w -wlsNearCirc :: Point2 -> Float -> World -> [Wall] +wlsNearCirc :: Point2 -> Float -> World -> IM.IntMap Wall wlsNearCirc p r w = wlsFromIXs w $ wlIXsNearCirc p r w wlZoneSize :: Float diff --git a/tags b/tags index a9dfa5b00..ce9819c9f 100644 --- a/tags +++ b/tags @@ -160,8 +160,8 @@ BulletPayload src/Dodge/Data/Bullet.hs 32;" t BulletTrajectory src/Dodge/Data/Bullet.hs 40;" t BulletTrajectoryType src/Dodge/Data/Bullet.hs 47;" t BurstTrigger src/Dodge/Data/TriggerType.hs 12;" C -Button src/Dodge/Data/Button.hs 33;" t -ButtonAccessTerminal src/Dodge/Data/Button.hs 31;" C +Button src/Dodge/Data/Button.hs 29;" t +ButtonAccessTerminal src/Dodge/Data/Button.hs 27;" C ButtonDumbSwitch src/Dodge/Data/Button.hs 26;" C ButtonEvent src/Dodge/Data/Button.hs 13;" t ButtonPress src/Dodge/Data/Button.hs 14;" C @@ -699,7 +699,7 @@ MODBlockedString src/Dodge/Data/Universe.hs 106;" C MODString src/Dodge/Data/Universe.hs 105;" C MODStringOption src/Dodge/Data/Universe.hs 107;" C MOTOR src/Dodge/Data/Item/Combine.hs 63;" C -MPO src/Dodge/Base/Collide.hs 95;" t +MPO src/Dodge/Base/Collide.hs 96;" t MTRS src/Dodge/Data/MTRS.hs 6;" t MTree src/Dodge/Data/MetaTree.hs 12;" C Machine src/Dodge/Data/Machine.hs 30;" t @@ -1561,9 +1561,7 @@ _bdMaxX src/Dodge/Data/Bounds.hs 12;" f _bdMaxY src/Dodge/Data/Bounds.hs 14;" f _bdMinX src/Dodge/Data/Bounds.hs 11;" f _bdMinY src/Dodge/Data/Bounds.hs 13;" f -_bdsColor1 src/Dodge/Data/Button.hs 28;" f -_bdsColor2 src/Dodge/Data/Button.hs 29;" f -_bdsTrigger src/Dodge/Data/Button.hs 27;" f +_bdsTrigger src/Dodge/Data/Button.hs 26;" f _beamCombine src/Dodge/Data/Beam.hs 46;" f _blDir src/Dodge/Data/Block.hs 27;" f _blDraw src/Dodge/Data/Block.hs 29;" f @@ -1596,13 +1594,13 @@ _bpColor src/Dodge/Data/Button.hs 17;" f _bpEff src/Dodge/Data/Button.hs 16;" f _bsColor1 src/Dodge/Data/Button.hs 22;" f _bsColor2 src/Dodge/Data/Button.hs 23;" f -_btEvent src/Dodge/Data/Button.hs 36;" f -_btID src/Dodge/Data/Button.hs 37;" f +_btEvent src/Dodge/Data/Button.hs 32;" f +_btID src/Dodge/Data/Button.hs 33;" f _btOn src/Dodge/Data/Button.hs 15;" f _btOn src/Dodge/Data/Button.hs 24;" f -_btPos src/Dodge/Data/Button.hs 34;" f -_btRot src/Dodge/Data/Button.hs 35;" f -_btTermID src/Dodge/Data/Button.hs 31;" f +_btPos src/Dodge/Data/Button.hs 30;" f +_btRot src/Dodge/Data/Button.hs 31;" f +_btTermID src/Dodge/Data/Button.hs 27;" f _buDam src/Dodge/Data/Bullet.hs 34;" f _buDrag src/Dodge/Data/Bullet.hs 20;" f _buEffect src/Dodge/Data/Bullet.hs 17;" f @@ -2532,7 +2530,7 @@ activateDetonator src/Dodge/Creature/Impulse/UseItem.hs 63;" f activeTargetCursorPic src/Dodge/Targeting/Draw.hs 31;" f addArmour src/Dodge/Creature.hs 82;" f addBranchAt src/Dodge/Tree/GenerateStructure.hs 18;" f -addButtonSlowDoor src/Dodge/Room/LongDoor.hs 96;" f +addButtonSlowDoor src/Dodge/Room/LongDoor.hs 97;" f addCrGibs src/Dodge/Prop/Gib.hs 17;" f addDepth src/Picture/Base.hs 125;" f addDoorAtNthLinkToggleInterrupt src/Dodge/Room/Warning.hs 43;" f @@ -2563,7 +2561,7 @@ addPolyWalls src/Dodge/LevelGen/StaticWalls.hs 129;" f addRandomGirderEW src/Dodge/Room/Girder.hs 9;" f addRandomGirderFrom src/Dodge/Room/Girder.hs 16;" f addSideEffect src/Dodge/Concurrent.hs 29;" f -addSouthPillars src/Dodge/Room/LongDoor.hs 88;" f +addSouthPillars src/Dodge/Room/LongDoor.hs 89;" f addTermSignal src/Dodge/Event/Input.hs 31;" f addToTrunk src/TreeHelp.hs 157;" f addWarningTerminal src/Dodge/Room/Warning.hs 94;" f @@ -2581,7 +2579,7 @@ airlockCrystal src/Dodge/Room/Airlock.hs 251;" f airlockDoubleDoor src/Dodge/Room/Airlock.hs 104;" f airlockSimple src/Dodge/Room/Airlock.hs 129;" f airlockZ src/Dodge/Room/Airlock.hs 166;" f -allVisibleWalls src/Dodge/Base/Collide.hs 224;" f +allVisibleWalls src/Dodge/Base/Collide.hs 226;" f alongSegBy src/Geometry.hs 40;" f alteRifle src/Dodge/Item/Held/Cane.hs 22;" f alteRifleAmmoOrient src/Dodge/Item/Orientation.hs 51;" f @@ -2597,7 +2595,7 @@ 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 68;" f -anythingHitCirc src/Dodge/Base/Collide.hs 331;" f +anythingHitCirc src/Dodge/Base/Collide.hs 335;" f applyCME src/Dodge/HeldUse.hs 397;" f applyClip src/Dodge/Debug.hs 176;" f applyCreatureDamage src/Dodge/Creature/Damage.hs 14;" f @@ -2743,7 +2741,7 @@ boolOption src/Dodge/Menu/OptionType.hs 12;" f bossKeyItems src/Dodge/LockAndKey.hs 13;" f bossRoom src/Dodge/Room/Boss.hs 55;" f bounceDir src/Dodge/Bullet.hs 111;" f -bouncePoint src/Dodge/Base/Collide.hs 85;" f +bouncePoint src/Dodge/Base/Collide.hs 86;" f bounceSound src/Dodge/Projectile/Update.hs 74;" f boundPoints src/Bound.hs 9;" f boundPointsRect src/Bound.hs 23;" f @@ -2779,8 +2777,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 317;" f -canSeeIndirect src/Dodge/Base/Collide.hs 324;" f +canSee src/Dodge/Base/Collide.hs 321;" f +canSeeIndirect src/Dodge/Base/Collide.hs 328;" f cancelExamineInventory src/Dodge/Item/BackgroundEffect.hs 23;" f capacitor src/Dodge/Item/Ammo.hs 67;" f card8Vec src/Dodge/Base/CardinalPoint.hs 17;" f @@ -2815,7 +2813,7 @@ chasmSimpleMaze src/Dodge/Room/Tutorial.hs 358;" f chasmSpitTerminal src/Dodge/Room/Tutorial.hs 298;" f chasmTestCorpse src/Dodge/Creature/Update.hs 155;" f chasmTestLiving src/Dodge/Creature/Update.hs 137;" f -chasmWallToSurface src/Dodge/Base/Collide.hs 118;" f +chasmWallToSurface src/Dodge/Base/Collide.hs 119;" f checkCombineSelectionExists src/Dodge/DisplayInventory.hs 100;" f checkConnection src/Dodge/Inventory/Swap.hs 66;" f checkDeath src/Dodge/Creature/Update.hs 78;" f @@ -2838,12 +2836,12 @@ chooseFootSound src/Dodge/Creature/State/WalkCycle.hs 35;" f chooseFreeSite src/Dodge/Inventory/RBList.hs 47;" f chooseMovementLtAuto src/Dodge/CreatureEffect.hs 78;" f chooseMovementSpreadGun src/Dodge/CreatureEffect.hs 61;" f -circHitWall src/Dodge/Base/Collide.hs 237;" f +circHitWall src/Dodge/Base/Collide.hs 239;" f circInPolygon src/Geometry/Polygon.hs 110;" f -circOnAnyCr src/Dodge/Base/Collide.hs 282;" f +circOnAnyCr src/Dodge/Base/Collide.hs 284;" f circOnSeg src/Geometry.hs 101;" f circOnSegNoEndpoints src/Geometry.hs 91;" f -circOnSomeWall src/Dodge/Base/Collide.hs 276;" f +circOnSomeWall src/Dodge/Base/Collide.hs 278;" f circle src/Picture/Base.hs 172;" f circleDecoration src/Dodge/Placement/TopDecoration.hs 62;" f circleSolid src/Picture/Base.hs 156;" f @@ -2879,22 +2877,22 @@ clsNearPoint src/Dodge/Zoning/Cloud.hs 9;" f clsNearRect src/Dodge/Zoning/Cloud.hs 18;" f clsNearSeg src/Dodge/Zoning/Cloud.hs 15;" f cogRaised src/Dodge/Creature/Perception.hs 101;" f -colCrWall src/Dodge/WallCreatureCollisions.hs 22;" f -colCrsWalls src/Dodge/WallCreatureCollisions.hs 14;" f +colCrWall src/Dodge/WallCreatureCollisions.hs 23;" f +colCrsWalls src/Dodge/WallCreatureCollisions.hs 15;" f collectDamageTypes src/Dodge/Damage.hs 53;" f collectInvItems src/Dodge/Inventory.hs 201;" f -collide3 src/Dodge/Base/Collide.hs 127;" f -collide3Chasm src/Dodge/Base/Collide.hs 111;" f -collide3Chasms src/Dodge/Base/Collide.hs 103;" f -collide3Creature src/Dodge/Base/Collide.hs 160;" f -collide3Floors src/Dodge/Base/Collide.hs 141;" f -collide3Wall src/Dodge/Base/Collide.hs 155;" f -collide3Walls src/Dodge/Base/Collide.hs 136;" f -collide3WallsFloor src/Dodge/Base/Collide.hs 97;" f -collideCircWalls src/Dodge/Base/Collide.hs 249;" f -collidePoint src/Dodge/Base/Collide.hs 51;" f -collidePointTestFilter src/Dodge/Base/Collide.hs 188;" f -collidePointWallsFilter src/Dodge/Base/Collide.hs 202;" f +collide3 src/Dodge/Base/Collide.hs 128;" f +collide3Chasm src/Dodge/Base/Collide.hs 112;" f +collide3Chasms src/Dodge/Base/Collide.hs 104;" f +collide3Creature src/Dodge/Base/Collide.hs 161;" f +collide3Floors src/Dodge/Base/Collide.hs 142;" f +collide3Wall src/Dodge/Base/Collide.hs 156;" f +collide3Walls src/Dodge/Base/Collide.hs 137;" f +collide3WallsFloor src/Dodge/Base/Collide.hs 98;" f +collideCircWalls src/Dodge/Base/Collide.hs 251;" f +collidePoint src/Dodge/Base/Collide.hs 52;" f +collidePointTestFilter src/Dodge/Base/Collide.hs 189;" f +collidePointWallsFilter src/Dodge/Base/Collide.hs 203;" f color src/Picture/Base.hs 100;" f colorLamp src/Dodge/Creature/Lamp.hs 10;" f colorSH src/Shape.hs 234;" f @@ -2957,7 +2955,7 @@ crDisplayAwareness src/Dodge/Creature/Picture/Awareness.hs 39;" f crDisplayVigilance src/Dodge/Creature/Picture/Awareness.hs 53;" f crHasTarget src/Dodge/Creature/Test.hs 66;" f crHasTargetLOS src/Dodge/Creature/Test.hs 69;" f -crHeight src/Dodge/Base/Collide.hs 173;" f +crHeight src/Dodge/Base/Collide.hs 174;" f crHit src/Dodge/WorldEvent/ThingsHit.hs 136;" f crIXsNearCirc src/Dodge/Zoning/Creature.hs 33;" f crIXsNearPoint src/Dodge/Zoning/Creature.hs 15;" f @@ -3147,7 +3145,7 @@ defaultDirtBlock src/Dodge/Default/Block.hs 17;" f defaultDirtWall src/Dodge/Default/Wall.hs 47;" f defaultDoor src/Dodge/Default/Door.hs 5;" f defaultDoorWall src/Dodge/Default/Wall.hs 29;" f -defaultDrawButton src/Dodge/Button/Draw.hs 30;" f +defaultDrawButton src/Dodge/Button/Draw.hs 44;" f defaultFlIt src/Dodge/Default.hs 27;" f defaultForeground src/Dodge/Default/ForegroundShape.hs 5;" f defaultHUD src/Dodge/Default/World.hs 172;" f @@ -3224,7 +3222,7 @@ doAnyEquipmentEffect src/Dodge/Creature/State.hs 140;" f doBackspace src/Dodge/Update/Input/Text.hs 31;" f doBarrelSpin src/Dodge/Projectile/Update.hs 168;" f doBlBl src/Dodge/BlBl.hs 5;" f -doBounce src/Dodge/Base/Collide.hs 66;" f +doBounce src/Dodge/Base/Collide.hs 67;" f doButtonEvent src/Dodge/Button/Event.hs 9;" f doConLoop src/Loop.hs 138;" f doConLoop' src/Loop.hs 230;" f @@ -3310,7 +3308,7 @@ drawBlip src/Dodge/RadarBlip.hs 16;" f drawBlock src/Dodge/Render/ShapePicture.hs 81;" f drawBoundingBox src/Dodge/Debug/Picture.hs 368;" f drawBullet src/Dodge/Render/ShapePicture.hs 175;" f -drawButton src/Dodge/Button/Draw.hs 10;" f +drawButton src/Dodge/Button/Draw.hs 11;" f drawCPUShadows src/Dodge/Render/Shadow.hs 19;" f drawCircCollisionTest src/Dodge/Debug/Picture.hs 118;" f drawCliff src/Dodge/Render/ShapePicture.hs 87;" f @@ -3337,6 +3335,7 @@ drawDragPickup src/Dodge/Render/Picture.hs 236;" f drawDragSelect src/Dodge/Render/Picture.hs 195;" f drawDragSelected src/Dodge/Render/HUD.hs 144;" f drawDragSelecting src/Dodge/Render/HUD.hs 162;" f +drawDumbSwitch src/Dodge/Button/Draw.hs 31;" f drawEmptySet src/Dodge/Render/Picture.hs 151;" f drawEnergyBall src/Dodge/EnergyBall/Draw.hs 7;" f drawEquipment src/Dodge/Creature/Picture.hs 125;" f @@ -3404,7 +3403,7 @@ drawShockwave src/Dodge/Shockwave/Draw.hs 6;" f drawSpark src/Dodge/Spark/Draw.hs 7;" f drawStaticBall src/Dodge/EnergyBall/Draw.hs 28;" f drawSubInventory src/Dodge/Render/HUD.hs 173;" f -drawSwitch src/Dodge/Button/Draw.hs 17;" f +drawSwitch src/Dodge/Button/Draw.hs 18;" f drawSwitchWire src/Dodge/LevelGen/Switch.hs 24;" f drawTargetingAR src/Dodge/Targeting/Draw.hs 20;" f drawTerminalCursorLink src/Dodge/Render/HUD.hs 392;" f @@ -3722,10 +3721,10 @@ handleTextInput src/Dodge/Event/Input.hs 19;" f handleWindowMoveEvent src/Dodge/Event.hs 44;" f hardQuit src/Dodge/Concurrent.hs 32;" f hasAutoDoorBody src/Dodge/Creature/Test.hs 141;" f -hasButtonLOS src/Dodge/Base/Collide.hs 301;" f +hasButtonLOS src/Dodge/Base/Collide.hs 304;" 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 296;" f +hasLOSIndirect src/Dodge/Base/Collide.hs 313;" f hat src/Dodge/Item/Equipment.hs 65;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 68;" f @@ -4098,6 +4097,7 @@ makeCorpse src/Dodge/Corpse/Make.hs 13;" f makeDebris src/Dodge/Block/Debris.hs 48;" f makeDebrisDirected src/Dodge/Block/Debris.hs 51;" f makeDoorDebris src/Dodge/Block/Debris.hs 26;" f +makeDumbSwitch src/Dodge/Room/LongDoor.hs 141;" f makeDustAt src/Dodge/WorldEvent/Cloud.hs 17;" f makeExplosionAt src/Dodge/WorldEvent/Explosion.hs 68;" f makeFlak src/Dodge/Bullet.hs 146;" f @@ -4298,7 +4298,7 @@ nextInSectionSS src/Dodge/SelectionSections.hs 34;" f nextLayoutInt src/Dodge/Data/MetaTree.hs 44;" f noPic src/ShapePicture.hs 25;" f noShape src/ShapePicture.hs 29;" f -noclipCheck src/Dodge/WallCreatureCollisions.hs 17;" f +noclipCheck src/Dodge/WallCreatureCollisions.hs 18;" f nodesNear src/Dodge/Path.hs 75;" f nonConvexChasm src/Dodge/Room/Tutorial.hs 260;" f nonCornerLinks src/Dodge/Room/SensorDoor.hs 53;" f @@ -4358,10 +4358,10 @@ overPos src/Picture/Base.hs 298;" f overPosObj src/Shape.hs 274;" f overPosSH src/Shape.hs 258;" f overPosSP src/ShapePicture.hs 41;" f -overlapCircWalls src/Dodge/Base/Collide.hs 230;" f -overlapCircWallsClosest src/Dodge/Base/Collide.hs 269;" f -overlapSegCrs src/Dodge/Base/Collide.hs 58;" f -overlapSegWalls src/Dodge/Base/Collide.hs 211;" f +overlapCircWalls src/Dodge/Base/Collide.hs 232;" f +overlapCircWallsClosest src/Dodge/Base/Collide.hs 271;" f +overlapSegCrs src/Dodge/Base/Collide.hs 59;" f +overlapSegWalls src/Dodge/Base/Collide.hs 212;" f overrideInternal src/Dodge/Creature/ReaderUpdate.hs 180;" f overrideMeleeCloseTarget src/Dodge/Creature/ReaderUpdate.hs 35;" f overwriteLabel src/Dodge/Tree/Compose.hs 32;" f @@ -4549,10 +4549,10 @@ psposAddLabel src/Dodge/PlacementSpot.hs 71;" f pt0 src/Dodge/LevelGen/PlacementHelper.hs 55;" f ptCont src/Dodge/LevelGen/PlacementHelper.hs 21;" f pulseChecker src/Dodge/Item/Equipment.hs 84;" f -pushCr src/Dodge/WallCreatureCollisions.hs 36;" f +pushCr src/Dodge/WallCreatureCollisions.hs 37;" f pushL src/DoubleStack.hs 20;" f -pushOutFromCorners src/Dodge/WallCreatureCollisions.hs 70;" f -pushOutFromWall src/Dodge/WallCreatureCollisions.hs 59;" f +pushOutFromCorners src/Dodge/WallCreatureCollisions.hs 83;" f +pushOutFromWall src/Dodge/WallCreatureCollisions.hs 72;" f pushR src/DoubleStack.hs 24;" f pushScreen src/Dodge/Menu/PushPop.hs 9;" f pushYouOutFromWalls src/Dodge/Update.hs 342;" f @@ -4967,10 +4967,10 @@ showEquipItem src/Dodge/Item/Display.hs 108;" f showInt src/Dodge/Item/Info.hs 75;" f showIntsString src/Dodge/Tree/Compose.hs 130;" f showInventoryPathing src/Dodge/Item/Display.hs 86;" f -showManObj src/Dodge/TestString.hs 58;" f +showManObj src/Dodge/TestString.hs 57;" f showMuzzlePositions src/Dodge/Debug.hs 292;" f showTerminalError src/Dodge/Debug/Terminal.hs 80;" f -showTimeFlow src/Dodge/TestString.hs 67;" f +showTimeFlow src/Dodge/TestString.hs 66;" f shrinkPolyOnEdges src/Geometry/Polygon.hs 198;" f shrinkVert src/Geometry/Polygon.hs 202;" f shuffle src/RandomHelp.hs 68;" f @@ -5006,9 +5006,9 @@ slapClean7S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 747;" f slapS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 667;" f slideDoorS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 629;" f slideWindow src/ListHelp.hs 81;" f -slowCrushRoom src/Dodge/Room/LongDoor.hs 140;" f -slowDoorRoom src/Dodge/Room/LongDoor.hs 152;" f -slowDoorRoomRunPast src/Dodge/Room/LongDoor.hs 169;" f +slowCrushRoom src/Dodge/Room/LongDoor.hs 144;" f +slowDoorRoom src/Dodge/Room/LongDoor.hs 176;" f +slowDoorRoomRunPast src/Dodge/Room/LongDoor.hs 193;" f smallBattery src/Dodge/Item/Ammo.hs 57;" f smallBranch src/Dodge/Tree/GenerateStructure.hs 32;" f smallChaseCrit src/Dodge/Creature/ChaseCrit.hs 14;" f @@ -5043,7 +5043,7 @@ soundToOnomato src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 175;" f soundToVol src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 4;" f soundWithStatus src/Dodge/SoundLogic.hs 104;" f soundWithStatusVolume src/Dodge/SoundLogic.hs 54;" f -southPillarsRoom src/Dodge/Room/LongDoor.hs 85;" f +southPillarsRoom src/Dodge/Room/LongDoor.hs 86;" f spaceAction src/Dodge/Update/Input/InGame.hs 504;" f spanColLightBlackI src/Dodge/Placement/Instance/LightSource.hs 160;" f spanColLightI src/Dodge/Placement/Instance/LightSource.hs 153;" f @@ -5076,7 +5076,7 @@ sqPlatformChasm src/Dodge/Room/Tutorial.hs 225;" f sqSpitChasm src/Dodge/Room/Tutorial.hs 240;" f square src/Geometry/Polygon.hs 56;" f squareDecoration src/Dodge/Placement/TopDecoration.hs 48;" f -squashIntersectCirclePoint src/Dodge/WallCreatureCollisions.hs 73;" f +squashIntersectCirclePoint src/Dodge/WallCreatureCollisions.hs 86;" f squashNormalizeV src/Geometry/Vector.hs 158;" f ssLookupDown src/Dodge/SelectionSections.hs 96;" f ssLookupGE' src/Dodge/SelectionSections.hs 150;" f @@ -5269,7 +5269,7 @@ tone440sawtoothquietS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 663;" f topInvW src/Dodge/ListDisplayParams.hs 54;" f topPrismEdgeIndices src/Shader/Poke.hs 335;" f topPrismIndices src/Shader/Poke.hs 410;" f -topTestPart src/Dodge/TestString.hs 54;" f +topTestPart src/Dodge/TestString.hs 53;" f torchShape src/Dodge/Item/Draw/SPic.hs 277;" f torqueAmount src/Dodge/HeldUse.hs 606;" f torqueCr src/Dodge/WorldEffect.hs 86;" f @@ -5348,8 +5348,8 @@ tutRezBox src/Dodge/Room/Tutorial.hs 525;" f tutRoomTree src/Dodge/Floor.hs 20;" f tutorialMessage1 src/Dodge/Room/Tutorial.hs 550;" f tweenAngles src/Geometry/Vector.hs 190;" f -twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 79;" f -twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 35;" f +twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 80;" f +twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 36;" f twists src/Dodge/Creature/Test.hs 103;" f twoFlat src/Dodge/Creature/Test.hs 100;" f twoFlatHRot src/Dodge/Item/HeldOffset.hs 76;" f @@ -5564,7 +5564,7 @@ viewGameRoomBoundaries src/Dodge/Debug/Picture.hs 332;" f viewRoomBoundaries src/Dodge/Debug/Picture.hs 341;" f viewTarget src/Dodge/Creature/ReaderUpdate.hs 155;" f violet src/Color.hs 48;" f -visibleWalls src/Dodge/Base/Collide.hs 216;" f +visibleWalls src/Dodge/Base/Collide.hs 217;" f visionCheck src/Dodge/Creature/Perception.hs 152;" f vocalizationTest src/Dodge/Creature/Vocalization.hs 62;" f volleyGun src/Dodge/Item/Held/Cane.hs 15;" f @@ -5572,9 +5572,9 @@ volleyGunShape src/Dodge/Item/Draw/SPic.hs 355;" f walkNozzle src/Dodge/HeldUse.hs 826;" f walkableNodeNear src/Dodge/Path.hs 69;" f wallBlips src/Dodge/RadarSweep.hs 99;" f -wallBuffer src/Dodge/WallCreatureCollisions.hs 54;" f +wallBuffer src/Dodge/WallCreatureCollisions.hs 67;" f wallIsZeroLength src/Dodge/LevelGen/StaticWalls.hs 179;" f -wallToSurface src/Dodge/Base/Collide.hs 180;" f +wallToSurface src/Dodge/Base/Collide.hs 181;" f wallsFromRooms src/Dodge/Layout.hs 141;" f wallsToDraw src/Dodge/Render/Walls.hs 18;" f warmupSound src/Dodge/HeldUse.hs 1396;" f @@ -5627,7 +5627,9 @@ wlIsOpaque src/Dodge/Base/Wall.hs 6;" f wlIsSeeThrough src/Dodge/Base/Wall.hs 11;" f wlOpaqueDraw src/Dodge/Render/Walls.hs 53;" f wlSeeThroughDraw src/Dodge/Render/Walls.hs 56;" f +wlWlCrush src/Dodge/WallCreatureCollisions.hs 61;" f wlZoneSize src/Dodge/Zoning/Wall.hs 52;" f +wlsCrush src/Dodge/WallCreatureCollisions.hs 57;" f wlsFromIXs src/Dodge/Zoning/Wall.hs 35;" f wlsHit src/Dodge/WorldEvent/ThingsHit.hs 156;" f wlsHitRadial src/Dodge/WorldEvent/ThingsHit.hs 168;" f