module Solutions.ExplorersOfIxalanContest where
import Dovin.V1
import Dovin.Prelude
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"
[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
[Char] -> [Char] -> GameMonad ()
gainAttribute [Char]
deathtouch [Char]
lazav
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
[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