diff --git a/src/Dodge/Data/Door.hs b/src/Dodge/Data/Door.hs index 9cdd193ed..c03f427cc 100644 --- a/src/Dodge/Data/Door.hs +++ b/src/Dodge/Data/Door.hs @@ -16,6 +16,7 @@ import Dodge.Data.MountedObject import Dodge.Data.PathGraph import Dodge.Data.WorldEffect import Geometry.Data +import qualified Data.IntMap.Strict as IM data DoorStatus = DoorOpen | DoorClosed | DoorHalfway | DoorInt Int deriving Eq @@ -35,6 +36,10 @@ data Door = Door , _drPos :: (Point2, Point2) , _drOpenPos :: (Point2, Point2) , _drClosePos :: (Point2, Point2) + , _drZeroPos :: (Point2,Float) + , _drOnePos :: (Point2,Float) + , _drLerp :: Float + , _drFootPrint :: IM.IntMap (Point2,Point2) , _drHP :: Int , _drDeath :: DrWdWd , _drSpeed :: Float diff --git a/src/Dodge/Data/WorldEffect.hs b/src/Dodge/Data/WorldEffect.hs index 18d4eb22d..cc5937f03 100644 --- a/src/Dodge/Data/WorldEffect.hs +++ b/src/Dodge/Data/WorldEffect.hs @@ -67,6 +67,7 @@ data DrWdWd | DrWdMakeDoorDebris | DrWdMechanismStepwise Int [Int] [(Point2, Point2)] | DoorMechanism + | DoorLerp --deriving (Eq, Ord, Show, Read) --Generic, Flat) --deriving (Eq, Show, Read) --, Generic) diff --git a/src/Dodge/Default/Door.hs b/src/Dodge/Default/Door.hs index eabb7ce82..49a57acdc 100644 --- a/src/Dodge/Default/Door.hs +++ b/src/Dodge/Default/Door.hs @@ -37,6 +37,10 @@ defaultDoor = , _drPos = (0, 0) , _drOpenPos = (0, 0) , _drClosePos = (0, 0) + , _drZeroPos = (0,0) + , _drOnePos = (0,0) + , _drLerp = 0 + , _drFootPrint = mempty , _drHP = 10000 , _drDeath = DrWdMakeDoorDebris , _drSpeed = 1 diff --git a/src/Dodge/DrWdWd.hs b/src/Dodge/DrWdWd.hs index 951b700d3..d98f26627 100644 --- a/src/Dodge/DrWdWd.hs +++ b/src/Dodge/DrWdWd.hs @@ -1,5 +1,8 @@ module Dodge.DrWdWd where +import Dodge.ShiftPoint +import Linear +import Data.IntMap.Merge.Strict import Control.Lens import Data.Foldable import qualified Data.IntSet as IS @@ -19,6 +22,7 @@ doDrWdWd dww = case dww of DrWdMakeDoorDebris -> makeDoorDebris DrWdMechanismStepwise nsteps wlids pss -> doorMechanismStepwise nsteps wlids pss DoorMechanism -> doorMechanism + DoorLerp -> doorLerp -- TODO sort out why DoorClosed status does not update correctly 22/06/23 doorMechanism :: Door -> World -> World @@ -51,6 +55,46 @@ doorMechanism dr w = case mvDir of | dist dpos dcp < 1 = cWorld . lWorld . doors . ix drid . drStatus .~ DoorClosed | otherwise = cWorld . lWorld . doors . ix drid . drStatus .~ DoorHalfway +doorLerp :: Door -> World -> World +doorLerp dr w = case newlerp of + Just x -> + w + & cWorld . lWorld . walls %~ merge dropMissing preserveMissing f + (wlposs x) + & moveUpdate + & cWorld . lWorld . doors . ix drid . drLerp .~ x + Nothing -> w + where + f = zipWithMatched $ \_ l wl -> wl & wlLine .~ l + (zp,za) = dr^. drZeroPos + (yp,ya) = dr^. drOnePos + p2a x = (zp + x *^ (yp - zp) , za + x * diffAngles ya za) + wlposs x = (dr ^. drFootPrint) & each . each %~ shiftPointBy (p2a x) + clerp = dr ^. drLerp + newlerp + | toOpen && clerp < 1 = Just . min 1 $ clerp + 0.1 + | clerp > 0 = Just . max 1 $ clerp - 0.1 + | otherwise = Nothing + toOpen = doWdBl (_drTrigger dr) w + mvDir + | toOpen && _drStatus dr == DoorOpen = Nothing -- Not sure why necessary + | toOpen && dist dpos dop > 0.5 = Just $ vecBetweenSpeed speed dpos dop + | dist dpos dcp > 0.5 = Just $ vecBetweenSpeed speed dpos dcp + | otherwise = Nothing + speed = _drSpeed dr + drid = _drID dr + moveUpdate = playSound . setStatus + playSound + | _drPushedBy dr == PushesItself = soundContinue (WallSound drid) dpos slideDoorS (Just 1) + | otherwise = id + dpos = snd $ _drPos dr + dop = snd $ _drOpenPos dr + dcp = snd $ _drClosePos dr + setStatus + | dist dpos dop < 1 = cWorld . lWorld . doors . ix drid . drStatus .~ DoorOpen + | dist dpos dcp < 1 = cWorld . lWorld . doors . ix drid . drStatus .~ DoorClosed + | otherwise = cWorld . lWorld . doors . ix drid . drStatus .~ DoorHalfway + -- TODO use vector instead of list, perhaps also memoisation of rectanglePairs -- TODO update _drPos -- perhaps also remove use of DoorInt in favour of DoorOpen/DoorClosed diff --git a/src/Dodge/Placement/PlaceSpot.hs b/src/Dodge/Placement/PlaceSpot.hs index cecd9df02..b965aa70c 100644 --- a/src/Dodge/Placement/PlaceSpot.hs +++ b/src/Dodge/Placement/PlaceSpot.hs @@ -39,7 +39,7 @@ placeSpot rid w plmnt = case plmnt of where shift = _rmShift $ w ^?! genRooms . ix rid -placePlainPSSpot :: GenWorld -> Int -> Placement -> DPoint2 -> GenWorld +placePlainPSSpot :: GenWorld -> Int -> Placement -> Point2A -> GenWorld placePlainPSSpot w rid plmnt shift = case plmnt ^. plType of RandPS rgn -> let (x, g) = runState rgn (w ^. gwWorld . randGen) @@ -89,7 +89,7 @@ placeSpotUsingLink w rid plmnt extract eff fallback = placeSpotRoomRand :: Int -> Int -> - (DPoint2 -> PlacementSpot) -> + (Point2A -> PlacementSpot) -> Placement -> GenWorld -> GenWorld diff --git a/src/Dodge/Room/Tutorial.hs b/src/Dodge/Room/Tutorial.hs index efefa6dcc..d2ee8f7e9 100644 --- a/src/Dodge/Room/Tutorial.hs +++ b/src/Dodge/Room/Tutorial.hs @@ -43,6 +43,7 @@ tutAnoTree = do foldMTRS [ tToBTree "TutStartRez" . return . cleatOnward <$> tutRezBox , corDoor + , tToBTree "asdf" . return . cleatOnward <$> airlockZ , return $ tToBTree "cor" $ return $ cleatOnward corridor , tToBTree "t" . return . cleatOnward <$> slowDoorRoom , corDoor diff --git a/src/Dodge/ShiftPoint.hs b/src/Dodge/ShiftPoint.hs index 2c5881e2b..82e546daa 100644 --- a/src/Dodge/ShiftPoint.hs +++ b/src/Dodge/ShiftPoint.hs @@ -1,12 +1,14 @@ {-# LANGUAGE BangPatterns #-} + module Dodge.ShiftPoint where + import Geometry -shiftPointBy :: (Point2,Float) -> Point2 -> Point2 -shiftPointBy (pos,rot) !p = pos +.+ rotateV rot p +shiftPointBy :: Point2A -> Point2 -> Point2 +shiftPointBy (pos, rot) !p = pos +.+ rotateV rot p -invShiftPointBy :: (Point2,Float) -> Point2 -> Point2 -invShiftPointBy (p1,r) p2 = rotateV (-r) $ p2 -.- p1 +invShiftPointBy :: (Point2, Float) -> Point2 -> Point2 +invShiftPointBy (p1, r) p2 = rotateV (- r) $ p2 -.- p1 -shiftPoint3By :: (Point2,Float) -> Point3 -> Point3 -shiftPoint3By (pos,rot) (V3 x y z) = addZ z $ pos +.+ rotateV rot (V2 x y) +shiftPoint3By :: (Point2, Float) -> Point3 -> Point3 +shiftPoint3By (pos, rot) (V3 x y z) = addZ z $ pos +.+ rotateV rot (V2 x y) diff --git a/src/Geometry/Data.hs b/src/Geometry/Data.hs index 728cefbcf..f63db99ac 100644 --- a/src/Geometry/Data.hs +++ b/src/Geometry/Data.hs @@ -45,7 +45,7 @@ instance ToJSON a => ToJSON (V4 a) where instance FromJSON a => FromJSON (V4 a) -type DPoint2 = (Point2, Float) +type Point2A = (Point2, Float) type QFloat = Q.Quaternion Float diff --git a/tags b/tags index 98724a79d..0c361637b 100644 --- a/tags +++ b/tags @@ -127,17 +127,17 @@ BlBl src/Dodge/Data/BlBl.hs 9;" t BlConst src/Dodge/Data/BlBl.hs 11;" C BlId src/Dodge/Data/BlBl.hs 12;" C BlNegate src/Dodge/Data/BlBl.hs 10;" C -BlSh src/Dodge/Data/Block.hs 43;" t -BlShConst src/Dodge/Data/Block.hs 45;" C -BlShMempty src/Dodge/Data/Block.hs 44;" C +BlSh src/Dodge/Data/Block.hs 42;" t +BlShConst src/Dodge/Data/Block.hs 44;" C +BlShMempty src/Dodge/Data/Block.hs 43;" C Block src/Dodge/Data/Block.hs 20;" t BlockDebris src/Dodge/Data/Prop.hs 44;" C BlockDegradeSound src/Dodge/Data/SoundOrigin.hs 30;" C -BlockDraw src/Dodge/Data/Block.hs 36;" t -BlockDrawBlSh src/Dodge/Data/Block.hs 38;" C -BlockDrawColHeightPoss src/Dodge/Data/Block.hs 40;" C -BlockDrawMempty src/Dodge/Data/Block.hs 37;" C -BlockDraws src/Dodge/Data/Block.hs 39;" C +BlockDraw src/Dodge/Data/Block.hs 35;" t +BlockDrawBlSh src/Dodge/Data/Block.hs 37;" C +BlockDrawColHeightPoss src/Dodge/Data/Block.hs 39;" C +BlockDrawMempty src/Dodge/Data/Block.hs 36;" C +BlockDraws src/Dodge/Data/Block.hs 38;" C BlockObstacle src/Dodge/Data/PathGraph.hs 49;" C BlockPart src/Dodge/Data/Wall/Structure.hs 14;" C BlockedLink src/Dodge/Data/Room.hs 50;" C @@ -350,15 +350,16 @@ DoNotMoveEquipment src/Dodge/Data/RightButtonOptions.hs 18;" C 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 -DoorClosed src/Dodge/Data/Door.hs 20;" C -DoorHalfway src/Dodge/Data/Door.hs 20;" C -DoorInt src/Dodge/Data/Door.hs 20;" C +Door src/Dodge/Data/Door.hs 30;" t +DoorClosed src/Dodge/Data/Door.hs 21;" C +DoorHalfway src/Dodge/Data/Door.hs 21;" C +DoorInt src/Dodge/Data/Door.hs 21;" C +DoorLerp src/Dodge/Data/WorldEffect.hs 70;" C DoorMechanism src/Dodge/Data/WorldEffect.hs 69;" C DoorObstacle src/Dodge/Data/PathGraph.hs 50;" C -DoorOpen src/Dodge/Data/Door.hs 20;" C +DoorOpen src/Dodge/Data/Door.hs 21;" C DoorPart src/Dodge/Data/Wall/Structure.hs 12;" C -DoorStatus src/Dodge/Data/Door.hs 20;" t +DoorStatus src/Dodge/Data/Door.hs 21;" t DoubleRes src/Dodge/Data/Config.hs 98;" C DoubleTreeNodeType src/Dodge/Data/DoubleTree.hs 14;" t DrWdId src/Dodge/Data/WorldEffect.hs 66;" C @@ -866,7 +867,7 @@ NorthEast8 src/Dodge/Data/CardinalPoint.hs 21;" C NorthWest src/Dodge/Data/CardinalPoint.hs 16;" C NorthWest8 src/Dodge/Data/CardinalPoint.hs 27;" C NotLink src/Dodge/Data/Room.hs 69;" C -NotPushed src/Dodge/Data/Door.hs 26;" C +NotPushed src/Dodge/Data/Door.hs 27;" C Nothing' src/MaybeHelp.hs 11;" C NothingID src/Dodge/Data/CrWlID.hs 10;" C NozzleAngle src/Dodge/Data/Item/Params.hs 16;" C @@ -1044,9 +1045,9 @@ PulseBallSF src/Dodge/Data/ComposedItem.hs 44;" C PulseLaser src/Dodge/Data/PulseLaser.hs 11;" t PulseLaserSF src/Dodge/Data/ComposedItem.hs 41;" C PulseStatus src/Dodge/Data/Creature/Misc.hs 52;" C -PushSource src/Dodge/Data/Door.hs 23;" t -PushedBy src/Dodge/Data/Door.hs 25;" C -PushesItself src/Dodge/Data/Door.hs 24;" C +PushSource src/Dodge/Data/Door.hs 24;" t +PushedBy src/Dodge/Data/Door.hs 26;" C +PushesItself src/Dodge/Data/Door.hs 25;" C PutBlock src/Dodge/Data/GenWorld.hs 45;" C PutButton src/Dodge/Data/GenWorld.hs 41;" C PutChasm src/Dodge/Data/GenWorld.hs 63;" C @@ -1552,7 +1553,7 @@ _blHP src/Dodge/Data/Block.hs 23;" f _blHeight src/Dodge/Data/Block.hs 28;" f _blID src/Dodge/Data/Block.hs 21;" f _blMaterial src/Dodge/Data/Block.hs 29;" f -_blObstructs src/Dodge/Data/Block.hs 32;" f +_blObstructs src/Dodge/Data/Block.hs 31;" f _blPos src/Dodge/Data/Block.hs 26;" f _blShadows src/Dodge/Data/Block.hs 24;" f _blWallIDs src/Dodge/Data/Block.hs 22;" f @@ -1764,21 +1765,25 @@ _doReplicateAction src/Dodge/Data/ActionPlan.hs 113;" f _doReplicateTimes src/Dodge/Data/ActionPlan.hs 107;" f _doReplicateTimes src/Dodge/Data/ActionPlan.hs 112;" f _doors src/Dodge/Data/LWorld.hs 118;" f -_drClosePos src/Dodge/Data/Door.hs 37;" f -_drDeath src/Dodge/Data/Door.hs 39;" f -_drHP src/Dodge/Data/Door.hs 38;" f -_drID src/Dodge/Data/Door.hs 30;" f -_drMech src/Dodge/Data/Door.hs 34;" f -_drMounts src/Dodge/Data/Door.hs 43;" f -_drObstacleType src/Dodge/Data/Door.hs 45;" f -_drOpenPos src/Dodge/Data/Door.hs 36;" f -_drPos src/Dodge/Data/Door.hs 35;" f -_drPushedBy src/Dodge/Data/Door.hs 41;" f -_drPushes src/Dodge/Data/Door.hs 42;" f -_drSpeed src/Dodge/Data/Door.hs 40;" f -_drStatus src/Dodge/Data/Door.hs 32;" f -_drTrigger src/Dodge/Data/Door.hs 33;" f -_drWallIDs src/Dodge/Data/Door.hs 31;" f +_drClosePos src/Dodge/Data/Door.hs 38;" f +_drDeath src/Dodge/Data/Door.hs 44;" f +_drFootPrint src/Dodge/Data/Door.hs 42;" f +_drHP src/Dodge/Data/Door.hs 43;" f +_drID src/Dodge/Data/Door.hs 31;" f +_drLerp src/Dodge/Data/Door.hs 41;" f +_drMech src/Dodge/Data/Door.hs 35;" f +_drMounts src/Dodge/Data/Door.hs 48;" f +_drObstacleType src/Dodge/Data/Door.hs 50;" f +_drOnePos src/Dodge/Data/Door.hs 40;" f +_drOpenPos src/Dodge/Data/Door.hs 37;" f +_drPos src/Dodge/Data/Door.hs 36;" f +_drPushedBy src/Dodge/Data/Door.hs 46;" f +_drPushes src/Dodge/Data/Door.hs 47;" f +_drSpeed src/Dodge/Data/Door.hs 45;" f +_drStatus src/Dodge/Data/Door.hs 33;" f +_drTrigger src/Dodge/Data/Door.hs 34;" f +_drWallIDs src/Dodge/Data/Door.hs 32;" f +_drZeroPos src/Dodge/Data/Door.hs 39;" f _dsPos src/Dodge/Data/Cloud.hs 28;" f _dsTimer src/Dodge/Data/Cloud.hs 30;" f _dsType src/Dodge/Data/Cloud.hs 31;" f @@ -2758,7 +2763,7 @@ bulletWeapons src/Dodge/Combine/Combinations.hs 248;" f burstRifle src/Dodge/Item/Held/Cane.hs 30;" f buttonFlip src/Dodge/Button/Event.hs 17;" f buzzS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 702;" f -cChasm src/Dodge/Room/Tutorial.hs 113;" f +cChasm src/Dodge/Room/Tutorial.hs 114;" f cFilledRect src/Dodge/CharacterEnums.hs 6;" f cWireRect src/Dodge/CharacterEnums.hs 10;" f calcSmoothScroll src/Dodge/SmoothScroll.hs 11;" f @@ -2793,7 +2798,7 @@ chaseCritInternal src/Dodge/Humanoid.hs 7;" f chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 120;" f chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 32;" f chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 36;" f -chasmSimpleMaze src/Dodge/Room/Tutorial.hs 180;" f +chasmSimpleMaze src/Dodge/Room/Tutorial.hs 181;" f chasmTest src/Dodge/Creature/Update.hs 132;" f chasmWallToSurface src/Dodge/Base/Collide.hs 120;" f checkCombineSelectionExists src/Dodge/DisplayInventory.hs 100;" f @@ -3024,9 +3029,9 @@ cutWallsWithPoints src/Dodge/LevelGen/StaticWalls.hs 112;" f cyan src/Color.hs 18;" f cycleDownEnum src/Dodge/Menu/OptionType.hs 27;" f cycleEnum src/Dodge/Menu/OptionType.hs 22;" f -cycleGT src/IntMapHelp.hs 93;" f +cycleGT src/IntMapHelp.hs 94;" f cycleL src/DoubleStack.hs 28;" f -cycleLT src/IntMapHelp.hs 96;" f +cycleLT src/IntMapHelp.hs 97;" f cycleOptions src/Dodge/Menu/Option.hs 75;" f cycleR src/DoubleStack.hs 32;" f cylinderIndices src/Shader/Poke.hs 382;" f @@ -3215,7 +3220,7 @@ doDebugTestF12 src/Dodge/Update/Input/DebugTest.hs 84;" f 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 -doDrWdWd src/Dodge/DrWdWd.hs 16;" f +doDrWdWd src/Dodge/DrWdWd.hs 17;" f doDrag src/Dodge/Update/Input/InGame.hs 127;" f doDrawing src/Dodge/Render.hs 34;" f doDrawing' src/Dodge/Render.hs 45;" f @@ -3258,8 +3263,9 @@ doWorldEvents src/Dodge/Update.hs 428;" f doWorldPos src/Dodge/WorldPos.hs 10;" f door src/Dodge/Room/Door.hs 14;" f doorBetween src/Dodge/Placement/Instance/Door.hs 39;" f -doorMechanism src/Dodge/DrWdWd.hs 24;" f -doorMechanismStepwise src/Dodge/DrWdWd.hs 59;" f +doorLerp src/Dodge/DrWdWd.hs 56;" f +doorMechanism src/Dodge/DrWdWd.hs 26;" f +doorMechanismStepwise src/Dodge/DrWdWd.hs 91;" f dotV src/Geometry/Vector.hs 76;" f dotV3 src/Geometry/Vector3D.hs 119;" f doubleCorridorBarrels src/Dodge/Room/Room.hs 276;" f @@ -3504,7 +3510,7 @@ findBlips src/Dodge/RadarSweep.hs 63;" f findBoundDists src/Dodge/Update/Camera.hs 248;" f findClosePoint src/Dodge/LevelGen/StaticWalls.hs 155;" f findClosePoint src/Dodge/LevelGen/StaticWalls/Deprecated.hs 74;" f -findIndex src/IntMapHelp.hs 85;" f +findIndex src/IntMapHelp.hs 86;" f findReverseEdge src/Polyhedra.hs 50;" f findReverseEdgeList src/Polyhedra.hs 57;" f findWallFreeDropPoint src/Dodge/FloorItem.hs 27;" f @@ -3545,7 +3551,7 @@ floorItemSPic src/Dodge/Render/ShapePicture.hs 120;" f floorWire src/Dodge/Wire.hs 13;" f foamSprayFadeOutS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 558;" f foamSprayLoopS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 554;" f -foldMTRS src/Dodge/Room/Tutorial.hs 58;" f +foldMTRS src/Dodge/Room/Tutorial.hs 59;" f foldPairs src/ListHelp.hs 37;" f foldrWhileArb src/ListHelp.hs 110;" f followImpulse src/Dodge/Creature/Impulse.hs 24;" f @@ -3606,8 +3612,8 @@ getCloseObj src/Dodge/Update/Input/InGame.hs 533;" f getCommand src/Dodge/Terminal.hs 52;" f getCommands src/Dodge/Terminal.hs 49;" f getCrMoveSpeed src/Dodge/Creature/Statistics.hs 50;" f -getCrsFromRooms src/Dodge/Room/Tutorial.hs 329;" f -getCrsFromRooms' src/Dodge/Room/Tutorial.hs 316;" f +getCrsFromRooms src/Dodge/Room/Tutorial.hs 330;" f +getCrsFromRooms' src/Dodge/Room/Tutorial.hs 317;" f getDebugMouseOver src/Dodge/Update.hs 376;" f getDistortions src/Dodge/Render.hs 435;" f getEdgesCrossing src/Dodge/Path.hs 43;" f @@ -3624,7 +3630,7 @@ getNodePos src/Dodge/Path.hs 40;" f getPJStabiliser src/Dodge/HeldUse.hs 1251;" f getPretty src/AesonHelp.hs 8;" f getPromptTM src/Dodge/Terminal/Type.hs 3;" f -getRoomsFromInts src/Dodge/Room/Tutorial.hs 312;" f +getRoomsFromInts src/Dodge/Room/Tutorial.hs 313;" f getRootItemBounds src/Dodge/Render/HUD.hs 100;" f getRootItemInvID src/Dodge/Inventory/Location.hs 35;" f getSelectedCloseObj src/Dodge/SelectedClose.hs 14;" f @@ -3769,14 +3775,14 @@ inorderNumberTree src/TreeHelp.hs 190;" f insertAt src/Padding.hs 63;" f insertIMInZone src/Dodge/Base.hs 54;" f insertInTrie src/SimpleTrie.hs 24;" f -insertNewKey src/IntMapHelp.hs 64;" f +insertNewKey src/IntMapHelp.hs 65;" f insertOneS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 514;" f insertOver src/ListHelp.hs 47;" f insertS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 446;" f insertWall src/Dodge/Placement/PlaceSpot/Block.hs 120;" f insertWallInZones src/Dodge/Wall/Zone.hs 20;" f insertWalls src/Dodge/Placement/PlaceSpot/Block.hs 115;" f -insertWithNewKeys src/IntMapHelp.hs 70;" f +insertWithNewKeys src/IntMapHelp.hs 71;" f intAnno src/Dodge/Floor.hs 111;" f interactWithCloseObj src/Dodge/SelectedClose.hs 9;" f interpWith src/Dodge/Creature/Boid.hs 13;" f @@ -3829,8 +3835,9 @@ inverseSelSecYint src/Dodge/SelectionSections.hs 164;" f inverseSelSecYintXPosCheck src/Dodge/SelectionSections.hs 177;" f inverseShockwaveAt src/Dodge/WorldEvent/Shockwave.hs 43;" f invertEncircleDistP src/Dodge/Creature/Boid.hs 16;" f -invertIntMap src/IntMapHelp.hs 99;" f +invertIntMap src/IntMapHelp.hs 100;" f invertIntMap src/Multiset.hs 67;" f +invertIntMapUnique src/IntMapHelp.hs 103;" f invertInventoryToMap src/Dodge/Combine.hs 56;" f invisibleChaseCrit src/Dodge/Creature/ChaseCrit.hs 21;" f invisibleWall src/Dodge/Placement/Instance/Wall.hs 16;" f @@ -3937,7 +3944,7 @@ keyCardRunPastRand src/Dodge/LockAndKey.hs 36;" f keyPic src/Dodge/Item/Draw/SPic.hs 459;" f keyholeCorridor src/Dodge/Room/Corridor.hs 39;" f knifeS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 638;" f -lChasm src/Dodge/Room/Tutorial.hs 122;" f +lChasm src/Dodge/Room/Tutorial.hs 123;" f lConnect src/Dodge/Render/Connectors.hs 42;" f lConnectMulti src/Dodge/Render/Connectors.hs 46;" f lShape src/Dodge/Placement/Instance/LightSource.hs 90;" f @@ -4187,7 +4194,7 @@ mglCreate src/GLHelp.hs 8;" f mglDelete src/GLHelp.hs 14;" f midBarDecoration src/Dodge/Placement/TopDecoration.hs 16;" f midBounds src/Dodge/Room/Foreground.hs 151;" f -midChasm src/Dodge/Room/Tutorial.hs 143;" f +midChasm src/Dodge/Room/Tutorial.hs 144;" f midPad src/Padding.hs 27;" f midPadL src/Padding.hs 33;" f midPoint src/Geometry.hs 83;" f @@ -4274,7 +4281,7 @@ nearSeg src/Dodge/Zoning/Common.hs 12;" f nearZeroAngle src/Geometry/Vector.hs 138;" f nearestAngleRep src/Geometry.hs 148;" f newExtraAwareness src/Dodge/Creature/Perception.hs 137;" f -newKey src/IntMapHelp.hs 60;" f +newKey src/IntMapHelp.hs 61;" f newSounds src/Dodge/Creature/Perception.hs 169;" f newTextureFramebuffer src/Framebuffer/Setup.hs 16;" f nextArc src/Dodge/Tesla.hs 61;" f @@ -4304,7 +4311,7 @@ numShads src/Picture/Data.hs 40;" f numSubElements src/Shader/Parameters.hs 39;" f numTraversable src/TreeHelp.hs 184;" f obstacleColor src/Dodge/Debug/Picture.hs 269;" f -obstructPathsCrossing src/Dodge/Path.hs 200;" f +obstructPathsCrossing src/Dodge/Path.hs 123;" f oldMachineBootS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 698;" f onEquipWristShield src/Dodge/Equipment.hs 37;" f onRemoveWristShield src/Dodge/Equipment.hs 24;" f @@ -4352,7 +4359,7 @@ p src/ShortShow.hs 48;" f pContID src/Dodge/LevelGen/PlacementHelper.hs 15;" f pairInPolys src/Dodge/Room/Path.hs 45;" f pairPolyPointsIntersect src/Geometry/ConvexPoly.hs 68;" f -pairsToIncGraph src/Dodge/Path.hs 148;" f +pairsToIncGraph src/Dodge/Path.hs 101;" f pairsToIncidence src/Dodge/Graph.hs 20;" f pairsToSCC src/Dodge/Graph.hs 32;" f paletteToColor src/Color.hs 58;" f @@ -4438,7 +4445,7 @@ pointInOrOnPolygon src/Geometry/Polygon.hs 78;" f pointInPoly src/Geometry/Polygon.hs 86;" f pointIsInCone src/Geometry.hs 375;" f pointIsOnScreen src/Dodge/Base/Window.hs 59;" f -pointTowardsImpulse src/Dodge/Path.hs 97;" f +pointTowardsImpulse src/Dodge/Path.hs 98;" f pointerToItem src/Dodge/Item/Location.hs 39;" f pointerToItemID src/Dodge/Item/Location.hs 42;" f pointerYourRootItem src/Dodge/Item/Location.hs 33;" f @@ -4483,8 +4490,8 @@ pokeWall src/Shader/Poke.hs 78;" f pokeWallsWindows src/Shader/Poke.hs 50;" f poly3 src/Picture/Base.hs 84;" f poly3Col src/Picture/Base.hs 88;" f -polyChasm src/Dodge/Room/Tutorial.hs 164;" f -polyChasmC src/Dodge/Room/Tutorial.hs 173;" f +polyChasm src/Dodge/Room/Tutorial.hs 165;" f +polyChasmC src/Dodge/Room/Tutorial.hs 174;" f polyCirc src/Shape.hs 46;" f polyCircx src/Shape.hs 51;" f polyCornerDist src/Geometry/Polygon.hs 61;" f @@ -4672,7 +4679,7 @@ removeAimPosture src/Dodge/Creature/YourControl.hs 159;" f removeAmmoFromMag src/Dodge/HeldUse.hs 907;" f removeDot src/ShortShow.hs 44;" f removeInverseWalls src/Dodge/LevelGen/StaticWalls.hs 25;" f -removeLights src/Dodge/Room/Tutorial.hs 229;" f +removeLights src/Dodge/Room/Tutorial.hs 230;" f removeShieldWall src/Dodge/Item/BackgroundEffect.hs 58;" f removeWallsInPolygon src/Dodge/LevelGen/StaticWalls.hs 182;" f renderDataResizeUpdate src/Preload/Update.hs 26;" f @@ -4790,7 +4797,7 @@ safeMinimumOnMaybe src/FoldableHelp.hs 67;" f safeMinimumOnMaybeF src/FoldableHelp.hs 39;" f safeMinimumOnMaybeL src/FoldableHelp.hs 57;" f safeNormalizeV src/Geometry/Vector.hs 165;" f -safeSwapKeys src/IntMapHelp.hs 77;" f +safeSwapKeys src/IntMapHelp.hs 78;" f safeUncons src/ListHelp.hs 72;" f safeUpdateSingleNode src/TreeHelp.hs 116;" f saveConfig src/Dodge/Config.hs 23;" f @@ -4851,7 +4858,7 @@ sensorReqToString src/Dodge/Machine/Update.hs 197;" f sensorRoom src/Dodge/Room/SensorDoor.hs 26;" f sensorRoomRunPast src/Dodge/Room/SensorDoor.hs 46;" f sensorSPic src/Dodge/Machine/Draw.hs 81;" f -sensorTut src/Dodge/Room/Tutorial.hs 338;" f +sensorTut src/Dodge/Room/Tutorial.hs 339;" f sensorTypeDamages src/Dodge/Machine/Update.hs 234;" f sentinelAI src/Dodge/Creature/SentinelAI.hs 20;" f sentinelExtraWatchUpdate src/Dodge/Creature/SentinelAI.hs 81;" f @@ -4878,7 +4885,7 @@ setOutLinks src/Dodge/RoomLink.hs 50;" f setOutLinksByType src/Dodge/RoomLink.hs 75;" f setOutLinksPD src/Dodge/RoomLink.hs 95;" f setRBCreatureTargeting src/Dodge/Creature/State.hs 290;" f -setRoomInt src/Dodge/Room/Tutorial.hs 65;" f +setRoomInt src/Dodge/Room/Tutorial.hs 66;" f setSelWhileDragging src/Dodge/Update/Input/InGame.hs 337;" f setSelectionListRestriction src/Dodge/Update/Input/ScreenLayer.hs 87;" f setShaderSource src/Shader/Compile.hs 290;" f @@ -4888,7 +4895,7 @@ setTargetMv src/Dodge/Creature/ReaderUpdate.hs 82;" f setTile src/Dodge/Layout.hs 70;" f setTiles src/Dodge/Layout.hs 67;" f setToggle src/Dodge/Prop/Update.hs 44;" f -setTreeInts src/Dodge/Room/Tutorial.hs 72;" f +setTreeInts src/Dodge/Room/Tutorial.hs 73;" f setViewDistance src/Dodge/Update/Camera.hs 236;" f setViewPos src/Dodge/Creature/ReaderUpdate.hs 69;" f setViewport src/Dodge/Render.hs 440;" f @@ -5017,7 +5024,7 @@ smallSnailInt2 src/Dodge/Path.hs 88;" f smg src/Dodge/Item/Held/Stick.hs 58;" f smokeReducer src/Dodge/Item/Scope.hs 162;" f snailAround src/Dodge/Path.hs 85;" f -snapToGrid src/Dodge/Path.hs 223;" f +snapToGrid src/Dodge/Path.hs 146;" f sndV2 src/Geometry/Data.hs 73;" f sniperRifle src/Dodge/Item/Held/Rod.hs 44;" f someCrits src/Dodge/LockAndKey.hs 120;" f @@ -5327,12 +5334,12 @@ turnTo src/Dodge/Movement/Turn.hs 8;" f turret src/Dodge/Placement/Instance/Turret.hs 37;" f turretItemOffset src/Dodge/Item/HeldOffset.hs 21;" f tutAnoTree src/Dodge/Room/Tutorial.hs 41;" f -tutDrop src/Dodge/Room/Tutorial.hs 77;" f -tutHub src/Dodge/Room/Tutorial.hs 236;" f -tutLight src/Dodge/Room/Tutorial.hs 201;" f -tutRezBox src/Dodge/Room/Tutorial.hs 349;" f +tutDrop src/Dodge/Room/Tutorial.hs 78;" f +tutHub src/Dodge/Room/Tutorial.hs 237;" f +tutLight src/Dodge/Room/Tutorial.hs 202;" f +tutRezBox src/Dodge/Room/Tutorial.hs 350;" f tutRoomTree src/Dodge/Floor.hs 21;" f -tutorialMessage1 src/Dodge/Room/Tutorial.hs 373;" f +tutorialMessage1 src/Dodge/Room/Tutorial.hs 374;" f tweenAngles src/Geometry/Vector.hs 190;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 81;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 29;" f @@ -5355,7 +5362,7 @@ unlockInv src/Dodge/Inventory/Lock.hs 12;" f unpause src/Dodge/Menu.hs 212;" f unsafeBlinkAction src/Dodge/Creature/Action/Blink.hs 57;" f unsafeBlinker src/Dodge/Item/Held/Utility.hs 33;" f -unsafeSwapKeys src/IntMapHelp.hs 74;" f +unsafeSwapKeys src/IntMapHelp.hs 75;" f unshadowBlock src/Dodge/Block.hs 39;" f untilJust src/MonadHelp.hs 7;" f untilJustCount src/MonadHelp.hs 14;" f @@ -5645,7 +5652,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 131;" f +zChasm src/Dodge/Room/Tutorial.hs 132;" f zConnect src/Dodge/Render/Connectors.hs 17;" f zConnectCol src/Dodge/Render/Connectors.hs 28;" f zConnectColMidX src/Dodge/Render/Connectors.hs 31;" f