module Solutions.GuildsOfRavnicaPre2 where

import Dovin.V1

solution :: GameMonad ()
solution :: GameMonad ()
solution = do
  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Initial state" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    Player -> GameMonad () -> GameMonad ()
as Player
Opponent (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ Int -> GameMonad ()
setLife Int
9

    CardLocation -> GameMonad () -> GameMonad ()
withLocation (Player
Active, Location
Hand) (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
1, Int
1) String
"Ochran Assassin"
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
2, Int
2) String
"Rhizome Lurcher"

    CardLocation -> GameMonad () -> GameMonad ()
withLocation (Player
Active, Location
Play) (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
1, Int
1) String
"Torch Courier"
      String -> GameMonad () -> GameMonad ()
withAttribute String
flying (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> String -> GameMonad ()
addCreature (Int
3, Int
2) String
"Whisper Agent"
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
2, Int
2) String
"Whisper, Blood Liturgist"

      Int -> String -> GameMonad ()
addLands Int
3 String
"Dragonskull Summit"
      Int -> String -> GameMonad ()
addLands Int
4 String
"Woodland Cemetery"

    CardLocation -> GameMonad () -> GameMonad ()
withLocation (Player
Active, Location
Graveyard) (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
2, Int
2) String
"Devkarin Dissident"
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
4, Int
3) String
"Underrealm Lich"
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
3, Int
4) String
"Golgari Findbroker"
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
2, Int
2) String
"Erstwhile Trooper"
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
5, Int
4) String
"Bone Dragon"

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Play Ochran Assassin, haste with Torch Courier" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    String -> String -> GameMonad ()
tapForMana String
"G" String
"Woodland Cemetery 1"
    String -> String -> GameMonad ()
tapForMana String
"B" String
"Woodland Cemetery 2"
    String -> String -> GameMonad ()
tapForMana String
"R" String
"Dragonskull Summit 1"
    String -> String -> GameMonad ()
cast String
"1BG" String
"Ochran Assassin"
    String -> GameMonad ()
resolve String
"Ochran Assassin"

    String -> String -> GameMonad ()
activate String
"" String
"Torch Courier"
    String -> GameMonad ()
sacrifice String
"Torch Courier"

    String -> String -> GameMonad ()
gainAttribute String
"haste" String
"Ochran Assassin"

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Sac Whisper to get Torch Courier back" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    String -> GameMonad ()
tap String
"Whisper, Blood Liturgist"
    String -> GameMonad ()
sacrifice String
"Whisper Agent"
    String -> GameMonad ()
sacrifice String
"Whisper, Blood Liturgist"

    Location -> String -> GameMonad ()
moveTo Location
Play String
"Torch Courier"

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Play Rhizome Lurcher, haste with Torch Courier" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    String -> String -> GameMonad ()
tapForMana String
"G" String
"Woodland Cemetery 3"
    String -> String -> GameMonad ()
tapForMana String
"B" String
"Woodland Cemetery 4"
    String -> String -> GameMonad ()
tapForMana String
"R" String
"Dragonskull Summit 2"
    String -> String -> GameMonad ()
tapForMana String
"R" String
"Dragonskull Summit 3"
    String -> String -> GameMonad ()
cast String
"2BG" String
"Rhizome Lurcher"
    String -> GameMonad ()
resolve String
"Rhizome Lurcher"

    CardMatcher -> (String -> GameMonad ()) -> GameMonad ()
forCards
      (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Graveyard) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> String -> CardMatcher
matchAttribute String
"creature")
      (GameMonad () -> String -> GameMonad ()
forall a b. a -> b -> a
const (GameMonad () -> String -> GameMonad ())
-> GameMonad () -> String -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> String -> GameMonad ()
modifyStrength (Int
1, Int
1) String
"Rhizome Lurcher")

    String -> String -> GameMonad ()
activate String
"" String
"Torch Courier"
    String -> GameMonad ()
sacrifice String
"Torch Courier"

    String -> String -> GameMonad ()
gainAttribute String
"haste" String
"Rhizome Lurcher"

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Attack with Lurcher and Assasin, everyone blocks Assasin" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [String] -> GameMonad ()
attackWith [String
"Rhizome Lurcher", String
"Ochran Assassin"]

    String -> String -> GameMonad ()
gainAttribute String
"blocked" String
"Ochran Assassin"

    [String] -> String -> GameMonad ()
combatDamage [] String
"Rhizome Lurcher"

    Player -> Int -> GameMonad ()
validateLife Player
Opponent Int
0

formatter :: p -> Formatter
formatter p
_ = Formatter
boardFormatter