module Solutions.ExplorersOfIxalanContest where
import Dovin.V1
import Dovin.Prelude
solution :: GameMonad ()
solution = do
let goblin = "goblin"
let pirate = "pirate"
let lazav = "Lazav, the Multifarious"
let shapeshift x = do
activate "" lazav
targetInLocation (Active, Graveyard) "Adanto Vanguard"
let goblinToken = withLocation (Active, Play)
. withAttributes [token, goblin]
. addCreature (1, 1)
step "Relevant initial state" $ do
withLocation (Active, Hand) $ do
withAttribute goblin $ addCreature (2, 2) "Legion Warboss"
withAttribute doublestrike
$ withEffect
matchInPlay
(matchOtherCreatures <> (const $ matchAttribute firststrike))
(pure . setAttribute doublestrike)
$ addCreature (2, 2) "Kwende, Pride of Femeref"
addSorcery "Switcheroo"
addInstant "Buccaneer's Bravado"
withLocation (Active, Play) $ do
addCreature (1, 3) lazav
withAttributes [goblin, token] $ addCreature (1, 1) "Goblin 1"
withAttributes [goblin, token] $ addCreature (1, 1) "Goblin 2"
withLocation (Active, Graveyard) $ do
addCreature (1, 1) "Adanto Vanguard"
addCreature (1, 3) "Lazav, the Multifarious 2"
withAttribute deathtouch $ addCreature (3, 3) "Isareth the Awakener"
addCreature (4, 3) "Truefire Captain"
withAttribute goblin $ addCreature (2, 2) "Siege-Gang Commander"
withAttribute deathtouch $ addCreature (1, 1) "Ochran Assassin"
withLocation (Opponent, Play) $ do
withAttributes [indestructible, doublestrike] $
addCreature (4, 8) "Zetalpa, Primal Dawn"
withAttribute pirate $ addCreature (4, 4) "Angrath's Marauders"
withAttribute firststrike $ addCreature (3, 3) "Goblin Chainwhirler"
withEffect
matchInPlay
matchOtherCreatures
(pure . setAttribute haste)
$ addCreature (3, 3) "Garna, the Bloodflame"
step "Cast Legion Warboss and Kwende from hand" $ do
cast "" "Legion Warboss"
resolve "Legion Warboss"
cast "" "Kwende, Pride of Femeref"
resolve "Kwende, Pride of Femeref"
step "Buccaneer's Bravado on Angrath's, giving first strike and +1/+1" $ do
with "Angrath's Marauders" $ \x -> do
cast "" "Buccaneer's Bravado"
target x
validate x $ matchAttribute pirate
resolve "Buccaneer's Bravado"
modifyStrength (1, 1) x
gainAttribute firststrike x
step "Switcheroo Kwende and Garna, creatures get haste and doublestrike appropriately" $ do
cast "" "Switcheroo"
target "Kwende, Pride of Femeref"
target "Garna, the Bloodflame"
resolve "Switcheroo"
move (Active, Play) (Opponent, Play) "Kwende, Pride of Femeref"
move (Opponent, Play) (Active, Play) "Garna, the Bloodflame"
gainAttribute summoned "Kwende, Pride of Femeref"
gainAttribute summoned "Garna, the Bloodflame"
step "Shapeshift to Adanto Vanguard and make indestructible" $ do
shapeshift "Adanto Vanguard"
activate "" lazav
gainAttribute indestructible lazav
step "Shapeshift Lazav to Isareth" $ do
shapeshift "Isareth the Awakener"
step "Begin combat, create a new goblin token from Warboss" $ do
trigger "Legion Warboss"
withAttribute haste $ goblinToken "Goblin 3"
step "Attack with lazav and all goblins (haste from Garna), with mentor from Warboss" $ do
attackWith [lazav, "Legion Warboss", "Goblin 1", "Goblin 2", "Goblin 3"]
triggerMentor "Legion Warboss" "Goblin 1"
step "Trigger lazav-as-isareth, reanimating Seige-Gang Commander" $ do
trigger lazav
targetInLocation (Active, Graveyard) "Siege-Gang Commander"
move (Active, Graveyard) (Active, Play) "Siege-Gang Commander"
forM_ [4..6] $ \n -> withAttribute haste $ goblinToken (numbered n "Goblin")
step "After declare attacker, shapeshift to Ochran Assassin, luring all enemies to block" $ do
shapeshift "Ochran Assassin"
loseAttribute deathtouch lazav
gainAttribute deathtouch lazav
forCards
(matchLocation (Opponent, Play))
(gainAttribute "blocking")
gainAttribute "blocked" lazav
step "After declare blockers, shapeshift to Truefire Captain" $ do
shapeshift "Truefire Captain"
loseAttribute deathtouch lazav
step "First strike damage from enemies to lazav, doubled from Angrath's, bounced to opponent from Truefire" $ do
forCards
( matchLocation (Opponent, Play)
<> matchAttribute "blocking"
<> (matchAttribute firststrike `matchOr` matchAttribute doublestrike)
)
$ \cn -> do
damage ((* 2) . view cardPower) (targetCard lazav) cn
damage ((* 2) . view cardPower) (targetPlayer Opponent) cn
step "Regular damage from enemies to lazav, doubled from Angrath's, bounced to opponent from Truefire" $ do
forCards (matchLocation (Opponent, Play) <> matchAttribute "blocking")
$ \cn -> do
damage ((* 2) . view cardPower) (targetCard lazav) cn
damage (view cardPower) (targetCard cn) lazav
damage ((* 2) . view cardPower) (targetPlayer Opponent) cn
step "Regular damage from attackers to player" $ do
forCards
(matchLocation (Active, Play) <> matchAttribute attacking <> missingAttribute "blocked")
(combatDamage [])
let sacrificeToSiegeGang = \name -> do
activate "" "Siege-Gang Commander"
validate name $ matchAttribute goblin
sacrifice name
damage (const 2) (targetPlayer Opponent) "Siege-Gang Commander"
step "Siege-gang all the goblins except Siege-Gang" $ do
commander <- requireCard "Siege-Gang Commander" mempty
forCards
((invert . matchName) "Siege-Gang Commander" <> matchAttribute goblin)
sacrificeToSiegeGang
step "Shapeshift to Warboss, sacrifice lazav and self to Siege-Gang" $ do
shapeshift "Legion Warboss"
gainAttribute goblin lazav
sacrificeToSiegeGang lazav
sacrificeToSiegeGang "Siege-Gang Commander"
damageFormatter = attributeFormatter $ do
attribute "cumulative damage" $ (* (-1)) <$> countLife Opponent
formatter :: Int -> Formatter
formatter 1 =
cardFormatter "hand" (matchLocation (Active, Hand))
<> cardFormatter "our creatures" (matchLocation (Active, Play))
<> cardFormatter "opponent creatures" (matchLocation (Opponent, Play))
<> cardFormatter "graveyard" (matchLocation (Active, Graveyard))
formatter 2 = cardFormatter "our creatures" (matchLocation (Active, Play))
formatter 8 = cardFormatter "attacking creatures" (matchAttribute "attacking")
formatter 9 = cardFormatter "our creatures" (matchLocation (Active, Play))
formatter 12 = damageFormatter <>
cardFormatter
"blocking creatures with doublestrike"
(matchAttribute "blocking" <> matchAttribute doublestrike)
formatter 13 = damageFormatter <>
cardFormatter "blocking creatures" (matchAttribute "blocking")
formatter 14 = damageFormatter <>
cardFormatter
"unblocked creatures"
(matchAttribute "attacking" <> missingAttribute "blocked")
formatter 15 = damageFormatter <>
cardFormatter "remaining creatures" (matchLocation (Active, Play))
formatter 16 = damageFormatter
formatter _ = blankFormatter