diff --git a/src/Dodge/BaseTriggerType.hs b/src/Dodge/BaseTriggerType.hs index 1dd63ce4c..eb94d5e15 100644 --- a/src/Dodge/BaseTriggerType.hs +++ b/src/Dodge/BaseTriggerType.hs @@ -16,45 +16,45 @@ itemTriggerType itm = case itm ^. itType of heldTriggerType :: HeldItemType -> TriggerType heldTriggerType = \case - BANGSTICK{} -> HammerTrigger - REWINDER -> HammerTrigger - TIMESTOPPER -> HammerTrigger - TIMESCROLLER -> HammerTrigger - PISTOL -> HammerTrigger - MACHINEPISTOL -> AutoTrigger - AUTOPISTOL -> AutoTrigger - SMG -> AutoTrigger - BANGCONE -> HammerTrigger - BLUNDERBUSS -> HammerTrigger - GRAPECANNON{} -> HammerTrigger - MINIGUNX{} -> AutoTrigger + BANGSTICK{} -> HammerTrigger 8 + REWINDER -> HammerTrigger 20 + TIMESTOPPER -> HammerTrigger 20 + TIMESCROLLER -> HammerTrigger 20 + PISTOL -> HammerTrigger 6 + MACHINEPISTOL -> WarmUpCoolDown 50 100 200 + AUTOPISTOL -> AutoTrigger 8 + SMG -> AutoTrigger 8 + BANGCONE -> HammerTrigger 20 + BLUNDERBUSS -> HammerTrigger 20 + GRAPECANNON{} -> HammerTrigger 20 + MINIGUNX{} -> WarmUpNoDelay 100 --VOLLEYGUN i -> BurstTrigger $ fmap (3*) [1 .. i-1] - VOLLEYGUN i -> VolleyGunTrigger i - RIFLE -> HammerTrigger - ALTERIFLE -> HammerTrigger - AUTORIFLE -> AutoTrigger - BURSTRIFLE -> BurstTrigger [3,6] - BANGROD -> HammerTrigger - ELEPHANTGUN -> HammerTrigger - AMR -> HammerTrigger - AUTOAMR -> AutoTrigger - SNIPERRIFLE -> HammerTrigger - FLAMESPITTER -> BurstTrigger [1..9] - FLAMETHROWER -> AutoTrigger - FLAMETORRENT -> AutoTrigger - FLAMEWALL -> AutoTrigger - BLOWTORCH -> AutoTrigger - SPARKGUN -> AutoTrigger - TESLAGUN -> AutoTrigger - LASER -> AutoTrigger - TRACTORGUN -> AutoTrigger - RLAUNCHER -> HammerTrigger - RLAUNCHERX{} -> HammerTrigger - GLAUNCHER -> HammerTrigger - POISONSPRAYER -> AutoTrigger - SHATTERGUN -> HammerTrigger - TORCH -> AutoTrigger + VOLLEYGUN i -> VolleyGunTrigger i 15 + RIFLE -> HammerTrigger 6 + ALTERIFLE -> HammerTrigger 6 + AUTORIFLE -> AutoTrigger 6 + BURSTRIFLE -> BurstTrigger [3,6] 8 -- time last used gets updated after last burst fire + BANGROD -> HammerTrigger 12 + ELEPHANTGUN -> HammerTrigger 12 + AMR -> HammerTrigger 12 + AUTOAMR -> AutoTrigger 12 + SNIPERRIFLE -> HammerTrigger 12 + FLAMESPITTER -> BurstTrigger [1..9] 6 + FLAMETHROWER -> NoTrigger + FLAMETORRENT -> NoTrigger + FLAMEWALL -> NoTrigger + BLOWTORCH -> NoTrigger + SPARKGUN -> NoTrigger + TESLAGUN -> NoTrigger + LASER -> NoTrigger + TRACTORGUN -> NoTrigger + RLAUNCHER -> HammerTrigger 20 + RLAUNCHERX{} -> HammerTrigger 20 + GLAUNCHER -> HammerTrigger 20 + POISONSPRAYER -> NoTrigger + SHATTERGUN -> HammerTrigger 20 + TORCH -> NoTrigger FLATSHIELD -> NoTrigger KEYCARD{} -> NoTrigger - BLINKER -> AlwaysSingleTrigger - BLINKERUNSAFE -> AlwaysSingleTrigger + BLINKER -> HammerTrigger 20 + BLINKERUNSAFE -> HammerTrigger 20 diff --git a/src/Dodge/Creature/Impulse/UseItem.hs b/src/Dodge/Creature/Impulse/UseItem.hs index cbe5d965a..02d031cd8 100644 --- a/src/Dodge/Creature/Impulse/UseItem.hs +++ b/src/Dodge/Creature/Impulse/UseItem.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE LambdaCase #-} +--{-# LANGUAGE LambdaCase #-} module Dodge.Creature.Impulse.UseItem (useItem) where @@ -19,8 +19,9 @@ useItem :: Int -> PressType -> World -> Maybe World useItem invid pt w = fmap (worldEventFlags . at InventoryChange ?~ ()) $ do cr <- w ^? cWorld . lWorld . creatures . ix 0 itmloc <- allInvLocs (_crInv cr) ^? ix invid . _2 - let usedloc = chooseUseLocation itmloc - useItemLoc cr usedloc pt w + useItemLoc cr itmloc pt w +-- let usedloc = chooseUseLocation itmloc +-- useItemLoc cr usedloc pt w useItemLoc :: Creature -> LocationLDT ItemLink OItem -> PressType -> World -> Maybe World useItemLoc cr loc pt w @@ -50,29 +51,30 @@ useItemLoc cr loc pt w , pt == InitialPress , Just invid' <- itm ^? itLocation . ilInvID = return $ toggleEquipmentAt invid' cr w - | otherwise = Nothing + | otherwise = (\loc' -> useItemLoc cr loc' pt w) =<< locUp loc + -- ie try location above where sf = loc ^. locLDT . ldtValue . _2 ldt = loc ^. locLDT itm = ldt ^. ldtValue . _1 -chooseUseLocation :: LocationLDT ItemLink OItem -> LocationLDT ItemLink OItem -chooseUseLocation loc - | isJust $ loc ^? locLDT . ldtValue . _1 . itType . ibtEquip = loc - | isJust $ loc ^? locLDT . ldtValue . _1 . itUse . uaParams . apProjectiles . ix 0 = - loc - | sf <- loc ^. locLDT . ldtValue . _2 - , structureUseAtLoc sf = - loc - | otherwise = maybe loc chooseUseLocation $ locUp loc - -structureUseAtLoc :: ItemStructuralFunction -> Bool -structureUseAtLoc = \case - HeldPlatformSF -> True - UnderBarrelPlatformSF -> True - GadgetPlatformSF -> True - MapperSF -> True - _ -> False +--chooseUseLocation :: LocationLDT ItemLink OItem -> LocationLDT ItemLink OItem +--chooseUseLocation loc +-- | isJust $ loc ^? locLDT . ldtValue . _1 . itType . ibtEquip = loc +-- | isJust $ loc ^? locLDT . ldtValue . _1 . itUse . uaParams . apProjectiles . ix 0 = +-- loc +-- | sf <- loc ^. locLDT . ldtValue . _2 +-- , structureUseAtLoc sf = +-- loc +-- | otherwise = maybe loc chooseUseLocation $ locUp loc +-- +--structureUseAtLoc :: ItemStructuralFunction -> Bool +--structureUseAtLoc = \case +-- HeldPlatformSF -> True +-- UnderBarrelPlatformSF -> True +-- GadgetPlatformSF -> True +-- MapperSF -> True +-- _ -> False activateDetonator :: LDTree ItemLink OItem -> World -> World activateDetonator det = fromMaybe id $ do diff --git a/src/Dodge/Creature/State.hs b/src/Dodge/Creature/State.hs index 8dfbc200e..15f4a03bf 100644 --- a/src/Dodge/Creature/State.hs +++ b/src/Dodge/Creature/State.hs @@ -3,9 +3,10 @@ module Dodge.Creature.State ( doDamage, ) where +import Dodge.HeldUse +import Dodge.BaseTriggerType import Dodge.Data.DoubleTree import Dodge.Item.Orientation -import Dodge.Item.UseDelay import Control.Applicative import Control.Monad import qualified Data.Map.Strict as M @@ -166,26 +167,26 @@ invItemLocUpdate cr loc w = doAnyEquipmentEffect loc cr $ case itm ^. itType of w & pointerToItem itm . itParams . wTime %~ (max 0 . subtract 1) HELD MACHINEPISTOL{} - | fromMaybe 0 (itm ^? itParams . wTime) >= _coolEnd (useDelay itm) -> + | fromMaybe 0 (itm ^? itParams . wTime) >= _coolEnd (itemTriggerType itm) -> w & pointerToItem itm . itParams . wTime .~ 0 & pointerToItem itm . itParams . coolSound .~ Nothing - | fromMaybe 0 (itm ^? itParams . wTime) == _coolStart (useDelay itm) -> + | fromMaybe 0 (itm ^? itParams . wTime) == _coolStart (itemTriggerType itm) -> w & randGen .~ g & pointerToItem itm . itParams . wTime +~ 1 & pointerToItem itm . itParams . coolSound ?~ sid & soundContinue (CrWeaponSound (_crID cr) (fromIntegral $ _itID itm)) (_crPos cr) sid (Just 1) - | fromMaybe 0 (itm ^? itParams . wTime) > _coolStart (useDelay itm) -> + | fromMaybe 0 (itm ^? itParams . wTime) > _coolStart (itemTriggerType itm) -> w & pointerToItem itm . itParams . wTime +~ 1 & soundContinue (CrWeaponSound (_crID cr) (fromIntegral $ _itID itm)) (_crPos cr) (fromMaybe undefined (itm ^? itParams . coolSound . _Just)) (Just 1) | itm ^? itParams . isWarming == Just True -> w & pointerToItem itm . itParams . isWarming .~ False - | fromMaybe 0 (itm ^? itParams . wTime) >= _warmStart (useDelay itm) -> + | fromMaybe 0 (itm ^? itParams . wTime) >= _warmStart (itemTriggerType itm) -> w & pointerToItem itm . itParams . wTime - .~ _coolStart (useDelay itm) + .~ _coolStart (itemTriggerType itm) | otherwise -> w & pointerToItem itm . itParams . wTime .~ 0 @@ -219,7 +220,7 @@ tryUseParent loc w = fromMaybe w $ do t <- locUp loc let t' = t ^. locLDT cr <- w ^? cWorld . lWorld . creatures . ix 0 - return $ heldEffectNoHammerCheck t' cr w + return $ heldEffect InitialPress t' cr w trySynthBullet :: LocationLDT ItemLink OItem -> World -> World trySynthBullet loc w = fromMaybe w $ do diff --git a/src/Dodge/Data/TriggerType.hs b/src/Dodge/Data/TriggerType.hs index 9ee9ab215..7baf4adc6 100644 --- a/src/Dodge/Data/TriggerType.hs +++ b/src/Dodge/Data/TriggerType.hs @@ -1,18 +1,28 @@ {-# LANGUAGE StrictData #-} ---{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell #-} module Dodge.Data.TriggerType where +import Control.Lens --import Data.Aeson --import Data.Aeson.TH data TriggerType - = AutoTrigger - | HammerTrigger + = AutoTrigger Int + | HammerTrigger Int | NoTrigger - | AlwaysSingleTrigger - | BurstTrigger [Int] - | VolleyGunTrigger Int +-- | AlwaysSingleTrigger Int + | BurstTrigger {_burstFrames :: [Int], _burstRate :: Int} + | VolleyGunTrigger {_volleyNumBarrels::Int, _volleyRate :: Int} + | WarmUpCoolDown + { _warmStart :: Int + , _coolStart :: Int + , _coolEnd :: Int + } + | WarmUpNoDelay + { _warmMax :: Int + } deriving (Eq, Show, Read) +makeLenses ''TriggerType --deriveJSON defaultOptions ''TriggerType diff --git a/src/Dodge/Data/UseDelay.hs b/src/Dodge/Data/UseDelay.hs index b54a33753..f6a3ce72f 100644 --- a/src/Dodge/Data/UseDelay.hs +++ b/src/Dodge/Data/UseDelay.hs @@ -12,14 +12,6 @@ data ItemUseDelay -- should just be Delay | FixedRate { _rateMax :: Int } - | WarmUpNoDelay - { _warmMax :: Int - } - | WarmUpCoolDown - { _warmStart :: Int - , _coolStart :: Int - , _coolEnd :: Int - } deriving (Eq, Ord, Show, Read) --Generic, Flat) makeLenses ''ItemUseDelay diff --git a/src/Dodge/HeldUse.hs b/src/Dodge/HeldUse.hs index 35c0607bc..250007d59 100644 --- a/src/Dodge/HeldUse.hs +++ b/src/Dodge/HeldUse.hs @@ -4,7 +4,7 @@ module Dodge.HeldUse ( gadgetEffect, - heldEffectNoHammerCheck, + heldEffect, mcUseHeld, heldEffectMuzzles, ) where @@ -23,13 +23,11 @@ import Dodge.Creature.Radius import Dodge.Data.ComposedItem import Dodge.Data.DoubleTree import Dodge.Data.Muzzle -import Dodge.Data.UseDelay import Dodge.Data.World import Dodge.Gas import Dodge.Inventory.Lock import Dodge.Inventory.Path import Dodge.Item.HeldOffset -import Dodge.Item.UseDelay import Dodge.Item.Weapon.Bullet import Dodge.Item.Weapon.Shatter import Dodge.Projectile.Create @@ -61,17 +59,8 @@ gadgetEffect pt loc | otherwise = const id heldEffect :: PressType -> LDTree ItemLink OItem -> Creature -> World -> World -heldEffect = useTimeCheck . hammerCheck heldEffectMuzzles - -heldEffectNoHammerCheck :: LDTree ItemLink OItem -> Creature -> World -> World -heldEffectNoHammerCheck = useTimeCheck heldEffectMuzzles - -type ChainEffect = - (LDTree ItemLink OItem -> Creature -> World -> World) -> - LDTree ItemLink OItem -> - Creature -> - World -> - World +heldEffect = hammerCheck heldEffectMuzzles +--heldEffect = useTimeCheck . hammerCheck heldEffectMuzzles hammerCheck :: (LDTree ItemLink OItem -> Creature -> World -> World) -> @@ -80,25 +69,54 @@ hammerCheck :: Creature -> World -> World -hammerCheck f pt it cr w - | BurstTrigger is <- itemTriggerType (it ^. ldtValue . _1) - , pt == InitialPress = - w & f it cr & cWorld . lWorld . delayedEvents .++~ map g is - | BurstTrigger{} <- itemTriggerType (it ^. ldtValue . _1) = w - | VolleyGunTrigger i <- itemTriggerType (it ^. ldtValue . _1) - , pt == InitialPress = - let (is, gen) = getVolleyBurst i (w ^. randGen) - in w & f it cr - & cWorld . lWorld . delayedEvents .++~ map g is - & randGen .~ gen - | VolleyGunTrigger{} <- itemTriggerType (it ^. ldtValue . _1) = w - | t <- itemTriggerType (it ^. ldtValue . _1) - , t == HammerTrigger || t == AlwaysSingleTrigger +hammerCheck f pt it cr w = case itemTriggerType $ it ^. ldtValue . _1 of + WarmUpNoDelay wm + | _wTime (_itParams $ _ldtValue $ fmap (^. _1) it) < wm -> + w & setwarming + & soundContinue (CrWeaponSound cid 0) (_crPos cr) (warmupSound $ it ^. ldtValue . _1 . itType) (Just 2) + & cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . wTime +~ 1 + WarmUpNoDelay{} -> f it cr w & setwarming + WarmUpCoolDown ws _ _ + | _wTime (_itParams $ _ldtValue $ fmap (^. _1) it) < ws -> + w & setwarming + & soundContinue (CrWeaponSound cid 0) (_crPos cr) (warmupSound $ it ^. ldtValue . _1 . itType) (Just 2) + & cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . wTime +~ 1 + WarmUpCoolDown _ cs _ + | _wTime (_itParams $ _ldtValue $ fmap (^. _1) it) < cs -> + f it cr w & setwarming + & cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . wTime +~ 1 + WarmUpCoolDown{} -> w & setwarming + BurstTrigger is t + | w ^. cWorld . lWorld . lClock - t > timelastused + , pt == InitialPress -> + w & f it cr & cWorld . lWorld . delayedEvents .++~ map g is + BurstTrigger{} -> w + VolleyGunTrigger i t + | w ^. cWorld . lWorld . lClock - t > timelastused + , pt == InitialPress -> + let (is, gen) = getVolleyBurst i (w ^. randGen) + in w & f it cr + & cWorld . lWorld . delayedEvents .++~ map g is + & randGen .~ gen + VolleyGunTrigger{} -> w + HammerTrigger t + | w ^. cWorld . lWorld . lClock - t > timelastused , isNothing $ lookup MakeAutoLink (it ^. ldtRight) - , pt /= InitialPress = - w - | otherwise = f it cr w + , pt == InitialPress -> + f it cr w + AutoTrigger t + | w ^. cWorld . lWorld . lClock - t > timelastused -> + f it cr w + _ -> w where + cid = _crID cr + -- the following is unsafe, but if ilInvID isn't correctly set we probably + -- will have problems elsewhere also + itRef = it ^?! ldtValue . _1 . itLocation . ilInvID + setwarming = + cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . isWarming + %~ const True + timelastused = it ^. ldtValue . _1 . itTimeLastUsed g x = (x, WdWdBurstFireRepetition (_crID cr) (it ^?! ldtValue . _1 . itLocation . ilInvID)) getVolleyBurst :: (Random a, RandomGen b, Num a) => Int -> b -> ([a], b) @@ -109,38 +127,44 @@ getVolleyBurst i g = {- | Applies a world effect after an item use cooldown check. input buffering? -} -useTimeCheck :: ChainEffect -useTimeCheck f item cr w = case useDelay $ item ^. ldtValue . _1 of - FixedRate rate - | w ^. cWorld . lWorld . lClock - rate > lastused -> f item cr w - -- note that the time last used must be updated later in the chain! - FixedRate{} -> w - WarmUpNoDelay wm - | _wTime (_itParams $ _ldtValue $ fmap (^. _1) item) < wm -> - w & setwarming - & soundContinue (CrWeaponSound cid 0) (_crPos cr) (warmupSound $ item ^. ldtValue . _1 . itType) (Just 2) - & cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . wTime +~ 1 - WarmUpNoDelay{} -> f item cr w & setwarming - WarmUpCoolDown ws _ _ - | _wTime (_itParams $ _ldtValue $ fmap (^. _1) item) < ws -> - w & setwarming - & soundContinue (CrWeaponSound cid 0) (_crPos cr) (warmupSound $ item ^. ldtValue . _1 . itType) (Just 2) - & cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . wTime +~ 1 - WarmUpCoolDown _ cs _ - | _wTime (_itParams $ _ldtValue $ fmap (^. _1) item) < cs -> - f item cr w & setwarming - & cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . wTime +~ 1 - WarmUpCoolDown{} -> w & setwarming - NoDelay -> f item cr w - where - lastused = item ^. ldtValue . _1 . itTimeLastUsed - cid = _crID cr - setwarming = - cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . isWarming - %~ const True - -- the following is unsafe, but if ilInvID isn't correctly set we probably - -- will have problems elsewhere also - itRef = item ^?! ldtValue . _1 . itLocation . ilInvID +useTimeCheck :: + (LDTree ItemLink OItem -> Creature -> World -> World) -> + LDTree ItemLink OItem -> + Creature -> + World -> + World +useTimeCheck f item cr w = w +-- case useDelay $ item ^. ldtValue . _1 of +-- FixedRate rate +-- | w ^. cWorld . lWorld . lClock - rate > lastused -> f item cr w +-- -- note that the time last used must be updated later in the chain! +-- FixedRate{} -> w +-- WarmUpNoDelay wm +-- | _wTime (_itParams $ _ldtValue $ fmap (^. _1) item) < wm -> +-- w & setwarming +-- & soundContinue (CrWeaponSound cid 0) (_crPos cr) (warmupSound $ item ^. ldtValue . _1 . itType) (Just 2) +-- & cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . wTime +~ 1 +-- WarmUpNoDelay{} -> f item cr w & setwarming +-- WarmUpCoolDown ws _ _ +-- | _wTime (_itParams $ _ldtValue $ fmap (^. _1) item) < ws -> +-- w & setwarming +-- & soundContinue (CrWeaponSound cid 0) (_crPos cr) (warmupSound $ item ^. ldtValue . _1 . itType) (Just 2) +-- & cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . wTime +~ 1 +-- WarmUpCoolDown _ cs _ +-- | _wTime (_itParams $ _ldtValue $ fmap (^. _1) item) < cs -> +-- f item cr w & setwarming +-- & cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . wTime +~ 1 +-- WarmUpCoolDown{} -> w & setwarming +-- NoDelay -> f item cr w +-- where +-- lastused = item ^. ldtValue . _1 . itTimeLastUsed +-- cid = _crID cr +-- setwarming = +-- cWorld . lWorld . creatures . ix cid . crInv . ix itRef . itParams . isWarming +-- %~ const True +-- -- the following is unsafe, but if ilInvID isn't correctly set we probably +-- -- will have problems elsewhere also +-- itRef = item ^?! ldtValue . _1 . itLocation . ilInvID heldEffectMuzzles :: LDTree ItemLink OItem -> Creature -> World -> World heldEffectMuzzles t cr w = @@ -422,7 +446,7 @@ applyCME itm cr cme -- the above is quite hacky for now _ -> failsound where - coolstart = fromMaybe 0 $ useDelay itm ^? coolStart + coolstart = fromMaybe 0 $ itemTriggerType itm ^? coolStart itid = itm ^?! itLocation . ilInvID -- unsafe spush = maybe 0 itemSidePush $ itm ^? itType . ibtHeld failsound w = case w ^? input . mouseButtons . ix SDL.ButtonLeft of @@ -775,7 +799,7 @@ useLoadedAmmo :: useLoadedAmmo _ _ (cme, w) Nothing = (cme, w) useLoadedAmmo itmtree cr (_, w) (Just (mz, x, magtree)) = (,) True $ removeAmmoFromMag x mid cr . makeMuzzleFlare mz itmtree cr $ case _mzEffect mz of - MuzzleShootBullet -> shootBullet itmtree cr (mz, x, magtree) w + MuzzleShootBullet -> shootBullets itmtree cr (mz, x, magtree) w MuzzleLaser -> creatureShootLaser itmtree cr mz w MuzzleTesla -> shootTeslaArc itm cr mz w MuzzleTractor -> shootTractorBeam cr w @@ -980,18 +1004,18 @@ magAmmoParams itm = case itm ^. itType of -- Just x | x /= 0 -> fst . randomR (- x, x) $ _randGen w -- _ -> 0 -shootBullet :: +shootBullets :: LDTree ItemLink OItem -> Creature -> (Muzzle, Int, LDTree ItemLink OItem) -> World -> World -shootBullet itmtree cr (mz, x, magtree) w = fromMaybe w $ do +shootBullets itmtree cr (mz, x, magtree) w = fromMaybe w $ do thebullet <- getBulletType $ fmap (^. _1) magtree - return $ foldl' (&) w (replicate x (makeBullet' thebullet (itmtree ^. ldtValue . _1) cr mz)) + return $ foldl' (&) w (replicate x (shootBullet thebullet (itmtree ^. ldtValue . _1) cr mz)) -makeBullet' :: Bullet -> Item -> Creature -> Muzzle -> World -> World -makeBullet' bu itm cr mz w = makeBullet bu itm bulpos dir . (randGen .~ g) $ w +shootBullet :: Bullet -> Item -> Creature -> Muzzle -> World -> World +shootBullet bu itm cr mz w = makeBullet bu itm bulpos dir . (randGen .~ g) $ w where bulpos = _crPos cr + rotateV (_crDir cr) moff (moff, mrot) = heldItemOrient2D itm cr (_mzPos mz + V2 0 offset) (_mzRot mz) @@ -1002,8 +1026,6 @@ makeBullet' bu itm cr mz w = makeBullet bu itm bulpos dir . (randGen .~ g) $ w Just x | x /= 0 -> fst . randomR (- x, x) $ _randGen w _ -> 0 --- & makeMuzzleSmoke mz itm cr - itemRandomOffset :: HeldItemType -> Float itemRandomOffset = \case BANGSTICK{} -> 0 @@ -1238,7 +1260,7 @@ mcShootLaser _ mc = mcShootAuto :: Item -> Machine -> World -> World mcShootAuto itm mc w - | Just (FixedRate rate) <- useDelay <$> mc ^? mcType . mctTurret . tuWeapon -- . itUse . heldDelay + | Just (AutoTrigger rate) <- itemTriggerType <$> mc ^? mcType . mctTurret . tuWeapon -- . itUse . heldDelay , w ^. cWorld . lWorld . lClock - rate > lastused = w & cWorld . lWorld . machines . ix (_mcID mc) . mcType . mctTurret . tuWeapon diff --git a/src/Dodge/Item/Display.hs b/src/Dodge/Item/Display.hs index 34ba9b02a..945fde6ad 100644 --- a/src/Dodge/Item/Display.hs +++ b/src/Dodge/Item/Display.hs @@ -7,7 +7,8 @@ module Dodge.Item.Display ( itemInternalValue, ) where -import Dodge.Item.UseDelay +import Dodge.BaseTriggerType +--import Dodge.Item.UseDelay import ShortShow import Data.Maybe import Dodge.Data.World @@ -42,7 +43,7 @@ itemInternalValue itm maybeWarmupStatus :: Item -> Maybe String -maybeWarmupStatus it = case useDelay it ^? warmMax of +maybeWarmupStatus it = case itemTriggerType it ^? warmMax of Nothing -> Nothing --Just m -> case m - (_warmTime . _heldDelay $ _itUse it) of Just m -> case m - _wTime (_itParams it) of diff --git a/src/Dodge/Item/Grammar.hs b/src/Dodge/Item/Grammar.hs index f2b8f665d..4d06a52cf 100644 --- a/src/Dodge/Item/Grammar.hs +++ b/src/Dodge/Item/Grammar.hs @@ -92,7 +92,7 @@ itemToBreakLists itm itmf = case (itm ^. itType, itmf) of getAutoSpringLinks :: Item -> [(ItemStructuralFunction, ItemLink)] getAutoSpringLinks itm = case itemTriggerType itm of - HammerTrigger -> [(MakeAutoSF, MakeAutoLink)] + HammerTrigger _ -> [(MakeAutoSF, MakeAutoLink)] _ -> [] extraWeaponLinks :: Item -> [(ItemStructuralFunction, ItemLink)] @@ -158,6 +158,7 @@ structureToPotentialFunction ldt = case ldt ^. ldtValue . _1 . itType of ATTACH GIMBAL -> S.singleton ProjectileStabiliserSF ATTACH GYROSCOPE -> S.singleton ProjectileStabiliserSF HELD GLAUNCHER -> S.singleton UnderBarrelPlatformSF + HELD BURSTRIFLE -> S.singleton UnderBarrelPlatformSF _ -> S.singleton (ldt ^. ldtValue . _2) baseCI :: Item -> CItem diff --git a/src/Dodge/Item/HeldOffset.hs b/src/Dodge/Item/HeldOffset.hs index 81ce88dce..71598e8c2 100644 --- a/src/Dodge/Item/HeldOffset.hs +++ b/src/Dodge/Item/HeldOffset.hs @@ -1,4 +1,5 @@ {-# LANGUAGE LambdaCase #-} + module Dodge.Item.HeldOffset ( turretItemOffset, twoFlatHRot, @@ -7,20 +8,21 @@ module Dodge.Item.HeldOffset ( heldItemOrient2D, heldItemOrient2D', itemRelativeOrient, + locOrientation, ) where -import Dodge.Item.Orientation -import Dodge.DoubleTree -import Dodge.Data.ComposedItem -import Dodge.Data.DoubleTree import Dodge.Creature.Radius import Dodge.Data.AimStance -import Dodge.Item.AimStance -import qualified Quaternion as Q +import Dodge.Data.ComposedItem import Dodge.Data.Creature +import Dodge.Data.DoubleTree import Dodge.Data.Machine +import Dodge.DoubleTree +import Dodge.Item.AimStance +import Dodge.Item.Orientation import Geometry import LensHelp +import qualified Quaternion as Q turretItemOffset :: Item -> Turret -> Machine -> Point3 -> Point3 turretItemOffset it tu mc = @@ -33,31 +35,31 @@ transToHandle itm = (-.-.- V3 x y 0) V2 x y = handlePos itm heldItemOrient2D :: Item -> Creature -> Point2 -> Float -> (Point2, Float) -heldItemOrient2D itm cr p a = (V2 x y, argV . Q.qToV2 $ q ) +heldItemOrient2D itm cr p a = (V2 x y, argV . Q.qToV2 $ q) where - (V3 x y _,q) = heldItemRelativeOrient itm cr (p `v2z` 0, Q.axisAngle (V3 0 0 1) a) + (V3 x y _, q) = heldItemRelativeOrient itm cr (p `v2z` 0, Q.axisAngle (V3 0 0 1) a) heldItemOrient2D' :: OItem -> Creature -> Point2 -> Float -> (Point2, Float) -heldItemOrient2D' (itm,_,(p1,q1)) cr p a = (V2 x y, argV . Q.qToV2 $ q ) +heldItemOrient2D' (itm, _, (p1, q1)) cr p a = (V2 x y, argV . Q.qToV2 $ q) where - (V3 x y _,q) = heldItemRelativeOrient itm cr (p1 + Q.rotate q1 (p `v2z` 0), q1 * Q.axisAngle (V3 0 0 1) a) + (V3 x y _, q) = heldItemRelativeOrient itm cr (p1 + Q.rotate q1 (p `v2z` 0), q1 * Q.axisAngle (V3 0 0 1) a) -heldItemRelativeOrient - :: Item -> Creature -> (Point3, Q.Quaternion Float) -> (Point3, Q.Quaternion Float) -heldItemRelativeOrient itm cr (p,q) - | Aiming {} <- _posture (_crStance cr) = +heldItemRelativeOrient :: + Item -> Creature -> (Point3, Q.Quaternion Float) -> (Point3, Q.Quaternion Float) +heldItemRelativeOrient itm cr (p, q) + | Aiming{} <- _posture (_crStance cr) = (p + aimingWeaponZeroPos cr itm `v2z` shoulderHeight, Q.qID * q) - | TwoHandFlat <- itemBaseStance itm = + | TwoHandFlat <- itemBaseStance itm = ( V3 (crRad $ cr ^. crType) 0 handD + rotate3 (twoFlatHRot cr) (transToHandle itm p) , Q.axisAngle (V3 0 0 1) (twoFlatHRot cr) * q ) - | OneHand <- itemBaseStance itm = - ( V3 (crRad (cr ^. crType) * 0.7 + handPos) (crRad (cr ^. crType) * negate 0.7) handD - + transToHandle itm p - , Q.qID * q - ) - | otherwise = - ( V3 (crRad $ cr ^. crType) 0 handD + | OneHand <- itemBaseStance itm = + ( V3 (crRad (cr ^. crType) * 0.7 + handPos) (crRad (cr ^. crType) * negate 0.7) handD + + transToHandle itm p + , Q.qID * q + ) + | otherwise = + ( V3 (crRad $ cr ^. crType) 0 handD + rotate3 (strideRot cr + 1.2) (V3 (-8) 0 0 + transToHandle itm p) , Q.axisAngle (V3 0 0 1) (strideRot cr + 1.2) * q ) @@ -69,6 +71,13 @@ heldItemRelativeOrient itm cr (p,q) f i = 0.1 * fromIntegral (sLen - i) / fromIntegral sLen sLen = _strideLength $ _crStance cr +locOrientation :: LocationLDT ItemLink OItem -> Creature -> Point3Q +locOrientation loc cr = + heldItemRelativeOrient + (locToTop loc ^. locLDT . ldtValue . _1) + cr + (loc ^. locLDT . ldtValue . _3) + aimingWeaponZeroPos :: Creature -> Item -> Point2 aimingWeaponZeroPos cr it = aimStanceHandlePos cr it - handlePos it @@ -81,7 +90,7 @@ aimStanceHandlePos _ it = case itemBaseStance it of TwoHandFlat -> V2 10 0 heldItemOffset :: Item -> Creature -> Point3 -> Point3 -heldItemOffset itm cr p = fst (heldItemRelativeOrient itm cr (p,Q.qID)) +heldItemOffset itm cr p = fst (heldItemRelativeOrient itm cr (p, Q.qID)) shoulderHeight :: Float shoulderHeight = 18 @@ -143,12 +152,15 @@ heldHandlePos = \case SHATTERGUN -> V2 3 0 TORCH -> V2 3 0 FLATSHIELD -> V2 3 0 - KEYCARD {} -> V2 3 0 + KEYCARD{} -> V2 3 0 BLINKER -> V2 3 0 BLINKERUNSAFE -> V2 3 0 -itemRelativeOrient :: LocationLDT ItemLink Item -> Creature - -> (Point3, Q.Quaternion Float) -> (Point3, Q.Quaternion Float) -itemRelativeOrient loc cr - = heldItemRelativeOrient (locToTop loc ^. locLDT . ldtValue) cr - . orientLocation (V3 0 0 0,Q.qID) loc +itemRelativeOrient :: + LocationLDT ItemLink Item -> + Creature -> + (Point3, Q.Quaternion Float) -> + (Point3, Q.Quaternion Float) +itemRelativeOrient loc cr = + heldItemRelativeOrient (locToTop loc ^. locLDT . ldtValue) cr + . orientLocation (V3 0 0 0, Q.qID) loc diff --git a/src/Dodge/Item/UseDelay.hs b/src/Dodge/Item/UseDelay.hs index e30573e58..e6c459e9b 100644 --- a/src/Dodge/Item/UseDelay.hs +++ b/src/Dodge/Item/UseDelay.hs @@ -1,60 +1,61 @@ {-# LANGUAGE LambdaCase #-} module Dodge.Item.UseDelay - (useDelay - , module Dodge.Data.UseDelay + (-- useDelay + module Dodge.Data.UseDelay ) where import Dodge.Data.UseDelay import Control.Lens import Dodge.Data.Item -useDelay :: Item -> ItemUseDelay -useDelay itm = case itm ^. itType of - HELD hit -> heldUseDelay hit - DETECTOR _ -> FixedRate 20 - _ -> NoDelay +--useDelay :: Item -> ItemUseDelay +--useDelay itm = case itm ^. itType of +-- HELD hit -> heldUseDelay hit +-- DETECTOR _ -> FixedRate 20 +-- _ -> NoDelay -heldUseDelay :: HeldItemType -> ItemUseDelay -heldUseDelay = \case - BANGSTICK _ -> FixedRate 8 - REWINDER -> FixedRate 20 - TIMESTOPPER -> FixedRate 20 - TIMESCROLLER -> FixedRate 20 - PISTOL -> FixedRate 6 - AUTOPISTOL -> FixedRate 8 - SMG -> FixedRate 8 - MACHINEPISTOL -> WarmUpCoolDown 50 100 200 - BURSTRIFLE -> FixedRate 8 -- time last used gets updated after the last burst fire - BANGCONE -> FixedRate 20 - BLUNDERBUSS -> FixedRate 20 - GRAPECANNON _ -> FixedRate 20 - MINIGUNX _ -> WarmUpNoDelay 100 - VOLLEYGUN{} -> FixedRate 15 - RIFLE -> FixedRate 6 - ALTERIFLE -> FixedRate 6 - AUTORIFLE -> FixedRate 6 - BANGROD -> FixedRate 12 - ELEPHANTGUN -> FixedRate 12 - AMR -> FixedRate 12 - AUTOAMR -> FixedRate 12 - SNIPERRIFLE -> FixedRate 12 - FLAMESPITTER -> FixedRate 6 - FLAMETHROWER -> NoDelay - FLAMETORRENT -> NoDelay - FLAMEWALL -> NoDelay - POISONSPRAYER -> NoDelay - BLOWTORCH -> NoDelay - SPARKGUN -> NoDelay - TESLAGUN -> NoDelay - LASER -> NoDelay - TRACTORGUN -> NoDelay - RLAUNCHER -> FixedRate 20 - RLAUNCHERX{} -> FixedRate 20 - GLAUNCHER -> FixedRate 20 - SHATTERGUN -> FixedRate 20 - BLINKER -> FixedRate 20 - BLINKERUNSAFE -> FixedRate 20 - TORCH -> NoDelay - FLATSHIELD -> NoDelay - KEYCARD _ -> NoDelay +--heldUseDelay :: HeldItemType -> ItemUseDelay +--heldUseDelay = \case +-- BANGSTICK _ -> FixedRate 8 +-- REWINDER -> FixedRate 20 +-- TIMESTOPPER -> FixedRate 20 +-- TIMESCROLLER -> FixedRate 20 +-- PISTOL -> FixedRate 6 +-- AUTOPISTOL -> FixedRate 8 +-- SMG -> FixedRate 8 +-- MACHINEPISTOL -> WarmUpCoolDown 50 100 200 +-- --BURSTRIFLE -> FixedRate 8 -- time last used gets updated after the last burst fire +-- BURSTRIFLE -> NoDelay +-- BANGCONE -> FixedRate 20 +-- BLUNDERBUSS -> FixedRate 20 +-- GRAPECANNON _ -> FixedRate 20 +-- MINIGUNX _ -> WarmUpNoDelay 100 +-- VOLLEYGUN{} -> FixedRate 15 +-- RIFLE -> FixedRate 6 +-- ALTERIFLE -> FixedRate 6 +-- AUTORIFLE -> FixedRate 6 +-- BANGROD -> FixedRate 12 +-- ELEPHANTGUN -> FixedRate 12 +-- AMR -> FixedRate 12 +-- AUTOAMR -> FixedRate 12 +-- SNIPERRIFLE -> FixedRate 12 +-- FLAMESPITTER -> FixedRate 6 +-- FLAMETHROWER -> NoDelay +-- FLAMETORRENT -> NoDelay +-- FLAMEWALL -> NoDelay +-- POISONSPRAYER -> NoDelay +-- BLOWTORCH -> NoDelay +-- SPARKGUN -> NoDelay +-- TESLAGUN -> NoDelay +-- LASER -> NoDelay +-- TRACTORGUN -> NoDelay +-- RLAUNCHER -> FixedRate 20 +-- RLAUNCHERX{} -> FixedRate 20 +-- GLAUNCHER -> FixedRate 20 +-- SHATTERGUN -> FixedRate 20 +-- BLINKER -> FixedRate 20 +-- BLINKERUNSAFE -> FixedRate 20 +-- TORCH -> NoDelay +-- FLATSHIELD -> NoDelay +-- KEYCARD _ -> NoDelay diff --git a/src/Dodge/TestString.hs b/src/Dodge/TestString.hs index 12d797a1e..ae4ecd6fe 100644 --- a/src/Dodge/TestString.hs +++ b/src/Dodge/TestString.hs @@ -31,8 +31,6 @@ testStringInit u = prettyShort (u ^? uvWorld . cWorld . lWorld . creatures . ix . ix 0 . itTimeLastUsed) <> prettyShort (u ^? uvWorld . cWorld . lWorld . creatures . ix 0 . crInv . ix 0 . itParams . wTime) - <> prettyShort (u ^? uvWorld . cWorld . lWorld . creatures . ix 0 . crInv - . ix 0 >>= ((^? rateMax) .useDelay)) --return . foldMap (prettyLDT (show . (^. _1 . itType))) . invLDT $ _crInv cr -- where -- idp = invDisplayParams $ u ^. uvWorld diff --git a/tags b/tags index 8087c5db9..87f693219 100644 --- a/tags +++ b/tags @@ -54,7 +54,6 @@ Airlock src/Dodge/Room/Airlock.hs 4;" m AlienContact src/Dodge/Data/Scenario.hs 30;" C AllRoomClipBoundaries src/Dodge/Data/Config.hs 107;" C AlteRifleSwitch src/Dodge/Data/Item/Params.hs 20;" C -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 @@ -109,7 +108,7 @@ AutoCrit src/Dodge/Data/Creature/Misc.hs 72;" C AutoCrit src/Dodge/Creature/AutoCrit.hs 1;" m AutoDoorObstacle src/Dodge/Data/PathGraph.hs 51;" C AutoRecharging src/Dodge/Data/Item/Use/Consumption.hs 26;" C -AutoTrigger src/Dodge/Data/TriggerType.hs 10;" C +AutoTrigger src/Dodge/Data/TriggerType.hs 11;" C AuxAddition src/Shader/AuxAddition.hs 1;" m Avatar src/Dodge/Data/Creature/Misc.hs 61;" C AvatarDead src/Dodge/Data/Creature/Misc.hs 69;" C @@ -235,7 +234,7 @@ BulletParams src/Dodge/Data/Item/Use.hs 52;" C BulletPayload src/Dodge/Data/Bullet.hs 36;" t BulletTrajectory src/Dodge/Data/Bullet.hs 44;" t BulletTrajectoryType src/Dodge/Data/Bullet.hs 51;" t -BurstTrigger src/Dodge/Data/TriggerType.hs 14;" C +BurstTrigger src/Dodge/Data/TriggerType.hs 15;" C Button src/Dodge/Data/Button.hs 30;" t Button src/Dodge/Data/Button.hs 6;" m Button src/Dodge/Placement/Instance/Button.hs 1;" m @@ -281,7 +280,6 @@ CardinalPoint src/Dodge/Base/CardinalPoint.hs 1;" m CardinalPoint src/Dodge/Data/CardinalPoint.hs 1;" m Carriage src/Dodge/Data/Creature/Stance.hs 20;" t Carte src/Dodge/Render/HUD/Carte.hs 1;" m -ChainEffect src/Dodge/HeldUse.hs 69;" t ChainEffect src/Dodge/Item/Weapon/TriggerType.hs 43;" t ChainUpdates src/Dodge/Creature/ChainUpdates.hs 1;" m ChangePosture src/Dodge/Data/ActionPlan.hs 42;" C @@ -812,7 +810,7 @@ Hammer src/Dodge/Hammer.hs 1;" m HammerDown src/Dodge/Data/Hammer.hs 18;" C HammerPosition src/Dodge/Data/Hammer.hs 17;" t HammerReleased src/Dodge/Data/Hammer.hs 19;" C -HammerTrigger src/Dodge/Data/TriggerType.hs 11;" C +HammerTrigger src/Dodge/Data/TriggerType.hs 12;" C HammerType src/Dodge/Data/Hammer.hs 12;" t HammerUp src/Dodge/Data/Hammer.hs 20;" C HandPos src/Dodge/Creature/HandPos.hs 1;" m @@ -822,7 +820,7 @@ HeavySmokeFlare src/Dodge/Data/Muzzle.hs 26;" C 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 +HeldOffset src/Dodge/Item/HeldOffset.hs 3;" m HeldPlatformSF src/Dodge/Data/ComposedItem.hs 39;" C HeldScroll src/Dodge/HeldScroll.hs 1;" m HeldUse src/Dodge/Data/Item/HeldUse.hs 6;" m @@ -979,7 +977,7 @@ Kill src/Dodge/Data/ActionPlan.hs 198;" C LASER src/Dodge/Data/Item/Combine.hs 168;" C LDT src/Dodge/Data/DoubleTree.hs 34;" C LDTBottomNode src/Dodge/Data/DoubleTree.hs 29;" C -LDTComb src/Dodge/Item/Grammar.hs 166;" t +LDTComb src/Dodge/Item/Grammar.hs 167;" t LDTMidAboveNode src/Dodge/Data/DoubleTree.hs 27;" C LDTMidBelowNode src/Dodge/Data/DoubleTree.hs 28;" C LDTRootNode src/Dodge/Data/DoubleTree.hs 25;" C @@ -1292,7 +1290,7 @@ NoSF src/Dodge/Data/ComposedItem.hs 54;" C NoShadowFidelity src/Shape/Data.hs 25;" C NoShadows src/Dodge/Data/Config.hs 103;" C NoSubInventory src/Dodge/Data/HUD.hs 29;" C -NoTrigger src/Dodge/Data/TriggerType.hs 12;" C +NoTrigger src/Dodge/Data/TriggerType.hs 13;" C NoWorldEffect src/Dodge/Data/WorldEffect.hs 22;" C Noclip src/Dodge/Data/Config.hs 70;" C NodeMTree src/Dodge/Data/MetaTree.hs 14;" C @@ -2025,7 +2023,7 @@ Trie src/SimpleTrie.hs 9;" t TriggerDoor src/Dodge/Placement/PlaceSpot/TriggerDoor.hs 1;" m TriggerLink src/Dodge/Data/ComposedItem.hs 16;" C TriggerSF src/Dodge/Data/ComposedItem.hs 47;" C -TriggerType src/Dodge/Data/TriggerType.hs 9;" t +TriggerType src/Dodge/Data/TriggerType.hs 10;" t TriggerType src/Dodge/Data/TriggerType.hs 4;" m TriggerType src/Dodge/Item/TriggerType.hs 1;" m TriggerType src/Dodge/Item/Weapon/TriggerType.hs 6;" m @@ -2132,7 +2130,7 @@ Vision src/Dodge/Data/Creature/Perception.hs 41;" t Vocalization src/Dodge/Data/Creature/Misc.hs 20;" t Vocalization src/Dodge/Creature/Vocalization.hs 1;" m Volition src/Dodge/Creature/Volition.hs 2;" m -VolleyGunTrigger src/Dodge/Data/TriggerType.hs 15;" C +VolleyGunTrigger src/Dodge/Data/TriggerType.hs 16;" C VolleyUnfiredBarrels src/Dodge/Data/Item/Params.hs 19;" C WALLDETECTOR src/Dodge/Data/Item/Combine.hs 185;" C WASD src/Dodge/WASD.hs 1;" m @@ -2164,9 +2162,9 @@ Walls src/Dodge/Render/Walls.hs 1;" m Walls_info src/Dodge/Data/Config.hs 75;" C War src/Dodge/Data/Scenario.hs 28;" C WarmTime src/Dodge/Data/Item/Params.hs 21;" C -WarmUpCoolDown src/Dodge/Data/UseDelay.hs 18;" C +WarmUpCoolDown src/Dodge/Data/TriggerType.hs 17;" C WarmUpNoDelay src/Dodge/Data/Item/HeldDelay.hs 18;" C -WarmUpNoDelay src/Dodge/Data/UseDelay.hs 15;" C +WarmUpNoDelay src/Dodge/Data/TriggerType.hs 22;" C Warning src/Dodge/Room/Warning.hs 2;" m WarningCry src/Dodge/Data/ActionPlan.hs 185;" C WasLeftForward src/Dodge/Data/Creature/Stance.hs 34;" C @@ -2329,6 +2327,8 @@ _buPos src/Dodge/Data/Bullet.hs 24;" f _buVel src/Dodge/Data/Bullet.hs 22;" f _buWidth src/Dodge/Data/Bullet.hs 26;" f _bullets src/Dodge/Data/LWorld.hs 106;" f +_burstFrames src/Dodge/Data/TriggerType.hs 15;" f +_burstRate src/Dodge/Data/TriggerType.hs 15;" f _buttons src/Dodge/Data/LWorld.hs 134;" f _cClock src/Dodge/Data/CWorld.hs 26;" f _cWorld src/Dodge/Data/World.hs 36;" f @@ -2395,9 +2395,9 @@ _cmeRecoil src/Dodge/Data/MuzzleEffect.hs 15;" f _cmeSound src/Dodge/Data/MuzzleEffect.hs 17;" f _cmeTorque src/Dodge/Data/MuzzleEffect.hs 16;" f _colorBlurShader src/Data/Preload/Render.hs 22;" f -_coolEnd src/Dodge/Data/UseDelay.hs 21;" f +_coolEnd src/Dodge/Data/TriggerType.hs 20;" f _coolSound src/Dodge/Data/Item/Params.hs 24;" f -_coolStart src/Dodge/Data/UseDelay.hs 20;" f +_coolStart src/Dodge/Data/TriggerType.hs 19;" f _coordinates src/Dodge/Data/LWorld.hs 127;" f _corpses src/Dodge/Data/LWorld.hs 136;" f _cpAttention src/Dodge/Data/Creature/Perception.hs 34;" f @@ -3244,6 +3244,8 @@ _vertices src/Polyhedra/Data.hs 22;" f _viDist src/Dodge/Data/Creature/Perception.hs 43;" f _viFOV src/Dodge/Data/Creature/Perception.hs 42;" f _viewPoint src/Dodge/Data/Creature.hs 69;" f +_volleyNumBarrels src/Dodge/Data/TriggerType.hs 16;" f +_volleyRate src/Dodge/Data/TriggerType.hs 16;" f _volume_master src/Dodge/Data/Config.hs 39;" f _volume_music src/Dodge/Data/Config.hs 41;" f _volume_sound src/Dodge/Data/Config.hs 40;" f @@ -3263,9 +3265,9 @@ _walls src/Dodge/Data/LWorld.hs 119;" f _wanID src/Dodge/Data/LWorld.hs 161;" f _wanPos src/Dodge/Data/LWorld.hs 160;" f _warmMax src/Dodge/Data/Item/HeldDelay.hs 19;" f -_warmMax src/Dodge/Data/UseDelay.hs 16;" f +_warmMax src/Dodge/Data/TriggerType.hs 23;" f _warmSound src/Dodge/Data/Item/HeldDelay.hs 20;" f -_warmStart src/Dodge/Data/UseDelay.hs 19;" f +_warmStart src/Dodge/Data/TriggerType.hs 18;" f _windowPosX src/Dodge/Data/Config.hs 53;" f _windowPosY src/Dodge/Data/Config.hs 54;" f _windowShader src/Data/Preload/Render.hs 19;" f @@ -3352,10 +3354,10 @@ advanceSmoothScroll src/Dodge/SmoothScroll.hs 33;" f advanceStepCounter src/Dodge/Creature/Impulse/Movement.hs 44;" f aimDelaySweep src/Dodge/Render/Picture.hs 264;" f aimStance src/Dodge/Item/AimStance.hs 13;" f -aimStanceHandlePos src/Dodge/Item/HeldOffset.hs 76;" f +aimStanceHandlePos src/Dodge/Item/HeldOffset.hs 85;" f aimStanceInfo src/Dodge/Item/Info.hs 243;" f aimTurn src/Dodge/Creature/YourControl.hs 165;" f -aimingWeaponZeroPos src/Dodge/Item/HeldOffset.hs 72;" f +aimingWeaponZeroPos src/Dodge/Item/HeldOffset.hs 81;" f airlock src/Dodge/Room/Airlock.hs 19;" f airlock0 src/Dodge/Room/Airlock.hs 25;" f airlock90 src/Dodge/Room/Airlock.hs 122;" f @@ -3364,8 +3366,8 @@ 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 266;" f -allInvLocs' src/Dodge/Item/Grammar.hs 287;" f +allInvLocs src/Dodge/Item/Grammar.hs 267;" f +allInvLocs' src/Dodge/Item/Grammar.hs 288;" f allVisibleWalls src/Dodge/Base/Collide.hs 132;" f alongSegBy src/Geometry.hs 40;" f alteRifle src/Dodge/Item/Held/Cane.hs 22;" f @@ -3381,21 +3383,21 @@ angleVV3 src/Geometry/Vector3D.hs 122;" f annoToRoomTree src/Dodge/Annotation.hs 17;" f anyUnusedSpot src/Dodge/PlacementSpot.hs 66;" f anythingHitCirc src/Dodge/Base/Collide.hs 247;" f -applyCME src/Dodge/HeldUse.hs 410;" f +applyCME src/Dodge/HeldUse.hs 435;" f applyCreatureDamage src/Dodge/Creature/Damage.hs 13;" f applyEventIO src/Loop.hs 89;" f applyGravityPU src/Dodge/Projectile/Update.hs 56;" f applyIndividualDamage src/Dodge/Creature/Damage.hs 16;" f -applyInvLock src/Dodge/HeldUse.hs 476;" f +applyInvLock src/Dodge/HeldUse.hs 501;" f applyMagnetsToBul src/Dodge/Bullet.hs 30;" f applyPastDamages src/Dodge/Creature/State.hs 134;" f applyPiercingDamage src/Dodge/Creature/Damage.hs 22;" f applyPosition src/Sound.hs 111;" f -applyRecoil src/Dodge/HeldUse.hs 508;" f +applyRecoil src/Dodge/HeldUse.hs 533;" f applyResFactor src/Dodge/Data/Config.hs 110;" f applySetTerminalString src/Dodge/Debug/Terminal.hs 81;" f -applySidePush src/Dodge/HeldUse.hs 607;" f -applySoundCME src/Dodge/HeldUse.hs 498;" f +applySidePush src/Dodge/HeldUse.hs 632;" f +applySoundCME src/Dodge/HeldUse.hs 523;" f applyTerminalCommand src/Dodge/Debug/Terminal.hs 28;" f applyTerminalCommandArguments src/Dodge/Debug/Terminal.hs 42;" f applyTerminalString src/Dodge/Debug/Terminal.hs 22;" f @@ -3403,7 +3405,7 @@ applyToNode src/TreeHelp.hs 64;" f applyToRandomNode src/TreeHelp.hs 150;" f applyToSubforest src/TreeHelp.hs 77;" f applyToSubtree src/TreeHelp.hs 70;" f -applyTorqueCME src/Dodge/HeldUse.hs 618;" f +applyTorqueCME src/Dodge/HeldUse.hs 643;" f applyWorldConfig src/Dodge/Config/Update.hs 38;" f aquamarine src/Color.hs 23;" f arHUD src/Dodge/Item/Scope.hs 134;" f @@ -3466,7 +3468,7 @@ barrel src/Dodge/Creature/Inanimate.hs 17;" f barrelShape src/Dodge/Render/ShapePicture.hs 46;" 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 163;" f +baseCI src/Dodge/Item/Grammar.hs 164;" f baseCaneShape src/Dodge/Item/Draw/SPic.hs 311;" f baseDebris src/Dodge/Block/Debris.hs 122;" f baseFloorTileSize src/Tile.hs 45;" f @@ -3476,17 +3478,17 @@ baseSMGShape src/Dodge/Item/Draw/SPic.hs 382;" f baseShoulder src/Dodge/Creature/Picture.hs 125;" 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 +baseStickSpread src/Dodge/HeldUse.hs 331;" f baseTriggerType src/Dodge/Item/TriggerType.hs 5;" f basicAttentionUpdate src/Dodge/Creature/Perception.hs 128;" f basicAwarenessUpdate src/Dodge/Creature/Perception.hs 38;" f basicCrPict src/Dodge/Creature/Picture.hs 28;" f basicCrShape src/Dodge/Creature/Picture.hs 34;" f basicDrawBeam src/Dodge/Beam/Draw.hs 11;" f -basicItemDisplay src/Dodge/Item/Display.hs 22;" f +basicItemDisplay src/Dodge/Item/Display.hs 23;" f basicMachineApplyDamage src/Dodge/Machine/Damage.hs 6;" f basicMachineUpdate src/Dodge/Machine.hs 13;" f -basicMuzFlare src/Dodge/HeldUse.hs 758;" f +basicMuzFlare src/Dodge/HeldUse.hs 783;" f basicTerminal src/Dodge/Terminal.hs 35;" f battery src/Dodge/Item/Ammo.hs 62;" f batteryPack src/Dodge/Item/Equipment.hs 46;" f @@ -3495,7 +3497,7 @@ beltMag src/Dodge/Item/Ammo.hs 38;" f bfsNodePoints src/Dodge/Path.hs 58;" f bfsThenReturn src/Dodge/Creature/ReaderUpdate.hs 218;" f bgateCalc src/Dodge/Inventory/SelectionList.hs 114;" f -bgunSound src/Dodge/HeldUse.hs 561;" f +bgunSound src/Dodge/HeldUse.hs 586;" f bindFBO src/Render.hs 244;" f bingate src/Dodge/Item/Scope.hs 109;" f black src/Color.hs 27;" f @@ -3782,14 +3784,14 @@ 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 1284;" f +createProjectile src/Dodge/HeldUse.hs 1343;" f +createProjectileR src/Dodge/HeldUse.hs 1307;" f createShell src/Dodge/Projectile/Create.hs 22;" f createShieldWall src/Dodge/Item/BackgroundEffect.hs 39;" f createUnusedLinkPos src/Dodge/Tree/Shift.hs 117;" f createWall src/Dodge/Wall/Create.hs 8;" f creatureDisplayText src/Dodge/Creature/Picture/Awareness.hs 11;" f -creatureShootLaser src/Dodge/HeldUse.hs 872;" f +creatureShootLaser src/Dodge/HeldUse.hs 897;" f creatureTurnTo src/Dodge/Creature/Impulse/Movement.hs 52;" f creatureTurnToward src/Dodge/Creature/Impulse/Movement.hs 73;" f creatureTurnTowardDir src/Dodge/Creature/Impulse/Movement.hs 62;" f @@ -3860,7 +3862,7 @@ dark src/Color.hs 108;" f darkenBackground src/Dodge/Render/MenuScreen.hs 52;" f dbArg src/Dodge/Base.hs 165;" f dbArgChain src/Dodge/Base.hs 170;" f -dbwMuzzles src/Dodge/HeldUse.hs 309;" f +dbwMuzzles src/Dodge/HeldUse.hs 334;" f deZoneIX src/Dodge/Zoning/Base.hs 89;" f deZoneWall src/Dodge/Zoning/Wall.hs 70;" f deadEndRoom src/Dodge/Room/Room.hs 235;" f @@ -3978,7 +3980,7 @@ detector src/Dodge/Item/Held/Utility.hs 27;" 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 1270;" f +determineProjectileTracking src/Dodge/HeldUse.hs 1293;" f diagonalLinesRect src/Dodge/Room/Foreground.hs 52;" f did src/Dodge/Item/InvSize.hs 54;" f diffAngles src/Geometry.hs 204;" f @@ -4043,9 +4045,9 @@ doDrag src/Dodge/Update/Input/InGame.hs 107;" f doDrawing src/Dodge/Render.hs 35;" f doDrawing' src/Dodge/Render.hs 46;" f doFloatFloat src/Dodge/FloatFunction.hs 5;" f -doGenFloat src/Dodge/HeldUse.hs 1228;" f +doGenFloat src/Dodge/HeldUse.hs 1251;" f doGravityPU src/Dodge/Projectile/Update.hs 50;" f -doHeldUseEffect src/Dodge/HeldUse.hs 339;" f +doHeldUseEffect src/Dodge/HeldUse.hs 364;" f doInPlacements src/Dodge/Layout.hs 92;" f doIndividualPlacements src/Dodge/Layout.hs 117;" f doInputScreenInput src/Dodge/Update/Input/ScreenLayer.hs 28;" f @@ -4237,7 +4239,7 @@ drawZoneNearPointCursor src/Dodge/Debug/Picture.hs 279;" f droneLauncher src/Dodge/Item/Weapon/Drone.hs 11;" f dropAll src/Dodge/Creature/State.hs 127;" f dropExcept src/Dodge/Creature/Action.hs 166;" f -dropInventoryPath src/Dodge/HeldUse.hs 1400;" f +dropInventoryPath src/Dodge/HeldUse.hs 1423;" 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 @@ -4352,7 +4354,7 @@ firstWorldLoad appDodge/Main.hs 77;" f fixedCoordPictures src/Dodge/Render/Picture.hs 17;" f fixedSizePicClampArrow src/Dodge/Picture/SizeInvariant.hs 57;" f flFlicker src/Dodge/Flame.hs 38;" f -flameMuzzles src/Dodge/HeldUse.hs 312;" f +flameMuzzles src/Dodge/HeldUse.hs 337;" f flameShield src/Dodge/Item/Equipment.hs 33;" f flameSize src/Dodge/Flame/Size.hs 5;" f flameSpitter src/Dodge/Item/Held/SprayGuns.hs 23;" f @@ -4360,7 +4362,7 @@ 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 385;" f -flareCircleAt src/Dodge/HeldUse.hs 739;" f +flareCircleAt src/Dodge/HeldUse.hs 764;" 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 @@ -4427,7 +4429,7 @@ gameRoomViewpoints src/Dodge/Viewpoints.hs 35;" f gameRoomsFromRooms src/Dodge/Layout.hs 158;" f gameplayMenu src/Dodge/Menu.hs 134;" f gameplayMenuOptions src/Dodge/Menu.hs 137;" f -gasType src/Dodge/HeldUse.hs 1184;" f +gasType src/Dodge/HeldUse.hs 1207;" f generateGenParams src/Dodge/LevelGen/LevelStructure.hs 22;" f generateGraphs src/Dodge/LevelGen.hs 39;" f generateLayout src/Dodge/Layout/Generate.hs 10;" f @@ -4442,11 +4444,11 @@ getAimZoom src/Dodge/Update/Camera.hs 135;" f getAmmoLinks src/Dodge/Item/Grammar.hs 114;" f getArguments src/Dodge/Update/Scroll.hs 178;" f getArguments' src/Dodge/Update/Scroll.hs 166;" f -getAttachedSFLink src/Dodge/HeldUse.hs 810;" f +getAttachedSFLink src/Dodge/HeldUse.hs 835;" f getAutoSpringLinks src/Dodge/Item/Grammar.hs 93;" f getAvailableListLines src/Dodge/SelectionList.hs 10;" f getBulHitDams src/Dodge/Bullet.hs 171;" f -getBulletType src/Dodge/HeldUse.hs 930;" f +getBulletType src/Dodge/HeldUse.hs 955;" f getCloseObj src/Dodge/Update/Input/InGame.hs 515;" f getCommands src/Dodge/Terminal.hs 117;" f getCommandsHelp src/Dodge/Terminal.hs 75;" f @@ -4454,17 +4456,17 @@ 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 1336;" f getInventoryPath src/Dodge/Inventory/Path.hs 8;" f getItemValue src/Dodge/Inventory/SelectionList.hs 143;" f -getLaserColor src/Dodge/HeldUse.hs 755;" f -getLaserDamage src/Dodge/HeldUse.hs 752;" f -getLaserPhaseV src/Dodge/HeldUse.hs 749;" f +getLaserColor src/Dodge/HeldUse.hs 780;" f +getLaserDamage src/Dodge/HeldUse.hs 777;" f +getLaserPhaseV src/Dodge/HeldUse.hs 774;" f 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 1328;" f getPretty src/AesonHelp.hs 8;" f getPromptTM src/Dodge/Terminal/Type.hs 8;" f getRootItemBounds src/Dodge/Render/HUD.hs 95;" f @@ -4474,7 +4476,7 @@ getSmoothScrollValue src/Dodge/SmoothScroll.hs 21;" f getSplitString src/Dodge/Debug/Terminal.hs 126;" f getTiles src/Dodge/Layout.hs 208;" f getViewpoints src/Dodge/Viewpoints.hs 29;" f -getVolleyBurst src/Dodge/HeldUse.hs 104;" f +getVolleyBurst src/Dodge/HeldUse.hs 123;" f getWallSPic src/Dodge/Render/Walls.hs 51;" f getWindowSize src/Dodge/WindowSize.hs 5;" f gimbal src/Dodge/Item/Scope.hs 153;" f @@ -4524,14 +4526,14 @@ hackOutline src/Dodge/Render/Outline.hs 5;" f halfHeight src/Dodge/Base/Window.hs 48;" f halfWidth src/Dodge/Base/Window.hs 48;" f haltSound src/Dodge/SoundLogic.hs 38;" f -hammerCheck src/Dodge/HeldUse.hs 76;" f +hammerCheck src/Dodge/HeldUse.hs 69;" f handleEvent src/Dodge/Event.hs 27;" f handleHotkeys src/Dodge/Creature/YourControl.hs 45;" f handleKeyboardEvent src/Dodge/Event/Input.hs 22;" f handleMouseButtonEvent src/Dodge/Event/Input.hs 63;" f handleMouseMotionEvent src/Dodge/Event/Input.hs 47;" f handleMouseWheelEvent src/Dodge/Event/Input.hs 58;" f -handlePos src/Dodge/Item/HeldOffset.hs 101;" f +handlePos src/Dodge/Item/HeldOffset.hs 110;" f handleResizeEvent src/Dodge/Event.hs 53;" f handleTextInput src/Dodge/Event/Input.hs 18;" f handleWindowMoveEvent src/Dodge/Event.hs 44;" f @@ -4555,26 +4557,25 @@ heightWallPS src/Dodge/Placement/Instance/Wall.hs 13;" f heldAimStance src/Dodge/Item/AimStance.hs 22;" f heldAimZoom src/Dodge/Update/Camera.hs 140;" f heldEffect src/Dodge/HeldUse.hs 63;" f -heldEffectMuzzles src/Dodge/HeldUse.hs 145;" f +heldEffectMuzzles src/Dodge/HeldUse.hs 170;" f heldEffectNoHammerCheck src/Dodge/HeldUse.hs 66;" f -heldHandlePos src/Dodge/Item/HeldOffset.hs 106;" f +heldHandlePos src/Dodge/Item/HeldOffset.hs 115;" f heldInfo src/Dodge/Item/Info.hs 90;" f heldItemAmmoSlots src/Dodge/Item/AmmoSlots.hs 18;" f heldItemBulkiness src/Dodge/Creature/YourControl.hs 177;" f -heldItemInvLock src/Dodge/HeldUse.hs 491;" f -heldItemMuzVel src/Dodge/HeldUse.hs 1070;" f -heldItemMuzzles src/Dodge/HeldUse.hs 173;" f -heldItemOffset src/Dodge/Item/HeldOffset.hs 83;" f -heldItemOrient2D src/Dodge/Item/HeldOffset.hs 35;" f -heldItemOrient2D' src/Dodge/Item/HeldOffset.hs 40;" f -heldItemRelativeOrient src/Dodge/Item/HeldOffset.hs 45;" f -heldItemRifling src/Dodge/HeldUse.hs 1114;" f +heldItemInvLock src/Dodge/HeldUse.hs 516;" f +heldItemMuzVel src/Dodge/HeldUse.hs 1093;" f +heldItemMuzzles src/Dodge/HeldUse.hs 198;" f +heldItemOffset src/Dodge/Item/HeldOffset.hs 92;" f +heldItemOrient2D src/Dodge/Item/HeldOffset.hs 37;" f +heldItemOrient2D' src/Dodge/Item/HeldOffset.hs 42;" f +heldItemRelativeOrient src/Dodge/Item/HeldOffset.hs 47;" f +heldItemRifling src/Dodge/HeldUse.hs 1137;" 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 +heldTorqueAmount src/Dodge/HeldUse.hs 659;" f heldTriggerType src/Dodge/BaseTriggerType.hs 17;" f -heldUseDelay src/Dodge/Item/UseDelay.hs 18;" f helpCommand src/Dodge/Terminal.hs 66;" f helpPoly3D src/Polyhedra.hs 125;" f heron src/Geometry.hs 217;" f @@ -4661,18 +4662,18 @@ 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 243;" f +invAdj src/Dodge/Item/Grammar.hs 244;" 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 155;" f -invLDT src/Dodge/Item/Grammar.hs 220;" f -invLDT' src/Dodge/Item/Grammar.hs 225;" f +invLDT src/Dodge/Item/Grammar.hs 221;" f +invLDT' src/Dodge/Item/Grammar.hs 226;" f invRootItemEffs src/Dodge/Creature/State.hs 148;" f -invRootMap src/Dodge/Item/Grammar.hs 232;" f -invRootTrees src/Dodge/Item/Grammar.hs 253;" f -invRootTrees' src/Dodge/Item/Grammar.hs 259;" f +invRootMap src/Dodge/Item/Grammar.hs 233;" f +invRootTrees src/Dodge/Item/Grammar.hs 254;" f +invRootTrees' src/Dodge/Item/Grammar.hs 260;" f invSelectionItem src/Dodge/Inventory/SelectionList.hs 32;" f invSetSelection src/Dodge/Inventory.hs 185;" f invSetSelectionPos src/Dodge/Inventory.hs 193;" f @@ -4689,7 +4690,7 @@ invertIntMap src/Multiset.hs 67;" f invertInventoryToMap src/Dodge/Combine.hs 57;" f invisibleChaseCrit src/Dodge/Creature/ChaseCrit.hs 21;" f invisibleWall src/Dodge/Placement/Instance/Wall.hs 16;" f -isAmmoIntLink src/Dodge/HeldUse.hs 765;" f +isAmmoIntLink src/Dodge/HeldUse.hs 790;" f isAnimate src/Dodge/Creature/Test.hs 143;" f isCognizant src/Dodge/Creature/Perception.hs 106;" f isConnected src/Dodge/Inventory/Swap.hs 74;" f @@ -4720,13 +4721,13 @@ 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 -itemBaseName src/Dodge/Item/Display.hs 59;" f +itemBaseName src/Dodge/Item/Display.hs 60;" f itemBaseStance src/Dodge/Item/AimStance.hs 17;" f itemBlips src/Dodge/RadarSweep.hs 93;" f itemBulkiness src/Dodge/Creature/YourControl.hs 172;" f itemCombinations src/Dodge/Combine/Combinations.hs 56;" f itemCombinationsEdges src/Dodge/Combine/Graph.hs 61;" f -itemDetectorEffect src/Dodge/HeldUse.hs 816;" f +itemDetectorEffect src/Dodge/HeldUse.hs 841;" f itemDisplay src/Dodge/Inventory/SelectionList.hs 49;" f itemEquipPict src/Dodge/Item/Draw.hs 18;" f itemExternalValue src/Dodge/Inventory/SelectionList.hs 84;" f @@ -4736,12 +4737,12 @@ itemFromBase src/Dodge/Item.hs 18;" f itemFromEquipType src/Dodge/Item.hs 64;" f itemFromHeldType src/Dodge/Item/Held.hs 25;" f itemInfo src/Dodge/Item/Info.hs 20;" f -itemInternalValue src/Dodge/Item/Display.hs 33;" f +itemInternalValue src/Dodge/Item/Display.hs 34;" f itemInvColor src/Dodge/Item/InventoryColor.hs 9;" f -itemInvLock src/Dodge/HeldUse.hs 486;" f -itemMuzzles src/Dodge/HeldUse.hs 158;" f -itemRandomOffset src/Dodge/HeldUse.hs 1007;" f -itemRelativeOrient src/Dodge/Item/HeldOffset.hs 150;" f +itemInvLock src/Dodge/HeldUse.hs 511;" f +itemMuzzles src/Dodge/HeldUse.hs 183;" f +itemRandomOffset src/Dodge/HeldUse.hs 1030;" f +itemRelativeOrient src/Dodge/Item/HeldOffset.hs 159;" f itemRooms src/Dodge/LockAndKey.hs 39;" f itemRotTreeSPic src/Dodge/Item/Draw/SPic.hs 27;" f itemSPic src/Dodge/Item/Draw/SPic.hs 33;" f @@ -4749,8 +4750,8 @@ 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 +itemSidePush src/Dodge/HeldUse.hs 457;" f +itemString src/Dodge/Item/Display.hs 56;" f itemToBreakLists src/Dodge/Item/Grammar.hs 38;" f itemToFunction src/Dodge/Item/Grammar.hs 120;" f itemTreeSPic src/Dodge/Item/Draw/SPic.hs 24;" f @@ -4764,7 +4765,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 210;" f +joinItemsInList src/Dodge/Item/Grammar.hs 211;" 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 @@ -4814,10 +4815,10 @@ ldtToIM src/Dodge/DoubleTree.hs 184;" f ldtToIndentList src/Dodge/DoubleTree.hs 187;" f ldtToLoc src/Dodge/DoubleTree.hs 233;" f left src/DoubleStack.hs 16;" f -leftChildList src/Dodge/Item/Grammar.hs 184;" f -leftIsParentCombine src/Dodge/Item/Grammar.hs 168;" f +leftChildList src/Dodge/Item/Grammar.hs 185;" f +leftIsParentCombine src/Dodge/Item/Grammar.hs 169;" f leftPad src/Padding.hs 15;" f -leftRightCombine src/Dodge/Item/Grammar.hs 196;" f +leftRightCombine src/Dodge/Item/Grammar.hs 197;" 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 @@ -4851,7 +4852,7 @@ lnkMidPosInvSelsCol src/Dodge/Render/HUD.hs 394;" f lnkPosDir src/Dodge/RoomLink.hs 97;" f loadDodgeConfig src/Dodge/Config/Load.hs 9;" f loadMusic src/Dodge/SoundLogic/LoadSound.hs 30;" f -loadMuzzle src/Dodge/HeldUse.hs 679;" f +loadMuzzle src/Dodge/HeldUse.hs 704;" f loadSaveSlot src/Dodge/Save.hs 74;" f loadSeed src/Dodge/LoadSeed.hs 7;" f loadSound src/Dodge/SoundLogic/LoadSound.hs 11;" f @@ -4863,6 +4864,7 @@ locGoHelp src/Dodge/DoubleTree.hs 273;" f locGoLeft src/Dodge/DoubleTree.hs 262;" f locGoRight src/Dodge/DoubleTree.hs 267;" f locLeftmost src/Dodge/DoubleTree.hs 255;" f +locOrientation src/Dodge/Item/HeldOffset.hs 74;" f locRightmost src/Dodge/DoubleTree.hs 258;" f locToTop src/Dodge/DoubleTree.hs 250;" f locUp src/Dodge/DoubleTree.hs 237;" f @@ -4894,7 +4896,7 @@ machineAddSound src/Dodge/Machine.hs 49;" f machinePistol src/Dodge/Item/Held/Stick.hs 52;" f machineUpdateDeathEff src/Dodge/Machine.hs 34;" f machineUpdateLiveDieEff src/Dodge/Machine.hs 16;" f -magAmmoParams src/Dodge/HeldUse.hs 951;" f +magAmmoParams src/Dodge/HeldUse.hs 976;" f magAmmoType src/Dodge/Item/MagAmmoType.hs 11;" f magShield src/Dodge/Item/Equipment.hs 27;" f magV src/Geometry/Vector.hs 171;" f @@ -4909,8 +4911,7 @@ makeAttach src/Dodge/Item/Attach.hs 10;" f makeBlip src/Dodge/RadarSweep.hs 69;" f makeBlockDebris src/Dodge/Block/Debris.hs 28;" f makeBoolOption src/Dodge/Menu/OptionType.hs 8;" f -makeBullet src/Dodge/HeldUse.hs 1051;" f -makeBullet' src/Dodge/HeldUse.hs 993;" f +makeBullet src/Dodge/HeldUse.hs 1074;" f makeButton src/Dodge/LevelGen/Switch.hs 16;" f makeByteStringShaderUsingVAO src/Shader/Compile.hs 128;" f makeCloudAt src/Dodge/WorldEvent/Cloud.hs 7;" f @@ -4936,7 +4937,7 @@ makeGasCloud src/Dodge/WorldEvent/SpawnParticle.hs 11;" f makeGrid src/Grid.hs 46;" f makeIntInterval src/Dodge/Zoning/Base.hs 35;" f makeMovingEB src/Dodge/EnergyBall.hs 74;" f -makeMuzzleFlare src/Dodge/HeldUse.hs 700;" f +makeMuzzleFlare src/Dodge/HeldUse.hs 725;" f makeParagraph src/Justify.hs 6;" f makePathBetween src/Dodge/Path.hs 35;" f makePathBetweenPs src/Dodge/Path.hs 54;" f @@ -4981,7 +4982,7 @@ maybeExitCombine src/Dodge/Update/Input/InGame.hs 536;" f maybeOpenConsole src/Dodge/Update.hs 126;" f maybeReadFile src/Dodge/LoadSeed.hs 10;" f maybeTakeOne src/RandomHelp.hs 116;" f -maybeWarmupStatus src/Dodge/Item/Display.hs 44;" f +maybeWarmupStatus src/Dodge/Item/Display.hs 45;" f mcApplyDamage src/Dodge/Machine/Update.hs 114;" f mcKillBut src/Dodge/Machine/Destroy.hs 34;" f mcKillTerm src/Dodge/Machine/Destroy.hs 26;" f @@ -4991,11 +4992,11 @@ mcProximitySensorUpdate src/Dodge/Machine/Update.hs 130;" f mcSPic src/Dodge/Render/ShapePicture.hs 111;" f mcSensorTriggerUpdate src/Dodge/Machine/Update.hs 93;" f mcSensorUpdate src/Dodge/Machine/Update.hs 125;" f -mcShootAuto src/Dodge/HeldUse.hs 1239;" f -mcShootLaser src/Dodge/HeldUse.hs 1232;" f +mcShootAuto src/Dodge/HeldUse.hs 1262;" f +mcShootLaser src/Dodge/HeldUse.hs 1255;" f mcTriggerVal src/Dodge/Machine/Update.hs 99;" f mcTypeUpdate src/Dodge/Machine/Update.hs 28;" f -mcUseHeld src/Dodge/HeldUse.hs 1158;" f +mcUseHeld src/Dodge/HeldUse.hs 1181;" f mcUseItem src/Dodge/Machine/Update.hs 85;" f medkit src/Dodge/Item/Consumable.hs 8;" f megaBattery src/Dodge/Item/Ammo.hs 54;" f @@ -5088,7 +5089,7 @@ multiArrow src/Picture/Composite.hs 11;" f multiLookupTrie src/SimpleTrie.hs 34;" f multiLookupTrieI src/SimpleTrie.hs 43;" f muout src/Dodge/RoomLink.hs 129;" f -muzFlareAt src/Dodge/HeldUse.hs 725;" f +muzFlareAt src/Dodge/HeldUse.hs 750;" f mvButton src/Dodge/Placement/PlaceSpot.hs 176;" f mvCr src/Dodge/Placement/PlaceSpot.hs 186;" f mvFS src/Dodge/Placement/PlaceSpot.hs 189;" f @@ -5483,7 +5484,7 @@ randsOnCirc src/RandomHelp.hs 127;" f randsSpread src/RandomHelp.hs 120;" f ratIntersectLineLine src/Geometry/Intersect.hs 195;" f readSaveSlot src/Dodge/Save.hs 45;" f -recoilAmount src/Dodge/HeldUse.hs 513;" f +recoilAmount src/Dodge/HeldUse.hs 538;" f rectNSWE src/Geometry/Polygon.hs 13;" f rectVV src/Geometry/Polygon.hs 38;" f rectWH src/Geometry/Polygon.hs 17;" f @@ -5510,7 +5511,7 @@ rememberSounds src/Dodge/Creature/Perception.hs 178;" f remoteDetonator src/Dodge/Item/Scope.hs 144;" f remoteScreen src/Dodge/Item/Scope.hs 139;" f removeAimPosture src/Dodge/Creature/YourControl.hs 147;" f -removeAmmoFromMag src/Dodge/HeldUse.hs 918;" f +removeAmmoFromMag src/Dodge/HeldUse.hs 943;" f removeDot src/ShortShow.hs 29;" f removeInverseWalls src/Dodge/LevelGen/StaticWalls.hs 25;" f removeShieldWall src/Dodge/Item/BackgroundEffect.hs 57;" f @@ -5555,8 +5556,8 @@ 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 190;" f -rightIsParentCombine src/Dodge/Item/Grammar.hs 176;" f +rightChildList src/Dodge/Item/Grammar.hs 191;" f +rightIsParentCombine src/Dodge/Item/Grammar.hs 177;" f rightPad src/Padding.hs 19;" f rightPadNoSquash src/Padding.hs 23;" f rlPosDir src/Dodge/RoomLink.hs 94;" f @@ -5791,14 +5792,15 @@ shiftRoomShiftToLink src/Dodge/Room/Link.hs 70;" f shiftedGrid src/Grid.hs 25;" f shineTargetLaser src/Dodge/Creature/State.hs 329;" f shineTorch src/Dodge/Creature/State.hs 409;" f -shootBullet src/Dodge/HeldUse.hs 983;" f +shootBullet src/Dodge/HeldUse.hs 1018;" f +shootBullets src/Dodge/HeldUse.hs 1008;" f shootFirstMiss src/Dodge/Creature/Volition.hs 33;" f -shootLaser src/Dodge/HeldUse.hs 897;" f +shootLaser src/Dodge/HeldUse.hs 922;" f shootOutPassage src/Dodge/Room/RezBox.hs 74;" f shootShatter src/Dodge/Item/Weapon/Shatter.hs 11;" f -shootTeslaArc src/Dodge/HeldUse.hs 1258;" f +shootTeslaArc src/Dodge/HeldUse.hs 1281;" f shootTillEmpty src/Dodge/Creature/Volition.hs 18;" f -shootTractorBeam src/Dodge/HeldUse.hs 849;" f +shootTractorBeam src/Dodge/HeldUse.hs 874;" f shootersRoom src/Dodge/Room/Room.hs 315;" f shootersRoom' src/Dodge/Room/Room.hs 280;" f shootersRoom1 src/Dodge/Room/Room.hs 305;" f @@ -5806,14 +5808,14 @@ shootingRange src/Dodge/Room/Room.hs 332;" f shortPoint2 src/Dodge/ShortShow.hs 4;" f shortShow src/ShortShow.hs 9;" f shotgunS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 693;" f -shoulderHeight src/Dodge/Item/HeldOffset.hs 86;" f +shoulderHeight src/Dodge/Item/HeldOffset.hs 95;" f shoulderSH src/Dodge/Creature/Picture.hs 133;" f shoulderSP src/Dodge/Creature/HandPos.hs 170;" f -showAttachItem src/Dodge/Item/Display.hs 90;" f -showEquipItem src/Dodge/Item/Display.hs 104;" f +showAttachItem src/Dodge/Item/Display.hs 91;" f +showEquipItem src/Dodge/Item/Display.hs 105;" f showInt src/Dodge/Item/Info.hs 73;" f showIntsString src/Dodge/Tree/Compose.hs 129;" f -showInventoryPathing src/Dodge/Item/Display.hs 84;" f +showInventoryPathing src/Dodge/Item/Display.hs 85;" f showManObj src/Dodge/TestString.hs 62;" f showTerminalError src/Dodge/Debug/Terminal.hs 78;" f showTimeFlow src/Dodge/TestString.hs 85;" f @@ -5956,12 +5958,11 @@ strFromEquipment src/Dodge/Creature/Statistics.hs 48;" f strFromHeldItem src/Dodge/Creature/Statistics.hs 60;" f strengthFactor src/Dodge/Creature/Impulse/Movement.hs 35;" f strictify src/MaybeHelp.hs 37;" f -strideRot src/Dodge/Item/HeldOffset.hs 89;" f +strideRot src/Dodge/Item/HeldOffset.hs 98;" 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 155;" f -structureUseAtLoc src/Dodge/Creature/Impulse/UseItem.hs 71;" f subInvX src/Dodge/ListDisplayParams.hs 48;" f subMap src/TreeHelp.hs 118;" f subZipWith src/Dodge/Placement/Instance/Wall.hs 115;" f @@ -6097,19 +6098,19 @@ 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 267;" f -torqueAmount src/Dodge/HeldUse.hs 629;" f +torqueAmount src/Dodge/HeldUse.hs 654;" f torqueCr src/Dodge/WorldEffect.hs 66;" f torso src/Dodge/Creature/Picture.hs 99;" f tractCr src/Dodge/TractorBeam/Update.hs 28;" f tractFlIt src/Dodge/TractorBeam/Update.hs 23;" f -tractorBeamAt src/Dodge/HeldUse.hs 861;" f +tractorBeamAt src/Dodge/HeldUse.hs 886;" f tractorGun src/Dodge/Item/Held/BatteryGuns.hs 60;" 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 transMat src/MatrixHelper.hs 73;" f -transToHandle src/Dodge/Item/HeldOffset.hs 30;" f +transToHandle src/Dodge/Item/HeldOffset.hs 32;" f translate src/Picture/Base.hs 116;" f translate3 src/Picture/Base.hs 120;" f translateFloatingCamera src/Dodge/Update/Camera.hs 45;" f @@ -6175,13 +6176,13 @@ trySynthBullet src/Dodge/Creature/State.hs 224;" f tryUseParent src/Dodge/Creature/State.hs 217;" f turnTo src/Dodge/Movement/Turn.hs 8;" f turret src/Dodge/Placement/Instance/Turret.hs 35;" f -turretItemOffset src/Dodge/Item/HeldOffset.hs 25;" f +turretItemOffset src/Dodge/Item/HeldOffset.hs 27;" f tweenAngles src/Geometry/Vector.hs 195;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 80;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 28;" f twists src/Dodge/Creature/Test.hs 108;" f twoFlat src/Dodge/Creature/Test.hs 105;" f -twoFlatHRot src/Dodge/Item/HeldOffset.hs 98;" f +twoFlatHRot src/Dodge/Item/HeldOffset.hs 107;" f twoHandTwistAmount src/Dodge/Creature/YourControl.hs 150;" f twoRoomPoss src/Dodge/PlacementSpot.hs 147;" f twoStep1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 533;" f @@ -6342,27 +6343,25 @@ upperRounded src/Shape.hs 185;" 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 1163;" f +useGasParams src/Dodge/HeldUse.hs 1186;" f useHotkey src/Dodge/Creature/YourControl.hs 70;" f -useInventoryPath src/Dodge/HeldUse.hs 1431;" f -useItem src/Dodge/Creature/Impulse/UseItem.hs 20;" f -useItemLoc src/Dodge/Creature/Impulse/UseItem.hs 27;" f +useInventoryPath src/Dodge/HeldUse.hs 1454;" f +useItem src/Dodge/Creature/Impulse/UseItem.hs 18;" f +useItemLoc src/Dodge/Creature/Impulse/UseItem.hs 26;" f useLnkRoomPos src/Dodge/PlacementSpot.hs 244;" f -useLoadedAmmo src/Dodge/HeldUse.hs 769;" f -useLocation src/Dodge/Creature/Impulse/UseItem.hs 61;" f +useLoadedAmmo src/Dodge/HeldUse.hs 794;" 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 1391;" f +useRewindGun src/Dodge/HeldUse.hs 1414;" 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 1372;" f +useStopWatch src/Dodge/HeldUse.hs 1395;" f useStopWatch src/Dodge/Luse.hs 21;" f -useTimeCheck src/Dodge/HeldUse.hs 112;" f +useTimeCheck src/Dodge/HeldUse.hs 131;" f useTimeCheck src/Dodge/Item/Weapon/TriggerType.hs 127;" f -useTimeScrollGun src/Dodge/HeldUse.hs 1380;" f +useTimeScrollGun src/Dodge/HeldUse.hs 1403;" f useTimeScrollGun src/Dodge/Luse.hs 29;" f useUnusedLnk src/Dodge/PlacementSpot.hs 169;" f usedRoomInLinkPoss src/Dodge/PlacementSpot.hs 196;" f @@ -6386,7 +6385,7 @@ verticalLampCover src/Dodge/Placement/Instance/LightSource/Cover.hs 38;" f verticalPipe src/Dodge/Picture.hs 19;" f verticalPipe src/Dodge/Placement/Instance/Pipe.hs 6;" f verticalWire src/Dodge/Wire.hs 24;" f -vgunMuzzles src/Dodge/HeldUse.hs 328;" f +vgunMuzzles src/Dodge/HeldUse.hs 353;" f viewBoundaries src/Dodge/Debug/Picture.hs 304;" f viewClipBounds src/Dodge/Debug/Picture.hs 313;" f viewDistanceFromItems src/Dodge/Update/Camera.hs 186;" f @@ -6398,7 +6397,7 @@ vocalizationTest src/Dodge/Creature/Vocalization.hs 42;" f volleyGun src/Dodge/Item/Held/Cane.hs 15;" f volleyGunShape src/Dodge/Item/Draw/SPic.hs 345;" f waistSP src/Dodge/Creature/HandPos.hs 173;" f -walkNozzle src/Dodge/HeldUse.hs 831;" f +walkNozzle src/Dodge/HeldUse.hs 856;" f walkableNodeNear src/Dodge/Path.hs 48;" f wallBlips src/Dodge/RadarSweep.hs 98;" f wallBuffer src/Dodge/WallCreatureCollisions.hs 52;" f @@ -6406,7 +6405,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 1425;" f +warmupSound src/Dodge/HeldUse.hs 1448;" f warningRooms src/Dodge/Room/Warning.hs 28;" f wasdAim src/Dodge/Creature/YourControl.hs 126;" f wasdDir src/Dodge/WASD.hs 17;" f