diff --git a/src/Dodge/HeldUse.hs b/src/Dodge/HeldUse.hs index b8ae64d4f..5d66d5d1c 100644 --- a/src/Dodge/HeldUse.hs +++ b/src/Dodge/HeldUse.hs @@ -1,5 +1,5 @@ +{-# LANGUAGE TupleSections #-} {-# OPTIONS -Wno-incomplete-uni-patterns #-} ---{-# LANGUAGE TupleSections #-} {-# LANGUAGE LambdaCase #-} module Dodge.HeldUse ( @@ -633,9 +633,9 @@ heldTorqueAmount = \case BLINKERUNSAFE -> 0 loadMuzzle :: LocationDT OItem -> Creature -> (Bool, World) -> Muzzle -> (Bool, World) -loadMuzzle loc cr (b, w) mz = fromMaybe (b, w) $ do +loadMuzzle loc cr (b, w) mz = maybe (b, w) (True,) $ do case mz ^. mzAmmoSlot of - NoAmmoRequired -> return (True, doMuzzleEffect loc cr mz Nothing w) + NoAmmoRequired -> return (doMuzzleEffect loc cr mz Nothing w) as -> do mag <- case as of MagBelow mi _ -> find (isAmmoIntLink mi . (^. dtValue . _2)) (loc ^. locDT . dtLeft) @@ -652,7 +652,7 @@ loadMuzzle loc cr (b, w) mz = fromMaybe (b, w) $ do | x <= availableammo -> x | otherwise -> 0 guard $ usedammo > 0 - return $ useLoadedAmmo loc cr (b, w) (Just (mz, usedammo, mag)) + return $ useLoadedAmmo loc cr mz (Just (usedammo, mag)) w makeMuzzleFlare :: Muzzle -> LocationDT OItem -> Creature -> World -> World makeMuzzleFlare mz loc cr = case mz ^. mzFlareType of @@ -723,22 +723,19 @@ basicMuzFlare pos dir = isAmmoIntLink :: Int -> ItemSF -> Bool isAmmoIntLink i sf = Just i == sf ^? amsfLink --- (AmmoMagSF j _) = i == j ---isAmmoIntLink _ _ = False - doMuzzleEffect :: LocationDT OItem -> Creature -> Muzzle - -> Maybe (LocationDT OItem, Item) -> World -> World + -> Maybe (Int, DTree OItem) -> World -> World doMuzzleEffect _ _ _ _ = id useLoadedAmmo :: LocationDT OItem -> Creature -> - (Bool, World) -> - Maybe (Muzzle, Int, DTree OItem) -> - (Bool, World) -useLoadedAmmo _ _ (cme, w) Nothing = (cme, w) -useLoadedAmmo loc cr (_, w) (Just (mz, x, magtree)) = (,) True $ - removeAmmoFromMag x mid cr . makeMuzzleFlare mz loc cr $ case _mzEffect mz of + Muzzle -> + Maybe (Int, DTree OItem) -> + World -> + World +useLoadedAmmo loc cr mz m w = + removeAmmoFromMag m cr . makeMuzzleFlare mz loc cr $ case _mzEffect mz of MuzzleShootBullet -> shootBullets loc cr (mz, x, magtree) w MuzzleLaser -> creatureShootLaser loc cr mz w MuzzlePulseLaser -> creatureShootPulseLaser loc cr mz w @@ -773,6 +770,7 @@ useLoadedAmmo loc cr (_, w) (Just (mz, x, magtree)) = (,) True $ itmtree = loc ^. locDT mid = magtree ^? dtValue . _1 . itLocation . ilInvID itm = itmtree ^. dtValue . _1 + (x, magtree) = fromJust m getAttachedSFLink :: ItemSF -> DTree OItem -> Maybe (NewInt ItmInt) getAttachedSFLink sf = (^? dtRight . folding (find f) . dtValue . _1 . itID) @@ -939,9 +937,11 @@ shootPulseBall p dir w = where i = IM.newKey $ w ^. cWorld . lWorld . pulseBalls -removeAmmoFromMag :: Int -> Maybe Int -> Creature -> World -> World -removeAmmoFromMag x mid cr = fromMaybe id $ do - magid <- mid +--removeAmmoFromMag :: Int -> Maybe Int -> Creature -> World -> World +removeAmmoFromMag :: Maybe (Int, DTree OItem) -> Creature -> World -> World +removeAmmoFromMag m cr = fromMaybe id $ do + (x, magtree) <- m + magid <- magtree ^? dtValue . _1 . itLocation . ilInvID return $ cWorld . lWorld . creatures . ix (_crID cr)