module Solutions.ExplorersOfIxalanContest where

import Dovin.V1
import Dovin.Prelude

-- This solution is not optimal, 130 damage is possible.
solution :: GameMonad ()
solution :: GameMonad ()
solution = do
  let goblin :: [Char]
goblin = [Char]
"goblin"
  let pirate :: [Char]
pirate = [Char]
"pirate"
  let lazav :: [Char]
lazav = [Char]
"Lazav, the Multifarious"
  let shapeshift :: p -> GameMonad ()
shapeshift p
x = do
        [Char] -> [Char] -> GameMonad ()
activate [Char]
"" [Char]
lazav
        CardLocation -> [Char] -> GameMonad ()
targetInLocation (Player
Active, Location
Graveyard) [Char]
"Adanto Vanguard"

  let goblinToken :: [Char] -> GameMonad ()
goblinToken = CardLocation -> GameMonad () -> GameMonad ()
withLocation (Player
Active, Location
Play)
        (GameMonad () -> GameMonad ())
-> ([Char] -> GameMonad ()) -> [Char] -> GameMonad ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Char]] -> GameMonad () -> GameMonad ()
withAttributes [[Char]
token, [Char]
goblin]
        (GameMonad () -> GameMonad ())
-> ([Char] -> GameMonad ()) -> [Char] -> GameMonad ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
1, Int
1)

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Relevant initial state" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    CardLocation -> GameMonad () -> GameMonad ()
withLocation (Player
Active, Location
Hand) (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
      [[Char]] -> GameMonad () -> GameMonad ()
withAttributes [[Char]
goblin, [Char]
mentor] (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
2, Int
2) [Char]
"Legion Warboss"
      [Char] -> GameMonad () -> GameMonad ()
withAttribute [Char]
doublestrike
        (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ CardMatcher
-> (Card -> CardMatcher)
-> (Card -> Identity Card)
-> GameMonad ()
-> GameMonad ()
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
$ [Char] -> CardMatcher
matchAttribute [Char]
firststrike))
            (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
. [Char] -> Card -> Card
setAttribute [Char]
doublestrike)
        (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
2, Int
2) [Char]
"Kwende, Pride of Femeref"

      [Char] -> GameMonad ()
addSorcery [Char]
"Switcheroo"
      [Char] -> GameMonad ()
addInstant [Char]
"Buccaneer's Bravado"

    CardLocation -> GameMonad () -> GameMonad ()
