module Solutions.Core19_9 where

import Dovin.V1
import Dovin.Prelude

spellCount :: [Char]
spellCount = [Char]
"spell-count"

-- Keeps track of number of spells cast, and if Aetherflux Reservoir is in play
-- triggers it.
castWithTriggers :: [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
castWithTriggers [Char]
cost [Char]
name = do
  ASetter Board Board Int Int
-> (Int -> Int)
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
modifying
    ((HashMap [Char] Int -> Identity (HashMap [Char] Int))
-> Board -> Identity Board
Lens' Board (HashMap [Char] Int)
counters ((HashMap [Char] Int -> Identity (HashMap [Char] Int))
 -> Board -> Identity Board)
-> ((Int -> Identity Int)
    -> HashMap [Char] Int -> Identity (HashMap [Char] Int))
-> ASetter Board Board Int Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (HashMap [Char] Int)
-> Lens'
     (HashMap [Char] Int) (Maybe (IxValue (HashMap [Char] Int)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at [Char]
Index (HashMap [Char] Int)
spellCount ((Maybe Int -> Identity (Maybe Int))
 -> HashMap [Char] Int -> Identity (HashMap [Char] Int))
-> ((Int -> Identity Int) -> Maybe Int -> Identity (Maybe Int))
-> (Int -> Identity Int)
-> HashMap [Char] Int
-> Identity (HashMap [Char] Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Iso' (Maybe Int) Int
forall a. Eq a => a -> Iso' (Maybe a) a
non Int
0)
    (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)

  CardMatcher
-> ([Char]
    -> ExceptT
         [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forCards
    (CardMatcher
matchInPlay CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
matchName [Char]
"Aetherflux Reservoir")
    (([Char]
  -> ExceptT
       [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ([Char]
    -> ExceptT
         [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. a -> b -> a
const (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> [Char]
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
      [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
trigger [Char]
"Aetherflux Reservoir"
      Int
x <- Getting Int Board Int
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (Getting Int Board Int
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int)
-> Getting Int Board Int
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
forall a b. (a -> b) -> a -> b
$ (HashMap [Char] Int -> Const Int (HashMap [Char] Int))
-> Board -> Const Int Board
Lens' Board (HashMap [Char] Int)
counters ((HashMap [Char] Int -> Const Int (HashMap [Char] Int))
 -> Board -> Const Int Board)
-> ((Int -> Const Int Int)
    -> HashMap [Char] Int -> Const Int (HashMap [Char] Int))
-> Getting Int Board Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (HashMap [Char] Int)
-> Lens'
     (HashMap [Char] Int) (Maybe (IxValue (HashMap [Char] Int)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at [Char]
Index (HashMap [Char] Int)
spellCount ((Maybe Int -> Const Int (Maybe Int))
 -> HashMap [Char] Int -> Const Int (HashMap [Char] Int))
-> ((Int -> Const Int Int) -> Maybe Int -> Const Int (Maybe Int))
-> (Int -> Const Int Int)
-> HashMap [Char] Int
-> Const Int (HashMap [Char] Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Iso' (Maybe Int) Int
forall a. Eq a => a -> Iso' (Maybe a) a
non Int
0
      Int
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
gainLife Int
x

  [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
cast [Char]
cost [Char]
name

solution :: GameMonad ()
solution :: ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
solution = do
  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Initial state" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    Player
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
as Player
Opponent (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ Int
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
setLife Int
50
    Int
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
setLife Int
1

    CardLocation
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
withLocation (Player
Active, Location
Play) (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
      Int
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addLands Int
3 [Char]
"Spirebluff Canal"
      [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addArtifact [Char]
"Cultivator's Caravan"
      [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addArtifact [Char]
"Powerstone Shard 1"
      [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addArtifact [Char]
"Powerstone Shard 2"
      [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addArtifact [Char]
"Mox Amber 1"
      (Int, Int)
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addCreature (Int
2, Int
2) [Char]
"Captain Lannery Storm"

    CardLocation
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
withLocation (Player
Active, Location
Hand) (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
      [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addArtifact [Char]
"Aetherflux Reservoir"
      [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addArtifact [Char]
"Mox Amber 2"
      [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addInstant [Char]
"Paradoxical Outcome"
      [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addArtifact [Char]
"Foundry Inspector"
      [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addInstant [Char]
"Abrade"

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Attack with Captain to get a Treasure, assume he's blocked and destroyed" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [[Char]]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
attackWith [[Char]
"Captain Lannery Storm"]
    CardLocation
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
withLocation (Player
Active, Location
Play) (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
withAttribute [Char]
token (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
addArtifact [Char]
"Treasure"

    [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
destroy [Char]
"Captain Lannery Storm"
    Phase
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
transitionTo Phase
SecondMain

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Cast Foundry Inspector, reducing cost of future artifacts" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"1" [Char]
"Treasure"
    [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
sacrifice [Char]
"Treasure"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"U" [Char]
"Spirebluff Canal 1"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"U" [Char]
"Spirebluff Canal 2"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
castWithTriggers [Char]
"3" [Char]
"Foundry Inspector" ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
resolveTop

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Cast Aetherflux Reservoir" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"2" [Char]
"Powerstone Shard 1"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"U" [Char]
"Spirebluff Canal 3"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
castWithTriggers [Char]
"3" [Char]
"Aetherflux Reservoir" ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
resolveTop

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Cast Mox Amber" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
castWithTriggers [Char]
"" [Char]
"Mox Amber 2" ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
resolveTop

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Tap Cultivator's Caravan, leave mana floating" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"U" [Char]
"Cultivator's Caravan"

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Cast Paradoxical Outcome for all artifacts and a tapped land" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"2" [Char]
"Powerstone Shard 2"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"U" [Char]
"Mox Amber 1"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"U" [Char]
"Mox Amber 2"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
castWithTriggers [Char]
"3U" [Char]
"Paradoxical Outcome" ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
resolveTop

    Location
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
moveTo Location
Hand [Char]
"Spirebluff Canal 1"
    Location
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
moveTo Location
Hand [Char]
"Powerstone Shard 1"
    Location
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
moveTo Location
Hand [Char]
"Powerstone Shard 2"
    Location
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
moveTo Location
Hand [Char]
"Mox Amber 1"
    Location
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
moveTo Location
Hand [Char]
"Mox Amber 2"
    Location
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
moveTo Location
Hand [Char]
"Cultivator's Caravan"

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Replay land and moxes" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    Location
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
moveTo Location
Play [Char]
"Spirebluff Canal 1"
    [Int]
-> (Int
    -> ExceptT
         [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Int
1..Int
2] ((Int
  -> ExceptT
       [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> (Int
    -> ExceptT
         [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ \Int
n -> do
      [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
castWithTriggers [Char]
"" (Int -> [Char] -> [Char]
numbered Int
n [Char]
"Mox Amber") ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
resolveTop

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Replay Powerstone Shard 1 with moxes" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"1" [Char]
"Mox Amber 1"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"1" [Char]
"Mox Amber 2"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
castWithTriggers [Char]
"2" [Char]
"Powerstone Shard 1" ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
resolveTop

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Replay Powerstone Shard 2 with floating mana and land" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"U" [Char]
"Spirebluff Canal 1"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
castWithTriggers [Char]
"2" [Char]
"Powerstone Shard 2" ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
resolveTop

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Replay Caravan" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"2" [Char]
"Powerstone Shard 1"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
castWithTriggers [Char]
"2" [Char]
"Cultivator's Caravan" ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
resolveTop

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Cast Abrade, target doesn't matter" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"R" [Char]
"Cultivator's Caravan"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
tapForMana [Char]
"2" [Char]
"Powerstone Shard 2"
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
castWithTriggers [Char]
"1R" [Char]
"Abrade" ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
resolveTop

  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Activate Aetherflux Reservoir, targeting opponent" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
forall a b. (a -> b) -> a -> b
$ do
    [Char]
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
activate [Char]
"" [Char]
"Aetherflux Reservoir"
    Int
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
loseLife Int
50
    (Card -> Int)
-> Target
-> [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
damage (Int -> Card -> Int
forall a b. a -> b -> a
const Int
50) (Player -> Target
targetPlayer Player
Opponent) [Char]
"Aetherflux Reservoir"
    Player
-> Int
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) ()
validateLife Player
Opponent Int
0

matchPowerstones :: CardMatcher
matchPowerstones = [Char] -> CardMatcher
matchName [Char]
"Powerstone Shard 1"
                    CardMatcher -> CardMatcher -> CardMatcher
`matchOr` [Char] -> CardMatcher
matchName [Char]
"Powerstone Shard 2"
                   CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> CardMatcher
matchInPlay
                   CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> Player -> CardMatcher
matchController Player
Active

matchArtifactMana :: CardMatcher
matchArtifactMana = [Char] -> CardMatcher
matchName [Char]
"Mox Amber 1"
                    CardMatcher -> CardMatcher -> CardMatcher
`matchOr` [Char] -> CardMatcher
matchName [Char]
"Mox Amber 2"
                    CardMatcher -> CardMatcher -> CardMatcher
`matchOr` [Char] -> CardMatcher
matchName [Char]
"Cultivator's Caravan"
                    CardMatcher -> CardMatcher -> CardMatcher
`matchOr` [Char] -> CardMatcher
matchName [Char]
"Treasure"

attributes :: Formatter
attributes = FormatMonad () -> Formatter
attributeFormatter (FormatMonad () -> Formatter) -> FormatMonad () -> Formatter
forall a b. (a -> b) -> a -> b
$ do
  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
-> FormatMonad ()
forall a. Show a => [Char] -> GameMonad a -> FormatMonad ()
attribute [Char]
"our life" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
 -> FormatMonad ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
-> FormatMonad ()
forall a b. (a -> b) -> a -> b
$ Player
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
countLife Player
Active
  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
-> FormatMonad ()
forall a. Show a => [Char] -> GameMonad a -> FormatMonad ()
attribute [Char]
"op. life" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
 -> FormatMonad ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
-> FormatMonad ()
forall a b. (a -> b) -> a -> b
$ Player
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
countLife Player
Opponent
  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
-> FormatMonad ()
forall a. Show a => [Char] -> GameMonad a -> FormatMonad ()
attribute [Char]
"spells" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
 -> FormatMonad ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
-> FormatMonad ()
forall a b. (a -> b) -> a -> b
$ [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
countValue [Char]
spellCount
  [Char]
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
-> FormatMonad ()
forall a. Show a => [Char] -> GameMonad a -> FormatMonad ()
attribute [Char]
"mana" (ExceptT
   [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
 -> FormatMonad ())
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
-> FormatMonad ()
forall a b. (a -> b) -> a -> b
$ do
    Int
normal <- Int -> Int -> Int
forall a. Num a => a -> a -> a
(+)
                (Int -> Int -> Int)
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
-> ExceptT
     [Char]
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     (Int -> Int)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CardMatcher
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
countCards
                  ( [Char] -> CardMatcher
matchAttribute [Char]
"land"
                    CardMatcher -> CardMatcher -> CardMatcher
`matchOr` CardMatcher
matchArtifactMana
                  CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
missingAttribute [Char]
tapped
                  CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> CardMatcher
matchInPlay
                  CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> Player -> CardMatcher
matchController Player
Active
                  )
                ExceptT
  [Char]
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  (Int -> Int)
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Player
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
countManaPool Player
Active
    Int
powerstones <- CardMatcher
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
countCards CardMatcher
matchPowerstones
    Int
untapped    <- CardMatcher
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
countCards (CardMatcher
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int)
-> CardMatcher
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
forall a b. (a -> b) -> a -> b
$ CardMatcher
matchPowerstones CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
missingAttribute [Char]
tapped
    Int
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
 -> ExceptT
      [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int)
-> Int
-> ExceptT
     [Char] (ReaderT Env (StateT Board (WriterT [Step] Identity))) Int
forall a b. (a -> b) -> a -> b
$ Int
normal Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Int
powerstones Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
untapped)

manaSources :: Formatter
manaSources = [Char] -> CardMatcher -> Formatter
cardFormatter
  [Char]
"open mana sources"
  ( [Char] -> CardMatcher
matchAttribute [Char]
"land"
    CardMatcher -> CardMatcher -> CardMatcher
`matchOr` CardMatcher
matchArtifactMana
    CardMatcher -> CardMatcher -> CardMatcher
`matchOr` CardMatcher
matchPowerstones
  CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
missingAttribute [Char]
tapped
  CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> CardMatcher
matchInPlay
  CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> Player -> CardMatcher
matchController Player
Active
  )
formatter :: a -> Formatter
formatter a
1 = Formatter
attributes Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> Formatter
boardFormatter
formatter a
_ = Formatter
attributes Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> Formatter
manaSources