From 60c399935e9dcfac3c32ce635e6b7971415f4f1c Mon Sep 17 00:00:00 2001 From: justin Date: Wed, 11 Sep 2024 11:33:08 +0100 Subject: [PATCH] Add link types to attachment tree --- ghcidOutput | 2 +- src/Dodge/Data/ComposedItem.hs | 2 + src/Dodge/Data/DoubleTree.hs | 8 +++ src/Dodge/Item/Grammar.hs | 93 ++++++++++++++++++++++++---------- src/Dodge/TestString.hs | 7 ++- tags | 77 ++++++++++++++++------------ 6 files changed, 128 insertions(+), 61 deletions(-) diff --git a/ghcidOutput b/ghcidOutput index 95162759e..69a8cf80b 100644 --- a/ghcidOutput +++ b/ghcidOutput @@ -1 +1 @@ -All good (614 modules, at 16:50:05) +All good (614 modules, at 11:30:44) diff --git a/src/Dodge/Data/ComposedItem.hs b/src/Dodge/Data/ComposedItem.hs index 2768ff496..34c7935be 100644 --- a/src/Dodge/Data/ComposedItem.hs +++ b/src/Dodge/Data/ComposedItem.hs @@ -9,6 +9,8 @@ import Control.Lens import Data.Aeson import Data.Aeson.TH +data ComposeLinkType = AmmoInLink + | AmmoModLink data ComposedItem = WeaponCI | WeaponScopeCI diff --git a/src/Dodge/Data/DoubleTree.hs b/src/Dodge/Data/DoubleTree.hs index c6d4e0c48..ec58c54a8 100644 --- a/src/Dodge/Data/DoubleTree.hs +++ b/src/Dodge/Data/DoubleTree.hs @@ -8,13 +8,21 @@ module Dodge.Data.DoubleTree import Control.Lens import Data.Aeson import Data.Aeson.TH +import Data.Bifunctor data DoubleTree a = DT {_dtValue :: a,_dtLeft :: [DoubleTree a],_dtRight :: [DoubleTree a]} deriving (Eq,Ord,Show,Read) +data LabelDoubleTree b a = LDT {_ldtValue :: a, _ldtLeft :: [(b,LabelDoubleTree b a)] + ,_ldtRight :: [(b,LabelDoubleTree b a)]} + deriving (Eq,Ord,Show,Read) + instance Functor DoubleTree where fmap f (DT x l r) = DT (f x) (fmap (fmap f) l) (fmap (fmap f) r) +instance Functor (LabelDoubleTree b) where + fmap f (LDT x l r) = LDT (f x) (fmap (second $ fmap f) l) (fmap (second $ fmap f) r) + makeLenses ''DoubleTree deriveJSON defaultOptions ''DoubleTree diff --git a/src/Dodge/Item/Grammar.hs b/src/Dodge/Item/Grammar.hs index b6accfa93..f8eec2977 100644 --- a/src/Dodge/Item/Grammar.hs +++ b/src/Dodge/Item/Grammar.hs @@ -1,5 +1,9 @@ module Dodge.Item.Grammar +-- (invTree +-- , indentInv +-- ) where +import Control.Applicative import Data.Maybe import ListHelp import Dodge.Data.Item @@ -13,9 +17,16 @@ type PCI = (ComposedItem, [ComposedItem], [ComposedItem]) type PCI' = (Item,ComposedItem,[ComposedItem], [ComposedItem]) +type PCI'' = (Item,ComposedItem,[(ComposeLinkType,ComposedItem)], [(ComposeLinkType,ComposedItem)]) + +type CIL = (ComposedItem,[(ComposeLinkType,ComposedItem)], [(ComposeLinkType,ComposedItem)]) + singleDT :: a -> DoubleTree a singleDT x = DT x [] [] +singleLDT :: a -> LabelDoubleTree b a +singleLDT x = LDT x [] [] + baseComposedItem :: ItemBaseType -> PCI baseComposedItem ibt = case ibt of HELD BURSTRIFLE -> (WeaponCI, [BulletAmmoCI], []) @@ -24,10 +35,56 @@ baseComposedItem ibt = case ibt of ATTACH BULLETSYNTHESIZER -> (AmmoModifierCI, [], []) _ -> (UncomposableCI, [], []) +baseComposedItem' :: ItemBaseType -> CIL +baseComposedItem' ibt = case ibt of + HELD BURSTRIFLE -> (WeaponCI, [(AmmoInLink,BulletAmmoCI)], []) + AMMOMAG TINMAG -> (BulletAmmoCI, [(AmmoModLink,AmmoModifierCI)], []) + AMMOMAG DRUMMAG -> (BulletAmmoCI, [(AmmoModLink,AmmoModifierCI)], []) + ATTACH BULLETSYNTHESIZER -> (AmmoModifierCI, [], []) + _ -> (UncomposableCI, [], []) + +basePCI :: Item -> PCI'' +basePCI itm = let (a,b,c) = baseComposedItem' (itm ^. itType . iyBase) + in (itm, a, b, c) + baseCI :: Item -> PCI' baseCI itm = let (a,b,c) = baseComposedItem (itm ^. itType . iyBase) in (itm, a, b, c) +combineMaybe :: (a -> a -> Maybe b) -> (a -> a -> b -> a) -> a -> a -> Maybe a +combineMaybe t f x y = fmap (f x y) (t x y) + +type LDTTest a b = LabelDoubleTree b a -> LabelDoubleTree b a -> Maybe b +type LDTCombine a b = LabelDoubleTree b a -> LabelDoubleTree b a -> b -> LabelDoubleTree b a + +type LDTComb a b = LabelDoubleTree b a -> LabelDoubleTree b a -> Maybe (LabelDoubleTree b a) + +-- the following imposes a strict ordering on the possible attachments +leftIsParentCombine :: LDTComb PCI'' ComposeLinkType +leftIsParentCombine (LDT (itm,p,lc,rc) lt rt) t'@(LDT (_,p',_,_) _ _) = do + let f (_,x) = p' == x + (_,ys) = break f rc + (linktype,_) <- safeHead ys + return $ LDT (itm,p,lc,tail ys) lt (rt ++ [(linktype,t')]) + +rightIsParentCombine :: LDTComb PCI'' ComposeLinkType +rightIsParentCombine t'@(LDT (_,p',_,_) _ _) (LDT (itm,p,lc,rc) lt rt) = do + let f (_,x) = p' == x + (_,ys) = break f lc + (linktype,_) <- safeHead ys + return $ LDT (itm,p,tail ys,rc) ((linktype,t'):lt) rt + +leftRightCombine :: LDTComb a b -> LDTComb a b + -> LabelDoubleTree b a -> LabelDoubleTree b a -> Maybe (LabelDoubleTree b a) +leftRightCombine f f' t1 t2 = f t1 t2 + <|> checkdepth t1 t2 + where + checkdepth t t'@(LDT x ls rs) = fromMaybe (checktop t t') $ do + (lab,t'') <- safeHead ls + tx <- checkdepth t t'' + return $ Just $ LDT x ((lab,tx):tail ls) rs + checktop t t' = f' t t' + joinItems :: DoubleTree PCI' -> DoubleTree PCI' -> Maybe (DoubleTree PCI') joinItems t@(DT (itm,px,lc',rc') ls' rs') s@(DT (_,py,_,_) _ _) | py `elem` rc' = Just (DT (itm,px,lc', delete py rc') ls' (rs' ++ [s])) @@ -41,33 +98,6 @@ joinItems t@(DT (itm,px,lc',rc') ls' rs') s@(DT (_,py,_,_) _ _) | pa `elem` lc = Just (DT (itm2,pb, delete pa lc,rc) (a:ls) rs) | otherwise = Nothing ---joinItems' :: DoubleTree PCI -> DoubleTree PCI -> Maybe (DoubleTree PCI) ---joinItems' t@(DT (px,cx) ls' rs') s@(DT (py,_) _ _) --- | py `elem` cx = Just (DT (px, delete py cx) ls' (rs' ++ [s])) --- | otherwise = checkdepth t s --- where --- checkdepth a a'@(DT b ls rs) = fromMaybe (checktop a a') $ do --- c <- safeHead ls --- d <- checkdepth a c --- return $ Just $ DT b (d:ls) rs --- checktop a@(DT (pa,_) _ _) (DT (pb,cb) ls rs) --- | pa `elem` cb = Just (DT (pb, delete pa cb) (a:ls) rs) --- | otherwise = Nothing --- ---joinItems'' :: Tree PCI -> Tree PCI -> Maybe (Tree PCI) ---joinItems'' t@(Node (px,cx) xs) s@(Node (py,_) _) ----- | fst y `elem` cx = Just (Node (px, delete y cx) (xs ++ [s])) --- | py `elem` cx = Just (Node (px, delete py cx) (xs ++ [s])) --- | otherwise = checkdepth t s --- where --- checkdepth a a'@(Node b cs) = fromMaybe (checktop a a') $ do --- c <- safeHead cs --- d <- checkdepth a c --- return $ Just $ Node b (d:cs) --- checktop a@(Node (pa,_) _) (Node (pb,cb) bs) --- | pa `elem` cb = Just (Node (pb, delete pa cb) (a:bs)) --- | otherwise = Nothing - joinItemsInList :: (a -> a -> Maybe a) -> [a] -> [a] joinItemsInList f xs = snd $ h (xs,[]) where @@ -113,6 +143,10 @@ prettyDT :: (a -> String) -> DoubleTree a -> [String] prettyDT f (DT x l r) = concatMap (map ('/':) . prettyDT f) r ++ (f x : concatMap (map ('\\':) . prettyDT f) l) +prettyLDT :: (a -> String) -> LabelDoubleTree b a -> [String] +prettyLDT f (LDT x l r) = concatMap (map ('/':) . prettyLDT f . snd) r + ++ (f x : concatMap (map ('\\':) . prettyLDT f . snd) l) + invTree :: IM.IntMap Item -> [String] invTree = concatMap (prettyDT (\(itm,_,_,_) -> show (_itType itm))) . joinItemsInList joinItems . IM.elems . fmap (singleDT . baseCI) @@ -122,6 +156,11 @@ indentInv = IM.fromList . zip [0..] . reverse . concatMap (flattenDT .indentDoubleTreeWith (' ':) ('|':) ('+':) . fmap (const "")) . joinItemsInList joinItems . IM.elems . fmap (singleDT . baseCI) +--invLDT :: IM.IntMap Item -> [LabelDoubleTree ComposeLinkType PCI''] +invLDT :: IM.IntMap Item -> [LabelDoubleTree ComposeLinkType PCI''] +invLDT = joinItemsInList (leftRightCombine leftIsParentCombine rightIsParentCombine) . IM.elems . + fmap (singleLDT . basePCI) + --indentInv :: IM.IntMap Item -> [String] --indentInv = concat . fmap (flattenDT . indentDoubleTreeWith (' ':) ('|':) ('+':) . fmap const "") -- . joinItemsInList joinItems diff --git a/src/Dodge/TestString.hs b/src/Dodge/TestString.hs index 6e32feb6a..265195515 100644 --- a/src/Dodge/TestString.hs +++ b/src/Dodge/TestString.hs @@ -1,6 +1,7 @@ {-# OPTIONS_GHC -Wno-unused-imports #-} module Dodge.TestString where +import Dodge.Data.DoubleTree import Dodge.Item.Grammar import Dodge.Item.Display import AesonHelp @@ -20,7 +21,11 @@ import Dodge.Data.Universe --import qualified Data.Map.Strict as M import qualified IntMapHelp as IM testStringInit :: Universe -> [String] -testStringInit u = maybe [] invTree (u ^? uvWorld . cWorld . lWorld . creatures . ix 0 . crInv) +testStringInit u = fromMaybe mempty $ do + inv <- fmap invLDT $ u ^? uvWorld . cWorld . lWorld . creatures . ix 0 . crInv + return $ concatMap (prettyLDT (\(x,_,_,_) -> take 5 (show $ x ^. itType . iyBase))) inv + +--testStringInit u = maybe [] invTree (u ^? uvWorld . cWorld . lWorld . creatures . ix 0 . crInv) -- [fromMaybe "" $ do -- cr <- u ^? uvWorld . cWorld . lWorld . creatures . ix 0 -- i <- cr ^? crManipulation . manObject . inInventory . ispItem diff --git a/tags b/tags index d36aa8487..6a283fa48 100644 --- a/tags +++ b/tags @@ -74,9 +74,11 @@ Ammo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 6;" m Ammo src/Dodge/Item/Ammo.hs 1;" m AmmoCheckMod src/Dodge/Data/Item/HeldUse.hs 82;" C AmmoHammerTimeUseOneMod src/Dodge/Data/Item/HeldUse.hs 84;" C +AmmoInLink src/Dodge/Data/ComposedItem.hs 12;" C AmmoMagType src/Dodge/Data/Item/Combine.hs 109;" t AmmoMagUse src/Dodge/Data/Item/Use.hs 58;" C -AmmoModifierCI src/Dodge/Data/ComposedItem.hs 15;" C +AmmoModLink src/Dodge/Data/ComposedItem.hs 13;" C +AmmoModifierCI src/Dodge/Data/ComposedItem.hs 17;" C AmmoParams src/Dodge/Data/Item/Use.hs 82;" t AmmoParams src/Dodge/Item/Weapon/AmmoParams.hs 1;" m AmmoPosition src/Dodge/Item/AmmoPosition.hs 8;" t @@ -303,7 +305,7 @@ Bullet src/Dodge/Data/Bullet.hs 6;" m Bullet src/Dodge/Item/Weapon/Bullet.hs 1;" m BulletAmmo src/Dodge/Data/Ammo.hs 37;" C BulletAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 39;" C -BulletAmmoCI src/Dodge/Data/ComposedItem.hs 16;" C +BulletAmmoCI src/Dodge/Data/ComposedItem.hs 18;" C BulletBeltAttachment src/Dodge/Data/Item.hs 52;" C BulletClipAttachment src/Dodge/Data/Item.hs 51;" C BulletEffect src/Dodge/Data/Bullet.hs 36;" t @@ -451,7 +453,8 @@ CombineInventoryChange src/Dodge/Data/World.hs 33;" C Common src/Dodge/Zoning/Common.hs 1;" m Compile src/Shader/Compile.hs 1;" m Compose src/Dodge/Tree/Compose.hs 4;" m -ComposedItem src/Dodge/Data/ComposedItem.hs 13;" t +ComposeLinkType src/Dodge/Data/ComposedItem.hs 12;" t +ComposedItem src/Dodge/Data/ComposedItem.hs 15;" t ComposedItem src/Dodge/Data/ComposedItem.hs 6;" m Composite src/Picture/Composite.hs 1;" m ComsSS src/Dodge/Data/Scenario.hs 98;" C @@ -586,7 +589,7 @@ DRUM src/Dodge/Combine/Data.hs 34;" C DRUMMAG src/Dodge/Combine/Data.hs 199;" C DRUMMAG src/Dodge/Data/Item/Combine.hs 112;" C DS src/DoubleStack.hs 3;" t -DT src/Dodge/Data/DoubleTree.hs 13;" C +DT src/Dodge/Data/DoubleTree.hs 14;" C DUALBEAM src/Dodge/Combine/Data.hs 171;" C DUALBEAM src/Dodge/Data/Item/Combine.hs 191;" C DUCTTAPE src/Dodge/Combine/Data.hs 31;" C @@ -725,7 +728,7 @@ DoorPart src/Dodge/Data/Wall.hs 50;" C DoorStatus src/Dodge/Data/Door.hs 23;" t DoubleRes src/Dodge/Data/Config.hs 95;" C DoubleStack src/DoubleStack.hs 1;" m -DoubleTree src/Dodge/Data/DoubleTree.hs 13;" t +DoubleTree src/Dodge/Data/DoubleTree.hs 14;" t DoubleTree src/Dodge/Data/DoubleTree.hs 5;" m DownscaleSize src/Dodge/DownscaleSize.hs 1;" m DrWdId src/Dodge/Data/WorldEffect.hs 65;" C @@ -1340,6 +1343,10 @@ LAUNCHHOME src/Dodge/Data/Item/Combine.hs 218;" C LBlink src/Dodge/Data/Item/HeldUse.hs 63;" C LBoost src/Dodge/Data/Item/HeldUse.hs 65;" C LBranches src/TreeExtra.hs 24;" C +LDT src/Dodge/Data/DoubleTree.hs 17;" C +LDTComb src/Dodge/Item/Grammar.hs 43;" t +LDTCombine src/Dodge/Item/Grammar.hs 41;" t +LDTTest src/Dodge/Item/Grammar.hs 40;" t LDoNothing src/Dodge/Data/Item/HeldUse.hs 58;" C LED src/Dodge/Combine/Data.hs 51;" C LED src/Dodge/Data/Item/Combine.hs 57;" C @@ -1368,6 +1375,7 @@ Label src/Dodge/Render/Label.hs 1;" m LabelAction src/Dodge/Data/ActionPlan.hs 79;" C LabelCluster src/Dodge/Data/RoomCluster.hs 14;" C LabelCluster src/Dodge/RoomCluster/Data.hs 12;" C +LabelDoubleTree src/Dodge/Data/DoubleTree.hs 17;" t LabelLayer src/Dodge/Picture/Layer/Data.hs 11;" C Laboratory src/Dodge/Data/Scenario.hs 61;" C Lamp src/Dodge/Creature/Lamp.hs 1;" m @@ -1840,8 +1848,9 @@ P2Ac src/Dodge/Data/CreatureEffect.hs 53;" t P2Imp src/Dodge/Data/CreatureEffect.hs 28;" t P2ImpNo src/Dodge/Data/CreatureEffect.hs 28;" C P2NoAction src/Dodge/Data/CreatureEffect.hs 53;" C -PCI src/Dodge/Item/Grammar.hs 12;" t -PCI' src/Dodge/Item/Grammar.hs 14;" t +PCI src/Dodge/Item/Grammar.hs 16;" t +PCI' src/Dodge/Item/Grammar.hs 18;" t +PCI'' src/Dodge/Item/Grammar.hs 20;" t PENBUL src/Dodge/Combine/Data.hs 204;" C PENMODULE src/Dodge/Combine/Data.hs 70;" C PIERCING src/Dodge/Data/Damage/Type.hs 12;" C @@ -2710,7 +2719,7 @@ TwoHandUnder src/Dodge/Data/Item/Use.hs 121;" C Type src/Dodge/Data/Damage/Type.hs 6;" m Typical src/Shape/Data.hs 36;" C UPtLayer src/Dodge/Picture/Layer/Data.hs 16;" C -UncomposableCI src/Dodge/Data/ComposedItem.hs 17;" C +UncomposableCI src/Dodge/Data/ComposedItem.hs 19;" C Uncursed src/Dodge/Data/Item/CurseStatus.hs 12;" C Uncursed src/Dodge/Item/Data.hs 8;" C UnderGround src/Dodge/Data/Scenario.hs 78;" C @@ -2872,8 +2881,8 @@ WdWdNegateTrig src/Dodge/Data/WorldEffect.hs 31;" C WdYouPos src/Dodge/Data/WorldEffect.hs 39;" C Weapon src/Dodge/Default/Weapon.hs 1;" m Weapon src/Dodge/Item/Weapon.hs 2;" m -WeaponCI src/Dodge/Data/ComposedItem.hs 13;" C -WeaponScopeCI src/Dodge/Data/ComposedItem.hs 14;" C +WeaponCI src/Dodge/Data/ComposedItem.hs 15;" C +WeaponScopeCI src/Dodge/Data/ComposedItem.hs 16;" C Weapons src/Dodge/Item/Held/Weapons.hs 1;" m West src/Dodge/Data/CardinalPoint.hs 7;" C WinScale src/Dodge/Base/WinScale.hs 1;" m @@ -3300,9 +3309,9 @@ _drSpeed src/Dodge/Data/Door.hs 45;" f _drStatus src/Dodge/Data/Door.hs 37;" f _drTrigger src/Dodge/Data/Door.hs 38;" f _drWallIDs src/Dodge/Data/Door.hs 36;" f -_dtLeft src/Dodge/Data/DoubleTree.hs 13;" f -_dtRight src/Dodge/Data/DoubleTree.hs 13;" f -_dtValue src/Dodge/Data/DoubleTree.hs 13;" f +_dtLeft src/Dodge/Data/DoubleTree.hs 14;" f +_dtRight src/Dodge/Data/DoubleTree.hs 14;" f +_dtValue src/Dodge/Data/DoubleTree.hs 14;" f _ebColor src/Dodge/Data/EnergyBall.hs 17;" f _ebEff src/Dodge/Data/EnergyBall.hs 21;" f _ebPos src/Dodge/Data/EnergyBall.hs 18;" f @@ -3553,6 +3562,9 @@ _ldpPos src/Dodge/Data/SelectionList.hs 19;" f _ldpScale src/Dodge/Data/SelectionList.hs 20;" f _ldpVerticalGap src/Dodge/Data/SelectionList.hs 21;" f _ldpWidth src/Dodge/Data/SelectionList.hs 23;" f +_ldtLeft src/Dodge/Data/DoubleTree.hs 17;" f +_ldtRight src/Dodge/Data/DoubleTree.hs 18;" f +_ldtValue src/Dodge/Data/DoubleTree.hs 17;" f _leadTargetBy src/Dodge/Data/ActionPlan.hs 150;" f _leftConsumption src/Dodge/Data/Item/Use.hs 44;" f _leftDelay src/Dodge/Data/Item/Use.hs 41;" f @@ -4504,9 +4516,9 @@ baseAMRShape src/Dodge/Item/Draw/SPic.hs 445;" f baseBlockPane src/Dodge/Placement/Instance/Wall.hs 86;" f baseBlockPane src/Dodge/Placements/Wall.hs 63;" f baseBlockPane src/Dodge/Room/Placement.hs 93;" f -baseCI src/Dodge/Item/Grammar.hs 27;" f +baseCI src/Dodge/Item/Grammar.hs 33;" f baseCaneShape src/Dodge/Item/Draw/SPic.hs 251;" f -baseComposedItem src/Dodge/Item/Grammar.hs 19;" f +baseComposedItem src/Dodge/Item/Grammar.hs 25;" f baseDebris src/Dodge/Block/Debris.hs 122;" f baseFloorTileSize src/Tile.hs 38;" f baseRifleShape src/Dodge/Item/Draw/SPic.hs 254;" f @@ -4765,6 +4777,7 @@ combineItemListYouX src/Dodge/Combine.hs 70;" f combineList src/Dodge/Combine.hs 78;" f combineList' src/Dodge/Combine.hs 83;" f combineListInfo src/Dodge/Combine.hs 97;" f +combineMaybe src/Dodge/Item/Grammar.hs 37;" f combineModuleMaps src/Dodge/Combine.hs 108;" f combineRooms src/Dodge/Room/Procedural.hs 151;" f combineS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 344;" f @@ -5487,7 +5500,7 @@ flatShieldEquipSPic src/Dodge/Item/Draw/SPic.hs 489;" f flatV2 src/Picture/Data.hs 65;" f flatV3 src/Picture/Data.hs 68;" f flatV4 src/Picture/Data.hs 71;" f -flattenDT src/Dodge/Item/Grammar.hs 109;" f +flattenDT src/Dodge/Item/Grammar.hs 158;" f flattenIMIMIM src/Dodge/Base/Zone.hs 246;" f fleeFrom src/Dodge/CreatureEffect.hs 119;" f fleeFromTarget src/Dodge/CreatureEffect.hs 65;" f @@ -5675,7 +5688,7 @@ hatCombinations src/Dodge/Combine/Combinations.hs 33;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 118;" f headLampShape src/Dodge/Item/Draw/SPic.hs 495;" f -headMap src/Dodge/Item/Grammar.hs 80;" f +headMap src/Dodge/Item/Grammar.hs 129;" 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 @@ -5713,9 +5726,9 @@ hvBulDams src/Dodge/Particle/Damage.hs 13;" f hvBulHitCr src/Dodge/Particle/Bullet/HitEffect.hs 17;" f hvBulHitWall src/Dodge/Particle/Bullet/HitEffect.hs 54;" f hvBulletAmmo src/Dodge/Item/Weapon/Bullet.hs 31;" f -iDTL src/Dodge/Item/Grammar.hs 94;" f -iDTR src/Dodge/Item/Grammar.hs 99;" f -iDTboth src/Dodge/Item/Grammar.hs 104;" f +iDTL src/Dodge/Item/Grammar.hs 143;" f +iDTR src/Dodge/Item/Grammar.hs 148;" f +iDTboth src/Dodge/Item/Grammar.hs 153;" f iShape src/Dodge/Placement/Instance/LightSource.hs 74;" f iShape src/Dodge/Placements/LightSource.hs 32;" f icosahedronPoints src/Polyhedra/Geodesic.hs 11;" f @@ -5735,8 +5748,8 @@ incBallAt src/Dodge/EnergyBall.hs 54;" f incendiaryModule src/Dodge/Item/Craftable.hs 21;" f incidenceToFunction src/Dodge/Graph.hs 26;" f indefiniteExceptions src/StringHelp.hs 29;" f -indentDoubleTreeWith src/Dodge/Item/Grammar.hs 89;" f -indentInv src/Dodge/Item/Grammar.hs 120;" f +indentDoubleTreeWith src/Dodge/Item/Grammar.hs 138;" f +indentInv src/Dodge/Item/Grammar.hs 169;" f initCrItemLocation src/Dodge/Item/Location/Initialize.hs 39;" f initCrItemLocations src/Dodge/Item/Location/Initialize.hs 34;" f initCrsItemLocations src/Dodge/Item/Location/Initialize.hs 14;" f @@ -5811,7 +5824,7 @@ invSelectionItem src/Dodge/Inventory/SelectionList.hs 16;" f invShiftPointBy src/Dodge/ShiftPoint.hs 8;" f invSideEff src/Dodge/Creature/State.hs 232;" f invSize src/Dodge/Inventory/CheckSlots.hs 40;" f -invTree src/Dodge/Item/Grammar.hs 116;" f +invTree src/Dodge/Item/Grammar.hs 165;" f inventoryX src/Dodge/Creature.hs 115;" f inverseShockwaveAt src/Dodge/WorldEvent/Shockwave.hs 43;" f invertEncircleDistP src/Dodge/Creature/Boid.hs 13;" f @@ -5890,10 +5903,8 @@ jShape src/Dodge/Placement/Instance/LightSource.hs 86;" f jShape src/Dodge/Placements/LightSource.hs 43;" f jaggedShape src/Dodge/Block/Debris.hs 191;" f jetPack src/Dodge/Item/Equipment.hs 92;" f -joinItems src/Dodge/Item/Grammar.hs 31;" f -joinItems' src/Dodge/Item/Grammar.hs 44;" f -joinItems'' src/Dodge/Item/Grammar.hs 57;" f -joinItemsInList src/Dodge/Item/Grammar.hs 71;" f +joinItems src/Dodge/Item/Grammar.hs 80;" f +joinItemsInList src/Dodge/Item/Grammar.hs 120;" f jps0' src/Dodge/LevelGen/Data.hs 60;" f jps0' src/Dodge/LevelGen/PlacementHelper.hs 60;" f jps0PushPS src/Dodge/LevelGen/Data.hs 63;" f @@ -5943,7 +5954,7 @@ lasTurret src/Dodge/Placement/Instance/Turret.hs 23;" f lasTurret src/Dodge/Placements/Turret.hs 29;" f lasWide src/Dodge/Item/Held/BatteryGuns.hs 97;" f lasWideRate src/Dodge/HeldUse.hs 353;" f -lastMap src/Dodge/Item/Grammar.hs 84;" f +lastMap src/Dodge/Item/Grammar.hs 133;" f latchkey src/Dodge/Item/Held/Utility.hs 23;" f latchkey src/Dodge/Item/PassKey.hs 14;" f launcher src/Dodge/Item/Held/Launcher.hs 10;" f @@ -5955,9 +5966,11 @@ layerNum src/Picture/Data.hs 31;" f layoutLevelFromSeed src/Dodge/LevelGen.hs 47;" f ldpVerticalSelection src/Dodge/Update/Input/ScreenLayer.hs 90;" f left src/DoubleStack.hs 16;" f +leftCombine src/Dodge/Item/Grammar.hs 45;" f leftInfo src/Dodge/Item/Info.hs 110;" f leftItemSPic src/Dodge/Item/Draw/SPic.hs 72;" f leftPad src/Padding.hs 14;" f +leftRightCombine src/Dodge/Item/Grammar.hs 54;" f legsSPic src/Dodge/Item/Draw/SPic.hs 529;" f liShape src/Dodge/Placement/Instance/LightSource.hs 99;" f liShape src/Dodge/Placements/LightSource.hs 55;" f @@ -6608,7 +6621,7 @@ prependTwo src/Geometry.hs 165;" f pressedMBEffects src/Dodge/Update/UsingInput.hs 27;" f pressedMBEffectsNoInventory src/Dodge/Update/UsingInput.hs 40;" f pressedMBEffectsTopInventory src/Dodge/Creature/YourControl.hs 206;" f -prettyDT src/Dodge/Item/Grammar.hs 112;" f +prettyDT src/Dodge/Item/Grammar.hs 161;" 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 @@ -7152,7 +7165,7 @@ showIntsString src/Dodge/Tree/Compose.hs 129;" f showLoadedAmount src/Dodge/Item/Display.hs 158;" f showPhaseV src/Dodge/Tweak/Show.hs 16;" f showTerminalError src/Dodge/Debug/Terminal.hs 75;" f -showTimeFlow src/Dodge/TestString.hs 56;" f +showTimeFlow src/Dodge/TestString.hs 58;" f showTractionPower src/Dodge/Tweak/Show.hs 22;" f showTweak src/Dodge/Tweak/Show.hs 5;" f shrinkGun src/Dodge/Item/Weapon/Utility.hs 44;" f @@ -7179,7 +7192,7 @@ singleBarrel src/Dodge/Item/Held/SingleBarrel.hs 6;" f singleBlock src/Dodge/Placement/Instance/Wall.hs 30;" f singleBlock src/Dodge/Placements/Wall.hs 11;" f singleBlock src/Dodge/Room/Placement.hs 23;" f -singleDT src/Dodge/Item/Grammar.hs 16;" f +singleDT src/Dodge/Item/Grammar.hs 22;" f singleton src/DoubleStack.hs 11;" f singletonTrie src/SimpleTrie.hs 14;" f sizeFBOs src/Framebuffer/Update.hs 22;" f @@ -7406,7 +7419,7 @@ testEvent src/Dodge/Event/Test.hs 10;" f testEventKey src/Dodge/Config/KeyConfig.hs 27;" f testInventory src/Dodge/Creature.hs 245;" f testPic src/Dodge/Render/ShapePicture.hs 153;" f -testStringInit src/Dodge/TestString.hs 21;" f +testStringInit src/Dodge/TestString.hs 22;" f text src/Picture/Base.hs 192;" f textGrad src/Picture/Text.hs 5;" f textJustifyCenter src/Picture/Base.hs 211;" f