From be6ea59d1e84fd7b4f88cef72b2055d9a3957f9f Mon Sep 17 00:00:00 2001 From: justin Date: Fri, 27 Jun 2025 10:42:23 +0100 Subject: [PATCH] Use function on location to determine laser orientation --- src/Dodge/Creature/State.hs | 57 ++++- src/Dodge/Data/DoubleTree.hs | 44 ++++ src/Dodge/DoubleTree.hs | 306 +++++++++++++++------------ src/Dodge/Item/Orientation.hs | 14 ++ tags | 381 +++++++++++++++++----------------- 5 files changed, 478 insertions(+), 324 deletions(-) diff --git a/src/Dodge/Creature/State.hs b/src/Dodge/Creature/State.hs index 9d7f0a948..18acaec88 100644 --- a/src/Dodge/Creature/State.hs +++ b/src/Dodge/Creature/State.hs @@ -3,6 +3,8 @@ module Dodge.Creature.State ( doDamage, ) where +import Data.Bifunctor +import Dodge.Data.DoubleTree import Dodge.Item.Orientation import Dodge.Item.UseDelay import Control.Applicative @@ -20,7 +22,7 @@ import Dodge.Creature.Test import Dodge.Damage import Dodge.Data.ComposedItem import Dodge.Data.Damage.Type -import Dodge.Data.DoubleTree +--import Dodge.Data.DoubleTree import Dodge.Data.World import Dodge.DoubleTree import Dodge.Euse @@ -308,7 +310,8 @@ updateItemWithOrientation :: updateItemWithOrientation cr m loc@(LocLDT _ itmtree) w = case (ci ^. _1 . itType, ci ^. _2) of (HELD TORCH, _) -> shineTorch cr itmtree m w - (HELD LASER, WeaponTargetingSF) -> shineTargetLaser cr itmtree m w + --(HELD LASER, WeaponTargetingSF) -> shineTargetLaser cr itmtree m w + (HELD LASER, WeaponTargetingSF) -> shineTargetLaser' cr loc w (TARGETING tt, _) -> updateItemTargeting tt cr itm w (ARHUD, _) -> drawARHUD loc w _ -> w @@ -324,13 +327,12 @@ drawARHUD (LocLDT con _) w = fromMaybe w $ do <>~ fold (drawTargetingAR itm w <|> drawMapperAR itm w) -shineTargetLaser :: +shineTargetLaser' :: Creature -> - LDTree ItemLink CItem -> - (Point3, Q.Quaternion Float) -> + LocationLDT ItemLink CItem -> World -> World -shineTargetLaser cr itmtree (p, q) w = fromMaybe (w & pointittarg . itTgPos .~ Nothing) $ do +shineTargetLaser' cr loc w = fromMaybe (w & pointittarg . itTgPos .~ Nothing) $ do guard (crIsAiming cr) (_, mag) <- find (isammolink . fst) (itmtree ^. ldtLeft) i <- mag ^. ldtValue . _1 . itConsumables @@ -354,6 +356,8 @@ shineTargetLaser cr itmtree (p, q) w = fromMaybe (w & pointittarg . itTgPos .~ N , _lpType = TargetingLaser (_itID itm) } where + itmtree = loc ^. locLDT + (p,q) = orientLocation $ fmap fst loc x = 1 isammolink AmmoInLink{} = True isammolink _ = False @@ -365,6 +369,47 @@ shineTargetLaser cr itmtree (p, q) w = fromMaybe (w & pointittarg . itTgPos .~ N invid = _ilInvID $ _itLocation itm col = blue -- mixColors reloadFrac (1-reloadFrac) blue red +--shineTargetLaser :: +-- Creature -> +-- LDTree ItemLink CItem -> +-- (Point3, Q.Quaternion Float) -> +-- World -> +-- World +--shineTargetLaser cr itmtree (p, q) w = fromMaybe (w & pointittarg . itTgPos .~ Nothing) $ do +-- guard (crIsAiming cr) +-- (_, mag) <- find (isammolink . fst) (itmtree ^. ldtLeft) +-- i <- mag ^. ldtValue . _1 . itConsumables +-- guard $ i >= x +-- maginvid <- mag ^? ldtValue . _1 . itLocation . ilInvID +-- return $ +-- w +-- & worldEventFlags . at InventoryChange ?~ () +-- & cWorld . lWorld . creatures . ix (_crID cr) +-- . crInv +-- . ix maginvid +-- . itConsumables +-- . _Just +-- -~ x +-- & cWorld . lWorld . lasers +-- .:~ Laser +-- { _lpPhaseV = 1 +-- , _lpDir = _crDir cr + argV (Q.qToV2 q) +-- , _lpPos = pos +-- , _lpColor = col +-- , _lpType = TargetingLaser (_itID itm) +-- } +-- where +-- x = 1 +-- isammolink AmmoInLink{} = True +-- isammolink _ = False +-- pos = _crPos cr + xyV3 (rotate3 cdir (p + V3 5 0 0)) +-- cdir = _crDir cr +-- itm = itmtree ^. ldtValue . _1 +-- pointittarg = cWorld . lWorld . creatures . ix cid . crInv . ix invid . itTargeting +-- cid = _crID cr +-- invid = _ilInvID $ _itLocation itm +-- col = blue -- mixColors reloadFrac (1-reloadFrac) blue red + shineTorch :: Creature -> LDTree ItemLink CItem -> diff --git a/src/Dodge/Data/DoubleTree.hs b/src/Dodge/Data/DoubleTree.hs index 10b171add..870b25e44 100644 --- a/src/Dodge/Data/DoubleTree.hs +++ b/src/Dodge/Data/DoubleTree.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} --{-# LANGUAGE StrictData #-} @@ -79,9 +80,52 @@ instance Bifunctor LDTree where (map (bimap f (first f)) l) (map (bimap f (first f)) r) + +data ContextDT a + = TopDT + | LeftwardDT + { _cdtUp :: ContextDT a + , _cdtCloseLeft :: [DoubleTree a] + , _cdtParent :: a + , _cdtCloseRight :: [DoubleTree a] + , _cdtFarRight :: [DoubleTree a] + } + | RightwardDT + { _cdtUp :: ContextDT a + , _cdtFarLeft :: [ DoubleTree a] + , _cdtCloseLeft :: [DoubleTree a] + , _cdtParent :: a + , _cdtCloseRight :: [DoubleTree a] + } + +data LocationDT b a = LocDT + { _locDtContext :: ContextDT a + , _locDT :: DoubleTree a + } + makeLenses ''DoubleTree makeLenses ''LDTree makeLenses ''LocationLDT makeLenses ''ContextLDT + +instance Functor (LocationLDT b) where + fmap f (LocLDT c t) = LocLDT (fmap f c) (fmap f t) + +instance Functor (ContextLDT b) where + fmap f = \case + TopLDT -> TopLDT + LeftwardLDT u cl p l cr fr -> LeftwardLDT (fmap f u) + (fmap (fmap (fmap f)) cl) + (f p) + l + (fmap (fmap (fmap f)) cr) + (fmap (fmap (fmap f)) fr) + RightwardLDT u fl cl p l cr -> RightwardLDT (fmap f u) + (fmap (fmap (fmap f)) fl) + (fmap (fmap (fmap f)) cl) + (f p) + l + (fmap (fmap (fmap f)) cr) + --deriveJSON defaultOptions ''DoubleTree --deriveJSON defaultOptions ''LabelDoubleTree diff --git a/src/Dodge/DoubleTree.hs b/src/Dodge/DoubleTree.hs index 3b05603c4..cc590fcdf 100644 --- a/src/Dodge/DoubleTree.hs +++ b/src/Dodge/DoubleTree.hs @@ -1,10 +1,10 @@ module Dodge.DoubleTree where -import Dodge.Data.DoubleTree -import qualified Data.IntMap.Strict as IM import Control.Lens import Data.Bifunctor +import qualified Data.IntMap.Strict as IM import Data.Monoid +import Dodge.Data.DoubleTree singleDT :: a -> DoubleTree a singleDT x = DT x [] [] @@ -17,172 +17,203 @@ ldtToDT (LDT x l r) = DT x (map (ldtToDT . snd) l) (map (ldtToDT . snd) r) -- propagate 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 - -> LDTree b a -> LDTree c a +ldtPropagate :: + (c -> b -> c) -> + (c -> b -> c) -> + c -> + LDTree b a -> + LDTree 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 - -> LDTree 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 +ldtPropagateFold :: + (c -> a -> b -> a -> c) -> + (c -> a -> b -> a -> c) -> + (c -> a -> d -> d) -> + c -> + LDTree 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 -- 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-tree, the updated value is used to update a final value (of type d). -ldtPropagateFoldTree :: (c -> a -> b -> a -> c) - -> (c -> a -> b -> a -> c) - -> (c -> LDTree b a -> d -> d) - -> c - -> LDTree b a - -> d - -> d -ldtPropagateFoldTree lf rf up x t@(LDT v l r) = - alaf Endo foldMap (\(s,y) -> ldtPropagateFoldTree lf rf up (rf x v s (_ldtValue y)) y) r - . alaf Endo foldMap (\(s,y) -> ldtPropagateFoldTree lf rf up (lf x v s (_ldtValue y)) y) l - . up x t +ldtPropagateFoldTree :: + (c -> a -> b -> a -> c) -> + (c -> a -> b -> a -> c) -> + (c -> LDTree b a -> d -> d) -> + c -> + LDTree b a -> + d -> + d +ldtPropagateFoldTree lf rf up x t@(LDT v l r) = + alaf Endo foldMap (\(s, y) -> ldtPropagateFoldTree lf rf up (rf x v s (_ldtValue y)) y) r + . alaf Endo foldMap (\(s, y) -> ldtPropagateFoldTree lf rf up (lf x v s (_ldtValue y)) y) l + . up x t -ildtPropagate :: (Int -> c -> b -> c) -> (Int -> c -> b -> c) - -> c - -> LDTree b a -> LDTree c a +ildtPropagate :: + (Int -> c -> b -> c) -> + (Int -> c -> b -> c) -> + c -> + LDTree b a -> + LDTree 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) + go f y i (z, t) = (f i y z, ildtPropagate lf rf (f i y z) t) ldtPropagateIndices :: LDTree b a -> LDTree b (a, [Either Int Int]) -ldtPropagateIndices (LDT x l r) = LDT (x,[]) (imap (f Left) l) (imap (f Right) r) +ldtPropagateIndices (LDT x l r) = LDT (x, []) (imap (f Left) l) (imap (f Right) r) where - f e i (y,t) = (y, second (e i:) <$> ldtPropagateIndices t) + f e i (y, t) = (y, second (e i :) <$> ldtPropagateIndices t) --- conceptually, in a tree growing from left to right, +-- 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 -doubleTreeToIndentList :: DoubleTree a -> [(a,Int,DoubleTreeNodeType)] +doubleTreeToIndentList :: DoubleTree a -> [(a, Int, DoubleTreeNodeType)] doubleTreeToIndentList = dtIL DTRootNode -dtIL :: DoubleTreeNodeType -> DoubleTree a -> [(a,Int,DoubleTreeNodeType)] -dtIL nt (DT x l r) = map doindent (concat (headMap (dtIL DTBottomNode) (dtIL DTMidBelowNode) l)) - ++ [(x,0,nt)] - ++ map doindent (concat (lastMap (dtIL DTTopNode) (dtIL DTMidAboveNode) r)) +dtIL :: DoubleTreeNodeType -> DoubleTree a -> [(a, Int, DoubleTreeNodeType)] +dtIL nt (DT x l r) = + map doindent (concat (headMap (dtIL DTBottomNode) (dtIL DTMidBelowNode) l)) + ++ [(x, 0, nt)] + ++ map doindent (concat (lastMap (dtIL DTTopNode) (dtIL DTMidAboveNode) r)) where - doindent (a,b,c) = (a,b+1,c) + doindent (a, b, c) = (a, b + 1, c) dtToAdjacency :: (a -> Int) -> DoubleTree a -> IM.IntMap [Int] -dtToAdjacency f (DT x l r) = IM.insert (f x) (map g l <> map g r) - . IM.unions $ map (dtToAdjacency f) $ l <> r - where +dtToAdjacency f (DT x l r) = + IM.insert (f x) (map g l <> map g r) + . IM.unions + $ map (dtToAdjacency f) $ l <> r + where g = f . _dtValue dtToIntMapWithRoot :: (a -> Int) -> DoubleTree a -> IM.IntMap (Maybe Int, DoubleTree a) -dtToIntMapWithRoot f t@(DT x l r) = IM.insert (f x) (Nothing, t) $ - foldMap (dtToRootIntMap' (f x) f) $ l <> r +dtToIntMapWithRoot f t@(DT x l r) = + IM.insert (f x) (Nothing, t) $ + foldMap (dtToRootIntMap' (f x) f) $ l <> r dtToRootIntMap' :: Int -> (a -> Int) -> DoubleTree a -> IM.IntMap (Maybe Int, DoubleTree a) -dtToRootIntMap' root f t@(DT x l r) = IM.insert (f x) (Just root, t) $ - foldMap (dtToRootIntMap' root f) $ l <> r +dtToRootIntMap' root f t@(DT x l r) = + IM.insert (f x) (Just root, t) $ + foldMap (dtToRootIntMap' root f) $ l <> r -dtToUpDownAdj :: (a -> Int) -> DoubleTree a -> IM.IntMap ([Int],[Int]) -dtToUpDownAdj f (DT x l r) = IM.insert (f x) (map g l , map g r) - . IM.unions $ map (dtToUpDownAdj f) $ l <> r - where +dtToUpDownAdj :: (a -> Int) -> DoubleTree a -> IM.IntMap ([Int], [Int]) +dtToUpDownAdj f (DT x l r) = + IM.insert (f x) (map g l, map g r) + . IM.unions + $ map (dtToUpDownAdj f) $ l <> r + where g = f . _dtValue -- returns an adjacency map with oldest ancestor and direct parent if they exist -- and any left and right children -dtToLRAdj :: (a -> Int) -> DoubleTree a -> IM.IntMap (Maybe (Int,Int),[Int],[Int]) -dtToLRAdj f (DT x l r) = IM.insert i (Nothing,map g l , map g r) - . IM.unions $ map (dtToAdjRootParent i i f) $ l <> r - where +dtToLRAdj :: (a -> Int) -> DoubleTree a -> IM.IntMap (Maybe (Int, Int), [Int], [Int]) +dtToLRAdj f (DT x l r) = + IM.insert i (Nothing, map g l, map g r) + . IM.unions + $ map (dtToAdjRootParent i i f) $ l <> r + where i = f x g = f . _dtValue -- returns an adjacency map with oldest ancestor and direct parent if they exist -- and any left and right children -- allows to propagate failure in the index discovery -dtToLRAdjEither :: (a -> Either String Int) -> DoubleTree a - -> Either String (IM.IntMap (Maybe (Int,Int),[Int],[Int])) +dtToLRAdjEither :: + (a -> Either String Int) -> + DoubleTree a -> + Either String (IM.IntMap (Maybe (Int, Int), [Int], [Int])) dtToLRAdjEither f (DT x l r) = do i <- f x l' <- mapM g l r' <- mapM g r childrenasnodes <- mapM (dtToAdjRootParentEither i i f) $ l <> r - return $ IM.insert i (Nothing,l' , r') - $ IM.unions childrenasnodes - where + return $ + IM.insert i (Nothing, l', r') $ + IM.unions childrenasnodes + where g = f . _dtValue -dtToAdjRootParent :: Int -> Int -> (a -> Int) -> DoubleTree a -> IM.IntMap (Maybe (Int,Int),[Int],[Int]) -dtToAdjRootParent root par f (DT x l r) = IM.insert (f x) (Just (root,par),map g l , map g r) - . IM.unions $ map (dtToAdjRootParent root (f x) f) $ l <> r - where +dtToAdjRootParent :: Int -> Int -> (a -> Int) -> DoubleTree a -> IM.IntMap (Maybe (Int, Int), [Int], [Int]) +dtToAdjRootParent root par f (DT x l r) = + IM.insert (f x) (Just (root, par), map g l, map g r) + . IM.unions + $ map (dtToAdjRootParent root (f x) f) $ l <> r + where g = f . _dtValue -dtToAdjRootParentEither :: Int -> Int - -> (a -> Either String Int) -> DoubleTree a -> Either String (IM.IntMap (Maybe (Int,Int),[Int],[Int])) +dtToAdjRootParentEither :: + Int -> + Int -> + (a -> Either String Int) -> + DoubleTree a -> + Either String (IM.IntMap (Maybe (Int, Int), [Int], [Int])) dtToAdjRootParentEither root par f (DT x l r) = do i <- f x l' <- mapM g l r' <- mapM g r childrenasnodes <- mapM (dtToAdjRootParentEither root i f) $ l <> r - return $ IM.insert i (Just (root,par),l' , r') $ IM.unions childrenasnodes - where + return $ IM.insert i (Just (root, par), l', r') $ IM.unions childrenasnodes + where g = f . _dtValue ldtToIM :: (a -> Int) -> LDTree b a -> IM.IntMap (LDTree b a) -ldtToIM f t@(LDT x l r) = IM.insert (f x) t $ IM.unions $ map (ldtToIM f . snd) $ l <> r +ldtToIM f t@(LDT x l r) = IM.insert (f x) t $ IM.unions $ map (ldtToIM f . snd) $ l <> r -ldtToIndentList :: LDTree b a -> [(a,Int,LabelDoubleTreeNodeType b)] +ldtToIndentList :: LDTree b a -> [(a, Int, LabelDoubleTreeNodeType b)] ldtToIndentList = ldtIL LDTRootNode -ldtIL :: LabelDoubleTreeNodeType b -> LDTree b a -> [(a,Int,LabelDoubleTreeNodeType b)] -ldtIL nt (LDT x l r) = map doindent - (concat - (headMap - (\(lab,c) -> ldtIL (LDTBottomNode lab) c) - (\(lab,c) -> ldtIL (LDTMidBelowNode lab) c) - l - ) - ) - ++ [(x,0,nt)] - ++ map doindent - (concat - (lastMap - (\(lab,c) -> ldtIL (LDTTopNode lab) c) - (\(lab,c) -> ldtIL (LDTMidAboveNode lab) c) - r +ldtIL :: LabelDoubleTreeNodeType b -> LDTree b a -> [(a, Int, LabelDoubleTreeNodeType b)] +ldtIL nt (LDT x l r) = + map + doindent + ( concat + ( headMap + (\(lab, c) -> ldtIL (LDTBottomNode lab) c) + (\(lab, c) -> ldtIL (LDTMidBelowNode lab) c) + l ) ) + ++ [(x, 0, nt)] + ++ map + doindent + ( concat + ( lastMap + (\(lab, c) -> ldtIL (LDTTopNode lab) c) + (\(lab, c) -> ldtIL (LDTMidAboveNode lab) c) + r + ) + ) where - doindent (a,b,c) = (a,b+1,c) + doindent (a, b, c) = (a, b + 1, c) headMap :: (a -> b) -> (a -> b) -> [a] -> [b] -headMap f g (x:xs) = f x : map g xs +headMap f g (x : xs) = f x : map g xs headMap _ _ [] = [] lastMap :: (a -> b) -> (a -> b) -> [a] -> [b] lastMap _ _ [] = [] lastMap f _ [x] = [f x] -lastMap f g (x:xs) = g x : lastMap f g xs +lastMap f g (x : xs) = g x : lastMap f g xs prettyDT :: (a -> String) -> DoubleTree a -> [String] -prettyDT f (DT x l r) = concatMap (map ('/':) . prettyDT f) r - ++ (f x : concatMap (map ('\\':) . prettyDT f) l) +prettyDT f (DT x l r) = + concatMap (map ('/' :) . prettyDT f) r + ++ (f x : concatMap (map ('\\' :) . prettyDT f) l) prettyLDT :: (a -> String) -> LDTree b a -> [String] -prettyLDT f (LDT x l r) = concatMap (map ('/':) . prettyLDT f . snd) r - ++ (f x : concatMap (map ('\\':) . prettyLDT f . snd) l) +prettyLDT f (LDT x l r) = + concatMap (map ('/' :) . prettyLDT f . snd) r + ++ (f x : concatMap (map ('\\' :) . prettyLDT f . snd) l) ldtToLoc :: LDTree b a -> LocationLDT b a ldtToLoc = LocLDT TopLDT @@ -190,13 +221,20 @@ ldtToLoc = LocLDT TopLDT -- should probably do tests for these locUp :: LocationLDT b a -> Maybe (LocationLDT b a) locUp (LocLDT TopLDT _) = Nothing -locUp (LocLDT c@LeftwardLDT{} t) = Just $ LocLDT (_cldtUp c) - (LDT (_cldtParent c) (_cldtCloseLeft c ++ ((_cldtLink c,t):_cldtCloseRight c)) (_cldtFarRight c)) -locUp (LocLDT c@RightwardLDT{} t) = Just $ LocLDT (_cldtUp c) - (LDT (_cldtParent c) (_cldtFarLeft c) (_cldtCloseLeft c ++ ((_cldtLink c,t):_cldtCloseRight c))) +locUp (LocLDT c@LeftwardLDT{} t) = + Just $ + LocLDT + (_cldtUp c) + (LDT (_cldtParent c) (_cldtCloseLeft c ++ ((_cldtLink c, t) : _cldtCloseRight c)) (_cldtFarRight c)) +locUp (LocLDT c@RightwardLDT{} t) = + Just $ + LocLDT + (_cldtUp c) + (LDT (_cldtParent c) (_cldtFarLeft c) (_cldtCloseLeft c ++ ((_cldtLink c, t) : _cldtCloseRight c))) locToTop :: LocationLDT b a -> LocationLDT b a locToTop loc = maybe loc locToTop $ locUp loc + --locToTop = fix $ \x -> fromMaybe x $ locUp x locLeftmost :: LocationLDT b a -> LocationLDT b a @@ -207,52 +245,62 @@ locRightmost loc = maybe loc locRightmost $ alaf Last foldMap Just $ locGoRight -- should probably do tests for these locGoLeft :: LocationLDT b a -> [LocationLDT b a] -locGoLeft (LocLDT c (LDT v l r)) = - [ LocLDT (LeftwardLDT c closel v link closer r) t | (closel,(link,t),closer) <- locGoHelp id l] +locGoLeft (LocLDT c (LDT v l r)) = + [LocLDT (LeftwardLDT c closel v link closer r) t | (closel, (link, t), closer) <- locGoHelp id l] -- should probably do tests for these locGoRight :: LocationLDT b a -> [LocationLDT b a] -locGoRight (LocLDT c (LDT v l r)) = - [ LocLDT (RightwardLDT c l closel v link closer) t | (closel,(link,t),closer) <- locGoHelp id r] +locGoRight (LocLDT c (LDT v l r)) = + [LocLDT (RightwardLDT c l closel v link closer) t | (closel, (link, t), closer) <- locGoHelp id r] -- this seems like it might be very inefficient for large lists -- difference lists? -locGoHelp :: (a -> b) -> [a] -> [([a],b,[a])] +locGoHelp :: (a -> b) -> [a] -> [([a], b, [a])] locGoHelp f = go [] where - go cleft (y:ys) = (cleft,f y, ys) : go (cleft <> [y]) ys + go cleft (y : ys) = (cleft, f y, ys) : go (cleft <> [y]) ys go _ [] = [] -- Propgates a value (of type c) down the branches of the ContextLDT. -- 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 context node, the updated value is used to update a final value (of type d). -cldtPropagateFold :: (c -> a -> b -> a -> c) - -> (c -> a -> b -> a -> c) - -> (c -> LocationLDT b a -> d -> d) - -> c - -> LocationLDT b a - -> d - -> d -cldtPropagateFold lf rf up x loc = - alaf Endo foldMap - (\(LocLDT con' t') -> cldtPropagateFold - lf - rf - up - (lf x (_cldtParent con') (_cldtLink con') (_ldtValue t')) - (LocLDT con' t')) +cldtPropagateFold :: + (c -> a -> b -> a -> c) -> + (c -> a -> b -> a -> c) -> + (c -> LocationLDT b a -> d -> d) -> + c -> + LocationLDT b a -> + d -> + d +cldtPropagateFold lf rf up x loc = + alaf + Endo + foldMap + ( \(LocLDT con' t') -> + cldtPropagateFold + lf + rf + up + (lf x (_cldtParent con') (_cldtLink con') (_ldtValue t')) + (LocLDT con' t') + ) (locGoLeft loc) - . alaf Endo foldMap - (\(LocLDT con' t') -> cldtPropagateFold - lf - rf - up - (rf x (_cldtParent con') (_cldtLink con') (_ldtValue t')) - (LocLDT con' t')) - (locGoRight loc) - . up x loc + . alaf + Endo + foldMap + ( \(LocLDT con' t') -> + cldtPropagateFold + lf + rf + up + (rf x (_cldtParent con') (_cldtLink con') (_ldtValue t')) + (LocLDT con' t') + ) + (locGoRight loc) + . up x loc reduceLocLDT :: Monoid m => (LocationLDT b a -> m) -> LocationLDT b a -> m -reduceLocLDT f x =foldMap (reduceLocLDT f) (locGoLeft x) <> f x - <> foldMap (reduceLocLDT f) (locGoRight x) +reduceLocLDT f x = + foldMap (reduceLocLDT f) (locGoLeft x) <> f x + <> foldMap (reduceLocLDT f) (locGoRight x) diff --git a/src/Dodge/Item/Orientation.hs b/src/Dodge/Item/Orientation.hs index 776d85e9a..b7a36a7a1 100644 --- a/src/Dodge/Item/Orientation.hs +++ b/src/Dodge/Item/Orientation.hs @@ -1,7 +1,11 @@ +{-# LANGUAGE LambdaCase #-} module Dodge.Item.Orientation ( orientAttachment, + orientLocation, ) where +import Dodge.DoubleTree +import Dodge.Data.DoubleTree import Dodge.Data.ComposedItem import Dodge.Data.Item import Geometry.Data @@ -11,6 +15,7 @@ orientChild :: Item -> (Point3, Q.Quaternion Float) orientChild itm = case _itType itm of HELD TORCH -> (V3 0 5 0, Q.qID) HELD LASER -> (V3 15 (-5) 0, Q.qID) + ATTACH UNDERBARRELSLOT -> (V3 10 (-8) 0, Q.qID) _ -> (0, Q.qID) orientByLink :: Item -> ItemLink -> (Point3, Q.Quaternion Float) @@ -22,9 +27,18 @@ orientByLink itm lt = case (_itType itm, lt) of orientAttachment :: Item -> ItemLink -> Item -> (Point3, Q.Quaternion Float) orientAttachment par lnk ch = case (_itType par, lnk, _itType ch) of + (ATTACH UNDERBARRELSLOT, _, _) -> (V3 (-5) (-8) 0, Q.qID) -- (HELD BURSTRIFLE, _, HELD TORCH) -> (V3 20 0 0, Q.axisAngle (V3 0 0 1) (pi/2)) -- (HELD LAUNCHER, _, HELD TORCH) -> (V3 0 20 0, Q.axisAngle (V3 0 0 1) (pi/4)) _ -> (t1 + Q.rotate q1 t2, q1 * q2) where (t1, q1) = orientByLink par lnk (t2, q2) = orientChild ch + +orientLocation :: LocationLDT ItemLink Item -> (Point3, Q.Quaternion Float) +orientLocation = \case + (LocLDT TopLDT _) -> (0, Q.qID) + (LocLDT c t) -> (p + Q.rotate q p1, q * q1) + where + (p,q) = orientLocation (LocLDT (_cldtUp c) (singleLDT (_cldtParent c))) + (p1,q1) = orientAttachment (_cldtParent c) (_cldtLink c) (_ldtValue t) diff --git a/tags b/tags index 11586e2e9..e22bb9539 100644 --- a/tags +++ b/tags @@ -29,7 +29,7 @@ APNothing src/Dodge/Data/Item/Use.hs 48;" C APProjectiles src/Dodge/Data/Item/Use.hs 46;" C AQUAMARINE src/Color/Data.hs 24;" C ARHUD src/Dodge/Data/Item/Combine.hs 35;" C -ARHUDSF src/Dodge/Data/ComposedItem.hs 47;" C +ARHUDSF src/Dodge/Data/ComposedItem.hs 46;" C ATTACH src/Dodge/Data/Item/Combine.hs 20;" C AUTOAMR src/Dodge/Data/Item/Combine.hs 159;" C AUTOPISTOL src/Dodge/Data/Item/Combine.hs 145;" C @@ -58,20 +58,20 @@ AlwaysSingleTrigger src/Dodge/Data/TriggerType.hs 13;" C Ambush src/Dodge/Data/ActionPlan.hs 178;" C Ammo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 3;" m Ammo src/Dodge/Item/Ammo.hs 1;" m -AmmoEffectLink src/Dodge/Data/ComposedItem.hs 19;" C -AmmoEffectSF src/Dodge/Data/ComposedItem.hs 57;" C -AmmoInLink src/Dodge/Data/ComposedItem.hs 14;" C -AmmoMagSF src/Dodge/Data/ComposedItem.hs 48;" C +AmmoEffectLink src/Dodge/Data/ComposedItem.hs 18;" C +AmmoEffectSF src/Dodge/Data/ComposedItem.hs 56;" C +AmmoInLink src/Dodge/Data/ComposedItem.hs 13;" C +AmmoMagSF src/Dodge/Data/ComposedItem.hs 47;" C AmmoMagType src/Dodge/Data/Item/Combine.hs 105;" t -AmmoModLink src/Dodge/Data/ComposedItem.hs 16;" C -AmmoModifierSF src/Dodge/Data/ComposedItem.hs 54;" C +AmmoModLink src/Dodge/Data/ComposedItem.hs 15;" C +AmmoModifierSF src/Dodge/Data/ComposedItem.hs 53;" C AmmoParams src/Dodge/Data/Item/Use.hs 51;" t -AmmoPayloadLink src/Dodge/Data/ComposedItem.hs 18;" C -AmmoPayloadSF src/Dodge/Data/ComposedItem.hs 56;" C +AmmoPayloadLink src/Dodge/Data/ComposedItem.hs 17;" C +AmmoPayloadSF src/Dodge/Data/ComposedItem.hs 55;" C AmmoPerShot src/Dodge/Data/Muzzle.hs 52;" t AmmoSlots src/Dodge/Item/AmmoSlots.hs 3;" m -AmmoTargetingLink src/Dodge/Data/ComposedItem.hs 17;" C -AmmoTargetingSF src/Dodge/Data/ComposedItem.hs 55;" C +AmmoTargetingLink src/Dodge/Data/ComposedItem.hs 16;" C +AmmoTargetingSF src/Dodge/Data/ComposedItem.hs 54;" C AmmoType src/Dodge/Data/AmmoType.hs 3;" m AnRoom src/Dodge/Annotation/Data.hs 18;" C AnTree src/Dodge/Annotation/Data.hs 19;" C @@ -250,7 +250,7 @@ CHARTREUSE src/Color/Data.hs 25;" C CHEMFUELPOUCH src/Dodge/Data/Item/Combine.hs 111;" C CHeal src/Dodge/Data/Item/HeldUse.hs 16;" C CIRCLE src/Dodge/Data/GenParams.hs 20;" C -CItem src/Dodge/Data/ComposedItem.hs 66;" t +CItem src/Dodge/Data/ComposedItem.hs 65;" t CLICKER src/Dodge/Data/Item/Combine.hs 28;" C CME src/Dodge/Data/MuzzleEffect.hs 14;" C COPIER src/Dodge/Data/Item/Combine.hs 29;" C @@ -356,7 +356,8 @@ ConsumableItemType src/Dodge/Data/Item/Combine.hs 114;" 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 48;" t +ContextDT src/Dodge/Data/DoubleTree.hs 82;" t +ContextLDT src/Dodge/Data/DoubleTree.hs 41;" t ContinentalGovernment src/Dodge/Data/Scenario.hs 51;" C ControlDeckSS src/Dodge/Data/Scenario.hs 89;" C ConvexPoly src/Geometry/ConvexPoly.hs 27;" t @@ -628,7 +629,7 @@ Equipment src/Dodge/Default/Item/Use/Equipment.hs 1;" m Equipment src/Dodge/Equipment.hs 1;" m Equipment src/Dodge/Item/Equipment.hs 1;" m EquipmentAllocation src/Dodge/Data/RightButtonOptions.hs 18;" t -EquipmentPlatformSF src/Dodge/Data/ComposedItem.hs 41;" C +EquipmentPlatformSF src/Dodge/Data/ComposedItem.hs 40;" C Escape src/Dodge/Data/Scenario.hs 10;" C EscapeMenuOption src/Dodge/Data/Universe.hs 76;" t Essential src/Shape/Data.hs 34;" C @@ -727,8 +728,8 @@ FullRes src/Dodge/Data/Config.hs 97;" C FullShadowFidelity src/Shape/Data.hs 24;" C FullSize src/Dodge/Data/Item/Params.hs 28;" C FullyVisible src/Dodge/Data/CamouflageStatus.hs 6;" C -FunctionChangeLink src/Dodge/Data/ComposedItem.hs 27;" C -FunctionChangeSF src/Dodge/Data/ComposedItem.hs 58;" C +FunctionChangeLink src/Dodge/Data/ComposedItem.hs 26;" C +FunctionChangeSF src/Dodge/Data/ComposedItem.hs 57;" C GBounce src/Dodge/Data/Projectile.hs 57;" C GEqC src/SameConstr.hs 20;" c GIMBAL src/Dodge/Data/Item/Combine.hs 96;" C @@ -741,7 +742,7 @@ GStick src/Dodge/Data/Projectile.hs 58;" C GStuckCreature src/Dodge/Data/Projectile.hs 59;" C GStuckWall src/Dodge/Data/Projectile.hs 60;" C GYROSCOPE src/Dodge/Data/Item/Combine.hs 97;" C -GadgetPlatformSF src/Dodge/Data/ComposedItem.hs 42;" C +GadgetPlatformSF src/Dodge/Data/ComposedItem.hs 41;" C GameOverOptions src/Dodge/Data/Universe.hs 72;" C GameRoom src/Dodge/GameRoom.hs 15;" t GameRoom src/Dodge/GameRoom.hs 8;" m @@ -786,8 +787,8 @@ GraphHelp src/GraphHelp.hs 1;" m GraphVizHelp src/GraphVizHelp.hs 2;" m Grenade src/Dodge/Data/Projectile.hs 42;" C GrenadeHitEffect src/Dodge/Data/Projectile.hs 56;" t -GrenadeHitEffectLink src/Dodge/Data/ComposedItem.hs 32;" C -GrenadeHitEffectSF src/Dodge/Data/ComposedItem.hs 61;" C +GrenadeHitEffectLink src/Dodge/Data/ComposedItem.hs 31;" C +GrenadeHitEffectSF src/Dodge/Data/ComposedItem.hs 60;" C Grid src/Grid.hs 1;" m Gust src/Dodge/Data/Gust.hs 13;" t Gust src/Dodge/Data/Gust.hs 6;" m @@ -822,7 +823,7 @@ Held src/Dodge/Item/Held.hs 1;" m HeldDelay src/Dodge/Data/Item/HeldDelay.hs 6;" m HeldItemType src/Dodge/Data/Item/Combine.hs 138;" t HeldOffset src/Dodge/Item/HeldOffset.hs 2;" m -HeldPlatformSF src/Dodge/Data/ComposedItem.hs 38;" C +HeldPlatformSF src/Dodge/Data/ComposedItem.hs 37;" C HeldScroll src/Dodge/HeldScroll.hs 1;" m HeldUse src/Dodge/Data/Item/HeldUse.hs 6;" m HeldUse src/Dodge/HeldUse.hs 5;" m @@ -910,7 +911,7 @@ Intention src/Dodge/Data/Creature.hs 66;" t Intention src/Dodge/Creature/Intention.hs 1;" m Intersect src/Geometry/Intersect.hs 5;" m IntersectingRoomClipBoundaries src/Dodge/Data/Config.hs 107;" C -IntroScanSF src/Dodge/Data/ComposedItem.hs 45;" C +IntroScanSF src/Dodge/Data/ComposedItem.hs 44;" C IntroScanType src/Dodge/Data/Item/Combine.hs 44;" t InvInt src/Dodge/Data/Item/Location.hs 19;" t InvSize src/Dodge/Item/InvSize.hs 2;" m @@ -943,7 +944,7 @@ ItemCancelExamineInventory src/Dodge/Data/Item/Effect.hs 31;" C ItemClust src/Dodge/Combine/Graph.hs 21;" C ItemCopierUpdate src/Dodge/Data/Item/Effect.hs 32;" C ItemDimension src/Dodge/Data/Item/Misc.hs 13;" t -ItemLink src/Dodge/Data/ComposedItem.hs 13;" t +ItemLink src/Dodge/Data/ComposedItem.hs 12;" t ItemLocation src/Dodge/Data/Item/Location.hs 28;" t ItemParamID src/Dodge/Data/Item/Params.hs 26;" C ItemParams src/Dodge/Data/Item/Params.hs 14;" t @@ -954,7 +955,7 @@ ItemScrollInt src/Dodge/Data/Item.hs 53;" C ItemScrollIntRange src/Dodge/Data/Item.hs 54;" C ItemScrollTimeFlow src/Dodge/Data/World.hs 62;" C ItemSetWarmTime src/Dodge/Data/Item/Effect.hs 34;" C -ItemStructuralFunction src/Dodge/Data/ComposedItem.hs 36;" t +ItemStructuralFunction src/Dodge/Data/ComposedItem.hs 35;" t ItemTargeting src/Dodge/Data/Item.hs 56;" t ItemType src/Dodge/Data/Item/Combine.hs 16;" t ItemUse src/Dodge/Data/Item/Use.hs 30;" t @@ -968,29 +969,28 @@ JGK src/Control/Foldl/JGK.hs 1;" m JOYSTICK src/Dodge/Data/Item/Combine.hs 95;" C JUMPLEGS src/Dodge/Data/Item/Combine.hs 130;" C JoinClust src/Dodge/Combine/Graph.hs 22;" C -JoystickLink src/Dodge/Data/ComposedItem.hs 22;" C -JoystickSF src/Dodge/Data/ComposedItem.hs 50;" C +JoystickLink src/Dodge/Data/ComposedItem.hs 21;" C +JoystickSF src/Dodge/Data/ComposedItem.hs 49;" C Just' src/MaybeHelp.hs 13;" C JustStartedPlaying src/Sound/Data.hs 24;" C Justify src/Justify.hs 1;" m KEYCARD src/Dodge/Data/Item/Combine.hs 177;" C Kill src/Dodge/Data/ActionPlan.hs 198;" C LASER src/Dodge/Data/Item/Combine.hs 168;" C -LDT src/Dodge/Data/DoubleTree.hs 40;" C +LDT src/Dodge/Data/DoubleTree.hs 33;" C LDTBottomNode src/Dodge/Data/DoubleTree.hs 28;" C -LDTComb src/Dodge/Item/Grammar.hs 233;" t +LDTComb src/Dodge/Item/Grammar.hs 162;" t LDTMidAboveNode src/Dodge/Data/DoubleTree.hs 26;" C LDTMidBelowNode src/Dodge/Data/DoubleTree.hs 27;" C LDTRootNode src/Dodge/Data/DoubleTree.hs 24;" C LDTTopNode src/Dodge/Data/DoubleTree.hs 25;" C +LDTree src/Dodge/Data/DoubleTree.hs 33;" t LED src/Dodge/Data/Item/Combine.hs 77;" C LHS src/Geometry/LHS.hs 1;" m LIGHTER src/Dodge/Data/Item/Combine.hs 66;" C LIGHTSENSOR src/Dodge/Data/Item/Combine.hs 80;" C LS src/Dodge/Data/LightSource.hs 23;" C LSParam src/Dodge/Data/LightSource.hs 16;" t -LTest src/Dodge/Data/ComposedItem.hs 70;" C -LUpdate src/Dodge/Data/ComposedItem.hs 75;" C LWorld src/Dodge/Data/LWorld.hs 97;" t LWorld src/Dodge/Data/LWorld.hs 6;" m LabLink src/Dodge/Data/Room.hs 45;" C @@ -998,7 +998,6 @@ LabSS src/Dodge/Data/Scenario.hs 97;" C Label src/Dodge/Render/Label.hs 1;" m LabelAction src/Dodge/Data/ActionPlan.hs 79;" C LabelCluster src/Dodge/Data/RoomCluster.hs 14;" C -LabelDoubleTree src/Dodge/Data/DoubleTree.hs 40;" t LabelDoubleTreeNodeType src/Dodge/Data/DoubleTree.hs 23;" t Laboratory src/Dodge/Data/Scenario.hs 61;" C Lamp src/Dodge/Creature/Lamp.hs 1;" m @@ -1026,7 +1025,8 @@ LeadTarget src/Dodge/Data/ActionPlan.hs 149;" C Left src/Dodge/Item/Left.hs 1;" m LeftConsumption src/Dodge/Data/Item/Use/Consumption.hs 25;" t LeftForward src/Dodge/Data/Creature/Stance.hs 32;" C -LeftwardLDT src/Dodge/Data/DoubleTree.hs 50;" C +LeftwardDT src/Dodge/Data/DoubleTree.hs 84;" C +LeftwardLDT src/Dodge/Data/DoubleTree.hs 43;" C LensHelp src/LensHelp.hs 1;" m Lethargic src/Dodge/Data/Creature/Perception.hs 55;" C LevelGen src/Dodge/LevelGen.hs 1;" m @@ -1048,8 +1048,6 @@ LimitedWater src/Dodge/Data/Scenario.hs 40;" C LinearShockwave src/Dodge/Data/LinearShockwave.hs 13;" t LinearShockwave src/Dodge/Data/LinearShockwave.hs 6;" m Link src/Dodge/Room/Link.hs 6;" m -LinkTest src/Dodge/Data/ComposedItem.hs 70;" t -LinkUpdate src/Dodge/Data/ComposedItem.hs 75;" t List src/Dodge/Combine/List.hs 1;" m List src/Dodge/Render/List.hs 3;" m ListDisplayParams src/Dodge/Data/SelectionList.hs 13;" t @@ -1064,11 +1062,13 @@ 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 73;" C -LocLDT src/Dodge/Data/DoubleTree.hs 67;" C +LocDT src/Dodge/Data/DoubleTree.hs 99;" C +LocLDT src/Dodge/Data/DoubleTree.hs 60;" 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 67;" t +LocationDT src/Dodge/Data/DoubleTree.hs 99;" t +LocationLDT src/Dodge/Data/DoubleTree.hs 60;" t Lock src/Dodge/Inventory/Lock.hs 1;" m LockAndKey src/Dodge/LockAndKey.hs 1;" m LoneWolf src/Dodge/Data/Creature/State.hs 26;" C @@ -1130,8 +1130,8 @@ MagnetUpdate src/Dodge/Data/Magnet.hs 13;" t MagnetUpdateTimer src/Dodge/Data/Magnet.hs 13;" C Main appDodge/Main.hs 1;" m Make src/Dodge/Corpse/Make.hs 1;" m -MakeAutoLink src/Dodge/Data/ComposedItem.hs 28;" C -MakeAutoSF src/Dodge/Data/ComposedItem.hs 59;" C +MakeAutoLink src/Dodge/Data/ComposedItem.hs 27;" C +MakeAutoSF src/Dodge/Data/ComposedItem.hs 58;" C MakeSound src/Dodge/Data/ActionPlan.hs 43;" C MakeStartCloudAt src/Dodge/Data/WorldEffect.hs 29;" C MakeTempLight src/Dodge/Data/WorldEffect.hs 33;" C @@ -1139,7 +1139,7 @@ ManipulatedObject src/Dodge/Data/Item/Use/Consumption/LoadAction.hs 20;" t Manipulation src/Dodge/Data/Item/Use/Consumption/LoadAction.hs 14;" t Manipulator src/Dodge/Data/Item/Use/Consumption/LoadAction.hs 15;" C MapperInventory src/Dodge/Data/HUD.hs 31;" C -MapperSF src/Dodge/Data/ComposedItem.hs 63;" C +MapperSF src/Dodge/Data/ComposedItem.hs 62;" C Mass src/Dodge/Creature/Mass.hs 2;" m Material src/Dodge/Data/Material.hs 11;" t Material src/Dodge/Creature/Material.hs 3;" m @@ -1288,7 +1288,7 @@ NoParams src/Dodge/Data/Item/Params.hs 15;" C NoResurrection src/Dodge/Data/Corpse.hs 14;" C NoRightButtonOptions src/Dodge/Data/RightButtonOptions.hs 14;" C NoRoomClipBoundaries src/Dodge/Data/Config.hs 107;" C -NoSF src/Dodge/Data/ComposedItem.hs 53;" C +NoSF src/Dodge/Data/ComposedItem.hs 52;" C NoShadowFidelity src/Shape/Data.hs 25;" C NoShadows src/Dodge/Data/Config.hs 103;" C NoSubInventory src/Dodge/Data/HUD.hs 29;" C @@ -1371,7 +1371,7 @@ Option src/Dodge/Menu/Option.hs 1;" m OptionScreen src/Dodge/Data/Universe.hs 82;" C OptionScreenFlag src/Dodge/Data/Universe.hs 72;" t OptionType src/Dodge/Menu/OptionType.hs 2;" m -Orientation src/Dodge/Item/Orientation.hs 1;" m +Orientation src/Dodge/Item/Orientation.hs 2;" m OutAction src/Dodge/Creature/Action.hs 45;" t OutLink src/Dodge/Data/Room.hs 43;" C OutPlacement src/Dodge/Data/GenWorld.hs 126;" t @@ -1501,8 +1501,8 @@ Projectile src/Dodge/Data/Projectile.hs 17;" t Projectile src/Dodge/Data/Projectile.hs 6;" m Projectile src/Dodge/Projectile.hs 1;" m ProjectileParams src/Dodge/Data/Item/Use.hs 53;" C -ProjectileStabiliserLink src/Dodge/Data/ComposedItem.hs 29;" C -ProjectileStabiliserSF src/Dodge/Data/ComposedItem.hs 60;" C +ProjectileStabiliserLink src/Dodge/Data/ComposedItem.hs 28;" C +ProjectileStabiliserSF src/Dodge/Data/ComposedItem.hs 59;" C ProjectileType src/Dodge/Data/Projectile.hs 41;" t ProjectileUpdate src/Dodge/Data/Projectile.hs 35;" t Prop src/Dodge/Data/Prop.hs 18;" t @@ -1610,11 +1610,11 @@ ReigonalGovernment src/Dodge/Data/Scenario.hs 50;" C Religion src/Dodge/Data/Scenario.hs 47;" C Reload src/Dodge/Data/ActionPlan.hs 190;" C ReloadStatus src/Dodge/Data/Item/Use/Consumption.hs 20;" t -RemoteDetonatorLink src/Dodge/Data/ComposedItem.hs 24;" C -RemoteDetonatorSF src/Dodge/Data/ComposedItem.hs 51;" C +RemoteDetonatorLink src/Dodge/Data/ComposedItem.hs 23;" C +RemoteDetonatorSF src/Dodge/Data/ComposedItem.hs 50;" C RemoteDirectionPU src/Dodge/Data/Projectile.hs 38;" C -RemoteScreenLink src/Dodge/Data/ComposedItem.hs 23;" C -RemoteScreenSF src/Dodge/Data/ComposedItem.hs 49;" C +RemoteScreenLink src/Dodge/Data/ComposedItem.hs 22;" C +RemoteScreenSF src/Dodge/Data/ComposedItem.hs 48;" C RemoveEquipment src/Dodge/Data/RightButtonOptions.hs 36;" C RemoveShieldWall src/Dodge/Data/Item/Effect.hs 27;" C Remove_LOS src/Dodge/Data/Config.hs 77;" C @@ -1639,7 +1639,8 @@ 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 58;" C +RightwardDT src/Dodge/Data/DoubleTree.hs 91;" C +RightwardLDT src/Dodge/Data/DoubleTree.hs 51;" C RoadBlock src/Dodge/Room/RoadBlock.hs 2;" m Rocket src/Dodge/Data/Projectile.hs 43;" C RocketHoming src/Dodge/Data/Projectile.hs 50;" t @@ -1673,7 +1674,7 @@ RoundedFaces src/Shape/Data.hs 18;" C RunPast src/Dodge/Room/RunPast.hs 1;" m RunningSideEffect src/Dodge/Data/Universe.hs 69;" C SCRAPMETAL src/Dodge/Data/Item/Combine.hs 61;" C -SFLink src/Dodge/Data/ComposedItem.hs 33;" C +SFLink src/Dodge/Data/ComposedItem.hs 32;" C SHATTERGUN src/Dodge/Data/Item/Combine.hs 174;" C SHELLMAG src/Dodge/Data/Item/Combine.hs 109;" C SHELLPAYLOAD src/Dodge/Data/Item/Combine.hs 102;" C @@ -1800,8 +1801,8 @@ SkiffBaySS src/Dodge/Data/Scenario.hs 108;" C SleepingQuatersSS src/Dodge/Data/Scenario.hs 90;" C Small src/Shape/Data.hs 31;" C Smoke src/Dodge/Data/Cloud.hs 23;" C -SmokeReducerLink src/Dodge/Data/ComposedItem.hs 25;" C -SmokeReducerSF src/Dodge/Data/ComposedItem.hs 52;" C +SmokeReducerLink src/Dodge/Data/ComposedItem.hs 24;" C +SmokeReducerSF src/Dodge/Data/ComposedItem.hs 51;" C SmoothScroll src/Dodge/SmoothScroll.hs 1;" m SocialUpheaval src/Dodge/Data/Scenario.hs 27;" C SolarGovernment src/Dodge/Data/Scenario.hs 53;" C @@ -2001,10 +2002,11 @@ ToStop src/Sound/Data.hs 28;" C Toggle src/Dodge/Data/Universe.hs 103;" C Toggle2 src/Dodge/Data/Universe.hs 107;" C ToggleExamine src/Dodge/ToggleExamine.hs 1;" m -ToggleSF src/Dodge/Data/ComposedItem.hs 62;" C +ToggleSF src/Dodge/Data/ComposedItem.hs 61;" C +TopDT src/Dodge/Data/DoubleTree.hs 83;" C TopDecoration src/Dodge/Placement/TopDecoration.hs 1;" m TopEscapeMenuOption src/Dodge/Data/Universe.hs 78;" C -TopLDT src/Dodge/Data/DoubleTree.hs 49;" C +TopLDT src/Dodge/Data/DoubleTree.hs 42;" C TorpedoBaySS src/Dodge/Data/Scenario.hs 99;" C TorqueCr src/Dodge/Data/WorldEffect.hs 30;" C TractorBeam src/Dodge/Data/TractorBeam.hs 13;" t @@ -2018,8 +2020,8 @@ TreeHelp src/TreeHelp.hs 12;" m Triangulate src/Geometry/Triangulate.hs 3;" m Trie src/SimpleTrie.hs 9;" t TriggerDoor src/Dodge/Placement/PlaceSpot/TriggerDoor.hs 1;" m -TriggerLink src/Dodge/Data/ComposedItem.hs 15;" C -TriggerSF src/Dodge/Data/ComposedItem.hs 46;" C +TriggerLink src/Dodge/Data/ComposedItem.hs 14;" C +TriggerSF src/Dodge/Data/ComposedItem.hs 45;" C TriggerType src/Dodge/Data/TriggerType.hs 9;" t TriggerType src/Dodge/Data/TriggerType.hs 4;" m TriggerType src/Dodge/Item/TriggerType.hs 1;" m @@ -2045,10 +2047,10 @@ Type src/Dodge/Terminal/Type.hs 1;" m Typical src/Shape/Data.hs 36;" C UNDERBARRELSLOT src/Dodge/Data/Item/Combine.hs 98;" C UNIGATE src/Dodge/Data/Item/Combine.hs 31;" C -UnderBarrelPlatformLink src/Dodge/Data/ComposedItem.hs 31;" C -UnderBarrelPlatformSF src/Dodge/Data/ComposedItem.hs 40;" C -UnderBarrelSlotLink src/Dodge/Data/ComposedItem.hs 30;" C -UnderBarrelSlotSF src/Dodge/Data/ComposedItem.hs 39;" C +UnderBarrelPlatformLink src/Dodge/Data/ComposedItem.hs 30;" C +UnderBarrelPlatformSF src/Dodge/Data/ComposedItem.hs 39;" C +UnderBarrelSlotLink src/Dodge/Data/ComposedItem.hs 29;" C +UnderBarrelSlotSF src/Dodge/Data/ComposedItem.hs 38;" C UnderGround src/Dodge/Data/Scenario.hs 78;" C UnderRoof src/Dodge/Data/Scenario.hs 79;" C UnderSea src/Dodge/Data/Scenario.hs 77;" C @@ -2056,7 +2058,7 @@ UniRandFloat src/Dodge/Data/GenFloat.hs 12;" C Unimportant src/Shape/Data.hs 37;" C Universe src/Dodge/Data/Universe.hs 31;" t Universe src/Dodge/Data/Universe.hs 6;" m -UnloadedWeaponSF src/Dodge/Data/ComposedItem.hs 37;" C +UnloadedWeaponSF src/Dodge/Data/ComposedItem.hs 36;" C UnlockInv src/Dodge/Data/WorldEffect.hs 27;" C UnusedLink src/Dodge/Data/Room.hs 65;" C Update src/Dodge/Config/Update.hs 4;" m @@ -2193,10 +2195,10 @@ WdWdBurstFireRepetition src/Dodge/Data/WorldEffect.hs 35;" C WdWdNegateTrig src/Dodge/Data/WorldEffect.hs 31;" C WdYouPos src/Dodge/Data/WorldEffect.hs 41;" C Weapon src/Dodge/Item/Weapon.hs 2;" m -WeaponScopeLink src/Dodge/Data/ComposedItem.hs 20;" C -WeaponScopeSF src/Dodge/Data/ComposedItem.hs 43;" C -WeaponTargetingLink src/Dodge/Data/ComposedItem.hs 21;" C -WeaponTargetingSF src/Dodge/Data/ComposedItem.hs 44;" C +WeaponScopeLink src/Dodge/Data/ComposedItem.hs 19;" C +WeaponScopeSF src/Dodge/Data/ComposedItem.hs 42;" C +WeaponTargetingLink src/Dodge/Data/ComposedItem.hs 20;" C +WeaponTargetingSF src/Dodge/Data/ComposedItem.hs 43;" C Weapons src/Dodge/Item/Held/Weapons.hs 1;" m West src/Dodge/Data/CardinalPoint.hs 7;" C West8 src/Dodge/Data/CardinalPoint.hs 17;" C @@ -2342,6 +2344,16 @@ _carriage src/Dodge/Data/Creature/Stance.hs 14;" f _carteCenter src/Dodge/Data/HUD.hs 46;" f _carteRot src/Dodge/Data/HUD.hs 48;" f _carteZoom src/Dodge/Data/HUD.hs 47;" f +_cdtCloseLeft src/Dodge/Data/DoubleTree.hs 86;" f +_cdtCloseLeft src/Dodge/Data/DoubleTree.hs 94;" f +_cdtCloseRight src/Dodge/Data/DoubleTree.hs 88;" f +_cdtCloseRight src/Dodge/Data/DoubleTree.hs 96;" f +_cdtFarLeft src/Dodge/Data/DoubleTree.hs 93;" f +_cdtFarRight src/Dodge/Data/DoubleTree.hs 89;" f +_cdtParent src/Dodge/Data/DoubleTree.hs 87;" f +_cdtParent src/Dodge/Data/DoubleTree.hs 95;" f +_cdtUp src/Dodge/Data/DoubleTree.hs 85;" f +_cdtUp src/Dodge/Data/DoubleTree.hs 92;" f _ceSideEffect src/Dodge/Data/Universe.hs 66;" f _ceString src/Dodge/Data/Universe.hs 67;" f _ciFilter src/Dodge/Data/HUD.hs 39;" f @@ -2355,18 +2367,18 @@ _clTimer src/Dodge/Data/Cloud.hs 17;" f _clType src/Dodge/Data/Cloud.hs 18;" f _clVel src/Dodge/Data/Cloud.hs 16;" f _clZoning src/Dodge/Data/World.hs 48;" f -_cldtCloseLeft src/Dodge/Data/DoubleTree.hs 52;" f -_cldtCloseLeft src/Dodge/Data/DoubleTree.hs 61;" f -_cldtCloseRight src/Dodge/Data/DoubleTree.hs 55;" f -_cldtCloseRight src/Dodge/Data/DoubleTree.hs 64;" f -_cldtFarLeft src/Dodge/Data/DoubleTree.hs 60;" f -_cldtFarRight src/Dodge/Data/DoubleTree.hs 56;" f -_cldtLink src/Dodge/Data/DoubleTree.hs 54;" f -_cldtLink src/Dodge/Data/DoubleTree.hs 63;" f -_cldtParent src/Dodge/Data/DoubleTree.hs 53;" f -_cldtParent src/Dodge/Data/DoubleTree.hs 62;" f -_cldtUp src/Dodge/Data/DoubleTree.hs 51;" f -_cldtUp src/Dodge/Data/DoubleTree.hs 59;" f +_cldtCloseLeft src/Dodge/Data/DoubleTree.hs 45;" f +_cldtCloseLeft src/Dodge/Data/DoubleTree.hs 54;" f +_cldtCloseRight src/Dodge/Data/DoubleTree.hs 48;" f +_cldtCloseRight src/Dodge/Data/DoubleTree.hs 57;" f +_cldtFarLeft src/Dodge/Data/DoubleTree.hs 53;" f +_cldtFarRight src/Dodge/Data/DoubleTree.hs 49;" f +_cldtLink src/Dodge/Data/DoubleTree.hs 47;" f +_cldtLink src/Dodge/Data/DoubleTree.hs 56;" f +_cldtParent src/Dodge/Data/DoubleTree.hs 46;" f +_cldtParent src/Dodge/Data/DoubleTree.hs 55;" f +_cldtUp src/Dodge/Data/DoubleTree.hs 44;" f +_cldtUp src/Dodge/Data/DoubleTree.hs 52;" f _clickPos src/Dodge/Data/Input.hs 53;" f _clickWorldPos src/Dodge/Data/Input.hs 55;" f _closeButtons src/Dodge/Data/HUD.hs 50;" f @@ -2676,9 +2688,9 @@ _lasers src/Dodge/Data/LWorld.hs 116;" f _ldpPos src/Dodge/Data/SelectionList.hs 14;" f _ldpScale src/Dodge/Data/SelectionList.hs 15;" f _ldpVerticalGap src/Dodge/Data/SelectionList.hs 16;" f -_ldtLeft src/Dodge/Data/DoubleTree.hs 42;" f -_ldtRight src/Dodge/Data/DoubleTree.hs 43;" f -_ldtValue src/Dodge/Data/DoubleTree.hs 41;" f +_ldtLeft src/Dodge/Data/DoubleTree.hs 35;" f +_ldtRight src/Dodge/Data/DoubleTree.hs 36;" f +_ldtValue src/Dodge/Data/DoubleTree.hs 34;" f _leadTargetBy src/Dodge/Data/ActionPlan.hs 150;" f _lightSources src/Dodge/Data/LWorld.hs 137;" f _lightingCapShader src/Data/Preload/Render.hs 16;" f @@ -2691,8 +2703,10 @@ _linearShockwaves src/Dodge/Data/LWorld.hs 117;" f _linkGapEW src/Dodge/Data/Room.hs 35;" f _linkGapNS src/Dodge/Data/Room.hs 36;" f _loadedMusic src/Music.hs 8;" f -_locLDT src/Dodge/Data/DoubleTree.hs 69;" f -_locLdtContext src/Dodge/Data/DoubleTree.hs 68;" f +_locDT src/Dodge/Data/DoubleTree.hs 101;" f +_locDtContext src/Dodge/Data/DoubleTree.hs 100;" f +_locLDT src/Dodge/Data/DoubleTree.hs 62;" f +_locLdtContext src/Dodge/Data/DoubleTree.hs 61;" 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 @@ -2703,9 +2717,6 @@ _lsID src/Dodge/Data/LightSource.hs 24;" f _lsParam src/Dodge/Data/LightSource.hs 25;" f _lsPos src/Dodge/Data/LightSource.hs 17;" f _lsRad src/Dodge/Data/LightSource.hs 18;" f -_luChildUpdate src/Dodge/Data/ComposedItem.hs 78;" f -_luLinkType src/Dodge/Data/ComposedItem.hs 76;" f -_luParentUpdate src/Dodge/Data/ComposedItem.hs 77;" f _lwID src/Dodge/Data/LinearShockwave.hs 15;" f _lwPoints src/Dodge/Data/LinearShockwave.hs 16;" f _lwPos src/Dodge/Data/LinearShockwave.hs 14;" f @@ -3024,7 +3035,7 @@ _sensorCoding src/Dodge/Data/GenParams.hs 16;" f _sentinelDir src/Dodge/Data/ActionPlan.hs 199;" f _sentinelPos src/Dodge/Data/ActionPlan.hs 199;" f _sfColor src/Shape/Data.hs 44;" f -_sfLink src/Dodge/Data/ComposedItem.hs 33;" f +_sfLink src/Dodge/Data/ComposedItem.hs 32;" f _sfShadowImportance src/Shape/Data.hs 45;" f _sfSize src/Shape/Data.hs 46;" f _sfType src/Shape/Data.hs 42;" f @@ -3163,8 +3174,6 @@ _tractorBeams src/Dodge/Data/LWorld.hs 118;" f _trieChildren src/SimpleTrie.hs 11;" f _trieMVal src/SimpleTrie.hs 10;" f _triggers src/Dodge/Data/LWorld.hs 128;" f -_tryLeftLink src/Dodge/Data/ComposedItem.hs 71;" f -_tryRightLink src/Dodge/Data/ComposedItem.hs 72;" f _ttDeathEffect src/Dodge/Data/Terminal.hs 85;" f _ttTriggerID src/Dodge/Data/Terminal.hs 84;" f _tuDir src/Dodge/Data/Machine.hs 61;" f @@ -3352,12 +3361,12 @@ airlockDoor src/Dodge/Room/Airlock.hs 51;" f airlockDoubleDoor src/Dodge/Room/Airlock.hs 54;" f airlockSimple src/Dodge/Room/Airlock.hs 66;" f airlockZ src/Dodge/Room/Airlock.hs 91;" f -allInvLocs src/Dodge/Item/Grammar.hs 326;" f +allInvLocs src/Dodge/Item/Grammar.hs 253;" f allVisibleWalls src/Dodge/Base/Collide.hs 132;" f alongSegBy src/Geometry.hs 40;" f alteRifle src/Dodge/Item/Held/Cane.hs 22;" f ammoMagInfo src/Dodge/Item/Info.hs 48;" f -ammoMagSPic src/Dodge/Item/Draw/SPic.hs 125;" f +ammoMagSPic src/Dodge/Item/Draw/SPic.hs 123;" f amr src/Dodge/Item/Held/Rod.hs 34;" f analyser src/Dodge/Placement/Instance/Analyser.hs 12;" f analyserByDoor src/Dodge/Room/LasTurret.hs 77;" f @@ -3440,10 +3449,10 @@ azure src/Color.hs 22;" f bQuadToF src/Geometry/Bezier.hs 37;" f bQuadToLine src/Geometry/Bezier.hs 30;" f backpackCombinations src/Dodge/Combine/Combinations.hs 27;" f -backpackShape src/Dodge/Item/Draw/SPic.hs 178;" f +backpackShape src/Dodge/Item/Draw/SPic.hs 176;" f backspaceInputted src/Dodge/Update/Input/Text.hs 25;" f bangCone src/Dodge/Item/Held/Cone.hs 11;" f -bangConeShape src/Dodge/Item/Draw/SPic.hs 293;" f +bangConeShape src/Dodge/Item/Draw/SPic.hs 291;" f bangEchoS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 507;" f bangRod src/Dodge/Item/Held/Rod.hs 18;" f bangS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 655;" f @@ -3451,18 +3460,18 @@ bangStick src/Dodge/Item/Held/Stick.hs 15;" f barPP src/Dodge/Room/Foreground.hs 236;" f barrel src/Dodge/Creature/Inanimate.hs 17;" f barrelShape src/Dodge/Render/ShapePicture.hs 46;" f -baseAMRShape src/Dodge/Item/Draw/SPic.hs 407;" f +baseAMRShape src/Dodge/Item/Draw/SPic.hs 405;" f baseBlockPane src/Dodge/Placement/Instance/Wall.hs 86;" f -baseCI src/Dodge/Item/Grammar.hs 186;" f -baseCaneShape src/Dodge/Item/Draw/SPic.hs 313;" f +baseCI src/Dodge/Item/Grammar.hs 159;" f +baseCaneShape src/Dodge/Item/Draw/SPic.hs 311;" f baseDebris src/Dodge/Block/Debris.hs 122;" f baseFloorTileSize src/Tile.hs 45;" f -baseRifleShape src/Dodge/Item/Draw/SPic.hs 316;" f -baseRodShape src/Dodge/Item/Draw/SPic.hs 404;" f -baseSMGShape src/Dodge/Item/Draw/SPic.hs 384;" f +baseRifleShape src/Dodge/Item/Draw/SPic.hs 314;" f +baseRodShape src/Dodge/Item/Draw/SPic.hs 402;" f +baseSMGShape src/Dodge/Item/Draw/SPic.hs 382;" f baseShoulder src/Dodge/Creature/Picture.hs 125;" f -baseStickShape src/Dodge/Item/Draw/SPic.hs 290;" f -baseStickShapeX src/Dodge/Item/Draw/SPic.hs 283;" f +baseStickShape src/Dodge/Item/Draw/SPic.hs 288;" f +baseStickShapeX src/Dodge/Item/Draw/SPic.hs 281;" f baseStickSpread src/Dodge/HeldUse.hs 306;" f baseTriggerType src/Dodge/Item/TriggerType.hs 5;" f basicAttentionUpdate src/Dodge/Creature/Perception.hs 128;" f @@ -3625,7 +3634,7 @@ clampPath src/Dodge/Room/Procedural.hs 166;" f clang1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 549;" f clang2S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 663;" f clangS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 531;" f -cldtPropagateFold src/Dodge/DoubleTree.hs 230;" f +cldtPropagateFold src/Dodge/DoubleTree.hs 268;" f cleanUpPreload src/Preload.hs 10;" f cleanUpRenderPreload src/Preload/Render.hs 217;" f cleanUpSoundPreload src/Preload.hs 15;" f @@ -3757,7 +3766,7 @@ crVocalizationSound src/Dodge/Creature/Vocalization.hs 13;" f crWarningSounds src/Dodge/Creature/Vocalization.hs 23;" f crZoneSize src/Dodge/Zoning/Creature.hs 41;" f craftInfo src/Dodge/Item/Info.hs 168;" f -craftItemSPic src/Dodge/Item/Draw/SPic.hs 57;" f +craftItemSPic src/Dodge/Item/Draw/SPic.hs 55;" f crankSlowS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 579;" f createArc src/Dodge/Tesla/Arc.hs 81;" f createFlIt src/Dodge/Placement/PlaceSpot.hs 180;" f @@ -3768,8 +3777,8 @@ createItemYou src/Dodge/Inventory/Add.hs 95;" f createLightMap src/Render.hs 26;" f createNewArc src/Dodge/Tesla/Arc.hs 90;" f createPathGrid src/Dodge/Room/Path.hs 21;" f -createProjectile src/Dodge/HeldUse.hs 1320;" f -createProjectileR src/Dodge/HeldUse.hs 1285;" f +createProjectile src/Dodge/HeldUse.hs 1317;" f +createProjectileR src/Dodge/HeldUse.hs 1282;" f createShell src/Dodge/Projectile/Create.hs 23;" f createShieldWall src/Dodge/Item/BackgroundEffect.hs 39;" f createUnusedLinkPos src/Dodge/Tree/Shift.hs 117;" f @@ -3881,7 +3890,7 @@ dededumS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 615;" f dedumS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 435;" f defDamageMaterial src/Dodge/Material/Damage.hs 22;" f defLSPic src/Dodge/LightSource/Draw.hs 10;" f -defSPic src/Dodge/Item/Draw/SPic.hs 299;" f +defSPic src/Dodge/Item/Draw/SPic.hs 297;" f defaultAimMvType src/Dodge/Creature/MoveType.hs 16;" f defaultAimingCrit src/Dodge/Default/Creature.hs 105;" f defaultArcStep src/Dodge/Tesla/Arc.hs 140;" f @@ -3961,7 +3970,7 @@ destroyMounts src/Dodge/Block.hs 97;" f destroyProjectile src/Dodge/Projectile/Update.hs 139;" f detV src/Geometry/Vector.hs 93;" f detector src/Dodge/Item/Held/Utility.hs 27;" f -detectorColor src/Dodge/Item/Draw/SPic.hs 453;" f +detectorColor src/Dodge/Item/Draw/SPic.hs 451;" f detectorEffect src/Dodge/Item/Weapon/Radar.hs 20;" f detectorInfo src/Dodge/Item/Info.hs 224;" f determineProjectileTracking src/Dodge/HeldUse.hs 1268;" f @@ -4092,7 +4101,7 @@ doubleCorridorBarrels src/Dodge/Room/Room.hs 265;" f doubleLampCover src/Dodge/Placement/Instance/LightSource/Cover.hs 28;" f doublePair src/Geometry.hs 161;" f doublePairSet src/Geometry.hs 165;" f -doubleTreeToIndentList src/Dodge/DoubleTree.hs 72;" f +doubleTreeToIndentList src/Dodge/DoubleTree.hs 80;" f doubleV2 src/Geometry.hs 168;" f drawARHUD src/Dodge/Creature/State.hs 319;" f drawAimSweep src/Dodge/Render/Picture.hs 271;" f @@ -4223,7 +4232,7 @@ drawZoneNearPointCursor src/Dodge/Debug/Picture.hs 279;" f droneLauncher src/Dodge/Item/Weapon/Drone.hs 11;" f dropAll src/Dodge/Creature/State.hs 126;" f dropExcept src/Dodge/Creature/Action.hs 166;" f -dropInventoryPath src/Dodge/HeldUse.hs 1399;" f +dropInventoryPath src/Dodge/HeldUse.hs 1396;" f dropItem src/Dodge/Creature/Action.hs 172;" f dropper src/Dodge/Item/Scope.hs 76;" f drumMag src/Dodge/Item/Ammo.hs 33;" f @@ -4232,15 +4241,15 @@ dssNearCirc src/Dodge/Zoning/Cloud.hs 39;" f dssNearPoint src/Dodge/Zoning/Cloud.hs 30;" f dssNearRect src/Dodge/Zoning/Cloud.hs 36;" f dssNearSeg src/Dodge/Zoning/Cloud.hs 33;" 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 +dtIL src/Dodge/DoubleTree.hs 83;" f +dtToAdjRootParent src/Dodge/DoubleTree.hs 146;" f +dtToAdjRootParentEither src/Dodge/DoubleTree.hs 154;" f +dtToAdjacency src/Dodge/DoubleTree.hs 91;" f +dtToIntMapWithRoot src/Dodge/DoubleTree.hs 99;" f +dtToLRAdj src/Dodge/DoubleTree.hs 119;" f +dtToLRAdjEither src/Dodge/DoubleTree.hs 131;" f +dtToRootIntMap' src/Dodge/DoubleTree.hs 104;" f +dtToUpDownAdj src/Dodge/DoubleTree.hs 109;" f dummyMenuOption src/Dodge/Menu/Option.hs 74;" f dustColor src/Shader/Poke/Cloud.hs 71;" f dustSpringVel src/Dodge/Update.hs 796;" f @@ -4277,7 +4286,7 @@ equipAllocString src/Dodge/Render/HUD.hs 308;" f equipAttachPos src/Dodge/Item/Draw.hs 30;" f equipBackgroundEffect src/Dodge/Euse.hs 15;" f equipInfo src/Dodge/Item/Info.hs 140;" f -equipItemSPic src/Dodge/Item/Draw/SPic.hs 149;" f +equipItemSPic src/Dodge/Item/Draw/SPic.hs 147;" f equipPosition src/Dodge/Item/Draw.hs 38;" f equipSiteInfo src/Dodge/Item/Info.hs 253;" f equipType src/Dodge/Data/EquipType.hs 10;" f @@ -4305,8 +4314,8 @@ extTrigLitPos src/Dodge/Placement/Instance/Button.hs 84;" f extendAway src/Dodge/Placement/Instance/LightSource.hs 200;" f extendConeToScreenEdge src/Dodge/Debug/Picture.hs 82;" f extraPics src/Dodge/Render/ShapePicture.hs 73;" f -extraWeaponLinks src/Dodge/Item/Grammar.hs 119;" f -extraWeaponLinksBelow src/Dodge/Item/Grammar.hs 128;" f +extraWeaponLinks src/Dodge/Item/Grammar.hs 94;" f +extraWeaponLinksBelow src/Dodge/Item/Grammar.hs 103;" f extractRoomPos src/Dodge/RoomPos.hs 6;" f faceEdges src/Polyhedra.hs 65;" f facesToVF src/Polyhedra/Geodesic.hs 69;" f @@ -4345,12 +4354,12 @@ flameSpitter src/Dodge/Item/Held/SprayGuns.hs 23;" f flameThrower src/Dodge/Item/Held/SprayGuns.hs 64;" f flameTorrent src/Dodge/Item/Held/SprayGuns.hs 32;" f flameWall src/Dodge/Item/Held/SprayGuns.hs 48;" f -flamerPic src/Dodge/Item/Draw/SPic.hs 387;" f +flamerPic src/Dodge/Item/Draw/SPic.hs 385;" f flareCircleAt src/Dodge/HeldUse.hs 739;" f flatItemCombinations src/Dodge/Combine/Combinations.hs 51;" f flatLookupItems src/Dodge/Combine.hs 39;" f flatShield src/Dodge/Item/Held/Utility.hs 17;" f -flatShieldEquipSPic src/Dodge/Item/Draw/SPic.hs 440;" f +flatShieldEquipSPic src/Dodge/Item/Draw/SPic.hs 438;" f fleeFrom src/Dodge/CreatureEffect.hs 120;" f fleeFromTarget src/Dodge/CreatureEffect.hs 66;" f flickerMod src/Dodge/Placement/Instance/LightSource/Flicker.hs 10;" f @@ -4385,7 +4394,7 @@ forceFoldable src/StrictHelp.hs 7;" f forceSpine src/StrictHelp.hs 4;" f fourEmbossDecoration src/Dodge/Placement/TopDecoration.hs 29;" f fpsText src/Dodge/Render/Picture.hs 53;" f -fractionLoadedAmmo src/Dodge/Item/Draw/SPic.hs 138;" f +fractionLoadedAmmo src/Dodge/Item/Draw/SPic.hs 136;" f frag src/Shader/Data.hs 102;" f freeShaderPointers' src/Shader.hs 37;" f fridgeHumS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 491;" f @@ -4425,11 +4434,11 @@ geometryTests test/Spec.hs 17;" f geometryUnitTests test/Spec.hs 22;" f geqConstr src/SameConstr.hs 21;" f getAimZoom src/Dodge/Update/Camera.hs 135;" f -getAmmoLinks src/Dodge/Item/Grammar.hs 135;" f +getAmmoLinks src/Dodge/Item/Grammar.hs 110;" f getArguments src/Dodge/Update/Scroll.hs 178;" f getArguments' src/Dodge/Update/Scroll.hs 166;" f getAttachedSFLink src/Dodge/HeldUse.hs 809;" f -getAutoSpringLinks src/Dodge/Item/Grammar.hs 114;" f +getAutoSpringLinks src/Dodge/Item/Grammar.hs 89;" f getAvailableListLines src/Dodge/SelectionList.hs 10;" f getBulHitDams src/Dodge/Bullet.hs 171;" f getBulletType src/Dodge/HeldUse.hs 928;" f @@ -4440,7 +4449,7 @@ getCrMoveSpeed src/Dodge/Creature/Statistics.hs 45;" f getDamageCoding src/Dodge/Terminal.hs 177;" f getDistortions src/Dodge/Render.hs 411;" f getEquipmentAllocation src/Dodge/Inventory/RBList.hs 47;" f -getGrenadeHitEffect src/Dodge/HeldUse.hs 1313;" f +getGrenadeHitEffect src/Dodge/HeldUse.hs 1310;" f getInventoryPath src/Dodge/Inventory/Path.hs 8;" f getItemValue src/Dodge/Inventory/SelectionList.hs 143;" f getLaserColor src/Dodge/HeldUse.hs 755;" f @@ -4450,7 +4459,7 @@ getLinksOfType src/Dodge/RoomLink.hs 39;" f getMaxLinesTM src/Dodge/Terminal/Type.hs 11;" f getMenuMouseContext src/Dodge/Update.hs 392;" f getNodePos src/Dodge/Path.hs 31;" f -getPJStabiliser src/Dodge/HeldUse.hs 1305;" f +getPJStabiliser src/Dodge/HeldUse.hs 1302;" f getPretty src/AesonHelp.hs 8;" f getPromptTM src/Dodge/Terminal/Type.hs 8;" f getRootItemBounds src/Dodge/Render/HUD.hs 95;" f @@ -4479,7 +4488,7 @@ glassShat4S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 599;" f glassSwitchBack src/Dodge/Room/Room.hs 70;" f glassSwitchBackCrits src/Dodge/Room/Room.hs 99;" f glassWallDamage src/Dodge/Wall/DamageEffect.hs 49;" f -glauncherPic src/Dodge/Item/Draw/SPic.hs 393;" f +glauncherPic src/Dodge/Item/Draw/SPic.hs 391;" f glushortSize src/Shader/Parameters.hs 25;" f goToPostStrat src/Dodge/Creature/Strategy.hs 10;" f goToTarget src/Dodge/Creature/ReaderUpdate.hs 138;" f @@ -4530,8 +4539,8 @@ hasLOSIndirect src/Dodge/Base/Collide.hs 219;" f hat src/Dodge/Item/Equipment.hs 76;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 79;" f -headLampShape src/Dodge/Item/Draw/SPic.hs 443;" f -headMap src/Dodge/DoubleTree.hs 170;" f +headLampShape src/Dodge/Item/Draw/SPic.hs 441;" f +headMap src/Dodge/DoubleTree.hs 199;" f heal src/Dodge/Item/Consumable.hs 17;" f heal25 src/Dodge/Item/Consumable.hs 14;" f healS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 483;" f @@ -4554,7 +4563,7 @@ heldItemOffset src/Dodge/Item/HeldOffset.hs 72;" f heldItemOrient2D src/Dodge/Item/HeldOffset.hs 29;" f heldItemRelativeOrient src/Dodge/Item/HeldOffset.hs 34;" f heldItemRifling src/Dodge/HeldUse.hs 1112;" f -heldItemSPic src/Dodge/Item/Draw/SPic.hs 225;" f +heldItemSPic src/Dodge/Item/Draw/SPic.hs 223;" f heldItemWeight src/Dodge/Creature/Statistics.hs 71;" f heldPositionInfo src/Dodge/Item/Info.hs 240;" f heldTorqueAmount src/Dodge/HeldUse.hs 634;" f @@ -4581,7 +4590,7 @@ humanoidAIList src/Dodge/Humanoid.hs 182;" f iShape src/Dodge/Placement/Instance/LightSource.hs 73;" f icosahedronPoints src/Polyhedra/Geodesic.hs 12;" f icosohedronFaces src/Polyhedra/Geodesic.hs 19;" f -ildtPropagate src/Dodge/DoubleTree.hs 57;" f +ildtPropagate src/Dodge/DoubleTree.hs 62;" f impulsiveAIBefore src/Dodge/Creature/Impulse.hs 23;" f inLink src/Dodge/RoomLink.hs 113;" f inSegArea src/Geometry/Intersect.hs 298;" f @@ -4646,16 +4655,16 @@ interweave src/Justify.hs 17;" f introScan src/Dodge/Item/Scope.hs 57;" f introScanValue src/Dodge/Inventory/SelectionList.hs 79;" f intsToPos src/Dodge/Room/Modify/Girder.hs 160;" f -invAdj src/Dodge/Item/Grammar.hs 307;" f +invAdj src/Dodge/Item/Grammar.hs 236;" f invCursorParams src/Dodge/ListDisplayParams.hs 36;" f invDP src/Dodge/ListDisplayParams.hs 30;" f invDimColor src/Dodge/DisplayInventory.hs 192;" f invHead src/Dodge/Render/HUD.hs 405;" f invItemLocUpdate src/Dodge/Creature/State.hs 154;" f -invLDT src/Dodge/Item/Grammar.hs 287;" f +invLDT src/Dodge/Item/Grammar.hs 216;" f invRootItemEffs src/Dodge/Creature/State.hs 147;" f -invRootMap src/Dodge/Item/Grammar.hs 296;" f -invRootTrees src/Dodge/Item/Grammar.hs 317;" f +invRootMap src/Dodge/Item/Grammar.hs 225;" f +invRootTrees src/Dodge/Item/Grammar.hs 246;" f invSelectionItem src/Dodge/Inventory/SelectionList.hs 32;" f invSetSelection src/Dodge/Inventory.hs 185;" f invSetSelectionPos src/Dodge/Inventory.hs 193;" f @@ -4703,7 +4712,6 @@ itEffectOnPickup src/Dodge/Item/BackgroundEffect.hs 64;" f itInvHeight src/Dodge/Item/InvSize.hs 11;" f itUseCondition src/Dodge/ItemUseCondition.hs 6;" f itemAmmoSlots src/Dodge/Item/AmmoSlots.hs 12;" f -itemBaseConnections src/Dodge/Item/Grammar.hs 190;" f itemBaseName src/Dodge/Item/Display.hs 59;" f itemBaseStance src/Dodge/Item/AimStance.hs 17;" f itemBlips src/Dodge/RadarSweep.hs 93;" f @@ -4726,16 +4734,16 @@ itemInvLock src/Dodge/HeldUse.hs 486;" f itemMuzzles src/Dodge/HeldUse.hs 158;" f itemRandomOffset src/Dodge/HeldUse.hs 1005;" f itemRooms src/Dodge/LockAndKey.hs 39;" f -itemRotTreeSPic src/Dodge/Item/Draw/SPic.hs 29;" f -itemSPic src/Dodge/Item/Draw/SPic.hs 35;" f +itemRotTreeSPic src/Dodge/Item/Draw/SPic.hs 27;" f +itemSPic src/Dodge/Item/Draw/SPic.hs 33;" f itemScan src/Dodge/Item/Scope.hs 63;" f itemScroll src/Dodge/Update/Scroll.hs 52;" f itemScrollDisplay src/Dodge/Inventory/SelectionList.hs 120;" f itemScrollValue src/Dodge/Inventory/SelectionList.hs 147;" f itemSidePush src/Dodge/HeldUse.hs 432;" f itemString src/Dodge/Item/Display.hs 55;" f -itemToBreakLists src/Dodge/Item/Grammar.hs 59;" f -itemToFunction src/Dodge/Item/Grammar.hs 141;" f +itemToBreakLists src/Dodge/Item/Grammar.hs 34;" f +itemToFunction src/Dodge/Item/Grammar.hs 116;" f itemTreeSPic src/Dodge/Item/Draw/SPic.hs 24;" f itemTriggerType src/Dodge/BaseTriggerType.hs 12;" f itemWeight src/Dodge/Creature/Statistics.hs 66;" f @@ -4747,7 +4755,7 @@ itmSpaceInfo src/Dodge/Item/Info.hs 25;" f itmUsageInfo src/Dodge/Item/Info.hs 230;" f jShape src/Dodge/Placement/Instance/LightSource.hs 85;" f jaggedShape src/Dodge/Block/Debris.hs 191;" f -joinItemsInList src/Dodge/Item/Grammar.hs 277;" f +joinItemsInList src/Dodge/Item/Grammar.hs 206;" f joystick src/Dodge/Item/Scope.hs 149;" f jps0' src/Dodge/LevelGen/PlacementHelper.hs 60;" f jps0PushPS src/Dodge/LevelGen/PlacementHelper.hs 63;" f @@ -4763,7 +4771,7 @@ keyCard src/Dodge/Item/Held/Utility.hs 20;" f keyCardAnalyserByDoor src/Dodge/Room/LasTurret.hs 71;" f keyCardRoomRunPast src/Dodge/Room/LasTurret.hs 59;" f keyCardRunPastRand src/Dodge/LockAndKey.hs 36;" f -keyPic src/Dodge/Item/Draw/SPic.hs 459;" f +keyPic src/Dodge/Item/Draw/SPic.hs 457;" f keyholeCorridor src/Dodge/Room/Corridor.hs 39;" f knifeS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 625;" f lConnect src/Dodge/Render/Connectors.hs 42;" f @@ -4775,32 +4783,31 @@ lampCoverWhen src/Dodge/Placement/Instance/LightSource/Cover.hs 19;" f lampCrSPic src/Dodge/Render/ShapePicture.hs 51;" f lasCenSensEdge src/Dodge/Room/LasTurret.hs 114;" f lasDronesPic src/Dodge/Item/Weapon/Drone.hs 22;" f -lasGunPic src/Dodge/Item/Draw/SPic.hs 413;" f +lasGunPic src/Dodge/Item/Draw/SPic.hs 411;" f lasSensorTurretTest src/Dodge/Room/LasTurret.hs 107;" f lasTunnel src/Dodge/Room/LasTurret.hs 126;" f lasTunnelRunPast src/Dodge/Room/LasTurret.hs 167;" f lasTurret src/Dodge/Placement/Instance/Turret.hs 38;" f laser src/Dodge/Item/Held/BatteryGuns.hs 41;" f -laserLinkTest src/Dodge/Item/Grammar.hs 196;" f -lastMap src/Dodge/DoubleTree.hs 174;" f +lastMap src/Dodge/DoubleTree.hs 203;" f launcherCrit src/Dodge/Creature/LauncherCrit.hs 12;" f layoutLevelFromSeed src/Dodge/LevelGen.hs 47;" f ldpVerticalSelection src/Dodge/Update/Input/ScreenLayer.hs 74;" f -ldtIL src/Dodge/DoubleTree.hs 149;" f +ldtIL src/Dodge/DoubleTree.hs 175;" f ldtPropagate src/Dodge/DoubleTree.hs 20;" f -ldtPropagateFold src/Dodge/DoubleTree.hs 29;" f -ldtPropagateFoldTree src/Dodge/DoubleTree.hs 45;" f -ldtPropagateIndices src/Dodge/DoubleTree.hs 64;" f +ldtPropagateFold src/Dodge/DoubleTree.hs 32;" f +ldtPropagateFoldTree src/Dodge/DoubleTree.hs 49;" f +ldtPropagateIndices src/Dodge/DoubleTree.hs 72;" f ldtToDT src/Dodge/DoubleTree.hs 15;" f -ldtToIM src/Dodge/DoubleTree.hs 143;" f -ldtToIndentList src/Dodge/DoubleTree.hs 146;" f -ldtToLoc src/Dodge/DoubleTree.hs 187;" f +ldtToIM src/Dodge/DoubleTree.hs 169;" f +ldtToIndentList src/Dodge/DoubleTree.hs 172;" f +ldtToLoc src/Dodge/DoubleTree.hs 218;" f left src/DoubleStack.hs 16;" f -leftChildList src/Dodge/Item/Grammar.hs 251;" f -leftIsParentCombine src/Dodge/Item/Grammar.hs 235;" f +leftChildList src/Dodge/Item/Grammar.hs 180;" f +leftIsParentCombine src/Dodge/Item/Grammar.hs 164;" f leftPad src/Padding.hs 15;" f -leftRightCombine src/Dodge/Item/Grammar.hs 263;" f -legsSPic src/Dodge/Item/Draw/SPic.hs 477;" f +leftRightCombine src/Dodge/Item/Grammar.hs 192;" f +legsSPic src/Dodge/Item/Draw/SPic.hs 475;" f liShape src/Dodge/Placement/Instance/LightSource.hs 98;" f light src/Color.hs 104;" f lightSensByDoor src/Dodge/Room/LasTurret.hs 46;" f @@ -4827,8 +4834,6 @@ listCursorChooseBorderScale src/Dodge/Render/List.hs 135;" f listGuard src/Dodge/Creature/ReaderUpdate.hs 190;" f listSelectionColorPicture src/Dodge/DisplayInventory.hs 308;" f litCorridor90 src/Dodge/Room/RoadBlock.hs 26;" f -llleft src/Dodge/Item/Grammar.hs 199;" f -llright src/Dodge/Item/Grammar.hs 205;" f lmt src/MatrixHelper.hs 43;" f lnkBothAnd src/Dodge/Room/Procedural.hs 121;" f lnkMidPosInvSelsCol src/Dodge/Render/HUD.hs 394;" f @@ -4843,13 +4848,13 @@ loadSounds src/Dodge/SoundLogic/LoadSound.hs 18;" f loadingScreen src/Dodge/Concurrent.hs 56;" f loadingScreen src/Dodge/Menu/Loading.hs 8;" f loadme src/Dodge/Debug/Terminal.hs 139;" f -locGoHelp src/Dodge/DoubleTree.hs 220;" f -locGoLeft src/Dodge/DoubleTree.hs 209;" f -locGoRight src/Dodge/DoubleTree.hs 214;" f -locLeftmost src/Dodge/DoubleTree.hs 202;" f -locRightmost src/Dodge/DoubleTree.hs 205;" f -locToTop src/Dodge/DoubleTree.hs 198;" f -locUp src/Dodge/DoubleTree.hs 191;" f +locGoHelp src/Dodge/DoubleTree.hs 258;" f +locGoLeft src/Dodge/DoubleTree.hs 247;" f +locGoRight src/Dodge/DoubleTree.hs 252;" f +locLeftmost src/Dodge/DoubleTree.hs 240;" f +locRightmost src/Dodge/DoubleTree.hs 243;" f +locToTop src/Dodge/DoubleTree.hs 235;" f +locUp src/Dodge/DoubleTree.hs 222;" f lockInv src/Dodge/Inventory/Lock.hs 9;" f lockInvFor src/Dodge/Item/Weapon/TriggerType.hs 50;" f lockRoomKeyItems src/Dodge/LockAndKey.hs 25;" f @@ -5021,8 +5026,8 @@ minOn src/FoldableHelp.hs 35;" f mini1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 443;" f miniGunCrit src/Dodge/Creature.hs 64;" f miniGunX src/Dodge/Item/Held/Cane.hs 33;" f -miniGunXPict src/Dodge/Item/Draw/SPic.hs 365;" f -miniGunXPictItem src/Dodge/Item/Draw/SPic.hs 359;" f +miniGunXPict src/Dodge/Item/Draw/SPic.hs 363;" f +miniGunXPictItem src/Dodge/Item/Draw/SPic.hs 357;" f miniS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 701;" f miniTree2 src/Dodge/Room/Room.hs 106;" f minimumOn src/FoldlHelp.hs 14;" f @@ -5148,9 +5153,10 @@ orderAroundFirst src/Geometry/Polygon.hs 82;" f orderAroundFirstReverse src/Geometry/Polygon.hs 78;" f orderPolygon src/Geometry/Polygon.hs 87;" f orderPolygonAround src/Geometry/Polygon.hs 70;" f -orientAttachment src/Dodge/Item/Orientation.hs 23;" f -orientByLink src/Dodge/Item/Orientation.hs 16;" f -orientChild src/Dodge/Item/Orientation.hs 10;" f +orientAttachment src/Dodge/Item/Orientation.hs 26;" f +orientByLink src/Dodge/Item/Orientation.hs 19;" f +orientChild src/Dodge/Item/Orientation.hs 12;" f +orientLocation src/Dodge/Item/Orientation.hs 36;" f orthogonalPointOnSeg src/Geometry/Intersect.hs 291;" f outLink src/Dodge/RoomLink.hs 105;" f outsideScreenPolygon src/Dodge/Debug/Picture.hs 44;" f @@ -5349,8 +5355,8 @@ preCritStart src/Dodge/Room/Start.hs 82;" f preloadRender src/Preload/Render.hs 30;" f premapMaybe src/FoldlHelp.hs 26;" f prependTwo src/Geometry.hs 176;" f -prettyDT src/Dodge/DoubleTree.hs 179;" f -prettyLDT src/Dodge/DoubleTree.hs 183;" f +prettyDT src/Dodge/DoubleTree.hs 208;" f +prettyLDT src/Dodge/DoubleTree.hs 213;" f prettyShort src/AesonHelp.hs 11;" f primeS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 581;" f printColumnTitles src/Dodge/Tree/Shift.hs 142;" f @@ -5472,7 +5478,7 @@ rectXH src/Geometry/Polygon.hs 32;" f rectXY src/Geometry/Polygon.hs 35;" f rectanglePairs src/Dodge/LevelGen/DoorPane.hs 7;" f red src/Color.hs 14;" f -reduceLocLDT src/Dodge/DoubleTree.hs 256;" f +reduceLocLDT src/Dodge/DoubleTree.hs 303;" f reflDirWall src/Dodge/Base/Wall.hs 16;" f reflVelWall src/Dodge/Base/Wall.hs 24;" f reflVelWallDamp src/Dodge/Base/Wall.hs 20;" f @@ -5536,12 +5542,12 @@ rezText' src/Dodge/Story.hs 17;" f rhombus src/Polyhedra.hs 72;" f rifle src/Dodge/Item/Held/Cane.hs 19;" f right src/DoubleStack.hs 16;" f -rightChildList src/Dodge/Item/Grammar.hs 257;" f -rightIsParentCombine src/Dodge/Item/Grammar.hs 243;" f +rightChildList src/Dodge/Item/Grammar.hs 186;" f +rightIsParentCombine src/Dodge/Item/Grammar.hs 172;" f rightPad src/Padding.hs 19;" f rightPadNoSquash src/Padding.hs 23;" f rlPosDir src/Dodge/RoomLink.hs 94;" f -rlauncherPic src/Dodge/Item/Draw/SPic.hs 390;" f +rlauncherPic src/Dodge/Item/Draw/SPic.hs 388;" f rmInLinks src/Dodge/RoomLink.hs 138;" f rmInvItem src/Dodge/Inventory.hs 64;" f rmLinksOfType src/Dodge/RoomLink.hs 135;" f @@ -5743,7 +5749,7 @@ shapeVerxAttributes src/Shape/Parameters.hs 13;" f shapeVerxSize src/Shape/Parameters.hs 10;" f shardShape src/Dodge/Block/Debris.hs 181;" f shatterGun src/Dodge/Item/Held/Weapons.hs 8;" f -shatterGunSPic src/Dodge/Item/Draw/SPic.hs 302;" f +shatterGunSPic src/Dodge/Item/Draw/SPic.hs 300;" f shatterWall src/Dodge/Item/Weapon/Shatter.hs 26;" f shellCollisionCheck src/Dodge/Projectile/Update.hs 85;" f shellMag src/Dodge/Item/Ammo.hs 48;" f @@ -5885,7 +5891,6 @@ spreadCenter src/Dodge/Base.hs 187;" f spreadFromCenter src/Dodge/Base.hs 176;" f spreadGunCrit src/Dodge/Creature/SpreadGunCrit.hs 12;" f spreadOut src/Dodge/Creature/Boid.hs 158;" f -springLinkTest src/Dodge/Item/Grammar.hs 217;" f sps src/Dodge/LevelGen/PlacementHelper.hs 30;" f sps0 src/Dodge/LevelGen/PlacementHelper.hs 42;" f square src/Geometry/Polygon.hs 46;" f @@ -5942,7 +5947,7 @@ strideRot src/Dodge/Item/HeldOffset.hs 78;" f stringToList src/Picture/Base.hs 313;" f stringToListGrad src/Picture/Text.hs 12;" f stripZ src/Geometry/Vector3D.hs 97;" f -structureToPotentialFunction src/Dodge/Item/Grammar.hs 176;" f +structureToPotentialFunction src/Dodge/Item/Grammar.hs 151;" f structureUseAtLoc src/Dodge/Creature/Impulse/UseItem.hs 75;" f subInvX src/Dodge/ListDisplayParams.hs 48;" f subMap src/TreeHelp.hs 118;" f @@ -5997,7 +6002,7 @@ terminalScreenGlow src/Dodge/Machine/Update.hs 35;" f terminalShape src/Dodge/Machine/Draw.hs 32;" f terminalWheelEvent src/Dodge/Update/Scroll.hs 124;" f teslaGun src/Dodge/Item/Held/BatteryGuns.hs 19;" f -teslaGunPic src/Dodge/Item/Draw/SPic.hs 410;" f +teslaGunPic src/Dodge/Item/Draw/SPic.hs 408;" f teslaParams src/Dodge/Item/Held/BatteryGuns.hs 32;" f teslaParams src/Dodge/Tesla/ItemParams.hs 6;" f testCrossWalls src/Dodge/Room/Path.hs 47;" f @@ -6055,7 +6060,6 @@ toClosestMultiple src/HelpNum.hs 3;" f toColor8 src/Color.hs 148;" f toFloatVAs src/Shader/Compile.hs 211;" f toLabel src/Dodge/Cleat.hs 16;" f -toLasgunUpdate src/Dodge/Item/Grammar.hs 210;" f toMultiset src/Multiset.hs 64;" f toOnward src/Dodge/Tree/Compose.hs 101;" f toTopLeft src/Dodge/Render/List.hs 219;" f @@ -6079,7 +6083,7 @@ topPrismEdgeIndices src/Shader/Poke.hs 335;" f topPrismIndices src/Shader/Poke.hs 410;" f topTestPart src/Dodge/TestString.hs 58;" f torch src/Dodge/Item/Held/Utility.hs 23;" f -torchShape src/Dodge/Item/Draw/SPic.hs 269;" f +torchShape src/Dodge/Item/Draw/SPic.hs 267;" f torqueAmount src/Dodge/HeldUse.hs 629;" f torqueCr src/Dodge/WorldEffect.hs 67;" f torso src/Dodge/Creature/Picture.hs 99;" f @@ -6087,7 +6091,7 @@ tractCr src/Dodge/TractorBeam/Update.hs 28;" f tractFlIt src/Dodge/TractorBeam/Update.hs 23;" f tractorBeamAt src/Dodge/HeldUse.hs 860;" f tractorGun src/Dodge/Item/Held/BatteryGuns.hs 60;" f -tractorGunPic src/Dodge/Item/Draw/SPic.hs 437;" f +tractorGunPic src/Dodge/Item/Draw/SPic.hs 435;" f tractorPullPos src/Dodge/TractorBeam/Update.hs 33;" f tractorSPic src/Dodge/TractorBeam/Draw.hs 10;" f tranRot src/Picture/Base.hs 124;" f @@ -6322,14 +6326,13 @@ upperPrismPolyST src/Shape.hs 108;" f upperPrismPolySU src/Shape.hs 114;" f upperPrismPolyTS src/Shape.hs 120;" f upperRounded src/Shape.hs 185;" f -useBreakL src/Dodge/Item/Grammar.hs 36;" f useBulletPayload src/Dodge/Bullet.hs 113;" f useC src/Dodge/Cuse.hs 8;" f useC' src/Dodge/Cuse.hs 13;" f useDelay src/Dodge/Item/UseDelay.hs 12;" f useGasParams src/Dodge/HeldUse.hs 1161;" f useHotkey src/Dodge/Creature/YourControl.hs 70;" f -useInventoryPath src/Dodge/HeldUse.hs 1430;" f +useInventoryPath src/Dodge/HeldUse.hs 1427;" f useItem src/Dodge/Creature/Impulse/UseItem.hs 20;" f useItemLoc src/Dodge/Creature/Impulse/UseItem.hs 27;" f useLnkRoomPos src/Dodge/PlacementSpot.hs 244;" f @@ -6338,15 +6341,15 @@ useLocation src/Dodge/Creature/Impulse/UseItem.hs 65;" f useMagShield src/Dodge/Euse.hs 26;" f useNormalCamera src/Dodge/Camera.hs 6;" f usePayload src/Dodge/Payload.hs 18;" f -useRewindGun src/Dodge/HeldUse.hs 1390;" f +useRewindGun src/Dodge/HeldUse.hs 1387;" f useRewindGun src/Dodge/Luse.hs 40;" f useRoomPosCond src/Dodge/PlacementSpot.hs 178;" f useRoomPosRoomCond src/Dodge/PlacementSpot.hs 181;" f -useStopWatch src/Dodge/HeldUse.hs 1371;" f +useStopWatch src/Dodge/HeldUse.hs 1368;" f useStopWatch src/Dodge/Luse.hs 21;" f useTimeCheck src/Dodge/HeldUse.hs 112;" f useTimeCheck src/Dodge/Item/Weapon/TriggerType.hs 127;" f -useTimeScrollGun src/Dodge/HeldUse.hs 1379;" f +useTimeScrollGun src/Dodge/HeldUse.hs 1376;" f useTimeScrollGun src/Dodge/Luse.hs 29;" f useUnusedLnk src/Dodge/PlacementSpot.hs 169;" f usedRoomInLinkPoss src/Dodge/PlacementSpot.hs 196;" f @@ -6380,7 +6383,7 @@ visibleWalls src/Dodge/Base/Collide.hs 124;" f visionCheck src/Dodge/Creature/Perception.hs 153;" f vocalizationTest src/Dodge/Creature/Vocalization.hs 42;" f volleyGun src/Dodge/Item/Held/Cane.hs 15;" f -volleyGunShape src/Dodge/Item/Draw/SPic.hs 347;" f +volleyGunShape src/Dodge/Item/Draw/SPic.hs 345;" f waistSP src/Dodge/Creature/HandPos.hs 173;" f walkNozzle src/Dodge/HeldUse.hs 830;" f walkableNodeNear src/Dodge/Path.hs 48;" f @@ -6390,7 +6393,7 @@ wallIsZeroLength src/Dodge/LevelGen/StaticWalls.hs 179;" f wallLine src/Dodge/Placement/Instance/Wall.hs 71;" f wallsFromRooms src/Dodge/Layout.hs 146;" f wallsToDraw src/Dodge/Render/Walls.hs 17;" f -warmupSound src/Dodge/HeldUse.hs 1424;" f +warmupSound src/Dodge/HeldUse.hs 1421;" f warningRooms src/Dodge/Room/Warning.hs 28;" f wasdAim src/Dodge/Creature/YourControl.hs 126;" f wasdDir src/Dodge/WASD.hs 17;" f