module Solutions.UltimateMasters where

import Control.Lens (over, view)
import Control.Monad

import Dovin.V2

sacrificeToAltar :: ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrificeToAltar ManaString
mana ManaString
name = do
  ManaString
-> ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
activate ManaString
"" ManaString
"" ManaString
"Phrexian Altar" ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop
  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrifice ManaString
name
  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addMana ManaString
mana

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

    Location
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withLocation Location
Hand (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addInstant ManaString
"Through the Breach"
      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withAttribute ManaString
arcane (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addInstant ManaString
"Goryo's Vengeance"
      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addSorcery ManaString
"Reanimate"
      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addSorcery ManaString
"Vengeful Rebirth"
      (Int, Int)
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addCreature (Int
2, Int
5) ManaString
"Stingerfling Spider"
      (Int, Int)
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addCreature (Int
15, Int
15) ManaString
"Emrakul, the Aeons Torn"

    Location
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withLocation Location
Play (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
      Int
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addPlaneswalker Int
3 ManaString
"Liliana of the Veil"
      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addArtifact ManaString
"Phrexian Altar"
      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addArtifact ManaString
"Engineered Explosives"
      Int
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addLands Int
6 ManaString
"Swamp"
      Int
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addLands Int
6 ManaString
"Mountain"

      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withAttribute ManaString
haste
        (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ Int
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withPlusOneCounters Int
1
        (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ (Int, Int)
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addCreature (Int
4, Int
3) ManaString
"Vengevine"

      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withAttribute ManaString
legendary
        (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ CardMatcher
-> (Card -> CardMatcher)
-> (Card -> Identity Card)
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withEffect
            CardMatcher
matchInPlay
            (Card -> CardMatcher
matchOtherCreatures (Card -> CardMatcher)
-> (Card -> CardMatcher) -> Card -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> (CardMatcher -> Card -> CardMatcher
forall a b. a -> b -> a
const (CardMatcher -> Card -> CardMatcher)
-> CardMatcher -> Card -> CardMatcher
forall a b. (a -> b) -> a -> b
$ [ManaString] -> CardMatcher
matchAttributes [ManaString
creature]))
            (Card -> Identity Card
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Card -> Identity Card) -> (Card -> Card) -> Card -> Identity Card
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ASetter Card Card CardStrength CardStrength
-> (CardStrength -> CardStrength) -> Card -> Card
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter Card Card CardStrength CardStrength
Lens' Card CardStrength
cardStrength ((Int, Int) -> CardStrength
mkStrength (Int
1, Int
1) CardStrength -> CardStrength -> CardStrength
forall a. Semigroup a => a -> a -> a
<>) (Card -> Card) -> (Card -> Card) -> Card -> Card
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ManaString -> Card -> Card
setAttribute ManaString
undying)
        (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ (Int, Int)
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addCreature (Int
5, Int
5) ManaString
"Mikaeus, the Unhallowed"

    Player
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
as Player
Opponent (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
      Location
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withLocation Location
Play (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
        Int
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addLands Int
7 ManaString
"Plains"
        Int
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addLands Int
2 ManaString
"Forest"

        ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addLand ManaString
"Dark Depths"

        ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withAttribute ManaString
flying (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
          (Int, Int)
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addCreature (Int
4, Int
6) ManaString
"Reya Dawnbringer"
          (Int, Int)
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addCreature (Int
4, Int
3) ManaString
"Sublime Archangel"
          ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withAttribute ManaString
legendary
            (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ (Int, Int)
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addCreature (Int
5, Int
5) ManaString
"Sigarda, Host of Herons"

      Location
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withLocation Location
Graveyard (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
        ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addEnchantment ManaString
"Bridge from Below"

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"Sac Vengevine and Reanimate with the created mana, exiling Bridge" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrificeToAltar ManaString
"B" ManaString
"Vengevine"

    ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
exile ManaString
"Bridge from Below"

    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
cast ManaString
"B" ManaString
"Reanimate" ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop
    CardLocation
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
targetInLocation (Player
Active, Location
Graveyard) ManaString
"Vengevine"
    Location
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
moveTo Location
Play ManaString
"Vengevine"

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"Sac Vengevine (undying) then Mikaeus for mana" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrificeToAltar ManaString
"U" ManaString
"Vengevine"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrificeToAltar ManaString
"U" ManaString
"Mikaeus, the Unhallowed"

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"Engineered Explosives for Sigarda" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    ManaString
-> ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
activate ManaString
"" ManaString
"2" ManaString
"Engineered Explosives" ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop
    ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
destroy ManaString
"Sigarda, Host of Herons"

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"Goryo's Mikaeus with spliced Breach of Stingerfling, destroying Archangel" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"B" ManaString
"Swamp 1"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"B" ManaString
"Swamp 2"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"R" ManaString
"Mountain 1"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"R" ManaString
"Mountain 2"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"R" ManaString
"Mountain 3"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"R" ManaString
"Mountain 4"

    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
cast ManaString
"1B" ManaString
"Goryo's Vengeance"
    ManaString
-> ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
splice ManaString
"Goryo's Vengeance" ManaString
"2RR" ManaString
"Through the Breach"
    ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop

    ManaString
-> (ManaString
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
with ManaString
"Mikaeus, the Unhallowed" ((ManaString
  -> ExceptT
       ManaString
       (ReaderT Env (StateT Board (WriterT [Step] Identity)))
       ())
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> (ManaString
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ \ManaString
cn -> do
      CardLocation
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
targetInLocation (Player
Active, Location
Graveyard) ManaString
cn
      CardMatcher
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
validate (ManaString -> CardMatcher
matchAttribute ManaString
legendary) ManaString
cn
      Location
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
moveTo Location
Play ManaString
cn
      ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
gainAttribute ManaString
haste ManaString
cn

    ManaString
-> (ManaString
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
with ManaString
"Stingerfling Spider" ((ManaString
  -> ExceptT
       ManaString
       (ReaderT Env (StateT Board (WriterT [Step] Identity)))
       ())
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> (ManaString
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ \ManaString
cn -> do
      CardLocation
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
targetInLocation (Player
Active, Location
Hand) ManaString
cn
      Location
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
moveTo Location
Play ManaString
cn
      ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
gainAttribute ManaString
haste ManaString
cn

      ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
trigger ManaString
"Destroy creature with flying" ManaString
cn ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop
      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
target ManaString
"Sublime Archangel"
      CardMatcher
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
validate (ManaString -> CardMatcher
matchAttribute ManaString
flying) ManaString
"Sublime Archangel"
      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
destroy ManaString
"Sublime Archangel"

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"Liliana to force sac of Reya" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    ManaString
-> Int
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
activatePlaneswalker ManaString
"" Int
1 ManaString
"Liliana of the Veil" ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop
    Player
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
as Player
Opponent (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrifice ManaString
"Reya Dawnbringer"

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"Breach Emrakul" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"B" ManaString
"Swamp 3"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"B" ManaString
"Swamp 4"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"B" ManaString
"Swamp 5"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"R" ManaString
"Mountain 5"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"R" ManaString
"Mountain 6"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
cast ManaString
"4R" ManaString
"Through the Breach" ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop

    ManaString
-> (ManaString
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
with ManaString
"Emrakul, the Aeons Torn" ((ManaString
  -> ExceptT
       ManaString
       (ReaderT Env (StateT Board (WriterT [Step] Identity)))
       ())
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> (ManaString
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ \ManaString
cn -> do
      CardLocation
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
targetInLocation (Player
Active, Location
Hand) ManaString
cn
      Location
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
moveTo Location
Play ManaString
cn
      ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
gainAttribute ManaString
haste ManaString
cn

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"Attack with everything" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    [ManaString]
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
attackWith
      [ ManaString
"Emrakul, the Aeons Torn"
      , ManaString
"Mikaeus, the Unhallowed"
      , ManaString
"Vengevine"
      , ManaString
"Stingerfling Spider"
      ]

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"Assume opponent activates Dark Depths to block Emrakul in response to Annihilator trigger, then annihilates lands" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
trigger ManaString
"Annihilator 6" ManaString
"Emrakul, the Aeons Torn"

    Player
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
as Player
Opponent (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
      [Int]
-> (Int
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (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
7] ((Int
  -> ExceptT
       ManaString
       (ReaderT Env (StateT Board (WriterT [Step] Identity)))
       ())
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> (Int
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ \Int
n -> ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"W" (Int -> ManaString -> ManaString
numbered Int
n ManaString
"Plains")
      [Int]
-> (Int
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (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
       ManaString
       (ReaderT Env (StateT Board (WriterT [Step] Identity)))
       ())
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> (Int
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ \Int
n -> ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"G" (Int -> ManaString -> ManaString
numbered Int
n ManaString
"Forest")
      ManaString
-> ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
activate ManaString
"" ManaString
"3" ManaString
"Dark Depths" ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop
      ManaString
-> ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
activate ManaString
"" ManaString
"3" ManaString
"Dark Depths" ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop
      ManaString
-> ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
activate ManaString
"" ManaString
"3" ManaString
"Dark Depths" ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop
      ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrifice ManaString
"Dark Depths"
      Location
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withLocation Location
Play
        (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ [ManaString]
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
withAttributes [ManaString
indestructible, ManaString
flying, ManaString
token]
        (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ (Int, Int)
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
addCreature (Int
20, Int
20) ManaString
"Marit Large"

    ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
resolve ManaString
"Annihilator 6"
    Player
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
as Player
Opponent (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$
      [Int]
-> (Int
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (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
6] ((Int
  -> ExceptT
       ManaString
       (ReaderT Env (StateT Board (WriterT [Step] Identity)))
       ())
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> (Int
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ \Int
n -> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrifice (Int -> ManaString -> ManaString
numbered Int
n ManaString
"Plains")

    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
gainAttribute ManaString
"blocked" ManaString
"Emrakul, the Aeons Torn"

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"Deal damage. Emrakul returns with undying" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    CardMatcher
-> (ManaString
    -> ExceptT
         ManaString
         (ReaderT Env (StateT Board (WriterT [Step] Identity)))
         ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forCards
      (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Play) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
matchAttribute ManaString
attacking CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
missingAttribute ManaString
"blocked")
      ([ManaString]
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
combatDamage [])

    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
fight ManaString
"Emrakul, the Aeons Torn" ManaString
"Marit Large"

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"In second main, sacrifice remaining creatures for mana (spider twice)" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    Phase
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
transitionTo Phase
SecondMain

    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrificeToAltar ManaString
"R" ManaString
"Vengevine"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrificeToAltar ManaString
"G" ManaString
"Stingerfling Spider"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrificeToAltar ManaString
"U" ManaString
"Stingerfling Spider" -- From undying
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrificeToAltar ManaString
"U" ManaString
"Emrakul, the Aeons Torn"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
sacrificeToAltar ManaString
"U" ManaString
"Mikaeus, the Unhallowed"

  ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a. ManaString -> GameMonad a -> GameMonad a
step ManaString
"Cast Vengeful Rebirth on Mikaeus, targeting opponent" (ExceptT
   ManaString
   (ReaderT Env (StateT Board (WriterT [Step] Identity)))
   ()
 -> ExceptT
      ManaString
      (ReaderT Env (StateT Board (WriterT [Step] Identity)))
      ())
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall a b. (a -> b) -> a -> b
$ do
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
tapForMana ManaString
"B" ManaString
"Swamp 6"
    ManaString
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
cast ManaString
"4GR" ManaString
"Vengeful Rebirth" ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  ()
resolveTop

    CardLocation
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
targetInLocation (Player
Active, Location
Graveyard) ManaString
"Mikaeus, the Unhallowed"
    Location
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
moveTo Location
Hand ManaString
"Mikaeus, the Unhallowed"
    (Card -> Int)
-> Target
-> ManaString
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
damage (Int -> Card -> Int
forall a b. a -> b -> a
const Int
6) (Player -> Target
targetPlayer Player
Opponent) ManaString
"Vengeful Rebirth"

    Int
-> Player
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     ()
validateLife Int
0 Player
Opponent

manaAttribute :: Formatter
manaAttribute = FormatMonad () -> Formatter
attributeFormatter (FormatMonad () -> Formatter) -> FormatMonad () -> Formatter
forall a b. (a -> b) -> a -> b
$ ManaString -> GameMonad Int -> FormatMonad ()
forall a. Show a => ManaString -> GameMonad a -> FormatMonad ()
attribute ManaString
"mana" (GameMonad Int -> FormatMonad ())
-> GameMonad Int -> FormatMonad ()
forall a b. (a -> b) -> a -> b
$
  Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Int -> Int -> Int)
-> GameMonad Int
-> ExceptT
     ManaString
     (ReaderT Env (StateT Board (WriterT [Step] Identity)))
     (Int -> Int)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CardMatcher -> GameMonad Int
countCards
            ( ManaString -> CardMatcher
matchAttribute ManaString
"land"
            CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
missingAttribute ManaString
"tapped"
            CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> Player -> CardMatcher
matchController Player
Active
            )
      ExceptT
  ManaString
  (ReaderT Env (StateT Board (WriterT [Step] Identity)))
  (Int -> Int)
-> GameMonad Int -> GameMonad Int
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Player -> GameMonad Int
countManaPool Player
Active

formatter :: Step -> Formatter
formatter = Int -> Formatter
forall a. (Eq a, Num a) => a -> Formatter
oldFormatter (Int -> Formatter) -> (Step -> Int) -> Step -> Formatter
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting Int Step Int -> Step -> Int
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Int Step Int
Lens' Step Int
stepNumber

oldFormatter :: a -> Formatter
oldFormatter a
1 = Formatter
boardFormatter
oldFormatter a
3 = Formatter
manaAttribute
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher -> Formatter
cardFormatter
       ManaString
"creatures"
       (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Play) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
matchAttribute ManaString
creature)
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher -> Formatter
cardFormatter
       ManaString
"graveyard"
       (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Graveyard) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
matchAttribute ManaString
creature)
oldFormatter a
4 = Formatter
manaAttribute
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher -> Formatter
cardFormatter
       ManaString
"remaining creatures"
       (CardLocation -> CardMatcher
matchLocation (Player
Opponent, Location
Play) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
matchAttribute ManaString
creature)
oldFormatter a
5 = Formatter
manaAttribute
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher -> Formatter
cardFormatter
       ManaString
"remaining creatures"
       (CardLocation -> CardMatcher
matchLocation (Player
Opponent, Location
Play) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
matchAttribute ManaString
creature)
oldFormatter a
6 = Formatter
manaAttribute
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher -> Formatter
cardFormatter
       ManaString
"remaining creatures"
       (CardLocation -> CardMatcher
matchLocation (Player
Opponent, Location
Play) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
matchAttribute ManaString
creature)
oldFormatter a
8 =
  ManaString -> CardMatcher -> Formatter
cardFormatter
    ManaString
"creatures"
    (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Play) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
matchAttribute ManaString
creature)
oldFormatter a
9 =
  ManaString -> CardMatcher -> Formatter
cardFormatter
    ManaString
"unblocked creatures"
    (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Play)
    CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
matchAttribute ManaString
creature
    CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> CardMatcher -> CardMatcher
invert (ManaString -> CardMatcher
matchAttribute ManaString
"blocked")
    )
oldFormatter a
10 =
     FormatMonad () -> Formatter
attributeFormatter (ManaString -> GameMonad Int -> FormatMonad ()
forall a. Show a => ManaString -> GameMonad a -> FormatMonad ()
attribute ManaString
"life" (Player -> GameMonad Int
countLife Player
Opponent))
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher -> Formatter
cardFormatter
       ManaString
"creatures"
       (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Play) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ManaString -> CardMatcher
matchAttribute ManaString
creature)
oldFormatter a
11 = Formatter
manaAttribute
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> FormatMonad () -> Formatter
attributeFormatter (ManaString -> GameMonad Int -> FormatMonad ()
forall a. Show a => ManaString -> GameMonad a -> FormatMonad ()
attribute ManaString
"life" (Player -> GameMonad Int
countLife Player
Opponent))
oldFormatter a
12 = Formatter
manaAttribute
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> FormatMonad () -> Formatter
attributeFormatter (ManaString -> GameMonad Int -> FormatMonad ()
forall a. Show a => ManaString -> GameMonad a -> FormatMonad ()
attribute ManaString
"life" (Player -> GameMonad Int
countLife Player
Opponent))
oldFormatter a
_ = Formatter
manaAttribute