diff --git a/ghcidOutput b/ghcidOutput index 2671dcde0..07576a5ea 100644 --- a/ghcidOutput +++ b/ghcidOutput @@ -1,15 +1 @@ -/home/justin/Haskell/loop/src/Dodge/Item/Grammar.hs:88:1-16: warning: [-Wunused-top-binds] - Defined but not used: ‘itemLinkTestLeft’ - | -88 | itemLinkTestLeft itm pci = Nothing - | ^^^^^^^^^^^^^^^^ -/home/justin/Haskell/loop/src/Dodge/Item/Grammar.hs:88:18-20: warning: [-Wunused-matches] - Defined but not used: ‘itm’ - | -88 | itemLinkTestLeft itm pci = Nothing - | ^^^ -/home/justin/Haskell/loop/src/Dodge/Item/Grammar.hs:88:22-24: warning: [-Wunused-matches] - Defined but not used: ‘pci’ - | -88 | itemLinkTestLeft itm pci = Nothing - | ^^^ +All good (598 modules, at 11:19:05) diff --git a/src/Dodge/Creature.hs b/src/Dodge/Creature.hs index 00ca56b8f..fc19a7f0c 100644 --- a/src/Dodge/Creature.hs +++ b/src/Dodge/Creature.hs @@ -282,12 +282,14 @@ testInventory = stackedInventory :: [Item] stackedInventory = [ torch - , torch + , battery , remoteScreen , megaShellMag , targetingScope TARGETLASER , burstRifle , megaTinMag 100 + , lasGun + , makeTypeCraft TRANSFORMER , teslaGun , megaBattery , flameThrower @@ -315,7 +317,6 @@ stackedInventory = , boosterGun , flatShield , spawnGun (lamp 5) - , lasGun -- , lasWide 20 , poisonSprayer , bulletBeltPack diff --git a/src/Dodge/Creature/Impulse/UseItem.hs b/src/Dodge/Creature/Impulse/UseItem.hs index f5b83005b..cf4030113 100644 --- a/src/Dodge/Creature/Impulse/UseItem.hs +++ b/src/Dodge/Creature/Impulse/UseItem.hs @@ -26,11 +26,33 @@ useRootItem :: Int -> World -> World useRootItem crid w = fromMaybe w $ do cr <- w ^? cWorld . lWorld . creatures . ix crid itRef <- cr ^? crManipulation . manObject . imRootItem - it <- invTrees (_crInv cr) ^? ix itRef + it <- invRootTrees (_crInv cr) ^? ix itRef return $ - itemUseEffect cr it w + itemUseEffect' cr it w & worldEventFlags . at InventoryChange ?~ () +itemUseEffect' :: Creature -> LabelDoubleTree ItemLink ComposedItem -> World -> World +itemUseEffect' cr itmtree w = case itmtree ^. ldtValue . cItemFunction of + WeaponPlatformSF -> heldEffect (bimap _iatType _cItem itmtree) cr w + & pointerToItem itm . itUse . heldHammer .~ HammerDown + _ -> w +-- UseHotkey{} -> doequipmentchange +-- UseEquip{} -> doequipmentchange +-- (UseConsume eff) -> useC eff (_ldtValue itmtree) cr w +-- UseCraft{} -> w +-- UseAttach{} -> selectUse itmtree cr w +-- UseAmmoMag{} -> w +-- UseScope{} -> w +-- UseBulletMod{} -> w + where + itm :: Item + itm = itmtree ^. ldtValue . cItem +-- doequipmentchange = fromMaybe w $ do +-- guard (_crHammerPosition cr == HammerUp) +-- invid <- itm ^? itLocation . ilInvID +-- return $ toggleEquipmentAt invid cr w + + itemUseEffect :: Creature -> LabelDoubleTree ComposeLinkType Item -> World -> World itemUseEffect cr itmtree w = case itmtree ^. ldtValue . itUse of UseHeld{} -> heldEffect itmtree cr w @@ -40,7 +62,6 @@ itemUseEffect cr itmtree w = case itmtree ^. ldtValue . itUse of (UseConsume eff) -> useC eff (_ldtValue itmtree) cr w UseCraft{} -> w UseAttach{} -> selectUse itmtree cr w --- UseTargeting {} -> w UseAmmoMag{} -> w UseScope{} -> w UseBulletMod{} -> w diff --git a/src/Dodge/Creature/Picture.hs b/src/Dodge/Creature/Picture.hs index 775d7544a..c91e374fd 100644 --- a/src/Dodge/Creature/Picture.hs +++ b/src/Dodge/Creature/Picture.hs @@ -9,6 +9,7 @@ module Dodge.Creature.Picture ( deadFeet, ) where +import Dodge.Data.ComposedItem import Control.Lens import Dodge.Creature.HandPos (translateToLeftHand, translateToRightHand) import Dodge.Creature.Test @@ -138,4 +139,4 @@ shoulderSH = translateSHz 20 drawEquipment :: Creature -> SPic {-# INLINE drawEquipment #-} -drawEquipment cr = foldMap (itemEquipPict cr . fmap (\(a, b, _) -> (a, b))) (invLDT $ _crInv cr) +drawEquipment cr = foldMap (itemEquipPict cr . fmap (\(a, b, _) -> CItem a b)) (invLDT $ _crInv cr) diff --git a/src/Dodge/Creature/State.hs b/src/Dodge/Creature/State.hs index 774023275..1519f0de0 100644 --- a/src/Dodge/Creature/State.hs +++ b/src/Dodge/Creature/State.hs @@ -175,7 +175,7 @@ updateAttachedItems itmtree cr = chainLinkOrientation chainLinkOrientation (updateItemWithOrientation cr) - (heldItemRelativeOrient (fst $ _ldtValue itmtree) cr (0, Q.qID)) + (heldItemRelativeOrient (_cItem $ _ldtValue itmtree) cr (0, Q.qID)) (LocLDT TopLDT itmtree) -- need to check rotation @@ -185,7 +185,7 @@ chainLinkOrientation :: ItemLink -> ComposedItem -> (Point3, Q.Quaternion Float) -chainLinkOrientation mo (par,_) (ILink lt f) (child,_) = (p + Q.rotate q p1, q * q1) +chainLinkOrientation mo (CItem par _) (ILink lt f) (CItem child _) = (p + Q.rotate q p1, q * q1) where (p, q) = mo (p1, q1) = f par lt child @@ -203,11 +203,11 @@ updateItemWithOrientation cr m loc@(LocLDT _ itmtree) = case _itType itm of ATTACH AUGMENTEDHUD -> drawAugmentedHUD loc _ -> id where - itm = itmtree ^. ldtValue . _1 + itm = itmtree ^. ldtValue . cItem drawAugmentedHUD :: LocationLDT ItemLink ComposedItem -> World -> World drawAugmentedHUD (LocLDT con _) w = fromMaybe w $ do - itm <- con ^? cldtParent . _1 + itm <- con ^? cldtParent . cItem return $ w & cWorld . lWorld . flares <>~ drawTargeting itm w shineTargetLaser :: Creature -> LabelDoubleTree ItemLink ComposedItem -> (Point3, Q.Quaternion Float) @@ -215,9 +215,9 @@ shineTargetLaser :: Creature -> LabelDoubleTree ItemLink ComposedItem -> (Point3 shineTargetLaser cr itmtree (p,q) w = fromMaybe (w & pointittarg . itTgPos .~ Nothing) $ do guard (crIsAiming cr) (_, mag) <- find (isammolink . _iatType . fst) (itmtree ^. ldtLeft) - i <- mag ^? ldtValue . _1 . itUse . amagLoadStatus . iaLoaded + i <- mag ^? ldtValue . cItem . itUse . amagLoadStatus . iaLoaded guard $ i >= x - maginvid <- mag ^? ldtValue . _1 . itLocation . ilInvID + maginvid <- mag ^? ldtValue . cItem . itLocation . ilInvID return $ w & cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix maginvid . itUse . amagLoadStatus . iaLoaded -~ x @@ -234,7 +234,7 @@ shineTargetLaser cr itmtree (p,q) w = fromMaybe (w & pointittarg . itTgPos .~ No isammolink _ = False pos = _crPos cr + xyV3 (rotate3 cdir (p + V3 5 0 0)) cdir = _crDir cr - itm = itmtree ^. ldtValue . _1 + itm = itmtree ^. ldtValue . cItem --pointItUse = cWorld . lWorld . creatures . ix cid . crInv . ix invid . itUse pointittarg = cWorld . lWorld . creatures . ix cid . crInv . ix invid . itTargeting cid = _crID cr @@ -244,9 +244,9 @@ shineTargetLaser cr itmtree (p,q) w = fromMaybe (w & pointittarg . itTgPos .~ No shineTorch :: Creature -> LabelDoubleTree ItemLink ComposedItem -> (Point3, Q.Quaternion Float) -> World -> World shineTorch cr itmtree (p, q) = fromMaybe id $ do (_, mag) <- find (isammolink . _iatType . fst) (itmtree ^. ldtLeft) - i <- mag ^? ldtValue . _1 . itUse . amagLoadStatus . iaLoaded + i <- mag ^? ldtValue . cItem . itUse . amagLoadStatus . iaLoaded guard $ i >= x - invid <- mag ^? ldtValue . _1 . itLocation . ilInvID + invid <- mag ^? ldtValue . cItem . itLocation . ilInvID return $ (cWorld . lWorld . tempLightSources .:~ tlsTimeRadColPos 1 250 0.7 pos'') . (cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix invid . itUse . amagLoadStatus . iaLoaded -~ x) diff --git a/src/Dodge/Data/ComposedItem.hs b/src/Dodge/Data/ComposedItem.hs index 3efc85b2d..a613ebcb7 100644 --- a/src/Dodge/Data/ComposedItem.hs +++ b/src/Dodge/Data/ComposedItem.hs @@ -23,6 +23,7 @@ data ComposeLinkType | WeaponTargetingLink | RemoteScreenLink | AugmentedHUDLink + | FunctionChangeLink deriving (Eq, Ord, Show, Read) data ItemStructuralFunction @@ -37,28 +38,36 @@ data ItemStructuralFunction | AmmoTargetingSF AmmoType | AmmoPayloadSF AmmoType | AmmoEffectSF AmmoType + | FunctionChangeSF deriving (Eq, Ord, Show, Read) -type PartiallyComposedItem lt = (Item, ItemStructuralFunction, LinkTest lt) -type ComposedItem = (Item, ItemStructuralFunction) +type PartiallyComposedItem = (Item, ItemStructuralFunction, LinkTest) + +data ComposedItem = CItem + { _cItem :: Item + , _cItemFunction :: ItemStructuralFunction + } data ItemLink = ILink { _iatType :: ComposeLinkType , _iatOrient :: Item -> ComposeLinkType -> Item -> (Point3, Quaternion Float) } -data LinkTest lt = LTest - { _tryLeftLink :: PartiallyComposedItem lt -> Maybe (LinkUpdate lt) - , _tryRightLink :: PartiallyComposedItem lt -> Maybe (LinkUpdate lt) +data LinkTest = LTest + { _tryLeftLink :: PartiallyComposedItem -> Maybe LinkUpdate + , _tryRightLink :: PartiallyComposedItem -> Maybe LinkUpdate } -data LinkUpdate lt = LUpdate - { _luLinkType :: lt - , _luParentUpdate :: PartiallyComposedItem lt -> PartiallyComposedItem lt - , _luChildUpdate :: PartiallyComposedItem lt -> PartiallyComposedItem lt +data LinkUpdate = LUpdate + { _luLinkType :: ItemLink + , _luParentUpdate :: PartiallyComposedItem -> PartiallyComposedItem + , _luChildUpdate :: PartiallyComposedItem -> PartiallyComposedItem } +makeLenses ''ComposedItem makeLenses ''ItemLink makeLenses ''LinkTest makeLenses ''LinkUpdate +deriveJSON defaultOptions ''ItemStructuralFunction +deriveJSON defaultOptions ''ComposedItem deriveJSON defaultOptions ''ComposeLinkType diff --git a/src/Dodge/Inventory/Location.hs b/src/Dodge/Inventory/Location.hs index 9eae100e2..9d8de70e0 100644 --- a/src/Dodge/Inventory/Location.hs +++ b/src/Dodge/Inventory/Location.hs @@ -2,7 +2,7 @@ module Dodge.Inventory.Location (updateRootItemID , crUpdateItemLocations , setInvPosFromSS - , tryGetRootItemInvID +-- , tryGetRootItemInvID ) where diff --git a/src/Dodge/Item/Draw.hs b/src/Dodge/Item/Draw.hs index d2e27fec6..00e01f484 100644 --- a/src/Dodge/Item/Draw.hs +++ b/src/Dodge/Item/Draw.hs @@ -24,7 +24,7 @@ itemEquipPict cr itmtree = case itm ^. itUse of epos <- cr ^? crInvEquipped . ix i return $ equipPosition epos cr attachpos (itemSPic itm) where - itm = itmtree ^. ldtValue . _1 + itm = itmtree ^. ldtValue . cItem equipPosition :: EquipPosition -> Creature -> Point3 -> SPic -> SPic equipPosition epos cr p sh = case epos of diff --git a/src/Dodge/Item/Draw/SPic.hs b/src/Dodge/Item/Draw/SPic.hs index 5df58d604..9f9ed299b 100644 --- a/src/Dodge/Item/Draw/SPic.hs +++ b/src/Dodge/Item/Draw/SPic.hs @@ -20,7 +20,7 @@ import Shape import ShapePicture itemTreeSPic :: LabelDoubleTree ItemLink ComposedItem -> SPic -itemTreeSPic (LDT (itm, _) l r) = +itemTreeSPic (LDT (CItem itm _) l r) = itemSPic itm <> foldMap (itemRotTreeSPic itm) (l <> r) @@ -28,7 +28,7 @@ itemRotTreeSPic :: Item -> (ItemLink, LabelDoubleTree ItemLink ComposedItem) -> itemRotTreeSPic par (il, t) = translateSP p . overPosSP (Q.rotate q) $ itemTreeSPic t where (p, q) = _iatOrient il par (_iatType il) itm - itm = t ^. ldtValue . _1 + itm = t ^. ldtValue . cItem itemSPic :: Item -> SPic itemSPic it = case it ^. itType of diff --git a/src/Dodge/Item/Grammar.hs b/src/Dodge/Item/Grammar.hs index c8b058ce8..becbfd8e8 100644 --- a/src/Dodge/Item/Grammar.hs +++ b/src/Dodge/Item/Grammar.hs @@ -19,13 +19,14 @@ import Dodge.Item.Orientation import LensHelp import ListHelp -useBreakL' :: [(ItemStructuralFunction, ComposeLinkType)] -> [(ItemStructuralFunction, ComposeLinkType)] - -> LinkTest ItemLink -useBreakL' x y = useBreakListsLinkTest (map (uncurry noa) x) (map (uncurry noa) y) +useBreakL :: [(ItemStructuralFunction, ComposeLinkType)] -> [(ItemStructuralFunction, ComposeLinkType)] + -> LinkTest +useBreakL x y = useBreakListsLinkTest (map (uncurry noa) x) (map (uncurry noa) y) where noa a b = (a, ILink b orientAttachment) -useBreakListsLinkTest :: [(ItemStructuralFunction, a)] -> [(ItemStructuralFunction, a)] -> LinkTest a +useBreakListsLinkTest :: [(ItemStructuralFunction, ItemLink)] + -> [(ItemStructuralFunction, ItemLink)] -> LinkTest useBreakListsLinkTest llist rlist = LTest ltest rtest where ltest (_, sf, _) = do @@ -79,27 +80,41 @@ itemToFunction itm = case itm ^. itType of TARGETING{} -> WeaponTargetingSF _ -> UncomposableIsolateSF -simplePCI :: Item -> PartiallyComposedItem ItemLink +simplePCI :: Item -> PartiallyComposedItem simplePCI itm = case _itType itm of - HELD LASGUN -> (itm, WeaponScopeSF, uncurry useBreakL' $ itemToBreakLists itm) - _ -> (itm, itemToFunction itm, uncurry useBreakL' $ itemToBreakLists itm) + HELD LASGUN -> (itm, WeaponScopeSF, laserLinkTest itm) + _ -> (itm, itemToFunction itm, uncurry useBreakL $ itemToBreakLists itm) -itemLinkTestLeft :: Item -> PartiallyComposedItem (LinkTest ItemLink) -> Maybe (LinkUpdate ItemLink) -itemLinkTestLeft itm pci = Nothing +laserLinkTest :: Item -> LinkTest +laserLinkTest itm = LTest (llleft itm) (llright itm) -basePartiallyComposedItem' :: Item -> PartiallyComposedItem ItemLink -basePartiallyComposedItem' itm = simplePCI itm +llleft :: Item -> PartiallyComposedItem -> Maybe LinkUpdate +llleft itm pci = _tryLeftLink (uncurry useBreakL $ itemToBreakLists itm) pci + +llright :: Item -> PartiallyComposedItem -> Maybe LinkUpdate +llright itm pci = case pci ^. _1 . itType of + CRAFT TRANSFORMER -> Just (toLasgunUpdate itm) + _ -> _tryRightLink (uncurry useBreakL $ itemToBreakLists itm) pci + +toLasgunUpdate :: Item -> LinkUpdate +toLasgunUpdate itm = LUpdate (ILink FunctionChangeLink orientAttachment) + (\(par,_,_) -> (par,WeaponPlatformSF,uncurry useBreakL $ itemToBreakLists itm)) + (\(chi,_,up) -> (chi,FunctionChangeSF,up)) + +--itemLinkTestLeft :: Item -> PartiallyComposedItem -> Maybe LinkUpdate +--itemLinkTestLeft itm = _tryLeftLink $ +-- uncurry useBreakL $ itemToBreakLists itm type LDTComb a b = LabelDoubleTree b a -> LabelDoubleTree b a -> Maybe (LabelDoubleTree b a) -leftIsParentCombine :: LDTComb (PartiallyComposedItem a) a +leftIsParentCombine :: LDTComb PartiallyComposedItem ItemLink leftIsParentCombine ltree rtree = do lu <- (ltree ^. ldtValue . _3 . tryRightLink) (rtree ^. ldtValue) return $ ltree & ldtValue %~ (lu ^. luParentUpdate) & ldtRight %~ (++ [(lu ^. luLinkType, rtree & ldtValue %~ (lu ^. luChildUpdate))]) -rightIsParentCombine :: LDTComb (PartiallyComposedItem a) a +rightIsParentCombine :: LDTComb PartiallyComposedItem ItemLink rightIsParentCombine ltree rtree = do lu <- (rtree ^. ldtValue . _3 . tryLeftLink) (ltree ^. ldtValue) return $ @@ -131,10 +146,10 @@ joinItemsInList f xs = snd $ h (xs, []) Nothing -> h (ys, y : z : zs) Just w -> h (w : ys, zs) -invLDT :: IM.IntMap Item -> [LabelDoubleTree ItemLink (PartiallyComposedItem ItemLink)] +invLDT :: IM.IntMap Item -> [LabelDoubleTree ItemLink PartiallyComposedItem] invLDT = joinItemsInList (leftRightCombine leftIsParentCombine rightIsParentCombine) . IM.elems - . fmap (singleLDT . basePartiallyComposedItem') + . fmap (singleLDT . simplePCI) -- this assumes the creature inventory is well formed, specifically the -- location ids @@ -180,7 +195,7 @@ invTrees' = IM.unions . map (ldtToIM getindex . fmap (^. _1)) . map (fmap (\(x, -- returns an intmap with trees for root items, indexed by inventory position invRootTrees :: IM.IntMap Item -> IM.IntMap (LabelDoubleTree ItemLink ComposedItem) -invRootTrees = IM.fromAscList . reverse . map (getid . fmap (\(x, y, _) -> (x, y))) . invLDT +invRootTrees = IM.fromAscList . reverse . map (getid . fmap (\(x, y, _) -> CItem x y)) . invLDT where getid :: LabelDoubleTree ItemLink ComposedItem -> (Int,LabelDoubleTree ItemLink ComposedItem) - getid t = (t ^?! ldtValue . _1 . itLocation . ilInvID, t) + getid t = (t ^?! ldtValue . cItem . itLocation . ilInvID, t) diff --git a/tags b/tags index 63f1d50f6..380a51585 100644 --- a/tags +++ b/tags @@ -56,17 +56,17 @@ Ambush src/Dodge/Data/ActionPlan.hs 178;" C Ammo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 6;" m Ammo src/Dodge/Item/Ammo.hs 1;" m AmmoEffectLink src/Dodge/Data/ComposedItem.hs 21;" C -AmmoEffectSF src/Dodge/Data/ComposedItem.hs 39;" C +AmmoEffectSF src/Dodge/Data/ComposedItem.hs 40;" C AmmoInLink src/Dodge/Data/ComposedItem.hs 17;" C -AmmoMagSF src/Dodge/Data/ComposedItem.hs 33;" C +AmmoMagSF src/Dodge/Data/ComposedItem.hs 34;" C AmmoMagType src/Dodge/Data/Item/Combine.hs 86;" t AmmoModLink src/Dodge/Data/ComposedItem.hs 18;" C -AmmoModifierSF src/Dodge/Data/ComposedItem.hs 36;" C +AmmoModifierSF src/Dodge/Data/ComposedItem.hs 37;" C AmmoParams src/Dodge/Data/Item/Use.hs 113;" t AmmoPayloadLink src/Dodge/Data/ComposedItem.hs 20;" C -AmmoPayloadSF src/Dodge/Data/ComposedItem.hs 38;" C +AmmoPayloadSF src/Dodge/Data/ComposedItem.hs 39;" C AmmoTargetingLink src/Dodge/Data/ComposedItem.hs 19;" C -AmmoTargetingSF src/Dodge/Data/ComposedItem.hs 37;" C +AmmoTargetingSF src/Dodge/Data/ComposedItem.hs 38;" C AmmoType src/Dodge/Data/Item/Use/Consumption/Ammo.hs 39;" t AnRoom src/Dodge/Annotation/Data.hs 17;" C AnTree src/Dodge/Annotation/Data.hs 18;" C @@ -98,7 +98,7 @@ Attention src/Dodge/Data/Creature/Perception.hs 60;" t AttentiveTo src/Dodge/Data/Creature/Perception.hs 61;" C Audition src/Dodge/Data/Creature/Perception.hs 47;" t AugmentedHUDLink src/Dodge/Data/ComposedItem.hs 25;" C -AugmentedHUDSF src/Dodge/Data/ComposedItem.hs 32;" C +AugmentedHUDSF src/Dodge/Data/ComposedItem.hs 33;" C AutoAI src/Dodge/Data/Creature/Misc.hs 57;" C AutoCrit src/Dodge/Creature/AutoCrit.hs 1;" m AutoDoorObstacle src/Dodge/Data/PathGraph.hs 51;" C @@ -245,6 +245,7 @@ CHARTREUSE src/Color/Data.hs 25;" C CHEMFUELPOUCH src/Dodge/Data/Item/Combine.hs 92;" C CHeal src/Dodge/Data/Item/HeldUse.hs 26;" C CIRCLE src/Dodge/Data/GenParams.hs 20;" C +CItem src/Dodge/Data/ComposedItem.hs 46;" C CME src/Dodge/Data/MuzzleEffect.hs 11;" C CONCUSSIVE src/Dodge/Data/Damage/Type.hs 22;" C CONSUMABLE src/Dodge/Data/Item/Combine.hs 19;" C @@ -337,7 +338,7 @@ Common src/Dodge/Zoning/Common.hs 1;" m Compile src/Shader/Compile.hs 1;" m Compose src/Dodge/Tree/Compose.hs 4;" m ComposeLinkType src/Dodge/Data/ComposedItem.hs 16;" t -ComposedItem src/Dodge/Data/ComposedItem.hs 43;" t +ComposedItem src/Dodge/Data/ComposedItem.hs 46;" t ComposedItem src/Dodge/Data/ComposedItem.hs 6;" m Composite src/Picture/Composite.hs 1;" m ComsSS src/Dodge/Data/Scenario.hs 98;" C @@ -746,6 +747,8 @@ FullRes src/Dodge/Data/Config.hs 95;" C FullShadowFidelity src/Shape/Data.hs 24;" C FullSize src/Dodge/Data/Item/Params.hs 31;" C FullyVisible src/Dodge/Data/CamouflageStatus.hs 12;" C +FunctionChangeLink src/Dodge/Data/ComposedItem.hs 26;" C +FunctionChangeSF src/Dodge/Data/ComposedItem.hs 41;" C GASINJECTOR src/Dodge/Data/Item/Combine.hs 69;" C GEqC src/SameConstr.hs 20;" c GLASSSHARD src/Dodge/Data/Item/Combine.hs 38;" C @@ -858,7 +861,7 @@ Huge src/Shape/Data.hs 28;" C Humanoid src/Dodge/Data/Creature/Misc.hs 65;" C Humanoid src/Dodge/Humanoid.hs 1;" m HumanoidAI src/Dodge/Data/Creature/Misc.hs 48;" t -ILink src/Dodge/Data/ComposedItem.hs 45;" C +ILink src/Dodge/Data/ComposedItem.hs 51;" C INVISIBILITYEQUIPMENT src/Dodge/Data/Item/Combine.hs 105;" C IRONBAR src/Dodge/Data/Item/Combine.hs 57;" C ITEMDETECTOR src/Dodge/Data/Item/Combine.hs 170;" C @@ -932,7 +935,7 @@ ItEffect src/Dodge/Data/Item/Effect.hs 12;" t ItEffect src/Dodge/ItEffect.hs 1;" m ItID src/Dodge/Data/Item.hs 31;" t ItInvEffect src/Dodge/Data/Item/Effect.hs 19;" t -ItTargeting src/Dodge/Data/Item.hs 47;" C +ItTargeting src/Dodge/Data/Item.hs 48;" C ItZoom src/Dodge/Data/Item/Use.hs 181;" t Item src/Dodge/Data/Item.hs 33;" t Item src/Dodge/Data/Item.hs 4;" m @@ -940,12 +943,12 @@ Item src/Dodge/Default/Item.hs 1;" m Item src/Dodge/Item.hs 3;" m ItemClust src/Dodge/Combine/Graph.hs 17;" C ItemDimension src/Dodge/Data/Item/Misc.hs 13;" t -ItemLink src/Dodge/Data/ComposedItem.hs 45;" t +ItemLink src/Dodge/Data/ComposedItem.hs 51;" t ItemLocation src/Dodge/Data/Item/Location.hs 27;" t ItemParams src/Dodge/Data/Item/Params.hs 13;" t ItemParams src/Dodge/Tesla/ItemParams.hs 1;" m ItemScrollTimeFlow src/Dodge/Data/World.hs 62;" C -ItemStructuralFunction src/Dodge/Data/ComposedItem.hs 28;" t +ItemStructuralFunction src/Dodge/Data/ComposedItem.hs 29;" t ItemTargeting src/Dodge/Data/Item.hs 47;" t ItemType src/Dodge/Data/Item/Combine.hs 15;" t ItemUse src/Dodge/Data/Item/Use.hs 35;" t @@ -966,7 +969,7 @@ LBlink src/Dodge/Data/Item/HeldUse.hs 53;" C LBoost src/Dodge/Data/Item/HeldUse.hs 55;" C LDT src/Dodge/Data/DoubleTree.hs 39;" C LDTBottomNode src/Dodge/Data/DoubleTree.hs 27;" C -LDTComb src/Dodge/Item/Grammar.hs 89;" t +LDTComb src/Dodge/Item/Grammar.hs 108;" t LDTMidAboveNode src/Dodge/Data/DoubleTree.hs 25;" C LDTMidBelowNode src/Dodge/Data/DoubleTree.hs 26;" C LDTRootNode src/Dodge/Data/DoubleTree.hs 23;" C @@ -981,11 +984,11 @@ LRewind src/Dodge/Data/Item/HeldUse.hs 49;" C LS src/Dodge/Data/LightSource.hs 34;" C LSParam src/Dodge/Data/LightSource.hs 27;" t LShrink src/Dodge/Data/Item/HeldUse.hs 52;" C -LTest src/Dodge/Data/ComposedItem.hs 50;" C +LTest src/Dodge/Data/ComposedItem.hs 56;" C LTimePause src/Dodge/Data/Item/HeldUse.hs 50;" C LTimeScroll src/Dodge/Data/Item/HeldUse.hs 51;" C LUnsafeBlink src/Dodge/Data/Item/HeldUse.hs 54;" C -LUpdate src/Dodge/Data/ComposedItem.hs 55;" C +LUpdate src/Dodge/Data/ComposedItem.hs 61;" C LWorld src/Dodge/Data/LWorld.hs 96;" t LWorld src/Dodge/Data/LWorld.hs 6;" m LabLink src/Dodge/Data/Room.hs 45;" C @@ -1044,8 +1047,8 @@ LinearShockwave src/Dodge/Data/LinearShockwave.hs 13;" t LinearShockwave src/Dodge/Data/LinearShockwave.hs 6;" m Link src/Dodge/Room/Link.hs 6;" m LinkDecoration src/Dodge/Debug/LinkDecoration.hs 1;" m -LinkTest src/Dodge/Data/ComposedItem.hs 50;" t -LinkUpdate src/Dodge/Data/ComposedItem.hs 55;" t +LinkTest src/Dodge/Data/ComposedItem.hs 56;" t +LinkUpdate src/Dodge/Data/ComposedItem.hs 61;" t List src/Dodge/Combine/List.hs 1;" m List src/Dodge/Render/List.hs 1;" m ListDisplayParams src/Dodge/Data/SelectionList.hs 18;" t @@ -1243,6 +1246,7 @@ NoHammer src/Dodge/Data/Hammer.hs 13;" C NoHoming src/Dodge/Data/Item/Use/Consumption/Ammo.hs 24;" C NoIntImp src/Dodge/Data/CreatureEffect.hs 20;" C NoInvEffect src/Dodge/Data/Item/Effect.hs 20;" C +NoItTargeting src/Dodge/Data/Item.hs 47;" C NoLighting src/Dodge/Data/Config.hs 102;" C NoMvType src/Dodge/Data/Creature/Misc.hs 38;" C NoNeedWeapon src/Dodge/Room/NoNeedWeapon.hs 2;" m @@ -1363,7 +1367,7 @@ ParamMID src/Dodge/Data/Item/Params.hs 28;" C Parameters src/Shader/Parameters.hs 1;" m Parameters src/Shape/Parameters.hs 1;" m Params src/Dodge/Data/Item/Params.hs 6;" m -PartiallyComposedItem src/Dodge/Data/ComposedItem.hs 42;" t +PartiallyComposedItem src/Dodge/Data/ComposedItem.hs 44;" t PassthroughLockKeyLists src/Dodge/Annotation/Data.hs 19;" C Path src/Dodge/Path.hs 2;" m Path src/Dodge/Room/Path.hs 1;" m @@ -1553,7 +1557,7 @@ Reload src/Dodge/Data/ActionPlan.hs 190;" C ReloadStatus src/Dodge/Data/Item/Use/Consumption.hs 20;" t RemoteDirectionPU src/Dodge/Data/Item/Use/Consumption/Ammo.hs 32;" C RemoteScreenLink src/Dodge/Data/ComposedItem.hs 24;" C -RemoteScreenSF src/Dodge/Data/ComposedItem.hs 34;" C +RemoteScreenSF src/Dodge/Data/ComposedItem.hs 35;" C RemoveEquipment src/Dodge/Data/RightButtonOptions.hs 36;" C RemoveShieldWall src/Dodge/Data/Item/Effect.hs 26;" C Remove_LOS src/Dodge/Data/Config.hs 77;" C @@ -1965,7 +1969,7 @@ TwoHandOver src/Dodge/Data/Item/Use.hs 176;" C TwoHandUnder src/Dodge/Data/Item/Use.hs 175;" C Type src/Dodge/Data/Damage/Type.hs 6;" m Typical src/Shape/Data.hs 36;" C -UncomposableIsolateSF src/Dodge/Data/ComposedItem.hs 35;" C +UncomposableIsolateSF src/Dodge/Data/ComposedItem.hs 36;" C Uncursed src/Dodge/Data/Item/CurseStatus.hs 12;" C UnderGround src/Dodge/Data/Scenario.hs 78;" C UnderRoof src/Dodge/Data/Scenario.hs 79;" C @@ -2096,11 +2100,11 @@ WdWdFromItixCrixWdWd src/Dodge/Data/WorldEffect.hs 34;" C WdWdNegateTrig src/Dodge/Data/WorldEffect.hs 33;" C WdYouPos src/Dodge/Data/WorldEffect.hs 41;" C Weapon src/Dodge/Item/Weapon.hs 2;" m -WeaponPlatformSF src/Dodge/Data/ComposedItem.hs 29;" C +WeaponPlatformSF src/Dodge/Data/ComposedItem.hs 30;" C WeaponScopeLink src/Dodge/Data/ComposedItem.hs 22;" C -WeaponScopeSF src/Dodge/Data/ComposedItem.hs 30;" C +WeaponScopeSF src/Dodge/Data/ComposedItem.hs 31;" C WeaponTargetingLink src/Dodge/Data/ComposedItem.hs 23;" C -WeaponTargetingSF src/Dodge/Data/ComposedItem.hs 31;" C +WeaponTargetingSF src/Dodge/Data/ComposedItem.hs 32;" C Weapons src/Dodge/Item/Held/Weapons.hs 1;" m West src/Dodge/Data/CardinalPoint.hs 7;" C Window src/Dodge/Base/Window.hs 2;" m @@ -2244,6 +2248,8 @@ _bulGunSound src/Dodge/Data/Item/Use.hs 105;" f _bullets src/Dodge/Data/LWorld.hs 105;" f _buttons src/Dodge/Data/LWorld.hs 133;" f _cClock src/Dodge/Data/CWorld.hs 28;" f +_cItem src/Dodge/Data/ComposedItem.hs 47;" f +_cItemFunction src/Dodge/Data/ComposedItem.hs 48;" f _cUse src/Dodge/Data/Item/Use.hs 51;" f _cWorld src/Dodge/Data/World.hs 38;" f _camBoundBox src/Dodge/Data/Camera.hs 31;" f @@ -2573,8 +2579,8 @@ _hudElement src/Dodge/Data/HUD.hs 36;" f _humanoidAI src/Dodge/Data/Creature/Misc.hs 69;" f _iaLoaded src/Dodge/Data/Item/Use/Consumption.hs 22;" f _iaMax src/Dodge/Data/Item/Use/Consumption.hs 21;" f -_iatOrient src/Dodge/Data/ComposedItem.hs 47;" f -_iatType src/Dodge/Data/ComposedItem.hs 46;" f +_iatOrient src/Dodge/Data/ComposedItem.hs 53;" f +_iatType src/Dodge/Data/ComposedItem.hs 52;" f _ibtAmmoMag src/Dodge/Data/Item/Combine.hs 22;" f _ibtAttach src/Dodge/Data/Item/Combine.hs 21;" f _ibtBulletMod src/Dodge/Data/Item/Combine.hs 24;" f @@ -2619,9 +2625,9 @@ _itInvSize src/Dodge/Data/Item.hs 41;" f _itLocation src/Dodge/Data/Item.hs 37;" f _itParams src/Dodge/Data/Item.hs 44;" f _itTargeting src/Dodge/Data/Item.hs 39;" f -_itTgActive src/Dodge/Data/Item.hs 50;" f -_itTgID src/Dodge/Data/Item.hs 49;" f -_itTgPos src/Dodge/Data/Item.hs 48;" f +_itTgActive src/Dodge/Data/Item.hs 51;" f +_itTgID src/Dodge/Data/Item.hs 50;" f +_itTgPos src/Dodge/Data/Item.hs 49;" f _itType src/Dodge/Data/Item.hs 35;" f _itUse src/Dodge/Data/Item.hs 34;" f _itemLocations src/Dodge/Data/LWorld.hs 99;" f @@ -2678,9 +2684,9 @@ _lsParam src/Dodge/Data/LightSource.hs 36;" f _lsPict src/Dodge/Data/LightSource.hs 38;" f _lsPos src/Dodge/Data/LightSource.hs 28;" f _lsRad src/Dodge/Data/LightSource.hs 29;" f -_luChildUpdate src/Dodge/Data/ComposedItem.hs 58;" f -_luLinkType src/Dodge/Data/ComposedItem.hs 56;" f -_luParentUpdate src/Dodge/Data/ComposedItem.hs 57;" f +_luChildUpdate src/Dodge/Data/ComposedItem.hs 64;" f +_luLinkType src/Dodge/Data/ComposedItem.hs 62;" f +_luParentUpdate src/Dodge/Data/ComposedItem.hs 63;" 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 @@ -3138,8 +3144,8 @@ _tractorBeams src/Dodge/Data/LWorld.hs 118;" f _trieChildren src/SimpleTrie.hs 10;" f _trieMVal src/SimpleTrie.hs 9;" f _triggers src/Dodge/Data/LWorld.hs 127;" f -_tryLeftLink src/Dodge/Data/ComposedItem.hs 51;" f -_tryRightLink src/Dodge/Data/ComposedItem.hs 52;" f +_tryLeftLink src/Dodge/Data/ComposedItem.hs 57;" f +_tryRightLink src/Dodge/Data/ComposedItem.hs 58;" f _ttDeathEffect src/Dodge/Data/Terminal.hs 82;" f _ttTriggerID src/Dodge/Data/Terminal.hs 81;" f _tuDir src/Dodge/Data/Machine.hs 61;" f @@ -3428,7 +3434,6 @@ baseBlockPane src/Dodge/Placement/Instance/Wall.hs 86;" f baseCaneShape src/Dodge/Item/Draw/SPic.hs 255;" f baseDebris src/Dodge/Block/Debris.hs 122;" f baseFloorTileSize src/Tile.hs 38;" f -basePartiallyComposedItem' src/Dodge/Item/Grammar.hs 86;" f baseRifleShape src/Dodge/Item/Draw/SPic.hs 258;" f baseRodShape src/Dodge/Item/Draw/SPic.hs 342;" f baseSMGShape src/Dodge/Item/Draw/SPic.hs 325;" f @@ -4529,21 +4534,21 @@ intersectSegsSeg src/Geometry/Intersect.hs 232;" f intervalList src/Geometry.hs 315;" f interweave src/Justify.hs 17;" f intsToPos src/Dodge/Room/Modify/Girder.hs 160;" f -invAdj src/Dodge/Item/Grammar.hs 146;" f +invAdj src/Dodge/Item/Grammar.hs 165;" f invDimColor src/Dodge/DisplayInventory.hs 139;" f invDisplayParams src/Dodge/ListDisplayParams.hs 29;" f invHead src/Dodge/Render/HUD.hs 266;" f -invIndentIM src/Dodge/Item/Grammar.hs 158;" f -invLDT src/Dodge/Item/Grammar.hs 130;" f -invRootMap src/Dodge/Item/Grammar.hs 139;" f -invRootTrees src/Dodge/Item/Grammar.hs 178;" f +invIndentIM src/Dodge/Item/Grammar.hs 177;" f +invLDT src/Dodge/Item/Grammar.hs 149;" f +invRootMap src/Dodge/Item/Grammar.hs 158;" f +invRootTrees src/Dodge/Item/Grammar.hs 197;" f invSelectionItem src/Dodge/Inventory/SelectionList.hs 34;" f invSelectionItem' src/Dodge/Inventory/SelectionList.hs 16;" f invShiftPointBy src/Dodge/ShiftPoint.hs 8;" f invSideEff src/Dodge/Creature/State.hs 161;" f invSize src/Dodge/Inventory/CheckSlots.hs 41;" f -invTrees src/Dodge/Item/Grammar.hs 166;" f -invTrees' src/Dodge/Item/Grammar.hs 170;" f +invTrees src/Dodge/Item/Grammar.hs 185;" f +invTrees' src/Dodge/Item/Grammar.hs 189;" f inventoryExtra src/Dodge/Render/HUD.hs 184;" f inventoryExtraH src/Dodge/Render/HUD.hs 195;" f inventoryX src/Dodge/Creature.hs 115;" f @@ -4605,7 +4610,8 @@ itemToBreakLists src/Dodge/Item/Grammar.hs 41;" f itemToFunction src/Dodge/Item/Grammar.hs 67;" f itemTreeSPic src/Dodge/Item/Draw/SPic.hs 22;" f itemUpdate src/Dodge/Creature/State.hs 310;" f -itemUseEffect src/Dodge/Creature/Impulse/UseItem.hs 34;" f +itemUseEffect src/Dodge/Creature/Impulse/UseItem.hs 56;" f +itemUseEffect' src/Dodge/Creature/Impulse/UseItem.hs 34;" f iterateUntil src/MonadHelp.hs 23;" f iterateWhile src/MonadHelp.hs 30;" f itmBaseInfo src/Dodge/Item/Info.hs 22;" f @@ -4614,7 +4620,7 @@ itmSpaceInfo src/Dodge/Item/Info.hs 17;" f itmUsageInfo src/Dodge/Item/Info.hs 200;" f jShape src/Dodge/Placement/Instance/LightSource.hs 86;" f jaggedShape src/Dodge/Block/Debris.hs 191;" f -joinItemsInList src/Dodge/Item/Grammar.hs 121;" f +joinItemsInList src/Dodge/Item/Grammar.hs 140;" f jps0' src/Dodge/LevelGen/PlacementHelper.hs 60;" f jps0PushPS src/Dodge/LevelGen/PlacementHelper.hs 63;" f jsps src/Dodge/LevelGen/PlacementHelper.hs 36;" f @@ -4647,6 +4653,7 @@ lasSensorTurretTest src/Dodge/Room/LasTurret.hs 105;" f lasTunnel src/Dodge/Room/LasTurret.hs 124;" f lasTunnelRunPast src/Dodge/Room/LasTurret.hs 165;" f lasTurret src/Dodge/Placement/Instance/Turret.hs 23;" f +laserLinkTest src/Dodge/Item/Grammar.hs 88;" f lastMap src/Dodge/DoubleTree.hs 174;" f latchkey src/Dodge/Item/Held/Utility.hs 23;" f launcher src/Dodge/Item/Held/Launcher.hs 12;" f @@ -4666,10 +4673,10 @@ ldtToIndentList src/Dodge/DoubleTree.hs 146;" f ldtToLoc src/Dodge/DoubleTree.hs 187;" f left src/DoubleStack.hs 16;" f leftInfo src/Dodge/Item/Info.hs 96;" f -leftIsParentCombine src/Dodge/Item/Grammar.hs 91;" f +leftIsParentCombine src/Dodge/Item/Grammar.hs 110;" f leftItemSPic src/Dodge/Item/Draw/SPic.hs 97;" f leftPad src/Padding.hs 14;" f -leftRightCombine src/Dodge/Item/Grammar.hs 105;" f +leftRightCombine src/Dodge/Item/Grammar.hs 124;" f legsSPic src/Dodge/Item/Draw/SPic.hs 415;" f liShape src/Dodge/Placement/Instance/LightSource.hs 99;" f light src/Color.hs 104;" f @@ -4698,6 +4705,8 @@ listCursorChooseBorderScale src/Dodge/Render/List.hs 105;" f listGuard src/Dodge/Creature/ReaderUpdate.hs 188;" f listSelectionColorPicture src/Dodge/DisplayInventory.hs 245;" f litCorridor90 src/Dodge/Room/RoadBlock.hs 26;" f +llleft src/Dodge/Item/Grammar.hs 91;" f +llright src/Dodge/Item/Grammar.hs 94;" f lmt src/MatrixHelper.hs 43;" f lnkBothAnd src/Dodge/Room/Procedural.hs 120;" f lnkMidPosInvSelsCol src/Dodge/Render/HUD.hs 255;" f @@ -5393,7 +5402,7 @@ rezText' src/Dodge/Story.hs 17;" f rhombus src/Polyhedra.hs 71;" f rifle src/Dodge/Item/Held/Cane.hs 51;" f right src/DoubleStack.hs 16;" f -rightIsParentCombine src/Dodge/Item/Grammar.hs 98;" f +rightIsParentCombine src/Dodge/Item/Grammar.hs 117;" f rightPad src/Padding.hs 22;" f rightPadNoSquash src/Padding.hs 26;" f rlPosDir src/Dodge/RoomLink.hs 94;" f @@ -5885,6 +5894,7 @@ toColor8 src/Color.hs 148;" f toCombNodeLabel src/Dodge/Combine/Graph.hs 81;" f toFloatVAs src/Shader/Compile.hs 211;" f toLabel src/Dodge/Cleat.hs 16;" f +toLasgunUpdate src/Dodge/Item/Grammar.hs 99;" f toMultiset src/Multiset.hs 58;" f toOnward src/Dodge/Tree/Compose.hs 101;" f toTopLeft src/Dodge/Render/List.hs 185;" f @@ -5893,7 +5903,7 @@ toV3 src/Geometry/Data.hs 38;" f toV4 src/Geometry/Data.hs 40;" f toggleCombineInv src/Dodge/DisplayInventory.hs 32;" f toggleCommand src/Dodge/Terminal.hs 194;" f -toggleEquipmentAt src/Dodge/Creature/Impulse/UseItem.hs 54;" f +toggleEquipmentAt src/Dodge/Creature/Impulse/UseItem.hs 75;" f toggleJust src/MaybeHelp.hs 41;" f toggleMap src/Dodge/Update/Input/InGame.hs 237;" f toggleTweakInv src/Dodge/Update/Input/InGame.hs 244;" f @@ -5912,7 +5922,7 @@ torso src/Dodge/Creature/Picture.hs 102;" f tractCr src/Dodge/TractorBeam/Update.hs 28;" f tractFlIt src/Dodge/TractorBeam/Update.hs 23;" f tractorBeamAt src/Dodge/HeldUse.hs 265;" f -tractorGun src/Dodge/Item/Held/BatteryGuns.hs 67;" f +tractorGun src/Dodge/Item/Held/BatteryGuns.hs 64;" f tractorGunPic src/Dodge/Item/Draw/SPic.hs 375;" f tractorPullPos src/Dodge/TractorBeam/Update.hs 33;" f tractorSPic src/Dodge/TractorBeam/Draw.hs 10;" f @@ -6135,8 +6145,8 @@ upperPrismPolyST src/Shape.hs 107;" f upperPrismPolySU src/Shape.hs 113;" f upperPrismPolyTS src/Shape.hs 119;" f upperRounded src/Shape.hs 183;" f -useBreakL' src/Dodge/Item/Grammar.hs 23;" f -useBreakListsLinkTest src/Dodge/Item/Grammar.hs 29;" f +useBreakL src/Dodge/Item/Grammar.hs 22;" f +useBreakListsLinkTest src/Dodge/Item/Grammar.hs 28;" f useBulletPayload src/Dodge/Bullet.hs 105;" f useC src/Dodge/Cuse.hs 8;" f useC' src/Dodge/Cuse.hs 13;" f @@ -6144,9 +6154,9 @@ useE src/Dodge/Euse.hs 24;" f useEquipment src/Dodge/Creature/State.hs 145;" f useGasParams src/Dodge/HeldUse.hs 412;" f useHotKey src/Dodge/Creature/YourControl.hs 48;" f -useItemHotkey src/Dodge/Creature/Impulse/UseItem.hs 124;" f -useItemLeftClick src/Dodge/Creature/Impulse/UseItem.hs 99;" f -useItemLeftClick' src/Dodge/Creature/Impulse/UseItem.hs 112;" f +useItemHotkey src/Dodge/Creature/Impulse/UseItem.hs 145;" f +useItemLeftClick src/Dodge/Creature/Impulse/UseItem.hs 120;" f +useItemLeftClick' src/Dodge/Creature/Impulse/UseItem.hs 133;" f useL src/Dodge/Luse.hs 13;" f useLnkRoomPos src/Dodge/PlacementSpot.hs 244;" f useLoadedAmmo src/Dodge/HeldUse.hs 207;" f