diff --git a/src/Dodge/Data/Room.hs b/src/Dodge/Data/Room.hs index a7170279e..924557c8b 100644 --- a/src/Dodge/Data/Room.hs +++ b/src/Dodge/Data/Room.hs @@ -16,7 +16,7 @@ data RoomPos = RoomPos , _rpDir :: Float , _rpType :: S.Set RoomPosType , _rpLinkStatus :: RPLinkStatus - , _rpPlacementUse :: Int + , _rpPlacementUse :: S.Set UsedPos } deriving (Eq, Ord, Show) @@ -80,6 +80,7 @@ data UsedPos = UsedPosLow | UsedPosMid | UsedPosHigh + | UsedPosFloor deriving (Eq, Ord, Show) makeLenses ''RoomLink diff --git a/src/Dodge/PlacementSpot.hs b/src/Dodge/PlacementSpot.hs index 8d666c2d2..31ec3835b 100644 --- a/src/Dodge/PlacementSpot.hs +++ b/src/Dodge/PlacementSpot.hs @@ -61,17 +61,17 @@ randDirPS ps = do isUnusedLnk :: RoomPos -> Room -> Bool isUnusedLnk rp _ = case _rpLinkStatus rp of - UnusedLink{} -> _rpPlacementUse rp == 0 + UnusedLink{} -> null $ _rpPlacementUse rp _ -> False anyUnusedSpot :: PlacementSpot -anyUnusedSpot = rprBool $ \rp _ -> _rpLinkStatus rp == NotLink && _rpPlacementUse rp == 0 +anyUnusedSpot = rprBool $ \rp _ -> _rpLinkStatus rp == NotLink && null (_rpPlacementUse rp) psposAddLabel :: RoomPosType -> PlacementSpot -> PlacementSpot psposAddLabel lab = psSelect %~ (\f rp r -> f rp r & _Just . _2 . rpType %~ S.insert lab) rprBool :: (RoomPos -> Room -> Bool) -> PlacementSpot -rprBool t = PSPos (useRoomPosRoomCond t) (const id) Nothing +rprBool t = PSPos (useRoomPosRoomCond (S.singleton UsedPosLow) t) (const id) Nothing rpIsOnPath :: RoomPos -> Bool rpIsOnPath = any f . _rpType @@ -99,34 +99,34 @@ rpOnPathFromEdge pe = any f . _rpType resetPLUse :: PlacementSpot -> PlacementSpot resetPLUse (PSPos f g fallback) = PSPos f' g fallback where - f' rp = fmap (second (rpPlacementUse .~ 0)) . f rp + f' rp = fmap (second (rpPlacementUse .~ mempty)) . f rp resetPLUse _ = error "Tried to reset _rpPlacementUse of non PSPos placement" rprShift :: - (RoomPos -> Room -> Maybe (Point2, Float)) -> + (RoomPos -> Room -> Maybe ((Point2, Float), S.Set UsedPos)) -> PlacementSpot rprShift t = PSPos f (const id) Nothing where f rp r = case t rp r of - Just (p, a) -> Just (PS p a, rp & rpPlacementUse +~ 1) + Just ((p, a), xs) -> Just (PS p a, rp & rpPlacementUse <>~ xs) Nothing -> Nothing rprBoolShift :: (RoomPos -> Room -> Bool) -> - ((Point2, Float) -> (Point2, Float)) -> + ((Point2, Float) -> ((Point2, Float), S.Set UsedPos)) -> PlacementSpot rprBoolShift t shift = PSPos f (const id) Nothing where f rp r - | t rp r = Just (PS p a, rp & rpPlacementUse +~ 1) + | t rp r = Just (PS p a, rp & rpPlacementUse <>~ xs) | otherwise = Nothing where - (p, a) = shift (_rpPos rp, _rpDir rp) + ((p, a), xs) = shift (_rpPos rp, _rpDir rp) unusedSpotAwayFromLink :: Float -> PlacementSpot unusedSpotAwayFromLink x = rprBool $ \rp r -> _rpLinkStatus rp == NotLink - && _rpPlacementUse rp == 0 + && null (_rpPlacementUse rp) && all ((> x) . dist (_rpPos rp)) (usedRoomLinkPoss r) setFallback :: Placement -> Placement -> Placement @@ -137,14 +137,14 @@ setFallback fallback = unusedOffPathAwayFromLink :: Float -> PlacementSpot unusedOffPathAwayFromLink x = rprBool $ \rp r -> - _rpPlacementUse rp == 0 + null (_rpPlacementUse rp) && all ((> x) . dist (_rpPos rp)) (usedRoomLinkPoss r) && rpIsOffPath rp unusedSpotAwayFromInLink :: Float -> PlacementSpot unusedSpotAwayFromInLink x = rprBool $ \rp r -> _rpLinkStatus rp == NotLink - && _rpPlacementUse rp == 0 + && null (_rpPlacementUse rp) && all ((> x) . dist (_rpPos rp)) (usedRoomInLinkPoss r) --twoUnusedLinks :: (PlacementSpot -> PlacementSpot -> Placement) -> Placement @@ -167,12 +167,12 @@ twoRoomPoss cond1 cond2 f = Placement (rprBool cond1) PutNothing Nothing Nothing isInLnk :: RoomPos -> Bool isInLnk rp = case _rpLinkStatus rp of - UsedInLink{} -> _rpPlacementUse rp == 0 + UsedInLink{} -> null $ _rpPlacementUse rp _ -> False isOutLnk :: RoomPos -> Bool isOutLnk rp = case _rpLinkStatus rp of - UsedOutLink{} -> _rpPlacementUse rp == 0 + UsedOutLink{} -> null $ _rpPlacementUse rp _ -> False useUnusedLnk :: PlacementSpot @@ -180,27 +180,30 @@ useUnusedLnk = rprBool isUnusedLnk isUsedLnkUnplaced :: RoomPos -> Bool isUsedLnkUnplaced rp = case _rpLinkStatus rp of - UsedOutLink{} -> _rpPlacementUse rp == 0 - UsedInLink{} -> _rpPlacementUse rp == 0 + UsedOutLink{} -> null (_rpPlacementUse rp) + UsedInLink{} -> null (_rpPlacementUse rp) _ -> False useRoomPosCond :: (RoomPos -> Room -> Bool) -> RoomPos -> Room -> Maybe (PlacementSpot, RoomPos) -useRoomPosCond f = useRoomPosRoomCond $ \rp r -> f rp r +useRoomPosCond f = useRoomPosRoomCond (S.singleton UsedPosLow) $ \rp r -> f rp r -useRoomPosRoomCond :: (RoomPos -> Room -> Bool) -> RoomPos -> Room -> Maybe (PlacementSpot, RoomPos) -useRoomPosRoomCond t rp r - | t rp r = Just (PS (_rpPos rp) (_rpDir rp), rp & rpPlacementUse +~ 1) +useRoomPosRoomCond :: S.Set UsedPos + -> (RoomPos -> Room -> Bool) -> RoomPos -> Room + -> Maybe (PlacementSpot, RoomPos) +useRoomPosRoomCond xs t rp r + | t rp r = Just (PS (_rpPos rp) (_rpDir rp), rp & rpPlacementUse <>~ xs) | otherwise = Nothing isUnusedLnkType :: RoomLinkType -> RoomPos -> Room -> Bool isUnusedLnkType rlt rp _ = case _rpLinkStatus rp of - UnusedLink{_rplsType = rlts} -> rlt `S.member` rlts && _rpPlacementUse rp == 0 + UnusedLink{_rplsType = rlts} -> rlt `S.member` rlts + && null (_rpPlacementUse rp) _ -> False unusedSpotNearInLink :: Float -> PlacementSpot unusedSpotNearInLink x = rprBool $ \rp r -> _rpLinkStatus rp == NotLink - && _rpPlacementUse rp == 0 + && null (_rpPlacementUse rp) && any ((< x) . dist (_rpPos rp)) (usedRoomInLinkPoss r) usedRoomInLinkPoss :: Room -> [Point2] @@ -224,7 +227,8 @@ atFstLnkOut = atNthLinkOut 0 atNthLinkOut :: Int -> PlacementSpot atNthLinkOut n = rprBool $ \rp _ -> rp ^? rpLinkStatus . rplsChildNum == Just n -atNthLnkOutShiftBy :: Int -> ((Point2, Float) -> (Point2, Float)) -> PlacementSpot +atNthLnkOutShiftBy :: Int -> ((Point2, Float) -> ((Point2, Float),S.Set UsedPos)) + -> PlacementSpot atNthLnkOutShiftBy n = rprBoolShift $ \rp _ -> rp ^? rpLinkStatus . rplsChildNum == Just n @@ -237,7 +241,7 @@ atNthLnkOutShiftBy n = rprBoolShift $ -- where -- (p,a) = theshift (_rpPos rp,_rpDir rp) -atFstLnkOutShiftBy :: ((Point2, Float) -> (Point2, Float)) -> PlacementSpot +atFstLnkOutShiftBy :: ((Point2, Float) -> ((Point2, Float), S.Set UsedPos)) -> PlacementSpot atFstLnkOutShiftBy = atNthLnkOutShiftBy 0 atFstLnkOutShiftInward :: Float -> PlacementSpot @@ -245,7 +249,7 @@ atFstLnkOutShiftInward = atNthLnkOutShiftInward 0 atNthLnkOutShiftInward :: Int -> Float -> PlacementSpot atNthLnkOutShiftInward n x = atNthLnkOutShiftBy n $ - \(p, a) -> (p +.+ rotateV a (V2 0 (negate x)), a) + \(p, a) -> ((p +.+ rotateV a (V2 0 (negate x)), a), S.singleton UsedPosLow) shiftInBy :: Float -> (Point2, Float) -> (Point2, Float) shiftInBy x (p, a) = (p +.+ rotateV a (V2 0 (negate x)), a) @@ -255,9 +259,9 @@ shiftByV2 x (p, a) = (p +.+ rotateV a x, a) -- this should probably check the placement use, but so should others: should -- unify these -useLnkRoomPos :: RoomPos -> Room -> Maybe (PlacementSpot, RoomPos) -useLnkRoomPos rp _ = case _rpLinkStatus rp of - UnusedLink{} -> Just (PS (_rpPos rp) (_rpDir rp), rp & rpPlacementUse +~ 1) +useLnkRoomPos :: S.Set UsedPos -> RoomPos -> Room -> Maybe (PlacementSpot, RoomPos) +useLnkRoomPos xs rp _ = case _rpLinkStatus rp of + UnusedLink{} -> Just (PS (_rpPos rp) (_rpDir rp), rp & rpPlacementUse <>~ xs) _ -> Nothing psRandRanges :: (Float, Float) -> (Float, Float) -> (Float, Float) -> State StdGen (Point2, Float) diff --git a/src/Dodge/Room/LasTurret.hs b/src/Dodge/Room/LasTurret.hs index 73d583439..65286aadb 100644 --- a/src/Dodge/Room/LasTurret.hs +++ b/src/Dodge/Room/LasTurret.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE TupleSections #-} module Dodge.Room.LasTurret where --import Dodge.Item.Held.Cane @@ -27,7 +28,7 @@ cenLasTur = do roomNgon 8 200 <&> rmPmnts .~ [ putLasTurret 0.02 , heightWallPS - (resetPLUse $ rprBoolShift (const . isInLnk) (shiftInBy 100)) + (resetPLUse $ rprBoolShift (const . isInLnk) (shiftInBy 100 <&> (,S.singleton UsedPosLow))) 30 covershape , thelight @@ -60,7 +61,7 @@ lightSensByDoor i rm = -- & rmOutPmnt . at i ?~ sensAboveDoor LaserSensor 20 (atFstLnkOutShiftBy sensorshift) covershape = rectNSWE 10 (-10) (-20) 20 - sensorshift (p, a) = (p +.+ rotateV a (V2 60 (-20)), a) + sensorshift (p, a) = ((p +.+ rotateV a (V2 60 (-20)), a),S.singleton UsedPosLow) keyCardRoomRunPast :: RandomGen g => Int -> Int -> State g (MetaTree Room String) keyCardRoomRunPast keyid rmid = do @@ -87,12 +88,13 @@ analyserByNthLink n proxreq i rm = .++~ [ psPt (atNthLinkOut n) $ PutForeground $ verticalWire (V2 20 0) 0 80 , analyser (SensorWithRequirement proxreq) - (atNthLnkOutShiftBy n (\(p, a) -> (p +.+ rotateV a (V2 18.5 (-2.5)), a))) + (atNthLnkOutShiftBy n (\(p, a) -> + ((p +.+ rotateV a (V2 18.5 (-2.5)), a), S.singleton UsedPosLow))) (atNthLnkOutShiftBy n sensorshift) & plExternalID ?~ i ] where - sensorshift (p, a) = (p +.+ rotateV a (V2 (-30) (-10)), a) + sensorshift (p, a) = ((p +.+ rotateV a (V2 (-30) (-10)), a), S.singleton UsedPosLow) analyserByNthLinkWithPrompt :: Int -> [TerminalLine] -> ProximityRequirement -> Int -> Placement @@ -103,12 +105,13 @@ analyserByNthLinkWithPrompt n l proxreq i = analyserWithPrompt l (SensorWithRequirement proxreq) - (atNthLnkOutShiftBy n (\(p, a) -> (p +.+ rotateV a (V2 18.5 (-2.5)), a))) + (atNthLnkOutShiftBy n (\(p, a) -> + ((p +.+ rotateV a (V2 18.5 (-2.5)), a),S.singleton UsedPosLow))) (atNthLnkOutShiftBy n sensorshift) & plExternalID ?~ i -- ] where - sensorshift (p, a) = (p +.+ rotateV a (V2 (-30) (-10)), a) + sensorshift (p, a) = ((p +.+ rotateV a (V2 (-30) (-10)), a), S.singleton UsedPosLow) analyserByDoor :: ProximityRequirement -> Int -> Room -> Room analyserByDoor = analyserByNthLink 0 diff --git a/src/Dodge/Room/LongDoor.hs b/src/Dodge/Room/LongDoor.hs index 8578b57b7..68177ee61 100644 --- a/src/Dodge/Room/LongDoor.hs +++ b/src/Dodge/Room/LongDoor.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE TupleSections #-} -- | Rooms containing long doors, probably with a big reveal behind them. module Dodge.Room.LongDoor where @@ -105,7 +106,8 @@ addButtonSlowDoor x h rm = do where theterminal = putMessageTerminal terminalColor (simpleTermMessage themessage) - & plSpot .~ rprBoolShift (isUnusedLnkType InLink) (shiftByV2 (V2 0 (-10))) + & plSpot .~ rprBoolShift (isUnusedLnkType InLink) + (shiftByV2 (V2 0 (-10)) <&> (,S.singleton UsedPosLow)) themessage = [ "WARNING:" , "LARGE BIOMASS DETECTED" diff --git a/src/Dodge/Room/Pillar.hs b/src/Dodge/Room/Pillar.hs index 1420ca84f..8da0bde7f 100644 --- a/src/Dodge/Room/Pillar.hs +++ b/src/Dodge/Room/Pillar.hs @@ -87,7 +87,7 @@ 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) && _rpPlacementUse rp == 0 + t edge rp = any (f edge) (_rpType rp) && null (_rpPlacementUse rp) f edge rpt = maybe False (PathFromEdge edge 0 `S.member`) (rpt ^? offPathFromEdges) roomPillarsPassage :: RandomGen g => State g Room @@ -114,7 +114,7 @@ roomPillars pillarsize w h wn hn = do .~ rprBool ( \rp _ -> rpIsOffPath rp - && _rpPlacementUse rp == 0 + && null (_rpPlacementUse rp) && _rpLinkStatus rp == NotLink ) ) diff --git a/src/Dodge/Room/Procedural.hs b/src/Dodge/Room/Procedural.hs index e4b0b0027..9e7558823 100644 --- a/src/Dodge/Room/Procedural.hs +++ b/src/Dodge/Room/Procedural.hs @@ -96,7 +96,8 @@ roomRect x y xn yn = zipWith (lnkBothAnd (OnEdge edge) edgefrom1 edgefrom2) [0 ..] . zipCountDown pth = linksAndPath' lnks $ map (bimap (+.+ V2 20 20) (+.+ V2 20 20)) (makeGrid xd xn yd yn) - makeonpos (p, a) = RoomPos p 0 (S.singleton $ RoomPosOnPath $ makerpedges a) NotLink 0 + makeonpos (p, a) = RoomPos p 0 (S.singleton $ RoomPosOnPath $ makerpedges a) + NotLink mempty makerpedges (a, b) = S.fromList [ PathFromEdge South b @@ -106,7 +107,8 @@ 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 $ RoomPosOffPath $ makerpedges' a) NotLink 0 + makeoffpos (p, a) = RoomPos + p 0 (S.singleton $ RoomPosOffPath $ makerpedges' a) NotLink mempty makerpedges' (a, b) = S.fromList [ PathFromEdge South b @@ -203,8 +205,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 0 - , RoomPos (V2 (w -15) (w -25)) pi S.empty NotLink 0 + [ RoomPos (V2 (w -20) (w -20)) pi S.empty NotLink mempty + , RoomPos (V2 (w -15) (w -25)) pi S.empty NotLink mempty ] , _rmBound = [[V2 0 0, V2 w w, V2 (- w) w]] } @@ -252,7 +254,7 @@ quarterRoomSquare w = do ] , _rmPmnts = b ++ [blockLine (V2 (w / 2) (w / 2)) (V2 0 w)] , _rmPos = - [ RoomPos p pi S.empty NotLink 0 + [ RoomPos p pi S.empty NotLink 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 a9c0b3e74..6e27908db 100644 --- a/src/Dodge/Room/Room.hs +++ b/src/Dodge/Room/Room.hs @@ -201,7 +201,7 @@ weaponBetweenPillars = do let wpPos = rprBool $ \rp r -> and [ rpIsOnPath rp - , _rpPlacementUse rp == 0 + , null $ _rpPlacementUse rp , _rpLinkStatus rp == NotLink , any ((< 100) . dist (_rpPos rp)) (usedRoomInLinkPoss r) ] @@ -211,7 +211,7 @@ weaponBetweenPillars = do randDirPS $ rprBool $ \rp r -> rpIsOnPath rp - && _rpPlacementUse rp == 0 + && null (_rpPlacementUse rp) && all ((> 100) . dist (_rpPos rp)) (usedRoomLinkPoss r) ( roomPillars 30 w h wn hn <&> rmPmnts .++~ map (`sps` randC1) critPlacementSpots ++ [sps wpPos (PutFlIt wp)] @@ -329,7 +329,7 @@ pistolerRoom = do .++~ replicate 3 ( psPtPl - (rprBool $ \rp _ -> _rpPlacementUse rp == 0 && rpIsOnPath rp) + (rprBool $ \rp _ -> null (_rpPlacementUse rp) && rpIsOnPath rp) (PutCrit chaseCrit) ) @@ -369,7 +369,7 @@ spawnerRoom = do roomC x y <&> rmPmnts .:~ psPtPl ( rprBool $ \rp _ -> - _rpPlacementUse rp == 0 && rpIsOnPath rp + null (_rpPlacementUse rp) && rpIsOnPath rp && xV2 (_rpPos rp) < x / 2 && yV2 (_rpPos rp) < y / 2 ) diff --git a/src/Dodge/Room/SensorDoor.hs b/src/Dodge/Room/SensorDoor.hs index f36df9abd..1e5c09df7 100644 --- a/src/Dodge/Room/SensorDoor.hs +++ b/src/Dodge/Room/SensorDoor.hs @@ -1,4 +1,4 @@ ---{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} module Dodge.Room.SensorDoor (sensAboveDoor,sensorRoomRunPast) where import Dodge.Data.MTRS @@ -53,7 +53,7 @@ sensorRoomRunPast dt n = do sensAboveDoor :: SensorType -> Float -> PlacementSpot -> Placement sensAboveDoor sensetype wth ps = extTrigLitPos - (atFstLnkOutShiftBy (\(p, a) -> (p +.+ rotateV a (V2 18.5 (-2.5)), a))) + (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 @@ -65,7 +65,7 @@ sensInsideDoor senseType i rm = rm , psPt atFstLnkOut . PutForeground $ verticalWire (V2 20 0) 0 80 , putMessageTerminal terminalColor (textTerminal & tmCommands .:~ TCDamageCommand) - & plSpot .~ rprBoolShift isUnusedLnk (shiftInBy 10) + & 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/Tanks.hs b/src/Dodge/Room/Tanks.hs index f269e7c76..3412e4de8 100644 --- a/src/Dodge/Room/Tanks.hs +++ b/src/Dodge/Room/Tanks.hs @@ -56,7 +56,7 @@ randEdgeTank = do & plSpot .~ rprBool ( \rp _ -> - _rpPlacementUse rp == 0 + null (_rpPlacementUse rp) && rpOffPathFromEdge (PathFromEdge edge 0) rp ) @@ -85,7 +85,7 @@ randEdgeTanks i = do & plSpot .~ rprBool ( \rp _ -> - _rpPlacementUse rp == 0 + null (_rpPlacementUse rp) && rpOffPathFromEdge (PathFromEdge edge 0) rp ) diff --git a/src/Dodge/Room/Tutorial.hs b/src/Dodge/Room/Tutorial.hs index af1165ae1..928799d24 100644 --- a/src/Dodge/Room/Tutorial.hs +++ b/src/Dodge/Room/Tutorial.hs @@ -1,5 +1,6 @@ module Dodge.Room.Tutorial where +import qualified Data.Set as S import ShortShow import Dodge.Data.MTRS import Dodge.Room.Room @@ -86,7 +87,7 @@ tutDrop = do terminalColor (defaultTerminal & tmBootLines .~ ss <> tlSetStatus (TerminalPressTo $ show x <>"QUIT") <> tlDoEffect TmWdWdPowerDownTerminal) & plSpot .~ rprBoolShift isUnusedLnk - (\(p, a) -> (p + 10 *.* unitVectorAtAngle (a - pi/2), a)) + (\(p, a) -> ((p + 10 *.* unitVectorAtAngle (a - pi/2), a), S.singleton UsedPosLow)) ss = [makeTermLine "--------------------------------------------" ,makeTermLine "YOU CAN ONLY CARRY A LIMITED AMOUNT OF ITEMS" @@ -151,7 +152,7 @@ tutHub = do terminalColor (defaultTerminal & tmBootLines .~ ss' <> tlSetStatus (TerminalPressTo "QUIT") <> tlDoEffect TmWdWdPowerDownTerminal) & plSpot .~ rprBoolShift isUnusedLnk - (\(p, a) -> (p + 10 *.* unitVectorAtAngle (a - pi/2), a)) + (\(p, a) -> ((p + 10 *.* unitVectorAtAngle (a - pi/2), a),S.singleton UsedPosLow)) ss' = [ makeTermLine "---------------------------------------------" , makeTermLine "HOLD [CAPS] AND SCROLL" diff --git a/src/Dodge/Room/Warning.hs b/src/Dodge/Room/Warning.hs index 6deed3dca..580a5d271 100644 --- a/src/Dodge/Room/Warning.hs +++ b/src/Dodge/Room/Warning.hs @@ -1,15 +1,19 @@ --{-# LANGUAGE TupleSections #-} -module Dodge.Room.Warning (warningRooms,addDoorToggleTerminal - , addDoorAtNthLinkToggleTerminal) where +module Dodge.Room.Warning ( + warningRooms, + addDoorToggleTerminal, + addDoorAtNthLinkToggleTerminal, +) where -import Control.Monad -import Dodge.Default.Terminal -import Dodge.Data.BlBl import Color +import Control.Monad import qualified Data.Map.Strict as M import Data.Maybe +import qualified Data.Set as S import Dodge.Cleat +import Dodge.Data.BlBl import Dodge.Data.GenWorld +import Dodge.Default.Terminal import Dodge.Placement.Instance import Dodge.PlacementSpot import Dodge.Room.Door @@ -34,32 +38,37 @@ addDoorToggleTerminal :: [TerminalLine] -> Int -> Room -> Room addDoorToggleTerminal = addDoorAtNthLinkToggleTerminal 0 addDoorAtNthLinkToggleTerminal :: Int -> [TerminalLine] -> Int -> Room -> Room -addDoorAtNthLinkToggleTerminal j xs i = (rmName .++~ "doorToggle-") --- . (rmOutPmnt . at i ?~ outplace) +addDoorAtNthLinkToggleTerminal j xs i = + (rmName .++~ "doorToggle-") + -- . (rmOutPmnt . at i ?~ outplace) . (rmPmnts .:~ outplace) where outplace = extTrigLitPos - (atNthLnkOutShiftBy j (\(p, a) -> (p +.+ rotateV a (V2 18.5 (-2.5)), a))) - ( Just . set plSpot (rprShift (moveToSideNthOutLink j)) + (atNthLnkOutShiftBy j (\(p, a) -> ((p +.+ rotateV a (V2 18.5 (-2.5)), a), S.singleton UsedPosLow))) + ( Just . set plSpot (rprShift (moveToSideNthOutLink (S.singleton UsedPosLow) j)) . putMessageTerminal terminalColor . termMessages - ) & plExternalID ?~ i + ) + & plExternalID + ?~ i termMessages trpl = lineOutputTerminal xs --(makeColorTermLine red "WARNING" : makeTermPara str) - & tmToggles .~ M.fromList + & tmToggles + .~ M.fromList [("DOOR", TerminalToggle (fromJust $ _plMID trpl) (BlConst True))] - addWarningTerminal :: String -> Int -> Room -> Room -addWarningTerminal str = addDoorToggleTerminal - (makeColorTermLine red "WARNING" : makeTermPara str) +addWarningTerminal str = + addDoorToggleTerminal + (makeColorTermLine red "WARNING" : makeTermPara str) lineOutputTerminal :: [TerminalLine] -> Terminal lineOutputTerminal tls = defaultTerminal & tmBootLines .~ textInputBlurb tls -moveToSideNthOutLink :: Int -> RoomPos -> Room -> Maybe (Point2, Float) -moveToSideNthOutLink i rp rm = do +moveToSideNthOutLink :: S.Set UsedPos + -> Int -> RoomPos -> Room -> Maybe ((Point2, Float), S.Set UsedPos) +moveToSideNthOutLink xs i rp rm = do j <- rp ^? rpLinkStatus . rplsChildNum guard $ i == j let rppos = _rpPos rp @@ -67,11 +76,12 @@ moveToSideNthOutLink i rp rm = do inpos = rppos +.+ rotateV rpdir (V2 0 (-12.5)) rtpos = inpos +.+ rotateV rpdir (V2 30 0) ltpos = inpos +.+ rotateV rpdir (V2 (-30) 0) - return $ if any (isJust . intersectSegPolyFirst inpos ltpos) (_rmPolys rm) + return $ + if any (isJust . intersectSegPolyFirst inpos ltpos) (_rmPolys rm) then -- the above test may not work properly if the room polys are -- complicated, it should really use created walls... - (rtpos, rpdir) - else (ltpos, rpdir) + ((rtpos, rpdir), xs) + else ((ltpos, rpdir), xs) --moveToSideFirstOutLink :: RoomPos -> Room -> Maybe (Point2, Float) --moveToSideFirstOutLink rp rm = do diff --git a/src/Dodge/Tree/Shift.hs b/src/Dodge/Tree/Shift.hs index e0636913a..49c492870 100644 --- a/src/Dodge/Tree/Shift.hs +++ b/src/Dodge/Tree/Shift.hs @@ -91,7 +91,7 @@ posRms prs parenti@(parent, _) ((numChild, t@(Node childi _)) : its) tseq = do , _rpDir = snd (lnkPosDir outlnk) , _rpType = S.empty , _rpLinkStatus = UsedOutLink (_rlType outlnk) numChild (snd childi) - , _rpPlacementUse = 0 + , _rpPlacementUse = mempty } & rmChildren .:~ snd childi shiftedoutlink = shiftLinkBy (_rmShift parent) outlnk @@ -106,7 +106,7 @@ posRms prs parenti@(parent, _) ((numChild, t@(Node childi _)) : its) tseq = do , _rpDir = snd (lnkPosDir il) , _rpType = S.empty , _rpLinkStatus = UsedInLink (_rlType il) (snd parenti) - , _rpPlacementUse = 0 + , _rpPlacementUse = mempty } shiftedt = over @@ -123,7 +123,7 @@ createUnusedLinkPos rm = rm & rmPos .++~ map f (_rmLinks rm) , _rpDir = _rlDir rl , _rpType = S.empty , _rpLinkStatus = UnusedLink $ _rlType rl - , _rpPlacementUse = 0 + , _rpPlacementUse = mempty } zipCount :: [a] -> [(Int, a)] diff --git a/tags b/tags index 88ff1afd5..6ba8b2891 100644 --- a/tags +++ b/tags @@ -1446,6 +1446,11 @@ UseableWhenAimed src/Dodge/Data/UseCondition.hs 5;" C UseableWhenHeld src/Dodge/Data/UseCondition.hs 6;" C UsedInLink src/Dodge/Data/Room.hs 61;" C UsedOutLink src/Dodge/Data/Room.hs 56;" C +UsedPos src/Dodge/Data/Room.hs 79;" t +UsedPosFloor src/Dodge/Data/Room.hs 83;" C +UsedPosHigh src/Dodge/Data/Room.hs 82;" C +UsedPosLow src/Dodge/Data/Room.hs 80;" C +UsedPosMid src/Dodge/Data/Room.hs 81;" C VAO src/Shader/Data.hs 64;" t VBO src/Shader/Data.hs 81;" t VF src/Polyhedra/Data.hs 21;" t @@ -2552,11 +2557,11 @@ activateDetonator src/Dodge/Creature/Impulse/UseItem.hs 62;" f activeTargetCursorPic src/Dodge/Targeting/Draw.hs 31;" f addArmour src/Dodge/Creature.hs 84;" f addBranchAt src/Dodge/Tree/GenerateStructure.hs 18;" f -addButtonSlowDoor src/Dodge/Room/LongDoor.hs 97;" f +addButtonSlowDoor src/Dodge/Room/LongDoor.hs 98;" f addCrGibs src/Dodge/Prop/Gib.hs 16;" f addDepth src/Picture/Base.hs 133;" f -addDoorAtNthLinkToggleTerminal src/Dodge/Room/Warning.hs 36;" f -addDoorToggleTerminal src/Dodge/Room/Warning.hs 33;" f +addDoorAtNthLinkToggleTerminal src/Dodge/Room/Warning.hs 40;" f +addDoorToggleTerminal src/Dodge/Room/Warning.hs 37;" f addDoorWall src/Dodge/Placement/PlaceSpot/TriggerDoor.hs 53;" f addEdges src/Dodge/Path.hs 122;" f addGib4 src/Dodge/Prop/Gib.hs 51;" f @@ -2582,10 +2587,10 @@ addPolyWalls src/Dodge/LevelGen/StaticWalls.hs 129;" f addRandomGirderEW src/Dodge/Room/Girder.hs 9;" f addRandomGirderFrom src/Dodge/Room/Girder.hs 16;" f addSideEffect src/Dodge/Concurrent.hs 29;" f -addSouthPillars src/Dodge/Room/LongDoor.hs 89;" f +addSouthPillars src/Dodge/Room/LongDoor.hs 90;" f addTermSignal src/Dodge/Event/Input.hs 31;" f addToTrunk src/TreeHelp.hs 157;" f -addWarningTerminal src/Dodge/Room/Warning.hs 54;" f +addWarningTerminal src/Dodge/Room/Warning.hs 61;" f addZ src/Geometry/Vector3D.hs 89;" f adjustIMZone src/Dodge/Base.hs 81;" f advanceScrollAmount src/Dodge/Update.hs 403;" f @@ -2610,10 +2615,10 @@ ammoMagSPic src/Dodge/Item/Draw/SPic.hs 145;" f amr src/Dodge/Item/Held/Rod.hs 34;" f anRoom src/Dodge/Floor.hs 117;" f analyser src/Dodge/Placement/Instance/Analyser.hs 12;" f -analyserByDoor src/Dodge/Room/LasTurret.hs 113;" f -analyserByDoorWithPrompt src/Dodge/Room/LasTurret.hs 116;" f -analyserByNthLink src/Dodge/Room/LasTurret.hs 83;" f -analyserByNthLinkWithPrompt src/Dodge/Room/LasTurret.hs 97;" f +analyserByDoor src/Dodge/Room/LasTurret.hs 116;" f +analyserByDoorWithPrompt src/Dodge/Room/LasTurret.hs 119;" f +analyserByNthLink src/Dodge/Room/LasTurret.hs 84;" f +analyserByNthLinkWithPrompt src/Dodge/Room/LasTurret.hs 99;" f analyserWithPrompt src/Dodge/Placement/Instance/Analyser.hs 15;" f andOrRegex src/Dodge/DisplayInventory.hs 78;" f angleBetween src/Geometry.hs 161;" f @@ -2664,12 +2669,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 44;" f -atFstLnkOut src/Dodge/PlacementSpot.hs 221;" f -atFstLnkOutShiftBy src/Dodge/PlacementSpot.hs 240;" f -atFstLnkOutShiftInward src/Dodge/PlacementSpot.hs 243;" f -atNthLinkOut src/Dodge/PlacementSpot.hs 224;" f -atNthLnkOutShiftBy src/Dodge/PlacementSpot.hs 227;" f -atNthLnkOutShiftInward src/Dodge/PlacementSpot.hs 246;" 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 attachBranch src/Dodge/Tree/Compose.hs 83;" f attachInfo src/Dodge/Item/Info.hs 58;" f attachList src/Dodge/Tree/Compose.hs 80;" f @@ -2811,10 +2816,10 @@ cardList src/Dodge/Base/CardinalPoint.hs 6;" f cardVec src/Dodge/Base/CardinalPoint.hs 9;" f cardinalVectors src/Dodge/FloorItem.hs 24;" f cdtPropagateFold src/Dodge/DoubleTree.hs 407;" f -cenLasTur src/Dodge/Room/LasTurret.hs 24;" f +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 288;" f +centerVaultRoom src/Dodge/Room/Procedural.hs 290;" f centroid src/Geometry/Polygon.hs 136;" f centroidNum src/Geometry/Polygon.hs 139;" f chainCreatureUpdates src/Dodge/Creature/ChainUpdates.hs 6;" f @@ -2870,7 +2875,7 @@ clAlt src/Dodge/Cloud.hs 5;" f clClSpringVel src/Dodge/Update.hs 827;" f clColor src/Shader/Poke/Cloud.hs 35;" f clZoneSize src/Dodge/Zoning/Cloud.hs 21;" f -clampPath src/Dodge/Room/Procedural.hs 165;" f +clampPath src/Dodge/Room/Procedural.hs 167;" f clang1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 560;" f clang2S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 676;" f clangS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 542;" f @@ -2929,11 +2934,11 @@ combinationsGraph src/Dodge/Combine/Graph.hs 74;" f combinationsOf src/Multiset.hs 46;" f combinationsTrie src/Dodge/Combine.hs 43;" f combineAwareness src/Dodge/Creature/Perception.hs 110;" f -combineFloors src/Dodge/Room/Procedural.hs 171;" f +combineFloors src/Dodge/Room/Procedural.hs 173;" f combineInventoryExtra src/Dodge/Render/HUD.hs 337;" f combineItemListYouX src/Dodge/Combine.hs 35;" f combineList src/Dodge/Combine.hs 21;" f -combineRooms src/Dodge/Room/Procedural.hs 151;" f +combineRooms src/Dodge/Room/Procedural.hs 153;" f combineS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 480;" f combineTree src/Dodge/Tree/Compose.hs 67;" f commandColor src/Dodge/Terminal.hs 114;" f @@ -2963,7 +2968,7 @@ coolMinigun src/Dodge/Creature/State.hs 94;" f copier src/Dodge/Item/Scope.hs 88;" f copierItemUpdate src/Dodge/Creature/State.hs 130;" f copyItemToFloor src/Dodge/FloorItem.hs 14;" f -corDoor src/Dodge/Room/Room.hs 378;" f +corDoor src/Dodge/Room/Room.hs 380;" f cornerList src/Preload/Render.hs 198;" f corpseOrGib src/Dodge/Creature/Update.hs 110;" f corridor src/Dodge/Room/Corridor.hs 17;" f @@ -3035,9 +3040,9 @@ creatureShootPulseLaser src/Dodge/HeldUse.hs 859;" f creatureTurnTo src/Dodge/Creature/Impulse/Movement.hs 53;" f creatureTurnToward src/Dodge/Creature/Impulse/Movement.hs 74;" f creatureTurnTowardDir src/Dodge/Creature/Impulse/Movement.hs 63;" f -critInDeadEnd src/Dodge/Room/Room.hs 236;" f -critsPillarRoom src/Dodge/Room/Room.hs 383;" f -critsRoom src/Dodge/Room/Room.hs 391;" f +critInDeadEnd src/Dodge/Room/Room.hs 238;" f +critsPillarRoom src/Dodge/Room/Room.hs 385;" f +critsRoom src/Dodge/Room/Room.hs 393;" f crixsNearSeg src/Dodge/Zoning/Creature.hs 29;" f crossPic src/Dodge/Render/Label.hs 27;" f crossProd src/Geometry/Vector3D.hs 41;" f @@ -3098,7 +3103,7 @@ dbArgChain src/Dodge/Base.hs 170;" f dbwMuzzles src/Dodge/HeldUse.hs 314;" f deZoneIX src/Dodge/Zoning/Base.hs 89;" f deZoneWall src/Dodge/Zoning/Wall.hs 70;" f -deadEndRoom src/Dodge/Room/Room.hs 239;" f +deadEndRoom src/Dodge/Room/Room.hs 241;" f deadFeet src/Dodge/Creature/Picture.hs 68;" f deadRot src/Dodge/Creature/Picture.hs 84;" f deadScalp src/Dodge/Creature/Picture.hs 81;" f @@ -3311,7 +3316,7 @@ doorMechanism src/Dodge/DrWdWd.hs 24;" f doorMechanismStepwise src/Dodge/DrWdWd.hs 59;" f dotV src/Geometry/Vector.hs 75;" f dotV3 src/Geometry/Vector3D.hs 119;" f -doubleCorridorBarrels src/Dodge/Room/Room.hs 269;" f +doubleCorridorBarrels src/Dodge/Room/Room.hs 271;" f doubleFindMax src/Dodge/Update/Scroll.hs 181;" f doubleFindMin src/Dodge/Update/Scroll.hs 160;" f doubleFindPred src/Dodge/Update/Scroll.hs 188;" f @@ -3704,7 +3709,7 @@ glassShat2S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 618;" f 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 101;" f +glassSwitchBackCrits src/Dodge/Room/Room.hs 103;" f glauncherPic src/Dodge/Item/Draw/SPic.hs 412;" f glushortSize src/Shader/Parameters.hs 25;" f goToPostStrat src/Dodge/Creature/Strategy.hs 10;" f @@ -3762,8 +3767,8 @@ headLampShape src/Dodge/Item/Draw/SPic.hs 455;" f headMap src/Dodge/DoubleTree.hs 249;" f headPQ src/Dodge/Creature/HandPos.hs 115;" f healS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 492;" f -healthAnalyserByDoor src/Dodge/Room/LasTurret.hs 80;" f -healthTest src/Dodge/Room/LasTurret.hs 119;" f +healthAnalyserByDoor src/Dodge/Room/LasTurret.hs 81;" f +healthTest src/Dodge/Room/LasTurret.hs 122;" f heightWallPS src/Dodge/Placement/Instance/Wall.hs 13;" f heldAimStance src/Dodge/Item/AimStance.hs 24;" f heldAimZoom src/Dodge/Update/Camera.hs 149;" f @@ -3909,7 +3914,7 @@ 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 195;" f +isUnusedLnkType src/Dodge/PlacementSpot.hs 197;" f isUsedLnkUnplaced src/Dodge/PlacementSpot.hs 181;" f isValidCommand src/Dodge/Debug/Terminal.hs 134;" f isVowel src/StringHelp.hs 8;" f @@ -3978,8 +3983,8 @@ justify src/Justify.hs 9;" f k src/ShortShow.hs 44;" f k' src/ShortShow.hs 44;" f keyCard src/Dodge/Item/Held/Utility.hs 20;" f -keyCardAnalyserByDoor src/Dodge/Room/LasTurret.hs 77;" f -keyCardRoomRunPast src/Dodge/Room/LasTurret.hs 65;" 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 471;" f keyholeCorridor src/Dodge/Room/Corridor.hs 39;" f @@ -3991,12 +3996,12 @@ lamp src/Dodge/Creature/Lamp.hs 21;" f 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 138;" f +lasCenSensEdge src/Dodge/Room/LasTurret.hs 141;" f lasGunPic src/Dodge/Item/Draw/SPic.hs 424;" f lasPulseS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 526;" f -lasSensorTurretTest src/Dodge/Room/LasTurret.hs 131;" f -lasTunnel src/Dodge/Room/LasTurret.hs 150;" f -lasTunnelRunPast src/Dodge/Room/LasTurret.hs 191;" f +lasSensorTurretTest src/Dodge/Room/LasTurret.hs 134;" f +lasTunnel src/Dodge/Room/LasTurret.hs 153;" f +lasTunnelRunPast src/Dodge/Room/LasTurret.hs 194;" f lasTurret src/Dodge/Placement/Instance/Turret.hs 40;" f laser src/Dodge/Item/Held/BatteryGuns.hs 34;" f lastMap src/Dodge/DoubleTree.hs 253;" f @@ -4026,8 +4031,8 @@ leftWristPQ src/Dodge/Creature/HandPos.hs 81;" f legsSPic src/Dodge/Item/Draw/SPic.hs 480;" f liShape src/Dodge/Placement/Instance/LightSource.hs 98;" f light src/Color.hs 104;" f -lightSensByDoor src/Dodge/Room/LasTurret.hs 50;" f -lightSensInsideDoor src/Dodge/Room/LasTurret.hs 38;" f +lightSensByDoor src/Dodge/Room/LasTurret.hs 51;" f +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 @@ -4037,7 +4042,7 @@ lineCol src/Picture/Base.hs 230;" f lineGeom src/Dodge/Base.hs 32;" f lineOnScreenCone src/Dodge/Debug/Picture.hs 59;" f lineOrth src/Dodge/Creature/Boid.hs 126;" f -lineOutputTerminal src/Dodge/Room/Warning.hs 58;" f +lineOutputTerminal src/Dodge/Room/Warning.hs 66;" f lineSplit src/Justify.hs 26;" f lineThick src/Picture/Base.hs 234;" f lineUp src/Dodge/Creature/Boid.hs 148;" f @@ -4051,7 +4056,7 @@ listGuard src/Dodge/Creature/ReaderUpdate.hs 190;" f listSelectionColorPicture src/Dodge/DisplayInventory.hs 302;" f litCorridor90 src/Dodge/Room/RoadBlock.hs 26;" f lmt src/MatrixHelper.hs 43;" f -lnkBothAnd src/Dodge/Room/Procedural.hs 121;" f +lnkBothAnd src/Dodge/Room/Procedural.hs 123;" f lnkMidPosInvSelsCol src/Dodge/Render/HUD.hs 387;" f lnkPosDir src/Dodge/RoomLink.hs 97;" f loadDodgeConfig src/Dodge/Config/Load.hs 9;" f @@ -4246,7 +4251,7 @@ miniGunX src/Dodge/Item/Held/Cane.hs 33;" f miniGunXPict src/Dodge/Item/Draw/SPic.hs 384;" f miniGunXPictItem src/Dodge/Item/Draw/SPic.hs 381;" f miniS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 716;" f -miniTree2 src/Dodge/Room/Room.hs 108;" f +miniTree2 src/Dodge/Room/Room.hs 110;" f minimumOn src/FoldlHelp.hs 14;" f mirrorXAxis src/Geometry/Polygon.hs 49;" f mirrorxz src/Picture/Base.hs 335;" f @@ -4279,7 +4284,7 @@ moveProjectile src/Dodge/Projectile/Update.hs 260;" f moveRoomBy src/Dodge/Room/Link.hs 53;" f moveShockwave src/Dodge/Shockwave/Update.hs 13;" f moveStuckGrenade src/Dodge/Projectile/Update.hs 246;" f -moveToSideNthOutLink src/Dodge/Room/Warning.hs 61;" f +moveToSideNthOutLink src/Dodge/Room/Warning.hs 69;" f moveWall src/Dodge/Wall/Move.hs 29;" f moveWallID src/Dodge/Wall/Move.hs 24;" f moveWallIDToward src/Dodge/Wall/Move.hs 47;" f @@ -4441,7 +4446,7 @@ pincerP''' src/Dodge/Creature/Boid.hs 75;" f pingPongBetween src/Render.hs 221;" f pipe src/Dodge/Item/Craftable.hs 32;" f pistol src/Dodge/Item/Held/Stick.hs 40;" f -pistolerRoom src/Dodge/Room/Room.hs 323;" f +pistolerRoom src/Dodge/Room/Room.hs 325;" f pjRemoteSetDirection src/Dodge/Projectile/Update.hs 225;" f plBlock src/Dodge/Placement/PlaceSpot/Block.hs 18;" f plDoor src/Dodge/Placement/PlaceSpot/TriggerDoor.hs 22;" f @@ -4602,7 +4607,7 @@ 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 263;" f +psRandRanges src/Dodge/PlacementSpot.hs 267;" f psj src/Dodge/LevelGen/PlacementHelper.hs 70;" f psposAddLabel src/Dodge/PlacementSpot.hs 70;" f pt0 src/Dodge/LevelGen/PlacementHelper.hs 54;" f @@ -4644,8 +4649,8 @@ qID src/Quaternion.hs 62;" f qToAng src/Quaternion.hs 59;" f qToV2 src/Quaternion.hs 56;" f qToV3 src/Quaternion.hs 53;" f -quarterRoomSquare src/Dodge/Room/Procedural.hs 212;" f -quarterRoomTri src/Dodge/Room/Procedural.hs 176;" f +quarterRoomSquare src/Dodge/Room/Procedural.hs 214;" f +quarterRoomTri src/Dodge/Room/Procedural.hs 178;" f quitCommand src/Dodge/Terminal.hs 93;" f qz src/Quaternion.hs 71;" f rLauncher src/Dodge/Item/Held/Launcher.hs 14;" f @@ -4677,8 +4682,8 @@ randSparkExtraVel src/Dodge/Spark.hs 92;" f randWallReflect src/Dodge/Update.hs 626;" f randomChallenges src/Dodge/Room/Start.hs 63;" f randomCompass src/Dodge/Layout.hs 57;" f -randomFourCornerRoom src/Dodge/Room/Procedural.hs 265;" f -randomFourCornerRoomCrsIts src/Dodge/Room/Procedural.hs 277;" f +randomFourCornerRoom src/Dodge/Room/Procedural.hs 267;" f +randomFourCornerRoomCrsIts src/Dodge/Room/Procedural.hs 279;" f randomLightPositions src/Dodge/Room/Modify/Girder.hs 152;" f randomMediumRoom src/Dodge/Room/Boss.hs 75;" f randomPath src/TreeHelp.hs 145;" f @@ -4781,12 +4786,12 @@ rmInvItem src/Dodge/Inventory.hs 73;" f rmLinksOfType src/Dodge/RoomLink.hs 135;" f rmOutLinks src/Dodge/RoomLink.hs 138;" f roomC src/Dodge/Room/Room.hs 40;" f -roomCCrits src/Dodge/Room/Room.hs 264;" f -roomCenterPillar src/Dodge/Room/Room.hs 121;" f +roomCCrits src/Dodge/Room/Room.hs 266;" f +roomCenterPillar src/Dodge/Room/Room.hs 123;" f roomCritLS src/Dodge/Room/RunPast.hs 24;" f roomCross src/Dodge/Room/Boss.hs 84;" f roomGlassOctogon src/Dodge/Room/Boss.hs 21;" f -roomMiniIntro src/Dodge/Room/Room.hs 116;" f +roomMiniIntro src/Dodge/Room/Room.hs 118;" f roomNgon src/Dodge/Room/Ngon.hs 15;" f roomPadCut src/Dodge/Room/Room.hs 61;" f roomPillars src/Dodge/Room/Pillar.hs 106;" f @@ -4794,7 +4799,7 @@ roomPillarsContaining src/Dodge/Room/Containing.hs 39;" f roomPillarsPassage src/Dodge/Room/Pillar.hs 93;" f roomPillarsSquare src/Dodge/Room/Pillar.hs 49;" f roomRect src/Dodge/Room/Procedural.hs 38;" f -roomRectAutoLinks src/Dodge/Room/Procedural.hs 138;" f +roomRectAutoLinks src/Dodge/Room/Procedural.hs 140;" f roomShuriken src/Dodge/Room/Boss.hs 122;" f roomTwistCross src/Dodge/Room/Boss.hs 153;" f roomsContaining src/Dodge/Room/Containing.hs 20;" f @@ -4985,10 +4990,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 253;" f +shiftByV2 src/Dodge/PlacementSpot.hs 257;" f shiftChildren src/Dodge/Tree/Compose.hs 44;" f shiftDraw src/Dodge/Render/ShapePicture.hs 80;" f -shiftInBy src/Dodge/PlacementSpot.hs 250;" f +shiftInBy src/Dodge/PlacementSpot.hs 254;" 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 @@ -5016,10 +5021,10 @@ shootShatter src/Dodge/Item/Weapon/Shatter.hs 11;" f shootTeslaArc src/Dodge/HeldUse.hs 1211;" f shootTillEmpty src/Dodge/Creature/Volition.hs 19;" f shootTractorBeam src/Dodge/HeldUse.hs 794;" f -shootersRoom src/Dodge/Room/Room.hs 317;" f -shootersRoom' src/Dodge/Room/Room.hs 284;" f -shootersRoom1 src/Dodge/Room/Room.hs 307;" f -shootingRange src/Dodge/Room/Room.hs 334;" f +shootersRoom src/Dodge/Room/Room.hs 319;" f +shootersRoom' src/Dodge/Room/Room.hs 286;" f +shootersRoom1 src/Dodge/Room/Room.hs 309;" f +shootingRange src/Dodge/Room/Room.hs 336;" f shortPoint2 src/Dodge/ShortShow.hs 4;" f shortShow src/ShortShow.hs 7;" f shotgunS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 708;" f @@ -5058,8 +5063,8 @@ slap1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 670;" f slapS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 604;" f slideDoorS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 688;" f slideWindow src/ListHelp.hs 80;" f -slowDoorRoom src/Dodge/Room/LongDoor.hs 154;" f -slowDoorRoomRunPast src/Dodge/Room/LongDoor.hs 171;" f +slowDoorRoom src/Dodge/Room/LongDoor.hs 156;" f +slowDoorRoomRunPast src/Dodge/Room/LongDoor.hs 173;" f smallBattery src/Dodge/Item/Ammo.hs 60;" f smallBranch src/Dodge/Tree/GenerateStructure.hs 32;" f smallChaseCrit src/Dodge/Creature/ChaseCrit.hs 14;" f @@ -5091,7 +5096,7 @@ soundToOnomato src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 150;" f soundToVol src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 4;" f soundWithStatus src/Dodge/SoundLogic.hs 104;" f soundWithStatusVolume src/Dodge/SoundLogic.hs 54;" f -southPillarsRoom src/Dodge/Room/LongDoor.hs 86;" f +southPillarsRoom src/Dodge/Room/LongDoor.hs 87;" f spaceAction src/Dodge/Update/Input/InGame.hs 528;" f spanColLightBlackI src/Dodge/Placement/Instance/LightSource.hs 193;" f spanColLightI src/Dodge/Placement/Instance/LightSource.hs 186;" f @@ -5104,7 +5109,7 @@ sparkRandDir src/Dodge/Spark.hs 116;" f sparkToDamage src/Dodge/Spark.hs 39;" f spawnAt src/Dodge/SpawnAt.hs 14;" f spawnerCrit src/Dodge/Creature.hs 56;" f -spawnerRoom src/Dodge/Room/Room.hs 362;" f +spawnerRoom src/Dodge/Room/Room.hs 364;" f speedLegs src/Dodge/Item/Equipment.hs 90;" f splashMenu src/Dodge/Menu.hs 30;" f splashMenuOptions src/Dodge/Menu.hs 35;" f @@ -5387,8 +5392,8 @@ tutRezBox src/Dodge/Room/Tutorial.hs 210;" f tutRoomTree src/Dodge/Floor.hs 21;" f tutorialMessage1 src/Dodge/Room/Tutorial.hs 232;" f tweenAngles src/Geometry/Vector.hs 195;" f -twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 80;" f -twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 28;" f +twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 81;" f +twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 29;" f twists src/Dodge/Creature/Test.hs 99;" f twoFlat src/Dodge/Creature/Test.hs 96;" f twoFlatHRot src/Dodge/Item/HeldOffset.hs 81;" f @@ -5415,7 +5420,7 @@ 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 200;" f +unusedSpotNearInLink src/Dodge/PlacementSpot.hs 203;" f updateAimPos src/Dodge/Update.hs 302;" f updateAllNodes src/TreeHelp.hs 86;" f updateArc src/Dodge/Tesla.hs 44;" f @@ -5557,7 +5562,7 @@ 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 258;" f +useLnkRoomPos src/Dodge/PlacementSpot.hs 262;" f useLoadedAmmo src/Dodge/HeldUse.hs 716;" f useMagShield src/Dodge/Euse.hs 27;" f useNormalCamera src/Dodge/Camera.hs 6;" f @@ -5568,8 +5573,8 @@ useRoomPosRoomCond src/Dodge/PlacementSpot.hs 190;" 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 206;" f -usedRoomLinkPoss src/Dodge/PlacementSpot.hs 213;" f +usedRoomInLinkPoss src/Dodge/PlacementSpot.hs 209;" f +usedRoomLinkPoss src/Dodge/PlacementSpot.hs 216;" f v2z src/Geometry/Vector3D.hs 93;" f vCen3 src/Geometry/Vector3D.hs 115;" f vInverse src/Geometry/Vector.hs 153;" f @@ -5610,7 +5615,7 @@ wallToSurface src/Dodge/Base/Collide.hs 172;" f wallsFromRooms src/Dodge/Layout.hs 131;" f wallsToDraw src/Dodge/Render/Walls.hs 17;" f warmupSound src/Dodge/HeldUse.hs 1421;" f -warningRooms src/Dodge/Room/Warning.hs 26;" f +warningRooms src/Dodge/Room/Warning.hs 30;" f wasdAim src/Dodge/Creature/YourControl.hs 132;" f wasdDir src/Dodge/WASD.hs 17;" f wasdM src/Dodge/WASD.hs 9;" f @@ -5619,12 +5624,12 @@ wasdWithAiming src/Dodge/Creature/YourControl.hs 125;" f watchCombinations src/Dodge/Combine/Combinations.hs 16;" f watchUpdateStrat src/Dodge/Creature/ReaderUpdate.hs 179;" f weakenMatS src/Dodge/Material/Sound.hs 18;" f -weaponBehindPillar src/Dodge/Room/Room.hs 179;" f -weaponBetweenPillars src/Dodge/Room/Room.hs 195;" f -weaponEmptyRoom src/Dodge/Room/Room.hs 140;" f -weaponLongCorridor src/Dodge/Room/Room.hs 220;" f -weaponRoom src/Dodge/Room/Room.hs 253;" f -weaponUnderCrits src/Dodge/Room/Room.hs 158;" f +weaponBehindPillar src/Dodge/Room/Room.hs 181;" f +weaponBetweenPillars src/Dodge/Room/Room.hs 197;" f +weaponEmptyRoom src/Dodge/Room/Room.hs 142;" f +weaponLongCorridor src/Dodge/Room/Room.hs 222;" f +weaponRoom src/Dodge/Room/Room.hs 255;" f +weaponUnderCrits src/Dodge/Room/Room.hs 160;" f wedgeGeom src/Dodge/Base.hs 42;" f wedgeOfThickness src/Dodge/Picture.hs 9;" f whirS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 712;" f @@ -5702,7 +5707,7 @@ zConnectColMidX src/Dodge/Render/Connectors.hs 31;" f zeroZ src/Geometry/Vector.hs 8;" f zipArcs src/Dodge/Tesla.hs 52;" f zipCount src/Dodge/Tree/Shift.hs 129;" f -zipCountDown src/Dodge/Room/Procedural.hs 118;" f +zipCountDown src/Dodge/Room/Procedural.hs 120;" f zoneCloud src/Dodge/Zoning/Cloud.hs 27;" f zoneClouds src/Dodge/Update.hs 460;" f zoneCreature src/Dodge/Zoning/Creature.hs 54;" f