Merge branch 'Card-Forge:master' into farm

This commit is contained in:
Simisays
2023-03-02 22:49:36 +01:00
committed by GitHub
25 changed files with 220 additions and 202 deletions

View File

@@ -1 +1,2 @@
--settings ./.mvn/local-settings.xml --settings
./.mvn/local-settings.xml

View File

@@ -2040,7 +2040,7 @@ public class ComputerUtilCombat {
final boolean hasTrample = attacker.hasKeyword(Keyword.TRAMPLE); final boolean hasTrample = attacker.hasKeyword(Keyword.TRAMPLE);
if (combat != null && hasTrample && attacker.isAttacking()) { if (combat != null && remaining != null && hasTrample && attacker.isAttacking()) {
// if attacker has trample and some of its blockers are also blocking others it's generally a good idea // if attacker has trample and some of its blockers are also blocking others it's generally a good idea
// to assign those without trample first so we can maximize the damage to the defender // to assign those without trample first so we can maximize the damage to the defender
for (final Card c : remaining) { for (final Card c : remaining) {

View File

@@ -198,6 +198,7 @@ public class AnimateEffect extends AnimateEffectBase {
if (sa.hasParam("Crew")) { if (sa.hasParam("Crew")) {
c.becomesCrewed(sa); c.becomesCrewed(sa);
c.updatePowerToughnessForView();
} }
game.fireEvent(new GameEventCardStatsChanged(c)); game.fireEvent(new GameEventCardStatsChanged(c));

View File

@@ -6361,7 +6361,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
continue; continue;
} }
if (!tr.getParam("Destination").equals(ZoneType.Battlefield.toString())) { if (!ZoneType.Battlefield.toString().equals(tr.getParam("Destination"))) {
continue; continue;
} }

View File

@@ -1722,7 +1722,7 @@ public class CardProperty {
return false; return false;
} }
} else if (property.equals("hadToAttackThisCombat")) { } else if (property.equals("hadToAttackThisCombat")) {
AttackRequirement e = combat.getAttackConstraints().getRequirements().get(card); AttackRequirement e = combat == null ? null : combat.getAttackConstraints().getRequirements().get(card);
if (e == null || !e.hasCreatureRequirement() || !e.getAttacker().equalsWithTimestamp(card)) { if (e == null || !e.hasCreatureRequirement() || !e.getAttacker().equalsWithTimestamp(card)) {
return false; return false;
} }

View File

@@ -49,7 +49,10 @@ public class EnemySprite extends CharacterSprite {
@Override @Override
void updateBoundingRect() { //We want enemies to take the full tile. void updateBoundingRect() { //We want enemies to take the full tile.
boundingRect.set(getX(), getY(), getWidth(), getHeight()); float scale = data == null ? 1f : data.scale;
if (scale < 0)
scale = 1f;
boundingRect.set(getX(), getY(), getWidth()*scale, getHeight()*scale);
} }
public void moveTo(Actor other, float delta) { public void moveTo(Actor other, float delta) {

View File

@@ -41,7 +41,7 @@ public class EffectData implements Serializable {
} }
public Array<IPaperCard> startBattleWithCards() { public Array<IPaperCard> startBattleWithCards() {
Array<IPaperCard> startCards=new Array<>(); Array<IPaperCard> startCards=new Array<>(IPaperCard.class);
if(startBattleWithCard != null) { if(startBattleWithCard != null) {
for (String name:startBattleWithCard) { for (String name:startBattleWithCard) {
PaperCard C = FModel.getMagicDb().getCommonCards().getCard(name); PaperCard C = FModel.getMagicDb().getCommonCards().getCard(name);

View File

@@ -260,7 +260,9 @@ public class FSkin {
final FileHandle f9 = getDefaultSkinFile(ForgeConstants.SPRITE_SLEEVES2_FILE); final FileHandle f9 = getDefaultSkinFile(ForgeConstants.SPRITE_SLEEVES2_FILE);
final FileHandle f10 = getDefaultSkinFile(ForgeConstants.SPRITE_BORDER_FILE); final FileHandle f10 = getDefaultSkinFile(ForgeConstants.SPRITE_BORDER_FILE);
final FileHandle f11 = getSkinFile(ForgeConstants.SPRITE_BUTTONS_FILE); final FileHandle f11 = getSkinFile(ForgeConstants.SPRITE_BUTTONS_FILE);
final FileHandle f11b = getDefaultSkinFile(ForgeConstants.SPRITE_BUTTONS_FILE);
final FileHandle f12 = getSkinFile(ForgeConstants.SPRITE_START_FILE); final FileHandle f12 = getSkinFile(ForgeConstants.SPRITE_START_FILE);
final FileHandle f12b = getDefaultSkinFile(ForgeConstants.SPRITE_START_FILE);
final FileHandle f13 = getDefaultSkinFile(ForgeConstants.SPRITE_DECKBOX_FILE); final FileHandle f13 = getDefaultSkinFile(ForgeConstants.SPRITE_DECKBOX_FILE);
final FileHandle f17 = getDefaultSkinFile(ForgeConstants.SPRITE_CRACKS_FILE); final FileHandle f17 = getDefaultSkinFile(ForgeConstants.SPRITE_CRACKS_FILE);
final FileHandle f18 = getDefaultSkinFile(ForgeConstants.SPRITE_PHYREXIAN_FILE); final FileHandle f18 = getDefaultSkinFile(ForgeConstants.SPRITE_PHYREXIAN_FILE);
@@ -313,6 +315,10 @@ public class FSkin {
manager.finishLoadingAsset(f11.path()); manager.finishLoadingAsset(f11.path());
Forge.hdbuttons = true; Forge.hdbuttons = true;
} }
} else if (f11b.exists() && Forge.allowCardBG) {
manager.load(f11b.path(), Texture.class, Forge.getAssets().getTextureFilter());
manager.finishLoadingAsset(f11b.path());
Forge.hdbuttons = true;
} else { Forge.hdbuttons = false; } //how to refresh buttons when a theme don't have hd buttons? } else { Forge.hdbuttons = false; } //how to refresh buttons when a theme don't have hd buttons?
if (f12.exists()) { if (f12.exists()) {
if (!Forge.allowCardBG) { if (!Forge.allowCardBG) {
@@ -322,6 +328,10 @@ public class FSkin {
manager.finishLoadingAsset(f12.path()); manager.finishLoadingAsset(f12.path());
Forge.hdstart = true; Forge.hdstart = true;
} }
} else if (f12b.exists() && Forge.allowCardBG) {
manager.load(f12b.path(), Texture.class, Forge.getAssets().getTextureFilter());
manager.finishLoadingAsset(f12b.path());
Forge.hdstart = true;
} else { Forge.hdstart = false; } } else { Forge.hdstart = false; }
//update colors //update colors
for (final FSkinColor.Colors c : FSkinColor.Colors.values()) { for (final FSkinColor.Colors c : FSkinColor.Colors.values()) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -1,119 +1,119 @@
fox.png fox.png
size: 448,224 size: 378, 106
format: RGBA8888 format: RGBA8888
filter: Nearest,Nearest filter: Nearest, Nearest
repeat: none repeat: none
Avatar Avatar
xy: 48, 49 xy: 17, 8
size: 11, 10 size: 16, 16
Idle Idle
xy: 0, 32 xy: 2, 38
size: 32, 32
Idle
xy: 32, 32
size: 32, 32
Idle
xy: 64, 32
size: 32, 32
Idle
xy: 96, 32
size: 32, 32
Idle
xy: 128, 32
size: 32, 32
Idle
xy: 160, 32
size: 32, 32
Idle
xy: 192, 32
size: 32, 32
Idle
xy: 224, 32
size: 32, 32 size: 32, 32
Idle Idle
xy: 256, 32 xy: 2, 4
size: 32, 32
Idle
xy: 288, 32
size: 32, 32
Idle
xy: 320, 32
size: 32, 32
Idle
xy: 352, 32
size: 32, 32
Idle
xy: 384, 32
size: 32, 32
Idle
xy: 416, 32
size: 32, 32
Walk
xy: 0, 96
size: 32, 32 size: 32, 32
Walk Idle
xy: 32, 96 xy: 36, 4
size: 32, 32 size: 32, 32
Walk Idle
xy: 64, 96 xy: 70, 4
size: 32, 32 size: 32, 32
Walk Idle
xy: 96, 96 xy: 206, 4
size: 32, 32 size: 32, 32
Walk Idle
xy: 128, 96 xy: 104, 4
size: 32, 32 size: 32, 32
Walk Idle
xy: 160, 96 xy: 138, 4
size: 32, 32 size: 32, 32
Walk Idle
xy: 192, 96 xy: 172, 4
size: 32, 32 size: 32, 32
Walk Idle
xy: 224, 96 xy: 206, 4
size: 32, 32 size: 32, 32
Walk Idle
xy: 256, 96 xy: 104, 4
size: 32, 32 size: 32, 32
Walk Idle
xy: 288, 96 xy: 240, 4
size: 32, 32 size: 32, 32
Walk Idle
xy: 320, 96 xy: 274, 4
size: 32, 32 size: 32, 32
Attack Idle
xy: 0, 128 xy: 308, 4
size: 32, 32
Idle
xy: 342, 4
size: 32, 32
Walk
xy: 2, 38
size: 32, 32
Walk
xy: 36, 38
size: 32, 32
Walk
xy: 70, 38
size: 32, 32
Walk
xy: 104, 38
size: 32, 32
Walk
xy: 138, 38
size: 32, 32
Walk
xy: 172, 38
size: 32, 32
Walk
xy: 206, 38
size: 32, 32
Walk
xy: 240, 38
size: 32, 32
Walk
xy: 274, 38
size: 32, 32
Walk
xy: 308, 38
size: 32, 32
Walk
xy: 342, 38
size: 32, 32
Attack
xy: 2, 72
size: 32, 32
Attack
xy: 138, 72
size: 32, 32
Attack
xy: 36, 72
size: 32, 32
Attack
xy: 70, 72
size: 32, 32
Attack
xy: 104, 72
size: 32, 32
Death
xy: 2, 72
size: 32, 32
Death
xy: 138, 72
size: 32, 32
Death
xy: 36, 72
size: 32, 32
Death
xy: 274, 72
size: 32, 32
Death
xy: 172, 72
size: 32, 32
Death
xy: 206, 72
size: 32, 32
Death
xy: 240, 72
size: 32, 32 size: 32, 32
Attack
xy: 32, 128
size: 32, 32
Attack
xy: 64, 128
size: 32, 32
Attack
xy: 96, 128
size: 32, 32
Attack
xy: 128, 128
size: 32, 32
Death
xy: 0, 192
size: 32, 32
Death
xy: 32, 192
size: 32, 32
Death
xy: 64, 192
size: 32, 32
Death
xy: 96, 192
size: 32, 32
Death
xy: 128, 192
size: 32, 32
Death
xy: 160, 192
size: 32, 32
Death
xy: 192, 192
size: 32, 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -1,93 +1,90 @@
ooze.png ooze.png
size: 256,160 size: 242, 106
format: RGBA8888 format: RGBA8888
filter: Nearest,Nearest filter: Nearest, Nearest
repeat: none repeat: none
Avatar Avatar
xy: 9, 151 xy: 36, 4
size: 15, 9
Idle
xy: 0, 0
size: 32, 32
Idle
xy: 32, 0
size: 32, 32
Idle
xy: 64, 0
size: 32, 32
Idle
xy: 96, 0
size: 32, 32 size: 32, 32
Idle Idle
xy: 0, 96 xy: 172, 4
size: 32, 32 size: 32, 32
Idle Idle
xy: 32, 96 xy: 2, 4
size: 32, 32 size: 32, 32
Idle orig: 32, 32
xy: 64, 96 Idle
size: 32, 32 xy: 36, 4
Idle size: 32, 32
xy: 96, 96 Idle
size: 32, 32 xy: 172, 4
Walk size: 32, 32
xy: 0, 32 Idle
size: 32, 32 xy: 70, 4
Walk size: 32, 32
xy: 32, 32 Idle
size: 32, 32 xy: 104, 4
Walk size: 32, 32
xy: 64, 32 Idle
size: 32, 32 xy: 138, 4
Walk size: 32, 32
xy: 96, 32 Walk
size: 32, 32 xy: 172, 4
Walk size: 32, 32
xy: 128, 32 Walk
size: 32, 32 xy: 2, 4
Walk size: 32, 32
xy: 160, 32 Walk
size: 32, 32 xy: 206, 4
Walk size: 32, 32
xy: 192, 32 Walk
size: 32, 32 xy: 2, 38
Walk size: 32, 32
xy: 224, 32 Walk
size: 32, 32 xy: 36, 38
Attack size: 32, 32
xy: 0, 64 Walk
size: 32, 32 xy: 70, 38
Attack size: 32, 32
xy: 32, 64 Walk
size: 32, 32 xy: 104, 38
Attack size: 32, 32
xy: 64, 64 Walk
size: 32, 32 xy: 138, 38
Attack size: 32, 32
xy: 96, 64 Attack
size: 32, 32 xy: 172, 4
Attack size: 32, 32
xy: 128, 64 Attack
size: 32, 32 xy: 2, 4
Attack size: 32, 32
xy: 160, 64 Attack
size: 32, 32 xy: 172, 38
Death size: 32, 32
xy: 0, 128 Attack
xy: 206, 38
size: 32, 32
Attack
xy: 2, 72
size: 32, 32
Attack
xy: 36, 72
size: 32, 32
Death
xy: 172, 4
size: 32, 32
Death
xy: 70, 72
size: 32, 32
Death
xy: 104, 72
size: 32, 32
Death
xy: 138, 72
size: 32, 32
Death
xy: 172, 72
size: 32, 32
Death
xy: 206, 72
size: 32, 32 size: 32, 32
Death
xy: 32, 128
size: 32, 32
Death
xy: 64, 128
size: 32, 32
Death
xy: 96, 128
size: 32, 32
Death
xy: 128, 128
size: 32, 32
Death
xy: 160, 128
size: 32, 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -3425,7 +3425,7 @@
"spawnRate": 1, "spawnRate": 1,
"difficulty": 0.1, "difficulty": 0.1,
"speed": 15, "speed": 15,
"scale": 0.75, "scale": 0.5,
"life": 10, "life": 10,
"rewards": [ "rewards": [
{ {
@@ -4099,6 +4099,7 @@
{ {
"name": "Ooze", "name": "Ooze",
"sprite": "sprites/dungeon/ooze.atlas", "sprite": "sprites/dungeon/ooze.atlas",
"scale": 0.6,
"deck": [ "deck": [
"decks/ooze.json" "decks/ooze.json"
], ],

View File

@@ -3,7 +3,7 @@ ManaCost:5 G
Types:Legendary Artifact Creature Wizard Types:Legendary Artifact Creature Wizard
PT:4/3 PT:4/3
K:Reach K:Reach
S:Mode$ Continuous | CharacteristicDefining$ True | SetPower$ 16 | SetToughness$ 9 | IsPresent$ Card.Self+attacking | Affected$ Creature.basePowerEQ4+baseToughnessEQ3+tapped+YouCtrl | Description$ As long as NICKNAME is attacking, tapped creatures you control with base power and toughness 4/3 have base power and toughness 16/9. S:Mode$ Continuous | SetPower$ 16 | SetToughness$ 9 | IsPresent$ Card.Self+attacking | Affected$ Creature.basePowerEQ4+baseToughnessEQ3+tapped+YouCtrl | Description$ As long as NICKNAME is attacking, tapped creatures you control with base power and toughness 4/3 have base power and toughness 16/9.
A:AB$ Mana | Cost$ T | Produced$ W U B R G | TriggersWhenSpent$ TrigChange | SpellDescription$ Add {W}{U}{B}{R}{G}. Creature spells you spend this mana to cast have their base power and toughness become 4/3. A:AB$ Mana | Cost$ T | Produced$ W U B R G | TriggersWhenSpent$ TrigChange | SpellDescription$ Add {W}{U}{B}{R}{G}. Creature spells you spend this mana to cast have their base power and toughness become 4/3.
SVar:TrigChange:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigAnimate | TriggerDescription$ Creature spells you spend this mana to cast have their base power and toughness become 4/3. SVar:TrigChange:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigAnimate | TriggerDescription$ Creature spells you spend this mana to cast have their base power and toughness become 4/3.
SVar:TrigAnimate:DB$ Animate | Defined$ TriggeredCard | Duration$ Permanent | Power$ 4 | Toughness$ 3 SVar:TrigAnimate:DB$ Animate | Defined$ TriggeredCard | Duration$ Permanent | Power$ 4 | Toughness$ 3

View File

@@ -5,7 +5,7 @@ PT:1/1
T:Mode$ ChangesZoneAll | ValidCards$ Creature.basePowerEQ1+baseToughnessEQ1+Other+YouCtrl | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever one or more other creatures with base power and toughness 1/1 enter the battlefield under your control, put a +1/+1 counter on CARDNAME. T:Mode$ ChangesZoneAll | ValidCards$ Creature.basePowerEQ1+baseToughnessEQ1+Other+YouCtrl | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever one or more other creatures with base power and toughness 1/1 enter the battlefield under your control, put a +1/+1 counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever NICKNAME attacks, each other creature you control with base power and toughness 1/1 gets +X/+X until end of turn, where X is the number of +1/+1 counters on NICKNAME. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever NICKNAME attacks, each other creature you control with base power and toughness 1/1 gets +X/+X until end of turn, where X is the number of +1/+1 counters on NICKNAME.
SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.basePowerEQ1+baseToughnessEQ1+Other | NumAtt$ +X | NumDef$ +X SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.basePowerEQ1+baseToughnessEQ1+Other+YouCtrl | NumAtt$ +X | NumDef$ +X
SVar:X:Count$CardCounters.P1P1 SVar:X:Count$CardCounters.P1P1
DeckHas:Ability$Counters DeckHas:Ability$Counters
DeckHints:Type$Citizen DeckHints:Type$Citizen

View File

@@ -5,6 +5,6 @@ PT:5/9
K:Islandwalk K:Islandwalk
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, exile it. Return it to the battlefield under your control tapped and attacking at the beginning of the next declare attackers step on your next turn. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, exile it. Return it to the battlefield under your control tapped and attacking at the beginning of the next declare attackers step on your next turn.
SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DelTrig SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DelTrig
SVar:DelTrig:DB$ DelayedTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card | DelayedTriggerDefinedPlayer$ You | ThisTurn$ True | Mode$ Phase | Phase$ Declare Attackers | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to the battlefield tapped and attacking. SVar:DelTrig:DB$ DelayedTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card | DelayedTriggerDefinedPlayer$ You | RememberObjects$ RememberedLKI | ThisTurn$ True | Mode$ Phase | Phase$ Declare Attackers | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to the battlefield tapped and attacking.
SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Exile | Destination$ Battlefield | Attacking$ True | Tapped$ True | GainControl$ True SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Exile | Destination$ Battlefield | Attacking$ True | Tapped$ True | GainControl$ True
Oracle:Islandwalk (This creature can't be blocked as long as defending player controls an Island.)\nWhenever Meandering Towershell attacks, exile it. Return it to the battlefield under your control tapped and attacking at the beginning of the declare attackers step on your next turn. Oracle:Islandwalk (This creature can't be blocked as long as defending player controls an Island.)\nWhenever Meandering Towershell attacks, exile it. Return it to the battlefield under your control tapped and attacking at the beginning of the declare attackers step on your next turn.

View File

@@ -1,3 +1,5 @@
An Uncommon Budget | https://downloads.cardforge.org/decks/uncommonbudget-brawl.zip
Brewer's Kitchen | https://downloads.cardforge.org/decks/brewerskitchen-brawl.zip
Budget Magic | https://downloads.cardforge.org/decks/budgetmagic-brawl.zip Budget Magic | https://downloads.cardforge.org/decks/budgetmagic-brawl.zip
Card Preview | https://downloads.cardforge.org/decks/cardpreview-brawl.zip Card Preview | https://downloads.cardforge.org/decks/cardpreview-brawl.zip
Commander Clash | https://downloads.cardforge.org/decks/commanderclash-brawl.zip Commander Clash | https://downloads.cardforge.org/decks/commanderclash-brawl.zip

View File

@@ -1,4 +1,5 @@
99 Problems | https://downloads.cardforge.org/decks/99problems.zip 99 Problems | https://downloads.cardforge.org/decks/99problems.zip
Brewer's Kitchen | https://downloads.cardforge.org/decks/brewerskitchen-commander.zip
Budget Commander | https://downloads.cardforge.org/decks/budgetcommander.zip Budget Commander | https://downloads.cardforge.org/decks/budgetcommander.zip
Card Preview | https://downloads.cardforge.org/decks/cardpreview-commander.zip Card Preview | https://downloads.cardforge.org/decks/cardpreview-commander.zip
Command Tower | https://downloads.cardforge.org/decks/commandtower.zip Command Tower | https://downloads.cardforge.org/decks/commandtower.zip

View File

@@ -1,6 +1,8 @@
Against the Odds | https://downloads.cardforge.org/decks/againsttheodds.zip Against the Odds | https://downloads.cardforge.org/decks/againsttheodds.zip
An Uncommon Budget | https://downloads.cardforge.org/decks/uncommonbudget.zip
Arena Championship | https://downloads.cardforge.org/decks/arenachampionship.zip Arena Championship | https://downloads.cardforge.org/decks/arenachampionship.zip
Breaking Through | https://downloads.cardforge.org/decks/breakingthrough.zip Breaking Through | https://downloads.cardforge.org/decks/breakingthrough.zip
Brewer's Kitchen | https://downloads.cardforge.org/decks/brewerskitchen.zip
Brewing on a Budget | https://downloads.cardforge.org/decks/brewingonabudget.zip Brewing on a Budget | https://downloads.cardforge.org/decks/brewingonabudget.zip
Budget Magic | https://downloads.cardforge.org/decks/budgetmagic.zip Budget Magic | https://downloads.cardforge.org/decks/budgetmagic.zip
Budget Modern Metagame | https://downloads.cardforge.org/decks/budgetmodernmetagame.zip Budget Modern Metagame | https://downloads.cardforge.org/decks/budgetmodernmetagame.zip