From 65383e2303f68562f39bfa6a68212f8954a620f2 Mon Sep 17 00:00:00 2001 From: justin Date: Thu, 12 Mar 2026 13:37:56 +0000 Subject: [PATCH] Stop intersectSegSegTest returning True for collinear line pairs --- src/Dodge/Data/Config.hs | 3 +- src/Dodge/Debug.hs | 6 +- src/Dodge/Debug/Picture.hs | 13 +- src/Dodge/Floor.hs | 2 +- src/Dodge/GameRoom.hs | 1 + src/Dodge/Layout.hs | 1 + src/Dodge/Room/Corridor.hs | 7 +- src/Dodge/Room/Door.hs | 1 + src/Dodge/Room/LasTurret.hs | 30 ++- src/Dodge/Room/Room.hs | 12 +- src/Dodge/Room/Tutorial.hs | 71 ++++---- src/Dodge/Tree/Shift.hs | 6 +- src/Geometry/ConvexPoly.hs | 37 ++++ src/Geometry/Intersect.hs | 6 +- tags | 353 ++++++++++++++++++------------------ 15 files changed, 326 insertions(+), 223 deletions(-) diff --git a/src/Dodge/Data/Config.hs b/src/Dodge/Data/Config.hs index 8c5e54518..f36f8a2c4 100644 --- a/src/Dodge/Data/Config.hs +++ b/src/Dodge/Data/Config.hs @@ -84,7 +84,8 @@ data DebugBool | Cr_status | Cr_awareness | Mouse_position - | View_boundaries + | View_gr_boundaries + | View_rm_boundaries | Walls_info | Pathing | Remove_LOS diff --git a/src/Dodge/Debug.hs b/src/Dodge/Debug.hs index 3ca3be67a..ce6362f9d 100644 --- a/src/Dodge/Debug.hs +++ b/src/Dodge/Debug.hs @@ -57,7 +57,8 @@ debugItem = \case Close_shape_culling -> mempty Bound_box_screen -> mempty Show_ms_frame -> mempty - View_boundaries -> mempty + View_gr_boundaries -> mempty + View_rm_boundaries -> mempty Show_bound_box -> mempty Show_wall_search_rays -> mempty Show_dda_test -> mempty @@ -227,7 +228,8 @@ drawDebug u = \case Close_shape_culling -> mempty Bound_box_screen -> mempty Show_ms_frame -> mempty - View_boundaries -> viewBoundaries $ _uvWorld u + View_gr_boundaries -> viewGameRoomBoundaries $ _uvWorld u + View_rm_boundaries -> viewRoomBoundaries $ _uvWorld u Show_bound_box -> drawBoundingBox $ _uvWorld u Show_wall_search_rays -> drawWallSearchRays $ _uvWorld u Show_dda_test -> drawDDATest $ _uvWorld u diff --git a/src/Dodge/Debug/Picture.hs b/src/Dodge/Debug/Picture.hs index 9ff82f91f..c3096c7a3 100644 --- a/src/Dodge/Debug/Picture.hs +++ b/src/Dodge/Debug/Picture.hs @@ -329,8 +329,8 @@ drawWallSearchRays w = foldMap (f . fst) $ allVisibleWalls w uncurryV translate p (circle 5) <> line [w ^. wCam . camViewFrom, p] -viewBoundaries :: World -> Picture -viewBoundaries w = +viewGameRoomBoundaries :: World -> Picture +viewGameRoomBoundaries w = setLayer DebugLayer $ color green (foldMap (polygonWire . _grBound) grs) <> color yellow (foldMap (\q -> line [p, q]) $ getViewpoints p (_cWorld w)) @@ -338,6 +338,15 @@ viewBoundaries w = p = w ^. wCam . camViewFrom grs = filter (pointInOrOnPolygon p . _grBound) (_cwgGameRooms $ _cwGen $ _cWorld w) +viewRoomBoundaries :: World -> Picture +viewRoomBoundaries w = + setLayer DebugLayer $ + color green (foldMap (foldMap polygonWire . _grRmBounds) grs) +-- <> color yellow (foldMap (\q -> line [p, q]) $ getViewpoints p (_cWorld w)) + where + p = w ^. wCam . camViewFrom + grs = filter (pointInOrOnPolygon p . _grBound) (_cwgGameRooms $ _cwGen $ _cWorld w) + viewClipBounds :: Config -> World -> Picture viewClipBounds cfig w | _debug_view_clip_bounds cfig == AllRoomClipBoundaries = diff --git a/src/Dodge/Floor.hs b/src/Dodge/Floor.hs index feb67bd5a..20964e003 100644 --- a/src/Dodge/Floor.hs +++ b/src/Dodge/Floor.hs @@ -24,7 +24,7 @@ initialRoomTree :: State LayoutVars MTRS initialRoomTree = foldMTRS $ intersperse - (zoom lyGen corDoor) + (zoom lyGen doorCor) [ intAnno startRoom , passthroughLockKeyLists [(sensorRoomRunPast ElectricSensor, takeOne diff --git a/src/Dodge/GameRoom.hs b/src/Dodge/GameRoom.hs index fe54a3b45..64f3d0499 100644 --- a/src/Dodge/GameRoom.hs +++ b/src/Dodge/GameRoom.hs @@ -13,6 +13,7 @@ data GameRoom = GameRoom { _grViewpoints :: [Point2] , _grViewpointsEx :: [Point2] , _grBound :: [Point2] + , _grRmBounds :: [[Point2]] , -- | gives direction of room _grDir :: Float , _grLinkDirs :: [Float] diff --git a/src/Dodge/Layout.hs b/src/Dodge/Layout.hs index 4500d1aae..1809622a9 100644 --- a/src/Dodge/Layout.hs +++ b/src/Dodge/Layout.hs @@ -162,6 +162,7 @@ gameRoomFromRoom rm = expandPolyCorners 50 . convexHullSafe . nubBy closePoints . concat $ _rmBound rm ++ _rmPolys rm + , _grRmBounds = map (map doshift) $ _rmBound rm , _grDir = getDir $ _rmPos rm , _grLinkDirs = mapMaybe undir $ _rmPos rm , _grName = _rmName rm diff --git a/src/Dodge/Room/Corridor.hs b/src/Dodge/Room/Corridor.hs index 05b54b86d..717f4a0b1 100644 --- a/src/Dodge/Room/Corridor.hs +++ b/src/Dodge/Room/Corridor.hs @@ -20,10 +20,11 @@ corridor = { _rmPolys = [poly] , _rmLinks = lnks' , --, _rmPath = foldMap (doublePairSet . (,) (V2 20 60) . fst) lnks - _rmPath = foldMap (doublePairSet . (,) (V2 20 60)) [V2 20 70, V2 20 10] + _rmPath = foldMap (doublePairSet . (,) (V2 20 60)) [V2 20 70, V2 20 5] --, _rmPmnts = [spanLightI (V2 0 39.5) (V2 40 39.5)] , _rmPmnts = [] - , _rmBound = [rectNSWE 50 30 (-5) 45] + , _rmBound = [rectNSWE 45 35 (-5) 45] +-- , _rmBound = [rectNSWE 50 40 (-5) 45] , _rmFloor = Tiled [makeTileFromPoly poly 5] , _rmRandPSs = [psRandRanges (10, 30) (30, 60) (0, 2 * pi)] , _rmName = "Corridor" @@ -38,7 +39,7 @@ corridor = , outLink (V2 20 70) (negate $ pi / 4) , outLink (V2 20 70) (pi / 6) , outLink (V2 20 70) (negate $ pi / 6) - , inLink (V2 20 10) pi + , inLink (V2 20 5) pi ] keyholeCorridor :: Room diff --git a/src/Dodge/Room/Door.hs b/src/Dodge/Room/Door.hs index 5c92a6f54..3e3d25849 100644 --- a/src/Dodge/Room/Door.hs +++ b/src/Dodge/Room/Door.hs @@ -19,6 +19,7 @@ door = , -- door extends into side walls (for shadows as rendered 12/03) _rmPmnts = [putAutoDoor (V2 0 20) (V2 40 20)] , _rmName = "autoDoor" +-- , _rmBound = [rectNSWE 21 19 0 40] , _rmBound = [rectNSWE 21 19 0 40] } where diff --git a/src/Dodge/Room/LasTurret.hs b/src/Dodge/Room/LasTurret.hs index fee80eac0..0c0ea8ac4 100644 --- a/src/Dodge/Room/LasTurret.hs +++ b/src/Dodge/Room/LasTurret.hs @@ -11,6 +11,7 @@ module Dodge.Room.LasTurret ( lasCenRunClose, ) where +import Dodge.Room.Procedural import qualified Data.Set as S import Dodge.Cleat import Dodge.Data.GenWorld @@ -141,8 +142,8 @@ lasCenSensEdge n = do , treePost [door, cleatLabel 0 corridor] ] -lasCenRunClose :: (RandomGen g) => State g (MetaTree Room String) -lasCenRunClose = do +lasCenRunClose' :: (RandomGen g) => State g (MetaTree Room String) +lasCenRunClose' = do thelight <- mntLightLnkCond $ rprBool $ const . isInLnk thelight1 <- mntLightLnkCond $ rprBool $ const . isOutLnk r <- @@ -169,6 +170,31 @@ lasCenRunClose = do inlinkwall = linkwall isInLnk outlinkwall = linkwall isOutLnk +lasCenRunClose :: (RandomGen g) => State g (MetaTree Room String) +lasCenRunClose = do + r <- + roomRectAutoLights 250 250 + <&> rmPmnts + <>~ [ putLasTurret 0.02 & plSpot .~ PS (V2 220 20) 0 + , inlinkwall 70 (rectNSWE 10 (-10) (-10) 30) + , inlinkwall 125 (rectNSWE 55 (-55) (-10) 10) + , inlinkwall 180 (rectNSWE 10 (-10) (-30) 10) + , outlinkwall 70 (rectNSWE 10 (-10) (-30) 10) + , outlinkwall 125 (rectNSWE 55 (-55) (-10) 10) + , outlinkwall 180 (rectNSWE 10 (-10) (-10) 30) + ] + <&> rmLinks %~ setInLinks (memtest (FromEdge West 0) (OnEdge South)) + <&> rmLinks %~ setOutLinks (memtest (FromEdge East 0) (OnEdge North)) + rToOnward "lasCenRunClose" $ return $ cleatOnward r + where + memtest a b x = let y = _rlType x + in a `S.member` y && b `S.member` y + linkwall f x = heightWallPS + (resetPLUse $ rprBoolShift (const . f) (shiftInBy x <&> (,S.singleton UsedPosLow))) + 30 + inlinkwall = linkwall isInLnk + outlinkwall = linkwall isOutLnk + lasTunnel :: (RandomGen g) => Float -> State g Room lasTunnel y = do extraPlmnts <- diff --git a/src/Dodge/Room/Room.hs b/src/Dodge/Room/Room.hs index 40a533d79..5302685bb 100644 --- a/src/Dodge/Room/Room.hs +++ b/src/Dodge/Room/Room.hs @@ -8,6 +8,7 @@ module Dodge.Room.Room ( pistolerRoom, spawnerRoom, corDoor, + doorCor, weaponBehindPillar, critsRoom, distributerRoom, @@ -395,10 +396,15 @@ spawnerRoom = do aRoom <- airlock return $ treeFromTrunk [aRoom, corridor] $ pure $ cleatOnward roomWithSpawner +doorCor :: RandomGen g => State g (MetaTree Room String) +doorCor = do + cor <- shuffleLinks (cleatOnward corridor) <&> rmPmnts .~ [] + return $ tToBTree "doorCor" $ treePost [door, cor] + corDoor :: RandomGen g => State g (MetaTree Room String) corDoor = do - cor <- shuffleLinks (cleatOnward corridor) <&> rmPmnts .~ [] - return $ tToBTree "corDoor" $ treePost [door, cor] + cor <- shuffleLinks corridor <&> rmPmnts .~ [] + return $ tToBTree "corDoor" $ treePost [cor,cor, cleatOnward door] critsPillarRoom :: Int -> State LayoutVars Room critsPillarRoom i = do @@ -452,6 +458,8 @@ distributerRoom atype aamount = do ) return $ r & rmPmnts .:~ store & rmInPmnt <>~ [(0,dst),(1,thepipe)] + & rmLinks %~ setInLinksByType (OnEdge South) + & rmLinks %~ setOutLinks (not . S.member (OnEdge South) . _rlType) tmDistributeLines :: [TerminalLine] tmDistributeLines = [TLine 1 [TerminalLineConst "ATTEMPTING TO DISTRIBUTE MATERIAL..." white] TmDistributeAmmo] diff --git a/src/Dodge/Room/Tutorial.hs b/src/Dodge/Room/Tutorial.hs index ec303fe6f..33849b8c7 100644 --- a/src/Dodge/Room/Tutorial.hs +++ b/src/Dodge/Room/Tutorial.hs @@ -52,43 +52,44 @@ tutAnoTree :: State LayoutVars MTRS tutAnoTree = do foldMTRS [ tToBTree "TutStartRez" . return . cleatOnward <$> tutRezBox +-- , return . tToBTree "door" $ treePost [corridor, cleatOnward door] , corDoor - , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) - , lasCenRunClose --- , passthroughLockKeyLists lockRoomKeyItems itemRooms - , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) -- , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) --- , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) --- , passthroughLockKeyLists --- [(sensorRoomRunPast ElectricSensor, takeOne --- [-- CRAFT (ENERGYBALLCRAFT TeslaBall) , --- HELD SPARKGUN])] --- itemRooms --- , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) --- , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) - , tToBTree "sdr" . return . cleatOnward <$> - (shuffleLinks =<< distributerRoom BulletAmmo 100000) --- , return $ tToBTree "cor" $ return $ cleatOnward corridor --- --, tToBTree "sdr" . return . cleatOnward <$> slowDoorRoom ----- , tToBTree "sr" . return . cleatOnward <$> tanksRoom [] [] --- , return $ tToBTree "door" $ return $ cleatOnward door --- , return $ tToBTree "cor" $ return $ cleatOnward corridor --- , tToBTree "sdr" . return . cleatOnward <$> --- (shuffleLinks =<< tanksPipesRoom) --- , return $ tToBTree "cor" $ return $ cleatOnward corridor --- , return $ tToBTree "cor" $ return $ cleatOnward corridor --- , return $ tToBTree "cor" $ return $ cleatOnward corridor - , return $ tToBTree "cor" $ return $ cleatOnward corridor - , return $ tToBTree "cor" $ return $ cleatOnward corridor - , return $ tToBTree "cor" $ return $ cleatOnward corridor - , return $ tToBTree "door" $ return $ cleatOnward door - , tutHub - , chasmSpitTerminal - , tutLight - , tutDrop - , return $ tToBTree "cor" $ return $ cleatOnward corridor - ---- , AnTree $ pickupTut - ---- , AnTree $ weaponTut +--aaa , lasCenRunClose +--aaa-- , passthroughLockKeyLists lockRoomKeyItems itemRooms +--aaa , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) +--aaa-- , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) +--aaa-- , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) +--aaa-- , passthroughLockKeyLists +--aaa-- [(sensorRoomRunPast ElectricSensor, takeOne +--aaa-- [-- CRAFT (ENERGYBALLCRAFT TeslaBall) , +--aaa-- HELD SPARKGUN])] +--aaa-- itemRooms +--aaa-- , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) +--aaa-- , tToBTree "cor" . return <$> shuffleLinks (cleatOnward corridor) +--aaa , tToBTree "sdr" . return . cleatOnward <$> +--aaa (shuffleLinks =<< distributerRoom BulletAmmo 100000) +--aaa-- , return $ tToBTree "cor" $ return $ cleatOnward corridor +--aaa-- --, tToBTree "sdr" . return . cleatOnward <$> slowDoorRoom +--aaa---- , tToBTree "sr" . return . cleatOnward <$> tanksRoom [] [] +--aaa-- , return $ tToBTree "door" $ return $ cleatOnward door +--aaa-- , return $ tToBTree "cor" $ return $ cleatOnward corridor +--aaa-- , tToBTree "sdr" . return . cleatOnward <$> +--aaa-- (shuffleLinks =<< tanksPipesRoom) +--aaa-- , return $ tToBTree "cor" $ return $ cleatOnward corridor +--aaa-- , return $ tToBTree "cor" $ return $ cleatOnward corridor +--aaa-- , return $ tToBTree "cor" $ return $ cleatOnward corridor +--aaa , return $ tToBTree "cor" $ return $ cleatOnward corridor +--aaa , return $ tToBTree "cor" $ return $ cleatOnward corridor +--aaa , return $ tToBTree "cor" $ return $ cleatOnward corridor +--aaa , return $ tToBTree "door" $ return $ cleatOnward door +--aaa , tutHub +--aaa , chasmSpitTerminal +--aaa , tutLight +--aaa , tutDrop +--aaa , return $ tToBTree "cor" $ return $ cleatOnward corridor +--aaa ---- , AnTree $ pickupTut +--aaa ---- , AnTree $ weaponTut ] foldMTRS :: diff --git a/src/Dodge/Tree/Shift.hs b/src/Dodge/Tree/Shift.hs index 64f921c4c..ee6e7d080 100644 --- a/src/Dodge/Tree/Shift.hs +++ b/src/Dodge/Tree/Shift.hs @@ -10,6 +10,7 @@ module Dodge.Tree.Shift ( PosRooms (..), ) where +import Data.Monoid import Control.Lens import Data.Bifunctor import Data.List (delete) @@ -66,7 +67,9 @@ posRms prs parenti@(parent, _) ((numChild, t@(Node childi _)) : its) tseq = do where tryChildLinks [] = tryParentLinks ls tryChildLinks ((numinlink, il) : ils) - | clipping = tryChildLinks ils + | Just xs <- clipping' = do + putStrLn $ show xs + tryChildLinks ils | otherwise = do putStrLn $ show j ++ "-" ++ show numinlink mayrs <- @@ -83,6 +86,7 @@ posRms prs parenti@(parent, _) ((numChild, t@(Node childi _)) : its) tseq = do where newBounds = map pointsToPoly . _rmBound . doRoomShift . fst $ rootLabel shiftedt clipping = or (convexPolysOverlap <$> newBounds <*> _prBounds prs) + clipping' = getFirst . foldMap First $ convexPolysOverlapWitness <$> newBounds <*> _prBounds prs updateparent rm = _rmLinkEff rm il child numChild outlnk rm & rmLinks %~ delete outlnk diff --git a/src/Geometry/ConvexPoly.hs b/src/Geometry/ConvexPoly.hs index 4cc3fc911..4f324ab55 100644 --- a/src/Geometry/ConvexPoly.hs +++ b/src/Geometry/ConvexPoly.hs @@ -9,6 +9,7 @@ module Geometry.ConvexPoly ( -- , centroid pointsToPoly, convexPolysOverlap, + convexPolysOverlapWitness, ) where import Control.Lens @@ -18,6 +19,7 @@ import Geometry.Data import Geometry.Intersect import Geometry.Polygon import Geometry.Vector +import Control.Applicative --import qualified Control.Foldl as L data ConvexPoly = ConvexPoly @@ -48,6 +50,13 @@ convexPolysOverlap cp1 cp2 = dist (_cpCen cp1) (_cpCen cp2) < _cpRad cp1 + _cpRad cp2 && polyPointsOverlap (_cpPoints cp1) (_cpPoints cp2) +-- | Test whether two polygons intersect or if one is contained in the other, +-- with witness. +convexPolysOverlapWitness :: ConvexPoly -> ConvexPoly -> Maybe (ConvexPoly, ConvexPoly,String) +convexPolysOverlapWitness cp1 cp2 + | Just s <- polyPointsOverlapWitness (_cpPoints cp1) (_cpPoints cp2) = Just (cp1,cp2,s) + | otherwise = Nothing + -- | Test whether two polygons intersect or if one is contained in the other. polyPointsOverlap :: [Point2] -> [Point2] -> Bool @@ -57,6 +66,14 @@ polyPointsOverlap (p : ps) (q : qs) = || polyPointsIntersect (p : ps) (q : qs) polyPointsOverlap _ _ = False +-- | Test whether two polygons intersect or if one is contained in the other. +polyPointsOverlapWitness :: [Point2] -> [Point2] -> Maybe String +polyPointsOverlapWitness (p : ps) (q : qs) + | pointInPoly p (q : qs) = Just $ "Contained: "<> show p <> " in " <> show (q:qs) + | pointInPoly q (p : ps) = Just $ "Contained: "<> show p <> " in " <> show (q:qs) + | otherwise = polyPointsIntersectWitness (p : ps) (q : qs) +polyPointsOverlapWitness _ _ = Nothing + polyPointsIntersect :: [Point2] -> [Point2] -> Bool polyPointsIntersect (a : b : xs) ps = go a (a : b : xs) ps where @@ -65,6 +82,14 @@ polyPointsIntersect (a : b : xs) ps = go a (a : b : xs) ps go _ _ _ = False polyPointsIntersect _ _ = False +polyPointsIntersectWitness :: [Point2] -> [Point2] -> Maybe String +polyPointsIntersectWitness (a : b : xs) ps = go a (a : b : xs) ps + where + go x' (a' : b' : xs') ps' = pairPolyPointsIntersectWitness a' b' ps' <|> go x' (b' : xs') ps' + go b' [a'] ps' = pairPolyPointsIntersectWitness a' b' ps' + go _ _ _ = Nothing +polyPointsIntersectWitness _ _ = Nothing + pairPolyPointsIntersect :: Point2 -> Point2 -> [Point2] -> Bool pairPolyPointsIntersect a' b' (c' : d' : xs') = go c' a' b' (c' : d' : xs') where @@ -73,5 +98,17 @@ pairPolyPointsIntersect a' b' (c' : d' : xs') = go c' a' b' (c' : d' : xs') go _ _ _ _ = False pairPolyPointsIntersect _ _ _ = False +pairPolyPointsIntersectWitness :: Point2 -> Point2 -> [Point2] -> Maybe String +pairPolyPointsIntersectWitness a' b' (c' : d' : xs') = go c' a' b' (c' : d' : xs') + where + go x a b (c : d : xs) + | intersectSegSegTest a b c d = Just $ show a <> " " <> show b <> " " <> show c <> " " <> show d + | otherwise = go x a b (d : xs) + go d a b [c] + | intersectSegSegTest a b c d = Just $ show a <> " " <> show b <> " " <> show c <> " " <> show d + | otherwise = Nothing + go _ _ _ _ = Nothing +pairPolyPointsIntersectWitness _ _ _ = Nothing + makeLenses ''ConvexPoly deriveJSON defaultOptions ''ConvexPoly diff --git a/src/Geometry/Intersect.hs b/src/Geometry/Intersect.hs index 19f172e89..022009e71 100644 --- a/src/Geometry/Intersect.hs +++ b/src/Geometry/Intersect.hs @@ -151,8 +151,10 @@ intersectSegSegTest x y z w = f x y z w && f z w x y && x /= y && z /= w where f a b c d = - (not (isRHS a b c) && not (isLHS a b d)) - || (not (isLHS a b c) && not (isRHS a b d)) +-- (not (isRHS a b c) && not (isLHS a b d)) +-- || (not (isLHS a b c) && not (isRHS a b d)) + (isRHS a b c && isLHS a b d) + || (isLHS a b c && isRHS a b d) intersectSegSegPreTest :: Point2 -> diff --git a/tags b/tags index e798f2d8c..40b43fc29 100644 --- a/tags +++ b/tags @@ -45,7 +45,7 @@ AimStance src/Dodge/Data/AimStance.hs 10;" t Aiming src/Dodge/Data/Creature/Stance.hs 33;" C AirFiltrationSS src/Dodge/Data/Scenario.hs 95;" C AlienContact src/Dodge/Data/Scenario.hs 30;" C -AllRoomClipBoundaries src/Dodge/Data/Config.hs 122;" C +AllRoomClipBoundaries src/Dodge/Data/Config.hs 123;" C AlteRifleSwitch src/Dodge/Data/Item/Params.hs 18;" C Ambush src/Dodge/Data/ActionPlan.hs 130;" C AmmoEffectSF src/Dodge/Data/ComposedItem.hs 33;" C @@ -138,7 +138,7 @@ Boosting src/Dodge/Data/Creature/Stance.hs 26;" C BottomMenuOption src/Dodge/Data/Universe.hs 77;" C BounceBullet src/Dodge/Data/Bullet.hs 28;" C BoundCurs src/Dodge/Data/SelectionList.hs 21;" C -Bound_box_screen src/Dodge/Data/Config.hs 94;" C +Bound_box_screen src/Dodge/Data/Config.hs 95;" C Bounds src/Dodge/Data/Bounds.hs 10;" t BrigSS src/Dodge/Data/Scenario.hs 102;" C Brute src/Dodge/Data/Item/Use/Consumption/LoadAction.hs 16;" C @@ -206,16 +206,16 @@ ChasmObstacle src/Dodge/Data/PathGraph.hs 51;" C ChemFuel src/Dodge/Data/Item/Use/Consumption/Ammo.hs 14;" C ChooseMovementLtAuto src/Dodge/Data/CreatureEffect.hs 29;" C ChooseMovementSpreadGun src/Dodge/Data/CreatureEffect.hs 28;" C -Circ_collision_test src/Dodge/Data/Config.hs 98;" C +Circ_collision_test src/Dodge/Data/Config.hs 99;" C Climate src/Dodge/Data/Scenario.hs 32;" C CloseToMelee src/Dodge/Data/ActionPlan.hs 139;" C -Close_shape_culling src/Dodge/Data/Config.hs 92;" C +Close_shape_culling src/Dodge/Data/Config.hs 93;" C Cloud src/Dodge/Data/Cloud.hs 12;" t CloudType src/Dodge/Data/Cloud.hs 20;" t ClusterLink src/Dodge/Data/RoomCluster.hs 13;" t ClusterStatus src/Dodge/Data/RoomCluster.hs 9;" t Cognizant src/Dodge/Data/Creature/Perception.hs 65;" C -Collision_test src/Dodge/Data/Config.hs 97;" C +Collision_test src/Dodge/Data/Config.hs 98;" C Color src/Color/Data.hs 30;" t Color8 src/Color/Data.hs 32;" t ColorFaction src/Dodge/Data/Creature/State.hs 19;" C @@ -234,7 +234,7 @@ ContextDT src/Dodge/Data/DoubleTree.hs 82;" t ContextLDT src/Dodge/Data/DoubleTree.hs 40;" t ContinentalGovernment src/Dodge/Data/Scenario.hs 51;" C ControlDeckSS src/Dodge/Data/Scenario.hs 89;" C -ConvexPoly src/Geometry/ConvexPoly.hs 23;" t +ConvexPoly src/Geometry/ConvexPoly.hs 25;" t CookDeath src/Dodge/Data/Creature.hs 68;" C CookingDamage src/Dodge/Data/Damage/Type.hs 5;" C Corporation src/Dodge/Data/Scenario.hs 46;" C @@ -281,7 +281,7 @@ Crushing src/Dodge/Data/Damage.hs 19;" C CryoReleaseCloud src/Dodge/Data/Cloud.hs 23;" C CryostatisSS src/Dodge/Data/Scenario.hs 91;" C Crystal src/Dodge/Data/Material.hs 16;" C -Cull_more_lights src/Dodge/Data/Config.hs 91;" C +Cull_more_lights src/Dodge/Data/Config.hs 92;" C CursorDisplay src/Dodge/Data/SelectionList.hs 20;" t Cylinder src/Shape/Data.hs 14;" C DETECTOR src/Dodge/Data/Item/Combine.hs 33;" C @@ -344,7 +344,7 @@ DoorDoNothing src/Dodge/Data/Door.hs 43;" C DoorLerp src/Dodge/Data/Door.hs 43;" C DoorPart src/Dodge/Data/Wall/Structure.hs 12;" C DoorUpdate src/Dodge/Data/Door.hs 43;" t -DoubleRes src/Dodge/Data/Config.hs 112;" C +DoubleRes src/Dodge/Data/Config.hs 113;" C DoubleTreeNodeType src/Dodge/Data/DoubleTree.hs 14;" t DrawForceField src/Dodge/Data/Wall.hs 37;" C DrawnWall src/Dodge/Data/Wall.hs 33;" C @@ -363,7 +363,7 @@ Ears src/Dodge/Data/Creature/Perception.hs 45;" C East src/Dodge/Data/CardinalPoint.hs 8;" C East8 src/Dodge/Data/CardinalPoint.hs 30;" C EdgeObstacle src/Dodge/Data/PathGraph.hs 49;" t -EighthRes src/Dodge/Data/Config.hs 112;" C +EighthRes src/Dodge/Data/Config.hs 113;" C Eldritch src/Dodge/Data/Scenario.hs 34;" C ElectricSensor src/Dodge/Data/Machine/Sensor.hs 14;" C ElectricSpark src/Dodge/Data/Spark.hs 19;" C @@ -453,7 +453,7 @@ ForceField src/Dodge/Data/Material.hs 19;" C ForceFieldType src/Dodge/Data/Item/Use/Consumption/Ammo.hs 11;" t ForegroundShape src/Dodge/Data/ForegroundShape.hs 12;" t FromEdge src/Dodge/Data/Room.hs 49;" C -FullRes src/Dodge/Data/Config.hs 112;" C +FullRes src/Dodge/Data/Config.hs 113;" C FullShadowFidelity src/Shape/Data.hs 19;" C FullSize src/Dodge/Data/Item/Params.hs 26;" C FullyVisible src/Dodge/Data/CamouflageStatus.hs 6;" C @@ -482,7 +482,7 @@ GenFloat src/Dodge/Data/GenFloat.hs 9;" t GenParams src/Dodge/Data/GenParams.hs 13;" t GenWorld src/Dodge/Data/GenWorld.hs 24;" t GenericFaction src/Dodge/Data/Creature/State.hs 13;" C -GeoObjShads src/Dodge/Data/Config.hs 116;" C +GeoObjShads src/Dodge/Data/Config.hs 117;" C GetTo src/Dodge/Data/ActionPlan.hs 141;" C GetToPoint src/Dodge/Data/Scenario.hs 12;" C Gib src/Dodge/Data/Prop.hs 22;" C @@ -513,7 +513,7 @@ HOMINGMODULE src/Dodge/Data/Item/Combine.hs 100;" C HOSE src/Dodge/Data/Item/Combine.hs 54;" C HP src/Dodge/Data/Creature.hs 63;" C HUD src/Dodge/Data/HUD.hs 29;" t -HalfRes src/Dodge/Data/Config.hs 112;" C +HalfRes src/Dodge/Data/Config.hs 113;" C HammerTrigger src/Dodge/Data/TriggerType.hs 10;" C HardQuit src/Dodge/Data/Universe.hs 68;" C HeavySmokeFlare src/Dodge/Data/Muzzle.hs 33;" C @@ -573,12 +573,12 @@ IncendiaryBall src/Dodge/Data/EnergyBall/Type.hs 11;" C InheritFloor src/Data/Tile.hs 12;" C Input src/Dodge/Data/Input.hs 33;" t InputScreen src/Dodge/Data/Universe.hs 92;" C -Inspect_wall src/Dodge/Data/Config.hs 105;" C +Inspect_wall src/Dodge/Data/Config.hs 106;" C Institution src/Dodge/Data/Scenario.hs 42;" t Int2 src/Geometry/Data.hs 21;" t IntID src/Dodge/Data/Universe.hs 120;" t Intention src/Dodge/Data/Creature.hs 70;" t -IntersectingRoomClipBoundaries src/Dodge/Data/Config.hs 122;" C +IntersectingRoomClipBoundaries src/Dodge/Data/Config.hs 123;" C IntroScanSF src/Dodge/Data/ComposedItem.hs 21;" C IntroScanType src/Dodge/Data/Item/Combine.hs 44;" t InvInt src/Dodge/Data/Item/Location.hs 16;" t @@ -800,7 +800,7 @@ MuzzleStopper src/Dodge/Data/Muzzle.hs 57;" C MuzzleTesla src/Dodge/Data/Muzzle.hs 43;" C MuzzleTractor src/Dodge/Data/Muzzle.hs 44;" C MuzzleUnsafeBlink src/Dodge/Data/Muzzle.hs 55;" C -Muzzle_positions src/Dodge/Data/Config.hs 109;" C +Muzzle_positions src/Dodge/Data/Config.hs 110;" C MvForward src/Dodge/Data/ActionPlan.hs 34;" C MvTurnToward src/Dodge/Data/ActionPlan.hs 33;" C MvWalking src/Dodge/Data/Creature/Misc.hs 28;" C @@ -836,17 +836,17 @@ NoItTargeting src/Dodge/Data/Item.hs 44;" C NoItemScroll src/Dodge/Data/Item.hs 39;" C NoItemZone src/Dodge/Data/Machine/Sensor.hs 31;" C NoLightFlare src/Dodge/Data/Muzzle.hs 31;" C -NoLighting src/Dodge/Data/Config.hs 119;" C +NoLighting src/Dodge/Data/Config.hs 120;" C NoMouseContext src/Dodge/Data/Input.hs 14;" C NoMvType src/Dodge/Data/Creature/Misc.hs 27;" C -NoObjShads src/Dodge/Data/Config.hs 117;" C +NoObjShads src/Dodge/Data/Config.hs 118;" C NoParams src/Dodge/Data/Item/Params.hs 13;" C NoRightButtonState src/Dodge/Data/RightButtonOptions.hs 14;" C -NoRoomClipBoundaries src/Dodge/Data/Config.hs 122;" C +NoRoomClipBoundaries src/Dodge/Data/Config.hs 123;" C NoSF src/Dodge/Data/ComposedItem.hs 29;" C NoSIDisplayMod src/Dodge/Data/SelectionList.hs 56;" C NoShadowFidelity src/Shape/Data.hs 20;" C -NoShadows src/Dodge/Data/Config.hs 118;" C +NoShadows src/Dodge/Data/Config.hs 119;" C NoSoundFilter src/Dodge/Data/WorldEffect.hs 23;" C NoSubInventory src/Dodge/Data/HUD.hs 15;" C NoTrigger src/Dodge/Data/TriggerType.hs 11;" C @@ -979,7 +979,7 @@ PathBetweenLeftRightClick src/Dodge/Data/Universe.hs 53;" C PathFromEdge src/Dodge/Data/Room.hs 77;" t PathShowType src/Dodge/Data/Universe.hs 52;" t PathTo src/Dodge/Data/ActionPlan.hs 70;" C -Pathing src/Dodge/Data/Config.hs 89;" C +Pathing src/Dodge/Data/Config.hs 90;" C Patrol src/Dodge/Data/ActionPlan.hs 132;" C PauseTimeMessage src/Dodge/Data/World.hs 86;" C PausedTimeFlow src/Dodge/Data/World.hs 82;" C @@ -1014,7 +1014,7 @@ PolyShad src/Picture/Data.hs 31;" C Polyhedra src/Polyhedra/Data.hs 13;" t Polyhedron src/Polyhedra/Data.hs 13;" C PosInf src/Dodge/Data/CardinalPoint.hs 44;" C -PosRooms src/Dodge/Tree/Shift.hs 28;" t +PosRooms src/Dodge/Tree/Shift.hs 29;" t Posture src/Dodge/Data/Creature/Stance.hs 32;" t PreloadData src/Data/Preload.hs 10;" t PrintMaterial src/Dodge/Data/AmmoType.hs 15;" C @@ -1059,7 +1059,7 @@ PutTrigger src/Dodge/Data/GenWorld.hs 47;" C PutWall src/Dodge/Data/GenWorld.hs 54;" C PutWorldUpdate src/Dodge/Data/GenWorld.hs 58;" C QFloat src/Geometry/Data.hs 50;" t -QuarterRes src/Dodge/Data/Config.hs 112;" C +QuarterRes src/Dodge/Data/Config.hs 113;" C QuicksaveSlot src/Dodge/Data/SaveSlot.hs 8;" C RAM src/Dodge/Data/Item/Combine.hs 73;" C RCommands src/Dodge/Terminal.hs 165;" C @@ -1096,13 +1096,13 @@ Reload src/Dodge/Data/ActionPlan.hs 142;" C RemoteDetonatorSF src/Dodge/Data/ComposedItem.hs 27;" C RemoteScreenSF src/Dodge/Data/ComposedItem.hs 25;" C RemoveEquipment src/Dodge/Data/RightButtonOptions.hs 33;" C -Remove_LOS src/Dodge/Data/Config.hs 90;" C +Remove_LOS src/Dodge/Data/Config.hs 91;" C RenderData src/Data/Preload/Render.hs 13;" t ReplaceEquipment src/Dodge/Data/RightButtonOptions.hs 29;" C RequireDeadCreatures src/Dodge/Data/Machine/Sensor.hs 36;" C RequireEquipment src/Dodge/Data/Machine/Sensor.hs 35;" C RequireHealth src/Dodge/Data/Machine/Sensor.hs 34;" C -ResFactor src/Dodge/Data/Config.hs 112;" t +ResFactor src/Dodge/Data/Config.hs 113;" t ResearchFacility src/Dodge/Data/Scenario.hs 62;" C ResourceFailure src/Dodge/Data/Scenario.hs 29;" C RespawnDelay src/Dodge/Data/World.hs 64;" C @@ -1120,8 +1120,8 @@ RocketHoming src/Dodge/Data/Projectile.hs 39;" t RocketSmoke src/Dodge/Data/Projectile.hs 52;" t RocketSmoke src/Dodge/Data/Cloud.hs 22;" C Room src/Dodge/Data/GenWorld.hs 127;" t -RoomClipping src/Dodge/Data/Config.hs 122;" t -RoomInt src/Dodge/Tree/Shift.hs 26;" t +RoomClipping src/Dodge/Data/Config.hs 123;" t +RoomInt src/Dodge/Tree/Shift.hs 27;" t RoomLink src/Dodge/Data/Room.hs 24;" t RoomLinkType src/Dodge/Data/Room.hs 43;" t RoomPos src/Dodge/Data/Room.hs 15;" t @@ -1183,7 +1183,7 @@ ShadNum src/Picture/Data.hs 30;" t Shader src/Shader/Data.hs 51;" t ShaderTexture src/Shader/Data.hs 102;" t ShadowFidelity src/Shape/Data.hs 19;" t -ShadowRendering src/Dodge/Data/Config.hs 115;" t +ShadowRendering src/Dodge/Data/Config.hs 116;" t Shape src/Shape/Data.hs 49;" t ShapeProp src/Dodge/Data/Prop.hs 14;" C ShapeType src/Shape/Data.hs 11;" t @@ -1196,27 +1196,27 @@ ShockwaveDirection src/Dodge/Data/Shockwave.hs 12;" t ShootAt src/Dodge/Data/ActionPlan.hs 133;" C ShortShow src/ShortShow.hs 6;" c ShortString src/ShortShow.hs 16;" t -Show_bound_box src/Dodge/Data/Config.hs 93;" C -Show_dda_test src/Dodge/Data/Config.hs 96;" C -Show_far_wall_detect src/Dodge/Data/Config.hs 99;" C -Show_mouse_click_pos src/Dodge/Data/Config.hs 108;" C +Show_bound_box src/Dodge/Data/Config.hs 94;" C +Show_dda_test src/Dodge/Data/Config.hs 97;" C +Show_far_wall_detect src/Dodge/Data/Config.hs 100;" C +Show_mouse_click_pos src/Dodge/Data/Config.hs 109;" C Show_ms_frame src/Dodge/Data/Config.hs 78;" C -Show_path_between src/Dodge/Data/Config.hs 106;" C +Show_path_between src/Dodge/Data/Config.hs 107;" C Show_sound src/Dodge/Data/Config.hs 82;" C -Show_wall_search_rays src/Dodge/Data/Config.hs 95;" C -Show_walls_near_point_cursor src/Dodge/Data/Config.hs 100;" C -Show_walls_near_segment src/Dodge/Data/Config.hs 102;" C -Show_walls_near_you src/Dodge/Data/Config.hs 101;" C -Show_writable_values src/Dodge/Data/Config.hs 107;" C -Show_zone_circ src/Dodge/Data/Config.hs 104;" C -Show_zone_near_point_cursor src/Dodge/Data/Config.hs 103;" C +Show_wall_search_rays src/Dodge/Data/Config.hs 96;" C +Show_walls_near_point_cursor src/Dodge/Data/Config.hs 101;" C +Show_walls_near_segment src/Dodge/Data/Config.hs 103;" C +Show_walls_near_you src/Dodge/Data/Config.hs 102;" C +Show_writable_values src/Dodge/Data/Config.hs 108;" C +Show_zone_circ src/Dodge/Data/Config.hs 105;" C +Show_zone_near_point_cursor src/Dodge/Data/Config.hs 104;" C ShrapnelBomb src/Dodge/Data/Payload.hs 10;" C ShrinkGunStatus src/Dodge/Data/Item/Params.hs 26;" t Shrunk src/Dodge/Data/Item/Params.hs 26;" C SideCluster src/Dodge/Data/RoomCluster.hs 13;" C SideEffect src/Dodge/Data/Universe.hs 62;" t SimpleEdge src/Dodge/Data/PathGraph.hs 43;" t -SixteenthRes src/Dodge/Data/Config.hs 112;" C +SixteenthRes src/Dodge/Data/Config.hs 113;" C Size src/Shape/Data.hs 23;" t SkiffBaySS src/Dodge/Data/Scenario.hs 108;" C SleepingQuatersSS src/Dodge/Data/Scenario.hs 90;" C @@ -1436,7 +1436,8 @@ VIOLET src/Color/Data.hs 19;" C VOLLEYGUN src/Dodge/Data/Item/Combine.hs 151;" C VertexAttribute src/Shader/Data.hs 66;" t Verx src/Picture/Data.hs 11;" t -View_boundaries src/Dodge/Data/Config.hs 87;" C +View_gr_boundaries src/Dodge/Data/Config.hs 87;" C +View_rm_boundaries src/Dodge/Data/Config.hs 88;" C ViewingDeckSS src/Dodge/Data/Scenario.hs 106;" C Vigilance src/Dodge/Data/Creature/Perception.hs 50;" t Vigilant src/Dodge/Data/Creature/Perception.hs 54;" C @@ -1465,7 +1466,7 @@ WallP src/Dodge/LevelGen/StaticWalls/Deprecated.hs 11;" t WallSound src/Dodge/Data/SoundOrigin.hs 25;" C WallStructure src/Dodge/Data/Wall/Structure.hs 10;" t WallWire src/Dodge/Data/Room.hs 55;" C -Walls_info src/Dodge/Data/Config.hs 88;" C +Walls_info src/Dodge/Data/Config.hs 89;" C War src/Dodge/Data/Scenario.hs 28;" C WarmTime src/Dodge/Data/Item/Params.hs 19;" C WarmUpCoolDown src/Dodge/Data/TriggerType.hs 14;" C @@ -1670,9 +1671,9 @@ _coordinates src/Dodge/Data/World.hs 60;" f _cpAttention src/Dodge/Data/Creature/Perception.hs 32;" f _cpAudition src/Dodge/Data/Creature/Perception.hs 35;" f _cpAwareness src/Dodge/Data/Creature/Perception.hs 33;" f -_cpCen src/Geometry/ConvexPoly.hs 25;" f -_cpPoints src/Geometry/ConvexPoly.hs 24;" f -_cpRad src/Geometry/ConvexPoly.hs 26;" f +_cpCen src/Geometry/ConvexPoly.hs 27;" f +_cpPoints src/Geometry/ConvexPoly.hs 26;" f +_cpRad src/Geometry/ConvexPoly.hs 28;" f _cpVigilance src/Dodge/Data/Creature/Perception.hs 31;" f _cpVision src/Dodge/Data/Creature/Perception.hs 34;" f _crActionPlan src/Dodge/Data/Creature.hs 51;" f @@ -1847,9 +1848,10 @@ _gibColor src/Dodge/Data/Prop.hs 22;" f _gibSize src/Dodge/Data/Prop.hs 22;" f _gnHitEffect src/Dodge/Data/Projectile.hs 31;" f _grBound src/Dodge/GameRoom.hs 15;" f -_grDir src/Dodge/GameRoom.hs 17;" f -_grLinkDirs src/Dodge/GameRoom.hs 18;" f -_grName src/Dodge/GameRoom.hs 19;" f +_grDir src/Dodge/GameRoom.hs 18;" f +_grLinkDirs src/Dodge/GameRoom.hs 19;" f +_grName src/Dodge/GameRoom.hs 20;" f +_grRmBounds src/Dodge/GameRoom.hs 16;" f _grViewpoints src/Dodge/GameRoom.hs 13;" f _grViewpointsEx src/Dodge/GameRoom.hs 14;" f _gr_cloud_shadows src/Dodge/Data/Config.hs 53;" f @@ -2117,11 +2119,11 @@ _plType src/Dodge/Data/GenWorld.hs 114;" f _playStatus src/Sound/Data.hs 15;" f _playingSounds src/Dodge/Data/World.hs 41;" f _posture src/Dodge/Data/Creature/Stance.hs 17;" f -_prBounds src/Dodge/Tree/Shift.hs 29;" f +_prBounds src/Dodge/Tree/Shift.hs 30;" f _prDraw src/Dodge/Data/Prop.hs 16;" f _prID src/Dodge/Data/Prop.hs 17;" f _prPos src/Dodge/Data/Prop.hs 15;" f -_prRooms src/Dodge/Tree/Shift.hs 30;" f +_prRooms src/Dodge/Tree/Shift.hs 31;" f _prRot src/Dodge/Data/Prop.hs 18;" f _preloadData src/Dodge/Data/Universe.hs 30;" f _pressedKeys src/Dodge/Data/Input.hs 37;" f @@ -2582,8 +2584,8 @@ ammoMagSPic src/Dodge/Item/Draw/SPic.hs 128;" f amr src/Dodge/Item/Held/Rod.hs 34;" f anRoom src/Dodge/Floor.hs 116;" f analyser src/Dodge/Placement/Instance/Analyser.hs 8;" f -analyserByDoor src/Dodge/Room/LasTurret.hs 110;" f -analyserByNthLink src/Dodge/Room/LasTurret.hs 94;" f +analyserByDoor src/Dodge/Room/LasTurret.hs 111;" f +analyserByNthLink src/Dodge/Room/LasTurret.hs 95;" f andOrRegex src/Dodge/DisplayInventory.hs 78;" f angleBetween src/Geometry.hs 158;" f angleVV src/Geometry/Vector.hs 58;" f @@ -2591,7 +2593,7 @@ angleVV3 src/Geometry/Vector3D.hs 122;" f anyUnusedSpot src/Dodge/PlacementSpot.hs 68;" f anythingHitCirc src/Dodge/Base/Collide.hs 342;" f applyCME src/Dodge/HeldUse.hs 372;" f -applyClip src/Dodge/Debug.hs 138;" f +applyClip src/Dodge/Debug.hs 139;" f applyCreatureDamage src/Dodge/Creature/Damage.hs 14;" f applyEventIO src/Loop.hs 90;" f applyGravityPU src/Dodge/Projectile/Update.hs 41;" f @@ -2601,8 +2603,8 @@ applyMagnetsToBul src/Dodge/Bullet.hs 32;" f applyPastDamages src/Dodge/Creature/State.hs 49;" f applyPosition src/Sound.hs 113;" f applyRecoil src/Dodge/HeldUse.hs 462;" f -applyResFactor src/Dodge/Data/Config.hs 125;" f -applyResFactorF src/Dodge/Data/Config.hs 134;" f +applyResFactor src/Dodge/Data/Config.hs 126;" f +applyResFactorF src/Dodge/Data/Config.hs 135;" f applySetTerminalString src/Dodge/Debug/Terminal.hs 83;" f applySidePush src/Dodge/HeldUse.hs 562;" f applySoundCME src/Dodge/HeldUse.hs 452;" f @@ -2748,7 +2750,7 @@ boxXYZ src/Polyhedra.hs 91;" f boxXYZnobase src/Polyhedra.hs 77;" f brainHat src/Dodge/Item/Equipment.hs 62;" f branchRectWith src/Dodge/Room/Branch.hs 16;" f -branchWith src/Dodge/Room/Room.hs 78;" f +branchWith src/Dodge/Room/Room.hs 79;" f bright src/Color.hs 147;" f brightX src/Color.hs 143;" f btSPic src/Dodge/Render/ShapePicture.hs 160;" f @@ -2766,7 +2768,7 @@ bulletWeapons src/Dodge/Combine/Combinations.hs 248;" f burstRifle src/Dodge/Item/Held/Cane.hs 30;" f buttonFlip src/Dodge/Button/Event.hs 17;" f buzzS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 593;" f -cChasm src/Dodge/Room/Tutorial.hs 148;" f +cChasm src/Dodge/Room/Tutorial.hs 149;" f cFilledRect src/Dodge/CharacterEnums.hs 6;" f cWireRect src/Dodge/CharacterEnums.hs 10;" f calcSmoothScroll src/Dodge/SmoothScroll.hs 11;" f @@ -2782,7 +2784,7 @@ cardinalBetweenAdj src/Dodge/Base/CardinalPoint.hs 28;" f cardinalVectors src/Dodge/FloorItem.hs 24;" f cdtPropagateFold src/Dodge/DoubleTree.hs 407;" f ceilingTo src/Geometry/Zone.hs 15;" f -cenLasTur src/Dodge/Room/LasTurret.hs 34;" f +cenLasTur src/Dodge/Room/LasTurret.hs 35;" f centerText src/Picture/Base.hs 176;" f centerVaultExplosiveExit src/Dodge/Room/NoNeedWeapon.hs 20;" f centerVaultRoom src/Dodge/Room/Procedural.hs 269;" f @@ -2802,8 +2804,8 @@ chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 121;" f chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 32;" f chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 36;" f chasmRotate src/Dodge/Creature/Update.hs 173;" f -chasmSimpleMaze src/Dodge/Room/Tutorial.hs 309;" f -chasmSpitTerminal src/Dodge/Room/Tutorial.hs 280;" f +chasmSimpleMaze src/Dodge/Room/Tutorial.hs 310;" f +chasmSpitTerminal src/Dodge/Room/Tutorial.hs 281;" 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 @@ -2921,19 +2923,20 @@ contToIDCont src/Dodge/LevelGen/PlacementHelper.hs 58;" f continueTerminal src/Dodge/Update/Input/InGame.hs 407;" f convexHull src/Geometry/Polygon.hs 150;" f convexHullSafe src/Geometry/Polygon.hs 157;" f -convexPolysOverlap src/Geometry/ConvexPoly.hs 46;" f +convexPolysOverlap src/Geometry/ConvexPoly.hs 48;" f +convexPolysOverlapWitness src/Geometry/ConvexPoly.hs 55;" f coolMachinePistol src/Dodge/Creature/State.hs 102;" f coolMinigun src/Dodge/Creature/State.hs 95;" f copier src/Dodge/Item/Scope.hs 94;" f copierItemUpdate src/Dodge/Creature/State.hs 131;" f copyItemToFloor src/Dodge/FloorItem.hs 14;" f -corDoor src/Dodge/Room/Room.hs 398;" f +corDoor src/Dodge/Room/Room.hs 404;" f cornerList src/Preload/Render.hs 236;" f corpseOrGib src/Dodge/Creature/Update.hs 98;" f corridor src/Dodge/Room/Corridor.hs 17;" f corridorBoss src/Dodge/LockAndKey.hs 133;" f -corridorN src/Dodge/Room/Corridor.hs 57;" f -corridorWallN src/Dodge/Room/Corridor.hs 76;" f +corridorN src/Dodge/Room/Corridor.hs 58;" f +corridorWallN src/Dodge/Room/Corridor.hs 77;" f crAdd src/Dodge/Room/RezBox.hs 116;" f crAwayFromPost src/Dodge/Creature/Test.hs 85;" f crBlips src/Dodge/RadarSweep.hs 88;" f @@ -2993,7 +2996,7 @@ createProjectile src/Dodge/HeldUse.hs 1271;" f createProjectileR src/Dodge/HeldUse.hs 1220;" f createShell src/Dodge/Projectile/Create.hs 21;" f createShieldWall src/Dodge/Item/BackgroundEffect.hs 53;" f -createUnusedLinkPos src/Dodge/Tree/Shift.hs 124;" f +createUnusedLinkPos src/Dodge/Tree/Shift.hs 128;" f createWall src/Dodge/Wall/Create.hs 8;" f creatureDisplayText src/Dodge/Creature/Picture/Awareness.hs 12;" f creatureShootLaser src/Dodge/HeldUse.hs 840;" f @@ -3001,10 +3004,10 @@ creatureShootPulseLaser src/Dodge/HeldUse.hs 871;" f creatureTurnTo src/Dodge/Creature/Impulse/Movement.hs 60;" f creatureTurnToward src/Dodge/Creature/Impulse/Movement.hs 81;" f creatureTurnTowardDir src/Dodge/Creature/Impulse/Movement.hs 70;" f -critDeadEnd src/Dodge/Room/Room.hs 256;" f -critInDeadEnd src/Dodge/Room/Room.hs 252;" f -critsPillarRoom src/Dodge/Room/Room.hs 403;" f -critsRoom src/Dodge/Room/Room.hs 411;" f +critDeadEnd src/Dodge/Room/Room.hs 257;" f +critInDeadEnd src/Dodge/Room/Room.hs 253;" f +critsPillarRoom src/Dodge/Room/Room.hs 409;" f +critsRoom src/Dodge/Room/Room.hs 417;" f crixsNearSeg src/Dodge/Zoning/Creature.hs 30;" f crossPic src/Dodge/Render/Label.hs 28;" f crossProd src/Geometry/Vector3D.hs 41;" f @@ -3071,7 +3074,7 @@ dbArgChain src/Dodge/Base.hs 170;" f dbwMuzzles src/Dodge/HeldUse.hs 325;" f deZoneIX src/Dodge/Zoning/Base.hs 91;" f deZoneWall src/Dodge/Zoning/Wall.hs 70;" f -deadEndRoom src/Dodge/Room/Room.hs 259;" f +deadEndRoom src/Dodge/Room/Room.hs 260;" f deadFeet src/Dodge/Creature/Picture.hs 68;" f deadRot src/Dodge/Creature/Picture.hs 86;" f deadScalp src/Dodge/Creature/Picture.hs 81;" f @@ -3081,17 +3084,17 @@ debrisSPic src/Dodge/Prop/Draw.hs 16;" f debrisSize src/Dodge/Block/Debris.hs 83;" f debugEvent src/Dodge/Debug.hs 44;" f debugEvents src/Dodge/Debug.hs 29;" f -debugGet src/Dodge/Debug.hs 82;" f +debugGet src/Dodge/Debug.hs 83;" f debugItem src/Dodge/Debug.hs 47;" f debugMenu src/Dodge/Menu.hs 122;" f debugMenuOptions src/Dodge/Menu.hs 128;" f -debugMouseClickPos src/Dodge/Debug.hs 153;" f -debugOn src/Dodge/Data/Config.hs 176;" f -debugPutDraw src/Dodge/Debug.hs 103;" f -debugPutItems src/Dodge/Debug.hs 86;" f -debugPutN src/Dodge/Debug.hs 92;" f -debugShowPath src/Dodge/Debug.hs 113;" f -debugWritableValues src/Dodge/Debug.hs 126;" f +debugMouseClickPos src/Dodge/Debug.hs 154;" f +debugOn src/Dodge/Data/Config.hs 177;" f +debugPutDraw src/Dodge/Debug.hs 104;" f +debugPutItems src/Dodge/Debug.hs 87;" f +debugPutN src/Dodge/Debug.hs 93;" f +debugShowPath src/Dodge/Debug.hs 114;" f +debugWritableValues src/Dodge/Debug.hs 127;" f decodeSensorType src/Dodge/Terminal.hs 81;" f decomposeSelfTree src/Dodge/Tree/Compose.hs 62;" f decomposeTree src/Dodge/Tree/Compose.hs 59;" f @@ -3123,7 +3126,7 @@ defaultCWGen src/Dodge/Default/World.hs 62;" f defaultCWorld src/Dodge/Default/World.hs 87;" f defaultChaseMvType src/Dodge/Creature/MoveType.hs 25;" f defaultClusterStatus src/Dodge/Default/Room.hs 37;" f -defaultConfig src/Dodge/Data/Config.hs 151;" f +defaultConfig src/Dodge/Data/Config.hs 152;" f defaultCreature src/Dodge/Default/Creature.hs 12;" f defaultCreatureMemory src/Dodge/Default/Creature.hs 66;" f defaultCrystalWall src/Dodge/Default/Wall.hs 35;" f @@ -3196,7 +3199,7 @@ dist src/Geometry/Vector.hs 185;" f dist3 src/Geometry/Vector3D.hs 101;" f distributeAmmoToItem src/Dodge/WorldEffect.hs 152;" f distributeAmmoToYou src/Dodge/WorldEffect.hs 140;" f -distributerRoom src/Dodge/Room/Room.hs 420;" f +distributerRoom src/Dodge/Room/Room.hs 426;" f divTo src/Geometry/Zone.hs 8;" f divideCircle src/Geometry.hs 321;" f divideDoorPane src/Dodge/Placement/Instance/Door.hs 65;" f @@ -3221,8 +3224,8 @@ doCrWdAc src/Dodge/CreatureEffect.hs 47;" f doDamage src/Dodge/Creature/State.hs 43;" f doDeathToggle src/Dodge/WorldEffect.hs 101;" f doDeathTriggers src/Dodge/WorldEffect.hs 94;" f -doDebugGet src/Dodge/Debug.hs 106;" f -doDebugPut src/Dodge/Debug.hs 95;" f +doDebugGet src/Dodge/Debug.hs 107;" f +doDebugPut src/Dodge/Debug.hs 96;" f doDebugTest src/Dodge/Update/Input/DebugTest.hs 23;" f doDebugTest2 src/Dodge/Update/Input/DebugTest.hs 38;" f doDebugTestF10 src/Dodge/Update/Input/DebugTest.hs 66;" f @@ -3274,10 +3277,11 @@ doWorldEvents src/Dodge/Update.hs 463;" f doWorldPos src/Dodge/WorldPos.hs 10;" f door src/Dodge/Room/Door.hs 13;" f doorBetween src/Dodge/Placement/Instance/Door.hs 38;" f +doorCor src/Dodge/Room/Room.hs 399;" f doorLerp src/Dodge/Door.hs 40;" f dotV src/Geometry/Vector.hs 76;" f dotV3 src/Geometry/Vector3D.hs 119;" f -doubleCorridorBarrels src/Dodge/Room/Room.hs 289;" f +doubleCorridorBarrels src/Dodge/Room/Room.hs 290;" f doublePair src/Geometry.hs 162;" f doublePairSet src/Geometry.hs 166;" f doubleTreeToIndentList src/Dodge/DoubleTree.hs 129;" f @@ -3290,7 +3294,7 @@ drawArrowDown src/Dodge/Render/Picture.hs 219;" f drawBaseMachine src/Dodge/Machine/Draw.hs 75;" f drawBlip src/Dodge/RadarBlip.hs 16;" f drawBlock src/Dodge/Render/ShapePicture.hs 80;" f -drawBoundingBox src/Dodge/Debug/Picture.hs 359;" f +drawBoundingBox src/Dodge/Debug/Picture.hs 368;" f drawBullet src/Dodge/Render/ShapePicture.hs 166;" f drawButton src/Dodge/Button/Draw.hs 10;" f drawCPUShadows src/Dodge/Render/Shadow.hs 19;" f @@ -3300,10 +3304,10 @@ drawCollisionTest src/Dodge/Debug/Picture.hs 103;" f drawCombFilter src/Dodge/Render/Picture.hs 267;" f drawCombineInventory src/Dodge/Render/HUD.hs 190;" f drawConcurrentMessage src/Dodge/Render/Picture.hs 72;" f -drawCoord src/Dodge/Debug/Picture.hs 387;" f +drawCoord src/Dodge/Debug/Picture.hs 396;" f drawCountMod src/Render.hs 231;" f -drawCrInfo src/Dodge/Debug.hs 177;" f -drawCrInfo' src/Dodge/Debug.hs 172;" f +drawCrInfo src/Dodge/Debug.hs 178;" f +drawCrInfo' src/Dodge/Debug.hs 173;" f drawCreature src/Dodge/Render/ShapePicture.hs 102;" f drawCreatureDisplayTexts src/Dodge/Debug/Picture.hs 199;" f drawCross src/Dodge/Render/Label.hs 25;" f @@ -3312,7 +3316,7 @@ drawCursorAt src/Dodge/Render/List.hs 73;" f drawCursorByTerminalStatus src/Dodge/Render/Picture.hs 137;" f drawDDATest src/Dodge/Debug/Picture.hs 304;" f drawDamSensor src/Dodge/Machine/Draw.hs 38;" f -drawDebug src/Dodge/Debug.hs 215;" f +drawDebug src/Dodge/Debug.hs 216;" f drawDrag src/Dodge/Render/Picture.hs 198;" f drawDragDrop src/Dodge/Render/Picture.hs 227;" f drawDragPickup src/Dodge/Render/Picture.hs 236;" f @@ -3357,11 +3361,11 @@ drawMenuOrHUD src/Dodge/Render/Picture.hs 67;" f drawMenuScreen src/Dodge/Render/MenuScreen.hs 18;" f drawMouseCursor src/Dodge/Render/Picture.hs 83;" f drawMouseOver src/Dodge/Render/HUD.hs 115;" f -drawMousePosition src/Dodge/Debug/Picture.hs 377;" f +drawMousePosition src/Dodge/Debug/Picture.hs 386;" f drawOptions src/Dodge/Render/MenuScreen.hs 36;" f drawPathBetween src/Dodge/Debug/Picture.hs 202;" f drawPathEdge src/Dodge/Debug/Picture.hs 261;" f -drawPathing src/Dodge/Debug/Picture.hs 408;" f +drawPathing src/Dodge/Debug/Picture.hs 417;" f drawPlus src/Dodge/Render/Picture.hs 163;" f drawPointLabel src/Dodge/Render/Label.hs 13;" f drawProjectile src/Dodge/Projectile/Draw.hs 13;" f @@ -3403,7 +3407,7 @@ drawWallsNearCursor src/Dodge/Debug/Picture.hs 233;" f drawWallsNearSegment src/Dodge/Debug/Picture.hs 130;" f drawWallsNearYou src/Dodge/Debug/Picture.hs 223;" f drawWeapon src/Dodge/Creature/Volition.hs 15;" f -drawWlIDs src/Dodge/Debug/Picture.hs 395;" f +drawWlIDs src/Dodge/Debug/Picture.hs 404;" f drawZone src/Dodge/Debug/Picture.hs 152;" f drawZoneCirc src/Dodge/Debug/Picture.hs 293;" f drawZoneCol src/Dodge/Debug/Picture.hs 149;" f @@ -3436,7 +3440,7 @@ ebDamage src/Dodge/EnergyBall.hs 85;" f ebEffect src/Dodge/EnergyBall.hs 45;" f ebFlicker src/Dodge/EnergyBall.hs 70;" f ebtToDamage src/Dodge/EnergyBall.hs 93;" f -edgeToPic src/Dodge/Debug/Picture.hs 417;" f +edgeToPic src/Dodge/Debug/Picture.hs 426;" f effectOnEquip src/Dodge/Euse.hs 89;" f effectOnRemove src/Dodge/Euse.hs 79;" f eitType src/Dodge/Data/EquipType.hs 15;" f @@ -3547,7 +3551,7 @@ floorTo src/Geometry/Zone.hs 12;" f floorWire src/Dodge/Wire.hs 13;" f foamSprayFadeOutS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 777;" f foamSprayLoopS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 823;" f -foldMTRS src/Dodge/Room/Tutorial.hs 94;" f +foldMTRS src/Dodge/Room/Tutorial.hs 95;" f foldPairs src/ListHelp.hs 37;" f foldrWhileArb src/ListHelp.hs 111;" f followImpulse src/Dodge/Creature/Impulse.hs 25;" f @@ -3609,8 +3613,8 @@ getCloseObj src/Dodge/Update/Input/InGame.hs 539;" f getCommand src/Dodge/Terminal.hs 61;" f getCommands src/Dodge/Terminal.hs 58;" f getCrMoveSpeed src/Dodge/Creature/Statistics.hs 50;" f -getCrsFromRooms src/Dodge/Room/Tutorial.hs 461;" f -getCrsFromRooms' src/Dodge/Room/Tutorial.hs 448;" f +getCrsFromRooms src/Dodge/Room/Tutorial.hs 462;" f +getCrsFromRooms' src/Dodge/Room/Tutorial.hs 449;" f getDebugMouseOver src/Dodge/Update.hs 424;" f getDistortions src/Dodge/Render.hs 443;" f getEdgesCrossing src/Dodge/Path.hs 37;" f @@ -3627,13 +3631,13 @@ getNodePos src/Dodge/Path.hs 34;" f getPJStabiliser src/Dodge/HeldUse.hs 1246;" f getPretty src/AesonHelp.hs 8;" f getPromptTM src/Dodge/Terminal/Type.hs 3;" f -getRoomsFromInts src/Dodge/Room/Tutorial.hs 444;" f +getRoomsFromInts src/Dodge/Room/Tutorial.hs 445;" f getRootItemBounds src/Dodge/Render/HUD.hs 106;" f getRootItemInvID src/Dodge/Inventory/Location.hs 35;" f getSelectedCloseObj src/Dodge/SelectedClose.hs 14;" f getSmoothScrollValue src/Dodge/SmoothScroll.hs 21;" f getSplitString src/Dodge/Debug/Terminal.hs 129;" f -getTiles src/Dodge/Layout.hs 199;" f +getTiles src/Dodge/Layout.hs 200;" f getViewpoints src/Dodge/Viewpoints.hs 29;" f getVolleyBurst src/Dodge/HeldUse.hs 128;" f getWallPathing src/Dodge/Wall/Pathing.hs 7;" f @@ -3651,8 +3655,8 @@ glassShat1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 697;" f glassShat2S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 707;" f glassShat3S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 711;" f glassShat4S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 687;" f -glassSwitchBack src/Dodge/Room/Room.hs 81;" f -glassSwitchBackCrits src/Dodge/Room/Room.hs 115;" f +glassSwitchBack src/Dodge/Room/Room.hs 82;" f +glassSwitchBackCrits src/Dodge/Room/Room.hs 116;" f glauncherPic src/Dodge/Item/Draw/SPic.hs 402;" f gluintSize src/Shader/Parameters.hs 25;" f goToPostStrat src/Dodge/Creature/Strategy.hs 10;" f @@ -3712,8 +3716,8 @@ headLampShape src/Dodge/Item/Draw/SPic.hs 423;" f headMap src/Dodge/DoubleTree.hs 249;" f headPQ src/Dodge/Creature/HandPos.hs 116;" f healS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 627;" f -healthAnalyserByDoor src/Dodge/Room/LasTurret.hs 91;" f -healthTest src/Dodge/Room/LasTurret.hs 113;" f +healthAnalyserByDoor src/Dodge/Room/LasTurret.hs 92;" f +healthTest src/Dodge/Room/LasTurret.hs 114;" f heightWallPS src/Dodge/Placement/Instance/Wall.hs 24;" f heldAimStance src/Dodge/Item/AimStance.hs 24;" f heldAimZoom src/Dodge/Update/Camera.hs 157;" f @@ -3936,26 +3940,27 @@ justify src/Justify.hs 9;" f k src/ShortShow.hs 48;" f k' src/ShortShow.hs 48;" f keyCard src/Dodge/Item/Held/Utility.hs 20;" f -keyCardAnalyserByDoor src/Dodge/Room/LasTurret.hs 88;" f -keyCardRoomRunPast src/Dodge/Room/LasTurret.hs 76;" f +keyCardAnalyserByDoor src/Dodge/Room/LasTurret.hs 89;" f +keyCardRoomRunPast src/Dodge/Room/LasTurret.hs 77;" f keyCardRunPastRand src/Dodge/LockAndKey.hs 36;" f keyPic src/Dodge/Item/Draw/SPic.hs 439;" f -keyholeCorridor src/Dodge/Room/Corridor.hs 44;" f +keyholeCorridor src/Dodge/Room/Corridor.hs 45;" f knifeS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 741;" f -lChasm src/Dodge/Room/Tutorial.hs 157;" f +lChasm src/Dodge/Room/Tutorial.hs 158;" f lConnect src/Dodge/Render/Connectors.hs 43;" f lConnectCol src/Dodge/Render/Connectors.hs 46;" f lConnectMulti src/Dodge/Render/Connectors.hs 51;" f lShape src/Dodge/Placement/Instance/LightSource.hs 54;" f lamp src/Dodge/Creature/Lamp.hs 18;" f lampCrSPic src/Dodge/Render/ShapePicture.hs 116;" f -lasCenRunClose src/Dodge/Room/LasTurret.hs 144;" f -lasCenSensEdge src/Dodge/Room/LasTurret.hs 132;" f +lasCenRunClose src/Dodge/Room/LasTurret.hs 173;" f +lasCenRunClose' src/Dodge/Room/LasTurret.hs 145;" f +lasCenSensEdge src/Dodge/Room/LasTurret.hs 133;" f lasGunPic src/Dodge/Item/Draw/SPic.hs 414;" f lasPulseS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 731;" f -lasSensorTurretTest src/Dodge/Room/LasTurret.hs 125;" f -lasTunnel src/Dodge/Room/LasTurret.hs 172;" f -lasTunnelRunPast src/Dodge/Room/LasTurret.hs 213;" f +lasSensorTurretTest src/Dodge/Room/LasTurret.hs 126;" f +lasTunnel src/Dodge/Room/LasTurret.hs 198;" f +lasTunnelRunPast src/Dodge/Room/LasTurret.hs 239;" f lasTurret src/Dodge/Placement/Instance/Turret.hs 35;" f laser src/Dodge/Item/Held/BatteryGuns.hs 34;" f lastMap src/Dodge/DoubleTree.hs 253;" f @@ -3989,8 +3994,8 @@ legsSPic src/Dodge/Item/Draw/SPic.hs 448;" f lerpP2A src/Dodge/ShiftPoint.hs 14;" f liShape src/Dodge/Placement/Instance/LightSource.hs 79;" f light src/Color.hs 131;" f -lightSensByDoor src/Dodge/Room/LasTurret.hs 61;" f -lightSensInsideDoor src/Dodge/Room/LasTurret.hs 49;" f +lightSensByDoor src/Dodge/Room/LasTurret.hs 62;" f +lightSensInsideDoor src/Dodge/Room/LasTurret.hs 50;" f lightSensor src/Dodge/Placement/Instance/Sensor.hs 26;" f lightsToRender src/Dodge/Render/Lights.hs 14;" f lightx4 src/Color.hs 155;" f @@ -4187,9 +4192,9 @@ mglCreate src/GLHelp.hs 8;" f mglDelete src/GLHelp.hs 14;" f midBarDecoration src/Dodge/Placement/TopDecoration.hs 23;" f midBounds src/Dodge/Room/Foreground.hs 150;" f -midChasm src/Dodge/Room/Tutorial.hs 180;" f -midChasmPlatform src/Dodge/Room/Tutorial.hs 199;" f -midChasmSpit src/Dodge/Room/Tutorial.hs 253;" f +midChasm src/Dodge/Room/Tutorial.hs 181;" f +midChasmPlatform src/Dodge/Room/Tutorial.hs 200;" f +midChasmSpit src/Dodge/Room/Tutorial.hs 254;" f midPad src/Padding.hs 27;" f midPadL src/Padding.hs 33;" f midPoint src/Geometry.hs 83;" f @@ -4203,7 +4208,7 @@ miniGunX src/Dodge/Item/Held/Cane.hs 33;" f miniGunXPict src/Dodge/Item/Draw/SPic.hs 375;" f miniGunXPictItem src/Dodge/Item/Draw/SPic.hs 367;" f miniS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 653;" f -miniTree2 src/Dodge/Room/Room.hs 122;" f +miniTree2 src/Dodge/Room/Room.hs 123;" f minimumOn src/FoldlHelp.hs 14;" f mirrorXAxis src/Geometry/Polygon.hs 76;" f mirrorxz src/Picture/Base.hs 330;" f @@ -4352,14 +4357,15 @@ overrideMeleeCloseTarget src/Dodge/Creature/ReaderUpdate.hs 35;" f overwriteLabel src/Dodge/Tree/Compose.hs 32;" f p src/ShortShow.hs 48;" f pContID src/Dodge/LevelGen/PlacementHelper.hs 15;" f -pairPolyPointsIntersect src/Geometry/ConvexPoly.hs 68;" f +pairPolyPointsIntersect src/Geometry/ConvexPoly.hs 93;" f +pairPolyPointsIntersectWitness src/Geometry/ConvexPoly.hs 101;" f pairsToIncGraph src/Dodge/Path.hs 94;" f pairsToIncidence src/Dodge/Graph.hs 20;" f pairsToSCC src/Dodge/Graph.hs 32;" f paletteToColor src/Color.hs 85;" f parseItem src/Dodge/Debug/Terminal.hs 62;" f parseNum src/Dodge/Debug/Terminal.hs 77;" f -passthroughLockKeyLists src/Dodge/Room/Tutorial.hs 523;" f +passthroughLockKeyLists src/Dodge/Room/Tutorial.hs 524;" f pathConnected src/Dodge/Room/CheckConsistency.hs 13;" f pathEdgeObstructed src/Dodge/Path.hs 66;" f pauseAndFloatCam src/Dodge/Camera.hs 10;" f @@ -4390,7 +4396,7 @@ pincerP'' src/Dodge/Creature/Boid.hs 106;" f pincerP''' src/Dodge/Creature/Boid.hs 77;" f pipe src/Dodge/Item/Craftable.hs 29;" f pistol src/Dodge/Item/Held/Stick.hs 18;" f -pistolerRoom src/Dodge/Room/Room.hs 343;" f +pistolerRoom src/Dodge/Room/Room.hs 344;" f pjRemoteSetDirection src/Dodge/Projectile/Update.hs 196;" f plBlock src/Dodge/Placement/PlaceSpot/Block.hs 24;" f plDoor src/Dodge/Placement/PlaceSpot/TriggerDoor.hs 12;" f @@ -4428,7 +4434,7 @@ pointerToItem src/Dodge/Item/Location.hs 39;" f pointerToItemID src/Dodge/Item/Location.hs 42;" f pointerYourRootItem src/Dodge/Item/Location.hs 33;" f pointerYourSelectedItem src/Dodge/Item/Location.hs 26;" f -pointsToPoly src/Geometry/ConvexPoly.hs 35;" f +pointsToPoly src/Geometry/ConvexPoly.hs 37;" f poisonSPic src/Dodge/Creature/Update.hs 130;" f poisonSprayer src/Dodge/Item/Held/SprayGuns.hs 17;" f poke34 src/Shader/Poke.hs 509;" f @@ -4463,14 +4469,16 @@ pokeWall src/Shader/Poke.hs 80;" f pokeWallsWindows src/Shader/Poke.hs 52;" f poly3 src/Picture/Base.hs 76;" f poly3Col src/Picture/Base.hs 80;" f -polyChasm src/Dodge/Room/Tutorial.hs 293;" f -polyChasmC src/Dodge/Room/Tutorial.hs 302;" f +polyChasm src/Dodge/Room/Tutorial.hs 294;" f +polyChasmC src/Dodge/Room/Tutorial.hs 303;" f polyCirc src/Shape.hs 47;" f polyCircx src/Shape.hs 52;" f polyCornerDist src/Geometry/Polygon.hs 69;" f polyOrthDist src/Geometry/Polygon.hs 59;" f -polyPointsIntersect src/Geometry/ConvexPoly.hs 60;" f -polyPointsOverlap src/Geometry/ConvexPoly.hs 53;" f +polyPointsIntersect src/Geometry/ConvexPoly.hs 77;" f +polyPointsIntersectWitness src/Geometry/ConvexPoly.hs 85;" f +polyPointsOverlap src/Geometry/ConvexPoly.hs 62;" f +polyPointsOverlapWitness src/Geometry/ConvexPoly.hs 70;" f polyToEdges src/Polyhedra.hs 125;" f polyToGeoRender src/Polyhedra.hs 134;" f polyToPics src/Polyhedra.hs 119;" f @@ -4482,9 +4490,9 @@ polygonCol src/Picture/Base.hs 70;" f polygonWire src/Picture/Base.hs 59;" f polysToPic src/Polyhedra.hs 122;" f popScreen src/Dodge/Menu/PushPop.hs 6;" f -posRms src/Dodge/Tree/Shift.hs 44;" f +posRms src/Dodge/Tree/Shift.hs 45;" f posSelSecYint src/Dodge/SelectionSections.hs 147;" f -positionRoomsFromTree src/Dodge/Tree/Shift.hs 35;" f +positionRoomsFromTree src/Dodge/Tree/Shift.hs 36;" f postGenerationProcessing src/Dodge/LevelGen.hs 31;" f postUniverseLoadSideEffect src/Dodge/WorldLoad.hs 14;" f postWorldLoad src/Dodge/WorldLoad.hs 18;" f @@ -4504,11 +4512,11 @@ prettyDT src/Dodge/DoubleTree.hs 258;" f prettyLDT src/Dodge/DoubleTree.hs 263;" f prettyShort src/AesonHelp.hs 11;" f primeS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 645;" f -printColumnTitles src/Dodge/Tree/Shift.hs 149;" f -printColumns src/Dodge/Tree/Shift.hs 139;" f -printInfo src/Dodge/Tree/Shift.hs 152;" f -printInfoCheckNum src/Dodge/Tree/Shift.hs 161;" f -printPartialColumns src/Dodge/Tree/Shift.hs 142;" f +printColumnTitles src/Dodge/Tree/Shift.hs 153;" f +printColumns src/Dodge/Tree/Shift.hs 143;" f +printInfo src/Dodge/Tree/Shift.hs 156;" f +printInfoCheckNum src/Dodge/Tree/Shift.hs 165;" f +printPartialColumns src/Dodge/Tree/Shift.hs 146;" f printPoint src/Dodge/Debug/Picture.hs 35;" f printRotPoint src/Dodge/Debug/Picture.hs 38;" f prismBox src/Shape.hs 74;" f @@ -4655,7 +4663,7 @@ removeAimPosture src/Dodge/Creature/YourControl.hs 159;" f removeAmmoFromMag src/Dodge/HeldUse.hs 905;" f removeDot src/ShortShow.hs 44;" f removeInverseWalls src/Dodge/LevelGen/StaticWalls.hs 25;" f -removeLights src/Dodge/Room/Tutorial.hs 359;" f +removeLights src/Dodge/Room/Tutorial.hs 360;" f removeShieldWall src/Dodge/Item/BackgroundEffect.hs 71;" f removeWallsInPolygon src/Dodge/LevelGen/StaticWalls.hs 182;" f renderDataResizeUpdate src/Preload/Update.hs 27;" f @@ -4714,15 +4722,15 @@ rmInLinks src/Dodge/RoomLink.hs 155;" f rmInvItem src/Dodge/Inventory.hs 74;" f rmLinksOfType src/Dodge/RoomLink.hs 152;" f rmOutLinks src/Dodge/RoomLink.hs 155;" f -roomC src/Dodge/Room/Room.hs 49;" f -roomCCrits src/Dodge/Room/Room.hs 284;" f -roomCenterPillar src/Dodge/Room/Room.hs 135;" f +roomC src/Dodge/Room/Room.hs 50;" f +roomCCrits src/Dodge/Room/Room.hs 285;" f +roomCenterPillar src/Dodge/Room/Room.hs 136;" f roomCritLS src/Dodge/Room/RunPast.hs 24;" f roomCross src/Dodge/Room/Boss.hs 79;" f roomGlassOctogon src/Dodge/Room/Boss.hs 22;" f -roomMiniIntro src/Dodge/Room/Room.hs 130;" f +roomMiniIntro src/Dodge/Room/Room.hs 131;" f roomNgon src/Dodge/Room/Ngon.hs 16;" f -roomPadCut src/Dodge/Room/Room.hs 70;" f +roomPadCut src/Dodge/Room/Room.hs 71;" f roomPillars src/Dodge/Room/Pillar.hs 106;" f roomPillarsContaining src/Dodge/Room/Containing.hs 39;" f roomPillarsPassage src/Dodge/Room/Pillar.hs 93;" f @@ -4841,7 +4849,7 @@ sensorReqToString src/Dodge/Machine/Update.hs 252;" f sensorRoom src/Dodge/Room/SensorDoor.hs 26;" f sensorRoomRunPast src/Dodge/Room/SensorDoor.hs 46;" f sensorSPic src/Dodge/Machine/Draw.hs 99;" f -sensorTut src/Dodge/Room/Tutorial.hs 470;" f +sensorTut src/Dodge/Room/Tutorial.hs 471;" f sensorTypeDamages src/Dodge/Machine/Update.hs 298;" f sensorTypeDamages src/Dodge/Wall/Damage.hs 91;" f sentinelAI src/Dodge/Creature/SentinelAI.hs 20;" f @@ -4850,7 +4858,7 @@ sentinelFireType src/Dodge/Creature/SentinelAI.hs 49;" f setAimPosture src/Dodge/Creature/YourControl.hs 145;" f setChannelPos src/Sound.hs 152;" f setClickWorldPos src/Dodge/Update.hs 109;" f -setClip src/Dodge/Debug.hs 201;" f +setClip src/Dodge/Debug.hs 202;" f setDepth src/Picture/Base.hs 120;" f setDirPS src/Dodge/PlacementSpot.hs 51;" f setFallback src/Dodge/PlacementSpot.hs 127;" f @@ -4868,7 +4876,7 @@ setOutLinks src/Dodge/RoomLink.hs 50;" f setOutLinksByType src/Dodge/RoomLink.hs 77;" f setOutLinksPD src/Dodge/RoomLink.hs 97;" f setRBCreatureTargeting src/Dodge/Creature/State.hs 290;" f -setRoomInt src/Dodge/Room/Tutorial.hs 101;" f +setRoomInt src/Dodge/Room/Tutorial.hs 102;" f setSelWhileDragging src/Dodge/Update/Input/InGame.hs 342;" f setSelectionListRestriction src/Dodge/Update/Input/ScreenLayer.hs 97;" f setShaderSource src/Shader/Compile.hs 121;" f @@ -4877,7 +4885,7 @@ setSoundVolume src/Sound.hs 159;" f setTargetMv src/Dodge/Creature/ReaderUpdate.hs 83;" f setTile src/Dodge/Layout.hs 70;" f setTiles src/Dodge/Layout.hs 67;" f -setTreeInts src/Dodge/Room/Tutorial.hs 108;" f +setTreeInts src/Dodge/Room/Tutorial.hs 109;" f setViewDistance src/Dodge/Update/Camera.hs 246;" f setViewPos src/Dodge/Creature/ReaderUpdate.hs 69;" f setViewport src/Dodge/Render.hs 448;" f @@ -4938,10 +4946,10 @@ shootShatter src/Dodge/Item/Weapon/Shatter.hs 12;" f shootTeslaArc src/Dodge/HeldUse.hs 1181;" f shootTillEmpty src/Dodge/Creature/Volition.hs 19;" f shootTractorBeam src/Dodge/HeldUse.hs 819;" f -shootersRoom src/Dodge/Room/Room.hs 337;" f -shootersRoom' src/Dodge/Room/Room.hs 304;" f -shootersRoom1 src/Dodge/Room/Room.hs 327;" f -shootingRange src/Dodge/Room/Room.hs 354;" f +shootersRoom src/Dodge/Room/Room.hs 338;" f +shootersRoom' src/Dodge/Room/Room.hs 305;" f +shootersRoom1 src/Dodge/Room/Room.hs 328;" f +shootingRange src/Dodge/Room/Room.hs 355;" f shortPoint2 src/Dodge/ShortShow.hs 4;" f shortShow src/ShortShow.hs 7;" f shotgunS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 527;" f @@ -4953,7 +4961,7 @@ 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 54;" f -showMuzzlePositions src/Dodge/Debug.hs 253;" f +showMuzzlePositions src/Dodge/Debug.hs 255;" f showTerminalError src/Dodge/Debug/Terminal.hs 80;" f showTimeFlow src/Dodge/TestString.hs 77;" f shrinkPolyOnEdges src/Geometry/Polygon.hs 183;" f @@ -5021,7 +5029,7 @@ soundMultiFrom src/Dodge/SoundLogic.hs 187;" f soundOriginIDsAt src/Dodge/WorldEvent/Sound.hs 18;" f soundOriginsIDsAt src/Dodge/WorldEvent/Sound.hs 13;" f soundPathList src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 346;" f -soundPic src/Dodge/Debug/Picture.hs 364;" f +soundPic src/Dodge/Debug/Picture.hs 373;" f soundStart src/Dodge/SoundLogic.hs 118;" f soundToOnomato src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 175;" f soundToVol src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 4;" f @@ -5040,7 +5048,7 @@ sparkRandDir src/Dodge/Spark.hs 117;" f sparkToDamage src/Dodge/Spark.hs 40;" f spawnAt src/Dodge/SpawnAt.hs 14;" f spawnerCrit src/Dodge/Creature.hs 54;" f -spawnerRoom src/Dodge/Room/Room.hs 382;" f +spawnerRoom src/Dodge/Room/Room.hs 383;" f speedLegs src/Dodge/Item/Equipment.hs 74;" f splashMenu src/Dodge/Menu.hs 31;" f splashMenuOptions src/Dodge/Menu.hs 36;" f @@ -5057,8 +5065,8 @@ spreadGunCrit src/Dodge/Creature/SpreadGunCrit.hs 11;" f spreadOut src/Dodge/Creature/Boid.hs 160;" f sps src/Dodge/LevelGen/PlacementHelper.hs 30;" f sps0 src/Dodge/LevelGen/PlacementHelper.hs 42;" f -sqPlatformChasm src/Dodge/Room/Tutorial.hs 223;" f -sqSpitChasm src/Dodge/Room/Tutorial.hs 238;" f +sqPlatformChasm src/Dodge/Room/Tutorial.hs 224;" f +sqSpitChasm src/Dodge/Room/Tutorial.hs 239;" f square src/Geometry/Polygon.hs 56;" f squareDecoration src/Dodge/Placement/TopDecoration.hs 48;" f squashIntersectCirclePoint src/Dodge/WallCreatureCollisions.hs 116;" f @@ -5117,7 +5125,7 @@ stripZ src/Geometry/Vector3D.hs 97;" f subInvX src/Dodge/ListDisplayParams.hs 51;" f subMap src/TreeHelp.hs 119;" f subZipWith src/Dodge/Placement/Instance/Wall.hs 94;" f -succB src/Dodge/Debug.hs 121;" f +succB src/Dodge/Debug.hs 122;" f swapAnyExtraSelection src/Dodge/Inventory/Swap.hs 57;" f swapInOutLinks src/Dodge/RoomLink.hs 100;" f swapIndices src/ListHelp.hs 50;" f @@ -5126,9 +5134,9 @@ swapItemWith src/Dodge/Inventory.hs 164;" f swarmCrit src/Dodge/Creature/SwarmCrit.hs 10;" f swarmUsingCenter src/Dodge/Creature/Boid.hs 174;" f t src/ShortShow.hs 48;" f -tEast src/Dodge/Room/Corridor.hs 95;" f +tEast src/Dodge/Room/Corridor.hs 96;" f tToBTree src/Dodge/Tree/Compose.hs 93;" f -tWest src/Dodge/Room/Corridor.hs 120;" f +tWest src/Dodge/Room/Corridor.hs 121;" f takeN src/RandomHelp.hs 46;" f takeNMore src/RandomHelp.hs 43;" f takeOne src/RandomHelp.hs 24;" f @@ -5187,7 +5195,7 @@ tflat2 src/Picture/Data.hs 55;" f tflat3 src/Picture/Data.hs 59;" f tflat4 src/Picture/Data.hs 63;" f theCleanup appDodge/Main.hs 65;" f -theColumns src/Dodge/Tree/Shift.hs 146;" f +theColumns src/Dodge/Tree/Shift.hs 150;" f theUpdateStep appDodge/Main.hs 101;" f thickArc src/Picture/Base.hs 293;" f thickCircle src/Picture/Base.hs 267;" f @@ -5204,7 +5212,7 @@ throb1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 801;" f throbC4S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 761;" f throwItem src/Dodge/Creature/Action.hs 191;" f tileTexCoords src/Tile.hs 11;" f -tilesFromRooms src/Dodge/Layout.hs 196;" f +tilesFromRooms src/Dodge/Layout.hs 197;" f tilesToLine src/Shader/AuxAddition.hs 66;" f timeFlowUpdate src/Dodge/Update.hs 182;" f timeScroller src/Dodge/Item/Held/Utility.hs 42;" f @@ -5222,7 +5230,7 @@ titleOptionsNoWrite src/Dodge/Menu.hs 107;" f tlDoEffect src/Dodge/Terminal.hs 115;" f tlSetStatus src/Dodge/Terminal.hs 112;" f tmDistributeAmmo src/Dodge/WorldEffect.hs 120;" f -tmDistributeLines src/Dodge/Room/Room.hs 456;" f +tmDistributeLines src/Dodge/Room/Room.hs 464;" f tmMachine src/Dodge/Placement/Instance/Terminal.hs 54;" f toBinary src/Dodge/Inventory/SelectionList.hs 138;" f toBothLnk src/Dodge/RoomLink.hs 138;" f @@ -5297,7 +5305,7 @@ treePaths src/TreeHelp.hs 139;" f treePost src/TreeHelp.hs 46;" f treeToPotentialFunction src/Dodge/Item/Grammar.hs 143;" f triLootRoom src/Dodge/Room/Treasure.hs 23;" f -triggerDoorRoom src/Dodge/Room/Door.hs 30;" f +triggerDoorRoom src/Dodge/Room/Door.hs 31;" f triggerSwitch src/Dodge/Placement/Instance/Button.hs 47;" f triggerSwitchSPic src/Dodge/Placement/Instance/Button.hs 14;" f triggerSwitchSPicLight src/Dodge/Placement/Instance/Button.hs 31;" f @@ -5324,12 +5332,12 @@ tryUseParent src/Dodge/Creature/State.hs 145;" f turnTo src/Dodge/Movement/Turn.hs 8;" f turretItemOffset src/Dodge/Item/HeldOffset.hs 22;" f tutAnoTree src/Dodge/Room/Tutorial.hs 51;" f -tutDrop src/Dodge/Room/Tutorial.hs 113;" f -tutHub src/Dodge/Room/Tutorial.hs 366;" f -tutLight src/Dodge/Room/Tutorial.hs 331;" f -tutRezBox src/Dodge/Room/Tutorial.hs 481;" f +tutDrop src/Dodge/Room/Tutorial.hs 114;" f +tutHub src/Dodge/Room/Tutorial.hs 367;" f +tutLight src/Dodge/Room/Tutorial.hs 332;" f +tutRezBox src/Dodge/Room/Tutorial.hs 482;" f tutRoomTree src/Dodge/Floor.hs 20;" f -tutorialMessage1 src/Dodge/Room/Tutorial.hs 504;" f +tutorialMessage1 src/Dodge/Room/Tutorial.hs 505;" f tweenAngles src/Geometry/Vector.hs 190;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 79;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 34;" f @@ -5539,9 +5547,10 @@ verticalPipe src/Dodge/Picture.hs 19;" f verticalPipe src/Dodge/Placement/Instance/Pipe.hs 6;" f verticalWire src/Dodge/Wire.hs 23;" f vgunMuzzles src/Dodge/HeldUse.hs 344;" f -viewBoundaries src/Dodge/Debug/Picture.hs 332;" f -viewClipBounds src/Dodge/Debug/Picture.hs 341;" f +viewClipBounds src/Dodge/Debug/Picture.hs 350;" f viewDistanceFromItems src/Dodge/Update/Camera.hs 202;" f +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 @@ -5567,12 +5576,12 @@ wasdMovement src/Dodge/Creature/YourControl.hs 169;" f wasdWithAiming src/Dodge/Creature/YourControl.hs 126;" f watchCombinations src/Dodge/Combine/Combinations.hs 16;" f watchUpdateStrat src/Dodge/Creature/ReaderUpdate.hs 185;" f -weaponBehindPillar src/Dodge/Room/Room.hs 195;" f -weaponBetweenPillars src/Dodge/Room/Room.hs 211;" f -weaponEmptyRoom src/Dodge/Room/Room.hs 156;" f -weaponLongCorridor src/Dodge/Room/Room.hs 236;" f -weaponRoom src/Dodge/Room/Room.hs 273;" f -weaponUnderCrits src/Dodge/Room/Room.hs 174;" f +weaponBehindPillar src/Dodge/Room/Room.hs 196;" f +weaponBetweenPillars src/Dodge/Room/Room.hs 212;" f +weaponEmptyRoom src/Dodge/Room/Room.hs 157;" f +weaponLongCorridor src/Dodge/Room/Room.hs 237;" f +weaponRoom src/Dodge/Room/Room.hs 274;" f +weaponUnderCrits src/Dodge/Room/Room.hs 175;" f wedgeGeom src/Dodge/Base.hs 42;" f wedgeOfThickness src/Dodge/Picture.hs 9;" f whirS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 639;" f @@ -5647,13 +5656,13 @@ yourInv src/Dodge/Base/You.hs 28;" f yourRootItem src/Dodge/Base/You.hs 22;" f yourSelectedItem src/Dodge/Base/You.hs 16;" f yourStatsInfo src/Dodge/Creature/Info.hs 27;" f -zChasm src/Dodge/Room/Tutorial.hs 167;" f +zChasm src/Dodge/Room/Tutorial.hs 168;" f zConnect src/Dodge/Render/Connectors.hs 18;" f zConnectCol src/Dodge/Render/Connectors.hs 29;" f zConnectColMidX src/Dodge/Render/Connectors.hs 32;" f zeroZ src/Geometry/Vector.hs 9;" f zipArcs src/Dodge/Tesla.hs 51;" f -zipCount src/Dodge/Tree/Shift.hs 136;" f +zipCount src/Dodge/Tree/Shift.hs 140;" f zoneCloud src/Dodge/Zoning/Cloud.hs 33;" f zoneClouds src/Dodge/Update.hs 511;" f zoneCreature src/Dodge/Zoning/Creature.hs 56;" f