module Game.LambdaHack.Content.ItemKind
( ItemKind(..), toVelocity, toLinger, validateItemKind
) where
import Data.Function
import Data.List
import Data.Ord
import Data.Text (Text)
import qualified Data.Text as T
import qualified NLP.Miniutter.English as MU
import qualified Game.LambdaHack.Common.Dice as Dice
import qualified Game.LambdaHack.Common.Effect as Effect
import Game.LambdaHack.Common.Flavour
import Game.LambdaHack.Common.Misc
data ItemKind = ItemKind
{ isymbol :: !Char
, iname :: !Text
, ifreq :: !Freqs
, iflavour :: ![Flavour]
, icount :: !Dice.Dice
, irarity :: ![(Int, Int)]
, iverbHit :: !MU.Part
, iweight :: !Int
, iaspects :: ![Effect.Aspect Dice.Dice]
, ieffects :: ![Effect.Effect Dice.Dice]
, ifeature :: ![Effect.Feature]
, idesc :: !Text
, ikit :: ![(Text, CStore)]
}
deriving Show
toVelocity :: Int -> Effect.Feature
toVelocity n = Effect.ToThrow $ Effect.ThrowMod n 100
toLinger :: Int -> Effect.Feature
toLinger n = Effect.ToThrow $ Effect.ThrowMod 100 n
validateItemKind :: [ItemKind] -> [ItemKind]
validateItemKind l =
let bad ik = T.length (iname ik) > 23
|| let sortedRarity = sortBy (comparing fst) (irarity ik)
in sortedRarity /= irarity ik
|| nubBy ((==) `on` fst) sortedRarity /= sortedRarity
|| case (sortedRarity, reverse sortedRarity) of
((lowest, _) : _, (highest, _) : _) ->
lowest < 1 || highest > 10
_ -> False
in filter bad l