From 1919757fca9f8dcec5305937fe11598f7d782694 Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 29 Mar 2026 19:48:31 +0100 Subject: [PATCH] Add alcoves for switches in push room --- src/Dodge/Base/CardinalPoint.hs | 9 ++- src/Dodge/Room/LongDoor.hs | 47 +++++++++--- tags | 130 ++++++++++++++++---------------- 3 files changed, 110 insertions(+), 76 deletions(-) diff --git a/src/Dodge/Base/CardinalPoint.hs b/src/Dodge/Base/CardinalPoint.hs index cbc6e0b11..f825d8f1a 100644 --- a/src/Dodge/Base/CardinalPoint.hs +++ b/src/Dodge/Base/CardinalPoint.hs @@ -7,8 +7,15 @@ import Geometry cardList :: [CardinalPoint] cardList = [North, East, South, West] +cardReverse :: CardinalPoint -> CardinalPoint +cardReverse = \case + North -> South + South -> North + East -> West + West -> East + cardVec :: CardinalPoint -> Point2 -cardVec cp = case cp of +cardVec = \case North -> V2 0 1 South -> V2 0 (-1) East -> V2 1 0 diff --git a/src/Dodge/Room/LongDoor.hs b/src/Dodge/Room/LongDoor.hs index 7695744c5..ea2dc79bc 100644 --- a/src/Dodge/Room/LongDoor.hs +++ b/src/Dodge/Room/LongDoor.hs @@ -1,8 +1,11 @@ {-# LANGUAGE TupleSections #-} +{-# LANGUAGE LambdaCase #-} -- | Rooms containing long doors, probably with a big reveal behind them. module Dodge.Room.LongDoor where +import Dodge.Placement.Instance.Block +import Dodge.Base.CardinalPoint import Dodge.Room.Modify import qualified Data.IntMap.Strict as IM import Dodge.Default @@ -189,28 +192,42 @@ slowCrushRoom = do pushCaverns :: RandomGen g => State g Room pushCaverns = do rm <- shuffleLinks =<< removeLights <$> roomRectAutoLights 250 100 + iside <- takeOne [North,South] + oside <- takeOne [North,South] crs <- takeOne [[] ] l <- takeOne --- [ [MountedLight (V3 55 0 50) 200 0.5 , MountedSPic (noPic $ aBar 55 [V2 10 0,V2 60 0])] --- , [MountedLight (V3 20 0 50) 200 0.5 , MountedSPic (noPic $ aBar 55 [V2 10 0,V2 22 0])] - [ [MountedLight (V3 30 45 50) 200 0.5 , MountedSPic (noPic $ aBar 55 [V2 10 45,V2 32 45])] + [ [MountedLight (V3 55 0 50) 200 0.5 , MountedSPic (noPic $ aBar 55 [V2 10 0,V2 60 0])] + , [MountedLight (V3 20 0 50) 200 0.5 , MountedSPic (noPic $ aBar 55 [V2 10 0,V2 22 0])] + , [MountedLight (V3 30 45 50) 200 0.5 , MountedSPic (noPic $ aBar 55 [V2 10 45,V2 32 45])] + , [MountedLight (V3 55 45 50) 200 0.5 + , MountedSPic (noPic $ aBar 55 [V2 10 45,V2 60 45]) + , MountedSPic (noPic $ aBar 55 [V2 10 (-45),V2 60 (-45)])] ] return $ rm - & rmBound <>~ [ - ] - & rmLinks %~ setInLinks (\rl -> slinks West $ rl ^. rlType) - & rmLinks %~ setOutLinks (\rl -> slinks East $ rl ^. rlType) + & rmPolys <>~ [dorot iside (trapTBH 20 10 10) & each +~ V2 20 (g iside) + ,dorot oside (trapTBH 20 10 10) & each +~ V2 230 (g oside)] + & rmBound .~ + rectNSWE 100 0 (-10) 260: + [dorot iside (trapTBH 20 10 10) & each +~ V2 20 (g iside) + ,dorot oside (trapTBH 20 10 10) & each +~ V2 230 (g oside)] + & rmLinks %~ setInLinks (\rl -> slinks West iside $ rl ^. rlType) + & rmLinks %~ setOutLinks (\rl -> slinks East oside $ rl ^. rlType) & rmPmnts <>~ [ps0 (PutTrigger False) $ \i -> Just $ - pContID (spos (slinks West)) (PutButton $ makeDumbSwitch i) $ \_ -> Just $ - pContID (spos (slinks East)) (PutButton $ makeDumbSwitch i) $ \_ -> Just $ + pContID (spos (slinks West $ cardReverse iside) f) (PutButton $ makeDumbSwitch i) $ \_ -> Just $ + pContID (spos (slinks East $ cardReverse oside) f) (PutButton $ makeDumbSwitch i) $ \_ -> Just $ sps0 (PutDoor (dr & drTrigger .~ WdTrig i & drMounts .~ l) defaultDoorWall) & plIDCont . mapped . mapped ?~ sps0 (PutDoor (dr1 & drTrigger .~ WdTrig i & drMounts .~ (l & each . moPos . _xy %~ rotateV pi)) defaultDoorWall) + , psPtPl (spos (slinks West $ cardReverse iside) f') (lowBlock Stone (greyN 0.5) 10 $ rectWH 20 10) + , psPtPl (spos (slinks East $ cardReverse oside) f') (lowBlock Stone (greyN 0.5) 10 $ rectWH 20 10) ] <> crs where - slinks x s = (FromEdge x 0 `S.member` s) + dorot = \case + North -> id + _ -> fmap negate + slinks x y s = (FromEdge x 0 `S.member` s) && OnEdge y `S.member` s dr = defaultDoor & drUpdate .~ DoorLerp 0.005 & drZeroPos .~ (V2 (-5) 50, 0) @@ -220,12 +237,18 @@ pushCaverns = do & drOnePos .~ (V2 255 50, 0) & drZeroPos .~ (V2 105 50, 0) f ps = case ps of - PS _ r -> ps & psRot +~ pi & psPos +~ rotateV r (V2 0 (-5)) + PS _ r -> ps & psRot +~ pi & psPos +~ rotateV r (V2 0 5) _ -> ps - spos h = (rprBool (t' h) & psSelect . mapped . mapped . _Just . _1 %~ f) + f' ps = case ps of + PS _ r -> ps & psRot +~ pi & psPos +~ rotateV r (V2 0 10) + _ -> ps + spos h f'' = (rprBool (t' h) & psSelect . mapped . mapped . _Just . _1 %~ f'') t' h rp _ = case _rpType rp of UnusedLink s -> h s _ -> False + g = \case + North -> 0 + _ -> 100 slowCrush90 :: RandomGen g => State g Room diff --git a/tags b/tags index e1f1b0d95..0c5a7ae43 100644 --- a/tags +++ b/tags @@ -765,9 +765,9 @@ MiniGunFlare src/Dodge/Data/Muzzle.hs 32;" C ModIDID src/Dodge/Data/Modification.hs 21;" C ModIDTimerPoint3Bool src/Dodge/Data/Modification.hs 13;" C Modification src/Dodge/Data/Modification.hs 12;" t -MountedLight src/Dodge/Data/MountedObject.hs 12;" C -MountedObject src/Dodge/Data/MountedObject.hs 11;" t -MountedSPic src/Dodge/Data/MountedObject.hs 13;" C +MountedLight src/Dodge/Data/MountedObject.hs 14;" C +MountedObject src/Dodge/Data/MountedObject.hs 13;" t +MountedSPic src/Dodge/Data/MountedObject.hs 15;" C MouseAiming src/Dodge/Data/Input.hs 15;" C MouseContext src/Dodge/Data/Input.hs 13;" t MouseGameRotate src/Dodge/Data/Input.hs 29;" C @@ -1153,7 +1153,7 @@ SNIPERRIFLE src/Dodge/Data/Item/Combine.hs 162;" C SOUNDSENSOR src/Dodge/Data/Item/Combine.hs 81;" C SPEEDLEGS src/Dodge/Data/Item/Combine.hs 131;" C SPRING src/Dodge/Data/Item/Combine.hs 53;" C -SPic src/ShapePicture/Data.hs 7;" t +SPic src/ShapePicture/Data.hs 9;" t SQUARE src/Dodge/Data/GenParams.hs 18;" C SSBO src/Shader/Data.hs 96;" t SString src/ShortShow.hs 16;" C @@ -1709,7 +1709,6 @@ _creatureGroups src/Dodge/Data/LWorld.hs 96;" f _creatures src/Dodge/Data/LWorld.hs 95;" f _csLinks src/Dodge/Data/RoomCluster.hs 10;" f _currentArc src/Dodge/Data/Item/Params.hs 15;" f -_currentFoot src/Dodge/Data/Creature/Stance.hs 23;" f _cwGen src/Dodge/Data/CWorld.hs 25;" f _cwTiles src/Dodge/Data/CWorld.hs 27;" f _cwgGameRooms src/Dodge/Data/CWorld.hs 42;" f @@ -1827,6 +1826,7 @@ _flboStride src/Shader/Data.hs 88;" f _floorItems src/Dodge/Data/LWorld.hs 131;" f _floorShader src/Data/Preload/Render.hs 46;" f _floorVBO src/Data/Preload/Render.hs 45;" f +_footForward src/Dodge/Data/Creature/Stance.hs 23;" f _foreShapes src/Dodge/Data/LWorld.hs 136;" f _fsDir src/Dodge/Data/ForegroundShape.hs 14;" f _fsPos src/Dodge/Data/ForegroundShape.hs 13;" f @@ -2598,6 +2598,7 @@ andOrRegex src/Dodge/DisplayInventory.hs 78;" f angleBetween src/Geometry.hs 158;" f angleVV src/Geometry/Vector.hs 58;" f angleVV3 src/Geometry/Vector3D.hs 122;" f +angleVVTests test/Spec.hs 67;" f anyUnusedSpot src/Dodge/PlacementSpot.hs 68;" f anythingHitCirc src/Dodge/Base/Collide.hs 335;" f applyCME src/Dodge/HeldUse.hs 397;" f @@ -2635,7 +2636,7 @@ arcStepwise src/Geometry.hs 326;" f arcStepwisePositive src/Geometry.hs 340;" f arcTest src/Picture/Test.hs 9;" f arcTest' src/Picture/Test.hs 21;" f -argV src/Geometry/Vector.hs 81;" f +argV src/Geometry/Vector.hs 83;" f armourChaseCrit src/Dodge/Creature/ArmourChase.hs 34;" f armouredChasers src/Dodge/Room/Boss.hs 58;" f armouredCorridor src/Dodge/Room/RoadBlock.hs 20;" f @@ -2669,7 +2670,7 @@ axisInt src/Geometry/Intersect.hs 246;" f azure src/Color.hs 49;" f bQuadToF src/Geometry/Bezier.hs 37;" f bQuadToLine src/Geometry/Bezier.hs 30;" f -backPQ src/Dodge/Creature/HandPos.hs 132;" f +backPQ src/Dodge/Creature/HandPos.hs 124;" f backgroundSpaceS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 729;" f backpackCombinations src/Dodge/Combine/Combinations.hs 27;" f backpackShape src/Dodge/Item/Draw/SPic.hs 188;" f @@ -2786,10 +2787,11 @@ canSeeIndirect src/Dodge/Base/Collide.hs 328;" f canSpring src/Dodge/Update.hs 969;" 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 +card8Vec src/Dodge/Base/CardinalPoint.hs 24;" f cardList src/Dodge/Base/CardinalPoint.hs 7;" f -cardVec src/Dodge/Base/CardinalPoint.hs 10;" f -cardinalBetweenAdj src/Dodge/Base/CardinalPoint.hs 28;" f +cardReverse src/Dodge/Base/CardinalPoint.hs 10;" f +cardVec src/Dodge/Base/CardinalPoint.hs 17;" f +cardinalBetweenAdj src/Dodge/Base/CardinalPoint.hs 35;" f cardinalVectors src/Dodge/FloorItem.hs 24;" f cdtPropagateFold src/Dodge/DoubleTree.hs 189;" f ceilingTo src/Geometry/Zone.hs 15;" f @@ -2834,7 +2836,7 @@ checkWallLeft src/Dodge/LevelGen/StaticWalls/Deprecated.hs 29;" f checkWallRight src/Dodge/LevelGen/StaticWalls.hs 54;" f checkWallRight src/Dodge/LevelGen/StaticWalls/Deprecated.hs 59;" f chemFuelPouch src/Dodge/Item/Ammo.hs 81;" f -chestPQ src/Dodge/Creature/HandPos.hs 129;" f +chestPQ src/Dodge/Creature/HandPos.hs 121;" f 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 @@ -3171,7 +3173,7 @@ defaultVision src/Dodge/Default/Creature.hs 87;" f defaultWall src/Dodge/Default/Wall.hs 15;" f defaultWindow src/Dodge/Default/Wall.hs 54;" f defaultWorld src/Dodge/Default/World.hs 33;" f -degToRad src/Geometry/Vector.hs 118;" f +degToRad src/Geometry/Vector.hs 120;" f deleteIMInZone src/Dodge/Base.hs 70;" f deleteWallFromZones src/Dodge/Wall/Zone.hs 23;" f deleteWallID src/Dodge/Wall/Delete.hs 13;" f @@ -3190,7 +3192,7 @@ destroyMcType src/Dodge/Machine/Destroy.hs 22;" f destroyMount src/Dodge/Wall/Damage.hs 167;" f destroyMounts src/Dodge/Wall/Damage.hs 164;" f destroyProjectile src/Dodge/Projectile/Update.hs 112;" f -detV src/Geometry/Vector.hs 94;" f +detV src/Geometry/Vector.hs 96;" f detector src/Dodge/Item/Held/Utility.hs 27;" f detectorColor src/Dodge/Item/Draw/SPic.hs 433;" f detectorInfo src/Dodge/Item/Info.hs 224;" f @@ -3211,7 +3213,7 @@ displayFreeSlots src/Dodge/DisplayInventory.hs 196;" f displayIndents src/Dodge/DisplayInventory.hs 110;" f displayPulse src/Dodge/Inventory/SelectionList.hs 176;" f displayTerminalLineString src/Dodge/Update.hs 563;" f -dist src/Geometry/Vector.hs 185;" f +dist src/Geometry/Vector.hs 187;" f dist3 src/Geometry/Vector3D.hs 101;" f distributeAmmoToItem src/Dodge/WorldEffect.hs 149;" f distributeAmmoToYou src/Dodge/WorldEffect.hs 137;" f @@ -3251,7 +3253,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 31;" f +doDoorMount src/Dodge/Door.hs 32;" f doDrag src/Dodge/Update/Input/InGame.hs 129;" f doDrawing src/Dodge/Render.hs 33;" f doDrawing' src/Dodge/Render.hs 44;" f @@ -3295,9 +3297,9 @@ doWorldPos src/Dodge/WorldPos.hs 10;" f door src/Dodge/Room/Door.hs 14;" f doorBetween src/Dodge/Placement/Instance/Door.hs 34;" f doorCor src/Dodge/Room/Room.hs 400;" f -doorLerp src/Dodge/Door.hs 42;" f -doorLerpWithTimer src/Dodge/Door.hs 75;" f -dotV src/Geometry/Vector.hs 76;" f +doorLerp src/Dodge/Door.hs 43;" f +doorLerpWithTimer src/Dodge/Door.hs 76;" f +dotV src/Geometry/Vector.hs 78;" f dotV3 src/Geometry/Vector3D.hs 119;" f doubleCorridorBarrels src/Dodge/Room/Room.hs 291;" f doublePair src/Geometry.hs 162;" f @@ -3491,7 +3493,7 @@ equipInfo src/Dodge/Item/Info.hs 140;" f equipItemSPic src/Dodge/Item/Draw/SPic.hs 159;" f equipPosition src/Dodge/Item/Draw.hs 38;" f equipSiteInfo src/Dodge/Item/Info.hs 253;" f -equipSitePQ src/Dodge/Creature/HandPos.hs 27;" f +equipSitePQ src/Dodge/Creature/HandPos.hs 28;" f equipType src/Dodge/Data/EquipType.hs 10;" f equipmentDesignation src/Dodge/Inventory/RBList.hs 52;" f equipmentStrValue src/Dodge/Creature/Statistics.hs 56;" f @@ -3619,9 +3621,9 @@ generateLayout src/Dodge/Layout/Generate.hs 11;" f generateLevelFromRoomList src/Dodge/Layout.hs 37;" f generateWorldFromSeed src/Dodge/LevelGen.hs 18;" f geom src/Shader/Data.hs 110;" f -geometryQuickCheckTests test/Spec.hs 55;" f -geometryTests test/Spec.hs 17;" f -geometryUnitTests test/Spec.hs 22;" f +geometryQuickCheckTests test/Spec.hs 59;" f +geometryTests test/Spec.hs 19;" f +geometryUnitTests test/Spec.hs 25;" f geqConstr src/SameConstr.hs 21;" f getAimZoom src/Dodge/Update/Camera.hs 152;" f getAmmoLinks src/Dodge/Item/Grammar.hs 108;" f @@ -3714,7 +3716,7 @@ haltSound src/Dodge/SoundLogic.hs 38;" f hammerCheck src/Dodge/HeldUse.hs 67;" f handHandleOrient src/Dodge/Item/HeldOffset.hs 57;" f handOrient src/Dodge/Item/HeldOffset.hs 39;" f -handWalkingPos src/Dodge/Creature/HandPos.hs 40;" f +handWalkingPos src/Dodge/Creature/HandPos.hs 41;" f handleEvent src/Dodge/Event.hs 27;" f handleHotkeys src/Dodge/Creature/YourControl.hs 46;" f handleKeyboardEvent src/Dodge/Event/Input.hs 23;" f @@ -3722,7 +3724,7 @@ handleMouseButtonEvent src/Dodge/Event/Input.hs 59;" f handleMouseMotionEvent src/Dodge/Event/Input.hs 47;" f handleMouseWheelEvent src/Dodge/Event/Input.hs 54;" f handleOrient src/Dodge/Item/HeldOffset.hs 32;" f -handlePos src/Dodge/Item/HeldOffset.hs 78;" f +handlePos src/Dodge/Item/HeldOffset.hs 80;" f handleResizeEvent src/Dodge/Event.hs 53;" f handleTextInput src/Dodge/Event/Input.hs 19;" f handleWindowMoveEvent src/Dodge/Event.hs 44;" f @@ -3737,7 +3739,7 @@ head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 68;" f headLampShape src/Dodge/Item/Draw/SPic.hs 423;" f headMap src/Dodge/DoubleTree.hs 118;" f -headPQ src/Dodge/Creature/HandPos.hs 120;" f +headPQ src/Dodge/Creature/HandPos.hs 115;" f healS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 627;" f healthAnalyserByDoor src/Dodge/Room/LasTurret.hs 108;" f healthTest src/Dodge/Room/LasTurret.hs 130;" f @@ -3746,7 +3748,7 @@ heldAimStance src/Dodge/Item/AimStance.hs 27;" f heldAimZoom src/Dodge/Update/Camera.hs 158;" f heldEffect src/Dodge/HeldUse.hs 64;" f heldEffectMuzzles src/Dodge/HeldUse.hs 135;" f -heldHandlePos src/Dodge/Item/HeldOffset.hs 84;" f +heldHandlePos src/Dodge/Item/HeldOffset.hs 86;" f heldInfo src/Dodge/Item/Info.hs 92;" f heldItemAmmoSlots src/Dodge/Item/AmmoSlots.hs 20;" f heldItemBulkiness src/Dodge/Creature/YourControl.hs 194;" f @@ -4000,12 +4002,13 @@ leaveResetQuitTerminal src/Dodge/WorldEffect.hs 163;" f led src/Dodge/Item/Held/Utility.hs 23;" f left src/DoubleStack.hs 16;" f leftChildList src/Dodge/Item/Grammar.hs 193;" f -leftHandPQ src/Dodge/Creature/HandPos.hs 69;" f +leftHandPQ src/Dodge/Creature/HandPos.hs 72;" f leftIsParentCombine src/Dodge/Item/Grammar.hs 170;" f -leftLegPQ src/Dodge/Creature/HandPos.hs 85;" f leftPad src/Padding.hs 15;" f leftRightCombine src/Dodge/Item/Grammar.hs 205;" f -leftWristPQ src/Dodge/Creature/HandPos.hs 82;" f +leftWristPQ src/Dodge/Creature/HandPos.hs 85;" f +legPQ src/Dodge/Creature/HandPos.hs 91;" f +legPQ' src/Dodge/Creature/HandPos.hs 96;" f legsSPic src/Dodge/Item/Draw/SPic.hs 448;" f lerpP2A src/Dodge/ShiftPoint.hs 14;" f liShape src/Dodge/Placement/Instance/LightSource.hs 85;" f @@ -4085,7 +4088,7 @@ magAmmoParams src/Dodge/HeldUse.hs 957;" f magAmmoType src/Dodge/Item/MagAmmoType.hs 12;" f magMax src/Dodge/Item/MagAmmoType.hs 29;" f magShield src/Dodge/Item/Equipment.hs 26;" f -magV src/Geometry/Vector.hs 172;" f +magV src/Geometry/Vector.hs 174;" f magV3 src/Geometry/Vector3D.hs 78;" f magazineCombinations src/Dodge/Combine/Combinations.hs 43;" f magenta src/Color.hs 46;" f @@ -4241,6 +4244,7 @@ mntLSOn src/Dodge/Placement/Instance/LightSource.hs 36;" f mntLightLnkCond src/Dodge/Placement/Instance/LightSource.hs 128;" f mntLightLnkCond' src/Dodge/Placement/Instance/LightSource.hs 136;" f mntLightLnkShape src/Dodge/Placement/Instance/LightSource.hs 133;" f +moPos src/Dodge/Data/MountedObject.hs 18;" f modTo src/Geometry/Zone.hs 18;" f mouseClickOptionsList src/Dodge/Update/Input/ScreenLayer.hs 70;" f mouseCursorType src/Dodge/Render/Picture.hs 90;" f @@ -4293,7 +4297,7 @@ nearParallel src/Dodge/LevelGen/StaticWalls/Deprecated.hs 14;" f nearPoint src/Dodge/Zoning/Common.hs 8;" f nearRect src/Dodge/Zoning/Common.hs 16;" f nearSeg src/Dodge/Zoning/Common.hs 12;" f -nearZeroAngle src/Geometry/Vector.hs 138;" f +nearZeroAngle src/Geometry/Vector.hs 140;" f nearestAngleRep src/Geometry.hs 148;" f newExtraAwareness src/Dodge/Creature/Perception.hs 137;" f newKey src/IntMapHelp.hs 61;" f @@ -4311,7 +4315,7 @@ nonConvexChasm src/Dodge/Room/Tutorial.hs 260;" f nonCornerLinks src/Dodge/Room/SensorDoor.hs 53;" f normalGait src/Dodge/Creature/State/WalkCycle.hs 30;" f normalTo8 src/Shader/Poke.hs 466;" f -normalizeAngle src/Geometry/Vector.hs 128;" f +normalizeAngle src/Geometry/Vector.hs 130;" f normalizeAnglePi src/Dodge/Base.hs 154;" f normalizeColor src/Color.hs 103;" f normalizeV src/Geometry/Vector.hs 44;" f @@ -4538,7 +4542,7 @@ printPoint src/Dodge/Debug/Picture.hs 35;" f printRotPoint src/Dodge/Debug/Picture.hs 38;" f prismBox src/Shape.hs 74;" f prismPoly src/Shape.hs 60;" f -projV src/Geometry/Vector.hs 177;" f +projV src/Geometry/Vector.hs 179;" f propSPic src/Dodge/Prop/Draw.hs 22;" f propagateOrientation src/Dodge/Item/Orientation.hs 92;" f ps0 src/Dodge/LevelGen/PlacementHelper.hs 52;" f @@ -4598,7 +4602,7 @@ qz src/Quaternion.hs 67;" f rLauncher src/Dodge/Item/Held/Launcher.hs 14;" f rLauncherX src/Dodge/Item/Held/Launcher.hs 30;" f rToOnward src/Dodge/Cleat.hs 21;" f -radToDeg src/Geometry/Vector.hs 123;" f +radToDeg src/Geometry/Vector.hs 125;" f radiusSpring src/Dodge/Update.hs 953;" f randBlockBreakWeapon src/Dodge/Item/Random.hs 7;" f randC1 src/Dodge/Placement/Instance/Creature.hs 8;" f @@ -4658,7 +4662,7 @@ reflVelWallDamp src/Dodge/Base/Wall.hs 20;" f reflWall src/Dodge/Base/Wall.hs 16;" f reflectAngle src/Geometry.hs 142;" f reflectIn src/Geometry.hs 136;" f -reflectInNormal src/Geometry/Vector.hs 217;" f +reflectInNormal src/Geometry/Vector.hs 219;" f reflectInParam src/Geometry.hs 230;" f reflectLaserAlong src/Dodge/Item/Weapon/LaserPath.hs 20;" f reflectPulseLaserAlong src/Dodge/Item/Weapon/LaserPath.hs 65;" f @@ -4724,12 +4728,11 @@ rhombus src/Polyhedra.hs 69;" f rifle src/Dodge/Item/Held/Cane.hs 19;" f right src/DoubleStack.hs 16;" f rightChildList src/Dodge/Item/Grammar.hs 199;" f -rightHandPQ src/Dodge/Creature/HandPos.hs 56;" f +rightHandPQ src/Dodge/Creature/HandPos.hs 59;" f rightIsParentCombine src/Dodge/Item/Grammar.hs 181;" f -rightLegPQ src/Dodge/Creature/HandPos.hs 103;" f rightPad src/Padding.hs 19;" f rightPadNoSquash src/Padding.hs 23;" f -rightWristPQ src/Dodge/Creature/HandPos.hs 66;" f +rightWristPQ src/Dodge/Creature/HandPos.hs 69;" f rlPosDir src/Dodge/RoomLink.hs 112;" f rlauncherPic src/Dodge/Item/Draw/SPic.hs 399;" f rmInLinks src/Dodge/RoomLink.hs 153;" f @@ -4775,8 +4778,8 @@ rotateTo src/Polyhedra/Geodesic.hs 65;" f rotateTo8 src/Dodge/Update/Camera/Rotate.hs 6;" f rotateToOverlappingWall src/Dodge/Update/Camera.hs 219;" f rotateToZ src/Quaternion.hs 35;" f -rotateV src/Geometry/Vector.hs 106;" f -rotateVAround src/Geometry/Vector.hs 113;" f +rotateV src/Geometry/Vector.hs 108;" f +rotateVAround src/Geometry/Vector.hs 115;" f rotateXY src/Polyhedra.hs 28;" f roundPoint2 src/Geometry/Intersect.hs 235;" f roundTank src/Dodge/Placement/Instance/Tank.hs 26;" f @@ -4791,15 +4794,15 @@ rsObjectColor src/Dodge/RadarSweep/Draw.hs 34;" f runPastStart src/Dodge/Room/Start.hs 73;" f runStateWorld src/Dodge/Randify.hs 18;" f sPS src/Dodge/LevelGen/PlacementHelper.hs 27;" f -safeAngleVV src/Geometry/Vector.hs 69;" f -safeArgV src/Geometry/Vector.hs 88;" f +safeAngleVV src/Geometry/Vector.hs 71;" f +safeArgV src/Geometry/Vector.hs 90;" f safeHead src/ListHelp.hs 68;" f safeMinMaybeL src/FoldableHelp.hs 48;" f safeMinimumOn src/FoldableHelp.hs 26;" f 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 +safeNormalizeV src/Geometry/Vector.hs 167;" f safeSwapKeys src/IntMapHelp.hs 78;" f safeUncons src/ListHelp.hs 73;" f safeUpdateSingleNode src/TreeHelp.hs 116;" f @@ -5013,10 +5016,10 @@ 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 -slowCrush90 src/Dodge/Room/LongDoor.hs 229;" f +slowCrush90 src/Dodge/Room/LongDoor.hs 236;" f slowCrushRoom src/Dodge/Room/LongDoor.hs 145;" f -slowDoorRoom src/Dodge/Room/LongDoor.hs 275;" f -slowDoorRoomRunPast src/Dodge/Room/LongDoor.hs 292;" f +slowDoorRoom src/Dodge/Room/LongDoor.hs 282;" f +slowDoorRoomRunPast src/Dodge/Room/LongDoor.hs 299;" 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 @@ -5052,6 +5055,7 @@ 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 +spPos src/ShapePicture/Data.hs 11;" f spaceAction src/Dodge/Update/Input/InGame.hs 504;" f spanColLightBlackI src/Dodge/Placement/Instance/LightSource.hs 161;" f spanColLightI src/Dodge/Placement/Instance/LightSource.hs 154;" f @@ -5086,7 +5090,7 @@ sqSpitChasm src/Dodge/Room/Tutorial.hs 240;" f square src/Geometry/Polygon.hs 56;" f squareDecoration src/Dodge/Placement/TopDecoration.hs 48;" f squashIntersectCirclePoint src/Dodge/WallCreatureCollisions.hs 119;" f -squashNormalizeV src/Geometry/Vector.hs 158;" f +squashNormalizeV src/Geometry/Vector.hs 160;" f ssLookupDown src/Dodge/SelectionSections.hs 96;" f ssLookupGE' src/Dodge/SelectionSections.hs 150;" f ssLookupGT src/Dodge/SelectionSections.hs 137;" f @@ -5299,8 +5303,8 @@ translate3 src/Picture/Base.hs 112;" f translateFloatingCamera src/Dodge/Update/Camera.hs 50;" f translateFloatingCameraKeys src/Dodge/Update/Camera.hs 68;" f translateH src/Picture/Base.hs 104;" f -translatePointToLeftHand src/Dodge/Creature/HandPos.hs 76;" f -translatePointToRightHand src/Dodge/Creature/HandPos.hs 37;" f +translatePointToLeftHand src/Dodge/Creature/HandPos.hs 79;" f +translatePointToRightHand src/Dodge/Creature/HandPos.hs 38;" f translateSH src/Shape.hs 242;" f translateSHxy src/Shape.hs 246;" f translateSHz src/Shape.hs 250;" f @@ -5308,11 +5312,11 @@ translateSP src/ShapePicture.hs 53;" f translateSPxy src/ShapePicture.hs 45;" f translateSPz src/ShapePicture.hs 49;" f translateScreenPos src/Dodge/ScreenPos.hs 12;" f -translateToES src/Dodge/Creature/HandPos.hs 24;" f -translateToLeftHand src/Dodge/Creature/HandPos.hs 79;" f -translateToLeftLeg src/Dodge/Creature/HandPos.hs 100;" f -translateToRightHand src/Dodge/Creature/HandPos.hs 63;" f -translateToRightLeg src/Dodge/Creature/HandPos.hs 117;" f +translateToES src/Dodge/Creature/HandPos.hs 25;" f +translateToLeftHand src/Dodge/Creature/HandPos.hs 82;" f +translateToLeftLeg src/Dodge/Creature/HandPos.hs 88;" f +translateToRightHand src/Dodge/Creature/HandPos.hs 66;" f +translateToRightLeg src/Dodge/Creature/HandPos.hs 112;" f translateXY src/Polyhedra.hs 23;" f trapTBH src/Geometry/Polygon.hs 22;" f trapezionBWHW src/Geometry/Polygon.hs 34;" f @@ -5357,12 +5361,12 @@ tutLight src/Dodge/Room/Tutorial.hs 380;" f tutRezBox src/Dodge/Room/Tutorial.hs 525;" f tutRoomTree src/Dodge/Floor.hs 20;" f tutorialMessage1 src/Dodge/Room/Tutorial.hs 550;" f -tweenAngles src/Geometry/Vector.hs 190;" f +tweenAngles src/Geometry/Vector.hs 192;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 80;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 36;" 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 +twoFlatHRot src/Dodge/Item/HeldOffset.hs 77;" f twoHandTwistAmount src/Dodge/Creature/YourControl.hs 166;" f twoRoomPoss src/Dodge/PlacementSpot.hs 148;" f twoStep1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 519;" f @@ -5374,7 +5378,7 @@ uncurryV src/Geometry/Data.hs 66;" f underBarrelSlot src/Dodge/Item/Scope.hs 176;" f unfoldrMID src/MonadHelp.hs 33;" f unigate src/Dodge/Item/Scope.hs 108;" f -unitVectorAtAngle src/Geometry/Vector.hs 101;" f +unitVectorAtAngle src/Geometry/Vector.hs 103;" f unlockInv src/Dodge/Inventory/Lock.hs 12;" f unpause src/Dodge/Menu.hs 205;" f unsafeBlinkAction src/Dodge/Creature/Action/Blink.hs 59;" f @@ -5551,8 +5555,8 @@ 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 154;" f -vNormal src/Geometry/Vector.hs 149;" f +vInverse src/Geometry/Vector.hs 156;" f +vNormal src/Geometry/Vector.hs 151;" f vNormaly src/Geometry/Vector3D.hs 72;" f vShape src/Dodge/Placement/Instance/LightSource.hs 99;" f vToL src/MatrixHelper.hs 56;" f @@ -5664,11 +5668,11 @@ xCylinder src/Shape.hs 133;" f xCylinderST src/Shape.hs 130;" f xIntercepts src/Dodge/Zoning/Base.hs 66;" f xSwitch src/Dodge/Room/Airlock.hs 32;" f -xV2 src/Geometry/Vector.hs 201;" f -xyV3 src/Geometry/Vector.hs 213;" f -xyzV4 src/Geometry/Vector.hs 209;" f +xV2 src/Geometry/Vector.hs 203;" f +xyV3 src/Geometry/Vector.hs 215;" f +xyzV4 src/Geometry/Vector.hs 211;" f yIntercepts src/Dodge/Zoning/Base.hs 78;" f -yV2 src/Geometry/Vector.hs 205;" f +yV2 src/Geometry/Vector.hs 207;" f yellow src/Color.hs 44;" f you src/Dodge/Base/You.hs 13;" f youDropItem src/Dodge/Creature/Action.hs 177;" f