{-# LANGUAGE DeriveGeneric #-}
module Game.LambdaHack.Common.ItemAspect
( AspectRecord(..), KindMean(..)
, emptyAspectRecord, addMeanAspect, castAspect, aspectsRandom
, aspectRecordToList, rollAspectRecord, getSkill, checkFlag, meanAspect
, onlyMinorEffects, itemTrajectory, totalRange, isHumanTrinket
, goesIntoEqp, goesIntoInv, goesIntoSha, loreFromMode, loreFromContainer
#ifdef EXPOSE_INTERNAL
, ceilingMeanDice
#endif
) where
import Prelude ()
import Game.LambdaHack.Core.Prelude
import qualified Control.Monad.Trans.State.Strict as St
import Data.Binary
import qualified Data.EnumSet as ES
import Data.Hashable (Hashable)
import qualified Data.Text as T
import GHC.Generics (Generic)
import qualified System.Random as R
import Game.LambdaHack.Common.Time
import Game.LambdaHack.Common.Types
import Game.LambdaHack.Common.Vector
import qualified Game.LambdaHack.Content.ItemKind as IK
import qualified Game.LambdaHack.Core.Dice as Dice
import Game.LambdaHack.Common.Point
import Game.LambdaHack.Core.Random
import qualified Game.LambdaHack.Definition.Ability as Ability
import Game.LambdaHack.Definition.Defs
data AspectRecord = AspectRecord
{ AspectRecord -> Int
aTimeout :: Int
, AspectRecord -> Skills
aSkills :: Ability.Skills
, AspectRecord -> Flags
aFlags :: Ability.Flags
, AspectRecord -> Text
aELabel :: Text
, AspectRecord -> ThrowMod
aToThrow :: IK.ThrowMod
, AspectRecord -> Maybe (GroupName ItemKind)
aHideAs :: Maybe (GroupName IK.ItemKind)
, AspectRecord -> Maybe EqpSlot
aEqpSlot :: Maybe Ability.EqpSlot
}
deriving (Int -> AspectRecord -> ShowS
[AspectRecord] -> ShowS
AspectRecord -> String
(Int -> AspectRecord -> ShowS)
-> (AspectRecord -> String)
-> ([AspectRecord] -> ShowS)
-> Show AspectRecord
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AspectRecord] -> ShowS
$cshowList :: [AspectRecord] -> ShowS
show :: AspectRecord -> String
$cshow :: AspectRecord -> String
showsPrec :: Int -> AspectRecord -> ShowS
$cshowsPrec :: Int -> AspectRecord -> ShowS
Show, AspectRecord -> AspectRecord -> Bool
(AspectRecord -> AspectRecord -> Bool)
-> (AspectRecord -> AspectRecord -> Bool) -> Eq AspectRecord
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AspectRecord -> AspectRecord -> Bool
$c/= :: AspectRecord -> AspectRecord -> Bool
== :: AspectRecord -> AspectRecord -> Bool
$c== :: AspectRecord -> AspectRecord -> Bool
Eq, Eq AspectRecord
Eq AspectRecord =>
(AspectRecord -> AspectRecord -> Ordering)
-> (AspectRecord -> AspectRecord -> Bool)
-> (AspectRecord -> AspectRecord -> Bool)
-> (AspectRecord -> AspectRecord -> Bool)
-> (AspectRecord -> AspectRecord -> Bool)
-> (AspectRecord -> AspectRecord -> AspectRecord)
-> (AspectRecord -> AspectRecord -> AspectRecord)
-> Ord AspectRecord
AspectRecord -> AspectRecord -> Bool
AspectRecord -> AspectRecord -> Ordering
AspectRecord -> AspectRecord -> AspectRecord
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: AspectRecord -> AspectRecord -> AspectRecord
$cmin :: AspectRecord -> AspectRecord -> AspectRecord
max :: AspectRecord -> AspectRecord -> AspectRecord
$cmax :: AspectRecord -> AspectRecord -> AspectRecord
>= :: AspectRecord -> AspectRecord -> Bool
$c>= :: AspectRecord -> AspectRecord -> Bool
> :: AspectRecord -> AspectRecord -> Bool
$c> :: AspectRecord -> AspectRecord -> Bool
<= :: AspectRecord -> AspectRecord -> Bool
$c<= :: AspectRecord -> AspectRecord -> Bool
< :: AspectRecord -> AspectRecord -> Bool
$c< :: AspectRecord -> AspectRecord -> Bool
compare :: AspectRecord -> AspectRecord -> Ordering
$ccompare :: AspectRecord -> AspectRecord -> Ordering
$cp1Ord :: Eq AspectRecord
Ord, (forall x. AspectRecord -> Rep AspectRecord x)
-> (forall x. Rep AspectRecord x -> AspectRecord)
-> Generic AspectRecord
forall x. Rep AspectRecord x -> AspectRecord
forall x. AspectRecord -> Rep AspectRecord x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AspectRecord x -> AspectRecord
$cfrom :: forall x. AspectRecord -> Rep AspectRecord x
Generic)
instance Hashable AspectRecord
instance Binary AspectRecord
data KindMean = KindMean
{ KindMean -> Bool
kmConst :: Bool
, KindMean -> AspectRecord
kmMean :: AspectRecord
}
deriving (Int -> KindMean -> ShowS
[KindMean] -> ShowS
KindMean -> String
(Int -> KindMean -> ShowS)
-> (KindMean -> String) -> ([KindMean] -> ShowS) -> Show KindMean
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KindMean] -> ShowS
$cshowList :: [KindMean] -> ShowS
show :: KindMean -> String
$cshow :: KindMean -> String
showsPrec :: Int -> KindMean -> ShowS
$cshowsPrec :: Int -> KindMean -> ShowS
Show, KindMean -> KindMean -> Bool
(KindMean -> KindMean -> Bool)
-> (KindMean -> KindMean -> Bool) -> Eq KindMean
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KindMean -> KindMean -> Bool
$c/= :: KindMean -> KindMean -> Bool
== :: KindMean -> KindMean -> Bool
$c== :: KindMean -> KindMean -> Bool
Eq, Eq KindMean
Eq KindMean =>
(KindMean -> KindMean -> Ordering)
-> (KindMean -> KindMean -> Bool)
-> (KindMean -> KindMean -> Bool)
-> (KindMean -> KindMean -> Bool)
-> (KindMean -> KindMean -> Bool)
-> (KindMean -> KindMean -> KindMean)
-> (KindMean -> KindMean -> KindMean)
-> Ord KindMean
KindMean -> KindMean -> Bool
KindMean -> KindMean -> Ordering
KindMean -> KindMean -> KindMean
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: KindMean -> KindMean -> KindMean
$cmin :: KindMean -> KindMean -> KindMean
max :: KindMean -> KindMean -> KindMean
$cmax :: KindMean -> KindMean -> KindMean
>= :: KindMean -> KindMean -> Bool
$c>= :: KindMean -> KindMean -> Bool
> :: KindMean -> KindMean -> Bool
$c> :: KindMean -> KindMean -> Bool
<= :: KindMean -> KindMean -> Bool
$c<= :: KindMean -> KindMean -> Bool
< :: KindMean -> KindMean -> Bool
$c< :: KindMean -> KindMean -> Bool
compare :: KindMean -> KindMean -> Ordering
$ccompare :: KindMean -> KindMean -> Ordering
$cp1Ord :: Eq KindMean
Ord, (forall x. KindMean -> Rep KindMean x)
-> (forall x. Rep KindMean x -> KindMean) -> Generic KindMean
forall x. Rep KindMean x -> KindMean
forall x. KindMean -> Rep KindMean x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep KindMean x -> KindMean
$cfrom :: forall x. KindMean -> Rep KindMean x
Generic)
emptyAspectRecord :: AspectRecord
emptyAspectRecord :: AspectRecord
emptyAspectRecord = $WAspectRecord :: Int
-> Skills
-> Flags
-> Text
-> ThrowMod
-> Maybe (GroupName ItemKind)
-> Maybe EqpSlot
-> AspectRecord
AspectRecord
{ aTimeout :: Int
aTimeout = 0
, aSkills :: Skills
aSkills = Skills
Ability.zeroSkills
, aFlags :: Flags
aFlags = EnumSet Flag -> Flags
Ability.Flags EnumSet Flag
forall k. EnumSet k
ES.empty
, aELabel :: Text
aELabel = ""
, aToThrow :: ThrowMod
aToThrow = Int -> Int -> Int -> ThrowMod
IK.ThrowMod 100 100 1
, aHideAs :: Maybe (GroupName ItemKind)
aHideAs = Maybe (GroupName ItemKind)
forall a. Maybe a
Nothing
, aEqpSlot :: Maybe EqpSlot
aEqpSlot = Maybe EqpSlot
forall a. Maybe a
Nothing
}
castAspect :: Dice.AbsDepth -> Dice.AbsDepth -> AspectRecord -> IK.Aspect
-> Rnd AspectRecord
castAspect :: AbsDepth -> AbsDepth -> AspectRecord -> Aspect -> Rnd AspectRecord
castAspect !AbsDepth
ldepth !AbsDepth
totalDepth !AspectRecord
ar !Aspect
asp =
case Aspect
asp of
IK.Timeout d :: Dice
d -> do
Int
n <- AbsDepth -> AbsDepth -> Dice -> Rnd Int
castDice AbsDepth
ldepth AbsDepth
totalDepth Dice
d
AspectRecord -> Rnd AspectRecord
forall (m :: * -> *) a. Monad m => a -> m a
return (AspectRecord -> Rnd AspectRecord)
-> AspectRecord -> Rnd AspectRecord
forall a b. (a -> b) -> a -> b
$! Bool -> AspectRecord -> AspectRecord
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (AspectRecord -> Int
aTimeout AspectRecord
ar Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0) (AspectRecord -> AspectRecord) -> AspectRecord -> AspectRecord
forall a b. (a -> b) -> a -> b
$ AspectRecord
ar {aTimeout :: Int
aTimeout = Int
n}
IK.AddSkill sk :: Skill
sk d :: Dice
d -> do
Int
n <- AbsDepth -> AbsDepth -> Dice -> Rnd Int
castDice AbsDepth
ldepth AbsDepth
totalDepth Dice
d
AspectRecord -> Rnd AspectRecord
forall (m :: * -> *) a. Monad m => a -> m a
return (AspectRecord -> Rnd AspectRecord)
-> AspectRecord -> Rnd AspectRecord
forall a b. (a -> b) -> a -> b
$! if Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= 0
then AspectRecord
ar {aSkills :: Skills
aSkills = Skill -> Int -> Skills -> Skills
Ability.addSk Skill
sk Int
n (AspectRecord -> Skills
aSkills AspectRecord
ar)}
else AspectRecord
ar
IK.SetFlag feat :: Flag
feat ->
AspectRecord -> Rnd AspectRecord
forall (m :: * -> *) a. Monad m => a -> m a
return (AspectRecord -> Rnd AspectRecord)
-> AspectRecord -> Rnd AspectRecord
forall a b. (a -> b) -> a -> b
$! AspectRecord
ar {aFlags :: Flags
aFlags = EnumSet Flag -> Flags
Ability.Flags
(EnumSet Flag -> Flags) -> EnumSet Flag -> Flags
forall a b. (a -> b) -> a -> b
$ Flag -> EnumSet Flag -> EnumSet Flag
forall k. Enum k => k -> EnumSet k -> EnumSet k
ES.insert Flag
feat (Flags -> EnumSet Flag
Ability.flags (Flags -> EnumSet Flag) -> Flags -> EnumSet Flag
forall a b. (a -> b) -> a -> b
$ AspectRecord -> Flags
aFlags AspectRecord
ar)}
IK.ELabel t :: Text
t -> AspectRecord -> Rnd AspectRecord
forall (m :: * -> *) a. Monad m => a -> m a
return (AspectRecord -> Rnd AspectRecord)
-> AspectRecord -> Rnd AspectRecord
forall a b. (a -> b) -> a -> b
$! AspectRecord
ar {aELabel :: Text
aELabel = Text
t}
IK.ToThrow tt :: ThrowMod
tt -> AspectRecord -> Rnd AspectRecord
forall (m :: * -> *) a. Monad m => a -> m a
return (AspectRecord -> Rnd AspectRecord)
-> AspectRecord -> Rnd AspectRecord
forall a b. (a -> b) -> a -> b
$! AspectRecord
ar {aToThrow :: ThrowMod
aToThrow = ThrowMod
tt}
IK.HideAs ha :: GroupName ItemKind
ha -> AspectRecord -> Rnd AspectRecord
forall (m :: * -> *) a. Monad m => a -> m a
return (AspectRecord -> Rnd AspectRecord)
-> AspectRecord -> Rnd AspectRecord
forall a b. (a -> b) -> a -> b
$! AspectRecord
ar {aHideAs :: Maybe (GroupName ItemKind)
aHideAs = GroupName ItemKind -> Maybe (GroupName ItemKind)
forall a. a -> Maybe a
Just GroupName ItemKind
ha}
IK.EqpSlot slot :: EqpSlot
slot -> AspectRecord -> Rnd AspectRecord
forall (m :: * -> *) a. Monad m => a -> m a
return (AspectRecord -> Rnd AspectRecord)
-> AspectRecord -> Rnd AspectRecord
forall a b. (a -> b) -> a -> b
$! AspectRecord
ar {aEqpSlot :: Maybe EqpSlot
aEqpSlot = EqpSlot -> Maybe EqpSlot
forall a. a -> Maybe a
Just EqpSlot
slot}
IK.Odds d :: Dice
d aspects1 :: [Aspect]
aspects1 aspects2 :: [Aspect]
aspects2 -> do
Bool
pick1 <- AbsDepth -> AbsDepth -> Dice -> Rnd Bool
oddsDice AbsDepth
ldepth AbsDepth
totalDepth Dice
d
(AspectRecord -> Aspect -> Rnd AspectRecord)
-> AspectRecord -> [Aspect] -> Rnd AspectRecord
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> Rnd b) -> b -> t a -> Rnd b
foldlM' (AbsDepth -> AbsDepth -> AspectRecord -> Aspect -> Rnd AspectRecord
castAspect AbsDepth
ldepth AbsDepth
totalDepth) AspectRecord
ar ([Aspect] -> Rnd AspectRecord) -> [Aspect] -> Rnd AspectRecord
forall a b. (a -> b) -> a -> b
$
if Bool
pick1 then [Aspect]
aspects1 else [Aspect]
aspects2
aspectsRandom :: [IK.Aspect] -> Bool
aspectsRandom :: [Aspect] -> Bool
aspectsRandom ass :: [Aspect]
ass =
let rollM :: Int -> Rnd AspectRecord
rollM depth :: Int
depth =
(AspectRecord -> Aspect -> Rnd AspectRecord)
-> AspectRecord -> [Aspect] -> Rnd AspectRecord
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> Rnd b) -> b -> t a -> Rnd b
foldlM' (AbsDepth -> AbsDepth -> AspectRecord -> Aspect -> Rnd AspectRecord
castAspect (Int -> AbsDepth
Dice.AbsDepth Int
depth) (Int -> AbsDepth
Dice.AbsDepth 10))
AspectRecord
emptyAspectRecord [Aspect]
ass
gen :: StdGen
gen = Int -> StdGen
R.mkStdGen 0
(ar0 :: AspectRecord
ar0, gen0 :: StdGen
gen0) = Rnd AspectRecord -> StdGen -> (AspectRecord, StdGen)
forall s a. State s a -> s -> (a, s)
St.runState (Int -> Rnd AspectRecord
rollM 0) StdGen
gen
(ar1 :: AspectRecord
ar1, gen1 :: StdGen
gen1) = Rnd AspectRecord -> StdGen -> (AspectRecord, StdGen)
forall s a. State s a -> s -> (a, s)
St.runState (Int -> Rnd AspectRecord
rollM 10) StdGen
gen0
in StdGen -> String
forall a. Show a => a -> String
show StdGen
gen String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= StdGen -> String
forall a. Show a => a -> String
show StdGen
gen0 Bool -> Bool -> Bool
|| StdGen -> String
forall a. Show a => a -> String
show StdGen
gen String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= StdGen -> String
forall a. Show a => a -> String
show StdGen
gen1 Bool -> Bool -> Bool
|| AspectRecord
ar0 AspectRecord -> AspectRecord -> Bool
forall a. Eq a => a -> a -> Bool
/= AspectRecord
ar1
addMeanAspect :: AspectRecord -> IK.Aspect -> AspectRecord
addMeanAspect :: AspectRecord -> Aspect -> AspectRecord
addMeanAspect !AspectRecord
ar !Aspect
asp =
case Aspect
asp of
IK.Timeout d :: Dice
d ->
let n :: Int
n = Dice -> Int
ceilingMeanDice Dice
d
in Bool -> AspectRecord -> AspectRecord
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (AspectRecord -> Int
aTimeout AspectRecord
ar Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0) (AspectRecord -> AspectRecord) -> AspectRecord -> AspectRecord
forall a b. (a -> b) -> a -> b
$ AspectRecord
ar {aTimeout :: Int
aTimeout = Int
n}
IK.AddSkill sk :: Skill
sk d :: Dice
d ->
let n :: Int
n = Dice -> Int
ceilingMeanDice Dice
d
in if Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= 0
then AspectRecord
ar {aSkills :: Skills
aSkills = Skill -> Int -> Skills -> Skills
Ability.addSk Skill
sk Int
n (AspectRecord -> Skills
aSkills AspectRecord
ar)}
else AspectRecord
ar
IK.SetFlag feat :: Flag
feat ->
AspectRecord
ar {aFlags :: Flags
aFlags = EnumSet Flag -> Flags
Ability.Flags (EnumSet Flag -> Flags) -> EnumSet Flag -> Flags
forall a b. (a -> b) -> a -> b
$ Flag -> EnumSet Flag -> EnumSet Flag
forall k. Enum k => k -> EnumSet k -> EnumSet k
ES.insert Flag
feat (Flags -> EnumSet Flag
Ability.flags (Flags -> EnumSet Flag) -> Flags -> EnumSet Flag
forall a b. (a -> b) -> a -> b
$ AspectRecord -> Flags
aFlags AspectRecord
ar)}
IK.ELabel t :: Text
t -> AspectRecord
ar {aELabel :: Text
aELabel = Text
t}
IK.ToThrow tt :: ThrowMod
tt -> AspectRecord
ar {aToThrow :: ThrowMod
aToThrow = ThrowMod
tt}
IK.HideAs ha :: GroupName ItemKind
ha -> AspectRecord
ar {aHideAs :: Maybe (GroupName ItemKind)
aHideAs = GroupName ItemKind -> Maybe (GroupName ItemKind)
forall a. a -> Maybe a
Just GroupName ItemKind
ha}
IK.EqpSlot slot :: EqpSlot
slot -> AspectRecord
ar {aEqpSlot :: Maybe EqpSlot
aEqpSlot = EqpSlot -> Maybe EqpSlot
forall a. a -> Maybe a
Just EqpSlot
slot}
IK.Odds{} -> AspectRecord
ar
ceilingMeanDice :: Dice.Dice -> Int
ceilingMeanDice :: Dice -> Int
ceilingMeanDice d :: Dice
d = Double -> Int
forall a b. (RealFrac a, Integral b) => a -> b
ceiling (Double -> Int) -> Double -> Int
forall a b. (a -> b) -> a -> b
$ Dice -> Double
Dice.meanDice Dice
d
aspectRecordToList :: AspectRecord -> [IK.Aspect]
aspectRecordToList :: AspectRecord -> [Aspect]
aspectRecordToList AspectRecord{..} =
[Dice -> Aspect
IK.Timeout (Dice -> Aspect) -> Dice -> Aspect
forall a b. (a -> b) -> a -> b
$ Int -> Dice
Dice.intToDice Int
aTimeout | Int
aTimeout Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= 0]
[Aspect] -> [Aspect] -> [Aspect]
forall a. [a] -> [a] -> [a]
++ [ Skill -> Dice -> Aspect
IK.AddSkill Skill
sk (Dice -> Aspect) -> Dice -> Aspect
forall a b. (a -> b) -> a -> b
$ Int -> Dice
Dice.intToDice Int
n
| (sk :: Skill
sk, n :: Int
n) <- Skills -> [(Skill, Int)]
Ability.skillsToList Skills
aSkills ]
[Aspect] -> [Aspect] -> [Aspect]
forall a. [a] -> [a] -> [a]
++ [Flag -> Aspect
IK.SetFlag Flag
feat | Flag
feat <- EnumSet Flag -> [Flag]
forall k. Enum k => EnumSet k -> [k]
ES.elems (EnumSet Flag -> [Flag]) -> EnumSet Flag -> [Flag]
forall a b. (a -> b) -> a -> b
$ Flags -> EnumSet Flag
Ability.flags Flags
aFlags]
[Aspect] -> [Aspect] -> [Aspect]
forall a. [a] -> [a] -> [a]
++ [Text -> Aspect
IK.ELabel Text
aELabel | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Text -> Bool
T.null Text
aELabel]
[Aspect] -> [Aspect] -> [Aspect]
forall a. [a] -> [a] -> [a]
++ [ThrowMod -> Aspect
IK.ToThrow ThrowMod
aToThrow | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ ThrowMod
aToThrow ThrowMod -> ThrowMod -> Bool
forall a. Eq a => a -> a -> Bool
== Int -> Int -> Int -> ThrowMod
IK.ThrowMod 100 100 1]
[Aspect] -> [Aspect] -> [Aspect]
forall a. [a] -> [a] -> [a]
++ [Aspect]
-> (GroupName ItemKind -> [Aspect])
-> Maybe (GroupName ItemKind)
-> [Aspect]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\ha :: GroupName ItemKind
ha -> [GroupName ItemKind -> Aspect
IK.HideAs GroupName ItemKind
ha]) Maybe (GroupName ItemKind)
aHideAs
[Aspect] -> [Aspect] -> [Aspect]
forall a. [a] -> [a] -> [a]
++ [Aspect] -> (EqpSlot -> [Aspect]) -> Maybe EqpSlot -> [Aspect]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\slot :: EqpSlot
slot -> [EqpSlot -> Aspect
IK.EqpSlot EqpSlot
slot]) Maybe EqpSlot
aEqpSlot
rollAspectRecord :: [IK.Aspect] -> Dice.AbsDepth -> Dice.AbsDepth
-> Rnd AspectRecord
rollAspectRecord :: [Aspect] -> AbsDepth -> AbsDepth -> Rnd AspectRecord
rollAspectRecord ass :: [Aspect]
ass ldepth :: AbsDepth
ldepth totalDepth :: AbsDepth
totalDepth =
(AspectRecord -> Aspect -> Rnd AspectRecord)
-> AspectRecord -> [Aspect] -> Rnd AspectRecord
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> Rnd b) -> b -> t a -> Rnd b
foldlM' (AbsDepth -> AbsDepth -> AspectRecord -> Aspect -> Rnd AspectRecord
castAspect AbsDepth
ldepth AbsDepth
totalDepth) AspectRecord
emptyAspectRecord [Aspect]
ass
getSkill :: Ability.Skill -> AspectRecord -> Int
{-# INLINE getSkill #-}
getSkill :: Skill -> AspectRecord -> Int
getSkill sk :: Skill
sk ar :: AspectRecord
ar = Skill -> Skills -> Int
Ability.getSk Skill
sk (Skills -> Int) -> Skills -> Int
forall a b. (a -> b) -> a -> b
$ AspectRecord -> Skills
aSkills AspectRecord
ar
checkFlag :: Ability.Flag -> AspectRecord -> Bool
{-# INLINE checkFlag #-}
checkFlag :: Flag -> AspectRecord -> Bool
checkFlag flag :: Flag
flag ar :: AspectRecord
ar = Flag -> Flags -> Bool
Ability.checkFl Flag
flag (AspectRecord -> Flags
aFlags AspectRecord
ar)
meanAspect :: IK.ItemKind -> AspectRecord
meanAspect :: ItemKind -> AspectRecord
meanAspect kind :: ItemKind
kind = (AspectRecord -> Aspect -> AspectRecord)
-> AspectRecord -> [Aspect] -> AspectRecord
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' AspectRecord -> Aspect -> AspectRecord
addMeanAspect AspectRecord
emptyAspectRecord (ItemKind -> [Aspect]
IK.iaspects ItemKind
kind)
onlyMinorEffects :: AspectRecord -> IK.ItemKind -> Bool
onlyMinorEffects :: AspectRecord -> ItemKind -> Bool
onlyMinorEffects ar :: AspectRecord
ar kind :: ItemKind
kind =
Flag -> AspectRecord -> Bool
checkFlag Flag
Ability.MinorEffects AspectRecord
ar
Bool -> Bool -> Bool
|| Bool -> Bool
not ((Effect -> Bool) -> [Effect] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> (Effect -> Bool) -> Effect -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Effect -> Bool
IK.onSmashEffect) ([Effect] -> Bool) -> [Effect] -> Bool
forall a b. (a -> b) -> a -> b
$ ItemKind -> [Effect]
IK.ieffects ItemKind
kind)
itemTrajectory :: AspectRecord -> IK.ItemKind -> [Point]
-> ([Vector], (Speed, Int))
itemTrajectory :: AspectRecord -> ItemKind -> [Point] -> ([Vector], (Speed, Int))
itemTrajectory ar :: AspectRecord
ar itemKind :: ItemKind
itemKind path :: [Point]
path =
let IK.ThrowMod{..} = AspectRecord -> ThrowMod
aToThrow AspectRecord
ar
in Int -> Int -> Int -> [Point] -> ([Vector], (Speed, Int))
computeTrajectory (ItemKind -> Int
IK.iweight ItemKind
itemKind) Int
throwVelocity Int
throwLinger [Point]
path
totalRange :: AspectRecord -> IK.ItemKind -> Int
totalRange :: AspectRecord -> ItemKind -> Int
totalRange ar :: AspectRecord
ar itemKind :: ItemKind
itemKind = (Speed, Int) -> Int
forall a b. (a, b) -> b
snd ((Speed, Int) -> Int) -> (Speed, Int) -> Int
forall a b. (a -> b) -> a -> b
$ ([Vector], (Speed, Int)) -> (Speed, Int)
forall a b. (a, b) -> b
snd (([Vector], (Speed, Int)) -> (Speed, Int))
-> ([Vector], (Speed, Int)) -> (Speed, Int)
forall a b. (a -> b) -> a -> b
$ AspectRecord -> ItemKind -> [Point] -> ([Vector], (Speed, Int))
itemTrajectory AspectRecord
ar ItemKind
itemKind []
isHumanTrinket :: IK.ItemKind -> Bool
isHumanTrinket :: ItemKind -> Bool
isHumanTrinket itemKind :: ItemKind
itemKind =
Bool -> (Int -> Bool) -> Maybe Int -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0) (Maybe Int -> Bool) -> Maybe Int -> Bool
forall a b. (a -> b) -> a -> b
$ GroupName ItemKind -> [(GroupName ItemKind, Int)] -> Maybe Int
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup "valuable" ([(GroupName ItemKind, Int)] -> Maybe Int)
-> [(GroupName ItemKind, Int)] -> Maybe Int
forall a b. (a -> b) -> a -> b
$ ItemKind -> [(GroupName ItemKind, Int)]
IK.ifreq ItemKind
itemKind
goesIntoEqp :: AspectRecord -> Bool
goesIntoEqp :: AspectRecord -> Bool
goesIntoEqp ar :: AspectRecord
ar = Flag -> AspectRecord -> Bool
checkFlag Flag
Ability.Equipable AspectRecord
ar
Bool -> Bool -> Bool
|| Flag -> AspectRecord -> Bool
checkFlag Flag
Ability.Meleeable AspectRecord
ar
goesIntoInv :: AspectRecord -> Bool
goesIntoInv :: AspectRecord -> Bool
goesIntoInv ar :: AspectRecord
ar = Bool -> Bool
not (Flag -> AspectRecord -> Bool
checkFlag Flag
Ability.Precious AspectRecord
ar) Bool -> Bool -> Bool
&& Bool -> Bool
not (AspectRecord -> Bool
goesIntoEqp AspectRecord
ar)
goesIntoSha :: AspectRecord -> Bool
goesIntoSha :: AspectRecord -> Bool
goesIntoSha ar :: AspectRecord
ar = Flag -> AspectRecord -> Bool
checkFlag Flag
Ability.Precious AspectRecord
ar Bool -> Bool -> Bool
&& Bool -> Bool
not (AspectRecord -> Bool
goesIntoEqp AspectRecord
ar)
loreFromMode :: ItemDialogMode -> SLore
loreFromMode :: ItemDialogMode -> SLore
loreFromMode c :: ItemDialogMode
c = case ItemDialogMode
c of
MStore COrgan -> SLore
SOrgan
MStore _ -> SLore
SItem
MOrgans -> SLore
forall a. (?callStack::CallStack) => a
undefined
MOwned -> SLore
SItem
MSkills -> SLore
forall a. (?callStack::CallStack) => a
undefined
MLore slore :: SLore
slore -> SLore
slore
MPlaces -> SLore
forall a. (?callStack::CallStack) => a
undefined
loreFromContainer :: AspectRecord -> Container -> SLore
loreFromContainer :: AspectRecord -> Container -> SLore
loreFromContainer arItem :: AspectRecord
arItem c :: Container
c = case Container
c of
CFloor{} -> SLore
SItem
CEmbed{} -> SLore
SEmbed
CActor _ store :: CStore
store -> if | Flag -> AspectRecord -> Bool
checkFlag Flag
Ability.Blast AspectRecord
arItem -> SLore
SBlast
| Flag -> AspectRecord -> Bool
checkFlag Flag
Ability.Condition AspectRecord
arItem -> SLore
SCondition
| Bool
otherwise -> ItemDialogMode -> SLore
loreFromMode (ItemDialogMode -> SLore) -> ItemDialogMode -> SLore
forall a b. (a -> b) -> a -> b
$ CStore -> ItemDialogMode
MStore CStore
store
CTrunk{} -> if Flag -> AspectRecord -> Bool
checkFlag Flag
Ability.Blast AspectRecord
arItem then SLore
SBlast else SLore
STrunk