module Dodge.Item.Location where import Dodge.Data import qualified IntMapHelp as IM import Control.Lens import Data.Maybe setHeldItemLoc :: Creature -> World -> World setHeldItemLoc cr = fst . getHeldItemLoc cr getHeldItemLoc :: Creature -> World -> (World,Int) getHeldItemLoc cr w = case maybeitid of Nothing -> ( w & cWorld . creatures . ix cid . crInv . ix j . itID ?~ newitid & cWorld . itemPositions %~ IM.insert newitid (InInv cid j) , itid) _ -> (w, itid) where cid = _crID cr j = crSel cr newitid = IM.newKey $ _itemPositions (_cWorld w) maybeitid = cr ^? crInv . ix j . itID . _Just itid = fromMaybe newitid maybeitid getItem :: Int -> World -> Maybe Item getItem itid w = do itpos <- w ^? cWorld . itemPositions . ix itid case itpos of OnFloor flitid -> w ^? cWorld . floorItems . ix flitid . flIt InInv cid invid -> w ^? cWorld . creatures . ix cid . crInv . ix invid VoidItm -> Nothing pointToItem :: Applicative f => ItemPos -> (Item -> f Item) -> World -> f World pointToItem (InInv cid invid) = cWorld . creatures . ix cid . crInv . ix invid pointToItem (OnFloor flid) = cWorld . floorItems . ix flid . flIt pointToItem _ = const pure