module Game.LambdaHack.Common.Item
(
ItemId, Item(..), seedToAspectsEffects
, ItemKindIx, Discovery, ItemSeed, ItemAspectEffect(..), DiscoAE
, ItemFull(..), ItemDisco(..), itemNoDisco, itemNoAE
, ItemBag, ItemDict, ItemKnown
) where
import qualified Control.Monad.State as St
import Data.Binary
import qualified Data.EnumMap.Strict as EM
import Data.Hashable (Hashable)
import qualified Data.Ix as Ix
import Data.Text (Text)
import GHC.Generics (Generic)
import System.Random (mkStdGen)
import Game.LambdaHack.Common.Effect
import Game.LambdaHack.Common.Flavour
import qualified Game.LambdaHack.Common.Kind as Kind
import Game.LambdaHack.Common.Misc
import Game.LambdaHack.Common.Random
import Game.LambdaHack.Content.ItemKind
newtype ItemId = ItemId Int
deriving (Show, Eq, Ord, Enum, Binary)
newtype ItemKindIx = ItemKindIx Int
deriving (Show, Eq, Ord, Enum, Ix.Ix, Hashable, Binary)
type Discovery = EM.EnumMap ItemKindIx (Kind.Id ItemKind)
newtype ItemSeed = ItemSeed Int
deriving (Show, Eq, Ord, Enum, Hashable, Binary)
data ItemAspectEffect = ItemAspectEffect
{ jaspects :: ![Aspect Int]
, jeffects :: ![Effect Int]
}
deriving (Show, Eq, Generic)
instance Binary ItemAspectEffect
instance Hashable ItemAspectEffect
type DiscoAE = EM.EnumMap ItemId ItemAspectEffect
data ItemDisco = ItemDisco
{ itemKindId :: Kind.Id ItemKind
, itemKind :: ItemKind
, itemAE :: Maybe ItemAspectEffect
}
deriving Show
data ItemFull = ItemFull
{ itemBase :: !Item
, itemK :: !Int
, itemDisco :: !(Maybe ItemDisco)
}
deriving Show
itemNoDisco :: (Item, Int) -> ItemFull
itemNoDisco (itemBase, itemK) =
ItemFull {itemBase, itemK, itemDisco=Nothing}
itemNoAE :: ItemFull -> ItemFull
itemNoAE itemFull@ItemFull{..} =
let f idisco = idisco {itemAE = Nothing}
newDisco = fmap f itemDisco
in itemFull {itemDisco = newDisco}
data Item = Item
{ jkindIx :: !ItemKindIx
, jlid :: !LevelId
, jsymbol :: !Char
, jname :: !Text
, jflavour :: !Flavour
, jfeature :: ![Feature]
, jweight :: !Int
}
deriving (Show, Eq, Generic)
instance Hashable Item
instance Binary Item
seedToAspectsEffects :: ItemSeed -> ItemKind -> AbsDepth -> AbsDepth
-> ItemAspectEffect
seedToAspectsEffects (ItemSeed itemSeed) kind ldepth totalDepth =
let castD = castDice ldepth totalDepth
rollAE = do
aspects <- mapM (flip aspectTrav castD) (iaspects kind)
effects <- mapM (flip effectTrav castD) (ieffects kind)
return (aspects, effects)
(jaspects, jeffects) = St.evalState rollAE (mkStdGen itemSeed)
in ItemAspectEffect{..}
type ItemBag = EM.EnumMap ItemId Int
type ItemDict = EM.EnumMap ItemId Item
type ItemKnown = (Item, ItemAspectEffect)