diff --git a/ghcidOutput b/ghcidOutput index 308c26c1b..cd4258a71 100644 --- a/ghcidOutput +++ b/ghcidOutput @@ -1 +1,2 @@ -All good (605 modules, at 20:13:06) +: error: + module ‘Dodge.Data.Creature.Shape’ cannot be found locally diff --git a/src/Dodge/Creature/State.hs b/src/Dodge/Creature/State.hs index 52d3d66b3..bad959f7a 100644 --- a/src/Dodge/Creature/State.hs +++ b/src/Dodge/Creature/State.hs @@ -3,6 +3,13 @@ module Dodge.Creature.State ( doDamage, ) where +import Dodge.WorldEvent.Flash +import Dodge.Data.DoubleTree +import Dodge.Item.HeldOffset +import Dodge.DoubleTree +import Dodge.Data.ComposedItem +import qualified Quaternion as Q +import Dodge.Item.Grammar import qualified Data.Map.Strict as M import Data.Maybe import Data.Monoid @@ -236,12 +243,45 @@ equipmentEffects cr = alaf Endo foldMap (useEquipment cr) (IM.keys $ _crInvEquip -- a loop going over all inventory items invSideEff :: Creature -> World -> World invSideEff cr = alaf Endo foldMap f (_crInv cr) + . updateRootItem cr where -- be careful with side effects that affect creature targeting f it = itemInvSideEffect cr it . maybe id (\g -> doInvEffect g it cr) (it ^? itEffect . ieInv) +updateRootItem :: Creature -> World -> World +updateRootItem cr = fromMaybe id $ do + invid <- cr ^? crManipulation . manObject . imRootItem + itmtree <- invTrees' (_crInv cr) ^? ix invid + return $ updateRootItem' itmtree cr + +-- need to check rotation +chainLinkOrientation + :: Maybe (Point3, Q.Quaternion Float) + -> Item + -> ItemLink + -> Item + -> Maybe (Point3,Q.Quaternion Float) +chainLinkOrientation mo par (ILink lt f) child = do + (p,q) <- mo + (p1,q1) <- f par lt child + return (p + Q.rotate q p1, q * q1) + +updateRootItem' :: LabelDoubleTree ItemLink Item -> Creature -> World -> World +updateRootItem' itmtree cr = ldtPropagateFold chainLinkOrientation chainLinkOrientation + (updateItemWithOrientation cr) + (Just (heldItemRelativeOrient (_ldtValue itmtree) cr (0,Q.qID))) + itmtree + +updateItemWithOrientation :: Creature -> Maybe (Point3, Q.Quaternion Float) -> Item -> World -> World +updateItemWithOrientation cr m itm = case _itType itm of + HELD TORCH -> testtorch cr m + _ -> id + +testtorch :: Creature -> Maybe (Point3, Q.Quaternion Float) -> World -> World +testtorch cr = maybe id $ \(pos,_) -> muzFlareAt yellow (_crPos cr `v2z` 0 + rotate3z (_crDir cr) pos) (_crDir cr) + itemInvSideEffect :: Creature -> Item -> World -> World itemInvSideEffect cr itm = case _itType itm of TARGETING tt -> updateItemTargeting tt cr itm @@ -259,55 +299,50 @@ itemInvSideEffect cr itm = case _itType itm of -- attachoff = it ^?! itDimension . dimAttachPos updateItemTargeting :: TargetingType -> Creature -> Item -> World -> World -updateItemTargeting tt cr itm w = - w & case tt of - _ - | not isattached -> - cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix (_ilInvID $ _itLocation itm) . itUse - %~ ( (tgPos .~ Nothing) - . (tgActive .~ False) - ) - TARGETLASER - | crIsAiming cr -> - cWorld . lWorld . lasers - .:~ LaserStart - { _lpPhaseV = 1 - , _lpDir = _crDir cr - , _lpPos = sp - , _lpColor = col - , _lpType = TargetingLaser (_itID itm) - } - TARGETLASER -> - cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix (_ilInvID $ _itLocation itm) - . itUse - . tgPos - .~ Nothing - TargetRBPress - | rbpressed -> - cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix (_ilInvID $ _itLocation itm) . itUse - %~ ( (tgPos %~ maybe (Just $ mouseWorldPos (w ^. input) (w ^. wCam)) Just) - . (tgActive .~ True) - ) - TargetRBPress -> +updateItemTargeting tt cr itm w = w & case tt of + _ | not isattached -> cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix (_ilInvID $ _itLocation itm) . itUse %~ ( (tgPos .~ Nothing) - . (tgActive .~ False) + . (tgActive .~ False)) + TARGETLASER | crIsAiming cr -> + cWorld . lWorld . lasers + .:~ LaserStart + { _lpPhaseV = 1 + , _lpDir = _crDir cr + , _lpPos = sp + , _lpColor = col + , _lpType = TargetingLaser (_itID itm) + } + TARGETLASER -> + cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix (_ilInvID $ _itLocation itm) + . itUse + . tgPos + .~ Nothing + TargetRBPress | rbpressed -> + cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix (_ilInvID $ _itLocation itm) . itUse + %~ ( (tgPos %~ maybe (Just $ mouseWorldPos (w ^. input) (w ^. wCam)) Just) + . (tgActive .~ True) ) - TargetRBCreature -> - cWorld . lWorld . creatures . ix (_crID cr) - . crInv - . ix (_ilInvID $ _itLocation itm) - . itUse - %~ setRBCreatureTargeting cr w - TargetCursor -> - cWorld . lWorld . creatures . ix (_crID cr) - . crInv - . ix (_ilInvID $ _itLocation itm) - . itUse - .~ TargetingUse - (Just (mouseWorldPos (w ^. input) (w ^. wCam))) - Nothing - True + TargetRBPress -> + cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix (_ilInvID $ _itLocation itm) . itUse + %~ ( (tgPos .~ Nothing) + . (tgActive .~ False) + ) + TargetRBCreature -> + cWorld . lWorld . creatures . ix (_crID cr) + . crInv + . ix (_ilInvID $ _itLocation itm) + . itUse + %~ setRBCreatureTargeting cr w + TargetCursor -> + cWorld . lWorld . creatures . ix (_crID cr) + . crInv + . ix (_ilInvID $ _itLocation itm) + . itUse + .~ TargetingUse + (Just (mouseWorldPos (w ^. input) (w ^. wCam))) + Nothing + True where isattached = itm ^?! itLocation . ilIsAttached rbpressed = SDL.ButtonRight `M.member` _mouseButtons (_input w) diff --git a/src/Dodge/Data/Creature/Shape.hs b/src/Dodge/Data/Creature/Shape.hs deleted file mode 100644 index 983b0c816..000000000 --- a/src/Dodge/Data/Creature/Shape.hs +++ /dev/null @@ -1,2 +0,0 @@ -module Dodge.Data.Creature.Shape where - diff --git a/src/Dodge/Data/DoubleTree.hs b/src/Dodge/Data/DoubleTree.hs index 659e8b322..3f3f0770b 100644 --- a/src/Dodge/Data/DoubleTree.hs +++ b/src/Dodge/Data/DoubleTree.hs @@ -40,6 +40,34 @@ data LabelDoubleTree b a = LDT {_ldtValue :: a, _ldtLeft :: [(b,LabelDoubleTree ,_ldtRight :: [(b,LabelDoubleTree b a)]} deriving (Eq,Ord,Show,Read) +-- I am not sure about the double use of records here +data ContextLDT b a = TopLDT + { _cldtValue :: a} + | LeftwardLDT + { _cldtUp :: ContextLDT b a + , _cldtCloseLeft :: [LabelDoubleTree b a] + , _cldtLink :: b + , _cldtValue :: a + , _cldtCloseRight :: [LabelDoubleTree b a] + , _cldtFarRight :: [LabelDoubleTree b a] + } + | RightwardLDT + { _cldtUp :: ContextLDT b a + , _cldtFarLeft :: [LabelDoubleTree b a] + , _cldtCloseLeft :: [LabelDoubleTree b a] + , _cldtLink :: b + , _cldtValue :: a + , _cldtCloseRight :: [LabelDoubleTree b a] + } + +-- this is not quite right, it duplicates the value when the context is at the +-- top +data LocationLDT b a = LocLDT + { _locLdtContext :: ContextLDT b a + , _locLdtLeft :: [LabelDoubleTree b a] + , _locLdtRight :: [LabelDoubleTree b a] + } + instance Functor DoubleTree where fmap f (DT x l r) = DT (f x) (fmap (fmap f) l) (fmap (fmap f) r) diff --git a/src/Dodge/DoubleTree.hs b/src/Dodge/DoubleTree.hs index 37429f6ed..c7db6d7e0 100644 --- a/src/Dodge/DoubleTree.hs +++ b/src/Dodge/DoubleTree.hs @@ -2,6 +2,9 @@ module Dodge.DoubleTree where import Dodge.Data.DoubleTree import qualified Data.IntMap.Strict as IM +import Control.Lens +import Data.Bifunctor +import Data.Monoid singleDT :: a -> DoubleTree a singleDT x = DT x [] [] @@ -9,10 +12,44 @@ singleDT x = DT x [] [] singleLDT :: a -> LabelDoubleTree b a singleLDT x = LDT x [] [] - ldtToDT :: LabelDoubleTree b a -> DoubleTree a ldtToDT (LDT x l r) = DT x (map (ldtToDT . snd) l) (map (ldtToDT . snd) r) +-- propogate two functions down the links of an LDT tree +-- which function is chosen depends on whether it is a left or right branch +ldtPropagate :: (c -> b -> c) -> (c -> b -> c) + -> c + -> LabelDoubleTree b a -> LabelDoubleTree c a +ldtPropagate lf rf = ildtPropagate (const lf) (const rf) + +-- Propgates a value (of type c) down the branches of the LDT. +-- The value is updated according a "left" or "right" function (lf or rf), +-- that acts on the parent value, the link, and the child value. +-- For each node, the updated value is used to update a final value (of type d). +ldtPropagateFold :: (c -> a -> b -> a -> c) + -> (c -> a -> b -> a -> c) + -> (c -> a -> d -> d) + -> c + -> LabelDoubleTree b a + -> d + -> d +ldtPropagateFold lf rf up x (LDT v l r) = + alaf Endo foldMap (\(s,y) -> ldtPropagateFold lf rf up (rf x v s (_ldtValue y)) y) r + . alaf Endo foldMap (\(s,y) -> ldtPropagateFold lf rf up (lf x v s (_ldtValue y)) y) l + . up x v + +ildtPropagate :: (Int -> c -> b -> c) -> (Int -> c -> b -> c) + -> c + -> LabelDoubleTree b a -> LabelDoubleTree c a +ildtPropagate lf rf x (LDT v l r) = LDT v (imap (go lf x) l) (imap (go rf x) r) + where + go f y i (z,t) = (f i y z, ildtPropagate lf rf (f i y z) t) + +ldtPropagateIndices :: LabelDoubleTree b a -> LabelDoubleTree b (a, [Either Int Int]) +ldtPropagateIndices (LDT x l r) = LDT (x,[]) (imap (f Left) l) (imap (f Right) r) + where + f e i (y,t) = (y, fmap (second (e i:)) $ ldtPropagateIndices t) + -- conceptually, in a tree growing from left to right, -- bottom -> top is equated with left -> right. -- this does not match with thinking of a list as top -> bottom, so take care diff --git a/src/Dodge/Item/Grammar.hs b/src/Dodge/Item/Grammar.hs index b5502227a..8e3f2ca1d 100644 --- a/src/Dodge/Item/Grammar.hs +++ b/src/Dodge/Item/Grammar.hs @@ -1,5 +1,6 @@ module Dodge.Item.Grammar ( invLDT, + invTrees', invTrees, invIndentIM, invAdj, @@ -168,3 +169,12 @@ invTrees = IM.unions . map (ldtToIM getindex . fmap (^. _1)) . map (bimap _iatTy getindex i = fromMaybe (error "in invTrees try to get non-inventory item tree") $ i ^? itLocation . ilInvID + +-- returns an intmap with trees for all root items +invTrees' :: IM.IntMap Item -> IM.IntMap (LabelDoubleTree ItemLink Item) +invTrees' = IM.unions . map (ldtToIM getindex . fmap (^. _1)) . map (bimap id (\(x, y, _) -> (x, y))) . invLDT + where + getindex :: Item -> Int + getindex i = + fromMaybe (error "in invTrees try to get non-inventory item tree") $ + i ^? itLocation . ilInvID diff --git a/src/Dodge/Item/Orientation.hs b/src/Dodge/Item/Orientation.hs index 5f875a727..56fa64d76 100644 --- a/src/Dodge/Item/Orientation.hs +++ b/src/Dodge/Item/Orientation.hs @@ -9,7 +9,7 @@ import qualified Linear.Quaternion as Q orientChild :: Item -> (Point3, Q.Quaternion Float) orientChild itm = case _itType itm of - HELD {} -> (0,Q.axisAngle (V3 1 0 0) 0) + HELD TORCH -> (V3 5 0 0,Q.axisAngle (V3 1 0 0) 0) _ -> (0,Q.axisAngle (V3 1 0 0) 0) orientByLink :: Item -> ComposeLinkType -> (Point3, Q.Quaternion Float) diff --git a/src/Dodge/LightSource/Torch.hs b/src/Dodge/LightSource/Torch.hs index f899605e6..536fe1507 100644 --- a/src/Dodge/LightSource/Torch.hs +++ b/src/Dodge/LightSource/Torch.hs @@ -9,7 +9,7 @@ import Geometry import LensHelp createTorchLightOffset :: Creature -> Item -> Point3 -> World -> World -createTorchLightOffset cr it off = muzFlareAt yellow pos (_crDir cr) . +createTorchLightOffset cr it off = (cWorld . lWorld . tempLightSources .:~ tlsTimeRadColPos 1 diff --git a/src/SimpleTrie.hs b/src/SimpleTrie.hs index 25a8f414a..9bfab7f59 100644 --- a/src/SimpleTrie.hs +++ b/src/SimpleTrie.hs @@ -1,42 +1,48 @@ {-# LANGUAGE TemplateHaskell #-} + module SimpleTrie where -import qualified Data.Map.Strict as M + import Control.Lens +import qualified Data.Map.Strict as M + data Trie a b = Trie - { _trieMVal :: Maybe b + { _trieMVal :: Maybe b , _trieChildren :: M.Map a (Trie a b) } + makeLenses ''Trie emptyTrie :: Trie a b emptyTrie = Trie Nothing M.empty singletonTrie :: Ord a => [a] -> b -> Trie a b -singletonTrie (k:ks) x = Trie Nothing $ M.singleton k $ singletonTrie ks x +singletonTrie (k : ks) x = Trie Nothing $ M.singleton k $ singletonTrie ks x singletonTrie [] x = Trie (Just x) M.empty insertInTrie :: Ord a => [a] -> b -> Trie a b -> Trie a b -insertInTrie [] x = trieMVal ?~ x -insertInTrie (k:ks) x = trieChildren %~ M.insertWith f k (singletonTrie ks x) +insertInTrie [] x = trieMVal ?~ x +insertInTrie (k : ks) x = trieChildren %~ M.insertWith f k (singletonTrie ks x) where f _ = insertInTrie ks x lookupTrie :: Ord a => [a] -> Trie a b -> Maybe b -lookupTrie (k:ks) t = _trieChildren t M.!? k >>= lookupTrie ks -lookupTrie [] t = _trieMVal t +lookupTrie (k : ks) t = _trieChildren t M.!? k >>= lookupTrie ks +lookupTrie [] t = _trieMVal t -multiLookupTrie :: Ord a => [a] -> Trie a b -> [([a],b)] -multiLookupTrie xs t@(Trie my ch) - | null xs || null ch = maybe [] (\y -> [([],y)]) my - | otherwise = let (z:zs) = xs in - case M.lookup z ch of - Nothing -> multiLookupTrie zs t - Just t' -> map (_1 %~ (z:)) (multiLookupTrie zs t') ++ multiLookupTrie zs t +multiLookupTrie :: Ord a => [a] -> Trie a b -> [([a], b)] +multiLookupTrie xs t@(Trie my ch) + | null xs || null ch = maybe [] (\y -> [([], y)]) my + | otherwise = + let (z : zs) = xs + in case M.lookup z ch of + Nothing -> multiLookupTrie zs t + Just t' -> map (_1 %~ (z :)) (multiLookupTrie zs t') ++ multiLookupTrie zs t -multiLookupTrieI :: Ord a => [(a,c)] -> Trie a b -> [([c],b)] -multiLookupTrieI xs t@(Trie my ch) - | null xs || null ch = maybe [] (\y -> [([],y)]) my - | otherwise = let ((z1,z2):zs) = xs in - case M.lookup z1 ch of - Nothing -> multiLookupTrieI zs t - Just t' -> map (_1 %~ (z2:)) (multiLookupTrieI zs t') ++ multiLookupTrieI zs t +multiLookupTrieI :: Ord a => [(a, c)] -> Trie a b -> [([c], b)] +multiLookupTrieI xs t@(Trie my ch) + | null xs || null ch = maybe [] (\y -> [([], y)]) my + | otherwise = + let ((z1, z2) : zs) = xs + in case M.lookup z1 ch of + Nothing -> multiLookupTrieI zs t + Just t' -> map (_1 %~ (z2 :)) (multiLookupTrieI zs t') ++ multiLookupTrieI zs t diff --git a/tags b/tags index 056880283..30010297a 100644 --- a/tags +++ b/tags @@ -358,6 +358,7 @@ ConsumableItemType src/Dodge/Data/Item/Combine.hs 95;" t Consumption src/Dodge/Data/Item/Use/Consumption.hs 8;" m Consumption src/Dodge/Default/Item/Use/Consumption.hs 1;" m Containing src/Dodge/Room/Containing.hs 2;" m +ContextLDT src/Dodge/Data/DoubleTree.hs 44;" t ContinentalGovernment src/Dodge/Data/Scenario.hs 51;" C ControlDeckSS src/Dodge/Data/Scenario.hs 89;" C ConvexPoly src/Geometry/ConvexPoly.hs 27;" t @@ -619,6 +620,7 @@ 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 EighthRes src/Dodge/Data/Config.hs 95;" C Eldritch src/Dodge/Data/Scenario.hs 34;" C @@ -930,10 +932,10 @@ 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 34;" t +ItDropEffect src/Dodge/Data/Item/Effect.hs 35;" t ItEffect src/Dodge/Data/Item/Effect.hs 12;" t ItEffect src/Dodge/ItEffect.hs 1;" m -ItFloorEffect src/Dodge/Data/Item/Effect.hs 31;" t +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 @@ -969,7 +971,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 84;" 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 @@ -1024,6 +1026,7 @@ LeftButton src/Dodge/Terminal/LeftButton.hs 1;" m LeftConsumption src/Dodge/Data/Item/Use/Consumption.hs 26;" t LeftForward src/Dodge/Data/Creature/Stance.hs 32;" C LeftItemType src/Dodge/Data/Item/Combine.hs 120;" t +LeftwardLDT src/Dodge/Data/DoubleTree.hs 46;" C LensHelp src/LensHelp.hs 1;" m Lethargic src/Dodge/Data/Creature/Perception.hs 55;" C LevelGen src/Dodge/LevelGen.hs 1;" m @@ -1062,9 +1065,11 @@ LoadSound src/Dodge/SoundLogic/LoadSound.hs 1;" m Loading src/Dodge/Menu/Loading.hs 1;" m LoadingBaySS src/Dodge/Data/Scenario.hs 93;" C LoadingScreen src/Dodge/Data/Universe.hs 69;" C +LocLDT src/Dodge/Data/DoubleTree.hs 65;" C Location src/Dodge/Data/Item/Location.hs 6;" m Location src/Dodge/Inventory/Location.hs 1;" m Location src/Dodge/Item/Location.hs 1;" m +LocationLDT src/Dodge/Data/DoubleTree.hs 65;" t Lock src/Dodge/Inventory/Lock.hs 1;" m LockAndKey src/Dodge/LockAndKey.hs 1;" m LockedInventory src/Dodge/Data/HUD.hs 30;" C @@ -1235,11 +1240,11 @@ 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 34;" C +NoDropEffect src/Dodge/Data/Item/Effect.hs 35;" 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 31;" 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 @@ -1580,6 +1585,7 @@ RezBox src/Dodge/Room/RezBox.hs 1;" m RightButtonOptions src/Dodge/Data/RightButtonOptions.hs 13;" t RightButtonOptions src/Dodge/Data/RightButtonOptions.hs 6;" m RightForward src/Dodge/Data/Creature/Stance.hs 33;" C +RightwardLDT src/Dodge/Data/DoubleTree.hs 54;" C RoadBlock src/Dodge/Room/RoadBlock.hs 2;" m Rod src/Dodge/Item/Held/Rod.hs 1;" m Room src/Dodge/Data/GenWorld.hs 96;" t @@ -1728,7 +1734,7 @@ ShrinkGunStatus src/Dodge/Data/Item/Params.hs 31;" t Shrunk src/Dodge/Data/Item/Params.hs 31;" C SideCluster src/Dodge/Data/RoomCluster.hs 14;" C SideEffect src/Dodge/Data/Universe.hs 60;" t -SimpleTrie src/SimpleTrie.hs 2;" m +SimpleTrie src/SimpleTrie.hs 3;" m SixteenthRes src/Dodge/Data/Config.hs 95;" C Size src/Shape/Data.hs 28;" t Size src/Dodge/Zone/Size.hs 1;" m @@ -1934,6 +1940,7 @@ Toggle src/Dodge/Data/Universe.hs 100;" C Toggle2 src/Dodge/Data/Universe.hs 104;" C TopDecoration src/Dodge/Placement/TopDecoration.hs 1;" m TopEscapeMenuOption src/Dodge/Data/Universe.hs 74;" C +TopLDT src/Dodge/Data/DoubleTree.hs 44;" C Torch src/Dodge/LightSource/Torch.hs 1;" m TorpedoBaySS src/Dodge/Data/Scenario.hs 99;" C TorqueCr src/Dodge/Data/WorldEffect.hs 32;" C @@ -1947,7 +1954,7 @@ Treasure src/Dodge/Room/Treasure.hs 5;" m Tree src/Dodge/Tree.hs 2;" m TreeHelp src/TreeHelp.hs 12;" m Triangulate src/Geometry/Triangulate.hs 3;" m -Trie src/SimpleTrie.hs 5;" t +Trie src/SimpleTrie.hs 8;" t TriggerDoor src/Dodge/Placement/PlaceSpot/TriggerDoor.hs 1;" m TriggerType src/Dodge/Data/Item/Use.hs 76;" t TriggerType src/Dodge/Item/Weapon/TriggerType.hs 6;" m @@ -2275,6 +2282,19 @@ _clTimer src/Dodge/Data/Cloud.hs 24;" f _clType src/Dodge/Data/Cloud.hs 25;" f _clVel src/Dodge/Data/Cloud.hs 20;" f _clZoning src/Dodge/Data/World.hs 50;" f +_cldtCloseLeft src/Dodge/Data/DoubleTree.hs 48;" f +_cldtCloseLeft src/Dodge/Data/DoubleTree.hs 57;" f +_cldtCloseRight src/Dodge/Data/DoubleTree.hs 51;" f +_cldtCloseRight src/Dodge/Data/DoubleTree.hs 60;" f +_cldtFarLeft src/Dodge/Data/DoubleTree.hs 56;" f +_cldtFarRight src/Dodge/Data/DoubleTree.hs 52;" f +_cldtLink src/Dodge/Data/DoubleTree.hs 49;" f +_cldtLink src/Dodge/Data/DoubleTree.hs 58;" f +_cldtUp src/Dodge/Data/DoubleTree.hs 47;" f +_cldtUp src/Dodge/Data/DoubleTree.hs 55;" f +_cldtValue src/Dodge/Data/DoubleTree.hs 45;" f +_cldtValue src/Dodge/Data/DoubleTree.hs 50;" f +_cldtValue src/Dodge/Data/DoubleTree.hs 59;" f _clickPos src/Dodge/Data/Input.hs 26;" f _clickWorldPos src/Dodge/Data/Input.hs 28;" f _closeObjects src/Dodge/Data/HUD.hs 40;" f @@ -2650,6 +2670,9 @@ _linkGapEW src/Dodge/Data/Room.hs 35;" f _linkGapNS src/Dodge/Data/Room.hs 36;" f _loadedChunks src/Sound/Data.hs 36;" f _loadedMusic src/Music.hs 8;" f +_locLdtContext src/Dodge/Data/DoubleTree.hs 66;" f +_locLdtLeft src/Dodge/Data/DoubleTree.hs 67;" f +_locLdtRight src/Dodge/Data/DoubleTree.hs 68;" f _lpColor src/Dodge/Data/Laser.hs 25;" f _lpDir src/Dodge/Data/Laser.hs 24;" f _lpPhaseV src/Dodge/Data/Laser.hs 22;" f @@ -3123,8 +3146,8 @@ _topBoxSize src/Shape/Data.hs 17;" f _torqueAfter src/Dodge/Data/Item/Use.hs 92;" f _torqueAfter src/Dodge/Data/Item/Use.hs 109;" f _tractorBeams src/Dodge/Data/LWorld.hs 122;" f -_trieChildren src/SimpleTrie.hs 7;" f -_trieMVal src/SimpleTrie.hs 6;" f +_trieChildren src/SimpleTrie.hs 10;" f +_trieMVal src/SimpleTrie.hs 9;" f _triggers src/Dodge/Data/LWorld.hs 131;" f _tryLeftLink src/Dodge/Data/ComposedItem.hs 51;" f _tryRightLink src/Dodge/Data/ComposedItem.hs 52;" f @@ -3311,7 +3334,6 @@ airlockZ src/Dodge/Room/Airlock.hs 91;" f allHotkeys src/Dodge/Creature/YourControl.hs 52;" f allVisibleWalls src/Dodge/Base/Collide.hs 131;" f alongSegBy src/Geometry.hs 43;" f -ammoComposedItem' src/Dodge/Item/Grammar.hs 66;" f ammoMagSPic src/Dodge/Item/Draw/SPic.hs 46;" f amr src/Dodge/Item/Held/Rod.hs 46;" f analyser src/Dodge/Placement/Instance/Analyser.hs 12;" f @@ -3333,7 +3355,7 @@ applyIndividualDamage' src/Dodge/Creature/Damage.hs 52;" f applyInvLock src/Dodge/HeldUse.hs 66;" f applyMagnetsToBul src/Dodge/Bullet.hs 46;" f applyNoDamage src/Dodge/Creature/Damage.hs 11;" f -applyPastDamages src/Dodge/Creature/State.hs 173;" f +applyPastDamages src/Dodge/Creature/State.hs 174;" f applyPiercingDamage src/Dodge/Creature/Damage.hs 57;" f applyPosition src/Sound.hs 110;" f applyRecoil src/Dodge/HeldUse.hs 85;" f @@ -3414,7 +3436,7 @@ baseBlockPane src/Dodge/Placement/Instance/Wall.hs 86;" f baseCaneShape src/Dodge/Item/Draw/SPic.hs 257;" f baseDebris src/Dodge/Block/Debris.hs 122;" f baseFloorTileSize src/Tile.hs 38;" f -basePartiallyComposedItem' src/Dodge/Item/Grammar.hs 33;" f +basePartiallyComposedItem' src/Dodge/Item/Grammar.hs 84;" f baseRifleShape src/Dodge/Item/Draw/SPic.hs 260;" f baseRodShape src/Dodge/Item/Draw/SPic.hs 344;" f baseSMGShape src/Dodge/Item/Draw/SPic.hs 327;" f @@ -3463,7 +3485,7 @@ blood5S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 380;" f blood6S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 500;" f blood7S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 342;" f blood8S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 330;" f -bloodPuddleAt src/Dodge/Creature/State.hs 136;" f +bloodPuddleAt src/Dodge/Creature/State.hs 137;" f blowTorch src/Dodge/Item/Held/SprayGuns.hs 51;" f blue src/Color.hs 16;" f blunderbuss src/Dodge/Item/Held/Cone.hs 29;" f @@ -3517,6 +3539,7 @@ centerVaultRoom src/Dodge/Room/Procedural.hs 288;" f centroid src/Geometry/Polygon.hs 113;" f centroidNum src/Geometry/Polygon.hs 116;" f chainCreatureUpdates src/Dodge/Creature/ChainUpdates.hs 6;" f +chainLinkOrientation src/Dodge/Creature/State.hs 254;" f chainPairs src/Geometry.hs 363;" f changeSwapClose src/Dodge/Inventory.hs 230;" f changeSwapInv src/Dodge/Inventory.hs 246;" f @@ -3524,8 +3547,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 51;" f -chargeIfInInventory src/Dodge/ItEffect.hs 43;" f +chargeIfEquipped src/Dodge/ItEffect.hs 57;" f +chargeIfInInventory src/Dodge/ItEffect.hs 49;" f chartreuse src/Color.hs 24;" f chaseCrit src/Dodge/Creature/ChaseCrit.hs 33;" f chaseCritAwarenessUpdate src/Dodge/Creature/Perception.hs 69;" f @@ -3533,7 +3556,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 79;" f +checkDeath src/Dodge/Creature/State.hs 80;" f checkEndGame src/Dodge/Update.hs 584;" f checkErrorGL src/Shader/Compile.hs 255;" f checkFBO src/Framebuffer/Check.hs 6;" f @@ -3647,7 +3670,7 @@ copyItemToFloor src/Dodge/FloorItem.hs 17;" f copyItemToFloorID src/Dodge/FloorItem.hs 21;" f corDoor src/Dodge/Room/Room.hs 378;" f cornerList src/Preload/Render.hs 194;" f -corpseOrGib src/Dodge/Creature/State.hs 99;" f +corpseOrGib src/Dodge/Creature/State.hs 100;" f corridor src/Dodge/Room/Corridor.hs 17;" f corridorBoss src/Dodge/LockAndKey.hs 133;" f corridorN src/Dodge/Room/Corridor.hs 52;" f @@ -3689,7 +3712,7 @@ 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 70;" 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 @@ -3697,7 +3720,7 @@ createPathGrid src/Dodge/Room/Path.hs 21;" f createProjectile src/Dodge/HeldUse.hs 457;" f createShell src/Dodge/Projectile/Create.hs 19;" f createShieldWall src/Dodge/Euse.hs 134;" f -createTorchLightOffset src/Dodge/LightSource/Torch.hs 9;" f +createTorchLightOffset src/Dodge/LightSource/Torch.hs 11;" f createUnusedLinkPos src/Dodge/Tree/Shift.hs 117;" f createWall src/Dodge/Wall/Create.hs 8;" f creatureDisplayText src/Dodge/Creature/Picture/Awareness.hs 10;" f @@ -3954,7 +3977,7 @@ doCrImp src/Dodge/CreatureEffect.hs 28;" f doCrWdAc src/Dodge/CreatureEffect.hs 77;" f doCrWdImp src/Dodge/CreatureEffect.hs 16;" f doCrWdWd src/Dodge/CreatureEffect.hs 20;" f -doDamage src/Dodge/Creature/State.hs 164;" f +doDamage src/Dodge/Creature/State.hs 165;" f doDamagesFL src/Dodge/Flame.hs 58;" f doDeathToggle src/Dodge/WorldEffect.hs 95;" f doDeathTriggers src/Dodge/WorldEffect.hs 90;" f @@ -3962,7 +3985,7 @@ 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 21;" 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 @@ -4025,7 +4048,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 19;" f +doubleTreeToIndentList src/Dodge/DoubleTree.hs 56;" f doubleV2 src/Geometry.hs 156;" f drawAllShadows src/Dodge/Shadows.hs 5;" f drawBaseMachine src/Dodge/Machine/Draw.hs 52;" f @@ -4129,28 +4152,29 @@ drawWlIDs src/Dodge/Debug/Picture.hs 327;" f drawZoneCol src/Dodge/Debug/Picture.hs 115;" f drawZoneNearPointCursor src/Dodge/Debug/Picture.hs 247;" f droneLauncher src/Dodge/Item/Weapon/Drone.hs 11;" f -dropByState src/Dodge/Creature/State.hs 158;" f +dropByState src/Dodge/Creature/State.hs 159;" 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 22;" f -dtToAdjRootParent src/Dodge/DoubleTree.hs 73;" f -dtToAdjRootParentEither src/Dodge/DoubleTree.hs 79;" f -dtToAdjacency src/Dodge/DoubleTree.hs 29;" f -dtToIntMapWithRoot src/Dodge/DoubleTree.hs 35;" f -dtToLRAdj src/Dodge/DoubleTree.hs 51;" f -dtToLRAdjEither src/Dodge/DoubleTree.hs 61;" f -dtToRootIntMap' src/Dodge/DoubleTree.hs 39;" f -dtToUpDownAdj src/Dodge/DoubleTree.hs 43;" 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 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 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 emptyCorridor src/Dodge/Room/BlinkAcross.hs 22;" f -emptyTrie src/SimpleTrie.hs 11;" f +emptyTrie src/SimpleTrie.hs 15;" f encircle src/Dodge/Creature/Boid.hs 115;" f encircleCloseP src/Dodge/Creature/Boid.hs 35;" f encircleDistP src/Dodge/Creature/Boid.hs 21;" f @@ -4165,7 +4189,7 @@ equipPosition src/Dodge/Item/Draw.hs 31;" f equipSiteInfo src/Dodge/Item/Info.hs 225;" f equipSiteToPositions src/Dodge/Inventory/RBList.hs 77;" f equipSpeed src/Dodge/Creature/Impulse/Movement.hs 99;" f -equipmentEffects src/Dodge/Creature/State.hs 232;" f +equipmentEffects src/Dodge/Creature/State.hs 233;" f equipmentStrValue src/Dodge/Creature/Statistics.hs 22;" f errorAngleVV src/Geometry.hs 62;" f errorClosestPointOnLine src/Geometry.hs 74;" f @@ -4255,7 +4279,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 35;" f +foldCr src/Dodge/Creature/State.hs 36;" f foldPairs src/ListHelp.hs 37;" f foldrWhileArb src/ListHelp.hs 110;" f followImpulse src/Dodge/Creature/Impulse.hs 37;" f @@ -4307,6 +4331,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 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 @@ -4404,7 +4429,7 @@ hat src/Dodge/Item/Equipment.hs 104;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 117;" f headLampShape src/Dodge/Item/Draw/SPic.hs 394;" f -headMap src/Dodge/DoubleTree.hs 117;" f +headMap src/Dodge/DoubleTree.hs 154;" 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 @@ -4415,8 +4440,8 @@ heightWallPS src/Dodge/Placement/Instance/Wall.hs 13;" f heldEffect src/Dodge/HeldUse.hs 33;" f heldEffectMuzzles src/Dodge/HeldUse.hs 36;" f heldInfo src/Dodge/Item/Info.hs 48;" f -heldItemOffset src/Dodge/Item/HeldOffset.hs 56;" f -heldItemRelativeOrient src/Dodge/Item/HeldOffset.hs 25;" f +heldItemOffset src/Dodge/Item/HeldOffset.hs 66;" f +heldItemRelativeOrient src/Dodge/Item/HeldOffset.hs 28;" f heldItemSPic src/Dodge/Item/Draw/SPic.hs 175;" f heldPositionInfo src/Dodge/Item/Info.hs 212;" f helpCommand src/Dodge/Terminal.hs 64;" f @@ -4442,6 +4467,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 impulsiveAIBefore src/Dodge/Creature/Impulse.hs 22;" f inCloseRegex src/Dodge/InputFocus.hs 99;" f inInputFocus src/Dodge/InputFocus.hs 63;" f @@ -4481,7 +4507,7 @@ inputFocus src/Dodge/InputFocus.hs 69;" f inputFocusI src/Dodge/InputFocus.hs 66;" f insertAt src/Padding.hs 60;" f insertIMInZone src/Dodge/Base.hs 59;" f -insertInTrie src/SimpleTrie.hs 18;" f +insertInTrie src/SimpleTrie.hs 22;" f insertNewKey src/IntMapHelp.hs 66;" f insertOneS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 368;" f insertOver src/ListHelp.hs 47;" f @@ -4490,7 +4516,7 @@ insertWall src/Dodge/Placement/PlaceSpot/Block.hs 122;" f insertWallInZones src/Dodge/Wall/Zone.hs 20;" f insertWalls src/Dodge/Placement/PlaceSpot/Block.hs 117;" f insertWithNewKeys src/IntMapHelp.hs 72;" f -internalHammerUpdate src/Dodge/Creature/State.hs 147;" f +internalHammerUpdate src/Dodge/Creature/State.hs 148;" f interpWith src/Dodge/Creature/Boid.hs 10;" f intersectCircSeg src/Geometry/Intersect.hs 303;" f intersectCircSegFirst src/Geometry/Intersect.hs 314;" f @@ -4510,19 +4536,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 141;" 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 153;" f -invLDT src/Dodge/Item/Grammar.hs 125;" f -invRootMap src/Dodge/Item/Grammar.hs 134;" 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 237;" f +invSideEff src/Dodge/Creature/State.hs 238;" f invSize src/Dodge/Inventory/CheckSlots.hs 41;" f -invTrees src/Dodge/Item/Grammar.hs 161;" 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 @@ -4537,7 +4564,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 398;" f +isFrictionless src/Dodge/Creature/State.hs 420;" f isGas src/Dodge/Euse.hs 64;" f isInLnk src/Dodge/PlacementSpot.hs 160;" f isJust' src/MaybeHelp.hs 29;" f @@ -4575,14 +4602,16 @@ itemFromHeldType src/Dodge/Item/Held.hs 25;" f itemFromLeftType src/Dodge/Item.hs 77;" f itemInfo src/Dodge/Item/Info.hs 12;" f itemInvColor src/Dodge/Item/InventoryColor.hs 9;" f -itemInvSideEffect src/Dodge/Creature/State.hs 245;" f +itemInvSideEffect src/Dodge/Creature/State.hs 272;" 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 34;" f itemString src/Dodge/Item/Display.hs 57;" 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 338;" f +itemUpdate src/Dodge/Creature/State.hs 360;" f itemUseEffect src/Dodge/Creature/Impulse/UseItem.hs 35;" f iterateUntil src/MonadHelp.hs 23;" f iterateWhile src/MonadHelp.hs 30;" f @@ -4593,7 +4622,7 @@ itmUsageInfo src/Dodge/Item/Info.hs 201;" f jShape src/Dodge/Placement/Instance/LightSource.hs 86;" f jaggedShape src/Dodge/Block/Debris.hs 191;" f jetPack src/Dodge/Item/Equipment.hs 91;" f -joinItemsInList src/Dodge/Item/Grammar.hs 116;" 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 @@ -4626,7 +4655,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 121;" f +lastMap src/Dodge/DoubleTree.hs 158;" 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 @@ -4634,16 +4663,19 @@ launcherPic src/Dodge/Item/Draw/SPic.hs 333;" 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 96;" f -ldtToDT src/Dodge/DoubleTree.hs 13;" f -ldtToIM src/Dodge/DoubleTree.hs 90;" f -ldtToIndentList src/Dodge/DoubleTree.hs 93;" f +ldtIL src/Dodge/DoubleTree.hs 133;" f +ldtPropagate src/Dodge/DoubleTree.hs 20;" f +ldtPropagateFold src/Dodge/DoubleTree.hs 29;" f +ldtPropagateIndices src/Dodge/DoubleTree.hs 48;" f +ldtToDT src/Dodge/DoubleTree.hs 15;" f +ldtToIM src/Dodge/DoubleTree.hs 127;" f +ldtToIndentList src/Dodge/DoubleTree.hs 130;" f left src/DoubleStack.hs 16;" f leftInfo src/Dodge/Item/Info.hs 96;" f -leftIsParentCombine src/Dodge/Item/Grammar.hs 86;" f +leftIsParentCombine src/Dodge/Item/Grammar.hs 89;" f leftItemSPic src/Dodge/Item/Draw/SPic.hs 99;" f leftPad src/Padding.hs 14;" f -leftRightCombine src/Dodge/Item/Grammar.hs 100;" f +leftRightCombine src/Dodge/Item/Grammar.hs 103;" f legsSPic src/Dodge/Item/Draw/SPic.hs 428;" f liShape src/Dodge/Placement/Instance/LightSource.hs 99;" f light src/Color.hs 100;" f @@ -4696,7 +4728,7 @@ longCrit src/Dodge/Creature.hs 69;" f longRoom src/Dodge/Room/LongRoom.hs 21;" f longRoomRunPast src/Dodge/Room/LongRoom.hs 47;" f longestCommonPrefix src/Dodge/Debug/Terminal.hs 138;" f -lookupTrie src/SimpleTrie.hs 24;" f +lookupTrie src/SimpleTrie.hs 28;" f loopPairs src/ListHelp.hs 30;" f lootRoom src/Dodge/Room/Treasure.hs 58;" f lorem src/Lorem.hs 3;" f @@ -4903,15 +4935,15 @@ moveWallID src/Dodge/Wall/Move.hs 24;" f moveWallIDToward src/Dodge/Wall/Move.hs 47;" f moveWallIDUnsafe src/Dodge/Wall/Move.hs 19;" f moveZoomCamera src/Dodge/Update/Camera.hs 80;" f -movementSideEff src/Dodge/Creature/State.hs 189;" f +movementSideEff src/Dodge/Creature/State.hs 190;" f mtTopLabels src/Dodge/Tree/Compose.hs 49;" f mtUnderLabels src/Dodge/Tree/Compose.hs 52;" f muchWlDustAt src/Dodge/Wall/Dust.hs 15;" f muin src/Dodge/RoomLink.hs 132;" f multGunCrit src/Dodge/Creature.hs 76;" f multiArrow src/Picture/Composite.hs 11;" f -multiLookupTrie src/SimpleTrie.hs 28;" f -multiLookupTrieI src/SimpleTrie.hs 36;" f +multiLookupTrie src/SimpleTrie.hs 32;" f +multiLookupTrieI src/SimpleTrie.hs 41;" f muout src/Dodge/RoomLink.hs 129;" f muzFlareAt src/Dodge/WorldEvent/Flash.hs 26;" f mvBullet src/Dodge/Bullet.hs 33;" f @@ -4987,7 +5019,7 @@ orderAroundFirst src/Geometry/Polygon.hs 74;" f orderAroundFirstReverse src/Geometry/Polygon.hs 70;" f orderPolygon src/Geometry/Polygon.hs 78;" f orderPolygonAround src/Geometry/Polygon.hs 63;" f -orientAttachment src/Dodge/Item/Orientation.hs 21;" f +orientAttachment src/Dodge/Item/Orientation.hs 22;" f orientByLink src/Dodge/Item/Orientation.hs 15;" f orientChild src/Dodge/Item/Orientation.hs 10;" f originIDsAt src/Dodge/WorldEvent/Sound.hs 18;" f @@ -5119,7 +5151,7 @@ pointerToItemLocation src/Dodge/Item/Location.hs 25;" f pointerYourRootItem src/Dodge/Item/Location.hs 42;" f pointerYourSelectedItem src/Dodge/Item/Location.hs 36;" f pointsToPoly src/Geometry/ConvexPoly.hs 39;" f -poisonSPic src/Dodge/Creature/State.hs 124;" f +poisonSPic src/Dodge/Creature/State.hs 125;" f poisonSprayer src/Dodge/Item/Held/SprayGuns.hs 17;" f poke34 src/Shader/Poke.hs 516;" f pokeArrayOff src/Shader/Poke.hs 527;" f @@ -5190,8 +5222,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 126;" f -prettyLDT src/Dodge/DoubleTree.hs 130;" f +prettyDT src/Dodge/DoubleTree.hs 163;" f +prettyLDT src/Dodge/DoubleTree.hs 167;" 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 @@ -5251,6 +5283,7 @@ putStrLnAppend src/Dodge/LevelGen.hs 79;" f putTerminal src/Dodge/Placement/Instance/Terminal.hs 16;" f putWireEnd src/Dodge/Wire.hs 31;" f putWireStart src/Dodge/Wire.hs 34;" f +qID src/Quaternion.hs 46;" f quarterRoomSquare src/Dodge/Room/Procedural.hs 212;" f quarterRoomTri src/Dodge/Room/Procedural.hs 176;" f quitCommand src/Dodge/Terminal.hs 55;" f @@ -5362,7 +5395,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 93;" 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 @@ -5392,7 +5425,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 24;" f +rootNotrootEff src/Dodge/ItEffect.hs 25;" f rose src/Color.hs 20;" f rotD src/Padding.hs 47;" f rotListAt src/Padding.hs 52;" f @@ -5412,7 +5445,7 @@ rotateSHx src/Shape.hs 261;" f rotateSP src/ShapePicture.hs 57;" f rotateTo src/Polyhedra/Geodesic.hs 63;" f rotateToOverlappingWall src/Dodge/Update/Camera.hs 179;" f -rotateToZ src/Quaternion.hs 31;" f +rotateToZ src/Quaternion.hs 32;" f rotateV src/Geometry/Vector.hs 105;" f rotateVAround src/Geometry/Vector.hs 112;" f rotateXY src/Polyhedra.hs 30;" f @@ -5455,7 +5488,7 @@ scaleSH src/Shape.hs 265;" f scalp src/Dodge/Creature/Picture.hs 93;" f scancodeToHotkey src/Dodge/Creature/YourControl.hs 70;" f scodeToChar src/Dodge/ScodeToChar.hs 6;" f -scorchSPic src/Dodge/Creature/State.hs 119;" f +scorchSPic src/Dodge/Creature/State.hs 120;" f screenBox src/Dodge/Base/Window.hs 53;" f screenPolygon src/Dodge/Base/Window.hs 17;" f screenPolygonBord src/Dodge/Base/Window.hs 27;" f @@ -5515,7 +5548,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 36;" f +setItemCharge src/Dodge/ItEffect.hs 42;" f setLayer src/Picture/Base.hs 139;" f setLinkType src/Dodge/RoomLink.hs 60;" f setLinkTypePD src/Dodge/RoomLink.hs 67;" f @@ -5526,7 +5559,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 317;" f +setRBCreatureTargeting src/Dodge/Creature/State.hs 339;" f setSelectionListRestriction src/Dodge/Update/Input/ScreenLayer.hs 121;" f setShaderSource src/Shader/Compile.hs 290;" f setShadowLimits src/Dodge/Shadows.hs 11;" f @@ -5606,7 +5639,7 @@ shootingRange src/Dodge/Room/Room.hs 334;" f shortPoint2 src/Dodge/ShortShow.hs 4;" f shortShow src/ShortShow.hs 10;" f shotgunS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 508;" f -shoulderHeight src/Dodge/Item/HeldOffset.hs 88;" f +shoulderHeight src/Dodge/Item/HeldOffset.hs 69;" f shoulderSH src/Dodge/Creature/Picture.hs 136;" f shoulderSP src/Dodge/Creature/HandPos.hs 196;" f showAttachItem src/Dodge/Item/Display.hs 76;" f @@ -5628,15 +5661,16 @@ 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 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 singleBlock src/Dodge/Placement/Instance/Wall.hs 30;" f -singleDT src/Dodge/DoubleTree.hs 6;" f -singleLDT src/Dodge/DoubleTree.hs 9;" f +singleDT src/Dodge/DoubleTree.hs 9;" f +singleLDT src/Dodge/DoubleTree.hs 12;" f singleton src/DoubleStack.hs 11;" f -singletonTrie src/SimpleTrie.hs 14;" f +singletonTrie src/SimpleTrie.hs 18;" f sizeFBOs src/Framebuffer/Update.hs 22;" f sizeModule src/Dodge/Item/Craftable.hs 37;" f sizeSelf src/Dodge/Creature/Action.hs 204;" f @@ -5734,7 +5768,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 53;" f +stateUpdate src/Dodge/Creature/State.hs 54;" 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 @@ -5751,7 +5785,7 @@ strFromEquipment src/Dodge/Creature/Statistics.hs 19;" f strFromHeldItem src/Dodge/Creature/Statistics.hs 37;" f strengthFactor src/Dodge/Creature/Impulse/Movement.hs 32;" f strictify src/MaybeHelp.hs 37;" f -strideRot src/Dodge/Item/HeldOffset.hs 91;" f +strideRot src/Dodge/Item/HeldOffset.hs 72;" f stringToList src/Picture/Base.hs 313;" f stringToListGrad src/Picture/Text.hs 12;" f stripZ src/Geometry/Vector3D.hs 97;" f @@ -5886,7 +5920,7 @@ tractorPullPos src/Dodge/TractorBeam/Update.hs 33;" f tractorSPic src/Dodge/TractorBeam/Draw.hs 10;" f tranRot src/Picture/Base.hs 124;" f transMat src/MatrixHelper.hs 73;" f -transToHandle src/Dodge/Item/HeldOffset.hs 20;" f +transToHandle src/Dodge/Item/HeldOffset.hs 21;" f translate src/Picture/Base.hs 116;" f translate3 src/Picture/Base.hs 120;" f translateFloatingCamera src/Dodge/Update/Camera.hs 48;" f @@ -5949,13 +5983,13 @@ trySiphonFuel src/Dodge/Euse.hs 46;" f trySpinByCID src/Dodge/Projectile/Update.hs 94;" f turnTo src/Dodge/Movement/Turn.hs 4;" f turnToAmount src/Dodge/Movement/Turn.hs 15;" f -turretItemOffset src/Dodge/Item/HeldOffset.hs 15;" f +turretItemOffset src/Dodge/Item/HeldOffset.hs 16;" f tweenAngles src/Geometry/Vector.hs 184;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 78;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 27;" f twists src/Dodge/Creature/Test.hs 103;" f twoFlat src/Dodge/Creature/Test.hs 100;" f -twoFlatHRot src/Dodge/Item/HeldOffset.hs 100;" f +twoFlatHRot src/Dodge/Item/HeldOffset.hs 81;" f twoRoomPoss src/Dodge/PlacementSpot.hs 147;" f twoStep1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 388;" f twoStepS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 424;" f @@ -5980,7 +6014,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 348;" f +updateAutoRecharge src/Dodge/Creature/State.hs 370;" f updateBackspaceRegex src/Dodge/Update/Input/InGame.hs 159;" f updateBarrel src/Dodge/Barreloid.hs 45;" f updateBarreloid src/Dodge/Barreloid.hs 13;" f @@ -6020,10 +6054,11 @@ updateIMl' src/Dodge/Update.hs 391;" f updateInGameCamera src/Dodge/Update/Camera.hs 71;" f updateInitialPressInGame src/Dodge/Update/Input/InGame.hs 108;" f updateInstantBullets src/Dodge/Update.hs 535;" f -updateInv src/Dodge/Creature/State.hs 228;" f +updateInv src/Dodge/Creature/State.hs 229;" f updateInventoryPositioning src/Dodge/DisplayInventory.hs 87;" f updateInventorySectionItems src/Dodge/DisplayInventory.hs 143;" f -updateItemTargeting src/Dodge/Creature/State.hs 261;" f +updateItemTargeting src/Dodge/Creature/State.hs 288;" f +updateItemWithOrientation src/Dodge/Creature/State.hs 269;" f updateKeyInGame src/Dodge/Update/Input/InGame.hs 102;" f updateKeysInTerminal src/Dodge/Update/Input/InGame.hs 91;" f updateLampoid src/Dodge/Lampoid.hs 13;" f @@ -6034,7 +6069,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 387;" f +updateMovement src/Dodge/Creature/State.hs 409;" f updateObjCatMaybes src/Dodge/Update.hs 407;" f updateObjMapMaybe src/Dodge/Update.hs 400;" f updatePastWorlds src/Dodge/Update.hs 305;" f @@ -6052,6 +6087,8 @@ updateRadarSweep src/Dodge/RadarSweep.hs 25;" f updateRadarSweeps src/Dodge/Update.hs 449;" f updateRandNode src/TreeHelp.hs 108;" f updateRenderSplit appDodge/Main.hs 105;" f +updateRootItem src/Dodge/Creature/State.hs 247;" f +updateRootItem' src/Dodge/Creature/State.hs 265;" f updateRootItemID src/Dodge/Inventory/Location.hs 41;" f updateScopeZoom src/Dodge/Update/Camera.hs 128;" f updateScopeZoom' src/Dodge/Update/Camera.hs 133;" f @@ -6102,12 +6139,13 @@ upperPrismPolyST src/Shape.hs 106;" f upperPrismPolySU src/Shape.hs 112;" f upperPrismPolyTS src/Shape.hs 118;" f upperRounded src/Shape.hs 181;" f -useBreakListsLinkTest src/Dodge/Item/Grammar.hs 21;" f +useBreakL' src/Dodge/Item/Grammar.hs 21;" 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 useE src/Dodge/Euse.hs 24;" f -useEquipment src/Dodge/Creature/State.hs 222;" f +useEquipment src/Dodge/Creature/State.hs 223;" f useGasParams src/Dodge/HeldUse.hs 376;" f useHotKey src/Dodge/Creature/YourControl.hs 49;" f useItemHotkey src/Dodge/Creature/Impulse/UseItem.hs 126;" f @@ -6128,7 +6166,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 214;" f +useUpdate src/Dodge/Creature/State.hs 215;" f usedRoomInLinkPoss src/Dodge/PlacementSpot.hs 196;" f usedRoomLinkPoss src/Dodge/PlacementSpot.hs 203;" f v2z src/Geometry/Vector3D.hs 93;" f @@ -6138,7 +6176,7 @@ vNormal src/Geometry/Vector.hs 137;" f vNormaly src/Geometry/Vector3D.hs 72;" f vShape src/Dodge/Placement/Instance/LightSource.hs 114;" f vToL src/MatrixHelper.hs 46;" f -vToQuat src/Quaternion.hs 38;" f +vToQuat src/Quaternion.hs 39;" f validTerminalCommands src/Dodge/Debug/Terminal.hs 130;" f vasTightStride src/Shader/Compile.hs 297;" f vecBetweenSpeed src/Dodge/Base.hs 124;" f