Files
loop/src/Dodge/Inventory/Add.hs
T

56 lines
2.0 KiB
Haskell

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
(i, w') <- tryPutItemInInv cid (w ^?! cWorld . lWorld . floorItems . ix 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 . lWorld . floorItems %~ IM.delete (_flItID flit)
& cWorld . lWorld . creatures . ix cid . crInv %~ putItemInInvSlot i it
)
where
it = _flIt flit
maybeInvSlot = checkInvSlotsYou it w
updateItLocation invid w' = w' & cWorld . lWorld . itemLocations . ix (_itID it) .~ 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 0) $
copyItemToFloorID (_crPos $ you w) (applyModules it) w