module Solutions.RavnicaAllegiance4 where

import Dovin.V2

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
13

    Location -> GameMonad () -> GameMonad ()
withLocation Location
Play (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
      String -> GameMonad ()
addEnchantment String
"Rhythm of the Wild"
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
2, Int
2) String
"Combine Guildmage"
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
2, Int
3) String
"Herald of Secret Streams"
      Int -> String -> GameMonad ()
addLands Int
4 String
"Breeding Pool"
      Int -> String -> GameMonad ()
addLands Int
4 String
"Stomping Ground"

    Location -> GameMonad () -> GameMonad ()
withLocation Location
Hand (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
2, Int
2) String
"Zhur-Taa Goblin"
      String -> GameMonad () -> GameMonad ()
withAttribute String
trample (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> String -> GameMonad ()
addCreature (Int
3, Int
3) String
"Galloping Lizrog"
      (Int, Int) -> String -> GameMonad ()
addCreature (Int
0, Int
2) String
"Incubation Druid"

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Activate Guildmage for extra +1/+1 counters" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    String -> String -> GameMonad ()
tapForMana String
"G" String
"Stomping Ground 1"
    String -> String -> GameMonad ()
tapForMana String
"G" String
"Stomping Ground 2"
    String -> GameMonad ()
tap String
"Combine Guildmage"
    String -> String -> String -> GameMonad ()
activate String
"Extra +1/+1" String
"1G" String
"Combine Guildmage"
    GameMonad ()
resolveTop

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Cast Incubation Druid with haste from riot, +1/+1 from guildmage" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    String -> String -> GameMonad ()
tapForMana String
"G" String
"Breeding Pool 1"
    String -> String -> GameMonad ()
tapForMana String
"G" String
"Breeding Pool 2"
    String -> String -> GameMonad ()
cast String
"1G" String
"Incubation Druid" GameMonad () -> GameMonad () -> GameMonad ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> GameMonad ()
resolveTop

    String -> String -> GameMonad ()
trigger String
"+1/+1" String
"Combine Guildmage"
    String -> String -> GameMonad ()
trigger String
"Riot" String
"Rhythm of the Wild"

    String -> GameMonad ()
resolve String
"Riot"
    String -> String -> GameMonad ()
gainAttribute String
haste String
"Incubation Druid"

    String -> GameMonad ()
resolve String
"+1/+1"
    String -> ASetter Card Card Int Int -> (Int -> Int) -> GameMonad ()
forall a b.
String -> ASetter Card Card a b -> (a -> b) -> GameMonad ()
modifyCardDeprecated String
"Incubation Druid" ASetter Card Card Int Int
Lens' Card Int
cardPlusOneCounters (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Cast Zhur-Taa, double Riot and bonus +1/+1 for 3 total" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    String -> String -> GameMonad ()
tapForMana String
"G" String
"Stomping Ground 3"
    String -> String -> GameMonad ()
tapForMana String
"R" String
"Stomping Ground 4"

    String -> String -> GameMonad ()
cast String
"RG" String
"Zhur-Taa Goblin" GameMonad () -> GameMonad () -> GameMonad ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> GameMonad ()
resolveTop

    String -> String -> GameMonad ()
trigger String
"+1/+1" String
"Combine Guildmage"
    String -> String -> GameMonad ()
trigger String
"Rhythm Riot" String
"Rhythm of the Wild"
    String -> String -> GameMonad ()
trigger String
"Zhur-Taa Riot" String
"Zhur-Taa Goblin"

    String -> GameMonad ()
resolve String
"Zhur-Taa Riot"
    String -> ASetter Card Card Int Int -> (Int -> Int) -> GameMonad ()
forall a b.
String -> ASetter Card Card a b -> (a -> b) -> GameMonad ()
modifyCardDeprecated String
"Zhur-Taa Goblin" ASetter Card Card Int Int
Lens' Card Int
cardPlusOneCounters (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)

    String -> GameMonad ()
resolve String
"Rhythm Riot"
    String -> ASetter Card Card Int Int -> (Int -> Int) -> GameMonad ()
forall a b.
String -> ASetter Card Card a b -> (a -> b) -> GameMonad ()
modifyCardDeprecated String
"Zhur-Taa Goblin" ASetter Card Card Int Int
Lens' Card Int
cardPlusOneCounters (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)

    String -> GameMonad ()
resolve String
"+1/+1"
    String -> ASetter Card Card Int Int -> (Int -> Int) -> GameMonad ()
forall a b.
String -> ASetter Card Card a b -> (a -> b) -> GameMonad ()
modifyCardDeprecated String
"Zhur-Taa Goblin" ASetter Card Card Int Int
Lens' Card Int
cardPlusOneCounters (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Tap Druid for 3 mana, add to lands to cast Lizrog" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    String -> GameMonad ()
tap String
"Incubation Druid" -- TODO: Check if this checks for haste?
    String -> String -> String -> GameMonad ()
activate String
"Mana" String
"" String
"Incubation Druid" GameMonad () -> GameMonad () -> GameMonad ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> GameMonad ()
resolveTop

    String -> GameMonad ()
addMana String
"GGG"
    String -> String -> GameMonad ()
tapForMana String
"U" String
"Breeding Pool 3"
    String -> String -> GameMonad ()
tapForMana String
"U" String
"Breeding Pool 4"

    String -> String -> GameMonad ()
cast String
"3UG" String
"Galloping Lizrog" GameMonad () -> GameMonad () -> GameMonad ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> GameMonad ()
resolveTop
    String -> String -> GameMonad ()
trigger String
"+1/+1 swap" String
"Galloping Lizrog"
    String -> String -> GameMonad ()
trigger String
"+1/+1" String
"Combine Guildmage"
    String -> String -> GameMonad ()
trigger String
"Rhythm Riot" String
"Rhythm of the Wild"

    String -> GameMonad ()
resolve String
"Rhythm Riot"
    String -> String -> GameMonad ()
gainAttribute String
haste String
"Galloping Lizrog"

    String -> GameMonad ()
resolve String
"+1/+1"
    String -> ASetter Card Card Int Int -> (Int -> Int) -> GameMonad ()
forall a b.
String -> ASetter Card Card a b -> (a -> b) -> GameMonad ()
modifyCardDeprecated String
"Galloping Lizrog" ASetter Card Card Int Int
Lens' Card Int
cardPlusOneCounters (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)

    String -> GameMonad ()
resolve String
"+1/+1 swap"
    String -> ASetter Card Card Int Int -> (Int -> Int) -> GameMonad ()
forall a b.
String -> ASetter Card Card a b -> (a -> b) -> GameMonad ()
modifyCardDeprecated String
"Galloping Lizrog" ASetter Card Card Int Int
Lens' Card Int
cardPlusOneCounters (\Int
x -> Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
    String -> ASetter Card Card Int Int -> (Int -> Int) -> GameMonad ()
forall a b.
String -> ASetter Card Card a b -> (a -> b) -> GameMonad ()
modifyCardDeprecated String
"Zhur-Taa Goblin" ASetter Card Card Int Int
Lens' Card Int
cardPlusOneCounters (\Int
x -> Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
3)
    String -> ASetter Card Card Int Int -> (Int -> Int) -> GameMonad ()
forall a b.
String -> ASetter Card Card a b -> (a -> b) -> GameMonad ()
modifyCardDeprecated String
"Incubation Druid" ASetter Card Card Int Int
Lens' Card Int
cardPlusOneCounters (\Int
x -> Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)

    String -> ASetter Card Card Int Int -> (Int -> Int) -> GameMonad ()
forall a b.
String -> ASetter Card Card a b -> (a -> b) -> GameMonad ()
modifyCardDeprecated String
"Galloping Lizrog" ASetter Card Card Int Int
Lens' Card Int
cardPlusOneCounters (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Int
5 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2))

  String -> GameMonad () -> GameMonad ()
forall a. String -> GameMonad a -> GameMonad a
step String
"Attacking with Lizrog, unblockable from Herald" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    CardMatcher -> String -> GameMonad ()
validate CardMatcher
matchInPlay String
"Herald of Secret Streams"

    [String] -> GameMonad ()
attackWith [String
"Galloping Lizrog"]
    [String] -> String -> GameMonad ()
combatDamage [] String
"Galloping Lizrog"

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

attributes :: Formatter
attributes = FormatMonad () -> Formatter
attributeFormatter (FormatMonad () -> Formatter) -> FormatMonad () -> Formatter
forall a b. (a -> b) -> a -> b
$ do
  String -> GameMonad Int -> FormatMonad ()
forall a. Show a => String -> GameMonad a -> FormatMonad ()
attribute String
"life" (GameMonad Int -> FormatMonad ())
-> GameMonad Int -> FormatMonad ()
forall a b. (a -> b) -> a -> b
$ Player -> GameMonad Int
countLife Player
Opponent

formatter :: p -> Formatter
formatter p
_ = Formatter
attributes Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> Formatter
boardFormatter