From 832bebb597f5b628a24daab8507dd6b658619271 Mon Sep 17 00:00:00 2001 From: justin Date: Tue, 24 Mar 2026 00:35:15 +0000 Subject: [PATCH] Improve doors --- src/Dodge/Data/Door.hs | 5 +- src/Dodge/Default/Door.hs | 4 +- src/Dodge/Door.hs | 42 +++++- src/Dodge/Placement/Instance/Door.hs | 54 ++----- src/Dodge/Room/Airlock.hs | 15 +- src/Dodge/Room/Door.hs | 4 +- src/Dodge/Room/LongDoor.hs | 7 +- src/Dodge/Room/Procedural.hs | 5 +- src/Dodge/TestString.hs | 2 +- tags | 217 ++++++++++++++------------- 10 files changed, 190 insertions(+), 165 deletions(-) diff --git a/src/Dodge/Data/Door.hs b/src/Dodge/Data/Door.hs index 3934844b2..62e25f3e3 100644 --- a/src/Dodge/Data/Door.hs +++ b/src/Dodge/Data/Door.hs @@ -40,7 +40,10 @@ data Door = Door , _drMounts :: [MountedObject] } -data DoorUpdate = DoorDoNothing | DoorLerp {_drLerpSpeed :: Float} +data DoorUpdate + = DoorDoNothing + | DoorLerp {_drLerpSpeed :: Float} + | DoorLerpWithTimer {_drLerpTimer :: Int, _drLerpSpeed :: Float} makeLenses ''Door diff --git a/src/Dodge/Default/Door.hs b/src/Dodge/Default/Door.hs index 775933ccf..007211723 100644 --- a/src/Dodge/Default/Door.hs +++ b/src/Dodge/Default/Door.hs @@ -1,4 +1,4 @@ -module Dodge.Default.Door ( defaultDoor) where +module Dodge.Default.Door (defaultDoor) where import Dodge.Data.Door @@ -7,7 +7,7 @@ defaultDoor = Door { _drID = 0 , _drTrigger = WdBlConst False - , _drUpdate = DoorLerp 1 + , _drUpdate = DoorLerp 2 , _drZeroPos = (0, 0) , _drOnePos = (0, 0) , _drLerp = 0 diff --git a/src/Dodge/Door.hs b/src/Dodge/Door.hs index 2acfcb6e6..e2df1e417 100644 --- a/src/Dodge/Door.hs +++ b/src/Dodge/Door.hs @@ -20,9 +20,10 @@ import Picture.Data import Shape.Data updateDoor :: Door -> World -> (S.Set Int2, World) -updateDoor dr w - | DoorLerp x <- dr ^. drUpdate = doorLerp x dr w - | otherwise = +updateDoor dr w = case dr ^. drUpdate of + DoorLerp x -> doorLerp x dr w + DoorLerpWithTimer n x -> doorLerpWithTimer n x dr w + DoorDoNothing -> ( mempty , foldl' (doDoorMount (doDoorLerp dr (dr ^. drLerp))) w (dr ^. drMounts) ) @@ -68,3 +69,38 @@ doorLerp speed dr w = fromMaybe (mempty, domounts (dr ^. drLerp) w) $ do soundContinue (WallSound drid) (fst $ doDoorLerp dr x) slideDoorS (Just 1) | otherwise = id +doorLerpWithTimer :: Int -> Float -> Door -> World -> (S.Set Int2, World) +doorLerpWithTimer n speed dr w = fromMaybe (mempty, domounts (dr ^. drLerp) w & uptimer) $ do + x <- newlerp + let ps = wlposs x + ps' = wlposs (dr ^. drLerp) + is = foldMap (S.fromList . uncurry (zoneOfSeg peZoneSize)) (ps <> ps') + -- it seems possible that this will miss some paths: we don't add zones for the + -- old footprint. Seems unlikely, but a possible cause of pathfinding bugs + return + ( is + , domounts x $ + f x + & playSound x + & cWorld . lWorld . doors . ix drid . drLerp .~ x + & uptimer + ) + where + domounts x w' = foldl' (doDoorMount (doDoorLerp dr x)) w' (dr ^. drMounts) + f = ifoldl' (flip . moveWallID) w . wlposs + wlposs x = (dr ^. drFootPrint) & each . each %~ shiftPointBy (doDoorLerp dr x) + clerp = dr ^. drLerp + newlerp + | toOpen && clerp < 1 = Just . min 1 $ clerp + speed + | clerp > 0 && not toOpen = Just . max 0 $ clerp - speed + | otherwise = Nothing + uptimer = cWorld . lWorld . doors . ix drid . drUpdate . drLerpTimer %~ updatetimer + updatetimer + | doWdBl (_drTrigger dr) w = const 20 + | otherwise = max 0 . subtract 1 + toOpen = doWdBl (_drTrigger dr) w || n > 0 + drid = _drID dr + playSound x + | _drPushedBy dr == PushesItself = + soundContinue (WallSound drid) (fst $ doDoorLerp dr x) slideDoorS (Just 1) + | otherwise = id diff --git a/src/Dodge/Placement/Instance/Door.hs b/src/Dodge/Placement/Instance/Door.hs index f07c1d7c5..2663cef4c 100644 --- a/src/Dodge/Placement/Instance/Door.hs +++ b/src/Dodge/Placement/Instance/Door.hs @@ -14,75 +14,53 @@ import Dodge.LevelGen.PlacementHelper import Geometry import Linear -putDoubleDoor :: Wall -> WdBl -> Point2 -> Point2 -> Float -> Placement -putDoubleDoor wl cond a b speed = - putDoubleDoorThen wl cond 1 a b speed (const $ const Nothing) +putDoubleDoor :: Wall -> Point2 -> Point2 -> Door -> Placement +putDoubleDoor wl a b dr = + putDoubleDoorThen wl 1 a b dr (const $ const Nothing) putDoubleDoorThen :: Wall -> - WdBl -> Float -> Point2 -> Point2 -> - Float -> + Door -> (Placement -> Placement -> Maybe Placement) -> Placement -putDoubleDoorThen wl cond soff a b speed cont = - doorBetween wl cond soff a half speed $ - \pl1 -> Just $ - doorBetween wl cond soff b half speed $ - \pl2 -> cont pl1 pl2 +putDoubleDoorThen wl soff a b dr cont = + doorBetween wl soff a half dr $ + \pl1 -> Just $ doorBetween wl soff b half dr $ \pl2 -> cont pl1 pl2 where half = 0.5 *^ (a + b) doorBetween :: Wall -> - WdBl -> Float -> Point2 -> Point2 -> - Float -> + Door -> (Placement -> Maybe Placement) -> Placement -doorBetween wl cond soff pa pb speed g = case divideLine 40 pa pb of --- [x, y] -> ptCont (putSlideDr adoor wl soff x y) g +doorBetween wl soff pa pb dr g = case divideLine 40 pa pb of (x : y : zs) -> - divideDoorPane - Nothing - wl - cond - (soff - dist y pb) - speed - (zip (x : y : zs) (y : zs)) - g + divideDoorPane Nothing wl (soff - dist y pb) dr (zip (x : y : zs) (y : zs)) g _ -> error "tried to create doorBetween with too few points" --- where --- adoor = --- defaultDoor --- & drTrigger .~ cond --- & drUpdate .~ DoorLerp speed divideDoorPane :: Maybe Int -> Wall -> - WdBl -> - Float -> Float -> + Door -> [(Point2, Point2)] -> (Placement -> Maybe Placement) -> Placement -divideDoorPane mid wl cond soff speed ppairs g = case ppairs of +divideDoorPane mid wl soff dr ppairs g = case ppairs of [p] -> ptCont (adoor p) g (p : ps) -> ptCont (adoor p) $ - \pl -> Just $ divideDoorPane (_plMID pl) wl cond soff speed ps g + \pl -> Just $ divideDoorPane (_plMID pl) wl soff dr ps g _ -> undefined where adoor (x, y) = putSlideDr thedoor wl soff x y - thedoor = - defaultDoor - & drUpdate . drLerpSpeed .~ speed - & drTrigger .~ cond - & drPushedBy .~ maybe PushesItself PushedBy mid + thedoor = dr & drPushedBy .~ maybe PushesItself PushedBy mid putAutoDoor :: Point2 -> Point2 -> Placement putAutoDoor a b = Placement (PS 0 0) (PutCoord a) Nothing Nothing $ \_ apl -> @@ -93,7 +71,7 @@ putAutoDoor a b = Placement (PS 0 0) (PutCoord a) Nothing Nothing $ \_ apl -> in Just $ putDoubleDoor defaultAutoWall - (WdBlCrFilterNearPoint 40 (0.5 *^ (x + y)) CrOpenAutoDoor) a b - 3 + (defaultDoor & drTrigger .~(WdBlCrFilterNearPoint 40 (0.5 *^ (x + y)) CrOpenAutoDoor) + & drUpdate .~ DoorLerpWithTimer 0 3) diff --git a/src/Dodge/Room/Airlock.hs b/src/Dodge/Room/Airlock.hs index df7cd9a5d..1171b54f4 100644 --- a/src/Dodge/Room/Airlock.hs +++ b/src/Dodge/Room/Airlock.hs @@ -44,8 +44,8 @@ decontamRoom i = & rmPmnts .~ [ pContID (PS (V2 (-35) 50) (negate $ pi / 2)) xSwitch $ \btid -> Just $ - putDoubleDoorThen defaultDoorWall (WdBlNegate $ WdBlBtOn btid) 1 (V2 0 20) (V2 40 20) 2 $ - \_ _ -> Just $ putDoubleDoor defaultDoorWall (WdBlBtOn btid) (V2 0 80) (V2 40 80) 2 + putDoubleDoorThen defaultDoorWall 1 (V2 0 20) (V2 40 20) (dr1 btid) $ + \_ _ -> Just $ putDoubleDoor defaultDoorWall (V2 0 80) (V2 40 80) (dr2 btid) , invisibleWall $ rectNSWE 60 40 (-40) (-30) , spanLightI (V2 (-20) 30) (V2 (-20) 70) , analyser (NoItemZone ps) (PS 50 0) (PS mcpos 0) & plExternalID ?~ i @@ -55,15 +55,16 @@ decontamRoom i = & rmInPmnt .~ [(0, return . f)] & rmBound .~ [rectNSWE 75 15 0 40, switchcut] where + dr1 btid = defaultDoor & drTrigger .~ (WdBlNegate $ WdBlBtOn btid) + dr2 btid = defaultDoor & drTrigger .~ (WdBlBtOn btid) f gw = fromMaybe (error "tried to put a door using an empty placement list") $ do pmnt <- gw ^? genPmnt . ix i return $ putDoubleDoor defaultDoorWall - (cond pmnt) (V2 (-10) 35) (V2 (-10) 65) - 2 + (defaultDoor & drTrigger .~ cond pmnt) cond pmnt = WdTrig $ pmnt ^?! plMID . _Just mcpos = V2 70 50 cutps = [rectNSWE 100 0 0 40, switchcut] @@ -84,8 +85,8 @@ airlock0 = , _rmPmnts = [ pContID (PS (V2 (-35) 50) (negate $ pi / 2)) xSwitch $ \btid -> Just $ - putDoubleDoorThen defaultDoorWall (WdBlNegate $ WdBlBtOn btid) 1 (V2 0 20) (V2 40 20) 2 $ - \_ _ -> Just $ putDoubleDoor defaultDoorWall (WdBlBtOn btid) (V2 0 80) (V2 40 80) 2 + putDoubleDoorThen defaultDoorWall 1 (V2 0 20) (V2 40 20) (dr1 btid) $ + \_ _ -> Just $ putDoubleDoor defaultDoorWall (V2 0 80) (V2 40 80) (dr2 btid) , invisibleWall $ rectNSWE 60 40 (-40) (-30) , spanLightI (V2 (-2) 30) (V2 (-2) 70) , sps0 $ putShape $ thinHighBar 75 (V2 40 50) (V2 (-1) 50) @@ -93,6 +94,8 @@ airlock0 = , _rmBound = [rectNSWE 75 15 0 40, switchcut] } where + dr1 btid = defaultDoor & drTrigger .~ (WdBlNegate $ WdBlBtOn btid) + dr2 btid = defaultDoor & drTrigger .~ (WdBlBtOn btid) switchcut = rectNSWE 65 35 (-40) 20 lnks = [ (V2 20 95, 0) diff --git a/src/Dodge/Room/Door.hs b/src/Dodge/Room/Door.hs index b68f5a51f..8e9ddf115 100644 --- a/src/Dodge/Room/Door.hs +++ b/src/Dodge/Room/Door.hs @@ -1,6 +1,7 @@ {- Rooms that connect other rooms, blocking sight. -} module Dodge.Room.Door where +import Dodge.Default.Door import Dodge.Default.Wall import Data.Maybe import Dodge.Data.GenWorld @@ -42,5 +43,6 @@ triggerDoorRoom i = where 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 + return $ putDoubleDoor defaultDoorWall (V2 0 20) (V2 40 20) + (defaultDoor & drTrigger .~ (cond pmnt)) cond pmnt = WdTrig $ fromJust (_plMID pmnt) diff --git a/src/Dodge/Room/LongDoor.hs b/src/Dodge/Room/LongDoor.hs index 25d077d48..8fa4e4543 100644 --- a/src/Dodge/Room/LongDoor.hs +++ b/src/Dodge/Room/LongDoor.hs @@ -64,7 +64,6 @@ twinSlowDoorRoom w h x = where --thewall = switchWallCol red thewall = defaultDoorWall - wlSpeed = 0.5 lampheight = 41 ps = [ rectNSWE h 0 (- w) w @@ -72,7 +71,7 @@ twinSlowDoorRoom w h x = ] thedoor btid = defaultDoor - & drUpdate . drLerpSpeed .~ wlSpeed + & drUpdate . drLerpSpeed .~ 0.5 & drTrigger .~ WdBlBtOn btid col = dim $ dim $ bright red @@ -116,11 +115,11 @@ addButtonSlowDoor x h = $ \btplmnt -> Just . putDoubleDoorThen defaultDoorWall - (WdBlBtOn $ fromJust $ _plMID btplmnt) 30 (V2 0 h) (V2 x h) - 0.5 + (defaultDoor & drTrigger .~ (WdBlBtOn $ fromJust $ _plMID btplmnt) + & drUpdate . drLerpSpeed .~ 0.5) $ \dr1 dr2 -> Just . sps0 diff --git a/src/Dodge/Room/Procedural.hs b/src/Dodge/Room/Procedural.hs index 052720472..60c49ea57 100644 --- a/src/Dodge/Room/Procedural.hs +++ b/src/Dodge/Room/Procedural.hs @@ -310,7 +310,4 @@ centerVaultRoom w h d = sPS (V2 0 (d -10)) 0 (putSlideDr (thedoor btid) thewall 1 (V2 21 0) (V2 0 0)) ] thewall = defaultDoorWall - thedoor btid = - defaultDoor - & drTrigger .~ WdBlBtOn btid - & drUpdate . drLerpSpeed .~ 2 + thedoor btid = defaultDoor & drTrigger .~ WdBlBtOn btid diff --git a/src/Dodge/TestString.hs b/src/Dodge/TestString.hs index ef59a2277..d4bb933fd 100644 --- a/src/Dodge/TestString.hs +++ b/src/Dodge/TestString.hs @@ -33,7 +33,7 @@ import Data.Monoid import RandomHelp testStringInit :: Universe -> [String] -testStringInit u = [evalState (takeOne ["a","b"]) (_randGen $ _uvWorld u)] +testStringInit u = fmap show $ u ^.. uvWorld . cWorld . lWorld . doors . each . drUpdate . drLerpTimer -- (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) diff --git a/tags b/tags index ac71a3a7e..84fbd5f95 100644 --- a/tags +++ b/tags @@ -205,8 +205,8 @@ ChaseCrit src/Dodge/Data/Creature/Misc.hs 68;" C ChaseCritters src/Dodge/Data/Creature/State.hs 16;" C ChasmObstacle src/Dodge/Data/PathGraph.hs 51;" C ChemFuel src/Dodge/Data/Item/Use/Consumption/Ammo.hs 14;" C -ChooseMovementLtAuto src/Dodge/Data/CreatureEffect.hs 29;" C -ChooseMovementSpreadGun src/Dodge/Data/CreatureEffect.hs 28;" C +ChooseMovementLtAuto src/Dodge/Data/CreatureEffect.hs 30;" C +ChooseMovementSpreadGun src/Dodge/Data/CreatureEffect.hs 29;" C Circ_collision_test src/Dodge/Data/Config.hs 99;" C Climate src/Dodge/Data/Scenario.hs 32;" C CloseToMelee src/Dodge/Data/ActionPlan.hs 139;" C @@ -240,7 +240,7 @@ CookDeath src/Dodge/Data/Creature.hs 68;" C CookingDamage src/Dodge/Data/Damage/Type.hs 5;" C Corporation src/Dodge/Data/Scenario.hs 46;" C Cosmic src/Dodge/Data/Scenario.hs 74;" C -CrAc src/Dodge/Data/CreatureEffect.hs 23;" t +CrAc src/Dodge/Data/CreatureEffect.hs 24;" t CrArcNode src/Dodge/Data/LWorld.hs 164;" C CrBl src/Dodge/Data/CreatureEffect.hs 20;" t CrCanShoot src/Dodge/Data/CreatureEffect.hs 20;" C @@ -262,10 +262,11 @@ CrIsPitted src/Dodge/Data/Creature.hs 66;" C CrMouth src/Dodge/Data/SoundOrigin.hs 16;" C CrMvType src/Dodge/Data/Creature/Misc.hs 26;" t CrMvType src/Dodge/Data/Creature/Misc.hs 29;" C +CrOpenAutoDoor src/Dodge/Data/CreatureEffect.hs 21;" C CrSound src/Dodge/Data/SoundOrigin.hs 15;" C -CrTurnAround src/Dodge/Data/CreatureEffect.hs 23;" C -CrWdAc src/Dodge/Data/CreatureEffect.hs 26;" t -CrWdBFSThenReturn src/Dodge/Data/CreatureEffect.hs 27;" C +CrTurnAround src/Dodge/Data/CreatureEffect.hs 24;" C +CrWdAc src/Dodge/Data/CreatureEffect.hs 27;" t +CrWdBFSThenReturn src/Dodge/Data/CreatureEffect.hs 28;" C CrWeaponFailSound src/Dodge/Data/SoundOrigin.hs 20;" C CrWeaponSound src/Dodge/Data/SoundOrigin.hs 18;" C CrWlID src/Dodge/Data/CrWlID.hs 10;" t @@ -342,8 +343,9 @@ DoReplicate src/Dodge/Data/ActionPlan.hs 106;" C DoReplicatePartial src/Dodge/Data/ActionPlan.hs 110;" C DockingBaySS src/Dodge/Data/Scenario.hs 92;" C Door src/Dodge/Data/Door.hs 29;" t -DoorDoNothing src/Dodge/Data/Door.hs 43;" C -DoorLerp src/Dodge/Data/Door.hs 43;" C +DoorDoNothing src/Dodge/Data/Door.hs 44;" C +DoorLerp src/Dodge/Data/Door.hs 45;" C +DoorLerpWithTimer src/Dodge/Data/Door.hs 46;" C DoorPart src/Dodge/Data/Wall/Structure.hs 12;" C DoorUpdate src/Dodge/Data/Door.hs 43;" t DoubleRes src/Dodge/Data/Config.hs 113;" C @@ -1763,7 +1765,8 @@ _drFootPrint src/Dodge/Data/Door.hs 36;" f _drHP src/Dodge/Data/Door.hs 37;" f _drID src/Dodge/Data/Door.hs 30;" f _drLerp src/Dodge/Data/Door.hs 35;" f -_drLerpSpeed src/Dodge/Data/Door.hs 43;" f +_drLerpSpeed src/Dodge/Data/Door.hs 45;" f +_drLerpTimer src/Dodge/Data/Door.hs 46;" f _drMounts src/Dodge/Data/Door.hs 40;" f _drOnePos src/Dodge/Data/Door.hs 34;" f _drPushedBy src/Dodge/Data/Door.hs 38;" f @@ -2560,13 +2563,13 @@ aimDelaySweep src/Dodge/Render/Picture.hs 285;" f aimStanceInfo src/Dodge/Item/Info.hs 242;" f aimTurn src/Dodge/Creature/YourControl.hs 181;" f airlock src/Dodge/Room/Airlock.hs 28;" f -airlock0 src/Dodge/Room/Airlock.hs 78;" f -airlock90 src/Dodge/Room/Airlock.hs 199;" f -airlockCrystal src/Dodge/Room/Airlock.hs 249;" f -airlockDoubleDoor src/Dodge/Room/Airlock.hs 102;" f -airlockSimple src/Dodge/Room/Airlock.hs 127;" f -airlockZ src/Dodge/Room/Airlock.hs 164;" f -allVisibleWalls src/Dodge/Base/Collide.hs 224;" f +airlock0 src/Dodge/Room/Airlock.hs 79;" f +airlock90 src/Dodge/Room/Airlock.hs 200;" f +airlockCrystal src/Dodge/Room/Airlock.hs 250;" f +airlockDoubleDoor src/Dodge/Room/Airlock.hs 103;" f +airlockSimple src/Dodge/Room/Airlock.hs 128;" f +airlockZ src/Dodge/Room/Airlock.hs 165;" f +allVisibleWalls src/Dodge/Base/Collide.hs 225;" f alongSegBy src/Geometry.hs 40;" f alteRifle src/Dodge/Item/Held/Cane.hs 22;" f alteRifleAmmoOrient src/Dodge/Item/Orientation.hs 51;" f @@ -2582,7 +2585,7 @@ angleBetween src/Geometry.hs 158;" f angleVV src/Geometry/Vector.hs 58;" f angleVV3 src/Geometry/Vector3D.hs 122;" f anyUnusedSpot src/Dodge/PlacementSpot.hs 68;" f -anythingHitCirc src/Dodge/Base/Collide.hs 342;" f +anythingHitCirc src/Dodge/Base/Collide.hs 343;" f applyCME src/Dodge/HeldUse.hs 387;" f applyClip src/Dodge/Debug.hs 138;" f applyCreatureDamage src/Dodge/Creature/Damage.hs 14;" f @@ -2759,13 +2762,13 @@ bulletWeapons src/Dodge/Combine/Combinations.hs 247;" f burstRifle src/Dodge/Item/Held/Cane.hs 30;" f buttonFlip src/Dodge/Button/Event.hs 17;" f buzzS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 593;" f -cChasm src/Dodge/Room/Tutorial.hs 131;" f +cChasm src/Dodge/Room/Tutorial.hs 132;" f cFilledRect src/Dodge/CharacterEnums.hs 6;" f cWireRect src/Dodge/CharacterEnums.hs 10;" f calcSmoothScroll src/Dodge/SmoothScroll.hs 11;" f calcTexCoord src/Tile.hs 19;" f -canSee src/Dodge/Base/Collide.hs 328;" f -canSeeIndirect src/Dodge/Base/Collide.hs 335;" f +canSee src/Dodge/Base/Collide.hs 329;" f +canSeeIndirect src/Dodge/Base/Collide.hs 336;" f cancelExamineInventory src/Dodge/Item/BackgroundEffect.hs 23;" f capacitor src/Dodge/Item/Ammo.hs 67;" f card8Vec src/Dodge/Base/CardinalPoint.hs 17;" f @@ -2779,8 +2782,8 @@ 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 270;" f -centroid src/Geometry/Polygon.hs 177;" f -centroidNum src/Geometry/Polygon.hs 180;" f +centroid src/Geometry/Polygon.hs 192;" f +centroidNum src/Geometry/Polygon.hs 195;" f chainPairs src/Geometry.hs 360;" f changeSwapOther src/Dodge/Inventory.hs 141;" f changeSwapSel src/Dodge/Inventory.hs 134;" f @@ -2794,12 +2797,12 @@ chaseCritInternal src/Dodge/Humanoid.hs 8;" f chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 121;" f chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 32;" f chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 36;" f -chasmRotate src/Dodge/Creature/Update.hs 173;" f -chasmSimpleMaze src/Dodge/Room/Tutorial.hs 338;" f -chasmSpitTerminal src/Dodge/Room/Tutorial.hs 288;" f -chasmTestCorpse src/Dodge/Creature/Update.hs 155;" f +chasmRotate src/Dodge/Creature/Update.hs 175;" f +chasmSimpleMaze src/Dodge/Room/Tutorial.hs 356;" f +chasmSpitTerminal src/Dodge/Room/Tutorial.hs 297;" f +chasmTestCorpse src/Dodge/Creature/Update.hs 156;" f chasmTestLiving src/Dodge/Creature/Update.hs 137;" f -chasmWallToSurface src/Dodge/Base/Collide.hs 118;" f +chasmWallToSurface src/Dodge/Base/Collide.hs 119;" f checkCombineSelectionExists src/Dodge/DisplayInventory.hs 100;" f checkConnection src/Dodge/Inventory/Swap.hs 66;" f checkDeath src/Dodge/Creature/Update.hs 78;" f @@ -2820,14 +2823,14 @@ chooseCursorBorders src/Dodge/Render/List.hs 141;" f chooseEquipPosition src/Dodge/Inventory/RBList.hs 41;" f chooseFootSound src/Dodge/Creature/State/WalkCycle.hs 35;" f chooseFreeSite src/Dodge/Inventory/RBList.hs 47;" f -chooseMovementLtAuto src/Dodge/CreatureEffect.hs 77;" f -chooseMovementSpreadGun src/Dodge/CreatureEffect.hs 60;" f -circHitWall src/Dodge/Base/Collide.hs 241;" f +chooseMovementLtAuto src/Dodge/CreatureEffect.hs 78;" f +chooseMovementSpreadGun src/Dodge/CreatureEffect.hs 61;" f +circHitWall src/Dodge/Base/Collide.hs 242;" f circInPolygon src/Geometry/Polygon.hs 110;" f -circOnAnyCr src/Dodge/Base/Collide.hs 292;" f +circOnAnyCr src/Dodge/Base/Collide.hs 293;" f circOnSeg src/Geometry.hs 101;" f circOnSegNoEndpoints src/Geometry.hs 91;" f -circOnSomeWall src/Dodge/Base/Collide.hs 286;" f +circOnSomeWall src/Dodge/Base/Collide.hs 287;" f circle src/Picture/Base.hs 172;" f circleDecoration src/Dodge/Placement/TopDecoration.hs 62;" f circleSolid src/Picture/Base.hs 156;" f @@ -2867,18 +2870,18 @@ colCrWall src/Dodge/WallCreatureCollisions.hs 29;" f colCrsWalls src/Dodge/WallCreatureCollisions.hs 19;" f collectDamageTypes src/Dodge/Damage.hs 53;" f collectInvItems src/Dodge/Update/Input/InGame.hs 300;" f -collide3 src/Dodge/Base/Collide.hs 127;" f -collide3Chasm src/Dodge/Base/Collide.hs 111;" f +collide3 src/Dodge/Base/Collide.hs 128;" f +collide3Chasm src/Dodge/Base/Collide.hs 112;" f collide3Chasms src/Dodge/Base/Collide.hs 104;" f -collide3Creature src/Dodge/Base/Collide.hs 160;" f -collide3Floors src/Dodge/Base/Collide.hs 141;" f -collide3Wall src/Dodge/Base/Collide.hs 155;" f -collide3Walls src/Dodge/Base/Collide.hs 136;" f +collide3Creature src/Dodge/Base/Collide.hs 161;" f +collide3Floors src/Dodge/Base/Collide.hs 142;" f +collide3Wall src/Dodge/Base/Collide.hs 156;" f +collide3Walls src/Dodge/Base/Collide.hs 137;" f collide3WallsFloor src/Dodge/Base/Collide.hs 98;" f -collideCircWalls src/Dodge/Base/Collide.hs 253;" f +collideCircWalls src/Dodge/Base/Collide.hs 254;" f collidePoint src/Dodge/Base/Collide.hs 52;" f -collidePointTestFilter src/Dodge/Base/Collide.hs 188;" f -collidePointWallsFilter src/Dodge/Base/Collide.hs 202;" f +collidePointTestFilter src/Dodge/Base/Collide.hs 189;" f +collidePointWallsFilter src/Dodge/Base/Collide.hs 203;" f color src/Picture/Base.hs 100;" f colorLamp src/Dodge/Creature/Lamp.hs 10;" f colorSH src/Shape.hs 234;" f @@ -2913,7 +2916,7 @@ constructEdgesList src/Polyhedra.hs 40;" f contToIDCont src/Dodge/LevelGen/PlacementHelper.hs 58;" f continueTerminal src/Dodge/Update/Input/InGame.hs 407;" f convexHull src/Geometry/Polygon.hs 150;" f -convexHullSafe src/Geometry/Polygon.hs 157;" f +convexHullSafe src/Geometry/Polygon.hs 172;" f convexPolysOverlap src/Geometry/ConvexPoly.hs 48;" f convexPolysOverlapWitness src/Geometry/ConvexPoly.hs 55;" f coolMachinePistol src/Dodge/Creature/State.hs 102;" f @@ -2929,26 +2932,26 @@ 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 -crAwayFromPost src/Dodge/Creature/Test.hs 85;" f +crAwayFromPost src/Dodge/Creature/Test.hs 86;" f crBlips src/Dodge/RadarSweep.hs 88;" f crCamouflage src/Dodge/Creature/Picture.hs 33;" f -crCanSeeCr src/Dodge/Creature/Test.hs 52;" f +crCanSeeCr src/Dodge/Creature/Test.hs 53;" f crCrSpring src/Dodge/Update.hs 942;" f crCurrentEquipment src/Dodge/Creature/Statistics.hs 62;" f crDeathSounds src/Dodge/Creature/Vocalization.hs 45;" f crDexterity src/Dodge/Creature/Statistics.hs 19;" f crDisplayAwareness src/Dodge/Creature/Picture/Awareness.hs 39;" f crDisplayVigilance src/Dodge/Creature/Picture/Awareness.hs 53;" f -crHasTarget src/Dodge/Creature/Test.hs 65;" f -crHasTargetLOS src/Dodge/Creature/Test.hs 68;" f -crHeight src/Dodge/Base/Collide.hs 173;" f +crHasTarget src/Dodge/Creature/Test.hs 66;" f +crHasTargetLOS src/Dodge/Creature/Test.hs 69;" f +crHeight src/Dodge/Base/Collide.hs 174;" f crHit src/Dodge/WorldEvent/ThingsHit.hs 121;" f crIXsNearCirc src/Dodge/Zoning/Creature.hs 33;" f crIXsNearPoint src/Dodge/Zoning/Creature.hs 15;" f -crInAimStance src/Dodge/Creature/Test.hs 93;" f +crInAimStance src/Dodge/Creature/Test.hs 94;" f crIntelligence src/Dodge/Creature/Statistics.hs 39;" f -crIsAiming src/Dodge/Creature/Test.hs 60;" f -crIsArmouredFrom src/Dodge/Creature/Test.hs 108;" f +crIsAiming src/Dodge/Creature/Test.hs 61;" f +crIsArmouredFrom src/Dodge/Creature/Test.hs 109;" f crMass src/Dodge/Creature/Mass.hs 5;" f crMaterial src/Dodge/Creature/Material.hs 8;" f crMaxHP src/Dodge/Creature/MaxHP.hs 6;" f @@ -2958,15 +2961,15 @@ crMvBy src/Dodge/Creature/Impulse/Movement.hs 22;" f crMvByNoStride src/Dodge/Creature/Impulse/Movement.hs 30;" f crMvForward src/Dodge/Creature/Impulse/Movement.hs 57;" f crMvType src/Dodge/Creature/MoveType.hs 6;" f -crNearPoint src/Dodge/Creature/Test.hs 131;" f +crNearPoint src/Dodge/Creature/Test.hs 132;" f crNumFreeSlots src/Dodge/Inventory/CheckSlots.hs 25;" f crOnWall src/Dodge/WallCreatureCollisions.hs 89;" f crRad src/Dodge/Creature/Radius.hs 7;" f -crSafeDistFromTarg src/Dodge/Creature/Test.hs 74;" f +crSafeDistFromTarg src/Dodge/Creature/Test.hs 75;" f crSetRoots src/Dodge/Inventory/Location.hs 55;" f crShape src/Dodge/Creature/Shape.hs 8;" f crSpring src/Dodge/Update.hs 937;" f -crStratConMatches src/Dodge/Creature/Test.hs 80;" f +crStratConMatches src/Dodge/Creature/Test.hs 81;" f crStrength src/Dodge/Creature/Statistics.hs 29;" f crUpdate src/Dodge/Creature/Update.hs 71;" f crUpdateInvidLocations src/Dodge/Inventory/Location.hs 66;" f @@ -3197,7 +3200,7 @@ distributeAmmoToYou src/Dodge/WorldEffect.hs 139;" f distributerRoom src/Dodge/Room/Room.hs 428;" f divTo src/Geometry/Zone.hs 8;" f divideCircle src/Geometry.hs 321;" f -divideDoorPane src/Dodge/Placement/Instance/Door.hs 65;" f +divideDoorPane src/Dodge/Placement/Instance/Door.hs 48;" f divideLine src/Geometry.hs 248;" f divideLineExact src/Geometry.hs 276;" f divideLineOddNumPoints src/Geometry.hs 261;" f @@ -3211,11 +3214,11 @@ doBounce src/Dodge/Base/Collide.hs 67;" f doButtonEvent src/Dodge/Button/Event.hs 9;" f doConLoop src/Loop.hs 138;" f doConLoop' src/Loop.hs 230;" f -doCrAc src/Dodge/CreatureEffect.hs 38;" f +doCrAc src/Dodge/CreatureEffect.hs 39;" f doCrBl src/Dodge/CreatureEffect.hs 30;" f doCrGroupUpdate src/Dodge/CrGroupUpdate.hs 5;" f doCrImp src/Dodge/CreatureEffect.hs 13;" f -doCrWdAc src/Dodge/CreatureEffect.hs 47;" f +doCrWdAc src/Dodge/CreatureEffect.hs 48;" f doDamage src/Dodge/Creature/State.hs 43;" f doDeathToggle src/Dodge/WorldEffect.hs 100;" f doDeathTriggers src/Dodge/WorldEffect.hs 93;" f @@ -3230,7 +3233,7 @@ doDebugTestF6 src/Dodge/Update/Input/DebugTest.hs 41;" f doDebugTestF7 src/Dodge/Update/Input/DebugTest.hs 51;" f doDebugTestF8 src/Dodge/Update/Input/DebugTest.hs 59;" f doDoorLerp src/Dodge/Door/DoorLerp.hs 8;" f -doDoorMount src/Dodge/Door.hs 30;" f +doDoorMount src/Dodge/Door.hs 31;" f doDrag src/Dodge/Update/Input/InGame.hs 128;" f doDrawing src/Dodge/Render.hs 33;" f doDrawing' src/Dodge/Render.hs 44;" f @@ -3270,10 +3273,11 @@ doWdP2f src/Dodge/WdP2f.hs 10;" f doWdWd src/Dodge/WorldEffect.hs 34;" f doWorldEvents src/Dodge/Update.hs 463;" f doWorldPos src/Dodge/WorldPos.hs 10;" f -door src/Dodge/Room/Door.hs 13;" f -doorBetween src/Dodge/Placement/Instance/Door.hs 38;" f +door src/Dodge/Room/Door.hs 14;" f +doorBetween src/Dodge/Placement/Instance/Door.hs 35;" f doorCor src/Dodge/Room/Room.hs 400;" f -doorLerp src/Dodge/Door.hs 40;" f +doorLerp src/Dodge/Door.hs 41;" f +doorLerpWithTimer src/Dodge/Door.hs 72;" f dotV src/Geometry/Vector.hs 76;" f dotV3 src/Geometry/Vector3D.hs 119;" f doubleCorridorBarrels src/Dodge/Room/Room.hs 291;" f @@ -3533,7 +3537,7 @@ flatItemCombinations src/Dodge/Combine/Combinations.hs 51;" f flatLookupItems src/Dodge/Combine.hs 39;" f flatShield src/Dodge/Item/Held/Utility.hs 17;" f flatShieldEquipSPic src/Dodge/Item/Draw/SPic.hs 419;" f -fleeFrom src/Dodge/CreatureEffect.hs 92;" f +fleeFrom src/Dodge/CreatureEffect.hs 93;" f flickerMod src/Dodge/Placement/Instance/LightSource/Flicker.hs 10;" f flickerUpdate src/Dodge/Placement/Instance/LightSource/Flicker.hs 24;" f floatSize src/Shader/Parameters.hs 17;" f @@ -3547,7 +3551,7 @@ floorTo src/Geometry/Zone.hs 12;" f floorWire src/Dodge/Wire.hs 13;" f foamSprayFadeOutS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 777;" f foamSprayLoopS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 823;" f -foldMTRS src/Dodge/Room/Tutorial.hs 85;" f +foldMTRS src/Dodge/Room/Tutorial.hs 86;" f foldPairs src/ListHelp.hs 37;" f foldrWhileArb src/ListHelp.hs 111;" f followImpulse src/Dodge/Creature/Impulse.hs 25;" f @@ -3609,8 +3613,8 @@ getCloseObj src/Dodge/Update/Input/InGame.hs 539;" f getCommand src/Dodge/Terminal.hs 61;" f getCommands src/Dodge/Terminal.hs 58;" f getCrMoveSpeed src/Dodge/Creature/Statistics.hs 50;" f -getCrsFromRooms src/Dodge/Room/Tutorial.hs 485;" f -getCrsFromRooms' src/Dodge/Room/Tutorial.hs 472;" f +getCrsFromRooms src/Dodge/Room/Tutorial.hs 503;" f +getCrsFromRooms' src/Dodge/Room/Tutorial.hs 490;" f getDebugMouseOver src/Dodge/Update.hs 424;" f getDistortions src/Dodge/Render.hs 443;" f getEdgesCrossing src/Dodge/Path.hs 37;" f @@ -3628,7 +3632,7 @@ 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/Modify.hs 31;" f -getRoomsFromInts src/Dodge/Room/Tutorial.hs 468;" f +getRoomsFromInts src/Dodge/Room/Tutorial.hs 486;" f getRootItemBounds src/Dodge/Render/HUD.hs 106;" f getRootItemInvID src/Dodge/Inventory/Location.hs 35;" f getSelectedCloseObj src/Dodge/SelectedClose.hs 14;" f @@ -3658,8 +3662,8 @@ glauncherPic src/Dodge/Item/Draw/SPic.hs 401;" f gluintSize src/Shader/Parameters.hs 25;" f goToPostStrat src/Dodge/Creature/Strategy.hs 10;" f goToTarget src/Dodge/Creature/ReaderUpdate.hs 150;" f -grahamEliminate src/Geometry/Polygon.hs 171;" f -grahamScan src/Geometry/Polygon.hs 162;" f +grahamEliminate src/Geometry/Polygon.hs 186;" f +grahamScan src/Geometry/Polygon.hs 177;" f grapeCannon src/Dodge/Item/Held/Cone.hs 17;" f graphToEdges src/Dodge/Graph.hs 35;" f graphToIncidence src/Dodge/Graph.hs 40;" f @@ -3702,10 +3706,11 @@ handleResizeEvent src/Dodge/Event.hs 53;" f handleTextInput src/Dodge/Event/Input.hs 19;" f handleWindowMoveEvent src/Dodge/Event.hs 44;" f hardQuit src/Dodge/Concurrent.hs 32;" f -hasButtonLOS src/Dodge/Base/Collide.hs 311;" f +hasAutoDoorBody src/Dodge/Creature/Test.hs 141;" f +hasButtonLOS src/Dodge/Base/Collide.hs 312;" f hasCaneGunDim src/Dodge/Item/InvSize.hs 48;" f -hasLOS src/Dodge/Base/Collide.hs 304;" f -hasLOSIndirect src/Dodge/Base/Collide.hs 320;" f +hasLOS src/Dodge/Base/Collide.hs 305;" f +hasLOSIndirect src/Dodge/Base/Collide.hs 321;" f hat src/Dodge/Item/Equipment.hs 65;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 68;" f @@ -3841,7 +3846,7 @@ invertInventoryToMap src/Dodge/Combine.hs 57;" f invisibleChaseCrit src/Dodge/Creature/ChaseCrit.hs 21;" f invisibleWall src/Dodge/Placement/Instance/Wall.hs 27;" f isAmmoIntLink src/Dodge/HeldUse.hs 731;" f -isAnimate src/Dodge/Creature/Test.hs 134;" f +isAnimate src/Dodge/Creature/Test.hs 135;" f isCognizant src/Dodge/Creature/Perception.hs 105;" f isConnected src/Dodge/Inventory/Swap.hs 77;" f isCornerLink src/Dodge/RoomLink.hs 66;" f @@ -3942,7 +3947,7 @@ 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 -lChasm src/Dodge/Room/Tutorial.hs 143;" f +lChasm src/Dodge/Room/Tutorial.hs 144;" f lConnect src/Dodge/Render/Connectors.hs 43;" f lConnectCol src/Dodge/Render/Connectors.hs 46;" f lConnectMulti src/Dodge/Render/Connectors.hs 51;" f @@ -4177,9 +4182,9 @@ mglCreate src/GLHelp.hs 8;" f mglDelete src/GLHelp.hs 14;" f midBarDecoration src/Dodge/Placement/TopDecoration.hs 23;" f midBounds src/Dodge/Room/Foreground.hs 150;" f -midChasm src/Dodge/Room/Tutorial.hs 172;" f -midChasmPlatform src/Dodge/Room/Tutorial.hs 194;" f -midChasmSpit src/Dodge/Room/Tutorial.hs 253;" f +midChasm src/Dodge/Room/Tutorial.hs 173;" f +midChasmPlatform src/Dodge/Room/Tutorial.hs 195;" f +midChasmSpit src/Dodge/Room/Tutorial.hs 262;" f midPad src/Padding.hs 27;" f midPadL src/Padding.hs 33;" f midPoint src/Geometry.hs 83;" f @@ -4277,6 +4282,7 @@ noPic src/ShapePicture.hs 25;" f noShape src/ShapePicture.hs 29;" f noclipCheck src/Dodge/WallCreatureCollisions.hs 23;" f nodesNear src/Dodge/Path.hs 75;" f +nonConvexChasm src/Dodge/Room/Tutorial.hs 259;" f nonCornerLinks src/Dodge/Room/SensorDoor.hs 55;" f normalGait src/Dodge/Creature/State/WalkCycle.hs 30;" f normalTo8 src/Shader/Poke.hs 466;" f @@ -4303,7 +4309,7 @@ oldMachineBootS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 635;" f onEquipWristShield src/Dodge/Euse.hs 94;" f onRemoveWristShield src/Dodge/Euse.hs 84;" f onXY src/Geometry/Vector3D.hs 130;" f -oneH src/Dodge/Creature/Test.hs 96;" f +oneH src/Dodge/Creature/Test.hs 97;" f openConsole src/Dodge/Update.hs 138;" f optionMenu src/Dodge/Menu.hs 110;" f optionScreenDefaultEffect src/Dodge/Update/Input/ScreenLayer.hs 62;" f @@ -4335,10 +4341,10 @@ overPos src/Picture/Base.hs 298;" f overPosObj src/Shape.hs 274;" f overPosSH src/Shape.hs 258;" f overPosSP src/ShapePicture.hs 41;" f -overlapCircWalls src/Dodge/Base/Collide.hs 230;" f -overlapCircWallsClosest src/Dodge/Base/Collide.hs 272;" f +overlapCircWalls src/Dodge/Base/Collide.hs 231;" f +overlapCircWallsClosest src/Dodge/Base/Collide.hs 273;" f overlapSegCrs src/Dodge/Base/Collide.hs 59;" f -overlapSegWalls src/Dodge/Base/Collide.hs 211;" f +overlapSegWalls src/Dodge/Base/Collide.hs 212;" f overrideInternal src/Dodge/Creature/ReaderUpdate.hs 180;" f overrideMeleeCloseTarget src/Dodge/Creature/ReaderUpdate.hs 35;" f overwriteLabel src/Dodge/Tree/Compose.hs 32;" f @@ -4352,7 +4358,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 550;" f +passthroughLockKeyLists src/Dodge/Room/Tutorial.hs 568;" f pathConnected src/Dodge/Room/CheckConsistency.hs 13;" f pathEdgeObstructed src/Dodge/Path.hs 66;" f pauseAndFloatCam src/Dodge/Camera.hs 10;" f @@ -4457,8 +4463,8 @@ pokeWall src/Shader/Poke.hs 80;" f pokeWallsWindows src/Shader/Poke.hs 52;" f poly3 src/Picture/Base.hs 76;" f poly3Col src/Picture/Base.hs 80;" f -polyChasm src/Dodge/Room/Tutorial.hs 316;" f -polyChasmC src/Dodge/Room/Tutorial.hs 328;" f +polyChasm src/Dodge/Room/Tutorial.hs 334;" f +polyChasmC src/Dodge/Room/Tutorial.hs 346;" f polyCirc src/Shape.hs 47;" f polyCircx src/Shape.hs 52;" f polyCornerDist src/Geometry/Polygon.hs 69;" f @@ -4536,12 +4542,12 @@ pushOutFromWalls src/Dodge/WallCreatureCollisions.hs 64;" f pushR src/DoubleStack.hs 24;" f pushScreen src/Dodge/Menu/PushPop.hs 9;" f pushYouOutFromWalls src/Dodge/Update.hs 320;" f -putAutoDoor src/Dodge/Placement/Instance/Door.hs 87;" f +putAutoDoor src/Dodge/Placement/Instance/Door.hs 65;" f putBlockN src/Dodge/Placement/Instance/Wall.hs 120;" f putBlockRect src/Dodge/Placement/Instance/Wall.hs 111;" f putBlockV src/Dodge/Placement/Instance/Wall.hs 114;" f putConvexChasm src/Dodge/Data/GenWorld.hs 70;" f -putDoor src/Dodge/Room/Airlock.hs 114;" f +putDoor src/Dodge/Room/Airlock.hs 115;" 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 @@ -4835,7 +4841,7 @@ sensorReqToString src/Dodge/Machine/Update.hs 242;" f sensorRoom src/Dodge/Room/SensorDoor.hs 29;" f sensorRoomRunPast src/Dodge/Room/SensorDoor.hs 61;" f sensorSPic src/Dodge/Machine/Draw.hs 99;" f -sensorTut src/Dodge/Room/Tutorial.hs 494;" f +sensorTut src/Dodge/Room/Tutorial.hs 512;" 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 @@ -4870,7 +4876,7 @@ setSoundVolume src/Sound.hs 159;" f setTargetMv src/Dodge/Creature/ReaderUpdate.hs 83;" f setTile src/Dodge/Layout.hs 70;" f setTiles src/Dodge/Layout.hs 67;" f -setTreeInts src/Dodge/Room/Tutorial.hs 92;" f +setTreeInts src/Dodge/Room/Tutorial.hs 93;" f setViewDistance src/Dodge/Update/Camera.hs 245;" f setViewPos src/Dodge/Creature/ReaderUpdate.hs 69;" f setViewport src/Dodge/Render.hs 448;" f @@ -4950,8 +4956,8 @@ 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 67;" f -shrinkPolyOnEdges src/Geometry/Polygon.hs 183;" f -shrinkVert src/Geometry/Polygon.hs 187;" f +shrinkPolyOnEdges src/Geometry/Polygon.hs 198;" f +shrinkVert src/Geometry/Polygon.hs 202;" f shuffle src/RandomHelp.hs 68;" f shuffleLinks src/Dodge/Room/Link.hs 30;" f shufflePair src/RandomHelp.hs 166;" f @@ -4985,8 +4991,8 @@ slapClean7S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 747;" f slapS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 667;" f slideDoorS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 629;" f slideWindow src/ListHelp.hs 81;" f -slowDoorRoom src/Dodge/Room/LongDoor.hs 140;" f -slowDoorRoomRunPast src/Dodge/Room/LongDoor.hs 157;" f +slowDoorRoom src/Dodge/Room/LongDoor.hs 141;" f +slowDoorRoomRunPast src/Dodge/Room/LongDoor.hs 158;" f smallBattery src/Dodge/Item/Ammo.hs 57;" f smallBranch src/Dodge/Tree/GenerateStructure.hs 32;" f smallChaseCrit src/Dodge/Creature/ChaseCrit.hs 14;" f @@ -5050,8 +5056,8 @@ spreadGunCrit src/Dodge/Creature/SpreadGunCrit.hs 11;" f spreadOut src/Dodge/Creature/Boid.hs 160;" f sps src/Dodge/LevelGen/PlacementHelper.hs 30;" f sps0 src/Dodge/LevelGen/PlacementHelper.hs 42;" f -sqPlatformChasm src/Dodge/Room/Tutorial.hs 223;" f -sqSpitChasm src/Dodge/Room/Tutorial.hs 238;" f +sqPlatformChasm src/Dodge/Room/Tutorial.hs 224;" f +sqSpitChasm src/Dodge/Room/Tutorial.hs 239;" f square src/Geometry/Polygon.hs 56;" f squareDecoration src/Dodge/Placement/TopDecoration.hs 48;" f squashIntersectCirclePoint src/Dodge/WallCreatureCollisions.hs 116;" f @@ -5293,7 +5299,8 @@ treePaths src/TreeHelp.hs 139;" f treePost src/TreeHelp.hs 46;" f treeToPotentialFunction src/Dodge/Item/Grammar.hs 147;" f triLootRoom src/Dodge/Room/Treasure.hs 23;" f -triggerDoorRoom src/Dodge/Room/Door.hs 31;" f +triangulateEarClip src/Geometry/Polygon.hs 162;" f +triggerDoorRoom src/Dodge/Room/Door.hs 32;" f triggerSwitch src/Dodge/Placement/Instance/Button.hs 47;" f triggerSwitchSPic src/Dodge/Placement/Instance/Button.hs 14;" f triggerSwitchSPicLight src/Dodge/Placement/Instance/Button.hs 31;" f @@ -5319,18 +5326,18 @@ tryThrust src/Dodge/Projectile/Update.hs 126;" f tryUseParent src/Dodge/Creature/State.hs 145;" f turnTo src/Dodge/Movement/Turn.hs 8;" f turretItemOffset src/Dodge/Item/HeldOffset.hs 22;" f -tutAnoTree src/Dodge/Room/Tutorial.hs 53;" f -tutDrop src/Dodge/Room/Tutorial.hs 97;" f -tutHub src/Dodge/Room/Tutorial.hs 392;" f -tutLight src/Dodge/Room/Tutorial.hs 360;" f -tutRezBox src/Dodge/Room/Tutorial.hs 505;" f +tutAnoTree src/Dodge/Room/Tutorial.hs 54;" f +tutDrop src/Dodge/Room/Tutorial.hs 98;" f +tutHub src/Dodge/Room/Tutorial.hs 410;" f +tutLight src/Dodge/Room/Tutorial.hs 378;" f +tutRezBox src/Dodge/Room/Tutorial.hs 523;" f tutRoomTree src/Dodge/Floor.hs 20;" f -tutorialMessage1 src/Dodge/Room/Tutorial.hs 530;" f +tutorialMessage1 src/Dodge/Room/Tutorial.hs 548;" f tweenAngles src/Geometry/Vector.hs 190;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 79;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 34;" f -twists src/Dodge/Creature/Test.hs 102;" f -twoFlat src/Dodge/Creature/Test.hs 99;" f +twists src/Dodge/Creature/Test.hs 103;" f +twoFlat src/Dodge/Creature/Test.hs 100;" f twoFlatHRot src/Dodge/Item/HeldOffset.hs 75;" f twoHandTwistAmount src/Dodge/Creature/YourControl.hs 166;" f twoRoomPoss src/Dodge/PlacementSpot.hs 148;" f @@ -5439,7 +5446,7 @@ updatePlasmaBall src/Dodge/Update.hs 484;" f updatePlasmaBalls src/Dodge/Update.hs 624;" f updatePreload src/Preload/Update.hs 21;" f updateProjectile src/Dodge/Projectile/Update.hs 26;" f -updatePulse src/Dodge/Creature/Update.hs 180;" f +updatePulse src/Dodge/Creature/Update.hs 182;" f updatePulseBall src/Dodge/Update.hs 500;" f updatePulseLaser src/Dodge/Update.hs 671;" f updatePulseLasers src/Dodge/Update.hs 479;" f @@ -5543,7 +5550,7 @@ viewGameRoomBoundaries src/Dodge/Debug/Picture.hs 332;" f viewRoomBoundaries src/Dodge/Debug/Picture.hs 341;" f viewTarget src/Dodge/Creature/ReaderUpdate.hs 155;" f violet src/Color.hs 48;" f -visibleWalls src/Dodge/Base/Collide.hs 216;" f +visibleWalls src/Dodge/Base/Collide.hs 217;" f visionCheck src/Dodge/Creature/Perception.hs 152;" f vocalizationTest src/Dodge/Creature/Vocalization.hs 62;" f volleyGun src/Dodge/Item/Held/Cane.hs 15;" f @@ -5553,7 +5560,7 @@ walkableNodeNear src/Dodge/Path.hs 69;" f 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 +wallToSurface src/Dodge/Base/Collide.hs 181;" f wallsFromRooms src/Dodge/Layout.hs 141;" f wallsToDraw src/Dodge/Render/Walls.hs 18;" f warmupSound src/Dodge/HeldUse.hs 1393;" f @@ -5646,7 +5653,7 @@ yourInv src/Dodge/Base/You.hs 28;" f yourRootItem src/Dodge/Base/You.hs 22;" f yourSelectedItem src/Dodge/Base/You.hs 16;" f yourStatsInfo src/Dodge/Creature/Info.hs 27;" f -zChasm src/Dodge/Room/Tutorial.hs 156;" f +zChasm src/Dodge/Room/Tutorial.hs 157;" f zConnect src/Dodge/Render/Connectors.hs 18;" f zConnectCol src/Dodge/Render/Connectors.hs 29;" f zConnectColMidX src/Dodge/Render/Connectors.hs 32;" f