module Dodge.Inventory.Add where import Control.Lens import Data.Maybe import Dodge.Base.You import Dodge.Combine.Module import Dodge.Data.World import Dodge.FloorItem import Dodge.Inventory.CheckSlots import qualified IntMapHelp as IM putItemInInvID :: Int -> Int -> World -> (Maybe Int, World) putItemInInvID cid flid w = fromMaybe (Nothing, w) $ do (i, w') <- tryPutItemInInv cid (_floorItems (_cWorld w) IM.! flid) w return (Just i, w') putItemInInvSlot :: Int -> Item -> IM.IntMap Item -> IM.IntMap Item putItemInInvSlot = IM.insertWith (const $ itUse . useAmount +~ 1) -- | Pick up a specific item. tryPutItemInInv :: Int -> FloorItem -> World -> Maybe (Int, World) tryPutItemInInv cid flit w = case maybeInvSlot of Nothing -> Nothing Just i -> Just ( i , w & updateItLocation i & cWorld . floorItems %~ IM.delete (_flItID flit) & cWorld . creatures . ix cid . crInv %~ putItemInInvSlot i it ) where it = _flIt flit maybeInvSlot = checkInvSlotsYou it w updateItLocation invid w' = case _itID it of Nothing -> w' Just j -> w' & cWorld . itemLocations . ix j .~ InInv cid invid --{- | Pick up a specific item. -} --putItemInInv :: Int -> FloorItem -> World -> World --putItemInInv cid flit w = case maybeInvSlot of -- Nothing -> w -- Just i -> w -- & updateItLocation i -- & floorItems %~ IM.delete (_flItID flit) -- & creatures . ix cid . crInv %~ IM.insertWith (const $ itAmount +~ 1) i it -- where -- it = _flIt flit -- maybeInvSlot = checkInvSlotsYou it w -- updateItLocation invid w' = case _itID it of -- Nothing -> w' -- Just j -> w' & itemPositions . ix j .~ InInv cid invid createPutItem :: Item -> World -> (Maybe Int, World) createPutItem it w = uncurry (putItemInInvID (_yourID (_cWorld w))) $ copyItemToFloorID (_crPos $ you w) (applyModules it) w