withLocation (Player
Active, Location
Play) (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
      (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
1, Int
3) [Char]
lazav
      [[Char]] -> GameMonad () -> GameMonad ()
withAttributes [[Char]
goblin, [Char]
token] (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
1, Int
1) [Char]
"Goblin 1"
      [[Char]] -> GameMonad () -> GameMonad ()
withAttributes [[Char]
goblin, [Char]
token] (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
1, Int
1) [Char]
"Goblin 2"

    CardLocation -> GameMonad () -> GameMonad ()
withLocation (Player
Active, Location
Graveyard) (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
      (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
1, Int
1) [Char]
"Adanto Vanguard"
      (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
1, Int
3) [Char]
"Lazav, the Multifarious 2"
      [Char] -> GameMonad () -> GameMonad ()
withAttribute [Char]
deathtouch (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
3, Int
3) [Char]
"Isareth the Awakener"
      (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
4, Int
3) [Char]
"Truefire Captain"
      [Char] -> GameMonad () -> GameMonad ()
withAttribute [Char]
goblin (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
2, Int
2) [Char]
"Siege-Gang Commander"
      [Char] -> GameMonad () -> GameMonad ()
withAttribute [Char]
deathtouch (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
1, Int
1) [Char]
"Ochran Assassin"

    CardLocation -> GameMonad () -> GameMonad ()
withLocation (Player
Opponent, Location
Play) (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
      [[Char]] -> GameMonad () -> GameMonad ()
withAttributes [[Char]
indestructible, [Char]
doublestrike] (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$
        (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
4, Int
8) [Char]
"Zetalpa, Primal Dawn"
      [Char] -> GameMonad () -> GameMonad ()
withAttribute [Char]
pirate (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
4, Int
4) [Char]
"Angrath's Marauders"
      [Char] -> GameMonad () -> GameMonad ()
withAttribute [Char]
firststrike (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
3, Int
3) [Char]
"Goblin Chainwhirler"
      CardMatcher
-> (Card -> CardMatcher)
-> (Card -> Identity Card)
-> GameMonad ()
-> GameMonad ()
withEffect
        CardMatcher
matchInPlay
        Card -> CardMatcher
matchOtherCreatures
        (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
. [Char] -> Card -> Card
setAttribute [Char]
haste)
        (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> [Char] -> GameMonad ()
addCreature (Int
3, Int
3) [Char]
"Garna, the Bloodflame"

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Cast Legion Warboss and Kwende from hand" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Char] -> [Char] -> GameMonad ()
cast [Char]
"" [Char]
"Legion Warboss"
    [Char] -> GameMonad ()
resolve [Char]
"Legion Warboss"
    [Char] -> [Char] -> GameMonad ()
cast [Char]
"" [Char]
"Kwende, Pride of Femeref"
    [Char] -> GameMonad ()
resolve [Char]
"Kwende, Pride of Femeref"

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Buccaneer's Bravado on Angrath's, giving first strike and +1/+1" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Char] -> ([Char] -> GameMonad ()) -> GameMonad ()
with [Char]
"Angrath's Marauders" (([Char] -> GameMonad ()) -> GameMonad ())
-> ([Char] -> GameMonad ()) -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ \[Char]
x -> do
      [Char] -> [Char] -> GameMonad ()
cast [Char]
"" [Char]
"Buccaneer's Bravado"
      [Char] -> GameMonad ()
target [Char]
x
      [Char] -> CardMatcher -> GameMonad ()
validate [Char]
x (CardMatcher -> GameMonad ()) -> CardMatcher -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ [Char] -> CardMatcher
matchAttribute [Char]
pirate
      [Char] -> GameMonad ()
resolve [Char]
"Buccaneer's Bravado"

      (Int, Int) -> [Char] -> GameMonad ()
modifyStrength (Int
1, Int
1) [Char]
x
      [Char] -> [Char] -> GameMonad ()
gainAttribute [Char]
firststrike [Char]
x

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Switcheroo Kwende and Garna, creatures get haste and doublestrike appropriately" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Char] -> [Char] -> GameMonad ()
cast [Char]
"" [Char]
"Switcheroo"
    [Char] -> GameMonad ()
target [Char]
"Kwende, Pride of Femeref"
    [Char] -> GameMonad ()
target [Char]
"Garna, the Bloodflame"
    [Char] -> GameMonad ()
resolve [Char]
"Switcheroo"

    CardLocation -> CardLocation -> [Char] -> GameMonad ()
move (Player
Active, Location
Play) (Player
Opponent, Location
Play) [Char]
"Kwende, Pride of Femeref"
    CardLocation -> CardLocation -> [Char] -> GameMonad ()
move (Player
Opponent, Location
Play) (Player
Active, Location
Play) [Char]
"Garna, the Bloodflame"

    [Char] -> [Char] -> GameMonad ()
gainAttribute [Char]
summoned [Char]
"Kwende, Pride of Femeref"
    [Char] -> [Char] -> GameMonad ()
gainAttribute [Char]
summoned [Char]
"Garna, the Bloodflame"

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Shapeshift to Adanto Vanguard and make indestructible" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Char] -> GameMonad ()
forall p. p -> GameMonad ()
shapeshift [Char]
"Adanto Vanguard"
    [Char] -> [Char] -> GameMonad ()
activate [Char]
"" [Char]
lazav
    [Char] -> [Char] -> GameMonad ()
gainAttribute [Char]
indestructible [Char]
lazav

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Shapeshift Lazav to Isareth" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Char] -> GameMonad ()
forall p. p -> GameMonad ()
shapeshift [Char]
"Isareth the Awakener"

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Begin combat, create a new goblin token from Warboss" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Char] -> GameMonad ()
trigger [Char]
"Legion Warboss"
    [Char] -> GameMonad () -> GameMonad ()
withAttribute [Char]
haste (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ [Char] -> GameMonad ()
goblinToken [Char]
"Goblin 3"

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Attack with lazav and all goblins (haste from Garna), with mentor from Warboss" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [[Char]] -> GameMonad ()
attackWith [[Char]
lazav, [Char]
"Legion Warboss", [Char]
"Goblin 1", [Char]
"Goblin 2", [Char]
"Goblin 3"]

    [Char] -> [Char] -> GameMonad ()
triggerMentor [Char]
"Goblin 1" [Char]
"Legion Warboss"
    [Char] -> [Char] -> GameMonad ()
resolveMentor [Char]
"Goblin 1" [Char]
"Legion Warboss"

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Trigger lazav-as-isareth, reanimating Seige-Gang Commander" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Char] -> GameMonad ()
trigger [Char]
lazav
    CardLocation -> [Char] -> GameMonad ()
targetInLocation (Player
Active, Location
Graveyard) [Char]
"Siege-Gang Commander"
    CardLocation -> CardLocation -> [Char] -> GameMonad ()
move (Player
Active, Location
Graveyard) (Player
Active, Location
Play) [Char]
"Siege-Gang Commander"

    -- haste from Garna, even though not relevant
    [Int] -> (Int -> GameMonad ()) -> GameMonad ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Int
4..Int
6] ((Int -> GameMonad ()) -> GameMonad ())
-> (Int -> GameMonad ()) -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ \Int
n -> [Char] -> GameMonad () -> GameMonad ()
withAttribute [Char]
haste (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ [Char] -> GameMonad ()
goblinToken (Int -> [Char] -> [Char]
numbered Int
n [Char]
"Goblin")

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"After declare attacker, shapeshift to Ochran Assassin, luring all enemies to block" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Char] -> GameMonad ()
forall p. p -> GameMonad ()
shapeshift [Char]
"Ochran Assassin"
    [Char] -> [Char] -> GameMonad ()
loseAttribute [Char]
deathtouch [Char]
lazav -- From Isareth
    [Char] -> [Char] -> GameMonad ()
gainAttribute [Char]
deathtouch [Char]
lazav -- From Assassin

    CardMatcher -> ([Char] -> GameMonad ()) -> GameMonad ()
forCards
      (CardLocation -> CardMatcher
matchLocation (Player
Opponent, Location
Play))
      ([Char] -> [Char] -> GameMonad ()
gainAttribute [Char]
"blocking")
    [Char] -> [Char] -> GameMonad ()
gainAttribute [Char]
"blocked" [Char]
lazav

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"After declare blockers, shapeshift to Truefire Captain" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Char] -> GameMonad ()
forall p. p -> GameMonad ()
shapeshift [Char]
"Truefire Captain"
    [Char] -> [Char] -> GameMonad ()
loseAttribute [Char]
deathtouch [Char]
lazav -- From Assassin

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"First strike damage from enemies to lazav, doubled from Angrath's, bounced to opponent from Truefire" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    CardMatcher -> ([Char] -> GameMonad ()) -> GameMonad ()
forCards
      (    CardLocation -> CardMatcher
matchLocation (Player
Opponent, Location
Play)
        CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
matchAttribute [Char]
"blocking"
        CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> ([Char] -> CardMatcher
matchAttribute [Char]
firststrike CardMatcher -> CardMatcher -> CardMatcher
`matchOr` [Char] -> CardMatcher
matchAttribute [Char]
doublestrike)
      )
      (([Char] -> GameMonad ()) -> GameMonad ())
-> ([Char] -> GameMonad ()) -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ \[Char]
cn -> do
        (Card -> Int) -> Target -> [Char] -> GameMonad ()
damage ((Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2) (Int -> Int) -> (Card -> Int) -> Card -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting Int Card Int -> Card -> Int
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Int Card Int
Lens' Card Int
cardPower) ([Char] -> Target
targetCard [Char]
lazav) [Char]
cn
        (Card -> Int) -> Target -> [Char] -> GameMonad ()
damage ((Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2) (Int -> Int) -> (Card -> Int) -> Card -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting Int Card Int -> Card -> Int
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Int Card Int
Lens' Card Int
cardPower) (Player -> Target
targetPlayer Player
Opponent) [Char]
cn

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Regular damage from enemies to lazav, doubled from Angrath's, bounced to opponent from Truefire" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    CardMatcher -> ([Char] -> GameMonad ()) -> GameMonad ()
forCards (CardLocation -> CardMatcher
matchLocation (Player
Opponent, Location
Play) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
matchAttribute [Char]
"blocking")
      (([Char] -> GameMonad ()) -> GameMonad ())
-> ([Char] -> GameMonad ()) -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ \[Char]
cn -> do
        (Card -> Int) -> Target -> [Char] -> GameMonad ()
damage ((Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2) (Int -> Int) -> (Card -> Int) -> Card -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting Int Card Int -> Card -> Int
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Int Card Int
Lens' Card Int
cardPower) ([Char] -> Target
targetCard [Char]
lazav) [Char]
cn
        (Card -> Int) -> Target -> [Char] -> GameMonad ()
damage (Getting Int Card Int -> Card -> Int
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Int Card Int
Lens' Card Int
cardPower) ([Char] -> Target
targetCard [Char]
cn) [Char]
lazav
        (Card -> Int) -> Target -> [Char] -> GameMonad ()
damage ((Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2) (Int -> Int) -> (Card -> Int) -> Card -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting Int Card Int -> Card -> Int
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Int Card Int
Lens' Card Int
cardPower) (Player -> Target
targetPlayer Player
Opponent) [Char]
cn

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Regular damage from attackers to player" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    CardMatcher -> ([Char] -> GameMonad ()) -> GameMonad ()
forCards
      (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Play) CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
matchAttribute [Char]
attacking CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
missingAttribute [Char]
"blocked")
      ([[Char]] -> [Char] -> GameMonad ()
combatDamage [])

  let sacrificeToSiegeGang :: [Char] -> GameMonad ()
sacrificeToSiegeGang = \[Char]
name -> do
        [Char] -> [Char] -> GameMonad ()
activate [Char]
"" [Char]
"Siege-Gang Commander"
        [Char] -> CardMatcher -> GameMonad ()
validate [Char]
name (CardMatcher -> GameMonad ()) -> CardMatcher -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ [Char] -> CardMatcher
matchAttribute [Char]
goblin
        [Char] -> GameMonad ()
sacrifice [Char]
name
        (Card -> Int) -> Target -> [Char] -> GameMonad ()
damage (Int -> Card -> Int
forall a b. a -> b -> a
const Int
2) (Player -> Target
targetPlayer Player
Opponent) [Char]
"Siege-Gang Commander"

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Siege-gang all the goblins except Siege-Gang" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    Card
commander <- [Char] -> CardMatcher -> GameMonad Card
requireCard [Char]
"Siege-Gang Commander" CardMatcher
forall a. Monoid a => a
mempty

    CardMatcher -> ([Char] -> GameMonad ()) -> GameMonad ()
forCards
      ((CardMatcher -> CardMatcher
invert (CardMatcher -> CardMatcher)
-> ([Char] -> CardMatcher) -> [Char] -> CardMatcher
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> CardMatcher
matchName) [Char]
"Siege-Gang Commander" CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
matchAttribute [Char]
goblin)
      [Char] -> GameMonad ()
sacrificeToSiegeGang

  [Char] -> GameMonad () -> GameMonad ()
forall a. [Char] -> GameMonad a -> GameMonad a
step [Char]
"Shapeshift to Warboss, sacrifice lazav and self to Siege-Gang" (GameMonad () -> GameMonad ()) -> GameMonad () -> GameMonad ()
forall a b. (a -> b) -> a -> b
$ do
    [Char] -> GameMonad ()
forall p. p -> GameMonad ()
shapeshift [Char]
"Legion Warboss"
    [Char] -> [Char] -> GameMonad ()
gainAttribute [Char]
goblin [Char]
lazav

    [Char] -> GameMonad ()
sacrificeToSiegeGang [Char]
lazav
    [Char] -> GameMonad ()
sacrificeToSiegeGang [Char]
"Siege-Gang Commander"

damageFormatter :: Formatter
damageFormatter = FormatMonad () -> Formatter
attributeFormatter (FormatMonad () -> Formatter) -> FormatMonad () -> Formatter
forall a b. (a -> b) -> a -> b
$ do
  [Char] -> GameMonad Int -> FormatMonad ()
forall a. Show a => [Char] -> GameMonad a -> FormatMonad ()
attribute [Char]
"cumulative damage" (GameMonad Int -> FormatMonad ())
-> GameMonad Int -> FormatMonad ()
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Int
forall a. Num a => a -> a -> a
* (-Int
1)) (Int -> Int) -> GameMonad Int -> GameMonad Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Player -> GameMonad Int
countLife Player
Opponent

formatter :: Int -> Formatter
formatter :: Int -> Formatter
formatter Int
1 =
     [Char] -> CardMatcher -> Formatter
cardFormatter [Char]
"hand" (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Hand))
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher -> Formatter
cardFormatter [Char]
"our creatures" (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Play))
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher -> Formatter
cardFormatter [Char]
"opponent creatures" (CardLocation -> CardMatcher
matchLocation (Player
Opponent, Location
Play))
  Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher -> Formatter
