From e9178f964344a81da6b34cb2ce9f6d29061451d3 Mon Sep 17 00:00:00 2001 From: justin Date: Tue, 7 Oct 2025 10:43:15 +0100 Subject: [PATCH] Make chasms remove RoomPos within their boundaries --- src/Dodge/Data/Room.hs | 22 +- src/Dodge/Layout.hs | 8 +- src/Dodge/Placement/PlaceSpot.hs | 7 +- src/Dodge/PlacementSpot.hs | 48 ++-- src/Dodge/Room/Ngon.hs | 3 + src/Dodge/Room/Pillar.hs | 10 +- src/Dodge/Room/Procedural.hs | 10 +- src/Dodge/Room/Room.hs | 4 +- src/Dodge/Room/Tutorial.hs | 16 +- src/Dodge/Room/Warning.hs | 2 +- src/Dodge/Tree/Shift.hs | 12 +- tags | 394 +++++++++++++++---------------- 12 files changed, 280 insertions(+), 256 deletions(-) diff --git a/src/Dodge/Data/Room.hs b/src/Dodge/Data/Room.hs index 2c803b09a..c0c5e4296 100644 --- a/src/Dodge/Data/Room.hs +++ b/src/Dodge/Data/Room.hs @@ -1,5 +1,6 @@ {-# LANGUAGE StrictData #-} {-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE LambdaCase #-} module Dodge.Data.Room ( module Dodge.Data.Room, @@ -14,8 +15,8 @@ import Geometry data RoomPos = RoomPos { _rpPos :: Point2 , _rpDir :: Float - , _rpType :: S.Set RoomPosType - , _rpLinkStatus :: RPLinkStatus + , _rpFlags :: S.Set RoomPosFlag + , _rpType :: RPLinkStatus , _rpPlacementUse :: S.Set UsedPos } deriving (Eq, Ord, Show) @@ -53,6 +54,7 @@ data RoomWire = --RoomWire Point2 Float WallWire Point2 Float Float +-- the link constructors should probably be combined in some way data RPLinkStatus = UsedOutLink { _rplsType :: S.Set RoomLinkType @@ -64,16 +66,20 @@ data RPLinkStatus , _rplsInRoomID :: Int } | UnusedLink {_rplsType :: S.Set RoomLinkType} - | PathNodeRP - | NotLink + | NotLink {_rpOnPath :: Bool} deriving (Eq, Ord, Show) +notLink :: RPLinkStatus -> Bool +notLink = \case + NotLink {} -> True + _ -> False + data PathFromEdge = PathFromEdge CardinalPoint Int deriving (Eq, Ord, Show) -data RoomPosType - = RoomPosOnGrid {_onPathFromEdges :: S.Set PathFromEdge} - | RoomPosOffGrid {_offPathFromEdges :: S.Set PathFromEdge} +data RoomPosFlag + = RoomPosOnGrid {_onGridFromEdges :: S.Set PathFromEdge} + | RoomPosOffGrid {_offGridFromEdges :: S.Set PathFromEdge} deriving (Eq, Ord, Show) data UsedPos @@ -85,5 +91,5 @@ data UsedPos makeLenses ''RoomLink makeLenses ''RoomPos -makeLenses ''RoomPosType +makeLenses ''RoomPosFlag makeLenses ''RPLinkStatus diff --git a/src/Dodge/Layout.hs b/src/Dodge/Layout.hs index c468a5d47..c2ff35007 100644 --- a/src/Dodge/Layout.hs +++ b/src/Dodge/Layout.hs @@ -168,21 +168,21 @@ gameRoomFromRoom rm = [ p +.+ 10 *.* unitVectorAtAngle a , p -.- 10 *.* unitVectorAtAngle a ] - filterUnusedLinks rp = case _rpLinkStatus rp of + filterUnusedLinks rp = case _rpType rp of UnusedLink{} -> Just $ _rpPos rp _ -> Nothing - filterUsedLinks rp = case _rpLinkStatus rp of + filterUsedLinks rp = case _rpType rp of UsedOutLink{} -> doubleShift (_rpPos rp) (_rpDir rp) UsedInLink{} -> doubleShift (_rpPos rp) (_rpDir rp) _ -> [] - undir rp = case _rpLinkStatus rp of + undir rp = case _rpType rp of UsedOutLink{} -> ma UsedInLink{} -> ma _ -> Nothing where ma = Just $ 0.5 * pi + _rpDir rp + snd (_rmShift rm) closePoints x y = roundPoint2 x == roundPoint2 y - getDir (rp : xs) = case _rpLinkStatus rp of + getDir (rp : xs) = case _rpType rp of UsedInLink{} -> _rpDir rp + snd (_rmShift rm) _ -> getDir xs getDir _ = 0 -- fallback diff --git a/src/Dodge/Placement/PlaceSpot.hs b/src/Dodge/Placement/PlaceSpot.hs index a64173ef6..2dfec1c01 100644 --- a/src/Dodge/Placement/PlaceSpot.hs +++ b/src/Dodge/Placement/PlaceSpot.hs @@ -126,7 +126,8 @@ placeSpotID rid ps pt w = case pt of w PutMachine pps mc wl mitm -> plMachine (map doShift pps) mc wl mitm p rot w PutLS ls -> plNewUpID (gwWorld . cWorld . lWorld . lightSources) lsID (mvLS p' rot ls) w - PutPPlate pp -> plNewUpID (gwWorld . cWorld . lWorld . pressPlates) ppID (mvPP p rot pp) w + PutPPlate pp + -> plNewUpID (gwWorld . cWorld . lWorld . pressPlates) ppID (mvPP p rot pp) w RandPS _ -> error "RandPS should not be reachable here" --evaluateRandPS rid rgn ps w PutDoor col eo f pss -> plDoor col eo f (map (bimap doShift doShift) pss) w PutCoord cp -> plNewID (gwWorld . coordinates) (doShift cp) w @@ -143,7 +144,9 @@ placeSpotID rid ps pt w = case pt of PutNothing -> (0, w) PutID i -> (i, w) PutWorldUpdate f -> (0, w & f rid ps) - PutChasm ps' -> (0, w & gwWorld . cWorld . chasms .:~ map doShift ps') + PutChasm ps' -> (0, w & gwWorld . cWorld . chasms .:~ map doShift ps' + & genRooms . ix rid . rmPos %~ filter (\rp -> not $ pointInPoly (_rpPos rp) ps') + ) PutLabel{} -> (0, w) where p@(V2 px py) = _psPos ps diff --git a/src/Dodge/PlacementSpot.hs b/src/Dodge/PlacementSpot.hs index ee3a17373..f89952f1d 100644 --- a/src/Dodge/PlacementSpot.hs +++ b/src/Dodge/PlacementSpot.hs @@ -1,9 +1,9 @@ ---{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE LambdaCase #-} module Dodge.PlacementSpot ( atFstLnkOut, atNthLnkOutShiftBy, rpIsOnGrid, - rpIsOffPath, + rpIsOffGrid, rpOffPathFromEdge, useUnusedLnk, psRandRanges, @@ -59,35 +59,35 @@ randDirPS ps = do return $ setDirPS a ps isUnusedLnk :: RoomPos -> Room -> Bool -isUnusedLnk rp _ = case _rpLinkStatus rp of +isUnusedLnk rp _ = case _rpType rp of UnusedLink{} -> null $ _rpPlacementUse rp _ -> False anyUnusedSpot :: PlacementSpot -anyUnusedSpot = rprBool $ \rp _ -> _rpLinkStatus rp == NotLink && null (_rpPlacementUse rp) +anyUnusedSpot = rprBool $ \rp _ -> notLink (_rpType rp) && null (_rpPlacementUse rp) -psposAddLabel :: RoomPosType -> PlacementSpot -> PlacementSpot -psposAddLabel lab = psSelect %~ (\f rp r -> f rp r & _Just . _2 . rpType %~ S.insert lab) +psposAddLabel :: RoomPosFlag -> PlacementSpot -> PlacementSpot +psposAddLabel lab = psSelect %~ (\f rp r -> f rp r & _Just . _2 . rpFlags %~ S.insert lab) rprBool :: (RoomPos -> Room -> Bool) -> PlacementSpot rprBool t = PSPos (useRoomPosRoomCond (S.singleton UsedPosLow) t) (const id) Nothing rpIsOnGrid :: RoomPos -> Bool -rpIsOnGrid = any f . _rpType +rpIsOnGrid = any f . _rpFlags where f RoomPosOnGrid{} = True f _ = False -rpIsOffPath :: RoomPos -> Bool -rpIsOffPath = any f . _rpType +rpIsOffGrid :: RoomPos -> Bool +rpIsOffGrid = any f . _rpFlags where f RoomPosOffGrid{} = True f _ = False rpOffPathFromEdge :: PathFromEdge -> RoomPos -> Bool -rpOffPathFromEdge pe = any f . _rpType +rpOffPathFromEdge pe = any f . _rpFlags where - f rt = maybe False (pe `elem`) (rt ^? offPathFromEdges) + f rt = maybe False (pe `elem`) (rt ^? offGridFromEdges) resetPLUse :: PlacementSpot -> PlacementSpot resetPLUse (PSPos f g fallback) = PSPos f' g fallback @@ -118,7 +118,7 @@ rprBoolShift t shift = PSPos f (const id) Nothing unusedSpotAwayFromLink :: Float -> PlacementSpot unusedSpotAwayFromLink x = rprBool $ \rp r -> - _rpLinkStatus rp == NotLink + notLink (_rpType rp) && null (_rpPlacementUse rp) && all ((> x) . dist (_rpPos rp)) (usedRoomLinkPoss r) @@ -132,11 +132,11 @@ unusedOffPathAwayFromLink :: Float -> PlacementSpot unusedOffPathAwayFromLink x = rprBool $ \rp r -> null (_rpPlacementUse rp) && all ((> x) . dist (_rpPos rp)) (usedRoomLinkPoss r) - && rpIsOffPath rp + && rpIsOffGrid rp unusedSpotAwayFromInLink :: Float -> PlacementSpot unusedSpotAwayFromInLink x = rprBool $ \rp r -> - _rpLinkStatus rp == NotLink + notLink (_rpType rp) && null (_rpPlacementUse rp) && all ((> x) . dist (_rpPos rp)) (usedRoomInLinkPoss r) @@ -159,12 +159,12 @@ twoRoomPoss cond1 cond2 f = Placement (rprBool cond1) PutNothing Nothing Nothing -- _ -> False isInLnk :: RoomPos -> Bool -isInLnk rp = case _rpLinkStatus rp of +isInLnk rp = case _rpType rp of UsedInLink{} -> null $ _rpPlacementUse rp _ -> False isOutLnk :: RoomPos -> Bool -isOutLnk rp = case _rpLinkStatus rp of +isOutLnk rp = case _rpType rp of UsedOutLink{} -> null $ _rpPlacementUse rp _ -> False @@ -172,7 +172,7 @@ useUnusedLnk :: PlacementSpot useUnusedLnk = rprBool isUnusedLnk isUsedLnkUnplaced :: RoomPos -> Bool -isUsedLnkUnplaced rp = case _rpLinkStatus rp of +isUsedLnkUnplaced rp = case _rpType rp of UsedOutLink{} -> null (_rpPlacementUse rp) UsedInLink{} -> null (_rpPlacementUse rp) _ -> False @@ -188,28 +188,28 @@ useRoomPosRoomCond xs t rp r | otherwise = Nothing isUnusedLnkType :: RoomLinkType -> RoomPos -> Room -> Bool -isUnusedLnkType rlt rp _ = case _rpLinkStatus rp of +isUnusedLnkType rlt rp _ = case _rpType rp of UnusedLink{_rplsType = rlts} -> rlt `S.member` rlts && null (_rpPlacementUse rp) _ -> False unusedSpotNearInLink :: Float -> PlacementSpot unusedSpotNearInLink x = rprBool $ \rp r -> - _rpLinkStatus rp == NotLink + notLink (_rpType rp) && null (_rpPlacementUse rp) && any ((< x) . dist (_rpPos rp)) (usedRoomInLinkPoss r) usedRoomInLinkPoss :: Room -> [Point2] usedRoomInLinkPoss r = mapMaybe f $ _rmPos r where - f rp = case _rpLinkStatus rp of + f rp = case _rpType rp of UsedInLink{} -> Just $ _rpPos rp _ -> Nothing usedRoomLinkPoss :: Room -> [Point2] usedRoomLinkPoss r = mapMaybe f $ _rmPos r where - f rp = case _rpLinkStatus rp of + f rp = case _rpType rp of UsedInLink{} -> Just $ _rpPos rp UsedOutLink{} -> Just $ _rpPos rp _ -> Nothing @@ -218,12 +218,12 @@ atFstLnkOut :: PlacementSpot atFstLnkOut = atNthLinkOut 0 atNthLinkOut :: Int -> PlacementSpot -atNthLinkOut n = rprBool $ \rp _ -> rp ^? rpLinkStatus . rplsChildNum == Just n +atNthLinkOut n = rprBool $ \rp _ -> rp ^? rpType . rplsChildNum == Just n atNthLnkOutShiftBy :: Int -> ((Point2, Float) -> ((Point2, Float),S.Set UsedPos)) -> PlacementSpot atNthLnkOutShiftBy n = rprBoolShift $ - \rp _ -> rp ^? rpLinkStatus . rplsChildNum == Just n + \rp _ -> rp ^? rpType . rplsChildNum == Just n --atNthLnkOutShiftBy n theshift = PSPos f (const id) Nothing -- where @@ -253,7 +253,7 @@ shiftByV2 x (p, a) = (p +.+ rotateV a x, a) -- this should probably check the placement use, but so should others: should -- unify these useLnkRoomPos :: S.Set UsedPos -> RoomPos -> Room -> Maybe (PlacementSpot, RoomPos) -useLnkRoomPos xs rp _ = case _rpLinkStatus rp of +useLnkRoomPos xs rp _ = case _rpType rp of UnusedLink{} -> Just (PS (_rpPos rp) (_rpDir rp), rp & rpPlacementUse <>~ xs) _ -> Nothing diff --git a/src/Dodge/Room/Ngon.hs b/src/Dodge/Room/Ngon.hs index 6dfb0419d..ac248e2ad 100644 --- a/src/Dodge/Room/Ngon.hs +++ b/src/Dodge/Room/Ngon.hs @@ -25,6 +25,7 @@ roomNgon n x = do , _rmBound = [poly] , _rmFloor = Tiled [makeTileFromPoly poly 2] , _rmName = show n ++ "gon" + , _rmPos = poss } where rot = 2 * pi / fromIntegral n @@ -34,6 +35,8 @@ roomNgon n x = do path2 = concat $ zipWith g path1 (tail path1 <> [head path1]) path3 = loopPairs path2 <> fmap (,V2 0 0) path2 path4 = concatMap doublePair path3 + poss = map (\p -> RoomPos p 0 mempty (NotLink True) mempty) + (V2 0 0 : path1) g z y = [z, 0.5 * (z + y)] lnks = sortOn ((\(V2 a b) -> (negate b, a)) . fst . snd) diff --git a/src/Dodge/Room/Pillar.hs b/src/Dodge/Room/Pillar.hs index 8da0bde7f..75a3582f9 100644 --- a/src/Dodge/Room/Pillar.hs +++ b/src/Dodge/Room/Pillar.hs @@ -87,8 +87,8 @@ roomPillarsSquare = do ++ concatMap (replicate nlns . makepill) [East, West] where makepill edge = sps (rprBool $ \rp _ -> t edge rp) smallPillar - t edge rp = any (f edge) (_rpType rp) && null (_rpPlacementUse rp) - f edge rpt = maybe False (PathFromEdge edge 0 `S.member`) (rpt ^? offPathFromEdges) + t edge rp = any (f edge) (_rpFlags rp) && null (_rpPlacementUse rp) + f edge rpt = maybe False (PathFromEdge edge 0 `S.member`) (rpt ^? offGridFromEdges) roomPillarsPassage :: RandomGen g => State g Room roomPillarsPassage = do @@ -106,16 +106,16 @@ roomPillarsPassage = do roomPillars :: RandomGen g => Float -> Float -> Float -> Int -> Int -> State g Room roomPillars pillarsize w h wn hn = do let rm = roomRect w h wn hn - npillars = length $ filter rpIsOffPath $ _rmPos rm + npillars = length $ filter rpIsOffGrid $ _rmPos rm plmnts = replicate npillars ( blockPillar (0.5 * pilw) (0.5 * pilh) & plSpot .~ rprBool ( \rp _ -> - rpIsOffPath rp + rpIsOffGrid rp && null (_rpPlacementUse rp) - && _rpLinkStatus rp == NotLink + && notLink (_rpType rp) ) ) addGirderLights $ diff --git a/src/Dodge/Room/Procedural.hs b/src/Dodge/Room/Procedural.hs index 14cd6ba30..3c7fd2881 100644 --- a/src/Dodge/Room/Procedural.hs +++ b/src/Dodge/Room/Procedural.hs @@ -98,7 +98,7 @@ roomRect x y xn yn = pth = linksGridToPath lnks $ map (bimap (+.+ V2 20 20) (+.+ V2 20 20)) (makeGrid xd xn yd yn) makeonpos (p, a) = RoomPos p 0 (S.singleton $ RoomPosOnGrid $ makerpedges a) - NotLink mempty + (NotLink True) mempty makerpedges (a, b) = S.fromList [ PathFromEdge South b @@ -109,7 +109,7 @@ roomRect x y xn yn = posps = map (over _1 (+.+ V2 20 20)) $ gridPoints'' xd (xn + 1) yd (yn + 1) interposps = map (over _1 (+.+ V2 (20 + xd / 2) (20 + yd / 2))) $ gridPoints'' xd xn yd yn makeoffpos (p, a) = RoomPos - p 0 (S.singleton $ RoomPosOffGrid $ makerpedges' a) NotLink mempty + p 0 (S.singleton $ RoomPosOffGrid $ makerpedges' a) (NotLink False) mempty makerpedges' (a, b) = S.fromList [ PathFromEdge South b @@ -206,8 +206,8 @@ quarterRoomTri w = do ] , _rmPmnts = b ++ [mntLS iShape (V2 (w -20) w) (V3 (w -20) (w -20) 70)] , _rmPos = - [ RoomPos (V2 (w -20) (w -20)) pi S.empty NotLink mempty - , RoomPos (V2 (w -15) (w -25)) pi S.empty NotLink mempty + [ RoomPos (V2 (w -20) (w -20)) pi S.empty (NotLink False) mempty + , RoomPos (V2 (w -15) (w -25)) pi S.empty (NotLink False) mempty ] , _rmBound = [[V2 0 0, V2 w w, V2 (- w) w]] } @@ -255,7 +255,7 @@ quarterRoomSquare w = do ] , _rmPmnts = b ++ [blockLine (V2 (w / 2) (w / 2)) (V2 0 w)] , _rmPos = - [ RoomPos p pi S.empty NotLink mempty + [ RoomPos p pi S.empty (NotLink False) mempty | p <- [V2 20 (2 * w -40), V2 25 (2 * w -45)] ] , --, _rmBound = [map toV2 [(w,w),(0,2*w),(-w,w)]] diff --git a/src/Dodge/Room/Room.hs b/src/Dodge/Room/Room.hs index de19118de..65f50e9e4 100644 --- a/src/Dodge/Room/Room.hs +++ b/src/Dodge/Room/Room.hs @@ -77,7 +77,7 @@ glassSwitchBack = do l2 <- mntLightLnkCond $ rprBool $ \rp _ -> - rp ^. rpLinkStatus . rplsType . at (OnEdge West) == Just () + rp ^. rpType . rplsType . at (OnEdge West) == Just () && null (rp ^. rpPlacementUse) let hf = hgt / 5 awindow h xl xr = windowLine (V2 xl h) (V2 xr h) @@ -207,7 +207,7 @@ weaponBetweenPillars = do and [ rpIsOnGrid rp , null $ _rpPlacementUse rp - , _rpLinkStatus rp == NotLink + , notLink (_rpType rp) , any ((< 100) . dist (_rpPos rp)) (usedRoomInLinkPoss r) ] ncrits <- state $ randomR (1, 3) diff --git a/src/Dodge/Room/Tutorial.hs b/src/Dodge/Room/Tutorial.hs index 751e690ff..c47b3ea48 100644 --- a/src/Dodge/Room/Tutorial.hs +++ b/src/Dodge/Room/Tutorial.hs @@ -1,6 +1,5 @@ module Dodge.Room.Tutorial where -import Dodge.Room.Pillar import Dodge.Item.Held.Utility import Control.Monad import qualified Data.IntMap.Strict as IM @@ -39,12 +38,25 @@ import TreeHelp --import Data.List (intersperse) +testf = PSPos (\x _ -> f x) (\_ -> id) Nothing + where + f x = case _rpType x of + NotLink{} -> Just (PS (_rpPos x) (_rpDir x), x) + _ -> Nothing + tutAnoTree :: State LayoutVars MTRS tutAnoTree = do foldMTRS [ tToBTree "TutStartRez" . return . cleatOnward <$> tutRezBox , corDoor - , tToBTree "x" . return . cleatOnward <$> roomPillarsSquare + , tToBTree "test" . return . cleatOnward <$> (roomRectAutoLinks 100 100 + <&> rmPmnts <>~ + [sps0 $ PutChasm $ rectNSWE 70 30 30 70 + , Placement testf (PutFlIt led) Nothing Nothing (const $ const Nothing) + ] + <&> rmPos .~[RoomPos 35 0 mempty (NotLink False) mempty] + -- <&> rmPos .~[] + ) , corDoor , tutHub , tutLight diff --git a/src/Dodge/Room/Warning.hs b/src/Dodge/Room/Warning.hs index 580a5d271..2a2a039b2 100644 --- a/src/Dodge/Room/Warning.hs +++ b/src/Dodge/Room/Warning.hs @@ -69,7 +69,7 @@ lineOutputTerminal tls = defaultTerminal & tmBootLines .~ textInputBlurb tls moveToSideNthOutLink :: S.Set UsedPos -> Int -> RoomPos -> Room -> Maybe ((Point2, Float), S.Set UsedPos) moveToSideNthOutLink xs i rp rm = do - j <- rp ^? rpLinkStatus . rplsChildNum + j <- rp ^? rpType . rplsChildNum guard $ i == j let rppos = _rpPos rp rpdir = _rpDir rp diff --git a/src/Dodge/Tree/Shift.hs b/src/Dodge/Tree/Shift.hs index 7d85fa94d..64f921c4c 100644 --- a/src/Dodge/Tree/Shift.hs +++ b/src/Dodge/Tree/Shift.hs @@ -92,8 +92,8 @@ posRms prs parenti@(parent, _) ((numChild, t@(Node childi _)) : its) tseq = do --, _rpDir = snd (lnkPosDir outlnk) { _rpPos = outlnk ^. rlPos , _rpDir = outlnk ^. rlDir - , _rpType = S.empty - , _rpLinkStatus = UsedOutLink (_rlType outlnk) numChild (snd childi) + , _rpFlags = S.empty + , _rpType = UsedOutLink (_rlType outlnk) numChild (snd childi) , _rpPlacementUse = mempty } & rmChildren .:~ snd childi @@ -109,8 +109,8 @@ posRms prs parenti@(parent, _) ((numChild, t@(Node childi _)) : its) tseq = do --, _rpDir = snd (lnkPosDir outlnk) { _rpPos = il ^. rlPos , _rpDir = il ^. rlDir - , _rpType = S.empty - , _rpLinkStatus = UsedInLink (_rlType il) (snd parenti) + , _rpFlags = mempty + , _rpType = UsedInLink (_rlType il) (snd parenti) , _rpPlacementUse = mempty } shiftedt = @@ -128,8 +128,8 @@ createUnusedLinkPos rm = rm & rmPos .++~ map f (_rmLinks rm) RoomPos { _rpPos = _rlPos rl , _rpDir = _rlDir rl - , _rpType = S.empty - , _rpLinkStatus = UnusedLink $ _rlType rl + , _rpFlags = mempty + , _rpType = UnusedLink $ _rlType rl , _rpPlacementUse = mempty } diff --git a/tags b/tags index 0a974447d..1f3f827c2 100644 --- a/tags +++ b/tags @@ -143,7 +143,7 @@ BlockDrawMempty src/Dodge/Data/Block.hs 39;" C BlockDraws src/Dodge/Data/Block.hs 41;" C BlockObstacle src/Dodge/Data/PathGraph.hs 49;" C BlockPart src/Dodge/Data/Wall/Structure.hs 16;" C -BlockedLink src/Dodge/Data/Room.hs 49;" C +BlockedLink src/Dodge/Data/Room.hs 50;" C BloomLayer src/Picture/Data.hs 25;" C BloomNoZWrite src/Picture/Data.hs 26;" C Blunt src/Dodge/Data/Damage.hs 21;" C @@ -337,7 +337,7 @@ DecorationShape src/Dodge/Data/GenParams.hs 20;" t DefaultCrGroupUpdate src/Dodge/Data/CrGroupParams.hs 22;" C DefaultForceField src/Dodge/Data/Item/Use/Consumption/Ammo.hs 11;" C DefaultLightSourceDraw src/Dodge/Data/LightSource.hs 13;" C -DefaultRoomType src/Dodge/Data/Room.hs 31;" C +DefaultRoomType src/Dodge/Data/Room.hs 32;" C DestroyBeing src/Dodge/Data/Scenario.hs 8;" C DestroyBullet src/Dodge/Data/Bullet.hs 29;" C DestroyItem src/Dodge/Data/Scenario.hs 7;" C @@ -479,7 +479,7 @@ FootForward src/Dodge/Data/Creature/Stance.hs 35;" t FootstepSound src/Dodge/Data/SoundOrigin.hs 30;" C ForceFieldType src/Dodge/Data/Item/Use/Consumption/Ammo.hs 11;" t ForegroundShape src/Dodge/Data/ForegroundShape.hs 14;" t -FromEdge src/Dodge/Data/Room.hs 48;" C +FromEdge src/Dodge/Data/Room.hs 49;" C FullRes src/Dodge/Data/Config.hs 97;" C FullShadowFidelity src/Shape/Data.hs 24;" C FullSize src/Dodge/Data/Item/Params.hs 28;" C @@ -587,7 +587,7 @@ ImpulsesList src/Dodge/Data/ActionPlan.hs 97;" C InDivineZone src/Dodge/Data/Scenario.hs 22;" C InDream src/Dodge/Data/Scenario.hs 19;" C InInv src/Dodge/Data/Item/Location.hs 27;" C -InLink src/Dodge/Data/Room.hs 44;" C +InLink src/Dodge/Data/Room.hs 45;" C InParallelUniverse src/Dodge/Data/Scenario.hs 21;" C InRealWorld src/Dodge/Data/Scenario.hs 18;" C InSimulation src/Dodge/Data/Scenario.hs 20;" C @@ -657,7 +657,7 @@ LIGHTSENSOR src/Dodge/Data/Item/Combine.hs 80;" C LS src/Dodge/Data/LightSource.hs 23;" C LSParam src/Dodge/Data/LightSource.hs 16;" t LWorld src/Dodge/Data/LWorld.hs 97;" t -LabLink src/Dodge/Data/Room.hs 45;" C +LabLink src/Dodge/Data/Room.hs 46;" C LabSS src/Dodge/Data/Scenario.hs 97;" C LabelAction src/Dodge/Data/ActionPlan.hs 79;" C LabelCluster src/Dodge/Data/RoomCluster.hs 13;" C @@ -886,33 +886,33 @@ NorthEast src/Dodge/Data/CardinalPoint.hs 13;" C NorthEast8 src/Dodge/Data/CardinalPoint.hs 21;" C NorthWest src/Dodge/Data/CardinalPoint.hs 16;" C NorthWest8 src/Dodge/Data/CardinalPoint.hs 27;" C -NotLink src/Dodge/Data/Room.hs 67;" C +NotLink src/Dodge/Data/Room.hs 69;" C NotPushed src/Dodge/Data/Door.hs 30;" C Nothing' src/MaybeHelp.hs 13;" C NothingID src/Dodge/Data/CrWlID.hs 12;" C NozzleAngle src/Dodge/Data/Item/Params.hs 18;" C +NumLight0 src/Dodge/Data/Config.hs 15;" C +NumLight1 src/Dodge/Data/Config.hs 16;" C +NumLight10 src/Dodge/Data/Config.hs 25;" C +NumLight11 src/Dodge/Data/Config.hs 26;" C +NumLight12 src/Dodge/Data/Config.hs 27;" C +NumLight13 src/Dodge/Data/Config.hs 28;" C +NumLight14 src/Dodge/Data/Config.hs 29;" C +NumLight15 src/Dodge/Data/Config.hs 30;" C +NumLight16 src/Dodge/Data/Config.hs 31;" C +NumLight17 src/Dodge/Data/Config.hs 32;" C +NumLight18 src/Dodge/Data/Config.hs 33;" C +NumLight19 src/Dodge/Data/Config.hs 34;" C +NumLight2 src/Dodge/Data/Config.hs 17;" C +NumLight20 src/Dodge/Data/Config.hs 35;" C +NumLight3 src/Dodge/Data/Config.hs 18;" C +NumLight4 src/Dodge/Data/Config.hs 19;" C +NumLight5 src/Dodge/Data/Config.hs 20;" C +NumLight6 src/Dodge/Data/Config.hs 21;" C +NumLight7 src/Dodge/Data/Config.hs 22;" C +NumLight8 src/Dodge/Data/Config.hs 23;" C +NumLight9 src/Dodge/Data/Config.hs 24;" C NumShadowCasters src/Dodge/Data/Config.hs 14;" t -NumShadowCasters0 src/Dodge/Data/Config.hs 15;" C -NumShadowCasters1 src/Dodge/Data/Config.hs 16;" C -NumShadowCasters10 src/Dodge/Data/Config.hs 25;" C -NumShadowCasters11 src/Dodge/Data/Config.hs 26;" C -NumShadowCasters12 src/Dodge/Data/Config.hs 27;" C -NumShadowCasters13 src/Dodge/Data/Config.hs 28;" C -NumShadowCasters14 src/Dodge/Data/Config.hs 29;" C -NumShadowCasters15 src/Dodge/Data/Config.hs 30;" C -NumShadowCasters16 src/Dodge/Data/Config.hs 31;" C -NumShadowCasters17 src/Dodge/Data/Config.hs 32;" C -NumShadowCasters18 src/Dodge/Data/Config.hs 33;" C -NumShadowCasters19 src/Dodge/Data/Config.hs 34;" C -NumShadowCasters2 src/Dodge/Data/Config.hs 17;" C -NumShadowCasters20 src/Dodge/Data/Config.hs 35;" C -NumShadowCasters3 src/Dodge/Data/Config.hs 18;" C -NumShadowCasters4 src/Dodge/Data/Config.hs 19;" C -NumShadowCasters5 src/Dodge/Data/Config.hs 20;" C -NumShadowCasters6 src/Dodge/Data/Config.hs 21;" C -NumShadowCasters7 src/Dodge/Data/Config.hs 22;" C -NumShadowCasters8 src/Dodge/Data/Config.hs 23;" C -NumShadowCasters9 src/Dodge/Data/Config.hs 24;" C OChasmWall src/Dodge/Data/Object.hs 15;" C OCreature src/Dodge/Data/Object.hs 12;" C OFloor src/Dodge/Data/Object.hs 14;" C @@ -936,7 +936,7 @@ Object src/Dodge/Data/Object.hs 10;" t ObjectType src/Dodge/Data/ObjectType.hs 11;" t OnBack src/Dodge/Data/Equipment/Misc.hs 24;" C OnChest src/Dodge/Data/Equipment/Misc.hs 23;" C -OnEdge src/Dodge/Data/Room.hs 47;" C +OnEdge src/Dodge/Data/Room.hs 48;" C OnFloor src/Dodge/Data/Item/Location.hs 36;" C OnHead src/Dodge/Data/Equipment/Misc.hs 22;" C OnLeftLeg src/Dodge/Data/Equipment/Misc.hs 27;" C @@ -953,7 +953,7 @@ OpticScope src/Dodge/Data/Item/Scope.hs 14;" C OptionScreen src/Dodge/Data/Universe.hs 82;" C OptionScreenFlag src/Dodge/Data/Universe.hs 72;" t OutAction src/Dodge/Creature/Action.hs 46;" t -OutLink src/Dodge/Data/Room.hs 43;" C +OutLink src/Dodge/Data/Room.hs 44;" C OutsideTerminal src/Dodge/Data/Input.hs 29;" C OutwardShockwave src/Dodge/Data/Shockwave.hs 14;" C OverCombCombine src/Dodge/Data/Input.hs 25;" C @@ -992,7 +992,7 @@ PUMP src/Dodge/Data/Item/Combine.hs 63;" C PaletteColor src/Color/Data.hs 14;" t PathEdge src/Dodge/Data/PathGraph.hs 40;" t PathEdgeNodes src/Dodge/Data/PathGraph.hs 33;" t -PathFromEdge src/Dodge/Data/Room.hs 70;" t +PathFromEdge src/Dodge/Data/Room.hs 77;" t PathTo src/Dodge/Data/ActionPlan.hs 88;" C Pathing src/Dodge/Data/Config.hs 76;" C Patrol src/Dodge/Data/ActionPlan.hs 180;" C @@ -1019,7 +1019,7 @@ Point3Q src/Geometry/Data.hs 52;" t Point4 src/Geometry/Data.hs 41;" t Poison src/Dodge/Data/Damage.hs 30;" C PoisonDamage src/Dodge/Data/Damage/Type.hs 6;" C -PolyEdge src/Dodge/Data/Room.hs 46;" C +PolyEdge src/Dodge/Data/Room.hs 47;" C PolyShad src/Picture/Data.hs 36;" C Polyhedra src/Polyhedra/Data.hs 13;" t Polyhedron src/Polyhedra/Data.hs 13;" C @@ -1113,7 +1113,7 @@ RIFLE src/Dodge/Data/Item/Combine.hs 153;" C RLAUNCHER src/Dodge/Data/Item/Combine.hs 170;" C RLAUNCHERX src/Dodge/Data/Item/Combine.hs 171;" C ROSE src/Color/Data.hs 21;" C -RPLinkStatus src/Dodge/Data/Room.hs 56;" t +RPLinkStatus src/Dodge/Data/Room.hs 58;" t RProps src/Dodge/Layout/Generate.hs 13;" C RadarBlip src/Dodge/Data/RadarBlip.hs 14;" t RadarSweep src/Dodge/Data/RadarSweep.hs 19;" t @@ -1126,7 +1126,7 @@ RandomImpulse src/Dodge/Data/ActionPlan.hs 32;" C RandomTurn src/Dodge/Data/ActionPlan.hs 31;" C ReactorSS src/Dodge/Data/Scenario.hs 111;" C RecRoomSS src/Dodge/Data/Scenario.hs 103;" C -RectRoomType src/Dodge/Data/Room.hs 32;" C +RectRoomType src/Dodge/Data/Room.hs 33;" C ReducedRocketSmoke src/Dodge/Data/Projectile.hs 55;" C ReigonalGovernment src/Dodge/Data/Scenario.hs 50;" C Religion src/Dodge/Data/Scenario.hs 47;" C @@ -1160,17 +1160,15 @@ RocketSmoke src/Dodge/Data/Cloud.hs 24;" C Room src/Dodge/Data/GenWorld.hs 125;" t RoomClipping src/Dodge/Data/Config.hs 107;" t RoomInt src/Dodge/Tree/Shift.hs 26;" t -RoomLink src/Dodge/Data/Room.hs 23;" t -RoomLinkType src/Dodge/Data/Room.hs 42;" t -RoomPos src/Dodge/Data/Room.hs 14;" t -RoomPosExLink src/Dodge/Data/Room.hs 76;" C -RoomPosLab src/Dodge/Data/Room.hs 77;" C -RoomPosOffPath src/Dodge/Data/Room.hs 75;" C -RoomPosOnPath src/Dodge/Data/Room.hs 74;" C -RoomPosType src/Dodge/Data/Room.hs 73;" 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 +RoomPosFlag src/Dodge/Data/Room.hs 80;" t +RoomPosOffGrid src/Dodge/Data/Room.hs 82;" C +RoomPosOnGrid src/Dodge/Data/Room.hs 81;" C RoomProperties src/Dodge/Layout/Generate.hs 13;" t -RoomType src/Dodge/Data/Room.hs 30;" t -RoomWire src/Dodge/Data/Room.hs 52;" t +RoomType src/Dodge/Data/Room.hs 31;" t +RoomWire src/Dodge/Data/Room.hs 53;" t RoundedFaces src/Shape/Data.hs 18;" C RunningSideEffect src/Dodge/Data/Universe.hs 69;" C SCRAPMETAL src/Dodge/Data/Item/Combine.hs 62;" C @@ -1424,7 +1422,7 @@ Unimportant src/Shape/Data.hs 37;" C Universe src/Dodge/Data/Universe.hs 31;" t UnloadedWeaponSF src/Dodge/Data/ComposedItem.hs 13;" C UnlockInv src/Dodge/Data/WorldEffect.hs 28;" C -UnusedLink src/Dodge/Data/Room.hs 66;" C +UnusedLink src/Dodge/Data/Room.hs 68;" C UseAheadPos src/Dodge/Data/ActionPlan.hs 160;" C UseAttach src/Dodge/Data/Item/Use.hs 32;" C UseBulletMod src/Dodge/Data/Item/Use.hs 37;" C @@ -1450,13 +1448,13 @@ UseValue src/Dodge/Data/Item/Use.hs 35;" C UseableAnytime src/Dodge/Data/UseCondition.hs 7;" C UseableWhenAimed src/Dodge/Data/UseCondition.hs 5;" C UseableWhenHeld src/Dodge/Data/UseCondition.hs 6;" C -UsedInLink src/Dodge/Data/Room.hs 62;" C -UsedOutLink src/Dodge/Data/Room.hs 57;" C -UsedPos src/Dodge/Data/Room.hs 80;" t -UsedPosFloor src/Dodge/Data/Room.hs 84;" C -UsedPosHigh src/Dodge/Data/Room.hs 83;" C -UsedPosLow src/Dodge/Data/Room.hs 81;" C -UsedPosMid src/Dodge/Data/Room.hs 82;" C +UsedInLink src/Dodge/Data/Room.hs 64;" C +UsedOutLink src/Dodge/Data/Room.hs 59;" C +UsedPos src/Dodge/Data/Room.hs 85;" t +UsedPosFloor src/Dodge/Data/Room.hs 89;" C +UsedPosHigh src/Dodge/Data/Room.hs 88;" C +UsedPosLow src/Dodge/Data/Room.hs 86;" C +UsedPosMid src/Dodge/Data/Room.hs 87;" C VAO src/Shader/Data.hs 64;" t VBO src/Shader/Data.hs 81;" t VF src/Polyhedra/Data.hs 21;" t @@ -1488,7 +1486,7 @@ WallP src/Dodge/LevelGen/StaticWalls.hs 23;" t WallP src/Dodge/LevelGen/StaticWalls/Deprecated.hs 11;" t WallSound src/Dodge/Data/SoundOrigin.hs 25;" C WallStructure src/Dodge/Data/Wall/Structure.hs 12;" t -WallWire src/Dodge/Data/Room.hs 54;" C +WallWire src/Dodge/Data/Room.hs 55;" C Walls_info src/Dodge/Data/Config.hs 75;" C War src/Dodge/Data/Scenario.hs 28;" C WarmTime src/Dodge/Data/Item/Params.hs 21;" C @@ -1988,8 +1986,8 @@ _lightingWallShadShader src/Data/Preload/Render.hs 14;" f _lights src/Dodge/Data/LWorld.hs 140;" f _lightsUBO src/Data/Preload/Render.hs 40;" f _linearShockwaves src/Dodge/Data/LWorld.hs 120;" f -_linkGapEW src/Dodge/Data/Room.hs 35;" f -_linkGapNS src/Dodge/Data/Room.hs 36;" f +_linkGapEW src/Dodge/Data/Room.hs 36;" f +_linkGapNS src/Dodge/Data/Room.hs 37;" f _locDT src/Dodge/Data/DoubleTree.hs 103;" f _locDtContext src/Dodge/Data/DoubleTree.hs 102;" f _locLDT src/Dodge/Data/DoubleTree.hs 63;" f @@ -2091,17 +2089,17 @@ _nodeMetaTree src/Dodge/Data/MetaTree.hs 16;" f _nodeTree src/Dodge/Data/MetaTree.hs 15;" f _nodesSearched src/Dodge/Data/Creature/Memory.hs 15;" f _nonInf src/Dodge/Data/CardinalPoint.hs 36;" f -_numLinkEW src/Dodge/Data/Room.hs 33;" f -_numLinkNS src/Dodge/Data/Room.hs 34;" f +_numLinkEW src/Dodge/Data/Room.hs 34;" f +_numLinkNS src/Dodge/Data/Room.hs 35;" f _numberChasmVerxs src/Dodge/Data/CWorld.hs 31;" f _numberFloorVerxs src/Dodge/Data/CWorld.hs 29;" f _nzAngle src/Dodge/Data/Item/Params.hs 18;" f _nzMaxWalkAngle src/Dodge/Data/Muzzle.hs 49;" f _nzPressure src/Dodge/Data/Muzzle.hs 48;" f _nzWalkSpeed src/Dodge/Data/Muzzle.hs 50;" f -_offPathFromEdges src/Dodge/Data/Room.hs 75;" f +_offGridFromEdges src/Dodge/Data/Room.hs 82;" f _oldMagnets src/Dodge/Data/LWorld.hs 127;" f -_onPathFromEdges src/Dodge/Data/Room.hs 74;" f +_onGridFromEdges src/Dodge/Data/Room.hs 81;" f _opDraw src/Dodge/Data/Wall.hs 43;" f _opSel src/Dodge/Data/RightButtonOptions.hs 17;" f _opTexture src/Dodge/Data/Wall.hs 44;" f @@ -2238,16 +2236,16 @@ _reverseAmount src/Dodge/Data/World.hs 72;" f _reverseAmount src/Dodge/Data/World.hs 76;" f _rkHoming src/Dodge/Data/Projectile.hs 35;" f _rkSmoke src/Dodge/Data/Projectile.hs 36;" f -_rlDir src/Dodge/Data/Room.hs 26;" f -_rlPos src/Dodge/Data/Room.hs 25;" f -_rlType src/Dodge/Data/Room.hs 24;" f +_rlDir src/Dodge/Data/Room.hs 27;" f +_rlPos src/Dodge/Data/Room.hs 26;" f +_rlType src/Dodge/Data/Room.hs 25;" f _rmBound src/Dodge/Data/GenWorld.hs 140;" f _rmChildren src/Dodge/Data/GenWorld.hs 151;" f _rmClusterStatus src/Dodge/Data/GenWorld.hs 153;" f _rmConnectsTo src/Dodge/Data/GenWorld.hs 148;" f _rmEndWires src/Dodge/Data/GenWorld.hs 147;" f _rmFloor src/Dodge/Data/GenWorld.hs 141;" f -_rmHeight src/Dodge/Data/Room.hs 38;" f +_rmHeight src/Dodge/Data/Room.hs 39;" f _rmInPmnt src/Dodge/Data/GenWorld.hs 139;" f _rmLinkEff src/Dodge/Data/GenWorld.hs 129;" f _rmLinks src/Dodge/Data/GenWorld.hs 127;" f @@ -2263,18 +2261,19 @@ _rmShift src/Dodge/Data/GenWorld.hs 143;" f _rmStartWires src/Dodge/Data/GenWorld.hs 146;" f _rmType src/Dodge/Data/GenWorld.hs 152;" f _rmViewpoints src/Dodge/Data/GenWorld.hs 144;" f -_rmWidth src/Dodge/Data/Room.hs 37;" f -_rpDir src/Dodge/Data/Room.hs 16;" f -_rpLinkStatus src/Dodge/Data/Room.hs 18;" f -_rpPlacementUse src/Dodge/Data/Room.hs 19;" f -_rpPos src/Dodge/Data/Room.hs 15;" f -_rpType src/Dodge/Data/Room.hs 17;" f -_rplsChildNum src/Dodge/Data/Room.hs 59;" f -_rplsInRoomID src/Dodge/Data/Room.hs 64;" f -_rplsOutRoomID src/Dodge/Data/Room.hs 60;" f -_rplsType src/Dodge/Data/Room.hs 58;" f -_rplsType src/Dodge/Data/Room.hs 63;" f -_rplsType src/Dodge/Data/Room.hs 66;" f +_rmWidth src/Dodge/Data/Room.hs 38;" f +_rpDir src/Dodge/Data/Room.hs 17;" f +_rpFlags src/Dodge/Data/Room.hs 18;" f +_rpOnPath src/Dodge/Data/Room.hs 69;" f +_rpPlacementUse src/Dodge/Data/Room.hs 20;" f +_rpPos src/Dodge/Data/Room.hs 16;" f +_rpType src/Dodge/Data/Room.hs 19;" f +_rplsChildNum src/Dodge/Data/Room.hs 61;" f +_rplsInRoomID src/Dodge/Data/Room.hs 66;" f +_rplsOutRoomID src/Dodge/Data/Room.hs 62;" f +_rplsType src/Dodge/Data/Room.hs 60;" f +_rplsType src/Dodge/Data/Room.hs 65;" f +_rplsType src/Dodge/Data/Room.hs 68;" f _rsAR src/Dodge/Data/RadarSweep.hs 25;" f _rsMapper src/Dodge/Data/RadarSweep.hs 24;" f _rsObject src/Dodge/Data/RadarSweep.hs 22;" f @@ -2588,7 +2587,7 @@ addIndefiniteArticle src/StringHelp.hs 17;" f addNodes src/Dodge/Path.hs 115;" f addPane src/Dodge/Placement/PlaceSpot.hs 169;" f addPlmnt src/Dodge/LevelGen/PlacementHelper.hs 87;" f -addPointPolygon src/Geometry/Polygon.hs 120;" f +addPointPolygon src/Geometry/Polygon.hs 133;" f addPolyWall src/Dodge/LevelGen/StaticWalls.hs 141;" f addPolyWalls src/Dodge/LevelGen/StaticWalls.hs 129;" f addRandomGirderEW src/Dodge/Room/Girder.hs 9;" f @@ -2631,7 +2630,7 @@ andOrRegex src/Dodge/DisplayInventory.hs 78;" f angleBetween src/Geometry.hs 161;" f angleVV src/Geometry/Vector.hs 57;" f angleVV3 src/Geometry/Vector3D.hs 122;" f -anyUnusedSpot src/Dodge/PlacementSpot.hs 67;" f +anyUnusedSpot src/Dodge/PlacementSpot.hs 66;" f anythingHitCirc src/Dodge/Base/Collide.hs 338;" f applyCME src/Dodge/HeldUse.hs 361;" f applyCreatureDamage src/Dodge/Creature/Damage.hs 13;" f @@ -2676,12 +2675,12 @@ arrow src/Picture/Composite.hs 19;" f arrowPath src/Picture/Composite.hs 8;" f assignHotkey src/Dodge/AssignHotkey.hs 9;" f assignPushDoors src/Dodge/LevelGen.hs 35;" f -atFstLnkOut src/Dodge/PlacementSpot.hs 224;" f -atFstLnkOutShiftBy src/Dodge/PlacementSpot.hs 244;" f -atFstLnkOutShiftInward src/Dodge/PlacementSpot.hs 247;" f -atNthLinkOut src/Dodge/PlacementSpot.hs 227;" f -atNthLnkOutShiftBy src/Dodge/PlacementSpot.hs 230;" f -atNthLnkOutShiftInward src/Dodge/PlacementSpot.hs 250;" f +atFstLnkOut src/Dodge/PlacementSpot.hs 217;" f +atFstLnkOutShiftBy src/Dodge/PlacementSpot.hs 237;" f +atFstLnkOutShiftInward src/Dodge/PlacementSpot.hs 240;" f +atNthLinkOut src/Dodge/PlacementSpot.hs 220;" f +atNthLnkOutShiftBy src/Dodge/PlacementSpot.hs 223;" f +atNthLnkOutShiftInward src/Dodge/PlacementSpot.hs 243;" f attachBranch src/Dodge/Tree/Compose.hs 83;" f attachInfo src/Dodge/Item/Info.hs 58;" f attachList src/Dodge/Tree/Compose.hs 80;" f @@ -2697,7 +2696,7 @@ autoGunS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 694;" f autoPistol src/Dodge/Item/Held/Stick.hs 49;" f autoRifle src/Dodge/Item/Held/Cane.hs 27;" f awakeLevelPerception src/Dodge/Creature/Perception.hs 163;" f -axisInt src/Geometry/Intersect.hs 257;" f +axisInt src/Geometry/Intersect.hs 262;" f azure src/Color.hs 22;" f bQuadToF src/Geometry/Bezier.hs 37;" f bQuadToLine src/Geometry/Bezier.hs 30;" f @@ -2706,7 +2705,7 @@ backpackCombinations src/Dodge/Combine/Combinations.hs 27;" f backpackShape src/Dodge/Item/Draw/SPic.hs 202;" f backspaceInputted src/Dodge/Update/Input/Text.hs 25;" f bangCone src/Dodge/Item/Held/Cone.hs 11;" f -bangConeShape src/Dodge/Item/Draw/SPic.hs 317;" f +bangConeShape src/Dodge/Item/Draw/SPic.hs 319;" f bangEchoS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 516;" f bangRod src/Dodge/Item/Held/Rod.hs 18;" f bangS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 668;" f @@ -2714,18 +2713,18 @@ bangStick src/Dodge/Item/Held/Stick.hs 15;" f barPP src/Dodge/Room/Foreground.hs 236;" f barrel src/Dodge/Creature/Inanimate.hs 17;" f barrelShape src/Dodge/Render/ShapePicture.hs 70;" f -baseAMRShape src/Dodge/Item/Draw/SPic.hs 420;" f +baseAMRShape src/Dodge/Item/Draw/SPic.hs 422;" f baseBlockPane src/Dodge/Placement/Instance/Wall.hs 86;" f baseCI src/Dodge/Item/Grammar.hs 158;" f -baseCaneShape src/Dodge/Item/Draw/SPic.hs 337;" f +baseCaneShape src/Dodge/Item/Draw/SPic.hs 339;" f baseFloorTileSize src/Tile.hs 45;" f baseItemTriggerType src/Dodge/BaseTriggerType.hs 21;" f -baseRifleShape src/Dodge/Item/Draw/SPic.hs 340;" f -baseRodShape src/Dodge/Item/Draw/SPic.hs 417;" f -baseSMGShape src/Dodge/Item/Draw/SPic.hs 405;" f +baseRifleShape src/Dodge/Item/Draw/SPic.hs 342;" f +baseRodShape src/Dodge/Item/Draw/SPic.hs 419;" f +baseSMGShape src/Dodge/Item/Draw/SPic.hs 407;" f baseShoulder src/Dodge/Creature/Picture.hs 116;" f -baseStickShape src/Dodge/Item/Draw/SPic.hs 314;" f -baseStickShapeX src/Dodge/Item/Draw/SPic.hs 306;" f +baseStickShape src/Dodge/Item/Draw/SPic.hs 316;" f +baseStickShapeX src/Dodge/Item/Draw/SPic.hs 308;" f baseStickSpread src/Dodge/HeldUse.hs 311;" f basicAttentionUpdate src/Dodge/Creature/Perception.hs 128;" f basicAwarenessUpdate src/Dodge/Creature/Perception.hs 38;" f @@ -2810,7 +2809,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 702;" f -cChasm src/Dodge/Room/Tutorial.hs 108;" f +cChasm src/Dodge/Room/Tutorial.hs 109;" f cFilledRect src/Dodge/CharacterEnums.hs 6;" f cWireRect src/Dodge/CharacterEnums.hs 10;" f calcSmoothScroll src/Dodge/SmoothScroll.hs 11;" f @@ -2829,8 +2828,8 @@ cenLasTur src/Dodge/Room/LasTurret.hs 25;" f centerText src/Picture/Base.hs 184;" f centerVaultExplosiveExit src/Dodge/Room/NoNeedWeapon.hs 20;" f centerVaultRoom src/Dodge/Room/Procedural.hs 291;" f -centroid src/Geometry/Polygon.hs 154;" f -centroidNum src/Geometry/Polygon.hs 157;" f +centroid src/Geometry/Polygon.hs 167;" f +centroidNum src/Geometry/Polygon.hs 170;" f chainCreatureUpdates src/Dodge/Creature/ChainUpdates.hs 6;" f chainPairs src/Geometry.hs 363;" f changeSwapOther src/Dodge/Inventory.hs 140;" f @@ -2844,7 +2843,7 @@ chaseCritAwarenessUpdate src/Dodge/Creature/Perception.hs 70;" f chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 114;" f chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 31;" f chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 37;" f -chasmSimpleMaze src/Dodge/Room/Tutorial.hs 175;" f +chasmSimpleMaze src/Dodge/Room/Tutorial.hs 176;" f chasmTest src/Dodge/Creature/Update.hs 131;" f chasmWallToSurface src/Dodge/Base/Collide.hs 110;" f checkCombineSelectionExists src/Dodge/DisplayInventory.hs 100;" f @@ -2872,7 +2871,7 @@ chooseMovementPistol src/Dodge/Humanoid.hs 203;" f chooseMovementPistol' src/Dodge/Humanoid.hs 208;" f chooseMovementSpreadGun src/Dodge/CreatureEffect.hs 88;" f circHitWall src/Dodge/Base/Collide.hs 232;" f -circInPolygon src/Geometry/Polygon.hs 88;" f +circInPolygon src/Geometry/Polygon.hs 101;" f circOnAnyCr src/Dodge/Base/Collide.hs 287;" f circOnSeg src/Geometry.hs 102;" f circOnSegNoEndpoints src/Geometry.hs 92;" f @@ -2908,9 +2907,9 @@ closeItemToSelectionItem src/Dodge/Inventory/SelectionList.hs 208;" f closeItemToTextPictures src/Dodge/Inventory/SelectionList.hs 243;" f closeObjectInfo src/Dodge/Render/HUD.hs 226;" f closestCreatureID src/Dodge/Debug.hs 118;" f -closestPointOnLine src/Geometry/Intersect.hs 281;" f -closestPointOnLineParam src/Geometry/Intersect.hs 297;" f -closestPointOnSeg src/Geometry/Intersect.hs 312;" f +closestPointOnLine src/Geometry/Intersect.hs 286;" f +closestPointOnLineParam src/Geometry/Intersect.hs 302;" f +closestPointOnSeg src/Geometry/Intersect.hs 317;" f cloudEffect src/Dodge/Update.hs 779;" f cloudPoisonDamage src/Dodge/Update/Cloud.hs 10;" f clsNearCirc src/Dodge/Zoning/Cloud.hs 18;" f @@ -2970,8 +2969,8 @@ constructEdges src/Polyhedra.hs 34;" f constructEdgesList src/Polyhedra.hs 43;" f contToIDCont src/Dodge/LevelGen/PlacementHelper.hs 57;" f continueTerminal src/Dodge/Update/Input/InGame.hs 402;" f -convexHull src/Geometry/Polygon.hs 128;" f -convexHullSafe src/Geometry/Polygon.hs 135;" f +convexHull src/Geometry/Polygon.hs 141;" f +convexHullSafe src/Geometry/Polygon.hs 148;" f convexPolysOverlap src/Geometry/ConvexPoly.hs 48;" f coolMachinePistol src/Dodge/Creature/State.hs 101;" f coolMinigun src/Dodge/Creature/State.hs 94;" f @@ -3144,7 +3143,7 @@ dededumS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 628;" f dedumS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 444;" f defDamageMaterial src/Dodge/Material/Damage.hs 22;" f defLSPic src/Dodge/LightSource/Draw.hs 10;" f -defSPic src/Dodge/Item/Draw/SPic.hs 323;" f +defSPic src/Dodge/Item/Draw/SPic.hs 325;" f defaultAimMvType src/Dodge/Creature/MoveType.hs 16;" f defaultAimingCrit src/Dodge/Default/Creature.hs 107;" f defaultAudition src/Dodge/Default/Creature.hs 92;" f @@ -3215,7 +3214,7 @@ destroyMounts src/Dodge/Block.hs 97;" f destroyProjectile src/Dodge/Projectile/Update.hs 160;" f detV src/Geometry/Vector.hs 93;" f detector src/Dodge/Item/Held/Utility.hs 27;" f -detectorColor src/Dodge/Item/Draw/SPic.hs 467;" f +detectorColor src/Dodge/Item/Draw/SPic.hs 469;" f detectorInfo src/Dodge/Item/Info.hs 224;" f determineProjectileTracking src/Dodge/HeldUse.hs 1228;" f diagonalLinesRect src/Dodge/Room/Foreground.hs 52;" f @@ -3588,12 +3587,12 @@ flameSpitter src/Dodge/Item/Held/SprayGuns.hs 23;" f flameThrower src/Dodge/Item/Held/SprayGuns.hs 64;" f flameTorrent src/Dodge/Item/Held/SprayGuns.hs 32;" f flameWall src/Dodge/Item/Held/SprayGuns.hs 48;" f -flamerPic src/Dodge/Item/Draw/SPic.hs 408;" f +flamerPic src/Dodge/Item/Draw/SPic.hs 410;" f flareCircleAt src/Dodge/HeldUse.hs 687;" f flatItemCombinations src/Dodge/Combine/Combinations.hs 51;" f flatLookupItems src/Dodge/Combine.hs 38;" f flatShield src/Dodge/Item/Held/Utility.hs 17;" f -flatShieldEquipSPic src/Dodge/Item/Draw/SPic.hs 454;" f +flatShieldEquipSPic src/Dodge/Item/Draw/SPic.hs 456;" f fleeFrom src/Dodge/CreatureEffect.hs 120;" f fleeFromTarget src/Dodge/CreatureEffect.hs 66;" f flickerMod src/Dodge/Placement/Instance/LightSource/Flicker.hs 10;" f @@ -3613,7 +3612,7 @@ floorItemSPic src/Dodge/Render/ShapePicture.hs 117;" f floorWire src/Dodge/Wire.hs 13;" f foamSprayFadeOutS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 558;" f foamSprayLoopS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 554;" f -foldMTRS src/Dodge/Room/Tutorial.hs 53;" f +foldMTRS src/Dodge/Room/Tutorial.hs 54;" f foldPairs src/ListHelp.hs 37;" f foldrWhileArb src/ListHelp.hs 110;" f followImpulse src/Dodge/Creature/Impulse.hs 39;" f @@ -3678,8 +3677,8 @@ getCloseObj src/Dodge/Update/Input/InGame.hs 533;" f getCommand src/Dodge/Terminal.hs 52;" f getCommands src/Dodge/Terminal.hs 49;" f getCrMoveSpeed src/Dodge/Creature/Statistics.hs 50;" f -getCrsFromRooms src/Dodge/Room/Tutorial.hs 310;" f -getCrsFromRooms' src/Dodge/Room/Tutorial.hs 297;" f +getCrsFromRooms src/Dodge/Room/Tutorial.hs 311;" f +getCrsFromRooms' src/Dodge/Room/Tutorial.hs 298;" f getDistortions src/Dodge/Render.hs 435;" f getGrenadeHitEffect src/Dodge/HeldUse.hs 1296;" f getInventoryPath src/Dodge/Inventory/Path.hs 9;" f @@ -3694,7 +3693,7 @@ getNodePos src/Dodge/Path.hs 31;" f getPJStabiliser src/Dodge/HeldUse.hs 1283;" f getPretty src/AesonHelp.hs 8;" f getPromptTM src/Dodge/Terminal/Type.hs 3;" f -getRoomsFromInts src/Dodge/Room/Tutorial.hs 293;" f +getRoomsFromInts src/Dodge/Room/Tutorial.hs 294;" f getRootItemBounds src/Dodge/Render/HUD.hs 100;" f getRootItemInvID src/Dodge/Inventory/Location.hs 35;" f getSelectedCloseObj src/Dodge/SelectedClose.hs 14;" f @@ -3719,12 +3718,12 @@ glassShat3S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 458;" f glassShat4S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 612;" f glassSwitchBack src/Dodge/Room/Room.hs 72;" f glassSwitchBackCrits src/Dodge/Room/Room.hs 106;" f -glauncherPic src/Dodge/Item/Draw/SPic.hs 414;" f +glauncherPic src/Dodge/Item/Draw/SPic.hs 416;" f glushortSize src/Shader/Parameters.hs 25;" f goToPostStrat src/Dodge/Creature/Strategy.hs 10;" f goToTarget src/Dodge/Creature/ReaderUpdate.hs 138;" f -grahamEliminate src/Geometry/Polygon.hs 149;" f -grahamScan src/Geometry/Polygon.hs 140;" f +grahamEliminate src/Geometry/Polygon.hs 162;" f +grahamScan src/Geometry/Polygon.hs 153;" f grapeCannon src/Dodge/Item/Held/Cone.hs 17;" f graphToEdges src/Dodge/Graph.hs 35;" f graphToIncidence src/Dodge/Graph.hs 40;" f @@ -3772,7 +3771,7 @@ hasLOSIndirect src/Dodge/Base/Collide.hs 310;" f hat src/Dodge/Item/Equipment.hs 76;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 79;" f -headLampShape src/Dodge/Item/Draw/SPic.hs 457;" f +headLampShape src/Dodge/Item/Draw/SPic.hs 459;" f headMap src/Dodge/DoubleTree.hs 249;" f headPQ src/Dodge/Creature/HandPos.hs 115;" f healS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 492;" f @@ -3820,7 +3819,8 @@ icosohedronFaces src/Polyhedra/Geodesic.hs 19;" f ildtPropagate src/Dodge/DoubleTree.hs 111;" f impulsiveAIBefore src/Dodge/Creature/Impulse.hs 24;" f inLink src/Dodge/RoomLink.hs 128;" f -inSegArea src/Geometry/Intersect.hs 328;" f +inSegArea src/Geometry/Intersect.hs 333;" f +inSimplePoly src/Geometry/Polygon.hs 89;" f inTextInputFocus src/Dodge/InputFocus.hs 8;" f incidenceToFunction src/Dodge/Graph.hs 26;" f indefiniteExceptions src/StringHelp.hs 29;" f @@ -3851,25 +3851,25 @@ insertWithNewKeys src/IntMapHelp.hs 70;" f intAnno src/Dodge/Floor.hs 111;" f interactWithCloseObj src/Dodge/SelectedClose.hs 9;" f interpWith src/Dodge/Creature/Boid.hs 11;" f -intersectCircSeg src/Geometry/Intersect.hs 335;" f -intersectCircSegFirst src/Geometry/Intersect.hs 353;" f -intersectCircSegTest src/Geometry/Intersect.hs 346;" f +intersectCircSeg src/Geometry/Intersect.hs 340;" f +intersectCircSegFirst src/Geometry/Intersect.hs 358;" f +intersectCircSegTest src/Geometry/Intersect.hs 351;" f intersectLineLine src/Geometry/Intersect.hs 18;" f intersectLinePlane src/Geometry/Intersect.hs 28;" f intersectLinefromScreen src/Dodge/Debug/Picture.hs 95;" f -intersectSegBezquad src/Geometry/Intersect.hs 266;" f -intersectSegLine src/Geometry/Intersect.hs 117;" f -intersectSegLineFrom src/Geometry/Intersect.hs 87;" f -intersectSegLineext src/Geometry/Intersect.hs 102;" f +intersectSegBezquad src/Geometry/Intersect.hs 271;" f +intersectSegLine src/Geometry/Intersect.hs 122;" f +intersectSegLineext src/Geometry/Intersect.hs 105;" f intersectSegPlane src/Geometry/Intersect.hs 34;" f -intersectSegPolyFirst src/Geometry/Intersect.hs 273;" f +intersectSegPolyFirst src/Geometry/Intersect.hs 278;" f +intersectSegRay src/Geometry/Intersect.hs 90;" f intersectSegSeg src/Geometry/Intersect.hs 69;" f intersectSegSegErrorTest src/Geometry/Intersect.hs 54;" f -intersectSegSegFullTest src/Geometry/Intersect.hs 133;" f -intersectSegSegPreTest src/Geometry/Intersect.hs 166;" f -intersectSegSegTest src/Geometry/Intersect.hs 152;" f +intersectSegSegFullTest src/Geometry/Intersect.hs 138;" f +intersectSegSegPreTest src/Geometry/Intersect.hs 171;" f +intersectSegSegTest src/Geometry/Intersect.hs 157;" f intersectSegSurface src/Geometry/Intersect.hs 43;" f -intersectSegsSeg src/Geometry/Intersect.hs 262;" f +intersectSegsSeg src/Geometry/Intersect.hs 267;" f intervalList src/Geometry.hs 315;" f interweave src/Justify.hs 17;" f introScan src/Dodge/Item/Scope.hs 57;" f @@ -3910,23 +3910,23 @@ isConnected src/Dodge/Inventory/Swap.hs 76;" f isCornerLink src/Dodge/RoomLink.hs 65;" f isElectrical src/Dodge/Machine/Update.hs 83;" f isGroupSelectableSection src/Dodge/Update/Input/InGame.hs 197;" f -isInLnk src/Dodge/PlacementSpot.hs 168;" f +isInLnk src/Dodge/PlacementSpot.hs 161;" f isJust' src/MaybeHelp.hs 29;" f -isLHS src/Geometry/LHS.hs 8;" f +isLHS src/Geometry/LHS.hs 11;" f isLeftOf src/Geometry.hs 202;" f isLeftOfA src/Geometry.hs 196;" f isMidEdgeLink src/Dodge/RoomLink.hs 56;" f isNHS src/Geometry/Intersect.hs 51;" f isNothing' src/MaybeHelp.hs 33;" f isOnSeg src/Geometry.hs 240;" f -isOutLnk src/Dodge/PlacementSpot.hs 173;" f +isOutLnk src/Dodge/PlacementSpot.hs 166;" f isOverTerminalScreen src/Dodge/Update.hs 383;" f isPulseLaser src/Dodge/IsPulseLaser.hs 10;" f isPutID src/Dodge/Placement/Instance/Wall.hs 129;" f -isRHS src/Geometry/LHS.hs 24;" f -isUnusedLnk src/Dodge/PlacementSpot.hs 62;" f -isUnusedLnkType src/Dodge/PlacementSpot.hs 197;" f -isUsedLnkUnplaced src/Dodge/PlacementSpot.hs 181;" f +isRHS src/Geometry/LHS.hs 32;" f +isUnusedLnk src/Dodge/PlacementSpot.hs 61;" f +isUnusedLnkType src/Dodge/PlacementSpot.hs 190;" f +isUsedLnkUnplaced src/Dodge/PlacementSpot.hs 174;" f isValidCommand src/Dodge/Debug/Terminal.hs 134;" f isVowel src/StringHelp.hs 8;" f isWalkable src/Dodge/Base/Collide.hs 317;" f @@ -3997,10 +3997,10 @@ keyCard src/Dodge/Item/Held/Utility.hs 20;" f keyCardAnalyserByDoor src/Dodge/Room/LasTurret.hs 78;" f keyCardRoomRunPast src/Dodge/Room/LasTurret.hs 66;" f keyCardRunPastRand src/Dodge/LockAndKey.hs 36;" f -keyPic src/Dodge/Item/Draw/SPic.hs 473;" f +keyPic src/Dodge/Item/Draw/SPic.hs 475;" f keyholeCorridor src/Dodge/Room/Corridor.hs 39;" f knifeS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 638;" f -lChasm src/Dodge/Room/Tutorial.hs 117;" f +lChasm src/Dodge/Room/Tutorial.hs 118;" f lConnect src/Dodge/Render/Connectors.hs 42;" f lConnectMulti src/Dodge/Render/Connectors.hs 46;" f lShape src/Dodge/Placement/Instance/LightSource.hs 90;" f @@ -4009,7 +4009,7 @@ lampCover src/Dodge/Placement/Instance/LightSource/Cover.hs 8;" f lampCoverWhen src/Dodge/Placement/Instance/LightSource/Cover.hs 19;" f lampCrSPic src/Dodge/Render/ShapePicture.hs 75;" f lasCenSensEdge src/Dodge/Room/LasTurret.hs 141;" f -lasGunPic src/Dodge/Item/Draw/SPic.hs 426;" f +lasGunPic src/Dodge/Item/Draw/SPic.hs 428;" f lasPulseS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 526;" f lasSensorTurretTest src/Dodge/Room/LasTurret.hs 134;" f lasTunnel src/Dodge/Room/LasTurret.hs 153;" f @@ -4041,7 +4041,7 @@ leftLegPQ src/Dodge/Creature/HandPos.hs 84;" f leftPad src/Padding.hs 15;" f leftRightCombine src/Dodge/Item/Grammar.hs 197;" f leftWristPQ src/Dodge/Creature/HandPos.hs 81;" f -legsSPic src/Dodge/Item/Draw/SPic.hs 482;" f +legsSPic src/Dodge/Item/Draw/SPic.hs 484;" f liShape src/Dodge/Placement/Instance/LightSource.hs 112;" f light src/Color.hs 104;" f lightSensByDoor src/Dodge/Room/LasTurret.hs 51;" f @@ -4049,7 +4049,7 @@ lightSensInsideDoor src/Dodge/Room/LasTurret.hs 39;" f lightSensor src/Dodge/Placement/Instance/Sensor.hs 42;" f lightsToRender src/Dodge/Render/Lights.hs 14;" f lightx4 src/Color.hs 145;" f -linGrad src/Geometry/Intersect.hs 250;" f +linGrad src/Geometry/Intersect.hs 255;" f line src/Picture/Base.hs 226;" f lineCol src/Picture/Base.hs 230;" f lineGeom src/Dodge/Base.hs 32;" f @@ -4251,7 +4251,7 @@ mglCreate src/GLHelp.hs 8;" f mglDelete src/GLHelp.hs 14;" f midBarDecoration src/Dodge/Placement/TopDecoration.hs 16;" f midBounds src/Dodge/Room/Foreground.hs 151;" f -midChasm src/Dodge/Room/Tutorial.hs 138;" f +midChasm src/Dodge/Room/Tutorial.hs 139;" f midPad src/Padding.hs 27;" f midPadL src/Padding.hs 33;" f midPoint src/Geometry.hs 84;" f @@ -4262,8 +4262,8 @@ minOn src/FoldableHelp.hs 35;" f mini1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 452;" f miniGunCrit src/Dodge/Creature.hs 63;" f miniGunX src/Dodge/Item/Held/Cane.hs 33;" f -miniGunXPict src/Dodge/Item/Draw/SPic.hs 386;" f -miniGunXPictItem src/Dodge/Item/Draw/SPic.hs 383;" f +miniGunXPict src/Dodge/Item/Draw/SPic.hs 388;" f +miniGunXPictItem src/Dodge/Item/Draw/SPic.hs 385;" f miniS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 716;" f miniTree2 src/Dodge/Room/Room.hs 113;" f minimumOn src/FoldlHelp.hs 14;" f @@ -4324,8 +4324,8 @@ mvPointToward src/Dodge/Base.hs 136;" f mvPointTowardAtSpeed src/Dodge/Base.hs 105;" f mvProp src/Dodge/Placement/PlaceSpot.hs 174;" f mvPs src/Dodge/Wall/Move.hs 58;" f -myIntersectLineLine src/Geometry/Intersect.hs 207;" f -myIntersectSegSeg src/Geometry/Intersect.hs 185;" f +myIntersectLineLine src/Geometry/Intersect.hs 212;" f +myIntersectSegSeg src/Geometry/Intersect.hs 190;" f myParams src/Dodge/Combine/Graph.hs 103;" f nRays src/Geometry.hs 185;" f nRaysRad src/Geometry.hs 189;" f @@ -4353,6 +4353,7 @@ normalizeAnglePi src/Dodge/Base.hs 154;" f normalizeColor src/Color.hs 76;" f normalizeV src/Geometry/Vector.hs 43;" f normalizeV3 src/Geometry/Vector3D.hs 84;" f +notLink src/Dodge/Data/Room.hs 72;" f nulgate src/Dodge/Item/Scope.hs 95;" f numColor src/Color.hs 128;" f numDrawableVertices src/Shader/Parameters.hs 34;" f @@ -4382,14 +4383,14 @@ optionsToSelections src/Dodge/Menu/Option.hs 47;" f orRegex src/Dodge/DisplayInventory.hs 81;" f orange src/Color.hs 25;" f orderAround3 src/Geometry/Vector3D.hs 105;" f -orderAroundFirst src/Geometry/Polygon.hs 106;" f -orderAroundFirstReverse src/Geometry/Polygon.hs 102;" f -orderPolygon src/Geometry/Polygon.hs 111;" f -orderPolygonAround src/Geometry/Polygon.hs 94;" f +orderAroundFirst src/Geometry/Polygon.hs 119;" f +orderAroundFirstReverse src/Geometry/Polygon.hs 115;" f +orderPolygon src/Geometry/Polygon.hs 124;" f +orderPolygonAround src/Geometry/Polygon.hs 107;" f orientAttachment src/Dodge/Item/Orientation.hs 31;" f orientByParentChSF src/Dodge/Item/Orientation.hs 24;" f orientChild src/Dodge/Item/Orientation.hs 13;" f -orthogonalPointOnSeg src/Geometry/Intersect.hs 321;" f +orthogonalPointOnSeg src/Geometry/Intersect.hs 326;" f outLink src/Dodge/RoomLink.hs 120;" f outsideScreenPolygon src/Dodge/Debug/Picture.hs 43;" f outwardIntegers src/Dodge/Base.hs 181;" f @@ -4503,7 +4504,7 @@ pnsNearSeg src/Dodge/Zoning/Pathing.hs 15;" f pointIfNotClose src/Dodge/LevelGen/StaticWalls/Deprecated.hs 68;" f pointInCircle src/Geometry.hs 212;" f pointInOrOnPolygon src/Geometry/Polygon.hs 77;" f -pointInPoly src/Geometry/Polygon.hs 84;" f +pointInPoly src/Geometry/Polygon.hs 85;" f pointIsInCone src/Geometry.hs 378;" f pointIsOnScreen src/Dodge/Base/Window.hs 59;" f pointTowardsImpulse src/Dodge/Path.hs 63;" f @@ -4551,8 +4552,8 @@ pokeWall src/Shader/Poke.hs 78;" f pokeWallsWindows src/Shader/Poke.hs 50;" f poly3 src/Picture/Base.hs 84;" f poly3Col src/Picture/Base.hs 88;" f -polyChasm src/Dodge/Room/Tutorial.hs 159;" f -polyChasmC src/Dodge/Room/Tutorial.hs 168;" f +polyChasm src/Dodge/Room/Tutorial.hs 160;" f +polyChasmC src/Dodge/Room/Tutorial.hs 169;" f polyCirc src/Shape.hs 46;" f polyCircx src/Shape.hs 51;" f polyCornerDist src/Geometry/Polygon.hs 60;" f @@ -4622,9 +4623,9 @@ psPt src/Dodge/LevelGen/PlacementHelper.hs 24;" f psPtCont src/Dodge/LevelGen/PlacementHelper.hs 18;" f psPtJpl src/Dodge/LevelGen/PlacementHelper.hs 12;" f psPtPl src/Dodge/LevelGen/PlacementHelper.hs 9;" f -psRandRanges src/Dodge/PlacementSpot.hs 267;" f +psRandRanges src/Dodge/PlacementSpot.hs 260;" f psj src/Dodge/LevelGen/PlacementHelper.hs 70;" f -psposAddLabel src/Dodge/PlacementSpot.hs 70;" f +psposAddLabel src/Dodge/PlacementSpot.hs 69;" f pt0 src/Dodge/LevelGen/PlacementHelper.hs 54;" f ptCont src/Dodge/LevelGen/PlacementHelper.hs 21;" f pulseChecker src/Dodge/Item/Equipment.hs 103;" f @@ -4674,7 +4675,7 @@ radBounds src/Dodge/Room/Foreground.hs 154;" f radToDeg src/Geometry/Vector.hs 122;" f randBlockBreakWeapon src/Dodge/Item/Random.hs 7;" f randC1 src/Dodge/Placement/Instance/Creature.hs 8;" f -randDirPS src/Dodge/PlacementSpot.hs 57;" f +randDirPS src/Dodge/PlacementSpot.hs 56;" f randDirSpark src/Dodge/Spark.hs 55;" f randEdgeTank src/Dodge/Room/Tanks.hs 33;" f randEdgeTanks src/Dodge/Room/Tanks.hs 63;" f @@ -4708,7 +4709,7 @@ randomTank src/Dodge/Room/Tanks.hs 19;" f randomTreeStructure src/Dodge/Layout/Generate.hs 18;" f randsOnCirc src/RandomHelp.hs 127;" f randsSpread src/RandomHelp.hs 120;" f -ratIntersectLineLine src/Geometry/Intersect.hs 225;" f +ratIntersectLineLine src/Geometry/Intersect.hs 230;" f readSaveSlot src/Dodge/Save.hs 45;" f recoilAmount src/Dodge/HeldUse.hs 459;" f rectNSWE src/Geometry/Polygon.hs 14;" f @@ -4743,7 +4744,7 @@ removeAimPosture src/Dodge/Creature/YourControl.hs 158;" f removeAmmoFromMag src/Dodge/HeldUse.hs 920;" f removeDot src/ShortShow.hs 40;" f removeInverseWalls src/Dodge/LevelGen/StaticWalls.hs 25;" f -removeLights src/Dodge/Room/Tutorial.hs 211;" f +removeLights src/Dodge/Room/Tutorial.hs 212;" f removeShieldWall src/Dodge/Item/BackgroundEffect.hs 57;" f removeWallsInPolygon src/Dodge/LevelGen/StaticWalls.hs 182;" f renderDataResizeUpdate src/Preload/Update.hs 26;" f @@ -4757,7 +4758,7 @@ renderShadows src/Render.hs 117;" f replaceNullWith src/Dodge/Creature/ReaderUpdate.hs 162;" f replacePutID src/Dodge/Placement/Instance/Wall.hs 102;" f resetCrVocCoolDown src/Dodge/Creature/Vocalization.hs 47;" f -resetPLUse src/Dodge/PlacementSpot.hs 99;" f +resetPLUse src/Dodge/PlacementSpot.hs 92;" f resetStride src/Dodge/Creature/State/WalkCycle.hs 24;" f resetTerminal src/Dodge/WorldEffect.hs 104;" f resizeFBOTO src/Framebuffer/Update.hs 203;" f @@ -4795,7 +4796,7 @@ rightPad src/Padding.hs 19;" f rightPadNoSquash src/Padding.hs 23;" f rightWristPQ src/Dodge/Creature/HandPos.hs 57;" f rlPosDir src/Dodge/RoomLink.hs 112;" f -rlauncherPic src/Dodge/Item/Draw/SPic.hs 411;" f +rlauncherPic src/Dodge/Item/Draw/SPic.hs 413;" f rmInLinks src/Dodge/RoomLink.hs 153;" f rmInvItem src/Dodge/Inventory.hs 73;" f rmLinksOfType src/Dodge/RoomLink.hs 150;" f @@ -4842,16 +4843,15 @@ rotateToZ src/Quaternion.hs 39;" f rotateV src/Geometry/Vector.hs 105;" f rotateVAround src/Geometry/Vector.hs 112;" f rotateXY src/Polyhedra.hs 31;" f -roundPoint2 src/Geometry/Intersect.hs 246;" f +roundPoint2 src/Geometry/Intersect.hs 251;" f roundTank src/Dodge/Placement/Instance/Tank.hs 25;" f roundTankCross src/Dodge/Placement/Instance/Tank.hs 31;" f -rpIsOffPath src/Dodge/PlacementSpot.hs 82;" f -rpIsOnPath src/Dodge/PlacementSpot.hs 76;" f -rpOffPathFromEdge src/Dodge/PlacementSpot.hs 88;" f -rpOnPathFromEdge src/Dodge/PlacementSpot.hs 94;" f -rprBool src/Dodge/PlacementSpot.hs 73;" f -rprBoolShift src/Dodge/PlacementSpot.hs 114;" f -rprShift src/Dodge/PlacementSpot.hs 105;" f +rpIsOffGrid src/Dodge/PlacementSpot.hs 81;" f +rpIsOnGrid src/Dodge/PlacementSpot.hs 75;" f +rpOffPathFromEdge src/Dodge/PlacementSpot.hs 87;" f +rprBool src/Dodge/PlacementSpot.hs 72;" f +rprBoolShift src/Dodge/PlacementSpot.hs 107;" f +rprShift src/Dodge/PlacementSpot.hs 98;" f rsObjectColor src/Dodge/RadarSweep/Draw.hs 34;" f runPastStart src/Dodge/Room/Start.hs 72;" f runStateWorld src/Dodge/Randify.hs 17;" f @@ -4928,7 +4928,7 @@ sensorReqToString src/Dodge/Machine/Update.hs 196;" f sensorRoom src/Dodge/Room/SensorDoor.hs 26;" f sensorRoomRunPast src/Dodge/Room/SensorDoor.hs 46;" f sensorSPic src/Dodge/Machine/Draw.hs 81;" f -sensorTut src/Dodge/Room/Tutorial.hs 319;" f +sensorTut src/Dodge/Room/Tutorial.hs 320;" f sensorTypeDamages src/Dodge/Machine/Update.hs 233;" f sentinelAI src/Dodge/Creature/SentinelAI.hs 20;" f sentinelExtraWatchUpdate src/Dodge/Creature/SentinelAI.hs 83;" f @@ -4938,8 +4938,8 @@ setChannelPos src/Sound.hs 150;" f setClickWorldPos src/Dodge/Update.hs 99;" f setClusterID src/Dodge/Combine/Graph.hs 116;" f setDepth src/Picture/Base.hs 128;" f -setDirPS src/Dodge/PlacementSpot.hs 50;" f -setFallback src/Dodge/PlacementSpot.hs 132;" f +setDirPS src/Dodge/PlacementSpot.hs 49;" f +setFallback src/Dodge/PlacementSpot.hs 125;" f setInLinks src/Dodge/RoomLink.hs 53;" f setInLinksByType src/Dodge/RoomLink.hs 72;" f setInLinksPD src/Dodge/RoomLink.hs 92;" f @@ -4954,7 +4954,7 @@ setOutLinks src/Dodge/RoomLink.hs 50;" f setOutLinksByType src/Dodge/RoomLink.hs 75;" f setOutLinksPD src/Dodge/RoomLink.hs 95;" f setRBCreatureTargeting src/Dodge/Creature/State.hs 288;" f -setRoomInt src/Dodge/Room/Tutorial.hs 60;" f +setRoomInt src/Dodge/Room/Tutorial.hs 61;" f setSelWhileDragging src/Dodge/Update/Input/InGame.hs 337;" f setSelectionListRestriction src/Dodge/Update/Input/ScreenLayer.hs 87;" f setShaderSource src/Shader/Compile.hs 290;" f @@ -4964,7 +4964,7 @@ setTargetMv src/Dodge/Creature/ReaderUpdate.hs 76;" f setTile src/Dodge/Layout.hs 66;" f setTiles src/Dodge/Layout.hs 63;" f setToggle src/Dodge/Prop/Update.hs 44;" f -setTreeInts src/Dodge/Room/Tutorial.hs 67;" f +setTreeInts src/Dodge/Room/Tutorial.hs 68;" f setViewDistance src/Dodge/Update/Camera.hs 236;" f setViewPos src/Dodge/Creature/ReaderUpdate.hs 63;" f setViewport src/Dodge/Render.hs 440;" f @@ -4995,7 +4995,7 @@ shapePoints src/Dodge/Room/Foreground.hs 145;" f shapeVerxAttributes src/Shape/Parameters.hs 13;" f shapeVerxSize src/Shape/Parameters.hs 10;" f shatterGun src/Dodge/Item/Held/Weapons.hs 8;" f -shatterGunSPic src/Dodge/Item/Draw/SPic.hs 326;" f +shatterGunSPic src/Dodge/Item/Draw/SPic.hs 328;" f shatterWall src/Dodge/Item/Weapon/Shatter.hs 26;" f shellExplosionCheck src/Dodge/Projectile/Update.hs 56;" f shellHitCreature src/Dodge/Projectile/Update.hs 84;" f @@ -5005,10 +5005,10 @@ shellMag src/Dodge/Item/Ammo.hs 49;" f shellModule src/Dodge/Item/Scope.hs 123;" f shellShape src/Dodge/Projectile/Draw.hs 35;" f shieldWall src/Dodge/Item/BackgroundEffect.hs 77;" f -shiftByV2 src/Dodge/PlacementSpot.hs 257;" f +shiftByV2 src/Dodge/PlacementSpot.hs 250;" f shiftChildren src/Dodge/Tree/Compose.hs 44;" f shiftDraw src/Dodge/Render/ShapePicture.hs 80;" f -shiftInBy src/Dodge/PlacementSpot.hs 254;" f +shiftInBy src/Dodge/PlacementSpot.hs 247;" f shiftInvItems src/Dodge/Update/Input/InGame.hs 305;" f shiftInvItemsDown src/Dodge/Update/Input/InGame.hs 350;" f shiftInvItemsUp src/Dodge/Update/Input/InGame.hs 344;" f @@ -5054,8 +5054,8 @@ showInventoryPathing src/Dodge/Item/Display.hs 86;" f showManObj src/Dodge/TestString.hs 45;" f showTerminalError src/Dodge/Debug/Terminal.hs 80;" f showTimeFlow src/Dodge/TestString.hs 68;" f -shrinkPolyOnEdges src/Geometry/Polygon.hs 160;" f -shrinkVert src/Geometry/Polygon.hs 164;" f +shrinkPolyOnEdges src/Geometry/Polygon.hs 173;" f +shrinkVert src/Geometry/Polygon.hs 177;" f shuffle src/RandomHelp.hs 49;" f shuffleLinks src/Dodge/Room/Link.hs 30;" f shuffleRoomPos src/Dodge/Layout.hs 76;" f @@ -5247,7 +5247,7 @@ terminalScreenGlow src/Dodge/Machine/Update.hs 39;" f terminalShape src/Dodge/Machine/Draw.hs 43;" f terminalWheelEvent src/Dodge/Update/Scroll.hs 131;" f teslaGun src/Dodge/Item/Held/BatteryGuns.hs 19;" f -teslaGunPic src/Dodge/Item/Draw/SPic.hs 423;" f +teslaGunPic src/Dodge/Item/Draw/SPic.hs 425;" f teslaParams src/Dodge/Item/Held/BatteryGuns.hs 25;" f testCrossWalls src/Dodge/Room/Path.hs 41;" f testEvent src/Dodge/Event/Test.hs 9;" f @@ -5333,7 +5333,7 @@ tractCr src/Dodge/TractorBeam/Update.hs 27;" f tractFlIt src/Dodge/TractorBeam/Update.hs 22;" f tractorBeamAt src/Dodge/HeldUse.hs 806;" f tractorGun src/Dodge/Item/Held/BatteryGuns.hs 53;" f -tractorGunPic src/Dodge/Item/Draw/SPic.hs 451;" f +tractorGunPic src/Dodge/Item/Draw/SPic.hs 453;" f tractorPullPos src/Dodge/TractorBeam/Update.hs 32;" f tractorSPic src/Dodge/TractorBeam/Draw.hs 10;" f tranRot src/Picture/Base.hs 124;" f @@ -5398,13 +5398,13 @@ tryUseParent src/Dodge/Creature/State.hs 144;" f turnTo src/Dodge/Movement/Turn.hs 8;" f turret src/Dodge/Placement/Instance/Turret.hs 37;" f turretItemOffset src/Dodge/Item/HeldOffset.hs 21;" f -tutAnoTree src/Dodge/Room/Tutorial.hs 40;" f -tutDrop src/Dodge/Room/Tutorial.hs 72;" f -tutHub src/Dodge/Room/Tutorial.hs 218;" f -tutLight src/Dodge/Room/Tutorial.hs 196;" f -tutRezBox src/Dodge/Room/Tutorial.hs 330;" f +tutAnoTree src/Dodge/Room/Tutorial.hs 41;" f +tutDrop src/Dodge/Room/Tutorial.hs 73;" f +tutHub src/Dodge/Room/Tutorial.hs 219;" f +tutLight src/Dodge/Room/Tutorial.hs 197;" f +tutRezBox src/Dodge/Room/Tutorial.hs 331;" f tutRoomTree src/Dodge/Floor.hs 21;" f -tutorialMessage1 src/Dodge/Room/Tutorial.hs 354;" f +tutorialMessage1 src/Dodge/Room/Tutorial.hs 355;" f tweenAngles src/Geometry/Vector.hs 195;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 81;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 29;" f @@ -5412,7 +5412,7 @@ twists src/Dodge/Creature/Test.hs 99;" f twoFlat src/Dodge/Creature/Test.hs 96;" f twoFlatHRot src/Dodge/Item/HeldOffset.hs 81;" f twoHandTwistAmount src/Dodge/Creature/YourControl.hs 165;" f -twoRoomPoss src/Dodge/PlacementSpot.hs 153;" f +twoRoomPoss src/Dodge/PlacementSpot.hs 146;" f twoStep1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 544;" f twoStepS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 596;" f twoStepSlowS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 586;" f @@ -5431,10 +5431,10 @@ unsafeSwapKeys src/IntMapHelp.hs 74;" f unshadowBlock src/Dodge/Block.hs 39;" f untilJust src/MonadHelp.hs 7;" f untilJustCount src/MonadHelp.hs 14;" f -unusedOffPathAwayFromLink src/Dodge/PlacementSpot.hs 138;" f -unusedSpotAwayFromInLink src/Dodge/PlacementSpot.hs 144;" f -unusedSpotAwayFromLink src/Dodge/PlacementSpot.hs 126;" f -unusedSpotNearInLink src/Dodge/PlacementSpot.hs 203;" f +unusedOffPathAwayFromLink src/Dodge/PlacementSpot.hs 131;" f +unusedSpotAwayFromInLink src/Dodge/PlacementSpot.hs 137;" f +unusedSpotAwayFromLink src/Dodge/PlacementSpot.hs 119;" f +unusedSpotNearInLink src/Dodge/PlacementSpot.hs 196;" f updateAimPos src/Dodge/Update.hs 302;" f updateAllNodes src/TreeHelp.hs 86;" f updateArc src/Dodge/Tesla.hs 44;" f @@ -5576,19 +5576,19 @@ useHotkey src/Dodge/Creature/YourControl.hs 76;" f useInventoryPath src/Dodge/HeldUse.hs 1427;" f useItem src/Dodge/Creature/Impulse/UseItem.hs 19;" f useItemLoc src/Dodge/Creature/Impulse/UseItem.hs 26;" f -useLnkRoomPos src/Dodge/PlacementSpot.hs 262;" f +useLnkRoomPos src/Dodge/PlacementSpot.hs 255;" f useLoadedAmmo src/Dodge/HeldUse.hs 716;" f useMagShield src/Dodge/Euse.hs 27;" f useNormalCamera src/Dodge/Camera.hs 6;" f usePayload src/Dodge/Payload.hs 18;" f useRewindGun src/Dodge/HeldUse.hs 1387;" f -useRoomPosCond src/Dodge/PlacementSpot.hs 187;" f -useRoomPosRoomCond src/Dodge/PlacementSpot.hs 190;" f +useRoomPosCond src/Dodge/PlacementSpot.hs 180;" f +useRoomPosRoomCond src/Dodge/PlacementSpot.hs 183;" f useStopWatch src/Dodge/HeldUse.hs 1368;" f useTimeScrollGun src/Dodge/HeldUse.hs 1376;" f -useUnusedLnk src/Dodge/PlacementSpot.hs 178;" f -usedRoomInLinkPoss src/Dodge/PlacementSpot.hs 209;" f -usedRoomLinkPoss src/Dodge/PlacementSpot.hs 216;" f +useUnusedLnk src/Dodge/PlacementSpot.hs 171;" f +usedRoomInLinkPoss src/Dodge/PlacementSpot.hs 202;" f +usedRoomLinkPoss src/Dodge/PlacementSpot.hs 209;" f v2z src/Geometry/Vector3D.hs 93;" f vCen3 src/Geometry/Vector3D.hs 115;" f vInverse src/Geometry/Vector.hs 153;" f @@ -5618,7 +5618,7 @@ visibleWalls src/Dodge/Base/Collide.hs 207;" f visionCheck src/Dodge/Creature/Perception.hs 153;" f vocalizationTest src/Dodge/Creature/Vocalization.hs 42;" f volleyGun src/Dodge/Item/Held/Cane.hs 15;" f -volleyGunShape src/Dodge/Item/Draw/SPic.hs 371;" f +volleyGunShape src/Dodge/Item/Draw/SPic.hs 373;" f walkNozzle src/Dodge/HeldUse.hs 782;" f walkableNodeNear src/Dodge/Path.hs 48;" f wallBlips src/Dodge/RadarSweep.hs 98;" f @@ -5715,7 +5715,7 @@ 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 126;" f +zChasm src/Dodge/Room/Tutorial.hs 127;" f zConnect src/Dodge/Render/Connectors.hs 17;" f zConnectCol src/Dodge/Render/Connectors.hs 28;" f zConnectColMidX src/Dodge/Render/Connectors.hs 31;" f