49 lines
1.4 KiB
Haskell
49 lines
1.4 KiB
Haskell
--{-# LANGUAGE TupleSections #-}
|
|
module Dodge.Combine (
|
|
combineList,
|
|
) where
|
|
|
|
import Data.Bifunctor
|
|
import Data.List (sortOn)
|
|
import qualified Data.Map.Strict as M
|
|
import Dodge.Base.You
|
|
import Dodge.Combine.Trie
|
|
import Dodge.Data.Combine
|
|
import Dodge.Data.Universe
|
|
import Dodge.Item.Display
|
|
import Dodge.Item.InventoryColor
|
|
import qualified IntMapHelp as IM
|
|
import SimpleTrie
|
|
|
|
invertInventoryToMap :: IM.IntMap Item -> M.Map ItemType [Int]
|
|
invertInventoryToMap =
|
|
IM.foldrWithKey
|
|
(\k it -> M.insertWith (++) (_itType it) [k])
|
|
mempty
|
|
|
|
groupSplitItemAmounts :: M.Map ItemType [Int] -> [((ItAmount, ItemType), [Int])]
|
|
groupSplitItemAmounts = M.foldrWithKey f []
|
|
where
|
|
f ibt is = (++) [((fromIntegral i, ibt), take i is) | i <- [1 .. length is]]
|
|
|
|
flatLookupItems :: IM.IntMap Item -> [([[Int]], Item)]
|
|
flatLookupItems =
|
|
flip multiLookupTrieI combinationsTrie . sortOn fst . groupSplitItemAmounts
|
|
. invertInventoryToMap
|
|
|
|
combineItemListYouX :: World -> [([Int], Item)]
|
|
combineItemListYouX = map (first concat) . flatLookupItems . yourInv
|
|
|
|
combineList :: World -> [SelectionItem CombinableItem]
|
|
combineList = map f . combineItemListYouX
|
|
where
|
|
f (is, itm) =
|
|
SelectionItem
|
|
{ _siPictures = basicItemDisplay itm
|
|
, _siHeight = _itInvSize itm
|
|
, _siIsSelectable = True
|
|
, _siColor = itemInvColor itm
|
|
, _siOffX = 0
|
|
, _siPayload = CombinableItem is itm []
|
|
}
|