more cleanup and organizing of TODOs
This commit is contained in:
parent
72b8052f70
commit
904e4120dd
1
PDFGen
1
PDFGen
|
@ -1 +0,0 @@
|
||||||
Subproject commit 53ea781d446d51ce70492a796c2523286490633f
|
|
2129
output.pdf
2129
output.pdf
File diff suppressed because it is too large
Load Diff
12
pandoc.old
12
pandoc.old
|
@ -1,12 +0,0 @@
|
||||||
const PandocOptions = &[_][]const u8{ "pandoc", "out.md", "-o", "out.pdf", "--pdf-engine", "xelatex", "-V", "mainfont:Liberation Mono", "-V", "geometry:margin=0cm" };
|
|
||||||
|
|
||||||
|
|
||||||
try allPrinted.appendSlice(markdownFormatString);
|
|
||||||
var pandocProcess = std.process.Child.init(PandocOptions, allocator);
|
|
||||||
_ = try pandocProcess.spawnAndWait();
|
|
||||||
|
|
||||||
try allPrinted.appendSlice(markdownFormatString);
|
|
||||||
|
|
||||||
try cwd.writeFile(.{ .sub_path = "out.md", .data = allPrinted.items });
|
|
||||||
|
|
||||||
const markdownFormatString = "```" ++ (" " ** (pageWidth - 4)) ++ "\n";
|
|
490
src/out.md
490
src/out.md
|
@ -1,490 +0,0 @@
|
||||||
```
|
|
||||||
|Prismatic Vista (Land) >> |Mox Jet {0} (Artifact) >> |Tenth District Hero {1}{W}
|
|
||||||
|{T}, Pay 1 life, Sacrifice |{T}: Add {B}. |(Creature Human) >> {1}{W},
|
|
||||||
|Prismatic Vista: Search your | |Collect evidence 2: Tenth
|
|
||||||
|library for a basic land | |District Hero becomes a Human
|
|
||||||
|card, put it onto the | |Detective with base power and
|
|
||||||
|battlefield, then shuffle. | |toughness 4/4 and gains
|
|
||||||
| | |vigilance. {2}{W}, Collect
|
|
||||||
| | |evidence 4: If Tenth District
|
|
||||||
| | |Hero is a Detective, it
|
|
||||||
| | |becomes a legendary creature
|
|
||||||
| | |named Mileva, the Stalwart,
|
|
||||||
| | |it has base power and
|
|
||||||
| | |toughness 5/5, and it gains
|
|
||||||
| | |"Other creatures you control
|
|
||||||
| | |have indestructible." (2/3)
|
|
||||||
| | |
|
|
||||||
|Wasteland (Land) >> {T}: Add |Misty Rainforest (Land) >> |Green Sun's Zenith {X}{G}
|
|
||||||
|{C}. {T}, Sacrifice |{T}, Pay 1 life, Sacrifice |(Sorcery) >> Search your
|
|
||||||
|Wasteland: Destroy target |Misty Rainforest: Search your |library for a green creature
|
|
||||||
|nonbasic land. |library for a Forest or |card with mana value X or
|
|
||||||
| |Island card, put it onto the |less, put it onto the
|
|
||||||
| |battlefield, then shuffle. |battlefield, then shuffle.
|
|
||||||
| | |Shuffle Green Sun's Zenith
|
|
||||||
| | |into its owner's library.
|
|
||||||
| | |
|
|
||||||
|Grist, the Hunger Tide |Wrenn and Six {R}{G} |Thalia, Heretic Cathar {2}{W}
|
|
||||||
|{1}{B}{G} (Legendary |(Legendary Planeswalker |(Legendary Creature Human
|
|
||||||
|Planeswalker Grist) >> As |Wrenn) >> +1: Return up to |Soldier) >> First strike
|
|
||||||
|long as Grist, the Hunger |one target land card from |Creatures and nonbasic lands
|
|
||||||
|Tide isn't on the |your graveyard to your hand. |your opponents control enter
|
|
||||||
|battlefield, it's a 1/1 |1: Wrenn and Six deals 1 |the battlefield tapped. (3/2)
|
|
||||||
|Insect creature in addition |damage to any target. 7: You |
|
|
||||||
|to its other types. +1: |get an emblem with "Instant |
|
|
||||||
|Create a 1/1 black and green |and sorcery cards in your |
|
|
||||||
|Insect creature token, then |graveyard have retrace." (You |
|
|
||||||
|mill a card. If an Insect |may cast instant and sorcery |
|
|
||||||
|card was milled this way, put |cards from your graveyard by |
|
|
||||||
|a loyalty counter on Grist |discarding a land card in |
|
|
||||||
|and repeat this process. 2: |addition to paying their |
|
|
||||||
|You may sacrifice a creature. |other costs.) |
|
|
||||||
|When you do, destroy target | |
|
|
||||||
|creature or planeswalker. 5: | |
|
|
||||||
|Each opponent loses life | |
|
|
||||||
|equal to the number of | |
|
|
||||||
|creature cards in your | |
|
|
||||||
|graveyard. | |
|
|
||||||
| | |
|
|
||||||
|Badlands (Land Swamp |Stomping Ground (Land |Fatal Push {B} (Instant) >>
|
|
||||||
|Mountain) >> ({T}: Add {B} or |Mountain Forest) >> ({T}: Add |Destroy target creature if it
|
|
||||||
|{R}.) |{R} or {G}.) As Stomping |has mana value 2 or less.
|
|
||||||
| |Ground enters the |Revolt Destroy that creature
|
|
||||||
| |battlefield, you may pay 2 |if it has mana value 4 or
|
|
||||||
| |life. If you don't, it enters |less instead if a permanent
|
|
||||||
| |the battlefield tapped. |you controlled left the
|
|
||||||
| | |battlefield this turn.
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
|Inti, Seneschal of the Sun |Mental Misstep {U/P} |Abrupt Decay {B}{G} (Instant)
|
|
||||||
|{1}{R} (Legendary Creature |(Instant) >> ({U/P} can be |>> This spell can't be
|
|
||||||
|Human Knight) >> Whenever you |paid with either {U} or 2 |countered. Destroy target
|
|
||||||
|attack, you may discard a |life.) Counter target spell |nonland permanent with mana
|
|
||||||
|card. When you do, put a |with mana value 1. |value 3 or less.
|
|
||||||
|+1/+1 counter on target | |
|
|
||||||
|attacking creature. It gains | |
|
|
||||||
|trample until end of turn. | |
|
|
||||||
|Whenever you discard one or | |
|
|
||||||
|more cards, exile the top | |
|
|
||||||
|card of your library. You may | |
|
|
||||||
|play that card until your | |
|
|
||||||
|next end step. (2/2) | |
|
|
||||||
| | |
|
|
||||||
|Gitaxian Probe {U/P} |Opposition Agent {2}{B} |Scavenging Ooze {1}{G}
|
|
||||||
|(Sorcery) >> ({U/P} can be |(Creature Human Rogue) >> |(Creature Ooze) >> {G}:
|
|
||||||
|paid with either {U} or 2 |Flash You control your |Exile target card from a
|
|
||||||
|life.) Look at target |opponents while they're |graveyard. If it was a
|
|
||||||
|player's hand. Draw a card. |searching their libraries. |creature card, put a +1/+1
|
|
||||||
| |While an opponent is |counter on Scavenging Ooze
|
|
||||||
| |searching their library, they |and you gain 1 life. (2/2)
|
|
||||||
| |exile each card they find. |
|
|
||||||
| |You may play those cards for |
|
|
||||||
| |as long as they remain |
|
|
||||||
| |exiled, and you may spend |
|
|
||||||
| |mana as though it were mana |
|
|
||||||
| |of any color to cast them. |
|
|
||||||
| |(3/2) |
|
|
||||||
| | |
|
|
||||||
|Dark Confidant {1}{B} |Troll of Khazad-dm {5}{B} |Taiga (Land Mountain Forest)
|
|
||||||
|(Creature Human Wizard) >> |(Creature Troll) >> Troll of |>> ({T}: Add {R} or {G}.)
|
|
||||||
|At the beginning of your |Khazad-dm can't be blocked |
|
|
||||||
|upkeep, reveal the top card |except by three or more |
|
|
||||||
|of your library and put that |creatures. Swampcycling {1} |
|
|
||||||
|card into your hand. You lose |({1}, Discard this card: |
|
|
||||||
|life equal to its mana value. |Search your library for a |
|
|
||||||
|(2/1) |Swamp card, reveal it, put it |
|
|
||||||
| |into your hand, then |
|
|
||||||
| |shuffle.) (6/5) |
|
|
||||||
| | |
|
|
||||||
|Deathrite Shaman {B/G} |Windswept Heath (Land) >> |Prismatic Ending {X}{W}
|
|
||||||
|(Creature Elf Shaman) >> |{T}, Pay 1 life, Sacrifice |(Sorcery) >> Converge Exile
|
|
||||||
|{T}: Exile target land card |Windswept Heath: Search your |target nonland permanent if
|
|
||||||
|from a graveyard. Add one |library for a Forest or |its mana value is less than
|
|
||||||
|mana of any color. {B}, {T}: |Plains card, put it onto the |or equal to the number of
|
|
||||||
|Exile target instant or |battlefield, then shuffle. |colors of mana spent to cast
|
|
||||||
|sorcery card from a | |this spell.
|
|
||||||
|graveyard. Each opponent | |
|
|
||||||
|loses 2 life. {G}, {T}: Exile | |
|
|
||||||
|target creature card from a | |
|
|
||||||
|graveyard. You gain 2 life. | |
|
|
||||||
|(1/2) | |
|
|
||||||
| | |
|
|
||||||
|Undermountain Adventurer |Lotus Petal {0} (Artifact) >> |Duress {B} (Sorcery) >>
|
|
||||||
|{3}{G} (Creature Giant |{T}, Sacrifice Lotus Petal: |Target opponent reveals their
|
|
||||||
|Warrior) >> Vigilance When |Add one mana of any color. |hand. You choose a
|
|
||||||
|Undermountain Adventurer | |noncreature, nonland card
|
|
||||||
|enters the battlefield, you | |from it. That player discards
|
|
||||||
|take the initiative. {T}: Add | |that card.
|
|
||||||
|{G}{G}. If you've completed a | |
|
|
||||||
|dungeon, add six {G} instead. | |
|
|
||||||
|(3/4) | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
|Forth Eorlingas! {X}{R}{W} |Mox Emerald {0} (Artifact) >> |Inquisition of Kozilek {B}
|
|
||||||
|(Sorcery) >> Create X 2/2 red |{T}: Add {G}. |(Sorcery) >> Target player
|
|
||||||
|Human Knight creature tokens | |reveals their hand. You
|
|
||||||
|with trample and haste. | |choose a nonland card from it
|
|
||||||
|Whenever one or more | |with mana value 3 or less.
|
|
||||||
|creatures you control deal | |That player discards that
|
|
||||||
|combat damage to one or more | |card.
|
|
||||||
|players this turn, you become | |
|
|
||||||
|the monarch. | |
|
|
||||||
| | |
|
|
||||||
|Minsc & Boo, Timeless Heroes |Tarmogoyf (Token Creature |Sungold Sentinel {1}{W}
|
|
||||||
|{2}{R}{G} (Legendary |Lhurgoyf) >> Tarmogoyf's |(Creature Human Soldier) >>
|
|
||||||
|Planeswalker Minsc) >> When |power is equal to the number |Whenever Sungold Sentinel
|
|
||||||
|Minsc & Boo, Timeless Heroes |of card types among cards in |enters the battlefield or
|
|
||||||
|enters the battlefield and at |all graveyards and its |attacks, exile up to one
|
|
||||||
|the beginning of your upkeep, |toughness is equal to that |target card from a graveyard.
|
|
||||||
|you may create Boo, a |number plus 1. (This token's |Coven {1}{W}: Choose a
|
|
||||||
|legendary 1/1 red Hamster |mana cost is {1}{G}.) (*/1+*) |color. Sungold Sentinel gains
|
|
||||||
|creature token with trample | |hexproof from that color
|
|
||||||
|and haste. +1: Put three | |until end of turn and can't
|
|
||||||
|+1/+1 counters on up to one | |be blocked by creatures of
|
|
||||||
|target creature with trample | |that color this turn.
|
|
||||||
|or haste. 2: Sacrifice a | |Activate only if you control
|
|
||||||
|creature. When you do, Minsc | |three or more creatures with
|
|
||||||
|& Boo, Timeless Heroes deals | |different powers. (3/2)
|
|
||||||
|X damage to any target, where | |
|
|
||||||
|X is that creature's power. | |
|
|
||||||
|If the sacrificed creature | |
|
|
||||||
|was a Hamster, draw X cards. | |
|
|
||||||
|Minsc & Boo, Timeless Heroes | |
|
|
||||||
|can be your commander. | |
|
|
||||||
| | |
|
|
||||||
|Simian Spirit Guide {2}{R} |Eladamri's Call {G}{W} |Unearth {B} (Sorcery) >>
|
|
||||||
|(Creature Ape Spirit) >> |(Instant) >> Search your |Return target creature card
|
|
||||||
|Exile Simian Spirit Guide |library for a creature card, |with mana value 3 or less
|
|
||||||
|from your hand: Add {R}. |reveal that card, put it into |from your graveyard to the
|
|
||||||
|(2/2) |your hand, then shuffle. |battlefield. Cycling {2}
|
|
||||||
| | |({2}, Discard this card: Draw
|
|
||||||
| | |a card.)
|
|
||||||
| | |
|
|
||||||
|Tidehollow Sculler {W}{B} |White Plume Adventurer {2}{W} |Swamp (Basic Land Swamp) >>
|
|
||||||
|(Artifact Creature Zombie) |(Creature Orc Cleric) >> |({T}: Add {B}.)
|
|
||||||
|>> When Tidehollow Sculler |When White Plume Adventurer |
|
|
||||||
|enters the battlefield, |enters the battlefield, you |
|
|
||||||
|target opponent reveals their |take the initiative. At the |
|
|
||||||
|hand and you choose a nonland |beginning of each opponent's |
|
|
||||||
|card from it. Exile that |upkeep, untap a creature you |
|
|
||||||
|card. When Tidehollow Sculler |control. If you've completed |
|
|
||||||
|leaves the battlefield, |a dungeon, untap all |
|
|
||||||
|return the exiled card to its |creatures you control |
|
|
||||||
|owner's hand. (2/2) |instead. (3/3) |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
|Mosswood Dreadknight // Dread |Karakas (Legendary Land) >> |Legolas's Quick Reflexes {G}
|
|
||||||
|Whispers {1}{G} // {1}{B} |{T}: Add {W}. {T}: Return |(Instant) >> Split second (As
|
|
||||||
|(Creature Human Knight // |target legendary creature to |long as this spell is on the
|
|
||||||
|Sorcery Adventure) >> (3/2) |its owner's hand. |stack, players can't cast
|
|
||||||
|Trample When Mosswood | |spells or activate abilities
|
|
||||||
|Dreadknight dies, you may | |that aren't mana abilities.)
|
|
||||||
|cast it from your graveyard | |Untap target creature. Until
|
|
||||||
|as an Adventure until the end | |end of turn, it gains
|
|
||||||
|of your next turn. (3/2) | |hexproof, reach, and
|
|
||||||
| // | |"Whenever this creature
|
|
||||||
|You draw a card and you lose | |becomes tapped, it deals
|
|
||||||
|1 life. (Then exile this | |damage equal to its power to
|
|
||||||
|card. You may cast the | |up to one target creature."
|
|
||||||
|creature later from exile.) | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
|Seasoned Dungeoneer {3}{W} |Mother of Runes {W} (Creature |Wooded Foothills (Land) >>
|
|
||||||
|(Creature Human Warrior) >> | Human Cleric) >> {T}: Target |{T}, Pay 1 life, Sacrifice
|
|
||||||
|When Seasoned Dungeoneer |creature you control gains |Wooded Foothills: Search your
|
|
||||||
|enters the battlefield, you |protection from the color of |library for a Mountain or
|
|
||||||
|take the initiative. Whenever |your choice until end of |Forest card, put it onto the
|
|
||||||
|you attack, target attacking |turn. (1/1) |battlefield, then shuffle.
|
|
||||||
|Cleric, Rogue, Warrior, or | |
|
|
||||||
|Wizard gains protection from | |
|
|
||||||
|creatures until end of turn. | |
|
|
||||||
|It explores. (Reveal the top | |
|
|
||||||
|card of your library. Put | |
|
|
||||||
|that card into your hand if | |
|
|
||||||
|it's a land. Otherwise, put a | |
|
|
||||||
|+1/+1 counter on the | |
|
|
||||||
|creature, then put the card | |
|
|
||||||
|back or put it into your | |
|
|
||||||
|graveyard.) (3/4) | |
|
|
||||||
| | |
|
|
||||||
|Verdant Catacombs (Land) >> |Hexdrinker {G} (Creature |Elvish Spirit Guide {2}{G}
|
|
||||||
|{T}, Pay 1 life, Sacrifice |Snake) >> Level up {1} ({1}: |(Creature Elf Spirit) >>
|
|
||||||
|Verdant Catacombs: Search |Put a level counter on this. |Exile Elvish Spirit Guide
|
|
||||||
|your library for a Swamp or |Level up only as a sorcery.) |from your hand: Add {G}.
|
|
||||||
|Forest card, put it onto the |LEVEL 3-7 4/4 Protection from |(2/2)
|
|
||||||
|battlefield, then shuffle. |instants LEVEL 8+ 6/6 |
|
|
||||||
| |Protection from everything |
|
|
||||||
| |(2/1) |
|
|
||||||
| | |
|
|
||||||
|Savannah (Land Forest |Godless Shrine (Land Plains |Kellan, Daring Traveler //
|
|
||||||
|Plains) >> ({T}: Add {G} or |Swamp) >> ({T}: Add {W} or |Journey On {1}{W} // {G}
|
|
||||||
|{W}.) |{B}.) As Godless Shrine |(Legendary Creature Human
|
|
||||||
| |enters the battlefield, you |Faerie Scout // Sorcery
|
|
||||||
| |may pay 2 life. If you don't, |Adventure) >> (2/3) Whenever
|
|
||||||
| |it enters the battlefield |Kellan, Daring Traveler
|
|
||||||
| |tapped. |attacks, reveal the top card
|
|
||||||
| | |of your library. If it's a
|
|
||||||
| | |creature card with mana value
|
|
||||||
| | |3 or less, put it into your
|
|
||||||
| | |hand. Otherwise, you may put
|
|
||||||
| | |it into your graveyard. (2/3)
|
|
||||||
| | |
|
|
||||||
| | |// Create X Map tokens, where
|
|
||||||
| | |X is one plus the number of
|
|
||||||
| | |opponents who control an
|
|
||||||
| | |artifact. (Then exile this
|
|
||||||
| | |card. You may cast the
|
|
||||||
| | |creature later from exile.)
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
|Witherbloom Command {B}{G} |Mox Pearl {0} (Artifact) >> |Underground Mortuary (Land
|
|
||||||
|(Sorcery) >> Choose two |{T}: Add {W}. |Swamp Forest) >> ({T}: Add
|
|
||||||
|Target player mills three | |{B} or {G}.) Underground
|
|
||||||
|cards, then you return a land | |Mortuary enters the
|
|
||||||
|card from your graveyard to | |battlefield tapped. When
|
|
||||||
|your hand. Destroy target | |Underground Mortuary enters
|
|
||||||
|noncreature, nonland | |the battlefield, surveil 1.
|
|
||||||
|permanent with mana value 2 | |(Look at the top card of your
|
|
||||||
|or less. Target creature | |library. You may put it into
|
|
||||||
|gets -3/-1 until end of turn. | |your graveyard.)
|
|
||||||
| Target opponent loses 2 life | |
|
|
||||||
|and you gain 2 life. | |
|
|
||||||
| | |
|
|
||||||
|Shadowspear {1} (Legendary |Razorverge Thicket (Land) >> |Overgrown Tomb (Land Swamp
|
|
||||||
|Artifact Equipment) >> |Razorverge Thicket enters the |Forest) >> ({T}: Add {B} or
|
|
||||||
|Equipped creature gets +1/+1 |battlefield tapped unless you |{G}.) As Overgrown Tomb
|
|
||||||
|and has trample and lifelink. |control two or fewer other |enters the battlefield, you
|
|
||||||
|{1}: Permanents your |lands. {T}: Add {G} or {W}. |may pay 2 life. If you don't,
|
|
||||||
|opponents control lose | |it enters the battlefield
|
|
||||||
|hexproof and indestructible | |tapped.
|
|
||||||
|until end of turn. Equip {2} | |
|
|
||||||
| | |
|
|
||||||
|Noble Hierarch {G} (Creature |Thalia, Guardian of Thraben |Reanimate {B} (Sorcery) >>
|
|
||||||
|Human Druid) >> Exalted |{1}{W} (Legendary Creature |Put target creature card from
|
|
||||||
|(Whenever a creature you |Human Soldier) >> First |a graveyard onto the
|
|
||||||
|control attacks alone, that |strike Noncreature spells |battlefield under your
|
|
||||||
|creature gets +1/+1 until end |cost {1} more to cast. (2/1) |control. You lose life equal
|
|
||||||
|of turn.) {T}: Add {G}, {W}, | |to its mana value.
|
|
||||||
|or {U}. (0/1) | |
|
|
||||||
| | |
|
|
||||||
|Laelia, the Blade Reforged |Sentinel of the Nameless City |Anointed Peacekeeper {2}{W}
|
|
||||||
|{2}{R} (Legendary Creature |{2}{G} (Creature Merfolk |(Creature Human Cleric) >>
|
|
||||||
|Spirit Warrior) >> Haste |Warrior Scout) >> Vigilance |Vigilance As Anointed
|
|
||||||
|Whenever Laelia, the Blade |Whenever Sentinel of the |Peacekeeper enters the
|
|
||||||
|Reforged attacks, exile the |Nameless City enters the |battlefield, look at an
|
|
||||||
|top card of your library. You |battlefield or attacks, |opponent's hand, then choose
|
|
||||||
|may play that card this turn. |create a Map token. (It's an |any card name. Spells your
|
|
||||||
|Whenever one or more cards |artifact with "{1}, {T}, |opponents cast with the
|
|
||||||
|are put into exile from your |Sacrifice this artifact: |chosen name cost {2} more to
|
|
||||||
|library and/or your |Target creature you control |cast. Activated abilities of
|
|
||||||
|graveyard, put a +1/+1 |explores. Activate only as a |sources with the chosen name
|
|
||||||
|counter on Laelia. (2/2) |sorcery.") (3/4) |cost {2} more to activate
|
|
||||||
| | |unless they're mana
|
|
||||||
| | |abilities. (3/3)
|
|
||||||
| | |
|
|
||||||
|Swords to Plowshares {W} |Forest (Basic Land Forest) |Leyline Binding {5}{W}
|
|
||||||
|(Instant) >> Exile target |>> ({T}: Add {G}.) |(Enchantment) >> Flash Domain
|
|
||||||
|creature. Its controller | | This spell costs {1} less to
|
|
||||||
|gains life equal to its | |cast for each basic land type
|
|
||||||
|power. | |among lands you control. When
|
|
||||||
| | |Leyline Binding enters the
|
|
||||||
| | |battlefield, exile target
|
|
||||||
| | |nonland permanent an opponent
|
|
||||||
| | |controls until Leyline
|
|
||||||
| | |Binding leaves the
|
|
||||||
| | |battlefield.
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
|Questing Beast {2}{G}{G} |Generous Ent {5}{G} (Creature |Bayou (Land Swamp Forest) >>
|
|
||||||
|(Legendary Creature Beast) | Treefolk) >> Reach When |({T}: Add {B} or {G}.)
|
|
||||||
|>> Vigilance, deathtouch, |Generous Ent enters the |
|
|
||||||
|haste Questing Beast can't be |battlefield, create a Food |
|
|
||||||
|blocked by creatures with |token. (It's an artifact with |
|
|
||||||
|power 2 or less. Combat |"{2}, {T}, Sacrifice this |
|
|
||||||
|damage that would be dealt by |artifact: You gain 3 life.") |
|
|
||||||
|creatures you control can't |Forestcycling {1} ({1}, |
|
|
||||||
|be prevented. Whenever |Discard this card: Search |
|
|
||||||
|Questing Beast deals combat |your library for a Forest |
|
|
||||||
|damage to an opponent, it |card, reveal it, put it into |
|
|
||||||
|deals that much damage to |your hand, then shuffle.) |
|
|
||||||
|target planeswalker that |(5/7) |
|
|
||||||
|player controls. (4/4) | |
|
|
||||||
| | |
|
|
||||||
|Plains (Basic Land Plains) |Boseiju, Who Endures |Arid Mesa (Land) >> {T}, Pay
|
|
||||||
|>> ({T}: Add {W}.) |(Legendary Land) >> {T}: Add |1 life, Sacrifice Arid Mesa:
|
|
||||||
| |{G}. Channel {1}{G}, Discard |Search your library for a
|
|
||||||
| |Boseiju, Who Endures: Destroy |Mountain or Plains card, put
|
|
||||||
| |target artifact, enchantment, |it onto the battlefield, then
|
|
||||||
| |or nonbasic land an opponent |shuffle.
|
|
||||||
| |controls. That player may |
|
|
||||||
| |search their library for a |
|
|
||||||
| |land card with a basic land |
|
|
||||||
| |type, put it onto the |
|
|
||||||
| |battlefield, then shuffle. |
|
|
||||||
| |This ability costs {1} less |
|
|
||||||
| |to activate for each |
|
|
||||||
| |legendary creature you |
|
|
||||||
| |control. |
|
|
||||||
| | |
|
|
||||||
|Plateau (Land Mountain |Endurance {1}{G}{G} (Creature |Scrubland (Land Plains
|
|
||||||
|Plains) >> ({T}: Add {R} or | Elemental Incarnation) >> |Swamp) >> ({T}: Add {W} or
|
|
||||||
|{W}.) |Flash Reach When Endurance |{B}.)
|
|
||||||
| |enters the battlefield, up to |
|
|
||||||
| |one target player puts all |
|
|
||||||
| |the cards from their |
|
|
||||||
| |graveyard on the bottom of |
|
|
||||||
| |their library in a random |
|
|
||||||
| |order. EvokeExile a green |
|
|
||||||
| |card from your hand. (3/4) |
|
|
||||||
| | |
|
|
||||||
|Ignoble Hierarch {G} |Scalding Tarn (Land) >> {T}, |Luminarch Aspirant {1}{W}
|
|
||||||
|(Creature Goblin Shaman) >> |Pay 1 life, Sacrifice |(Creature Human Cleric) >>
|
|
||||||
|Exalted (Whenever a creature |Scalding Tarn: Search your |At the beginning of combat on
|
|
||||||
|you control attacks alone, |library for an Island or |your turn, put a +1/+1
|
|
||||||
|that creature gets +1/+1 |Mountain card, put it onto |counter on target creature
|
|
||||||
|until end of turn.) {T}: Add |the battlefield, then |you control. (1/1)
|
|
||||||
|{B}, {R}, or {G}. (0/1) |shuffle. |
|
|
||||||
| | |
|
|
||||||
|Archon of Emeria {2}{W} |Once Upon a Time {1}{G} |Mana Confluence (Land) >>
|
|
||||||
|(Creature Archon) >> Flying |(Instant) >> If this spell is |{T}, Pay 1 life: Add one mana
|
|
||||||
|Each player can't cast more |the first spell you've cast |of any color.
|
|
||||||
|than one spell each turn. |this game, you may cast it |
|
|
||||||
|Nonbasic lands your opponents |without paying its mana cost. |
|
|
||||||
|control enter the battlefield |Look at the top five cards of |
|
|
||||||
|tapped. (2/3) |your library. You may reveal |
|
|
||||||
| |a creature or land card from |
|
|
||||||
| |among them and put it into |
|
|
||||||
| |your hand. Put the rest on |
|
|
||||||
| |the bottom of your library in |
|
|
||||||
| |a random order. |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
|Birds of Paradise {G} |Cankerbloom {1}{G} (Creature |Path to Exile {W} (Instant)
|
|
||||||
|(Creature Bird) >> Flying |Phyrexian Fungus) >> {1}, |>> Exile target creature. Its
|
|
||||||
|{T}: Add one mana of any |Sacrifice Cankerbloom: Choose |controller may search their
|
|
||||||
|color. (0/1) |one Destroy target |library for a basic land
|
|
||||||
| |artifact. Destroy target |card, put that card onto the
|
|
||||||
| |enchantment. Proliferate. |battlefield tapped, then
|
|
||||||
| |(Choose any number of |shuffle.
|
|
||||||
| |permanents and/or players, |
|
|
||||||
| |then give each another |
|
|
||||||
| |counter of each kind already |
|
|
||||||
| |there.) (3/2) |
|
|
||||||
| | |
|
|
||||||
|Marsh Flats (Land) >> {T}, |Broadside Bombardiers {2}{R} |Caves of Chaos Adventurer
|
|
||||||
|Pay 1 life, Sacrifice Marsh |(Creature Goblin Pirate) >> |{3}{R} (Creature Human
|
|
||||||
|Flats: Search your library |Menace, haste Boast |Barbarian) >> Trample When
|
|
||||||
|for a Plains or Swamp card, |Sacrifice another creature or |Caves of Chaos Adventurer
|
|
||||||
|put it onto the battlefield, |artifact: Broadside |enters the battlefield, you
|
|
||||||
|then shuffle. |Bombardiers deals damage |take the initiative. Whenever
|
|
||||||
| |equal to 2 plus the |Caves of Chaos Adventurer
|
|
||||||
| |sacrificed permanent's mana |attacks, exile the top card
|
|
||||||
| |value to any target. |of your library. If you've
|
|
||||||
| |(Activate only if this |completed a dungeon, you may
|
|
||||||
| |creature attacked this turn |play that card this turn
|
|
||||||
| |and only once each turn.) |without paying its mana cost.
|
|
||||||
| |(2/2) |Otherwise, you may play that
|
|
||||||
| | |card this turn. (5/3)
|
|
||||||
| | |
|
|
||||||
|Mawloc {X}{R}{G} (Creature |Comet, Stellar Pup {2}{R}{W} |Orcish Bowmasters {1}{B}
|
|
||||||
|Tyranid) >> Ravenous (This |(Legendary Planeswalker |(Creature Orc Archer) >>
|
|
||||||
|creature enters the |Comet) >> 0: Roll a six-sided |Flash When Orcish Bowmasters
|
|
||||||
|battlefield with X +1/+1 |die. 1 or 2 [+2], then |enters the battlefield and
|
|
||||||
|counters on it. If X is 5 or |create two 1/1 green Squirrel |whenever an opponent draws a
|
|
||||||
|more, draw a card when it |creature tokens. They gain |card except the first one
|
|
||||||
|enters.) Terror from the Deep |haste until end of turn. 3 |they draw in each of their
|
|
||||||
| When Mawloc enters the |[1], then return a card with |draw steps, Orcish Bowmasters
|
|
||||||
|battlefield, it fights up to |mana value 2 or less from |deals 1 damage to any target.
|
|
||||||
|one target creature an |your graveyard to your hand. |Then amass Orcs 1. (1/1)
|
|
||||||
|opponent controls. If that |4 or 5 Comet, Stellar Pup |
|
|
||||||
|creature would die this turn, |deals damage equal to the |
|
|
||||||
|exile it instead. (2/2) |number of loyalty counters on |
|
|
||||||
| |him to a creature or player, |
|
|
||||||
| |then [2]. 6 [+1], and you |
|
|
||||||
| |may activate Comet, Stellar |
|
|
||||||
| |Pup's loyalty ability two |
|
|
||||||
| |more times this turn. |
|
|
||||||
| | |
|
|
||||||
|Chrome Mox {0} (Artifact) >> |Thoughtseize {B} (Sorcery) >> |Polluted Delta (Land) >> {T},
|
|
||||||
|Imprint When Chrome Mox |Target player reveals their |Pay 1 life, Sacrifice
|
|
||||||
|enters the battlefield, you |hand. You choose a nonland |Polluted Delta: Search your
|
|
||||||
|may exile a nonartifact, |card from it. That player |library for an Island or
|
|
||||||
|nonland card from your hand. |discards that card. You lose |Swamp card, put it onto the
|
|
||||||
|{T}: Add one mana of any of |2 life. |battlefield, then shuffle.
|
|
||||||
|the exiled card's colors. | |
|
|
||||||
| | |
|
|
||||||
|City of Brass (Land) >> |Mox Diamond {0} (Artifact) >> |Flooded Strand (Land) >> {T},
|
|
||||||
|Whenever City of Brass |If Mox Diamond would enter |Pay 1 life, Sacrifice Flooded
|
|
||||||
|becomes tapped, it deals 1 |the battlefield, you may |Strand: Search your library
|
|
||||||
|damage to you. {T}: Add one |discard a land card instead. |for a Plains or Island card,
|
|
||||||
|mana of any color. |If you do, put Mox Diamond |put it onto the battlefield,
|
|
||||||
| |onto the battlefield. If you |then shuffle.
|
|
||||||
| |don't, put it into its |
|
|
||||||
| |owner's graveyard. {T}: Add |
|
|
||||||
| |one mana of any color. |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
|Temple Garden (Land Forest |Lord Skitter, Sewer King |Bloodstained Mire (Land) >>
|
|
||||||
|Plains) >> ({T}: Add {G} or |{2}{B} (Legendary Creature |{T}, Pay 1 life, Sacrifice
|
|
||||||
|{W}.) As Temple Garden enters |Rat Noble) >> Whenever |Bloodstained Mire: Search
|
|
||||||
|the battlefield, you may pay |another Rat enters the |your library for a Swamp or
|
|
||||||
|2 life. If you don't, it |battlefield under your |Mountain card, put it onto
|
|
||||||
|enters the battlefield |control, exile up to one |the battlefield, then
|
|
||||||
|tapped. |target card from an |shuffle.
|
|
||||||
| |opponent's graveyard. At the |
|
|
||||||
| |beginning of combat on your |
|
|
||||||
| |turn, create a 1/1 black Rat |
|
|
||||||
| |creature token with "This |
|
|
||||||
| |creature can't block." (3/3) |
|
|
||||||
| | |
|
|
||||||
|Ayara's Oathsworn {1}{B} | |
|
|
||||||
|(Creature Human Knight) >> | |
|
|
||||||
|Menace Whenever Ayara's | |
|
|
||||||
|Oathsworn deals combat damage | |
|
|
||||||
|to a player, if it has fewer | |
|
|
||||||
|than four +1/+1 counters on | |
|
|
||||||
|it, put a +1/+1 counter on | |
|
|
||||||
|it. Then if it has exactly | |
|
|
||||||
|four +1/+1 counters on it, | |
|
|
||||||
|search your library for a | |
|
|
||||||
|card, put it into your hand, | |
|
|
||||||
|then shuffle. (2/2) | |
|
|
||||||
| | |
|
|
||||||
```
|
|
BIN
src/out.pdf
BIN
src/out.pdf
Binary file not shown.
|
@ -1,9 +1,20 @@
|
||||||
//c library usage based on https://medium.com/@eddo2626/lets-learn-zig-4-using-c-libraries-in-zig-5fcc3206f0dc
|
//TODO: change references to "HeightMayVary" to "constantHeight"
|
||||||
|
//TODO: add loyalty for planeswalkers
|
||||||
|
//TODO: print mana cost beside each name for dual-faced cards
|
||||||
|
//TODO: consider eliminating the TextCard struct
|
||||||
|
//TODO: add some kind of "update" command to support pulling new oracle data
|
||||||
|
//TODO: implement oracleFileName as a cli arg
|
||||||
|
//TODO: add more robust tests
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
// https://github.com/Hejsil/zig-clap
|
||||||
const clap = @import("clap");
|
const clap = @import("clap");
|
||||||
|
|
||||||
//using the zg lib: https://codeberg.org/dude_the_builder/zg
|
// https://codeberg.org/dude_the_builder/zg
|
||||||
const DisplayWidth = @import("DisplayWidth");
|
const DisplayWidth = @import("DisplayWidth");
|
||||||
|
|
||||||
|
// https://github.com/AndreRenaud/PDFGen
|
||||||
|
// including the header file only works for a full build, "zig run" can't find it
|
||||||
const c = @cImport({
|
const c = @cImport({
|
||||||
@cInclude("pdfgen.h");
|
@cInclude("pdfgen.h");
|
||||||
});
|
});
|
||||||
|
@ -44,15 +55,20 @@ const cardWidth = 30;
|
||||||
const cardHeight = 32;
|
const cardHeight = 32;
|
||||||
const minCardHeight = 5;
|
const minCardHeight = 5;
|
||||||
const pageHeight = 66;
|
const pageHeight = 66;
|
||||||
var heightMayVary = true; //whether or not cards must have a constant height
|
const pdfHeight = c.PDF_LETTER_HEIGHT;
|
||||||
|
const pdfWidth = c.PDF_LETTER_WIDTH;
|
||||||
|
|
||||||
const formatString = "{s: <" ++ std.fmt.digits2(cardWidth) ++ "}";
|
const formatString = "{s: <" ++ std.fmt.digits2(cardWidth) ++ "}";
|
||||||
const lineFormatter = "|" ++ formatString;
|
const lineFormatter = "|" ++ formatString;
|
||||||
const spacer: []const u8 = "|" ++ (" " ** cardWidth);
|
const spacer: []const u8 = "|" ++ (" " ** cardWidth);
|
||||||
const oracleFileName = "/home/lumenk/Documents/code/zig/proxy-print/src/oracle-cards-20240701090158.json"; //"oracle-cards-20240205220208.js";
|
|
||||||
const fullWidthSpacer = (spacer ** 3) ++ "\n";
|
const fullWidthSpacer = (spacer ** 3) ++ "\n";
|
||||||
const pageWidth = fullWidthSpacer.len;
|
const pageWidth = fullWidthSpacer.len;
|
||||||
|
|
||||||
|
//values that may vary depending on user-supplied arguments
|
||||||
|
var oracleFileName = "oracle-data/oracle-cards-20240701090158.json";
|
||||||
|
var listFileName: []const u8 = undefined; //the name of the file with the list of cards to print
|
||||||
|
var heightMayVary = true; //whether or not cards must have a constant height
|
||||||
|
|
||||||
test "Check constants" {
|
test "Check constants" {
|
||||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||||
const paddedLine = try std.fmt.allocPrint(gpa.allocator(), lineFormatter, .{"hello> woooooooooooooooooooorl"});
|
const paddedLine = try std.fmt.allocPrint(gpa.allocator(), lineFormatter, .{"hello> woooooooooooooooooooorl"});
|
||||||
|
@ -60,8 +76,6 @@ test "Check constants" {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main() !void {
|
pub fn main() !void {
|
||||||
// var args = try std.process.argsWithAllocator(std.heap.page_allocator);
|
|
||||||
|
|
||||||
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||||||
defer arena.deinit();
|
defer arena.deinit();
|
||||||
const allocator = arena.allocator();
|
const allocator = arena.allocator();
|
||||||
|
@ -69,7 +83,7 @@ pub fn main() !void {
|
||||||
const params = comptime clap.parseParamsComptime(
|
const params = comptime clap.parseParamsComptime(
|
||||||
\\-h, --help Display this help and exit.
|
\\-h, --help Display this help and exit.
|
||||||
\\-l, --listFile <str> The list of cards to print
|
\\-l, --listFile <str> The list of cards to print
|
||||||
\\
|
\\-c, --constant <str> "true" or "false" (case-sensitive, whether or not the height of cards may vary)
|
||||||
);
|
);
|
||||||
|
|
||||||
const res = clap.parse(clap.Help, ¶ms, clap.parsers.default, .{
|
const res = clap.parse(clap.Help, ¶ms, clap.parsers.default, .{
|
||||||
|
@ -77,8 +91,15 @@ pub fn main() !void {
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
return err;
|
return err;
|
||||||
};
|
};
|
||||||
if(res.args.listFile == null) return error.ExpectedArgument;
|
if(res.args.listFile) |name| {
|
||||||
const listFileName = res.args.listFile.?;
|
listFileName = name;
|
||||||
|
} else {
|
||||||
|
return error.ExpectedArgument;
|
||||||
|
}
|
||||||
|
//TODO (FIXME): passing "false" currently causes the program to hang and then crash
|
||||||
|
if(res.args.constant) |choice| {
|
||||||
|
heightMayVary = stringToBool(choice);
|
||||||
|
}
|
||||||
|
|
||||||
const oracleFile = try cwd.openFile(oracleFileName, .{});
|
const oracleFile = try cwd.openFile(oracleFileName, .{});
|
||||||
var jsonReader = json.reader(allocator, oracleFile.reader());
|
var jsonReader = json.reader(allocator, oracleFile.reader());
|
||||||
|
@ -106,8 +127,6 @@ pub fn main() !void {
|
||||||
|
|
||||||
cards.sort(CardSortContext{ .list = cards.values() });
|
cards.sort(CardSortContext{ .list = cards.values() });
|
||||||
var allPrinted = std.ArrayList([]const u8).init(allocator);
|
var allPrinted = std.ArrayList([]const u8).init(allocator);
|
||||||
const pdfHeight = c.PDF_LETTER_HEIGHT;
|
|
||||||
const pdfWidth = c.PDF_LETTER_WIDTH;
|
|
||||||
const pdf_doc: *c.pdf_doc = @ptrCast(c.pdf_create(pdfWidth, pdfHeight, &c.pdf_info{ .creator = ("My Software" ++ " " ** 53).* }).?);
|
const pdf_doc: *c.pdf_doc = @ptrCast(c.pdf_create(pdfWidth, pdfHeight, &c.pdf_info{ .creator = ("My Software" ++ " " ** 53).* }).?);
|
||||||
|
|
||||||
var rowToPrint = std.ArrayList(TextCard).init(allocator);
|
var rowToPrint = std.ArrayList(TextCard).init(allocator);
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue