{-# LANGUAGE DeriveGeneric, GeneralizedNewtypeDeriving #-}
module Game.LambdaHack.Definition.Ability
( Skill(..), Skills, Flag(..), Flags(..), Tactic(..), EqpSlot(..)
, getSk, addSk, checkFl, skillsToList
, zeroSkills, addSkills, sumScaledSkills
, nameTactic, describeTactic, tacticSkills
, blockOnly, meleeAdjacent, meleeAndRanged, ignoreItems
#ifdef EXPOSE_INTERNAL
, compactSkills, scaleSkills
#endif
) where
import Prelude ()
import Game.LambdaHack.Core.Prelude
import Data.Binary
import qualified Data.EnumMap.Strict as EM
import qualified Data.EnumSet as ES
import Data.Hashable (Hashable)
import GHC.Generics (Generic)
data Skill =
SkMove
| SkMelee
| SkDisplace
| SkAlter
| SkWait
| SkMoveItem
| SkProject
| SkApply
| SkSwimming
| SkFlying
| SkHurtMelee
| SkArmorMelee
| SkArmorRanged
| SkMaxHP
| SkMaxCalm
| SkSpeed
| SkSight
| SkSmell
| SkShine
| SkNocto
| SkHearing
| SkAggression
| SkOdor
deriving (Int -> Skill -> ShowS
[Skill] -> ShowS
Skill -> String
(Int -> Skill -> ShowS)
-> (Skill -> String) -> ([Skill] -> ShowS) -> Show Skill
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Skill] -> ShowS
$cshowList :: [Skill] -> ShowS
show :: Skill -> String
$cshow :: Skill -> String
showsPrec :: Int -> Skill -> ShowS
$cshowsPrec :: Int -> Skill -> ShowS
Show, Skill -> Skill -> Bool
(Skill -> Skill -> Bool) -> (Skill -> Skill -> Bool) -> Eq Skill
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Skill -> Skill -> Bool
$c/= :: Skill -> Skill -> Bool
== :: Skill -> Skill -> Bool
$c== :: Skill -> Skill -> Bool
Eq, Eq Skill
Eq Skill =>
(Skill -> Skill -> Ordering)
-> (Skill -> Skill -> Bool)
-> (Skill -> Skill -> Bool)
-> (Skill -> Skill -> Bool)
-> (Skill -> Skill -> Bool)
-> (Skill -> Skill -> Skill)
-> (Skill -> Skill -> Skill)
-> Ord Skill
Skill -> Skill -> Bool
Skill -> Skill -> Ordering
Skill -> Skill -> Skill
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 :: Skill -> Skill -> Skill
$cmin :: Skill -> Skill -> Skill
max :: Skill -> Skill -> Skill
$cmax :: Skill -> Skill -> Skill
>= :: Skill -> Skill -> Bool
$c>= :: Skill -> Skill -> Bool
> :: Skill -> Skill -> Bool
$c> :: Skill -> Skill -> Bool
<= :: Skill -> Skill -> Bool
$c<= :: Skill -> Skill -> Bool
< :: Skill -> Skill -> Bool
$c< :: Skill -> Skill -> Bool
compare :: Skill -> Skill -> Ordering
$ccompare :: Skill -> Skill -> Ordering
$cp1Ord :: Eq Skill
Ord, (forall x. Skill -> Rep Skill x)
-> (forall x. Rep Skill x -> Skill) -> Generic Skill
forall x. Rep Skill x -> Skill
forall x. Skill -> Rep Skill x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Skill x -> Skill
$cfrom :: forall x. Skill -> Rep Skill x
Generic, Int -> Skill
Skill -> Int
Skill -> [Skill]
Skill -> Skill
Skill -> Skill -> [Skill]
Skill -> Skill -> Skill -> [Skill]
(Skill -> Skill)
-> (Skill -> Skill)
-> (Int -> Skill)
-> (Skill -> Int)
-> (Skill -> [Skill])
-> (Skill -> Skill -> [Skill])
-> (Skill -> Skill -> [Skill])
-> (Skill -> Skill -> Skill -> [Skill])
-> Enum Skill
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Skill -> Skill -> Skill -> [Skill]
$cenumFromThenTo :: Skill -> Skill -> Skill -> [Skill]
enumFromTo :: Skill -> Skill -> [Skill]
$cenumFromTo :: Skill -> Skill -> [Skill]
enumFromThen :: Skill -> Skill -> [Skill]
$cenumFromThen :: Skill -> Skill -> [Skill]
enumFrom :: Skill -> [Skill]
$cenumFrom :: Skill -> [Skill]
fromEnum :: Skill -> Int
$cfromEnum :: Skill -> Int
toEnum :: Int -> Skill
$ctoEnum :: Int -> Skill
pred :: Skill -> Skill
$cpred :: Skill -> Skill
succ :: Skill -> Skill
$csucc :: Skill -> Skill
Enum, Skill
Skill -> Skill -> Bounded Skill
forall a. a -> a -> Bounded a
maxBound :: Skill
$cmaxBound :: Skill
minBound :: Skill
$cminBound :: Skill
Bounded)
newtype Skills = Skills {Skills -> EnumMap Skill Int
skills :: EM.EnumMap Skill Int}
deriving (Int -> Skills -> ShowS
[Skills] -> ShowS
Skills -> String
(Int -> Skills -> ShowS)
-> (Skills -> String) -> ([Skills] -> ShowS) -> Show Skills
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Skills] -> ShowS
$cshowList :: [Skills] -> ShowS
show :: Skills -> String
$cshow :: Skills -> String
showsPrec :: Int -> Skills -> ShowS
$cshowsPrec :: Int -> Skills -> ShowS
Show, Skills -> Skills -> Bool
(Skills -> Skills -> Bool)
-> (Skills -> Skills -> Bool) -> Eq Skills
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Skills -> Skills -> Bool
$c/= :: Skills -> Skills -> Bool
== :: Skills -> Skills -> Bool
$c== :: Skills -> Skills -> Bool
Eq, Eq Skills
Eq Skills =>
(Skills -> Skills -> Ordering)
-> (Skills -> Skills -> Bool)
-> (Skills -> Skills -> Bool)
-> (Skills -> Skills -> Bool)
-> (Skills -> Skills -> Bool)
-> (Skills -> Skills -> Skills)
-> (Skills -> Skills -> Skills)
-> Ord Skills
Skills -> Skills -> Bool
Skills -> Skills -> Ordering
Skills -> Skills -> Skills
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 :: Skills -> Skills -> Skills
$cmin :: Skills -> Skills -> Skills
max :: Skills -> Skills -> Skills
$cmax :: Skills -> Skills -> Skills
>= :: Skills -> Skills -> Bool
$c>= :: Skills -> Skills -> Bool
> :: Skills -> Skills -> Bool
$c> :: Skills -> Skills -> Bool
<= :: Skills -> Skills -> Bool
$c<= :: Skills -> Skills -> Bool
< :: Skills -> Skills -> Bool
$c< :: Skills -> Skills -> Bool
compare :: Skills -> Skills -> Ordering
$ccompare :: Skills -> Skills -> Ordering
$cp1Ord :: Eq Skills
Ord, (forall x. Skills -> Rep Skills x)
-> (forall x. Rep Skills x -> Skills) -> Generic Skills
forall x. Rep Skills x -> Skills
forall x. Skills -> Rep Skills x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Skills x -> Skills
$cfrom :: forall x. Skills -> Rep Skills x
Generic, Int -> Skills -> Int
Skills -> Int
(Int -> Skills -> Int) -> (Skills -> Int) -> Hashable Skills
forall a. (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: Skills -> Int
$chash :: Skills -> Int
hashWithSalt :: Int -> Skills -> Int
$chashWithSalt :: Int -> Skills -> Int
Hashable, Get Skills
[Skills] -> Put
Skills -> Put
(Skills -> Put) -> Get Skills -> ([Skills] -> Put) -> Binary Skills
forall t. (t -> Put) -> Get t -> ([t] -> Put) -> Binary t
putList :: [Skills] -> Put
$cputList :: [Skills] -> Put
get :: Get Skills
$cget :: Get Skills
put :: Skills -> Put
$cput :: Skills -> Put
Binary)
data Flag =
Fragile
| Lobable
| Durable
| Equipable
| Meleeable
| Precious
| Blast
| Condition
| Unique
| Periodic
| MinorEffects
deriving (Int -> Flag -> ShowS
[Flag] -> ShowS
Flag -> String
(Int -> Flag -> ShowS)
-> (Flag -> String) -> ([Flag] -> ShowS) -> Show Flag
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Flag] -> ShowS
$cshowList :: [Flag] -> ShowS
show :: Flag -> String
$cshow :: Flag -> String
showsPrec :: Int -> Flag -> ShowS
$cshowsPrec :: Int -> Flag -> ShowS
Show, Flag -> Flag -> Bool
(Flag -> Flag -> Bool) -> (Flag -> Flag -> Bool) -> Eq Flag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Flag -> Flag -> Bool
$c/= :: Flag -> Flag -> Bool
== :: Flag -> Flag -> Bool
$c== :: Flag -> Flag -> Bool
Eq, Eq Flag
Eq Flag =>
(Flag -> Flag -> Ordering)
-> (Flag -> Flag -> Bool)
-> (Flag -> Flag -> Bool)
-> (Flag -> Flag -> Bool)
-> (Flag -> Flag -> Bool)
-> (Flag -> Flag -> Flag)
-> (Flag -> Flag -> Flag)
-> Ord Flag
Flag -> Flag -> Bool
Flag -> Flag -> Ordering
Flag -> Flag -> Flag
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 :: Flag -> Flag -> Flag
$cmin :: Flag -> Flag -> Flag
max :: Flag -> Flag -> Flag
$cmax :: Flag -> Flag -> Flag
>= :: Flag -> Flag -> Bool
$c>= :: Flag -> Flag -> Bool
> :: Flag -> Flag -> Bool
$c> :: Flag -> Flag -> Bool
<= :: Flag -> Flag -> Bool
$c<= :: Flag -> Flag -> Bool
< :: Flag -> Flag -> Bool
$c< :: Flag -> Flag -> Bool
compare :: Flag -> Flag -> Ordering
$ccompare :: Flag -> Flag -> Ordering
$cp1Ord :: Eq Flag
Ord, (forall x. Flag -> Rep Flag x)
-> (forall x. Rep Flag x -> Flag) -> Generic Flag
forall x. Rep Flag x -> Flag
forall x. Flag -> Rep Flag x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Flag x -> Flag
$cfrom :: forall x. Flag -> Rep Flag x
Generic, Int -> Flag
Flag -> Int
Flag -> [Flag]
Flag -> Flag
Flag -> Flag -> [Flag]
Flag -> Flag -> Flag -> [Flag]
(Flag -> Flag)
-> (Flag -> Flag)
-> (Int -> Flag)
-> (Flag -> Int)
-> (Flag -> [Flag])
-> (Flag -> Flag -> [Flag])
-> (Flag -> Flag -> [Flag])
-> (Flag -> Flag -> Flag -> [Flag])
-> Enum Flag
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Flag -> Flag -> Flag -> [Flag]
$cenumFromThenTo :: Flag -> Flag -> Flag -> [Flag]
enumFromTo :: Flag -> Flag -> [Flag]
$cenumFromTo :: Flag -> Flag -> [Flag]
enumFromThen :: Flag -> Flag -> [Flag]
$cenumFromThen :: Flag -> Flag -> [Flag]
enumFrom :: Flag -> [Flag]
$cenumFrom :: Flag -> [Flag]
fromEnum :: Flag -> Int
$cfromEnum :: Flag -> Int
toEnum :: Int -> Flag
$ctoEnum :: Int -> Flag
pred :: Flag -> Flag
$cpred :: Flag -> Flag
succ :: Flag -> Flag
$csucc :: Flag -> Flag
Enum, Flag
Flag -> Flag -> Bounded Flag
forall a. a -> a -> Bounded a
maxBound :: Flag
$cmaxBound :: Flag
minBound :: Flag
$cminBound :: Flag
Bounded)
newtype Flags = Flags {Flags -> EnumSet Flag
flags :: ES.EnumSet Flag}
deriving (Int -> Flags -> ShowS
[Flags] -> ShowS
Flags -> String
(Int -> Flags -> ShowS)
-> (Flags -> String) -> ([Flags] -> ShowS) -> Show Flags
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Flags] -> ShowS
$cshowList :: [Flags] -> ShowS
show :: Flags -> String
$cshow :: Flags -> String
showsPrec :: Int -> Flags -> ShowS
$cshowsPrec :: Int -> Flags -> ShowS
Show, Flags -> Flags -> Bool
(Flags -> Flags -> Bool) -> (Flags -> Flags -> Bool) -> Eq Flags
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Flags -> Flags -> Bool
$c/= :: Flags -> Flags -> Bool
== :: Flags -> Flags -> Bool
$c== :: Flags -> Flags -> Bool
Eq, Eq Flags
Eq Flags =>
(Flags -> Flags -> Ordering)
-> (Flags -> Flags -> Bool)
-> (Flags -> Flags -> Bool)
-> (Flags -> Flags -> Bool)
-> (Flags -> Flags -> Bool)
-> (Flags -> Flags -> Flags)
-> (Flags -> Flags -> Flags)
-> Ord Flags
Flags -> Flags -> Bool
Flags -> Flags -> Ordering
Flags -> Flags -> Flags
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 :: Flags -> Flags -> Flags
$cmin :: Flags -> Flags -> Flags
max :: Flags -> Flags -> Flags
$cmax :: Flags -> Flags -> Flags
>= :: Flags -> Flags -> Bool
$c>= :: Flags -> Flags -> Bool
> :: Flags -> Flags -> Bool
$c> :: Flags -> Flags -> Bool
<= :: Flags -> Flags -> Bool
$c<= :: Flags -> Flags -> Bool
< :: Flags -> Flags -> Bool
$c< :: Flags -> Flags -> Bool
compare :: Flags -> Flags -> Ordering
$ccompare :: Flags -> Flags -> Ordering
$cp1Ord :: Eq Flags
Ord, (forall x. Flags -> Rep Flags x)
-> (forall x. Rep Flags x -> Flags) -> Generic Flags
forall x. Rep Flags x -> Flags
forall x. Flags -> Rep Flags x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Flags x -> Flags
$cfrom :: forall x. Flags -> Rep Flags x
Generic, Int -> Flags -> Int
Flags -> Int
(Int -> Flags -> Int) -> (Flags -> Int) -> Hashable Flags
forall a. (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: Flags -> Int
$chash :: Flags -> Int
hashWithSalt :: Int -> Flags -> Int
$chashWithSalt :: Int -> Flags -> Int
Hashable, Get Flags
[Flags] -> Put
Flags -> Put
(Flags -> Put) -> Get Flags -> ([Flags] -> Put) -> Binary Flags
forall t. (t -> Put) -> Get t -> ([t] -> Put) -> Binary t
putList :: [Flags] -> Put
$cputList :: [Flags] -> Put
get :: Get Flags
$cget :: Get Flags
put :: Flags -> Put
$cput :: Flags -> Put
Binary)
data Tactic =
TExplore
| TFollow
| TFollowNoItems
| TMeleeAndRanged
| TMeleeAdjacent
| TBlock
| TRoam
| TPatrol
deriving (Int -> Tactic -> ShowS
[Tactic] -> ShowS
Tactic -> String
(Int -> Tactic -> ShowS)
-> (Tactic -> String) -> ([Tactic] -> ShowS) -> Show Tactic
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Tactic] -> ShowS
$cshowList :: [Tactic] -> ShowS
show :: Tactic -> String
$cshow :: Tactic -> String
showsPrec :: Int -> Tactic -> ShowS
$cshowsPrec :: Int -> Tactic -> ShowS
Show, Tactic -> Tactic -> Bool
(Tactic -> Tactic -> Bool)
-> (Tactic -> Tactic -> Bool) -> Eq Tactic
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Tactic -> Tactic -> Bool
$c/= :: Tactic -> Tactic -> Bool
== :: Tactic -> Tactic -> Bool
$c== :: Tactic -> Tactic -> Bool
Eq, Eq Tactic
Eq Tactic =>
(Tactic -> Tactic -> Ordering)
-> (Tactic -> Tactic -> Bool)
-> (Tactic -> Tactic -> Bool)
-> (Tactic -> Tactic -> Bool)
-> (Tactic -> Tactic -> Bool)
-> (Tactic -> Tactic -> Tactic)
-> (Tactic -> Tactic -> Tactic)
-> Ord Tactic
Tactic -> Tactic -> Bool
Tactic -> Tactic -> Ordering
Tactic -> Tactic -> Tactic
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 :: Tactic -> Tactic -> Tactic
$cmin :: Tactic -> Tactic -> Tactic
max :: Tactic -> Tactic -> Tactic
$cmax :: Tactic -> Tactic -> Tactic
>= :: Tactic -> Tactic -> Bool
$c>= :: Tactic -> Tactic -> Bool
> :: Tactic -> Tactic -> Bool
$c> :: Tactic -> Tactic -> Bool
<= :: Tactic -> Tactic -> Bool
$c<= :: Tactic -> Tactic -> Bool
< :: Tactic -> Tactic -> Bool
$c< :: Tactic -> Tactic -> Bool
compare :: Tactic -> Tactic -> Ordering
$ccompare :: Tactic -> Tactic -> Ordering
$cp1Ord :: Eq Tactic
Ord, Int -> Tactic
Tactic -> Int
Tactic -> [Tactic]
Tactic -> Tactic
Tactic -> Tactic -> [Tactic]
Tactic -> Tactic -> Tactic -> [Tactic]
(Tactic -> Tactic)
-> (Tactic -> Tactic)
-> (Int -> Tactic)
-> (Tactic -> Int)
-> (Tactic -> [Tactic])
-> (Tactic -> Tactic -> [Tactic])
-> (Tactic -> Tactic -> [Tactic])
-> (Tactic -> Tactic -> Tactic -> [Tactic])
-> Enum Tactic
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Tactic -> Tactic -> Tactic -> [Tactic]
$cenumFromThenTo :: Tactic -> Tactic -> Tactic -> [Tactic]
enumFromTo :: Tactic -> Tactic -> [Tactic]
$cenumFromTo :: Tactic -> Tactic -> [Tactic]
enumFromThen :: Tactic -> Tactic -> [Tactic]
$cenumFromThen :: Tactic -> Tactic -> [Tactic]
enumFrom :: Tactic -> [Tactic]
$cenumFrom :: Tactic -> [Tactic]
fromEnum :: Tactic -> Int
$cfromEnum :: Tactic -> Int
toEnum :: Int -> Tactic
$ctoEnum :: Int -> Tactic
pred :: Tactic -> Tactic
$cpred :: Tactic -> Tactic
succ :: Tactic -> Tactic
$csucc :: Tactic -> Tactic
Enum, Tactic
Tactic -> Tactic -> Bounded Tactic
forall a. a -> a -> Bounded a
maxBound :: Tactic
$cmaxBound :: Tactic
minBound :: Tactic
$cminBound :: Tactic
Bounded, (forall x. Tactic -> Rep Tactic x)
-> (forall x. Rep Tactic x -> Tactic) -> Generic Tactic
forall x. Rep Tactic x -> Tactic
forall x. Tactic -> Rep Tactic x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Tactic x -> Tactic
$cfrom :: forall x. Tactic -> Rep Tactic x
Generic)
instance Binary Tactic
instance Hashable Tactic
data EqpSlot =
EqpSlotMove
| EqpSlotMelee
| EqpSlotDisplace
| EqpSlotAlter
| EqpSlotWait
| EqpSlotMoveItem
| EqpSlotProject
| EqpSlotApply
| EqpSlotSwimming
| EqpSlotFlying
| EqpSlotHurtMelee
| EqpSlotArmorMelee
| EqpSlotArmorRanged
| EqpSlotMaxHP
| EqpSlotSpeed
| EqpSlotSight
| EqpSlotShine
| EqpSlotMiscBonus
| EqpSlotWeaponFast
| EqpSlotWeaponBig
deriving (Int -> EqpSlot -> ShowS
[EqpSlot] -> ShowS
EqpSlot -> String
(Int -> EqpSlot -> ShowS)
-> (EqpSlot -> String) -> ([EqpSlot] -> ShowS) -> Show EqpSlot
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EqpSlot] -> ShowS
$cshowList :: [EqpSlot] -> ShowS
show :: EqpSlot -> String
$cshow :: EqpSlot -> String
showsPrec :: Int -> EqpSlot -> ShowS
$cshowsPrec :: Int -> EqpSlot -> ShowS
Show, EqpSlot -> EqpSlot -> Bool
(EqpSlot -> EqpSlot -> Bool)
-> (EqpSlot -> EqpSlot -> Bool) -> Eq EqpSlot
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EqpSlot -> EqpSlot -> Bool
$c/= :: EqpSlot -> EqpSlot -> Bool
== :: EqpSlot -> EqpSlot -> Bool
$c== :: EqpSlot -> EqpSlot -> Bool
Eq, Eq EqpSlot
Eq EqpSlot =>
(EqpSlot -> EqpSlot -> Ordering)
-> (EqpSlot -> EqpSlot -> Bool)
-> (EqpSlot -> EqpSlot -> Bool)
-> (EqpSlot -> EqpSlot -> Bool)
-> (EqpSlot -> EqpSlot -> Bool)
-> (EqpSlot -> EqpSlot -> EqpSlot)
-> (EqpSlot -> EqpSlot -> EqpSlot)
-> Ord EqpSlot
EqpSlot -> EqpSlot -> Bool
EqpSlot -> EqpSlot -> Ordering
EqpSlot -> EqpSlot -> EqpSlot
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 :: EqpSlot -> EqpSlot -> EqpSlot
$cmin :: EqpSlot -> EqpSlot -> EqpSlot
max :: EqpSlot -> EqpSlot -> EqpSlot
$cmax :: EqpSlot -> EqpSlot -> EqpSlot
>= :: EqpSlot -> EqpSlot -> Bool
$c>= :: EqpSlot -> EqpSlot -> Bool
> :: EqpSlot -> EqpSlot -> Bool
$c> :: EqpSlot -> EqpSlot -> Bool
<= :: EqpSlot -> EqpSlot -> Bool
$c<= :: EqpSlot -> EqpSlot -> Bool
< :: EqpSlot -> EqpSlot -> Bool
$c< :: EqpSlot -> EqpSlot -> Bool
compare :: EqpSlot -> EqpSlot -> Ordering
$ccompare :: EqpSlot -> EqpSlot -> Ordering
$cp1Ord :: Eq EqpSlot
Ord, Int -> EqpSlot
EqpSlot -> Int
EqpSlot -> [EqpSlot]
EqpSlot -> EqpSlot
EqpSlot -> EqpSlot -> [EqpSlot]
EqpSlot -> EqpSlot -> EqpSlot -> [EqpSlot]
(EqpSlot -> EqpSlot)
-> (EqpSlot -> EqpSlot)
-> (Int -> EqpSlot)
-> (EqpSlot -> Int)
-> (EqpSlot -> [EqpSlot])
-> (EqpSlot -> EqpSlot -> [EqpSlot])
-> (EqpSlot -> EqpSlot -> [EqpSlot])
-> (EqpSlot -> EqpSlot -> EqpSlot -> [EqpSlot])
-> Enum EqpSlot
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: EqpSlot -> EqpSlot -> EqpSlot -> [EqpSlot]
$cenumFromThenTo :: EqpSlot -> EqpSlot -> EqpSlot -> [EqpSlot]
enumFromTo :: EqpSlot -> EqpSlot -> [EqpSlot]
$cenumFromTo :: EqpSlot -> EqpSlot -> [EqpSlot]
enumFromThen :: EqpSlot -> EqpSlot -> [EqpSlot]
$cenumFromThen :: EqpSlot -> EqpSlot -> [EqpSlot]
enumFrom :: EqpSlot -> [EqpSlot]
$cenumFrom :: EqpSlot -> [EqpSlot]
fromEnum :: EqpSlot -> Int
$cfromEnum :: EqpSlot -> Int
toEnum :: Int -> EqpSlot
$ctoEnum :: Int -> EqpSlot
pred :: EqpSlot -> EqpSlot
$cpred :: EqpSlot -> EqpSlot
succ :: EqpSlot -> EqpSlot
$csucc :: EqpSlot -> EqpSlot
Enum, EqpSlot
EqpSlot -> EqpSlot -> Bounded EqpSlot
forall a. a -> a -> Bounded a
maxBound :: EqpSlot
$cmaxBound :: EqpSlot
minBound :: EqpSlot
$cminBound :: EqpSlot
Bounded, (forall x. EqpSlot -> Rep EqpSlot x)
-> (forall x. Rep EqpSlot x -> EqpSlot) -> Generic EqpSlot
forall x. Rep EqpSlot x -> EqpSlot
forall x. EqpSlot -> Rep EqpSlot x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep EqpSlot x -> EqpSlot
$cfrom :: forall x. EqpSlot -> Rep EqpSlot x
Generic)
instance Binary Skill where
put :: Skill -> Put
put = Word8 -> Put
putWord8 (Word8 -> Put) -> (Skill -> Word8) -> Skill -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Word8
forall a. Enum a => Int -> a
toEnum (Int -> Word8) -> (Skill -> Int) -> Skill -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Skill -> Int
forall a. Enum a => a -> Int
fromEnum
get :: Get Skill
get = (Word8 -> Skill) -> Get Word8 -> Get Skill
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Skill
forall a. Enum a => Int -> a
toEnum (Int -> Skill) -> (Word8 -> Int) -> Word8 -> Skill
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Int
forall a. Enum a => a -> Int
fromEnum) Get Word8
getWord8
instance Binary Flag where
put :: Flag -> Put
put = Word8 -> Put
putWord8 (Word8 -> Put) -> (Flag -> Word8) -> Flag -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Word8
forall a. Enum a => Int -> a
toEnum (Int -> Word8) -> (Flag -> Int) -> Flag -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Flag -> Int
forall a. Enum a => a -> Int
fromEnum
get :: Get Flag
get = (Word8 -> Flag) -> Get Word8 -> Get Flag
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Flag
forall a. Enum a => Int -> a
toEnum (Int -> Flag) -> (Word8 -> Int) -> Word8 -> Flag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Int
forall a. Enum a => a -> Int
fromEnum) Get Word8
getWord8
instance Binary EqpSlot where
put :: EqpSlot -> Put
put = Word8 -> Put
putWord8 (Word8 -> Put) -> (EqpSlot -> Word8) -> EqpSlot -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Word8
forall a. Enum a => Int -> a
toEnum (Int -> Word8) -> (EqpSlot -> Int) -> EqpSlot -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EqpSlot -> Int
forall a. Enum a => a -> Int
fromEnum
get :: Get EqpSlot
get = (Word8 -> EqpSlot) -> Get Word8 -> Get EqpSlot
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> EqpSlot
forall a. Enum a => Int -> a
toEnum (Int -> EqpSlot) -> (Word8 -> Int) -> Word8 -> EqpSlot
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Int
forall a. Enum a => a -> Int
fromEnum) Get Word8
getWord8
instance Hashable Skill
instance Hashable Flag
instance Hashable EqpSlot
getSk :: Skill -> Skills -> Int
{-# INLINE getSk #-}
getSk :: Skill -> Skills -> Int
getSk sk :: Skill
sk (Skills skills :: EnumMap Skill Int
skills) = Int -> Skill -> EnumMap Skill Int -> Int
forall k a. Enum k => a -> k -> EnumMap k a -> a
EM.findWithDefault 0 Skill
sk EnumMap Skill Int
skills
addSk :: Skill -> Int -> Skills -> Skills
addSk :: Skill -> Int -> Skills -> Skills
addSk sk :: Skill
sk n :: Int
n = Skills -> Skills -> Skills
addSkills (EnumMap Skill Int -> Skills
Skills (EnumMap Skill Int -> Skills) -> EnumMap Skill Int -> Skills
forall a b. (a -> b) -> a -> b
$ Skill -> Int -> EnumMap Skill Int
forall k a. Enum k => k -> a -> EnumMap k a
EM.singleton Skill
sk Int
n)
checkFl :: Flag -> Flags -> Bool
{-# INLINE checkFl #-}
checkFl :: Flag -> Flags -> Bool
checkFl flag :: Flag
flag (Flags flags :: EnumSet Flag
flags) = Flag
flag Flag -> EnumSet Flag -> Bool
forall k. Enum k => k -> EnumSet k -> Bool
`ES.member` EnumSet Flag
flags
skillsToList :: Skills -> [(Skill, Int)]
skillsToList :: Skills -> [(Skill, Int)]
skillsToList (Skills sk :: EnumMap Skill Int
sk) = EnumMap Skill Int -> [(Skill, Int)]
forall k a. Enum k => EnumMap k a -> [(k, a)]
EM.assocs EnumMap Skill Int
sk
zeroSkills :: Skills
zeroSkills :: Skills
zeroSkills = EnumMap Skill Int -> Skills
Skills EnumMap Skill Int
forall k a. EnumMap k a
EM.empty
compactSkills :: EM.EnumMap Skill Int -> EM.EnumMap Skill Int
compactSkills :: EnumMap Skill Int -> EnumMap Skill Int
compactSkills = (Int -> Bool) -> EnumMap Skill Int -> EnumMap Skill Int
forall a k. (a -> Bool) -> EnumMap k a -> EnumMap k a
EM.filter (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= 0)
addSkills :: Skills -> Skills -> Skills
addSkills :: Skills -> Skills -> Skills
addSkills (Skills sk1 :: EnumMap Skill Int
sk1) (Skills sk2 :: EnumMap Skill Int
sk2) =
EnumMap Skill Int -> Skills
Skills (EnumMap Skill Int -> Skills) -> EnumMap Skill Int -> Skills
forall a b. (a -> b) -> a -> b
$ EnumMap Skill Int -> EnumMap Skill Int
compactSkills (EnumMap Skill Int -> EnumMap Skill Int)
-> EnumMap Skill Int -> EnumMap Skill Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Int)
-> EnumMap Skill Int -> EnumMap Skill Int -> EnumMap Skill Int
forall a k.
(a -> a -> a) -> EnumMap k a -> EnumMap k a -> EnumMap k a
EM.unionWith Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) EnumMap Skill Int
sk1 EnumMap Skill Int
sk2
scaleSkills :: Int -> EM.EnumMap Skill Int -> EM.EnumMap Skill Int
scaleSkills :: Int -> EnumMap Skill Int -> EnumMap Skill Int
scaleSkills n :: Int
n = (Int -> Int) -> EnumMap Skill Int -> EnumMap Skill Int
forall a b k. (a -> b) -> EnumMap k a -> EnumMap k b
EM.map (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
*)
sumScaledSkills :: [(Skills, Int)] -> Skills
sumScaledSkills :: [(Skills, Int)] -> Skills
sumScaledSkills l :: [(Skills, Int)]
l = EnumMap Skill Int -> Skills
Skills (EnumMap Skill Int -> Skills) -> EnumMap Skill Int -> Skills
forall a b. (a -> b) -> a -> b
$ EnumMap Skill Int -> EnumMap Skill Int
compactSkills (EnumMap Skill Int -> EnumMap Skill Int)
-> EnumMap Skill Int -> EnumMap Skill Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Int) -> [EnumMap Skill Int] -> EnumMap Skill Int
forall a k. (a -> a -> a) -> [EnumMap k a] -> EnumMap k a
EM.unionsWith Int -> Int -> Int
forall a. Num a => a -> a -> a
(+)
([EnumMap Skill Int] -> EnumMap Skill Int)
-> [EnumMap Skill Int] -> EnumMap Skill Int
forall a b. (a -> b) -> a -> b
$ ((Skills, Int) -> EnumMap Skill Int)
-> [(Skills, Int)] -> [EnumMap Skill Int]
forall a b. (a -> b) -> [a] -> [b]
map (\(Skills sk :: EnumMap Skill Int
sk, k :: Int
k) -> Int -> EnumMap Skill Int -> EnumMap Skill Int
scaleSkills Int
k EnumMap Skill Int
sk) [(Skills, Int)]
l
nameTactic :: Tactic -> Text
nameTactic :: Tactic -> Text
nameTactic TExplore = "explore"
nameTactic TFollow = "follow freely"
nameTactic TFollowNoItems = "follow only"
nameTactic TMeleeAndRanged = "fight only"
nameTactic TMeleeAdjacent = "melee only"
nameTactic TBlock = "block only"
nameTactic TRoam = "roam freely"
nameTactic TPatrol = "patrol area"
describeTactic :: Tactic -> Text
describeTactic :: Tactic -> Text
describeTactic TExplore = "investigate unknown positions, chase targets"
describeTactic TFollow = "follow leader's target or position, grab items"
describeTactic TFollowNoItems =
"follow leader's target or position, ignore items"
describeTactic TMeleeAndRanged =
"engage in both melee and ranged combat, don't move"
describeTactic TMeleeAdjacent = "engage exclusively in melee, don't move"
describeTactic TBlock = "block and wait, don't move"
describeTactic TRoam = "move freely, chase targets"
describeTactic TPatrol = "find and patrol an area (WIP)"
tacticSkills :: Tactic -> Skills
tacticSkills :: Tactic -> Skills
tacticSkills TExplore = Skills
zeroSkills
tacticSkills TFollow = Skills
zeroSkills
tacticSkills TFollowNoItems = Skills
ignoreItems
tacticSkills TMeleeAndRanged = Skills
meleeAndRanged
tacticSkills TMeleeAdjacent = Skills
meleeAdjacent
tacticSkills TBlock = Skills
blockOnly
tacticSkills TRoam = Skills
zeroSkills
tacticSkills TPatrol = Skills
zeroSkills
minusTen, blockOnly, meleeAdjacent, meleeAndRanged, ignoreItems :: Skills
minusTen :: Skills
minusTen = EnumMap Skill Int -> Skills
Skills (EnumMap Skill Int -> Skills) -> EnumMap Skill Int -> Skills
forall a b. (a -> b) -> a -> b
$ [(Skill, Int)] -> EnumMap Skill Int
forall k a. Enum k => [(k, a)] -> EnumMap k a
EM.fromDistinctAscList
([(Skill, Int)] -> EnumMap Skill Int)
-> [(Skill, Int)] -> EnumMap Skill Int
forall a b. (a -> b) -> a -> b
$ [Skill] -> [Int] -> [(Skill, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Skill
SkMove .. Skill
SkApply] (Int -> [Int]
forall a. a -> [a]
repeat (-10))
blockOnly :: Skills
blockOnly = EnumMap Skill Int -> Skills
Skills (EnumMap Skill Int -> Skills) -> EnumMap Skill Int -> Skills
forall a b. (a -> b) -> a -> b
$ Skill -> EnumMap Skill Int -> EnumMap Skill Int
forall k a. Enum k => k -> EnumMap k a -> EnumMap k a
EM.delete Skill
SkWait (EnumMap Skill Int -> EnumMap Skill Int)
-> EnumMap Skill Int -> EnumMap Skill Int
forall a b. (a -> b) -> a -> b
$ Skills -> EnumMap Skill Int
skills Skills
minusTen
meleeAdjacent :: Skills
meleeAdjacent = EnumMap Skill Int -> Skills
Skills (EnumMap Skill Int -> Skills) -> EnumMap Skill Int -> Skills
forall a b. (a -> b) -> a -> b
$ Skill -> EnumMap Skill Int -> EnumMap Skill Int
forall k a. Enum k => k -> EnumMap k a -> EnumMap k a
EM.delete Skill
SkMelee (EnumMap Skill Int -> EnumMap Skill Int)
-> EnumMap Skill Int -> EnumMap Skill Int
forall a b. (a -> b) -> a -> b
$ Skills -> EnumMap Skill Int
skills Skills
blockOnly
meleeAndRanged :: Skills
meleeAndRanged = EnumMap Skill Int -> Skills
Skills (EnumMap Skill Int -> Skills) -> EnumMap Skill Int -> Skills
forall a b. (a -> b) -> a -> b
$ Skill -> EnumMap Skill Int -> EnumMap Skill Int
forall k a. Enum k => k -> EnumMap k a -> EnumMap k a
EM.delete Skill
SkProject (EnumMap Skill Int -> EnumMap Skill Int)
-> EnumMap Skill Int -> EnumMap Skill Int
forall a b. (a -> b) -> a -> b
$ Skills -> EnumMap Skill Int
skills Skills
meleeAdjacent
ignoreItems :: Skills
ignoreItems = EnumMap Skill Int -> Skills
Skills (EnumMap Skill Int -> Skills) -> EnumMap Skill Int -> Skills
forall a b. (a -> b) -> a -> b
$ [(Skill, Int)] -> EnumMap Skill Int
forall k a. Enum k => [(k, a)] -> EnumMap k a
EM.fromList
([(Skill, Int)] -> EnumMap Skill Int)
-> [(Skill, Int)] -> EnumMap Skill Int
forall a b. (a -> b) -> a -> b
$ [Skill] -> [Int] -> [(Skill, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Skill
SkMoveItem, Skill
SkProject, Skill
SkApply] (Int -> [Int]
forall a. a -> [a]
repeat (-10))