module Solutions.GuildsOfRavnica1 where

import Control.Monad (forM_)

import Dovin.V1

-- http://www.possibilitystorm.com/083-guilds-of-ravnica-puzzle-1/
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
5

    CardLocation -> GameMonad () -> GameMonad ()
withLocation (Player
Active, Location
Hand)
      (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ [String] -> GameMonad () -> GameMonad ()
withAttributes [String
flying, String
mentor]
      (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> String -> GameMonad ()
addCreature (Int
2, Int
5) String
"Aurelia, Exemplar of Justice"

    CardLocation -> GameMonad () -> GameMonad ()
withLocation (Player
Active, Location
Play) (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
      String -> GameMonad () -> GameMonad ()
withAttribute String
mentor (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
        (Int, Int) -> String -> GameMonad ()
addCreature (Int
3, Int
1) String
"Blade Instructor"
        (Int, Int) -> String -> GameMonad ()
addCreature (Int
1, Int
1) String
"Goblin Banneret"
        (Int, Int) -> String -> GameMonad ()
addCreature (Int
4, Int
2) String
"Barging Sergeant"
      Int -> String -> GameMonad ()
addPlaneswalker Int
5 String
"Angrath, the Flame-Chained"

      Int -> String -> GameMonad ()
addLands Int
4 String
"Sacred Foundry"
      Int -> String -> GameMonad ()
addLands Int
4 String
"Dragonskull Summit"

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Cast Aurelia" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    String -> String -> GameMonad ()
tapForMana String
"R" String
"Sacred Foundry 1"
    String -> String -> GameMonad ()
tapForMana String
"W" String
"Sacred Foundry 2"
    String -> String -> GameMonad ()
tapForMana String
"W" String
"Sacred Foundry 3"
    String -> String -> GameMonad ()
tapForMana String
"W" String
"Sacred Foundry 4"
    String -> String -> GameMonad ()
cast String
"2RW" String
"Aurelia, Exemplar of Justice"
    String -> GameMonad ()
resolve String
"Aurelia, Exemplar of Justice"

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Angrath gain control, targeting Aurelia" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    String -> Int -> String -> GameMonad ()
activatePlaneswalker String
"" (-Int
3) String
"Angrath, the Flame-Chained" GameMonad () -> GameMonad () -> GameMonad ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> GameMonad ()
resolveTop
    String -> GameMonad ()
target String
"Aurelia, Exemplar of Justice"
    String -> String -> GameMonad ()
gainAttribute String
"haste" String
"Aurelia, Exemplar of Justice"

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Activate Goblin Banneret" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Int] -> (Int -> GameMonad ()) -> GameMonad ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Int
1..Int
2] ((Int -> GameMonad ()) -> GameMonad ())
-> (Int -> GameMonad ()) -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ \Int
n -> String -> String -> GameMonad ()
tapForMana String
"R" (Int -> String -> String
numbered Int
n String
"Dragonskull Summit")
    String -> String -> GameMonad ()
activate String
"R1" String
"Goblin Banneret"
    (Int, Int) -> String -> GameMonad ()
modifyStrength (Int
2, Int
0) String
"Goblin Banneret"

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Begin combat, put Aurelia's trigger on Banneret" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    String -> GameMonad ()
trigger String
"Aurelia, Exemplar of Justice"
    (Int, Int) -> String -> GameMonad ()
modifyStrength (Int
2, Int
0) String
"Goblin Banneret"

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Attack with everything, stacking Mentor triggers on to Aurelia" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [String] -> GameMonad ()
attackWith
      [ String
"Aurelia, Exemplar of Justice"
      , String
"Blade Instructor"
      , String
"Goblin Banneret"
      , String
"Barging Sergeant"
      ]

    String -> String -> GameMonad ()
triggerMentor String
"Aurelia, Exemplar of Justice" String
"Goblin Banneret"
    String -> String -> GameMonad ()
triggerMentor String
"Aurelia, Exemplar of Justice" String
"Barging Sergeant"
    String -> String -> GameMonad ()
triggerMentor String
"Aurelia, Exemplar of Justice" String
"Blade Instructor"

    String -> String -> GameMonad ()
resolveMentor String
"Aurelia, Exemplar of Justice" String
"Blade Instructor"
    String -> String -> GameMonad ()
resolveMentor String
"Aurelia, Exemplar of Justice" String
"Barging Sergeant"
    String -> String -> GameMonad ()
resolveMentor String
"Aurelia, Exemplar of Justice" String
"Goblin Banneret"

    [String] -> String -> GameMonad ()
combatDamage [] String
"Aurelia, Exemplar of Justice"

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

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