module Dodge.Inventory.CheckSlots where import Control.Lens import Data.Maybe import Dodge.Base.You import Dodge.Data.World import Dodge.Inventory.ItemSpace import qualified IntMapHelp as IM {- | checks whether or not an item will fit in your inventory if so return Just the next slot to be used -} checkInvSlotsYou :: Item -> World -> Maybe Int checkInvSlotsYou it w | crNumFreeSlots ycr >= ceiling (_itInvSize it) = Just $ findItemSlot it inv | otherwise = Nothing where ycr = you w inv = _crInv ycr -- Assumes that the item is singular. -- Do not want to stack floor items for now findItemSlot :: Item -> IM.IntMap Item -> Int findItemSlot it inv = case it ^? itUse . useAmount of Just _ -> fromMaybe newslot $ IM.findIndex (\it' -> _itType it == _itType it') inv _ -> newslot where newslot = maybe 0 ((+ 1) . fst) $ IM.lookupMax inv crNumFreeSlots :: Creature -> Int crNumFreeSlots cr = _crInvCapacity cr - invSize (_crInv cr) crInvSize :: Creature -> Int crInvSize = invSize . _crInv invSize :: IM.IntMap Item -> Int invSize = sum . fmap itSlotsTaken