cardFormatter [Char]
"graveyard" (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Graveyard))
formatter Int
2 = [Char] -> CardMatcher -> Formatter
cardFormatter [Char]
"our creatures" (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Play))
formatter Int
8 = [Char] -> CardMatcher -> Formatter
cardFormatter [Char]
"attacking creatures" ([Char] -> CardMatcher
matchAttribute [Char]
"attacking")
formatter Int
9 = [Char] -> CardMatcher -> Formatter
cardFormatter [Char]
"our creatures" (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Play))
formatter Int
12 = Formatter
damageFormatter Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<>
  [Char] -> CardMatcher -> Formatter
cardFormatter
   [Char]
"blocking creatures with doublestrike"
   ([Char] -> CardMatcher
matchAttribute [Char]
"blocking" CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
matchAttribute [Char]
doublestrike)
formatter Int
13 = Formatter
damageFormatter Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<>
  [Char] -> CardMatcher -> Formatter
cardFormatter [Char]
"blocking creatures" ([Char] -> CardMatcher
matchAttribute [Char]
"blocking")
formatter Int
14 = Formatter
damageFormatter Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<>
  [Char] -> CardMatcher -> Formatter
cardFormatter
    [Char]
"unblocked creatures"
    ([Char] -> CardMatcher
matchAttribute [Char]
"attacking" CardMatcher -> CardMatcher -> CardMatcher
forall a. Semigroup a => a -> a -> a
<> [Char] -> CardMatcher
missingAttribute [Char]
"blocked")
formatter Int
15 = Formatter
damageFormatter Formatter -> Formatter -> Formatter
forall a. Semigroup a => a -> a -> a
<>
  [Char] -> CardMatcher -> Formatter
cardFormatter [Char]
"remaining creatures" (CardLocation -> CardMatcher
matchLocation (Player
Active, Location
Play))
formatter Int
16 = Formatter
damageFormatter

formatter Int
_ = Formatter
blankFormatter