module Game.LambdaHack.Common.Item
(
ItemId, Item(..), seedToAspectsEffects
, ItemKindIx, DiscoveryKind, ItemSeed, ItemAspectEffect(..), DiscoveryEffect
, ItemFull(..), ItemDisco(..), itemNoDisco, itemNoAE
, ItemTimer, ItemQuant, 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.Flavour
import qualified Game.LambdaHack.Common.Kind as Kind
import Game.LambdaHack.Common.Misc
import Game.LambdaHack.Common.Random
import Game.LambdaHack.Common.Time
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 DiscoveryKind = 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]
}
deriving (Show, Eq, Generic)
instance Binary ItemAspectEffect
instance Hashable ItemAspectEffect
type DiscoveryEffect = 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
, itemTimer :: !ItemTimer
, itemDisco :: !(Maybe ItemDisco)
}
deriving Show
itemNoDisco :: (Item, Int) -> ItemFull
itemNoDisco (itemBase, itemK) =
ItemFull {itemBase, itemK, itemTimer = [], 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
rollA = mapM (flip aspectTrav castD) (iaspects kind)
jaspects = St.evalState rollA (mkStdGen itemSeed)
jeffects = ieffects kind
in ItemAspectEffect{..}
type ItemTimer = [Time]
type ItemQuant = (Int, ItemTimer)
type ItemBag = EM.EnumMap ItemId ItemQuant
type ItemDict = EM.EnumMap ItemId Item
type ItemKnown = (ItemKindIx, ItemAspectEffect)