module Dovin.Builder (
addCard
, addAura
, addArtifact
, addCreature
, addEnchantment
, addInstant
, addLand
, addLands
, addPlaneswalker
, addSorcery
, as
, withAttribute
, withAttributes
, withEffect
, withLocation
, withPlusOneCounters
) where
import Control.Monad.Reader (ask, local)
import qualified Data.HashMap.Strict as M
import qualified Data.Set as S
import Dovin.Attributes
import Dovin.Prelude
import Dovin.Types
addCard :: CardName -> GameMonad ()
addCard name = do
card <- use $ cards . at name
case card of
Just _ -> throwError $ "Card should be removed: " <> name
Nothing -> do
template <- view envTemplate
modifying cards (M.insert name (BaseCard $ set cardName name template))
addAura :: CardName -> GameMonad ()
addAura name = withAttribute aura $ addEnchantment name
addArtifact :: CardName -> GameMonad ()
addArtifact name = withAttribute artifact $ addEnchantment name
addCreature :: (Int, Int) -> CardName -> GameMonad ()
addCreature strength name = local (set (envTemplate . cardStrength) $ mkStrength strength)
$ withAttribute creature
$ addCard name
addPlaneswalker :: Int -> CardName -> GameMonad ()
addPlaneswalker loyalty name = local (set (envTemplate . cardLoyalty) loyalty)
$ withAttribute planeswalker
$ addCard name
addEnchantment :: CardName -> GameMonad ()
addEnchantment name = withAttribute enchantment $ addCard name
addInstant :: CardName -> GameMonad ()
addInstant name = withAttribute instant $ addCard name
addLand :: CardName -> GameMonad ()
addLand name = withAttribute land $ addCard name
addLands :: Int -> CardName -> GameMonad ()
addLands n name = withAttribute land $
forM_ [1..n] $ \n -> addCard (numbered n name)
addSorcery :: CardName -> GameMonad ()
addSorcery name = withAttribute sorcery $ addCard name
as :: Player -> GameMonad () -> GameMonad ()
as player = local (set envActor player)
withAttribute :: String -> GameMonad () -> GameMonad ()
withAttribute attr = withAttributes [attr]
withAttributes :: [String] -> GameMonad () -> GameMonad ()
withAttributes attrs =
let f = S.union . S.fromList $ attrs in
local (over (envTemplate . cardAttributes) f
. over (envTemplate . cardDefaultAttributes) f)
withEffect ::
CardMatcher
-> (Card -> CardMatcher)
-> (Card -> GameMonad Card)
-> GameMonad ()
-> GameMonad ()
withEffect applyCondition filter action =
local (over (envTemplate . cardEffects) (mkEffect applyCondition filter action:))
withLocation :: Location -> GameMonad () -> GameMonad ()
withLocation loc m = do
p <- view envActor
local (set (envTemplate . cardLocation) (p, loc)) m
withPlusOneCounters :: Int -> GameMonad () -> GameMonad ()
withPlusOneCounters = local . set (envTemplate . cardPlusOneCounters)