From 3b75ab73aa905c74d862c218d9a9ca2967f3dc27 Mon Sep 17 00:00:00 2001 From: justin Date: Thu, 3 Oct 2024 10:08:13 +0100 Subject: [PATCH] Cleanup code for your control --- ghcidOutput | 2 +- src/Dodge/Creature/State.hs | 73 +++++++++------ src/Dodge/Creature/YourControl.hs | 93 +++++-------------- tags | 147 +++++++++++++++--------------- 4 files changed, 141 insertions(+), 174 deletions(-) diff --git a/ghcidOutput b/ghcidOutput index 858c74d87..d6c458305 100644 --- a/ghcidOutput +++ b/ghcidOutput @@ -1 +1 @@ -All good (602 modules, at 23:49:54) +All good (602 modules, at 10:06:36) diff --git a/src/Dodge/Creature/State.hs b/src/Dodge/Creature/State.hs index f59ee0996..713d8384a 100644 --- a/src/Dodge/Creature/State.hs +++ b/src/Dodge/Creature/State.hs @@ -3,7 +3,6 @@ module Dodge.Creature.State ( doDamage, ) where -import Dodge.LightSource import qualified Data.Map.Strict as M import Data.Maybe import Data.Monoid @@ -24,6 +23,7 @@ import Dodge.Hammer import Dodge.ItEffect import Dodge.Item.Grammar import Dodge.Item.HeldOffset +import Dodge.LightSource import Dodge.Prop.Gib import Dodge.SoundLogic --import Dodge.WorldEvent.Flash @@ -73,9 +73,11 @@ stateUpdate f = checkDeath :: Creature -> World -> World checkDeath cr w - | _crHP cr > 0 = w + | _crHP cr > 0 = + w & cWorld . lWorld . creatures . ix (_crID cr) . crState . csDamage .~ [] - | otherwise = w + | otherwise = + w & dropByState cr & removecr & stopSoundFrom (CrWeaponSound (_crID cr) 0) @@ -192,26 +194,27 @@ chainLinkOrientation mo par (ILink lt f) child = (p + Q.rotate q p1, q * q1) (p, q) = mo (p1, q1) = f par lt child -updateItemWithOrientation :: Creature -> (Point3, Q.Quaternion Float) - -> LabelDoubleTree ItemLink Item - -> World -> World +updateItemWithOrientation :: + Creature -> + (Point3, Q.Quaternion Float) -> + LabelDoubleTree ItemLink Item -> + World -> + World updateItemWithOrientation cr m itmtree = case _itType itm of HELD TORCH -> shineTorch cr itmtree m _ -> id where itm = itmtree ^. ldtValue - - shineTorch :: Creature -> LabelDoubleTree ItemLink Item -> (Point3, Q.Quaternion Float) -> World -> World -shineTorch cr itmtree (p,q) = fromMaybe id $ do - (_,mag) <- find (isammolink . _iatType . fst) (itmtree ^. ldtLeft) +shineTorch cr itmtree (p, q) = fromMaybe id $ do + (_, mag) <- find (isammolink . _iatType . fst) (itmtree ^. ldtLeft) i <- mag ^? ldtValue . itUse . amagLoadStatus . iaLoaded guard $ i >= x invid <- mag ^? ldtValue . itLocation . ilInvID return $ (cWorld . lWorld . tempLightSources .:~ tlsTimeRadColPos 1 250 0.7 pos'') - . (cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix invid . itUse . amagLoadStatus . iaLoaded -~ x) + . (cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix invid . itUse . amagLoadStatus . iaLoaded -~ x) where x = 10 isammolink AmmoInLink{} = True @@ -219,39 +222,49 @@ shineTorch cr itmtree (p,q) = fromMaybe id $ do pos = (_crPos cr `v2z` 0 + rotate3 cdir p) pos'' = pos + rotate3 d (V3 8 0 1.5) cdir = _crDir cr - a = argV (Q.qToV2 q) - d = _crDir cr + a + d = _crDir cr + argV (Q.qToV2 q) itemInvSideEffect :: Creature -> Item -> World -> World itemInvSideEffect cr itm = case _itType itm of TARGETING tt -> updateItemTargeting tt cr itm _ -> id +-- this probably needs to be set to null when dropped as well? updateItemTargeting :: TargetingType -> Creature -> Item -> World -> World updateItemTargeting tt cr itm w = case tt of - _ | not isattached -> w - & pointItUse . tgPos .~ Nothing - & pointItUse . tgActive .~ False - TARGETLASER | crIsAiming cr -> w - & cWorld . lWorld . lasers .:~ LaserStart + _ + | not isattached -> + w + & pointItUse . tgPos .~ Nothing + & pointItUse . tgActive .~ False + TARGETLASER + | crIsAiming cr -> + w + & cWorld . lWorld . lasers + .:~ LaserStart { _lpPhaseV = 1 , _lpDir = _crDir cr , _lpPos = sp , _lpColor = col , _lpType = TargetingLaser (_itID itm) } - TARGETLASER -> w & pointItUse . tgPos .~ Nothing - TargetRBPress | rbpressed -> w - & pointItUse . tgPos %~ maybe (Just $ mouseWorldPos (w ^. input) (w ^. wCam)) Just - & pointItUse . tgActive .~ True - TargetRBPress -> w + TARGETLASER -> w & pointItUse . tgPos .~ Nothing + TargetRBPress + | rbpressed -> + w + & pointItUse . tgPos %~ maybe (Just $ mouseWorldPos (w ^. input) (w ^. wCam)) Just + & pointItUse . tgActive .~ True + TargetRBPress -> + w & pointItUse . tgPos .~ Nothing & pointItUse . tgActive .~ False - TargetRBCreature -> w & pointItUse %~ setRBCreatureTargeting cr w - TargetCursor -> w & pointItUse .~ TargetingUse - (Just (mouseWorldPos (w ^. input) (w ^. wCam))) - Nothing - True + TargetRBCreature -> w & pointItUse %~ setRBCreatureTargeting cr w + TargetCursor -> + w & pointItUse + .~ TargetingUse + (Just (mouseWorldPos (w ^. input) (w ^. wCam))) + Nothing + True where pointItUse = cWorld . lWorld . creatures . ix cid . crInv . ix invid . itUse cid = _crID cr @@ -264,7 +277,8 @@ updateItemTargeting tt cr itm w = case tt of setRBCreatureTargeting :: Creature -> World -> ItemUse -> ItemUse setRBCreatureTargeting cr w ituse | SDL.ButtonRight `M.member` _mouseButtons (_input w) && isJust (ituse ^? tgID . _Just) - && canSeeTarget = ituse & updatePos & tgActive .~ True + && canSeeTarget = + ituse & updatePos & tgActive .~ True | otherwise = ituse & tgID .~ fmap _crID newtarg & updatePos & tgActive .~ False where newtarg = @@ -292,7 +306,6 @@ useUpdate = . (heldDelay . warmTime %~ decreaseToZero) . (heldDelay . rateTime %~ decreaseToZero) - updateAutoRecharge :: Item -> Item updateAutoRecharge it = case it ^? itUse . leftConsumption of Just (AutoRecharging l m t p) diff --git a/src/Dodge/Creature/YourControl.hs b/src/Dodge/Creature/YourControl.hs index 9ce46ce62..6e8d695c6 100644 --- a/src/Dodge/Creature/YourControl.hs +++ b/src/Dodge/Creature/YourControl.hs @@ -20,15 +20,14 @@ import qualified SDL -- | The AI equivalent for your control. yourControl :: Creature -> World -> World -yourControl cr w +yourControl _ w | inInputFocus w = w | not intopinv = - w & cWorld . lWorld . creatures . ix (_crID cr) - %~ wasdWithAiming w (_mvSpeed $ _crMvType cr) + w & cWorld . lWorld . creatures . ix 0 %~ wasdWithAiming w | otherwise = w - & cWorld . lWorld . creatures . ix (_crID cr) - %~ (wasdWithAiming w (_mvSpeed $ _crMvType cr) . mouseActionsCr (_mouseButtons (_input w))) + & cWorld . lWorld . creatures . ix 0 + %~ (wasdWithAiming w . mouseActionsCr (w ^. input . mouseButtons)) & pressedMBEffectsTopInventory pkeys & handleHotkeys where @@ -91,88 +90,43 @@ tryAssignHotkey w sc = fromMaybe w $ do itid <- cr ^? crManipulation . manObject . imSelectedItem return $ w & cWorld . lWorld . creatures . ix 0 %~ assignHotkey itid (scancodeToHotkey sc) -{- | Turn key presses into creature movement. - | note the order of operation, setting the posture first--this prevents the twist fire bug +{- | The order of these MAY be important, in particular the setting of crMvAim + within wasdMovement should probably be done first -} ---wasdWithAiming :: --- World -> --- -- | Base speed --- Float -> --- Creature -> --- Creature ---wasdWithAiming w speed cr --- | isAiming = addAnyTwist $ aimTurn mouseDir $ theMovement $ setMvAim cr --- | crIsReloading cr && SDL.ButtonRight `M.member` _mouseButtons (_input w) = --- aimTurn mouseDir $ removeTwist $ theMovement $ setMvAim cr --- | otherwise = theMovement $ theTurn $ removeTwist $ setMvAim cr --- where --- setMvAim = maybe id (crMvAim .~) dir --- twistamount = 1.6 --- removeTwist cr' = --- cr' --- & crDir +~ _crTwist cr' --- & crTwist .~ 0 --- addAnyTwist = fromMaybe id $ do --- itRef <- cr ^? crManipulation . manObject . inInventory . ispItem --- astance <- cr ^? crInv . ix itRef . itUse . heldAim . aimStance --- case (astance, cr ^. crTwist) of --- (TwoHandUnder, 0) -> --- return $ (crTwist .~ twistamount * pi) . (crDir -~ twistamount * pi) --- (TwoHandOver, 0) -> --- return $ (crTwist .~ twistamount * pi) . (crDir -~ twistamount * pi) --- _ -> Nothing --- theMovement --- | movDir == V2 0 0 = id --- | otherwise = crMvAbsolute (speed *.* movAbs) --- theTurn cr' = creatureTurnTowardDir (_crMvAim cr') 0.2 cr' --- movDir = wasdDir (w ^. input) --- dir = fmap ((w ^. wCam . camRot) +) (safeArgV movDir) --- movAbs = rotateV (w ^. wCam . camRot) $ normalizeV movDir --- isAiming = _posture (_crStance cr) == Aiming --- mouseDir = argV $ mouseWorldPos (w ^. input) (w ^. wCam) - (cr ^. crPos) - --- | The order of these MAY be important, in particular the setting of crMvAim --- within wasdMovement should probably be done first wasdWithAiming :: World -> - -- | Base speed - Float -> Creature -> Creature -wasdWithAiming w speed = wasdAim inp cam . wasdTwist . wasdMovement inp cam speed +wasdWithAiming w cr = wasdAim inp cam . wasdTwist $ wasdMovement inp cam speed cr where + speed = _mvSpeed $ _crMvType cr inp = w ^. input cam = w ^. wCam wasdAim :: Input -> Camera -> Creature -> Creature wasdAim inp cam cr | SDL.ButtonRight `M.member` _mouseButtons inp = aimTurn mouseDir cr - | otherwise = theTurn cr + | otherwise = creatureTurnTowardDir (_crMvAim cr) 0.2 cr where - theTurn cr' = creatureTurnTowardDir (_crMvAim cr') 0.2 cr' mouseDir = argV $ mouseWorldPos inp cam - (cr ^. crPos) -- aim with the root item wasdTwist :: Creature -> Creature wasdTwist cr - | _posture (_crStance cr) == Aiming = addAnyTwist cr - | otherwise = removeTwist cr - where - twistamount = 1.6 - removeTwist cr' = - cr' - & crDir +~ _crTwist cr' - & crTwist .~ 0 - addAnyTwist = fromMaybe id $ do + | _posture (_crStance cr) == Aiming = fromMaybe cr $ do itRef <- cr ^? crManipulation . manObject . imRootItem astance <- cr ^? crInv . ix itRef . itUse . heldAim . aimStance case (astance, cr ^. crTwist) of (TwoHandUnder, 0) -> - return $ (crTwist .~ twistamount * pi) . (crDir -~ twistamount * pi) + return $ cr & crTwist .~ twistamount * pi & crDir -~ twistamount * pi (TwoHandOver, 0) -> - return $ (crTwist .~ twistamount * pi) . (crDir -~ twistamount * pi) + return $ cr & crTwist .~ twistamount * pi & crDir -~ twistamount * pi _ -> Nothing - + | otherwise = cr + & crDir +~ _crTwist cr + & crTwist .~ 0 --remove twistk + where + twistamount = 1.6 wasdMovement :: Input -> Camera -> Float -> Creature -> Creature wasdMovement inp cam speed = theMovement . setMvAim @@ -193,11 +147,14 @@ aimTurn a cr = creatureTurnTowardDir a (x * 0.2) cr itRef <- cr ^? crManipulation . manObject . imRootItem cr ^? crInv . ix itRef . itUse . heldAim . aimTurnSpeed --- | Set posture according to mouse presses. +{- | Set posture according to mouse presses. + (should you be aiming without a selected item?) +-} mouseActionsCr :: M.Map SDL.MouseButton Int -> Creature -> Creature -mouseActionsCr pkeys cr - | SDL.ButtonRight `M.member` pkeys = cr & crStance . posture .~ Aiming - | otherwise = cr & crStance . posture .~ AtEase +mouseActionsCr pkeys + | SDL.ButtonRight `M.member` pkeys = crStance . posture .~ Aiming + | otherwise = crStance . posture .~ AtEase + -- where -- noaction = fromMaybe True $ do -- theaction <- cr ^? crManipulation . manObject . inInventory . iselAction @@ -210,7 +167,7 @@ pressedMBEffectsTopInventory pkeys w | isDown SDL.ButtonMiddle = w & wCam . camRot -~ rotation | otherwise = w where - youhammerdown = set (cWorld . lWorld . creatures . ix 0 . crHammerPosition) HammerDown + youhammerdown = set (cWorld . lWorld . creatures . ix 0 . crHammerPosition) HammerDown inTopInv = case w ^. hud . hudElement of DisplayInventory{_subInventory = NoSubInventory} -> True _ -> False diff --git a/tags b/tags index fe46cfdfd..be5ca7a33 100644 --- a/tags +++ b/tags @@ -412,9 +412,8 @@ Create src/Dodge/Projectile/Create.hs 1;" m Create src/Dodge/Prop/Create.hs 1;" m Create src/Dodge/Wall/Create.hs 1;" m CreateFlame src/Dodge/Data/Item/Use/Consumption/Ammo.hs 54;" C -CreateHeldLight src/Dodge/Data/Item/Effect.hs 25;" C CreatePoisonGas src/Dodge/Data/Item/Use/Consumption/Ammo.hs 54;" C -CreateShieldWall src/Dodge/Data/Item/Effect.hs 26;" C +CreateShieldWall src/Dodge/Data/Item/Effect.hs 25;" C Creature src/Dodge/Data/Creature.hs 38;" t Creature src/Dodge/Creature.hs 1;" m Creature src/Dodge/Data/Creature.hs 7;" m @@ -620,8 +619,8 @@ Effect src/Dodge/Data/Item/Effect.hs 6;" m Effect src/Dodge/Default/Item/Effect.hs 1;" m EffectArguments src/Dodge/Data/Terminal.hs 92;" t EffectRootNotroot src/Dodge/Data/Item/Effect.hs 24;" C -EffectWhileAttached src/Dodge/Data/Item/Effect.hs 29;" C -EffectWhileRoot src/Dodge/Data/Item/Effect.hs 28;" C +EffectWhileAttached src/Dodge/Data/Item/Effect.hs 28;" C +EffectWhileRoot src/Dodge/Data/Item/Effect.hs 27;" C EighthRes src/Dodge/Data/Config.hs 95;" C Eldritch src/Dodge/Data/Scenario.hs 34;" C ElectricalAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 43;" C @@ -932,10 +931,9 @@ ItAmount src/Dodge/Data/Item/Use/Consumption.hs 39;" t ItCrWdId src/Dodge/Data/WorldEffect.hs 19;" C ItCrWdItemEffect src/Dodge/Data/WorldEffect.hs 20;" C ItCrWdWd src/Dodge/Data/WorldEffect.hs 18;" t -ItDropEffect src/Dodge/Data/Item/Effect.hs 35;" t +ItDropEffect src/Dodge/Data/Item/Effect.hs 31;" t ItEffect src/Dodge/Data/Item/Effect.hs 12;" t ItEffect src/Dodge/ItEffect.hs 1;" m -ItFloorEffect src/Dodge/Data/Item/Effect.hs 32;" t ItID src/Dodge/Data/Item.hs 29;" t ItInvEffect src/Dodge/Data/Item/Effect.hs 19;" t ItZoom src/Dodge/Data/Item/Use.hs 188;" t @@ -970,7 +968,7 @@ LBlink src/Dodge/Data/Item/HeldUse.hs 53;" C LBoost src/Dodge/Data/Item/HeldUse.hs 55;" C LDT src/Dodge/Data/DoubleTree.hs 39;" C LDTBottomNode src/Dodge/Data/DoubleTree.hs 27;" C -LDTComb src/Dodge/Item/Grammar.hs 88;" t +LDTComb src/Dodge/Item/Grammar.hs 87;" t LDTMidAboveNode src/Dodge/Data/DoubleTree.hs 25;" C LDTMidBelowNode src/Dodge/Data/DoubleTree.hs 26;" C LDTRootNode src/Dodge/Data/DoubleTree.hs 23;" C @@ -1239,11 +1237,10 @@ NoCursor src/Dodge/Data/SelectionList.hs 72;" C NoDamageEffect src/Dodge/Data/Damage.hs 29;" C NoDebugInfo src/Dodge/Data/Universe.hs 54;" C NoDelay src/Dodge/Data/Item/HeldDelay.hs 14;" C -NoDropEffect src/Dodge/Data/Item/Effect.hs 35;" C +NoDropEffect src/Dodge/Data/Item/Effect.hs 31;" C NoEquipParams src/Dodge/Data/Item/Use/Equipment.hs 29;" C NoEscapeMenuOption src/Dodge/Data/Universe.hs 75;" C NoFaction src/Dodge/Data/Creature/State.hs 40;" C -NoFloorEffect src/Dodge/Data/Item/Effect.hs 32;" C NoHammer src/Dodge/Data/Hammer.hs 13;" C NoHoming src/Dodge/Data/Item/Use/Consumption/Ammo.hs 24;" C NoIntImp src/Dodge/Data/CreatureEffect.hs 20;" C @@ -1561,7 +1558,7 @@ RemoteDirectionPU src/Dodge/Data/Item/Use/Consumption/Ammo.hs 32;" C RemoteScreenLink src/Dodge/Data/ComposedItem.hs 24;" C RemoteScreenSF src/Dodge/Data/ComposedItem.hs 34;" C RemoveEquipment src/Dodge/Data/RightButtonOptions.hs 36;" C -RemoveShieldWall src/Dodge/Data/Item/Effect.hs 27;" C +RemoveShieldWall src/Dodge/Data/Item/Effect.hs 26;" C Remove_LOS src/Dodge/Data/Config.hs 77;" C Render src/Data/Preload/Render.hs 5;" m Render src/Dodge/Render.hs 2;" m @@ -3435,7 +3432,7 @@ baseBlockPane src/Dodge/Placement/Instance/Wall.hs 86;" f baseCaneShape src/Dodge/Item/Draw/SPic.hs 255;" f baseDebris src/Dodge/Block/Debris.hs 122;" f baseFloorTileSize src/Tile.hs 38;" f -basePartiallyComposedItem' src/Dodge/Item/Grammar.hs 85;" f +basePartiallyComposedItem' src/Dodge/Item/Grammar.hs 84;" f baseRifleShape src/Dodge/Item/Draw/SPic.hs 258;" f baseRodShape src/Dodge/Item/Draw/SPic.hs 342;" f baseSMGShape src/Dodge/Item/Draw/SPic.hs 325;" f @@ -3545,8 +3542,8 @@ changeSwapSel src/Dodge/Inventory.hs 222;" f changeSwapWith src/Dodge/Inventory.hs 281;" f charToTuple src/Picture/Base.hs 317;" f charToTupleGrad src/Picture/Text.hs 18;" f -chargeIfEquipped src/Dodge/ItEffect.hs 57;" f -chargeIfInInventory src/Dodge/ItEffect.hs 49;" f +chargeIfEquipped src/Dodge/ItEffect.hs 54;" f +chargeIfInInventory src/Dodge/ItEffect.hs 46;" f chartreuse src/Color.hs 24;" f chaseCrit src/Dodge/Creature/ChaseCrit.hs 33;" f chaseCritAwarenessUpdate src/Dodge/Creature/Perception.hs 69;" f @@ -3554,7 +3551,7 @@ chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 112;" f chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 30;" f chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 46;" f checkBlockHP src/Dodge/Block.hs 46;" f -checkDeath src/Dodge/Creature/State.hs 76;" f +checkDeath src/Dodge/Creature/State.hs 74;" f checkEndGame src/Dodge/Update.hs 584;" f checkErrorGL src/Shader/Compile.hs 255;" f checkFBO src/Framebuffer/Check.hs 6;" f @@ -3593,7 +3590,7 @@ cleatLabel src/Dodge/Cleat.hs 30;" f cleatOnward src/Dodge/Cleat.hs 24;" f cleatSide src/Dodge/Cleat.hs 27;" f click1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 414;" f -clickDetector src/Dodge/Item/Held/Utility.hs 37;" f +clickDetector src/Dodge/Item/Held/Utility.hs 36;" f clickGetCreature src/Dodge/Debug.hs 82;" f clipV src/Geometry/Vector.hs 47;" f clipZoom src/Dodge/Update/Camera.hs 219;" f @@ -3710,7 +3707,6 @@ createFlIt src/Dodge/Placement/PlaceSpot.hs 178;" f createForceField src/Dodge/ForceField.hs 7;" f createGas src/Dodge/Gas.hs 8;" f createHeadLamp src/Dodge/Euse.hs 159;" f -createHeldLight src/Dodge/ItEffect.hs 67;" f createItemYou src/Dodge/Inventory/Add.hs 77;" f createLightMap src/Render.hs 26;" f createNewArc src/Dodge/Tesla/Arc.hs 76;" f @@ -3829,7 +3825,7 @@ defDamageMaterial src/Dodge/Material/Damage.hs 17;" f defLSPic src/Dodge/LightSource/Draw.hs 11;" f defSPic src/Dodge/Item/Draw/SPic.hs 241;" f defaultAimMvType src/Dodge/Default/Creature.hs 122;" f -defaultAimParams src/Dodge/Default/Item/Use/AimParams.hs 6;" f +defaultAimParams src/Dodge/Default/Item/Use/AimParams.hs 9;" f defaultAimingCrit src/Dodge/Default/Creature.hs 131;" f defaultApplyDamage src/Dodge/Creature/Damage.hs 20;" f defaultArcStep src/Dodge/Tesla/Arc/Default.hs 15;" f @@ -3839,7 +3835,7 @@ defaultBangCane src/Dodge/Item/Held/Cane.hs 19;" f defaultBlock src/Dodge/Default/Block.hs 5;" f defaultBounds src/Dodge/Data/Bounds.hs 20;" f defaultBullet src/Dodge/Item/Weapon/Bullet.hs 10;" f -defaultBulletWeapon src/Dodge/Default/Item.hs 43;" f +defaultBulletWeapon src/Dodge/Default/Item.hs 41;" f defaultButton src/Dodge/Default.hs 51;" f defaultCOSection src/Dodge/Default/World.hs 204;" f defaultCWCam src/Dodge/Default/World.hs 65;" f @@ -3848,9 +3844,9 @@ defaultCWorld src/Dodge/Default/World.hs 80;" f defaultChaseMvType src/Dodge/Default/Creature.hs 113;" f defaultClusterStatus src/Dodge/Default/Room.hs 38;" f defaultConfig src/Dodge/Data/Config.hs 125;" f -defaultConsumable src/Dodge/Default/Item.hs 48;" f +defaultConsumable src/Dodge/Default/Item.hs 46;" f defaultCorpse src/Dodge/Corpse/Make.hs 29;" f -defaultCraftItem src/Dodge/Default/Item.hs 37;" f +defaultCraftItem src/Dodge/Default/Item.hs 35;" f defaultCreature src/Dodge/Default/Creature.hs 12;" f defaultCreatureMemory src/Dodge/Default/Creature.hs 72;" f defaultCreatureSkin src/Dodge/Default/Creature.hs 66;" f @@ -3869,7 +3865,7 @@ defaultFiltSection src/Dodge/Default/World.hs 210;" f defaultFlIt src/Dodge/Default.hs 30;" f defaultForeground src/Dodge/Default/ForegroundShape.hs 5;" f defaultHUD src/Dodge/Default/World.hs 151;" f -defaultHeldItem src/Dodge/Default/Item.hs 21;" f +defaultHeldItem src/Dodge/Default/Item.hs 19;" f defaultHeldUse src/Dodge/Default/Item/Use.hs 29;" f defaultImpulsive src/Dodge/Humanoid.hs 190;" f defaultInanimate src/Dodge/Default/Creature.hs 69;" f @@ -3878,12 +3874,13 @@ defaultIntention src/Dodge/Default/Creature.hs 105;" f defaultInvSection src/Dodge/Default/World.hs 217;" f defaultInvSections src/Dodge/Default/World.hs 175;" f defaultInvSize src/Dodge/Default/Creature.hs 79;" f +defaultItEffect src/Dodge/Default/Item.hs 49;" f defaultItEffect src/Dodge/Default/Item/Effect.hs 5;" f -defaultItZoom src/Dodge/Default/Item/Use/AimParams.hs 27;" f -defaultItemDimension src/Dodge/Default/Item.hs 14;" f +defaultItZoom src/Dodge/Default/Item/Use/AimParams.hs 30;" f +defaultItemDimension src/Dodge/Default/Item.hs 12;" f defaultLS src/Dodge/Default/LightSource.hs 6;" f defaultLWorld src/Dodge/Default/World.hs 92;" f -defaultLeftItem src/Dodge/Default/Item.hs 34;" f +defaultLeftItem src/Dodge/Default/Item.hs 32;" f defaultLeftLoadable src/Dodge/Default/Item/Use/Consumption.hs 8;" f defaultLeftUse src/Dodge/Default/Item/Use.hs 14;" f defaultListDisplayParams src/Dodge/ListDisplayParams.hs 18;" f @@ -3983,13 +3980,12 @@ doDrWdWd src/Dodge/DrWdWd.hs 16;" f doDrawing src/Dodge/Render.hs 35;" f doDrawing' src/Dodge/Render.hs 46;" f doFloatFloat src/Dodge/FloatFunction.hs 5;" f -doFloorEffect src/Dodge/ItEffect.hs 22;" f doGenFloat src/Dodge/HeldUse.hs 402;" f doInPlacements src/Dodge/Layout.hs 92;" f doIndividualPlacements src/Dodge/Layout.hs 117;" f doInputScreenInput src/Dodge/Update/Input/ScreenLayer.hs 25;" f doIntImp src/Dodge/CreatureEffect.hs 24;" f -doInvEffect src/Dodge/ItEffect.hs 9;" f +doInvEffect src/Dodge/ItEffect.hs 10;" f doItCrWdWd src/Dodge/WorldEffect.hs 49;" f doItemTimeScroll src/Dodge/Update.hs 182;" f doLoop src/Loop.hs 60;" f @@ -4046,7 +4042,7 @@ doubleCorridorBarrels src/Dodge/Room/Room.hs 267;" f doubleLampCover src/Dodge/Placement/Instance/LightSource/Cover.hs 28;" f doublePair src/Geometry.hs 149;" f doublePairSet src/Geometry.hs 153;" f -doubleTreeToIndentList src/Dodge/DoubleTree.hs 56;" f +doubleTreeToIndentList src/Dodge/DoubleTree.hs 72;" f doubleV2 src/Geometry.hs 156;" f drawAllShadows src/Dodge/Shadows.hs 5;" f drawBaseMachine src/Dodge/Machine/Draw.hs 52;" f @@ -4154,20 +4150,20 @@ dropByState src/Dodge/Creature/State.hs 119;" f dropExcept src/Dodge/Creature/Action.hs 172;" f dropItem src/Dodge/Creature/Action.hs 177;" f drumMag src/Dodge/Item/Ammo.hs 36;" f -dtIL src/Dodge/DoubleTree.hs 59;" f -dtToAdjRootParent src/Dodge/DoubleTree.hs 110;" f -dtToAdjRootParentEither src/Dodge/DoubleTree.hs 116;" f -dtToAdjacency src/Dodge/DoubleTree.hs 66;" f -dtToIntMapWithRoot src/Dodge/DoubleTree.hs 72;" f -dtToLRAdj src/Dodge/DoubleTree.hs 88;" f -dtToLRAdjEither src/Dodge/DoubleTree.hs 98;" f -dtToRootIntMap' src/Dodge/DoubleTree.hs 76;" f -dtToUpDownAdj src/Dodge/DoubleTree.hs 80;" f +dtIL src/Dodge/DoubleTree.hs 75;" f +dtToAdjRootParent src/Dodge/DoubleTree.hs 126;" f +dtToAdjRootParentEither src/Dodge/DoubleTree.hs 132;" f +dtToAdjacency src/Dodge/DoubleTree.hs 82;" f +dtToIntMapWithRoot src/Dodge/DoubleTree.hs 88;" f +dtToLRAdj src/Dodge/DoubleTree.hs 104;" f +dtToLRAdjEither src/Dodge/DoubleTree.hs 114;" f +dtToRootIntMap' src/Dodge/DoubleTree.hs 92;" f +dtToUpDownAdj src/Dodge/DoubleTree.hs 96;" f dummyMenuOption src/Dodge/Menu/Option.hs 81;" f ebFlicker src/Dodge/EnergyBall.hs 94;" f edgeFormatting src/Dodge/Combine/Graph.hs 118;" f edgeToPic src/Dodge/Debug/Picture.hs 392;" f -effectWhileAttached src/Dodge/ItEffect.hs 30;" f +effectWhileAttached src/Dodge/ItEffect.hs 27;" f ejectS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 470;" f elecCrackleS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 362;" f elephantGun src/Dodge/Item/Held/Rod.hs 38;" f @@ -4277,7 +4273,7 @@ floorItemSPic src/Dodge/Render/ShapePicture.hs 169;" f floorWire src/Dodge/Wire.hs 13;" f foamSprayFadeOutS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 398;" f foamSprayLoopS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 394;" f -foldCr src/Dodge/Creature/State.hs 45;" f +foldCr src/Dodge/Creature/State.hs 43;" f foldPairs src/ListHelp.hs 37;" f foldrWhileArb src/ListHelp.hs 110;" f followImpulse src/Dodge/Creature/Impulse.hs 37;" f @@ -4329,7 +4325,7 @@ geometryQuickCheckTests test/Spec.hs 55;" f geometryTests test/Spec.hs 17;" f geometryUnitTests test/Spec.hs 22;" f geqConstr src/SameConstr.hs 21;" f -getAmmoLinks src/Dodge/Item/Grammar.hs 61;" f +getAmmoLinks src/Dodge/Item/Grammar.hs 60;" f getArguments src/Dodge/Update/Scroll.hs 151;" f getArguments' src/Dodge/Update/Scroll.hs 139;" f getAvailableListLines src/Dodge/SelectionList.hs 11;" f @@ -4427,7 +4423,7 @@ hat src/Dodge/Item/Equipment.hs 96;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 109;" f headLampShape src/Dodge/Item/Draw/SPic.hs 392;" f -headMap src/Dodge/DoubleTree.hs 154;" f +headMap src/Dodge/DoubleTree.hs 170;" f heal src/Dodge/Item/Consumable.hs 17;" f heal25 src/Dodge/Item/Consumable.hs 14;" f healS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 354;" f @@ -4465,7 +4461,7 @@ iShape src/Dodge/Placement/Instance/LightSource.hs 74;" f icosahedronPoints src/Polyhedra/Geodesic.hs 11;" f icosohedronFaces src/Polyhedra/Geodesic.hs 18;" f ifConfigWallRotate src/Dodge/Update/Camera.hs 173;" f -ildtPropagate src/Dodge/DoubleTree.hs 41;" f +ildtPropagate src/Dodge/DoubleTree.hs 57;" f impulsiveAIBefore src/Dodge/Creature/Impulse.hs 22;" f inCloseRegex src/Dodge/InputFocus.hs 99;" f inInputFocus src/Dodge/InputFocus.hs 63;" f @@ -4534,20 +4530,20 @@ intersectSegsSeg src/Geometry/Intersect.hs 232;" f intervalList src/Geometry.hs 315;" f interweave src/Justify.hs 17;" f intsToPos src/Dodge/Room/Modify/Girder.hs 160;" f -invAdj src/Dodge/Item/Grammar.hs 145;" f +invAdj src/Dodge/Item/Grammar.hs 144;" f invDimColor src/Dodge/DisplayInventory.hs 139;" f invDisplayParams src/Dodge/ListDisplayParams.hs 29;" f invHead src/Dodge/Render/HUD.hs 266;" f -invIndentIM src/Dodge/Item/Grammar.hs 157;" f -invLDT src/Dodge/Item/Grammar.hs 129;" f -invRootMap src/Dodge/Item/Grammar.hs 138;" f +invIndentIM src/Dodge/Item/Grammar.hs 156;" f +invLDT src/Dodge/Item/Grammar.hs 128;" f +invRootMap src/Dodge/Item/Grammar.hs 137;" f invSelectionItem src/Dodge/Inventory/SelectionList.hs 34;" f invSelectionItem' src/Dodge/Inventory/SelectionList.hs 16;" f invShiftPointBy src/Dodge/ShiftPoint.hs 8;" f invSideEff src/Dodge/Creature/State.hs 163;" f invSize src/Dodge/Inventory/CheckSlots.hs 41;" f -invTrees src/Dodge/Item/Grammar.hs 165;" f -invTrees' src/Dodge/Item/Grammar.hs 174;" f +invTrees src/Dodge/Item/Grammar.hs 164;" f +invTrees' src/Dodge/Item/Grammar.hs 173;" f inventoryExtra src/Dodge/Render/HUD.hs 184;" f inventoryExtraH src/Dodge/Render/HUD.hs 195;" f inventoryX src/Dodge/Creature.hs 115;" f @@ -4562,7 +4558,7 @@ isAmmoIntLink src/Dodge/HeldUse.hs 174;" f isAnimate src/Dodge/Creature/Test.hs 138;" f isCognizant src/Dodge/Creature/Perception.hs 105;" f isElectrical src/Dodge/Data/Damage.hs 42;" f -isFrictionless src/Dodge/Creature/State.hs 305;" f +isFrictionless src/Dodge/Creature/State.hs 326;" f isGas src/Dodge/Euse.hs 64;" f isInLnk src/Dodge/PlacementSpot.hs 160;" f isJust' src/MaybeHelp.hs 29;" f @@ -4600,16 +4596,16 @@ itemFromHeldType src/Dodge/Item/Held.hs 25;" f itemFromLeftType src/Dodge/Item.hs 76;" f itemInfo src/Dodge/Item/Info.hs 12;" f itemInvColor src/Dodge/Item/InventoryColor.hs 9;" f -itemInvSideEffect src/Dodge/Creature/State.hs 217;" f +itemInvSideEffect src/Dodge/Creature/State.hs 227;" f itemNumberDisplay src/Dodge/Item/Display.hs 111;" f itemRooms src/Dodge/LockAndKey.hs 39;" f itemRotTreeSPic src/Dodge/Item/Draw/SPic.hs 27;" f itemSPic src/Dodge/Item/Draw/SPic.hs 33;" f itemString src/Dodge/Item/Display.hs 57;" f -itemToBreakLists src/Dodge/Item/Grammar.hs 41;" f -itemToFunction src/Dodge/Item/Grammar.hs 66;" f +itemToBreakLists src/Dodge/Item/Grammar.hs 40;" f +itemToFunction src/Dodge/Item/Grammar.hs 65;" f itemTreeSPic src/Dodge/Item/Draw/SPic.hs 22;" f -itemUpdate src/Dodge/Creature/State.hs 276;" f +itemUpdate src/Dodge/Creature/State.hs 298;" f itemUseEffect src/Dodge/Creature/Impulse/UseItem.hs 35;" f iterateUntil src/MonadHelp.hs 23;" f iterateWhile src/MonadHelp.hs 30;" f @@ -4619,7 +4615,7 @@ itmSpaceInfo src/Dodge/Item/Info.hs 17;" f itmUsageInfo src/Dodge/Item/Info.hs 200;" f jShape src/Dodge/Placement/Instance/LightSource.hs 86;" f jaggedShape src/Dodge/Block/Debris.hs 191;" f -joinItemsInList src/Dodge/Item/Grammar.hs 120;" f +joinItemsInList src/Dodge/Item/Grammar.hs 119;" f jps0' src/Dodge/LevelGen/PlacementHelper.hs 60;" f jps0PushPS src/Dodge/LevelGen/PlacementHelper.hs 63;" f jsps src/Dodge/LevelGen/PlacementHelper.hs 36;" f @@ -4652,7 +4648,7 @@ lasSensorTurretTest src/Dodge/Room/LasTurret.hs 105;" f lasTunnel src/Dodge/Room/LasTurret.hs 124;" f lasTunnelRunPast src/Dodge/Room/LasTurret.hs 165;" f lasTurret src/Dodge/Placement/Instance/Turret.hs 23;" f -lastMap src/Dodge/DoubleTree.hs 158;" f +lastMap src/Dodge/DoubleTree.hs 174;" f latchkey src/Dodge/Item/Held/Utility.hs 23;" f launcher src/Dodge/Item/Held/Launcher.hs 12;" f launcherCrit src/Dodge/Creature/LauncherCrit.hs 12;" f @@ -4660,19 +4656,20 @@ launcherPic src/Dodge/Item/Draw/SPic.hs 331;" f launcherX src/Dodge/Item/Held/Launcher.hs 32;" f layoutLevelFromSeed src/Dodge/LevelGen.hs 47;" f ldpVerticalSelection src/Dodge/Update/Input/ScreenLayer.hs 90;" f -ldtIL src/Dodge/DoubleTree.hs 133;" f +ldtIL src/Dodge/DoubleTree.hs 149;" f ldtPropagate src/Dodge/DoubleTree.hs 20;" f ldtPropagateFold src/Dodge/DoubleTree.hs 29;" f -ldtPropagateIndices src/Dodge/DoubleTree.hs 48;" f +ldtPropagateFoldTree src/Dodge/DoubleTree.hs 45;" f +ldtPropagateIndices src/Dodge/DoubleTree.hs 64;" f ldtToDT src/Dodge/DoubleTree.hs 15;" f -ldtToIM src/Dodge/DoubleTree.hs 127;" f -ldtToIndentList src/Dodge/DoubleTree.hs 130;" f +ldtToIM src/Dodge/DoubleTree.hs 143;" f +ldtToIndentList src/Dodge/DoubleTree.hs 146;" f left src/DoubleStack.hs 16;" f leftInfo src/Dodge/Item/Info.hs 96;" f -leftIsParentCombine src/Dodge/Item/Grammar.hs 90;" f +leftIsParentCombine src/Dodge/Item/Grammar.hs 89;" f leftItemSPic src/Dodge/Item/Draw/SPic.hs 97;" f leftPad src/Padding.hs 14;" f -leftRightCombine src/Dodge/Item/Grammar.hs 104;" f +leftRightCombine src/Dodge/Item/Grammar.hs 103;" f legsSPic src/Dodge/Item/Draw/SPic.hs 426;" f liShape src/Dodge/Placement/Instance/LightSource.hs 99;" f light src/Color.hs 100;" f @@ -5218,8 +5215,8 @@ preloadRender src/Preload/Render.hs 30;" f premapMaybe src/FoldlHelp.hs 24;" f prependTwo src/Geometry.hs 165;" f pressedMBEffectsTopInventory src/Dodge/Creature/YourControl.hs 206;" f -prettyDT src/Dodge/DoubleTree.hs 163;" f -prettyLDT src/Dodge/DoubleTree.hs 167;" f +prettyDT src/Dodge/DoubleTree.hs 179;" f +prettyLDT src/Dodge/DoubleTree.hs 183;" f primeS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 422;" f printColumnTitles src/Dodge/Tree/Shift.hs 142;" f printColumns src/Dodge/Tree/Shift.hs 132;" f @@ -5393,7 +5390,7 @@ rezText' src/Dodge/Story.hs 17;" f rhombus src/Polyhedra.hs 71;" f rifle src/Dodge/Item/Held/Cane.hs 51;" f right src/DoubleStack.hs 16;" f -rightIsParentCombine src/Dodge/Item/Grammar.hs 97;" f +rightIsParentCombine src/Dodge/Item/Grammar.hs 96;" f rightPad src/Padding.hs 22;" f rightPadNoSquash src/Padding.hs 26;" f rlPosDir src/Dodge/RoomLink.hs 94;" f @@ -5423,7 +5420,7 @@ roomShuriken src/Dodge/Room/Boss.hs 120;" f roomTwistCross src/Dodge/Room/Boss.hs 151;" f roomsContaining src/Dodge/Room/Containing.hs 19;" f roomsContaining' src/Dodge/Room/Containing.hs 24;" f -rootNotrootEff src/Dodge/ItEffect.hs 25;" f +rootNotrootEff src/Dodge/ItEffect.hs 22;" f rose src/Color.hs 20;" f rotD src/Padding.hs 47;" f rotListAt src/Padding.hs 52;" f @@ -5546,7 +5543,7 @@ setInLinks src/Dodge/RoomLink.hs 51;" f setInLinksByType src/Dodge/RoomLink.hs 54;" f setInLinksPD src/Dodge/RoomLink.hs 74;" f setInvPosFromSS src/Dodge/Inventory/Location.hs 71;" f -setItemCharge src/Dodge/ItEffect.hs 42;" f +setItemCharge src/Dodge/ItEffect.hs 39;" f setLayer src/Picture/Base.hs 139;" f setLinkType src/Dodge/RoomLink.hs 60;" f setLinkTypePD src/Dodge/RoomLink.hs 67;" f @@ -5557,7 +5554,7 @@ setOldPos src/Dodge/Update.hs 351;" f setOutLinks src/Dodge/RoomLink.hs 48;" f setOutLinksByType src/Dodge/RoomLink.hs 57;" f setOutLinksPD src/Dodge/RoomLink.hs 77;" f -setRBCreatureTargeting src/Dodge/Creature/State.hs 256;" f +setRBCreatureTargeting src/Dodge/Creature/State.hs 277;" f setSelectionListRestriction src/Dodge/Update/Input/ScreenLayer.hs 121;" f setShaderSource src/Shader/Compile.hs 290;" f setShadowLimits src/Dodge/Shadows.hs 11;" f @@ -5621,6 +5618,7 @@ shiftRoomBy src/Dodge/Room/Link.hs 37;" f shiftRoomShiftBy src/Dodge/Room/Link.hs 81;" f shiftRoomShiftToLink src/Dodge/Room/Link.hs 70;" f shiftedGrid src/Grid.hs 25;" f +shineTorch src/Dodge/Creature/State.hs 209;" f shootBullet src/Dodge/HeldUse.hs 327;" f shootFirstMiss src/Dodge/Creature/Volition.hs 33;" f shootL src/Dodge/Item/Weapon/TriggerType.hs 298;" f @@ -5659,11 +5657,11 @@ shuffleTail src/RandomHelp.hs 55;" f sigmoid src/Dodge/Base.hs 129;" f simpleCrSprings src/Dodge/Update.hs 646;" f simpleDamFL src/Dodge/Flame.hs 41;" f -simplePCI src/Dodge/Item/Grammar.hs 82;" f +simplePCI src/Dodge/Item/Grammar.hs 81;" f simpleTermMessage src/Dodge/Terminal.hs 249;" f sineRaisePitchOneSecS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 486;" f sineRaisePitchTwoSecS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 340;" f -singleAmmo src/Dodge/Default/Item.hs 40;" f +singleAmmo src/Dodge/Default/Item.hs 38;" f singleBlock src/Dodge/Placement/Instance/Wall.hs 30;" f singleDT src/Dodge/DoubleTree.hs 9;" f singleLDT src/Dodge/DoubleTree.hs 12;" f @@ -5766,7 +5764,7 @@ startNewGameInSlot src/Dodge/StartNewGame.hs 15;" f startRoom src/Dodge/Room/Start.hs 62;" f startSeedGame src/Dodge/StartNewGame.hs 20;" f startSeedGameConc src/Dodge/StartNewGame.hs 27;" f -stateUpdate src/Dodge/Creature/State.hs 63;" f +stateUpdate src/Dodge/Creature/State.hs 61;" f statsModifier src/Dodge/Creature/Info.hs 14;" f stone1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 386;" f stone2S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 474;" f @@ -5843,7 +5841,6 @@ testEvent src/Dodge/Event/Test.hs 10;" f testInventory src/Dodge/Creature.hs 256;" f testPic src/Dodge/Render/ShapePicture.hs 163;" f testStringInit src/Dodge/TestString.hs 22;" f -testtorch src/Dodge/Creature/State.hs 202;" f text src/Picture/Base.hs 193;" f textGrad src/Picture/Text.hs 5;" f textJustifyCenter src/Picture/Base.hs 212;" f @@ -6013,7 +6010,7 @@ upHammer src/Dodge/Default.hs 77;" f upProjectile src/Dodge/Projectile/Update.hs 25;" f updateAllNodes src/TreeHelp.hs 85;" f updateArc src/Dodge/Tesla/Arc.hs 86;" f -updateAutoRecharge src/Dodge/Creature/State.hs 288;" f +updateAutoRecharge src/Dodge/Creature/State.hs 309;" f updateBackspaceRegex src/Dodge/Update/Input/InGame.hs 159;" f updateBarrel src/Dodge/Barreloid.hs 45;" f updateBarreloid src/Dodge/Barreloid.hs 13;" f @@ -6056,7 +6053,7 @@ updateInstantBullets src/Dodge/Update.hs 535;" f updateInv src/Dodge/Creature/State.hs 153;" f updateInventoryPositioning src/Dodge/DisplayInventory.hs 87;" f updateInventorySectionItems src/Dodge/DisplayInventory.hs 143;" f -updateItemTargeting src/Dodge/Creature/State.hs 222;" f +updateItemTargeting src/Dodge/Creature/State.hs 233;" f updateItemWithOrientation src/Dodge/Creature/State.hs 197;" f updateKeyInGame src/Dodge/Update/Input/InGame.hs 102;" f updateKeysInTerminal src/Dodge/Update/Input/InGame.hs 91;" f @@ -6068,7 +6065,7 @@ updateLinearShockwave src/Dodge/LinearShockwave/Update.hs 8;" f updateLongPressInGame src/Dodge/Update/Input/InGame.hs 128;" f updateMIM src/Dodge/Update.hs 548;" f updateMachine src/Dodge/Machine/Update.hs 16;" f -updateMovement src/Dodge/Creature/State.hs 295;" f +updateMovement src/Dodge/Creature/State.hs 316;" f updateObjCatMaybes src/Dodge/Update.hs 407;" f updateObjMapMaybe src/Dodge/Update.hs 400;" f updatePastWorlds src/Dodge/Update.hs 305;" f @@ -6139,7 +6136,7 @@ upperPrismPolySU src/Shape.hs 112;" f upperPrismPolyTS src/Shape.hs 118;" f upperRounded src/Shape.hs 181;" f useBreakL' src/Dodge/Item/Grammar.hs 22;" f -useBreakListsLinkTest src/Dodge/Item/Grammar.hs 29;" f +useBreakListsLinkTest src/Dodge/Item/Grammar.hs 28;" f useBulletPayload src/Dodge/Bullet.hs 105;" f useC src/Dodge/Cuse.hs 8;" f useC' src/Dodge/Cuse.hs 13;" f @@ -6165,7 +6162,7 @@ useStopWatch src/Dodge/Luse.hs 24;" f useTimeCheck src/Dodge/Item/Weapon/TriggerType.hs 246;" f useTimeScrollGun src/Dodge/Luse.hs 32;" f useUnusedLnk src/Dodge/PlacementSpot.hs 169;" f -useUpdate src/Dodge/Creature/State.hs 279;" f +useUpdate src/Dodge/Creature/State.hs 301;" f usedRoomInLinkPoss src/Dodge/PlacementSpot.hs 196;" f usedRoomLinkPoss src/Dodge/PlacementSpot.hs 203;" f v2z src/Geometry/Vector3D.hs 93;" f