From 508b848204c5e8e52439d5371667877eb18ce2e0 Mon Sep 17 00:00:00 2001 From: justin Date: Thu, 19 Mar 2026 11:40:49 +0000 Subject: [PATCH] Function for adding random lights to roomNGon --- src/Dodge/Data/GenWorld.hs | 13 +- src/Dodge/Data/Room.hs | 5 + src/Dodge/Floor.hs | 2 +- src/Dodge/Layout.hs | 143 +++++---- src/Dodge/LockAndKey.hs | 5 +- src/Dodge/Placement/Instance/LightSource.hs | 5 +- src/Dodge/Placement/PlaceSpot.hs | 6 +- src/Dodge/Room/Airlock.hs | 2 +- src/Dodge/Room/Containing.hs | 24 +- src/Dodge/Room/Door.hs | 2 +- src/Dodge/Room/LasTurret.hs | 19 +- src/Dodge/Room/Modify.hs | 78 ++++- src/Dodge/Room/Ngon.hs | 1 + src/Dodge/Room/Room.hs | 8 +- src/Dodge/Room/SensorDoor.hs | 51 ++-- src/Dodge/Room/Start.hs | 5 +- src/Dodge/Room/Tutorial.hs | 12 +- src/Dodge/TestString.hs | 7 +- src/RandomHelp.hs | 92 +++--- tags | 309 ++++++++++---------- 20 files changed, 453 insertions(+), 336 deletions(-) diff --git a/src/Dodge/Data/GenWorld.hs b/src/Dodge/Data/GenWorld.hs index 269c9999d..648fda0ed 100644 --- a/src/Dodge/Data/GenWorld.hs +++ b/src/Dodge/Data/GenWorld.hs @@ -100,6 +100,8 @@ data PlacementSpot | PSNoShiftCont {_psPos :: Point2, _psRot :: Float} | PSPos { _psSelect :: RoomPos -> Room -> Maybe (PlacementSpot, RoomPos) + -- looks for the first rp for which a rp rm returns Just (ps,rp'), + -- replaces the rp with rp' , _psRoomEff :: RoomPos -> Room -> Room , _psFallback :: Maybe Placement } @@ -138,7 +140,7 @@ data Room = Room , _rmPos :: [RoomPos] , _rmPath :: S.Set (Point2, Point2) , _rmPmnts :: [Placement] - , _rmInPmnt :: [(Int,GenWorld -> Placement)] -- so far as I can tell, + , _rmInPmnt :: [(Int,GenWorld -> State StdGen Placement)] -- so far as I can tell, -- the first Int only determines the order in which these are applied , _rmBound :: [[Point2]] , _rmFloor :: Floor @@ -162,3 +164,12 @@ makeLenses ''RoomType makeLenses ''PSType makeLenses ''PlacementSpot makeLenses ''Placement + +-- I may regret this. I believe it satisfies associativity, but haven't thought +-- about it too much. +instance Semigroup Placement where + p <> q = p & plIDCont %~ f + where + f g gw pl = case g gw pl of + Nothing -> Just q + Just r -> Just $ r & plIDCont %~ f diff --git a/src/Dodge/Data/Room.hs b/src/Dodge/Data/Room.hs index c8e540293..9ca258726 100644 --- a/src/Dodge/Data/Room.hs +++ b/src/Dodge/Data/Room.hs @@ -38,6 +38,10 @@ data RoomType , _rmWidth :: Float , _rmHeight :: Float } + | RoomNgon + { _rmngonSides :: Int + , _rmngonSize :: Float + } deriving (Eq, Ord) data RoomLinkType @@ -81,6 +85,7 @@ data RoomPosFlag = RoomPosOnGrid {_onGridFromEdges :: S.Set PathFromEdge} | RoomPosOffGrid {_offGridFromEdges :: S.Set PathFromEdge} | RoomPosOnFloor + | ColoredLightRP deriving (Eq, Ord, Show) data UsedPos diff --git a/src/Dodge/Floor.hs b/src/Dodge/Floor.hs index 23955ec9f..7ee7952bc 100644 --- a/src/Dodge/Floor.hs +++ b/src/Dodge/Floor.hs @@ -25,7 +25,7 @@ initialRoomTree = foldMTRS $ intersperse (zoom lyGen doorCor) - [ intAnno startRoom + [ startRoom , passthroughLockKeyLists [(sensorRoomRunPast ElectricSensor, takeOne [-- CRAFT (ENERGYBALLCRAFT TeslaBall) , diff --git a/src/Dodge/Layout.hs b/src/Dodge/Layout.hs index 52733c74d..c46ef6d84 100644 --- a/src/Dodge/Layout.hs +++ b/src/Dodge/Layout.hs @@ -1,25 +1,27 @@ {-# LANGUAGE TupleSections #-} + module Dodge.Layout ( generateLevelFromRoomList, tilesFromRooms, shuffleRoomPos, ) where -import qualified Data.Vector.Unboxed as UV ---import Dodge.Path.Translate +-- import Dodge.Path.Translate import qualified Control.Foldl as L import Control.Lens import Data.Foldable import Data.Function ---import Data.Graph.Inductive (labEdges, labNodes) -import Data.List (nubBy,sortOn) +import Linear +-- import Data.Graph.Inductive (labEdges, labNodes) +import Data.List (nubBy, sortOn) import Data.Maybe import Data.Tile ---import Data.Traversable +import qualified Data.Vector.Unboxed as UV +-- import Data.Traversable import Dodge.Data.GenWorld import Dodge.Default.Wall import Dodge.GameRoom ---import Dodge.Item.Location.Initialize +-- import Dodge.Item.Location.Initialize import Dodge.LevelGen.LevelStructure import Dodge.LevelGen.StaticWalls import Dodge.Path @@ -37,29 +39,27 @@ generateLevelFromRoomList gr' w = over gwWorld initWallZoning . over gwWorld randomCompass . over gwWorld setupWorldBounds --- . over (gwWorld . cWorld . lWorld) initItemLocations . doInPlacements --- . doOutPlacements . doIndividualPlacements . setTiles . worldToGenWorld rs' - $ w & cWorld . lWorld . walls .~ wallsFromRooms rs + $ w + & cWorld . lWorld . walls .~ wallsFromRooms rs & cWorld . cwGen . cwgGameRooms .~ gameRoomsFromRooms (IM.elems rs') & cWorld . incNode .~ inodes & cWorld . incGraph .~ igraph & cWorld . incEdges .~ ipairs - & incNodeZoning .~ UV.ifoldl' (\m i p -> zonePn (i,p) m) mempty inodes + & incNodeZoning .~ UV.ifoldl' (\m i p -> zonePn (i, p) m) mempty inodes & incEdgeZoning .~ foldl' (flip (zoneIncPe inodes)) mempty ipairs where pairs = snapToGrid $ foldMap _rmPath rs - (inodes,igraph,ipairs) = pairsToIncGraph pairs + (inodes, igraph, ipairs) = pairsToIncGraph pairs rs = map doRoomShift $ IM.elems rs' rs' = mapM shuffleRoomPos gr' & evalState $ _randGen w - randomCompass :: World -> World -randomCompass w = w - & wCam . camRot .~ (takeOne [0, 0.5 * pi, pi, 1.5 * pi] & evalState $ _randGen w) +randomCompass w = + w & wCam . camRot .~ (takeOne [0, 0.5 * pi, pi, 1.5 * pi] & evalState $ _randGen w) -- note the order of traversal of the rooms is important -- hence the reverse @@ -70,65 +70,61 @@ setTiles gw = foldr setTile gw . reverse . IM.elems $ _genRooms gw setTile :: Room -> GenWorld -> GenWorld setTile r gw = case _rmFloor r of Tiled{} -> gw - InheritFloor -> gw - & genRooms . ix (fromJust (_rmMID r)) . rmFloor .~ Tiled [t & tilePoly .~ poly] + InheritFloor -> + gw & genRooms . ix (fromJust (_rmMID r)) . rmFloor .~ Tiled [t & tilePoly .~ poly] where t = case _rmMParent r of Nothing -> Tile poly (V2 0 0) (V2 1 0) 16 Just pid -> head $ _tiles $ _rmFloor $ _genRooms gw IM.! pid - poly = orderPolygon . convexHullSafe - . nubBy ((==) `on` roundPoint2) $ concat $ _rmPolys r + poly = + orderPolygon + . convexHullSafe + . nubBy ((==) `on` roundPoint2) + . concat + $ _rmPolys r -shuffleRoomPos :: RandomGen g => Room -> State g Room +shuffleRoomPos :: (RandomGen g) => Room -> State g Room shuffleRoomPos = rmPos shuffle ---shuffleRoomPos rm = do --- newPos <- shuffle $ _rmPos rm --- return $ rm & rmPos .~ newPos doInPlacements :: GenWorld -> GenWorld -doInPlacements w = foldl' (\gw (i,(_,f)) -> placeSpot i gw (f gw)) w - . sortOn (fst.snd) - $ foldMap g $ w ^. genRooms +doInPlacements w = + foldl' (\gw (i, (_, f)) -> rplaceSpot i gw (f gw)) w + . sortOn (fst . snd) + . foldMap g + $ w ^. genRooms where - g rm = (rm^?! rmMID . _Just,) <$> (rm ^. rmInPmnt) --- let (gw, rms) = mapAccumR doRoomInPlacements w (_genRooms w) --- in gw & genRooms .~ rms - ---doRoomInPlacements :: GenWorld -> Room -> (GenWorld, Room) ---doRoomInPlacements w rm = foldr f (w, rm) $ _rmInPmnt rm --- where --- f plf (w', r') = placeSpot (w', r') (plf w') + g rm = (rm ^?! rmMID . _Just,) <$> (rm ^. rmInPmnt) + rplaceSpot i gw rx = placeSpot i (gw & gwWorld . randGen .~ gen) x + where + (x,gen) = runState rx (gw ^. gwWorld . randGen) doIndividualPlacements :: GenWorld -> GenWorld doIndividualPlacements gw = foldl' doRoomPlacements gw (_genRooms gw) doRoomPlacements :: GenWorld -> Room -> GenWorld -doRoomPlacements w rm = foldl' (placeSpot i) (w & genRooms . ix i . rmPmnts .~ mempty) - . sortOn plPriority $ _rmPmnts rm +doRoomPlacements w rm = + foldl' (placeSpot i) (w & genRooms . ix i . rmPmnts .~ mempty) + . sortOn plPriority + $ _rmPmnts rm where i = rm ^?! rmMID . _Just plPriority :: Placement -> Int plPriority pl = case pl ^. plType of - PutChasm {} -> 0 - PutBlock {} -> 1 - PutDoor {} -> 2 + PutChasm{} -> 0 + PutBlock{} -> 1 + PutDoor{} -> 2 _ -> 3 ---placeSpot' :: Int -> GenWorld -> Placement -> GenWorld ---placeSpot' = placeSpot ---placeSpot' i gw x = --- let (gw',r') = placeSpot (gw,(gw ^?! genRooms . ix i)) x --- in gw' & genRooms . ix i .~ r' - setupWorldBounds :: World -> World setupWorldBounds w = - w & cWorld . cwGen . cwgWorldBounds - %~ ( (bdMinX .~ f minx) - . (bdMaxX .~ f maxx) - . (bdMinY .~ f miny) - . (bdMaxY .~ f maxy) - ) + w + & cWorld . cwGen . cwgWorldBounds + %~ ( (bdMinX .~ f minx) + . (bdMaxX .~ f maxx) + . (bdMinY .~ f miny) + . (bdMaxY .~ f maxy) + ) where f = fromMaybe 0 ps = IM.map (fst . _wlLine) $ w ^. cWorld . lWorld . walls -- _walls (_cWorld w) @@ -162,14 +158,17 @@ gameRoomFromRoom rm = GameRoom { _grViewpoints = map doshift $ - _rmViewpoints rm ++ (map fst . foldl' (flip cutWalls) [] $ _rmPolys rm) + _rmViewpoints rm + ++ (map fst . foldl' (flip cutWalls) [] $ _rmPolys rm) ++ mapMaybe filterUnusedLinks (_rmPos rm) , _grViewpointsEx = concatMap filterUsedLinks (_rmPos rm) , _grBound = - map doshift $ - expandPolyCorners 50 . convexHullSafe . nubBy closePoints + map doshift + $ expandPolyCorners 50 + . convexHullSafe + . nubBy closePoints . concat - $ _rmBound rm ++ _rmPolys rm + $ _rmBound rm ++ _rmPolys rm , _grRmBounds = map (map doshift) $ _rmBound rm , _grDir = getDir $ _rmPos rm , _grLinkDirs = mapMaybe undir $ _rmPos rm @@ -180,8 +179,8 @@ gameRoomFromRoom rm = doubleShift p a = map doshift - [ p +.+ 10 *.* unitVectorAtAngle a - , p -.- 10 *.* unitVectorAtAngle a + [ p + 10 *^ unitVectorAtAngle a + , p - 10 *^ unitVectorAtAngle a ] filterUnusedLinks rp = case _rpType rp of UnusedLink{} -> Just $ _rpPos rp @@ -210,36 +209,36 @@ getTiles fl = case fl of Tiled xs -> xs _ -> error "tiles not correctly set for some room" ---divideWall :: Wall -> [Wall] ---divideWall wl +-- divideWall :: Wall -> [Wall] +-- divideWall wl -- = let (a,b) = _wlLine wl -- ps = divideLine (zoneSize * 2) a b -- in zipWith (\ x y -> wl & wlLine .~ (x,y) ) (init ps) (tail ps) ---divideWallIn :: Wall -> IM.IntMap Wall -> IM.IntMap Wall ---divideWallIn wl wls = +-- divideWallIn :: Wall -> IM.IntMap Wall -> IM.IntMap Wall +-- divideWallIn wl wls = -- let (wl':newWls) = divideWall wl -- k = IM.newKey wls -- newWls' = zipWith (\i w -> w {_wlID = i}) [k..] newWls -- in foldl' (flip $ \w -> IM.insert (_wlID w) w) wls (wl':newWls') -- ---divideWalls :: IM.IntMap Wall -> IM.IntMap Wall ---divideWalls wls = foldl' (flip divideWallIn) wls wls +-- divideWalls :: IM.IntMap Wall -> IM.IntMap Wall +-- divideWalls wls = foldl' (flip divideWallIn) wls wls ---insertInZone :: Int -> Int -> a -> IM.IntMap (IM.IntMap a) -> IM.IntMap (IM.IntMap a) ---insertInZone x y obj = IM.insertWith f x $ IM.singleton y obj +-- insertInZone :: Int -> Int -> a -> IM.IntMap (IM.IntMap a) -> IM.IntMap (IM.IntMap a) +-- insertInZone x y obj = IM.insertWith f x $ IM.singleton y obj -- where f _ = IM.insert y obj ---shiftRoomTree :: Tree Room -> Tree Room ---shiftRoomTree (Node t []) = Node t [] ---shiftRoomTree (Node t ts) = Node t +-- shiftRoomTree :: Tree Room -> Tree Room +-- shiftRoomTree (Node t []) = Node t [] +-- shiftRoomTree (Node t ts) = Node t -- $ zipWith (\l -> shiftRoomTree . applyToRoot (shiftRoomToLink l)) -- (_rmLinks t) -- ts ---shiftRoomTreeConstruction :: Tree Room -> [Tree Room] ---shiftRoomTreeConstruction (Node t []) = [Node t []] ---shiftRoomTreeConstruction (Node t ts) = (Node t [] :) $ concat $ +-- shiftRoomTreeConstruction :: Tree Room -> [Tree Room] +-- shiftRoomTreeConstruction (Node t []) = [Node t []] +-- shiftRoomTreeConstruction (Node t ts) = (Node t [] :) $ concat $ -- zipWith (\l -> shiftRoomTreeConstruction . applyToRoot (shiftRoomBy l . f)) -- (_rmLinks t) -- ts @@ -248,8 +247,8 @@ getTiles fl = case fl of -- where -- (p,a) = last $ _rmLinks r ---addTile :: Float -> Room -> Room ---addTile z r +-- addTile :: Float -> Room -> Room +-- addTile z r -- | not (null (_rmFloor r)) || null rp = r -- | otherwise = r & rmFloor .~ [makeTileFromPoly poly z] -- where diff --git a/src/Dodge/LockAndKey.hs b/src/Dodge/LockAndKey.hs index 22a0b49d1..2b9292e2b 100644 --- a/src/Dodge/LockAndKey.hs +++ b/src/Dodge/LockAndKey.hs @@ -25,9 +25,8 @@ lockRoomMultiItems = lockRoomKeyItems :: [(Int -> State LayoutVars (MetaTree Room String), State LayoutVars ItemType)] lockRoomKeyItems = - [ (lasCenSensEdge, takeOne [LASER,HELD TESLACOIL, HELD FLATSHIELD]) --- [ (lasCenSensEdge, takeOne [HELD RLAUNCHER, LASER, HELD SPARKGUN, HELD FLATSHIELD]) --- , (sensorRoomRunPast LaserSensor, return LASER) +-- [ (lasCenSensEdge, takeOne [LASER,HELD TESLACOIL, HELD FLATSHIELD]) + [ (sensorRoomRunPast LaserSensor, return LASER) -- , (const slowDoorRoomRunPast, return $ HELD (MINIGUNX 3)) -- , (const longRoomRunPast, takeOne [HELD SNIPERRIFLE, HELD FLATSHIELD]) -- , (const glassLessonRunPast, takeOne [LASER]) diff --git a/src/Dodge/Placement/Instance/LightSource.hs b/src/Dodge/Placement/Instance/LightSource.hs index 82ae608ae..7150ed097 100644 --- a/src/Dodge/Placement/Instance/LightSource.hs +++ b/src/Dodge/Placement/Instance/LightSource.hs @@ -181,7 +181,8 @@ spanColLightBlackI col h a b = V2 x y = 0.5 *.* (a +.+ b) spanLightI :: Point2 -> Point2 -> Placement -spanLightI = spanColLightI 0.75 50.1 +--spanLightI = spanColLightI 0.75 50.1 +spanLightI = spanColLightI 0.75 95 spanLightY :: Point2 -> Point2 -> Point2 -> Point2 -> Placement spanLightY l x y z = @@ -191,7 +192,7 @@ spanLightY l x y z = sps0 $ f z where f p = putShape $ thinHighBar h p (l + normalize (l-p)) - h = 50 + h = 95 --extendAway :: Point2 -> Point2 -> Point2 --extendAway p x = p +.+ squashNormalizeV (p -.- x) diff --git a/src/Dodge/Placement/PlaceSpot.hs b/src/Dodge/Placement/PlaceSpot.hs index 16ca7e96a..a94fd8ee5 100644 --- a/src/Dodge/Placement/PlaceSpot.hs +++ b/src/Dodge/Placement/PlaceSpot.hs @@ -33,7 +33,7 @@ import NewInt placeSpot :: Int -> GenWorld -> Placement -> GenWorld placeSpot rid w plmnt = case plmnt ^. plSpot of PSRoomRand i f -> placeSpotRoomRand rid i f plmnt w - PSPos extract eff fallback -> placeSpotUsingLink w rid plmnt extract eff fallback + PSPos extract eff fallback -> placeSpotUsingRoomPos w rid plmnt extract eff fallback _ -> placePlainPSSpot w rid plmnt shift where shift = _rmShift $ w ^?! genRooms . ix rid @@ -62,7 +62,7 @@ placePlainPSSpot w rid plmnt shift = case plmnt ^. plType of (w' & genRooms . ix rid . rmPmnts .:~ newplmnt) -- this should be tidied up -placeSpotUsingLink :: +placeSpotUsingRoomPos :: GenWorld -> Int -> Placement -> @@ -70,7 +70,7 @@ placeSpotUsingLink :: (RoomPos -> Room -> Room) -> Maybe Placement -> GenWorld -placeSpotUsingLink w rid plmnt extract eff fallback = +placeSpotUsingRoomPos w rid plmnt extract eff fallback = case searchedPoss (w ^?! genRooms . ix rid . rmPos) of Just (ps, rmposs) -> placeSpot diff --git a/src/Dodge/Room/Airlock.hs b/src/Dodge/Room/Airlock.hs index cc1825809..df7cd9a5d 100644 --- a/src/Dodge/Room/Airlock.hs +++ b/src/Dodge/Room/Airlock.hs @@ -52,7 +52,7 @@ decontamRoom i = ] -- & rmOutPmnt . at i ?~ -- analyser (NoItemZone ps) (PS 50 0) (PS mcpos 0) - & rmInPmnt .~ [(0, f)] + & rmInPmnt .~ [(0, return . f)] & rmBound .~ [rectNSWE 75 15 0 40, switchcut] where f gw = fromMaybe (error "tried to put a door using an empty placement list") $ do diff --git a/src/Dodge/Room/Containing.hs b/src/Dodge/Room/Containing.hs index ccf1d5f6d..1190ca7fa 100644 --- a/src/Dodge/Room/Containing.hs +++ b/src/Dodge/Room/Containing.hs @@ -1,6 +1,7 @@ ---{-# LANGUAGE TupleSections #-} +-- {-# LANGUAGE TupleSections #-} module Dodge.Room.Containing where +import Control.Monad import Dodge.Cleat import Dodge.Data.GenWorld import Dodge.Item.Display @@ -15,28 +16,27 @@ import Dodge.Tree import Geometry import LensHelp import RandomHelp -import Control.Monad -roomsContaining :: RandomGen g => [Creature] -> [Item] -> State g (MetaTree Room String) +roomsContaining :: (RandomGen g) => [Creature] -> [Item] -> State g (MetaTree Room String) roomsContaining crs its = tToBTree str <$> roomsContaining' crs its where str = "roomsContaining " ++ concatMap _crName crs ++ concatMap (head . basicItemDisplay) its -roomsContaining' :: RandomGen g => [Creature] -> [Item] -> State g (Tree Room) +roomsContaining' :: (RandomGen g) => [Creature] -> [Item] -> State g (Tree Room) roomsContaining' crs its = do endroom <- join $ takeOne - [-- roomPillarsSquare <&> rmPmnts ++.~ crsItmsUnused crs its - --, randomFourCornerRoomCrsIts crs its - --, tanksRoom crs its --- tanksPipesRoom <&> rmPmnts ++.~ crsItmsUnused crs its - roomPillarsContaining crs its --- , roomPillarsPassage <&> rmPmnts ++.~ crsItmsUnused crs its + [ roomPillarsSquare <&> rmPmnts ++.~ crsItmsUnused crs its + , randomFourCornerRoomCrsIts crs its + , tanksRoom crs its + , tanksPipesRoom <&> rmPmnts ++.~ crsItmsUnused crs its + , roomPillarsContaining crs its + , roomPillarsPassage <&> rmPmnts ++.~ crsItmsUnused crs its ] return (pure $ cleatOnward endroom) -roomPillarsContaining :: RandomGen g => [Creature] -> [Item] -> State g Room +roomPillarsContaining :: (RandomGen g) => [Creature] -> [Item] -> State g Room roomPillarsContaining crs itms = do (w, wn) <- takeOne [(240, 2), (340, 3)] (h, hn) <- takeOne [(240, 2), (340, 3)] @@ -47,7 +47,7 @@ crsItmsUnused crs itms = map (\it -> sps0 (PutFlIt it) & plSpot .~ anyUnusedSpot) itms ++ map (\cr -> sps0 (PutCrit cr) & plSpot .~ unusedSpotAwayFromLink 50) crs -pedestalRoom :: RandomGen g => Item -> State g Room +pedestalRoom :: (RandomGen g) => Item -> State g Room pedestalRoom it = do let flit = PutFlIt it x <- state $ randomR (150, 250) diff --git a/src/Dodge/Room/Door.hs b/src/Dodge/Room/Door.hs index 3e3d25849..b68f5a51f 100644 --- a/src/Dodge/Room/Door.hs +++ b/src/Dodge/Room/Door.hs @@ -40,7 +40,7 @@ triggerDoorRoom i = -- note no bounds } where - f gw = fromMaybe (error "tried to put a door using an empty placement list") $ do + f gw = return $ fromMaybe (error "tried to put a door using an empty placement list") $ do pmnt <- gw ^? genPmnt . ix i return $ putDoubleDoor defaultDoorWall (cond pmnt) (V2 0 20) (V2 40 20) 2 cond pmnt = WdTrig $ fromJust (_plMID pmnt) diff --git a/src/Dodge/Room/LasTurret.hs b/src/Dodge/Room/LasTurret.hs index 1ffbcca9f..4bbd104a6 100644 --- a/src/Dodge/Room/LasTurret.hs +++ b/src/Dodge/Room/LasTurret.hs @@ -17,6 +17,7 @@ module Dodge.Room.LasTurret ( storeRoomID, ) where +import Dodge.Room.Modify import Color import Control.Monad import Data.Foldable @@ -148,9 +149,9 @@ lasSensorTurretTest = do let cenroom = cenroom'' & rmInPmnt - <>~ [ (0, alight pi . f i) - , (0, alight (0.5 * pi) . f i) - , (0, alight (1.5 * pi) . f i) + <>~ [ (0, return . alight pi . f i) + , (0, return . alight (0.5 * pi) . f i) + , (0, return . alight (1.5 * pi) . f i) ] rToOnward "lasSensorTurretTest" $ treePost @@ -166,7 +167,7 @@ lasCenSensEdge n = do (i, cenroom') <- storeRoomID =<< shuffleLinks =<< lightSensByDoor n =<< cenLasTur lshape <- takeOne [vShape, lShape, jShape, liShape] let alight a rp = mntLSCond (fmap (fmap $ colorSH black) lshape) (PS (rotateV a $ _rpPos rp) (a + _rpDir rp)) - blight a = (0, alight a . f i) + blight a = (0, return . alight a . f i) let cenroom = cenroom' & rmInPmnt <>~ map blight [pi, (0.5 * pi), (1.5 * pi)] let doorroom = triggerDoorRoom n rToOnward "lasCenSensEdge" $ @@ -181,16 +182,6 @@ lasCenSensEdge n = do isused UsedOutLink{_rplsChildNum = 0} = True isused _ = False -storeRoomID :: Room -> State LayoutVars (Int, Room) -storeRoomID x = do - i <- nextLayoutInt - return (i, x & rmPmnts .:~ sps0 (PutWorldUpdate (f i))) - where - f i rid _ gw = gw & genInts . at i ?~ (gw ^?! genRooms . ix rid . rmMID . _Just) - --- unsafe! assumes that storeRoomID has been called -getRoomFromID :: Int -> GenWorld -> Room -getRoomFromID i gw = gw ^?! genRooms . ix (gw ^?! genInts . ix i) lasRunYinYang :: (RandomGen g) => State g (MetaTree Room String) lasRunYinYang = do diff --git a/src/Dodge/Room/Modify.hs b/src/Dodge/Room/Modify.hs index 9c78e89a8..6e12ad775 100644 --- a/src/Dodge/Room/Modify.hs +++ b/src/Dodge/Room/Modify.hs @@ -1,4 +1,76 @@ -module Dodge.Room.Modify - ( module Dodge.Room.Modify.Girder - ) where +module Dodge.Room.Modify ( + module Dodge.Room.Modify.Girder, + storeRoomID, + getRoomFromID, + addLightsNGon, + removeLights, +) where + +import Color +import Shape +import Dodge.Placement.Instance.LightSource +import Dodge.LevelGen.PlacementHelper +import LensHelp +import Dodge.Data.MetaTree +import RandomHelp +import Dodge.Data.GenWorld import Dodge.Room.Modify.Girder +import qualified Data.Set as S +import Data.Maybe +import Geometry +import Data.Foldable + +storeRoomID :: Room -> State LayoutVars (Int, Room) +storeRoomID x = do + i <- nextLayoutInt + return (i, x & rmPmnts .:~ sps0 (PutWorldUpdate (f i))) + where + f i rid _ gw = gw & genInts . at i ?~ (gw ^?! genRooms . ix rid . rmMID . _Just) + +-- unsafe! assumes that storeRoomID has been called +getRoomFromID :: Int -> GenWorld -> Room +getRoomFromID i gw = gw ^?! genRooms . ix (gw ^?! genInts . ix i) + +removeLights :: Room -> Room +removeLights = rmPmnts %~ mapMaybe f + where + f x = case x ^. plType of + PutLabel "light" -> Nothing + _ -> Just x + +addLightsNGon :: Room -> State LayoutVars Room +addLightsNGon rm = do + (i, rm') <- storeRoomID $ removeLights rm + return $ + rm' + & rmInPmnt + .:~ (0, f i) + where + a = 2 * pi - (2 * pi / fromIntegral (rm ^?! rmType . rmngonSides)) + y = rm ^?! rmType . rmngonSize + x = y * tan (0.5 * a) + f i gw = do + lshape <- takeOne [vShape, lShape, jShape, liShape] + let ps = fromMaybe (PS (V2 y 0) 0) $ rpToPS <$> find iscolorlight (grm ^. rmPos) + alight a' = mntLSCond (fmap (fmap $ colorSH black) lshape) (rotateps a' ps) + takeOne + [ spanLightY (V2 0 0) (V2 y x) (V2 (x) y) (V2 (x) (-y)) + , spanLightY (V2 20 20) (V2 y 20) (V2 (-y) 20) (V2 20 (-y)) + , spanLightI (V2 22 y) (V2 22 (-y)) + , spanLightI (V2 x y) (V2 (-x) (-y)) + , alight (0.5 * pi) <> alight (1.5 * pi) + ] + where + grm = getRoomFromID i gw + rotateps a' (PS v d) = PS (rotateV a' v) (a' + d) + rotateps _ _ = error "in addLightsNGon" + rpToPS rp = (PS (_rpPos rp) (_rpDir rp)) + iscolorlight rp = + (ColoredLightRP `S.member` (rp ^. rpFlags)) + && islinkroompos rp + islinkroompos rp = case rp ^. rpType of + UsedOutLink{} -> True + UsedInLink{} -> True + UnusedLink{} -> True + NotLink{} -> False + diff --git a/src/Dodge/Room/Ngon.hs b/src/Dodge/Room/Ngon.hs index cd0afe652..7a2b622ba 100644 --- a/src/Dodge/Room/Ngon.hs +++ b/src/Dodge/Room/Ngon.hs @@ -24,6 +24,7 @@ roomNgon n x = do , _rmPmnts = [thelight] , _rmBound = [poly] , _rmFloor = Tiled [makeTileFromPoly poly 2] + , _rmType = RoomNgon n x --, _rmFloor = InheritFloor , _rmName = show n ++ "gon" , _rmPos = poss diff --git a/src/Dodge/Room/Room.hs b/src/Dodge/Room/Room.hs index ab8d160f7..6ae1834e0 100644 --- a/src/Dodge/Room/Room.hs +++ b/src/Dodge/Room/Room.hs @@ -154,7 +154,7 @@ roomCenterPillar = do roomRect 240 240 2 2 ) -weaponEmptyRoom :: State StdGen (Tree Room) +weaponEmptyRoom :: RandomGen g => State g (Tree Room) weaponEmptyRoom = do w <- state $ randomR (220, 300) h <- state $ randomR (220, 300) @@ -209,7 +209,7 @@ weaponBehindPillar = do , cleatOnward $ set rmPmnts [sPS (V2 20 60) (negate $ pi / 2) randC1] corridorN ] -weaponBetweenPillars :: State StdGen (MetaTree Room String) +weaponBetweenPillars :: State LayoutVars (MetaTree Room String) weaponBetweenPillars = do (w, wn) <- takeOne [(240, 2), (340, 3)] (h, hn) <- takeOne [(240, 2), (340, 3)] @@ -271,7 +271,7 @@ deadEndRoom = lnks = [(V2 0 30, 0)] {- A random Either tree with a weapon and melee monster challenge. -} -weaponRoom :: State StdGen (MetaTree Room String) +weaponRoom :: State LayoutVars (MetaTree Room String) weaponRoom = join $ takeOne @@ -458,7 +458,7 @@ distributerRoom atype aamount = do ) ) return $ r & rmPmnts .:~ store - & rmInPmnt <>~ [(0,dst),(1,thepipe)] + & rmInPmnt <>~ [(0,return . dst),(1,return . thepipe)] & rmLinks %~ setInLinksByType (OnEdge South) & rmLinks %~ setOutLinks (not . S.member (OnEdge South) . _rlType) diff --git a/src/Dodge/Room/SensorDoor.hs b/src/Dodge/Room/SensorDoor.hs index 16af31fb4..11c8be2e2 100644 --- a/src/Dodge/Room/SensorDoor.hs +++ b/src/Dodge/Room/SensorDoor.hs @@ -1,33 +1,37 @@ {-# LANGUAGE TupleSections #-} -module Dodge.Room.SensorDoor (sensAboveDoor,sensorRoomRunPast) where -import Dodge.Data.MTRS +module Dodge.Room.SensorDoor (sensAboveDoor, sensorRoomRunPast) where + +import Dodge.Room.Procedural +import Control.Monad import qualified Data.Set as S import Dodge.Cleat import Dodge.Data.GenWorld +import Dodge.Data.MTRS import Dodge.LevelGen.PlacementHelper import Dodge.Placement.Instance import Dodge.PlacementSpot import Dodge.Room.Corridor import Dodge.Room.Door import Dodge.Room.Link +import Dodge.Room.Modify import Dodge.Room.Ngon -import Dodge.Room.Procedural import Dodge.Terminal import Dodge.Tree import Dodge.Wire import Geometry import LensHelp import RandomHelp -import Control.Monad -- TODO fix case where the sensor created by sensInsideDoor blocks another door -- for roomRectAutoLinks-- make the locked door a center door? -sensorRoom :: RandomGen g => SensorType -> Int -> State g (Tree Room) +sensorRoom :: SensorType -> Int -> State LayoutVars (Tree Room) sensorRoom senseType n = do - rm <- join $ takeOne [roomNgon 8 200, roomRectAutoLights 200 200] + rm <- join $ takeOne [addLightsNGon =<< roomNgon 8 200, roomRectAutoLights 200 200] + --rm <- join $ takeOne [addLightsNGon =<< roomNgon 8 200] cenroom <- shuffleLinks $ sensInsideDoor senseType n rm - return $ treePost + return $ + treePost [ door , cenroom & rmLinkEff .~ f , triggerDoorRoom n @@ -43,29 +47,40 @@ sensorRoom senseType n = do p' = p +.+ rotateV d (V2 0 (negate 100)) isclose = dist (_rlPos rl) p' < 30 -sensorRoomRunPast :: RandomGen g => SensorType -> Int -> State g MTRS + + +sensorRoomRunPast :: SensorType -> Int -> State LayoutVars MTRS sensorRoomRunPast dt n = do t <- sensorRoom dt n - rToOnward "sensorRoomRunPast" $ t - & applyToSubforest [0] - ( ++ [ treePost [ door & rmConnectsTo .~ (\s -> S.member InLink s && not (S.member BlockedLink s)) , cleatLabel n corridor ] ]) + rToOnward "sensorRoomRunPast" $ + t + & applyToSubforest + [0] + (++ [treePost [door & rmConnectsTo .~ (\s -> S.member InLink s && not (S.member BlockedLink s)), cleatLabel n corridor]]) sensAboveDoor :: SensorType -> Float -> PlacementSpot -> Placement sensAboveDoor sensetype wth ps = extTrigLitPos - (atFstLnkOutShiftBy (\(p, a) -> ((p +.+ rotateV a (V2 18.5 (-2.5)), a), S.singleton UsedPosHigh))) + ( psposAddLabel + ColoredLightRP + (atFstLnkOutShiftBy (\(p, a) -> ((p +.+ rotateV a (V2 18.5 (-2.5)), a), S.singleton UsedPosHigh))) + ) (\tp -> Just $ damageSensor sensetype wth (_plMID tp) ps) sensInsideDoor :: SensorType -> Int -> Room -> Room -sensInsideDoor senseType i rm = rm - & rmName .++~ take 4 (show senseType) - & rmPmnts +sensInsideDoor senseType i rm = + rm + & rmName + .++~ take 4 (show senseType) + & rmPmnts .++~ [ psPt atFstLnkOut . PutForeground $ floorWire (V2 20 0) (V2 20 (-100)) , psPt atFstLnkOut . PutForeground $ floorWire (V2 0 (-100)) (V2 20 (-100)) , psPt atFstLnkOut . PutForeground $ verticalWire (V2 20 0) 0 80 - , putMessageTerminal + , putMessageTerminal (textTerminal & tmCommands .:~ TCDamageCommand) - & plSpot .~ rprBoolShift isUnusedLnk (shiftInBy 10 <&> (, S.singleton UsedPosHigh)) - , sensAboveDoor senseType 10 (atFstLnkOutShiftInward 100) & plExternalID ?~ i + & plSpot + .~ rprBoolShift isUnusedLnk (shiftInBy 10 <&> (,S.singleton UsedPosHigh)) + , sensAboveDoor senseType 10 (atFstLnkOutShiftInward 100) & plExternalID ?~ i ] + -- & rmOutPmnt . at i ?~ sensAboveDoor senseType 10 (atFstLnkOutShiftInward 100) diff --git a/src/Dodge/Room/Start.hs b/src/Dodge/Room/Start.hs index d79367d4a..95650ac26 100644 --- a/src/Dodge/Room/Start.hs +++ b/src/Dodge/Room/Start.hs @@ -50,8 +50,9 @@ powerFakeout = do ] -- the i is used either for a PickOnePlacement or a room id, this is not great -startRoom :: Int -> State StdGen (MetaTree Room String) -startRoom i = +startRoom :: State LayoutVars (MetaTree Room String) +startRoom = do + i <- nextLayoutInt join $ takeOne [ attachOnward "startThenWeaponRoom" <$> preCritStart <*> weaponRoom diff --git a/src/Dodge/Room/Tutorial.hs b/src/Dodge/Room/Tutorial.hs index 7f4e6a848..0aaf292d2 100644 --- a/src/Dodge/Room/Tutorial.hs +++ b/src/Dodge/Room/Tutorial.hs @@ -2,6 +2,7 @@ module Dodge.Room.Tutorial where +import Dodge.Room.Modify import Control.Monad import qualified Data.IntMap.Strict as IM import qualified Data.IntSet as IS @@ -119,7 +120,7 @@ tutDrop = do return $ tToBTree "TutDrop" $ treePost - [x & rmInPmnt .:~ (0, t j), y, cleatOnward rm] + [x & rmInPmnt .:~ (0, return . t j), y, cleatOnward rm] where t j gw = let x = gw ^? genInts . ix j @@ -391,13 +392,6 @@ tutLight = do ) _ -> Nothing -removeLights :: Room -> Room -removeLights = rmPmnts %~ mapMaybe f - where - f x = case x ^. plType of - PutLabel "light" -> Nothing - _ -> Just x - tutHub :: State LayoutVars (MetaTree Room String) tutHub = do (is, wbp) <- setTreeInts =<< critsRoom 1 @@ -413,7 +407,7 @@ tutHub = do x <- shuffleLinks . analyserByDoor (RequireEquipment (AMMOMAG DRUMMAG)) i - . (rmInPmnt .:~ (0, a)) + . (rmInPmnt .:~ (0, return . a)) . addDoorAtNthLinkToggleTerminal 1 ss j -- . addDoorAtNthLinkToggleInterrupt 2 ds j . addDoorAtNthLinkToggleInterrupt 2 ds j1 diff --git a/src/Dodge/TestString.hs b/src/Dodge/TestString.hs index 27c4f2e16..ef59a2277 100644 --- a/src/Dodge/TestString.hs +++ b/src/Dodge/TestString.hs @@ -30,11 +30,12 @@ import qualified Data.Map.Strict as M import NewInt import Data.Foldable import Data.Monoid +import RandomHelp testStringInit :: Universe -> [String] -testStringInit u = - (fmap show $ u ^.. uvWorld . cWorld . lWorld . machines . each . mcType . _McDamSensor . sensAmount) - <> (fmap show $ u ^.. uvWorld . cWorld . lWorld . machines . each . mcMaterial) +testStringInit u = [evalState (takeOne ["a","b"]) (_randGen $ _uvWorld u)] +-- (fmap show $ u ^.. uvWorld . cWorld . lWorld . machines . each . mcType . _McDamSensor . sensAmount) +-- <> (fmap show $ u ^.. uvWorld . cWorld . lWorld . machines . each . mcMaterial) --testStringInit u = map show (u ^.. uvWorld . cWorld . lWorld . machines . traverse . mcDir) --testStringInit u = map show -- (u ^.. uvWorld . cWorld . lWorld . machines . traverse .mcType . _McDistributer) diff --git a/src/RandomHelp.hs b/src/RandomHelp.hs index 4c9548625..3caac915b 100644 --- a/src/RandomHelp.hs +++ b/src/RandomHelp.hs @@ -2,13 +2,13 @@ {- Helpers for random generation. -} module RandomHelp ( module System.Random, --- module Control.Monad.State, + -- module Control.Monad.State, module RandomHelp, module Control.Monad.Trans.State.Lazy, ) where import Control.Monad ---import Control.Monad.State +-- import Control.Monad.State import Control.Monad.Trans.State.Lazy import Data.List import Geometry @@ -21,8 +21,25 @@ randomRanges = join . takeOne . f f (x : y : ys) = state (randomR (x, y)) : f ys f _ = [] -takeOne :: RandomGen g => [a] -> State g a -takeOne xs = state (randomR (0, length xs - 1)) >>= (\i -> return (xs !! i)) +takeOne :: (RandomGen g) => [a] -> State g a +takeOne xs = state (randomR (0, length xs - 1)) >>= \i -> return (xs !! i) + +takeOneRem :: (RandomGen g) => [a] -> State g (Maybe (a, [a])) +takeOneRem [] = return Nothing +takeOneRem xs = + state (randomR (0, length xs - 1)) >>= \i -> do + let (ys, (z : zs)) = splitAt i xs + return $ Just (z, ys <> zs) + +takeOneFiltered :: (RandomGen g) => (a -> Bool) -> [a] -> State g (Maybe a) +takeOneFiltered t xs = do + m <- takeOneRem xs + f m + where + f Nothing = return Nothing + f (Just (y, ys)) + | t y = return $ Just y + | otherwise = takeOneFiltered t ys takeOneWeighted :: (RandomGen g, Random b, Ord b, Num b) => [b] -> [a] -> State g a takeOneWeighted ws xs = state (randomR (0, sum ws)) >>= (\w -> return (xs !! i w ws)) @@ -32,25 +49,25 @@ takeOneWeighted ws xs = state (randomR (0, sum ws)) >>= (\w -> return (xs !! i w | otherwise = 1 + i (y - z) zs i _ _ = 0 ---{-# OPTIONS -Wno-incomplete-uni-patterns #-} -takeOneMore :: RandomGen g => ([a], [a]) -> State g ([a], [a]) +-- {-# OPTIONS -Wno-incomplete-uni-patterns #-} +takeOneMore :: (RandomGen g) => ([a], [a]) -> State g ([a], [a]) takeOneMore (_, []) = error "trying to takeOneMore from empty list" takeOneMore (xs, ys) = do i <- state $ randomR (0, length ys - 1) let (zs, w : ws) = splitAt i ys return (w : xs, zs ++ ws) -takeNMore :: RandomGen g => Int -> ([a], [a]) -> State g ([a], [a]) +takeNMore :: (RandomGen g) => Int -> ([a], [a]) -> State g ([a], [a]) takeNMore n p = foldl' (flip $ const (>>= takeOneMore)) (return p) [1 .. n] -takeN :: RandomGen g => Int -> [a] -> State g [a] +takeN :: (RandomGen g) => Int -> [a] -> State g [a] takeN 0 _ = return [] takeN i xs = fst <$> takeNMore i ([], xs) -- | Randomly shuffle a list. -shuffle :: RandomGen g => [a] -> State g [a] +shuffle :: (RandomGen g) => [a] -> State g [a] shuffle xs = do - rands <- forM [0 .. length xs -1] $ \i -> state $ randomR (0, i) + rands <- forM [0 .. length xs - 1] $ \i -> state $ randomR (0, i) let f ys rand = let (as, b : bs) = splitAt rand ys in (as ++ bs, b) @@ -58,94 +75,95 @@ shuffle xs = do return $ forceElements zs `seq` zs -- | Randomly shuffle the tail of a list, not safe. -shuffleTail :: RandomGen g => [a] -> State g [a] +shuffleTail :: (RandomGen g) => [a] -> State g [a] shuffleTail (x : xs) = (x :) <$> shuffle xs shuffleTail _ = undefined -- select elements from a list randomly -- each element has the same independent chance of being selected -randomSelectionFromList :: RandomGen g => Float -> [a] -> State g [a] +randomSelectionFromList :: (RandomGen g) => Float -> [a] -> State g [a] randomSelectionFromList = filterM . const . randProb -randProb :: RandomGen g => Float -> State g Bool +randProb :: (RandomGen g) => Float -> State g Bool randProb p = do p1 <- state $ randomR (0, 1) return (p1 < p) -randInCirc :: RandomGen g => Float -> State g Point2 +randInCirc :: (RandomGen g) => Float -> State g Point2 randInCirc = flip randInArc (2 * pi) -randOnCirc :: RandomGen g => Float -> State g Point2 +randOnCirc :: (RandomGen g) => Float -> State g Point2 randOnCirc r = do - a <- state $ randomR (0, 2*pi) + a <- state $ randomR (0, 2 * pi) return $ r *.* unitVectorAtAngle a -randInArc :: RandomGen g => Float -> Float -> State g Point2 +randInArc :: (RandomGen g) => Float -> Float -> State g Point2 randInArc = randInArcStrip 0 -randInArcStrip :: RandomGen g => Float -> Float -> Float -> State g Point2 +randInArcStrip :: (RandomGen g) => Float -> Float -> Float -> State g Point2 randInArcStrip minrad maxRad maxangle = do rad <- state $ randomR (minrad, maxRad) ang <- state $ randomR (0, maxangle) return $ rad *.* unitVectorAtAngle ang -randOnUnitSphere :: RandomGen g => State g Point3 +randOnUnitSphere :: (RandomGen g) => State g Point3 randOnUnitSphere = do z <- state $ randomR (negate 1, 1) longitude <- state $ randomR (0, 2 * pi) let (V2 x y) = sqrt (1 - z ^ (2 :: Int)) *.* unitVectorAtAngle longitude return (V3 x y z) -randOnHemisphere :: RandomGen g => State g Point3 +randOnHemisphere :: (RandomGen g) => State g Point3 randOnHemisphere = do z <- state $ randomR (0, 1) longitude <- state $ randomR (0, 2 * pi) let (V2 x y) = sqrt (1 - z ^ (2 :: Int)) *.* unitVectorAtAngle longitude return (V3 x y z) -randInHemisphere :: RandomGen g => State g Point3 +randInHemisphere :: (RandomGen g) => State g Point3 randInHemisphere = do p <- randOnHemisphere r <- state $ randomR (0, 1) return $ r *.*.* p -randInRect :: RandomGen g => Float -> Float -> State g Point2 +randInRect :: (RandomGen g) => Float -> Float -> State g Point2 randInRect w h = do x <- state $ randomR (0, w) y <- state $ randomR (0, h) return (V2 x y) -maybeTakeOne :: RandomGen g => [a] -> State g (Maybe a) +maybeTakeOne :: (RandomGen g) => [a] -> State g (Maybe a) maybeTakeOne [] = return Nothing maybeTakeOne xs = state (randomR (0, length xs - 1)) >>= (\i -> return (Just (xs !! i))) -randsSpread :: RandomGen g => (Float, Float) -> Int -> State g [Float] +randsSpread :: (RandomGen g) => (Float, Float) -> Int -> State g [Float] randsSpread (a, b) i | i <= 0 = error "tried to take <= 0 randsSpread" | otherwise = zipWith (+) [a + x, a + 2 * x ..] <$> replicateM i (state $ randomR (0, x)) where x = (b - a) / fromIntegral i -randsOnCirc :: RandomGen g => Int -> State g [Float] +randsOnCirc :: (RandomGen g) => Int -> State g [Float] randsOnCirc = randsSpread (0, 2 * pi) -randPeakedParam :: RandomGen g => Int -> Float -> Float -> Float -> State g Float +randPeakedParam :: (RandomGen g) => Int -> Float -> Float -> Float -> State g Float randPeakedParam i a b c = do x <- state $ randomR (-1, 1) let y = x ^ i - return $ if y < 0 - then a + y * (a-b) - else b + y * (c-b) + return $ + if y < 0 + then a + y * (a - b) + else b + y * (c - b) -randPeaked :: RandomGen g => Float -> Float -> Float -> State g Float +randPeaked :: (RandomGen g) => Float -> Float -> Float -> State g Float randPeaked = randPeakedParam 3 -randFromPair :: RandomGen g => Float -> (a,a) -> State g a -randFromPair x (l,r) = do - y <- state $ randomR (0,1) +randFromPair :: (RandomGen g) => Float -> (a, a) -> State g a +randFromPair x (l, r) = do + y <- state $ randomR (0, 1) if x < y then return l else return r -shufflePair :: RandomGen g => (a,a) -> State g (a,a) -shufflePair (x,y) = do - v <- state $ randomR (0::Float,1) - if v > 0.5 then return (x,y) else return (y,x) +shufflePair :: (RandomGen g) => (a, a) -> State g (a, a) +shufflePair (x, y) = do + v <- state $ randomR (0 :: Float, 1) + if v > 0.5 then return (x, y) else return (y, x) diff --git a/tags b/tags index 258b39bbf..830284d6c 100644 --- a/tags +++ b/tags @@ -131,7 +131,7 @@ BlockDebris src/Dodge/Data/Prop.hs 23;" C BlockDegradeSound src/Dodge/Data/SoundOrigin.hs 31;" C BlockPart src/Dodge/Data/Wall/Structure.hs 14;" C BlockStatus src/Dodge/Data/Universe.hs 98;" t -BlockedLink src/Dodge/Data/Room.hs 50;" C +BlockedLink src/Dodge/Data/Room.hs 54;" C BloomLayer src/Picture/Data.hs 21;" C Blunt src/Dodge/Data/Damage.hs 17;" C Boosting src/Dodge/Data/Creature/Stance.hs 26;" C @@ -220,6 +220,7 @@ 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 +ColoredLightRP src/Dodge/Data/Room.hs 88;" C Comatose src/Dodge/Data/Creature/Perception.hs 51;" C CombAmount src/Dodge/Data/CombAmount.hs 10;" t CombItem src/Dodge/Data/Combine.hs 8;" t @@ -453,7 +454,7 @@ FootstepSound src/Dodge/Data/SoundOrigin.hs 30;" C 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 +FromEdge src/Dodge/Data/Room.hs 53;" 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 @@ -563,7 +564,7 @@ ImpulsesList src/Dodge/Data/ActionPlan.hs 72;" C InDivineZone src/Dodge/Data/Scenario.hs 22;" C InDream src/Dodge/Data/Scenario.hs 19;" C InInv src/Dodge/Data/Item/Location.hs 29;" C -InLink src/Dodge/Data/Room.hs 45;" C +InLink src/Dodge/Data/Room.hs 49;" 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 @@ -628,7 +629,7 @@ LIGHTSENSOR src/Dodge/Data/Item/Combine.hs 79;" C LS src/Dodge/Data/LightSource.hs 21;" C LSParam src/Dodge/Data/LightSource.hs 14;" t LWorld src/Dodge/Data/LWorld.hs 94;" t -LabLink src/Dodge/Data/Room.hs 46;" C +LabLink src/Dodge/Data/Room.hs 50;" C LabSS src/Dodge/Data/Scenario.hs 97;" C LabelCluster src/Dodge/Data/RoomCluster.hs 13;" C Laboratory src/Dodge/Data/Scenario.hs 61;" C @@ -857,7 +858,7 @@ NorthEast src/Dodge/Data/CardinalPoint.hs 21;" C NorthEast8 src/Dodge/Data/CardinalPoint.hs 29;" C NorthWest src/Dodge/Data/CardinalPoint.hs 24;" C NorthWest8 src/Dodge/Data/CardinalPoint.hs 35;" C -NotLink src/Dodge/Data/Room.hs 69;" C +NotLink src/Dodge/Data/Room.hs 73;" C NotPushed src/Dodge/Data/Door.hs 26;" C Nothing' src/MaybeHelp.hs 11;" C NothingID src/Dodge/Data/CrWlID.hs 10;" C @@ -917,7 +918,7 @@ Object src/Dodge/Data/Object.hs 10;" t ObjectType src/Dodge/Data/ObjectType.hs 9;" t OnBack src/Dodge/Data/Equipment/Misc.hs 22;" C OnChest src/Dodge/Data/Equipment/Misc.hs 21;" C -OnEdge src/Dodge/Data/Room.hs 48;" C +OnEdge src/Dodge/Data/Room.hs 52;" C OnFloor src/Dodge/Data/Item/Location.hs 38;" C OnHead src/Dodge/Data/Equipment/Misc.hs 20;" C OnLeftLeg src/Dodge/Data/Equipment/Misc.hs 25;" C @@ -933,7 +934,7 @@ Opaque src/Dodge/Data/Wall.hs 34;" C OpticScope src/Dodge/Data/Item/Scope.hs 12;" C OptionScreen src/Dodge/Data/Universe.hs 82;" C OptionScreenFlag src/Dodge/Data/Universe.hs 70;" t -OutLink src/Dodge/Data/Room.hs 44;" C +OutLink src/Dodge/Data/Room.hs 48;" C OutsideTerminal src/Dodge/Data/Input.hs 28;" C OutwardShockwave src/Dodge/Data/Shockwave.hs 12;" C OverCombCombine src/Dodge/Data/Input.hs 24;" C @@ -963,13 +964,13 @@ PRISM src/Dodge/Data/Item/Combine.hs 65;" C PS src/Dodge/Data/GenWorld.hs 99;" C PSNoShiftCont src/Dodge/Data/GenWorld.hs 100;" C PSPos src/Dodge/Data/GenWorld.hs 101;" C -PSRoomRand src/Dodge/Data/GenWorld.hs 106;" C +PSRoomRand src/Dodge/Data/GenWorld.hs 108;" C PSType src/Dodge/Data/GenWorld.hs 32;" t PUMP src/Dodge/Data/Item/Combine.hs 62;" C PaletteColor src/Color/Data.hs 11;" t PathBetweenDebugV2s src/Dodge/Data/Universe.hs 54;" C PathBetweenLeftRightClick src/Dodge/Data/Universe.hs 53;" C -PathFromEdge src/Dodge/Data/Room.hs 77;" t +PathFromEdge src/Dodge/Data/Room.hs 81;" t PathShowType src/Dodge/Data/Universe.hs 52;" t PathTo src/Dodge/Data/ActionPlan.hs 70;" C Pathing src/Dodge/Data/Config.hs 90;" C @@ -986,7 +987,7 @@ Picture src/Picture/Data.hs 41;" t Piercing src/Dodge/Data/Damage.hs 16;" C Piezoelectric src/Dodge/Data/Material.hs 23;" C PistolAI src/Dodge/Data/Creature/Misc.hs 41;" C -Placement src/Dodge/Data/GenWorld.hs 112;" t +Placement src/Dodge/Data/GenWorld.hs 114;" t PlacementSpot src/Dodge/Data/GenWorld.hs 98;" t PlainBarrel src/Dodge/Data/Creature/Misc.hs 86;" C PlainDeath src/Dodge/Data/Creature.hs 68;" C @@ -1007,7 +1008,7 @@ Poison src/Dodge/Data/Damage.hs 26;" C PoisonDamage src/Dodge/Data/Damage/Type.hs 6;" C PoisonDeath src/Dodge/Data/Creature.hs 68;" C PoisonGas src/Dodge/Data/Cloud.hs 42;" C -PolyEdge src/Dodge/Data/Room.hs 47;" C +PolyEdge src/Dodge/Data/Room.hs 51;" C PolyShad src/Picture/Data.hs 31;" C Polyhedra src/Polyhedra/Data.hs 13;" t Polyhedron src/Polyhedra/Data.hs 13;" C @@ -1074,7 +1075,7 @@ RIFLE src/Dodge/Data/Item/Combine.hs 153;" C RLAUNCHER src/Dodge/Data/Item/Combine.hs 169;" C RLAUNCHERX src/Dodge/Data/Item/Combine.hs 170;" C ROSE src/Color/Data.hs 18;" C -RPLinkStatus src/Dodge/Data/Room.hs 58;" t +RPLinkStatus src/Dodge/Data/Room.hs 62;" t RProps src/Dodge/Layout/Generate.hs 14;" C RadarBlip src/Dodge/Data/RadarBlip.hs 12;" t RadarSweep src/Dodge/Data/RadarSweep.hs 17;" t @@ -1118,18 +1119,20 @@ Rocket src/Dodge/Data/Projectile.hs 32;" C 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 +Room src/Dodge/Data/GenWorld.hs 129;" 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 +RoomLinkType src/Dodge/Data/Room.hs 47;" t +RoomNgon src/Dodge/Data/Room.hs 41;" C 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 +RoomPosFlag src/Dodge/Data/Room.hs 84;" t +RoomPosOffGrid src/Dodge/Data/Room.hs 86;" C +RoomPosOnFloor src/Dodge/Data/Room.hs 87;" C +RoomPosOnGrid src/Dodge/Data/Room.hs 85;" C RoomProperties src/Dodge/Layout/Generate.hs 14;" t RoomType src/Dodge/Data/Room.hs 31;" t -RoomWire src/Dodge/Data/Room.hs 53;" t +RoomWire src/Dodge/Data/Room.hs 57;" t RoundedFaces src/Shape/Data.hs 13;" C RunningSideEffect src/Dodge/Data/Universe.hs 67;" C SCRAPMETAL src/Dodge/Data/Item/Combine.hs 61;" C @@ -1396,7 +1399,7 @@ Unimportant src/Shape/Data.hs 32;" C Universe src/Dodge/Data/Universe.hs 28;" t UnloadedWeaponSF src/Dodge/Data/ComposedItem.hs 13;" C UnlockInv src/Dodge/Data/WorldEffect.hs 31;" C -UnusedLink src/Dodge/Data/Room.hs 68;" C +UnusedLink src/Dodge/Data/Room.hs 72;" C UseAttach src/Dodge/Data/Item/Use.hs 30;" C UseBulletMod src/Dodge/Data/Item/Use.hs 35;" C UseCondition src/Dodge/Data/UseCondition.hs 4;" t @@ -1419,13 +1422,13 @@ UseValue src/Dodge/Data/Item/Use.hs 33;" 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 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 +UsedInLink src/Dodge/Data/Room.hs 68;" C +UsedOutLink src/Dodge/Data/Room.hs 63;" C +UsedPos src/Dodge/Data/Room.hs 91;" t +UsedPosFloor src/Dodge/Data/Room.hs 95;" C +UsedPosHigh src/Dodge/Data/Room.hs 94;" C +UsedPosLow src/Dodge/Data/Room.hs 92;" C +UsedPosMid src/Dodge/Data/Room.hs 93;" C VAO src/Shader/Data.hs 64;" t VBO src/Shader/Data.hs 79;" t VF src/Polyhedra/Data.hs 21;" t @@ -1462,7 +1465,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 10;" t -WallWire src/Dodge/Data/Room.hs 55;" C +WallWire src/Dodge/Data/Room.hs 59;" 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 @@ -2056,9 +2059,9 @@ _nzAngle src/Dodge/Data/Item/Params.hs 16;" f _nzMaxWalkAngle src/Dodge/Data/Muzzle.hs 50;" f _nzPressure src/Dodge/Data/Muzzle.hs 49;" f _nzWalkSpeed src/Dodge/Data/Muzzle.hs 51;" f -_offGridFromEdges src/Dodge/Data/Room.hs 82;" f +_offGridFromEdges src/Dodge/Data/Room.hs 86;" f _oldMagnets src/Dodge/Data/LWorld.hs 127;" f -_onGridFromEdges src/Dodge/Data/Room.hs 81;" f +_onGridFromEdges src/Dodge/Data/Room.hs 85;" f _opDraw src/Dodge/Data/Wall.hs 33;" f _opSel src/Dodge/Data/RightButtonOptions.hs 15;" f _opTexture src/Dodge/Data/Wall.hs 34;" f @@ -2090,11 +2093,11 @@ _pjSpin src/Dodge/Data/Projectile.hs 19;" f _pjTimer src/Dodge/Data/Projectile.hs 22;" f _pjType src/Dodge/Data/Projectile.hs 24;" f _pjVel src/Dodge/Data/Projectile.hs 17;" f -_plExternalID src/Dodge/Data/GenWorld.hs 116;" f -_plIDCont src/Dodge/Data/GenWorld.hs 117;" f -_plMID src/Dodge/Data/GenWorld.hs 115;" f -_plSpot src/Dodge/Data/GenWorld.hs 113;" f -_plType src/Dodge/Data/GenWorld.hs 114;" f +_plExternalID src/Dodge/Data/GenWorld.hs 118;" f +_plIDCont src/Dodge/Data/GenWorld.hs 119;" f +_plMID src/Dodge/Data/GenWorld.hs 117;" f +_plSpot src/Dodge/Data/GenWorld.hs 115;" f +_plType src/Dodge/Data/GenWorld.hs 116;" f _plasmaBalls src/Dodge/Data/LWorld.hs 106;" f _playStatus src/Sound/Data.hs 15;" f _playingSounds src/Dodge/Data/World.hs 41;" f @@ -2114,11 +2117,11 @@ _proxReqEquipment src/Dodge/Data/Machine/Sensor.hs 35;" f _proxReqMinHealth src/Dodge/Data/Machine/Sensor.hs 34;" f _proxSensorType src/Dodge/Data/Machine/Sensor.hs 25;" f _proxToggle src/Dodge/Data/Machine/Sensor.hs 26;" f -_psFallback src/Dodge/Data/GenWorld.hs 104;" f +_psFallback src/Dodge/Data/GenWorld.hs 106;" f _psPos src/Dodge/Data/GenWorld.hs 99;" f -_psRandShift src/Dodge/Data/GenWorld.hs 108;" f -_psRoomEff src/Dodge/Data/GenWorld.hs 103;" f -_psRoomRandPointNum src/Dodge/Data/GenWorld.hs 107;" f +_psRandShift src/Dodge/Data/GenWorld.hs 110;" f +_psRoomEff src/Dodge/Data/GenWorld.hs 105;" f +_psRoomRandPointNum src/Dodge/Data/GenWorld.hs 109;" f _psRot src/Dodge/Data/GenWorld.hs 99;" f _psSelect src/Dodge/Data/GenWorld.hs 102;" f _pullWallShader src/Data/Preload/Render.hs 22;" f @@ -2185,41 +2188,43 @@ _rkSmoke src/Dodge/Data/Projectile.hs 34;" 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 143;" f -_rmChildren src/Dodge/Data/GenWorld.hs 154;" f -_rmClusterStatus src/Dodge/Data/GenWorld.hs 156;" f -_rmConnectsTo src/Dodge/Data/GenWorld.hs 151;" f -_rmEndWires src/Dodge/Data/GenWorld.hs 150;" f -_rmFloor src/Dodge/Data/GenWorld.hs 144;" f +_rmBound src/Dodge/Data/GenWorld.hs 145;" f +_rmChildren src/Dodge/Data/GenWorld.hs 156;" f +_rmClusterStatus src/Dodge/Data/GenWorld.hs 158;" f +_rmConnectsTo src/Dodge/Data/GenWorld.hs 153;" f +_rmEndWires src/Dodge/Data/GenWorld.hs 152;" f +_rmFloor src/Dodge/Data/GenWorld.hs 146;" f _rmHeight src/Dodge/Data/Room.hs 39;" f -_rmInPmnt src/Dodge/Data/GenWorld.hs 141;" f -_rmLinkEff src/Dodge/Data/GenWorld.hs 131;" f -_rmLinks src/Dodge/Data/GenWorld.hs 129;" f -_rmMID src/Dodge/Data/GenWorld.hs 152;" f -_rmMParent src/Dodge/Data/GenWorld.hs 153;" f -_rmName src/Dodge/Data/GenWorld.hs 145;" f -_rmPath src/Dodge/Data/GenWorld.hs 139;" f -_rmPmnts src/Dodge/Data/GenWorld.hs 140;" f -_rmPolys src/Dodge/Data/GenWorld.hs 128;" f -_rmPos src/Dodge/Data/GenWorld.hs 138;" f -_rmRandPSs src/Dodge/Data/GenWorld.hs 148;" f -_rmShift src/Dodge/Data/GenWorld.hs 146;" f -_rmStartWires src/Dodge/Data/GenWorld.hs 149;" f -_rmType src/Dodge/Data/GenWorld.hs 155;" f -_rmViewpoints src/Dodge/Data/GenWorld.hs 147;" f +_rmInPmnt src/Dodge/Data/GenWorld.hs 143;" f +_rmLinkEff src/Dodge/Data/GenWorld.hs 133;" f +_rmLinks src/Dodge/Data/GenWorld.hs 131;" f +_rmMID src/Dodge/Data/GenWorld.hs 154;" f +_rmMParent src/Dodge/Data/GenWorld.hs 155;" f +_rmName src/Dodge/Data/GenWorld.hs 147;" f +_rmPath src/Dodge/Data/GenWorld.hs 141;" f +_rmPmnts src/Dodge/Data/GenWorld.hs 142;" f +_rmPolys src/Dodge/Data/GenWorld.hs 130;" f +_rmPos src/Dodge/Data/GenWorld.hs 140;" f +_rmRandPSs src/Dodge/Data/GenWorld.hs 150;" f +_rmShift src/Dodge/Data/GenWorld.hs 148;" f +_rmStartWires src/Dodge/Data/GenWorld.hs 151;" f +_rmType src/Dodge/Data/GenWorld.hs 157;" f +_rmViewpoints src/Dodge/Data/GenWorld.hs 149;" f _rmWidth src/Dodge/Data/Room.hs 38;" f +_rmngonSides src/Dodge/Data/Room.hs 42;" f +_rmngonSize src/Dodge/Data/Room.hs 43;" 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 +_rpOnPath src/Dodge/Data/Room.hs 73;" 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 +_rplsChildNum src/Dodge/Data/Room.hs 65;" f +_rplsInRoomID src/Dodge/Data/Room.hs 70;" f +_rplsOutRoomID src/Dodge/Data/Room.hs 66;" f +_rplsType src/Dodge/Data/Room.hs 64;" f +_rplsType src/Dodge/Data/Room.hs 69;" f +_rplsType src/Dodge/Data/Room.hs 72;" f _rsAR src/Dodge/Data/RadarSweep.hs 23;" f _rsMapper src/Dodge/Data/RadarSweep.hs 22;" f _rsObject src/Dodge/Data/RadarSweep.hs 20;" f @@ -2533,6 +2538,7 @@ addGirderNS' src/Dodge/Room/Modify/Girder.hs 55;" f addHighGirder src/Dodge/Room/Modify/Girder.hs 132;" f addHighGirder' src/Dodge/Room/Modify/Girder.hs 142;" f addIndefiniteArticle src/StringHelp.hs 17;" f +addLightsNGon src/Dodge/Room/Modify.hs 41;" f addNodesCrossing src/Dodge/Room/Path.hs 28;" f addNodesCrossingCirc src/Dodge/Room/Path.hs 41;" f addPane src/Dodge/Placement/PlaceSpot.hs 169;" f @@ -2569,8 +2575,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 124;" f -analyserByNthLink src/Dodge/Room/LasTurret.hs 108;" f +analyserByDoor src/Dodge/Room/LasTurret.hs 127;" f +analyserByNthLink src/Dodge/Room/LasTurret.hs 111;" f andOrRegex src/Dodge/DisplayInventory.hs 78;" f angleBetween src/Geometry.hs 158;" f angleVV src/Geometry/Vector.hs 58;" f @@ -2769,7 +2775,7 @@ cardinalBetweenAdj src/Dodge/Base/CardinalPoint.hs 28;" f cardinalVectors src/Dodge/FloorItem.hs 24;" f cdtPropagateFold src/Dodge/DoubleTree.hs 189;" f ceilingTo src/Geometry/Zone.hs 15;" f -cenLasTur src/Dodge/Room/LasTurret.hs 50;" f +cenLasTur src/Dodge/Room/LasTurret.hs 51;" f centerText src/Picture/Base.hs 176;" f centerVaultExplosiveExit src/Dodge/Room/NoNeedWeapon.hs 20;" f centerVaultRoom src/Dodge/Room/Procedural.hs 269;" f @@ -2919,7 +2925,7 @@ 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 136;" f +corridorBoss src/Dodge/LockAndKey.hs 135;" 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 @@ -3232,7 +3238,7 @@ doFloatFloat src/Dodge/FloatFunction.hs 5;" f doGenFloat src/Dodge/HeldUse.hs 1174;" f doGravityPU src/Dodge/Projectile/Update.hs 35;" f doHeldUseEffect src/Dodge/HeldUse.hs 369;" f -doInPlacements src/Dodge/Layout.hs 87;" f +doInPlacements src/Dodge/Layout.hs 89;" f doIndividualPlacements src/Dodge/Layout.hs 101;" f doInputScreenInput src/Dodge/Update/Input/ScreenLayer.hs 38;" f doItemTimeScroll src/Dodge/Update.hs 206;" f @@ -3574,9 +3580,9 @@ gLauncher src/Dodge/Item/Held/Launcher.hs 24;" f gRandify src/Dodge/Randify.hs 12;" f gadgetEffect src/Dodge/HeldUse.hs 49;" f gameOverMenu src/Dodge/Menu.hs 200;" f -gameRoomFromRoom src/Dodge/Layout.hs 152;" f +gameRoomFromRoom src/Dodge/Layout.hs 156;" f gameRoomViewpoints src/Dodge/Viewpoints.hs 35;" f -gameRoomsFromRooms src/Dodge/Layout.hs 149;" f +gameRoomsFromRooms src/Dodge/Layout.hs 153;" f gameplayMenu src/Dodge/Menu.hs 152;" f gameplayMenuOptions src/Dodge/Menu.hs 155;" f gasEffect src/Dodge/Update.hs 855;" f @@ -3585,7 +3591,7 @@ gassesNearPoint src/Dodge/Zoning/Cloud.hs 12;" f generateGenParams src/Dodge/LevelGen/LevelStructure.hs 23;" f generateGraphs src/Dodge/Menu.hs 147;" f generateLayout src/Dodge/Layout/Generate.hs 11;" f -generateLevelFromRoomList src/Dodge/Layout.hs 35;" f +generateLevelFromRoomList src/Dodge/Layout.hs 37;" f generateWorldFromSeed src/Dodge/LevelGen.hs 18;" f geom src/Shader/Data.hs 110;" f geometryQuickCheckTests test/Spec.hs 55;" f @@ -3603,8 +3609,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 496;" f -getCrsFromRooms' src/Dodge/Room/Tutorial.hs 483;" f +getCrsFromRooms src/Dodge/Room/Tutorial.hs 489;" f +getCrsFromRooms' src/Dodge/Room/Tutorial.hs 476;" f getDebugMouseOver src/Dodge/Update.hs 424;" f getDistortions src/Dodge/Render.hs 443;" f getEdgesCrossing src/Dodge/Path.hs 37;" f @@ -3621,14 +3627,14 @@ getNodePos src/Dodge/Path.hs 34;" f getPJStabiliser src/Dodge/HeldUse.hs 1268;" f getPretty src/AesonHelp.hs 8;" f getPromptTM src/Dodge/Terminal/Type.hs 3;" f -getRoomFromID src/Dodge/Room/LasTurret.hs 195;" f -getRoomsFromInts src/Dodge/Room/Tutorial.hs 479;" f +getRoomFromID src/Dodge/Room/Modify.hs 31;" f +getRoomsFromInts src/Dodge/Room/Tutorial.hs 472;" 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 200;" f +getTiles src/Dodge/Layout.hs 207;" f getViewpoints src/Dodge/Viewpoints.hs 29;" f getVolleyBurst src/Dodge/HeldUse.hs 129;" f getWallPathing src/Dodge/Wall/Pathing.hs 7;" f @@ -3707,8 +3713,8 @@ headLampShape src/Dodge/Item/Draw/SPic.hs 422;" f headMap src/Dodge/DoubleTree.hs 118;" f headPQ src/Dodge/Creature/HandPos.hs 116;" f healS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 627;" f -healthAnalyserByDoor src/Dodge/Room/LasTurret.hs 105;" f -healthTest src/Dodge/Room/LasTurret.hs 127;" f +healthAnalyserByDoor src/Dodge/Room/LasTurret.hs 108;" f +healthTest src/Dodge/Room/LasTurret.hs 130;" 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 @@ -3892,7 +3898,7 @@ itemInternalValue src/Dodge/Item/Display.hs 34;" f itemInvColor src/Dodge/Item/InventoryColor.hs 9;" f itemInvLock src/Dodge/HeldUse.hs 454;" f itemMuzzles src/Dodge/HeldUse.hs 172;" f -itemRooms src/Dodge/LockAndKey.hs 41;" f +itemRooms src/Dodge/LockAndKey.hs 40;" f itemRotTreeSPic src/Dodge/Item/Draw/SPicTree.hs 16;" f itemSPic src/Dodge/Item/Draw/SPic.hs 17;" f itemScan src/Dodge/Item/Scope.hs 68;" f @@ -3930,9 +3936,9 @@ 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 102;" f -keyCardRoomRunPast src/Dodge/Room/LasTurret.hs 90;" f -keyCardRunPastRand src/Dodge/LockAndKey.hs 38;" f +keyCardAnalyserByDoor src/Dodge/Room/LasTurret.hs 105;" f +keyCardRoomRunPast src/Dodge/Room/LasTurret.hs 93;" f +keyCardRunPastRand src/Dodge/LockAndKey.hs 37;" f keyPic src/Dodge/Item/Draw/SPic.hs 438;" f keyholeCorridor src/Dodge/Room/Corridor.hs 45;" f knifeS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 741;" f @@ -3943,19 +3949,19 @@ lConnectMulti src/Dodge/Render/Connectors.hs 51;" f lShape src/Dodge/Placement/Instance/LightSource.hs 57;" f lamp src/Dodge/Creature/Lamp.hs 18;" f lampCrSPic src/Dodge/Render/ShapePicture.hs 125;" f -lasCenRunClose' src/Dodge/Room/LasTurret.hs 321;" f -lasCenRunClose1 src/Dodge/Room/LasTurret.hs 410;" f -lasCenRunClose2 src/Dodge/Room/LasTurret.hs 483;" f -lasCenRunCloseLongCor src/Dodge/Room/LasTurret.hs 375;" f -lasCenSensEdge src/Dodge/Room/LasTurret.hs 162;" f +lasCenRunClose' src/Dodge/Room/LasTurret.hs 309;" f +lasCenRunClose1 src/Dodge/Room/LasTurret.hs 398;" f +lasCenRunClose2 src/Dodge/Room/LasTurret.hs 471;" f +lasCenRunCloseLongCor src/Dodge/Room/LasTurret.hs 363;" f +lasCenSensEdge src/Dodge/Room/LasTurret.hs 165;" f lasGunPic src/Dodge/Item/Draw/SPic.hs 413;" f lasPulseS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 731;" f -lasRunRand src/Dodge/Room/LasTurret.hs 480;" f -lasRunYinYang src/Dodge/Room/LasTurret.hs 198;" f -lasRunYinYangCenter src/Dodge/Room/LasTurret.hs 261;" f -lasSensorTurretTest src/Dodge/Room/LasTurret.hs 139;" f -lasTunnel src/Dodge/Room/LasTurret.hs 521;" f -lasTunnelRunPast src/Dodge/Room/LasTurret.hs 562;" f +lasRunRand src/Dodge/Room/LasTurret.hs 468;" f +lasRunYinYang src/Dodge/Room/LasTurret.hs 186;" f +lasRunYinYangCenter src/Dodge/Room/LasTurret.hs 249;" f +lasSensorTurretTest src/Dodge/Room/LasTurret.hs 142;" f +lasTunnel src/Dodge/Room/LasTurret.hs 509;" f +lasTunnelRunPast src/Dodge/Room/LasTurret.hs 550;" f lasTurret src/Dodge/Placement/Instance/Turret.hs 35;" f laser src/Dodge/Item/Held/BatteryGuns.hs 27;" f laserSpark src/Dodge/Material/Damage.hs 37;" f @@ -3979,8 +3985,8 @@ legsSPic src/Dodge/Item/Draw/SPic.hs 447;" f lerpP2A src/Dodge/ShiftPoint.hs 14;" f liShape src/Dodge/Placement/Instance/LightSource.hs 82;" f light src/Color.hs 131;" f -lightSensByDoor src/Dodge/Room/LasTurret.hs 75;" f -lightSensInsideDoor src/Dodge/Room/LasTurret.hs 63;" f +lightSensByDoor src/Dodge/Room/LasTurret.hs 77;" f +lightSensInsideDoor src/Dodge/Room/LasTurret.hs 64;" f lightSensor src/Dodge/Placement/Instance/Sensor.hs 33;" f lightsToRender src/Dodge/Render/Lights.hs 14;" f lightx4 src/Color.hs 155;" f @@ -4122,7 +4128,7 @@ maybeDestroyDoor src/Dodge/Wall/Damage.hs 141;" f maybeExitCombine src/Dodge/Update/Input/InGame.hs 568;" f maybeOpenConsole src/Dodge/Update.hs 133;" f maybeReadFile src/Dodge/LoadSeed.hs 10;" f -maybeTakeOne src/RandomHelp.hs 118;" f +maybeTakeOne src/RandomHelp.hs 135;" f maybeWarmupStatus src/Dodge/Item/Display.hs 45;" f mcBackgroundSound src/Dodge/Machine/Update.hs 153;" f mcColor src/Dodge/Machine/Draw.hs 83;" f @@ -4277,7 +4283,7 @@ normalizeAnglePi src/Dodge/Base.hs 154;" f normalizeColor src/Color.hs 103;" f normalizeV src/Geometry/Vector.hs 44;" f normalizeV3 src/Geometry/Vector3D.hs 84;" f -notLink src/Dodge/Data/Room.hs 72;" f +notLink src/Dodge/Data/Room.hs 76;" f nulgate src/Dodge/Item/Scope.hs 101;" f numDrawableVertices src/Shader/Parameters.hs 34;" f numGLuint src/Shader/Parameters.hs 29;" f @@ -4344,7 +4350,7 @@ 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 561;" f +passthroughLockKeyLists src/Dodge/Room/Tutorial.hs 554;" f pathConnected src/Dodge/Room/CheckConsistency.hs 13;" f pathEdgeObstructed src/Dodge/Path.hs 66;" f pauseAndFloatCam src/Dodge/Camera.hs 10;" f @@ -4385,6 +4391,7 @@ plNew src/Dodge/Base/NewID.hs 19;" f plNewID src/Dodge/Base/NewID.hs 7;" f plNewUpID src/Dodge/Base/NewID.hs 13;" f plNewUsing src/Dodge/Base/NewID.hs 27;" f +plPriority src/Dodge/Layout.hs 112;" f plRRpt src/Dodge/LevelGen/PlacementHelper.hs 33;" f placeChasm src/Dodge/Placement/PlaceSpot.hs 153;" f placeMachineWalls src/Dodge/Placement/PlaceSpot.hs 216;" f @@ -4392,7 +4399,7 @@ placePlainPSSpot src/Dodge/Placement/PlaceSpot.hs 41;" f placeSpot src/Dodge/Placement/PlaceSpot.hs 33;" f placeSpotID src/Dodge/Placement/PlaceSpot.hs 102;" f placeSpotRoomRand src/Dodge/Placement/PlaceSpot.hs 87;" f -placeSpotUsingLink src/Dodge/Placement/PlaceSpot.hs 65;" f +placeSpotUsingRoomPos src/Dodge/Placement/PlaceSpot.hs 65;" f placeWallPoly src/Dodge/Placement/PlaceSpot.hs 164;" f plainRegex src/Dodge/DisplayInventory.hs 193;" f playIfFree src/Sound.hs 139;" f @@ -4482,7 +4489,7 @@ powlist src/Multiset.hs 61;" f powlistUpToN src/Multiset.hs 23;" f powlistUpToN' src/Multiset.hs 12;" f powlistUpToN'' src/Multiset.hs 31;" f -preCritStart src/Dodge/Room/Start.hs 83;" f +preCritStart src/Dodge/Room/Start.hs 84;" f prePos src/Quaternion.hs 64;" f preloadRender src/Preload/Render.hs 29;" f premapMaybe src/FoldlHelp.hs 26;" f @@ -4536,7 +4543,7 @@ putDoor src/Dodge/Room/Airlock.hs 114;" f putDoubleDoor src/Dodge/Placement/Instance/Door.hs 17;" f putDoubleDoorThen src/Dodge/Placement/Instance/Door.hs 21;" f putImmediateMessageTerminal src/Dodge/Placement/Instance/Terminal.hs 60;" f -putLamp src/Dodge/Placement/Instance/LightSource.hs 202;" f +putLamp src/Dodge/Placement/Instance/LightSource.hs 203;" f putLasTurret src/Dodge/Placement/Instance/Turret.hs 23;" f putLitButOnPos src/Dodge/Placement/Instance/Button.hs 65;" f putLitButOnPosExtTrig src/Dodge/Placement/Instance/Button.hs 98;" f @@ -4570,22 +4577,22 @@ randDirSpark src/Dodge/Spark.hs 56;" f randEdgeTank src/Dodge/Room/Tanks.hs 34;" f randEdgeTanks src/Dodge/Room/Tanks.hs 52;" f randFirstWeapon src/Dodge/Placement/Random.hs 8;" f -randFromPair src/RandomHelp.hs 143;" f -randInArc src/RandomHelp.hs 83;" f -randInArcStrip src/RandomHelp.hs 86;" f -randInCirc src/RandomHelp.hs 75;" f -randInHemisphere src/RandomHelp.hs 106;" f -randInRect src/RandomHelp.hs 112;" f -randOnCirc src/RandomHelp.hs 78;" f -randOnHemisphere src/RandomHelp.hs 99;" f -randOnUnitSphere src/RandomHelp.hs 92;" f -randPeaked src/RandomHelp.hs 140;" f -randPeakedParam src/RandomHelp.hs 132;" f -randProb src/RandomHelp.hs 70;" f +randFromPair src/RandomHelp.hs 161;" f +randInArc src/RandomHelp.hs 100;" f +randInArcStrip src/RandomHelp.hs 103;" f +randInCirc src/RandomHelp.hs 92;" f +randInHemisphere src/RandomHelp.hs 123;" f +randInRect src/RandomHelp.hs 129;" f +randOnCirc src/RandomHelp.hs 95;" f +randOnHemisphere src/RandomHelp.hs 116;" f +randOnUnitSphere src/RandomHelp.hs 109;" f +randPeaked src/RandomHelp.hs 158;" f +randPeakedParam src/RandomHelp.hs 149;" f +randProb src/RandomHelp.hs 87;" f randSpark src/Dodge/Spark.hs 70;" f randSparkExtraVel src/Dodge/Spark.hs 93;" f randWallReflect src/Dodge/Update.hs 702;" f -randomChallenges src/Dodge/Room/Start.hs 63;" f +randomChallenges src/Dodge/Room/Start.hs 64;" f randomCompass src/Dodge/Layout.hs 60;" f randomFourCornerRoom src/Dodge/Room/Procedural.hs 246;" f randomFourCornerRoomCrsIts src/Dodge/Room/Procedural.hs 258;" f @@ -4594,11 +4601,11 @@ randomMediumRoom src/Dodge/Room/Boss.hs 70;" f randomPath src/TreeHelp.hs 145;" f randomPoints bench/Bench.hs 37;" f randomRanges src/RandomHelp.hs 18;" f -randomSelectionFromList src/RandomHelp.hs 67;" f +randomSelectionFromList src/RandomHelp.hs 84;" f randomTank src/Dodge/Room/Tanks.hs 20;" f randomTreeStructure src/Dodge/Layout/Generate.hs 19;" f -randsOnCirc src/RandomHelp.hs 129;" f -randsSpread src/RandomHelp.hs 122;" f +randsOnCirc src/RandomHelp.hs 146;" f +randsSpread src/RandomHelp.hs 139;" f ratIntersectLineLine src/Geometry/Intersect.hs 214;" f rdToVec2s src/Dodge/Render.hs 426;" f readSaveSlot src/Dodge/Save.hs 45;" f @@ -4640,7 +4647,7 @@ removeAimPosture src/Dodge/Creature/YourControl.hs 159;" f removeAmmoFromMag src/Dodge/HeldUse.hs 929;" f removeDot src/ShortShow.hs 44;" f removeInverseWalls src/Dodge/LevelGen/StaticWalls.hs 25;" f -removeLights src/Dodge/Room/Tutorial.hs 394;" f +removeLights src/Dodge/Room/Modify.hs 34;" f removeShieldWall src/Dodge/Item/BackgroundEffect.hs 71;" f removeWallsInPolygon src/Dodge/LevelGen/StaticWalls.hs 182;" f renderDataResizeUpdate src/Preload/Update.hs 27;" f @@ -4676,7 +4683,7 @@ reversePair src/Dodge/LevelGen.hs 87;" f rewinder src/Dodge/Item/Held/Utility.hs 36;" f rezBox src/Dodge/Room/RezBox.hs 31;" f rezBox' src/Dodge/Room/RezBox.hs 46;" f -rezBoxStart src/Dodge/Room/Start.hs 78;" f +rezBoxStart src/Dodge/Room/Start.hs 79;" f rezBoxes src/Dodge/Room/RezBox.hs 119;" f rezBoxesWpCrit src/Dodge/Room/RezBox.hs 90;" f rezColor src/Dodge/Room/RezBox.hs 138;" f @@ -4752,7 +4759,7 @@ rprBool src/Dodge/PlacementSpot.hs 74;" f rprBoolShift src/Dodge/PlacementSpot.hs 109;" f rprShift src/Dodge/PlacementSpot.hs 100;" f rsObjectColor src/Dodge/RadarSweep/Draw.hs 34;" f -runPastStart src/Dodge/Room/Start.hs 72;" f +runPastStart src/Dodge/Room/Start.hs 73;" f runStateWorld src/Dodge/Randify.hs 18;" f sPS src/Dodge/LevelGen/PlacementHelper.hs 27;" f safeAngleVV src/Geometry/Vector.hs 69;" f @@ -4818,15 +4825,15 @@ selSecSelSize src/Dodge/SelectionSections.hs 143;" f selSecYint src/Dodge/SelectionSections.hs 152;" f selectedItemScroll src/Dodge/Update/Scroll.hs 47;" f semitoneLoop1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 785;" f -sensAboveDoor src/Dodge/Room/SensorDoor.hs 53;" f -sensInsideDoor src/Dodge/Room/SensorDoor.hs 59;" f +sensAboveDoor src/Dodge/Room/SensorDoor.hs 64;" f +sensInsideDoor src/Dodge/Room/SensorDoor.hs 73;" f senseDamage src/Dodge/Machine/Update.hs 264;" f senseDamage' src/Dodge/Wall/Damage.hs 61;" f sensorReqToString src/Dodge/Machine/Update.hs 242;" f -sensorRoom src/Dodge/Room/SensorDoor.hs 26;" f -sensorRoomRunPast src/Dodge/Room/SensorDoor.hs 46;" f +sensorRoom src/Dodge/Room/SensorDoor.hs 31;" f +sensorRoomRunPast src/Dodge/Room/SensorDoor.hs 55;" f sensorSPic src/Dodge/Machine/Draw.hs 99;" f -sensorTut src/Dodge/Room/Tutorial.hs 505;" f +sensorTut src/Dodge/Room/Tutorial.hs 498;" f sensorTypeDamages src/Dodge/Machine/Update.hs 288;" f sensorTypeDamages src/Dodge/Wall/Damage.hs 92;" f sentinelAI src/Dodge/Creature/SentinelAI.hs 20;" f @@ -4876,7 +4883,7 @@ setupFramebufferGivenStencil src/Framebuffer/Setup.hs 31;" f setupLoop src/Loop.hs 30;" f setupShadowFramebuffer src/Framebuffer/Setup.hs 24;" f setupVBO src/Shader/Compile.hs 37;" f -setupWorldBounds src/Dodge/Layout.hs 116;" f +setupWorldBounds src/Dodge/Layout.hs 119;" f sfInvColor src/Dodge/Item/InventoryColor.hs 12;" f shaderTypeExt src/Shader/Compile.hs 59;" f shapeBounds src/Dodge/Room/Foreground.hs 147;" f @@ -4937,17 +4944,17 @@ showEquipItem src/Dodge/Item/Display.hs 108;" f showInt src/Dodge/Item/Info.hs 75;" f showIntsString src/Dodge/Tree/Compose.hs 130;" f showInventoryPathing src/Dodge/Item/Display.hs 86;" f -showManObj src/Dodge/TestString.hs 57;" f +showManObj src/Dodge/TestString.hs 58;" f showMuzzlePositions src/Dodge/Debug.hs 254;" f showTerminalError src/Dodge/Debug/Terminal.hs 80;" f -showTimeFlow src/Dodge/TestString.hs 66;" f +showTimeFlow src/Dodge/TestString.hs 67;" f shrinkPolyOnEdges src/Geometry/Polygon.hs 183;" f shrinkVert src/Geometry/Polygon.hs 187;" f -shuffle src/RandomHelp.hs 51;" f +shuffle src/RandomHelp.hs 68;" f shuffleLinks src/Dodge/Room/Link.hs 30;" f -shufflePair src/RandomHelp.hs 148;" f -shuffleRoomPos src/Dodge/Layout.hs 82;" f -shuffleTail src/RandomHelp.hs 61;" f +shufflePair src/RandomHelp.hs 166;" f +shuffleRoomPos src/Dodge/Layout.hs 86;" f +shuffleTail src/RandomHelp.hs 78;" f sigmoid src/Dodge/Base.hs 151;" f simpleCrSprings src/Dodge/Update.hs 931;" f simpleTermMessage src/Dodge/Terminal.hs 275;" f @@ -4995,7 +5002,7 @@ snailAround src/Dodge/Path.hs 78;" f snapToGrid src/Dodge/Path.hs 129;" f sndV2 src/Geometry/Data.hs 73;" f sniperRifle src/Dodge/Item/Held/Rod.hs 44;" f -someCrits src/Dodge/LockAndKey.hs 123;" f +someCrits src/Dodge/LockAndKey.hs 122;" f soundAngle src/Dodge/SoundLogic.hs 163;" f soundContinue src/Dodge/SoundLogic.hs 131;" f soundContinueVol src/Dodge/SoundLogic.hs 145;" f @@ -5018,7 +5025,7 @@ spanColLightBlackI src/Dodge/Placement/Instance/LightSource.hs 176;" f spanColLightI src/Dodge/Placement/Instance/LightSource.hs 169;" f spanLS src/Dodge/Placement/Instance/LightSource.hs 161;" f spanLightI src/Dodge/Placement/Instance/LightSource.hs 183;" f -spanLightY src/Dodge/Placement/Instance/LightSource.hs 186;" f +spanLightY src/Dodge/Placement/Instance/LightSource.hs 187;" f sparkDam src/Dodge/Spark.hs 37;" f sparkRandDir src/Dodge/Spark.hs 117;" f sparkToDamage src/Dodge/Spark.hs 40;" f @@ -5068,7 +5075,7 @@ stackPicturesAtOff src/Dodge/Render/List.hs 98;" f stackText src/Picture/Base.hs 180;" f stackedInventory src/Dodge/Creature.hs 324;" f startCr src/Dodge/Creature.hs 90;" f -startCrafts src/Dodge/Room/Start.hs 93;" f +startCrafts src/Dodge/Room/Start.hs 94;" f startDrag src/Dodge/Update/Input/InGame.hs 285;" f startInvList src/Dodge/Creature.hs 105;" f startInventory src/Dodge/Creature.hs 108;" f @@ -5090,7 +5097,7 @@ stopBulletAt src/Dodge/Bullet.hs 200;" f stopPushing src/Dodge/Wall/Damage.hs 172;" f stopSoundFrom src/Dodge/SoundLogic.hs 220;" f storageShape src/Dodge/Machine/Draw.hs 31;" f -storeRoomID src/Dodge/Room/LasTurret.hs 187;" f +storeRoomID src/Dodge/Room/Modify.hs 23;" f strFromEquipment src/Dodge/Creature/Statistics.hs 53;" f strFromHeldItem src/Dodge/Creature/Statistics.hs 67;" f strengthFactor src/Dodge/Creature/Impulse/Movement.hs 51;" f @@ -5114,11 +5121,13 @@ t src/ShortShow.hs 48;" f tEast src/Dodge/Room/Corridor.hs 96;" f tToBTree src/Dodge/Tree/Compose.hs 93;" f tWest src/Dodge/Room/Corridor.hs 121;" f -takeN src/RandomHelp.hs 46;" f -takeNMore src/RandomHelp.hs 43;" f +takeN src/RandomHelp.hs 63;" f +takeNMore src/RandomHelp.hs 60;" f takeOne src/RandomHelp.hs 24;" f -takeOneMore src/RandomHelp.hs 36;" f -takeOneWeighted src/RandomHelp.hs 27;" f +takeOneFiltered src/RandomHelp.hs 34;" f +takeOneMore src/RandomHelp.hs 53;" f +takeOneRem src/RandomHelp.hs 27;" f +takeOneWeighted src/RandomHelp.hs 44;" f takeUntil src/FoldableHelp.hs 99;" f takeWhileArb src/ListHelp.hs 100;" f takeWhileArb' src/ListHelp.hs 108;" f @@ -5157,7 +5166,7 @@ testEvent src/Dodge/Event/Test.hs 11;" f testInventory src/Dodge/Creature.hs 305;" f testPic src/Dodge/Render/ShapePicture.hs 57;" f testSPic src/Dodge/Render/ShapePicture.hs 54;" f -testStringInit src/Dodge/TestString.hs 34;" f +testStringInit src/Dodge/TestString.hs 35;" f text src/Picture/Base.hs 185;" f textGrad src/Picture/Text.hs 5;" f textInputBlurb src/Dodge/Terminal.hs 43;" f @@ -5189,7 +5198,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 197;" f +tilesFromRooms src/Dodge/Layout.hs 204;" f tilesToLine src/Shader/AuxAddition.hs 66;" f timeFlowUpdate src/Dodge/Update.hs 181;" f timeScroller src/Dodge/Item/Held/Utility.hs 42;" f @@ -5235,7 +5244,7 @@ tone440sawtoothquietS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 663;" f topInvW src/Dodge/ListDisplayParams.hs 54;" f topPrismEdgeIndices src/Shader/Poke.hs 335;" f topPrismIndices src/Shader/Poke.hs 410;" f -topTestPart src/Dodge/TestString.hs 53;" f +topTestPart src/Dodge/TestString.hs 54;" f torchShape src/Dodge/Item/Draw/SPic.hs 276;" f torqueAmount src/Dodge/HeldUse.hs 596;" f torqueCr src/Dodge/WorldEffect.hs 86;" f @@ -5310,11 +5319,11 @@ 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 112;" f -tutHub src/Dodge/Room/Tutorial.hs 401;" f +tutHub src/Dodge/Room/Tutorial.hs 394;" f tutLight src/Dodge/Room/Tutorial.hs 362;" f -tutRezBox src/Dodge/Room/Tutorial.hs 516;" f +tutRezBox src/Dodge/Room/Tutorial.hs 509;" f tutRoomTree src/Dodge/Floor.hs 20;" f -tutorialMessage1 src/Dodge/Room/Tutorial.hs 541;" f +tutorialMessage1 src/Dodge/Room/Tutorial.hs 534;" f tweenAngles src/Geometry/Vector.hs 190;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 79;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 34;" f @@ -5543,7 +5552,7 @@ wallBlips src/Dodge/RadarSweep.hs 99;" f wallBuffer src/Dodge/WallCreatureCollisions.hs 54;" f wallIsZeroLength src/Dodge/LevelGen/StaticWalls.hs 179;" f wallToSurface src/Dodge/Base/Collide.hs 180;" f -wallsFromRooms src/Dodge/Layout.hs 137;" f +wallsFromRooms src/Dodge/Layout.hs 141;" f wallsToDraw src/Dodge/Render/Walls.hs 18;" f warmupSound src/Dodge/HeldUse.hs 1393;" f warningRooms src/Dodge/Room/Warning.hs 33;" f