maleghast-engine/src/Units/Components.hs

84 lines
2.3 KiB
Haskell

module Units.Components
( AttackT(..)
, ProtoEffect
, anyTarget
, buildAttack
, SelfAbilityT(..)
, mkSelfAbility
, inflictTokens
, push
, pull
, inflictStatusEffect
)
where
import GameModel
( Attack(..)
, BoardState
, CharacterIdentifier
, Choice
, DamageType
, Effect(..)
, mkChoice, Token, forcedMove, ForcedMoveType (..), owner, StatusEffect
)
import Numeric.Natural (Natural)
-------------------------
-- Attacks & Abilities --
-------------------------
data AttackT = AttackT
{ tName :: String
, tRange :: (Natural, Natural)
, tValidTargets :: BoardState -> CharacterIdentifier -> Bool
, tMelee :: Bool
, tDamageType :: DamageType
, tDamageAmount :: Natural
, tHeadshotEffects :: [ProtoEffect]
, tStandardEffects :: [ProtoEffect]
}
anyTarget :: BoardState -> CharacterIdentifier -> Bool
anyTarget = const $ const True
buildAttack :: AttackT -> CharacterIdentifier -> Choice
buildAttack (AttackT {..}) attacker = mkChoice tName [targetEffect]
where
attackDetails target = Attack
((sequence $ sequence tHeadshotEffects attacker) target)
tMelee
((sequence $ sequence tStandardEffects attacker) target)
tDamageType
tDamageAmount
attackEffect target = [ResolveAttack attacker (attackDetails target) target]
targetEffect = Target attacker tRange tValidTargets attackEffect
data SelfAbilityT = SelfAbilityT
{ tName :: String
, tEffects :: [ProtoEffect]
}
mkSelfAbility :: SelfAbilityT -> CharacterIdentifier -> Choice
mkSelfAbility (SelfAbilityT {..}) cid = mkChoice tName (sequence (sequence tEffects cid) cid)
-----------------------------
--------- Effects -----------
-----------------------------
type ProtoEffect = CharacterIdentifier -> CharacterIdentifier -> Effect
inflictStatusEffect :: StatusEffect -> ProtoEffect
inflictStatusEffect se _ = InflictStatusEffect se
inflictTokens :: Num n => Token n -> n -> ProtoEffect
inflictTokens tokenType tokenCount _ = InflictTokens tokenType tokenCount
genericShift :: ForcedMoveType -> Natural -> ProtoEffect
genericShift fmType amount puller = forcedMove fmType amount (owner puller) (Left puller)
push :: Natural -> ProtoEffect
push = genericShift Push
pull :: Natural -> ProtoEffect
pull = genericShift Pull