From 19d2703ff425eaa816cb8bb36cc473b46fba391e Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Thu, 13 Jun 2019 22:34:31 +0000 Subject: [PATCH 01/64] Update forge-gui/res/editions/Magic 2020.txt --- forge-gui/res/editions/Magic 2020.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 forge-gui/res/editions/Magic 2020.txt diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt new file mode 100644 index 00000000000..4fd58ad5ff7 --- /dev/null +++ b/forge-gui/res/editions/Magic 2020.txt @@ -0,0 +1,14 @@ +[metadata] +Code=M20 +Date=2019-07-12 +Name=Core Set 2019 +MciCode=m20 +Type=Core + +[cards] +126 R Chandra, Acolyte of the Flame +127 M Chandra, Awakened Inferno +128 U Chandra, Novice Pyromancer + +[tokens] +r_1_1_elemental From 80946ca88fe5bf2be9eff4cd1dbe3dc8b7478075 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Jun 2019 12:59:06 +0300 Subject: [PATCH 02/64] - Fix a logic error in TapAllAi --- forge-ai/src/main/java/forge/ai/ability/TapAllAi.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java index 8744ade29f0..baf1842e4e0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java @@ -24,8 +24,7 @@ import java.util.List; public class TapAllAi extends SpellAbilityAi { @Override protected boolean canPlayAI(final Player ai, SpellAbility sa) { - // If tapping all creatures do it either during declare attackers of AIs - // turn + // If tapping all creatures do it either during declare attackers of AIs turn // or during upkeep/begin combat? final Card source = sa.getHostCard(); @@ -86,7 +85,7 @@ public class TapAllAi extends SpellAbilityAi { return false; } // in AI's turn, check if there are possible attackers, before tapping blockers - if (game.getPhaseHandler().isPlayerTurn(ai) && !SpellAbilityAi.isSorcerySpeed(sa)) { + if (game.getPhaseHandler().isPlayerTurn(ai)) { validTappables = ai.getCardsIn(ZoneType.Battlefield); final boolean any = Iterables.any(validTappables, new Predicate() { @Override From e75929c16d1626bb9cb164c44b63052352490de4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Jun 2019 13:13:19 +0300 Subject: [PATCH 03/64] - Fix tests to comply with the newest Oracle. --- .../src/test/java/forge/ai/simulation/GameSimulatorTest.java | 4 ++-- .../test/java/forge/ai/simulation/SpellAbilityPickerTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java index 062cdcb54ce..49c26d51663 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java @@ -501,7 +501,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertTrue(depths.hasCounters()); SpellAbility sa = findSAWithPrefix(thespian, - "{2}, {T}: CARDNAME becomes a copy of target land and gains this ability."); + "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); assertNotNull(sa); sa.getTargets().add(depths); @@ -526,7 +526,7 @@ public class GameSimulatorTest extends SimulationTestCase { game.getAction().checkStateEffects(true); SpellAbility sa = findSAWithPrefix(thespian, - "{2}, {T}: CARDNAME becomes a copy of target land and gains this ability."); + "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); assertNotNull(sa); sa.getTargets().add(thespian); diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java index 50c5977df39..6a1bd7cf654 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java @@ -235,7 +235,7 @@ public class SpellAbilityPickerTest extends SimulationTestCase { assertEquals("Urborg, Tomb of Yawgmoth", choices.get(1)); // Next, expected to use Thespian's Stage to copy Dark Depths. Plan.Decision d2 = picker.getPlan().getDecisions().get(1); - String expected = "{2}, {T}: Thespian's Stage becomes a copy of target land and gains this ability."; + String expected = "{2}, {T}: Thespian's Stage becomes a copy of target land, except it has this ability."; assertEquals(expected, d2.saRef.toString()); assertTrue(d2.targets.toString().contains("Dark Depths")); } From f7cd068532571d14070e4a5363efb4f2b15e64b7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Jun 2019 15:52:31 +0300 Subject: [PATCH 04/64] - Added an AI logic parameter to Bond of Discipline similar to Cryptic Command --- forge-gui/res/cardsfolder/b/bond_of_discipline.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/b/bond_of_discipline.txt b/forge-gui/res/cardsfolder/b/bond_of_discipline.txt index 7401f579fc2..c6e19d0a070 100644 --- a/forge-gui/res/cardsfolder/b/bond_of_discipline.txt +++ b/forge-gui/res/cardsfolder/b/bond_of_discipline.txt @@ -1,6 +1,6 @@ Name:Bond of Discipline ManaCost:4 W Types:Sorcery -A:SP$ TapAll | Cost$ 4 W | ValidCards$ Creature.OppCtrl | SubAbility$ DBPumpAll | SpellDescription$ Tap all creatures your opponents control. Creatures you control gain lifelink until end of turn. +A:SP$ TapAll | Cost$ 4 W | ValidCards$ Creature.OppCtrl | AILogic$ AtLeast3 | SubAbility$ DBPumpAll | SpellDescription$ Tap all creatures your opponents control. Creatures you control gain lifelink until end of turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Lifelink Oracle:Tap all creatures your opponents control. Creatures you control gain lifelink until end of turn. From 7b8e59810c5e8bd9021b12adc8b0f0ad6150f610 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Jun 2019 17:20:40 +0300 Subject: [PATCH 05/64] - Somewhat better logic for Might of Old Krosa and Arrester's Zeal, allowing the AI to use them in Main 1 in overwhelming situations. --- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 3 ++- forge-ai/src/main/java/forge/ai/ability/PumpAi.java | 3 ++- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- forge-gui/res/cardsfolder/m/might_of_old_krosa.txt | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index e013f26d785..bab3509cb5c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1213,6 +1213,7 @@ public class ComputerUtilCard { final Game game = ai.getGame(); final PhaseHandler phase = game.getPhaseHandler(); final Combat combat = phase.getCombat(); + final boolean main1Preferred = "Main1IfAble".equals(sa.getParam("AILogic")) && phase.is(PhaseType.MAIN1, ai); final boolean isBerserk = "Berserk".equals(sa.getParam("AILogic")); final boolean loseCardAtEOT = "Sacrifice".equals(sa.getParam("AtEOT")) || "Exile".equals(sa.getParam("AtEOT")) || "Destroy".equals(sa.getParam("AtEOT")) || "ExileCombat".equals(sa.getParam("AtEOT")); @@ -1250,7 +1251,7 @@ public class ComputerUtilCard { // will the creature attack (only relevant for sorcery speed)? if (phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) && phase.isPlayerTurn(ai) - && SpellAbilityAi.isSorcerySpeed(sa) + && SpellAbilityAi.isSorcerySpeed(sa) || main1Preferred && power > 0 && ComputerUtilCard.doesCreatureAttackAI(ai, c)) { return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 5a1a7b92887..b0a1a054e59 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -104,6 +104,7 @@ public class PumpAi extends PumpAiBase { @Override protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) { final Game game = ai.getGame(); + boolean main1Preferred = "Main1IfAble".equals(sa.getParam("AILogic")) && ph.is(PhaseType.MAIN1, ai); if (game.getStack().isEmpty() && hasTapCost(sa.getPayCosts(), sa.getHostCard())) { if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) && ph.isPlayerTurn(ai)) { return false; @@ -115,7 +116,7 @@ public class PumpAi extends PumpAiBase { if (game.getStack().isEmpty() && ph.getPhase().isBefore(PhaseType.COMBAT_BEGIN)) { // Instant-speed pumps should not be cast outside of combat when the // stack is empty - if (!sa.isCurse() && !SpellAbilityAi.isSorcerySpeed(sa)) { + if (!sa.isCurse() && !SpellAbilityAi.isSorcerySpeed(sa) && !main1Preferred) { return false; } } diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index 627dbcc32d1..0dc3e781a08 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -1,6 +1,6 @@ Name:Arrester's Zeal ManaCost:W Types:Instant -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. +A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | AILogic$ Main1IfAble | SpellDescription$ Target creature gets +2/+2 until end of turn. SVar:DBAddendum:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt b/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt index 5f5f3e33b8b..f164c1fbc8f 100644 --- a/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt +++ b/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt @@ -1,7 +1,7 @@ Name:Might of Old Krosa ManaCost:G Types:Instant -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ X | NumDef$ X | References$ X | SpellDescription$ Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. +A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ X | NumDef$ X | References$ X | AILogic$ Main1IfAble | SpellDescription$ Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. SVar:X:Count$IfCastInOwnMainPhase.4.2 SVar:Picture:http://www.wizards.com/global/images/magic/general/might_of_old_krosa.jpg Oracle:Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. From 46c91b9eb5931327e841672a633920e2a92bd2d1 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Jun 2019 17:32:46 +0300 Subject: [PATCH 06/64] - Fix Aquatic Incursion --- forge-gui/res/cardsfolder/a/aquatic_incursion.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/aquatic_incursion.txt b/forge-gui/res/cardsfolder/a/aquatic_incursion.txt index 4c849c6d88c..c00c999b7e9 100644 --- a/forge-gui/res/cardsfolder/a/aquatic_incursion.txt +++ b/forge-gui/res/cardsfolder/a/aquatic_incursion.txt @@ -2,7 +2,7 @@ Name:Aquatic Incursion ManaCost:3 U Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 blue Merfolk creature tokens with hexproof. -SVar:TrigToken:DB$Token | LegacyImage$ u 1 1 merfolk hexproof rix | TokenScript$ u_1_1_merfolk_hexproof | TokenOwner$ You +SVar:TrigToken:DB$Token | TokenAmount$ 2 | LegacyImage$ u 1 1 merfolk hexproof rix | TokenScript$ u_1_1_merfolk_hexproof | TokenOwner$ You A:AB$ Pump | Cost$ 3 U | ValidTgts$ Merfolk | TgtPrompt$ Select target Merfolk | KW$ HIDDEN Unblockable | SpellDescription$ Target Merfolk can't be blocked this turn. DeckHints:Type$Merfolk SVar:Picture:http://www.wizards.com/global/images/magic/general/aquatic_incursion.jpg From 6c15a05c8eb23fe709d2759dfc8bf133baf7ef9c Mon Sep 17 00:00:00 2001 From: Adam Pantel <> Date: Sun, 16 Jun 2019 14:28:05 -0400 Subject: [PATCH 07/64] Fix defender selection on "enters attacking" effects --- .../ability/effects/ChangeZoneEffect.java | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 04b2e5b66da..52f2dfa00dd 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -543,13 +543,27 @@ public class ChangeZoneEffect extends SpellAbilityEffect { movedCard.turnFaceDown(true); } if (sa.hasParam("Attacking")) { - // What should they attack? - FCollectionView defenders = game.getCombat().getDefenders(); - if (!defenders.isEmpty()) { - // Blockeres are already declared, set this to unblocked - game.getCombat().addAttacker(tgtC, defenders.getFirst()); - game.getCombat().getBandOfAttacker(tgtC).setBlocked(false); - game.fireEvent(new GameEventCombatChanged()); + final Combat combat = game.getCombat(); + if ( null != combat ) { + final FCollectionView e = combat.getDefenders(); + + GameEntity defender = null; + if (sa.hasParam("DefinedDefender")) { + FCollection objs = AbilityUtils.getDefinedObjects(sa.getHostCard(), sa.getParam("DefinedDefender"), sa); + for(GameObject obj : objs) { + if (obj instanceof GameEntity) { + defender = (GameEntity)obj; + break; + } + } + } else { + defender = player.getController().chooseSingleEntityForEffect(e, sa, "Declare a defender for " + movedCard ); + } + if (defender != null) { + combat.addAttacker(movedCard, defender); + game.getCombat().getBandOfAttacker(movedCard).setBlocked(false); + game.fireEvent(new GameEventCombatChanged()); + } } } if (sa.hasParam("Ninjutsu")) { @@ -1028,6 +1042,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (defender != null) { combat.addAttacker(c, defender); + game.getCombat().getBandOfAttacker(c).setBlocked(false); game.fireEvent(new GameEventCombatChanged()); } } From 97ae1bc45149aee01f5ccc3affb36e4815319668 Mon Sep 17 00:00:00 2001 From: kms70847 Date: Mon, 17 Jun 2019 00:42:13 -0400 Subject: [PATCH 08/64] Shuffle list of potential cards before passing them to the commander deck generator. Proposed fix for https://git.cardforge.org/core-developers/forge/issues/1057 --- forge-gui/src/main/java/forge/deck/DeckgenUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index f1854cb2ea6..9ace1b8cbbd 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -624,13 +624,13 @@ public class DeckgenUtil { }else { List> potentialCards = new ArrayList<>(); potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(DeckFormat.Commander.toString()).get(commander.getName())); + Collections.shuffle(potentialCards, MyRandom.getRandom()); for(Map.Entry pair:potentialCards){ if(format.isLegalCard(pair.getKey())) { preSelectedCards.add(pair.getKey()); } } } - //Collections.shuffle(potentialCards, r); //check for partner commanders From 489f583e67a8d21763e9e4c24595de64d80c93b3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 17 Jun 2019 17:57:19 +0300 Subject: [PATCH 09/64] - Fix Shirei, Shizo's Caretaker --- forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt b/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt index 199cd063057..a020b1c0492 100644 --- a/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt +++ b/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt @@ -3,7 +3,7 @@ ManaCost:4 B Types:Legendary Creature Spirit PT:2/2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Creature.powerLE1+YouOwn | OptionalDecider$ You | Execute$ DelTrig | TriggerDescription$ Whenever a creature with power 1 or less is put into your graveyard from the battlefield, you may return that card to the battlefield at the beginning of the next end step if CARDNAME is still on the battlefield. -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigReturn | IsPresent$ Card.Self | PresentZone$ Battlefield | RememberObjects$ TriggeredCard | TriggerDescription$ Return creature to the battlefield. +SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigReturn | IsPresent$ Card.Self+StrictlySelf | PresentZone$ Battlefield | RememberObjects$ TriggeredCard | TriggerDescription$ Return creature to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ DelayTriggerRemembered | IsPresent$ Card.Self+StrictlySelf | PresentZone$ Battlefield T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Static$ True | Execute$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearTriggered$ True From db7077adcda69571ce0ec7f2d4158c0621ab31aa Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Mon, 17 Jun 2019 15:21:23 +0000 Subject: [PATCH 10/64] Add the first several preview cards --- .../upcoming/angel_of_vitality.txt | 6 +++ .../upcoming/atemsis_all_seeing.txt | 6 +++ .../upcoming/cavalier_of_flame.txt | 5 +++ .../upcoming/chandra_acolyte_of_flame.txt | 5 +++ .../upcoming/chandra_awakened_inferno.txt | 5 +++ .../upcoming/chandra_novice_pyromancer.txt | 5 +++ .../upcoming/chandras_embercat.txt | 5 +++ .../upcoming/chandras_regulator.txt | 4 ++ .../cardsfolder/upcoming/corpse_knight.txt | 5 +++ .../upcoming/creeping_trailblazer.txt | 5 +++ .../cardsfolder/upcoming/cryptic_caves.txt | 4 ++ .../cardsfolder/upcoming/dread_presence.txt | 5 +++ .../res/cardsfolder/upcoming/flame_sweep.txt | 4 ++ .../upcoming/rienne_angel_of_rebirth.txt | 6 +++ .../upcoming/scheming_symmetry.txt | 4 ++ .../upcoming/wakeroot_elemental.txt | 5 +++ .../cardsfolder/upcoming/yaroks_fenlurker.txt | 5 +++ forge-gui/res/editions/Magic 2020.txt | 40 ++++++++++++++++++- 18 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/angel_of_vitality.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/atemsis_all_seeing.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chandras_regulator.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/corpse_knight.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/cryptic_caves.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dread_presence.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/flame_sweep.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/angel_of_vitality.txt b/forge-gui/res/cardsfolder/upcoming/angel_of_vitality.txt new file mode 100644 index 00000000000..1befc003830 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/angel_of_vitality.txt @@ -0,0 +1,6 @@ +Name:Angel of Vitality +ManaCost:2 W +Types:Creature Angel +K:Flying +Oracle:Flying\nIf you would gain life, you gain that much life plus 1 instead.\nAngel of Vitality gets +2/+2 as long as you have 25 or more life. +PT:2/2 diff --git a/forge-gui/res/cardsfolder/upcoming/atemsis_all_seeing.txt b/forge-gui/res/cardsfolder/upcoming/atemsis_all_seeing.txt new file mode 100644 index 00000000000..66975497e61 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/atemsis_all_seeing.txt @@ -0,0 +1,6 @@ +Name:Atemsis, All-Seeing +ManaCost:3 U U U +Types:Legendary Creature Sphinx +K:Flying +Oracle:Flying\n{2}{U}, {T}: Draw two cards, then discard a card.\nWhenever Atemsis, All-Seeing deals damage to an opponent, you may reveal your hand. If cards with at least six different converted mana costs are revealed this way, that player loses the game. +PT:4/5 diff --git a/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt b/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt new file mode 100644 index 00000000000..873f7e72967 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt @@ -0,0 +1,5 @@ +Name:Cavalier of Flame +ManaCost:2 R R R +Types:Creature Elemental Knight +Oracle:{1}{R}: Creatures you control get +1/+0 and gain haste until end of turn.\nWhen Cavalier of Flame enters the battlefield, discard any number of cards, then draw that many cards.\nWhen Cavalier of Flame dies, it deals X damage to each opponent and each planeswalker they control, where X is the number of land cards in your graveyard. +PT:6/5 diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt b/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt new file mode 100644 index 00000000000..4213ab621f1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt @@ -0,0 +1,5 @@ +Name:Chandra, Acolyte of Flame +ManaCost:1 R R +Types:Legendary Planeswalker Chandra +Oracle:[0]: Put a loyalty counter on each red planeswalker you control.\n[0]: Create two 1/1 red Elemental creature tokens. They gain haste. Sacrifice them at the beginning of the next end step.\n[-2]: You may cast target instant or sorcery card with converted mana cost 3 or less from your graveyard. If that card would be put into your graveyard this turn, exile it instead. +Loyalty:4 diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt b/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt new file mode 100644 index 00000000000..ee9f683a116 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt @@ -0,0 +1,5 @@ +Name:Chandra, Awakened Inferno +ManaCost:4 R R +Types:Legendary Planeswalker Chandra +Oracle:This spell can't be countered.\n[+2]: Each opponent gets an emblem with "At the beginning of your upkeep, this emblem deals 1 damage to you."\n[-3]: Chandra, Awakened Inferno deals 3 damage to each non-Elemental creature.\n[-X]: Chandra, Awakened Inferno deals X damage to target creature or planeswalker. If a permanent dealt damage this way would die this turn, exile it instead. +Loyalty:6 diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt b/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt new file mode 100644 index 00000000000..9b7e3dba255 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt @@ -0,0 +1,5 @@ +Name:Chandra, Novice Pyromancer +ManaCost:3 R +Types:Legendary Planeswalker Chandra +Oracle:[+1]: Elementals you control get +2/+0 until end of turn.\n[-1]: Add {R}{R}.\n[-2]: Chandra, Novice Pyromancer deals 2 damage to any target. +Loyalty:5 diff --git a/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt b/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt new file mode 100644 index 00000000000..23977b6fd23 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt @@ -0,0 +1,5 @@ +Name:Chandra's Embercat +ManaCost:1 R +Types:Creature Elemental Cat +Oracle:{T}: Add {R}. Spend this mana only to cast an Elemental spell or a Chandra planeswalker spell. +PT:2/2 diff --git a/forge-gui/res/cardsfolder/upcoming/chandras_regulator.txt b/forge-gui/res/cardsfolder/upcoming/chandras_regulator.txt new file mode 100644 index 00000000000..5e860216f92 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chandras_regulator.txt @@ -0,0 +1,4 @@ +Name:Chandra's Regulator +ManaCost:1 R +Types:Legendary Artifact +Oracle:Whenever you activate a loyalty ability of a Chandra planeswalker, you may pay {1}. If you do, copy that ability. You may choose new targets for the copy.\n{1}, {T}, Discard a Mountain card or a red card: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt b/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt new file mode 100644 index 00000000000..d80fff7d91a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt @@ -0,0 +1,5 @@ +Name:Corpse Knight +ManaCost:W B +Types:Creature Zombie Knight +Oracle:Whenever another creature enters the battlefield under your control, each opponent loses 1 life. +PT:2/2 diff --git a/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt b/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt new file mode 100644 index 00000000000..5fdf1aaf798 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt @@ -0,0 +1,5 @@ +Name:Creeping Trailblazer +ManaCost:R G +Types:Creature Elemental +Oracle:Other Elementals you control get +1/+0.\n{2}{R}{G}: Creeping Trailblazer gets +1/+1 until end of turn for each Elemental you control. +PT:2/2 diff --git a/forge-gui/res/cardsfolder/upcoming/cryptic_caves.txt b/forge-gui/res/cardsfolder/upcoming/cryptic_caves.txt new file mode 100644 index 00000000000..02a50c65dbe --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cryptic_caves.txt @@ -0,0 +1,4 @@ +Name:Cryptic Caves +ManaCost:no cost +Types:Land +Oracle:{T}: Add {C}.\n{1}, {T}, Sacrifice Cryptic Caves: Draw a card. Activate this ability only if you control five or more lands. diff --git a/forge-gui/res/cardsfolder/upcoming/dread_presence.txt b/forge-gui/res/cardsfolder/upcoming/dread_presence.txt new file mode 100644 index 00000000000..a57b961cc0a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dread_presence.txt @@ -0,0 +1,5 @@ +Name:Dread Presence +ManaCost:3 B +Types:Creature Nightmare +Oracle:Whenever a Swamp enters the battlefield under your control, choose one--\n*You draw a card and you lose 1 life.\n*Dread Presence deals 2 damage to any target and you gain 2 life. +PT:3/3 diff --git a/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt b/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt new file mode 100644 index 00000000000..29b66bef38c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt @@ -0,0 +1,4 @@ +Name:Flame Sweep +ManaCost:2 R +Types:Instant +Oracle:Flame Sweep deals 2 damage to each creature except for creatures you control with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt b/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt new file mode 100644 index 00000000000..41f7e4d652e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt @@ -0,0 +1,6 @@ +Name:Rienne, Angel of Rebirth +ManaCost:2 R G W +Types:Legendary Creature Angel +K:Flying +Oracle:Flying\nOther multicolored creatures you control get +1/+0.\nWhenever another multicolored creature you control dies, return it to its owner's hand at the beginning of the next end step. +PT:5/4 diff --git a/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt b/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt new file mode 100644 index 00000000000..93894ce396d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt @@ -0,0 +1,4 @@ +Name:Scheming Symmetry +ManaCost:B +Types:Sorcery +Oracle:Choose two target players. Each of them searches their library for a card, then shuffles their library and puts that card on top of it. diff --git a/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt b/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt new file mode 100644 index 00000000000..8c38957f5fb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt @@ -0,0 +1,5 @@ +Name:Wakeroot Elemental +ManaCost:4 G G +Types:Creature Elemental +Oracle:{G}{G}{G}{G}{G}: Untap a land of your choice that you control. It becomes a 5/5 Elemental creature with haste. It's still a land. (This effect lasts until as long as that land is in play.) +PT:5/5 diff --git a/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt b/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt new file mode 100644 index 00000000000..ff078ebe2dc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt @@ -0,0 +1,5 @@ +Name:Yarok's Fenlurker +ManaCost:B B +Types:Creature Horror +Oracle:When Yarok's Fenlurker enters the battlefield, each opponent exiles a card from their hand.\n{2}{B}: Yarok's Fenlurker gets +1/+1 until end of turn. +PT:1/1 diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index 4fd58ad5ff7..d61bd2cd0fe 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -1,14 +1,50 @@ [metadata] Code=M20 Date=2019-07-12 -Name=Core Set 2019 +Name=Core Set 2020 MciCode=m20 Type=Core +BoosterCovers=5 +Booster=10 Common:!fromSheet("M19 Secret Cards"), 3 Uncommon:!fromSheet("M19 Secret Cards"), 1 RareMythic:!fromSheet("M19 Secret Cards"), 1 fromSheet("M19 Lands") [cards] -126 R Chandra, Acolyte of the Flame +4 U Angel of Vitality + +13 U Devout Decree + +46 R Atemsis, All-Seeing + +69 C Negate + +95 U Disfigure +96 R Dread Presence + +113 R Scheming Symmetry + +123 U Yarok's Fenlurker + +125 M Cavalier of Flame +126 R Chandra, Acolyte of Flame 127 M Chandra, Awakened Inferno 128 U Chandra, Novice Pyromancer +129 C Chandra's Embercat + +131 R Chandra's Regulator +132 U Chandra's Spitfire + +139 U Flame Sweep + +197 R Thrashing Brontodon + +202 R Wakeroot Elemental + +206 U Corpse Knight +207 U Creeping Trailblazer + +244 U Cryptic Caves + +280 L Forest +281 M Rienne, Angel of Rebirth [tokens] r_1_1_elemental From 7a7cf01cafbca34251e46cdd894294b16439f1c7 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Mon, 17 Jun 2019 15:38:48 +0000 Subject: [PATCH 11/64] Rienne is a secret card, add Ironroot Warlord and Unsummon. --- forge-gui/res/blockdata/printsheets.txt | 5 ++++- forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt | 5 +++++ forge-gui/res/editions/Magic 2020.txt | 9 +++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt diff --git a/forge-gui/res/blockdata/printsheets.txt b/forge-gui/res/blockdata/printsheets.txt index af99de474f2..3d876bec8c6 100644 --- a/forge-gui/res/blockdata/printsheets.txt +++ b/forge-gui/res/blockdata/printsheets.txt @@ -1457,4 +1457,7 @@ Snow-Covered Plains Snow-Covered Island Snow-Covered Swamp Snow-Covered Mountain -Snow-Covered Forest \ No newline at end of file +Snow-Covered Forest + +[M20 Secret Cards] +Rienne, Angel of Rebirth \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt b/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt new file mode 100644 index 00000000000..d6ef3131f51 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt @@ -0,0 +1,5 @@ +Name:Ironroot Warlord +ManaCost:1 G W +Types:Creature Treefolk Soldier +Oracle:Ironroot Warlord's power is equal to the number of creatures you control.\n{3}{G}{W}: Create a 1/1 white Soldier creature token. +PT:*/5 diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index d61bd2cd0fe..0a43c759889 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -4,8 +4,8 @@ Date=2019-07-12 Name=Core Set 2020 MciCode=m20 Type=Core -BoosterCovers=5 -Booster=10 Common:!fromSheet("M19 Secret Cards"), 3 Uncommon:!fromSheet("M19 Secret Cards"), 1 RareMythic:!fromSheet("M19 Secret Cards"), 1 fromSheet("M19 Lands") +BoosterCovers=1 +Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Secret Cards"), 1 RareMythic:!fromSheet("M20 Secret Cards"), 1 BasicLand [cards] 4 U Angel of Vitality @@ -16,6 +16,8 @@ Booster=10 Common:!fromSheet("M19 Secret Cards"), 3 Uncommon:!fromSheet("M19 Sec 69 C Negate +78 C Unsummon + 95 U Disfigure 96 R Dread Presence @@ -41,6 +43,8 @@ Booster=10 Common:!fromSheet("M19 Secret Cards"), 3 Uncommon:!fromSheet("M19 Sec 206 U Corpse Knight 207 U Creeping Trailblazer +209 U Ironroot Warlord + 244 U Cryptic Caves 280 L Forest @@ -48,3 +52,4 @@ Booster=10 Common:!fromSheet("M19 Secret Cards"), 3 Uncommon:!fromSheet("M19 Sec [tokens] r_1_1_elemental +w_1_1_soldier From 68f8b9800cb8c0a884387220726915a6cc7ce72d Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Mon, 17 Jun 2019 15:46:41 +0000 Subject: [PATCH 12/64] add ajani --- .../upcoming/ajani_strength_of_the_pride.txt | 5 +++++ forge-gui/res/editions/Magic 2020.txt | 2 ++ forge-gui/res/tokenscripts/ajanis_pridemate.txt | 10 ++++++++++ 3 files changed, 17 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt create mode 100644 forge-gui/res/tokenscripts/ajanis_pridemate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt b/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt new file mode 100644 index 00000000000..99a470e12a2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt @@ -0,0 +1,5 @@ +Name:Ajani, Strength of the Pride +ManaCost:2 W W +Types:Legendary Planeswalker Ajani +Oracle:[+1]: You gain life equal to the number of creatures you control plus the number of planeswalkers you control.\n[-2]: Create a 2/2 white Cat Soldier creature token named Ajani's Pridemate with "Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate."\n[0]: If you have at least 15 life or more than your starting life total, exile Ajani, Strength of the Pride and each artifact and creature your opponents control. +Loyalty:5 diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index 0a43c759889..1f644718290 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -8,6 +8,7 @@ BoosterCovers=1 Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Secret Cards"), 1 RareMythic:!fromSheet("M20 Secret Cards"), 1 BasicLand [cards] +2 M Ajani, Strength of the Pride 4 U Angel of Vitality 13 U Devout Decree @@ -51,5 +52,6 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 281 M Rienne, Angel of Rebirth [tokens] +ajanis_pridemate r_1_1_elemental w_1_1_soldier diff --git a/forge-gui/res/tokenscripts/ajanis_pridemate.txt b/forge-gui/res/tokenscripts/ajanis_pridemate.txt new file mode 100644 index 00000000000..5d8fd74e6b6 --- /dev/null +++ b/forge-gui/res/tokenscripts/ajanis_pridemate.txt @@ -0,0 +1,10 @@ +Name:Ajani's Pridemate +ManaCost:no cost +Types:Creature Cat Soldier +PT:2/2 +T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you gain life, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:Picture:http://www.wizards.com/global/images/magic/general/ajanis_pridemate.jpg +DeckHints:Ability$LifeGain +DeckHas:Ability$Counters +Oracle:Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate. From e927b6f6de68ad2bf24e37ce86c3c1d05a1885fd Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Mon, 17 Jun 2019 15:49:43 +0000 Subject: [PATCH 13/64] empyrean eagle --- forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt | 6 ++++++ forge-gui/res/editions/Magic 2020.txt | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt b/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt new file mode 100644 index 00000000000..40afe7b9827 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt @@ -0,0 +1,6 @@ +Name:Empyrean Eagle +ManaCost:1 W U +Types:Creature Bird Spirit +K:Flying +Oracle:Flying\nOther creatures you control with flying get +1/+1. +PT:2/3 diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index 1f644718290..3d284aed21f 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -43,7 +43,7 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 206 U Corpse Knight 207 U Creeping Trailblazer - +208 U Empyrean Eagle 209 U Ironroot Warlord 244 U Cryptic Caves From 077bfc4fdf9f65533a0e8b5072abf6cc98792bd2 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 17 Jun 2019 19:08:14 +0300 Subject: [PATCH 14/64] - Added AI cast preference to Mass Hysteria and Concordant Crossroads --- forge-ai/src/main/java/forge/ai/ability/PermanentAi.java | 9 ++++----- forge-gui/res/cardsfolder/c/concordant_crossroads.txt | 1 + forge-gui/res/cardsfolder/m/mass_hysteria.txt | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index e89c9e87d3e..3832bd0c956 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -1,5 +1,6 @@ package forge.ai.ability; +import forge.game.card.*; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicates; @@ -12,10 +13,6 @@ import forge.card.CardType.Supertype; import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.GlobalRuleChange; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardLists; -import forge.game.card.CardPredicates; import forge.game.cost.Cost; import forge.game.keyword.KeywordInterface; import forge.game.mana.ManaCostBeingPaid; @@ -198,7 +195,9 @@ public class PermanentAi extends SpellAbilityAi { } } else if (param.startsWith("MaxControlled")) { // Only cast unless there are X or more cards like this on the battlefield under AI control already, - CardCollection ctrld = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals(card.getName())); + CardCollectionView valid = param.contains("Globally") ? ai.getGame().getCardsIn(ZoneType.Battlefield) + : ai.getCardsIn(ZoneType.Battlefield); + CardCollection ctrld = CardLists.filter(valid, CardPredicates.nameEquals(card.getName())); int numControlled = 0; if (param.endsWith("WithoutOppAuras")) { diff --git a/forge-gui/res/cardsfolder/c/concordant_crossroads.txt b/forge-gui/res/cardsfolder/c/concordant_crossroads.txt index 5c8339c3e58..07daa2a86be 100644 --- a/forge-gui/res/cardsfolder/c/concordant_crossroads.txt +++ b/forge-gui/res/cardsfolder/c/concordant_crossroads.txt @@ -5,6 +5,7 @@ S:Mode$ Continuous | Affected$ Creature | AddKeyword$ Haste | Description$ All c SVar:BuffedBy:Creature SVar:AntiBuffedBy:Creature SVar:NonStackingEffect:True +SVar:AICastPreference:MaxControlledGlobally$ 1 AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/concordant_crossroads.jpg Oracle:All creatures have haste. diff --git a/forge-gui/res/cardsfolder/m/mass_hysteria.txt b/forge-gui/res/cardsfolder/m/mass_hysteria.txt index c8976a546e0..cba6baf17cd 100644 --- a/forge-gui/res/cardsfolder/m/mass_hysteria.txt +++ b/forge-gui/res/cardsfolder/m/mass_hysteria.txt @@ -6,5 +6,6 @@ SVar:NonStackingEffect:True AI:RemoveDeck:Random SVar:BuffedBy:Creature SVar:AntiBuffedBy:Creature +SVar:AICastPreference:MaxControlledGlobally$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/mass_hysteria.jpg Oracle:All creatures have haste. From c30505ad8d0f8ecd671fad18faef57e86f087c52 Mon Sep 17 00:00:00 2001 From: schnautzr Date: Mon, 17 Jun 2019 13:32:40 -0500 Subject: [PATCH 15/64] cavalier of flame, ajani strength of pride. note that ajani's third ability needs work yet to prevent graying out when the condition is false, but this would rarely if ever be a problem --- .../upcoming/ajani_strength_of_the_pride.txt | 11 ++++++++++- .../res/cardsfolder/upcoming/cavalier_of_flame.txt | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt b/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt index 99a470e12a2..92520b8e7d9 100644 --- a/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt +++ b/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt @@ -1,5 +1,14 @@ Name:Ajani, Strength of the Pride ManaCost:2 W W Types:Legendary Planeswalker Ajani +A:AB$ GainLife | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | LifeAmount$ NumCreatures | References$ NumCreatures,NumPlaneswalkers | SpellDescription$ You gain life equal to the number of creatures you control plus the number of planeswalkers you control. +SVar:NumCreatures:Count$Valid Creature.YouCtrl/Plus.NumPlaneswalkers +SVar:NumPlaneswalkers:Count$Valid Planeswalker.YouCtrl +A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenScript$ ajanis_pridemate | LegacyImage$ ajanis pridemate m20 | SpellDescription$ Create a 2/2 white Cat Soldier creature token named Ajani's Pridemate with "Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate." +DeckHas:Ability$Token +A:AB$ ChangeZone | Cost$ SubCounter<0/LOYALTY> | CheckSVar$ CurLife | SVarCompare$ GEInitLife | References$ CurLife,InitLife | Planeswalker$ True | Ultimate$ True | Defined$ Self | Origin$ Battlefield | Destination$ Exile | SubAbility$ ExileOppCreatures | SpellDescription$ If you have at least 15 life more than your starting life total, exile CARDNAME and each artifact and creature your opponents control. +SVar:ExileOppCreatures:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Creature.OppCtrl, Artifact.OppCtrl +SVar:CurLife:Count$YourLifeTotal +SVar:InitLife:Count$YourStartingLife/Plus.15 Oracle:[+1]: You gain life equal to the number of creatures you control plus the number of planeswalkers you control.\n[-2]: Create a 2/2 white Cat Soldier creature token named Ajani's Pridemate with "Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate."\n[0]: If you have at least 15 life or more than your starting life total, exile Ajani, Strength of the Pride and each artifact and creature your opponents control. -Loyalty:5 +Loyalty:5 \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt b/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt index 873f7e72967..f1d38ef1b5d 100644 --- a/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt +++ b/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt @@ -1,5 +1,14 @@ Name:Cavalier of Flame ManaCost:2 R R R Types:Creature Elemental Knight +A:AB$ PumpAll | Cost$ 1 R | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | KW$ Haste | SpellDescription$ Creatures you control get +1/+0 and gain haste until end of turn. +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, discard any number of cards, then draw that many cards. +SVar:TrigDiscard:DB$ Discard | Cost$ 3 R | AnyNumber$ True | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ Discard any number of cards, then draw that many cards. +SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ Y | References$ Y | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Y:Remembered$Amount +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamageAll | OptionalDecider$ You | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals X damage to each opponent and each planeswalker they control, where X is the number of land cards in your graveyard. +SVar:TrigDamageAll:DB$ DamageAll | ValidPlayers$ Player.Opponent | ValidCards$ Planeswalker.OppCtrl | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to each opponent and each planeswalker they control, where X is the number of land cards in your graveyard. +SVar:X:Count$TypeInYourYard.Land Oracle:{1}{R}: Creatures you control get +1/+0 and gain haste until end of turn.\nWhen Cavalier of Flame enters the battlefield, discard any number of cards, then draw that many cards.\nWhen Cavalier of Flame dies, it deals X damage to each opponent and each planeswalker they control, where X is the number of land cards in your graveyard. -PT:6/5 +PT:6/5 \ No newline at end of file From 7492891db7edb01836b6bdb83c122ae94ca91d47 Mon Sep 17 00:00:00 2001 From: schnautzr Date: Mon, 17 Jun 2019 13:58:21 -0500 Subject: [PATCH 16/64] moar cardz --- .../res/cardsfolder/upcoming/angel_of_vitality.txt | 11 +++++++++-- forge-gui/res/cardsfolder/upcoming/infuriate.txt | 4 ++++ .../res/cardsfolder/upcoming/kykar_winds_fury.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/octoprophet.txt | 5 +++++ .../res/cardsfolder/upcoming/thought_distortion.txt | 4 ++++ 5 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/infuriate.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/octoprophet.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thought_distortion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/angel_of_vitality.txt b/forge-gui/res/cardsfolder/upcoming/angel_of_vitality.txt index 1befc003830..d4bcf273cbd 100644 --- a/forge-gui/res/cardsfolder/upcoming/angel_of_vitality.txt +++ b/forge-gui/res/cardsfolder/upcoming/angel_of_vitality.txt @@ -1,6 +1,13 @@ Name:Angel of Vitality ManaCost:2 W Types:Creature Angel -K:Flying -Oracle:Flying\nIf you would gain life, you gain that much life plus 1 instead.\nAngel of Vitality gets +2/+2 as long as you have 25 or more life. PT:2/2 +K:Flying +R:Event$ GainLife | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ GainLife | AiLogic$ DoubleLife | Description$ If you would gain life, you gain that much life plus 1 instead. +SVar:GainLife:DB$ ReplaceEffect | VarName$ LifeGained | VarValue$ X | References$ X +SVar:X:ReplaceCount$LifeGained/Plus.1 +SVar:PlayMain1:True +AI:RemoveDeck:Random +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | CheckSVar$ Y | SVarCompare$ GE25 | Description$ CARDNAME gets +2/+2 as long as you have 25 or more life. +SVar:Y:Count$YourLifeTotal +Oracle:Flying\nIf you would gain life, you gain that much life plus 1 instead.\nAngel of Vitality gets +2/+2 as long as you have 25 or more life. diff --git a/forge-gui/res/cardsfolder/upcoming/infuriate.txt b/forge-gui/res/cardsfolder/upcoming/infuriate.txt new file mode 100644 index 00000000000..d14446bc20f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/infuriate.txt @@ -0,0 +1,4 @@ +Name:Infuriate +ManaCost:R +Types:Instant +Oracle:Target creature gets +3/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt b/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt new file mode 100644 index 00000000000..eb0e925bb26 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt @@ -0,0 +1,6 @@ +Name:Kykar, Wind's Fury +ManaCost:1 U R W +Types:Legendary Creature Bird Wizard +K:Flying +Oracle:Flying\nWhenever you cast a noncreature spell, create a 1/1 white Spirit creature token with flying.\nSacrifice a Spirit: Add {R}. +PT:3/3 diff --git a/forge-gui/res/cardsfolder/upcoming/octoprophet.txt b/forge-gui/res/cardsfolder/upcoming/octoprophet.txt new file mode 100644 index 00000000000..6c3b3ae4a16 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/octoprophet.txt @@ -0,0 +1,5 @@ +Name:Octoprophet +ManaCost:3 U +Types:Creature Octopus +Oracle:When Octoprophet enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) +PT:3/3 diff --git a/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt b/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt new file mode 100644 index 00000000000..7cc3323155c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt @@ -0,0 +1,4 @@ +Name:Thought Distortion +ManaCost:4 B B +Types:Sorcery +Oracle:This spell can't be countered.\nTarget opponent reveals their hand. Exile all noncreature, nonland cards from that player's hand and graveyard. From f0345438daa1bfe217c4cba843296264557edb28 Mon Sep 17 00:00:00 2001 From: schnautzr Date: Mon, 17 Jun 2019 15:52:10 -0500 Subject: [PATCH 17/64] dragon mage and stuff --- .../res/cardsfolder/upcoming/aether_gust.txt | 4 ++++ .../upcoming/loxodon_lifesinger.txt | 5 +++++ .../res/cardsfolder/upcoming/risen_reef.txt | 5 +++++ forge-gui/res/editions/Magic 2020.txt | 21 ++++++++++++++++++- 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/aether_gust.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/risen_reef.txt diff --git a/forge-gui/res/cardsfolder/upcoming/aether_gust.txt b/forge-gui/res/cardsfolder/upcoming/aether_gust.txt new file mode 100644 index 00000000000..e096b110179 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/aether_gust.txt @@ -0,0 +1,4 @@ +Name:Aether Gust +ManaCost:1 U +Types:Instant +Oracle:Choose target spell or permanent that's red or green. Its owner puts it on the top or bottom of their library. diff --git a/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt b/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt new file mode 100644 index 00000000000..5a35e61081c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt @@ -0,0 +1,5 @@ +Name:Loxodon Lifesinger +ManaCost:5 W +Types:Creature Elephant Cleric +Oracle:When Loxodon Lifesinger enters the battlefield, you may have your life total become the total toughness of creatures you control.\n{5}{W}: Loxodon Lifesinger gets +X/+X until end of turn, where X is your life total. +PT:4/6 diff --git a/forge-gui/res/cardsfolder/upcoming/risen_reef.txt b/forge-gui/res/cardsfolder/upcoming/risen_reef.txt new file mode 100644 index 00000000000..643efc18f8d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/risen_reef.txt @@ -0,0 +1,5 @@ +Name:Risen Reef +ManaCost:1 G U +Types:Creature Elemental +Oracle:Whenever Risen Reef or another Elemental enters the battlefield under your control, look at the top card of your library. If it's a land card, you may put it onto the battlefield tapped. If you don't put the card onto the battlefield, put it into your hand. +PT:1/1 diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index 3d284aed21f..329a14d6e1b 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -4,14 +4,23 @@ Date=2019-07-12 Name=Core Set 2020 MciCode=m20 Type=Core -BoosterCovers=1 +BoosterCovers=3 Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Secret Cards"), 1 RareMythic:!fromSheet("M20 Secret Cards"), 1 BasicLand [cards] 2 M Ajani, Strength of the Pride 4 U Angel of Vitality +10 C Octoprophet + 13 U Devout Decree +14 C Disenchant + +24 R Leyline of Sanctity + +27 R Loxodon Lifesinger + +42 U Aether Gust 46 R Atemsis, All-Seeing @@ -24,6 +33,8 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 113 R Scheming Symmetry +117 U Thought Distortion + 123 U Yarok's Fenlurker 125 M Cavalier of Flame @@ -35,8 +46,12 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 131 R Chandra's Regulator 132 U Chandra's Spitfire +135 U Dragon Mage + 139 U Flame Sweep +145 C Infuriate + 197 R Thrashing Brontodon 202 R Wakeroot Elemental @@ -46,6 +61,10 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 208 U Empyrean Eagle 209 U Ironroot Warlord +212 M Kykar, Wind's Fury + +217 U Risen Reef + 244 U Cryptic Caves 280 L Forest From 6cdbcf3a0b725cabe3a777442e460ea8ade43af1 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Mon, 17 Jun 2019 20:56:11 +0000 Subject: [PATCH 18/64] - Somewhat better logic for Might of Old Krosa and Arrester's Zeal, allowing the AI to use them in Main 1 in overwhelming situations. --- .../src/main/java/forge/ai/AiController.java | 2 +- .../main/java/forge/ai/ComputerUtilCard.java | 51 ++++++++++++++---- .../main/java/forge/ai/ComputerUtilCost.java | 2 +- .../java/forge/ai/PlayerControllerAi.java | 14 ++++- .../forge/ai/ability/ActivateAbilityAi.java | 7 ++- .../main/java/forge/ai/ability/AnimateAi.java | 4 +- .../main/java/forge/ai/ability/BalanceAi.java | 3 +- .../main/java/forge/ai/ability/BidLifeAi.java | 3 +- .../java/forge/ai/ability/ChangeZoneAi.java | 10 ++-- .../java/forge/ai/ability/ChooseCardAi.java | 3 +- .../forge/ai/ability/ChooseCardNameAi.java | 2 +- .../java/forge/ai/ability/ChooseColorAi.java | 4 +- .../java/forge/ai/ability/ChooseNumberAi.java | 3 +- .../java/forge/ai/ability/ChooseSourceAi.java | 3 +- .../forge/ai/ability/ControlExchangeAi.java | 3 +- .../forge/ai/ability/CountersPutAllAi.java | 7 ++- .../java/forge/ai/ability/DamageAiBase.java | 5 +- .../java/forge/ai/ability/DamageAllAi.java | 4 +- .../java/forge/ai/ability/DamageDealAi.java | 4 +- .../main/java/forge/ai/ability/DebuffAi.java | 5 +- .../main/java/forge/ai/ability/DestroyAi.java | 2 +- .../java/forge/ai/ability/DestroyAllAi.java | 2 +- .../src/main/java/forge/ai/ability/DigAi.java | 4 +- .../java/forge/ai/ability/DigUntilAi.java | 3 +- .../main/java/forge/ai/ability/DiscardAi.java | 8 +-- .../java/forge/ai/ability/DrainManaAi.java | 7 ++- .../src/main/java/forge/ai/ability/FogAi.java | 2 +- .../java/forge/ai/ability/GameLossAi.java | 8 +-- .../java/forge/ai/ability/LifeExchangeAi.java | 5 +- .../ai/ability/LifeExchangeVariantAi.java | 2 +- .../main/java/forge/ai/ability/LifeSetAi.java | 5 +- .../java/forge/ai/ability/MustBlockAi.java | 2 +- .../java/forge/ai/ability/PermanentAi.java | 9 ++-- .../forge/ai/ability/PowerExchangeAi.java | 3 +- .../main/java/forge/ai/ability/ProtectAi.java | 2 +- .../main/java/forge/ai/ability/PumpAi.java | 3 +- .../java/forge/ai/ability/PumpAiBase.java | 2 +- .../main/java/forge/ai/ability/PumpAllAi.java | 2 +- .../ai/ability/RearrangeTopOfLibraryAi.java | 4 +- .../main/java/forge/ai/ability/RepeatAi.java | 4 +- .../java/forge/ai/ability/SacrificeAi.java | 3 +- .../java/forge/ai/ability/SacrificeAllAi.java | 3 +- .../main/java/forge/ai/ability/TapAiBase.java | 2 +- .../main/java/forge/ai/ability/TapAllAi.java | 13 +++-- .../main/java/forge/ai/ability/TokenAi.java | 8 +-- .../java/forge/ai/ability/TwoPilesAi.java | 3 +- .../java/forge/ai/ability/UnattachAllAi.java | 3 +- .../main/java/forge/ai/ability/UntapAi.java | 2 +- .../java/forge/ai/simulation/GameCopier.java | 19 ++----- .../forge/ai/simulation/GameSimulator.java | 2 +- .../src/main/java/forge/util/ImageUtil.java | 6 +-- .../main/java/forge/game/card/CardUtil.java | 32 +++++------ .../src/main/java/forge/control/FControl.java | 2 +- .../java/forge/gui/ImportSourceAnalyzer.java | 27 ++-------- .../itemmanager/filters/TextSearchFilter.java | 2 +- .../forge/itemmanager/views/ItemView.java | 4 +- .../deckeditor/controllers/ACEditorBase.java | 4 +- .../screens/workshop/views/VCardScript.java | 2 +- .../main/java/forge/toolbox/FUndoManager.java | 8 +-- .../ai/simulation/GameSimulatorTest.java | 54 +++++++++++++++++-- .../ai/simulation/SpellAbilityPickerTest.java | 2 +- .../res/cardsfolder/a/ajanis_pridemate.txt | 4 +- .../a/approach_of_the_second_sun.txt | 4 +- .../res/cardsfolder/a/aquatic_incursion.txt | 2 +- .../res/cardsfolder/a/arresters_zeal.txt | 2 +- .../res/cardsfolder/a/artisan_of_forms.txt | 4 +- .../res/cardsfolder/b/benalish_emissary.txt | 1 + forge-gui/res/cardsfolder/b/bog_down.txt | 3 ++ .../res/cardsfolder/b/bond_of_discipline.txt | 2 +- .../res/cardsfolder/c/caligo_skin_witch.txt | 2 + forge-gui/res/cardsfolder/c/cemetery_puca.txt | 4 +- .../res/cardsfolder/c/cho_arrim_legate.txt | 4 +- .../cardsfolder/c/concordant_crossroads.txt | 1 + .../res/cardsfolder/c/crazed_firecat.txt | 4 +- .../res/cardsfolder/d/dacks_duplicate.txt | 4 +- forge-gui/res/cardsfolder/d/dark_depths.txt | 4 +- .../res/cardsfolder/d/dead_of_winter.txt | 2 +- .../res/cardsfolder/d/deepwood_legate.txt | 4 +- .../res/cardsfolder/d/dimir_doppelganger.txt | 4 +- .../res/cardsfolder/d/dream_pillager.txt | 6 +-- .../res/cardsfolder/d/dwarven_landslide.txt | 2 + forge-gui/res/cardsfolder/e/epochrasite.txt | 2 +- forge-gui/res/cardsfolder/e/evil_twin.txt | 4 +- .../res/cardsfolder/e/excavation_elephant.txt | 2 + .../cardsfolder/g/gatekeeper_of_malakir.txt | 2 +- .../res/cardsfolder/g/ghitu_chronicler.txt | 3 ++ forge-gui/res/cardsfolder/g/gigantoplasm.txt | 4 +- forge-gui/res/cardsfolder/g/goatnap.txt | 2 +- .../res/cardsfolder/g/goblin_ruinblaster.txt | 1 + .../cardsfolder/h/heartstabber_mosquito.txt | 1 + forge-gui/res/cardsfolder/h/heat_shimmer.txt | 4 +- .../res/cardsfolder/h/hypnotic_cloud.txt | 2 + .../res/cardsfolder/i/increasing_ambition.txt | 4 +- .../cardsfolder/i/increasing_confusion.txt | 4 +- .../res/cardsfolder/i/increasing_devotion.txt | 4 +- .../res/cardsfolder/i/increasing_savagery.txt | 4 +- .../cardsfolder/i/increasing_vengeance.txt | 4 +- forge-gui/res/cardsfolder/j/jilt.txt | 2 + .../res/cardsfolder/k/kamahls_druidic_vow.txt | 2 +- .../res/cardsfolder/k/keldon_overseer.txt | 1 + .../k/kiki_jiki_mirror_breaker.txt | 4 +- forge-gui/res/cardsfolder/k/kor_aeronaut.txt | 1 + .../res/cardsfolder/k/kor_sanctifiers.txt | 3 ++ forge-gui/res/cardsfolder/k/kyren_legate.txt | 4 +- .../res/cardsfolder/l/lord_of_atlantis.txt | 4 +- forge-gui/res/cardsfolder/m/magma_burst.txt | 3 ++ .../res/cardsfolder/m/marsh_casualties.txt | 1 + forge-gui/res/cardsfolder/m/mass_hysteria.txt | 1 + forge-gui/res/cardsfolder/m/massacre.txt | 4 +- .../res/cardsfolder/m/mercurial_pretender.txt | 4 +- .../res/cardsfolder/m/might_of_old_krosa.txt | 2 +- .../res/cardsfolder/m/minion_reflector.txt | 4 +- .../cardsfolder/m/mizzium_transreliquat.txt | 4 +- forge-gui/res/cardsfolder/m/mogg_salvage.txt | 4 +- forge-gui/res/cardsfolder/m/mold_shambler.txt | 1 + .../res/cardsfolder/n/narset_transcendent.txt | 4 +- .../res/cardsfolder/o/oran_rief_recluse.txt | 2 +- forge-gui/res/cardsfolder/o/orims_chant.txt | 1 + forge-gui/res/cardsfolder/o/orims_thunder.txt | 1 + .../res/cardsfolder/p/patricians_scorn.txt | 4 +- .../res/cardsfolder/p/phantasmal_form.txt | 2 +- .../res/cardsfolder/p/phantasmal_image.txt | 4 +- forge-gui/res/cardsfolder/p/probe.txt | 2 + .../res/cardsfolder/p/progenitor_mimic.txt | 4 +- .../res/cardsfolder/r/rakshasa_vizier.txt | 2 +- .../res/cardsfolder/r/refreshing_rain.txt | 4 +- forge-gui/res/cardsfolder/r/rowan_kenrith.txt | 2 +- forge-gui/res/cardsfolder/r/rushing_river.txt | 2 + .../res/cardsfolder/r/rushwood_legate.txt | 4 +- .../res/cardsfolder/s/sadistic_obsession.txt | 2 +- .../res/cardsfolder/s/saprazzan_legate.txt | 4 +- .../cardsfolder/s/shirei_shizos_caretaker.txt | 2 +- .../res/cardsfolder/s/shivan_emissary.txt | 2 +- forge-gui/res/cardsfolder/s/sivvis_ruse.txt | 4 +- forge-gui/res/cardsfolder/s/skizzik.txt | 4 ++ forge-gui/res/cardsfolder/s/splinter_twin.txt | 6 +-- .../res/cardsfolder/s/stolen_strategy.txt | 12 +++++ .../res/cardsfolder/s/strength_of_night.txt | 2 +- forge-gui/res/cardsfolder/s/submerge.txt | 4 +- .../res/cardsfolder/t/teferi_time_raveler.txt | 2 +- .../cardsfolder/t/tempt_with_immortality.txt | 4 +- .../cardsfolder/t/tempt_with_vengeance.txt | 4 +- .../cardsfolder/t/territorial_allosaurus.txt | 1 + .../res/cardsfolder/t/thespians_stage.txt | 4 +- forge-gui/res/cardsfolder/t/throatseeker.txt | 2 +- forge-gui/res/cardsfolder/t/time_spiral.txt | 4 +- .../res/cardsfolder/t/tolarian_emissary.txt | 1 + .../res/cardsfolder/t/transguild_courier.txt | 2 +- forge-gui/res/cardsfolder/t/twinflame.txt | 4 +- .../cardsfolder/u/unstable_shapeshifter.txt | 4 +- .../res/cardsfolder/u/urborg_emissary.txt | 1 + .../res/cardsfolder/v/verduran_emissary.txt | 1 + .../cardsfolder/v/vesuvan_doppelganger.txt | 6 +-- .../cardsfolder/v/vesuvan_shapeshifter.txt | 6 +-- forge-gui/res/editions/Ravnica Allegiance.txt | 2 +- forge-gui/res/formats/Casual/pauper.txt | 1 + .../DCI/Arena Standard/2019-02-14.txt | 7 +++ .../DCI/Arena Standard/2019-05-24.txt | 7 +++ .../DCI/Arena Standard/China/2019-02-14.txt | 7 +++ .../DCI/Arena Standard/China/2019-05-24.txt | 7 +++ .../Historic/DCI/Legacy/2018-06-22.txt | 7 +++ .../Historic/DCI/Legacy/2018-07-06.txt | 2 +- .../Historic/DCI/Legacy/2018-07-14.txt | 2 +- .../Historic/DCI/Legacy/2018-10-06.txt | 2 +- .../Historic/DCI/Legacy/2018-11-16.txt | 7 +++ .../Historic/DCI/Legacy/2019-01-25.txt | 7 +++ .../Historic/DCI/Legacy/2019-05-24.txt | 7 +++ .../Historic/DCI/Legacy/2019-06-14.txt | 7 +++ .../Historic/DCI/Modern/2018-11-16.txt | 7 +++ .../Historic/DCI/Modern/2019-01-25.txt | 7 +++ .../Historic/DCI/Modern/2019-05-24.txt | 7 +++ .../Historic/DCI/Modern/2019-06-14.txt | 7 +++ .../Historic/DCI/Pauper/2019-05-24.txt | 7 +++ .../Historic/DCI/Standard/2018-07-14.txt | 2 +- .../Historic/DCI/Standard/2018-11-16.txt | 7 +++ .../Historic/DCI/Standard/2019-01-25.txt | 7 +++ .../Historic/DCI/Standard/2019-05-24.txt | 7 +++ .../DCI/Standard/China/2018-06-22.txt | 7 +++ .../DCI/Standard/China/2018-07-14.txt | 7 +++ .../DCI/Standard/China/2018-10-06.txt | 7 +++ .../DCI/Standard/China/2018-11-16.txt | 7 +++ .../DCI/Standard/China/2019-01-25.txt | 7 +++ .../DCI/Standard/China/2019-05-24.txt | 7 +++ .../Historic/DCI/Vintage/2018-06-22.txt | 8 +++ .../Historic/DCI/Vintage/2018-07-14.txt | 2 +- .../Historic/DCI/Vintage/2018-10-06.txt | 2 +- .../Historic/DCI/Vintage/2018-11-16.txt | 8 +++ .../Historic/DCI/Vintage/2019-01-25.txt | 8 +++ .../Historic/DCI/Vintage/2019-05-24.txt | 8 +++ .../Historic/DCI/Vintage/2019-06-14.txt | 8 +++ .../main/java/forge/achievement/Domain.java | 27 ++++++++-- .../src/main/java/forge/deck/DeckgenUtil.java | 2 +- .../java/forge/itemmanager/ColumnDef.java | 3 +- .../forge/player/PlayerControllerHuman.java | 20 +++---- .../forge/quest/QuestChallengeGenerator.java | 12 ++--- .../forge/quest/QuestEventLDADuelManager.java | 6 +-- .../java/forge/quest/QuestUtilUnlockSets.java | 2 +- .../java/forge/quest/data/QuestAssets.java | 10 +++- .../forge/util/AbstractGeneticAlgorithm.java | 6 +-- .../src/main/java/forge/util/XmlReader.java | 2 +- 200 files changed, 663 insertions(+), 347 deletions(-) create mode 100644 forge-gui/res/cardsfolder/s/stolen_strategy.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 557ab6c1ef9..de72afa9903 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1778,7 +1778,7 @@ public class AiController { + MyRandom.getRandom().nextInt(3); return Math.max(remaining, min) / 2; } else if ("LowestLoseLife".equals(logic)) { - return MyRandom.getRandom().nextInt(Math.min(player.getLife() / 3, ComputerUtil.getOpponentFor(player).getLife())) + 1; + return MyRandom.getRandom().nextInt(Math.min(player.getLife() / 3, player.getWeakestOpponent().getLife())) + 1; } else if ("HighestGetCounter".equals(logic)) { return MyRandom.getRandom().nextInt(3); } else if (source.hasSVar("EnergyToPay")) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 12f984154c9..bab3509cb5c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -521,7 +521,7 @@ public class ComputerUtilCard { */ public static CardCollectionView getLikelyBlockers(final Player ai, final CardCollectionView blockers) { AiBlockController aiBlk = new AiBlockController(ai); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); Combat combat = new Combat(opp); //Use actual attackers if available, else consider all possible attackers Combat currentCombat = ai.getGame().getCombat(); @@ -884,7 +884,7 @@ public class ComputerUtilCard { List chosen = new ArrayList(); Player ai = sa.getActivatingPlayer(); final Game game = ai.getGame(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (sa.hasParam("AILogic")) { final String logic = sa.getParam("AILogic"); @@ -974,7 +974,7 @@ public class ComputerUtilCard { public static boolean useRemovalNow(final SpellAbility sa, final Card c, final int dmg, ZoneType destination) { final Player ai = sa.getActivatingPlayer(); final AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final Game game = ai.getGame(); final PhaseHandler ph = game.getPhaseHandler(); final PhaseType phaseType = ph.getPhase(); @@ -1213,6 +1213,7 @@ public class ComputerUtilCard { final Game game = ai.getGame(); final PhaseHandler phase = game.getPhaseHandler(); final Combat combat = phase.getCombat(); + final boolean main1Preferred = "Main1IfAble".equals(sa.getParam("AILogic")) && phase.is(PhaseType.MAIN1, ai); final boolean isBerserk = "Berserk".equals(sa.getParam("AILogic")); final boolean loseCardAtEOT = "Sacrifice".equals(sa.getParam("AtEOT")) || "Exile".equals(sa.getParam("AtEOT")) || "Destroy".equals(sa.getParam("AtEOT")) || "ExileCombat".equals(sa.getParam("AtEOT")); @@ -1250,7 +1251,7 @@ public class ComputerUtilCard { // will the creature attack (only relevant for sorcery speed)? if (phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) && phase.isPlayerTurn(ai) - && SpellAbilityAi.isSorcerySpeed(sa) + && SpellAbilityAi.isSorcerySpeed(sa) || main1Preferred && power > 0 && ComputerUtilCard.doesCreatureAttackAI(ai, c)) { return true; @@ -1269,7 +1270,7 @@ public class ComputerUtilCard { } } - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); Card pumped = getPumpedCreature(ai, sa, c, toughness, power, keywords); List oppCreatures = opp.getCreaturesInPlay(); float chance = 0; @@ -1842,17 +1843,45 @@ public class ComputerUtilCard { String needsToPlayName = isRightSplit ? "SplitNeedsToPlay" : "NeedsToPlay"; String needsToPlayVarName = isRightSplit ? "SplitNeedsToPlayVar" : "NeedsToPlayVar"; - if (sa != null && sa.isEvoke()) { - if (card.hasSVar("NeedsToPlayEvoked")) { - needsToPlayName = "NeedsToPlayEvoked"; - } - if (card.hasSVar("NeedsToPlayEvokedVar")) { - needsToPlayVarName = "NeedsToPlayEvokedVar"; + // TODO: if there are ever split cards with Evoke or Kicker, factor in the right split option above + if (sa != null) { + if (sa.isEvoke()) { + // if the spell is evoked, will use NeedsToPlayEvoked if available (otherwise falls back to NeedsToPlay) + if (card.hasSVar("NeedsToPlayEvoked")) { + needsToPlayName = "NeedsToPlayEvoked"; + } + if (card.hasSVar("NeedsToPlayEvokedVar")) { + needsToPlayVarName = "NeedsToPlayEvokedVar"; + } + } else if (sa.isKicked()) { + // if the spell is kicked, uses NeedsToPlayKicked if able and locks out the regular NeedsToPlay check + // for unkicked spells, uses NeedsToPlay + if (card.hasSVar("NeedsToPlayKicked")) { + needsToPlayName = "NeedsToPlayKicked"; + } else { + needsToPlayName = "UNUSED"; + } + if (card.hasSVar("NeedsToPlayKickedVar")) { + needsToPlayVarName = "NeedsToPlayKickedVar"; + } else { + needsToPlayVarName = "UNUSED"; + } } } if (card.hasSVar(needsToPlayName)) { final String needsToPlay = card.getSVar(needsToPlayName); + + // A special case which checks that this creature will attack if it's the AI's turn + if (needsToPlay.equalsIgnoreCase("WillAttack")) { + if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) { + return ComputerUtilCard.doesSpecifiedCreatureAttackAI(sa.getActivatingPlayer(), card) ? + AiPlayDecision.WillPlay : AiPlayDecision.BadEtbEffects; + } else { + return AiPlayDecision.WillPlay; // not our turn, skip this check for the possible Flash use etc. + } + } + CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, needsToPlay.split(","), card.getController(), card, null); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index fcd1f648a49..8685990addf 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -635,7 +635,7 @@ public class ComputerUtilCost { && (!source.getName().equals("Tyrannize") || payer.getCardsIn(ZoneType.Hand).size() > 2) && (!source.getName().equals("Perplex") || payer.getCardsIn(ZoneType.Hand).size() < 2) && (!source.getName().equals("Breaking Point") || payer.getCreaturesInPlay().size() > 1) - && (!source.getName().equals("Chain of Vapor") || (ComputerUtil.getOpponentFor(payer).getCreaturesInPlay().size() > 0 && payer.getLandsInPlay().size() > 3)); + && (!source.getName().equals("Chain of Vapor") || (payer.getWeakestOpponent().getCreaturesInPlay().size() > 0 && payer.getLandsInPlay().size() > 3)); } public static Set getAvailableManaColors(Player ai, Card additionalLand) { diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 2365e971abc..df01caaf238 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -1105,7 +1105,7 @@ public class PlayerControllerAi extends PlayerController { public String chooseCardName(SpellAbility sa, Predicate cpp, String valid, String message) { if (sa.hasParam("AILogic")) { CardCollectionView aiLibrary = player.getCardsIn(ZoneType.Library); - CardCollectionView oppLibrary = ComputerUtil.getOpponentFor(player).getCardsIn(ZoneType.Library); + CardCollectionView oppLibrary = player.getWeakestOpponent().getCardsIn(ZoneType.Library); final Card source = sa.getHostCard(); final String logic = sa.getParam("AILogic"); @@ -1227,6 +1227,18 @@ public class PlayerControllerAi extends PlayerController { // Choose the optional cost if it can be paid (to be improved later, check for playability and other conditions perhaps) Cost fullCost = opt.getCost().copy().add(costSoFar); SpellAbility fullCostSa = chosen.copyWithDefinedCost(fullCost); + + // Playability check for Kicker + if (opt.getType() == OptionalCost.Kicker1 || opt.getType() == OptionalCost.Kicker2) { + SpellAbility kickedSaCopy = fullCostSa.copy(); + kickedSaCopy.addOptionalCost(opt.getType()); + Card copy = CardUtil.getLKICopy(chosen.getHostCard()); + copy.addOptionalCostPaid(opt.getType()); + if (ComputerUtilCard.checkNeedsToPlayReqs(copy, kickedSaCopy) != AiPlayDecision.WillPlay) { + continue; // don't choose kickers we don't want to play + } + } + if (ComputerUtilCost.canPayCost(fullCostSa, player)) { chosenOptCosts.add(opt); costSoFar.add(opt.getCost()); diff --git a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java index 7eba97960da..44780ec2e94 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; import forge.game.card.Card; @@ -22,7 +21,7 @@ public class ActivateAbilityAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card source = sa.getHostCard(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); List list = CardLists.getType(opp.getCardsIn(ZoneType.Battlefield), sa.getParamOrDefault("Type", "Card")); @@ -46,7 +45,7 @@ public class ActivateAbilityAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card source = sa.getHostCard(); @@ -87,7 +86,7 @@ public class ActivateAbilityAi extends SpellAbilityAi { } } else { sa.resetTargets(); - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); + sa.getTargets().add(ai.getWeakestOpponent()); } return randomReturn; diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java index 42a5831ed7b..0ba446e250e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -78,13 +78,13 @@ public class AnimateAi extends SpellAbilityAi { num = (num == null) ? "1" : num; final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack); CardCollection list = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), - ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), topStack); + ai.getWeakestOpponent(), topStack.getHostCard(), topStack); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); ComputerUtilCard.sortByEvaluateCreature(list); if (!list.isEmpty() && list.size() == nToSac && ComputerUtilCost.canPayCost(sa, ai)) { Card animatedCopy = becomeAnimated(source, sa); list.add(animatedCopy); - list = CardLists.getValidCards(list, valid.split(","), ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), + list = CardLists.getValidCards(list, valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(), topStack); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); if (ComputerUtilCard.evaluateCreature(animatedCopy) < ComputerUtilCard.evaluateCreature(list.get(0)) diff --git a/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java b/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java index b5576134334..9aba6e53fe9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; @@ -17,7 +16,7 @@ public class BalanceAi extends SpellAbilityAi { int diff = 0; // TODO Add support for multiplayer logic - final Player opp = ComputerUtil.getOpponentFor(aiPlayer); + final Player opp = aiPlayer.getWeakestOpponent(); final CardCollectionView humPerms = opp.getCardsIn(ZoneType.Battlefield); final CardCollectionView compPerms = aiPlayer.getCardsIn(ZoneType.Battlefield); diff --git a/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java b/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java index 55ceb865919..634fabc1254 100644 --- a/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import java.util.List; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.game.Game; @@ -25,7 +24,7 @@ public class BidLifeAi extends SpellAbilityAi { if (tgt != null) { sa.resetTargets(); if (tgt.canTgtCreature()) { - List list = CardLists.getTargetableCards(ComputerUtil.getOpponentFor(aiPlayer).getCardsIn(ZoneType.Battlefield), sa); + List list = CardLists.getTargetableCards(aiPlayer.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), sa); list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa); if (list.isEmpty()) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index d2c4a7c55ef..77dcb36069e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -229,7 +229,7 @@ public class ChangeZoneAi extends SpellAbilityAi { final Card source = sa.getHostCard(); final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); ZoneType origin = null; - final Player opponent = ComputerUtil.getOpponentFor(ai); + final Player opponent = ai.getWeakestOpponent(); boolean activateForCost = ComputerUtil.activateForCost(sa, ai); if (sa.hasParam("Origin")) { @@ -439,7 +439,7 @@ public class ChangeZoneAi extends SpellAbilityAi { // if putting cards from hand to library and parent is drawing cards // make sure this will actually do something: final TargetRestrictions tgt = sa.getTargetRestrictions(); - final Player opp = ComputerUtil.getOpponentFor(aiPlayer); + final Player opp = aiPlayer.getWeakestOpponent(); if (tgt != null && tgt.canTgtPlayer()) { boolean isCurse = sa.isCurse(); if (isCurse && sa.canTarget(opp)) { @@ -500,7 +500,7 @@ public class ChangeZoneAi extends SpellAbilityAi { Iterable pDefined; final TargetRestrictions tgt = sa.getTargetRestrictions(); if ((tgt != null) && tgt.canTgtPlayer()) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (sa.isCurse()) { if (sa.canTarget(opp)) { sa.getTargets().add(opp); @@ -619,7 +619,7 @@ public class ChangeZoneAi extends SpellAbilityAi { */ private static Card chooseCreature(final Player ai, CardCollection list) { // Creating a new combat for testing purposes. - final Player opponent = ComputerUtil.getOpponentFor(ai); + final Player opponent = ai.getWeakestOpponent(); Combat combat = new Combat(opponent); for (Card att : opponent.getCreaturesInPlay()) { combat.addAttacker(att, ai); @@ -935,7 +935,7 @@ public class ChangeZoneAi extends SpellAbilityAi { && !currCombat.getBlockers(attacker).isEmpty()) { ComputerUtilCard.sortByEvaluateCreature(blockers); Combat combat = new Combat(ai); - combat.addAttacker(attacker, ComputerUtil.getOpponentFor(ai)); + combat.addAttacker(attacker, ai.getWeakestOpponent()); for (Card blocker : blockers) { combat.addBlocker(attacker, blocker); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java index db861634ebe..6d0cee69a14 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java @@ -8,7 +8,6 @@ import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilAbility; import forge.ai.ComputerUtilCard; @@ -127,7 +126,7 @@ public class ChooseCardAi extends SpellAbilityAi { } } else if (aiLogic.equals("Duneblast")) { CardCollection aiCreatures = ai.getCreaturesInPlay(); - CardCollection oppCreatures = ComputerUtil.getOpponentFor(ai).getCreaturesInPlay(); + CardCollection oppCreatures = ai.getWeakestOpponent().getCreaturesInPlay(); aiCreatures = CardLists.getNotKeyword(aiCreatures, Keyword.INDESTRUCTIBLE); oppCreatures = CardLists.getNotKeyword(oppCreatures, Keyword.INDESTRUCTIBLE); diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java index 6148e60fdb5..ff0bfc2ceaa 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java @@ -41,7 +41,7 @@ public class ChooseCardNameAi extends SpellAbilityAi { if (tgt != null) { sa.resetTargets(); if (tgt.canOnlyTgtOpponent()) { - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); + sa.getTargets().add(ai.getWeakestOpponent()); } else { sa.getTargets().add(ai); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java index 905fdab48f8..8ba40274dcd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java @@ -52,7 +52,7 @@ public class ChooseColorAi extends SpellAbilityAi { } if ("Addle".equals(sourceName)) { - if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) || ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Hand).isEmpty()) { + if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) || ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).isEmpty()) { return false; } return true; @@ -61,7 +61,7 @@ public class ChooseColorAi extends SpellAbilityAi { if (logic.equals("MostExcessOpponentControls")) { for (byte color : MagicColor.WUBRG) { CardCollectionView ailist = ai.getCardsIn(ZoneType.Battlefield); - CardCollectionView opplist = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield); + CardCollectionView opplist = ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield); ailist = CardLists.filter(ailist, CardPredicates.isColor(color)); opplist = CardLists.filter(opplist, CardPredicates.isColor(color)); diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java index fe84327251b..46276414778 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseNumberAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -17,7 +16,7 @@ public class ChooseNumberAi extends SpellAbilityAi { TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); - Player opp = ComputerUtil.getOpponentFor(aiPlayer); + Player opp = aiPlayer.getWeakestOpponent(); if (sa.canTarget(opp)) { sa.getTargets().add(opp); } else { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java index 7f740adb8dc..3478e74b73b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java @@ -7,7 +7,6 @@ import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCombat; import forge.ai.ComputerUtilCost; @@ -68,7 +67,7 @@ public class ChooseSourceAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (sa.canTarget(opp)) { sa.getTargets().add(opp); } else { diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java index ab3c3465127..f21b327b3fd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java @@ -3,7 +3,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.collect.Lists; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; @@ -30,7 +29,7 @@ public class ControlExchangeAi extends SpellAbilityAi { sa.resetTargets(); CardCollection list = - CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); + CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); // AI won't try to grab cards that are filtered out of AI decks on // purpose list = CardLists.filter(list, new Predicate() { diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java index 82dc7f1adfd..0be541d2f5f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.collect.Lists; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCost; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; @@ -39,7 +38,7 @@ public class CountersPutAllAi extends SpellAbilityAi { final boolean curse = sa.isCurse(); final TargetRestrictions tgt = sa.getTargetRestrictions(); - hList = CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); + hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); if (abCost != null) { @@ -68,7 +67,7 @@ public class CountersPutAllAi extends SpellAbilityAi { } if (tgt != null) { - Player pl = curse ? ComputerUtil.getOpponentFor(ai) : ai; + Player pl = curse ? ai.getWeakestOpponent() : ai; sa.getTargets().add(pl); hList = CardLists.filterControlledBy(hList, pl); @@ -149,7 +148,7 @@ public class CountersPutAllAi extends SpellAbilityAi { */ @Override public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { - return player.getCreaturesInPlay().size() >= ComputerUtil.getOpponentFor(player).getCreaturesInPlay().size(); + return player.getCreaturesInPlay().size() >= player.getWeakestOpponent().getCreaturesInPlay().size(); } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java index 1b2dc7ee7fd..d894b2f7a79 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java @@ -1,7 +1,6 @@ package forge.ai.ability; import com.google.common.collect.Iterables; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCombat; import forge.ai.SpellAbilityAi; import forge.game.Game; @@ -20,7 +19,7 @@ import forge.util.MyRandom; public abstract class DamageAiBase extends SpellAbilityAi { protected boolean avoidTargetP(final Player comp, final SpellAbility sa) { - Player enemy = ComputerUtil.getOpponentFor(comp); + Player enemy = comp.getWeakestOpponent(); // Logic for cards that damage owner, like Fireslinger // Do not target a player if they aren't below 75% of our health. // Unless Lifelink will cancel the damage to us @@ -54,7 +53,7 @@ public abstract class DamageAiBase extends SpellAbilityAi { protected boolean shouldTgtP(final Player comp, final SpellAbility sa, final int d, final boolean noPrevention, final boolean noPlaneswalkerRedirection) { int restDamage = d; final Game game = comp.getGame(); - Player enemy = ComputerUtil.getOpponentFor(comp); + Player enemy = comp.getWeakestOpponent(); boolean dmgByCardsInHand = false; if ("X".equals(sa.getParam("NumDmg")) && sa.getHostCard() != null && sa.hasSVar(sa.getParam("NumDmg")) && diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java index e43dfac49ab..cbede1c1a11 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java @@ -212,7 +212,7 @@ public class DamageAllAi extends SpellAbilityAi { } // Evaluate creatures getting killed - Player enemy = ComputerUtil.getOpponentFor(ai); + Player enemy = ai.getWeakestOpponent(); final CardCollection humanList = getKillableCreatures(sa, enemy, dmg); CardCollection computerList = getKillableCreatures(sa, ai, dmg); final TargetRestrictions tgt = sa.getTargetRestrictions(); @@ -294,7 +294,7 @@ public class DamageAllAi extends SpellAbilityAi { } // Evaluate creatures getting killed - Player enemy = ComputerUtil.getOpponentFor(ai); + Player enemy = ai.getWeakestOpponent(); final CardCollection humanList = getKillableCreatures(sa, enemy, dmg); CardCollection computerList = getKillableCreatures(sa, ai, dmg); final TargetRestrictions tgt = sa.getTargetRestrictions(); diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 3671da06f71..7ca4915f285 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -552,7 +552,7 @@ public class DamageDealAi extends DamageAiBase { final boolean oppTargetsChoice = sa.hasParam("TargetingPlayer"); final String logic = sa.getParamOrDefault("AILogic", ""); - Player enemy = ComputerUtil.getOpponentFor(ai); + Player enemy = ai.getWeakestOpponent(); if ("PowerDmg".equals(logic)) { // check if it is better to target the player instead, the original target is already set in PumpAi.pumpTgtAI() @@ -876,7 +876,7 @@ public class DamageDealAi extends DamageAiBase { // this is for Triggered targets that are mandatory final boolean noPrevention = sa.hasParam("NoPrevention"); final boolean divided = sa.hasParam("DividedAsYouChoose"); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); while (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa)) { if (tgt.canTgtPlaneswalker()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java index eee46d29579..ca3fae2f3a8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java @@ -4,7 +4,6 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCost; import forge.ai.SpellAbilityAi; @@ -177,7 +176,7 @@ public class DebuffAi extends SpellAbilityAi { * @return a CardCollection. */ private CardCollection getCurseCreatures(final Player ai, final SpellAbility sa, final List kws) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); CardCollection list = CardLists.getTargetableCards(opp.getCreaturesInPlay(), sa); if (!list.isEmpty()) { list = CardLists.filter(list, new Predicate() { @@ -217,7 +216,7 @@ public class DebuffAi extends SpellAbilityAi { list.remove(c); } - final CardCollection pref = CardLists.filterControlledBy(list, ComputerUtil.getOpponentFor(ai)); + final CardCollection pref = CardLists.filterControlledBy(list, ai.getWeakestOpponent()); final CardCollection forced = CardLists.filterControlledBy(list, ai); final Card source = sa.getHostCard(); diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index 06705baf8bf..cede308bfc7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -288,7 +288,7 @@ public class DestroyAi extends SpellAbilityAi { } else if (sa.hasParam("Defined")) { list = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); if ("WillSkipTurn".equals(logic) && (sa.getHostCard().getController().equals(ai) - || ai.getCreaturesInPlay().size() < ComputerUtil.getOpponentFor(ai).getCreaturesInPlay().size() + || ai.getCreaturesInPlay().size() < ai.getWeakestOpponent().getCreaturesInPlay().size() || !source.getGame().getPhaseHandler().isPlayerTurn(ai) || ai.getLife() <= 5)) { // Basic ai logic for Lethal Vapors diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java index b2b06161f29..16d426c7f62 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java @@ -66,7 +66,7 @@ public class DestroyAllAi extends SpellAbilityAi { public boolean doMassRemovalLogic(Player ai, SpellAbility sa) { final Card source = sa.getHostCard(); final String logic = sa.getParamOrDefault("AILogic", ""); - Player opponent = ComputerUtil.getOpponentFor(ai); // TODO: how should this AI logic work for multiplayer and getOpponents()? + Player opponent = ai.getWeakestOpponent(); // TODO: how should this AI logic work for multiplayer and getOpponents()? final int CREATURE_EVAL_THRESHOLD = 200; diff --git a/forge-ai/src/main/java/forge/ai/ability/DigAi.java b/forge-ai/src/main/java/forge/ai/ability/DigAi.java index e33409722e7..e3435869c4d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigAi.java @@ -24,7 +24,7 @@ public class DigAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player ai, SpellAbility sa) { final Game game = ai.getGame(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); final Card host = sa.getHostCard(); Player libraryOwner = ai; @@ -106,7 +106,7 @@ public class DigAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (sa.usesTargeting()) { sa.resetTargets(); if (mandatory && sa.canTarget(opp)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java index 7be26f04209..f18dc3c7784 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; import forge.game.card.Card; @@ -36,7 +35,7 @@ public class DigUntilAi extends SpellAbilityAi { final boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); Player libraryOwner = ai; - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if ("DontMillSelf".equals(logic)) { // A card that digs for specific things and puts everything revealed before it into graveyard diff --git a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java index dbc18b05808..d7dad6b293d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java @@ -56,7 +56,7 @@ public class DiscardAi extends SpellAbilityAi { return SpecialCardAi.VolrathsShapeshifter.consider(ai, sa); } - final boolean humanHasHand = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Hand).size() > 0; + final boolean humanHasHand = ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).size() > 0; if (tgt != null) { if (!discardTargetAI(ai, sa)) { @@ -87,7 +87,7 @@ public class DiscardAi extends SpellAbilityAi { if (sa.hasParam("NumCards")) { if (sa.getParam("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ComputerUtil.getOpponentFor(ai) + final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ai.getWeakestOpponent() .getCardsIn(ZoneType.Hand).size()); if (cardsToDiscard < 1) { return false; @@ -172,7 +172,7 @@ public class DiscardAi extends SpellAbilityAi { protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (!discardTargetAI(ai, sa)) { if (mandatory && sa.canTarget(opp)) { sa.getTargets().add(opp); @@ -193,7 +193,7 @@ public class DiscardAi extends SpellAbilityAi { } if ("X".equals(sa.getParam("RevealNumber")) && sa.getHostCard().getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. - final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ComputerUtil.getOpponentFor(ai) + final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ai.getWeakestOpponent() .getCardsIn(ZoneType.Hand).size()); sa.getHostCard().setSVar("PayX", Integer.toString(cardsToDiscard)); } diff --git a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java index a922c0f0508..f6745d73c39 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; import forge.game.card.Card; @@ -19,7 +18,7 @@ public class DrainManaAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card source = sa.getHostCard(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); if (tgt == null) { @@ -41,7 +40,7 @@ public class DrainManaAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card source = sa.getHostCard(); @@ -82,7 +81,7 @@ public class DrainManaAi extends SpellAbilityAi { } } else { sa.resetTargets(); - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); + sa.getTargets().add(ai.getWeakestOpponent()); } return randomReturn; diff --git a/forge-ai/src/main/java/forge/ai/ability/FogAi.java b/forge-ai/src/main/java/forge/ai/ability/FogAi.java index ecdb0c03b4f..9d919b10b22 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FogAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FogAi.java @@ -107,7 +107,7 @@ public class FogAi extends SpellAbilityAi { protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) { final Game game = aiPlayer.getGame(); boolean chance; - if (game.getPhaseHandler().isPlayerTurn(ComputerUtil.getOpponentFor(sa.getActivatingPlayer()))) { + if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer().getWeakestOpponent())) { chance = game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE); } else { chance = game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DAMAGE); diff --git a/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java b/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java index 1fbb7c7d943..03b77143d99 100644 --- a/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -9,7 +8,7 @@ import forge.game.spellability.TargetRestrictions; public class GameLossAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player ai, SpellAbility sa) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (opp.cantLose()) { return false; } @@ -34,15 +33,16 @@ public class GameLossAi extends SpellAbilityAi { // Phage the Untouchable // (Final Fortune would need to attach it's delayed trigger to a // specific turn, which can't be done yet) + Player opp = ai.getWeakestOpponent(); - if (!mandatory && ComputerUtil.getOpponentFor(ai).cantLose()) { + if (!mandatory && opp.cantLose()) { return false; } final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); + sa.getTargets().add(opp); } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java index e9b7515b950..8b387b7791a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -20,7 +19,7 @@ public class LifeExchangeAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { final int myLife = aiPlayer.getLife(); - Player opponent = ComputerUtil.getOpponentFor(aiPlayer); + Player opponent = aiPlayer.getWeakestOpponent(); final int hLife = opponent.getLife(); if (!aiPlayer.canGainLife()) { @@ -76,7 +75,7 @@ public class LifeExchangeAi extends SpellAbilityAi { final boolean mandatory) { final TargetRestrictions tgt = sa.getTargetRestrictions(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (tgt != null) { sa.resetTargets(); if (sa.canTarget(opp) && (mandatory || ai.getLife() < opp.getLife())) { diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java index 144e91ff726..e1432844d01 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java @@ -149,7 +149,7 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { final boolean mandatory) { final TargetRestrictions tgt = sa.getTargetRestrictions(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (tgt != null) { sa.resetTargets(); if (sa.canTarget(opp) && (mandatory || ai.getLife() < opp.getLife())) { diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java index fb8c0797711..cc4d851bd9b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeSetAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilAbility; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; @@ -20,7 +19,7 @@ public class LifeSetAi extends SpellAbilityAi { // Ability_Cost abCost = sa.getPayCosts(); final Card source = sa.getHostCard(); final int myLife = ai.getLife(); - final Player opponent = ComputerUtil.getOpponentFor(ai); + final Player opponent = ai.getWeakestOpponent(); final int hlife = opponent.getLife(); final String amountStr = sa.getParam("LifeAmount"); @@ -107,7 +106,7 @@ public class LifeSetAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { final int myLife = ai.getLife(); - final Player opponent = ComputerUtil.getOpponentFor(ai); + final Player opponent = ai.getWeakestOpponent(); final int hlife = opponent.getLife(); final Card source = sa.getHostCard(); final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java index e01d0b38943..238ba76c409 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java @@ -95,7 +95,7 @@ public class MustBlockAi extends SpellAbilityAi { boolean chance = false; if (abTgt != null) { - final List list = determineGoodBlockers(definedAttacker, ai, ComputerUtil.getOpponentFor(ai), sa, true,true); + final List list = determineGoodBlockers(definedAttacker, ai, ai.getWeakestOpponent(), sa, true,true); if (list.isEmpty()) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index e89c9e87d3e..3832bd0c956 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -1,5 +1,6 @@ package forge.ai.ability; +import forge.game.card.*; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicates; @@ -12,10 +13,6 @@ import forge.card.CardType.Supertype; import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.GlobalRuleChange; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardLists; -import forge.game.card.CardPredicates; import forge.game.cost.Cost; import forge.game.keyword.KeywordInterface; import forge.game.mana.ManaCostBeingPaid; @@ -198,7 +195,9 @@ public class PermanentAi extends SpellAbilityAi { } } else if (param.startsWith("MaxControlled")) { // Only cast unless there are X or more cards like this on the battlefield under AI control already, - CardCollection ctrld = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals(card.getName())); + CardCollectionView valid = param.contains("Globally") ? ai.getGame().getCardsIn(ZoneType.Battlefield) + : ai.getCardsIn(ZoneType.Battlefield); + CardCollection ctrld = CardLists.filter(valid, CardPredicates.nameEquals(card.getName())); int numControlled = 0; if (param.endsWith("WithoutOppAuras")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java index 6dd2e5aa767..1db4d76d321 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; @@ -31,7 +30,7 @@ public class PowerExchangeAi extends SpellAbilityAi { sa.resetTargets(); List list = - CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); + CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); // AI won't try to grab cards that are filtered out of AI decks on // purpose list = CardLists.filter(list, new Predicate() { diff --git a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java index a7030e1180f..513b8689a0c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java @@ -146,7 +146,7 @@ public class ProtectAi extends SpellAbilityAi { if (s==null) { return false; } else { - Player opponent = ComputerUtil.getOpponentFor(ai); + Player opponent = ai.getWeakestOpponent(); Combat combat = ai.getGame().getCombat(); int dmg = ComputerUtilCombat.damageIfUnblocked(c, opponent, combat, true); float ratio = 1.0f * dmg / opponent.getLife(); diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 5a1a7b92887..b0a1a054e59 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -104,6 +104,7 @@ public class PumpAi extends PumpAiBase { @Override protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) { final Game game = ai.getGame(); + boolean main1Preferred = "Main1IfAble".equals(sa.getParam("AILogic")) && ph.is(PhaseType.MAIN1, ai); if (game.getStack().isEmpty() && hasTapCost(sa.getPayCosts(), sa.getHostCard())) { if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) && ph.isPlayerTurn(ai)) { return false; @@ -115,7 +116,7 @@ public class PumpAi extends PumpAiBase { if (game.getStack().isEmpty() && ph.getPhase().isBefore(PhaseType.COMBAT_BEGIN)) { // Instant-speed pumps should not be cast outside of combat when the // stack is empty - if (!sa.isCurse() && !SpellAbilityAi.isSorcerySpeed(sa)) { + if (!sa.isCurse() && !SpellAbilityAi.isSorcerySpeed(sa) && !main1Preferred) { return false; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index 89af0bf5722..e4567af164f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -177,7 +177,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { final Game game = ai.getGame(); final Combat combat = game.getCombat(); final PhaseHandler ph = game.getPhaseHandler(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final int newPower = card.getNetCombatDamage() + attack; //int defense = getNumDefense(sa); if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java index dfa5db11642..7f03f31ddf4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java @@ -68,7 +68,7 @@ public class PumpAllAi extends PumpAiBase { valid = sa.getParam("ValidCards"); } - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); CardCollection comp = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); CardCollection human = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); diff --git a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java index b896edbb8a2..e8092eccfa2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java @@ -46,10 +46,10 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi { // ability is targeted sa.resetTargets(); - Player opp = ComputerUtil.getOpponentFor(aiPlayer); + Player opp = aiPlayer.getWeakestOpponent(); final boolean canTgtAI = sa.canTarget(aiPlayer); final boolean canTgtHuman = sa.canTarget(opp); - + if (canTgtHuman && canTgtAI) { // TODO: maybe some other consideration rather than random? Player preferredTarget = MyRandom.percentTrue(50) ? aiPlayer : opp; diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java index 20d43fa814b..08059c5cace 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java @@ -15,7 +15,7 @@ public class RepeatAi extends SpellAbilityAi { protected boolean canPlayAI(Player ai, SpellAbility sa) { final Card source = sa.getHostCard(); final TargetRestrictions tgt = sa.getTargetRestrictions(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (tgt != null) { if (!opp.canBeTargetedBy(sa)) { @@ -49,7 +49,7 @@ public class RepeatAi extends SpellAbilityAi { protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { if (sa.usesTargeting()) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (sa.canTarget(opp)) { sa.resetTargets(); sa.getTargets().add(opp); diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java index 97ebb3004df..f5f1c587075 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; @@ -63,7 +62,7 @@ public class SacrificeAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); final boolean destroy = sa.hasParam("Destroy"); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ai.getWeakestOpponent(); if (tgt != null) { sa.resetTargets(); if (!opp.canBeTargetedBy(sa)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java index 4a077ba19a1..8032c127eed 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCost; import forge.ai.ComputerUtilMana; @@ -37,7 +36,7 @@ public class SacrificeAllAi extends SpellAbilityAi { } CardCollection humanlist = - CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa); + CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa); CardCollection computerlist = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java index 79b627dae43..77f83383db6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java @@ -112,7 +112,7 @@ public abstract class TapAiBase extends SpellAbilityAi { * @return a boolean. */ protected boolean tapPrefTargeting(final Player ai, final Card source, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory) { - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final Game game = ai.getGame(); CardCollection tapList = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), ai.getOpponents()); tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source, sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java index c61ef26a721..baf1842e4e0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java @@ -3,7 +3,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCombat; import forge.ai.SpellAbilityAi; import forge.game.Game; @@ -25,12 +24,11 @@ import java.util.List; public class TapAllAi extends SpellAbilityAi { @Override protected boolean canPlayAI(final Player ai, SpellAbility sa) { - // If tapping all creatures do it either during declare attackers of AIs - // turn + // If tapping all creatures do it either during declare attackers of AIs turn // or during upkeep/begin combat? final Card source = sa.getHostCard(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final Game game = ai.getGame(); if (game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) { @@ -87,7 +85,7 @@ public class TapAllAi extends SpellAbilityAi { return false; } // in AI's turn, check if there are possible attackers, before tapping blockers - if (game.getPhaseHandler().isPlayerTurn(ai) && !SpellAbilityAi.isSorcerySpeed(sa)) { + if (game.getPhaseHandler().isPlayerTurn(ai)) { validTappables = ai.getCardsIn(ZoneType.Battlefield); final boolean any = Iterables.any(validTappables, new Predicate() { @Override @@ -125,8 +123,9 @@ public class TapAllAi extends SpellAbilityAi { if (tgt != null) { sa.resetTargets(); - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); - validTappables = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield); + Player opp = ai.getWeakestOpponent(); + sa.getTargets().add(opp); + validTappables = opp.getCardsIn(ZoneType.Battlefield); } if (mandatory) { diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index feae6ff6106..cee492ffb3c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -167,7 +167,7 @@ public class TokenAi extends SpellAbilityAi { */ final Card source = sa.getHostCard(); final Game game = ai.getGame(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); if (ComputerUtil.preventRunAwayActivations(sa)) { return false; // prevent infinite tokens? @@ -261,13 +261,13 @@ public class TokenAi extends SpellAbilityAi { num = (num == null) ? "1" : num; final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack); CardCollection list = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), - ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), sa); + ai.getWeakestOpponent(), topStack.getHostCard(), sa); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); // only care about saving single creature for now if (!list.isEmpty() && nTokens > 0 && list.size() == nToSac) { ComputerUtilCard.sortByEvaluateCreature(list); list.add(token); - list = CardLists.getValidCards(list, valid.split(","), ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), sa); + list = CardLists.getValidCards(list, valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(), sa); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); if (ComputerUtilCard.evaluateCreature(token) < ComputerUtilCard.evaluateCreature(list.get(0)) && list.contains(token)) { @@ -285,7 +285,7 @@ public class TokenAi extends SpellAbilityAi { if (tgt != null) { sa.resetTargets(); if (tgt.canOnlyTgtOpponent()) { - sa.getTargets().add(ComputerUtil.getOpponentFor(ai)); + sa.getTargets().add(ai.getWeakestOpponent()); } else { sa.getTargets().add(ai); } diff --git a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java index 871ec928ed1..1589ec3f41d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import java.util.List; -import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; import forge.game.card.Card; @@ -29,7 +28,7 @@ public class TwoPilesAi extends SpellAbilityAi { valid = sa.getParam("ValidCards"); } - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { diff --git a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java index 5a105d49d00..6b7ad4eefbe 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java @@ -1,6 +1,5 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; @@ -65,7 +64,7 @@ public class UnattachAllAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { final Card card = sa.getHostCard(); - final Player opp = ComputerUtil.getOpponentFor(ai); + final Player opp = ai.getWeakestOpponent(); // Check if there are any valid targets List targets = new ArrayList(); final TargetRestrictions tgt = sa.getTargetRestrictions(); diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java index 7e692b9240b..48884ee524f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java @@ -139,7 +139,7 @@ public class UntapAi extends SpellAbilityAi { Player targetController = ai; if (sa.isCurse()) { - targetController = ComputerUtil.getOpponentFor(ai); + targetController = ai.getWeakestOpponent(); } CardCollection list = CardLists.getTargetableCards(targetController.getCardsIn(ZoneType.Battlefield), sa); diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index 0664b2c767d..b2b8fa39ffa 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -1,24 +1,13 @@ package forge.ai.simulation; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import forge.LobbyPlayer; import forge.ai.LobbyPlayerAi; import forge.card.CardStateName; -import forge.game.Game; -import forge.game.GameEntity; -import forge.game.GameObject; -import forge.game.GameObjectMap; -import forge.game.GameRules; -import forge.game.Match; -import forge.game.StaticEffect; +import forge.game.*; import forge.game.card.*; import forge.game.card.token.TokenInfo; import forge.game.combat.Combat; @@ -28,13 +17,16 @@ import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.game.spellability.SpellAbility; -import forge.game.spellability.SpellAbilityRestriction; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.staticability.StaticAbility; import forge.game.trigger.TriggerType; import forge.game.zone.PlayerZoneBattlefield; import forge.game.zone.ZoneType; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + public class GameCopier { private static final ZoneType[] ZONES = new ZoneType[] { ZoneType.Battlefield, @@ -323,7 +315,6 @@ public class GameCopier { } if (c.isPlaneswalker()) { for (SpellAbility sa : c.getAllSpellAbilities()) { - SpellAbilityRestriction restrict = sa.getRestrictions(); int active = sa.getActivationsThisTurn(); if (sa.isPwAbility() && active > 0) { SpellAbility newSa = findSAInCard(sa, newCard); diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java index 106670042d7..6fe8a5074be 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java @@ -207,7 +207,7 @@ public class GameSimulator { } // TODO: Support multiple opponents. - Player opponent = ComputerUtil.getOpponentFor(aiPlayer); + Player opponent = aiPlayer.getWeakestOpponent(); resolveStack(simGame, opponent); // TODO: If this is during combat, before blockers are declared, diff --git a/forge-core/src/main/java/forge/util/ImageUtil.java b/forge-core/src/main/java/forge/util/ImageUtil.java index cd5668bb20c..fff1213d844 100644 --- a/forge-core/src/main/java/forge/util/ImageUtil.java +++ b/forge-core/src/main/java/forge/util/ImageUtil.java @@ -7,8 +7,6 @@ import forge.card.CardRules; import forge.card.CardSplitType; import forge.item.PaperCard; -import org.apache.commons.lang3.StringUtils; - public class ImageUtil { public static float getNearestHQSize(float baseSize, float actualSize) { //get nearest power of actualSize to baseSize so that the image renders good @@ -46,9 +44,7 @@ public class ImageUtil { cntPictures = db.getPrintCount(card.getName(), edition); hasManyPictures = cntPictures > 1; } else { - // without set number of pictures equals number of urls provided in Svar:Picture - String urls = card.getPictureUrl(backFace); - cntPictures = StringUtils.countMatches(urls, "\\") + 1; + cntPictures = 1; // raise the art index limit to the maximum of the sets this card was printed in int maxCntPictures = db.getMaxPrintCount(card.getName()); diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 542f11d9d8f..1c177ec82fa 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -17,18 +17,7 @@ */ package forge.game.card; -import java.util.List; -import java.util.Set; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.common.collect.Table; - -import io.sentry.Sentry; -import io.sentry.event.BreadcrumbBuilder; - +import com.google.common.collect.*; import forge.ImageKeys; import forge.card.CardStateName; import forge.card.CardType; @@ -40,14 +29,16 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; -import forge.game.spellability.AbilityManaPart; -import forge.game.spellability.AbilitySub; -import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; +import forge.game.spellability.*; import forge.game.trigger.Trigger; import forge.game.zone.ZoneType; import forge.util.TextUtil; import forge.util.collect.FCollection; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; + +import java.util.List; +import java.util.Set; public final class CardUtil { // disable instantiation @@ -308,6 +299,15 @@ public final class CardUtil { newCopy.updateKeywordsCache(newCopy.getState(s)); } + newCopy.setKickerMagnitude(in.getKickerMagnitude()); + + for (OptionalCost ocost : in.getOptionalCostsPaid()) { + newCopy.addOptionalCostPaid(ocost); + } + + newCopy.setCastSA(in.getCastSA()); + newCopy.setCastFrom(in.getCastFrom()); + return newCopy; } diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index ae655029173..4c836b0d76e 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -386,7 +386,7 @@ public enum FControl implements KeyEventDispatcher { return true; } } - else if (e.getID() == KeyEvent.KEY_PRESSED && e.getModifiers() == InputEvent.ALT_MASK) { + else if (e.getID() == KeyEvent.KEY_PRESSED && e.getModifiersEx() == InputEvent.ALT_DOWN_MASK) { altKeyLastDown = true; } } diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java index 3879b66185c..c19d9c5b10f 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java @@ -20,7 +20,6 @@ package forge.gui; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import forge.card.CardEdition; -import forge.card.CardRules; import forge.item.IPaperCard; import forge.item.PaperCard; import forge.model.FModel; @@ -295,30 +294,10 @@ public class ImportSourceAnalyzer { // character mangling on some system locales, but we want to replicate the old code here exactly return out.toString().toLowerCase(); } - + + @Deprecated private void addDefaultPicNames(final PaperCard c, final boolean backFace) { - final CardRules card = c.getRules(); - final String urls = card.getPictureUrl(backFace); - if (StringUtils.isEmpty(urls)) { return; } - - final int numPics = 1 + StringUtils.countMatches(urls, "\\"); - if (c.getArtIndex() > numPics) { - return; - } - - final String filenameBase = ImageUtil.getImageKey(c, backFace, false); - final String filename = filenameBase + ".jpg"; - final boolean alreadyHadIt = null != defaultPicNames.put(filename, filename); - if ( alreadyHadIt ) { - return; - } - - // Do you shift artIndex by one here? - final String newLastSymbol = 0 == c.getArtIndex() ? "" : String.valueOf(c.getArtIndex() /* + 1 */); - final String oldFilename = oldCleanString(filenameBase.replaceAll("[0-9]?(\\.full)?$", "")) + newLastSymbol + ".jpg"; - //if ( numPics > 1 ) - //System.out.printf("Will move %s -> %s%n", oldFilename, filename); - defaultPicOldNameToCurrentName.put(oldFilename, filename); + return; } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java index 75cfc6418cb..dc9ad7af8f4 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java @@ -79,7 +79,7 @@ public class TextSearchFilter extends ItemFilter { itemManager.focus(); break; case KeyEvent.VK_ENTER: - if (e.getModifiers() == 0) { + if (e.getModifiersEx() == 0) { if (changeTimer.isRunning()) { applyChange(); //apply change now if currently delayed } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java index 58e774f3142..aaff5a98c15 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java @@ -327,7 +327,7 @@ public abstract class ItemView { private boolean popupShowing = false; private Popup popup; private Timer popupTimer; - private static final int okModifiers = InputEvent.SHIFT_MASK | InputEvent.ALT_GRAPH_MASK; + private static final int okModifiers = InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_GRAPH_DOWN_MASK; public IncrementalSearch() { } @@ -481,7 +481,7 @@ public abstract class ItemView { //$FALL-THROUGH$ default: // shift and/or alt-graph down is ok. anything else is a hotkey (e.g. ctrl-f) - if (okModifiers != (e.getModifiers() | okModifiers) + if (okModifiers != (e.getModifiersEx() | okModifiers) || !CharUtils.isAsciiPrintable(e.getKeyChar())) { // escape sneaks in here on Windows return; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java index bce6256d230..d616c02ef3b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java @@ -585,7 +585,7 @@ public abstract class ACEditorBase { txtScript.setDocument(doc); error = doc.addStyle("error", null); error.addAttribute(StyleConstants.Background, Color.red); - error.addAttribute(StyleConstants.Bold, new Boolean(true)); + error.addAttribute(StyleConstants.Bold, Boolean.valueOf(true)); } public JTextPane getTxtScript() { diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java b/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java index e088eb85555..ad24d10575f 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java @@ -200,8 +200,8 @@ public class FUndoManager extends UndoManager implements DocumentListener { public UndoAction() { putValue(Action.NAME, "Undo"); putValue(Action.SHORT_DESCRIPTION, getValue(Action.NAME)); - putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_U)); - putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK)); + putValue(Action.MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_U)); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK)); setEnabled(false); } @@ -229,8 +229,8 @@ public class FUndoManager extends UndoManager implements DocumentListener { public RedoAction() { putValue(Action.NAME, "Redo"); putValue(Action.SHORT_DESCRIPTION, getValue(Action.NAME)); - putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_R)); - putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK)); + putValue(Action.MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_R)); + putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_DOWN_MASK)); setEnabled(false); } diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java index b521cd68f12..49c26d51663 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java @@ -501,7 +501,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertTrue(depths.hasCounters()); SpellAbility sa = findSAWithPrefix(thespian, - "{2}, {T}: CARDNAME becomes a copy of target land and gains this ability."); + "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); assertNotNull(sa); sa.getTargets().add(depths); @@ -526,7 +526,7 @@ public class GameSimulatorTest extends SimulationTestCase { game.getAction().checkStateEffects(true); SpellAbility sa = findSAWithPrefix(thespian, - "{2}, {T}: CARDNAME becomes a copy of target land and gains this ability."); + "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); assertNotNull(sa); sa.getTargets().add(thespian); @@ -1849,7 +1849,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card simSpark = (Card)sim.getGameCopier().find(sparkDouble); - assertTrue(simSpark != null); + assertNotNull(simSpark); assertTrue(simSpark.getZone().is(ZoneType.Battlefield)); assertTrue(simSpark.getCounters(CounterType.P1P1) == 1); assertTrue(simSpark.getCounters(CounterType.LOYALTY) == 5); @@ -1882,13 +1882,59 @@ public class GameSimulatorTest extends SimulationTestCase { Card awakened = findCardWithName(sim.getSimulatedGameState(), "Vitu-Ghazi"); - assertTrue(awakened != null); + assertNotNull(awakened); assertTrue(awakened.getName().equals("Vitu-Ghazi")); assertTrue(awakened.getCounters(CounterType.P1P1) == 9); assertTrue(awakened.hasKeyword(Keyword.HASTE)); assertTrue(awakened.getType().hasSubtype("Goblin")); } + public void testNecroticOozeActivateOnce() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + for (int i=0; i<7; i++) { addCardToZone("Swamp", p, ZoneType.Battlefield); } + for (int i=0; i<7; i++) { addCardToZone("Forest", p, ZoneType.Battlefield); } + + addCardToZone("Basking Rootwalla", p, ZoneType.Graveyard); + Card ooze = addCardToZone("Necrotic Ooze", p, ZoneType.Hand); + + SpellAbility oozeSA = ooze.getFirstSpellAbility(); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(oozeSA); + + Card oozeOTB = findCardWithName(sim.getSimulatedGameState(), "Necrotic Ooze"); + + assertNotNull(oozeOTB); + + SpellAbility copiedSA = findSAWithPrefix(oozeOTB, "{1}{G}:"); + assertNotNull(copiedSA); + assertTrue(copiedSA.getRestrictions().getLimitToCheck().equals("1")); + } + + public void testEpochrasite() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + + for (int i=0; i<7; i++) { addCardToZone("Swamp", p, ZoneType.Battlefield); } + + Card epo = addCardToZone("Epochrasite", p, ZoneType.Graveyard); + Card animate = addCardToZone("Animate Dead", p, ZoneType.Hand); + + SpellAbility saAnimate = animate.getFirstSpellAbility(); + saAnimate.getTargets().add(epo); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(saAnimate); + + Card epoOTB = findCardWithName(sim.getSimulatedGameState(), "Epochrasite"); + + assertNotNull(epoOTB); + assertTrue(epoOTB.getCounters(CounterType.P1P1) == 3); + } + @SuppressWarnings("unused") public void broken_testCloneDimir() { Game game = initAndCreateGame(); diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java index 50c5977df39..6a1bd7cf654 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java @@ -235,7 +235,7 @@ public class SpellAbilityPickerTest extends SimulationTestCase { assertEquals("Urborg, Tomb of Yawgmoth", choices.get(1)); // Next, expected to use Thespian's Stage to copy Dark Depths. Plan.Decision d2 = picker.getPlan().getDecisions().get(1); - String expected = "{2}, {T}: Thespian's Stage becomes a copy of target land and gains this ability."; + String expected = "{2}, {T}: Thespian's Stage becomes a copy of target land, except it has this ability."; assertEquals(expected, d2.saRef.toString()); assertTrue(d2.targets.toString().contains("Dark Depths")); } diff --git a/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt b/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt index 41409051805..9defa76ed61 100644 --- a/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt +++ b/forge-gui/res/cardsfolder/a/ajanis_pridemate.txt @@ -2,9 +2,9 @@ Name:Ajani's Pridemate ManaCost:1 W Types:Creature Cat Soldier PT:2/2 -T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever you gain life, you may put a +1/+1 counter on CARDNAME. +T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you gain life, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/ajanis_pridemate.jpg DeckHints:Ability$LifeGain DeckHas:Ability$Counters -Oracle:Whenever you gain life, you may put a +1/+1 counter on Ajani's Pridemate. +Oracle:Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate. diff --git a/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt b/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt index 70d201f1af9..48c890acdfb 100644 --- a/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt +++ b/forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt @@ -3,7 +3,7 @@ ManaCost:6 W Types:Sorcery T:Mode$ SpellCast | ValidCard$ Card.Self | Static$ True | Execute$ ApproachingSuns SVar:ApproachingSuns:DB$ Effect | Name$ ApproachingSuns | Duration$ Permanent -A:SP$ Branch | Cost$ 6 W | References$ X,Y,Z | BranchConditionSVar$ X | BranchConditionSVarCompare$ EQ3 | TrueSubAbility$ WinGame | FalseSubAbility$ GainLife | SpellDescription$ If CARDNAME was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put CARDNAME into its owner's library seventh from the top and you gain 7 life. +A:SP$ Branch | Cost$ 6 W | References$ X,Y,Z | BranchConditionSVar$ X | BranchConditionSVarCompare$ EQ3 | TrueSubAbility$ WinGame | FalseSubAbility$ GainLife | SpellDescription$ If this spell was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put CARDNAME into its owner's library seventh from the top and you gain 7 life. SVar:WinGame:DB$ WinsGame | Defined$ You SVar:GainLife:DB$ GainLife | LifeAmount$ 7 | Defined$ You | SubAbility$ Reapproach SVar:Reapproach:DB$ ChangeZone | Origin$ Stack | Destination$ Library | LibraryPosition$ 6 | Defined$ Self @@ -11,4 +11,4 @@ SVar:Y:Count$ValidCommand Effect.YouCtrl+namedApproachingSuns/LimitMax.2 SVar:Z:Count$ValidStack Card.wasCastFromHand+Self/LimitMax.1 SVar:X:SVar$Y/Plus.Z DeckNeeds:Name$Approach of the Second Sun -Oracle:If Approach of the Second Sun was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put Approach of the Second Sun into its owner's library seventh from the top and you gain 7 life. \ No newline at end of file +Oracle:If this spell was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put Approach of the Second Sun into its owner's library seventh from the top and you gain 7 life. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/a/aquatic_incursion.txt b/forge-gui/res/cardsfolder/a/aquatic_incursion.txt index 4c849c6d88c..c00c999b7e9 100644 --- a/forge-gui/res/cardsfolder/a/aquatic_incursion.txt +++ b/forge-gui/res/cardsfolder/a/aquatic_incursion.txt @@ -2,7 +2,7 @@ Name:Aquatic Incursion ManaCost:3 U Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 blue Merfolk creature tokens with hexproof. -SVar:TrigToken:DB$Token | LegacyImage$ u 1 1 merfolk hexproof rix | TokenScript$ u_1_1_merfolk_hexproof | TokenOwner$ You +SVar:TrigToken:DB$Token | TokenAmount$ 2 | LegacyImage$ u 1 1 merfolk hexproof rix | TokenScript$ u_1_1_merfolk_hexproof | TokenOwner$ You A:AB$ Pump | Cost$ 3 U | ValidTgts$ Merfolk | TgtPrompt$ Select target Merfolk | KW$ HIDDEN Unblockable | SpellDescription$ Target Merfolk can't be blocked this turn. DeckHints:Type$Merfolk SVar:Picture:http://www.wizards.com/global/images/magic/general/aquatic_incursion.jpg diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index 627dbcc32d1..0dc3e781a08 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -1,6 +1,6 @@ Name:Arrester's Zeal ManaCost:W Types:Instant -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. +A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | AILogic$ Main1IfAble | SpellDescription$ Target creature gets +2/+2 until end of turn. SVar:DBAddendum:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt index 5168bc73c30..69eccedc206 100644 --- a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt +++ b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt @@ -2,7 +2,7 @@ Name:Artisan of Forms ManaCost:1 U Types:Creature Human Wizard PT:1/1 -T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigArtisanCopy | TriggerDescription$ Heroic — Whenever you cast a spell that targets CARDNAME, you may have CARDNAME become a copy of target creature and gain this ability. +T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigArtisanCopy | TriggerDescription$ Heroic — Whenever you cast a spell that targets CARDNAME, you may have CARDNAME become a copy of target creature, except it has this ability. SVar:TrigArtisanCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy | Optional$ True | GainThisAbility$ True | AddSVars$ TrigArtisanCopy | AILogic$ CloneBestCreature SVar:Picture:http://www.wizards.com/global/images/magic/general/artisan_of_forms.jpg -Oracle:Heroic — Whenever you cast a spell that targets Artisan of Forms, you may have Artisan of Forms become a copy of target creature and gain this ability. +Oracle:Heroic — Whenever you cast a spell that targets Artisan of Forms, you may have Artisan of Forms become a copy of target creature, except it has this ability. diff --git a/forge-gui/res/cardsfolder/b/benalish_emissary.txt b/forge-gui/res/cardsfolder/b/benalish_emissary.txt index 430c6072f3e..695fb18021c 100644 --- a/forge-gui/res/cardsfolder/b/benalish_emissary.txt +++ b/forge-gui/res/cardsfolder/b/benalish_emissary.txt @@ -6,5 +6,6 @@ K:Kicker:1 G T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target land. SVar:TrigKicker:DB$Destroy | ValidTgts$ Land | TgtPrompt$ Select target land DeckHints:Color$Green +SVar:NeedsToPlayKicked:Land.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_emissary.jpg Oracle:Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.)\nWhen Benalish Emissary enters the battlefield, if it was kicked, destroy target land. diff --git a/forge-gui/res/cardsfolder/b/bog_down.txt b/forge-gui/res/cardsfolder/b/bog_down.txt index 381fcab0669..127d1745bba 100644 --- a/forge-gui/res/cardsfolder/b/bog_down.txt +++ b/forge-gui/res/cardsfolder/b/bog_down.txt @@ -4,5 +4,8 @@ Types:Sorcery K:Kicker:Sac<2/Land> A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | TgtPrompt$ Choose a player | NumCards$ WasKicked | References$ WasKicked | Mode$ TgtChoose | SpellDescription$ Target player discards two cards. If CARDNAME was kicked, that player discards three cards instead. SVar:WasKicked:Count$Kicked.3.2 +SVar:NeedsToPlayKickedVar:Z GE3 +SVar:Z:Count$ValidHand Card.OppCtrl +SVar:AIPreference:SacCost$Land.basic+YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_down.jpg Oracle:Kicker—Sacrifice two lands. (You may sacrifice two lands in addition to any other costs as you cast this spell.)\nTarget player discards two cards. If this spell was kicked, that player discards three cards instead. diff --git a/forge-gui/res/cardsfolder/b/bond_of_discipline.txt b/forge-gui/res/cardsfolder/b/bond_of_discipline.txt index 7401f579fc2..c6e19d0a070 100644 --- a/forge-gui/res/cardsfolder/b/bond_of_discipline.txt +++ b/forge-gui/res/cardsfolder/b/bond_of_discipline.txt @@ -1,6 +1,6 @@ Name:Bond of Discipline ManaCost:4 W Types:Sorcery -A:SP$ TapAll | Cost$ 4 W | ValidCards$ Creature.OppCtrl | SubAbility$ DBPumpAll | SpellDescription$ Tap all creatures your opponents control. Creatures you control gain lifelink until end of turn. +A:SP$ TapAll | Cost$ 4 W | ValidCards$ Creature.OppCtrl | AILogic$ AtLeast3 | SubAbility$ DBPumpAll | SpellDescription$ Tap all creatures your opponents control. Creatures you control gain lifelink until end of turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Lifelink Oracle:Tap all creatures your opponents control. Creatures you control gain lifelink until end of turn. diff --git a/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt b/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt index db9cb3200b3..09282fc143a 100644 --- a/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt +++ b/forge-gui/res/cardsfolder/c/caligo_skin_witch.txt @@ -5,4 +5,6 @@ PT:1/3 K:Kicker:3 B T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, each opponent discards two cards. SVar:TrigDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 2 | Mode$ TgtChoose +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Count$ValidHand Card.OppCtrl Oracle:Kicker {3}{B} (You may pay an additional {3}{B} as you cast this spell.)\nWhen Caligo Skin-Witch enters the battlefield, if it was kicked, each opponent discards two cards. diff --git a/forge-gui/res/cardsfolder/c/cemetery_puca.txt b/forge-gui/res/cardsfolder/c/cemetery_puca.txt index 6bc8c257d6a..a0f53309c88 100644 --- a/forge-gui/res/cardsfolder/c/cemetery_puca.txt +++ b/forge-gui/res/cardsfolder/c/cemetery_puca.txt @@ -3,8 +3,8 @@ ManaCost:1 UB UB Types:Creature Shapeshifter PT:1/2 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ CemeteryPucaCopy | TriggerDescription$ Whenever a creature dies, you may pay {1}. If you do, CARDNAME becomes a copy of that creature and gains this ability. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ CemeteryPucaCopy | TriggerDescription$ Whenever a creature dies, you may pay {1}. If you do, CARDNAME becomes a copy of that creature, except it has this ability. SVar:CemeteryPucaCopy:AB$ Clone | Cost$ 1 | Defined$ TriggeredCardLKICopy | GainThisAbility$ True AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cemetery_puca.jpg -Oracle:Whenever a creature dies, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature and gains this ability. +Oracle:Whenever a creature dies, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature, except it has this ability. diff --git a/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt b/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt index 4dd663e25ce..66f35d47fb8 100644 --- a/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt +++ b/forge-gui/res/cardsfolder/c/cho_arrim_legate.txt @@ -3,8 +3,8 @@ ManaCost:2 W Types:Creature Human Soldier PT:1/2 K:Protection from black -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Swamp and you control a Plains, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Swamp and you control a Plains, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Swamp.OppCtrl SVar:Y:Count$Valid Plains.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/cho_arrim_legate.jpg -Oracle:Protection from black\nIf an opponent controls a Swamp and you control a Plains, you may cast Cho-Arrim Legate without paying its mana cost. +Oracle:Protection from black\nIf an opponent controls a Swamp and you control a Plains, you may cast this spell without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/c/concordant_crossroads.txt b/forge-gui/res/cardsfolder/c/concordant_crossroads.txt index 5c8339c3e58..07daa2a86be 100644 --- a/forge-gui/res/cardsfolder/c/concordant_crossroads.txt +++ b/forge-gui/res/cardsfolder/c/concordant_crossroads.txt @@ -5,6 +5,7 @@ S:Mode$ Continuous | Affected$ Creature | AddKeyword$ Haste | Description$ All c SVar:BuffedBy:Creature SVar:AntiBuffedBy:Creature SVar:NonStackingEffect:True +SVar:AICastPreference:MaxControlledGlobally$ 1 AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/concordant_crossroads.jpg Oracle:All creatures have haste. diff --git a/forge-gui/res/cardsfolder/c/crazed_firecat.txt b/forge-gui/res/cardsfolder/c/crazed_firecat.txt index 5729d197783..b7f1aa0f2bd 100644 --- a/forge-gui/res/cardsfolder/c/crazed_firecat.txt +++ b/forge-gui/res/cardsfolder/c/crazed_firecat.txt @@ -2,9 +2,9 @@ Name:Crazed Firecat ManaCost:5 R R Types:Creature Elemental Cat PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on CARDNAME for each flip you win. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on CARDNAME for each flip you won. SVar:TrigFlip:DB$ FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ X | LoseSubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | References$ X SVar:X:Number$0 SVar:Picture:http://www.wizards.com/global/images/magic/general/crazed_firecat.jpg -Oracle:When Crazed Firecat enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on Crazed Firecat for each flip you win. +Oracle:When Crazed Firecat enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on Crazed Firecat for each flip you won. diff --git a/forge-gui/res/cardsfolder/d/dacks_duplicate.txt b/forge-gui/res/cardsfolder/d/dacks_duplicate.txt index ce5cd483f24..8cf010a908b 100644 --- a/forge-gui/res/cardsfolder/d/dacks_duplicate.txt +++ b/forge-gui/res/cardsfolder/d/dacks_duplicate.txt @@ -3,6 +3,6 @@ ManaCost:2 U R Types:Creature Shapeshifter PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddKeywords$ Haste & Dethrone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it gains haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.) +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddKeywords$ Haste & Dethrone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it has haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.) SVar:Picture:http://www.wizards.com/global/images/magic/general/dacks_duplicate.jpg -Oracle:You may have Dack's Duplicate enter the battlefield as a copy of any creature on the battlefield except it gains haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.) +Oracle:You may have Dack's Duplicate enter the battlefield as a copy of any creature on the battlefield, except it has haste and dethrone. (Whenever it attacks the player with the most life or tied for most life, put a +1/+1 counter on it.) diff --git a/forge-gui/res/cardsfolder/d/dark_depths.txt b/forge-gui/res/cardsfolder/d/dark_depths.txt index 923bb8f20d4..e4ec8c13d6a 100644 --- a/forge-gui/res/cardsfolder/d/dark_depths.txt +++ b/forge-gui/res/cardsfolder/d/dark_depths.txt @@ -3,9 +3,9 @@ ManaCost:no cost Types:Legendary Snow Land K:etbCounter:ICE:10 A:AB$ RemoveCounter | Cost$ 3 | CounterType$ ICE | CounterNum$ 1 | SpellDescription$ Remove an ice counter from CARDNAME. -T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_EQ0_ICE | Execute$ TrigSac | TriggerDescription$ When Dark Depths has no ice counters on it, sacrifice it. If you do, create a legendary 20/20 black Avatar creature token with flying and indestructible named Marit Lage. +T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_EQ0_ICE | Execute$ TrigSac | TriggerDescription$ When Dark Depths has no ice counters on it, sacrifice it. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible. SVar:TrigSac:DB$ Sacrifice | RememberSacrificed$ True | SubAbility$ DBToken SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ marit_lage | TokenOwner$ You | LegacyImage$ marit lage v16 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_depths.jpg -Oracle:Dark Depths enters the battlefield with ten ice counters on it.\n{3}: Remove an ice counter from Dark Depths.\nWhen Dark Depths has no ice counters on it, sacrifice it. If you do, create a legendary 20/20 black Avatar creature token with flying and indestructible named Marit Lage. +Oracle:Dark Depths enters the battlefield with ten ice counters on it.\n{3}: Remove an ice counter from Dark Depths.\nWhen Dark Depths has no ice counters on it, sacrifice it. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible. diff --git a/forge-gui/res/cardsfolder/d/dead_of_winter.txt b/forge-gui/res/cardsfolder/d/dead_of_winter.txt index f01e6a9a775..762ab799287 100644 --- a/forge-gui/res/cardsfolder/d/dead_of_winter.txt +++ b/forge-gui/res/cardsfolder/d/dead_of_winter.txt @@ -1,7 +1,7 @@ Name:Dead of Winter ManaCost:2 B Types:Sorcery -A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature.Snow | NumAtt$ -X | NumDef$ -X | References$ X | SpellDescription$ All nonsnow creatures get -X/-X until end of turn, where X is the number of snow permanents you control. +A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature.nonSnow | NumAtt$ -X | NumDef$ -X | References$ X | SpellDescription$ All nonsnow creatures get -X/-X until end of turn, where X is the number of snow permanents you control. SVar:X:Count$Valid Permanent.Snow+YouCtrl AI:RemoveDeck:Random DeckNeeds:Type$Snow diff --git a/forge-gui/res/cardsfolder/d/deepwood_legate.txt b/forge-gui/res/cardsfolder/d/deepwood_legate.txt index 48294e9cf39..45deb129a93 100644 --- a/forge-gui/res/cardsfolder/d/deepwood_legate.txt +++ b/forge-gui/res/cardsfolder/d/deepwood_legate.txt @@ -2,9 +2,9 @@ Name:Deepwood Legate ManaCost:3 B Types:Creature Shade PT:1/1 -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control a Swamp, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control a Swamp, you may cast this spell without paying its mana cost. A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. SVar:X:Count$Valid Forest.OppCtrl SVar:Y:Count$Valid Swamp.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/deepwood_legate.jpg -Oracle:If an opponent controls a Forest and you control a Swamp, you may cast Deepwood Legate without paying its mana cost.\n{B}: Deepwood Legate gets +1/+1 until end of turn. +Oracle:If an opponent controls a Forest and you control a Swamp, you may cast this spell without paying its mana cost.\n{B}: Deepwood Legate gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt b/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt index 8eb95e9fc7f..0b47311defa 100644 --- a/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt +++ b/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt @@ -3,8 +3,8 @@ ManaCost:1 U B Types:Creature Shapeshifter PT:0/2 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone -A:AB$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DDCopy | SpellDescription$ Exile target creature card from a graveyard. CARDNAME becomes a copy of that card and gains this ability. +A:AB$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DDCopy | SpellDescription$ Exile target creature card from a graveyard. CARDNAME becomes a copy of that card, except it has this ability. SVar:DDCopy:DB$ Clone | Defined$ Remembered | GainThisAbility$ True AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_doppelganger.jpg -Oracle:{1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card and gains this ability. +Oracle:{1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card, except it has this ability. diff --git a/forge-gui/res/cardsfolder/d/dream_pillager.txt b/forge-gui/res/cardsfolder/d/dream_pillager.txt index 9956b223480..53c861debfc 100644 --- a/forge-gui/res/cardsfolder/d/dream_pillager.txt +++ b/forge-gui/res/cardsfolder/d/dream_pillager.txt @@ -3,11 +3,11 @@ ManaCost:5 R R Types:Creature Dragon PT:4/4 K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards exiled this way. +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards from among those exiled cards. SVar:TrigExile:DB$ Mill | Defined$ You | NumCards$ X | References$ X | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | ForgetOnMoved$ Exile | RememberObjects$ RememberedCard | SubAbility$ DBCleanup -SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.nonLand+IsRemembered | MayPlay$ True | AffectedZone$ Exile | Description$ Until end of turn, you may play that card. +SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.nonLand+IsRemembered | MayPlay$ True | AffectedZone$ Exile | Description$ Until end of turn, you may cast nonland cards from among those exiled cards. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:TriggerCount$DamageAmount SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_pillager.jpg -Oracle:Flying\nWhenever Dream Pillager deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards exiled this way. +Oracle:Flying\nWhenever Dream Pillager deals combat damage to a player, exile that many cards from the top of your library. Until end of turn, you may cast nonland cards from among those exiled cards. diff --git a/forge-gui/res/cardsfolder/d/dwarven_landslide.txt b/forge-gui/res/cardsfolder/d/dwarven_landslide.txt index ac41042fa2f..9b0a47d15de 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_landslide.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_landslide.txt @@ -4,5 +4,7 @@ Types:Sorcery K:Kicker:2 R Sac<1/Land> A:SP$ Destroy | Cost$ 3 R | ValidTgts$ Land | TargetMin$ X | TargetMax$ X | References$ X | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. If CARDNAME was kicked, destroy another target land. SVar:X:Count$Kicked.2.1 +SVar:NeedsToPlayKickedVar:Z GE2 +SVar:Z:Count$Valid Land.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_landslide.jpg Oracle:Kicker—{2}{R}, Sacrifice a land. (You may pay {2}{R} and sacrifice a land in addition to any other costs as you cast this spell.)\nDestroy target land. If Dwarven Landslide was kicked, destroy another target land. diff --git a/forge-gui/res/cardsfolder/e/epochrasite.txt b/forge-gui/res/cardsfolder/e/epochrasite.txt index f1e017ceebd..e6a5965d55a 100644 --- a/forge-gui/res/cardsfolder/e/epochrasite.txt +++ b/forge-gui/res/cardsfolder/e/epochrasite.txt @@ -2,7 +2,7 @@ Name:Epochrasite ManaCost:2 Types:Artifact Creature Construct PT:1/1 -K:etbCounter:P1P1:3:ValidLKI$ Card.Self+wasNotCastFromHand:CARDNAME enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand. +K:etbCounter:P1P1:3:ValidCard$ Card.Self+wasNotCastFromHand:CARDNAME enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand. T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigExile | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile it with three time counters on it and it gains suspend. SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBPutCounter | RememberChanged$ True SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ TIME | CounterNum$ 3 | SubAbility$ GiveSuspend diff --git a/forge-gui/res/cardsfolder/e/evil_twin.txt b/forge-gui/res/cardsfolder/e/evil_twin.txt index 683191e7ed6..0a55f1b6eec 100644 --- a/forge-gui/res/cardsfolder/e/evil_twin.txt +++ b/forge-gui/res/cardsfolder/e/evil_twin.txt @@ -4,7 +4,7 @@ Types:Creature Shapeshifter PT:0/0 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ EvilTwin | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it gains "{U}{B}, {T}: Destroy target creature with the same name as this creature." +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ EvilTwin | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it has "{U}{B}, {T}: Destroy target creature with the same name as this creature." SVar:EvilTwin:AB$Destroy | Cost$ U B T | ValidTgts$ Creature.sameName | TgtPrompt$ Select target creature with the same name. | SpellDescription$ Destroy target creature with the same name as this creature. SVar:Picture:http://www.wizards.com/global/images/magic/general/evil_twin.jpg -Oracle:You may have Evil Twin enter the battlefield as a copy of any creature on the battlefield, except it gains "{U}{B}, {T}: Destroy target creature with the same name as this creature." +Oracle:You may have Evil Twin enter the battlefield as a copy of any creature on the battlefield, except it has "{U}{B}, {T}: Destroy target creature with the same name as this creature." diff --git a/forge-gui/res/cardsfolder/e/excavation_elephant.txt b/forge-gui/res/cardsfolder/e/excavation_elephant.txt index 5d4c069b4d0..3d9fd4f727e 100644 --- a/forge-gui/res/cardsfolder/e/excavation_elephant.txt +++ b/forge-gui/res/cardsfolder/e/excavation_elephant.txt @@ -5,4 +5,6 @@ PT:3/5 K:Kicker:1 W T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target artifact card from your graveyard to your hand. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouOwn +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Count$ValidGraveyard Artifact.YouOwn Oracle:Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.)\nWhen Excavation Elephant enters the battlefield, if it was kicked, return target artifact card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt b/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt index 1e71c7024a4..9f428d0adec 100644 --- a/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt +++ b/forge-gui/res/cardsfolder/g/gatekeeper_of_malakir.txt @@ -5,7 +5,7 @@ PT:2/2 K:Kicker:B T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, target player sacrifices a creature. SVar:TrigKicker:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature | SacMessage$ Creature -SVar:NeedsToPlay:Creature.YouDontCtrl +SVar:NeedsToPlayKicked:Creature.YouDontCtrl SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/gatekeeper_of_malakir.jpg Oracle:Kicker {B} (You may pay an additional {B} as you cast this spell.)\nWhen Gatekeeper of Malakir enters the battlefield, if it was kicked, target player sacrifices a creature. diff --git a/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt b/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt index 59ec14dca72..93057963ce8 100644 --- a/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt +++ b/forge-gui/res/cardsfolder/g/ghitu_chronicler.txt @@ -5,4 +5,7 @@ PT:1/3 K:Kicker:3 R T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target instant or sorcery card from your graveyard to your hand. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Count$ValidGraveyard Instant.YouOwn/Plus.Z1 +SVar:Z1:Count$ValidGraveyard Sorcery.YouOwn Oracle:Kicker {3}{R} (You may pay an additional {3}{R} as you cast this spell.)\nWhen Ghitu Chronicler enters the battlefield, if it was kicked, return target instant or sorcery card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/g/gigantoplasm.txt b/forge-gui/res/cardsfolder/g/gigantoplasm.txt index eea8196c8c6..73733579483 100644 --- a/forge-gui/res/cardsfolder/g/gigantoplasm.txt +++ b/forge-gui/res/cardsfolder/g/gigantoplasm.txt @@ -3,8 +3,8 @@ ManaCost:3 U Types:Creature Shapeshifter PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ Gigantoplasm | AddSVars$ X | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it gains "{X}: This creature has base power and toughness of X/X." +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ Gigantoplasm | AddSVars$ X | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it has "{X}: This creature has base power and toughness of X/X." SVar:Gigantoplasm:AB$ Animate | Cost$ X | Power$ X | Toughness$ X | References$ X | ValidCards$ Self | Permanent$ True | SpellDescription$ CARDNAME has base power and toughness of X/X. SVar:X:Count$xPaid SVar:Picture:http://www.wizards.com/global/images/magic/general/gigantoplasm.jpg -Oracle:You may have Gigantoplasm enter the battlefield as a copy of any creature on the battlefield except it gains "{X}: This creature has base power and toughness X/X." +Oracle:You may have Gigantoplasm enter the battlefield as a copy of any creature on the battlefield, except it has "{X}: This creature has base power and toughness X/X." diff --git a/forge-gui/res/cardsfolder/g/goatnap.txt b/forge-gui/res/cardsfolder/g/goatnap.txt index 0c21954562a..105bc13bc9b 100644 --- a/forge-gui/res/cardsfolder/g/goatnap.txt +++ b/forge-gui/res/cardsfolder/g/goatnap.txt @@ -1,7 +1,7 @@ Name:Goatnap ManaCost:2 R Types:Sorcery -A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | AddKWs$ Haste | LoseControl$ EOT | SubAbility$ DBPump | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If that creature is a, it also gets +3/+0 until end of turn. +A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | AddKWs$ Haste | LoseControl$ EOT | SubAbility$ DBPump | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If that creature is a goat, it also gets +3/+0 until end of turn. SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ 3 | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X SVar:X:Targeted$Valid Goat Oracle:Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If that creature is a goat, it also gets +3/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt b/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt index 523769fd6f9..3ee041e0021 100644 --- a/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt +++ b/forge-gui/res/cardsfolder/g/goblin_ruinblaster.txt @@ -6,5 +6,6 @@ K:Haste K:Kicker:R T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target nonbasic land. SVar:TrigKicker:DB$Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land. +SVar:NeedsToPlayKicked:Land.nonBasic+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_ruinblaster.jpg Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nHaste\nWhen Goblin Ruinblaster enters the battlefield, if it was kicked, destroy target nonbasic land. diff --git a/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt b/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt index d2b45a5a3e2..e8ac0ea55c3 100644 --- a/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt +++ b/forge-gui/res/cardsfolder/h/heartstabber_mosquito.txt @@ -7,5 +7,6 @@ K:Kicker:2 B T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target creature. SVar:TrigKicker:DB$Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature. SVar:PlayMain1:TRUE +SVar:NeedsToPlayKicked:Creature.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/Heartstabber_Mosquito.jpg Oracle:Kicker {2}{B} (You may pay an additional {2}{B} as you cast this spell.)\nFlying\nWhen Heartstabber Mosquito enters the battlefield, if it was kicked, destroy target creature. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/h/heat_shimmer.txt b/forge-gui/res/cardsfolder/h/heat_shimmer.txt index 5f3aff8e3ec..93391920855 100644 --- a/forge-gui/res/cardsfolder/h/heat_shimmer.txt +++ b/forge-gui/res/cardsfolder/h/heat_shimmer.txt @@ -1,6 +1,6 @@ Name:Heat Shimmer ManaCost:2 R Types:Sorcery -A:SP$ CopyPermanent | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | AddKeywords$ Haste | AtEOTTrig$ Exile | SpellDescription$ Create a token that's a copy of target creature. That token has haste and "At the beginning of the end step, exile this permanent." +A:SP$ CopyPermanent | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | AddKeywords$ Haste | AtEOTTrig$ Exile | SpellDescription$ Create a token that's a copy of target creature, except it has haste and "At the beginning of the end step, exile this permanent." SVar:Picture:http://www.wizards.com/global/images/magic/general/heat_shimmer.jpg -Oracle:Create a token that's a copy of target creature. That token has haste and "At the beginning of the end step, exile this permanent." +Oracle:Create a token that's a copy of target creature, except it has haste and "At the beginning of the end step, exile this permanent." diff --git a/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt b/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt index af49ff69459..b7c816f91d3 100644 --- a/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt +++ b/forge-gui/res/cardsfolder/h/hypnotic_cloud.txt @@ -4,5 +4,7 @@ Types:Sorcery K:Kicker:4 A:SP$ Discard | Cost$ 1 B | NumCards$ X | References$ X | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ TgtChoose | SpellDescription$ Target player discards a card. If CARDNAME was kicked, that player discards three cards instead. SVar:X:Count$Kicked.3.1 +SVar:NeedsToPlayKickedVar:Z GE2 +SVar:Z:Count$ValidHand Card.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/hypnotic_cloud.jpg Oracle:Kicker {4} (You may pay an additional {4} as you cast this spell.)\nTarget player discards a card. If Hypnotic Cloud was kicked, that player discards three cards instead. diff --git a/forge-gui/res/cardsfolder/i/increasing_ambition.txt b/forge-gui/res/cardsfolder/i/increasing_ambition.txt index 3d195b06464..9c0c4747b61 100644 --- a/forge-gui/res/cardsfolder/i/increasing_ambition.txt +++ b/forge-gui/res/cardsfolder/i/increasing_ambition.txt @@ -2,7 +2,7 @@ Name:Increasing Ambition ManaCost:4 B Types:Sorcery K:Flashback:7 B -A:SP$ ChangeZone | Cost$ 4 B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ X | Mandatory$ True | References$ X | SpellDescription$ Search your library for a card and put that card into your hand. If CARDNAME was cast from a graveyard, instead search your library for two cards and put them into your hand. Then shuffle your library. +A:SP$ ChangeZone | Cost$ 4 B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ X | Mandatory$ True | References$ X | SpellDescription$ Search your library for a card and put that card into your hand. If this spell was cast from a graveyard, instead search your library for two cards and put them into your hand. Then shuffle your library. SVar:X:Count$wasCastFromGraveyard.2.1 SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_ambition.jpg -Oracle:Search your library for a card and put that card into your hand. If Increasing Ambition was cast from a graveyard, instead search your library for two cards and put those cards into your hand. Then shuffle your library.\nFlashback {7}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +Oracle:Search your library for a card and put that card into your hand. If this spell was cast from a graveyard, instead search your library for two cards and put those cards into your hand. Then shuffle your library.\nFlashback {7}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/i/increasing_confusion.txt b/forge-gui/res/cardsfolder/i/increasing_confusion.txt index 1dc02f5bbfc..76a7b09503e 100644 --- a/forge-gui/res/cardsfolder/i/increasing_confusion.txt +++ b/forge-gui/res/cardsfolder/i/increasing_confusion.txt @@ -2,9 +2,9 @@ Name:Increasing Confusion ManaCost:X U Types:Sorcery K:Flashback:X U -A:SP$ Mill | Cost$ X U | NumCards$ Z | ValidTgts$ Player | TgtPrompt$ Choose a player | References$ X,Y,Z | SpellDescription$ Target player puts the top X cards of their library into their graveyard. If CARDNAME was cast from a graveyard, that player puts twice as many cards into their graveyard instead. +A:SP$ Mill | Cost$ X U | NumCards$ Z | ValidTgts$ Player | TgtPrompt$ Choose a player | References$ X,Y,Z | SpellDescription$ Target player puts the top X cards of their library into their graveyard. If this spell was cast from a graveyard, that player puts twice as many cards into their graveyard instead. SVar:Z:SVar$X/Times.Y SVar:X:Count$xPaid SVar:Y:wasCastFromGraveyard.2.1 SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_confusion.jpg -Oracle:Target player puts the top X cards of their library into their graveyard. If Increasing Confusion was cast from a graveyard, that player puts twice that many cards into their graveyard instead.\nFlashback {X}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +Oracle:Target player puts the top X cards of their library into their graveyard. If this spell was cast from a graveyard, that player puts twice that many cards into their graveyard instead.\nFlashback {X}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/i/increasing_devotion.txt b/forge-gui/res/cardsfolder/i/increasing_devotion.txt index 77ba865a7cc..5a95cd235eb 100644 --- a/forge-gui/res/cardsfolder/i/increasing_devotion.txt +++ b/forge-gui/res/cardsfolder/i/increasing_devotion.txt @@ -2,7 +2,7 @@ Name:Increasing Devotion ManaCost:3 W W Types:Sorcery K:Flashback:7 W W -A:SP$ Token | Cost$ 3 W W | TokenAmount$ X | TokenScript$ w_1_1_human | LegacyImage$ w 1 1 human dka | TokenOwner$ You | References$ X | SpellDescription$ Create five 1/1 white Human creature tokens. If CARDNAME was cast from a graveyard, create ten of those tokens instead. +A:SP$ Token | Cost$ 3 W W | TokenAmount$ X | TokenScript$ w_1_1_human | LegacyImage$ w 1 1 human dka | TokenOwner$ You | References$ X | SpellDescription$ Create five 1/1 white Human creature tokens. If this spell was cast from a graveyard, create ten of those tokens instead. SVar:X:Count$wasCastFromGraveyard.10.5 SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_devotion.jpg -Oracle:Create five 1/1 white Human creature tokens. If Increasing Devotion was cast from a graveyard, create ten of those tokens instead.\nFlashback {7}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +Oracle:Create five 1/1 white Human creature tokens. If this spell was cast from a graveyard, create ten of those tokens instead.\nFlashback {7}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/i/increasing_savagery.txt b/forge-gui/res/cardsfolder/i/increasing_savagery.txt index 335714eb288..4eb9d8216b2 100644 --- a/forge-gui/res/cardsfolder/i/increasing_savagery.txt +++ b/forge-gui/res/cardsfolder/i/increasing_savagery.txt @@ -2,7 +2,7 @@ Name:Increasing Savagery ManaCost:2 G G Types:Sorcery K:Flashback:5 G G -A:SP$ PutCounter | Cost$ 2 G G | CounterNum$ X | CounterType$ P1P1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | References$ X | SpellDescription$ Put five +1/+1 counters on target creature. If CARDNAME was cast from a graveyard, put ten +1/+1 counters on that creature instead. +A:SP$ PutCounter | Cost$ 2 G G | CounterNum$ X | CounterType$ P1P1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | References$ X | SpellDescription$ Put five +1/+1 counters on target creature. If this spell was cast from a graveyard, put ten +1/+1 counters on that creature instead. SVar:X:Count$wasCastFromGraveyard.10.5 SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_savagery.jpg -Oracle:Put five +1/+1 counters on target creature. If Increasing Savagery was cast from a graveyard, put ten +1/+1 counters on that creature instead.\nFlashback {5}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +Oracle:Put five +1/+1 counters on target creature. If this spell was cast from a graveyard, put ten +1/+1 counters on that creature instead.\nFlashback {5}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/i/increasing_vengeance.txt b/forge-gui/res/cardsfolder/i/increasing_vengeance.txt index ae45627bd04..1c864b599af 100644 --- a/forge-gui/res/cardsfolder/i/increasing_vengeance.txt +++ b/forge-gui/res/cardsfolder/i/increasing_vengeance.txt @@ -2,8 +2,8 @@ Name:Increasing Vengeance ManaCost:R R Types:Instant K:Flashback:3 R R -A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SubAbility$ DBCopy2 | SpellDescription$ Copy target instant or sorcery spell you control. If CARDNAME was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies. +A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SubAbility$ DBCopy2 | SpellDescription$ Copy target instant or sorcery spell you control. If this spell was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies. SVar:DBCopy2:DB$ CopySpellAbility | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | AILogic$ Always SVar:X:Count$wasCastFromGraveyard.1.0 SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_vengeance.jpg -Oracle:Copy target instant or sorcery spell you control. If Increasing Vengeance was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.\nFlashback {3}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +Oracle:Copy target instant or sorcery spell you control. If this spell was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.\nFlashback {3}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/j/jilt.txt b/forge-gui/res/cardsfolder/j/jilt.txt index 07c885f993e..1f372cb360c 100644 --- a/forge-gui/res/cardsfolder/j/jilt.txt +++ b/forge-gui/res/cardsfolder/j/jilt.txt @@ -5,5 +5,7 @@ K:Kicker:1 R A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature to bounce | TargetUnique$ True | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBDamage | SpellDescription$ Return target creature to its owner's hand. SVar:DBDamage:DB$ DealDamage | Condition$ Kicked | ValidTgts$ Creature | TgtPrompt$ Select another target creature to deal 2 damage | TargetUnique$ True | NumDmg$ 2 | TargetMin$ X | TargetMax$ X | SpellDescription$ If CARDNAME was kicked, it deals 2 damage to another target creature. SVar:X:Count$Kicked.1.0 +SVar:NeedsToPlayKickedVar:Z GE2 +SVar:Z:Count$Valid Creature.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/jilt.jpg Oracle:Kicker {1}{R} (You may pay an additional {1}{R} as you cast this spell.)\nReturn target creature to its owner's hand. If Jilt was kicked, it deals 2 damage to another target creature. diff --git a/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt b/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt index 4b197e4db3e..d1cb55fba67 100644 --- a/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt +++ b/forge-gui/res/cardsfolder/k/kamahls_druidic_vow.txt @@ -1,7 +1,7 @@ Name:Kamahl's Druidic Vow ManaCost:X G G Types:Legendary Sorcery -A:SP$ Dig | Cost$ X G G | DigNum$ X | Reveal$ True | AnyNumber$ True | ChangeValid$ Land,Permanent.Legendary+cmcLEX | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | References$ X | SpellDescription$ Reveal the top X cards of your library. You may put any number of permanent cards with converted mana cost X or less from among them onto the battlefield. Then put all cards revealed this way that weren't put onto the battlefield into your graveyard. +A:SP$ Dig | Cost$ X G G | DigNum$ X | Reveal$ True | AnyNumber$ True | ChangeValid$ Land,Permanent.Legendary+cmcLEX | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | References$ X | SpellDescription$ Reveal the top X cards of your library. You may put any number of land and/or legendary permanent cards with converted mana cost X or less from among them onto the battlefield. Put the rest into your graveyard. SVar:X:Count$xPaid SVar:NeedsToPlayVar:Z GE6 SVar:Z:Count$Valid Land.YouCtrl+untapped diff --git a/forge-gui/res/cardsfolder/k/keldon_overseer.txt b/forge-gui/res/cardsfolder/k/keldon_overseer.txt index b72b86373cf..3be69da62f3 100644 --- a/forge-gui/res/cardsfolder/k/keldon_overseer.txt +++ b/forge-gui/res/cardsfolder/k/keldon_overseer.txt @@ -6,4 +6,5 @@ K:Kicker:3 R K:Haste T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. SVar:TrigKicker:DB$ GainControl | TgtPrompt$ Choose target creature. | ValidTgts$ Creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature until end of turn, untap that creature, and it gains haste until end of turn. +SVar:NeedsToPlayKicked:Creature.OppCtrl Oracle:Kicker {3}{R} (You may pay an additional {3}{R} as you cast this spell.)\nHaste\nWhen Keldon Overseer enters the battlefield, if it was kicked, gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt b/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt index e2102a880df..b21d030f25e 100644 --- a/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt +++ b/forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt @@ -3,6 +3,6 @@ ManaCost:2 R R R Types:Legendary Creature Goblin Shaman PT:2/2 K:Haste -A:AB$ CopyPermanent | Cost$ T | ValidTgts$ Creature.nonLegendary+YouCtrl | TgtPrompt$ Select target nonlegendary creature you control | AddKeywords$ Haste | AtEOT$ Sacrifice | AILogic$ BeforeCombat | SpellDescription$ Create a token that's a copy of target nonlegendary creature you control. That token has haste. Sacrifice it at the beginning of the next end step. +A:AB$ CopyPermanent | Cost$ T | ValidTgts$ Creature.nonLegendary+YouCtrl | TgtPrompt$ Select target nonlegendary creature you control | AddKeywords$ Haste | AtEOT$ Sacrifice | AILogic$ BeforeCombat | SpellDescription$ Create a token that's a copy of target nonlegendary creature you control, except it has haste. Sacrifice it at the beginning of the next end step. SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card50321.jpg -Oracle:Haste\n{T}: Create a token that's a copy of target nonlegendary creature you control. That token has haste. Sacrifice it at the beginning of the next end step. +Oracle:Haste\n{T}: Create a token that's a copy of target nonlegendary creature you control, except it has haste. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/k/kor_aeronaut.txt b/forge-gui/res/cardsfolder/k/kor_aeronaut.txt index 8effcc56db7..b104e1ccbde 100644 --- a/forge-gui/res/cardsfolder/k/kor_aeronaut.txt +++ b/forge-gui/res/cardsfolder/k/kor_aeronaut.txt @@ -7,5 +7,6 @@ K:Kicker:1 W T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, target creature gains flying until end of turn. SVar:TrigKicker:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying SVar:PlayMain1:True +SVar:NeedsToPlayKicked:Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/Kor_Aeronaut.jpg Oracle:Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.)\nFlying\nWhen Kor Aeronaut enters the battlefield, if it was kicked, target creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt b/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt index f5de8cda75f..a4e03f07e28 100644 --- a/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt +++ b/forge-gui/res/cardsfolder/k/kor_sanctifiers.txt @@ -5,5 +5,8 @@ PT:2/3 K:Kicker:W T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target artifact or enchantment. SVar:TrigKicker:DB$Destroy | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment. +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Count$Valid Artifact.OppCtrl/Plus.Z1 +SVar:Z1:Count$Valid Enchantment.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/Kor_sanctifiers.jpg Oracle:Kicker {W} (You may pay an additional {W} as you cast this spell.)\nWhen Kor Sanctifiers enters the battlefield, if it was kicked, destroy target artifact or enchantment. diff --git a/forge-gui/res/cardsfolder/k/kyren_legate.txt b/forge-gui/res/cardsfolder/k/kyren_legate.txt index f535099fa19..d9bb8b190ca 100644 --- a/forge-gui/res/cardsfolder/k/kyren_legate.txt +++ b/forge-gui/res/cardsfolder/k/kyren_legate.txt @@ -3,8 +3,8 @@ ManaCost:1 R Types:Creature Goblin PT:1/1 K:Haste -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Plains and you control a Mountain, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Plains and you control a Mountain, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Plains.OppCtrl SVar:Y:Count$Valid Mountain.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/kyren_legate.jpg -Oracle:Haste\nIf an opponent controls a Plains and you control a Mountain, you may cast Kyren Legate without paying its mana cost. +Oracle:Haste\nIf an opponent controls a Plains and you control a Mountain, you may cast this spell without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt b/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt index 2b4be094498..4d45f152ab0 100644 --- a/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt +++ b/forge-gui/res/cardsfolder/l/lord_of_atlantis.txt @@ -2,7 +2,7 @@ Name:Lord of Atlantis ManaCost:U U Types:Creature Merfolk PT:2/2 -S:Mode$ Continuous | Affected$ Creature.Merfolk+Other | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Islandwalk | Description$ Other Merfolk creatures get +1/+1 and have islandwalk. +S:Mode$ Continuous | Affected$ Card.Merfolk+Other | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Islandwalk | Description$ Other Merfolk get +1/+1 and have islandwalk. (They can't be blocked as long as defending player controls an Island.) SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_atlantis.jpg -Oracle:Other Merfolk creatures get +1/+1 and have islandwalk. +Oracle:Other Merfolk get +1/+1 and have islandwalk. (They can't be blocked as long as defending player controls an Island.) diff --git a/forge-gui/res/cardsfolder/m/magma_burst.txt b/forge-gui/res/cardsfolder/m/magma_burst.txt index 2415c2b0884..698298d8595 100644 --- a/forge-gui/res/cardsfolder/m/magma_burst.txt +++ b/forge-gui/res/cardsfolder/m/magma_burst.txt @@ -4,6 +4,9 @@ Types:Instant K:Kicker:Sac<2/Land> A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | TargetMin$ X | TargetMax$ X | References$ X | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target. If CARDNAME was kicked, it deals 3 damage to another target. SVar:X:Count$Kicked.2.1 +SVar:NeedsToPlayKickedVar:Z GE2 +SVar:Z:Count$Valid Creature.OppCtrl/Plus.Z1 +SVar:Z1:Count$Valid Planeswalker.OppCtrl AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_burst.jpg Oracle:Kicker—Sacrifice two lands. (You may sacrifice two lands in addition to any other costs as you cast this spell.)\nMagma Burst deals 3 damage to any target. If Magma Burst was kicked, it deals 3 damage to another target. diff --git a/forge-gui/res/cardsfolder/m/marsh_casualties.txt b/forge-gui/res/cardsfolder/m/marsh_casualties.txt index 5c869b43ed9..611856fec81 100644 --- a/forge-gui/res/cardsfolder/m/marsh_casualties.txt +++ b/forge-gui/res/cardsfolder/m/marsh_casualties.txt @@ -4,5 +4,6 @@ Types:Sorcery K:Kicker:3 A:SP$ PumpAll | Cost$ B B | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | NumAtt$ -X | NumDef$ -X | References$ X | IsCurse$ True | SpellDescription$ Creatures target player controls get -1/-1 until end of turn. If CARDNAME was kicked, those creatures get -2/-2 until end of turn instead. SVar:X:Count$Kicked.2.1 +SVar:NeedsToPlayKicked:Creature.OppCtrl+toughnessEQ2 SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_casualties.jpg Oracle:Kicker {3} (You may pay an additional {3} as you cast this spell.)\nCreatures target player controls get -1/-1 until end of turn. If Marsh Casualties was kicked, those creatures get -2/-2 until end of turn instead. diff --git a/forge-gui/res/cardsfolder/m/mass_hysteria.txt b/forge-gui/res/cardsfolder/m/mass_hysteria.txt index c8976a546e0..cba6baf17cd 100644 --- a/forge-gui/res/cardsfolder/m/mass_hysteria.txt +++ b/forge-gui/res/cardsfolder/m/mass_hysteria.txt @@ -6,5 +6,6 @@ SVar:NonStackingEffect:True AI:RemoveDeck:Random SVar:BuffedBy:Creature SVar:AntiBuffedBy:Creature +SVar:AICastPreference:MaxControlledGlobally$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/mass_hysteria.jpg Oracle:All creatures have haste. diff --git a/forge-gui/res/cardsfolder/m/massacre.txt b/forge-gui/res/cardsfolder/m/massacre.txt index 2cc529de824..a46e441dee3 100644 --- a/forge-gui/res/cardsfolder/m/massacre.txt +++ b/forge-gui/res/cardsfolder/m/massacre.txt @@ -1,9 +1,9 @@ Name:Massacre ManaCost:2 B B Types:Sorcery -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Plains and you control a Swamp, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Plains and you control a Swamp, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Plains.OppCtrl SVar:Y:Count$Valid Swamp.YouCtrl A:SP$ PumpAll | Cost$ 2 B B | ValidCards$ Creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ All creatures get -2/-2 until end of turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/massacre.jpg -Oracle:If an opponent controls a Plains and you control a Swamp, you may cast Massacre without paying its mana cost.\nAll creatures get -2/-2 until end of turn. +Oracle:If an opponent controls a Plains and you control a Swamp, you may cast this spell without paying its mana cost.\nAll creatures get -2/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mercurial_pretender.txt b/forge-gui/res/cardsfolder/m/mercurial_pretender.txt index c6e48a645d5..426f1da5e9e 100644 --- a/forge-gui/res/cardsfolder/m/mercurial_pretender.txt +++ b/forge-gui/res/cardsfolder/m/mercurial_pretender.txt @@ -3,7 +3,7 @@ ManaCost:4 U Types:Creature Shapeshifter PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.YouCtrl+Other | AddAbilities$ MercurialBounce | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature you control except it gains "{2}{U}{U}: Return this creature to its owner's hand." +SVar:DBCopy:DB$ Clone | Choices$ Creature.YouCtrl+Other | AddAbilities$ MercurialBounce | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature you control, except it has "{2}{U}{U}: Return this creature to its owner's hand." SVar:MercurialBounce:AB$ ChangeZone | Cost$ 2 U U | Defined$ Self | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. SVar:Picture:http://www.wizards.com/global/images/magic/general/mercurial_pretender.jpg -Oracle:You may have Mercurial Pretender enter the battlefield as a copy of any creature you control except it gains "{2}{U}{U}: Return this creature to its owner's hand." +Oracle:You may have Mercurial Pretender enter the battlefield as a copy of any creature you control, except it has "{2}{U}{U}: Return this creature to its owner's hand." diff --git a/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt b/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt index 5f5f3e33b8b..f164c1fbc8f 100644 --- a/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt +++ b/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt @@ -1,7 +1,7 @@ Name:Might of Old Krosa ManaCost:G Types:Instant -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ X | NumDef$ X | References$ X | SpellDescription$ Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. +A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ X | NumDef$ X | References$ X | AILogic$ Main1IfAble | SpellDescription$ Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. SVar:X:Count$IfCastInOwnMainPhase.4.2 SVar:Picture:http://www.wizards.com/global/images/magic/general/might_of_old_krosa.jpg Oracle:Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. diff --git a/forge-gui/res/cardsfolder/m/minion_reflector.txt b/forge-gui/res/cardsfolder/m/minion_reflector.txt index f739e01c834..86f92f52888 100644 --- a/forge-gui/res/cardsfolder/m/minion_reflector.txt +++ b/forge-gui/res/cardsfolder/m/minion_reflector.txt @@ -1,8 +1,8 @@ Name:Minion Reflector ManaCost:5 Types:Artifact -T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCopy | OptionalDecider$ You | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature. That token has haste and "At the beginning of the end step, sacrifice this permanent." +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCopy | OptionalDecider$ You | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature, except it has haste and "At the beginning of the end step, sacrifice this permanent." SVar:TrigCopy:AB$ CopyPermanent | Cost$ 2 | Defined$ TriggeredCard | AddKeywords$ Haste | AtEOTTrig$ Sacrifice SVar:BuffedBy:Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/minion_reflector.jpg -Oracle:Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature. That token has haste and "At the beginning of the end step, sacrifice this permanent." +Oracle:Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature, except it has haste and "At the beginning of the end step, sacrifice this permanent." diff --git a/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt b/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt index e86074aa2b9..c7d99e8321f 100644 --- a/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt +++ b/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt @@ -2,7 +2,7 @@ Name:Mizzium Transreliquat ManaCost:3 Types:Artifact A:AB$ Clone | Cost$ 3 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy until end of turn. | Duration$ UntilEndOfTurn | SpellDescription$ CARDNAME becomes a copy of target artifact until end of turn. -A:AB$ Clone | Cost$ 1 U R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target artifact and gains this ability. +A:AB$ Clone | Cost$ 1 U R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to copy. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target artifact, except it has this ability. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mizzium_transreliquat.jpg -Oracle:{3}: Mizzium Transreliquat becomes a copy of target artifact until end of turn.\n{1}{U}{R}: Mizzium Transreliquat becomes a copy of target artifact and gains this ability. +Oracle:{3}: Mizzium Transreliquat becomes a copy of target artifact until end of turn.\n{1}{U}{R}: Mizzium Transreliquat becomes a copy of target artifact, except it has this ability. diff --git a/forge-gui/res/cardsfolder/m/mogg_salvage.txt b/forge-gui/res/cardsfolder/m/mogg_salvage.txt index 7bdc66e80ab..debde464dd4 100644 --- a/forge-gui/res/cardsfolder/m/mogg_salvage.txt +++ b/forge-gui/res/cardsfolder/m/mogg_salvage.txt @@ -1,9 +1,9 @@ Name:Mogg Salvage ManaCost:2 R Types:Instant -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Mountain, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Mountain, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Island.OppCtrl SVar:Y:Count$Valid Mountain.YouCtrl A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_salvage.jpg -Oracle:If an opponent controls an Island and you control a Mountain, you may cast Mogg Salvage without paying its mana cost.\nDestroy target artifact. +Oracle:If an opponent controls an Island and you control a Mountain, you may cast this spell without paying its mana cost.\nDestroy target artifact. diff --git a/forge-gui/res/cardsfolder/m/mold_shambler.txt b/forge-gui/res/cardsfolder/m/mold_shambler.txt index 46bd5516fe4..20d5f704a90 100644 --- a/forge-gui/res/cardsfolder/m/mold_shambler.txt +++ b/forge-gui/res/cardsfolder/m/mold_shambler.txt @@ -5,5 +5,6 @@ PT:3/3 K:Kicker:1 G T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target noncreature permanent. SVar:TrigKicker:DB$Destroy | ValidTgts$ Permanent.nonCreature | TgtPrompt$ Select target noncreature permanent. +SVar:NeedsToPlay:Permanent.nonCreature+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/mold_shambler.jpg Oracle:Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.)\nWhen Mold Shambler enters the battlefield, if it was kicked, destroy target noncreature permanent. diff --git a/forge-gui/res/cardsfolder/n/narset_transcendent.txt b/forge-gui/res/cardsfolder/n/narset_transcendent.txt index 7500018e1ec..f00e39918ae 100644 --- a/forge-gui/res/cardsfolder/n/narset_transcendent.txt +++ b/forge-gui/res/cardsfolder/n/narset_transcendent.txt @@ -5,11 +5,11 @@ Loyalty:6 A:AB$ PeekAndReveal | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | AILogic$ Main2 | PeekAmount$ 1 | RevealValid$ Card.nonCreature+nonLand | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBChangeZone | SpellDescription$ Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand. SVar:DBChangeZone:DB$ ChangeZone | Defined$ TopOfLibrary | Origin$ Library | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Card.nonCreature+nonLand | ConditionCompare$ EQ1 | SubAbility$ DBCleanupOne SVar:DBCleanupOne:DB$ Cleanup | ClearRemembered$ True -A:AB$Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ NarsetRebound | Stackable$ False | Name$ Narset Transcendent effect. | Triggers$ AddRebound | SVars$ AddReboundMain,DBCleanupTwo | SpellDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. +A:AB$Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ NarsetRebound | Stackable$ False | Name$ Narset Transcendent effect. | Triggers$ AddRebound | SVars$ AddReboundMain,DBCleanupTwo | SpellDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.) SVar:AddRebound:Mode$ SpellCast | ValidCard$ Instant.wasCastFromHand,Sorcery.wasCastFromHand | ValidActivatingPlayer$ You | OneOff$ True | Execute$ AddReboundMain | TriggerZones$ Command | TriggerDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. SVar:AddReboundMain:DB$ Pump | Defined$ TriggeredCard| KW$ Rebound | PumpZone$ Stack | SubAbility$ DBCleanupTwo SVar:DBCleanupTwo:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile A:AB$ Effect | Cost$ SubCounter<9/LOYALTY> | Name$ Emblem - Narset Transcendent | StaticAbilities$ STNarset | Planeswalker$ True | Ultimate$ True | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Your opponents can't cast noncreature spells." SVar:STNarset:Mode$ CantBeCast | ValidCard$ Card.nonCreature | Caster$ Opponent | EffectZone$ Command | Description$ Your opponents can't cast noncreature spells. SVar:Picture:http://www.wizards.com/global/images/magic/general/narset_transcendent.jpg -Oracle:[+1]: Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand.\n[-2]: When you cast your next instant or sorcery spell from your hand this turn, it gains rebound.\n[-9]: You get an emblem with "Your opponents can't cast noncreature spells." +Oracle:[+1]: Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand.\n[-2]: When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)\n[-9]: You get an emblem with "Your opponents can't cast noncreature spells." diff --git a/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt b/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt index 1ded78141f7..59c57282779 100644 --- a/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt +++ b/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt @@ -6,6 +6,6 @@ K:Kicker:2 G K:Reach T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target creature with flying. SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying. -AI:RemoveDeck:All +SVar:NeedsToPlayKicked:Creature.withFlying+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/oran_rief_recluse.jpg Oracle:Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.)\nReach (This creature can block creatures with flying.)\nWhen Oran-Rief Recluse enters the battlefield, if it was kicked, destroy target creature with flying. diff --git a/forge-gui/res/cardsfolder/o/orims_chant.txt b/forge-gui/res/cardsfolder/o/orims_chant.txt index d8d666f6fa4..bf531791bbb 100644 --- a/forge-gui/res/cardsfolder/o/orims_chant.txt +++ b/forge-gui/res/cardsfolder/o/orims_chant.txt @@ -6,5 +6,6 @@ A:SP$ Effect | Cost$ W | Name$ Orim's Chant Effect | IsCurse$ True | StaticAbili SVar:CantAttackWhenKicked:DB$ Effect | Name$ Orim's Chant can't Attack Effect | IsCurse$ True | StaticAbilities$ CantAttack | Condition$ Kicked | SpellDescription$ If CARDNAME was kicked, creatures can't attack this turn. SVar:CantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Target player can't cast spells this turn. SVar:CantAttack:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AffectedZone$ Battlefield | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures can't attack this turn. +SVar:NeedsToPlayKicked:Creature.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/orims_chant.jpg Oracle:Kicker {W} (You may pay an additional {W} as you cast this spell.)\nTarget player can't cast spells this turn.\nIf Orim's Chant was kicked, creatures can't attack this turn. diff --git a/forge-gui/res/cardsfolder/o/orims_thunder.txt b/forge-gui/res/cardsfolder/o/orims_thunder.txt index cb066851fa8..0cd9030d2b5 100644 --- a/forge-gui/res/cardsfolder/o/orims_thunder.txt +++ b/forge-gui/res/cardsfolder/o/orims_thunder.txt @@ -7,5 +7,6 @@ SVar:DBDamage:DB$DealDamage | Condition$ Kicked | ValidTgts$ Creature | TgtPromp SVar:X:Targeted$CardManaCost SVar:Y:Count$Kicked.1.0 DeckHints:Color$Red +SVar:NeedsToPlay:Creature.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/orims_thunder.jpg Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nDestroy target artifact or enchantment. If Orim's Thunder was kicked, it deals damage equal to that permanent's converted mana cost to target creature. diff --git a/forge-gui/res/cardsfolder/p/patricians_scorn.txt b/forge-gui/res/cardsfolder/p/patricians_scorn.txt index 87a39c75ab7..5931b29ad6e 100644 --- a/forge-gui/res/cardsfolder/p/patricians_scorn.txt +++ b/forge-gui/res/cardsfolder/p/patricians_scorn.txt @@ -2,7 +2,7 @@ Name:Patrician's Scorn ManaCost:3 W Types:Instant A:SP$ DestroyAll | Cost$ 3 W | ValidCards$ Enchantment | SpellDescription$ Destroy all enchantments. -A:SP$ DestroyAll | Cost$ 0 | ValidCards$ Enchantment | CheckSVar$ X | SVarCompare$ GE1 | References$ X | SpellDescription$ If you've cast another white spell this turn, you may cast CARDNAME without paying its mana cost. Destroy all enchantments. +A:SP$ DestroyAll | Cost$ 0 | ValidCards$ Enchantment | CheckSVar$ X | SVarCompare$ GE1 | References$ X | SpellDescription$ If you've cast another white spell this turn, you may cast this spell without paying its mana cost. Destroy all enchantments. SVar:X:Count$ThisTurnCast_Card.White+Other+YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/patricians_scorn.jpg -Oracle:If you've cast another white spell this turn, you may cast Patrician's Scorn without paying its mana cost.\nDestroy all enchantments. +Oracle:If you've cast another white spell this turn, you may cast this spell without paying its mana cost.\nDestroy all enchantments. diff --git a/forge-gui/res/cardsfolder/p/phantasmal_form.txt b/forge-gui/res/cardsfolder/p/phantasmal_form.txt index 0b3075c873c..4b554a788c0 100644 --- a/forge-gui/res/cardsfolder/p/phantasmal_form.txt +++ b/forge-gui/res/cardsfolder/p/phantasmal_form.txt @@ -1,7 +1,7 @@ Name:Phantasmal Form ManaCost:2 U Types:Instant -A:SP$ Animate | Cost$ 2 U | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target creature | Power$ 3 | Toughness$ 3 | Keywords$ Flying | Colors$ Blue | Types$ Illusion | SpellDescription$ Until end of turn, up to two target creatures each have base power and toughness 3/3, gain flying, and become blue phase in addition to their other colors and types. +A:SP$ Animate | Cost$ 2 U | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target creature | Power$ 3 | Toughness$ 3 | Keywords$ Flying | Colors$ Blue | Types$ Illusion | SubAbility$ DBDraw | SpellDescription$ Until end of turn, up to two target creatures each have base power and toughness 3/3, gain flying, and become blue phase in addition to their other colors and types. AI:RemoveDeck:All SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. Oracle:Until end of turn, up to two target creatures each have base power and toughness 3/3, gain flying, and become blue Illusions in addition to their other colors and types.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/p/phantasmal_image.txt b/forge-gui/res/cardsfolder/p/phantasmal_image.txt index 7c110e6016e..b3a4f808c9b 100644 --- a/forge-gui/res/cardsfolder/p/phantasmal_image.txt +++ b/forge-gui/res/cardsfolder/p/phantasmal_image.txt @@ -4,9 +4,9 @@ Types:Creature Illusion PT:0/0 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTypes$ Illusion | AddTriggers$ PhantasmalImageTgtTrig | AddSVars$ PhantasmalImageSac,Targeting | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it gains "When this creature becomes the target of a spell or ability, sacrifice it." +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTypes$ Illusion | AddTriggers$ PhantasmalImageTgtTrig | AddSVars$ PhantasmalImageSac,Targeting | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has "When this creature becomes the target of a spell or ability, sacrifice it." SVar:PhantasmalImageTgtTrig:Mode$ BecomesTarget | ValidTarget$ Card.Self | Execute$ PhantasmalImageSac | TriggerDescription$ When this creature becomes the target of a spell or ability, sacrifice it. SVar:PhantasmalImageSac:DB$Sacrifice | Defined$ Self SVar:Targeting:Dies SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_image.jpg -Oracle:You may have Phantasmal Image enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it gains "When this creature becomes the target of a spell or ability, sacrifice it." +Oracle:You may have Phantasmal Image enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has "When this creature becomes the target of a spell or ability, sacrifice it." diff --git a/forge-gui/res/cardsfolder/p/probe.txt b/forge-gui/res/cardsfolder/p/probe.txt index e64bc38112e..6314eda7efd 100644 --- a/forge-gui/res/cardsfolder/p/probe.txt +++ b/forge-gui/res/cardsfolder/p/probe.txt @@ -6,5 +6,7 @@ A:SP$ Draw | Cost$ 2 U | NumCards$ 3 | SubAbility$ DBDiscardYou | SpellDescripti SVar:DBDiscardYou:DB$ Discard | Defined$ You | NumCards$ 2 | SubAbility$ DBDiscardTarget | Mode$ TgtChoose | SpellDescription$ then discard two cards. SVar:DBDiscardTarget:DB$ Discard | Condition$ Kicked | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ If CARDNAME was kicked, target player discards two cards. DeckHints:Color$Black +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Count$ValidHand Card.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/probe.jpg Oracle:Kicker {1}{B} (You may pay an additional {1}{B} as you cast this spell.)\nDraw three cards, then discard two cards.\nIf Probe was kicked, target player discards two cards. diff --git a/forge-gui/res/cardsfolder/p/progenitor_mimic.txt b/forge-gui/res/cardsfolder/p/progenitor_mimic.txt index 19553c0e0ed..36d8322352b 100644 --- a/forge-gui/res/cardsfolder/p/progenitor_mimic.txt +++ b/forge-gui/res/cardsfolder/p/progenitor_mimic.txt @@ -3,9 +3,9 @@ ManaCost:4 G U Types:Creature Shapeshifter PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTriggers$ ProgenitorTrig | AddSVars$ ProgenitorCopy,ProgenitorTrig | SpellDescription$ You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it gains "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature." +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTriggers$ ProgenitorTrig | AddSVars$ ProgenitorCopy,ProgenitorTrig | SpellDescription$ You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it has "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature." SVar:ProgenitorTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ ProgenitorCopy | IsPresent$ Card.Self+nonToken | TriggerDescription$ At the beginning of your upkeep, if CARDNAME isn't a token, create a token that's a copy of CARDNAME." SVar:ProgenitorCopy:DB$ CopyPermanent | Defined$ Self | NumCopies$ 1 SVar:NeedsToPlay:Creature.inZoneBattlefield SVar:Picture:http://www.wizards.com/global/images/magic/general/progenitor_mimic.jpg -Oracle:You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it gains "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature." +Oracle:You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield, except it has "At the beginning of your upkeep, if this creature isn't a token, create a token that's a copy of this creature." diff --git a/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt b/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt index d8d1c246e2b..41f5d8d8c85 100644 --- a/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt +++ b/forge-gui/res/cardsfolder/r/rakshasa_vizier.txt @@ -2,7 +2,7 @@ Name:Rakshasa Vizier ManaCost:2 B G U Types:Creature Cat Demon PT:4/4 -T:Mode$ ChangesZoneAll | ValidCards$ Card.YouOwn | Origin$ Graveyard | Destination$ Exile | TriggerZones$ Battlefield | Execute$ TrigPutcounter | TriggerDescription$ Whenever one or more cards are put into exile from your graveyard, put that many +1/+1 counters on Rakshasa Vizier. +T:Mode$ ChangesZoneAll | ValidCards$ Card.YouOwn | Origin$ Graveyard | Destination$ Exile | TriggerZones$ Battlefield | Execute$ TrigPutcounter | TriggerDescription$ Whenever one or more cards are put into exile from your graveyard, put that many +1/+1 counters on CARDNAME. SVar:TrigPutcounter:DB$ PutCounter | CounterType$ P1P1 | Defined$ Self | CounterNum$ X | References$ X SVar:X:TriggerCount$Amount SVar:Picture:http://www.wizards.com/global/images/magic/general/rakshasa_vizier.jpg diff --git a/forge-gui/res/cardsfolder/r/refreshing_rain.txt b/forge-gui/res/cardsfolder/r/refreshing_rain.txt index 4855603a83d..2ce7f1d83cb 100644 --- a/forge-gui/res/cardsfolder/r/refreshing_rain.txt +++ b/forge-gui/res/cardsfolder/r/refreshing_rain.txt @@ -1,9 +1,9 @@ Name:Refreshing Rain ManaCost:3 G Types:Instant -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Swamp and you control a Forest, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls a Swamp and you control a Forest, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Swamp.OppCtrl SVar:Y:Count$Valid Forest.YouCtrl A:SP$ GainLife | Cost$ 3 G | LifeAmount$ 6 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player gains 6 life. SVar:Picture:http://www.wizards.com/global/images/magic/general/refreshing_rain.jpg -Oracle:If an opponent controls a Swamp and you control a Forest, you may cast Refreshing Rain without paying its mana cost.\nTarget player gains 6 life. +Oracle:If an opponent controls a Swamp and you control a Forest, you may cast this spell without paying its mana cost.\nTarget player gains 6 life. diff --git a/forge-gui/res/cardsfolder/r/rowan_kenrith.txt b/forge-gui/res/cardsfolder/r/rowan_kenrith.txt index 9868e082f06..302a8e04b57 100644 --- a/forge-gui/res/cardsfolder/r/rowan_kenrith.txt +++ b/forge-gui/res/cardsfolder/r/rowan_kenrith.txt @@ -4,7 +4,7 @@ Types:Legendary Planeswalker Rowan Loyalty:4 Text:CARDNAME can be your commander. K:Partner:Will Kenrith:Will -A:AB$ Effect | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | Name$ Rowan Kenrith Taunt Effect | ValidTgts$ Player | TgtPrompt$ Select target player | StaticAbilities$ MustAttack | References$ MustAttack | RememberObjects$ Targeted | IsCurse$ True | Triggers$ RemoveEffect | SVars$ ExileEffect | Duration$ Permanent | SubAbility$ DBCleanup | SpellDescription$ Creatures target player controls attack this turn if able. +A:AB$ Effect | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | Name$ Rowan Kenrith Taunt Effect | ValidTgts$ Player | TgtPrompt$ Select target player | StaticAbilities$ MustAttack | References$ MustAttack | RememberObjects$ Targeted | IsCurse$ True | Triggers$ RemoveEffect | SVars$ ExileEffect | Duration$ Permanent | SubAbility$ DBCleanup | SpellDescription$ During target player's next turn, each creature that player controls attacks if able. SVar:MustAttack:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ CARDNAME attacks each combat if able. | Description$ Creatures target opponent controls attack this turn if able. SVar:RemoveEffect:Mode$ Phase | Phase$ Cleanup | ValidPlayer$ Player.IsRemembered | TriggerZones$ Command | Static$ True | Execute$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile diff --git a/forge-gui/res/cardsfolder/r/rushing_river.txt b/forge-gui/res/cardsfolder/r/rushing_river.txt index e73447c7bd3..4f83a95e0b2 100644 --- a/forge-gui/res/cardsfolder/r/rushing_river.txt +++ b/forge-gui/res/cardsfolder/r/rushing_river.txt @@ -4,5 +4,7 @@ Types:Instant K:Kicker:Sac<1/Land> A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | TargetMin$ X | TargetMax$ X | References$ X | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target nonland permanent to its owner's hand. If CARDNAME was kicked, return another target nonland permanent to its owner's hand. SVar:X:Count$Kicked.2.1 +SVar:NeedsToPlayKickedVar:Z GE2 +SVar:Z:Count$Valid Permanent.nonLand+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/rushing_river.jpg Oracle:Kicker—Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell.)\nReturn target nonland permanent to its owner's hand. If Rushing River was kicked, return another target nonland permanent to its owner's hand. diff --git a/forge-gui/res/cardsfolder/r/rushwood_legate.txt b/forge-gui/res/cardsfolder/r/rushwood_legate.txt index 1abba122043..2ab40f2c1f6 100644 --- a/forge-gui/res/cardsfolder/r/rushwood_legate.txt +++ b/forge-gui/res/cardsfolder/r/rushwood_legate.txt @@ -2,8 +2,8 @@ Name:Rushwood Legate ManaCost:2 G Types:Creature Dryad PT:2/1 -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Forest, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | References$ X,Y | Description$ If an opponent controls an Island and you control a Forest, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Island.OppCtrl SVar:Y:Count$Valid Forest.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/rushwood_legate.jpg -Oracle:If an opponent controls an Island and you control a Forest, you may cast Rushwood Legate without paying its mana cost. +Oracle:If an opponent controls an Island and you control a Forest, you may cast this spell without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/s/sadistic_obsession.txt b/forge-gui/res/cardsfolder/s/sadistic_obsession.txt index 333899f8501..0cbb51c2bea 100644 --- a/forge-gui/res/cardsfolder/s/sadistic_obsession.txt +++ b/forge-gui/res/cardsfolder/s/sadistic_obsession.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 3 B | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ TapCounter | Description$ Enchanted creature has "{B}, {T}: Put a -1/-1 counter on target creature." -SVar:TapCounter:AB$ PutCounter | Cost$ B T | ValidTgts$ Creature | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on target creature. +SVar:TapCounter:AB$ PutCounter | Cost$ B T | ValidTgts$ Creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True | SpellDescription$ Put a -1/-1 counter on target creature. SVar:NonStackingAttachEffect:True DeckHas:Ability$Counters Oracle:Enchant creature\nEnchanted creature has "{B}, {T}: Put a -1/-1 counter on target creature." diff --git a/forge-gui/res/cardsfolder/s/saprazzan_legate.txt b/forge-gui/res/cardsfolder/s/saprazzan_legate.txt index 8bfd797fd89..45609bc0703 100644 --- a/forge-gui/res/cardsfolder/s/saprazzan_legate.txt +++ b/forge-gui/res/cardsfolder/s/saprazzan_legate.txt @@ -3,8 +3,8 @@ ManaCost:3 U Types:Creature Merfolk Soldier PT:1/3 K:Flying -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control an Island, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control an Island, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Mountain.OppCtrl SVar:Y:Count$Valid Island.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_legate.jpg -Oracle:Flying\nIf an opponent controls a Mountain and you control an Island, you may cast Saprazzan Legate without paying its mana cost. +Oracle:Flying\nIf an opponent controls a Mountain and you control an Island, you may cast this spell without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt b/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt index 199cd063057..a020b1c0492 100644 --- a/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt +++ b/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt @@ -3,7 +3,7 @@ ManaCost:4 B Types:Legendary Creature Spirit PT:2/2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Creature.powerLE1+YouOwn | OptionalDecider$ You | Execute$ DelTrig | TriggerDescription$ Whenever a creature with power 1 or less is put into your graveyard from the battlefield, you may return that card to the battlefield at the beginning of the next end step if CARDNAME is still on the battlefield. -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigReturn | IsPresent$ Card.Self | PresentZone$ Battlefield | RememberObjects$ TriggeredCard | TriggerDescription$ Return creature to the battlefield. +SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigReturn | IsPresent$ Card.Self+StrictlySelf | PresentZone$ Battlefield | RememberObjects$ TriggeredCard | TriggerDescription$ Return creature to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ DelayTriggerRemembered | IsPresent$ Card.Self+StrictlySelf | PresentZone$ Battlefield T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Static$ True | Execute$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearTriggered$ True diff --git a/forge-gui/res/cardsfolder/s/shivan_emissary.txt b/forge-gui/res/cardsfolder/s/shivan_emissary.txt index c92ccdf7d86..db81c97f1a2 100644 --- a/forge-gui/res/cardsfolder/s/shivan_emissary.txt +++ b/forge-gui/res/cardsfolder/s/shivan_emissary.txt @@ -5,7 +5,7 @@ PT:1/1 K:Kicker:1 B T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target nonblack creature. It can't be regenerated. SVar:TrigKicker:DB$Destroy | ValidTgts$ Creature.nonBlack | NoRegen$ True | TgtPrompt$ Select target nonblack creature -AI:RemoveDeck:Random DeckNeeds:Color$Black +SVar:NeedsToPlayKicked:Creature.nonBlack+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_emissary.jpg Oracle:Kicker {1}{B} (You may pay an additional {1}{B} as you cast this spell.)\nWhen Shivan Emissary enters the battlefield, if it was kicked, destroy target nonblack creature. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/s/sivvis_ruse.txt b/forge-gui/res/cardsfolder/s/sivvis_ruse.txt index 469a657da53..2f085d4299c 100644 --- a/forge-gui/res/cardsfolder/s/sivvis_ruse.txt +++ b/forge-gui/res/cardsfolder/s/sivvis_ruse.txt @@ -1,11 +1,11 @@ Name:Sivvi's Ruse ManaCost:2 W W Types:Instant -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control a Plains, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control a Plains, you may cast this spell without paying its mana cost. A:SP$ Effect | Cost$ 2 W W | Name$ Sivvi's Ruse Effect | ReplacementEffects$ RPrevent | SpellDescription$ Prevent all damage that would be dealt this turn to creatures you control. SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ Creature.YouCtrl | Description$ Prevent all damage that would be dealt this turn to creatures you control. SVar:X:Count$Valid Mountain.OppCtrl SVar:Y:Count$Valid Plains.YouCtrl AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sivvis_ruse.jpg -Oracle:If an opponent controls a Mountain and you control a Plains, you may cast Sivvi's Ruse without paying its mana cost.\nPrevent all damage that would be dealt this turn to creatures you control. +Oracle:If an opponent controls a Mountain and you control a Plains, you may cast this spell without paying its mana cost.\nPrevent all damage that would be dealt this turn to creatures you control. diff --git a/forge-gui/res/cardsfolder/s/skizzik.txt b/forge-gui/res/cardsfolder/s/skizzik.txt index 2505c751475..ffaeaa7048e 100644 --- a/forge-gui/res/cardsfolder/s/skizzik.txt +++ b/forge-gui/res/cardsfolder/s/skizzik.txt @@ -7,5 +7,9 @@ K:Trample K:Kicker:R T:Mode$ Phase | Phase$ End of Turn | IsPresent$ Card.Self+notkicked | Execute$ TrigNotKicked | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of the end step, sacrifice CARDNAME unless it was kicked. SVar:TrigNotKicked:DB$Sacrifice | Defined$ Self +# The following construct specifies that the AI always plays the spell kicked, and plays it unkicked on its own turn only if it will attack +SVar:NeedsToPlay:WillAttack +SVar:NeedsToPlayKickedVar:Z GE1 +SVar:Z:Number$1 SVar:Picture:http://www.wizards.com/global/images/magic/general/skizzik.jpg Oracle:Kicker {R} (You may pay an additional {R} as you cast this spell.)\nTrample, haste\nAt the beginning of the end step, sacrifice Skizzik unless it was kicked. diff --git a/forge-gui/res/cardsfolder/s/splinter_twin.txt b/forge-gui/res/cardsfolder/s/splinter_twin.txt index 0e4598a6087..913bbef85bf 100644 --- a/forge-gui/res/cardsfolder/s/splinter_twin.txt +++ b/forge-gui/res/cardsfolder/s/splinter_twin.txt @@ -3,8 +3,8 @@ ManaCost:2 R R Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 2 R R | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ ABCopy | Description$ Enchanted creature has "{T}: Create a token that's a copy of this creature. That token has haste. Exile it at the beginning of the next end step." -SVar:ABCopy:AB$ CopyPermanent | Cost$ T | Defined$ Self | AddKeywords$ Haste | AtEOT$ Exile | SpellDescription$ Create a token that's a copy of this creature. That token has haste. Exile it at the beginning of the next end step. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ ABCopy | Description$ Enchanted creature has "{T}: Create a token that's a copy of this creature, except it has haste. Exile it at the beginning of the next end step." +SVar:ABCopy:AB$ CopyPermanent | Cost$ T | Defined$ Self | AddKeywords$ Haste | AtEOT$ Exile | SpellDescription$ Create a token that's a copy of this creature, except it has haste. Exile it at the beginning of the next end step. SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/splinter_twin.jpg -Oracle:Enchant creature\nEnchanted creature has "{T}: Create a token that's a copy of this creature. That token has haste. Exile it at the beginning of the next end step." +Oracle:Enchant creature\nEnchanted creature has "{T}: Create a token that's a copy of this creature, except it has haste. Exile that token at the beginning of the next end step." diff --git a/forge-gui/res/cardsfolder/s/stolen_strategy.txt b/forge-gui/res/cardsfolder/s/stolen_strategy.txt new file mode 100644 index 00000000000..bea88f35b7a --- /dev/null +++ b/forge-gui/res/cardsfolder/s/stolen_strategy.txt @@ -0,0 +1,12 @@ +Name:Stolen Strategy +ManaCost:4 R +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ At the beginning of your upkeep, exile the top card of each opponent’s library. +SVar:TrigExile:DB$ Mill | Defined$ Player.Opponent | NumCards$ 1 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of each opponent's library. Until end of turn, you may cast nonland cards and you may spend mana as though it were mana of any color to cast those spells. +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCastDoM | SVars$ TrigRemoveSelf | RememberObjects$ Remembered | SubAbility$ DBCleanup +SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. +SVar:TriggerCastDoM:Mode$ SpellCast | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Execute$ TrigRemoveSelf | Static$ True +SVar:TrigRemoveSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Picture:https://img.scryfall.com/cards/large/en/bbd/64.jpg +Oracle:At the beginning of your upkeep, exile the top card of each opponent’s library. Until end of turn, you may cast nonland cards from among those exiled cards, and you may spend mana as though it were mana of any color to cast those spells. diff --git a/forge-gui/res/cardsfolder/s/strength_of_night.txt b/forge-gui/res/cardsfolder/s/strength_of_night.txt index 2b933f0fda3..96901d17bc2 100644 --- a/forge-gui/res/cardsfolder/s/strength_of_night.txt +++ b/forge-gui/res/cardsfolder/s/strength_of_night.txt @@ -4,7 +4,7 @@ Types:Instant K:Kicker:B A:SP$ PumpAll | Cost$ 2 G | ValidCards$ Creature.YouCtrl | NumAtt$ 1 | NumDef$ 1 | SubAbility$ DBPumpYourZombies | SpellDescription$ Creatures you control get +1/+1 until end of turn. If CARDNAME was kicked, Zombie creatures you control get an additional +2/+2 until end of turn. SVar:DBPumpYourZombies:DB$ PumpAll | ValidCards$ Creature.Zombie+YouCtrl | NumAtt$ 2 | NumDef$ 2 | Condition$ Kicked | ConditionDescription$ If Strength of Night was kicked, -AI:RemoveDeck:Random DeckNeeds:Color$Black & Type$Zombie +SVar:NeedsToPlayKicked:Creature.Zombie+YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/strength_of_night.jpg Oracle:Kicker {B} (You may pay an additional {B} as you cast this spell.)\nCreatures you control get +1/+1 until end of turn. If Strength of Night was kicked, Zombie creatures you control get an additional +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/submerge.txt b/forge-gui/res/cardsfolder/s/submerge.txt index 45e7dd9225c..31bfd5eede7 100644 --- a/forge-gui/res/cardsfolder/s/submerge.txt +++ b/forge-gui/res/cardsfolder/s/submerge.txt @@ -1,9 +1,9 @@ Name:Submerge ManaCost:4 U Types:Instant -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control an Island, you may cast CARDNAME without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddKeyword$ Alternative Cost:0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Forest and you control an Island, you may cast this spell without paying its mana cost. SVar:X:Count$Valid Forest.OppCtrl SVar:Y:Count$Valid Island.YouCtrl A:SP$ ChangeZone | Cost$ 4 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. SVar:Picture:http://www.wizards.com/global/images/magic/general/submerge.jpg -Oracle:If an opponent controls a Forest and you control an Island, you may cast Submerge without paying its mana cost.\nPut target creature on top of its owner's library. +Oracle:If an opponent controls a Forest and you control an Island, you may cast this spell without paying its mana cost.\nPut target creature on top of its owner's library. diff --git a/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt b/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt index ecd0d2017e2..e8868aa1ba8 100644 --- a/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt +++ b/forge-gui/res/cardsfolder/t/teferi_time_raveler.txt @@ -3,7 +3,7 @@ ManaCost:1 W U Types:Legendary Planeswalker Teferi Loyalty:4 S:Mode$ CantBeCast | ValidCard$ Card | Caster$ Opponent | OnlySorcerySpeed$ True | Description$ Each opponent can cast spells only any time they could cast a sorcery. -A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | StaticAbilities$ STPlay | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, you may cast sorcery spells as though they had flash. +A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | StaticAbilities$ STPlay | Duration$ UntilYourNextTurn | AILogic$ Main2 | SpellDescription$ Until your next turn, you may cast sorcery spells as though they had flash. SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Sorcery | AffectedZone$ Exile,Graveyard,Hand,Library,Command | WithFlash$ You | Description$ Until your next turn, you may cast sorcery spells as though they had flash. SVar:PlayMain1:TRUE A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | Origin$ Battlefield | Destination$ Hand | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact,Creature,Enchantment | TgtPrompt$ Select target artifact, creature, or enchantment | SpellDescription$ Return up to one target artifact, creature, or enchantment to its owner's hand. Draw a card. | SubAbility$ DBDraw diff --git a/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt b/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt index 17b880269e4..b1f0511d18c 100644 --- a/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt +++ b/forge-gui/res/cardsfolder/t/tempt_with_immortality.txt @@ -1,7 +1,7 @@ Name:Tempt with Immortality ManaCost:4 B Types:Sorcery -A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | Hidden$ True | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each player who does, return a creature card from your graveyard to the battlefield. +A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | Hidden$ True | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each opponent who does, return a creature card from your graveyard to the battlefield. SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBChangeZone | RepeatPlayers$ Player.Opponent | SubAbility$ DBReturn SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.RememberedPlayerCtrl | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | ChangeNum$ 1 | Hidden$ True | RememberChanged$ True SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ X | References$ X | Hidden$ True | SubAbility$ DBCleanup @@ -10,4 +10,4 @@ SVar:X:Remembered$Amount SVar:NeedsToPlayVar:Y GE2 SVar:Y:Count$TypeInYourYard.Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/tempt_with_immortality.jpg -Oracle:Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each player who does, return a creature card from your graveyard to the battlefield. +Oracle:Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each opponent who does, return a creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt b/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt index 45ecb52fcc8..31d7a98ec1b 100644 --- a/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt +++ b/forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt @@ -1,7 +1,7 @@ Name:Tempt with Vengeance ManaCost:X R Types:Sorcery -A:SP$ Token | Cost$ X R | TokenAmount$ X | References$ X | TokenScript$ r_1_1_elemental_haste | TokenOwner$ You | LegacyImage$ r 1 1 elemental haste c13 | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each player who does, create X 1/1 red Elemental creature tokens with haste. +A:SP$ Token | Cost$ X R | TokenAmount$ X | References$ X | TokenScript$ r_1_1_elemental_haste | TokenOwner$ You | LegacyImage$ r 1 1 elemental haste c13 | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each opponent who does, create X 1/1 red Elemental creature tokens with haste. SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBTokenOpp | RepeatPlayers$ Player.Opponent | RepeatOptionalForEachPlayer$ True | RepeatOptionalMessage$ Do you want to create X 1/1 red Elemental creature tokens with haste? | SubAbility$ DBToken SVar:DBTokenOpp:DB$ Token | TokenAmount$ X | References$ X | TokenScript$ r_1_1_elemental_haste | TokenOwner$ Player.IsRemembered | LegacyImage$ r 1 1 elemental haste c13 | SubAbility$ DBCount SVar:DBCount:DB$ StoreSVar | SVar$ Y | Type$ CountSVar | Expression$ Y/Plus.1 | References$ Y @@ -11,4 +11,4 @@ SVar:Y:Number$0 SVar:X:Count$xPaid SVar:Z:SVar$X/Times.Y SVar:Picture:http://www.wizards.com/global/images/magic/general/tempt_with_vengeance.jpg -Oracle:Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each player who does, create X 1/1 red Elemental creature tokens with haste. +Oracle:Tempting offer — Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each opponent who does, create X 1/1 red Elemental creature tokens with haste. diff --git a/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt b/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt index 7107c646f8e..c4e6911b7e2 100644 --- a/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt +++ b/forge-gui/res/cardsfolder/t/territorial_allosaurus.txt @@ -6,4 +6,5 @@ K:Kicker:2 G T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, it fights another target creature. SVar:TrigKicker:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.Other | TgtPrompt$ Choose another target creature SVar:PlayMain1:TRUE +SVar:NeedsToPlayKicked:Creature.OppCtrl+toughnessLE5 Oracle:Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.)\nWhen Territorial Allosaurus enters the battlefield, if it was kicked, it fights another target creature. diff --git a/forge-gui/res/cardsfolder/t/thespians_stage.txt b/forge-gui/res/cardsfolder/t/thespians_stage.txt index 276afdc26e9..12a8bbfeca5 100644 --- a/forge-gui/res/cardsfolder/t/thespians_stage.txt +++ b/forge-gui/res/cardsfolder/t/thespians_stage.txt @@ -2,7 +2,7 @@ Name:Thespian's Stage ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. -A:AB$ Clone | Cost$ 2 T | ValidTgts$ Land | TgtPrompt$ Select target land to copy. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target land and gains this ability. +A:AB$ Clone | Cost$ 2 T | ValidTgts$ Land | TgtPrompt$ Select target land to copy. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target land, except it has this ability. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thespians_stage.jpg -Oracle:{T}: Add {C}.\n{2}, {T}: Thespian's Stage becomes a copy of target land and gains this ability. +Oracle:{T}: Add {C}.\n{2}, {T}: Thespian's Stage becomes a copy of target land, except it has this ability. diff --git a/forge-gui/res/cardsfolder/t/throatseeker.txt b/forge-gui/res/cardsfolder/t/throatseeker.txt index 4cf546ada03..5f94f090d87 100644 --- a/forge-gui/res/cardsfolder/t/throatseeker.txt +++ b/forge-gui/res/cardsfolder/t/throatseeker.txt @@ -2,6 +2,6 @@ Name:Throatseeker ManaCost:2 B Types:Creature Vampire Ninja PT:3/2 -S:Mode$ Continuous | Affected$ Ninja.attacking+unblocked | AddKeyword$ Lifelink | Description$ Unblocked attacking Ninjas you control have lifelink. +S:Mode$ Continuous | Affected$ Ninja.attacking+unblocked+YouCtrl | AddKeyword$ Lifelink | Description$ Unblocked attacking Ninjas you control have lifelink. SVar:PlayMain1:TRUE Oracle:Unblocked attacking Ninjas you control have lifelink. diff --git a/forge-gui/res/cardsfolder/t/time_spiral.txt b/forge-gui/res/cardsfolder/t/time_spiral.txt index 2a5a967e054..954adfca9e0 100644 --- a/forge-gui/res/cardsfolder/t/time_spiral.txt +++ b/forge-gui/res/cardsfolder/t/time_spiral.txt @@ -1,9 +1,9 @@ Name:Time Spiral ManaCost:4 U U Types:Sorcery -A:SP$ ChangeZoneAll | Cost$ 4 U U | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | AILogic$ Timetwister | SpellDescription$ Each player shuffles their graveyard and hand into their library, then draws seven cards. Exile CARDNAME. You untap up to six lands. +A:SP$ ChangeZoneAll | Cost$ 4 U U | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | AILogic$ Timetwister | SpellDescription$ Each player shuffles their hand and graveyard into their library, then draws seven cards. Exile CARDNAME. You untap up to six lands. SVar:DBDraw:DB$ Draw | NumCards$ 7 | Defined$ Player | SubAbility$ DBChange | StackDescription$ None SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBUntap | StackDescription$ None SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 6 | StackDescription$ None SVar:Picture:http://www.wizards.com/global/images/magic/general/time_spiral.jpg -Oracle:Exile Time Spiral. Each player shuffles their graveyard and hand into their library, then draws seven cards. You untap up to six lands. +Oracle:Exile Time Spiral. Each player shuffles their hand and graveyard into their library, then draws seven cards. You untap up to six lands. diff --git a/forge-gui/res/cardsfolder/t/tolarian_emissary.txt b/forge-gui/res/cardsfolder/t/tolarian_emissary.txt index c2c0e7fb6e0..fc2883ec0c2 100644 --- a/forge-gui/res/cardsfolder/t/tolarian_emissary.txt +++ b/forge-gui/res/cardsfolder/t/tolarian_emissary.txt @@ -7,5 +7,6 @@ K:Kicker:1 W T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target enchantment. SVar:TrigKicker:DB$Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment DeckHints:Color$White +SVar:NeedsToPlayKicked:Enchantment.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/tolarian_emissary.jpg Oracle:Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.)\nFlying\nWhen Tolarian Emissary enters the battlefield, if it was kicked, destroy target enchantment. diff --git a/forge-gui/res/cardsfolder/t/transguild_courier.txt b/forge-gui/res/cardsfolder/t/transguild_courier.txt index 43ff467cc3a..eb86b048b17 100644 --- a/forge-gui/res/cardsfolder/t/transguild_courier.txt +++ b/forge-gui/res/cardsfolder/t/transguild_courier.txt @@ -4,4 +4,4 @@ Types:Artifact Creature Golem S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | SetColor$ All | Description$ CARDNAME is all colors. PT:3/3 SVar:Picture:http://www.wizards.com/global/images/magic/general/transguild_courier.jpg -Oracle:Transguild Courier is all colors +Oracle:Transguild Courier is all colors. diff --git a/forge-gui/res/cardsfolder/t/twinflame.txt b/forge-gui/res/cardsfolder/t/twinflame.txt index cc79e0f2db9..ed5b596eb4b 100644 --- a/forge-gui/res/cardsfolder/t/twinflame.txt +++ b/forge-gui/res/cardsfolder/t/twinflame.txt @@ -2,7 +2,7 @@ Name:Twinflame ManaCost:1 R Types:Sorcery K:Strive:2 R -A:SP$ CopyPermanent | Cost$ 1 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | TargetMin$ 0 | TargetMax$ MaxTargets | AddKeywords$ Haste | AtEOT$ Exile | References$ MaxTargets | SpellDescription$ Choose any number of target creatures you control. For each of them, create a token that's a copy of that creature. Those tokens have haste. Exile them at the beginning of the next end step. +A:SP$ CopyPermanent | Cost$ 1 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | TargetMin$ 0 | TargetMax$ MaxTargets | AddKeywords$ Haste | AtEOT$ Exile | References$ MaxTargets | SpellDescription$ Choose any number of target creatures you control. For each of them, create a token that's a copy of that creature, except it has haste. Exile those tokens at the beginning of the next end step. SVar:MaxTargets:Count$Valid Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/twinflame.jpg -Oracle:Strive — Twinflame costs {2}{R} more to cast for each target beyond the first.\nChoose any number of target creatures you control. For each of them, create a token that's a copy of that creature. Those tokens have haste. Exile them at the beginning of the next end step. +Oracle:Strive — Twinflame costs {2}{R} more to cast for each target beyond the first.\nChoose any number of target creatures you control. For each of them, create a token that's a copy of that creature, except it has haste. Exile those tokens at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt b/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt index f78b867c0e5..7a529d1bd57 100644 --- a/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt +++ b/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt @@ -3,7 +3,7 @@ ManaCost:3 U Types:Creature Shapeshifter PT:0/1 # Make SVars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ USCopy | TriggerDescription$ Whenever another creature enters the battlefield, CARDNAME becomes a copy of that creature and gains this ability. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ USCopy | TriggerDescription$ Whenever another creature enters the battlefield, CARDNAME becomes a copy of that creature, except it has this ability. SVar:USCopy:DB$ Clone | Defined$ TriggeredCard | GainThisAbility$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/unstable_shapeshifter.jpg -Oracle:Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature and gains this ability. +Oracle:Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature, except it has this ability. diff --git a/forge-gui/res/cardsfolder/u/urborg_emissary.txt b/forge-gui/res/cardsfolder/u/urborg_emissary.txt index a7ee4913ef4..519a5b00838 100644 --- a/forge-gui/res/cardsfolder/u/urborg_emissary.txt +++ b/forge-gui/res/cardsfolder/u/urborg_emissary.txt @@ -5,5 +5,6 @@ PT:3/1 K:Kicker:1 U T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target permanent to its owner's hand. SVar:TrigKicker:DB$ChangeZone | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand +SVar:NeedsToPlayKicked:Permanent.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_emissary.jpg Oracle:Kicker {1}{U} (You may pay an additional {1}{U} as you cast this spell.)\nWhen Urborg Emissary enters the battlefield, if it was kicked, return target permanent to its owner's hand. diff --git a/forge-gui/res/cardsfolder/v/verduran_emissary.txt b/forge-gui/res/cardsfolder/v/verduran_emissary.txt index 5a2a9a1447d..0f8a1b8df4c 100644 --- a/forge-gui/res/cardsfolder/v/verduran_emissary.txt +++ b/forge-gui/res/cardsfolder/v/verduran_emissary.txt @@ -6,5 +6,6 @@ K:Kicker:1 R T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target artifact. It can't be regenerated. SVar:TrigKicker:DB$Destroy | ValidTgts$ Artifact | NoRegen$ True | TgtPrompt$ Select target artifact DeckHints:Color$Red +SVar:NeedsToPlayKicked:Artifact.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/verduran_emissary.jpg Oracle:Kicker {1}{R} (You may pay an additional {1}{R} as you cast this spell.)\nWhen Verduran Emissary enters the battlefield, if it was kicked, destroy target artifact. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt index 2e0eac3b014..336eb8270ba 100644 --- a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt +++ b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt @@ -4,9 +4,9 @@ Types:Creature Shapeshifter PT:0/0 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone K:ETBReplacement:Copy:ChooseCreature:Optional -SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True | AILogic$ Clone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability." +SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True | AILogic$ Clone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it doesn't copy that creature's color and it has "At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability." SVar:DBCopy:DB$ Clone | Defined$ Remembered | Colors$ Blue | OverwriteColors$ True | AddTriggers$ VesDopUpkeepTrig | AddSVars$ VesDopCopy,VesDopUpkeepTrig -SVar:VesDopUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesDopCopy | TriggerDescription$ At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability. +SVar:VesDopUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesDopCopy | TriggerDescription$ At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability. SVar:VesDopCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy. | Optional$ True | Colors$ Blue | OverwriteColors$ True | GainThisAbility$ True | AddSVars$ VesDopCopy | AILogic$ CloneBestCreature | SubAbility$ DBCleanup SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuvan_doppelganger.jpg -Oracle:You may have Vesuvan Doppelganger enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability." +Oracle:You may have Vesuvan Doppelganger enter the battlefield as a copy of any creature on the battlefield, except it doesn't copy that creature's color and it has "At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability." diff --git a/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt b/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt index c992da26df0..cfaa62f53fe 100644 --- a/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt +++ b/forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt @@ -4,9 +4,9 @@ Types:Creature Shapeshifter PT:0/0 K:Morph:1 U K:ETBReplacement:Copy:DBCopy:Optional -SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTriggers$ VesShapeUpkeepTrig | AddSVars$ VesShapeTurn,VesShapeUpkeepTrig | Duration$ UntilFacedown | SpellDescription$ As CARDNAME enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down." +SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTriggers$ VesShapeUpkeepTrig | AddSVars$ VesShapeTurn,VesShapeUpkeepTrig | Duration$ UntilFacedown | SpellDescription$ As CARDNAME enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature, except it has "At the beginning of your upkeep, you may turn this creature face down." SVar:VesShapeUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesShapeTurn | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may turn CARDNAME face down. SVar:VesShapeTurn:DB$ SetState | Defined$ Self | Mode$ TurnFace -R:Event$ TurnFaceUp | ValidCard$ Card.Self | Optional$ True | ReplaceWith$ DBCopy | ActiveZones$ Battlefield | Secondary$ True | Description$ As CARDNAME is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down." +R:Event$ TurnFaceUp | ValidCard$ Card.Self | Optional$ True | ReplaceWith$ DBCopy | ActiveZones$ Battlefield | Secondary$ True | Description$ As CARDNAME is turned face up, you may choose another creature on the battlefield. If you do, until CARDNAME is turned face down, it becomes a copy of that creature, except it has "At the beginning of your upkeep, you may turn this creature face down." SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuvan_shapeshifter.jpg -Oracle:As Vesuvan Shapeshifter enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down."\nMorph {1}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +Oracle:As Vesuvan Shapeshifter enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature, except it has "At the beginning of your upkeep, you may turn this creature face down."\nMorph {1}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/editions/Ravnica Allegiance.txt b/forge-gui/res/editions/Ravnica Allegiance.txt index 9ecee43ba81..bb88b427d96 100644 --- a/forge-gui/res/editions/Ravnica Allegiance.txt +++ b/forge-gui/res/editions/Ravnica Allegiance.txt @@ -284,7 +284,7 @@ Booster=10 Common:!fromSheet("RNA Secret Cards"), 3 Uncommon:!fromSheet("RNA Sec 273 M The Haunt of Hightower [tokens] -rg_4_4_beast +rg_4_4_beast_trample g_3_3_centaur g_3_3_frog_lizard r_1_1_goblin diff --git a/forge-gui/res/formats/Casual/pauper.txt b/forge-gui/res/formats/Casual/pauper.txt index b1d4f6fbba7..9a7d7f51d72 100644 --- a/forge-gui/res/formats/Casual/pauper.txt +++ b/forge-gui/res/formats/Casual/pauper.txt @@ -4,3 +4,4 @@ Order:108 Subtype:Custom Type:Casual Rarities:L, C +Banned:Gush;Gitaxian Probe;Daze diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt new file mode 100644 index 00000000000..3fc62fcfa46 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-02-14.txt @@ -0,0 +1,7 @@ +[format] +Name:Arena Standard, 2/14/19 +Type:Historic +Subtype:Standard +Effective:2019-02-14 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA +Banned:Nexus of Fate; Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt new file mode 100644 index 00000000000..4d3103a4f7a --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Arena Standard, War of the Spark +Type:Historic +Subtype:Standard +Effective:2019-05-24 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR +Banned:Nexus of Fate; Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt new file mode 100644 index 00000000000..ccd3417a3ef --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-02-14.txt @@ -0,0 +1,7 @@ +[format] +Name:China Arena Standard, 2/14/19 +Type:Historic +Subtype:Standard +Effective:2019-02-14 +Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA +Banned:Nexus of Fate; Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt new file mode 100644 index 00000000000..b4b4283b026 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Arena Standard/China/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:China Arena Standard, War of the Spark +Type:Historic +Subtype:Standard +Effective:2019-05-24 +Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR +Banned:Nexus of Fate; Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt new file mode 100644 index 00000000000..ee23213ddf6 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Jiang Yanggu & Mu Yanling +Type:Historic +Subtype:Legacy +Effective:2018-06-22 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt index 01766a2b756..701f7dd49ff 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt @@ -3,5 +3,5 @@ Name:Legacy, 07/06/18 Type:Historic Subtype:Legacy Effective:2018-07-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt index 7e2e6603f0d..772b6362eec 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt @@ -3,5 +3,5 @@ Name:Legacy, Core Set 2019 Type:Historic Subtype:Legacy Effective:2018-07-14 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt index 551753dca8a..7e9a7f13a54 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt @@ -3,5 +3,5 @@ Name:Legacy, Guilds of Ravnica Type:Historic Subtype:Legacy Effective:2018-10-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt new file mode 100644 index 00000000000..ede9f897a3b --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Gift Pack 2018 +Type:Historic +Subtype:Legacy +Effective:2018-16-16 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt new file mode 100644 index 00000000000..efacdd5ed6f --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Ravnica Allegiance +Type:Historic +Subtype:Legacy +Effective:2019-01-25 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt new file mode 100644 index 00000000000..cd5c2c9382c --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, War of the Spark +Type:Historic +Subtype:Legacy +Effective:2019-05-24 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt new file mode 100644 index 00000000000..870516080f9 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Modern Horizons +Type:Historic +Subtype:Legacy +Effective:2019-06-14 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, MH1 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt new file mode 100644 index 00000000000..b90246831b6 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2018-11-16.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Gift Pack 2018 +Type:Historic +Subtype:Modern +Effective:2018-11-16 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18 +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt new file mode 100644 index 00000000000..ee5e7de45ca --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-01-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Ravnica Allegiance +Type:Historic +Subtype:Modern +Effective:2019-01-25 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt new file mode 100644 index 00000000000..c1a4bafe023 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, War of the Spark +Type:Historic +Subtype:Modern +Effective:2019-05-24 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt new file mode 100644 index 00000000000..d5722822ef8 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-06-14.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Modern Horizons +Type:Historic +Subtype:Modern +Effective:2019-06-14 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1 +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt new file mode 100644 index 00000000000..ed5449641c2 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pauper/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Pauper, War of the Spark +Type:Historic +Subtype:Custom +Effective:2019-05-24 +Rarities:L, C +Banned:Gush;Gitaxian Probe;Daze diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt index 1fa39763228..88dedfb8d2d 100644 --- a/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt @@ -2,6 +2,6 @@ Name:Standard, Core Set 2019 Type:Historic Subtype:Standard -Effective:2018-04-27 +Effective:2018-07-14 Sets:KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19 Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt new file mode 100644 index 00000000000..e52ee6b3beb --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2018-11-16.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Gift Pack 2018 +Type:Historic +Subtype:Standard +Effective:2018-11-16 +Sets:XLN, RIX, DOM, M19, GRN, G18 +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt new file mode 100644 index 00000000000..458763cc7e6 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-01-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Ravnica Allegiance +Type:Historic +Subtype:Standard +Effective:2019-01-25 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt new file mode 100644 index 00000000000..f8cd2af1877 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, War of the Spark +Type:Historic +Subtype:Standard +Effective:2019-05-24 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt new file mode 100644 index 00000000000..cf8d7f245c0 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-06-22.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, Jiang Yanggu & Mu Yanling +Type:Historic +Subtype:Standard +Effective:2018-06-22 +Sets:KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 +Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt new file mode 100644 index 00000000000..4fc75027a0c --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-07-14.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, Core Set 2019 +Type:Historic +Subtype:Standard +Effective:2018-07-14 +Sets:KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 +Banned:Aetherworks Marvel; Attune with Aether; Felidar Guardian; Rampaging Ferocidon; Ramunap Ruins; Rogue Refiner; Smuggler's Copter \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt new file mode 100644 index 00000000000..9e289328925 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-10-06.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, Guilds of Ravnica +Type:Historic +Subtype:Standard +Effective:2018-10-06 +Sets:XLN, RIX, DOM, GS1, M19, GRN +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt new file mode 100644 index 00000000000..1a706b8ec8c --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2018-11-16.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, Gift Pack 2018 +Type:Historic +Subtype:Standard +Effective:2018-11-16 +Sets:XLN, RIX, DOM, GS1, M19, GRN, G18 +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt new file mode 100644 index 00000000000..c2b20a6f30b --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-01-25.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, Ravnica Allegiance +Type:Historic +Subtype:Standard +Effective:2019-01-25 +Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt new file mode 100644 index 00000000000..e8fcaac588f --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/China/2019-05-24.txt @@ -0,0 +1,7 @@ +[format] +Name:China Standard, War of the Spark +Type:Historic +Subtype:Standard +Effective:2019-05-24 +Sets:XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR +Banned:Rampaging Ferocidon \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt new file mode 100644 index 00000000000..5e0a2aeeb16 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Jiang Yanggu & Mu Yanling +Type:Historic +Subtype:Vintage +Effective:2018-06-22 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt index 983de9d0a19..1e46ab461f3 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt @@ -3,6 +3,6 @@ Name:Vintage, Core Set 2019 Type:Historic Subtype:Vintage Effective:2018-07-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt index f4baed68ee0..335b48aab8f 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt @@ -3,6 +3,6 @@ Name:Vintage, Guilds of Ravnica Type:Historic Subtype:Vintage Effective:2018-10-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt new file mode 100644 index 00000000000..85472a7163e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Gift Pack 2018 +Type:Historic +Subtype:Vintage +Effective:2018-11-16 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt new file mode 100644 index 00000000000..abb5d3902b8 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Ravnica Allegiance +Type:Historic +Subtype:Vintage +Effective:2019-01-25 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt new file mode 100644 index 00000000000..cf7a3a2b78e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, War of the Spark +Type:Historic +Subtype:Vintage +Effective:2019-05-24 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA, WAR +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt new file mode 100644 index 00000000000..1f10a6ea9e0 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Modern Horizons +Type:Historic +Subtype:Vintage +Effective:2019-06-14 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA, WAR, MH1 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/achievement/Domain.java b/forge-gui/src/main/java/forge/achievement/Domain.java index 2aa7c8da680..93b6a397889 100644 --- a/forge-gui/src/main/java/forge/achievement/Domain.java +++ b/forge-gui/src/main/java/forge/achievement/Domain.java @@ -1,19 +1,35 @@ package forge.achievement; -import java.util.HashSet; -import java.util.Set; - import forge.game.Game; import forge.game.GameType; import forge.game.card.Card; import forge.game.player.Player; import forge.game.zone.ZoneType; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + public class Domain extends ProgressiveAchievement { public Domain() { super("Domain", "Domain", "Win a game with one of each basic land on the battlefield", "It's nice being able to cast anything you want."); } + private HashMap basicLandMap = new HashMap() { + { + put("Plains", "Plains"); + put("Snow-Covered Plains", "Plains"); + put("Island", "Island"); + put("Snow-Covered Island", "Island"); + put("Forest", "Forest"); + put("Snow-Covered Forest", "Forest"); + put("Mountain", "Mountain"); + put("Snow-Covered Mountain", "Mountain"); + put("Swamp", "Swamp"); + put("Snow-Covered Swamp", "Swamp"); + } + }; + @Override protected boolean eval(Player player, Game game) { if (game.getRules().hasAppliedVariant(GameType.MomirBasic) || game.getRules().hasAppliedVariant(GameType.MoJhoSto)) { @@ -23,8 +39,9 @@ public class Domain extends ProgressiveAchievement { if (player.getOutcome().hasWon()) { Set basicLands = new HashSet(); for (Card c : player.getCardsIn(ZoneType.Battlefield)) { - if (c.isBasicLand()) { - basicLands.add(c.getName()); + String name = c.getName(); + if (c.isBasicLand() && basicLandMap.containsKey(name)) { + basicLands.add(basicLandMap.get(name)); } } return basicLands.size() == 5; diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index f1854cb2ea6..9ace1b8cbbd 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -624,13 +624,13 @@ public class DeckgenUtil { }else { List> potentialCards = new ArrayList<>(); potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(DeckFormat.Commander.toString()).get(commander.getName())); + Collections.shuffle(potentialCards, MyRandom.getRandom()); for(Map.Entry pair:potentialCards){ if(format.isLegalCard(pair.getKey())) { preSelectedCards.add(pair.getKey()); } } } - //Collections.shuffle(potentialCards, r); //check for partner commanders diff --git a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java index 74dc7c3b1ad..4d9087d7b8a 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java @@ -32,6 +32,7 @@ import forge.limited.DraftRankCache; import forge.model.FModel; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Map.Entry; public enum ColumnDef { @@ -533,7 +534,7 @@ public enum ColumnDef { Double ranking = DraftRankCache.getRanking(cp.getName(), cp.getEdition()); if (ranking != null) { if (truncate) { - return new BigDecimal(ranking).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue(); + return new BigDecimal(ranking).setScale(4, RoundingMode.HALF_UP).doubleValue(); } return ranking; } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index c011bccd12e..4a7a109d68d 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -522,26 +522,26 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShow(delayedReveal.getCards()); } - tempShow(optionList1); - tempShow(optionList2); + tempShow(optionList1); + tempShow(optionList2); if (useSelectCardsInput(optionList1) && useSelectCardsInput(optionList2)) { final InputSelectFromTwoLists input = new InputSelectFromTwoLists(this, optional, optionList1, optionList2, sa); input.setCancelAllowed(optional); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); input.showAndWait(); - endTempShowCards(); + endTempShowCards(); return (List) input.getSelected(); - } + } final GameEntityView result1 = getGui().chooseSingleEntityForEffect(title, GameEntityView.getEntityCollection(optionList1), null, optional); final GameEntityView result2 = getGui().chooseSingleEntityForEffect(title, GameEntityView.getEntityCollection(optionList2), null, (result1==null)?optional:true); endTempShowCards(); - List results = new ArrayList<>(); - GameEntity entity1 = convertToEntity(result1); - if (entity1!=null) { results.add((T) entity1); } - GameEntity entity2 = convertToEntity(result2); - if (entity2!=null) { results.add((T) entity2); } + List results = new ArrayList<>(); + GameEntity entity1 = convertToEntity(result1); + if (entity1!=null) { results.add((T) entity1); } + GameEntity entity2 = convertToEntity(result2); + if (entity2!=null) { results.add((T) entity2); } return results; } @@ -1502,7 +1502,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont game.getTracker().unfreeze(); } final List possible = CharmEffect.makePossibleOptions(sa); - HashMap spellViewCache = new HashMap<>(); + LinkedHashMap spellViewCache = new LinkedHashMap<>(); for (AbilitySub spellAbility : possible) { spellViewCache.put(spellAbility.getView(), spellAbility); } diff --git a/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java b/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java index 73c1dea1a5a..c54958a9143 100644 --- a/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java +++ b/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java @@ -17,7 +17,7 @@ public class QuestChallengeGenerator { int id = 0; for (int i=0;i<5;++i) { QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().getModern()); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(1000); qc.setWinsReqd(MyRandom.getRandom().nextInt(5)); qc.setDifficulty(QuestEventDifficulty.MEDIUM); @@ -27,7 +27,7 @@ public class QuestChallengeGenerator { } for (int i=0;i<5;++i) { QuestEventChallenge qc = getAIHeadstartChallenge(1); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(1000); qc.setCardReward("1 multicolor rare"); qc.setWinsReqd(MyRandom.getRandom().nextInt(5)); @@ -37,7 +37,7 @@ public class QuestChallengeGenerator { } for (int i=0;i<5;++i) { QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().get("Legacy")); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(5000); qc.setCardReward("2 multicolor rares"); qc.setWinsReqd(MyRandom.getRandom().nextInt(25)); @@ -47,7 +47,7 @@ public class QuestChallengeGenerator { } for (int i=0;i<5;++i) { QuestEventChallenge qc = getAIHeadstartChallenge(2); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(5000); qc.setCardReward("2 multicolor rares"); qc.setWinsReqd(MyRandom.getRandom().nextInt(25)); @@ -57,7 +57,7 @@ public class QuestChallengeGenerator { } for (int i=0;i<5;++i) { QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().get("Vintage")); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(10000); qc.setCardReward("3 multicolor rares"); qc.setWinsReqd(MyRandom.getRandom().nextInt(50)); @@ -67,7 +67,7 @@ public class QuestChallengeGenerator { } for (int i=0;i<5;++i) { QuestEventChallenge qc = getAIHeadstartChallenge(3); - qc.setId(new Integer(id).toString()); + qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(10000); qc.setCardReward("3 multicolor rares"); qc.setWinsReqd(MyRandom.getRandom().nextInt(50)); diff --git a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java index ba453988dbf..281cf71dfc7 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java @@ -64,11 +64,11 @@ public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface duel.setTitle(archetype.getName()); duel.setOpponentName(archetype.getName()); QuestEventDifficulty diff = QuestEventDifficulty.EASY; - if(i <= (new Float(archetypes.size()))*.1){ + if(i <= Float.valueOf(archetypes.size())*.1){ diff = QuestEventDifficulty.EXPERT; - }else if(i <= (new Float(archetypes.size()))*.4){ + }else if(i <= Float.valueOf(archetypes.size())*.4){ diff = QuestEventDifficulty.HARD; - }else if(i <= (new Float(archetypes.size()))*.7) { + }else if(i <= Float.valueOf(archetypes.size())*.7) { diff = QuestEventDifficulty.MEDIUM; } duel.setDifficulty(diff); diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java index 2f3140de1c7..d7881334f57 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java @@ -82,7 +82,7 @@ public class QuestUtilUnlockSets { } int price = UNLOCK_COST; if (mapPrices.containsKey(TextUtil.concatNoSpace(ed.getName(), " Booster Pack"))) { - price = Math.max(new Double(30 * Math.pow(Math.sqrt(mapPrices.get(TextUtil.concatNoSpace(ed.getName(), + price = Math.max(Double.valueOf(30 * Math.pow(Math.sqrt(mapPrices.get(TextUtil.concatNoSpace(ed.getName(), " Booster Pack"))), 1.70)).intValue(), UNLOCK_COST); } price = (int) ((double) price * multiplier); diff --git a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java index 8f7b644641b..6140c1d5b64 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -17,6 +17,8 @@ */ package forge.quest.data; +import java.lang.reflect.InvocationTargetException; + import java.util.EnumMap; import java.util.HashMap; import java.util.Map; @@ -99,7 +101,7 @@ public class QuestAssets { QuestItemCondition current = this.inventoryItems.get(itemType); if (!current.getClass().equals(itemType.getModelClass())) { try { - QuestItemCondition modern = itemType.getModelClass().newInstance(); + QuestItemCondition modern = itemType.getModelClass().getDeclaredConstructor().newInstance(); modern.takeDataFrom(current); current = modern; inventoryItems.put(itemType, modern); @@ -107,6 +109,10 @@ public class QuestAssets { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); } } @@ -123,7 +129,7 @@ public class QuestAssets { QuestItemCondition cond = this.inventoryItems.get(itemType); if (null == cond) { try { // care to set appropriate state class here - cond = itemType.getModelClass().newInstance(); + cond = itemType.getModelClass().getDeclaredConstructor().newInstance(); } catch (final Exception e) { e.printStackTrace(); cond = new QuestItemCondition(); diff --git a/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java b/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java index 16bfdb33025..c19d45f3eb0 100644 --- a/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java +++ b/forge-gui/src/main/java/forge/util/AbstractGeneticAlgorithm.java @@ -18,13 +18,13 @@ public abstract class AbstractGeneticAlgorithm { protected abstract T expandPool(); public void pruneWeakest(){ - population = population.subList(0, new Float(population.size()*pruneRatio).intValue()); + population = population.subList(0, Float.valueOf(population.size()*pruneRatio).intValue()); } protected void generateChildren(){ int prunedSize = population.size(); while(population.size()0.85f){ T child = mutateObject(population.get(randomIndex)); @@ -34,7 +34,7 @@ public abstract class AbstractGeneticAlgorithm { }else if(rand>0.70f){ int secondIndex = randomIndex; while(secondIndex != randomIndex){ - secondIndex = new Double(prunedSize*Math.pow(MyRandom.getRandom().nextDouble(), 0.25)/2d).intValue(); + secondIndex = Double.valueOf(prunedSize*Math.pow(MyRandom.getRandom().nextDouble(), 0.25)/2d).intValue(); } T child = createChild(population.get(randomIndex) , population.get(secondIndex)); diff --git a/forge-gui/src/main/java/forge/util/XmlReader.java b/forge-gui/src/main/java/forge/util/XmlReader.java index bcf544b6cbc..9b2c3eeabae 100644 --- a/forge-gui/src/main/java/forge/util/XmlReader.java +++ b/forge-gui/src/main/java/forge/util/XmlReader.java @@ -181,7 +181,7 @@ public class XmlReader { final T result; if (collectionToLoad == null) { try { - result = collectionType.newInstance(); + result = collectionType.getDeclaredConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); From 680e2d63e309310c73632dea217b387433e6c194 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Jun 2019 07:27:25 +0300 Subject: [PATCH 19/64] - War of the Spark: it looks like there are only 3 booster covers (except for color-themed boosters and other stuff) --- forge-gui/res/editions/War of the Spark.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/War of the Spark.txt b/forge-gui/res/editions/War of the Spark.txt index b3a8147df17..25e9a60aab0 100644 --- a/forge-gui/res/editions/War of the Spark.txt +++ b/forge-gui/res/editions/War of the Spark.txt @@ -5,7 +5,7 @@ Name=War of the Spark Code2=WAR MciCode=war Type=Expansion -BoosterCovers=5 +BoosterCovers=3 Booster=10 Common:!fromSheet("WAR Secret Cards"), 3 Uncommon:!fromSheet("WAR Secret Cards"), 1 RareMythic:!fromSheet("WAR Secret Cards"), 1 BasicLand BoosterMustContain=Planeswalker From 7c92e75359a5d7f91bd5969c7eb4c041ebcd4aac Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 18 Jun 2019 20:23:48 +0800 Subject: [PATCH 20/64] M20: Add Leyline of Combustion --- .../SpellAbilityStackInstance.java | 2 + .../trigger/TriggerBecomesTargetOnce.java | 95 +++++++++++++++++++ .../java/forge/game/trigger/TriggerType.java | 1 + .../main/java/forge/game/zone/MagicStack.java | 5 + .../res/cardsfolder/h/horobi_deaths_wail.txt | 2 +- .../upcoming/leyline_of_combustion.txt | 8 ++ forge-gui/res/cardsfolder/w/wild_defiance.txt | 2 +- 7 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java create mode 100644 forge-gui/res/cardsfolder/upcoming/leyline_of_combustion.txt diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index afb8d498aae..bf6a8e8a045 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -357,6 +357,8 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { runParams.put("Target", tgt); getSourceCard().getGame().getTriggerHandler().runTrigger(TriggerType.BecomesTarget, runParams, false); } + runParams.put("Targets", target.getTargets()); + getSourceCard().getGame().getTriggerHandler().runTrigger(TriggerType.BecomesTargetOnce, runParams, false); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java new file mode 100644 index 00000000000..bd8a2868c51 --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java @@ -0,0 +1,95 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.game.trigger; + +import forge.game.GameObject; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Trigger_BecomesTargetOnce class. + *

+ * + * @author Forge + * @version $Id$ + * @since 1.0.15 + */ +public class TriggerBecomesTargetOnce extends Trigger { + + /** + *

+ * Constructor for Trigger_BecomesTargetOnce. + *

+ * + * @param params + * a {@link java.util.HashMap} object. + * @param host + * a {@link forge.game.card.Card} object. + * @param intrinsic + * the intrinsic + */ + public TriggerBecomesTargetOnce(final java.util.Map params, final Card host, final boolean intrinsic) { + super(params, host, intrinsic); + } + + /** {@inheritDoc} */ + @SuppressWarnings("unchecked") + @Override + public final boolean performTest(final Map runParams2) { + if (this.mapParams.containsKey("ValidSource")) { + if (!matchesValid(((SpellAbility) runParams2.get("SourceSA")).getHostCard(), this.mapParams + .get("ValidSource").split(","), this.getHostCard())) { + return false; + } + } + if (this.mapParams.containsKey("ValidTarget")) { + List targets = (List) runParams2.get("Targets"); + boolean valid = false; + for (GameObject b : targets) { + if (matchesValid(b, this.mapParams.get("ValidTarget").split(","), this.getHostCard())) { + valid = true; + break; + } + } + if (!valid) { + return false; + } + } + return true; + } + + /** {@inheritDoc} */ + @Override + public final void setTriggeringObjects(final SpellAbility sa) { + sa.setTriggeringObject("SourceSA", this.getRunParams().get("SourceSA")); + sa.setTriggeringObject("Source", ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard()); + sa.setTriggeringObject("Targets", this.getRunParams().get("Targets")); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + sb.append("Source: ").append(((SpellAbility) sa.getTriggeringObject("SourceSA")).getHostCard()).append(", "); + sb.append("Targets: ").append(sa.getTriggeringObject("Targets")); + return sb.toString(); + } +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 9061aa652d2..307dcb5a1f4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -27,6 +27,7 @@ public enum TriggerType { BecomeMonstrous(TriggerBecomeMonstrous.class), BecomeRenowned(TriggerBecomeRenowned.class), BecomesTarget(TriggerBecomesTarget.class), + BecomesTargetOnce(TriggerBecomesTargetOnce.class), BlockersDeclared(TriggerBlockersDeclared.class), Blocks(TriggerBlocks.class), Championed(TriggerChampioned.class), diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 7a814cc6a4f..0c3907380c9 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -438,6 +438,8 @@ public class MagicStack /* extends MyObservable */ implements Iterable Date: Tue, 18 Jun 2019 22:26:44 +0800 Subject: [PATCH 21/64] Update Ajani, Strength of the Pride --- .../res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt b/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt index 92520b8e7d9..76aa84ce9a1 100644 --- a/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt +++ b/forge-gui/res/cardsfolder/upcoming/ajani_strength_of_the_pride.txt @@ -1,14 +1,13 @@ Name:Ajani, Strength of the Pride ManaCost:2 W W Types:Legendary Planeswalker Ajani +Loyalty:5 A:AB$ GainLife | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | LifeAmount$ NumCreatures | References$ NumCreatures,NumPlaneswalkers | SpellDescription$ You gain life equal to the number of creatures you control plus the number of planeswalkers you control. SVar:NumCreatures:Count$Valid Creature.YouCtrl/Plus.NumPlaneswalkers SVar:NumPlaneswalkers:Count$Valid Planeswalker.YouCtrl A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenScript$ ajanis_pridemate | LegacyImage$ ajanis pridemate m20 | SpellDescription$ Create a 2/2 white Cat Soldier creature token named Ajani's Pridemate with "Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate." DeckHas:Ability$Token -A:AB$ ChangeZone | Cost$ SubCounter<0/LOYALTY> | CheckSVar$ CurLife | SVarCompare$ GEInitLife | References$ CurLife,InitLife | Planeswalker$ True | Ultimate$ True | Defined$ Self | Origin$ Battlefield | Destination$ Exile | SubAbility$ ExileOppCreatures | SpellDescription$ If you have at least 15 life more than your starting life total, exile CARDNAME and each artifact and creature your opponents control. -SVar:ExileOppCreatures:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Creature.OppCtrl, Artifact.OppCtrl +A:AB$ ChangeZoneAll | Cost$ SubCounter<0/LOYALTY> | ConditionCheckSVar$ CurLife | ConditionSVarCompare$ GEInitLife | References$ CurLife,InitLife | Planeswalker$ True | Ultimate$ True | ChangeType$ Card.Self,Creature.OppCtrl,Artifact.OppCtrl | Origin$ Battlefield | Destination$ Exile | SpellDescription$ If you have at least 15 life more than your starting life total, exile CARDNAME and each artifact and creature your opponents control. SVar:CurLife:Count$YourLifeTotal SVar:InitLife:Count$YourStartingLife/Plus.15 Oracle:[+1]: You gain life equal to the number of creatures you control plus the number of planeswalkers you control.\n[-2]: Create a 2/2 white Cat Soldier creature token named Ajani's Pridemate with "Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate."\n[0]: If you have at least 15 life or more than your starting life total, exile Ajani, Strength of the Pride and each artifact and creature your opponents control. -Loyalty:5 \ No newline at end of file From a5679cab492a8bc87f8dae2188b04467c042d14c Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 18 Jun 2019 22:39:02 +0800 Subject: [PATCH 22/64] Add Atemsis, All-Seeing --- .../res/cardsfolder/upcoming/atemsis_all_seeing.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/atemsis_all_seeing.txt b/forge-gui/res/cardsfolder/upcoming/atemsis_all_seeing.txt index 66975497e61..f7124bbef43 100644 --- a/forge-gui/res/cardsfolder/upcoming/atemsis_all_seeing.txt +++ b/forge-gui/res/cardsfolder/upcoming/atemsis_all_seeing.txt @@ -1,6 +1,13 @@ Name:Atemsis, All-Seeing ManaCost:3 U U U Types:Legendary Creature Sphinx -K:Flying -Oracle:Flying\n{2}{U}, {T}: Draw two cards, then discard a card.\nWhenever Atemsis, All-Seeing deals damage to an opponent, you may reveal your hand. If cards with at least six different converted mana costs are revealed this way, that player loses the game. PT:4/5 +K:Flying +A:AB$ Draw | Cost$ 2 U T | NumCards$ 2 | SpellDescription$ Draw two cards, then discard a card. | SubAbility$ DBDiscard +SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | OptionalDecider$ You | Execute$ TrigReveal | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, you may reveal your hand. If cards with at least six different converted mana costs are revealed this way, that player loses the game. +SVar:TrigReveal:DB$ RevealHand | Defined$ You | RememberRevealed$ True | SubAbility$ DBLoseGame +SVar:DBLoseGame:DB$ LosesGame | Defined$ TriggeredTarget | ConditionCheckSVar$ X | ConditionSVarCompare$ GE6 | References$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$DifferentCMC +Oracle:Flying\n{2}{U}, {T}: Draw two cards, then discard a card.\nWhenever Atemsis, All-Seeing deals damage to an opponent, you may reveal your hand. If cards with at least six different converted mana costs are revealed this way, that player loses the game. From 21356478e00d87d6bf143b9f088fe6b898fce019 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 18 Jun 2019 15:03:52 +0000 Subject: [PATCH 23/64] move oracle to bottom --- forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt | 2 +- forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt | 2 +- forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt | 2 +- .../res/cardsfolder/upcoming/chandra_novice_pyromancer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt | 2 +- forge-gui/res/cardsfolder/upcoming/corpse_knight.txt | 2 +- forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/dread_presence.txt | 2 +- forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt | 2 +- forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt | 2 +- forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt | 2 +- forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt | 2 +- forge-gui/res/cardsfolder/upcoming/octoprophet.txt | 2 +- forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt | 2 +- forge-gui/res/cardsfolder/upcoming/risen_reef.txt | 2 +- forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt | 2 +- forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt b/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt index f1d38ef1b5d..9b3238db6fa 100644 --- a/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt +++ b/forge-gui/res/cardsfolder/upcoming/cavalier_of_flame.txt @@ -1,6 +1,7 @@ Name:Cavalier of Flame ManaCost:2 R R R Types:Creature Elemental Knight +PT:6/5 A:AB$ PumpAll | Cost$ 1 R | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | KW$ Haste | SpellDescription$ Creatures you control get +1/+0 and gain haste until end of turn. T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, discard any number of cards, then draw that many cards. SVar:TrigDiscard:DB$ Discard | Cost$ 3 R | AnyNumber$ True | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ Discard any number of cards, then draw that many cards. @@ -11,4 +12,3 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigDamageAll:DB$ DamageAll | ValidPlayers$ Player.Opponent | ValidCards$ Planeswalker.OppCtrl | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to each opponent and each planeswalker they control, where X is the number of land cards in your graveyard. SVar:X:Count$TypeInYourYard.Land Oracle:{1}{R}: Creatures you control get +1/+0 and gain haste until end of turn.\nWhen Cavalier of Flame enters the battlefield, discard any number of cards, then draw that many cards.\nWhen Cavalier of Flame dies, it deals X damage to each opponent and each planeswalker they control, where X is the number of land cards in your graveyard. -PT:6/5 \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt b/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt index 4213ab621f1..e21a8eb4dbd 100644 --- a/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt +++ b/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt @@ -1,5 +1,5 @@ Name:Chandra, Acolyte of Flame ManaCost:1 R R Types:Legendary Planeswalker Chandra -Oracle:[0]: Put a loyalty counter on each red planeswalker you control.\n[0]: Create two 1/1 red Elemental creature tokens. They gain haste. Sacrifice them at the beginning of the next end step.\n[-2]: You may cast target instant or sorcery card with converted mana cost 3 or less from your graveyard. If that card would be put into your graveyard this turn, exile it instead. Loyalty:4 +Oracle:[0]: Put a loyalty counter on each red planeswalker you control.\n[0]: Create two 1/1 red Elemental creature tokens. They gain haste. Sacrifice them at the beginning of the next end step.\n[-2]: You may cast target instant or sorcery card with converted mana cost 3 or less from your graveyard. If that card would be put into your graveyard this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt b/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt index ee9f683a116..c29c57e1f44 100644 --- a/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt +++ b/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt @@ -1,5 +1,5 @@ Name:Chandra, Awakened Inferno ManaCost:4 R R Types:Legendary Planeswalker Chandra -Oracle:This spell can't be countered.\n[+2]: Each opponent gets an emblem with "At the beginning of your upkeep, this emblem deals 1 damage to you."\n[-3]: Chandra, Awakened Inferno deals 3 damage to each non-Elemental creature.\n[-X]: Chandra, Awakened Inferno deals X damage to target creature or planeswalker. If a permanent dealt damage this way would die this turn, exile it instead. Loyalty:6 +Oracle:This spell can't be countered.\n[+2]: Each opponent gets an emblem with "At the beginning of your upkeep, this emblem deals 1 damage to you."\n[-3]: Chandra, Awakened Inferno deals 3 damage to each non-Elemental creature.\n[-X]: Chandra, Awakened Inferno deals X damage to target creature or planeswalker. If a permanent dealt damage this way would die this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt b/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt index 9b7e3dba255..0c03e2eea0c 100644 --- a/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt +++ b/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt @@ -1,5 +1,5 @@ Name:Chandra, Novice Pyromancer ManaCost:3 R Types:Legendary Planeswalker Chandra -Oracle:[+1]: Elementals you control get +2/+0 until end of turn.\n[-1]: Add {R}{R}.\n[-2]: Chandra, Novice Pyromancer deals 2 damage to any target. Loyalty:5 +Oracle:[+1]: Elementals you control get +2/+0 until end of turn.\n[-1]: Add {R}{R}.\n[-2]: Chandra, Novice Pyromancer deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt b/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt index 23977b6fd23..9e83f4a15da 100644 --- a/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt +++ b/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt @@ -1,5 +1,5 @@ Name:Chandra's Embercat ManaCost:1 R Types:Creature Elemental Cat -Oracle:{T}: Add {R}. Spend this mana only to cast an Elemental spell or a Chandra planeswalker spell. PT:2/2 +Oracle:{T}: Add {R}. Spend this mana only to cast an Elemental spell or a Chandra planeswalker spell. diff --git a/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt b/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt index d80fff7d91a..14399e0512d 100644 --- a/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt +++ b/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt @@ -1,5 +1,5 @@ Name:Corpse Knight ManaCost:W B Types:Creature Zombie Knight -Oracle:Whenever another creature enters the battlefield under your control, each opponent loses 1 life. PT:2/2 +Oracle:Whenever another creature enters the battlefield under your control, each opponent loses 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt b/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt index 5fdf1aaf798..243f3ccc68a 100644 --- a/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt +++ b/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt @@ -1,5 +1,5 @@ Name:Creeping Trailblazer ManaCost:R G Types:Creature Elemental -Oracle:Other Elementals you control get +1/+0.\n{2}{R}{G}: Creeping Trailblazer gets +1/+1 until end of turn for each Elemental you control. PT:2/2 +Oracle:Other Elementals you control get +1/+0.\n{2}{R}{G}: Creeping Trailblazer gets +1/+1 until end of turn for each Elemental you control. diff --git a/forge-gui/res/cardsfolder/upcoming/dread_presence.txt b/forge-gui/res/cardsfolder/upcoming/dread_presence.txt index a57b961cc0a..0ccfcedaa02 100644 --- a/forge-gui/res/cardsfolder/upcoming/dread_presence.txt +++ b/forge-gui/res/cardsfolder/upcoming/dread_presence.txt @@ -1,5 +1,5 @@ Name:Dread Presence ManaCost:3 B Types:Creature Nightmare -Oracle:Whenever a Swamp enters the battlefield under your control, choose one--\n*You draw a card and you lose 1 life.\n*Dread Presence deals 2 damage to any target and you gain 2 life. PT:3/3 +Oracle:Whenever a Swamp enters the battlefield under your control, choose one--\n*You draw a card and you lose 1 life.\n*Dread Presence deals 2 damage to any target and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt b/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt index 40afe7b9827..d2c86333d68 100644 --- a/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt +++ b/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt @@ -2,5 +2,5 @@ Name:Empyrean Eagle ManaCost:1 W U Types:Creature Bird Spirit K:Flying -Oracle:Flying\nOther creatures you control with flying get +1/+1. PT:2/3 +Oracle:Flying\nOther creatures you control with flying get +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt b/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt index d6ef3131f51..5c80d969c56 100644 --- a/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt +++ b/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt @@ -1,5 +1,5 @@ Name:Ironroot Warlord ManaCost:1 G W Types:Creature Treefolk Soldier -Oracle:Ironroot Warlord's power is equal to the number of creatures you control.\n{3}{G}{W}: Create a 1/1 white Soldier creature token. PT:*/5 +Oracle:Ironroot Warlord's power is equal to the number of creatures you control.\n{3}{G}{W}: Create a 1/1 white Soldier creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt b/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt index eb0e925bb26..aafdbefdc4b 100644 --- a/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt +++ b/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt @@ -2,5 +2,5 @@ Name:Kykar, Wind's Fury ManaCost:1 U R W Types:Legendary Creature Bird Wizard K:Flying -Oracle:Flying\nWhenever you cast a noncreature spell, create a 1/1 white Spirit creature token with flying.\nSacrifice a Spirit: Add {R}. PT:3/3 +Oracle:Flying\nWhenever you cast a noncreature spell, create a 1/1 white Spirit creature token with flying.\nSacrifice a Spirit: Add {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt b/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt index 5a35e61081c..147702c49a6 100644 --- a/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt +++ b/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt @@ -1,5 +1,5 @@ Name:Loxodon Lifesinger ManaCost:5 W Types:Creature Elephant Cleric -Oracle:When Loxodon Lifesinger enters the battlefield, you may have your life total become the total toughness of creatures you control.\n{5}{W}: Loxodon Lifesinger gets +X/+X until end of turn, where X is your life total. PT:4/6 +Oracle:When Loxodon Lifesinger enters the battlefield, you may have your life total become the total toughness of creatures you control.\n{5}{W}: Loxodon Lifesinger gets +X/+X until end of turn, where X is your life total. diff --git a/forge-gui/res/cardsfolder/upcoming/octoprophet.txt b/forge-gui/res/cardsfolder/upcoming/octoprophet.txt index 6c3b3ae4a16..c0c73e6e32f 100644 --- a/forge-gui/res/cardsfolder/upcoming/octoprophet.txt +++ b/forge-gui/res/cardsfolder/upcoming/octoprophet.txt @@ -1,5 +1,5 @@ Name:Octoprophet ManaCost:3 U Types:Creature Octopus -Oracle:When Octoprophet enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) PT:3/3 +Oracle:When Octoprophet enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt b/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt index 41f7e4d652e..1d3d480a2cf 100644 --- a/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt +++ b/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt @@ -2,5 +2,5 @@ Name:Rienne, Angel of Rebirth ManaCost:2 R G W Types:Legendary Creature Angel K:Flying -Oracle:Flying\nOther multicolored creatures you control get +1/+0.\nWhenever another multicolored creature you control dies, return it to its owner's hand at the beginning of the next end step. PT:5/4 +Oracle:Flying\nOther multicolored creatures you control get +1/+0.\nWhenever another multicolored creature you control dies, return it to its owner's hand at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/upcoming/risen_reef.txt b/forge-gui/res/cardsfolder/upcoming/risen_reef.txt index 643efc18f8d..c54a98fad26 100644 --- a/forge-gui/res/cardsfolder/upcoming/risen_reef.txt +++ b/forge-gui/res/cardsfolder/upcoming/risen_reef.txt @@ -1,5 +1,5 @@ Name:Risen Reef ManaCost:1 G U Types:Creature Elemental -Oracle:Whenever Risen Reef or another Elemental enters the battlefield under your control, look at the top card of your library. If it's a land card, you may put it onto the battlefield tapped. If you don't put the card onto the battlefield, put it into your hand. PT:1/1 +Oracle:Whenever Risen Reef or another Elemental enters the battlefield under your control, look at the top card of your library. If it's a land card, you may put it onto the battlefield tapped. If you don't put the card onto the battlefield, put it into your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt b/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt index 8c38957f5fb..9fc8c183daf 100644 --- a/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt +++ b/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt @@ -1,5 +1,5 @@ Name:Wakeroot Elemental ManaCost:4 G G Types:Creature Elemental -Oracle:{G}{G}{G}{G}{G}: Untap a land of your choice that you control. It becomes a 5/5 Elemental creature with haste. It's still a land. (This effect lasts until as long as that land is in play.) PT:5/5 +Oracle:{G}{G}{G}{G}{G}: Untap a land of your choice that you control. It becomes a 5/5 Elemental creature with haste. It's still a land. (This effect lasts until as long as that land is in play.) diff --git a/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt b/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt index ff078ebe2dc..e1d1cc88d41 100644 --- a/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt +++ b/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt @@ -1,5 +1,5 @@ Name:Yarok's Fenlurker ManaCost:B B Types:Creature Horror -Oracle:When Yarok's Fenlurker enters the battlefield, each opponent exiles a card from their hand.\n{2}{B}: Yarok's Fenlurker gets +1/+1 until end of turn. PT:1/1 +Oracle:When Yarok's Fenlurker enters the battlefield, each opponent exiles a card from their hand.\n{2}{B}: Yarok's Fenlurker gets +1/+1 until end of turn. From f1737b993cacc28e8c72071e7d13847929c98d5d Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 18 Jun 2019 15:38:55 +0000 Subject: [PATCH 24/64] more --- .../cardsfolder/upcoming/bird_tangle_goblin.txt | 5 +++++ .../upcoming/leyline_of_combustion.txt | 4 ++++ .../cardsfolder/upcoming/silverback_shaman.txt | 6 ++++++ .../res/cardsfolder/upcoming/veil_of_summer.txt | 4 ++++ .../res/cardsfolder/upcoming/voracious_hydra.txt | 6 ++++++ forge-gui/res/editions/Magic 2020.txt | 16 ++++++++++++++++ 6 files changed, 41 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/bird_tangle_goblin.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/leyline_of_combustion.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bird_tangle_goblin.txt b/forge-gui/res/cardsfolder/upcoming/bird_tangle_goblin.txt new file mode 100644 index 00000000000..6171c392af9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bird_tangle_goblin.txt @@ -0,0 +1,5 @@ +Name:Bird Tangle Goblin +ManaCost:1 R +Types:Creature Goblin +PT:2/1 +Oracle:{R}: Bird Tangle Goblin gains flying until end of turn. Activate this ability only if you control a creature with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/leyline_of_combustion.txt b/forge-gui/res/cardsfolder/upcoming/leyline_of_combustion.txt new file mode 100644 index 00000000000..ed31ec3520d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/leyline_of_combustion.txt @@ -0,0 +1,4 @@ +Name:Leyline of Combustion +ManaCost:2 R R +Types:Enchantment +Oracle:If Leyline of Combustion is in your opening hand, you may begin the game with it on the battlefield.\nWhenever you and/or at least one permanent you control becomes the target of a spell or ability an opponent controls, Leyline of Combustion deals 2 damage to that player. diff --git a/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt b/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt new file mode 100644 index 00000000000..e84728acca2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt @@ -0,0 +1,6 @@ +Name:Silverback Shaman +ManaCost:3 G G +Types:Creature Ape Shaman +K:Trample +PT:5/4 +Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it's attacking.)\nWhen Silverback Shaman dies, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt b/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt new file mode 100644 index 00000000000..5020241d005 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt @@ -0,0 +1,4 @@ +Name:Veil of Summer +ManaCost:G +Types:Instant +Oracle:Draw a card if an opponent has cast a blue or black spell this turn. Spells you control can't be countered this turn. You and permanents you control gain hexproof from blue and from black until end of turn. (You and they can't be the targets of blue or black spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt b/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt new file mode 100644 index 00000000000..74f6f82b832 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt @@ -0,0 +1,6 @@ +Name:Voracious Hydra +ManaCost:X G G +Types:Creature Hydra +PT:0/1 +K:Trample +Oracle:Trample\nVoracious Hydra enters the battlefield with X +1/+1 counters.\nWhen Voracious Hydra enters the battlefield, choose one--\n*Double the number of +1/+1 counters on Voracious Hydra.\n*You may have Voracious Hydra fight with target creature you don't control. diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index 329a14d6e1b..d6db66b71bd 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -20,6 +20,8 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 27 R Loxodon Lifesinger +33 R Planar Cleansing + 42 U Aether Gust 46 R Atemsis, All-Seeing @@ -28,9 +30,13 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 78 C Unsummon +87 U Blightbeetle + 95 U Disfigure 96 R Dread Presence +107 R Leyline of the Void + 113 R Scheming Symmetry 117 U Thought Distortion @@ -50,9 +56,19 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 139 U Flame Sweep +142 C Bird Tangle Goblin +143 U Goblin Ringleader + 145 C Infuriate +148 R Leyline of Combustion + +195 C Silverback Shaman + 197 R Thrashing Brontodon +198 U Veil of Summer + +200 R Voracious Hydra 202 R Wakeroot Elemental From 18777d9224f776378e97938c2f10ecb12a7aeaf2 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 18 Jun 2019 16:07:01 +0000 Subject: [PATCH 25/64] more --- .../res/cardsfolder/upcoming/angelic_cleric.txt | 5 +++++ .../res/cardsfolder/upcoming/blightbeetle.txt | 6 ++++++ .../upcoming/chinese_goblin_miner.txt | 5 +++++ .../res/cardsfolder/upcoming/flood_of_tears.txt | 4 ++++ .../cardsfolder/upcoming/reckless_airstrike.txt | 4 ++++ .../cardsfolder/upcoming/starfield_mystic.txt | 5 +++++ forge-gui/res/editions/Magic 2020.txt | 17 ++++++++++++++++- 7 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/blightbeetle.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt diff --git a/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt b/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt new file mode 100644 index 00000000000..6d7dc19a072 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt @@ -0,0 +1,5 @@ +Name:Angelic Cleric +ManaCost:W W +Types:Human Cleric +PT:1/4 +Oracle:Whenever an Angel enters the battlefield under your control, you gain 4 life.\nWhenever an Angel you control dies, create a 1/1 white Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt b/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt new file mode 100644 index 00000000000..f5202dd260e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt @@ -0,0 +1,6 @@ +Name:Blightbeetle +ManaCost:1 B +Types:Creature Insect +PT:1/1 +K:Protection from green +Oracle:Protection from green (This creature can't be blocked, targeted, dealt damage, enchanted, or equipped by anything green.)\nCreatures your opponents control can't have +1/+1 counters put on them. diff --git a/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt b/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt new file mode 100644 index 00000000000..b386b0d8989 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt @@ -0,0 +1,5 @@ +Name:Chinese Goblin Miner +ManaCost:2 R +Types:Creature Goblin +PT:3/2 +Oracle:{3}, {T}, Sacrifice a land or artifact: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt b/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt new file mode 100644 index 00000000000..cd78c2928e0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt @@ -0,0 +1,4 @@ +Name:Flood of Tears +ManaCost:4 U U +Types:Sorcery +Oracle:Return all nonland permanents to their owners' hands. If you return four or more nontoken permanents you control this way, you may put a permanent card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt b/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt new file mode 100644 index 00000000000..57f1ec86f04 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt @@ -0,0 +1,4 @@ +Name:Reckless Airstrike +ManaCost:R +Types:Sorcery +Oracle:Choose one--\n*Reckless Airstrike deals 3 damage to target creature with flying.\n*Destroy target artifact. diff --git a/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt b/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt new file mode 100644 index 00000000000..5e63a536e84 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt @@ -0,0 +1,5 @@ +Name:Starfield Mystic +ManaCost:1 W +Types:Creature Human Cleric +PT:2/2 +Oracle:Enchantment spells you cast cost {1} less to cast.\nWhenever an enchantment you control is put into a graveyard from the battlefield, put a +1/+1 counter on Starfield Mystic. diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index d6db66b71bd..7b60c2a45bd 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -11,7 +11,7 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 2 M Ajani, Strength of the Pride 4 U Angel of Vitality -10 C Octoprophet +8 R Angelic Cleric 13 U Devout Decree 14 C Disenchant @@ -22,11 +22,18 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 33 R Planar Cleansing +35 R Rule of Law + +39 R Starfield Mystic + 42 U Aether Gust 46 R Atemsis, All-Seeing +59 R Flood of Tears + 69 C Negate +70 C Octoprophet 78 C Unsummon @@ -52,8 +59,11 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 131 R Chandra's Regulator 132 U Chandra's Spitfire +134 C Chinese Goblin Miner 135 U Dragon Mage +137 U Ember Hauler + 139 U Flame Sweep 142 C Bird Tangle Goblin @@ -63,6 +73,10 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 148 R Leyline of Combustion +154 C Reckless Airstrike + +163 U Uncaged Fury + 195 C Silverback Shaman 197 R Thrashing Brontodon @@ -90,3 +104,4 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec ajanis_pridemate r_1_1_elemental w_1_1_soldier +w_1_1_spirit_flying From 376a2821e8b52007f33afcb81ba7f566f51f67a8 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 18 Jun 2019 16:33:43 +0000 Subject: [PATCH 26/64] more spoilers --- .../cardsfolder/upcoming/bacchetta_punitiva.txt | 4 ++++ .../cardsfolder/upcoming/bird_tangle_goblin.txt | 5 ----- .../res/cardsfolder/upcoming/goblin_hitchhiker.txt | 5 +++++ .../upcoming/golos_tireless_pilgrim.txt | 5 +++++ .../cardsfolder/upcoming/kaalia_zenith_seeker.txt | 7 +++++++ .../cardsfolder/upcoming/overgrowth_elemental.txt | 5 +++++ forge-gui/res/editions/Magic 2020.txt | 14 +++++++++++++- 7 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/bird_tangle_goblin.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt b/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt new file mode 100644 index 00000000000..f0cedb64706 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt @@ -0,0 +1,4 @@ +Name:Bacchetta Punitiva +ManaCost:3 +Types:Artifact +Oracle:{3}, {T}: Bacchetta Punitiva deals 1 damage to any target.\nWhen Bacchetta Punitiva is put into a graveyard from the battlefield, it deals 5 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/bird_tangle_goblin.txt b/forge-gui/res/cardsfolder/upcoming/bird_tangle_goblin.txt deleted file mode 100644 index 6171c392af9..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/bird_tangle_goblin.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Bird Tangle Goblin -ManaCost:1 R -Types:Creature Goblin -PT:2/1 -Oracle:{R}: Bird Tangle Goblin gains flying until end of turn. Activate this ability only if you control a creature with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt b/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt new file mode 100644 index 00000000000..6b316fabae9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt @@ -0,0 +1,5 @@ +Name:Goblin Hitchhiker +ManaCost:1 R +Types:Creature Goblin +PT:2/1 +Oracle:{R}: Goblin Hitchhiker gains flying until end of turn. Activate this ability only if you control a creature with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt b/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt new file mode 100644 index 00000000000..da3d3c1b0c5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt @@ -0,0 +1,5 @@ +Name:Golos, Tireless Pilgrim +ManaCost:5 +Types:Legendary Artifact Creature Scout +PT:3/5 +Oracle:When Golos, Tireless Pilgrim enters the battlefield, you may search your library for a land card, put that card onto the battlefield tapped, then shuffle your library.\n{2}{W}{U}{B}{R}{G}: Exile the top three cards of your library. You may play them this turn without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt b/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt new file mode 100644 index 00000000000..511c071f3fb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt @@ -0,0 +1,7 @@ +Name:Kaalia, Zenith Seeker +ManaCost:R W B +Types:Legendary Creature Human Cleric +PT:3/3 +K:Flying +K:Vigilance +Oracle:Flying, vigilance\nWhen Kaalia, Zenith Seeker enters the battlefield, look at the top six cards of your library. You may reveal an Angel card, a Demon card, and/or a Dragon card from among them and put them into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt b/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt new file mode 100644 index 00000000000..d489743c826 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt @@ -0,0 +1,5 @@ +Name:Overgrowth Elemental +ManaCost:2 G +Types:Creature Elemental +PT:3/2 +Oracle:When Overgrowth Elemental enters the battlefield, put a +1/+1 counter on another target Elemental you control.\nWhenever another creature you control dies, you gain 1 life. If that creature was an Elemental, put a +1/+1 counter on Overgrowth Elemental. diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index 7b60c2a45bd..4483b72ed21 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -19,6 +19,7 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 24 R Leyline of Sanctity 27 R Loxodon Lifesinger +28 U Loyal Pegasus 33 R Planar Cleansing @@ -30,6 +31,8 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 46 R Atemsis, All-Seeing +55 C Convolute + 59 R Flood of Tears 69 C Negate @@ -66,7 +69,7 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 139 U Flame Sweep -142 C Bird Tangle Goblin +142 C Goblin Hitchhiker 143 U Goblin Ringleader 145 C Infuriate @@ -77,6 +80,10 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 163 U Uncaged Fury +180 U Loaming Shaman + +187 U Overgrowth Elemental + 195 C Silverback Shaman 197 R Thrashing Brontodon @@ -90,11 +97,16 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 207 U Creeping Trailblazer 208 U Empyrean Eagle 209 U Ironroot Warlord +210 M Kaalia, Zenith Seeker 212 M Kykar, Wind's Fury 217 U Risen Reef +226 R Golos, Tireless Pilgrim + +236 U Bacchetta Punitiva + 244 U Cryptic Caves 280 L Forest From 66fcd517eac35419ec8551e9a9cc3e5d8280283e Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 18 Jun 2019 16:45:50 +0000 Subject: [PATCH 27/64] rest of tuesday morning spoilers --- forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/growth_cycle.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt | 6 ++++++ forge-gui/res/editions/Magic 2020.txt | 7 +++++++ 5 files changed, 26 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/growth_cycle.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt b/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt new file mode 100644 index 00000000000..38ea2e00b90 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt @@ -0,0 +1,5 @@ +Name:Barkhide Troll +ManaCost:G G +Types:Creature Troll +PT:2/2 +Oracle:Barkhide Troll enters the battlefield with a +1/+1 counter on it.\n{1}, Remove a +1/+1 counter from Barkhide Troll: Barkhide Troll gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt new file mode 100644 index 00000000000..7d391071ffe --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt @@ -0,0 +1,4 @@ +Name:Field of the Dead +ManaCost:no cost +Types:Land +Oracle:Field of the Dead enters the battlefield tapped.\n{T}: Add {C}.\nWhenever Field fo the Dead or another land enters the battlefield under your control, if you control seven or more lands with different names, create a 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt b/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt new file mode 100644 index 00000000000..ccdc1993795 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt @@ -0,0 +1,4 @@ +Name:Growth Cycle +ManaCost:1 G +Types:Instant +Oracle:Target creature gets +3/+3 until end of turn. It gets an additional +2/+2 until end of turn for each card named Growth Cycle in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt b/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt new file mode 100644 index 00000000000..a97e3721abf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt @@ -0,0 +1,6 @@ +Name:Hanged Executioner +ManaCost:2 W +Types:Creature Spirit +K:Flying +PT:1/1 +Oracle:Flying\nWhen Hanged Executioner enters the battlefield, create a 1/1 white Spirit creature token with flying.\n{3}{W}, Exile Hanged Executioner: Exile target creature. diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index 4483b72ed21..14cb78ca795 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -16,6 +16,8 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 13 U Devout Decree 14 C Disenchant +22 R Hanged Executioner + 24 R Leyline of Sanctity 27 R Loxodon Lifesinger @@ -80,6 +82,10 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 163 U Uncaged Fury +165 U Barkhide Troll + +175 C Growth Cycle + 180 U Loaming Shaman 187 U Overgrowth Elemental @@ -117,3 +123,4 @@ ajanis_pridemate r_1_1_elemental w_1_1_soldier w_1_1_spirit_flying +b_2_2_zombie From 4b38c614fae59c94cc8725008e80d944f4b260ca Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Jun 2019 19:57:44 +0300 Subject: [PATCH 28/64] - Improve logic for Ajani, the Greathearted. --- .../src/main/java/forge/ai/ability/CountersPutAllAi.java | 9 +++++++-- forge-ai/src/main/java/forge/ai/ability/PermanentAi.java | 2 +- forge-gui/res/cardsfolder/a/ajani_the_greathearted.txt | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java index 0be541d2f5f..6142b9c71ff 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java @@ -38,8 +38,13 @@ public class CountersPutAllAi extends SpellAbilityAi { final boolean curse = sa.isCurse(); final TargetRestrictions tgt = sa.getTargetRestrictions(); - hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); - cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); + if ("OwnCreatsAndOtherPWs".equals(sa.getParam("AILogic"))) { + hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source); + cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source); + } else { + hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); + cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); + } if (abCost != null) { // AI currently disabled for these costs diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index 3832bd0c956..14a3f8160c5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -201,7 +201,7 @@ public class PermanentAi extends SpellAbilityAi { int numControlled = 0; if (param.endsWith("WithoutOppAuras")) { - // Check that the permanet does not have any auras attached to it by the opponent (this assumes that if + // Check that the permanent does not have any auras attached to it by the opponent (this assumes that if // the opponent cast an aura on the opposing permanent, it's not with good intentions, and thus it might // be better to have a pristine copy of the card - might not always be a correct assumption, but sounds // like a reasonable default for some cards). diff --git a/forge-gui/res/cardsfolder/a/ajani_the_greathearted.txt b/forge-gui/res/cardsfolder/a/ajani_the_greathearted.txt index e105fac8380..2e16294a6d1 100644 --- a/forge-gui/res/cardsfolder/a/ajani_the_greathearted.txt +++ b/forge-gui/res/cardsfolder/a/ajani_the_greathearted.txt @@ -5,8 +5,8 @@ Loyalty:5 S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddKeyword$ Vigilance | Description$ Creatures you control have vigilance. SVar:NonStackingEffect:True SVar:PlayMain1:TRUE -A:AB$ GainLife | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ true | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -A:AB$ PutCounterAll | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ true | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPutCounterAll | SpellDescription$ Put a +1/+1 counter on each creature you control and a loyalty counter on each other planeswalker you control. -SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Planeswalker.YouCtrl+Other | CounterType$ LOYALTY | CounterNum$ 1 +A:AB$ GainLife | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | LifeAmount$ 3 | SpellDescription$ You gain 3 life. +A:AB$ PutCounterAll | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ OwnCreatsAndOtherPWs | SubAbility$ DBPutCounterAll | SpellDescription$ Put a +1/+1 counter on each creature you control and a loyalty counter on each other planeswalker you control. +SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Planeswalker.YouCtrl+Other | CounterType$ LOYALTY | CounterNum$ 1 | AILogic$ OwnCreatsAndOtherPWs DeckHas:Ability$Counters & Ability$LifeGain Oracle:Creatures you control have vigilance.\n[+1]: You gain 3 life.\n[-2]: Put a +1/+1 counter on each creature you control and a loyalty counter on each other planeswalker you control. From 1a6d3a0dd328e50652a7153acfcaccde179f0b25 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 18 Jun 2019 17:47:33 +0000 Subject: [PATCH 29/64] leyline of anticipation reprint --- forge-gui/res/editions/Magic 2020.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index 14cb78ca795..306a24e14ef 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -37,6 +37,8 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 59 R Flood of Tears +64 R Leyline of Anticipation + 69 C Negate 70 C Octoprophet From 03769a5600ed522ce1aa4b743f8677c77af17af2 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 18 Jun 2019 18:18:20 +0000 Subject: [PATCH 30/64] pacifism --- forge-gui/res/editions/Magic 2020.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index 306a24e14ef..39daa4d5f8d 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -23,6 +23,8 @@ Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Sec 27 R Loxodon Lifesinger 28 U Loyal Pegasus +C Pacifism + 33 R Planar Cleansing 35 R Rule of Law From af6d437407dbb8482d13e1ce0e22989e7158147e Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Jun 2019 22:15:48 +0300 Subject: [PATCH 31/64] - Added puzzle PS_WAR7. --- forge-gui/res/puzzle/PS_WAR7.pzl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_WAR7.pzl diff --git a/forge-gui/res/puzzle/PS_WAR7.pzl b/forge-gui/res/puzzle/PS_WAR7.pzl new file mode 100644 index 00000000000..ab621c7d5e5 --- /dev/null +++ b/forge-gui/res/puzzle/PS_WAR7.pzl @@ -0,0 +1,17 @@ +[metadata] +Name:Possibility Storm - War of the Spark #07 +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/06/117.-WAR7-v2.jpg +Goal:Win +Turns:1 +Difficulty:Rare +Description:Win this turn. Assume any cards you could draw are irrelevant to the puzzle. +[state] +humanlife=8 +ailife=20 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Narset's Reversal;Siren's Ruse;Fraying Omnipotence;Expansion // Explosion +humanlibrary=Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus +humanbattlefield=Saheeli, Sublime Artificer|Counters:LOYALTY=3;Desperate Castaways;Sleek Schooner;Naru Meha, Master Wizard;Firemind Vessel;Steam Vents|NoETBTrigs;Steam Vents|NoETBTrigs;Steam Vents|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs +aibattlefield=God-Eternal Oketra;t:Zombie Warrior,P:4,T:4,Cost:no cost,Color:B,Types:Creature-Zombie-Warrior,Keywords:Vigilance,Image:b_4_4_zombie_warrior_vigilance_war;Impassioned Orator;t:Zombie Warrior,P:4,T:4,Cost:no cost,Color:B,Types:Creature-Zombie-Warrior,Keywords:Vigilance,Image:b_4_4_zombie_warrior_vigilance_war;Impassioned Orator;t:Zombie Warrior,P:4,T:4,Cost:no cost,Color:B,Types:Creature-Zombie-Warrior,Keywords:Vigilance,Image:b_4_4_zombie_warrior_vigilance_war;Impassioned Orator From 78e78bb3d54df16d21528f78b410bb68a0771341 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 16 Jan 2019 11:37:18 +0300 Subject: [PATCH 32/64] - Added puzzle PS_GRNS (Survive the Turn: GRN edition). - Currently doesn't work well because the AI doesn't prioritize cards in such a way that they would play the cards in such a way they'd actually win on their first turn. --- .../src/main/java/forge/ai/GameState.java | 115 ++++++++++-------- forge-gui/res/puzzle/PS_GRNS.pzl | 20 +++ 2 files changed, 84 insertions(+), 51 deletions(-) create mode 100644 forge-gui/res/puzzle/PS_GRNS.pzl diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 693ebba2690..8f705c8c987 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -74,7 +74,6 @@ public abstract class GameState { private final Map cardToEnchantPlayerId = new HashMap<>(); private final Map markedDamage = new HashMap<>(); private final Map> cardToChosenClrs = new HashMap<>(); - private final Map cardToChosenCards = new HashMap<>(); private final Map cardToChosenType = new HashMap<>(); private final Map> cardToRememberedId = new HashMap<>(); private final Map> cardToImprintedId = new HashMap<>(); @@ -97,9 +96,11 @@ public abstract class GameState { private String precastHuman = null; private String precastAI = null; + private String putOnStackHuman = null; + private String putOnStackAI = null; + private int turn = 1; - private boolean removeSummoningSickness = false; // Targeting for precast spells in a game state (mostly used by Puzzle Mode game states) private final int TARGET_NONE = -1; // untargeted spell (e.g. Joraga Invocation) @@ -214,10 +215,6 @@ public abstract class GameState { // Remember the IDs of imprinted cards cardsReferencedByID.add(i); } - for (Card i : card.getChosenCards()) { - // Remember the IDs of chosen cards - cardsReferencedByID.add(i); - } if (game.getCombat() != null && game.getCombat().isAttacking(card)) { // Remember the IDs of attacked planeswalkers GameEntity def = game.getCombat().getDefenderByAttacker(card); @@ -319,17 +316,6 @@ public abstract class GameState { newText.append("|NamedCard:").append(c.getNamedCard()); } - List chosenCardIds = Lists.newArrayList(); - for (Object obj : c.getChosenCards()) { - if (obj instanceof Card) { - int id = ((Card)obj).getId(); - chosenCardIds.add(String.valueOf(id)); - } - } - if (!chosenCardIds.isEmpty()) { - newText.append("|ChosenCards:").append(TextUtil.join(chosenCardIds, ",")); - } - List rememberedCardIds = Lists.newArrayList(); for (Object obj : c.getRemembered()) { if (obj instanceof Card) { @@ -450,10 +436,6 @@ public abstract class GameState { turn = Integer.parseInt(categoryValue); } - else if (categoryName.equals("removesummoningsickness")) { - removeSummoningSickness = categoryValue.equalsIgnoreCase("true"); - } - else if (categoryName.endsWith("life")) { if (isHuman) humanLife = Integer.parseInt(categoryValue); @@ -535,6 +517,13 @@ public abstract class GameState { precastAI = categoryValue; } + else if (categoryName.endsWith("putonstack")) { + if (isHuman) + putOnStackHuman = categoryValue; + else + putOnStackAI = categoryValue; + } + else if (categoryName.endsWith("manapool")) { if (isHuman) humanManaPool = categoryValue; @@ -574,7 +563,6 @@ public abstract class GameState { cardToExiledWithId.clear(); markedDamage.clear(); cardToChosenClrs.clear(); - cardToChosenCards.clear(); cardToChosenType.clear(); cardToScript.clear(); cardAttackMap.clear(); @@ -614,6 +602,9 @@ public abstract class GameState { game.getTriggerHandler().setSuppressAllTriggers(false); + // SAs added to stack cause triggers to fire, as if the relevant SAs were cast + handleAddSAsToStack(game); + // Combat only works for 1v1 matches for now (which are the only matches dev mode supports anyway) // Note: triggers may fire during combat declarations ("whenever X attacks, ...", etc.) if (newPhase == PhaseType.COMBAT_DECLARE_ATTACKERS || newPhase == PhaseType.COMBAT_DECLARE_BLOCKERS) { @@ -628,12 +619,6 @@ public abstract class GameState { game.getPhaseHandler().devAdvanceToPhase(advPhase); } - if (removeSummoningSickness) { - for (Card card : game.getCardsInGame()) { - card.setSickness(false); - } - } - game.getAction().checkStateEffects(true); //ensure state based effects and triggers are updated } @@ -803,6 +788,9 @@ public abstract class GameState { } private void executeScript(Game game, Card c, String sPtr) { + executeScript(game, c, sPtr, false); + } + private void executeScript(Game game, Card c, String sPtr, boolean putOnStack) { int tgtID = TARGET_NONE; if (sPtr.contains("->")) { String tgtDef = sPtr.substring(sPtr.lastIndexOf("->") + 2); @@ -878,13 +866,17 @@ public abstract class GameState { sa.setActivatingPlayer(c.getController()); handleScriptedTargetingForSA(game, sa, tgtID); - sa.resolve(); + if (putOnStack) { + game.getStack().addAndUnfreeze(sa); + } else { + sa.resolve(); - // resolve subabilities - SpellAbility subSa = sa.getSubAbility(); - while (subSa != null) { - subSa.resolve(); - subSa = subSa.getSubAbility(); + // resolve subabilities + SpellAbility subSa = sa.getSubAbility(); + while (subSa != null) { + subSa.resolve(); + subSa = subSa.getSubAbility(); + } } } @@ -906,7 +898,28 @@ public abstract class GameState { } } + private void handleAddSAsToStack(final Game game) { + Player human = game.getPlayers().get(0); + Player ai = game.getPlayers().get(1); + + if (putOnStackHuman != null) { + String[] spellList = TextUtil.split(putOnStackHuman, ';'); + for (String spell : spellList) { + precastSpellFromCard(spell, human, game, true); + } + } + if (putOnStackAI != null) { + String[] spellList = TextUtil.split(putOnStackAI, ';'); + for (String spell : spellList) { + precastSpellFromCard(spell, ai, game, true); + } + } + } + private void precastSpellFromCard(String spellDef, final Player activator, final Game game) { + precastSpellFromCard(spellDef, activator, game, false); + } + private void precastSpellFromCard(String spellDef, final Player activator, final Game game, final boolean putOnStack) { int tgtID = TARGET_NONE; String scriptID = ""; @@ -931,7 +944,7 @@ public abstract class GameState { SpellAbility sa = null; if (!scriptID.isEmpty()) { - executeScript(game, c, scriptID); + executeScript(game, c, scriptID, putOnStack); return; } @@ -940,7 +953,11 @@ public abstract class GameState { handleScriptedTargetingForSA(game, sa, tgtID); - sa.resolve(); + if (putOnStack) { + game.getStack().addAndUnfreeze(sa); + } else { + sa.resolve(); + } } private void handleMarkedDamage() { @@ -976,12 +993,6 @@ public abstract class GameState { Card c = entry.getKey(); c.setNamedCard(entry.getValue()); } - - // Chosen cards - for (Entry entry : cardToChosenCards.entrySet()) { - Card c = entry.getKey(); - c.setChosenCards(entry.getValue()); - } } private void handleCardAttachments() { @@ -1016,7 +1027,7 @@ public abstract class GameState { String[] allCounterStrings = counterString.split(","); for (final String counterPair : allCounterStrings) { String[] pair = counterPair.split("=", 2); - entity.addCounter(CounterType.valueOf(pair[0]), Integer.parseInt(pair[1]), null, false, false, null); + entity.addCounter(CounterType.valueOf(pair[0]), Integer.parseInt(pair[1]), null, false, false); } } @@ -1082,6 +1093,7 @@ public abstract class GameState { zone.setCards(kv.getValue()); } } + } /** @@ -1142,7 +1154,7 @@ public abstract class GameState { } else if (info.startsWith("SummonSick")) { c.setSickness(true); } else if (info.startsWith("FaceDown")) { - c.turnFaceDown(true); + c.setState(CardStateName.FaceDown, true); if (info.endsWith("Manifested")) { c.setManifested(true); } @@ -1167,6 +1179,14 @@ public abstract class GameState { // TODO: improve this for game states with more than two players String tgt = info.substring(info.indexOf(':') + 1); cardToEnchantPlayerId.put(c, tgt.equalsIgnoreCase("AI") ? TARGET_AI : TARGET_HUMAN); + } else if (info.startsWith("Owner:")) { + // TODO: improve this for game states with more than two players + Player human = player.getGame().getPlayers().get(0); + Player ai = player.getGame().getPlayers().get(1); + String owner = info.substring(info.indexOf(':') + 1); + Player controller = c.getController(); + c.setOwner(owner.equalsIgnoreCase("AI") ? ai : human); + c.setController(controller, c.getGame().getNextTimestamp()); } else if (info.startsWith("Ability:")) { String abString = info.substring(info.indexOf(':') + 1).toLowerCase(); c.addSpellAbility(AbilityFactory.getAbility(abilityString.get(abString), c)); @@ -1177,13 +1197,6 @@ public abstract class GameState { cardToChosenClrs.put(c, Arrays.asList(info.substring(info.indexOf(':') + 1).split(","))); } else if (info.startsWith("ChosenType:")) { cardToChosenType.put(c, info.substring(info.indexOf(':') + 1)); - } else if (info.startsWith("ChosenCards:")) { - CardCollection chosen = new CardCollection(); - String[] idlist = info.substring(info.indexOf(':') + 1).split(","); - for (String id : idlist) { - chosen.add(idToCard.get(Integer.parseInt(id))); - } - cardToChosenCards.put(c, chosen); } else if (info.startsWith("NamedCard:")) { cardToNamedCard.put(c, info.substring(info.indexOf(':') + 1)); } else if (info.startsWith("ExecuteScript:")) { diff --git a/forge-gui/res/puzzle/PS_GRNS.pzl b/forge-gui/res/puzzle/PS_GRNS.pzl new file mode 100644 index 00000000000..49324e1a1a1 --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRNS.pzl @@ -0,0 +1,20 @@ +[metadata] +Name:Possibility Storm - Guilds of Ravnica Special (Survive the Turn) +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/01/094.-GRN004-3.jpg +Goal:Survive +Turns:1 +Difficulty:Special +Description:Start in your opponent's first main phase with their Mnemonic Betrayal just cast and on the stack. Find a way to survive the turn! The trigger from Deeproot Champion is also on the stack and it will get one +1/+1 counter! Assume that any cards that could be drawn by either player are lands that enter the battlefield tapped. Goblin Banneret and Runaway Steam-Kin controlled by your opponent are owned by you. +[state] +humanlife=9 +ailife=20 +turn=1 +activeplayer=ai +activephase=MAIN1 +humanhand=Mission Briefing +humanlibrary=Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard +humangraveyard=Fervent Strike;Warlord's Fury;Dinosaur Stampede;Sure Strike;Crash the Ramparts;Buccaneer's Bravado;Rescue;Forebear's Blade +humanbattlefield=Raptor Hatchling;Diamond Mare|ChosenColor:Blue;Beamsplitter Mage;Island;Island;Island;Mountain;Forest +ailibrary=Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard +aibattlefield=Relic Runner;Goblin Banneret|Owner:Human;Deeproot Champion;Runaway Steam-Kin|Owner:Human;Overgrown Tomb;Overgrown Tomb;Overgrown Tomb;Overgrown Tomb|Tapped;Island;Island;Island;Island|Tapped +aiputonstack=Mnemonic Betrayal From 113409516c80fa1d368fac4e61f8b57df5196bc8 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Jun 2019 22:23:29 +0300 Subject: [PATCH 33/64] - Disable PS_GRNS until a way can be found to make the AI behave correctly. --- forge-gui/res/puzzle/{PS_GRNS.pzl => PS_GRNS.pzl.example} | 3 +++ 1 file changed, 3 insertions(+) rename forge-gui/res/puzzle/{PS_GRNS.pzl => PS_GRNS.pzl.example} (83%) diff --git a/forge-gui/res/puzzle/PS_GRNS.pzl b/forge-gui/res/puzzle/PS_GRNS.pzl.example similarity index 83% rename from forge-gui/res/puzzle/PS_GRNS.pzl rename to forge-gui/res/puzzle/PS_GRNS.pzl.example index 49324e1a1a1..1a00b8ada75 100644 --- a/forge-gui/res/puzzle/PS_GRNS.pzl +++ b/forge-gui/res/puzzle/PS_GRNS.pzl.example @@ -1,3 +1,6 @@ +# This is an example puzzle, currently disabled. It demonstrates how to set up a puzzle where a spell is put on stack +# at the beginning of the puzzle. Unfortunately, this particular puzzle doesn't work well in Forge due to the fact that +# the AI does not use its resources optimally, thus naturally failing to defeat the player in one turn and losing. [metadata] Name:Possibility Storm - Guilds of Ravnica Special (Survive the Turn) URL:http://www.possibilitystorm.com/wp-content/uploads/2019/01/094.-GRN004-3.jpg From 9831995db39369444c83eba3ef924b48f1320b1d Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Jun 2019 22:24:57 +0300 Subject: [PATCH 34/64] - Patch GameState to work with the latest changes. --- forge-ai/src/main/java/forge/ai/GameState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 8f705c8c987..1d19fd85818 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -1027,7 +1027,7 @@ public abstract class GameState { String[] allCounterStrings = counterString.split(","); for (final String counterPair : allCounterStrings) { String[] pair = counterPair.split("=", 2); - entity.addCounter(CounterType.valueOf(pair[0]), Integer.parseInt(pair[1]), null, false, false); + entity.addCounter(CounterType.valueOf(pair[0]), Integer.parseInt(pair[1]), null, false, false, null); } } From ecd48916c0584fa15999c3f0bc1a80c0bd5da0f7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Jun 2019 22:31:45 +0300 Subject: [PATCH 35/64] - Restore functionality for remove sickness and choose cards --- .../src/main/java/forge/ai/GameState.java | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 1d19fd85818..fc182cfdc34 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -74,6 +74,7 @@ public abstract class GameState { private final Map cardToEnchantPlayerId = new HashMap<>(); private final Map markedDamage = new HashMap<>(); private final Map> cardToChosenClrs = new HashMap<>(); + private final Map cardToChosenCards = new HashMap<>(); private final Map cardToChosenType = new HashMap<>(); private final Map> cardToRememberedId = new HashMap<>(); private final Map> cardToImprintedId = new HashMap<>(); @@ -101,6 +102,7 @@ public abstract class GameState { private int turn = 1; + private boolean removeSummoningSickness = false; // Targeting for precast spells in a game state (mostly used by Puzzle Mode game states) private final int TARGET_NONE = -1; // untargeted spell (e.g. Joraga Invocation) @@ -215,6 +217,10 @@ public abstract class GameState { // Remember the IDs of imprinted cards cardsReferencedByID.add(i); } + for (Card i : card.getChosenCards()) { + // Remember the IDs of chosen cards + cardsReferencedByID.add(i); + } if (game.getCombat() != null && game.getCombat().isAttacking(card)) { // Remember the IDs of attacked planeswalkers GameEntity def = game.getCombat().getDefenderByAttacker(card); @@ -316,6 +322,17 @@ public abstract class GameState { newText.append("|NamedCard:").append(c.getNamedCard()); } + List chosenCardIds = Lists.newArrayList(); + for (Object obj : c.getChosenCards()) { + if (obj instanceof Card) { + int id = ((Card)obj).getId(); + chosenCardIds.add(String.valueOf(id)); + } + } + if (!chosenCardIds.isEmpty()) { + newText.append("|ChosenCards:").append(TextUtil.join(chosenCardIds, ",")); + } + List rememberedCardIds = Lists.newArrayList(); for (Object obj : c.getRemembered()) { if (obj instanceof Card) { @@ -436,6 +453,10 @@ public abstract class GameState { turn = Integer.parseInt(categoryValue); } + else if (categoryName.equals("removesummoningsickness")) { + removeSummoningSickness = categoryValue.equalsIgnoreCase("true"); + } + else if (categoryName.endsWith("life")) { if (isHuman) humanLife = Integer.parseInt(categoryValue); @@ -563,6 +584,7 @@ public abstract class GameState { cardToExiledWithId.clear(); markedDamage.clear(); cardToChosenClrs.clear(); + cardToChosenCards.clear(); cardToChosenType.clear(); cardToScript.clear(); cardAttackMap.clear(); @@ -619,6 +641,12 @@ public abstract class GameState { game.getPhaseHandler().devAdvanceToPhase(advPhase); } + if (removeSummoningSickness) { + for (Card card : game.getCardsInGame()) { + card.setSickness(false); + } + } + game.getAction().checkStateEffects(true); //ensure state based effects and triggers are updated } @@ -993,6 +1021,12 @@ public abstract class GameState { Card c = entry.getKey(); c.setNamedCard(entry.getValue()); } + + // Chosen cards + for (Entry entry : cardToChosenCards.entrySet()) { + Card c = entry.getKey(); + c.setChosenCards(entry.getValue()); + } } private void handleCardAttachments() { @@ -1154,7 +1188,7 @@ public abstract class GameState { } else if (info.startsWith("SummonSick")) { c.setSickness(true); } else if (info.startsWith("FaceDown")) { - c.setState(CardStateName.FaceDown, true); + c.turnFaceDown(true); if (info.endsWith("Manifested")) { c.setManifested(true); } @@ -1197,6 +1231,13 @@ public abstract class GameState { cardToChosenClrs.put(c, Arrays.asList(info.substring(info.indexOf(':') + 1).split(","))); } else if (info.startsWith("ChosenType:")) { cardToChosenType.put(c, info.substring(info.indexOf(':') + 1)); + } else if (info.startsWith("ChosenCards:")) { + CardCollection chosen = new CardCollection(); + String[] idlist = info.substring(info.indexOf(':') + 1).split(","); + for (String id : idlist) { + chosen.add(idToCard.get(Integer.parseInt(id))); + } + cardToChosenCards.put(c, chosen); } else if (info.startsWith("NamedCard:")) { cardToNamedCard.put(c, info.substring(info.indexOf(':') + 1)); } else if (info.startsWith("ExecuteScript:")) { From 769a3f6dd8395401bdbce5a01128b7febf575108 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Jun 2019 22:32:23 +0300 Subject: [PATCH 36/64] - Remove empty line. --- forge-ai/src/main/java/forge/ai/GameState.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index fc182cfdc34..984bb2dc9b6 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -1127,7 +1127,6 @@ public abstract class GameState { zone.setCards(kv.getValue()); } } - } /** From f17a3f250024ca24360f56cce8372215bb1ee7d6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Jun 2019 22:34:23 +0300 Subject: [PATCH 37/64] - Add a comment to PS_GRNS --- forge-gui/res/puzzle/PS_GRNS.pzl.example | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/puzzle/PS_GRNS.pzl.example b/forge-gui/res/puzzle/PS_GRNS.pzl.example index 1a00b8ada75..91a431d18e1 100644 --- a/forge-gui/res/puzzle/PS_GRNS.pzl.example +++ b/forge-gui/res/puzzle/PS_GRNS.pzl.example @@ -1,6 +1,7 @@ # This is an example puzzle, currently disabled. It demonstrates how to set up a puzzle where a spell is put on stack # at the beginning of the puzzle. Unfortunately, this particular puzzle doesn't work well in Forge due to the fact that # the AI does not use its resources optimally, thus naturally failing to defeat the player in one turn and losing. +# Also, this puzzle demonstrates how it's possible to add a card which is owned by a player other than its controller. [metadata] Name:Possibility Storm - Guilds of Ravnica Special (Survive the Turn) URL:http://www.possibilitystorm.com/wp-content/uploads/2019/01/094.-GRN004-3.jpg From e029ee713dc1883430c73f6a5f4255f1e11440bd Mon Sep 17 00:00:00 2001 From: churrufli Date: Wed, 19 Jun 2019 00:05:20 +0200 Subject: [PATCH 38/64] Moving hard-coded text to res files --- .../src/main/java/forge/item/PaperCard.java | 4 +- .../src/main/java/forge/control/FControl.java | 27 +- .../java/forge/itemmanager/CardManager.java | 29 +- .../itemmanager/filters/StatTypeFilter.java | 4 +- .../forge/itemmanager/views/ImageView.java | 11 +- .../deckeditor/controllers/ACEditorBase.java | 41 +- .../controllers/CEditorConstructed.java | 33 +- .../controllers/CEditorVariant.java | 8 +- .../controllers/DeckController.java | 6 +- .../deckeditor/menus/DeckFileMenu.java | 23 +- .../screens/deckeditor/views/VAllDecks.java | 6 +- .../screens/deckeditor/views/VBrawlDecks.java | 6 +- .../deckeditor/views/VCardCatalog.java | 4 +- .../deckeditor/views/VCommanderDecks.java | 6 +- .../deckeditor/views/VCurrentDeck.java | 20 +- .../screens/deckeditor/views/VDeckgen.java | 22 +- .../deckeditor/views/VTinyLeadersDecks.java | 6 +- .../home/settings/VSubmenuPreferences.java | 2 +- .../workshop/views/VWorkshopCatalog.java | 7 +- forge-gui/res/languages/de-DE.properties | 167 +++++- forge-gui/res/languages/en-US.properties | 561 +++++++++++------- forge-gui/res/languages/es-es.properties | 181 +++++- .../main/java/forge/itemmanager/GroupDef.java | 29 +- .../forge/itemmanager/SItemManagerUtil.java | 90 +-- 24 files changed, 916 insertions(+), 377 deletions(-) diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 41c05424bec..be80957515c 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -28,6 +28,7 @@ import forge.StaticData; import forge.card.CardDb; import forge.card.CardRarity; import forge.card.CardRules; +import forge.util.Localizer; import forge.util.TextUtil; /** @@ -95,7 +96,8 @@ public final class PaperCard implements Comparable, InventoryItemFro @Override public String getItemType() { - return "Card"; + final Localizer localizer = Localizer.getInstance(); + return localizer.getMessage("lblCard"); } public boolean hasImage() { diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index 4c836b0d76e..4f951641eb5 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -124,19 +124,16 @@ public enum FControl implements KeyEventDispatcher { * instantiated separately by each screen's top level view class. */ FControl() { + final Localizer localizer = Localizer.getInstance(); Singletons.getView().getFrame().addWindowListener(new WindowAdapter() { @Override public void windowClosing(final WindowEvent e) { switch (closeAction) { case NONE: //prompt user for close action if not previously specified - final List options = ImmutableList.of("Close Screen", "Exit Forge", "Cancel"); + final List options = ImmutableList.of(localizer.getMessage("lblCloseScreen"), localizer.getMessage("lblExitForge"), localizer.getMessage("lblCancel")); final int reply = FOptionPane.showOptionDialog( - "Forge now supports navigation tabs which allow closing and switching between different screens with ease. " - + "As a result, you no longer need to use the X button in the upper right to close the current screen and go back." - + "\n\n" - + "Please select what you want to happen when clicking the X button in the upper right. This choice will be used " - + "going forward and you will not see this message again. You can change this behavior at any time in Preferences.", - "Select Your Close Action", + localizer.getMessage("txCloseAction1") + "\n\n" + localizer.getMessage("txCloseAction2"), + localizer.getMessage("titCloseAction"), FOptionPane.INFORMATION_ICON, options, 2); @@ -179,13 +176,14 @@ public enum FControl implements KeyEventDispatcher { } public boolean canExitForge(final boolean forRestart) { - final String action = (forRestart ? "Restart" : "Exit"); - String userPrompt = "Are you sure you wish to " + (forRestart ? "restart" : "exit") + " Forge?"; + final Localizer localizer = Localizer.getInstance(); + final String action = (forRestart ? localizer.getMessage("lblRestart") : localizer.getMessage("lblExit")); + String userPrompt =(forRestart ? localizer.getMessage("lblAreYouSureYouWishRestartForge") : localizer.getMessage("lblAreYouSureYouWishExitForge")); final boolean hasCurrentMatches = hasCurrentMatches(); if (hasCurrentMatches) { - userPrompt = "One or more games are currently active. " + userPrompt; + userPrompt = localizer.getMessage("lblOneOrMoreGamesActive") + ". " + userPrompt; } - if (!FOptionPane.showConfirmDialog(userPrompt, action + " Forge", action, "Cancel", !hasCurrentMatches)) { //default Yes if no game active + if (!FOptionPane.showConfirmDialog(userPrompt, action + " Forge", action, localizer.getMessage("lblCancel"), !hasCurrentMatches)) { //default Yes if no game active return false; } return CDeckEditorUI.SINGLETON_INSTANCE.canSwitchAway(true); @@ -223,7 +221,8 @@ public enum FControl implements KeyEventDispatcher { closeAction = CloseAction.valueOf(prefs.getPref(FPref.UI_CLOSE_ACTION)); - FView.SINGLETON_INSTANCE.setSplashProgessBarMessage("Loading quest..."); + final Localizer localizer = Localizer.getInstance(); + FView.SINGLETON_INSTANCE.setSplashProgessBarMessage(localizer.getMessage("lblLoadingQuest")); // Preload quest data if present final File dirQuests = new File(ForgeConstants.QUEST_SAVE_DIR); final String questname = FModel.getQuestPreferences().getPref(QPref.CURRENT_QUEST); @@ -258,7 +257,6 @@ public enum FControl implements KeyEventDispatcher { FView.SINGLETON_INSTANCE.getLpnDocument().addComponentListener(SResizingUtil.getWindowResizeListener()); setGlobalKeyboardHandler(); - final Localizer localizer = Localizer.getInstance(); FView.SINGLETON_INSTANCE.setSplashProgessBarMessage(localizer.getMessage("lblOpeningMainWindow")); SwingUtilities.invokeLater(new Runnable() { @Override @@ -318,7 +316,8 @@ public enum FControl implements KeyEventDispatcher { try { SLayoutIO.loadLayout(null); } catch (final InvalidLayoutFileException ex) { - SOptionPane.showMessageDialog(String.format("Your %s layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout.", screen.getTabCaption()), "Warning!"); + final Localizer localizer = Localizer.getInstance(); + SOptionPane.showMessageDialog(String.format(localizer.getMessage("lblerrLoadingLayoutFile"), screen.getTabCaption()), "Warning!"); if (screen.deleteLayoutFile()) { SLayoutIO.loadLayout(null); //try again } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java index 534c103524d..3ebaff3221a 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java @@ -10,6 +10,7 @@ import forge.quest.data.QuestPreferences; import forge.screens.home.quest.DialogChooseFormats; import forge.screens.home.quest.DialogChooseSets; import forge.screens.match.controllers.CDetailPicture; +import forge.util.Localizer; import javax.swing.*; import java.util.HashMap; @@ -81,8 +82,8 @@ public class CardManager extends ItemManager { public void buildAddFilterMenu(JMenu menu, final ItemManager itemManager) { GuiUtils.addSeparator(menu); //separate from current search item - - JMenu fmt = GuiUtils.createMenu("Format"); + final Localizer localizer = Localizer.getInstance(); + JMenu fmt = GuiUtils.createMenu(localizer.getMessage("lblFormat")); for (final GameFormat f : FModel.getFormats().getFilterList()) { GuiUtils.addMenuItem(fmt, f.getName(), null, new Runnable() { @Override @@ -93,7 +94,7 @@ public class CardManager extends ItemManager { } menu.add(fmt); - GuiUtils.addMenuItem(menu, "Formats...", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblFormats") + "...", null, new Runnable() { @Override public void run() { final CardFormatFilter existingFilter = itemManager.getFilter(CardFormatFilter.class); if (existingFilter != null) { @@ -113,7 +114,7 @@ public class CardManager extends ItemManager { } }); - GuiUtils.addMenuItem(menu, "Sets...", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblSets") + "...", null, new Runnable() { @Override public void run() { CardSetFilter existingFilter = itemManager.getFilter(CardSetFilter.class); @@ -135,7 +136,7 @@ public class CardManager extends ItemManager { } }); - JMenu world = GuiUtils.createMenu("Quest world"); + JMenu world = GuiUtils.createMenu(localizer.getMessage("lblQuestWorld")); for (final QuestWorld w : FModel.getWorlds()) { GuiUtils.addMenuItem(world, w.getName(), null, new Runnable() { @Override @@ -148,19 +149,19 @@ public class CardManager extends ItemManager { GuiUtils.addSeparator(menu); - GuiUtils.addMenuItem(menu, "Colors", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblColors"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardColorFilter(itemManager)); } }, itemManager.getFilter(CardColorFilter.class) == null); - GuiUtils.addMenuItem(menu, "Types", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblTypes"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardTypeFilter(itemManager)); } }, itemManager.getFilter(CardTypeFilter.class) == null); - GuiUtils.addMenuItem(menu, "Converted mana costs", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblConvertedManaCosts"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardCMCFilter(itemManager)); @@ -169,19 +170,19 @@ public class CardManager extends ItemManager { GuiUtils.addSeparator(menu); - GuiUtils.addMenuItem(menu, "CMC range", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblCMCRange"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardCMCRangeFilter(itemManager)); } }, itemManager.getFilter(CardCMCRangeFilter.class) == null); - GuiUtils.addMenuItem(menu, "Power range", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblPowerRange"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardPowerFilter(itemManager)); } }, itemManager.getFilter(CardPowerFilter.class) == null); - GuiUtils.addMenuItem(menu, "Toughness range", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblToughnessRange"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardToughnessFilter(itemManager)); @@ -190,7 +191,7 @@ public class CardManager extends ItemManager { GuiUtils.addSeparator(menu); - GuiUtils.addMenuItem(menu, "Foil", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblFoil"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardFoilFilter(itemManager)); @@ -198,7 +199,7 @@ public class CardManager extends ItemManager { }, itemManager.getFilter(CardFoilFilter.class) == null); if (QuestMode) { - GuiUtils.addMenuItem(menu, "Personal Rating", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblPersonalRating"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardRatingFilter(itemManager)); @@ -208,7 +209,7 @@ public class CardManager extends ItemManager { GuiUtils.addSeparator(menu); - GuiUtils.addMenuItem(menu, "Advanced...", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblAdvanced")+ "...", null, new Runnable() { @Override @SuppressWarnings("unchecked") public void run() { diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java index 94e885075e6..15d0fbcee87 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java @@ -12,6 +12,7 @@ import forge.itemmanager.SItemManagerUtil.StatTypes; import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.util.ItemPool; +import forge.util.Localizer; import javax.swing.*; @@ -28,9 +29,10 @@ public abstract class StatTypeFilter extends ToggleButt @SuppressWarnings("serial") protected void addToggleButton(JPanel widget, final StatTypes st) { + final Localizer localizer = Localizer.getInstance(); StringBuilder tooltip = new StringBuilder(); tooltip.append(st.label); - tooltip.append(" (click to toggle the filter, right-click to show only "); + tooltip.append(" (" + localizer.getMessage("lblclicktotoogle") + " "); if (st.label.length() > 1 && !Character.isUpperCase(st.label.charAt(1))) { tooltip.append(st.label.substring(0, 1).toLowerCase()); tooltip.append(st.label.substring(1)); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java index d5833b4f2c0..d7bfcd1bba6 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java @@ -56,6 +56,7 @@ import forge.toolbox.FSkin.SkinFont; import forge.toolbox.FSkin.SkinImage; import forge.toolbox.FTextField; import forge.toolbox.special.CardZoomer; +import forge.util.Localizer; import forge.view.arcane.CardPanel; public class ImageView extends ItemView { @@ -83,6 +84,7 @@ public class ImageView extends ItemView { private ItemInfo focalItem; private final List orderedItems = new ArrayList(); private final List groups = new ArrayList(); + final Localizer localizer = Localizer.getInstance(); private static boolean isPreferenceEnabled(final ForgePreferences.FPref preferenceName) { return FModel.getPreferences().getPrefBoolean(preferenceName); @@ -127,9 +129,8 @@ public class ImageView extends ItemView { repaintSelf(); } } - private void updateToolTip() { - setToolTipText(isAllCollapsed ? "Expand all groups" : "Collapse all groups"); + setToolTipText(isAllCollapsed ? localizer.getMessage("lblExpandallgroups") : localizer.getMessage("lblCollapseallgroups")); } @Override @@ -211,11 +212,11 @@ public class ImageView extends ItemView { }); getPnlOptions().add(btnExpandCollapseAll, "w " + FTextField.HEIGHT + "px, h " + FTextField.HEIGHT + "px"); - getPnlOptions().add(new FLabel.Builder().text("Group by:").fontSize(12).build()); + getPnlOptions().add(new FLabel.Builder().text(localizer.getMessage("lblGroupby") +":").fontSize(12).build()); cbGroupByOptions.addTo(getPnlOptions(), "pushx, growx"); - getPnlOptions().add(new FLabel.Builder().text("Pile by:").fontSize(12).build()); + getPnlOptions().add(new FLabel.Builder().text(localizer.getMessage("lblPileby") +":").fontSize(12).build()); cbPileByOptions.addTo(getPnlOptions(), "pushx, growx"); - getPnlOptions().add(new FLabel.Builder().text("Columns:").fontSize(12).build()); + getPnlOptions().add(new FLabel.Builder().text(localizer.getMessage("lblColumns") +":").fontSize(12).build()); cbColumnCount.addTo(getPnlOptions(), "w 38px!"); //setup display diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java index d616c02ef3b..76fdaf507d4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java @@ -44,6 +44,7 @@ import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.util.Aggregates; import forge.util.ItemPool; +import forge.util.Localizer; import forge.view.FView; import javax.swing.*; @@ -77,37 +78,39 @@ public abstract class ACEditorBase { catalogManager = new CardManager(getCDetailPicture(), wantUnique, false); deckManager = new CardManager(getCDetailPicture(), wantUnique, false); - catalogManager.setCaption("Catalog"); + final Localizer localizer = Localizer.getInstance(); + + catalogManager.setCaption(localizer.getMessage("lblCatalog")); this.setCatalogManager(catalogManager); this.setDeckManager(deckManager); @@ -258,13 +261,14 @@ public final class CEditorConstructed extends CDeckEditor { } public static void buildAddContextMenu(EditorContextMenuBuilder cmb, DeckSection sectionMode) { + final Localizer localizer = Localizer.getInstance(); switch (sectionMode) { case Main: - cmb.addMoveItems("Add", "to deck"); - cmb.addMoveAlternateItems("Add", "to sideboard"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltodeck")); + cmb.addMoveAlternateItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltosideboard")); break; case Sideboard: - cmb.addMoveItems("Add", "to sideboard"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), "to sideboard"); break; case Commander: cmb.addMoveItems("Set", "as commander"); @@ -273,41 +277,42 @@ public final class CEditorConstructed extends CDeckEditor { cmb.addMoveItems("Set", "as avatar"); break; case Schemes: - cmb.addMoveItems("Add", "to scheme deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), "to scheme deck"); break; case Planes: - cmb.addMoveItems("Add", "to planar deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), "to planar deck"); break; case Conspiracy: - cmb.addMoveItems("Add", "to conspiracy deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), "to conspiracy deck"); break; } } public static void buildRemoveContextMenu(EditorContextMenuBuilder cmb, DeckSection sectionMode, boolean foilAvailable) { + final Localizer localizer = Localizer.getInstance(); switch (sectionMode) { case Main: - cmb.addMoveItems("Remove", "from deck"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromdeck")); cmb.addMoveAlternateItems("Move", "to sideboard"); break; case Sideboard: - cmb.addMoveItems("Remove", "from sideboard"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromsideboard")); cmb.addMoveAlternateItems("Move", "to deck"); break; case Commander: - cmb.addMoveItems("Remove", "as commander"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblascommander")); break; case Avatar: - cmb.addMoveItems("Remove", "as avatar"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblasavatar")); break; case Schemes: - cmb.addMoveItems("Remove", "from scheme deck"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromschemedeck")); break; case Planes: - cmb.addMoveItems("Remove", "from planar deck"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromplanardeck")); break; case Conspiracy: - cmb.addMoveItems("Remove", "from conspiracy deck"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromconspiracydeck")); break; } if (foilAvailable) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java index f085687768e..69953f07822 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java @@ -35,6 +35,7 @@ import forge.screens.deckeditor.views.VAllDecks; import forge.screens.deckeditor.views.VDeckgen; import forge.screens.match.controllers.CDetailPicture; import forge.util.ItemPool; +import forge.util.Localizer; import forge.util.storage.IStorage; import java.util.Map.Entry; @@ -70,8 +71,9 @@ public final class CEditorVariant extends CDeckEditor { final CardManager catalogManager = new CardManager(cDetailPicture, true, false); final CardManager deckManager = new CardManager(cDetailPicture, true, false); + final Localizer localizer = Localizer.getInstance(); - catalogManager.setCaption("Catalog"); + catalogManager.setCaption(localizer.getMessage("lblCatalog")); this.setCatalogManager(catalogManager); this.setDeckManager(deckManager); @@ -131,12 +133,12 @@ public final class CEditorVariant extends CDeckEditor { @Override protected void buildAddContextMenu(EditorContextMenuBuilder cmb) { - cmb.addMoveItems("Add", "to deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltodeck")); } @Override protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) { - cmb.addMoveItems("Remove", "from deck"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromdeck")); } /* diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java index 3b0b40ca894..f2a01e17c64 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java @@ -21,6 +21,7 @@ import forge.StaticData; import forge.deck.*; import forge.item.PaperCard; import forge.util.ItemPool; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Supplier; @@ -402,9 +403,10 @@ public class DeckController { } public void updateCaptions() { - String tabCaption = "Current Deck"; + final Localizer localizer = Localizer.getInstance(); + String tabCaption = localizer.getMessage("lblCurrentDeck2"); final String title = getModelName(); - String itemManagerCaption = title.isEmpty() ? "[Untitled]" : title; + String itemManagerCaption = title.isEmpty() ? "[" + localizer.getMessage("lblUntitled") +"]" : title; if (!saved) { tabCaption = "*" + tabCaption; diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/DeckFileMenu.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/DeckFileMenu.java index 4ae4b42ae84..1b104cf5112 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/DeckFileMenu.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/DeckFileMenu.java @@ -5,6 +5,7 @@ import forge.menus.MenuUtil; import forge.screens.deckeditor.CDeckEditorUI; import forge.screens.deckeditor.views.VCurrentDeck; import forge.toolbox.FSkin.SkinnedMenuItem; +import forge.util.Localizer; import javax.swing.*; @@ -24,8 +25,8 @@ public final class DeckFileMenu { public static JMenu getMenu(boolean showMenuIcons) { showIcons = showMenuIcons; - - JMenu menu = new JMenu("File"); + final Localizer localizer = Localizer.getInstance(); + JMenu menu = new JMenu(localizer.getMessage("lblFile")); menu.setMnemonic(KeyEvent.VK_F); menu.add(getMenuItem_New()); menu.add(getMenuItem_Open()); @@ -51,7 +52,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_New() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("New Deck"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblNewDeck")); menuItem.setIcon(showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_NEW) : null); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_N)); menuItem.addActionListener(getNewAction()); @@ -68,7 +70,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_Open() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("Open Deck"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblOpenDeck")); menuItem.setIcon(showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_OPEN) : null); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_O)); menuItem.addActionListener(getOpenAction()); @@ -85,7 +88,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_Import() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("Import Deck"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblImportDeck")); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_I)); menuItem.addActionListener(getImportAction()); return menuItem; @@ -101,7 +105,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_Save() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("Save Deck"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblSaveDeck")); menuItem.setIcon(showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_SAVE) : null); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_S)); menuItem.addActionListener(getSaveAction()); @@ -119,7 +124,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_SaveAs() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("Save Deck As"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblSaveDeckAs")); menuItem.setIcon(showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_SAVEAS) : null); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_E)); menuItem.addActionListener(getSaveAsAction()); @@ -137,7 +143,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_Print() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("Print to HTML file"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblPrinttoHTMLfile")); menuItem.setIcon(showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_PRINT) : null); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_P)); menuItem.addActionListener(getPrintAction()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java index b31b6cb31b4..6a9af01f1ea 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java @@ -10,6 +10,7 @@ import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.controllers.CAllDecks; import forge.screens.match.controllers.CDetailPicture; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -25,7 +26,8 @@ public enum VAllDecks implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Constructed"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblConstructed")); private DeckManager lstDecks; @@ -93,6 +95,6 @@ public enum VAllDecks implements IVDoc { public void setCDetailPicture(final CDetailPicture cDetailPicture) { this.lstDecks = new DeckManager(GameType.Constructed, cDetailPicture); - this.lstDecks.setCaption("Constructed Decks"); + this.lstDecks.setCaption(localizer.getMessage("lblConstructedDecks")); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java index 8afcb05a190..717139884df 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java @@ -10,6 +10,7 @@ import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.controllers.CBrawlDecks; import forge.screens.match.controllers.CDetailPicture; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -25,7 +26,8 @@ public enum VBrawlDecks implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Brawl"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblBrawl")); private DeckManager lstDecks; @@ -93,6 +95,6 @@ public enum VBrawlDecks implements IVDoc { public void setCDetailPicture(final CDetailPicture cDetailPicture) { this.lstDecks = new DeckManager(GameType.Brawl, cDetailPicture); - this.lstDecks.setCaption("Brawl Decks"); + this.lstDecks.setCaption(localizer.getMessage("lblBrawlDecks")); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCardCatalog.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCardCatalog.java index 56349e757b6..77afc809778 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCardCatalog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCardCatalog.java @@ -8,6 +8,7 @@ import forge.item.InventoryItem; import forge.itemmanager.ItemManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.controllers.CCardCatalog; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -23,7 +24,8 @@ public enum VCardCatalog implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Card Catalog"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblCardCatalog")); private final ItemManagerContainer itemManagerContainer = new ItemManagerContainer(); private ItemManager itemManager; diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java index fbed9d4271f..2c40e97b632 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java @@ -10,6 +10,7 @@ import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.controllers.CCommanderDecks; import forge.screens.match.controllers.CDetailPicture; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -25,7 +26,8 @@ public enum VCommanderDecks implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Commander"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblCommander")); private DeckManager lstDecks; @@ -93,6 +95,6 @@ public enum VCommanderDecks implements IVDoc { public void setCDetailPicture(final CDetailPicture cDetailPicture) { this.lstDecks = new DeckManager(GameType.Commander, cDetailPicture); - this.lstDecks.setCaption("Commander Decks"); + this.lstDecks.setCaption(localizer.getMessage("lblCommanderDecks")); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java index baed1befa8e..d0b6a7cafef 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java @@ -3,6 +3,7 @@ package forge.screens.deckeditor.views; import javax.swing.JPanel; import javax.swing.SwingConstants; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import forge.assets.FSkinProp; import forge.gui.framework.DragCell; @@ -24,16 +25,17 @@ import forge.toolbox.FTextField; */ public enum VCurrentDeck implements IVDoc { SINGLETON_INSTANCE; + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Current Deck"); + private final DragTab tab = new DragTab(localizer.getMessage("lblVCurrentDeck")); // Other fields private final FLabel btnSave = new FLabel.Builder() .fontSize(14) - .tooltip("Save Deck (Ctrl+S)") + .tooltip(localizer.getMessage("ttbtnSave")) .iconInBackground(true) .iconAlignX(SwingConstants.CENTER) .icon(FSkin.getIcon(FSkinProp.ICO_SAVE)) @@ -41,7 +43,7 @@ public enum VCurrentDeck implements IVDoc { private final FLabel btnSaveAs = new FLabel.Builder() .fontSize(14) - .tooltip("Save Deck As (Ctrl+E)") + .tooltip(localizer.getMessage("ttbtnSaveAs")) .iconInBackground(true) .iconAlignX(SwingConstants.CENTER) .icon(FSkin.getIcon(FSkinProp.ICO_SAVEAS)) @@ -49,7 +51,7 @@ public enum VCurrentDeck implements IVDoc { private final FLabel btnLoad = new FLabel.Builder() .fontSize(14) - .tooltip("Open Deck (Ctrl+O)") + .tooltip(localizer.getMessage("ttbtnLoadDeck")) .iconInBackground(true) .iconAlignX(SwingConstants.CENTER) .icon(FSkin.getIcon(FSkinProp.ICO_OPEN)) @@ -57,7 +59,7 @@ public enum VCurrentDeck implements IVDoc { private final FLabel btnNew = new FLabel.Builder() .fontSize(14) - .tooltip("New Deck (Ctrl+N)") + .tooltip(localizer.getMessage("ttbtnNewDeck")) .iconInBackground(true) .iconAlignX(SwingConstants.CENTER) .icon(FSkin.getIcon(FSkinProp.ICO_NEW)) @@ -65,7 +67,7 @@ public enum VCurrentDeck implements IVDoc { private final FLabel btnPrintProxies = new FLabel.Builder() .fontSize(14) - .tooltip("Print to HTML file (Ctrl+P)") + .tooltip(localizer.getMessage("ttbtnPrintProxies")) .iconInBackground(true) .iconAlignX(SwingConstants.CENTER) .icon(FSkin.getIcon(FSkinProp.ICO_PRINT)) @@ -73,15 +75,15 @@ public enum VCurrentDeck implements IVDoc { private final FLabel btnImport = new FLabel.Builder() .fontSize(14) - .text("Import") - .tooltip("Attempt to import a deck from a non-Forge format (Ctrl+I)") + .text(localizer.getMessage("lblImport")) + .tooltip(localizer.getMessage("ttImportDeck")) .opaque(true).hoverable(true).build(); private final FTextField txfTitle = new FTextField.Builder().ghostText("[New Deck]").build(); private final JPanel pnlHeader = new JPanel(); - private final FLabel lblTitle = new FLabel.Builder().text("Title").fontSize(14).build(); + private final FLabel lblTitle = new FLabel.Builder().text(localizer.getMessage("lblTitle")).fontSize(14).build(); private final ItemManagerContainer itemManagerContainer = new ItemManagerContainer(); private ItemManager itemManager; diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VDeckgen.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VDeckgen.java index 924ffabc641..abd5a3e1108 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VDeckgen.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VDeckgen.java @@ -6,6 +6,7 @@ import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; import forge.screens.deckeditor.controllers.CDeckgen; import forge.toolbox.FLabel; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; /** @@ -16,30 +17,29 @@ import net.miginfocom.swing.MigLayout; public enum VDeckgen implements IVDoc { /** */ SINGLETON_INSTANCE; - // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Deck Generation"); - + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblDeckGeneration")); // Deckgen buttons private final FLabel btnRandCardpool = new FLabel.Builder() - .tooltip("Generate random constructed cardpool in current deck area") - .text("Random Cardpool").fontSize(14) + .tooltip(localizer.getMessage("ttbtnRandCardpool")) + .text(localizer.getMessage("btnRandCardpool")).fontSize(14) .opaque(true).hoverable(true).build(); private final FLabel btnRandDeck2 = new FLabel.Builder() - .tooltip("Generate 2 color constructed deck in current deck area") - .text("Constructed (2 color)").fontSize(14) + .tooltip(localizer.getMessage("ttbtnRandDeck2")) + .text(localizer.getMessage("btnRandDeck2")).fontSize(14) .opaque(true).hoverable(true).build(); private final FLabel btnRandDeck3 = new FLabel.Builder() - .tooltip("Generate 3 color constructed deck in current deck area") - .text("Constructed (3 color)").fontSize(14) + .tooltip(localizer.getMessage("ttbtnRandDeck3")) + .text(localizer.getMessage("btnRandDeck3")).fontSize(14) .opaque(true).hoverable(true).build(); private final FLabel btnRandDeck5 = new FLabel.Builder() - .tooltip("Generate 5 color constructed deck in current deck area") - .text("Constructed (5 color)").fontSize(14) + .tooltip(localizer.getMessage("ttbtnRandDeck5")) + .text(localizer.getMessage("btnRandDeck5")).fontSize(14) .opaque(true).hoverable(true).build(); //========== Constructor diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java index cc824baa017..d52488766f6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java @@ -10,6 +10,7 @@ import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.controllers.CTinyLeadersDecks; import forge.screens.match.controllers.CDetailPicture; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -25,7 +26,8 @@ public enum VTinyLeadersDecks implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Tiny Leaders"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblTinyLeaders")); private DeckManager lstDecks; @@ -93,6 +95,6 @@ public enum VTinyLeadersDecks implements IVDoc { public void setCDetailPicture(final CDetailPicture cDetailPicture) { this.lstDecks = new DeckManager(GameType.TinyLeaders, cDetailPicture); - this.lstDecks.setCaption("Tiny Leaders Decks"); + this.lstDecks.setCaption(localizer.getMessage("lblTinyLeadersDecks")); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index b821d1ec7fb..aba5acb71d0 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -862,7 +862,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private JPanel getPlayerNamePanel() { JPanel p = new JPanel(new MigLayout("insets 0, gap 0!")); p.setOpaque(false); - FLabel lbl = new FLabel.Builder().text("Player Name: ").fontSize(12).fontStyle(Font.BOLD).build(); + FLabel lbl = new FLabel.Builder().text(localizer.getMessage("lblPlayerName") +": ").fontSize(12).fontStyle(Font.BOLD).build(); p.add(lbl, "aligny top, h 100%, gap 4px 0 0 0"); p.add(btnPlayerName, "aligny top, h 100%, w 200px!"); return p; diff --git a/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VWorkshopCatalog.java b/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VWorkshopCatalog.java index 02db9e8d7ca..102cf326cdb 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VWorkshopCatalog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VWorkshopCatalog.java @@ -13,6 +13,7 @@ import forge.screens.match.controllers.CDetailPicture; import forge.screens.workshop.controllers.CCardScript; import forge.screens.workshop.controllers.CWorkshopCatalog; import forge.util.ItemPool; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -27,10 +28,10 @@ import javax.swing.event.ListSelectionListener; */ public enum VWorkshopCatalog implements IVDoc { SINGLETON_INSTANCE; - + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Card Catalog"); + private final DragTab tab = new DragTab(localizer.getMessage("lblCardCatalog")); private final ItemManagerContainer cardManagerContainer = new ItemManagerContainer(); private final CardManager cardManager; private final CDetailPicture cDetailPicture = new CDetailPicture(); @@ -38,7 +39,7 @@ public enum VWorkshopCatalog implements IVDoc { //========== Constructor VWorkshopCatalog() { this.cardManager = new CardManager(cDetailPicture, true, false); - this.cardManager.setCaption("Catalog"); + this.cardManager.setCaption(localizer.getMessage("lblCatalog")); final Iterable allCards = Iterables.concat(FModel.getMagicDb().getCommonCards(), FModel.getMagicDb().getVariantCards()); this.cardManager.setPool(ItemPool.createFrom(allCards, PaperCard.class), true); this.cardManagerContainer.setItemManager(this.cardManager); diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 20dd5d1adf8..27ac3ac67c6 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -7,6 +7,36 @@ splash.loading.decks=Lade Decks... splash.loading.processingimagesprites=Verarbeite Bilddaten #FControl.java lblOpeningMainWindow=Öffne Hauptfenster... +lblCloseScreen=Close Screen +txCloseAction1=Forge now supports navigation tabs which allow closing and switching between different screens with ease. As a result, you no longer need to use the X button in the upper right to close the current screen and go back. +txCloseAction2=Please select what you want to happen when clicking the X button in the upper right. This choice will be used going forward and you will not see this message again. You can change this behavior at any time in Preferences. +titCloseAction=Select Your Close Action +lblAreYouSureYouWishRestartForge=Are you sure you wish restart Forge? +lblAreYouSureYouWishExitForge=Are you sure you wish exit Forge? +lblOneOrMoreGamesActive=One or more games are currently active +lblerrLoadingLayoutFile=Your %s layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout. +lblLoadingQuest=Loading quest... +#FScreen.java +lblHome=Home +lblWorkshop=Workshop +lblBacktoHome=Back to Home +lblDeckEditor=Deck Editor +lblCloseEditor=Close Editor +lblCommanderDeckEditor=Commander Deck Editor +lblTinyLeadersDeckEditor=Tiny Leaders DeckEditor +lblBrawlDeckEditor=Brawl Deck Editor +lblDraftDeckEditor=Draft Deck Editor +lblSealedDeckEditor=Sealed Deck Editor +lblTokenViewer=Token Viewer +lblCloseViewer=Close Viewer +lblQuestDeckEditor=Quest Deck Editor +lblQuestTournamentDeckEditor=Quest Tournament Deck Editor +lblSpellShop=Spell Shop +lblLeaveShop=Leave Shop +lblLeaveDraft=Leave Draft +lblBazaar=Bazaar +lblConcedeGame=Concede Game +txerrFailedtodeletelayoutfile=Failed to delete layout file. #VSubmenuPreferences.java Preferences=Einstellungen btnReset=Alles zurücksetzen @@ -70,7 +100,6 @@ cbUseSentry=Sende automatisch Fehlerberichte cbpGameLogEntryType=Spielberichtsumfang cbpCloseAction=Beenden cbpDefaultFontSize=Standard Schriftgröße -cbpMulliganRule = Mulligan Rule cbpAiProfiles=KI Persönlichkeit cbpDisplayCurrentCardColors=Zeige detailierte Kartenfarben cbpAutoYieldMode=Automatische Bestätigung @@ -79,6 +108,7 @@ cbpCounterDisplayLocation=Markeranzeige Ort cbpGraveyardOrdering=Genaue Reihenfolge im Friedhof einhalten Troubleshooting=Fehlerbehebung GeneralConfiguration=Allgemeine Einstellungen +lblPlayerName=Player Name nlPlayerName=Name unter welchem du beim Spielen geführt wirst. nlCompactMainMenu=Aktiviere, um im Seitenmenü platzsparend immer nur eine Menügruppe anzeigen zu lassen. (Erfordert Neustart) nlUseSentry=Aktiviere, um automatische Fehlerberichte an die Entwickler zu senden. @@ -120,6 +150,7 @@ nlLoadCardsLazily=Wenn aktiviert, lädt Forge Kartenscripte erst wenn sie benöt nlLoadHistoricFormats=Wenn aktiviert, lädt Forge auch ältere Spielformate. Verlängert den Programmstart. GraphicOptions=Grafik Optionen nlDefaultFontSize=Die Standardschriftgröße. Alle Schriftelemente werden werden relative zu dieser angepaßt. (Erfordert Neustart) +cbpMulliganRule=Mulligan Rule nlImageFetcher=Ermöglicht bei bestehender Onlineverbindung das automatisches Nachladen fehlender Kartenbilder. nlDisplayFoil=Zeige FOIL-Karten mit einem optischen FOIL-Effekt. nlRandomFoil=Zeige den FOIL-Effekt bei zufälligen Karten. @@ -659,4 +690,136 @@ lblWinsforNewDraft=Siege für neues Draft-Spiel lblWinsperDraftRotation=Siege pro Draft notwendig ttWinsperDraftRotation=Wenn ein Draft nicht soweit fertig gespielt wird, wird er entfernt oder ersetzt. lblRotationType=Austauschtyp -ttRotationType=Bei 0 verschwinden alte Drafts, bei 1 wird er duch einen neuen ersetzt. \ No newline at end of file +ttRotationType=Bei 0 verschwinden alte Drafts, bei 1 wird er duch einen neuen ersetzt. +#StatTypeFilter.java +lblclicktotoogle=click to toggle the filter, right-click to show only +#SItemManagerUtil.java +lblWhitecards=White cards +lblBluecards=Blue cards +lblBlackcards=Black cards +lblRedcards=Red cards +lblGreencards=Green cards +lblColorlesscards=Colorless cards +lblMulticolorcards=Multicolor cards +lblPackordeck=Card packs and prebuilt decks +lblLands=Lands +lblArtifacts=Artifacts +lblCreatures=Creatures +lblEnchantments=Enchantments +lblPlaneswalkers=Planeswalkers +lblInstants=Instants +lblSorceries=Sorceries +lblCCMC0=Cards with CMC 0 +lblCCMC1=Cards with CMC 1 +lblCCMC2=Cards with CMC 2 +lblCCMC3=Cards with CMC 3 +lblCCMC4=Cards with CMC 4 +lblCCMC5=Cards with CMC 5 +lblCCMC6orMore=Cards with CMC 6 +lblWhitedecks=White decks +lblBluedecks=Blue decks +lblBlackdecks=Black decks +lblReddecks=Red decks +lblGreendecks=Green decks +lblColorlessdecks=Colorless decks +lblMulticolordecks=Multicolor decks +lblOldstyleFoilcards=Old style Foil cards +lblNewstyleFoilcards=New style Foil cards +lblNon-Foilcards=Non-Foil cards +lblUnratedcards=Unrated cards +lbl1starcards=1 star cards +lbl2starcards=2 star cards +lbl3starcards=3 star cards +lbl4starcards=4 star cards +lbl5starcards=5 star cards +lblXcopiesof=X copies of +lblcopiesof=copies of +#ACEditorBase.java +lblAddcard=Add card +ttAddcard=Add selected card to current deck (or double click the row or hit the spacebar) +lblAdd4ofcard=Add 4 of card +ttAdd4ofcard=Add up to 4 of selected card to current deck +lblRemovecard=Remove card +ttRemovecard=Remove selected card from current deck (or double click the row or hit the spacebar) +lblRemove4ofcard=Remove 4 of card +ttRemove4ofcard=Remove up to 4 of selected card to current deck +lblAddBasicLands=Add Basic Lands +ttAddBasicLands=Add basic lands to the deck +lblCardCatalog=Card Catalog +lblJumptoprevioustable=Jump to previous table +lblJumptopnexttable=Jump to next table +lblJumptotextfilter=Jump to text filter +lblChooseavalueforX=Choose a value for X +#VCurrentDeck.java +lblVCurrentDeck=Current Deck +ttbtnSave=Save Deck (Ctrl+S) +ttbtnSaveAs=Save Deck As (Ctrl+E) +ttbtnLoadDeck=Open Deck (Ctrl+O) +ttbtnNewDeck=New Deck (Ctrl+N) +ttbtnPrintProxies=Print to HTML file (Ctrl+P) +lblImport=Import +ttImportDeck=Attempt to import a deck from a non-Forge format (Ctrl+I) +lblTitle=Title +#ImageView.java +lblExpandallgroups=Expand all groups +lblCollapseallgroups=Collapse all groups +lblGroupby=group by +lblPileby=pile by +lblColumns=Columns +#CEditorVariant.java +lblCatalog=Catalog +lblAdd=Add +lbltodeck=to deck +lblfromdeck=from deck +lbltosideboard=to sideboard +lblfromsideboard=from sideboard +lblascommander=as commander +lblasavatar=as avatar +lblfromschemedeck=from scheme deck +lblfromplanardeck=from planar deck +lblfromconspiracydeck=from conspiracy deck +#GroupDef.java +lblColor=Color +lblColorIdentity=Color Identity +lblSet=Set +lblDefault=Default +lblType=Type +lblPlaneswalkerDeckSort=Planeswalker Deck Sort +lblRarity=Rarity +lblConvertToFoil=Foil +lblMulticolor=Multicolor +#DeckFileMenu.java +lblNewDeck=New Deck +lblOpenDeck=Open Deck +lblImportDeck=Import Deck +lblSaveDeck=Save Deck +lblSaveDeckAs=Save Deck As... +lblPrinttoHTMLfile=Print to HTML file +#PaperCard.java +lblCard=Carta +#CardManager.java +lblFormat=Format +lblFormats=Formats +lblQuestWorld=Quest World +lblSets=Sets +lblTypes=Types +lblConvertedManaCosts=Converted mana +lblCMCRange=CMC Range +lblPowerRange=Power Range +lblToughnessRange=Toughness Range +lblFoil=Foil +lblPersonalRating=Personal Rating +lblAdvanced=Advanced +#VDeckgen.java +lblDeckGeneration=Deck Generation +btnRandCardpool=Random Cardpool +ttbtnRandCardpool=Generate random constructed cardpool in current deck area +btnRandDeck2=Constructed (2 color) +ttbtnRandDeck2=Generate 2 color constructed deck in current deck area +btnRandDeck3=Constructed (3 color) +ttbtnRandDeck3=Generate 3 color constructed deck in current deck area +btnRandDeck5=Constructed (5 color) +ttbtnRandDeck5=Generate 5 color constructed deck in current deck area +#DeckCotroller.java +lblCurrentDeck2=Current Deck +lblUntitled=Untitled diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 82a6fc7b49a..e88eebc9dd2 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1,222 +1,253 @@ -language.name = English (US) +language.name=English (US) #SplashScreen.java -splash.loading.examining-cards = Loading cards, examining folder -splash.loading.cards-folders = Loading cards from folders -splash.loading.cards-archive = Loading cards from archive -splash.loading.decks = Loading decks... +splash.loading.examining-cards=Loading cards, examining folder +splash.loading.cards-folders=Loading cards from folders +splash.loading.cards-archive=Loading cards from archive +splash.loading.decks=Loading decks... splash.loading.processingimagesprites=Processing image sprites #FControl.java lblOpeningMainWindow=Opening main window... +lblCloseScreen=Close Screen +txCloseAction1=Forge now supports navigation tabs which allow closing and switching between different screens with ease. As a result, you no longer need to use the X button in the upper right to close the current screen and go back. +txCloseAction2=Please select what you want to happen when clicking the X button in the upper right. This choice will be used going forward and you will not see this message again. You can change this behavior at any time in Preferences. +titCloseAction=Select Your Close Action +lblAreYouSureYouWishRestartForge=Are you sure you wish restart Forge? +lblAreYouSureYouWishExitForge=Are you sure you wish exit Forge? +lblOneOrMoreGamesActive=One or more games are currently active +lblerrLoadingLayoutFile=Your %s layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout. +lblLoadingQuest=Loading quest... +#FScreen.java +lblHome=Home +lblWorkshop=Workshop +lblBacktoHome=Back to Home +lblDeckEditor=Deck Editor +lblCloseEditor=Close Editor +lblCommanderDeckEditor=Commander Deck Editor +lblTinyLeadersDeckEditor=Tiny Leaders DeckEditor +lblBrawlDeckEditor=Brawl Deck Editor +lblDraftDeckEditor=Draft Deck Editor +lblSealedDeckEditor=Sealed Deck Editor +lblTokenViewer=Token Viewer +lblCloseViewer=Close Viewer +lblQuestDeckEditor=Quest Deck Editor +lblQuestTournamentDeckEditor=Quest Tournament Deck Editor +lblSpellShop=Spell Shop +lblLeaveShop=Leave Shop +lblLeaveDraft=Leave Draft +lblBazaar=Bazaar +lblConcedeGame=Concede Game +txerrFailedtodeletelayoutfile=Failed to delete layout file. #VSubmenuPreferences.java -Preferences = Preferences -btnReset = Reset to Default Settings -btnDeleteMatchUI = Reset Match Layout -btnDeleteEditorUI = Reset Editor Layout -btnDeleteWorkshopUI = Reset Workshop Layout -btnUserProfileUI = Open User Directory -btnContentDirectoryUI = Open Content Directory -btnResetJavaFutureCompatibilityWarnings = Reset Java Compatibility Warnings -btnClearImageCache = Clear Image Cache -btnTokenPreviewer = Token Previewer -btnCopyToClipboard= Copy to Clipboard +Preferences=Preferences +btnReset=Reset to Default Settings +btnDeleteMatchUI=Reset Match Layout +btnDeleteEditorUI=Reset Editor Layout +btnDeleteWorkshopUI=Reset Workshop Layout +btnUserProfileUI=Open User Directory +btnContentDirectoryUI=Open Content Directory +btnResetJavaFutureCompatibilityWarnings=Reset Java Compatibility Warnings +btnClearImageCache=Clear Image Cache +btnTokenPreviewer=Token Previewer +btnCopyToClipboard=Copy to Clipboard cbpSelectLanguage=Language nlSelectLanguage=Select Language (Excluded Game part. Still a work in progress) (RESTART REQUIRED) -cbRemoveSmall = Remove Small Creatures -cbCardBased = Include Card-based Deck Generation -cbSingletons = Singleton Mode -cbRemoveArtifacts = Remove Artifacts -cbAnte = Play for Ante -cbAnteMatchRarity = Match Ante Rarity -cbEnableAICheats = Allow AI Cheating -cbManaBurn = Mana Burn -cbManaLostPrompt = Prompt Mana Pool Emptying -cbDevMode = Developer Mode -cbLoadCardsLazily = Load Card Scripts Lazily -cbLoadHistoricFormats = Load Historic Formats -cbWorkshopSyntax = Workshop Syntax Checker -cbEnforceDeckLegality = Deck Conformance -cbSideboardForAI = Human Sideboard for AI -cbPerformanceMode = Performance Mode -cbFilteredHands = Filtered Hands -cbImageFetcher = Automatically Download Missing Card Art -cbCloneImgSource = Clones Use Original Card Art -cbScaleLarger = Scale Image Larger -cbRenderBlackCardBorders = Render Black Card Borders -cbLargeCardViewers = Use Large Card Viewers -cbSmallDeckViewer = Use Small Deck Viewer -cbDisplayFoil = Display Foil Overlay -cbRandomFoil = Random Foil -cbRandomArtInPools = Randomize Card Art in Generated Card Pools -cbEnableSounds = Enable Sounds -cbEnableMusic = Enable Music -cbAltSoundSystem = Use Alternate Sound System -cbUiForTouchScreen = Enhance UI for Touchscreens -cbTimedTargOverlay = Enable Targeting Overlay Optimization -cbCompactMainMenu = Use Compact Main Sidebar Menu -cbDetailedPaymentDesc = Spell Description in Payment Prompt -cbPromptFreeBlocks = Free Block Handling -cbPauseWhileMinimized = Pause While Minimized -cbCompactPrompt = Compact Prompt -cbEscapeEndsTurn = Use Escape Key to End Turn -cbPreselectPrevAbOrder = Preselect Last Order of Abilities -cbHideReminderText = Hide Reminder Text -cbOpenPacksIndiv = Open Packs Individually -cbTokensInSeparateRow = Display Tokens in a Separate Row -cbStackCreatures = Stack Creatures -cbFilterLandsByColorId = Filter Lands by Color in Activated Abilities -cbShowStormCount = Show Storm Count in Prompt Pane -cbRemindOnPriority = Visually Alert on Receipt of Priority -cbUseSentry = Automatically submit bug reports. -cbpGameLogEntryType = Game Log Verbosity -cbpCloseAction = Close Action -cbpDefaultFontSize = Default Font Size +cbRemoveSmall=Remove Small Creatures +cbCardBased=Include Card-based Deck Generation +cbSingletons=Singleton Mode +cbRemoveArtifacts=Remove Artifacts +cbAnte=Play for Ante +cbAnteMatchRarity=Match Ante Rarity +cbEnableAICheats=Allow AI Cheating +cbManaBurn=Mana Burn +cbManaLostPrompt=Prompt Mana Pool Emptying +cbDevMode=Developer Mode +cbLoadCardsLazily=Load Card Scripts Lazily +cbLoadHistoricFormats=Load Historic Formats +cbWorkshopSyntax=Workshop Syntax Checker +cbEnforceDeckLegality=Deck Conformance +cbSideboardForAI=Human Sideboard for AI +cbPerformanceMode=Performance Mode +cbFilteredHands=Filtered Hands +cbImageFetcher=Automatically Download Missing Card Art +cbCloneImgSource=Clones Use Original Card Art +cbScaleLarger=Scale Image Larger +cbRenderBlackCardBorders=Render Black Card Borders +cbLargeCardViewers=Use Large Card Viewers +cbSmallDeckViewer=Use Small Deck Viewer +cbDisplayFoil=Display Foil Overlay +cbRandomFoil=Random Foil +cbRandomArtInPools=Randomize Card Art in Generated Card Pools +cbEnableSounds=Enable Sounds +cbEnableMusic=Enable Music +cbAltSoundSystem=Use Alternate Sound System +cbUiForTouchScreen=Enhance UI for Touchscreens +cbTimedTargOverlay=Enable Targeting Overlay Optimization +cbCompactMainMenu=Use Compact Main Sidebar Menu +cbDetailedPaymentDesc=Spell Description in Payment Prompt +cbPromptFreeBlocks=Free Block Handling +cbPauseWhileMinimized=Pause While Minimized +cbCompactPrompt=Compact Prompt +cbEscapeEndsTurn=Use Escape Key to End Turn +cbPreselectPrevAbOrder=Preselect Last Order of Abilities +cbHideReminderText=Hide Reminder Text +cbOpenPacksIndiv=Open Packs Individually +cbTokensInSeparateRow=Display Tokens in a Separate Row +cbStackCreatures=Stack Creatures +cbFilterLandsByColorId=Filter Lands by Color in Activated Abilities +cbShowStormCount=Show Storm Count in Prompt Pane +cbRemindOnPriority=Visually Alert on Receipt of Priority +cbUseSentry=Automatically submit bug reports. +cbpGameLogEntryType=Game Log Verbosity +cbpCloseAction=Close Action +cbpDefaultFontSize=Default Font Size +cbpAiProfiles=AI Personality +cbpDisplayCurrentCardColors=Show Detailed Card Color +cbpAutoYieldMode=Auto-Yield +cbpCounterDisplayType=Counter Display Type +cbpCounterDisplayLocation=Counter Display Location +cbpGraveyardOrdering=Allow Ordering Cards Put in Graveyard +Troubleshooting=Troubleshooting +GeneralConfiguration=General Configuration +lblPlayerName=Player Name +nlPlayerName=Sets the name that you will be referred to by Forge during gameplay. +nlCompactMainMenu=Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED). +nlUseSentry=When enabled, automatically submits bug reports to developers. +GamePlay=Gameplay +nlpMulliganRule=Choose the version of the Mulligan rule +nlpAiProfiles=Choose your AI opponent +nlAnte=Determines whether or not the game is played for ante. +nlAnteMatchRarity=Attempts to make antes the same rarity for all players. +nlEnableAICheats=Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set). +nlManaBurn=Play with mana burn (from pre-Magic 2010 rules). +nlManaLostPrompt=When enabled, you get a warning if passing priority would cause you to lose mana in your mana pool. +nlEnforceDeckLegality=Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc). +nlSideboardForAI=Allows users to sideboard with the AIs deck and sideboard in constructed game formats. +nlPerformanceMode=Disables additional static abilities checks to speed up the game engine. (Warning: breaks some 'as if had flash' scenarios when casting cards owned by opponents). +nlFilteredHands=Generates two starting hands and keeps the one with the closest to average land count for the deck. (Requires restart) +nlCloneImgSource=When enabled clones will use their original art instead of the cloned card's art. +nlPromptFreeBlocks=When enabled, if you would have to pay 0 to block, pay automatically without prompt. +nlPauseWhileMinimized=When enabled, Forge pauses when minimized (primarily for AI vs AI). +nlEscapeEndsTurn=When enabled, Escape key functions as an alternative shortcut to end the current turn. +nlDetailedPaymentDesc=When enabled, detailed spell/ability descriptions are shown when choosing targets and paying costs. +nlShowStormCount=When enabled, displays the current storm count in the prompt pane. +nlRemindOnPriority=When enabled, flashes the player choice area upon receiving priority. +nlPreselectPrevAbOrder=When enabled, preselects the last defined simultaneous ability order in the ordering dialog. +nlpGraveyardOrdering=Determines when to let the player choose the order of cards simultaneously put in graveyard (never, always, or only when playing with cards for which it matters, for example, Volrath's Shapeshifter). +nlpAutoYieldMode=Defines the granularity level of auto-yields (per unique ability or per unique card). +RandomDeckGeneration=Random Deck Generation +nlRemoveSmall=Disables 1/1 and 0/X creatures in generated decks +nlSingletons=Disables non-land duplicates in generated decks +nlRemoveArtifacts=Disables artifact cards in generated decks +nlCardBased=Builds more synergistic random decks (requires restart) +DeckEditorOptions=Deck Editor Options +nlFilterLandsByColorId=When using card color filters, filter lands in a way to make it easier to find relevant mana producing lands. +AdvancedSettings=Advanced Settings +nlDevMode=Enables menu with functions for testing during development. +nlWorkshopSyntax=Enables syntax checking of card scripts in the Workshop. Note: functionality still in testing phase! +nlGameLogEntryType=Changes how much information is displayed in the game log. Sorted by least to most verbose. +nlCloseAction=Changes what happens when clicking the X button in the upper right. +nlLoadCardsLazily=If turned on, Forge will load card scripts as they're needed instead of at start up. (Warning: Experimental) +nlLoadHistoricFormats=If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup. +GraphicOptions=Graphic Options +nlDefaultFontSize=The default font size within the UI. All font elements are scaled relative to this. (Needs restart) cbpMulliganRule = Mulligan Rule -cbpAiProfiles = AI Personality -cbpDisplayCurrentCardColors = Show Detailed Card Color -cbpAutoYieldMode = Auto-Yield -cbpCounterDisplayType = Counter Display Type -cbpCounterDisplayLocation = Counter Display Location -cbpGraveyardOrdering = Allow Ordering Cards Put in Graveyard -Troubleshooting = Troubleshooting -GeneralConfiguration = General Configuration -nlPlayerName = Sets the name that you will be referred to by Forge during gameplay. -nlCompactMainMenu = Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED). -nlUseSentry = When enabled, automatically submits bug reports to developers. -GamePlay = Gameplay -nlpMulliganRule = Choose the version of the Mulligan rule -nlpAiProfiles = Choose your AI opponent -nlAnte = Determines whether or not the game is played for ante. -nlAnteMatchRarity = Attempts to make antes the same rarity for all players. -nlEnableAICheats = Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set). -nlManaBurn = Play with mana burn (from pre-Magic 2010 rules). -nlManaLostPrompt = When enabled, you get a warning if passing priority would cause you to lose mana in your mana pool. -nlEnforceDeckLegality = Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc). -nlSideboardForAI = Allows users to sideboard with the AIs deck and sideboard in constructed game formats. -nlPerformanceMode = Disables additional static abilities checks to speed up the game engine. (Warning: breaks some 'as if had flash' scenarios when casting cards owned by opponents). -nlFilteredHands = Generates two starting hands and keeps the one with the closest to average land count for the deck. (Requires restart) -nlCloneImgSource = When enabled clones will use their original art instead of the cloned card's art. -nlPromptFreeBlocks = When enabled, if you would have to pay 0 to block, pay automatically without prompt. -nlPauseWhileMinimized = When enabled, Forge pauses when minimized (primarily for AI vs AI). -nlEscapeEndsTurn = When enabled, Escape key functions as an alternative shortcut to end the current turn. -nlDetailedPaymentDesc = When enabled, detailed spell/ability descriptions are shown when choosing targets and paying costs. -nlShowStormCount = When enabled, displays the current storm count in the prompt pane. -nlRemindOnPriority = When enabled, flashes the player choice area upon receiving priority. -nlPreselectPrevAbOrder = When enabled, preselects the last defined simultaneous ability order in the ordering dialog. -nlpGraveyardOrdering = Determines when to let the player choose the order of cards simultaneously put in graveyard (never, always, or only when playing with cards for which it matters, for example, Volrath's Shapeshifter). -nlpAutoYieldMode = Defines the granularity level of auto-yields (per unique ability or per unique card). -RandomDeckGeneration = Random Deck Generation -nlRemoveSmall = Disables 1/1 and 0/X creatures in generated decks -nlSingletons = Disables non-land duplicates in generated decks -nlRemoveArtifacts = Disables artifact cards in generated decks -nlCardBased = Builds more synergistic random decks (requires restart) -DeckEditorOptions = Deck Editor Options -nlFilterLandsByColorId = When using card color filters, filter lands in a way to make it easier to find relevant mana producing lands. -AdvancedSettings = Advanced Settings -nlDevMode = Enables menu with functions for testing during development. -nlWorkshopSyntax = Enables syntax checking of card scripts in the Workshop. Note: functionality still in testing phase! -nlGameLogEntryType = Changes how much information is displayed in the game log. Sorted by least to most verbose. -nlCloseAction = Changes what happens when clicking the X button in the upper right. -nlLoadCardsLazily = If turned on, Forge will load card scripts as they're needed instead of at start up. (Warning: Experimental) -nlLoadHistoricFormats = If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup. -GraphicOptions = Graphic Options -nlDefaultFontSize = The default font size within the UI. All font elements are scaled relative to this. (Needs restart) -nlImageFetcher = Enables live fetching of missing card images from an online resource. -nlDisplayFoil = Displays foil cards with the visual foil overlay effect. -nlRandomFoil = Adds foil effect to random cards. -nlScaleLarger = Allows card pictures to be expanded larger than their original size. -nlRenderBlackCardBorders = Render black borders around card images. -nlLargeCardViewers = Makes all card viewers much larger for use with high resolution images. Will not fit on smaller screens. -nlSmallDeckViewer = Sets the deck viewer window to be 800x600 rather than a proportion of the screen size. -nlRandomArtInPools = Generates cards with random art in generated limited mode card pools. -nlUiForTouchScreen = Increases some UI elements to provide a better experience on touchscreen devices. (Needs restart) -nlCompactPrompt = Hide header and use smaller font in Prompt pane to make it more compact. -nlHideReminderText = Hide reminder text in Card Detail pane. -nlOpenPacksIndiv = When opening Fat Packs and Booster Boxes, booster packs will be opened and displayed one at a time. -nlTokensInSeparateRow = Displays tokens in a separate row on the battlefield below the non-token creatures. -nlStackCreatures = Stacks identical creatures on the battlefield like lands, artifacts, and enchantments. -nlTimedTargOverlay = Enables throttling-based optimization of targeting overlay to reduce CPU use (only disable if you experience choppiness on older hardware, requires starting a new match). -nlCounterDisplayType = Selects the style of the in-game counter display for cards. Text-based is a new tab-like display on the cards. Image-based is the old counter image. Hybrid displays both at once. -nlCounterDisplayLocation = Determines where to position the text-based counters on the card: close to the top or close to the bottom. -nlDisplayCurrentCardColors = Displays the breakdown of the current color of cards in the card detail information panel. -SoundOptions = Sound Options -nlEnableSounds = Enable sound effects during the game -nlEnableMusic = Enable background music during the game -nlAltSoundSystem = Use the alternate sound system (only use if you have issues with sound not playing or disappearing) -KeyboardShortcuts = Keyboard Shortcuts +nlImageFetcher=Enables live fetching of missing card images from an online resource. +nlDisplayFoil=Displays foil cards with the visual foil overlay effect. +nlRandomFoil=Adds foil effect to random cards. +nlScaleLarger=Allows card pictures to be expanded larger than their original size. +nlRenderBlackCardBorders=Render black borders around card images. +nlLargeCardViewers=Makes all card viewers much larger for use with high resolution images. Will not fit on smaller screens. +nlSmallDeckViewer=Sets the deck viewer window to be 800x600 rather than a proportion of the screen size. +nlRandomArtInPools=Generates cards with random art in generated limited mode card pools. +nlUiForTouchScreen=Increases some UI elements to provide a better experience on touchscreen devices. (Needs restart) +nlCompactPrompt=Hide header and use smaller font in Prompt pane to make it more compact. +nlHideReminderText=Hide reminder text in Card Detail pane. +nlOpenPacksIndiv=When opening Fat Packs and Booster Boxes, booster packs will be opened and displayed one at a time. +nlTokensInSeparateRow=Displays tokens in a separate row on the battlefield below the non-token creatures. +nlStackCreatures=Stacks identical creatures on the battlefield like lands, artifacts, and enchantments. +nlTimedTargOverlay=Enables throttling-based optimization of targeting overlay to reduce CPU use (only disable if you experience choppiness on older hardware, requires starting a new match). +nlCounterDisplayType=Selects the style of the in-game counter display for cards. Text-based is a new tab-like display on the cards. Image-based is the old counter image. Hybrid displays both at once. +nlCounterDisplayLocation=Determines where to position the text-based counters on the card: close to the top or close to the bottom. +nlDisplayCurrentCardColors=Displays the breakdown of the current color of cards in the card detail information panel. +SoundOptions=Sound Options +nlEnableSounds=Enable sound effects during the game +nlEnableMusic=Enable background music during the game +nlAltSoundSystem=Use the alternate sound system (only use if you have issues with sound not playing or disappearing) +KeyboardShortcuts=Keyboard Shortcuts # VSubmenuAchievements.java -Achievements = Achievements +Achievements=Achievements # VSubmenuDownloaders.java -btnDownloadSetPics = Download LQ Set Pictures -btnDownloadPics = Download LQ Card Pictures -btnDownloadQuestImages = Download Quest Images -btnDownloadAchievementImages = Download Achievement Images -btnReportBug =Report a Bug -btnListImageData =Audit Card and Image Data -lblListImageData = Audit cards not implemented by Forge and missing card images -btnImportPictures = Import Data -btnHowToPlay = How To Play -btnDownloadPrices = Download Card Prices -btnLicensing = License Details -lblDownloadPics = Download default card picture for each card. -lblDownloadSetPics = Download all pictures of each card (one for each set the card appeared in) -lblDownloadQuestImages = Download tokens and icons used in Quest mode. -lblDownloadAchievementImages = Download achievement images to really make your trophies stand out. -lblDownloadPrices = Download up-to-date price list for in-game card shops. -lblYourVersionOfJavaIsTooOld = Your version of Java is too old to use the content downloaders. -lblPleaseUpdateToTheLatestVersionOfJava = Please update to the latest version of Java -lblYoureRunning = You're running -lblYouNeedAtLeastJavaVersion = You need at least version 1.8.0_101. -lblImportPictures = Import data from a local directory. -lblReportBug = Something broken? -lblHowToPlay = Rules of the Game. -lblLicensing = Forge legal. -ContentDownloaders = Content Downloaders -ReleaseNotes = Release Notes +btnDownloadSetPics=Download LQ Set Pictures +btnDownloadPics=Download LQ Card Pictures +btnDownloadQuestImages=Download Quest Images +btnDownloadAchievementImages=Download Achievement Images +btnReportBug=Report a Bug +btnListImageData=Audit Card and Image Data +lblListImageData=Audit cards not implemented by Forge and missing card images +btnImportPictures=Import Data +btnHowToPlay=How To Play +btnDownloadPrices=Download Card Prices +btnLicensing=License Details +lblDownloadPics=Download default card picture for each card. +lblDownloadSetPics=Download all pictures of each card (one for each set the card appeared in) +lblDownloadQuestImages=Download tokens and icons used in Quest mode. +lblDownloadAchievementImages=Download achievement images to really make your trophies stand out. +lblDownloadPrices=Download up-to-date price list for in-game card shops. +lblYourVersionOfJavaIsTooOld=Your version of Java is too old to use the content downloaders. +lblPleaseUpdateToTheLatestVersionOfJava=Please update to the latest version of Java +lblYoureRunning=You're running +lblYouNeedAtLeastJavaVersion=You need at least version 1.8.0_101. +lblImportPictures=Import data from a local directory. +lblReportBug=Something broken? +lblHowToPlay=Rules of the Game. +lblLicensing=Forge legal. +ContentDownloaders=Content Downloaders +ReleaseNotes=Release Notes # CSubmenuPreferences.java -CantChangeDevModeWhileNetworkMath = Can't change DEV_MODE while a network match is in progress! -CompatibilityWarningsReEnabled = Compatibility warnings re-enabled! -AresetForgeSettingsToDefault = This will reset all preferences to their defaults and restart Forge.\n\n Reset and restart Forge? -TresetForgeSettingsToDefault =Reset Settings -AresetDeckEditorLayout =This will reset the Deck Editor screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? -TresetDeckEditorLayout =Reset Deck Editor Layout +CantChangeDevModeWhileNetworkMath=Can't change DEV_MODE while a network match is in progress! +CompatibilityWarningsReEnabled=Compatibility warnings re-enabled! +AresetForgeSettingsToDefault=This will reset all preferences to their defaults and restart Forge.\n\n Reset and restart Forge? +TresetForgeSettingsToDefault=Reset Settings +AresetDeckEditorLayout=This will reset the Deck Editor screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? +TresetDeckEditorLayout=Reset Deck Editor Layout OKresetDeckEditorLayout=Deck Editor layout has been reset. -AresetWorkshopLayout = This will reset the Workshop screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? -TresetWorkshopLayout = Reset Workshop Layout -OKresetWorkshopLayout = Workshop layout has been reset. -AresetMatchScreenLayout = This will reset the layout of the Match screen.\n If you want to save the current layout first, please use the Dock tab -> Save Layout option in the Match screen.\n\n Reset layout? -TresetMatchScreenLayout = Reset Match Screen Layout -OKresetMatchScreenLayout = Match Screen layout has been reset. +AresetWorkshopLayout=This will reset the Workshop screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? +TresetWorkshopLayout=Reset Workshop Layout +OKresetWorkshopLayout=Workshop layout has been reset. +AresetMatchScreenLayout=This will reset the layout of the Match screen.\n If you want to save the current layout first, please use the Dock tab -> Save Layout option in the Match screen.\n\n Reset layout? +TresetMatchScreenLayout=Reset Match Screen Layout +OKresetMatchScreenLayout=Match Screen layout has been reset. #EMenuGroup.java -lblSanctionedFormats= Sanctioned Formats -lblOnlineMultiplayer = Online Multiplayer -lblQuestMode = Quest Mode -lblPuzzleMode = Puzzle Mode -lblGauntlets = Gauntlets -lblGameSettings = Game Settings +lblSanctionedFormats=Sanctioned Formats +lblOnlineMultiplayer=Online Multiplayer +lblQuestMode=Quest Mode +lblPuzzleMode=Puzzle Mode +lblGauntlets=Gauntlets +lblGameSettings=Game Settings #VLobby.java lblHeaderConstructedMode=Sanctioned Format: Constructed lblGetNewRandomName=Get new random name lbltypeofName=What type of name do you want to generate? -lblconfirmName= Would you like to use the name %s, or try again? +lblconfirmName=Would you like to use the name %s, or try again? lblUseThisName=Use this name lblTryAgain=Try Again lblAddAPlayer=Add a Player lblVariants=Variants #VSubmenuConstructed.java -lblConstructedMode = Constructed Mode -lblConstructed = Constructed +lblConstructedMode=Constructed Mode +lblConstructed=Constructed #PlayerPanel.java lblSelectaDeck=Select a deck lblSelectaSchemeDeck=Select a scheme deck lblSchemeDeckEditor=Scheme Deck Editor lblSelectaCommanderDeck=Select a Commander deck -lblSelectaPlanarDeck = Select a planar deck -lblPlanarDeckEditor = Planar Deck Editor -lblSelectaVanguardAvatar = Select a Vanguard avatar -lblVanguardAvatar = Vanguard avatar +lblSelectaPlanarDeck=Select a planar deck +lblPlanarDeckEditor=Planar Deck Editor +lblSelectaVanguardAvatar=Select a Vanguard avatar +lblVanguardAvatar=Vanguard avatar lblDeck=Deck lblSchemeDeck=Scheme Deck -lblCommanderDeck= Commander Deck +lblCommanderDeck=Commander Deck lblPlanarDeck=Planar Deck lblVanguard=Vanguard lblHuman=Human @@ -229,8 +260,8 @@ lblHeroes=Heroes lblRemove=Remove ttlblAvatar=L-click: Select avatar. R-click: Randomize avatar. lblReady=Ready -lblKick = Kick -lblReallyKick = Really Kick %s? +lblKick=Kick +lblReallyKick=Really Kick %s? #ForgeMenu.java lblRestart=Restart lblExit=Exit @@ -267,7 +298,7 @@ lblOff=Off lblCardMouseOver=Card Mouseover lblAlwaysOn=Always On lblAutoYields=Auto-Yields -lblDeckList = Deck List +lblDeckList=Deck List lblClose=Close lblExitForge=Exit Forge #ConstructedGameMenu.java @@ -285,7 +316,7 @@ lblIsGoingFirst=is going first lblYouAreGoing=you are going lblMulligan=Mulligan lblDoYouWantToKeepYourHand=Do you want to keep your hand? -lblReturnForLondon=Return %s of %s card(s) to bottom of library +lblReturnForLondon=Return %n card(s) to bottom of library lblOk=Ok lblReset=Reset lblAuto=Auto @@ -311,7 +342,7 @@ lblSHORTCUT_MACRO_RECORD=Match: record a macro sequence of actions lblSHORTCUT_MACRO_NEXT_ACTION=Match: execute next action in a recorded macro lblSHORTCUT_CARD_ZOOM=Match: zoom the currently selected card #VSubmenuDraft.java -lblBoosterDraft= Booster Draft +lblBoosterDraft=Booster Draft lblHeaderBoosterDraft=Sanctioned Format: Booster Draft lblPlayAnOpponent=Play an opponent lblPlayAll7opponents=Play all 7 opponents @@ -358,7 +389,7 @@ lblBrawl=Brawl lblBrawlDesc=Each player has a legendary \"General\" card which can be cast at any time and determines deck colors. Only cards legal in Standard may be used. lblPlaneswalker=Planeswalker lblPlaneswalkerDesc=Each player has a Planeswalker card which can be cast at any time. -lblPlanechase =Planechase +lblPlanechase=Planechase lblPlanechaseDesc=Plane cards apply global effects. The Plane card changes when a player rolls \"Planeswalk\" on the planar die. lblArchenemyDesc=One player is the Archenemy and fights the other players by playing Scheme cards. lblArchenemyRumble=Archenemy Rumble @@ -381,7 +412,7 @@ cbSummonPlant=Summon Plant cbLaunchZeppelin=Launch Zeppelin #VSubmenuQuest.java lblQuestData=Quest Data -lblLoadQuestData =Load Quest Data +lblLoadQuestData=Load Quest Data lblStartanewQuest=Start a new Quest lblOldQuestData=Old quest data? Put into %s and restart Forge. rbEasy=Easy @@ -403,7 +434,7 @@ lblAllowDuplicateCards=Allow duplicate cards lblStartingPoolDistribution=Starting pool distribution lblChooseDistribution=Choose Distribution lblPrizedCards=Prized cards -lblAllCardsAvailableWin =All cards will be available to win. +lblAllCardsAvailableWin=All cards will be available to win. lblOnlySetsInStarting=Only sets in starting pool will be available. lblAllowUnlockAdEd=Allow unlock of additional editions lblEmbark=Embark! @@ -659,4 +690,136 @@ lblWinsforNewDraft=Wins for New Draft lblWinsperDraftRotation=Wins per Draft Rotation ttWinsperDraftRotation=If a Draft is not played for this many match wins, it will be removed or replaced. lblRotationType=Rotation Type -ttRotationType =If set to 0, old drafts disappear, if set to 1, they are replaced with another one using different sets. +ttRotationType=If set to 0, old drafts disappear, if set to 1, they are replaced with another one using different sets. +#StatTypeFilter.java +lblclicktotoogle=click to toggle the filter, right-click to show only +#SItemManagerUtil.java +lblWhitecards=White cards +lblBluecards=Blue cards +lblBlackcards=Black cards +lblRedcards=Red cards +lblGreencards=Green cards +lblColorlesscards=Colorless cards +lblMulticolorcards=Multicolor cards +lblPackordeck=Card packs and prebuilt decks +lblLands=Lands +lblArtifacts=Artifacts +lblCreatures=Creatures +lblEnchantments=Enchantments +lblPlaneswalkers=Planeswalkers +lblInstants=Instants +lblSorceries=Sorceries +lblCCMC0=Cards with CMC 0 +lblCCMC1=Cards with CMC 1 +lblCCMC2=Cards with CMC 2 +lblCCMC3=Cards with CMC 3 +lblCCMC4=Cards with CMC 4 +lblCCMC5=Cards with CMC 5 +lblCCMC6orMore=Cards with CMC 6+ +lblWhitedecks=White decks +lblBluedecks=Blue decks +lblBlackdecks=Black decks +lblReddecks=Red decks +lblGreendecks=Green decks +lblColorlessdecks=Colorless decks +lblMulticolordecks=Multicolor decks +lblOldstyleFoilcards=Old style Foil cards +lblNewstyleFoilcards=New style Foil cards +lblNon-Foilcards=Non-Foil cards +lblUnratedcards=Unrated cards +lbl1starcards=1 star cards +lbl2starcards=2 star cards +lbl3starcards=3 star cards +lbl4starcards=4 star cards +lbl5starcards=5 star cards +lblXcopiesof=X copies of +lblcopiesof=copies of +#ACEditorBase.java +lblAddcard=Add card +ttAddcard=Add selected card to current deck (or double click the row or hit the spacebar) +lblAdd4ofcard=Add 4 of card +ttAdd4ofcard=Add up to 4 of selected card to current deck +lblRemovecard=Remove card +ttRemovecard=Remove selected card from current deck (or double click the row or hit the spacebar) +lblRemove4ofcard=Remove 4 of card +ttRemove4ofcard=Remove up to 4 of selected card to current deck +lblAddBasicLands=Add Basic Lands +ttAddBasicLands=Add basic lands to the deck +lblCardCatalog=Card Catalog +lblJumptoprevioustable=Jump to previous table +lblJumptopnexttable=Jump to next table +lblJumptotextfilter=Jump to text filter +lblChooseavalueforX=Choose a value for X +#VCurrentDeck.java +lblVCurrentDeck=Current Deck +ttbtnSave=Save Deck (Ctrl+S) +ttbtnSaveAs=Save Deck As (Ctrl+E) +ttbtnLoadDeck=Open Deck (Ctrl+O) +ttbtnNewDeck=New Deck (Ctrl+N) +ttbtnPrintProxies=Print to HTML file (Ctrl+P) +lblImport=Import +ttImportDeck=Attempt to import a deck from a non-Forge format (Ctrl+I) +lblTitle=Title +#ImageView.java +lblExpandallgroups=Expand all groups +lblCollapseallgroups=Collapse all groups +lblGroupby=group by +lblPileby=pile by +lblColumns=Columns +#CEditorVariant.java +lblCatalog=Catalog +lblAdd=Add +lbltodeck=to deck +lblfromdeck=from deck +lbltosideboard=to sideboard +lblfromsideboard=from sideboard +lblascommander=as commander +lblasavatar=as avatar +lblfromschemedeck=from scheme deck +lblfromplanardeck=from planar deck +lblfromconspiracydeck=from conspiracy deck +#GroupDef.java +lblColor=Color +lblColorIdentity=Color Identity +lblSet=Set +lblDefault=Default +lblType=Type +lblPlaneswalkerDeckSort=Planeswalker Deck Sort +lblRarity=Rarity +lblConvertToFoil=Foil +lblMulticolor=Multicolor +#DeckFileMenu.java +lblNewDeck=New Deck +lblOpenDeck=Open Deck +lblImportDeck=Import Deck +lblSaveDeck=Save Deck +lblSaveDeckAs=Save Deck As +lblPrinttoHTMLfile=Print to HTML file +#PaperCard.java +lblCard=Carta +#CardManager.java +lblFormat=Format +lblFormats=Formats +lblQuestWorld=Quest World +lblSets=Sets +lblTypes=Types +lblConvertedManaCosts=Converted mana +lblCMCRange=CMC Range +lblPowerRange=Power Range +lblToughnessRange=Toughness Range +lblFoil=Foil +lblPersonalRating=Personal Rating +lblAdvanced=Advanced +#VDeckgen.java +lblDeckGeneration=Deck Generation +btnRandCardpool=Random Cardpool +ttbtnRandCardpool=Generate random constructed cardpool in current deck area +btnRandDeck2=Constructed (2 color) +ttbtnRandDeck2=Generate 2 color constructed deck in current deck area +btnRandDeck3=Constructed (3 color) +ttbtnRandDeck3=Generate 3 color constructed deck in current deck area +btnRandDeck5=Constructed (5 color) +ttbtnRandDeck5=Generate 5 color constructed deck in current deck area +#DeckCotroller.java +lblCurrentDeck2=Current Deck +lblUntitled=Untitled diff --git a/forge-gui/res/languages/es-es.properties b/forge-gui/res/languages/es-es.properties index e8bfaf9d674..6e04781e980 100644 --- a/forge-gui/res/languages/es-es.properties +++ b/forge-gui/res/languages/es-es.properties @@ -7,6 +7,36 @@ splash.loading.decks=Cargando Mazos... splash.loading.processingimagesprites=Procesando imágenes de cartas #FControl.java lblOpeningMainWindow=Abriendo ventana principal... +lblCloseScreen=Cerrar Pantalla +txCloseAction1=Forge ahora admite pestañas de navegación que permiten cerrar y cambiar entre diferentes pantallas con facilidad. Como resultado, ya no necesita usar el botón X en la esquina superior derecha para cerrar la pantalla actual y regresar. +txCloseAction2=Seleccione lo que desea que suceda al hacer clic en el botón X en la parte superior derecha. Esta opción se utilizará en el futuro y no volverá a ver este mensaje. Puedes cambiar este comportamiento en cualquier momento en Preferencias. +titCloseAction=Seleccione su Acción al Cerrar +lblAreYouSureYouWishRestartForge=¿Estás seguro de que deseas reiniciar Forge? +lblAreYouSureYouWishExitForge=¿Estás seguro de que deseas salir de Forge? +lblOneOrMoreGamesActive=Una o más partidas están actualmente activos +lblerrLoadingLayoutFile=No se pudo leer el archivo de diseño %s. Se eliminará después de presionar OK.\nEl juego continuará con el diseño predeterminado. +lblLoadingQuest=Cargando datos de Aventura.... +#FScreen.java +lblHome=Inicio +lblWorkshop=Taller +lblBacktoHome=Volver a Inicio +lblDeckEditor=Editor de Mazos +lblCloseEditor=Cerrar Editor +lblCommanderDeckEditor=Editor Mazos Commander +lblTinyLeadersDeckEditor=Editor Mazos Tiny Leaders +lblBrawlDeckEditor=Editor Mazos Brawl +lblDraftDeckEditor=Editor Mazo Draft +lblSealedDeckEditor=Editor Mazo Sellao +lblTokenViewer=Visor de Tokens +lblCloseViewer=Cerrar Visor +lblQuestDeckEditor=Editor Mazos Aventura +lblQuestTournamentDeckEditor=Editor Mazos Torneos Aventura +lblSpellShop=Tienda de Hechizos +lblLeaveShop=Salir de la Tienda +lblLeaveDraft=Abandonar Draft +lblBazaar=Bazar +lblConcedeGame=Conceder Partida +txerrFailedtodeletelayoutfile=Fallo al borrar el archivo de disposición #VSubmenuPreferences.java Preferences=Preferencias btnReset=Restablecer la configuración predeterminada @@ -70,7 +100,6 @@ cbUseSentry=Enviar automáticamente informes de errores. cbpGameLogEntryType=Verbosidad del registro del juego cbpCloseAction=Acción al cerrar cbpDefaultFontSize=Tamaño de fuente predeterminado -cbpMulliganRule = Mulligan Rule cbpAiProfiles=Personalidad de la IA cbpDisplayCurrentCardColors=Mostrar color detallado de la carta cbpAutoYieldMode=Auto-Ceder @@ -79,11 +108,12 @@ cbpCounterDisplayLocation=Ubicación del contador cbpGraveyardOrdering=Permitir ordenar cartas puestas en el cementerio Troubleshooting=Solución de problemas GeneralConfiguration=Configuración general +lblPlayerName=Nombre Jugador nlPlayerName=Establece el nombre al que te referirá Forge durante el juego. nlCompactMainMenu=Habilitar para una barra lateral eficiente en espacio que muestre solo un grupo de menús a la vez (REQUIERE REINICIAR). nlUseSentry=Cuando está habilitado, envía automáticamente informes de errores a los desarrolladores. GamePlay=Juego -nlpMulliganRule=Choose the version of the Mulligan rule +nlpMulliganRule=Elige versión de reglas de Mulligan nlpAiProfiles=Elige tu oponente de la IA nlAnte=Determina si el juego se juega con apuesta o no. nlAnteMatchRarity=Intenta crear apuesta de la misma rareza para todos los jugadores. @@ -120,6 +150,7 @@ nlLoadCardsLazily=Si está activado, Forge cargará los scripts de las cartas se nlLoadHistoricFormats=Si está activado, Forge cargará todas los formatos históricos, esto puede demorar un poco más en cargarse en el inicio. GraphicOptions=Opciones gráficas nlDefaultFontSize=El tamaño de fuente predeterminado dentro de la interfaz de usuario. Todos los elementos de fuente se escalan en relación a esto. (Necesita reinicio) +cbpMulliganRule=Regla de Mulligan nlImageFetcher=Permite la descarga instantánea de imágenes de cartas faltantes. nlDisplayFoil=Mostrar cartas foil con un capa que da efecto foil sobre la carta nlRandomFoil=Agrega efecto de foil a cartas aleatorias. @@ -175,12 +206,12 @@ ReleaseNotes=Notas de la Versión # CSubmenuPreferences.java CantChangeDevModeWhileNetworkMath=¡No se puede cambiar a Modo Desarrollador mientras se está realizando una partida en red! CompatibilityWarningsReEnabled=¡Advertencias de compatibilidad re-habilitadas! -AresetForgeSettingsToDefault=Esto reseteará todas las preferencias a sus valores predeterminados y reiniciará Forge.\n\ n¿Resetear y reiniciar Forge? +AresetForgeSettingsToDefault=Esto reseteará todas las preferencias a sus valores predeterminados y reiniciará Forge.\n\n¿Resetear y reiniciar Forge? TresetForgeSettingsToDefault=Ajustes del Reset AresetDeckEditorLayout=Esto restablecerá el diseño de la pantalla del Editor de Mazos.\nTodas las vistas con pestañas se restaurarán a sus posiciones predeterminadas.\n\n ¿Restablecer diseño? TresetDeckEditorLayout=Restablecer diseño del Editor de Mazos OKresetDeckEditorLayout=El diseño del Editor se ha reestablecido correctamente -AresetWorkshopLayout=Esto restablecerá el diseño del Taller.\nTodas las vistas con pestañas se restaurarán a sus posiciones predeterminadas. \n\n ¿Restablecer diseño? +AresetWorkshopLayout=Esto restablecerá el diseño del Taller.\nTodas las vistas con pestañas se restaurarán a sus posiciones predeterminadas. \n\n¿Restablecer diseño? TresetWorkshopLayout=Restablecer diseño del Taller. OKresetWorkshopLayout=El diseño del Taller se ha restablecido. AresetMatchScreenLayout=Esto restablecerá el diseño de la pantalla de Juego.\n Si desea guardar primero el diseño actual, use la pestaña Dock -> Guardar opción de diseño en la pantalla de Juego\n \n ¿Restablecer diseño? @@ -207,7 +238,7 @@ lblConstructedMode=Modo Construido lblConstructed=Construido #PlayerPanel.java lblSelectaDeck=Selecciona un Mazo -lblSelectaSchemeDeck=Selecciona un Mazo de Fenómenos (Scheme) +lblSelectaSchemeDeck=Selecciona un Mazo de Escenario (Scheme) lblSchemeDeckEditor=Editor de Mazo de Escenario (Scheme) lblSelectaCommanderDeck=Selecciona un Mazo Commander lblSelectaPlanarDeck=Selecciona un Mazo Planar @@ -381,7 +412,7 @@ cbSummonPlant=Invocar Planta cbLaunchZeppelin=Lanzar Zeppelin #VSubmenuQuest.java lblQuestData=Datos de Aventura -lblLoadQuestData=Load Quest Data +lblLoadQuestData=Cargar Datos de Aventura lblStartanewQuest=Comenzar una nueva Aventura lblOldQuestData=Viejos datos de Aventura? Poner en %n y reiniciar Forge. rbEasy=Fácil @@ -477,7 +508,7 @@ btnSpendToken=Gastar Token btnStartMatchSmall=Comenzar Siguiente Partida lblUndetermined=Sin determinar btnSpendTokenTT=Crea un nuevo torneo que se puede jugar de inmediato. -lblPastResults=Past Results +lblPastResults=Resultados Anteriores #VSubmenuQuestDecks.java lblQuestDecks=Mazos de la Aventura lblQuestDesc1=En el modo Aventura, construyes un mazo a partir de un inventario limitado. @@ -566,7 +597,7 @@ lblnextChallengeInWins1=Un nuevo desafío estará disponible después de 1 victo lblnextChallengeInWins2=Un nuevo desafío estará disponible después de %n victorias más. lblWinStreak=Racha lblBest=Mejor -lblBuildAndSelectaDeck=Construye, luego selecciona un mazo en el submenú "Mazo de misiones". +lblBuildAndSelectaDeck=Construye, luego selecciona un mazo en el submenú "Mazos de la Aventura". lblCurrentDeck=Tu mazo actual es %n PleaseCreateAQuestBefore=Por favor crea una aventura antes de intentar %n. lblNoQuest=No Aventura @@ -591,7 +622,7 @@ lblBoosterPackRatios=Proporción de pack de sobres lblDifficultyAdjustments=Ajustes de dificultad lblShopPreferences=Preferencias de la tienda lblDraftTournaments=Torneos de Draft -lblBaseWinnings= +lblBaseWinnings=Base Winnings lblNoLosses=Sin pérdidas lblPoisonWin=Victoria por Veneno lblMillingWin=Victoria por Deckeo @@ -660,3 +691,135 @@ lblWinsperDraftRotation=Victorias Rotación de Draft ttWinsperDraftRotation=Si no se juega un Draft para esta cantidad de victorias, se eliminará o reemplazará. lblRotationType=Tipo de Rotación ttRotationType=Si se establece en 0, los anteriores Draft desaparecen, si se establece en 1, se reemplazan por otros que utilizan sets diferentes. +#StatTypeFilter.java +lblclicktotoogle=haga clic para alternar el filtro, haga clic con el botón derecho para mostrar solo +#SItemManagerUtil.java +lblWhitecards=Cartas Blancas +lblBluecards=Cartas Azules +lblBlackcards=Cartas Negras +lblRedcards=Cartas Rojas +lblGreencards=Cartas Verdes +lblColorlesscards=Cartas Incoloras +lblMulticolorcards=Cartas Multicolor +lblPackordeck=Pack de Cartas y Mazos Preconstruidos +lblLands=Tierras +lblArtifacts=Artefactos +lblCreatures=Criaturas +lblEnchantments=Encantamientos +lblPlaneswalkers=Planeswalkers +lblInstants=Instantáneos +lblSorceries=Conjuros +lblCCMC0=Cartas con CMC 0 +lblCCMC1=Cartas con CMC 1 +lblCCMC2=Cartas con CMC 2 +lblCCMC3=Cartas con CMC 3 +lblCCMC4=Cartas con CMC 4 +lblCCMC5=Cartas con CMC 5 +lblCCMC6orMore=Cartas con CMC 6 o mas +lblWhitedecks=Mazos Blancos +lblBluedecks=Mazos Azules +lblBlackdecks=Mazos Negros +lblReddecks=Mazos Rojos +lblGreendecks=Mazos Verdes +lblColorlessdecks=Mazos Incoloros +lblMulticolordecks=Mazos Multicolor +lblOldstyleFoilcards=Cartas Foil Viejo Estilo +lblNewstyleFoilcards=Cartas Foil Nuevo Estilo +lblNon-Foilcards=Cartas no Foil +lblUnratedcards=Cartas sin valorar +lbl1starcards=Cartas 1 estrella +lbl2starcards=Cartas 2 estrellas +lbl3starcards=Cartas 3 estrellas +lbl4starcards=Cartas 4 estrellas +lbl5starcards=Cartas 5 estrellas +lblXcopiesof=X copias de +lblcopiesof=copias de +#ACEditorBase.java +lblAddcard=Añadir carta +ttAddcard=Añade la carta seleccionada al mazo actual (o haz doble clic en la fila o presiona la barra espaciadora) +lblAdd4ofcard=Añadir 4 cartas +ttAdd4ofcard=Añadir hasta 4 de la carta seleccionada al mazo actual +lblRemovecard=Quitar carta +ttRemovecard=Quitar la carta seleccionada del mazo actual (o haz doble clic en la fila o presiona la barra espaciadora) +lblRemove4ofcard=Quitar 4 cartas +ttRemove4ofcard=Quitar hasta 4 de la carta seleccionada al mazo actual +lblAddBasicLands=Añadir Tierras Básicas +ttAddBasicLands=Añadir tierras básicas al mazo +lblCardCatalog=Catálogo de Cartas +lblJumptoprevioustable=Saltar a la tabla anterior +lblJumptopnexttable=Saltar a la siguiente tabla +lblJumptotextfilter=Saltar al filtro de texto +lblChooseavalueforX=Elige un valor para X +#VCurrentDeck.java +lblVCurrentDeck=Mazo Actual +ttbtnSave=Guardar Mazo (Ctrl+S) +ttbtnSaveAs=Guardar Mazo como... (Ctrl+E) +ttbtnLoadDeck=Abrir Mazo (Ctrl+O) +ttbtnNewDeck=Nuevo Mazo ((Ctrl+N) +ttbtnPrintProxies=Imprimir a archivo HTML (Ctrl+P) +lblImport=Importar +ttImportDeck=Intenta importar un deck desde un formato que no sea Forge (Ctrl + I) +lblTitle=Título +#ImageView.java +lblExpandallgroups=Expandir todos los grupos +lblCollapseallgroups=Contraer todos los grupos +lblGroupby=agrupar por +lblPileby=apilar por +lblColumns=Columnas +#CEditorVariant.java +lblCatalog=Catálogo +lblAdd=Añadir +lbltodeck=al mazo +lblfromdeck=del mazo +lbltosideboard=al banquillo +lblfromsideboard=del banquillo +lblascommander=como comandante +lblasavatar=como avatar +lblfromschemedeck=del mazo de escenario +lblfromplanardeck=del mazo planar +lblfromconspiracydeck=del mazo conspiracy +#GroupDef.java +lblColor=Color +lblColorIdentity=Identidad de Color +lblSet=Edición +lblDefault=por defecto +lblType=Tipo +lblPlaneswalkerDeckSort=por Planewalkers +lblRarity=Rareza +lblConvertToFoil=Foil +lblMulticolor=Multicolor +#DeckFileMenu.java +lblNewDeck=Nuevo Mazo +lblOpenDeck=Abrir Mazo +lblImportDeck=Importar Mazo +lblSaveDeck=Guardar Mazo +lblSaveDeckAs=Guardar Mazo como... +lblPrinttoHTMLfile=Imprimir en fichero HTML +#PaperCard.java +lblCard=Carta +#CardManager.java +lblFormat=Formato +lblFormats=Formatos +lblQuestWorld=Mundos del Modo Aventura +lblSets=Ediciones +lblTypes=Tipos +lblConvertedManaCosts=Maná Convertido +lblCMCRange=Rango de CMC +lblPowerRange=Rango de Fuerza +lblToughnessRange=Rango de Resistencia +lblFoil=Foil +lblPersonalRating=Puntuación Personal +lblAdvanced=Avanzado +#VDeckgen.java +lblDeckGeneration=Deck Generation +btnRandCardpool=Random Cardpool +ttbtnRandCardpool=Generate random constructed cardpool in current deck area +btnRandDeck2=Constructed (2 color) +ttbtnRandDeck2=Generate 2 color constructed deck in current deck area +btnRandDeck3=Constructed (3 color) +ttbtnRandDeck3=Generate 3 color constructed deck in current deck area +btnRandDeck5=Constructed (5 color) +ttbtnRandDeck5=Generate 5 color constructed deck in current deck area +#DeckCotroller.java +lblCurrentDeck2=Current Deck +lblUntitled=Untitled diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index 075a70889ae..a90d573ddca 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -15,9 +15,10 @@ import forge.deck.DeckProxy; import forge.item.InventoryItem; import forge.item.PaperCard; import forge.model.FModel; +import forge.util.Localizer; public enum GroupDef { - COLOR("Color", getColorGroups(), + COLOR("lblColor", getColorGroups(), new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -36,7 +37,7 @@ public enum GroupDef { return -1; } }), - COLOR_IDENTITY("Color Identity", getColorGroups(), + COLOR_IDENTITY("lblColorIdentity", getColorGroups(), new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -55,7 +56,7 @@ public enum GroupDef { return -1; } }), - SET("Set", getSetGroups(), + SET("lblSet", getSetGroups(), new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -74,7 +75,7 @@ public enum GroupDef { return -1; } }), - DEFAULT("Default", + DEFAULT("lblDefault", new String[] { "Creatures", "Spells", "Lands" }, new Function() { @Override @@ -104,7 +105,7 @@ public enum GroupDef { } }), - CARD_TYPE("Type", + CARD_TYPE("lblType", new String[] { "Planeswalker", "Creature", "Sorcery", "Instant", "Artifact", "Enchantment", "Land", "Tribal instant" }, new Function() { @Override @@ -148,7 +149,7 @@ public enum GroupDef { return -1; } }), - PW_DECK_SORT("Planeswalker Deck Sort", + PW_DECK_SORT("lblPlaneswalkerDeckSort", new String[] { "Planeswalker", "Rares", "Creature", "Land", "Other Spells" }, new Function() { @Override @@ -178,8 +179,8 @@ public enum GroupDef { return -1; } }), - CARD_RARITY("Rarity", - new String[] { "Mythic Rares", "Rares", "Uncommons", "Commons", "Basic Lands" }, + CARD_RARITY("lblRarity", + new String[] {"Mythic Rares", "Rares", "Uncommons", "Commons", "Basic Lands"}, new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -210,7 +211,8 @@ public enum GroupDef { }); GroupDef(String name0, String[] groups0, Function fnGetPileByOverride0, Function fnGroupItem0) { - this.name = name0; + final Localizer localizer = Localizer.getInstance(); + this.name = localizer.getMessage(name0); this.groups = groups0; this.fnGetPileByOverride = fnGetPileByOverride0; this.fnGroupItem = fnGroupItem0; @@ -247,8 +249,15 @@ public enum GroupDef { } private static String[] getColorGroups() { + final Localizer localizer = Localizer.getInstance(); + String white = new String(localizer.getMessage("lblWhite")); + String blue = new String(localizer.getMessage("lblBlue")); + String black = new String(localizer.getMessage("lblBlack")); + String green = new String(localizer.getMessage("lblGreen")); + String multicolor = new String(localizer.getMessage("lblMulticolor")); + String colorless = new String(localizer.getMessage("lblColorless")); //TODO: Support breaking up Multicolor into separate groups for each color combination - return new String[] { "White", "Blue", "Black", "Red", "Green", "Multicolor", "Colorless" }; + return new String[] {white,blue,black,green,multicolor,colorless }; } private static Integer getColorGroup(ColorSet color) { diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index a5df84f7e1a..b880cf717b6 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -9,6 +9,7 @@ import forge.deck.DeckProxy; import forge.interfaces.IComboBox; import forge.item.InventoryItem; import forge.util.ComparableOp; +import forge.util.Localizer; import java.util.ArrayList; import java.util.Collections; @@ -28,49 +29,49 @@ import java.util.Map.Entry; public final class SItemManagerUtil { /** An enum to encapsulate metadata for the stats/filter objects. */ public static enum StatTypes implements IHasSkinProp { - WHITE (FSkinProp.IMG_MANA_W, CardRulesPredicates.Presets.IS_WHITE, "White cards"), - BLUE (FSkinProp.IMG_MANA_U, CardRulesPredicates.Presets.IS_BLUE, "Blue cards"), - BLACK (FSkinProp.IMG_MANA_B, CardRulesPredicates.Presets.IS_BLACK, "Black cards"), - RED (FSkinProp.IMG_MANA_R, CardRulesPredicates.Presets.IS_RED, "Red cards"), - GREEN (FSkinProp.IMG_MANA_G, CardRulesPredicates.Presets.IS_GREEN, "Green cards"), - COLORLESS (FSkinProp.IMG_MANA_COLORLESS, CardRulesPredicates.Presets.IS_COLORLESS, "Colorless cards"), - MULTICOLOR (FSkinProp.IMG_MULTI, CardRulesPredicates.Presets.IS_MULTICOLOR, "Multicolor cards"), + WHITE (FSkinProp.IMG_MANA_W, CardRulesPredicates.Presets.IS_WHITE, "lblWhitecards"), + BLUE (FSkinProp.IMG_MANA_U, CardRulesPredicates.Presets.IS_BLUE, "lblBluecards"), + BLACK (FSkinProp.IMG_MANA_B, CardRulesPredicates.Presets.IS_BLACK, "lblBlackcards"), + RED (FSkinProp.IMG_MANA_R, CardRulesPredicates.Presets.IS_RED, "lblRedcards"), + GREEN (FSkinProp.IMG_MANA_G, CardRulesPredicates.Presets.IS_GREEN, "lblGreencards"), + COLORLESS (FSkinProp.IMG_MANA_COLORLESS, CardRulesPredicates.Presets.IS_COLORLESS, "lblColorlesscards"), + MULTICOLOR (FSkinProp.IMG_MULTI, CardRulesPredicates.Presets.IS_MULTICOLOR, "lblMulticolorcards"), - PACK_OR_DECK (FSkinProp.IMG_PACK, null, "Card packs and prebuilt decks"), - LAND (FSkinProp.IMG_LAND, CardRulesPredicates.Presets.IS_LAND, "Lands"), - ARTIFACT (FSkinProp.IMG_ARTIFACT, CardRulesPredicates.Presets.IS_ARTIFACT, "Artifacts"), - CREATURE (FSkinProp.IMG_CREATURE, CardRulesPredicates.Presets.IS_CREATURE, "Creatures"), - ENCHANTMENT (FSkinProp.IMG_ENCHANTMENT, CardRulesPredicates.Presets.IS_ENCHANTMENT, "Enchantments"), - PLANESWALKER (FSkinProp.IMG_PLANESWALKER, CardRulesPredicates.Presets.IS_PLANESWALKER, "Planeswalkers"), - INSTANT (FSkinProp.IMG_INSTANT, CardRulesPredicates.Presets.IS_INSTANT, "Instants"), - SORCERY (FSkinProp.IMG_SORCERY, CardRulesPredicates.Presets.IS_SORCERY, "Sorceries"), + PACK_OR_DECK (FSkinProp.IMG_PACK, null, "lblPackordeck"), + LAND (FSkinProp.IMG_LAND, CardRulesPredicates.Presets.IS_LAND, "lblLands"), + ARTIFACT (FSkinProp.IMG_ARTIFACT, CardRulesPredicates.Presets.IS_ARTIFACT, "lblArtifacts"), + CREATURE (FSkinProp.IMG_CREATURE, CardRulesPredicates.Presets.IS_CREATURE, "lblCreatures"), + ENCHANTMENT (FSkinProp.IMG_ENCHANTMENT, CardRulesPredicates.Presets.IS_ENCHANTMENT, "lblEnchantments"), + PLANESWALKER (FSkinProp.IMG_PLANESWALKER, CardRulesPredicates.Presets.IS_PLANESWALKER, "lblPlaneswalkers"), + INSTANT (FSkinProp.IMG_INSTANT, CardRulesPredicates.Presets.IS_INSTANT, "lblInstants"), + SORCERY (FSkinProp.IMG_SORCERY, CardRulesPredicates.Presets.IS_SORCERY, "lblSorceries"), - CMC_0 (FSkinProp.IMG_MANA_0, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 0), "Cards with CMC 0"), - CMC_1 (FSkinProp.IMG_MANA_1, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 1), "Cards with CMC 1"), - CMC_2 (FSkinProp.IMG_MANA_2, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 2), "Cards with CMC 2"), - CMC_3 (FSkinProp.IMG_MANA_3, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 3), "Cards with CMC 3"), - CMC_4 (FSkinProp.IMG_MANA_4, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 4), "Cards with CMC 4"), - CMC_5 (FSkinProp.IMG_MANA_5, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 5), "Cards with CMC 5"), - CMC_6 (FSkinProp.IMG_MANA_6, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.GT_OR_EQUAL, 6), "Cards with CMC 6+"), + CMC_0 (FSkinProp.IMG_MANA_0, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 0), "lblCCMC0"), + CMC_1 (FSkinProp.IMG_MANA_1, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 1), "lblCCMC1"), + CMC_2 (FSkinProp.IMG_MANA_2, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 2), "lblCCMC2"), + CMC_3 (FSkinProp.IMG_MANA_3, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 3), "lblCCMC3"), + CMC_4 (FSkinProp.IMG_MANA_4, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 4), "lblCCMC4"), + CMC_5 (FSkinProp.IMG_MANA_5, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 5), "lblCCMC5"), + CMC_6 (FSkinProp.IMG_MANA_6, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.GT_OR_EQUAL, 6), "lblCCMC6orMore"), - DECK_WHITE (FSkinProp.IMG_MANA_W, null, "White decks"), - DECK_BLUE (FSkinProp.IMG_MANA_U, null, "Blue decks"), - DECK_BLACK (FSkinProp.IMG_MANA_B, null, "Black decks"), - DECK_RED (FSkinProp.IMG_MANA_R, null, "Red decks"), - DECK_GREEN (FSkinProp.IMG_MANA_G, null, "Green decks"), - DECK_COLORLESS (FSkinProp.IMG_MANA_COLORLESS, null, "Colorless decks"), - DECK_MULTICOLOR (FSkinProp.IMG_MULTI, null, "Multicolor decks"), + DECK_WHITE (FSkinProp.IMG_MANA_W, null, "lblWhitedecks"), + DECK_BLUE (FSkinProp.IMG_MANA_U, null, "lblBluedecks"), + DECK_BLACK (FSkinProp.IMG_MANA_B, null, "lblBlackdecks"), + DECK_RED (FSkinProp.IMG_MANA_R, null, "lblReddecks"), + DECK_GREEN (FSkinProp.IMG_MANA_G, null, "lblGreendecks"), + DECK_COLORLESS (FSkinProp.IMG_MANA_COLORLESS, null, "lblColorlessdecks"), + DECK_MULTICOLOR (FSkinProp.IMG_MULTI, null, "lblMulticolordecks"), - FOIL_OLD (FSkinProp.FOIL_11, null, "Old style Foil cards"), - FOIL_NEW (FSkinProp.FOIL_01, null, "New style Foil cards"), - FOIL_NONE (FSkinProp.ICO_CLOSE, null, "Non-Foil cards"), + FOIL_OLD (FSkinProp.FOIL_11, null, "lblOldstyleFoilcards"), + FOIL_NEW (FSkinProp.FOIL_01, null, "lblNewstyleFoilcards"), + FOIL_NONE (FSkinProp.ICO_CLOSE, null, "lblNon-Foilcards"), - RATE_NONE (FSkinProp.IMG_FAVNONE, null, "Unrated cards"), - RATE_1 (FSkinProp.IMG_FAV1, null, "1 star cards"), - RATE_2 (FSkinProp.IMG_FAV2, null, "2 star cards"), - RATE_3 (FSkinProp.IMG_FAV3, null, "3 star cards"), - RATE_4 (FSkinProp.IMG_FAV4, null, "4 star cards"), - RATE_5 (FSkinProp.IMG_FAV5, null, "5 star cards"); + RATE_NONE (FSkinProp.IMG_FAVNONE, null, "lblUnratedcards"), + RATE_1 (FSkinProp.IMG_FAV1, null, "lbl1starcards"), + RATE_2 (FSkinProp.IMG_FAV2, null, "lbl2starcards"), + RATE_3 (FSkinProp.IMG_FAV3, null, "lbl3starcards"), + RATE_4 (FSkinProp.IMG_FAV4, null, "lbl4starcards"), + RATE_5 (FSkinProp.IMG_FAV5, null, "lbl5starcards"); public final FSkinProp skinProp; @@ -80,7 +81,8 @@ public final class SItemManagerUtil { private StatTypes(final FSkinProp skinProp0, final Predicate predicate0, final String label0) { skinProp = skinProp0; predicate = predicate0; - label = label0; + final Localizer localizer = Localizer.getInstance(); + label = localizer.getMessage(label0); } @Override @@ -95,6 +97,7 @@ public final class SItemManagerUtil { return getItemDisplayString(items, qty, forTitle); } public static String getItemDisplayString(final Iterable items, final int qty, final boolean forTitle) { + final Localizer localizer = Localizer.getInstance(); //determine shared type among items int itemCount = 0; String sharedType = null; @@ -130,10 +133,10 @@ public final class SItemManagerUtil { result = itemCount + " " + result + "s"; } if (qty < 0) { //treat negative numbers as unknown quantity - result = "X copies of " + result; + result = localizer.getMessage("lblXcopiesof") + " " + result; } else if (qty != 1) { - result = qty + " copies of " + result; + result = qty + " " + localizer.getMessage("lblcopiesof")+ " " + result; } } return result; @@ -166,8 +169,9 @@ public final class SItemManagerUtil { final boolean isDeckManager = itemManager.getGenericType().equals(DeckProxy.class); final GroupDef[] groupByOptions = isDeckManager ? DECK_GROUPBY_OPTIONS : CARD_GROUPBY_OPTIONS; final ColumnDef[] pileByOptions = isDeckManager ? DECK_PILEBY_OPTIONS : CARD_PILEBY_OPTIONS; - cbGroupByOptions.addItem("(none)"); - cbPileByOptions.addItem("(none)"); + final Localizer localizer = Localizer.getInstance(); + cbGroupByOptions.addItem("(" + localizer.getMessage("lblNone") + ")"); + cbPileByOptions.addItem("(" + localizer.getMessage("lblNone") + ")"); for (final GroupDef option : groupByOptions) { cbGroupByOptions.addItem(option); } From 7b41e9b19da7a5d8b0969ba5b4cf8523c485ba59 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 10:04:02 +0800 Subject: [PATCH 39/64] Merge branch 'master' of https://git.cardforge.org/core-developers/forge into m20 --- .../src/main/java/forge/ai/GameState.java | 69 ++++++++++++-- .../forge/ai/ability/CountersPutAllAi.java | 9 +- .../java/forge/ai/ability/PermanentAi.java | 2 +- .../ability/effects/ChangeZoneEffect.java | 29 ++++-- .../SpellAbilityStackInstance.java | 2 + .../trigger/TriggerBecomesTargetOnce.java | 95 +++++++++++++++++++ .../java/forge/game/trigger/TriggerType.java | 1 + .../main/java/forge/game/zone/MagicStack.java | 5 + .../cardsfolder/a/ajani_the_greathearted.txt | 6 +- .../res/cardsfolder/h/horobi_deaths_wail.txt | 2 +- .../upcoming/leyline_of_combustion.txt | 8 ++ forge-gui/res/cardsfolder/w/wild_defiance.txt | 2 +- forge-gui/res/editions/War of the Spark.txt | 2 +- forge-gui/res/puzzle/PS_GRNS.pzl.example | 24 +++++ forge-gui/res/puzzle/PS_WAR7.pzl | 17 ++++ 15 files changed, 249 insertions(+), 24 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java create mode 100644 forge-gui/res/cardsfolder/upcoming/leyline_of_combustion.txt create mode 100644 forge-gui/res/puzzle/PS_GRNS.pzl.example create mode 100644 forge-gui/res/puzzle/PS_WAR7.pzl diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 693ebba2690..984bb2dc9b6 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -97,6 +97,9 @@ public abstract class GameState { private String precastHuman = null; private String precastAI = null; + private String putOnStackHuman = null; + private String putOnStackAI = null; + private int turn = 1; private boolean removeSummoningSickness = false; @@ -535,6 +538,13 @@ public abstract class GameState { precastAI = categoryValue; } + else if (categoryName.endsWith("putonstack")) { + if (isHuman) + putOnStackHuman = categoryValue; + else + putOnStackAI = categoryValue; + } + else if (categoryName.endsWith("manapool")) { if (isHuman) humanManaPool = categoryValue; @@ -614,6 +624,9 @@ public abstract class GameState { game.getTriggerHandler().setSuppressAllTriggers(false); + // SAs added to stack cause triggers to fire, as if the relevant SAs were cast + handleAddSAsToStack(game); + // Combat only works for 1v1 matches for now (which are the only matches dev mode supports anyway) // Note: triggers may fire during combat declarations ("whenever X attacks, ...", etc.) if (newPhase == PhaseType.COMBAT_DECLARE_ATTACKERS || newPhase == PhaseType.COMBAT_DECLARE_BLOCKERS) { @@ -803,6 +816,9 @@ public abstract class GameState { } private void executeScript(Game game, Card c, String sPtr) { + executeScript(game, c, sPtr, false); + } + private void executeScript(Game game, Card c, String sPtr, boolean putOnStack) { int tgtID = TARGET_NONE; if (sPtr.contains("->")) { String tgtDef = sPtr.substring(sPtr.lastIndexOf("->") + 2); @@ -878,13 +894,17 @@ public abstract class GameState { sa.setActivatingPlayer(c.getController()); handleScriptedTargetingForSA(game, sa, tgtID); - sa.resolve(); + if (putOnStack) { + game.getStack().addAndUnfreeze(sa); + } else { + sa.resolve(); - // resolve subabilities - SpellAbility subSa = sa.getSubAbility(); - while (subSa != null) { - subSa.resolve(); - subSa = subSa.getSubAbility(); + // resolve subabilities + SpellAbility subSa = sa.getSubAbility(); + while (subSa != null) { + subSa.resolve(); + subSa = subSa.getSubAbility(); + } } } @@ -906,7 +926,28 @@ public abstract class GameState { } } + private void handleAddSAsToStack(final Game game) { + Player human = game.getPlayers().get(0); + Player ai = game.getPlayers().get(1); + + if (putOnStackHuman != null) { + String[] spellList = TextUtil.split(putOnStackHuman, ';'); + for (String spell : spellList) { + precastSpellFromCard(spell, human, game, true); + } + } + if (putOnStackAI != null) { + String[] spellList = TextUtil.split(putOnStackAI, ';'); + for (String spell : spellList) { + precastSpellFromCard(spell, ai, game, true); + } + } + } + private void precastSpellFromCard(String spellDef, final Player activator, final Game game) { + precastSpellFromCard(spellDef, activator, game, false); + } + private void precastSpellFromCard(String spellDef, final Player activator, final Game game, final boolean putOnStack) { int tgtID = TARGET_NONE; String scriptID = ""; @@ -931,7 +972,7 @@ public abstract class GameState { SpellAbility sa = null; if (!scriptID.isEmpty()) { - executeScript(game, c, scriptID); + executeScript(game, c, scriptID, putOnStack); return; } @@ -940,7 +981,11 @@ public abstract class GameState { handleScriptedTargetingForSA(game, sa, tgtID); - sa.resolve(); + if (putOnStack) { + game.getStack().addAndUnfreeze(sa); + } else { + sa.resolve(); + } } private void handleMarkedDamage() { @@ -1167,6 +1212,14 @@ public abstract class GameState { // TODO: improve this for game states with more than two players String tgt = info.substring(info.indexOf(':') + 1); cardToEnchantPlayerId.put(c, tgt.equalsIgnoreCase("AI") ? TARGET_AI : TARGET_HUMAN); + } else if (info.startsWith("Owner:")) { + // TODO: improve this for game states with more than two players + Player human = player.getGame().getPlayers().get(0); + Player ai = player.getGame().getPlayers().get(1); + String owner = info.substring(info.indexOf(':') + 1); + Player controller = c.getController(); + c.setOwner(owner.equalsIgnoreCase("AI") ? ai : human); + c.setController(controller, c.getGame().getNextTimestamp()); } else if (info.startsWith("Ability:")) { String abString = info.substring(info.indexOf(':') + 1).toLowerCase(); c.addSpellAbility(AbilityFactory.getAbility(abilityString.get(abString), c)); diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java index 0be541d2f5f..6142b9c71ff 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java @@ -38,8 +38,13 @@ public class CountersPutAllAi extends SpellAbilityAi { final boolean curse = sa.isCurse(); final TargetRestrictions tgt = sa.getTargetRestrictions(); - hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); - cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); + if ("OwnCreatsAndOtherPWs".equals(sa.getParam("AILogic"))) { + hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source); + cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source); + } else { + hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); + cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); + } if (abCost != null) { // AI currently disabled for these costs diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index 3832bd0c956..14a3f8160c5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -201,7 +201,7 @@ public class PermanentAi extends SpellAbilityAi { int numControlled = 0; if (param.endsWith("WithoutOppAuras")) { - // Check that the permanet does not have any auras attached to it by the opponent (this assumes that if + // Check that the permanent does not have any auras attached to it by the opponent (this assumes that if // the opponent cast an aura on the opposing permanent, it's not with good intentions, and thus it might // be better to have a pristine copy of the card - might not always be a correct assumption, but sounds // like a reasonable default for some cards). diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 04b2e5b66da..52f2dfa00dd 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -543,13 +543,27 @@ public class ChangeZoneEffect extends SpellAbilityEffect { movedCard.turnFaceDown(true); } if (sa.hasParam("Attacking")) { - // What should they attack? - FCollectionView defenders = game.getCombat().getDefenders(); - if (!defenders.isEmpty()) { - // Blockeres are already declared, set this to unblocked - game.getCombat().addAttacker(tgtC, defenders.getFirst()); - game.getCombat().getBandOfAttacker(tgtC).setBlocked(false); - game.fireEvent(new GameEventCombatChanged()); + final Combat combat = game.getCombat(); + if ( null != combat ) { + final FCollectionView e = combat.getDefenders(); + + GameEntity defender = null; + if (sa.hasParam("DefinedDefender")) { + FCollection objs = AbilityUtils.getDefinedObjects(sa.getHostCard(), sa.getParam("DefinedDefender"), sa); + for(GameObject obj : objs) { + if (obj instanceof GameEntity) { + defender = (GameEntity)obj; + break; + } + } + } else { + defender = player.getController().chooseSingleEntityForEffect(e, sa, "Declare a defender for " + movedCard ); + } + if (defender != null) { + combat.addAttacker(movedCard, defender); + game.getCombat().getBandOfAttacker(movedCard).setBlocked(false); + game.fireEvent(new GameEventCombatChanged()); + } } } if (sa.hasParam("Ninjutsu")) { @@ -1028,6 +1042,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (defender != null) { combat.addAttacker(c, defender); + game.getCombat().getBandOfAttacker(c).setBlocked(false); game.fireEvent(new GameEventCombatChanged()); } } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index afb8d498aae..bf6a8e8a045 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -357,6 +357,8 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { runParams.put("Target", tgt); getSourceCard().getGame().getTriggerHandler().runTrigger(TriggerType.BecomesTarget, runParams, false); } + runParams.put("Targets", target.getTargets()); + getSourceCard().getGame().getTriggerHandler().runTrigger(TriggerType.BecomesTargetOnce, runParams, false); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java new file mode 100644 index 00000000000..bd8a2868c51 --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java @@ -0,0 +1,95 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.game.trigger; + +import forge.game.GameObject; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Trigger_BecomesTargetOnce class. + *

+ * + * @author Forge + * @version $Id$ + * @since 1.0.15 + */ +public class TriggerBecomesTargetOnce extends Trigger { + + /** + *

+ * Constructor for Trigger_BecomesTargetOnce. + *

+ * + * @param params + * a {@link java.util.HashMap} object. + * @param host + * a {@link forge.game.card.Card} object. + * @param intrinsic + * the intrinsic + */ + public TriggerBecomesTargetOnce(final java.util.Map params, final Card host, final boolean intrinsic) { + super(params, host, intrinsic); + } + + /** {@inheritDoc} */ + @SuppressWarnings("unchecked") + @Override + public final boolean performTest(final Map runParams2) { + if (this.mapParams.containsKey("ValidSource")) { + if (!matchesValid(((SpellAbility) runParams2.get("SourceSA")).getHostCard(), this.mapParams + .get("ValidSource").split(","), this.getHostCard())) { + return false; + } + } + if (this.mapParams.containsKey("ValidTarget")) { + List targets = (List) runParams2.get("Targets"); + boolean valid = false; + for (GameObject b : targets) { + if (matchesValid(b, this.mapParams.get("ValidTarget").split(","), this.getHostCard())) { + valid = true; + break; + } + } + if (!valid) { + return false; + } + } + return true; + } + + /** {@inheritDoc} */ + @Override + public final void setTriggeringObjects(final SpellAbility sa) { + sa.setTriggeringObject("SourceSA", this.getRunParams().get("SourceSA")); + sa.setTriggeringObject("Source", ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard()); + sa.setTriggeringObject("Targets", this.getRunParams().get("Targets")); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + sb.append("Source: ").append(((SpellAbility) sa.getTriggeringObject("SourceSA")).getHostCard()).append(", "); + sb.append("Targets: ").append(sa.getTriggeringObject("Targets")); + return sb.toString(); + } +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 9061aa652d2..307dcb5a1f4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -27,6 +27,7 @@ public enum TriggerType { BecomeMonstrous(TriggerBecomeMonstrous.class), BecomeRenowned(TriggerBecomeRenowned.class), BecomesTarget(TriggerBecomesTarget.class), + BecomesTargetOnce(TriggerBecomesTargetOnce.class), BlockersDeclared(TriggerBlockersDeclared.class), Blocks(TriggerBlocks.class), Championed(TriggerChampioned.class), diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 7a814cc6a4f..0c3907380c9 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -438,6 +438,8 @@ public class MagicStack /* extends MyObservable */ implements Iterable | Planeswalker$ true | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -A:AB$ PutCounterAll | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ true | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPutCounterAll | SpellDescription$ Put a +1/+1 counter on each creature you control and a loyalty counter on each other planeswalker you control. -SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Planeswalker.YouCtrl+Other | CounterType$ LOYALTY | CounterNum$ 1 +A:AB$ GainLife | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | LifeAmount$ 3 | SpellDescription$ You gain 3 life. +A:AB$ PutCounterAll | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ OwnCreatsAndOtherPWs | SubAbility$ DBPutCounterAll | SpellDescription$ Put a +1/+1 counter on each creature you control and a loyalty counter on each other planeswalker you control. +SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Planeswalker.YouCtrl+Other | CounterType$ LOYALTY | CounterNum$ 1 | AILogic$ OwnCreatsAndOtherPWs DeckHas:Ability$Counters & Ability$LifeGain Oracle:Creatures you control have vigilance.\n[+1]: You gain 3 life.\n[-2]: Put a +1/+1 counter on each creature you control and a loyalty counter on each other planeswalker you control. diff --git a/forge-gui/res/cardsfolder/h/horobi_deaths_wail.txt b/forge-gui/res/cardsfolder/h/horobi_deaths_wail.txt index f53c4681af0..8b387242298 100644 --- a/forge-gui/res/cardsfolder/h/horobi_deaths_wail.txt +++ b/forge-gui/res/cardsfolder/h/horobi_deaths_wail.txt @@ -3,7 +3,7 @@ ManaCost:2 B B Types:Legendary Creature Spirit PT:4/4 K:Flying -T:Mode$ BecomesTarget | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever a creature becomes the target of a spell or ability, destroy that creature. +T:Mode$ BecomesTarget | ValidTarget$ Creature+inZoneBattlefield | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever a creature becomes the target of a spell or ability, destroy that creature. SVar:TrigDestroy:DB$Destroy | Defined$ TriggeredTarget SVar:Picture:http://www.wizards.com/global/images/magic/general/horobi_deaths_wail.jpg Oracle:Flying\nWhenever a creature becomes the target of a spell or ability, destroy that creature. diff --git a/forge-gui/res/cardsfolder/upcoming/leyline_of_combustion.txt b/forge-gui/res/cardsfolder/upcoming/leyline_of_combustion.txt new file mode 100644 index 00000000000..736c6d160a3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/leyline_of_combustion.txt @@ -0,0 +1,8 @@ +Name:Leyline of Combustion +ManaCost:2 R R +Types:Enchantment +K:MayEffectFromOpeningHand:FromHand +SVar:FromHand:DB$ ChangeZone | Defined$ Self | Origin$ Hand | Destination$ Battlefield | SpellDescription$ If CARDNAME is in your opening hand, you may begin the game with it on the battlefield. +T:Mode$ BecomesTargetOnce | ValidTarget$ You,Permanent.YouCtrl+inZoneBattlefield | ValidSource$ Card.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever you and/or at least one permanent you control becomes the target of a spell or ability an opponent controls, CARDNAME deals 2 damage to that player. +SVar:TrigDmg:DB$ DealDamage | Defined$ TriggeredSourceSAController | NumDmg$ 2 +Oracle:If Leyline of Combustion is in your opening hand, you may begin the game with it on the battlefield.\nWhenever you and/or at least one permanent you control becomes the target of a spell or ability an opponent controls, Leyline of Combustion deals 2 damage to that player. diff --git a/forge-gui/res/cardsfolder/w/wild_defiance.txt b/forge-gui/res/cardsfolder/w/wild_defiance.txt index f6582b3ff22..7039d2e907b 100644 --- a/forge-gui/res/cardsfolder/w/wild_defiance.txt +++ b/forge-gui/res/cardsfolder/w/wild_defiance.txt @@ -1,7 +1,7 @@ Name:Wild Defiance ManaCost:2 G Types:Enchantment -T:Mode$ BecomesTarget | ValidTarget$ Creature.YouCtrl | ValidSource$ Instant,Sorcery | SourceType$ spell | TriggerZones$ Battlefield | Execute$ WildPump | TriggerDescription$ Whenever a creature you control becomes the target of an instant or sorcery spell, it gets +3/+3 until end of turn. +T:Mode$ BecomesTarget | ValidTarget$ Creature.YouCtrl+inZoneBattlefield | ValidSource$ Instant,Sorcery | SourceType$ spell | TriggerZones$ Battlefield | Execute$ WildPump | TriggerDescription$ Whenever a creature you control becomes the target of an instant or sorcery spell, it gets +3/+3 until end of turn. SVar:WildPump:DB$ Pump | Defined$ TriggeredTarget | NumAtt$ +3 | NumDef$ +3 SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_defiance.jpg Oracle:Whenever a creature you control becomes the target of an instant or sorcery spell, that creature gets +3/+3 until end of turn. diff --git a/forge-gui/res/editions/War of the Spark.txt b/forge-gui/res/editions/War of the Spark.txt index b3a8147df17..25e9a60aab0 100644 --- a/forge-gui/res/editions/War of the Spark.txt +++ b/forge-gui/res/editions/War of the Spark.txt @@ -5,7 +5,7 @@ Name=War of the Spark Code2=WAR MciCode=war Type=Expansion -BoosterCovers=5 +BoosterCovers=3 Booster=10 Common:!fromSheet("WAR Secret Cards"), 3 Uncommon:!fromSheet("WAR Secret Cards"), 1 RareMythic:!fromSheet("WAR Secret Cards"), 1 BasicLand BoosterMustContain=Planeswalker diff --git a/forge-gui/res/puzzle/PS_GRNS.pzl.example b/forge-gui/res/puzzle/PS_GRNS.pzl.example new file mode 100644 index 00000000000..91a431d18e1 --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRNS.pzl.example @@ -0,0 +1,24 @@ +# This is an example puzzle, currently disabled. It demonstrates how to set up a puzzle where a spell is put on stack +# at the beginning of the puzzle. Unfortunately, this particular puzzle doesn't work well in Forge due to the fact that +# the AI does not use its resources optimally, thus naturally failing to defeat the player in one turn and losing. +# Also, this puzzle demonstrates how it's possible to add a card which is owned by a player other than its controller. +[metadata] +Name:Possibility Storm - Guilds of Ravnica Special (Survive the Turn) +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/01/094.-GRN004-3.jpg +Goal:Survive +Turns:1 +Difficulty:Special +Description:Start in your opponent's first main phase with their Mnemonic Betrayal just cast and on the stack. Find a way to survive the turn! The trigger from Deeproot Champion is also on the stack and it will get one +1/+1 counter! Assume that any cards that could be drawn by either player are lands that enter the battlefield tapped. Goblin Banneret and Runaway Steam-Kin controlled by your opponent are owned by you. +[state] +humanlife=9 +ailife=20 +turn=1 +activeplayer=ai +activephase=MAIN1 +humanhand=Mission Briefing +humanlibrary=Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard +humangraveyard=Fervent Strike;Warlord's Fury;Dinosaur Stampede;Sure Strike;Crash the Ramparts;Buccaneer's Bravado;Rescue;Forebear's Blade +humanbattlefield=Raptor Hatchling;Diamond Mare|ChosenColor:Blue;Beamsplitter Mage;Island;Island;Island;Mountain;Forest +ailibrary=Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard;Foul Orchard +aibattlefield=Relic Runner;Goblin Banneret|Owner:Human;Deeproot Champion;Runaway Steam-Kin|Owner:Human;Overgrown Tomb;Overgrown Tomb;Overgrown Tomb;Overgrown Tomb|Tapped;Island;Island;Island;Island|Tapped +aiputonstack=Mnemonic Betrayal diff --git a/forge-gui/res/puzzle/PS_WAR7.pzl b/forge-gui/res/puzzle/PS_WAR7.pzl new file mode 100644 index 00000000000..ab621c7d5e5 --- /dev/null +++ b/forge-gui/res/puzzle/PS_WAR7.pzl @@ -0,0 +1,17 @@ +[metadata] +Name:Possibility Storm - War of the Spark #07 +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/06/117.-WAR7-v2.jpg +Goal:Win +Turns:1 +Difficulty:Rare +Description:Win this turn. Assume any cards you could draw are irrelevant to the puzzle. +[state] +humanlife=8 +ailife=20 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Narset's Reversal;Siren's Ruse;Fraying Omnipotence;Expansion // Explosion +humanlibrary=Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus;Gigantosaurus +humanbattlefield=Saheeli, Sublime Artificer|Counters:LOYALTY=3;Desperate Castaways;Sleek Schooner;Naru Meha, Master Wizard;Firemind Vessel;Steam Vents|NoETBTrigs;Steam Vents|NoETBTrigs;Steam Vents|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs +aibattlefield=God-Eternal Oketra;t:Zombie Warrior,P:4,T:4,Cost:no cost,Color:B,Types:Creature-Zombie-Warrior,Keywords:Vigilance,Image:b_4_4_zombie_warrior_vigilance_war;Impassioned Orator;t:Zombie Warrior,P:4,T:4,Cost:no cost,Color:B,Types:Creature-Zombie-Warrior,Keywords:Vigilance,Image:b_4_4_zombie_warrior_vigilance_war;Impassioned Orator;t:Zombie Warrior,P:4,T:4,Cost:no cost,Color:B,Types:Creature-Zombie-Warrior,Keywords:Vigilance,Image:b_4_4_zombie_warrior_vigilance_war;Impassioned Orator From 879d01b1ec1583abbdf2a066de962e72478bb5c0 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 10:17:56 +0800 Subject: [PATCH 40/64] Merge branch 'm20spoilers' into m20 Update some scripts --- forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt | 2 ++ .../res/cardsfolder/upcoming/creeping_trailblazer.txt | 5 +++++ .../res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt | 7 ++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt b/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt index 9e83f4a15da..f5da45f228c 100644 --- a/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt +++ b/forge-gui/res/cardsfolder/upcoming/chandras_embercat.txt @@ -2,4 +2,6 @@ Name:Chandra's Embercat ManaCost:1 R Types:Creature Elemental Cat PT:2/2 +A:AB$ Mana | Cost$ T | Produced$ R | RestrictValid$ Spell.Elemental,Spell.Planeswalker+Chandra | SpellDescription$ Add {R}. Spend this mana only to cast an Elemental spell or a Chandra planeswalker spell. +SVar:BuffedBy:Planeswalker.Chandra Oracle:{T}: Add {R}. Spend this mana only to cast an Elemental spell or a Chandra planeswalker spell. diff --git a/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt b/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt index 243f3ccc68a..1f415d2e2da 100644 --- a/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt +++ b/forge-gui/res/cardsfolder/upcoming/creeping_trailblazer.txt @@ -2,4 +2,9 @@ Name:Creeping Trailblazer ManaCost:R G Types:Creature Elemental PT:2/2 +S:Mode$ Continuous | Affected$ Elemental.YouCtrl+Other | AddPower$ 1 | Description$ Other Elementals you control get +1/+0. +SVar:PlayMain1:TRUE +A:AB$ Pump | Cost$ 2 R G | NumAtt$ +X | NumDef$ +X | References$ X | SpellDescription$ CARDNAME gets +1/+1 until end of turn for each Elemental you control. +SVar:X:Count$Valid Elemental.YouCtrl +SVar:BuffedBy:Card.Elemental Oracle:Other Elementals you control get +1/+0.\n{2}{R}{G}: Creeping Trailblazer gets +1/+1 until end of turn for each Elemental you control. diff --git a/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt b/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt index 1d3d480a2cf..a04f65dda83 100644 --- a/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt +++ b/forge-gui/res/cardsfolder/upcoming/rienne_angel_of_rebirth.txt @@ -1,6 +1,11 @@ Name:Rienne, Angel of Rebirth ManaCost:2 R G W Types:Legendary Creature Angel -K:Flying PT:5/4 +K:Flying +S:Mode$ Continuous | Affected$ Creature.MultiColor+Other+YouCtrl | AddPower$ 1 | Description$ Other multicolored creatures you control get +1/+0. +SVar:PlayMain1:TRUE +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.MultiColor+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ DelayedTrig | TriggerDescription$ Whenever another multicolored creature you control dies, return it to its owner's hand at the beginning of the next end step. +SVar:TrigDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ TriggeredCard | TriggerDescription$ Return it to its owner's hand at the beginning of the next end step. +SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Graveyard | Destination$ Hand Oracle:Flying\nOther multicolored creatures you control get +1/+0.\nWhenever another multicolored creature you control dies, return it to its owner's hand at the beginning of the next end step. From 8b8a61dd743f943e24c8de671d029c0d7566706e Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Wed, 19 Jun 2019 03:04:58 +0000 Subject: [PATCH 41/64] Tuesday evening spoilers --- .../cardsfolder/upcoming/captivating_gyre.txt | 4 ++++ .../res/cardsfolder/upcoming/legions_end.txt | 4 ++++ .../upcoming/repeated_reverberation.txt | 4 ++++ .../cardsfolder/upcoming/season_of_growth.txt | 4 ++++ .../upcoming/unchained_berserker.txt | 6 +++++ .../upcoming/wolfriders_saddle.txt | 5 ++++ forge-gui/res/editions/Magic 2020.txt | 24 +++++++++++++++++-- 7 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/legions_end.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/season_of_growth.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt b/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt new file mode 100644 index 00000000000..275713e50d9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt @@ -0,0 +1,4 @@ +Name:Captivating Gyre +ManaCost:4 U U +Types:Sorcery +Oracle:Return up to three target creatures to their owners' hands. diff --git a/forge-gui/res/cardsfolder/upcoming/legions_end.txt b/forge-gui/res/cardsfolder/upcoming/legions_end.txt new file mode 100644 index 00000000000..05ea90f780a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/legions_end.txt @@ -0,0 +1,4 @@ +Name:Legion's End +ManaCost:1 B +Types:Sorcery +Oracle:Exile target creature an opponent controls with converted mana cost 2 or less and all other creatures that player controls with the same name as that creature. Then that player reveals their hand and exiles all cards with that name from their hand and graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt b/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt new file mode 100644 index 00000000000..4a13d3291af --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt @@ -0,0 +1,4 @@ +Name:Repeated Reverberation +ManaCost:2 R R +Types:Instant +Oracle:When you next cast an instant spell, cast a sorcery spell, or activate a loyalty ability this turn, copy that spell or ability twice. You may choose new targets for the copies. diff --git a/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt b/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt new file mode 100644 index 00000000000..dddb6ffe5cd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt @@ -0,0 +1,4 @@ +Name:Season of Growth +ManaCost:1 G +Types:Enchantment +Oracle:Whenever a creature enters the battlefield under your control, scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.)\nWhenever you cast a spell that targets a creature you control, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt b/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt new file mode 100644 index 00000000000..9783fb5099e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt @@ -0,0 +1,6 @@ +Name:Unchained Berserker +ManaCost:1 R +Types:Creature Human Berserker +K:Protection from white +PT:1/1 +Oracle:Protection from white (This creature can't be blocked, targeted, dealt damage, enchanted, or equipped by anything white.)\nUnchained Berserker gets +2/+0 as long as it's attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt b/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt new file mode 100644 index 00000000000..e9c8e038a65 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt @@ -0,0 +1,5 @@ +Name:Wolfrider's Saddle +ManaCost:3 G +Types:Artifact Equipment +K:Equip:3 +Oracle:When Wolfrider's Saddle enters the battlefield, create a 2/2 green Wolf creature token, then attach Wolfrider's Saddle to it.\nEquipped creature gets +1/+1 and can't be blocked by more than one creature.\nEquip{3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/editions/Magic 2020.txt b/forge-gui/res/editions/Magic 2020.txt index 39daa4d5f8d..cd4239ad32c 100644 --- a/forge-gui/res/editions/Magic 2020.txt +++ b/forge-gui/res/editions/Magic 2020.txt @@ -8,7 +8,9 @@ BoosterCovers=3 Booster=10 Common:!fromSheet("M20 Secret Cards"), 3 Uncommon:!fromSheet("M20 Secret Cards"), 1 RareMythic:!fromSheet("M20 Secret Cards"), 1 BasicLand [cards] + 2 M Ajani, Strength of the Pride + 4 U Angel of Vitality 8 R Angelic Cleric @@ -27,7 +29,7 @@ C Pacifism 33 R Planar Cleansing -35 R Rule of Law +35 U Rule of Law 39 R Starfield Mystic @@ -35,8 +37,12 @@ C Pacifism 46 R Atemsis, All-Seeing +51 U Captivating Gyre + 55 C Convolute +57 R Dungeon Geists + 59 R Flood of Tears 64 R Leyline of Anticipation @@ -48,9 +54,12 @@ C Pacifism 87 U Blightbeetle +92 C Bone Splinters + 95 U Disfigure 96 R Dread Presence +106 R Legion's End 107 R Leyline of the Void 113 R Scheming Symmetry @@ -84,8 +93,10 @@ C Pacifism 154 C Reckless Airstrike -163 U Uncaged Fury +156 R Repeated Reverberation +163 U Uncaged Fury +164 U Unchained Berserker 165 U Barkhide Troll 175 C Growth Cycle @@ -94,6 +105,10 @@ C Pacifism 187 U Overgrowth Elemental +189 U Pulse of Murasa + +191 U Season of Growth + 195 C Silverback Shaman 197 R Thrashing Brontodon @@ -103,6 +118,8 @@ C Pacifism 202 R Wakeroot Elemental +204 U Wolfrider's Saddle + 206 U Corpse Knight 207 U Creeping Trailblazer 208 U Empyrean Eagle @@ -119,6 +136,8 @@ C Pacifism 244 U Cryptic Caves +247 R Field of the Dead + 280 L Forest 281 M Rienne, Angel of Rebirth @@ -127,4 +146,5 @@ ajanis_pridemate r_1_1_elemental w_1_1_soldier w_1_1_spirit_flying +g_2_2_wolf b_2_2_zombie From 7e5cc4d9fe5f7ed1a2694628b096321b80d9f16c Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 12:00:25 +0800 Subject: [PATCH 42/64] Temporarily removed unscripted cards for merge --- forge-gui/res/cardsfolder/upcoming/aether_gust.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/blightbeetle.txt | 6 ------ forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt | 4 ---- .../res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt | 5 ----- .../res/cardsfolder/upcoming/chandra_awakened_inferno.txt | 5 ----- .../res/cardsfolder/upcoming/chandra_novice_pyromancer.txt | 5 ----- .../res/cardsfolder/upcoming/chinese_goblin_miner.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/corpse_knight.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/dread_presence.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt | 6 ------ forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/flame_sweep.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt | 5 ----- .../res/cardsfolder/upcoming/golos_tireless_pilgrim.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/growth_cycle.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt | 6 ------ forge-gui/res/cardsfolder/upcoming/infuriate.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt | 5 ----- .../res/cardsfolder/upcoming/kaalia_zenith_seeker.txt | 7 ------- forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt | 6 ------ forge-gui/res/cardsfolder/upcoming/legions_end.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/octoprophet.txt | 5 ----- .../res/cardsfolder/upcoming/overgrowth_elemental.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt | 4 ---- .../res/cardsfolder/upcoming/repeated_reverberation.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/risen_reef.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/season_of_growth.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt | 6 ------ forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/thought_distortion.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt | 6 ------ forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt | 6 ------ forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt | 5 ----- 42 files changed, 204 deletions(-) delete mode 100644 forge-gui/res/cardsfolder/upcoming/aether_gust.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/blightbeetle.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/corpse_knight.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/dread_presence.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/flame_sweep.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/growth_cycle.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/infuriate.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/legions_end.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/octoprophet.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/risen_reef.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/season_of_growth.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/thought_distortion.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/aether_gust.txt b/forge-gui/res/cardsfolder/upcoming/aether_gust.txt deleted file mode 100644 index e096b110179..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/aether_gust.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Aether Gust -ManaCost:1 U -Types:Instant -Oracle:Choose target spell or permanent that's red or green. Its owner puts it on the top or bottom of their library. diff --git a/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt b/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt deleted file mode 100644 index 6d7dc19a072..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Angelic Cleric -ManaCost:W W -Types:Human Cleric -PT:1/4 -Oracle:Whenever an Angel enters the battlefield under your control, you gain 4 life.\nWhenever an Angel you control dies, create a 1/1 white Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt b/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt deleted file mode 100644 index f0cedb64706..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Bacchetta Punitiva -ManaCost:3 -Types:Artifact -Oracle:{3}, {T}: Bacchetta Punitiva deals 1 damage to any target.\nWhen Bacchetta Punitiva is put into a graveyard from the battlefield, it deals 5 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt b/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt deleted file mode 100644 index 38ea2e00b90..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Barkhide Troll -ManaCost:G G -Types:Creature Troll -PT:2/2 -Oracle:Barkhide Troll enters the battlefield with a +1/+1 counter on it.\n{1}, Remove a +1/+1 counter from Barkhide Troll: Barkhide Troll gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt b/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt deleted file mode 100644 index f5202dd260e..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt +++ /dev/null @@ -1,6 +0,0 @@ -Name:Blightbeetle -ManaCost:1 B -Types:Creature Insect -PT:1/1 -K:Protection from green -Oracle:Protection from green (This creature can't be blocked, targeted, dealt damage, enchanted, or equipped by anything green.)\nCreatures your opponents control can't have +1/+1 counters put on them. diff --git a/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt b/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt deleted file mode 100644 index 275713e50d9..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Captivating Gyre -ManaCost:4 U U -Types:Sorcery -Oracle:Return up to three target creatures to their owners' hands. diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt b/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt deleted file mode 100644 index e21a8eb4dbd..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Chandra, Acolyte of Flame -ManaCost:1 R R -Types:Legendary Planeswalker Chandra -Loyalty:4 -Oracle:[0]: Put a loyalty counter on each red planeswalker you control.\n[0]: Create two 1/1 red Elemental creature tokens. They gain haste. Sacrifice them at the beginning of the next end step.\n[-2]: You may cast target instant or sorcery card with converted mana cost 3 or less from your graveyard. If that card would be put into your graveyard this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt b/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt deleted file mode 100644 index c29c57e1f44..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Chandra, Awakened Inferno -ManaCost:4 R R -Types:Legendary Planeswalker Chandra -Loyalty:6 -Oracle:This spell can't be countered.\n[+2]: Each opponent gets an emblem with "At the beginning of your upkeep, this emblem deals 1 damage to you."\n[-3]: Chandra, Awakened Inferno deals 3 damage to each non-Elemental creature.\n[-X]: Chandra, Awakened Inferno deals X damage to target creature or planeswalker. If a permanent dealt damage this way would die this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt b/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt deleted file mode 100644 index 0c03e2eea0c..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Chandra, Novice Pyromancer -ManaCost:3 R -Types:Legendary Planeswalker Chandra -Loyalty:5 -Oracle:[+1]: Elementals you control get +2/+0 until end of turn.\n[-1]: Add {R}{R}.\n[-2]: Chandra, Novice Pyromancer deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt b/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt deleted file mode 100644 index b386b0d8989..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Chinese Goblin Miner -ManaCost:2 R -Types:Creature Goblin -PT:3/2 -Oracle:{3}, {T}, Sacrifice a land or artifact: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt b/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt deleted file mode 100644 index 14399e0512d..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Corpse Knight -ManaCost:W B -Types:Creature Zombie Knight -PT:2/2 -Oracle:Whenever another creature enters the battlefield under your control, each opponent loses 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/dread_presence.txt b/forge-gui/res/cardsfolder/upcoming/dread_presence.txt deleted file mode 100644 index 0ccfcedaa02..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/dread_presence.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Dread Presence -ManaCost:3 B -Types:Creature Nightmare -PT:3/3 -Oracle:Whenever a Swamp enters the battlefield under your control, choose one--\n*You draw a card and you lose 1 life.\n*Dread Presence deals 2 damage to any target and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt b/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt deleted file mode 100644 index d2c86333d68..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt +++ /dev/null @@ -1,6 +0,0 @@ -Name:Empyrean Eagle -ManaCost:1 W U -Types:Creature Bird Spirit -K:Flying -PT:2/3 -Oracle:Flying\nOther creatures you control with flying get +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt deleted file mode 100644 index 7d391071ffe..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Field of the Dead -ManaCost:no cost -Types:Land -Oracle:Field of the Dead enters the battlefield tapped.\n{T}: Add {C}.\nWhenever Field fo the Dead or another land enters the battlefield under your control, if you control seven or more lands with different names, create a 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt b/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt deleted file mode 100644 index 29b66bef38c..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Flame Sweep -ManaCost:2 R -Types:Instant -Oracle:Flame Sweep deals 2 damage to each creature except for creatures you control with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt b/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt deleted file mode 100644 index cd78c2928e0..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Flood of Tears -ManaCost:4 U U -Types:Sorcery -Oracle:Return all nonland permanents to their owners' hands. If you return four or more nontoken permanents you control this way, you may put a permanent card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt b/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt deleted file mode 100644 index 6b316fabae9..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Goblin Hitchhiker -ManaCost:1 R -Types:Creature Goblin -PT:2/1 -Oracle:{R}: Goblin Hitchhiker gains flying until end of turn. Activate this ability only if you control a creature with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt b/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt deleted file mode 100644 index da3d3c1b0c5..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Golos, Tireless Pilgrim -ManaCost:5 -Types:Legendary Artifact Creature Scout -PT:3/5 -Oracle:When Golos, Tireless Pilgrim enters the battlefield, you may search your library for a land card, put that card onto the battlefield tapped, then shuffle your library.\n{2}{W}{U}{B}{R}{G}: Exile the top three cards of your library. You may play them this turn without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt b/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt deleted file mode 100644 index ccdc1993795..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Growth Cycle -ManaCost:1 G -Types:Instant -Oracle:Target creature gets +3/+3 until end of turn. It gets an additional +2/+2 until end of turn for each card named Growth Cycle in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt b/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt deleted file mode 100644 index a97e3721abf..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt +++ /dev/null @@ -1,6 +0,0 @@ -Name:Hanged Executioner -ManaCost:2 W -Types:Creature Spirit -K:Flying -PT:1/1 -Oracle:Flying\nWhen Hanged Executioner enters the battlefield, create a 1/1 white Spirit creature token with flying.\n{3}{W}, Exile Hanged Executioner: Exile target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/infuriate.txt b/forge-gui/res/cardsfolder/upcoming/infuriate.txt deleted file mode 100644 index d14446bc20f..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/infuriate.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Infuriate -ManaCost:R -Types:Instant -Oracle:Target creature gets +3/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt b/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt deleted file mode 100644 index 5c80d969c56..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Ironroot Warlord -ManaCost:1 G W -Types:Creature Treefolk Soldier -PT:*/5 -Oracle:Ironroot Warlord's power is equal to the number of creatures you control.\n{3}{G}{W}: Create a 1/1 white Soldier creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt b/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt deleted file mode 100644 index 511c071f3fb..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt +++ /dev/null @@ -1,7 +0,0 @@ -Name:Kaalia, Zenith Seeker -ManaCost:R W B -Types:Legendary Creature Human Cleric -PT:3/3 -K:Flying -K:Vigilance -Oracle:Flying, vigilance\nWhen Kaalia, Zenith Seeker enters the battlefield, look at the top six cards of your library. You may reveal an Angel card, a Demon card, and/or a Dragon card from among them and put them into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt b/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt deleted file mode 100644 index aafdbefdc4b..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt +++ /dev/null @@ -1,6 +0,0 @@ -Name:Kykar, Wind's Fury -ManaCost:1 U R W -Types:Legendary Creature Bird Wizard -K:Flying -PT:3/3 -Oracle:Flying\nWhenever you cast a noncreature spell, create a 1/1 white Spirit creature token with flying.\nSacrifice a Spirit: Add {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/legions_end.txt b/forge-gui/res/cardsfolder/upcoming/legions_end.txt deleted file mode 100644 index 05ea90f780a..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/legions_end.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Legion's End -ManaCost:1 B -Types:Sorcery -Oracle:Exile target creature an opponent controls with converted mana cost 2 or less and all other creatures that player controls with the same name as that creature. Then that player reveals their hand and exiles all cards with that name from their hand and graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt b/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt deleted file mode 100644 index 147702c49a6..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Loxodon Lifesinger -ManaCost:5 W -Types:Creature Elephant Cleric -PT:4/6 -Oracle:When Loxodon Lifesinger enters the battlefield, you may have your life total become the total toughness of creatures you control.\n{5}{W}: Loxodon Lifesinger gets +X/+X until end of turn, where X is your life total. diff --git a/forge-gui/res/cardsfolder/upcoming/octoprophet.txt b/forge-gui/res/cardsfolder/upcoming/octoprophet.txt deleted file mode 100644 index c0c73e6e32f..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/octoprophet.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Octoprophet -ManaCost:3 U -Types:Creature Octopus -PT:3/3 -Oracle:When Octoprophet enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt b/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt deleted file mode 100644 index d489743c826..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Overgrowth Elemental -ManaCost:2 G -Types:Creature Elemental -PT:3/2 -Oracle:When Overgrowth Elemental enters the battlefield, put a +1/+1 counter on another target Elemental you control.\nWhenever another creature you control dies, you gain 1 life. If that creature was an Elemental, put a +1/+1 counter on Overgrowth Elemental. diff --git a/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt b/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt deleted file mode 100644 index 57f1ec86f04..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Reckless Airstrike -ManaCost:R -Types:Sorcery -Oracle:Choose one--\n*Reckless Airstrike deals 3 damage to target creature with flying.\n*Destroy target artifact. diff --git a/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt b/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt deleted file mode 100644 index 4a13d3291af..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Repeated Reverberation -ManaCost:2 R R -Types:Instant -Oracle:When you next cast an instant spell, cast a sorcery spell, or activate a loyalty ability this turn, copy that spell or ability twice. You may choose new targets for the copies. diff --git a/forge-gui/res/cardsfolder/upcoming/risen_reef.txt b/forge-gui/res/cardsfolder/upcoming/risen_reef.txt deleted file mode 100644 index c54a98fad26..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/risen_reef.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Risen Reef -ManaCost:1 G U -Types:Creature Elemental -PT:1/1 -Oracle:Whenever Risen Reef or another Elemental enters the battlefield under your control, look at the top card of your library. If it's a land card, you may put it onto the battlefield tapped. If you don't put the card onto the battlefield, put it into your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt b/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt deleted file mode 100644 index 93894ce396d..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Scheming Symmetry -ManaCost:B -Types:Sorcery -Oracle:Choose two target players. Each of them searches their library for a card, then shuffles their library and puts that card on top of it. diff --git a/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt b/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt deleted file mode 100644 index dddb6ffe5cd..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Season of Growth -ManaCost:1 G -Types:Enchantment -Oracle:Whenever a creature enters the battlefield under your control, scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.)\nWhenever you cast a spell that targets a creature you control, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt b/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt deleted file mode 100644 index e84728acca2..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt +++ /dev/null @@ -1,6 +0,0 @@ -Name:Silverback Shaman -ManaCost:3 G G -Types:Creature Ape Shaman -K:Trample -PT:5/4 -Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it's attacking.)\nWhen Silverback Shaman dies, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt b/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt deleted file mode 100644 index 5e63a536e84..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Starfield Mystic -ManaCost:1 W -Types:Creature Human Cleric -PT:2/2 -Oracle:Enchantment spells you cast cost {1} less to cast.\nWhenever an enchantment you control is put into a graveyard from the battlefield, put a +1/+1 counter on Starfield Mystic. diff --git a/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt b/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt deleted file mode 100644 index 7cc3323155c..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Thought Distortion -ManaCost:4 B B -Types:Sorcery -Oracle:This spell can't be countered.\nTarget opponent reveals their hand. Exile all noncreature, nonland cards from that player's hand and graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt b/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt deleted file mode 100644 index 9783fb5099e..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt +++ /dev/null @@ -1,6 +0,0 @@ -Name:Unchained Berserker -ManaCost:1 R -Types:Creature Human Berserker -K:Protection from white -PT:1/1 -Oracle:Protection from white (This creature can't be blocked, targeted, dealt damage, enchanted, or equipped by anything white.)\nUnchained Berserker gets +2/+0 as long as it's attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt b/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt deleted file mode 100644 index 5020241d005..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Veil of Summer -ManaCost:G -Types:Instant -Oracle:Draw a card if an opponent has cast a blue or black spell this turn. Spells you control can't be countered this turn. You and permanents you control gain hexproof from blue and from black until end of turn. (You and they can't be the targets of blue or black spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt b/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt deleted file mode 100644 index 74f6f82b832..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt +++ /dev/null @@ -1,6 +0,0 @@ -Name:Voracious Hydra -ManaCost:X G G -Types:Creature Hydra -PT:0/1 -K:Trample -Oracle:Trample\nVoracious Hydra enters the battlefield with X +1/+1 counters.\nWhen Voracious Hydra enters the battlefield, choose one--\n*Double the number of +1/+1 counters on Voracious Hydra.\n*You may have Voracious Hydra fight with target creature you don't control. diff --git a/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt b/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt deleted file mode 100644 index 9fc8c183daf..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Wakeroot Elemental -ManaCost:4 G G -Types:Creature Elemental -PT:5/5 -Oracle:{G}{G}{G}{G}{G}: Untap a land of your choice that you control. It becomes a 5/5 Elemental creature with haste. It's still a land. (This effect lasts until as long as that land is in play.) diff --git a/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt b/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt deleted file mode 100644 index e9c8e038a65..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Wolfrider's Saddle -ManaCost:3 G -Types:Artifact Equipment -K:Equip:3 -Oracle:When Wolfrider's Saddle enters the battlefield, create a 2/2 green Wolf creature token, then attach Wolfrider's Saddle to it.\nEquipped creature gets +1/+1 and can't be blocked by more than one creature.\nEquip{3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt b/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt deleted file mode 100644 index e1d1cc88d41..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Yarok's Fenlurker -ManaCost:B B -Types:Creature Horror -PT:1/1 -Oracle:When Yarok's Fenlurker enters the battlefield, each opponent exiles a card from their hand.\n{2}{B}: Yarok's Fenlurker gets +1/+1 until end of turn. From 9c1c075de2abedd42596215c406f0f10f61dfe11 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 12:08:53 +0800 Subject: [PATCH 43/64] The unimplemented m20 cards --- forge-gui/res/cardsfolder/upcoming/aether_gust.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/blightbeetle.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt | 4 ++++ .../res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt | 5 +++++ .../res/cardsfolder/upcoming/chandra_awakened_inferno.txt | 5 +++++ .../res/cardsfolder/upcoming/chandra_novice_pyromancer.txt | 5 +++++ .../res/cardsfolder/upcoming/chinese_goblin_miner.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/corpse_knight.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/dread_presence.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/flame_sweep.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt | 5 +++++ .../res/cardsfolder/upcoming/golos_tireless_pilgrim.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/growth_cycle.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/infuriate.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt | 5 +++++ .../res/cardsfolder/upcoming/kaalia_zenith_seeker.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/legions_end.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/octoprophet.txt | 5 +++++ .../res/cardsfolder/upcoming/overgrowth_elemental.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt | 4 ++++ .../res/cardsfolder/upcoming/repeated_reverberation.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/risen_reef.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/season_of_growth.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/thought_distortion.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt | 4 ++++ forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt | 5 +++++ 42 files changed, 204 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/aether_gust.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/blightbeetle.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/corpse_knight.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dread_presence.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/flame_sweep.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/growth_cycle.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/infuriate.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/legions_end.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/octoprophet.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/risen_reef.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/season_of_growth.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thought_distortion.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/aether_gust.txt b/forge-gui/res/cardsfolder/upcoming/aether_gust.txt new file mode 100644 index 00000000000..e096b110179 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/aether_gust.txt @@ -0,0 +1,4 @@ +Name:Aether Gust +ManaCost:1 U +Types:Instant +Oracle:Choose target spell or permanent that's red or green. Its owner puts it on the top or bottom of their library. diff --git a/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt b/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt new file mode 100644 index 00000000000..6d7dc19a072 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt @@ -0,0 +1,5 @@ +Name:Angelic Cleric +ManaCost:W W +Types:Human Cleric +PT:1/4 +Oracle:Whenever an Angel enters the battlefield under your control, you gain 4 life.\nWhenever an Angel you control dies, create a 1/1 white Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt b/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt new file mode 100644 index 00000000000..f0cedb64706 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt @@ -0,0 +1,4 @@ +Name:Bacchetta Punitiva +ManaCost:3 +Types:Artifact +Oracle:{3}, {T}: Bacchetta Punitiva deals 1 damage to any target.\nWhen Bacchetta Punitiva is put into a graveyard from the battlefield, it deals 5 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt b/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt new file mode 100644 index 00000000000..38ea2e00b90 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt @@ -0,0 +1,5 @@ +Name:Barkhide Troll +ManaCost:G G +Types:Creature Troll +PT:2/2 +Oracle:Barkhide Troll enters the battlefield with a +1/+1 counter on it.\n{1}, Remove a +1/+1 counter from Barkhide Troll: Barkhide Troll gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt b/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt new file mode 100644 index 00000000000..f5202dd260e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt @@ -0,0 +1,6 @@ +Name:Blightbeetle +ManaCost:1 B +Types:Creature Insect +PT:1/1 +K:Protection from green +Oracle:Protection from green (This creature can't be blocked, targeted, dealt damage, enchanted, or equipped by anything green.)\nCreatures your opponents control can't have +1/+1 counters put on them. diff --git a/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt b/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt new file mode 100644 index 00000000000..275713e50d9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt @@ -0,0 +1,4 @@ +Name:Captivating Gyre +ManaCost:4 U U +Types:Sorcery +Oracle:Return up to three target creatures to their owners' hands. diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt b/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt new file mode 100644 index 00000000000..e21a8eb4dbd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt @@ -0,0 +1,5 @@ +Name:Chandra, Acolyte of Flame +ManaCost:1 R R +Types:Legendary Planeswalker Chandra +Loyalty:4 +Oracle:[0]: Put a loyalty counter on each red planeswalker you control.\n[0]: Create two 1/1 red Elemental creature tokens. They gain haste. Sacrifice them at the beginning of the next end step.\n[-2]: You may cast target instant or sorcery card with converted mana cost 3 or less from your graveyard. If that card would be put into your graveyard this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt b/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt new file mode 100644 index 00000000000..c29c57e1f44 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt @@ -0,0 +1,5 @@ +Name:Chandra, Awakened Inferno +ManaCost:4 R R +Types:Legendary Planeswalker Chandra +Loyalty:6 +Oracle:This spell can't be countered.\n[+2]: Each opponent gets an emblem with "At the beginning of your upkeep, this emblem deals 1 damage to you."\n[-3]: Chandra, Awakened Inferno deals 3 damage to each non-Elemental creature.\n[-X]: Chandra, Awakened Inferno deals X damage to target creature or planeswalker. If a permanent dealt damage this way would die this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt b/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt new file mode 100644 index 00000000000..0c03e2eea0c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt @@ -0,0 +1,5 @@ +Name:Chandra, Novice Pyromancer +ManaCost:3 R +Types:Legendary Planeswalker Chandra +Loyalty:5 +Oracle:[+1]: Elementals you control get +2/+0 until end of turn.\n[-1]: Add {R}{R}.\n[-2]: Chandra, Novice Pyromancer deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt b/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt new file mode 100644 index 00000000000..b386b0d8989 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt @@ -0,0 +1,5 @@ +Name:Chinese Goblin Miner +ManaCost:2 R +Types:Creature Goblin +PT:3/2 +Oracle:{3}, {T}, Sacrifice a land or artifact: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt b/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt new file mode 100644 index 00000000000..14399e0512d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt @@ -0,0 +1,5 @@ +Name:Corpse Knight +ManaCost:W B +Types:Creature Zombie Knight +PT:2/2 +Oracle:Whenever another creature enters the battlefield under your control, each opponent loses 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/dread_presence.txt b/forge-gui/res/cardsfolder/upcoming/dread_presence.txt new file mode 100644 index 00000000000..0ccfcedaa02 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dread_presence.txt @@ -0,0 +1,5 @@ +Name:Dread Presence +ManaCost:3 B +Types:Creature Nightmare +PT:3/3 +Oracle:Whenever a Swamp enters the battlefield under your control, choose one--\n*You draw a card and you lose 1 life.\n*Dread Presence deals 2 damage to any target and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt b/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt new file mode 100644 index 00000000000..d2c86333d68 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt @@ -0,0 +1,6 @@ +Name:Empyrean Eagle +ManaCost:1 W U +Types:Creature Bird Spirit +K:Flying +PT:2/3 +Oracle:Flying\nOther creatures you control with flying get +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt new file mode 100644 index 00000000000..7d391071ffe --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt @@ -0,0 +1,4 @@ +Name:Field of the Dead +ManaCost:no cost +Types:Land +Oracle:Field of the Dead enters the battlefield tapped.\n{T}: Add {C}.\nWhenever Field fo the Dead or another land enters the battlefield under your control, if you control seven or more lands with different names, create a 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt b/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt new file mode 100644 index 00000000000..29b66bef38c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt @@ -0,0 +1,4 @@ +Name:Flame Sweep +ManaCost:2 R +Types:Instant +Oracle:Flame Sweep deals 2 damage to each creature except for creatures you control with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt b/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt new file mode 100644 index 00000000000..cd78c2928e0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt @@ -0,0 +1,4 @@ +Name:Flood of Tears +ManaCost:4 U U +Types:Sorcery +Oracle:Return all nonland permanents to their owners' hands. If you return four or more nontoken permanents you control this way, you may put a permanent card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt b/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt new file mode 100644 index 00000000000..6b316fabae9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt @@ -0,0 +1,5 @@ +Name:Goblin Hitchhiker +ManaCost:1 R +Types:Creature Goblin +PT:2/1 +Oracle:{R}: Goblin Hitchhiker gains flying until end of turn. Activate this ability only if you control a creature with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt b/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt new file mode 100644 index 00000000000..da3d3c1b0c5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt @@ -0,0 +1,5 @@ +Name:Golos, Tireless Pilgrim +ManaCost:5 +Types:Legendary Artifact Creature Scout +PT:3/5 +Oracle:When Golos, Tireless Pilgrim enters the battlefield, you may search your library for a land card, put that card onto the battlefield tapped, then shuffle your library.\n{2}{W}{U}{B}{R}{G}: Exile the top three cards of your library. You may play them this turn without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt b/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt new file mode 100644 index 00000000000..ccdc1993795 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt @@ -0,0 +1,4 @@ +Name:Growth Cycle +ManaCost:1 G +Types:Instant +Oracle:Target creature gets +3/+3 until end of turn. It gets an additional +2/+2 until end of turn for each card named Growth Cycle in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt b/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt new file mode 100644 index 00000000000..a97e3721abf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt @@ -0,0 +1,6 @@ +Name:Hanged Executioner +ManaCost:2 W +Types:Creature Spirit +K:Flying +PT:1/1 +Oracle:Flying\nWhen Hanged Executioner enters the battlefield, create a 1/1 white Spirit creature token with flying.\n{3}{W}, Exile Hanged Executioner: Exile target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/infuriate.txt b/forge-gui/res/cardsfolder/upcoming/infuriate.txt new file mode 100644 index 00000000000..d14446bc20f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/infuriate.txt @@ -0,0 +1,4 @@ +Name:Infuriate +ManaCost:R +Types:Instant +Oracle:Target creature gets +3/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt b/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt new file mode 100644 index 00000000000..5c80d969c56 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt @@ -0,0 +1,5 @@ +Name:Ironroot Warlord +ManaCost:1 G W +Types:Creature Treefolk Soldier +PT:*/5 +Oracle:Ironroot Warlord's power is equal to the number of creatures you control.\n{3}{G}{W}: Create a 1/1 white Soldier creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt b/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt new file mode 100644 index 00000000000..511c071f3fb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt @@ -0,0 +1,7 @@ +Name:Kaalia, Zenith Seeker +ManaCost:R W B +Types:Legendary Creature Human Cleric +PT:3/3 +K:Flying +K:Vigilance +Oracle:Flying, vigilance\nWhen Kaalia, Zenith Seeker enters the battlefield, look at the top six cards of your library. You may reveal an Angel card, a Demon card, and/or a Dragon card from among them and put them into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt b/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt new file mode 100644 index 00000000000..aafdbefdc4b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt @@ -0,0 +1,6 @@ +Name:Kykar, Wind's Fury +ManaCost:1 U R W +Types:Legendary Creature Bird Wizard +K:Flying +PT:3/3 +Oracle:Flying\nWhenever you cast a noncreature spell, create a 1/1 white Spirit creature token with flying.\nSacrifice a Spirit: Add {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/legions_end.txt b/forge-gui/res/cardsfolder/upcoming/legions_end.txt new file mode 100644 index 00000000000..05ea90f780a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/legions_end.txt @@ -0,0 +1,4 @@ +Name:Legion's End +ManaCost:1 B +Types:Sorcery +Oracle:Exile target creature an opponent controls with converted mana cost 2 or less and all other creatures that player controls with the same name as that creature. Then that player reveals their hand and exiles all cards with that name from their hand and graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt b/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt new file mode 100644 index 00000000000..147702c49a6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt @@ -0,0 +1,5 @@ +Name:Loxodon Lifesinger +ManaCost:5 W +Types:Creature Elephant Cleric +PT:4/6 +Oracle:When Loxodon Lifesinger enters the battlefield, you may have your life total become the total toughness of creatures you control.\n{5}{W}: Loxodon Lifesinger gets +X/+X until end of turn, where X is your life total. diff --git a/forge-gui/res/cardsfolder/upcoming/octoprophet.txt b/forge-gui/res/cardsfolder/upcoming/octoprophet.txt new file mode 100644 index 00000000000..c0c73e6e32f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/octoprophet.txt @@ -0,0 +1,5 @@ +Name:Octoprophet +ManaCost:3 U +Types:Creature Octopus +PT:3/3 +Oracle:When Octoprophet enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt b/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt new file mode 100644 index 00000000000..d489743c826 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt @@ -0,0 +1,5 @@ +Name:Overgrowth Elemental +ManaCost:2 G +Types:Creature Elemental +PT:3/2 +Oracle:When Overgrowth Elemental enters the battlefield, put a +1/+1 counter on another target Elemental you control.\nWhenever another creature you control dies, you gain 1 life. If that creature was an Elemental, put a +1/+1 counter on Overgrowth Elemental. diff --git a/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt b/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt new file mode 100644 index 00000000000..57f1ec86f04 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt @@ -0,0 +1,4 @@ +Name:Reckless Airstrike +ManaCost:R +Types:Sorcery +Oracle:Choose one--\n*Reckless Airstrike deals 3 damage to target creature with flying.\n*Destroy target artifact. diff --git a/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt b/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt new file mode 100644 index 00000000000..4a13d3291af --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt @@ -0,0 +1,4 @@ +Name:Repeated Reverberation +ManaCost:2 R R +Types:Instant +Oracle:When you next cast an instant spell, cast a sorcery spell, or activate a loyalty ability this turn, copy that spell or ability twice. You may choose new targets for the copies. diff --git a/forge-gui/res/cardsfolder/upcoming/risen_reef.txt b/forge-gui/res/cardsfolder/upcoming/risen_reef.txt new file mode 100644 index 00000000000..c54a98fad26 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/risen_reef.txt @@ -0,0 +1,5 @@ +Name:Risen Reef +ManaCost:1 G U +Types:Creature Elemental +PT:1/1 +Oracle:Whenever Risen Reef or another Elemental enters the battlefield under your control, look at the top card of your library. If it's a land card, you may put it onto the battlefield tapped. If you don't put the card onto the battlefield, put it into your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt b/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt new file mode 100644 index 00000000000..93894ce396d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt @@ -0,0 +1,4 @@ +Name:Scheming Symmetry +ManaCost:B +Types:Sorcery +Oracle:Choose two target players. Each of them searches their library for a card, then shuffles their library and puts that card on top of it. diff --git a/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt b/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt new file mode 100644 index 00000000000..dddb6ffe5cd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt @@ -0,0 +1,4 @@ +Name:Season of Growth +ManaCost:1 G +Types:Enchantment +Oracle:Whenever a creature enters the battlefield under your control, scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.)\nWhenever you cast a spell that targets a creature you control, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt b/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt new file mode 100644 index 00000000000..e84728acca2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt @@ -0,0 +1,6 @@ +Name:Silverback Shaman +ManaCost:3 G G +Types:Creature Ape Shaman +K:Trample +PT:5/4 +Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it's attacking.)\nWhen Silverback Shaman dies, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt b/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt new file mode 100644 index 00000000000..5e63a536e84 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt @@ -0,0 +1,5 @@ +Name:Starfield Mystic +ManaCost:1 W +Types:Creature Human Cleric +PT:2/2 +Oracle:Enchantment spells you cast cost {1} less to cast.\nWhenever an enchantment you control is put into a graveyard from the battlefield, put a +1/+1 counter on Starfield Mystic. diff --git a/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt b/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt new file mode 100644 index 00000000000..7cc3323155c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt @@ -0,0 +1,4 @@ +Name:Thought Distortion +ManaCost:4 B B +Types:Sorcery +Oracle:This spell can't be countered.\nTarget opponent reveals their hand. Exile all noncreature, nonland cards from that player's hand and graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt b/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt new file mode 100644 index 00000000000..9783fb5099e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt @@ -0,0 +1,6 @@ +Name:Unchained Berserker +ManaCost:1 R +Types:Creature Human Berserker +K:Protection from white +PT:1/1 +Oracle:Protection from white (This creature can't be blocked, targeted, dealt damage, enchanted, or equipped by anything white.)\nUnchained Berserker gets +2/+0 as long as it's attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt b/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt new file mode 100644 index 00000000000..5020241d005 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt @@ -0,0 +1,4 @@ +Name:Veil of Summer +ManaCost:G +Types:Instant +Oracle:Draw a card if an opponent has cast a blue or black spell this turn. Spells you control can't be countered this turn. You and permanents you control gain hexproof from blue and from black until end of turn. (You and they can't be the targets of blue or black spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt b/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt new file mode 100644 index 00000000000..74f6f82b832 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt @@ -0,0 +1,6 @@ +Name:Voracious Hydra +ManaCost:X G G +Types:Creature Hydra +PT:0/1 +K:Trample +Oracle:Trample\nVoracious Hydra enters the battlefield with X +1/+1 counters.\nWhen Voracious Hydra enters the battlefield, choose one--\n*Double the number of +1/+1 counters on Voracious Hydra.\n*You may have Voracious Hydra fight with target creature you don't control. diff --git a/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt b/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt new file mode 100644 index 00000000000..9fc8c183daf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt @@ -0,0 +1,5 @@ +Name:Wakeroot Elemental +ManaCost:4 G G +Types:Creature Elemental +PT:5/5 +Oracle:{G}{G}{G}{G}{G}: Untap a land of your choice that you control. It becomes a 5/5 Elemental creature with haste. It's still a land. (This effect lasts until as long as that land is in play.) diff --git a/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt b/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt new file mode 100644 index 00000000000..e9c8e038a65 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt @@ -0,0 +1,5 @@ +Name:Wolfrider's Saddle +ManaCost:3 G +Types:Artifact Equipment +K:Equip:3 +Oracle:When Wolfrider's Saddle enters the battlefield, create a 2/2 green Wolf creature token, then attach Wolfrider's Saddle to it.\nEquipped creature gets +1/+1 and can't be blocked by more than one creature.\nEquip{3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt b/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt new file mode 100644 index 00000000000..e1d1cc88d41 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt @@ -0,0 +1,5 @@ +Name:Yarok's Fenlurker +ManaCost:B B +Types:Creature Horror +PT:1/1 +Oracle:When Yarok's Fenlurker enters the battlefield, each opponent exiles a card from their hand.\n{2}{B}: Yarok's Fenlurker gets +1/+1 until end of turn. From ff7d4cfc31f1a3b87996a6ea846f9d4f2628c339 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 12:15:37 +0800 Subject: [PATCH 44/64] Merge branch 'master' of https://git.cardforge.org/core-developers/forge into m20 --- .../src/main/java/forge/item/PaperCard.java | 4 +- .../src/main/java/forge/control/FControl.java | 27 +- .../java/forge/itemmanager/CardManager.java | 29 +- .../itemmanager/filters/StatTypeFilter.java | 4 +- .../forge/itemmanager/views/ImageView.java | 11 +- .../deckeditor/controllers/ACEditorBase.java | 41 +- .../controllers/CEditorConstructed.java | 33 +- .../controllers/CEditorVariant.java | 8 +- .../controllers/DeckController.java | 6 +- .../deckeditor/menus/DeckFileMenu.java | 23 +- .../screens/deckeditor/views/VAllDecks.java | 6 +- .../screens/deckeditor/views/VBrawlDecks.java | 6 +- .../deckeditor/views/VCardCatalog.java | 4 +- .../deckeditor/views/VCommanderDecks.java | 6 +- .../deckeditor/views/VCurrentDeck.java | 20 +- .../screens/deckeditor/views/VDeckgen.java | 22 +- .../deckeditor/views/VTinyLeadersDecks.java | 6 +- .../home/settings/VSubmenuPreferences.java | 2 +- .../workshop/views/VWorkshopCatalog.java | 7 +- forge-gui/res/languages/de-DE.properties | 167 +++++- forge-gui/res/languages/en-US.properties | 561 +++++++++++------- forge-gui/res/languages/es-es.properties | 181 +++++- .../main/java/forge/itemmanager/GroupDef.java | 29 +- .../forge/itemmanager/SItemManagerUtil.java | 90 +-- 24 files changed, 916 insertions(+), 377 deletions(-) diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 41c05424bec..be80957515c 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -28,6 +28,7 @@ import forge.StaticData; import forge.card.CardDb; import forge.card.CardRarity; import forge.card.CardRules; +import forge.util.Localizer; import forge.util.TextUtil; /** @@ -95,7 +96,8 @@ public final class PaperCard implements Comparable, InventoryItemFro @Override public String getItemType() { - return "Card"; + final Localizer localizer = Localizer.getInstance(); + return localizer.getMessage("lblCard"); } public boolean hasImage() { diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index 4c836b0d76e..4f951641eb5 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -124,19 +124,16 @@ public enum FControl implements KeyEventDispatcher { * instantiated separately by each screen's top level view class. */ FControl() { + final Localizer localizer = Localizer.getInstance(); Singletons.getView().getFrame().addWindowListener(new WindowAdapter() { @Override public void windowClosing(final WindowEvent e) { switch (closeAction) { case NONE: //prompt user for close action if not previously specified - final List options = ImmutableList.of("Close Screen", "Exit Forge", "Cancel"); + final List options = ImmutableList.of(localizer.getMessage("lblCloseScreen"), localizer.getMessage("lblExitForge"), localizer.getMessage("lblCancel")); final int reply = FOptionPane.showOptionDialog( - "Forge now supports navigation tabs which allow closing and switching between different screens with ease. " - + "As a result, you no longer need to use the X button in the upper right to close the current screen and go back." - + "\n\n" - + "Please select what you want to happen when clicking the X button in the upper right. This choice will be used " - + "going forward and you will not see this message again. You can change this behavior at any time in Preferences.", - "Select Your Close Action", + localizer.getMessage("txCloseAction1") + "\n\n" + localizer.getMessage("txCloseAction2"), + localizer.getMessage("titCloseAction"), FOptionPane.INFORMATION_ICON, options, 2); @@ -179,13 +176,14 @@ public enum FControl implements KeyEventDispatcher { } public boolean canExitForge(final boolean forRestart) { - final String action = (forRestart ? "Restart" : "Exit"); - String userPrompt = "Are you sure you wish to " + (forRestart ? "restart" : "exit") + " Forge?"; + final Localizer localizer = Localizer.getInstance(); + final String action = (forRestart ? localizer.getMessage("lblRestart") : localizer.getMessage("lblExit")); + String userPrompt =(forRestart ? localizer.getMessage("lblAreYouSureYouWishRestartForge") : localizer.getMessage("lblAreYouSureYouWishExitForge")); final boolean hasCurrentMatches = hasCurrentMatches(); if (hasCurrentMatches) { - userPrompt = "One or more games are currently active. " + userPrompt; + userPrompt = localizer.getMessage("lblOneOrMoreGamesActive") + ". " + userPrompt; } - if (!FOptionPane.showConfirmDialog(userPrompt, action + " Forge", action, "Cancel", !hasCurrentMatches)) { //default Yes if no game active + if (!FOptionPane.showConfirmDialog(userPrompt, action + " Forge", action, localizer.getMessage("lblCancel"), !hasCurrentMatches)) { //default Yes if no game active return false; } return CDeckEditorUI.SINGLETON_INSTANCE.canSwitchAway(true); @@ -223,7 +221,8 @@ public enum FControl implements KeyEventDispatcher { closeAction = CloseAction.valueOf(prefs.getPref(FPref.UI_CLOSE_ACTION)); - FView.SINGLETON_INSTANCE.setSplashProgessBarMessage("Loading quest..."); + final Localizer localizer = Localizer.getInstance(); + FView.SINGLETON_INSTANCE.setSplashProgessBarMessage(localizer.getMessage("lblLoadingQuest")); // Preload quest data if present final File dirQuests = new File(ForgeConstants.QUEST_SAVE_DIR); final String questname = FModel.getQuestPreferences().getPref(QPref.CURRENT_QUEST); @@ -258,7 +257,6 @@ public enum FControl implements KeyEventDispatcher { FView.SINGLETON_INSTANCE.getLpnDocument().addComponentListener(SResizingUtil.getWindowResizeListener()); setGlobalKeyboardHandler(); - final Localizer localizer = Localizer.getInstance(); FView.SINGLETON_INSTANCE.setSplashProgessBarMessage(localizer.getMessage("lblOpeningMainWindow")); SwingUtilities.invokeLater(new Runnable() { @Override @@ -318,7 +316,8 @@ public enum FControl implements KeyEventDispatcher { try { SLayoutIO.loadLayout(null); } catch (final InvalidLayoutFileException ex) { - SOptionPane.showMessageDialog(String.format("Your %s layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout.", screen.getTabCaption()), "Warning!"); + final Localizer localizer = Localizer.getInstance(); + SOptionPane.showMessageDialog(String.format(localizer.getMessage("lblerrLoadingLayoutFile"), screen.getTabCaption()), "Warning!"); if (screen.deleteLayoutFile()) { SLayoutIO.loadLayout(null); //try again } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java index 534c103524d..3ebaff3221a 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java @@ -10,6 +10,7 @@ import forge.quest.data.QuestPreferences; import forge.screens.home.quest.DialogChooseFormats; import forge.screens.home.quest.DialogChooseSets; import forge.screens.match.controllers.CDetailPicture; +import forge.util.Localizer; import javax.swing.*; import java.util.HashMap; @@ -81,8 +82,8 @@ public class CardManager extends ItemManager { public void buildAddFilterMenu(JMenu menu, final ItemManager itemManager) { GuiUtils.addSeparator(menu); //separate from current search item - - JMenu fmt = GuiUtils.createMenu("Format"); + final Localizer localizer = Localizer.getInstance(); + JMenu fmt = GuiUtils.createMenu(localizer.getMessage("lblFormat")); for (final GameFormat f : FModel.getFormats().getFilterList()) { GuiUtils.addMenuItem(fmt, f.getName(), null, new Runnable() { @Override @@ -93,7 +94,7 @@ public class CardManager extends ItemManager { } menu.add(fmt); - GuiUtils.addMenuItem(menu, "Formats...", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblFormats") + "...", null, new Runnable() { @Override public void run() { final CardFormatFilter existingFilter = itemManager.getFilter(CardFormatFilter.class); if (existingFilter != null) { @@ -113,7 +114,7 @@ public class CardManager extends ItemManager { } }); - GuiUtils.addMenuItem(menu, "Sets...", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblSets") + "...", null, new Runnable() { @Override public void run() { CardSetFilter existingFilter = itemManager.getFilter(CardSetFilter.class); @@ -135,7 +136,7 @@ public class CardManager extends ItemManager { } }); - JMenu world = GuiUtils.createMenu("Quest world"); + JMenu world = GuiUtils.createMenu(localizer.getMessage("lblQuestWorld")); for (final QuestWorld w : FModel.getWorlds()) { GuiUtils.addMenuItem(world, w.getName(), null, new Runnable() { @Override @@ -148,19 +149,19 @@ public class CardManager extends ItemManager { GuiUtils.addSeparator(menu); - GuiUtils.addMenuItem(menu, "Colors", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblColors"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardColorFilter(itemManager)); } }, itemManager.getFilter(CardColorFilter.class) == null); - GuiUtils.addMenuItem(menu, "Types", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblTypes"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardTypeFilter(itemManager)); } }, itemManager.getFilter(CardTypeFilter.class) == null); - GuiUtils.addMenuItem(menu, "Converted mana costs", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblConvertedManaCosts"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardCMCFilter(itemManager)); @@ -169,19 +170,19 @@ public class CardManager extends ItemManager { GuiUtils.addSeparator(menu); - GuiUtils.addMenuItem(menu, "CMC range", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblCMCRange"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardCMCRangeFilter(itemManager)); } }, itemManager.getFilter(CardCMCRangeFilter.class) == null); - GuiUtils.addMenuItem(menu, "Power range", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblPowerRange"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardPowerFilter(itemManager)); } }, itemManager.getFilter(CardPowerFilter.class) == null); - GuiUtils.addMenuItem(menu, "Toughness range", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblToughnessRange"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardToughnessFilter(itemManager)); @@ -190,7 +191,7 @@ public class CardManager extends ItemManager { GuiUtils.addSeparator(menu); - GuiUtils.addMenuItem(menu, "Foil", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblFoil"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardFoilFilter(itemManager)); @@ -198,7 +199,7 @@ public class CardManager extends ItemManager { }, itemManager.getFilter(CardFoilFilter.class) == null); if (QuestMode) { - GuiUtils.addMenuItem(menu, "Personal Rating", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblPersonalRating"), null, new Runnable() { @Override public void run() { itemManager.addFilter(new CardRatingFilter(itemManager)); @@ -208,7 +209,7 @@ public class CardManager extends ItemManager { GuiUtils.addSeparator(menu); - GuiUtils.addMenuItem(menu, "Advanced...", null, new Runnable() { + GuiUtils.addMenuItem(menu, localizer.getMessage("lblAdvanced")+ "...", null, new Runnable() { @Override @SuppressWarnings("unchecked") public void run() { diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java index 94e885075e6..15d0fbcee87 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java @@ -12,6 +12,7 @@ import forge.itemmanager.SItemManagerUtil.StatTypes; import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.util.ItemPool; +import forge.util.Localizer; import javax.swing.*; @@ -28,9 +29,10 @@ public abstract class StatTypeFilter extends ToggleButt @SuppressWarnings("serial") protected void addToggleButton(JPanel widget, final StatTypes st) { + final Localizer localizer = Localizer.getInstance(); StringBuilder tooltip = new StringBuilder(); tooltip.append(st.label); - tooltip.append(" (click to toggle the filter, right-click to show only "); + tooltip.append(" (" + localizer.getMessage("lblclicktotoogle") + " "); if (st.label.length() > 1 && !Character.isUpperCase(st.label.charAt(1))) { tooltip.append(st.label.substring(0, 1).toLowerCase()); tooltip.append(st.label.substring(1)); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java index d5833b4f2c0..d7bfcd1bba6 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java @@ -56,6 +56,7 @@ import forge.toolbox.FSkin.SkinFont; import forge.toolbox.FSkin.SkinImage; import forge.toolbox.FTextField; import forge.toolbox.special.CardZoomer; +import forge.util.Localizer; import forge.view.arcane.CardPanel; public class ImageView extends ItemView { @@ -83,6 +84,7 @@ public class ImageView extends ItemView { private ItemInfo focalItem; private final List orderedItems = new ArrayList(); private final List groups = new ArrayList(); + final Localizer localizer = Localizer.getInstance(); private static boolean isPreferenceEnabled(final ForgePreferences.FPref preferenceName) { return FModel.getPreferences().getPrefBoolean(preferenceName); @@ -127,9 +129,8 @@ public class ImageView extends ItemView { repaintSelf(); } } - private void updateToolTip() { - setToolTipText(isAllCollapsed ? "Expand all groups" : "Collapse all groups"); + setToolTipText(isAllCollapsed ? localizer.getMessage("lblExpandallgroups") : localizer.getMessage("lblCollapseallgroups")); } @Override @@ -211,11 +212,11 @@ public class ImageView extends ItemView { }); getPnlOptions().add(btnExpandCollapseAll, "w " + FTextField.HEIGHT + "px, h " + FTextField.HEIGHT + "px"); - getPnlOptions().add(new FLabel.Builder().text("Group by:").fontSize(12).build()); + getPnlOptions().add(new FLabel.Builder().text(localizer.getMessage("lblGroupby") +":").fontSize(12).build()); cbGroupByOptions.addTo(getPnlOptions(), "pushx, growx"); - getPnlOptions().add(new FLabel.Builder().text("Pile by:").fontSize(12).build()); + getPnlOptions().add(new FLabel.Builder().text(localizer.getMessage("lblPileby") +":").fontSize(12).build()); cbPileByOptions.addTo(getPnlOptions(), "pushx, growx"); - getPnlOptions().add(new FLabel.Builder().text("Columns:").fontSize(12).build()); + getPnlOptions().add(new FLabel.Builder().text(localizer.getMessage("lblColumns") +":").fontSize(12).build()); cbColumnCount.addTo(getPnlOptions(), "w 38px!"); //setup display diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java index d616c02ef3b..76fdaf507d4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java @@ -44,6 +44,7 @@ import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.util.Aggregates; import forge.util.ItemPool; +import forge.util.Localizer; import forge.view.FView; import javax.swing.*; @@ -77,37 +78,39 @@ public abstract class ACEditorBase { catalogManager = new CardManager(getCDetailPicture(), wantUnique, false); deckManager = new CardManager(getCDetailPicture(), wantUnique, false); - catalogManager.setCaption("Catalog"); + final Localizer localizer = Localizer.getInstance(); + + catalogManager.setCaption(localizer.getMessage("lblCatalog")); this.setCatalogManager(catalogManager); this.setDeckManager(deckManager); @@ -258,13 +261,14 @@ public final class CEditorConstructed extends CDeckEditor { } public static void buildAddContextMenu(EditorContextMenuBuilder cmb, DeckSection sectionMode) { + final Localizer localizer = Localizer.getInstance(); switch (sectionMode) { case Main: - cmb.addMoveItems("Add", "to deck"); - cmb.addMoveAlternateItems("Add", "to sideboard"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltodeck")); + cmb.addMoveAlternateItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltosideboard")); break; case Sideboard: - cmb.addMoveItems("Add", "to sideboard"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), "to sideboard"); break; case Commander: cmb.addMoveItems("Set", "as commander"); @@ -273,41 +277,42 @@ public final class CEditorConstructed extends CDeckEditor { cmb.addMoveItems("Set", "as avatar"); break; case Schemes: - cmb.addMoveItems("Add", "to scheme deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), "to scheme deck"); break; case Planes: - cmb.addMoveItems("Add", "to planar deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), "to planar deck"); break; case Conspiracy: - cmb.addMoveItems("Add", "to conspiracy deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), "to conspiracy deck"); break; } } public static void buildRemoveContextMenu(EditorContextMenuBuilder cmb, DeckSection sectionMode, boolean foilAvailable) { + final Localizer localizer = Localizer.getInstance(); switch (sectionMode) { case Main: - cmb.addMoveItems("Remove", "from deck"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromdeck")); cmb.addMoveAlternateItems("Move", "to sideboard"); break; case Sideboard: - cmb.addMoveItems("Remove", "from sideboard"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromsideboard")); cmb.addMoveAlternateItems("Move", "to deck"); break; case Commander: - cmb.addMoveItems("Remove", "as commander"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblascommander")); break; case Avatar: - cmb.addMoveItems("Remove", "as avatar"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblasavatar")); break; case Schemes: - cmb.addMoveItems("Remove", "from scheme deck"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromschemedeck")); break; case Planes: - cmb.addMoveItems("Remove", "from planar deck"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromplanardeck")); break; case Conspiracy: - cmb.addMoveItems("Remove", "from conspiracy deck"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromconspiracydeck")); break; } if (foilAvailable) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java index f085687768e..69953f07822 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java @@ -35,6 +35,7 @@ import forge.screens.deckeditor.views.VAllDecks; import forge.screens.deckeditor.views.VDeckgen; import forge.screens.match.controllers.CDetailPicture; import forge.util.ItemPool; +import forge.util.Localizer; import forge.util.storage.IStorage; import java.util.Map.Entry; @@ -70,8 +71,9 @@ public final class CEditorVariant extends CDeckEditor { final CardManager catalogManager = new CardManager(cDetailPicture, true, false); final CardManager deckManager = new CardManager(cDetailPicture, true, false); + final Localizer localizer = Localizer.getInstance(); - catalogManager.setCaption("Catalog"); + catalogManager.setCaption(localizer.getMessage("lblCatalog")); this.setCatalogManager(catalogManager); this.setDeckManager(deckManager); @@ -131,12 +133,12 @@ public final class CEditorVariant extends CDeckEditor { @Override protected void buildAddContextMenu(EditorContextMenuBuilder cmb) { - cmb.addMoveItems("Add", "to deck"); + cmb.addMoveItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltodeck")); } @Override protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) { - cmb.addMoveItems("Remove", "from deck"); + cmb.addMoveItems(localizer.getMessage("lblRemove"), localizer.getMessage("lblfromdeck")); } /* diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java index 3b0b40ca894..f2a01e17c64 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java @@ -21,6 +21,7 @@ import forge.StaticData; import forge.deck.*; import forge.item.PaperCard; import forge.util.ItemPool; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Supplier; @@ -402,9 +403,10 @@ public class DeckController { } public void updateCaptions() { - String tabCaption = "Current Deck"; + final Localizer localizer = Localizer.getInstance(); + String tabCaption = localizer.getMessage("lblCurrentDeck2"); final String title = getModelName(); - String itemManagerCaption = title.isEmpty() ? "[Untitled]" : title; + String itemManagerCaption = title.isEmpty() ? "[" + localizer.getMessage("lblUntitled") +"]" : title; if (!saved) { tabCaption = "*" + tabCaption; diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/DeckFileMenu.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/DeckFileMenu.java index 4ae4b42ae84..1b104cf5112 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/DeckFileMenu.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/DeckFileMenu.java @@ -5,6 +5,7 @@ import forge.menus.MenuUtil; import forge.screens.deckeditor.CDeckEditorUI; import forge.screens.deckeditor.views.VCurrentDeck; import forge.toolbox.FSkin.SkinnedMenuItem; +import forge.util.Localizer; import javax.swing.*; @@ -24,8 +25,8 @@ public final class DeckFileMenu { public static JMenu getMenu(boolean showMenuIcons) { showIcons = showMenuIcons; - - JMenu menu = new JMenu("File"); + final Localizer localizer = Localizer.getInstance(); + JMenu menu = new JMenu(localizer.getMessage("lblFile")); menu.setMnemonic(KeyEvent.VK_F); menu.add(getMenuItem_New()); menu.add(getMenuItem_Open()); @@ -51,7 +52,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_New() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("New Deck"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblNewDeck")); menuItem.setIcon(showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_NEW) : null); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_N)); menuItem.addActionListener(getNewAction()); @@ -68,7 +70,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_Open() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("Open Deck"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblOpenDeck")); menuItem.setIcon(showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_OPEN) : null); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_O)); menuItem.addActionListener(getOpenAction()); @@ -85,7 +88,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_Import() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("Import Deck"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblImportDeck")); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_I)); menuItem.addActionListener(getImportAction()); return menuItem; @@ -101,7 +105,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_Save() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("Save Deck"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblSaveDeck")); menuItem.setIcon(showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_SAVE) : null); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_S)); menuItem.addActionListener(getSaveAction()); @@ -119,7 +124,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_SaveAs() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("Save Deck As"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblSaveDeckAs")); menuItem.setIcon(showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_SAVEAS) : null); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_E)); menuItem.addActionListener(getSaveAsAction()); @@ -137,7 +143,8 @@ public final class DeckFileMenu { } private static SkinnedMenuItem getMenuItem_Print() { - SkinnedMenuItem menuItem = new SkinnedMenuItem("Print to HTML file"); + final Localizer localizer = Localizer.getInstance(); + SkinnedMenuItem menuItem = new SkinnedMenuItem(localizer.getMessage("lblPrinttoHTMLfile")); menuItem.setIcon(showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_PRINT) : null); menuItem.setAccelerator(MenuUtil.getAcceleratorKey(KeyEvent.VK_P)); menuItem.addActionListener(getPrintAction()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java index b31b6cb31b4..6a9af01f1ea 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java @@ -10,6 +10,7 @@ import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.controllers.CAllDecks; import forge.screens.match.controllers.CDetailPicture; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -25,7 +26,8 @@ public enum VAllDecks implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Constructed"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblConstructed")); private DeckManager lstDecks; @@ -93,6 +95,6 @@ public enum VAllDecks implements IVDoc { public void setCDetailPicture(final CDetailPicture cDetailPicture) { this.lstDecks = new DeckManager(GameType.Constructed, cDetailPicture); - this.lstDecks.setCaption("Constructed Decks"); + this.lstDecks.setCaption(localizer.getMessage("lblConstructedDecks")); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java index 8afcb05a190..717139884df 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java @@ -10,6 +10,7 @@ import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.controllers.CBrawlDecks; import forge.screens.match.controllers.CDetailPicture; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -25,7 +26,8 @@ public enum VBrawlDecks implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Brawl"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblBrawl")); private DeckManager lstDecks; @@ -93,6 +95,6 @@ public enum VBrawlDecks implements IVDoc { public void setCDetailPicture(final CDetailPicture cDetailPicture) { this.lstDecks = new DeckManager(GameType.Brawl, cDetailPicture); - this.lstDecks.setCaption("Brawl Decks"); + this.lstDecks.setCaption(localizer.getMessage("lblBrawlDecks")); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCardCatalog.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCardCatalog.java index 56349e757b6..77afc809778 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCardCatalog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCardCatalog.java @@ -8,6 +8,7 @@ import forge.item.InventoryItem; import forge.itemmanager.ItemManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.controllers.CCardCatalog; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -23,7 +24,8 @@ public enum VCardCatalog implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Card Catalog"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblCardCatalog")); private final ItemManagerContainer itemManagerContainer = new ItemManagerContainer(); private ItemManager itemManager; diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java index fbed9d4271f..2c40e97b632 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java @@ -10,6 +10,7 @@ import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.controllers.CCommanderDecks; import forge.screens.match.controllers.CDetailPicture; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -25,7 +26,8 @@ public enum VCommanderDecks implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Commander"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblCommander")); private DeckManager lstDecks; @@ -93,6 +95,6 @@ public enum VCommanderDecks implements IVDoc { public void setCDetailPicture(final CDetailPicture cDetailPicture) { this.lstDecks = new DeckManager(GameType.Commander, cDetailPicture); - this.lstDecks.setCaption("Commander Decks"); + this.lstDecks.setCaption(localizer.getMessage("lblCommanderDecks")); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java index baed1befa8e..d0b6a7cafef 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java @@ -3,6 +3,7 @@ package forge.screens.deckeditor.views; import javax.swing.JPanel; import javax.swing.SwingConstants; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import forge.assets.FSkinProp; import forge.gui.framework.DragCell; @@ -24,16 +25,17 @@ import forge.toolbox.FTextField; */ public enum VCurrentDeck implements IVDoc { SINGLETON_INSTANCE; + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Current Deck"); + private final DragTab tab = new DragTab(localizer.getMessage("lblVCurrentDeck")); // Other fields private final FLabel btnSave = new FLabel.Builder() .fontSize(14) - .tooltip("Save Deck (Ctrl+S)") + .tooltip(localizer.getMessage("ttbtnSave")) .iconInBackground(true) .iconAlignX(SwingConstants.CENTER) .icon(FSkin.getIcon(FSkinProp.ICO_SAVE)) @@ -41,7 +43,7 @@ public enum VCurrentDeck implements IVDoc { private final FLabel btnSaveAs = new FLabel.Builder() .fontSize(14) - .tooltip("Save Deck As (Ctrl+E)") + .tooltip(localizer.getMessage("ttbtnSaveAs")) .iconInBackground(true) .iconAlignX(SwingConstants.CENTER) .icon(FSkin.getIcon(FSkinProp.ICO_SAVEAS)) @@ -49,7 +51,7 @@ public enum VCurrentDeck implements IVDoc { private final FLabel btnLoad = new FLabel.Builder() .fontSize(14) - .tooltip("Open Deck (Ctrl+O)") + .tooltip(localizer.getMessage("ttbtnLoadDeck")) .iconInBackground(true) .iconAlignX(SwingConstants.CENTER) .icon(FSkin.getIcon(FSkinProp.ICO_OPEN)) @@ -57,7 +59,7 @@ public enum VCurrentDeck implements IVDoc { private final FLabel btnNew = new FLabel.Builder() .fontSize(14) - .tooltip("New Deck (Ctrl+N)") + .tooltip(localizer.getMessage("ttbtnNewDeck")) .iconInBackground(true) .iconAlignX(SwingConstants.CENTER) .icon(FSkin.getIcon(FSkinProp.ICO_NEW)) @@ -65,7 +67,7 @@ public enum VCurrentDeck implements IVDoc { private final FLabel btnPrintProxies = new FLabel.Builder() .fontSize(14) - .tooltip("Print to HTML file (Ctrl+P)") + .tooltip(localizer.getMessage("ttbtnPrintProxies")) .iconInBackground(true) .iconAlignX(SwingConstants.CENTER) .icon(FSkin.getIcon(FSkinProp.ICO_PRINT)) @@ -73,15 +75,15 @@ public enum VCurrentDeck implements IVDoc { private final FLabel btnImport = new FLabel.Builder() .fontSize(14) - .text("Import") - .tooltip("Attempt to import a deck from a non-Forge format (Ctrl+I)") + .text(localizer.getMessage("lblImport")) + .tooltip(localizer.getMessage("ttImportDeck")) .opaque(true).hoverable(true).build(); private final FTextField txfTitle = new FTextField.Builder().ghostText("[New Deck]").build(); private final JPanel pnlHeader = new JPanel(); - private final FLabel lblTitle = new FLabel.Builder().text("Title").fontSize(14).build(); + private final FLabel lblTitle = new FLabel.Builder().text(localizer.getMessage("lblTitle")).fontSize(14).build(); private final ItemManagerContainer itemManagerContainer = new ItemManagerContainer(); private ItemManager itemManager; diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VDeckgen.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VDeckgen.java index 924ffabc641..abd5a3e1108 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VDeckgen.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VDeckgen.java @@ -6,6 +6,7 @@ import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; import forge.screens.deckeditor.controllers.CDeckgen; import forge.toolbox.FLabel; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; /** @@ -16,30 +17,29 @@ import net.miginfocom.swing.MigLayout; public enum VDeckgen implements IVDoc { /** */ SINGLETON_INSTANCE; - // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Deck Generation"); - + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblDeckGeneration")); // Deckgen buttons private final FLabel btnRandCardpool = new FLabel.Builder() - .tooltip("Generate random constructed cardpool in current deck area") - .text("Random Cardpool").fontSize(14) + .tooltip(localizer.getMessage("ttbtnRandCardpool")) + .text(localizer.getMessage("btnRandCardpool")).fontSize(14) .opaque(true).hoverable(true).build(); private final FLabel btnRandDeck2 = new FLabel.Builder() - .tooltip("Generate 2 color constructed deck in current deck area") - .text("Constructed (2 color)").fontSize(14) + .tooltip(localizer.getMessage("ttbtnRandDeck2")) + .text(localizer.getMessage("btnRandDeck2")).fontSize(14) .opaque(true).hoverable(true).build(); private final FLabel btnRandDeck3 = new FLabel.Builder() - .tooltip("Generate 3 color constructed deck in current deck area") - .text("Constructed (3 color)").fontSize(14) + .tooltip(localizer.getMessage("ttbtnRandDeck3")) + .text(localizer.getMessage("btnRandDeck3")).fontSize(14) .opaque(true).hoverable(true).build(); private final FLabel btnRandDeck5 = new FLabel.Builder() - .tooltip("Generate 5 color constructed deck in current deck area") - .text("Constructed (5 color)").fontSize(14) + .tooltip(localizer.getMessage("ttbtnRandDeck5")) + .text(localizer.getMessage("btnRandDeck5")).fontSize(14) .opaque(true).hoverable(true).build(); //========== Constructor diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java index cc824baa017..d52488766f6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java @@ -10,6 +10,7 @@ import forge.itemmanager.DeckManager; import forge.itemmanager.ItemManagerContainer; import forge.screens.deckeditor.controllers.CTinyLeadersDecks; import forge.screens.match.controllers.CDetailPicture; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -25,7 +26,8 @@ public enum VTinyLeadersDecks implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Tiny Leaders"); + final Localizer localizer = Localizer.getInstance(); + private final DragTab tab = new DragTab(localizer.getMessage("lblTinyLeaders")); private DeckManager lstDecks; @@ -93,6 +95,6 @@ public enum VTinyLeadersDecks implements IVDoc { public void setCDetailPicture(final CDetailPicture cDetailPicture) { this.lstDecks = new DeckManager(GameType.TinyLeaders, cDetailPicture); - this.lstDecks.setCaption("Tiny Leaders Decks"); + this.lstDecks.setCaption(localizer.getMessage("lblTinyLeadersDecks")); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index b821d1ec7fb..aba5acb71d0 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -862,7 +862,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private JPanel getPlayerNamePanel() { JPanel p = new JPanel(new MigLayout("insets 0, gap 0!")); p.setOpaque(false); - FLabel lbl = new FLabel.Builder().text("Player Name: ").fontSize(12).fontStyle(Font.BOLD).build(); + FLabel lbl = new FLabel.Builder().text(localizer.getMessage("lblPlayerName") +": ").fontSize(12).fontStyle(Font.BOLD).build(); p.add(lbl, "aligny top, h 100%, gap 4px 0 0 0"); p.add(btnPlayerName, "aligny top, h 100%, w 200px!"); return p; diff --git a/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VWorkshopCatalog.java b/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VWorkshopCatalog.java index 02db9e8d7ca..102cf326cdb 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VWorkshopCatalog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VWorkshopCatalog.java @@ -13,6 +13,7 @@ import forge.screens.match.controllers.CDetailPicture; import forge.screens.workshop.controllers.CCardScript; import forge.screens.workshop.controllers.CWorkshopCatalog; import forge.util.ItemPool; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -27,10 +28,10 @@ import javax.swing.event.ListSelectionListener; */ public enum VWorkshopCatalog implements IVDoc { SINGLETON_INSTANCE; - + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Card Catalog"); + private final DragTab tab = new DragTab(localizer.getMessage("lblCardCatalog")); private final ItemManagerContainer cardManagerContainer = new ItemManagerContainer(); private final CardManager cardManager; private final CDetailPicture cDetailPicture = new CDetailPicture(); @@ -38,7 +39,7 @@ public enum VWorkshopCatalog implements IVDoc { //========== Constructor VWorkshopCatalog() { this.cardManager = new CardManager(cDetailPicture, true, false); - this.cardManager.setCaption("Catalog"); + this.cardManager.setCaption(localizer.getMessage("lblCatalog")); final Iterable allCards = Iterables.concat(FModel.getMagicDb().getCommonCards(), FModel.getMagicDb().getVariantCards()); this.cardManager.setPool(ItemPool.createFrom(allCards, PaperCard.class), true); this.cardManagerContainer.setItemManager(this.cardManager); diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 20dd5d1adf8..27ac3ac67c6 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -7,6 +7,36 @@ splash.loading.decks=Lade Decks... splash.loading.processingimagesprites=Verarbeite Bilddaten #FControl.java lblOpeningMainWindow=Öffne Hauptfenster... +lblCloseScreen=Close Screen +txCloseAction1=Forge now supports navigation tabs which allow closing and switching between different screens with ease. As a result, you no longer need to use the X button in the upper right to close the current screen and go back. +txCloseAction2=Please select what you want to happen when clicking the X button in the upper right. This choice will be used going forward and you will not see this message again. You can change this behavior at any time in Preferences. +titCloseAction=Select Your Close Action +lblAreYouSureYouWishRestartForge=Are you sure you wish restart Forge? +lblAreYouSureYouWishExitForge=Are you sure you wish exit Forge? +lblOneOrMoreGamesActive=One or more games are currently active +lblerrLoadingLayoutFile=Your %s layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout. +lblLoadingQuest=Loading quest... +#FScreen.java +lblHome=Home +lblWorkshop=Workshop +lblBacktoHome=Back to Home +lblDeckEditor=Deck Editor +lblCloseEditor=Close Editor +lblCommanderDeckEditor=Commander Deck Editor +lblTinyLeadersDeckEditor=Tiny Leaders DeckEditor +lblBrawlDeckEditor=Brawl Deck Editor +lblDraftDeckEditor=Draft Deck Editor +lblSealedDeckEditor=Sealed Deck Editor +lblTokenViewer=Token Viewer +lblCloseViewer=Close Viewer +lblQuestDeckEditor=Quest Deck Editor +lblQuestTournamentDeckEditor=Quest Tournament Deck Editor +lblSpellShop=Spell Shop +lblLeaveShop=Leave Shop +lblLeaveDraft=Leave Draft +lblBazaar=Bazaar +lblConcedeGame=Concede Game +txerrFailedtodeletelayoutfile=Failed to delete layout file. #VSubmenuPreferences.java Preferences=Einstellungen btnReset=Alles zurücksetzen @@ -70,7 +100,6 @@ cbUseSentry=Sende automatisch Fehlerberichte cbpGameLogEntryType=Spielberichtsumfang cbpCloseAction=Beenden cbpDefaultFontSize=Standard Schriftgröße -cbpMulliganRule = Mulligan Rule cbpAiProfiles=KI Persönlichkeit cbpDisplayCurrentCardColors=Zeige detailierte Kartenfarben cbpAutoYieldMode=Automatische Bestätigung @@ -79,6 +108,7 @@ cbpCounterDisplayLocation=Markeranzeige Ort cbpGraveyardOrdering=Genaue Reihenfolge im Friedhof einhalten Troubleshooting=Fehlerbehebung GeneralConfiguration=Allgemeine Einstellungen +lblPlayerName=Player Name nlPlayerName=Name unter welchem du beim Spielen geführt wirst. nlCompactMainMenu=Aktiviere, um im Seitenmenü platzsparend immer nur eine Menügruppe anzeigen zu lassen. (Erfordert Neustart) nlUseSentry=Aktiviere, um automatische Fehlerberichte an die Entwickler zu senden. @@ -120,6 +150,7 @@ nlLoadCardsLazily=Wenn aktiviert, lädt Forge Kartenscripte erst wenn sie benöt nlLoadHistoricFormats=Wenn aktiviert, lädt Forge auch ältere Spielformate. Verlängert den Programmstart. GraphicOptions=Grafik Optionen nlDefaultFontSize=Die Standardschriftgröße. Alle Schriftelemente werden werden relative zu dieser angepaßt. (Erfordert Neustart) +cbpMulliganRule=Mulligan Rule nlImageFetcher=Ermöglicht bei bestehender Onlineverbindung das automatisches Nachladen fehlender Kartenbilder. nlDisplayFoil=Zeige FOIL-Karten mit einem optischen FOIL-Effekt. nlRandomFoil=Zeige den FOIL-Effekt bei zufälligen Karten. @@ -659,4 +690,136 @@ lblWinsforNewDraft=Siege für neues Draft-Spiel lblWinsperDraftRotation=Siege pro Draft notwendig ttWinsperDraftRotation=Wenn ein Draft nicht soweit fertig gespielt wird, wird er entfernt oder ersetzt. lblRotationType=Austauschtyp -ttRotationType=Bei 0 verschwinden alte Drafts, bei 1 wird er duch einen neuen ersetzt. \ No newline at end of file +ttRotationType=Bei 0 verschwinden alte Drafts, bei 1 wird er duch einen neuen ersetzt. +#StatTypeFilter.java +lblclicktotoogle=click to toggle the filter, right-click to show only +#SItemManagerUtil.java +lblWhitecards=White cards +lblBluecards=Blue cards +lblBlackcards=Black cards +lblRedcards=Red cards +lblGreencards=Green cards +lblColorlesscards=Colorless cards +lblMulticolorcards=Multicolor cards +lblPackordeck=Card packs and prebuilt decks +lblLands=Lands +lblArtifacts=Artifacts +lblCreatures=Creatures +lblEnchantments=Enchantments +lblPlaneswalkers=Planeswalkers +lblInstants=Instants +lblSorceries=Sorceries +lblCCMC0=Cards with CMC 0 +lblCCMC1=Cards with CMC 1 +lblCCMC2=Cards with CMC 2 +lblCCMC3=Cards with CMC 3 +lblCCMC4=Cards with CMC 4 +lblCCMC5=Cards with CMC 5 +lblCCMC6orMore=Cards with CMC 6 +lblWhitedecks=White decks +lblBluedecks=Blue decks +lblBlackdecks=Black decks +lblReddecks=Red decks +lblGreendecks=Green decks +lblColorlessdecks=Colorless decks +lblMulticolordecks=Multicolor decks +lblOldstyleFoilcards=Old style Foil cards +lblNewstyleFoilcards=New style Foil cards +lblNon-Foilcards=Non-Foil cards +lblUnratedcards=Unrated cards +lbl1starcards=1 star cards +lbl2starcards=2 star cards +lbl3starcards=3 star cards +lbl4starcards=4 star cards +lbl5starcards=5 star cards +lblXcopiesof=X copies of +lblcopiesof=copies of +#ACEditorBase.java +lblAddcard=Add card +ttAddcard=Add selected card to current deck (or double click the row or hit the spacebar) +lblAdd4ofcard=Add 4 of card +ttAdd4ofcard=Add up to 4 of selected card to current deck +lblRemovecard=Remove card +ttRemovecard=Remove selected card from current deck (or double click the row or hit the spacebar) +lblRemove4ofcard=Remove 4 of card +ttRemove4ofcard=Remove up to 4 of selected card to current deck +lblAddBasicLands=Add Basic Lands +ttAddBasicLands=Add basic lands to the deck +lblCardCatalog=Card Catalog +lblJumptoprevioustable=Jump to previous table +lblJumptopnexttable=Jump to next table +lblJumptotextfilter=Jump to text filter +lblChooseavalueforX=Choose a value for X +#VCurrentDeck.java +lblVCurrentDeck=Current Deck +ttbtnSave=Save Deck (Ctrl+S) +ttbtnSaveAs=Save Deck As (Ctrl+E) +ttbtnLoadDeck=Open Deck (Ctrl+O) +ttbtnNewDeck=New Deck (Ctrl+N) +ttbtnPrintProxies=Print to HTML file (Ctrl+P) +lblImport=Import +ttImportDeck=Attempt to import a deck from a non-Forge format (Ctrl+I) +lblTitle=Title +#ImageView.java +lblExpandallgroups=Expand all groups +lblCollapseallgroups=Collapse all groups +lblGroupby=group by +lblPileby=pile by +lblColumns=Columns +#CEditorVariant.java +lblCatalog=Catalog +lblAdd=Add +lbltodeck=to deck +lblfromdeck=from deck +lbltosideboard=to sideboard +lblfromsideboard=from sideboard +lblascommander=as commander +lblasavatar=as avatar +lblfromschemedeck=from scheme deck +lblfromplanardeck=from planar deck +lblfromconspiracydeck=from conspiracy deck +#GroupDef.java +lblColor=Color +lblColorIdentity=Color Identity +lblSet=Set +lblDefault=Default +lblType=Type +lblPlaneswalkerDeckSort=Planeswalker Deck Sort +lblRarity=Rarity +lblConvertToFoil=Foil +lblMulticolor=Multicolor +#DeckFileMenu.java +lblNewDeck=New Deck +lblOpenDeck=Open Deck +lblImportDeck=Import Deck +lblSaveDeck=Save Deck +lblSaveDeckAs=Save Deck As... +lblPrinttoHTMLfile=Print to HTML file +#PaperCard.java +lblCard=Carta +#CardManager.java +lblFormat=Format +lblFormats=Formats +lblQuestWorld=Quest World +lblSets=Sets +lblTypes=Types +lblConvertedManaCosts=Converted mana +lblCMCRange=CMC Range +lblPowerRange=Power Range +lblToughnessRange=Toughness Range +lblFoil=Foil +lblPersonalRating=Personal Rating +lblAdvanced=Advanced +#VDeckgen.java +lblDeckGeneration=Deck Generation +btnRandCardpool=Random Cardpool +ttbtnRandCardpool=Generate random constructed cardpool in current deck area +btnRandDeck2=Constructed (2 color) +ttbtnRandDeck2=Generate 2 color constructed deck in current deck area +btnRandDeck3=Constructed (3 color) +ttbtnRandDeck3=Generate 3 color constructed deck in current deck area +btnRandDeck5=Constructed (5 color) +ttbtnRandDeck5=Generate 5 color constructed deck in current deck area +#DeckCotroller.java +lblCurrentDeck2=Current Deck +lblUntitled=Untitled diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 82a6fc7b49a..e88eebc9dd2 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1,222 +1,253 @@ -language.name = English (US) +language.name=English (US) #SplashScreen.java -splash.loading.examining-cards = Loading cards, examining folder -splash.loading.cards-folders = Loading cards from folders -splash.loading.cards-archive = Loading cards from archive -splash.loading.decks = Loading decks... +splash.loading.examining-cards=Loading cards, examining folder +splash.loading.cards-folders=Loading cards from folders +splash.loading.cards-archive=Loading cards from archive +splash.loading.decks=Loading decks... splash.loading.processingimagesprites=Processing image sprites #FControl.java lblOpeningMainWindow=Opening main window... +lblCloseScreen=Close Screen +txCloseAction1=Forge now supports navigation tabs which allow closing and switching between different screens with ease. As a result, you no longer need to use the X button in the upper right to close the current screen and go back. +txCloseAction2=Please select what you want to happen when clicking the X button in the upper right. This choice will be used going forward and you will not see this message again. You can change this behavior at any time in Preferences. +titCloseAction=Select Your Close Action +lblAreYouSureYouWishRestartForge=Are you sure you wish restart Forge? +lblAreYouSureYouWishExitForge=Are you sure you wish exit Forge? +lblOneOrMoreGamesActive=One or more games are currently active +lblerrLoadingLayoutFile=Your %s layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout. +lblLoadingQuest=Loading quest... +#FScreen.java +lblHome=Home +lblWorkshop=Workshop +lblBacktoHome=Back to Home +lblDeckEditor=Deck Editor +lblCloseEditor=Close Editor +lblCommanderDeckEditor=Commander Deck Editor +lblTinyLeadersDeckEditor=Tiny Leaders DeckEditor +lblBrawlDeckEditor=Brawl Deck Editor +lblDraftDeckEditor=Draft Deck Editor +lblSealedDeckEditor=Sealed Deck Editor +lblTokenViewer=Token Viewer +lblCloseViewer=Close Viewer +lblQuestDeckEditor=Quest Deck Editor +lblQuestTournamentDeckEditor=Quest Tournament Deck Editor +lblSpellShop=Spell Shop +lblLeaveShop=Leave Shop +lblLeaveDraft=Leave Draft +lblBazaar=Bazaar +lblConcedeGame=Concede Game +txerrFailedtodeletelayoutfile=Failed to delete layout file. #VSubmenuPreferences.java -Preferences = Preferences -btnReset = Reset to Default Settings -btnDeleteMatchUI = Reset Match Layout -btnDeleteEditorUI = Reset Editor Layout -btnDeleteWorkshopUI = Reset Workshop Layout -btnUserProfileUI = Open User Directory -btnContentDirectoryUI = Open Content Directory -btnResetJavaFutureCompatibilityWarnings = Reset Java Compatibility Warnings -btnClearImageCache = Clear Image Cache -btnTokenPreviewer = Token Previewer -btnCopyToClipboard= Copy to Clipboard +Preferences=Preferences +btnReset=Reset to Default Settings +btnDeleteMatchUI=Reset Match Layout +btnDeleteEditorUI=Reset Editor Layout +btnDeleteWorkshopUI=Reset Workshop Layout +btnUserProfileUI=Open User Directory +btnContentDirectoryUI=Open Content Directory +btnResetJavaFutureCompatibilityWarnings=Reset Java Compatibility Warnings +btnClearImageCache=Clear Image Cache +btnTokenPreviewer=Token Previewer +btnCopyToClipboard=Copy to Clipboard cbpSelectLanguage=Language nlSelectLanguage=Select Language (Excluded Game part. Still a work in progress) (RESTART REQUIRED) -cbRemoveSmall = Remove Small Creatures -cbCardBased = Include Card-based Deck Generation -cbSingletons = Singleton Mode -cbRemoveArtifacts = Remove Artifacts -cbAnte = Play for Ante -cbAnteMatchRarity = Match Ante Rarity -cbEnableAICheats = Allow AI Cheating -cbManaBurn = Mana Burn -cbManaLostPrompt = Prompt Mana Pool Emptying -cbDevMode = Developer Mode -cbLoadCardsLazily = Load Card Scripts Lazily -cbLoadHistoricFormats = Load Historic Formats -cbWorkshopSyntax = Workshop Syntax Checker -cbEnforceDeckLegality = Deck Conformance -cbSideboardForAI = Human Sideboard for AI -cbPerformanceMode = Performance Mode -cbFilteredHands = Filtered Hands -cbImageFetcher = Automatically Download Missing Card Art -cbCloneImgSource = Clones Use Original Card Art -cbScaleLarger = Scale Image Larger -cbRenderBlackCardBorders = Render Black Card Borders -cbLargeCardViewers = Use Large Card Viewers -cbSmallDeckViewer = Use Small Deck Viewer -cbDisplayFoil = Display Foil Overlay -cbRandomFoil = Random Foil -cbRandomArtInPools = Randomize Card Art in Generated Card Pools -cbEnableSounds = Enable Sounds -cbEnableMusic = Enable Music -cbAltSoundSystem = Use Alternate Sound System -cbUiForTouchScreen = Enhance UI for Touchscreens -cbTimedTargOverlay = Enable Targeting Overlay Optimization -cbCompactMainMenu = Use Compact Main Sidebar Menu -cbDetailedPaymentDesc = Spell Description in Payment Prompt -cbPromptFreeBlocks = Free Block Handling -cbPauseWhileMinimized = Pause While Minimized -cbCompactPrompt = Compact Prompt -cbEscapeEndsTurn = Use Escape Key to End Turn -cbPreselectPrevAbOrder = Preselect Last Order of Abilities -cbHideReminderText = Hide Reminder Text -cbOpenPacksIndiv = Open Packs Individually -cbTokensInSeparateRow = Display Tokens in a Separate Row -cbStackCreatures = Stack Creatures -cbFilterLandsByColorId = Filter Lands by Color in Activated Abilities -cbShowStormCount = Show Storm Count in Prompt Pane -cbRemindOnPriority = Visually Alert on Receipt of Priority -cbUseSentry = Automatically submit bug reports. -cbpGameLogEntryType = Game Log Verbosity -cbpCloseAction = Close Action -cbpDefaultFontSize = Default Font Size +cbRemoveSmall=Remove Small Creatures +cbCardBased=Include Card-based Deck Generation +cbSingletons=Singleton Mode +cbRemoveArtifacts=Remove Artifacts +cbAnte=Play for Ante +cbAnteMatchRarity=Match Ante Rarity +cbEnableAICheats=Allow AI Cheating +cbManaBurn=Mana Burn +cbManaLostPrompt=Prompt Mana Pool Emptying +cbDevMode=Developer Mode +cbLoadCardsLazily=Load Card Scripts Lazily +cbLoadHistoricFormats=Load Historic Formats +cbWorkshopSyntax=Workshop Syntax Checker +cbEnforceDeckLegality=Deck Conformance +cbSideboardForAI=Human Sideboard for AI +cbPerformanceMode=Performance Mode +cbFilteredHands=Filtered Hands +cbImageFetcher=Automatically Download Missing Card Art +cbCloneImgSource=Clones Use Original Card Art +cbScaleLarger=Scale Image Larger +cbRenderBlackCardBorders=Render Black Card Borders +cbLargeCardViewers=Use Large Card Viewers +cbSmallDeckViewer=Use Small Deck Viewer +cbDisplayFoil=Display Foil Overlay +cbRandomFoil=Random Foil +cbRandomArtInPools=Randomize Card Art in Generated Card Pools +cbEnableSounds=Enable Sounds +cbEnableMusic=Enable Music +cbAltSoundSystem=Use Alternate Sound System +cbUiForTouchScreen=Enhance UI for Touchscreens +cbTimedTargOverlay=Enable Targeting Overlay Optimization +cbCompactMainMenu=Use Compact Main Sidebar Menu +cbDetailedPaymentDesc=Spell Description in Payment Prompt +cbPromptFreeBlocks=Free Block Handling +cbPauseWhileMinimized=Pause While Minimized +cbCompactPrompt=Compact Prompt +cbEscapeEndsTurn=Use Escape Key to End Turn +cbPreselectPrevAbOrder=Preselect Last Order of Abilities +cbHideReminderText=Hide Reminder Text +cbOpenPacksIndiv=Open Packs Individually +cbTokensInSeparateRow=Display Tokens in a Separate Row +cbStackCreatures=Stack Creatures +cbFilterLandsByColorId=Filter Lands by Color in Activated Abilities +cbShowStormCount=Show Storm Count in Prompt Pane +cbRemindOnPriority=Visually Alert on Receipt of Priority +cbUseSentry=Automatically submit bug reports. +cbpGameLogEntryType=Game Log Verbosity +cbpCloseAction=Close Action +cbpDefaultFontSize=Default Font Size +cbpAiProfiles=AI Personality +cbpDisplayCurrentCardColors=Show Detailed Card Color +cbpAutoYieldMode=Auto-Yield +cbpCounterDisplayType=Counter Display Type +cbpCounterDisplayLocation=Counter Display Location +cbpGraveyardOrdering=Allow Ordering Cards Put in Graveyard +Troubleshooting=Troubleshooting +GeneralConfiguration=General Configuration +lblPlayerName=Player Name +nlPlayerName=Sets the name that you will be referred to by Forge during gameplay. +nlCompactMainMenu=Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED). +nlUseSentry=When enabled, automatically submits bug reports to developers. +GamePlay=Gameplay +nlpMulliganRule=Choose the version of the Mulligan rule +nlpAiProfiles=Choose your AI opponent +nlAnte=Determines whether or not the game is played for ante. +nlAnteMatchRarity=Attempts to make antes the same rarity for all players. +nlEnableAICheats=Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set). +nlManaBurn=Play with mana burn (from pre-Magic 2010 rules). +nlManaLostPrompt=When enabled, you get a warning if passing priority would cause you to lose mana in your mana pool. +nlEnforceDeckLegality=Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc). +nlSideboardForAI=Allows users to sideboard with the AIs deck and sideboard in constructed game formats. +nlPerformanceMode=Disables additional static abilities checks to speed up the game engine. (Warning: breaks some 'as if had flash' scenarios when casting cards owned by opponents). +nlFilteredHands=Generates two starting hands and keeps the one with the closest to average land count for the deck. (Requires restart) +nlCloneImgSource=When enabled clones will use their original art instead of the cloned card's art. +nlPromptFreeBlocks=When enabled, if you would have to pay 0 to block, pay automatically without prompt. +nlPauseWhileMinimized=When enabled, Forge pauses when minimized (primarily for AI vs AI). +nlEscapeEndsTurn=When enabled, Escape key functions as an alternative shortcut to end the current turn. +nlDetailedPaymentDesc=When enabled, detailed spell/ability descriptions are shown when choosing targets and paying costs. +nlShowStormCount=When enabled, displays the current storm count in the prompt pane. +nlRemindOnPriority=When enabled, flashes the player choice area upon receiving priority. +nlPreselectPrevAbOrder=When enabled, preselects the last defined simultaneous ability order in the ordering dialog. +nlpGraveyardOrdering=Determines when to let the player choose the order of cards simultaneously put in graveyard (never, always, or only when playing with cards for which it matters, for example, Volrath's Shapeshifter). +nlpAutoYieldMode=Defines the granularity level of auto-yields (per unique ability or per unique card). +RandomDeckGeneration=Random Deck Generation +nlRemoveSmall=Disables 1/1 and 0/X creatures in generated decks +nlSingletons=Disables non-land duplicates in generated decks +nlRemoveArtifacts=Disables artifact cards in generated decks +nlCardBased=Builds more synergistic random decks (requires restart) +DeckEditorOptions=Deck Editor Options +nlFilterLandsByColorId=When using card color filters, filter lands in a way to make it easier to find relevant mana producing lands. +AdvancedSettings=Advanced Settings +nlDevMode=Enables menu with functions for testing during development. +nlWorkshopSyntax=Enables syntax checking of card scripts in the Workshop. Note: functionality still in testing phase! +nlGameLogEntryType=Changes how much information is displayed in the game log. Sorted by least to most verbose. +nlCloseAction=Changes what happens when clicking the X button in the upper right. +nlLoadCardsLazily=If turned on, Forge will load card scripts as they're needed instead of at start up. (Warning: Experimental) +nlLoadHistoricFormats=If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup. +GraphicOptions=Graphic Options +nlDefaultFontSize=The default font size within the UI. All font elements are scaled relative to this. (Needs restart) cbpMulliganRule = Mulligan Rule -cbpAiProfiles = AI Personality -cbpDisplayCurrentCardColors = Show Detailed Card Color -cbpAutoYieldMode = Auto-Yield -cbpCounterDisplayType = Counter Display Type -cbpCounterDisplayLocation = Counter Display Location -cbpGraveyardOrdering = Allow Ordering Cards Put in Graveyard -Troubleshooting = Troubleshooting -GeneralConfiguration = General Configuration -nlPlayerName = Sets the name that you will be referred to by Forge during gameplay. -nlCompactMainMenu = Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED). -nlUseSentry = When enabled, automatically submits bug reports to developers. -GamePlay = Gameplay -nlpMulliganRule = Choose the version of the Mulligan rule -nlpAiProfiles = Choose your AI opponent -nlAnte = Determines whether or not the game is played for ante. -nlAnteMatchRarity = Attempts to make antes the same rarity for all players. -nlEnableAICheats = Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set). -nlManaBurn = Play with mana burn (from pre-Magic 2010 rules). -nlManaLostPrompt = When enabled, you get a warning if passing priority would cause you to lose mana in your mana pool. -nlEnforceDeckLegality = Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc). -nlSideboardForAI = Allows users to sideboard with the AIs deck and sideboard in constructed game formats. -nlPerformanceMode = Disables additional static abilities checks to speed up the game engine. (Warning: breaks some 'as if had flash' scenarios when casting cards owned by opponents). -nlFilteredHands = Generates two starting hands and keeps the one with the closest to average land count for the deck. (Requires restart) -nlCloneImgSource = When enabled clones will use their original art instead of the cloned card's art. -nlPromptFreeBlocks = When enabled, if you would have to pay 0 to block, pay automatically without prompt. -nlPauseWhileMinimized = When enabled, Forge pauses when minimized (primarily for AI vs AI). -nlEscapeEndsTurn = When enabled, Escape key functions as an alternative shortcut to end the current turn. -nlDetailedPaymentDesc = When enabled, detailed spell/ability descriptions are shown when choosing targets and paying costs. -nlShowStormCount = When enabled, displays the current storm count in the prompt pane. -nlRemindOnPriority = When enabled, flashes the player choice area upon receiving priority. -nlPreselectPrevAbOrder = When enabled, preselects the last defined simultaneous ability order in the ordering dialog. -nlpGraveyardOrdering = Determines when to let the player choose the order of cards simultaneously put in graveyard (never, always, or only when playing with cards for which it matters, for example, Volrath's Shapeshifter). -nlpAutoYieldMode = Defines the granularity level of auto-yields (per unique ability or per unique card). -RandomDeckGeneration = Random Deck Generation -nlRemoveSmall = Disables 1/1 and 0/X creatures in generated decks -nlSingletons = Disables non-land duplicates in generated decks -nlRemoveArtifacts = Disables artifact cards in generated decks -nlCardBased = Builds more synergistic random decks (requires restart) -DeckEditorOptions = Deck Editor Options -nlFilterLandsByColorId = When using card color filters, filter lands in a way to make it easier to find relevant mana producing lands. -AdvancedSettings = Advanced Settings -nlDevMode = Enables menu with functions for testing during development. -nlWorkshopSyntax = Enables syntax checking of card scripts in the Workshop. Note: functionality still in testing phase! -nlGameLogEntryType = Changes how much information is displayed in the game log. Sorted by least to most verbose. -nlCloseAction = Changes what happens when clicking the X button in the upper right. -nlLoadCardsLazily = If turned on, Forge will load card scripts as they're needed instead of at start up. (Warning: Experimental) -nlLoadHistoricFormats = If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup. -GraphicOptions = Graphic Options -nlDefaultFontSize = The default font size within the UI. All font elements are scaled relative to this. (Needs restart) -nlImageFetcher = Enables live fetching of missing card images from an online resource. -nlDisplayFoil = Displays foil cards with the visual foil overlay effect. -nlRandomFoil = Adds foil effect to random cards. -nlScaleLarger = Allows card pictures to be expanded larger than their original size. -nlRenderBlackCardBorders = Render black borders around card images. -nlLargeCardViewers = Makes all card viewers much larger for use with high resolution images. Will not fit on smaller screens. -nlSmallDeckViewer = Sets the deck viewer window to be 800x600 rather than a proportion of the screen size. -nlRandomArtInPools = Generates cards with random art in generated limited mode card pools. -nlUiForTouchScreen = Increases some UI elements to provide a better experience on touchscreen devices. (Needs restart) -nlCompactPrompt = Hide header and use smaller font in Prompt pane to make it more compact. -nlHideReminderText = Hide reminder text in Card Detail pane. -nlOpenPacksIndiv = When opening Fat Packs and Booster Boxes, booster packs will be opened and displayed one at a time. -nlTokensInSeparateRow = Displays tokens in a separate row on the battlefield below the non-token creatures. -nlStackCreatures = Stacks identical creatures on the battlefield like lands, artifacts, and enchantments. -nlTimedTargOverlay = Enables throttling-based optimization of targeting overlay to reduce CPU use (only disable if you experience choppiness on older hardware, requires starting a new match). -nlCounterDisplayType = Selects the style of the in-game counter display for cards. Text-based is a new tab-like display on the cards. Image-based is the old counter image. Hybrid displays both at once. -nlCounterDisplayLocation = Determines where to position the text-based counters on the card: close to the top or close to the bottom. -nlDisplayCurrentCardColors = Displays the breakdown of the current color of cards in the card detail information panel. -SoundOptions = Sound Options -nlEnableSounds = Enable sound effects during the game -nlEnableMusic = Enable background music during the game -nlAltSoundSystem = Use the alternate sound system (only use if you have issues with sound not playing or disappearing) -KeyboardShortcuts = Keyboard Shortcuts +nlImageFetcher=Enables live fetching of missing card images from an online resource. +nlDisplayFoil=Displays foil cards with the visual foil overlay effect. +nlRandomFoil=Adds foil effect to random cards. +nlScaleLarger=Allows card pictures to be expanded larger than their original size. +nlRenderBlackCardBorders=Render black borders around card images. +nlLargeCardViewers=Makes all card viewers much larger for use with high resolution images. Will not fit on smaller screens. +nlSmallDeckViewer=Sets the deck viewer window to be 800x600 rather than a proportion of the screen size. +nlRandomArtInPools=Generates cards with random art in generated limited mode card pools. +nlUiForTouchScreen=Increases some UI elements to provide a better experience on touchscreen devices. (Needs restart) +nlCompactPrompt=Hide header and use smaller font in Prompt pane to make it more compact. +nlHideReminderText=Hide reminder text in Card Detail pane. +nlOpenPacksIndiv=When opening Fat Packs and Booster Boxes, booster packs will be opened and displayed one at a time. +nlTokensInSeparateRow=Displays tokens in a separate row on the battlefield below the non-token creatures. +nlStackCreatures=Stacks identical creatures on the battlefield like lands, artifacts, and enchantments. +nlTimedTargOverlay=Enables throttling-based optimization of targeting overlay to reduce CPU use (only disable if you experience choppiness on older hardware, requires starting a new match). +nlCounterDisplayType=Selects the style of the in-game counter display for cards. Text-based is a new tab-like display on the cards. Image-based is the old counter image. Hybrid displays both at once. +nlCounterDisplayLocation=Determines where to position the text-based counters on the card: close to the top or close to the bottom. +nlDisplayCurrentCardColors=Displays the breakdown of the current color of cards in the card detail information panel. +SoundOptions=Sound Options +nlEnableSounds=Enable sound effects during the game +nlEnableMusic=Enable background music during the game +nlAltSoundSystem=Use the alternate sound system (only use if you have issues with sound not playing or disappearing) +KeyboardShortcuts=Keyboard Shortcuts # VSubmenuAchievements.java -Achievements = Achievements +Achievements=Achievements # VSubmenuDownloaders.java -btnDownloadSetPics = Download LQ Set Pictures -btnDownloadPics = Download LQ Card Pictures -btnDownloadQuestImages = Download Quest Images -btnDownloadAchievementImages = Download Achievement Images -btnReportBug =Report a Bug -btnListImageData =Audit Card and Image Data -lblListImageData = Audit cards not implemented by Forge and missing card images -btnImportPictures = Import Data -btnHowToPlay = How To Play -btnDownloadPrices = Download Card Prices -btnLicensing = License Details -lblDownloadPics = Download default card picture for each card. -lblDownloadSetPics = Download all pictures of each card (one for each set the card appeared in) -lblDownloadQuestImages = Download tokens and icons used in Quest mode. -lblDownloadAchievementImages = Download achievement images to really make your trophies stand out. -lblDownloadPrices = Download up-to-date price list for in-game card shops. -lblYourVersionOfJavaIsTooOld = Your version of Java is too old to use the content downloaders. -lblPleaseUpdateToTheLatestVersionOfJava = Please update to the latest version of Java -lblYoureRunning = You're running -lblYouNeedAtLeastJavaVersion = You need at least version 1.8.0_101. -lblImportPictures = Import data from a local directory. -lblReportBug = Something broken? -lblHowToPlay = Rules of the Game. -lblLicensing = Forge legal. -ContentDownloaders = Content Downloaders -ReleaseNotes = Release Notes +btnDownloadSetPics=Download LQ Set Pictures +btnDownloadPics=Download LQ Card Pictures +btnDownloadQuestImages=Download Quest Images +btnDownloadAchievementImages=Download Achievement Images +btnReportBug=Report a Bug +btnListImageData=Audit Card and Image Data +lblListImageData=Audit cards not implemented by Forge and missing card images +btnImportPictures=Import Data +btnHowToPlay=How To Play +btnDownloadPrices=Download Card Prices +btnLicensing=License Details +lblDownloadPics=Download default card picture for each card. +lblDownloadSetPics=Download all pictures of each card (one for each set the card appeared in) +lblDownloadQuestImages=Download tokens and icons used in Quest mode. +lblDownloadAchievementImages=Download achievement images to really make your trophies stand out. +lblDownloadPrices=Download up-to-date price list for in-game card shops. +lblYourVersionOfJavaIsTooOld=Your version of Java is too old to use the content downloaders. +lblPleaseUpdateToTheLatestVersionOfJava=Please update to the latest version of Java +lblYoureRunning=You're running +lblYouNeedAtLeastJavaVersion=You need at least version 1.8.0_101. +lblImportPictures=Import data from a local directory. +lblReportBug=Something broken? +lblHowToPlay=Rules of the Game. +lblLicensing=Forge legal. +ContentDownloaders=Content Downloaders +ReleaseNotes=Release Notes # CSubmenuPreferences.java -CantChangeDevModeWhileNetworkMath = Can't change DEV_MODE while a network match is in progress! -CompatibilityWarningsReEnabled = Compatibility warnings re-enabled! -AresetForgeSettingsToDefault = This will reset all preferences to their defaults and restart Forge.\n\n Reset and restart Forge? -TresetForgeSettingsToDefault =Reset Settings -AresetDeckEditorLayout =This will reset the Deck Editor screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? -TresetDeckEditorLayout =Reset Deck Editor Layout +CantChangeDevModeWhileNetworkMath=Can't change DEV_MODE while a network match is in progress! +CompatibilityWarningsReEnabled=Compatibility warnings re-enabled! +AresetForgeSettingsToDefault=This will reset all preferences to their defaults and restart Forge.\n\n Reset and restart Forge? +TresetForgeSettingsToDefault=Reset Settings +AresetDeckEditorLayout=This will reset the Deck Editor screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? +TresetDeckEditorLayout=Reset Deck Editor Layout OKresetDeckEditorLayout=Deck Editor layout has been reset. -AresetWorkshopLayout = This will reset the Workshop screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? -TresetWorkshopLayout = Reset Workshop Layout -OKresetWorkshopLayout = Workshop layout has been reset. -AresetMatchScreenLayout = This will reset the layout of the Match screen.\n If you want to save the current layout first, please use the Dock tab -> Save Layout option in the Match screen.\n\n Reset layout? -TresetMatchScreenLayout = Reset Match Screen Layout -OKresetMatchScreenLayout = Match Screen layout has been reset. +AresetWorkshopLayout=This will reset the Workshop screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? +TresetWorkshopLayout=Reset Workshop Layout +OKresetWorkshopLayout=Workshop layout has been reset. +AresetMatchScreenLayout=This will reset the layout of the Match screen.\n If you want to save the current layout first, please use the Dock tab -> Save Layout option in the Match screen.\n\n Reset layout? +TresetMatchScreenLayout=Reset Match Screen Layout +OKresetMatchScreenLayout=Match Screen layout has been reset. #EMenuGroup.java -lblSanctionedFormats= Sanctioned Formats -lblOnlineMultiplayer = Online Multiplayer -lblQuestMode = Quest Mode -lblPuzzleMode = Puzzle Mode -lblGauntlets = Gauntlets -lblGameSettings = Game Settings +lblSanctionedFormats=Sanctioned Formats +lblOnlineMultiplayer=Online Multiplayer +lblQuestMode=Quest Mode +lblPuzzleMode=Puzzle Mode +lblGauntlets=Gauntlets +lblGameSettings=Game Settings #VLobby.java lblHeaderConstructedMode=Sanctioned Format: Constructed lblGetNewRandomName=Get new random name lbltypeofName=What type of name do you want to generate? -lblconfirmName= Would you like to use the name %s, or try again? +lblconfirmName=Would you like to use the name %s, or try again? lblUseThisName=Use this name lblTryAgain=Try Again lblAddAPlayer=Add a Player lblVariants=Variants #VSubmenuConstructed.java -lblConstructedMode = Constructed Mode -lblConstructed = Constructed +lblConstructedMode=Constructed Mode +lblConstructed=Constructed #PlayerPanel.java lblSelectaDeck=Select a deck lblSelectaSchemeDeck=Select a scheme deck lblSchemeDeckEditor=Scheme Deck Editor lblSelectaCommanderDeck=Select a Commander deck -lblSelectaPlanarDeck = Select a planar deck -lblPlanarDeckEditor = Planar Deck Editor -lblSelectaVanguardAvatar = Select a Vanguard avatar -lblVanguardAvatar = Vanguard avatar +lblSelectaPlanarDeck=Select a planar deck +lblPlanarDeckEditor=Planar Deck Editor +lblSelectaVanguardAvatar=Select a Vanguard avatar +lblVanguardAvatar=Vanguard avatar lblDeck=Deck lblSchemeDeck=Scheme Deck -lblCommanderDeck= Commander Deck +lblCommanderDeck=Commander Deck lblPlanarDeck=Planar Deck lblVanguard=Vanguard lblHuman=Human @@ -229,8 +260,8 @@ lblHeroes=Heroes lblRemove=Remove ttlblAvatar=L-click: Select avatar. R-click: Randomize avatar. lblReady=Ready -lblKick = Kick -lblReallyKick = Really Kick %s? +lblKick=Kick +lblReallyKick=Really Kick %s? #ForgeMenu.java lblRestart=Restart lblExit=Exit @@ -267,7 +298,7 @@ lblOff=Off lblCardMouseOver=Card Mouseover lblAlwaysOn=Always On lblAutoYields=Auto-Yields -lblDeckList = Deck List +lblDeckList=Deck List lblClose=Close lblExitForge=Exit Forge #ConstructedGameMenu.java @@ -285,7 +316,7 @@ lblIsGoingFirst=is going first lblYouAreGoing=you are going lblMulligan=Mulligan lblDoYouWantToKeepYourHand=Do you want to keep your hand? -lblReturnForLondon=Return %s of %s card(s) to bottom of library +lblReturnForLondon=Return %n card(s) to bottom of library lblOk=Ok lblReset=Reset lblAuto=Auto @@ -311,7 +342,7 @@ lblSHORTCUT_MACRO_RECORD=Match: record a macro sequence of actions lblSHORTCUT_MACRO_NEXT_ACTION=Match: execute next action in a recorded macro lblSHORTCUT_CARD_ZOOM=Match: zoom the currently selected card #VSubmenuDraft.java -lblBoosterDraft= Booster Draft +lblBoosterDraft=Booster Draft lblHeaderBoosterDraft=Sanctioned Format: Booster Draft lblPlayAnOpponent=Play an opponent lblPlayAll7opponents=Play all 7 opponents @@ -358,7 +389,7 @@ lblBrawl=Brawl lblBrawlDesc=Each player has a legendary \"General\" card which can be cast at any time and determines deck colors. Only cards legal in Standard may be used. lblPlaneswalker=Planeswalker lblPlaneswalkerDesc=Each player has a Planeswalker card which can be cast at any time. -lblPlanechase =Planechase +lblPlanechase=Planechase lblPlanechaseDesc=Plane cards apply global effects. The Plane card changes when a player rolls \"Planeswalk\" on the planar die. lblArchenemyDesc=One player is the Archenemy and fights the other players by playing Scheme cards. lblArchenemyRumble=Archenemy Rumble @@ -381,7 +412,7 @@ cbSummonPlant=Summon Plant cbLaunchZeppelin=Launch Zeppelin #VSubmenuQuest.java lblQuestData=Quest Data -lblLoadQuestData =Load Quest Data +lblLoadQuestData=Load Quest Data lblStartanewQuest=Start a new Quest lblOldQuestData=Old quest data? Put into %s and restart Forge. rbEasy=Easy @@ -403,7 +434,7 @@ lblAllowDuplicateCards=Allow duplicate cards lblStartingPoolDistribution=Starting pool distribution lblChooseDistribution=Choose Distribution lblPrizedCards=Prized cards -lblAllCardsAvailableWin =All cards will be available to win. +lblAllCardsAvailableWin=All cards will be available to win. lblOnlySetsInStarting=Only sets in starting pool will be available. lblAllowUnlockAdEd=Allow unlock of additional editions lblEmbark=Embark! @@ -659,4 +690,136 @@ lblWinsforNewDraft=Wins for New Draft lblWinsperDraftRotation=Wins per Draft Rotation ttWinsperDraftRotation=If a Draft is not played for this many match wins, it will be removed or replaced. lblRotationType=Rotation Type -ttRotationType =If set to 0, old drafts disappear, if set to 1, they are replaced with another one using different sets. +ttRotationType=If set to 0, old drafts disappear, if set to 1, they are replaced with another one using different sets. +#StatTypeFilter.java +lblclicktotoogle=click to toggle the filter, right-click to show only +#SItemManagerUtil.java +lblWhitecards=White cards +lblBluecards=Blue cards +lblBlackcards=Black cards +lblRedcards=Red cards +lblGreencards=Green cards +lblColorlesscards=Colorless cards +lblMulticolorcards=Multicolor cards +lblPackordeck=Card packs and prebuilt decks +lblLands=Lands +lblArtifacts=Artifacts +lblCreatures=Creatures +lblEnchantments=Enchantments +lblPlaneswalkers=Planeswalkers +lblInstants=Instants +lblSorceries=Sorceries +lblCCMC0=Cards with CMC 0 +lblCCMC1=Cards with CMC 1 +lblCCMC2=Cards with CMC 2 +lblCCMC3=Cards with CMC 3 +lblCCMC4=Cards with CMC 4 +lblCCMC5=Cards with CMC 5 +lblCCMC6orMore=Cards with CMC 6+ +lblWhitedecks=White decks +lblBluedecks=Blue decks +lblBlackdecks=Black decks +lblReddecks=Red decks +lblGreendecks=Green decks +lblColorlessdecks=Colorless decks +lblMulticolordecks=Multicolor decks +lblOldstyleFoilcards=Old style Foil cards +lblNewstyleFoilcards=New style Foil cards +lblNon-Foilcards=Non-Foil cards +lblUnratedcards=Unrated cards +lbl1starcards=1 star cards +lbl2starcards=2 star cards +lbl3starcards=3 star cards +lbl4starcards=4 star cards +lbl5starcards=5 star cards +lblXcopiesof=X copies of +lblcopiesof=copies of +#ACEditorBase.java +lblAddcard=Add card +ttAddcard=Add selected card to current deck (or double click the row or hit the spacebar) +lblAdd4ofcard=Add 4 of card +ttAdd4ofcard=Add up to 4 of selected card to current deck +lblRemovecard=Remove card +ttRemovecard=Remove selected card from current deck (or double click the row or hit the spacebar) +lblRemove4ofcard=Remove 4 of card +ttRemove4ofcard=Remove up to 4 of selected card to current deck +lblAddBasicLands=Add Basic Lands +ttAddBasicLands=Add basic lands to the deck +lblCardCatalog=Card Catalog +lblJumptoprevioustable=Jump to previous table +lblJumptopnexttable=Jump to next table +lblJumptotextfilter=Jump to text filter +lblChooseavalueforX=Choose a value for X +#VCurrentDeck.java +lblVCurrentDeck=Current Deck +ttbtnSave=Save Deck (Ctrl+S) +ttbtnSaveAs=Save Deck As (Ctrl+E) +ttbtnLoadDeck=Open Deck (Ctrl+O) +ttbtnNewDeck=New Deck (Ctrl+N) +ttbtnPrintProxies=Print to HTML file (Ctrl+P) +lblImport=Import +ttImportDeck=Attempt to import a deck from a non-Forge format (Ctrl+I) +lblTitle=Title +#ImageView.java +lblExpandallgroups=Expand all groups +lblCollapseallgroups=Collapse all groups +lblGroupby=group by +lblPileby=pile by +lblColumns=Columns +#CEditorVariant.java +lblCatalog=Catalog +lblAdd=Add +lbltodeck=to deck +lblfromdeck=from deck +lbltosideboard=to sideboard +lblfromsideboard=from sideboard +lblascommander=as commander +lblasavatar=as avatar +lblfromschemedeck=from scheme deck +lblfromplanardeck=from planar deck +lblfromconspiracydeck=from conspiracy deck +#GroupDef.java +lblColor=Color +lblColorIdentity=Color Identity +lblSet=Set +lblDefault=Default +lblType=Type +lblPlaneswalkerDeckSort=Planeswalker Deck Sort +lblRarity=Rarity +lblConvertToFoil=Foil +lblMulticolor=Multicolor +#DeckFileMenu.java +lblNewDeck=New Deck +lblOpenDeck=Open Deck +lblImportDeck=Import Deck +lblSaveDeck=Save Deck +lblSaveDeckAs=Save Deck As +lblPrinttoHTMLfile=Print to HTML file +#PaperCard.java +lblCard=Carta +#CardManager.java +lblFormat=Format +lblFormats=Formats +lblQuestWorld=Quest World +lblSets=Sets +lblTypes=Types +lblConvertedManaCosts=Converted mana +lblCMCRange=CMC Range +lblPowerRange=Power Range +lblToughnessRange=Toughness Range +lblFoil=Foil +lblPersonalRating=Personal Rating +lblAdvanced=Advanced +#VDeckgen.java +lblDeckGeneration=Deck Generation +btnRandCardpool=Random Cardpool +ttbtnRandCardpool=Generate random constructed cardpool in current deck area +btnRandDeck2=Constructed (2 color) +ttbtnRandDeck2=Generate 2 color constructed deck in current deck area +btnRandDeck3=Constructed (3 color) +ttbtnRandDeck3=Generate 3 color constructed deck in current deck area +btnRandDeck5=Constructed (5 color) +ttbtnRandDeck5=Generate 5 color constructed deck in current deck area +#DeckCotroller.java +lblCurrentDeck2=Current Deck +lblUntitled=Untitled diff --git a/forge-gui/res/languages/es-es.properties b/forge-gui/res/languages/es-es.properties index e8bfaf9d674..6e04781e980 100644 --- a/forge-gui/res/languages/es-es.properties +++ b/forge-gui/res/languages/es-es.properties @@ -7,6 +7,36 @@ splash.loading.decks=Cargando Mazos... splash.loading.processingimagesprites=Procesando imágenes de cartas #FControl.java lblOpeningMainWindow=Abriendo ventana principal... +lblCloseScreen=Cerrar Pantalla +txCloseAction1=Forge ahora admite pestañas de navegación que permiten cerrar y cambiar entre diferentes pantallas con facilidad. Como resultado, ya no necesita usar el botón X en la esquina superior derecha para cerrar la pantalla actual y regresar. +txCloseAction2=Seleccione lo que desea que suceda al hacer clic en el botón X en la parte superior derecha. Esta opción se utilizará en el futuro y no volverá a ver este mensaje. Puedes cambiar este comportamiento en cualquier momento en Preferencias. +titCloseAction=Seleccione su Acción al Cerrar +lblAreYouSureYouWishRestartForge=¿Estás seguro de que deseas reiniciar Forge? +lblAreYouSureYouWishExitForge=¿Estás seguro de que deseas salir de Forge? +lblOneOrMoreGamesActive=Una o más partidas están actualmente activos +lblerrLoadingLayoutFile=No se pudo leer el archivo de diseño %s. Se eliminará después de presionar OK.\nEl juego continuará con el diseño predeterminado. +lblLoadingQuest=Cargando datos de Aventura.... +#FScreen.java +lblHome=Inicio +lblWorkshop=Taller +lblBacktoHome=Volver a Inicio +lblDeckEditor=Editor de Mazos +lblCloseEditor=Cerrar Editor +lblCommanderDeckEditor=Editor Mazos Commander +lblTinyLeadersDeckEditor=Editor Mazos Tiny Leaders +lblBrawlDeckEditor=Editor Mazos Brawl +lblDraftDeckEditor=Editor Mazo Draft +lblSealedDeckEditor=Editor Mazo Sellao +lblTokenViewer=Visor de Tokens +lblCloseViewer=Cerrar Visor +lblQuestDeckEditor=Editor Mazos Aventura +lblQuestTournamentDeckEditor=Editor Mazos Torneos Aventura +lblSpellShop=Tienda de Hechizos +lblLeaveShop=Salir de la Tienda +lblLeaveDraft=Abandonar Draft +lblBazaar=Bazar +lblConcedeGame=Conceder Partida +txerrFailedtodeletelayoutfile=Fallo al borrar el archivo de disposición #VSubmenuPreferences.java Preferences=Preferencias btnReset=Restablecer la configuración predeterminada @@ -70,7 +100,6 @@ cbUseSentry=Enviar automáticamente informes de errores. cbpGameLogEntryType=Verbosidad del registro del juego cbpCloseAction=Acción al cerrar cbpDefaultFontSize=Tamaño de fuente predeterminado -cbpMulliganRule = Mulligan Rule cbpAiProfiles=Personalidad de la IA cbpDisplayCurrentCardColors=Mostrar color detallado de la carta cbpAutoYieldMode=Auto-Ceder @@ -79,11 +108,12 @@ cbpCounterDisplayLocation=Ubicación del contador cbpGraveyardOrdering=Permitir ordenar cartas puestas en el cementerio Troubleshooting=Solución de problemas GeneralConfiguration=Configuración general +lblPlayerName=Nombre Jugador nlPlayerName=Establece el nombre al que te referirá Forge durante el juego. nlCompactMainMenu=Habilitar para una barra lateral eficiente en espacio que muestre solo un grupo de menús a la vez (REQUIERE REINICIAR). nlUseSentry=Cuando está habilitado, envía automáticamente informes de errores a los desarrolladores. GamePlay=Juego -nlpMulliganRule=Choose the version of the Mulligan rule +nlpMulliganRule=Elige versión de reglas de Mulligan nlpAiProfiles=Elige tu oponente de la IA nlAnte=Determina si el juego se juega con apuesta o no. nlAnteMatchRarity=Intenta crear apuesta de la misma rareza para todos los jugadores. @@ -120,6 +150,7 @@ nlLoadCardsLazily=Si está activado, Forge cargará los scripts de las cartas se nlLoadHistoricFormats=Si está activado, Forge cargará todas los formatos históricos, esto puede demorar un poco más en cargarse en el inicio. GraphicOptions=Opciones gráficas nlDefaultFontSize=El tamaño de fuente predeterminado dentro de la interfaz de usuario. Todos los elementos de fuente se escalan en relación a esto. (Necesita reinicio) +cbpMulliganRule=Regla de Mulligan nlImageFetcher=Permite la descarga instantánea de imágenes de cartas faltantes. nlDisplayFoil=Mostrar cartas foil con un capa que da efecto foil sobre la carta nlRandomFoil=Agrega efecto de foil a cartas aleatorias. @@ -175,12 +206,12 @@ ReleaseNotes=Notas de la Versión # CSubmenuPreferences.java CantChangeDevModeWhileNetworkMath=¡No se puede cambiar a Modo Desarrollador mientras se está realizando una partida en red! CompatibilityWarningsReEnabled=¡Advertencias de compatibilidad re-habilitadas! -AresetForgeSettingsToDefault=Esto reseteará todas las preferencias a sus valores predeterminados y reiniciará Forge.\n\ n¿Resetear y reiniciar Forge? +AresetForgeSettingsToDefault=Esto reseteará todas las preferencias a sus valores predeterminados y reiniciará Forge.\n\n¿Resetear y reiniciar Forge? TresetForgeSettingsToDefault=Ajustes del Reset AresetDeckEditorLayout=Esto restablecerá el diseño de la pantalla del Editor de Mazos.\nTodas las vistas con pestañas se restaurarán a sus posiciones predeterminadas.\n\n ¿Restablecer diseño? TresetDeckEditorLayout=Restablecer diseño del Editor de Mazos OKresetDeckEditorLayout=El diseño del Editor se ha reestablecido correctamente -AresetWorkshopLayout=Esto restablecerá el diseño del Taller.\nTodas las vistas con pestañas se restaurarán a sus posiciones predeterminadas. \n\n ¿Restablecer diseño? +AresetWorkshopLayout=Esto restablecerá el diseño del Taller.\nTodas las vistas con pestañas se restaurarán a sus posiciones predeterminadas. \n\n¿Restablecer diseño? TresetWorkshopLayout=Restablecer diseño del Taller. OKresetWorkshopLayout=El diseño del Taller se ha restablecido. AresetMatchScreenLayout=Esto restablecerá el diseño de la pantalla de Juego.\n Si desea guardar primero el diseño actual, use la pestaña Dock -> Guardar opción de diseño en la pantalla de Juego\n \n ¿Restablecer diseño? @@ -207,7 +238,7 @@ lblConstructedMode=Modo Construido lblConstructed=Construido #PlayerPanel.java lblSelectaDeck=Selecciona un Mazo -lblSelectaSchemeDeck=Selecciona un Mazo de Fenómenos (Scheme) +lblSelectaSchemeDeck=Selecciona un Mazo de Escenario (Scheme) lblSchemeDeckEditor=Editor de Mazo de Escenario (Scheme) lblSelectaCommanderDeck=Selecciona un Mazo Commander lblSelectaPlanarDeck=Selecciona un Mazo Planar @@ -381,7 +412,7 @@ cbSummonPlant=Invocar Planta cbLaunchZeppelin=Lanzar Zeppelin #VSubmenuQuest.java lblQuestData=Datos de Aventura -lblLoadQuestData=Load Quest Data +lblLoadQuestData=Cargar Datos de Aventura lblStartanewQuest=Comenzar una nueva Aventura lblOldQuestData=Viejos datos de Aventura? Poner en %n y reiniciar Forge. rbEasy=Fácil @@ -477,7 +508,7 @@ btnSpendToken=Gastar Token btnStartMatchSmall=Comenzar Siguiente Partida lblUndetermined=Sin determinar btnSpendTokenTT=Crea un nuevo torneo que se puede jugar de inmediato. -lblPastResults=Past Results +lblPastResults=Resultados Anteriores #VSubmenuQuestDecks.java lblQuestDecks=Mazos de la Aventura lblQuestDesc1=En el modo Aventura, construyes un mazo a partir de un inventario limitado. @@ -566,7 +597,7 @@ lblnextChallengeInWins1=Un nuevo desafío estará disponible después de 1 victo lblnextChallengeInWins2=Un nuevo desafío estará disponible después de %n victorias más. lblWinStreak=Racha lblBest=Mejor -lblBuildAndSelectaDeck=Construye, luego selecciona un mazo en el submenú "Mazo de misiones". +lblBuildAndSelectaDeck=Construye, luego selecciona un mazo en el submenú "Mazos de la Aventura". lblCurrentDeck=Tu mazo actual es %n PleaseCreateAQuestBefore=Por favor crea una aventura antes de intentar %n. lblNoQuest=No Aventura @@ -591,7 +622,7 @@ lblBoosterPackRatios=Proporción de pack de sobres lblDifficultyAdjustments=Ajustes de dificultad lblShopPreferences=Preferencias de la tienda lblDraftTournaments=Torneos de Draft -lblBaseWinnings= +lblBaseWinnings=Base Winnings lblNoLosses=Sin pérdidas lblPoisonWin=Victoria por Veneno lblMillingWin=Victoria por Deckeo @@ -660,3 +691,135 @@ lblWinsperDraftRotation=Victorias Rotación de Draft ttWinsperDraftRotation=Si no se juega un Draft para esta cantidad de victorias, se eliminará o reemplazará. lblRotationType=Tipo de Rotación ttRotationType=Si se establece en 0, los anteriores Draft desaparecen, si se establece en 1, se reemplazan por otros que utilizan sets diferentes. +#StatTypeFilter.java +lblclicktotoogle=haga clic para alternar el filtro, haga clic con el botón derecho para mostrar solo +#SItemManagerUtil.java +lblWhitecards=Cartas Blancas +lblBluecards=Cartas Azules +lblBlackcards=Cartas Negras +lblRedcards=Cartas Rojas +lblGreencards=Cartas Verdes +lblColorlesscards=Cartas Incoloras +lblMulticolorcards=Cartas Multicolor +lblPackordeck=Pack de Cartas y Mazos Preconstruidos +lblLands=Tierras +lblArtifacts=Artefactos +lblCreatures=Criaturas +lblEnchantments=Encantamientos +lblPlaneswalkers=Planeswalkers +lblInstants=Instantáneos +lblSorceries=Conjuros +lblCCMC0=Cartas con CMC 0 +lblCCMC1=Cartas con CMC 1 +lblCCMC2=Cartas con CMC 2 +lblCCMC3=Cartas con CMC 3 +lblCCMC4=Cartas con CMC 4 +lblCCMC5=Cartas con CMC 5 +lblCCMC6orMore=Cartas con CMC 6 o mas +lblWhitedecks=Mazos Blancos +lblBluedecks=Mazos Azules +lblBlackdecks=Mazos Negros +lblReddecks=Mazos Rojos +lblGreendecks=Mazos Verdes +lblColorlessdecks=Mazos Incoloros +lblMulticolordecks=Mazos Multicolor +lblOldstyleFoilcards=Cartas Foil Viejo Estilo +lblNewstyleFoilcards=Cartas Foil Nuevo Estilo +lblNon-Foilcards=Cartas no Foil +lblUnratedcards=Cartas sin valorar +lbl1starcards=Cartas 1 estrella +lbl2starcards=Cartas 2 estrellas +lbl3starcards=Cartas 3 estrellas +lbl4starcards=Cartas 4 estrellas +lbl5starcards=Cartas 5 estrellas +lblXcopiesof=X copias de +lblcopiesof=copias de +#ACEditorBase.java +lblAddcard=Añadir carta +ttAddcard=Añade la carta seleccionada al mazo actual (o haz doble clic en la fila o presiona la barra espaciadora) +lblAdd4ofcard=Añadir 4 cartas +ttAdd4ofcard=Añadir hasta 4 de la carta seleccionada al mazo actual +lblRemovecard=Quitar carta +ttRemovecard=Quitar la carta seleccionada del mazo actual (o haz doble clic en la fila o presiona la barra espaciadora) +lblRemove4ofcard=Quitar 4 cartas +ttRemove4ofcard=Quitar hasta 4 de la carta seleccionada al mazo actual +lblAddBasicLands=Añadir Tierras Básicas +ttAddBasicLands=Añadir tierras básicas al mazo +lblCardCatalog=Catálogo de Cartas +lblJumptoprevioustable=Saltar a la tabla anterior +lblJumptopnexttable=Saltar a la siguiente tabla +lblJumptotextfilter=Saltar al filtro de texto +lblChooseavalueforX=Elige un valor para X +#VCurrentDeck.java +lblVCurrentDeck=Mazo Actual +ttbtnSave=Guardar Mazo (Ctrl+S) +ttbtnSaveAs=Guardar Mazo como... (Ctrl+E) +ttbtnLoadDeck=Abrir Mazo (Ctrl+O) +ttbtnNewDeck=Nuevo Mazo ((Ctrl+N) +ttbtnPrintProxies=Imprimir a archivo HTML (Ctrl+P) +lblImport=Importar +ttImportDeck=Intenta importar un deck desde un formato que no sea Forge (Ctrl + I) +lblTitle=Título +#ImageView.java +lblExpandallgroups=Expandir todos los grupos +lblCollapseallgroups=Contraer todos los grupos +lblGroupby=agrupar por +lblPileby=apilar por +lblColumns=Columnas +#CEditorVariant.java +lblCatalog=Catálogo +lblAdd=Añadir +lbltodeck=al mazo +lblfromdeck=del mazo +lbltosideboard=al banquillo +lblfromsideboard=del banquillo +lblascommander=como comandante +lblasavatar=como avatar +lblfromschemedeck=del mazo de escenario +lblfromplanardeck=del mazo planar +lblfromconspiracydeck=del mazo conspiracy +#GroupDef.java +lblColor=Color +lblColorIdentity=Identidad de Color +lblSet=Edición +lblDefault=por defecto +lblType=Tipo +lblPlaneswalkerDeckSort=por Planewalkers +lblRarity=Rareza +lblConvertToFoil=Foil +lblMulticolor=Multicolor +#DeckFileMenu.java +lblNewDeck=Nuevo Mazo +lblOpenDeck=Abrir Mazo +lblImportDeck=Importar Mazo +lblSaveDeck=Guardar Mazo +lblSaveDeckAs=Guardar Mazo como... +lblPrinttoHTMLfile=Imprimir en fichero HTML +#PaperCard.java +lblCard=Carta +#CardManager.java +lblFormat=Formato +lblFormats=Formatos +lblQuestWorld=Mundos del Modo Aventura +lblSets=Ediciones +lblTypes=Tipos +lblConvertedManaCosts=Maná Convertido +lblCMCRange=Rango de CMC +lblPowerRange=Rango de Fuerza +lblToughnessRange=Rango de Resistencia +lblFoil=Foil +lblPersonalRating=Puntuación Personal +lblAdvanced=Avanzado +#VDeckgen.java +lblDeckGeneration=Deck Generation +btnRandCardpool=Random Cardpool +ttbtnRandCardpool=Generate random constructed cardpool in current deck area +btnRandDeck2=Constructed (2 color) +ttbtnRandDeck2=Generate 2 color constructed deck in current deck area +btnRandDeck3=Constructed (3 color) +ttbtnRandDeck3=Generate 3 color constructed deck in current deck area +btnRandDeck5=Constructed (5 color) +ttbtnRandDeck5=Generate 5 color constructed deck in current deck area +#DeckCotroller.java +lblCurrentDeck2=Current Deck +lblUntitled=Untitled diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index 075a70889ae..a90d573ddca 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -15,9 +15,10 @@ import forge.deck.DeckProxy; import forge.item.InventoryItem; import forge.item.PaperCard; import forge.model.FModel; +import forge.util.Localizer; public enum GroupDef { - COLOR("Color", getColorGroups(), + COLOR("lblColor", getColorGroups(), new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -36,7 +37,7 @@ public enum GroupDef { return -1; } }), - COLOR_IDENTITY("Color Identity", getColorGroups(), + COLOR_IDENTITY("lblColorIdentity", getColorGroups(), new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -55,7 +56,7 @@ public enum GroupDef { return -1; } }), - SET("Set", getSetGroups(), + SET("lblSet", getSetGroups(), new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -74,7 +75,7 @@ public enum GroupDef { return -1; } }), - DEFAULT("Default", + DEFAULT("lblDefault", new String[] { "Creatures", "Spells", "Lands" }, new Function() { @Override @@ -104,7 +105,7 @@ public enum GroupDef { } }), - CARD_TYPE("Type", + CARD_TYPE("lblType", new String[] { "Planeswalker", "Creature", "Sorcery", "Instant", "Artifact", "Enchantment", "Land", "Tribal instant" }, new Function() { @Override @@ -148,7 +149,7 @@ public enum GroupDef { return -1; } }), - PW_DECK_SORT("Planeswalker Deck Sort", + PW_DECK_SORT("lblPlaneswalkerDeckSort", new String[] { "Planeswalker", "Rares", "Creature", "Land", "Other Spells" }, new Function() { @Override @@ -178,8 +179,8 @@ public enum GroupDef { return -1; } }), - CARD_RARITY("Rarity", - new String[] { "Mythic Rares", "Rares", "Uncommons", "Commons", "Basic Lands" }, + CARD_RARITY("lblRarity", + new String[] {"Mythic Rares", "Rares", "Uncommons", "Commons", "Basic Lands"}, new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -210,7 +211,8 @@ public enum GroupDef { }); GroupDef(String name0, String[] groups0, Function fnGetPileByOverride0, Function fnGroupItem0) { - this.name = name0; + final Localizer localizer = Localizer.getInstance(); + this.name = localizer.getMessage(name0); this.groups = groups0; this.fnGetPileByOverride = fnGetPileByOverride0; this.fnGroupItem = fnGroupItem0; @@ -247,8 +249,15 @@ public enum GroupDef { } private static String[] getColorGroups() { + final Localizer localizer = Localizer.getInstance(); + String white = new String(localizer.getMessage("lblWhite")); + String blue = new String(localizer.getMessage("lblBlue")); + String black = new String(localizer.getMessage("lblBlack")); + String green = new String(localizer.getMessage("lblGreen")); + String multicolor = new String(localizer.getMessage("lblMulticolor")); + String colorless = new String(localizer.getMessage("lblColorless")); //TODO: Support breaking up Multicolor into separate groups for each color combination - return new String[] { "White", "Blue", "Black", "Red", "Green", "Multicolor", "Colorless" }; + return new String[] {white,blue,black,green,multicolor,colorless }; } private static Integer getColorGroup(ColorSet color) { diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index a5df84f7e1a..b880cf717b6 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -9,6 +9,7 @@ import forge.deck.DeckProxy; import forge.interfaces.IComboBox; import forge.item.InventoryItem; import forge.util.ComparableOp; +import forge.util.Localizer; import java.util.ArrayList; import java.util.Collections; @@ -28,49 +29,49 @@ import java.util.Map.Entry; public final class SItemManagerUtil { /** An enum to encapsulate metadata for the stats/filter objects. */ public static enum StatTypes implements IHasSkinProp { - WHITE (FSkinProp.IMG_MANA_W, CardRulesPredicates.Presets.IS_WHITE, "White cards"), - BLUE (FSkinProp.IMG_MANA_U, CardRulesPredicates.Presets.IS_BLUE, "Blue cards"), - BLACK (FSkinProp.IMG_MANA_B, CardRulesPredicates.Presets.IS_BLACK, "Black cards"), - RED (FSkinProp.IMG_MANA_R, CardRulesPredicates.Presets.IS_RED, "Red cards"), - GREEN (FSkinProp.IMG_MANA_G, CardRulesPredicates.Presets.IS_GREEN, "Green cards"), - COLORLESS (FSkinProp.IMG_MANA_COLORLESS, CardRulesPredicates.Presets.IS_COLORLESS, "Colorless cards"), - MULTICOLOR (FSkinProp.IMG_MULTI, CardRulesPredicates.Presets.IS_MULTICOLOR, "Multicolor cards"), + WHITE (FSkinProp.IMG_MANA_W, CardRulesPredicates.Presets.IS_WHITE, "lblWhitecards"), + BLUE (FSkinProp.IMG_MANA_U, CardRulesPredicates.Presets.IS_BLUE, "lblBluecards"), + BLACK (FSkinProp.IMG_MANA_B, CardRulesPredicates.Presets.IS_BLACK, "lblBlackcards"), + RED (FSkinProp.IMG_MANA_R, CardRulesPredicates.Presets.IS_RED, "lblRedcards"), + GREEN (FSkinProp.IMG_MANA_G, CardRulesPredicates.Presets.IS_GREEN, "lblGreencards"), + COLORLESS (FSkinProp.IMG_MANA_COLORLESS, CardRulesPredicates.Presets.IS_COLORLESS, "lblColorlesscards"), + MULTICOLOR (FSkinProp.IMG_MULTI, CardRulesPredicates.Presets.IS_MULTICOLOR, "lblMulticolorcards"), - PACK_OR_DECK (FSkinProp.IMG_PACK, null, "Card packs and prebuilt decks"), - LAND (FSkinProp.IMG_LAND, CardRulesPredicates.Presets.IS_LAND, "Lands"), - ARTIFACT (FSkinProp.IMG_ARTIFACT, CardRulesPredicates.Presets.IS_ARTIFACT, "Artifacts"), - CREATURE (FSkinProp.IMG_CREATURE, CardRulesPredicates.Presets.IS_CREATURE, "Creatures"), - ENCHANTMENT (FSkinProp.IMG_ENCHANTMENT, CardRulesPredicates.Presets.IS_ENCHANTMENT, "Enchantments"), - PLANESWALKER (FSkinProp.IMG_PLANESWALKER, CardRulesPredicates.Presets.IS_PLANESWALKER, "Planeswalkers"), - INSTANT (FSkinProp.IMG_INSTANT, CardRulesPredicates.Presets.IS_INSTANT, "Instants"), - SORCERY (FSkinProp.IMG_SORCERY, CardRulesPredicates.Presets.IS_SORCERY, "Sorceries"), + PACK_OR_DECK (FSkinProp.IMG_PACK, null, "lblPackordeck"), + LAND (FSkinProp.IMG_LAND, CardRulesPredicates.Presets.IS_LAND, "lblLands"), + ARTIFACT (FSkinProp.IMG_ARTIFACT, CardRulesPredicates.Presets.IS_ARTIFACT, "lblArtifacts"), + CREATURE (FSkinProp.IMG_CREATURE, CardRulesPredicates.Presets.IS_CREATURE, "lblCreatures"), + ENCHANTMENT (FSkinProp.IMG_ENCHANTMENT, CardRulesPredicates.Presets.IS_ENCHANTMENT, "lblEnchantments"), + PLANESWALKER (FSkinProp.IMG_PLANESWALKER, CardRulesPredicates.Presets.IS_PLANESWALKER, "lblPlaneswalkers"), + INSTANT (FSkinProp.IMG_INSTANT, CardRulesPredicates.Presets.IS_INSTANT, "lblInstants"), + SORCERY (FSkinProp.IMG_SORCERY, CardRulesPredicates.Presets.IS_SORCERY, "lblSorceries"), - CMC_0 (FSkinProp.IMG_MANA_0, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 0), "Cards with CMC 0"), - CMC_1 (FSkinProp.IMG_MANA_1, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 1), "Cards with CMC 1"), - CMC_2 (FSkinProp.IMG_MANA_2, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 2), "Cards with CMC 2"), - CMC_3 (FSkinProp.IMG_MANA_3, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 3), "Cards with CMC 3"), - CMC_4 (FSkinProp.IMG_MANA_4, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 4), "Cards with CMC 4"), - CMC_5 (FSkinProp.IMG_MANA_5, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 5), "Cards with CMC 5"), - CMC_6 (FSkinProp.IMG_MANA_6, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.GT_OR_EQUAL, 6), "Cards with CMC 6+"), + CMC_0 (FSkinProp.IMG_MANA_0, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 0), "lblCCMC0"), + CMC_1 (FSkinProp.IMG_MANA_1, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 1), "lblCCMC1"), + CMC_2 (FSkinProp.IMG_MANA_2, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 2), "lblCCMC2"), + CMC_3 (FSkinProp.IMG_MANA_3, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 3), "lblCCMC3"), + CMC_4 (FSkinProp.IMG_MANA_4, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 4), "lblCCMC4"), + CMC_5 (FSkinProp.IMG_MANA_5, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 5), "lblCCMC5"), + CMC_6 (FSkinProp.IMG_MANA_6, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.GT_OR_EQUAL, 6), "lblCCMC6orMore"), - DECK_WHITE (FSkinProp.IMG_MANA_W, null, "White decks"), - DECK_BLUE (FSkinProp.IMG_MANA_U, null, "Blue decks"), - DECK_BLACK (FSkinProp.IMG_MANA_B, null, "Black decks"), - DECK_RED (FSkinProp.IMG_MANA_R, null, "Red decks"), - DECK_GREEN (FSkinProp.IMG_MANA_G, null, "Green decks"), - DECK_COLORLESS (FSkinProp.IMG_MANA_COLORLESS, null, "Colorless decks"), - DECK_MULTICOLOR (FSkinProp.IMG_MULTI, null, "Multicolor decks"), + DECK_WHITE (FSkinProp.IMG_MANA_W, null, "lblWhitedecks"), + DECK_BLUE (FSkinProp.IMG_MANA_U, null, "lblBluedecks"), + DECK_BLACK (FSkinProp.IMG_MANA_B, null, "lblBlackdecks"), + DECK_RED (FSkinProp.IMG_MANA_R, null, "lblReddecks"), + DECK_GREEN (FSkinProp.IMG_MANA_G, null, "lblGreendecks"), + DECK_COLORLESS (FSkinProp.IMG_MANA_COLORLESS, null, "lblColorlessdecks"), + DECK_MULTICOLOR (FSkinProp.IMG_MULTI, null, "lblMulticolordecks"), - FOIL_OLD (FSkinProp.FOIL_11, null, "Old style Foil cards"), - FOIL_NEW (FSkinProp.FOIL_01, null, "New style Foil cards"), - FOIL_NONE (FSkinProp.ICO_CLOSE, null, "Non-Foil cards"), + FOIL_OLD (FSkinProp.FOIL_11, null, "lblOldstyleFoilcards"), + FOIL_NEW (FSkinProp.FOIL_01, null, "lblNewstyleFoilcards"), + FOIL_NONE (FSkinProp.ICO_CLOSE, null, "lblNon-Foilcards"), - RATE_NONE (FSkinProp.IMG_FAVNONE, null, "Unrated cards"), - RATE_1 (FSkinProp.IMG_FAV1, null, "1 star cards"), - RATE_2 (FSkinProp.IMG_FAV2, null, "2 star cards"), - RATE_3 (FSkinProp.IMG_FAV3, null, "3 star cards"), - RATE_4 (FSkinProp.IMG_FAV4, null, "4 star cards"), - RATE_5 (FSkinProp.IMG_FAV5, null, "5 star cards"); + RATE_NONE (FSkinProp.IMG_FAVNONE, null, "lblUnratedcards"), + RATE_1 (FSkinProp.IMG_FAV1, null, "lbl1starcards"), + RATE_2 (FSkinProp.IMG_FAV2, null, "lbl2starcards"), + RATE_3 (FSkinProp.IMG_FAV3, null, "lbl3starcards"), + RATE_4 (FSkinProp.IMG_FAV4, null, "lbl4starcards"), + RATE_5 (FSkinProp.IMG_FAV5, null, "lbl5starcards"); public final FSkinProp skinProp; @@ -80,7 +81,8 @@ public final class SItemManagerUtil { private StatTypes(final FSkinProp skinProp0, final Predicate predicate0, final String label0) { skinProp = skinProp0; predicate = predicate0; - label = label0; + final Localizer localizer = Localizer.getInstance(); + label = localizer.getMessage(label0); } @Override @@ -95,6 +97,7 @@ public final class SItemManagerUtil { return getItemDisplayString(items, qty, forTitle); } public static String getItemDisplayString(final Iterable items, final int qty, final boolean forTitle) { + final Localizer localizer = Localizer.getInstance(); //determine shared type among items int itemCount = 0; String sharedType = null; @@ -130,10 +133,10 @@ public final class SItemManagerUtil { result = itemCount + " " + result + "s"; } if (qty < 0) { //treat negative numbers as unknown quantity - result = "X copies of " + result; + result = localizer.getMessage("lblXcopiesof") + " " + result; } else if (qty != 1) { - result = qty + " copies of " + result; + result = qty + " " + localizer.getMessage("lblcopiesof")+ " " + result; } } return result; @@ -166,8 +169,9 @@ public final class SItemManagerUtil { final boolean isDeckManager = itemManager.getGenericType().equals(DeckProxy.class); final GroupDef[] groupByOptions = isDeckManager ? DECK_GROUPBY_OPTIONS : CARD_GROUPBY_OPTIONS; final ColumnDef[] pileByOptions = isDeckManager ? DECK_PILEBY_OPTIONS : CARD_PILEBY_OPTIONS; - cbGroupByOptions.addItem("(none)"); - cbPileByOptions.addItem("(none)"); + final Localizer localizer = Localizer.getInstance(); + cbGroupByOptions.addItem("(" + localizer.getMessage("lblNone") + ")"); + cbPileByOptions.addItem("(" + localizer.getMessage("lblNone") + ")"); for (final GroupDef option : groupByOptions) { cbGroupByOptions.addItem(option); } From 680d8e1c9caa2b269b374f160ffe9de4be9451b1 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 13:19:24 +0800 Subject: [PATCH 45/64] add some scripts --- .../java/forge/game/ability/effects/ChangeZoneEffect.java | 7 +++++-- forge-gui/res/cardsfolder/upcoming/aether_gust.txt | 1 + forge-gui/res/cardsfolder/upcoming/corpse_knight.txt | 2 ++ forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt | 4 +++- forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt | 8 +++++++- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 52f2dfa00dd..4397465f47c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -391,8 +391,11 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (sa.hasParam("DestinationAlternative")) { final StringBuilder sb = new StringBuilder(); sb.append(sa.getParam("AlternativeDestinationMessage")); - - if (!player.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneToAltDestination, sb.toString())) { + Player alterDecider = player; + if (sa.hasParam("AlternativeDecider")) { + alterDecider = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("AlternativeDecider"), sa).get(0); + } + if (!alterDecider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneToAltDestination, sb.toString())) { destination = ZoneType.smartValueOf(sa.getParam("DestinationAlternative")); altDest = true; } diff --git a/forge-gui/res/cardsfolder/upcoming/aether_gust.txt b/forge-gui/res/cardsfolder/upcoming/aether_gust.txt index e096b110179..1b731a7cba2 100644 --- a/forge-gui/res/cardsfolder/upcoming/aether_gust.txt +++ b/forge-gui/res/cardsfolder/upcoming/aether_gust.txt @@ -1,4 +1,5 @@ Name:Aether Gust ManaCost:1 U Types:Instant +A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Card.inZoneStack+Red,Card.inZoneStack+Green,Permanent.Red,Permanent.Green | TgtZone$ Battlefield,Stack | TgtPrompt$ Select target spell or permanent that's red or green | AlternativeDecider$ TargetedController | Origin$ Battlefield,Stack | Fizzle$ True | Destination$ Library | LibraryPosition$ 0 | DestinationAlternative$ Library | LibraryPositionAlternative$ -1 | AlternativeDestinationMessage$ Would you like to put the card on the top of your library (and not on the bottom)? | SpellDescription$ Choose target spell or permanent that's red or green. Its owner puts it on the top or bottom of their library. Oracle:Choose target spell or permanent that's red or green. Its owner puts it on the top or bottom of their library. diff --git a/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt b/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt index 14399e0512d..6b3d39e050c 100644 --- a/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt +++ b/forge-gui/res/cardsfolder/upcoming/corpse_knight.txt @@ -2,4 +2,6 @@ Name:Corpse Knight ManaCost:W B Types:Creature Zombie Knight PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever another creature enters the battlefield under your control, each opponent loses 1 life. +SVar:TrigDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 Oracle:Whenever another creature enters the battlefield under your control, each opponent loses 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt b/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt index d2c86333d68..441fc29a7dd 100644 --- a/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt +++ b/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt @@ -1,6 +1,8 @@ Name:Empyrean Eagle ManaCost:1 W U Types:Creature Bird Spirit -K:Flying PT:2/3 +K:Flying +S:Mode$ Continuous | Affected$ Creature.withFlying+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other creatures you control with flying get +1/+1. +SVar:PlayMain1:TRUE Oracle:Flying\nOther creatures you control with flying get +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt index 7d391071ffe..80b86abe1df 100644 --- a/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/upcoming/field_of_the_dead.txt @@ -1,4 +1,10 @@ Name:Field of the Dead ManaCost:no cost Types:Land -Oracle:Field of the Dead enters the battlefield tapped.\n{T}: Add {C}.\nWhenever Field fo the Dead or another land enters the battlefield under your control, if you control seven or more lands with different names, create a 2/2 black Zombie creature token. +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ X | SVarCompare$ GE7 | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME or another land enters the battlefield under your control, if you control seven or more lands with different names, create a 2/2 black Zombie creature token. +T:Mode$ ChangesZone | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE7 | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | Execute$ TrigToken | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another land enters the battlefield under your control, if you control seven or more lands with different names, create a 2/2 black Zombie creature token. +SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenAmount$ 1 | LegacyImage$ b 2 2 zombie m20 +SVar:X:Count$DifferentCardNames_Land.YouCtrl+inZoneBattlefield +Oracle:Field of the Dead enters the battlefield tapped.\n{T}: Add {C}.\nWhenever Field of the Dead or another land enters the battlefield under your control, if you control seven or more lands with different names, create a 2/2 black Zombie creature token. From c82950555df8aa7588c3e6fdd075cff648ab37ec Mon Sep 17 00:00:00 2001 From: kms70847 Date: Wed, 19 Jun 2019 01:34:19 -0400 Subject: [PATCH 46/64] Use FMouseAdapter's `onLeftDoubleClick` event for double click detection in ListChooser. --- forge-gui-desktop/src/main/java/forge/gui/ListChooser.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java b/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java index de74b2b9b0d..ae670d53f84 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java @@ -134,10 +134,8 @@ public class ListChooser { } }); this.lstChoices.addMouseListener(new FMouseAdapter() { - @Override public void onLeftClick(final MouseEvent e) { - if (e.getClickCount() == 2) { + @Override public void onLeftDoubleClick(final MouseEvent e) { ListChooser.this.commit(); - } } }); } From 49d57a0365c6ebeca13563dec9cb5ccd174c720b Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Wed, 19 Jun 2019 06:40:15 +0100 Subject: [PATCH 47/64] Added Random Modern World --- forge-gui/res/quest/world/worlds.txt | 1 + .../forge/quest/QuestChallengeGenerator.java | 29 ++++++++++++++----- .../java/forge/quest/QuestController.java | 14 +++++++-- .../java/forge/quest/QuestEventLDADuel.java | 7 +++-- .../forge/quest/QuestEventLDADuelManager.java | 9 ++++-- .../src/main/java/forge/quest/QuestWorld.java | 7 +++++ 6 files changed, 51 insertions(+), 16 deletions(-) diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index 416def9a9c2..9a71672caec 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,5 +1,6 @@ Name:Main world Name:Random Standard +Name:Random Modern Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star diff --git a/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java b/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java index c54958a9143..621dded3c3f 100644 --- a/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java +++ b/forge-gui/src/main/java/forge/quest/QuestChallengeGenerator.java @@ -12,11 +12,24 @@ import java.util.*; public class QuestChallengeGenerator { - public static QuestEventChallengeList generateChallenges(){ + private GameFormat formatMedium=FModel.getFormats().getModern(); + private GameFormat formatHard=FModel.getFormats().get("Legacy"); + private GameFormat formatExpert=FModel.getFormats().get("Vintage"); + private GameFormat baseFormat; + + QuestChallengeGenerator(GameFormat baseFormat){ + this.baseFormat=baseFormat; + if(baseFormat.getName().equals((FModel.getFormats().getModern().getName()))){ + formatMedium=FModel.getFormats().get("Legacy"); + formatHard=FModel.getFormats().get("Vintage"); + } + } + + public QuestEventChallengeList generateChallenges(){ Map challenges = new HashMap<>(); int id = 0; for (int i=0;i<5;++i) { - QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().getModern()); + QuestEventChallenge qc = getFormatChallenge(formatMedium); qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(1000); qc.setWinsReqd(MyRandom.getRandom().nextInt(5)); @@ -36,7 +49,7 @@ public class QuestChallengeGenerator { id++; } for (int i=0;i<5;++i) { - QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().get("Legacy")); + QuestEventChallenge qc = getFormatChallenge(formatHard); qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(5000); qc.setCardReward("2 multicolor rares"); @@ -56,7 +69,7 @@ public class QuestChallengeGenerator { id++; } for (int i=0;i<5;++i) { - QuestEventChallenge qc = getFormatChallenge(FModel.getFormats().get("Vintage")); + QuestEventChallenge qc = getFormatChallenge(formatExpert); qc.setId(Integer.valueOf(id).toString()); qc.setCreditsReward(10000); qc.setCardReward("3 multicolor rares"); @@ -78,7 +91,7 @@ public class QuestChallengeGenerator { return new QuestEventChallengeList(challenges); } - public static QuestEventChallenge getFormatChallenge(GameFormat format){ + public QuestEventChallenge getFormatChallenge(GameFormat format){ QuestEventChallenge qc = new QuestEventChallenge(); qc.setAiLife(20); @@ -92,11 +105,11 @@ public class QuestChallengeGenerator { return qc; } - public static QuestEventChallenge getAIHeadstartChallenge(int extras){ + public QuestEventChallenge getAIHeadstartChallenge(int extras){ QuestEventChallenge qc = new QuestEventChallenge(); qc.setAiLife(20); - qc.setEventDeck(DeckgenUtil.buildLDACArchetypeDeck(FModel.getFormats().getStandard(),true)); + qc.setEventDeck(DeckgenUtil.buildLDACArchetypeDeck(baseFormat,true)); qc.setTitle(qc.getEventDeck().getName() + " headstart challenge"); qc.setName(qc.getEventDeck().getName() + " headstart challenge"); qc.setOpponentName(qc.getEventDeck().getName()); @@ -117,7 +130,7 @@ public class QuestChallengeGenerator { return qc; } - public static class QuestEventChallengeList implements IStorage{ + public class QuestEventChallengeList implements IStorage{ private Map challenges; diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 9750f45a03d..f679f7e954a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -446,9 +446,12 @@ public class QuestController { if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { - this.duelManager = new QuestEventLDADuelManager(); + this.duelManager = new QuestEventLDADuelManager(FModel.getFormats().getStandard()); return; - } else if (world.isCustom()) { + } else if (world.getName().equals(QuestWorld.MODERNWORLDNAME)) { + this.duelManager = new QuestEventLDADuelManager(FModel.getFormats().getModern()); + return; + }else if (world.isCustom()) { path = world.getDuelsDir() == null ? ForgeConstants.DEFAULT_DUELS_DIR : ForgeConstants.USER_QUEST_WORLD_DIR + world.getDuelsDir(); } else { path = world.getDuelsDir() == null ? ForgeConstants.DEFAULT_DUELS_DIR : ForgeConstants.QUEST_WORLD_DIR + world.getDuelsDir(); @@ -475,7 +478,12 @@ public class QuestController { if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { - allChallenges = QuestChallengeGenerator.generateChallenges(); + QuestChallengeGenerator gen = new QuestChallengeGenerator(FModel.getFormats().getStandard()); + allChallenges = gen.generateChallenges(); + return; + }else if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { + QuestChallengeGenerator gen = new QuestChallengeGenerator(FModel.getFormats().getModern()); + allChallenges = gen.generateChallenges(); return; } else if (world.isCustom()) { path = world.getChallengesDir() == null ? ForgeConstants.DEFAULT_CHALLENGES_DIR : ForgeConstants.USER_QUEST_WORLD_DIR + world.getChallengesDir(); diff --git a/forge-gui/src/main/java/forge/quest/QuestEventLDADuel.java b/forge-gui/src/main/java/forge/quest/QuestEventLDADuel.java index 162128048fc..9ebe9ca4e6c 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventLDADuel.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventLDADuel.java @@ -20,6 +20,7 @@ package forge.quest; import forge.deck.DeckgenUtil; import forge.deck.io.Archetype; +import forge.game.GameFormat; import forge.model.FModel; /** @@ -32,14 +33,16 @@ import forge.model.FModel; public class QuestEventLDADuel extends QuestEventDuel { private Archetype archetype; + private GameFormat baseFormat; /** * Instantiates a new quest duel. */ - public QuestEventLDADuel(Archetype archetype) { + public QuestEventLDADuel(Archetype archetype, GameFormat baseFormat) { super(); + this.baseFormat = baseFormat; this.archetype = archetype; - this.eventDeck = DeckgenUtil.buildLDACArchetypeDeck(archetype, FModel.getFormats().getStandard(),true); + this.eventDeck = DeckgenUtil.buildLDACArchetypeDeck(archetype, baseFormat,true); } } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java index 281cf71dfc7..0fdc9660461 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java @@ -19,6 +19,7 @@ package forge.quest; import forge.deck.CardArchetypeLDAGenerator; import forge.deck.io.Archetype; +import forge.game.GameFormat; import forge.model.FModel; import forge.quest.data.QuestPreferences; import forge.quest.data.QuestPreferences.DifficultyPrefs; @@ -42,9 +43,11 @@ public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface private List archetypes; private final MapOfLists sortedDuels = new EnumMapOfLists<>(QuestEventDifficulty.class, CollectionSuppliers.arrayLists()); + private GameFormat baseFormat; - public QuestEventLDADuelManager(){ - archetypes = CardArchetypeLDAGenerator.ldaArchetypes.get(FModel.getFormats().getStandard().getName()); + public QuestEventLDADuelManager(GameFormat baseFormat){ + this.baseFormat = baseFormat; + archetypes = CardArchetypeLDAGenerator.ldaArchetypes.get(baseFormat.getName()); assembleDuelDifficultyLists(); } @@ -58,7 +61,7 @@ public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface int i=0; for(Archetype archetype : archetypes){ - QuestEventLDADuel duel = new QuestEventLDADuel((archetype)); + QuestEventLDADuel duel = new QuestEventLDADuel(archetype,baseFormat); duel.setDescription("Randomly generated "+archetype.getName()+" archetype deck."); duel.setName(archetype.getName()); duel.setTitle(archetype.getName()); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index 4c77b0ec515..cc44ae603c7 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,6 +40,7 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; + public static final String MODERNWORLDNAME = "Random Modern"; public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -194,6 +195,12 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } + if (useName.equalsIgnoreCase(QuestWorld.MODERNWORLDNAME)){ + useFormat = new GameFormatQuest(QuestWorld.MODERNWORLDNAME, + FModel.getFormats().getModern().getAllowedSetCodes(), + FModel.getFormats().getModern().getBannedCardNames(),false); + } + if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), From 3df07861cf7ce0ab62c667ece999c0331687ae36 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Wed, 19 Jun 2019 06:49:57 +0100 Subject: [PATCH 48/64] Removed unused import --- forge-gui/src/main/java/forge/quest/QuestEventLDADuel.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/quest/QuestEventLDADuel.java b/forge-gui/src/main/java/forge/quest/QuestEventLDADuel.java index 9ebe9ca4e6c..c2efbb1da94 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventLDADuel.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventLDADuel.java @@ -21,7 +21,6 @@ package forge.quest; import forge.deck.DeckgenUtil; import forge.deck.io.Archetype; import forge.game.GameFormat; -import forge.model.FModel; /** *

From 9f71beae57aa72864f93d8061e8736572c478e29 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 14:52:25 +0800 Subject: [PATCH 49/64] Update forgescrible scripts by austinio7116 --- .../res/cardsfolder/upcoming/golos_tireless_pilgrim.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/growth_cycle.txt | 3 +++ forge-gui/res/cardsfolder/upcoming/infuriate.txt | 1 + forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt | 3 +++ .../res/cardsfolder/upcoming/kaalia_zenith_seeker.txt | 4 +++- forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt | 6 +++++- forge-gui/res/cardsfolder/upcoming/octoprophet.txt | 2 ++ .../res/cardsfolder/upcoming/overgrowth_elemental.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt | 5 ++++- forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt | 3 +++ 10 files changed, 39 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt b/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt index da3d3c1b0c5..537724e2fda 100644 --- a/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt +++ b/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt @@ -2,4 +2,10 @@ Name:Golos, Tireless Pilgrim ManaCost:5 Types:Legendary Artifact Creature Scout PT:3/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a land card, put that card onto the battlefield tapped, then shuffle your library. +SVar:TrigChange:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land | ChangeNum$ 1 | ShuffleNonMandatory$ True +A:AB$ Mill | Cost$ 2 W U B G G | Defined$ You | NumCards$ 3 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top three cards of your library. You may play them this turn without paying their mana costs. +SVar:DBEffect:DB$ Effect | StaticAbilities$ EffPlay | EffectOwner$ You | RememberObjects$ Remembered | ForgetOnMoved$ Exile | SubAbility$ DBCleanup +SVar:EffPlay:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play them this turn without paying their mana costs. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:When Golos, Tireless Pilgrim enters the battlefield, you may search your library for a land card, put that card onto the battlefield tapped, then shuffle your library.\n{2}{W}{U}{B}{R}{G}: Exile the top three cards of your library. You may play them this turn without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt b/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt index ccdc1993795..d4997237e57 100644 --- a/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt +++ b/forge-gui/res/cardsfolder/upcoming/growth_cycle.txt @@ -1,4 +1,7 @@ Name:Growth Cycle ManaCost:1 G Types:Instant +A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 3 | NumDef$ 3 | SubAbility$ DBPump | SpellDescription$ Target creature gets +3/+3 until end of turn. It gets an additional +2/+2 until end of turn for each card named Growth Cycle in your graveyard. +SVar:DBPump:DB$ Pump | Defined$ ParentTarget | NumAtt$ +X | NumDef$ +X | References$ X +SVar:X:Count$ValidGraveyard Card.namedGrowth Cycle/Times.2 Oracle:Target creature gets +3/+3 until end of turn. It gets an additional +2/+2 until end of turn for each card named Growth Cycle in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/infuriate.txt b/forge-gui/res/cardsfolder/upcoming/infuriate.txt index d14446bc20f..cc76de05bd5 100644 --- a/forge-gui/res/cardsfolder/upcoming/infuriate.txt +++ b/forge-gui/res/cardsfolder/upcoming/infuriate.txt @@ -1,4 +1,5 @@ Name:Infuriate ManaCost:R Types:Instant +A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +2 | SpellDescription$ Target creature gets +3/+2 until end of turn. Oracle:Target creature gets +3/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt b/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt index 5c80d969c56..2696a579c5d 100644 --- a/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt +++ b/forge-gui/res/cardsfolder/upcoming/ironroot_warlord.txt @@ -2,4 +2,7 @@ Name:Ironroot Warlord ManaCost:1 G W Types:Creature Treefolk Soldier PT:*/5 +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | Description$ CARDNAME's power is equal to the number of creatures you control. +SVar:X:Count$Valid Creature.YouCtrl +A:AB$ Token | Cost$ 3 G W | TokenAmount$ 1 | TokenScript$ w_1_1_soldier | TokenOwner$ You | LegacyImage$ w 1 1 soldier m20 | SpellDescription$ Create a 1/1 white Soldier creature token. Oracle:Ironroot Warlord's power is equal to the number of creatures you control.\n{3}{G}{W}: Create a 1/1 white Soldier creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt b/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt index 511c071f3fb..3754e2afc69 100644 --- a/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt +++ b/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt @@ -4,4 +4,6 @@ Types:Legendary Creature Human Cleric PT:3/3 K:Flying K:Vigilance -Oracle:Flying, vigilance\nWhen Kaalia, Zenith Seeker enters the battlefield, look at the top six cards of your library. You may reveal an Angel card, a Demon card, and/or a Dragon card from among them and put them into your hand. Put the rest on the bottom of your library in a random order. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top six cards of your library. You may review an Angel card, a Demon card, and/or a Dragon card from among them and put them into your hand. Put the rest on the bottom of your library in a random order. +SVar:TrigDig:DB$ Dig | DigNum$ 6 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Card.Angel,Card.Demon,Card.Dragon | RestRandomOrder$ True +Oracle:Flying, vigilance\nWhen Kaalia, Zenith Seeker enters the battlefield, look at the top six cards of your library. You may review an Angel card, a Demon card, and/or a Dragon card from among them and put them into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt b/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt index aafdbefdc4b..c92855307a2 100644 --- a/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt +++ b/forge-gui/res/cardsfolder/upcoming/kykar_winds_fury.txt @@ -1,6 +1,10 @@ Name:Kykar, Wind's Fury ManaCost:1 U R W Types:Legendary Creature Bird Wizard -K:Flying PT:3/3 +K:Flying +T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a noncreature spell, create a 1/1 white Spirit creature token with flying. +SVar:TrigToken:DB$ Token | LegacyImage$ w 1 1 spirit flying m20 | TokenAmount$ 1 | TokenScript$ w_1_1_spirit_flying | TokenOwner$ You +SVar:BuffedBy:Card.nonCreature+nonLand +A:AB$ Mana | Cost$ Sac<1/Spirit> | Produced$ R | SpellDescription$ Add {R}. Oracle:Flying\nWhenever you cast a noncreature spell, create a 1/1 white Spirit creature token with flying.\nSacrifice a Spirit: Add {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/octoprophet.txt b/forge-gui/res/cardsfolder/upcoming/octoprophet.txt index c0c73e6e32f..54388beb5da 100644 --- a/forge-gui/res/cardsfolder/upcoming/octoprophet.txt +++ b/forge-gui/res/cardsfolder/upcoming/octoprophet.txt @@ -2,4 +2,6 @@ Name:Octoprophet ManaCost:3 U Types:Creature Octopus PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) +SVar:TrigScry:DB$ Scry | ScryNum$ 2 Oracle:When Octoprophet enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt b/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt index d489743c826..e4f9bd656e7 100644 --- a/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt +++ b/forge-gui/res/cardsfolder/upcoming/overgrowth_elemental.txt @@ -2,4 +2,13 @@ Name:Overgrowth Elemental ManaCost:2 G Types:Creature Elemental PT:3/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPut | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on another target Elemental you control. +SVar:TrigPut:DB$ PutCounter | ValidTgts$ Elemental.Other+YouCtrl | TgtPrompt$ Select another target Elemental you control | CounterType$ P1P1 | CounterNum$ 1 +AI:RemoveDeck:Random +SVar:PlayMain1:TRUE +DeckHints:Type$Elemental +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature you control dies, you gain 1 life. If that creature was an Elemental, put a +1/+1 counter on CARDNAME. +SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionDefined$ TriggeredCardLKICopy | ConditionPresent$ Creature.Elemental +DeckHas:Ability$Counters Oracle:When Overgrowth Elemental enters the battlefield, put a +1/+1 counter on another target Elemental you control.\nWhenever another creature you control dies, you gain 1 life. If that creature was an Elemental, put a +1/+1 counter on Overgrowth Elemental. diff --git a/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt b/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt index e84728acca2..d7d56b4e0fb 100644 --- a/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt +++ b/forge-gui/res/cardsfolder/upcoming/silverback_shaman.txt @@ -1,6 +1,9 @@ Name:Silverback Shaman ManaCost:3 G G Types:Creature Ape Shaman -K:Trample PT:5/4 +K:Trample +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, draw a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ You +SVar:SacMe:1 Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it's attacking.)\nWhen Silverback Shaman dies, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt b/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt index 5e63a536e84..9ce30ccf4ce 100644 --- a/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt +++ b/forge-gui/res/cardsfolder/upcoming/starfield_mystic.txt @@ -2,4 +2,7 @@ Name:Starfield Mystic ManaCost:1 W Types:Creature Human Cleric PT:2/2 +S:Mode$ ReduceCost | ValidCard$ Enchantment | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Enchantment spells you cast cost {1} less to cast. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever an enchantment you control is put into a graveyard from the battlefield, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 Oracle:Enchantment spells you cast cost {1} less to cast.\nWhenever an enchantment you control is put into a graveyard from the battlefield, put a +1/+1 counter on Starfield Mystic. From 03ff6923fd2a506ea6cd1cfc3bd9068c88c14792 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 15:08:19 +0800 Subject: [PATCH 50/64] Add Chandras by AStrangerIsHere --- .../upcoming/chandra_acolyte_of_flame.txt | 13 +++++++++++-- .../upcoming/chandra_awakened_inferno.txt | 11 +++++++++-- .../upcoming/chandra_novice_pyromancer.txt | 7 +++++-- .../res/cardsfolder/upcoming/wakeroot_elemental.txt | 4 +++- .../res/cardsfolder/upcoming/yaroks_fenlurker.txt | 3 +++ 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt b/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt index e21a8eb4dbd..b277c7fda9b 100644 --- a/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt +++ b/forge-gui/res/cardsfolder/upcoming/chandra_acolyte_of_flame.txt @@ -1,5 +1,14 @@ Name:Chandra, Acolyte of Flame -ManaCost:1 R R Types:Legendary Planeswalker Chandra +ManaCost:1 R R Loyalty:4 -Oracle:[0]: Put a loyalty counter on each red planeswalker you control.\n[0]: Create two 1/1 red Elemental creature tokens. They gain haste. Sacrifice them at the beginning of the next end step.\n[-2]: You may cast target instant or sorcery card with converted mana cost 3 or less from your graveyard. If that card would be put into your graveyard this turn, exile it instead. +A:AB$ PutCounterAll | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | ValidCards$ Planeswalker.YouCtrl+Red | CounterType$ LOYALTY | CounterNum$ 1 | SpellDescription$ Put a loyalty counter on each red planeswalker you control. +A:AB$ Token | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | TokenAmount$ 2 | TokenScript$ r_1_1_elemental | TokenOwner$ You | LegacyImage$ r 1 1 elemental m20 | AtEOT$ Sacrifice | RememberTokens$ True | SubAbility$ DBPump | SpellDescription$ Create two 1/1 red Elemental creature tokens. They gain haste. Sacrifice them at the beginning of the next end step. +SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ Haste | Permanent$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ CastFromGraveThisTurn | ValidTgts$ Instant.YouCtrl+cmcLE3,Sorcery.YouCtrl+cmcLE3 | TgtZone$ Graveyard | TgtPrompt$ Select target instant or sorcery card with mana cost 3 or less | RememberObjects$ Targeted | StaticAbilities$ Play | ExileOnMoved$ Graveyard | SubAbility$ DBEffect | SpellDescription$ You may cast target instant or sorcery card with mana cost 3 or less from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead. +SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may play remembered card. +SVar:DBEffect:DB$ Effect | RememberObjects$ Targeted | ExileOnMoved$ Stack | ReplacementEffects$ ReplaceGraveyard | SVars$ MoveExile +SVar:ReplaceGraveyard:Event$ Moved | ValidCard$ Card.IsRemembered | Origin$ Stack | Destination$ Graveyard | ReplaceWith$ MoveExile | Description$ If that card would be put into your graveyard this turn, exile it instead. +SVar:MoveExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Stack | Destination$ Exile +Oracle:[0]: Put a loyalty counter on each red planeswalker you control.\n[0]: Create two 1/1 red Elemental creature tokens. They gain haste. Sacrifice them at the beginning of the next end step.\n:[-2]: You may cast target instant or sorcery with mana cost 3 or less card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt b/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt index c29c57e1f44..d11538fb734 100644 --- a/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt +++ b/forge-gui/res/cardsfolder/upcoming/chandra_awakened_inferno.txt @@ -1,5 +1,12 @@ Name:Chandra, Awakened Inferno -ManaCost:4 R R Types:Legendary Planeswalker Chandra +ManaCost:4 R R Loyalty:6 -Oracle:This spell can't be countered.\n[+2]: Each opponent gets an emblem with "At the beginning of your upkeep, this emblem deals 1 damage to you."\n[-3]: Chandra, Awakened Inferno deals 3 damage to each non-Elemental creature.\n[-X]: Chandra, Awakened Inferno deals X damage to target creature or planeswalker. If a permanent dealt damage this way would die this turn, exile it instead. +K:CARDNAME can't be countered. +A:AB$ Effect | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | EffectOwner$ Player.Opponent | Name$ Emblem - Chandra, Awakened Inferno | Triggers$ BOTTrig | SVars$ ChandraDmg | Duration$ Permanent | AILogic$ Always | SpellDescription$ Each opponent gets an emblem with "At the beginning of your upkeep, this emblem deals 1 damage to you." +SVar:BOTTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ ChandraDmg | TriggerDescription$ At the beginning of your upkeep, this emblem deals 1 damage to you. +SVar:ChandraDmg:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 1 +A:AB$ DamageAll | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidCards$ Creature.nonElemental | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to each non-Elemental creature. +A:AB$ DealDamage | Cost$ SubCounter | Planeswalker$ True | Ultimate$ True | ValidTgts$ Creature,Planeswalker | NumDmg$ ChosenX | References$ X | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals X damage to target creature or planeswalker. If a permanent dealt damage this way would die this turn, exile it instead. +SVar:X:XChoice +Oracle:This spell can't be countered.\n[+2]: Each opponent gets an emblem with "At the beginning of your upkeep, this emblem deals 1 damage to you."\n[-3]: Chandra, Awakened Inferno deals 3 damage to each non-Elemental creature.\n[-X]: Chandra, Awakened Inferno deals X damage to target creature or planeswalker. If a permanent dealt damage this way would die this turn, exile it instead. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt b/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt index 0c03e2eea0c..63124291ce1 100644 --- a/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt +++ b/forge-gui/res/cardsfolder/upcoming/chandra_novice_pyromancer.txt @@ -1,5 +1,8 @@ Name:Chandra, Novice Pyromancer -ManaCost:3 R Types:Legendary Planeswalker Chandra +ManaCost:3 R Loyalty:5 -Oracle:[+1]: Elementals you control get +2/+0 until end of turn.\n[-1]: Add {R}{R}.\n[-2]: Chandra, Novice Pyromancer deals 2 damage to any target. +A:AB$ PumpAll | Cost$ AddCounter<1/LOYALTY> | ValidCards$ Elemental.YouCtrl | NumAtt$ +2 | NumDef$ +0 | Planeswalker$ True | AILogic$ Always | SpellDescription$ Elementals you control get +2/+0 until end of turn. +A:AB$ Mana | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Produced$ R | Amount$ 2 | SubAbility$ DBEffect | SpellDescription$ Add {R}{R}. +A:AB$ DealDamage | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. +Oracle:[+1]: Elementals you control get +2/+0 until end of turn.\n[-1]: Add {R}{R}.\n[-2]: Chandra, Novice Pyromancer deals 2 damage to any target. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt b/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt index 9fc8c183daf..05d47297638 100644 --- a/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt +++ b/forge-gui/res/cardsfolder/upcoming/wakeroot_elemental.txt @@ -2,4 +2,6 @@ Name:Wakeroot Elemental ManaCost:4 G G Types:Creature Elemental PT:5/5 -Oracle:{G}{G}{G}{G}{G}: Untap a land of your choice that you control. It becomes a 5/5 Elemental creature with haste. It's still a land. (This effect lasts until as long as that land is in play.) +A:AB$ Uptap | Cost$ G G G G G | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | SubAbility$ DBAnimate | SpellDescription$ Untap target land you control. It becomes a 5/5 Elemental creature with haste. It's still a land. +SVar:DBAnimate:DB$ Animate | Power$ 5 | Toughness$ 5 | Types$ Creature,Elemental | Keywords$ Haste | Permanent$ True +Oracle:{G}{G}{G}{G}{G}: Untap target land you control. It becomes a 5/5 Elemental creature with haste. It's still a land. diff --git a/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt b/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt index e1d1cc88d41..66301011699 100644 --- a/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt +++ b/forge-gui/res/cardsfolder/upcoming/yaroks_fenlurker.txt @@ -2,4 +2,7 @@ Name:Yarok's Fenlurker ManaCost:B B Types:Creature Horror PT:1/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, each opponent exiles a card from their hand. +SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | DefinedPlayer$ Player.Opponent | Mandatory$ True | ChangeType$ Card | ChangeNum$ 1 | Hidden$ True | IsCurse$ True +A:AB$ Pump | Cost$ 2 B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Oracle:When Yarok's Fenlurker enters the battlefield, each opponent exiles a card from their hand.\n{2}{B}: Yarok's Fenlurker gets +1/+1 until end of turn. From 7aedbefcdf95f0d94797d4a5ea8253e32afcc77c Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 15:18:07 +0800 Subject: [PATCH 51/64] Fix a typo --- forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt b/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt index 537724e2fda..f814096988f 100644 --- a/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt +++ b/forge-gui/res/cardsfolder/upcoming/golos_tireless_pilgrim.txt @@ -4,7 +4,7 @@ Types:Legendary Artifact Creature Scout PT:3/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a land card, put that card onto the battlefield tapped, then shuffle your library. SVar:TrigChange:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land | ChangeNum$ 1 | ShuffleNonMandatory$ True -A:AB$ Mill | Cost$ 2 W U B G G | Defined$ You | NumCards$ 3 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top three cards of your library. You may play them this turn without paying their mana costs. +A:AB$ Mill | Cost$ 2 W U B R G | Defined$ You | NumCards$ 3 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top three cards of your library. You may play them this turn without paying their mana costs. SVar:DBEffect:DB$ Effect | StaticAbilities$ EffPlay | EffectOwner$ You | RememberObjects$ Remembered | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:EffPlay:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play them this turn without paying their mana costs. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True From da63da60c809e2ccdb1e298e2d5915386f278872 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 16:01:38 +0800 Subject: [PATCH 52/64] Update Blightbeetle --- forge-gui/res/cardsfolder/upcoming/blightbeetle.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt b/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt index f5202dd260e..7eba6725aca 100644 --- a/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt +++ b/forge-gui/res/cardsfolder/upcoming/blightbeetle.txt @@ -3,4 +3,6 @@ ManaCost:1 B Types:Creature Insect PT:1/1 K:Protection from green +S:Mode$ CantPutCounter | Affected$ Creature.OppCtrl | CounterType$ P1P1 | Description$ Creatures your opponents control can't have +1/+1 counters put on them. +SVar:PlayMain1:TRUE Oracle:Protection from green (This creature can't be blocked, targeted, dealt damage, enchanted, or equipped by anything green.)\nCreatures your opponents control can't have +1/+1 counters put on them. From 0f8c30a379ff54446e52723df97d3855cf50ace5 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 19 Jun 2019 16:33:21 +0800 Subject: [PATCH 53/64] Temporarily removed unimplemented cards for merge --- forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt | 5 ----- .../res/cardsfolder/upcoming/bacchetta_punitiva.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt | 4 ---- .../res/cardsfolder/upcoming/chinese_goblin_miner.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/dread_presence.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt | 8 -------- forge-gui/res/cardsfolder/upcoming/flame_sweep.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt | 5 ----- .../res/cardsfolder/upcoming/hanged_executioner.txt | 6 ------ forge-gui/res/cardsfolder/upcoming/infuriate.txt | 5 ----- .../res/cardsfolder/upcoming/kaalia_zenith_seeker.txt | 9 --------- forge-gui/res/cardsfolder/upcoming/legions_end.txt | 4 ---- .../res/cardsfolder/upcoming/loxodon_lifesinger.txt | 5 ----- .../res/cardsfolder/upcoming/reckless_airstrike.txt | 4 ---- .../res/cardsfolder/upcoming/repeated_reverberation.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/risen_reef.txt | 5 ----- forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/season_of_growth.txt | 4 ---- .../res/cardsfolder/upcoming/thought_distortion.txt | 4 ---- .../res/cardsfolder/upcoming/unchained_berserker.txt | 6 ------ forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt | 4 ---- forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt | 6 ------ forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt | 5 ----- 25 files changed, 124 deletions(-) delete mode 100644 forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/dread_presence.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/flame_sweep.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/infuriate.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/legions_end.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/risen_reef.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/season_of_growth.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/thought_distortion.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt delete mode 100644 forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt b/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt deleted file mode 100644 index 6d7dc19a072..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/angelic_cleric.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Angelic Cleric -ManaCost:W W -Types:Human Cleric -PT:1/4 -Oracle:Whenever an Angel enters the battlefield under your control, you gain 4 life.\nWhenever an Angel you control dies, create a 1/1 white Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt b/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt deleted file mode 100644 index f0cedb64706..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/bacchetta_punitiva.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Bacchetta Punitiva -ManaCost:3 -Types:Artifact -Oracle:{3}, {T}: Bacchetta Punitiva deals 1 damage to any target.\nWhen Bacchetta Punitiva is put into a graveyard from the battlefield, it deals 5 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt b/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt deleted file mode 100644 index 38ea2e00b90..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/barkhide_troll.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Barkhide Troll -ManaCost:G G -Types:Creature Troll -PT:2/2 -Oracle:Barkhide Troll enters the battlefield with a +1/+1 counter on it.\n{1}, Remove a +1/+1 counter from Barkhide Troll: Barkhide Troll gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt b/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt deleted file mode 100644 index 275713e50d9..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/captivating_gyre.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Captivating Gyre -ManaCost:4 U U -Types:Sorcery -Oracle:Return up to three target creatures to their owners' hands. diff --git a/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt b/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt deleted file mode 100644 index b386b0d8989..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/chinese_goblin_miner.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Chinese Goblin Miner -ManaCost:2 R -Types:Creature Goblin -PT:3/2 -Oracle:{3}, {T}, Sacrifice a land or artifact: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/dread_presence.txt b/forge-gui/res/cardsfolder/upcoming/dread_presence.txt deleted file mode 100644 index 0ccfcedaa02..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/dread_presence.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Dread Presence -ManaCost:3 B -Types:Creature Nightmare -PT:3/3 -Oracle:Whenever a Swamp enters the battlefield under your control, choose one--\n*You draw a card and you lose 1 life.\n*Dread Presence deals 2 damage to any target and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt b/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt deleted file mode 100644 index 441fc29a7dd..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/empyrean_eagle.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Empyrean Eagle -ManaCost:1 W U -Types:Creature Bird Spirit -PT:2/3 -K:Flying -S:Mode$ Continuous | Affected$ Creature.withFlying+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other creatures you control with flying get +1/+1. -SVar:PlayMain1:TRUE -Oracle:Flying\nOther creatures you control with flying get +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt b/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt deleted file mode 100644 index 29b66bef38c..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/flame_sweep.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Flame Sweep -ManaCost:2 R -Types:Instant -Oracle:Flame Sweep deals 2 damage to each creature except for creatures you control with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt b/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt deleted file mode 100644 index cd78c2928e0..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/flood_of_tears.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Flood of Tears -ManaCost:4 U U -Types:Sorcery -Oracle:Return all nonland permanents to their owners' hands. If you return four or more nontoken permanents you control this way, you may put a permanent card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt b/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt deleted file mode 100644 index 6b316fabae9..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/goblin_hitchhiker.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Goblin Hitchhiker -ManaCost:1 R -Types:Creature Goblin -PT:2/1 -Oracle:{R}: Goblin Hitchhiker gains flying until end of turn. Activate this ability only if you control a creature with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt b/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt deleted file mode 100644 index a97e3721abf..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/hanged_executioner.txt +++ /dev/null @@ -1,6 +0,0 @@ -Name:Hanged Executioner -ManaCost:2 W -Types:Creature Spirit -K:Flying -PT:1/1 -Oracle:Flying\nWhen Hanged Executioner enters the battlefield, create a 1/1 white Spirit creature token with flying.\n{3}{W}, Exile Hanged Executioner: Exile target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/infuriate.txt b/forge-gui/res/cardsfolder/upcoming/infuriate.txt deleted file mode 100644 index cc76de05bd5..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/infuriate.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Infuriate -ManaCost:R -Types:Instant -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +2 | SpellDescription$ Target creature gets +3/+2 until end of turn. -Oracle:Target creature gets +3/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt b/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt deleted file mode 100644 index 3754e2afc69..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/kaalia_zenith_seeker.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Kaalia, Zenith Seeker -ManaCost:R W B -Types:Legendary Creature Human Cleric -PT:3/3 -K:Flying -K:Vigilance -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top six cards of your library. You may review an Angel card, a Demon card, and/or a Dragon card from among them and put them into your hand. Put the rest on the bottom of your library in a random order. -SVar:TrigDig:DB$ Dig | DigNum$ 6 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Card.Angel,Card.Demon,Card.Dragon | RestRandomOrder$ True -Oracle:Flying, vigilance\nWhen Kaalia, Zenith Seeker enters the battlefield, look at the top six cards of your library. You may review an Angel card, a Demon card, and/or a Dragon card from among them and put them into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/legions_end.txt b/forge-gui/res/cardsfolder/upcoming/legions_end.txt deleted file mode 100644 index 05ea90f780a..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/legions_end.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Legion's End -ManaCost:1 B -Types:Sorcery -Oracle:Exile target creature an opponent controls with converted mana cost 2 or less and all other creatures that player controls with the same name as that creature. Then that player reveals their hand and exiles all cards with that name from their hand and graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt b/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt deleted file mode 100644 index 147702c49a6..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/loxodon_lifesinger.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Loxodon Lifesinger -ManaCost:5 W -Types:Creature Elephant Cleric -PT:4/6 -Oracle:When Loxodon Lifesinger enters the battlefield, you may have your life total become the total toughness of creatures you control.\n{5}{W}: Loxodon Lifesinger gets +X/+X until end of turn, where X is your life total. diff --git a/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt b/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt deleted file mode 100644 index 57f1ec86f04..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/reckless_airstrike.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Reckless Airstrike -ManaCost:R -Types:Sorcery -Oracle:Choose one--\n*Reckless Airstrike deals 3 damage to target creature with flying.\n*Destroy target artifact. diff --git a/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt b/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt deleted file mode 100644 index 4a13d3291af..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/repeated_reverberation.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Repeated Reverberation -ManaCost:2 R R -Types:Instant -Oracle:When you next cast an instant spell, cast a sorcery spell, or activate a loyalty ability this turn, copy that spell or ability twice. You may choose new targets for the copies. diff --git a/forge-gui/res/cardsfolder/upcoming/risen_reef.txt b/forge-gui/res/cardsfolder/upcoming/risen_reef.txt deleted file mode 100644 index c54a98fad26..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/risen_reef.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Risen Reef -ManaCost:1 G U -Types:Creature Elemental -PT:1/1 -Oracle:Whenever Risen Reef or another Elemental enters the battlefield under your control, look at the top card of your library. If it's a land card, you may put it onto the battlefield tapped. If you don't put the card onto the battlefield, put it into your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt b/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt deleted file mode 100644 index 93894ce396d..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/scheming_symmetry.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Scheming Symmetry -ManaCost:B -Types:Sorcery -Oracle:Choose two target players. Each of them searches their library for a card, then shuffles their library and puts that card on top of it. diff --git a/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt b/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt deleted file mode 100644 index dddb6ffe5cd..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/season_of_growth.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Season of Growth -ManaCost:1 G -Types:Enchantment -Oracle:Whenever a creature enters the battlefield under your control, scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.)\nWhenever you cast a spell that targets a creature you control, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt b/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt deleted file mode 100644 index 7cc3323155c..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/thought_distortion.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Thought Distortion -ManaCost:4 B B -Types:Sorcery -Oracle:This spell can't be countered.\nTarget opponent reveals their hand. Exile all noncreature, nonland cards from that player's hand and graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt b/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt deleted file mode 100644 index 9783fb5099e..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/unchained_berserker.txt +++ /dev/null @@ -1,6 +0,0 @@ -Name:Unchained Berserker -ManaCost:1 R -Types:Creature Human Berserker -K:Protection from white -PT:1/1 -Oracle:Protection from white (This creature can't be blocked, targeted, dealt damage, enchanted, or equipped by anything white.)\nUnchained Berserker gets +2/+0 as long as it's attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt b/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt deleted file mode 100644 index 5020241d005..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/veil_of_summer.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Veil of Summer -ManaCost:G -Types:Instant -Oracle:Draw a card if an opponent has cast a blue or black spell this turn. Spells you control can't be countered this turn. You and permanents you control gain hexproof from blue and from black until end of turn. (You and they can't be the targets of blue or black spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt b/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt deleted file mode 100644 index 74f6f82b832..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/voracious_hydra.txt +++ /dev/null @@ -1,6 +0,0 @@ -Name:Voracious Hydra -ManaCost:X G G -Types:Creature Hydra -PT:0/1 -K:Trample -Oracle:Trample\nVoracious Hydra enters the battlefield with X +1/+1 counters.\nWhen Voracious Hydra enters the battlefield, choose one--\n*Double the number of +1/+1 counters on Voracious Hydra.\n*You may have Voracious Hydra fight with target creature you don't control. diff --git a/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt b/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt deleted file mode 100644 index e9c8e038a65..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/wolfriders_saddle.txt +++ /dev/null @@ -1,5 +0,0 @@ -Name:Wolfrider's Saddle -ManaCost:3 G -Types:Artifact Equipment -K:Equip:3 -Oracle:When Wolfrider's Saddle enters the battlefield, create a 2/2 green Wolf creature token, then attach Wolfrider's Saddle to it.\nEquipped creature gets +1/+1 and can't be blocked by more than one creature.\nEquip{3} ({3}: Attach to target creature you control. Equip only as a sorcery.) From 17f1a9ed8b6f10fe1a1851c0d727eebb5c99e8ba Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 19 Jun 2019 19:32:04 +0300 Subject: [PATCH 54/64] - Fix Angrath's Rampage description. --- forge-gui/res/cardsfolder/a/angraths_rampage.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/angraths_rampage.txt b/forge-gui/res/cardsfolder/a/angraths_rampage.txt index 7560309aa52..9e47e3d9be9 100644 --- a/forge-gui/res/cardsfolder/a/angraths_rampage.txt +++ b/forge-gui/res/cardsfolder/a/angraths_rampage.txt @@ -3,6 +3,6 @@ ManaCost:B R Types:Sorcery A:SP$ Charm | Cost$ B R | Choices$ SacArtifact,SacCreature,SacPW SVar:SacArtifact:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Artifact | Amount$ 1 | SpellDescription$ Target player sacrifices an artifact. -SVar:SacCreature:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature | Amount$ 1 | SpellDescription$ Target player sacrifices an creature. -SVar:SacPW:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Planeswalker | Amount$ 1 | SpellDescription$ Target player sacrifices an planeswalker. +SVar:SacCreature:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature | Amount$ 1 | SpellDescription$ Target player sacrifices a creature. +SVar:SacPW:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Planeswalker | Amount$ 1 | SpellDescription$ Target player sacrifices a planeswalker. Oracle:Choose one —\n• Target player sacrifices an artifact.\n• Target player sacrifices a creature.\n• Target player sacrifices a planeswalker. From 4a9a763b40d93a0b2cbe7443d74e91655cbba96a Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Wed, 19 Jun 2019 19:52:08 +0100 Subject: [PATCH 55/64] Improved land counts in deck generation to use linear regression to generate land requirements from average CMC - also increased variance of CMC ratios and reduced land count requirements if filtered decks enabled --- .../forge/limited/CardThemedDeckBuilder.java | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java index c4ee7b701d4..769e7a34801 100644 --- a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java @@ -19,6 +19,7 @@ import forge.game.GameFormat; import forge.item.IPaperCard; import forge.item.PaperCard; import forge.model.FModel; +import forge.properties.ForgePreferences; import forge.util.MyRandom; import java.util.*; @@ -206,22 +207,27 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { // 5. If there are still on-color cards, and the average cmc is low, add // extras. double avCMC = getAverageCMC(deckList); - int maxCMC = getMaxCMC(deckList); - if (avCMC < 4) { - addLowCMCCard(); - if (targetSize > 60) { - addLowCMCCard(); - } - } - if (avCMC < 3 && maxCMC < 6) { - addLowCMCCard(); - } - if (avCMC < 2.5 && maxCMC < 5) { - addLowCMCCard(); - if (targetSize > 60) { + //calculated required lands based on https://www.channelfireball.com/articles/how-many-lands-do-you-need-to-consistently-hit-your-land-drops/ + float baseLandParameter = 16f; + //reduce landcount if filtered hands enabled + if(FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.FILTERED_HANDS)){ + baseLandParameter--; + } + landsNeeded = new Double((baseLandParameter + 3.14f * avCMC) * targetSize/60f).intValue(); + if (logToConsole) { + System.out.println("Required lands from linear regression : " + avCMC + " cmc, needed: " + landsNeeded); + } + numSpellsNeeded = targetSize-landsNeeded; + int extraCardsToAdd = numSpellsNeeded - deckList.size(); + if (logToConsole) { + System.out.println("Extra cards to add : " + extraCardsToAdd); + } + if(extraCardsToAdd>0){ + for(int i=0; i 0) addCards(onColorCreaturesAndSpells, stillNeeds); stillNeeds = numSpellsNeeded - deckList.size(); @@ -274,12 +283,13 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } } - + if (logToConsole) { + System.out.println("Lands needed : " + landsNeeded); + } if (landsNeeded > 0) { addLands(clrCnts); } if (logToConsole) { - System.out.println("Lands needed : " + landsNeeded); System.out.println("Post Lands : " + deckList.size()); } addWastesIfRequired(); @@ -345,8 +355,8 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { protected void generateTargetCMCs(){ targetCMCs = new HashMap<>(); - targetCMCs.put(1,Math.round((MyRandom.getRandom().nextInt(12)+4)*targetSize/60));//10 - targetCMCs.put(2,Math.round((MyRandom.getRandom().nextInt(16)+8)*targetSize/60));//16 + targetCMCs.put(1,Math.round((MyRandom.getRandom().nextInt(16)+2)*targetSize/60));//10 + targetCMCs.put(2,Math.round((MyRandom.getRandom().nextInt(20)+6)*targetSize/60));//16 targetCMCs.put(3,Math.round((MyRandom.getRandom().nextInt(10)+8)*targetSize/60));//13 targetCMCs.put(4,Math.round((MyRandom.getRandom().nextInt(8)+6)*targetSize/60));//8 targetCMCs.put(5,Math.round((MyRandom.getRandom().nextInt(8)+6)*targetSize/60));//7 @@ -488,7 +498,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { aiPlayables.remove(card); rankedColorList.remove(card); - landsNeeded--; + //landsNeeded--; if (logToConsole) { System.out.println("Low CMC: " + card.getName()); } @@ -681,7 +691,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { float p = (float) clrCnts[i] / (float) totalColor; int nLand = Math.round(landsNeeded * p); // desired truncation to int if (logToConsole) { - System.out.printf("Basics[%s]: %d/%d = %f%% = %d cards%n", MagicColor.Constant.BASIC_LANDS.get(i), clrCnts[i], totalColor, 100*p, nLand); + System.out.printf("Basics[%s]: %d/%d = %f%% = %d cards%n", MagicColor.Constant.BASIC_LANDS.get(i), clrCnts[i], totalColor, 100*p, nLand + 1); } PaperCard snowLand = null; From 416eb02da4d5805c72f7e18b7b8d3c192c98a26a Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 19 Jun 2019 21:58:52 +0300 Subject: [PATCH 56/64] - Fix en-US localization for lblCard --- forge-gui/res/languages/en-US.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index e88eebc9dd2..04f38684d60 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -796,7 +796,7 @@ lblSaveDeck=Save Deck lblSaveDeckAs=Save Deck As lblPrinttoHTMLfile=Print to HTML file #PaperCard.java -lblCard=Carta +lblCard=Card #CardManager.java lblFormat=Format lblFormats=Formats From 69d1e0f2b94ec5ebd70d3e57c3c220467f95dabe Mon Sep 17 00:00:00 2001 From: Michael D Date: Thu, 20 Jun 2019 08:50:59 +0000 Subject: [PATCH 57/64] Update Hypercube to intended drafting format. --- forge-gui/res/draft/Hypercube (383 cards).draft | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/draft/Hypercube (383 cards).draft b/forge-gui/res/draft/Hypercube (383 cards).draft index d59e912ed4b..7594314669e 100644 --- a/forge-gui/res/draft/Hypercube (383 cards).draft +++ b/forge-gui/res/draft/Hypercube (383 cards).draft @@ -2,5 +2,5 @@ Name:Hypercube (383 cards) DeckFile:Hypercube (383 cards) Singleton:True -Booster: 15 Any -NumPacks: 3 +Booster: 12 Any +NumPacks: 4 From e8ceda3a129d48a938a8e7129e8d7fb27baee0e9 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 20 Jun 2019 19:30:36 +0300 Subject: [PATCH 58/64] - Fix an issue with the theme deck generator hanging on certain decks (-1 -1 BG Counters, Lands WRG) --- forge-gui/res/quest/themes/Lands WRG.thm | 5 +---- .../src/main/java/forge/deck/DeckGeneratorTheme.java | 11 +++++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/forge-gui/res/quest/themes/Lands WRG.thm b/forge-gui/res/quest/themes/Lands WRG.thm index 74f07df2452..e0a667844f6 100644 --- a/forge-gui/res/quest/themes/Lands WRG.thm +++ b/forge-gui/res/quest/themes/Lands WRG.thm @@ -15,13 +15,10 @@ Treetop Village Dryad Arbor [/Group] -[Group MaxCnt=2 Percentage=5] +[Group MaxCnt=4 Percentage=5] Kabira Crossroads Karakas The Tabernacle at Pendrell Vale -The Tabernacle at Pendrell Vale -The Tabernacle at Pendrell Vale -The Tabernacle at Pendrell Vale [/Group] [Group MaxCnt=4 Percentage=10] diff --git a/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java b/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java index f58b986ac60..281425fd157 100644 --- a/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java +++ b/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java @@ -131,16 +131,15 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { ss = s.split("\\|"); int lc = 0; - while ((cardCounts.get(ss[0]) >= g.maxCnt) || (lc > 999)) { + while ((cardCounts.get(ss[0]) >= g.maxCnt)) { // looping // forever s = g.cardnames.get(MyRandom.getRandom().nextInt(cnSize)); ss = s.split("\\|"); - lc++; - } - if (lc > 999) { - throw new RuntimeException("ThemeDeckGenerator : getThemeDeck -- looped too much -- filename is " - + tFileName); + if (lc > 999) { + throw new RuntimeException("ThemeDeckGenerator : getThemeDeck -- looped too much -- filename is " + + tFileName); + } } final int n = cardCounts.get(ss[0]); From a686573ea7c0b8b7ba1e172b3f9dc9a2c5f60d19 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 20 Jun 2019 19:33:42 +0300 Subject: [PATCH 59/64] - One of the changes in Lands WRG unneeded --- forge-gui/res/quest/themes/Lands WRG.thm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/res/quest/themes/Lands WRG.thm b/forge-gui/res/quest/themes/Lands WRG.thm index e0a667844f6..6af7344d22e 100644 --- a/forge-gui/res/quest/themes/Lands WRG.thm +++ b/forge-gui/res/quest/themes/Lands WRG.thm @@ -19,6 +19,9 @@ Dryad Arbor Kabira Crossroads Karakas The Tabernacle at Pendrell Vale +The Tabernacle at Pendrell Vale +The Tabernacle at Pendrell Vale +The Tabernacle at Pendrell Vale [/Group] [Group MaxCnt=4 Percentage=10] From 12e3dd21980db7e5452e4a0c920fc6ab4d2213bf Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 21 Jun 2019 18:55:57 +0300 Subject: [PATCH 60/64] - Improve the AI for combat pumps when it comes to timing the activation. --- forge-ai/src/main/java/forge/ai/ability/PumpAi.java | 3 ++- forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index b0a1a054e59..47aeb602b13 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -113,7 +113,8 @@ public class PumpAi extends PumpAiBase { return false; } } - if (game.getStack().isEmpty() && ph.getPhase().isBefore(PhaseType.COMBAT_BEGIN)) { + if (game.getStack().isEmpty() && (ph.getPhase().isBefore(PhaseType.COMBAT_BEGIN) + || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS))) { // Instant-speed pumps should not be cast outside of combat when the // stack is empty if (!sa.isCurse() && !SpellAbilityAi.isSorcerySpeed(sa) && !main1Preferred) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index e4567af164f..3ccc5b81605 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -460,6 +460,10 @@ public abstract class PumpAiBase extends SpellAbilityAi { if (combat == null || !(combat.isBlocking(card) || combat.isBlocked(card))) { return false; } + } else if (keyword.equals("Menace")) { + if (combat == null || !combat.isAttacking(card)) { + return false; + } } return true; } From 3ef5e82c468f3d024bcfb5aad9a0c9031b05ff20 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 21 Jun 2019 20:49:30 +0300 Subject: [PATCH 61/64] - Somewhat improve the AI for combat pumps coming from permanents --- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index bab3509cb5c..858ceb8fb22 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1457,6 +1457,10 @@ public class ComputerUtilCard { } if (totalPowerUnblocked >= opp.getLife()) { return true; + } else if (totalPowerUnblocked > dmg && sa.getHostCard() != null && sa.getHostCard().isInPlay()) { + if (sa.getPayCosts() != null && sa.getPayCosts().hasNoManaCost()) { + return true; // always activate abilities which cost no mana and which can increase unblocked damage + } } } float value = 1.0f * (pumpedDmg - dmg); From ebde3de7d8591e86cbeeed6005644f40b70b52bc Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 22 Jun 2019 08:09:48 +0300 Subject: [PATCH 62/64] - Added a couple AI hints --- forge-gui/res/cardsfolder/f/find_finality.txt | 1 + forge-gui/res/cardsfolder/w/wildgrowth_walker.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/forge-gui/res/cardsfolder/f/find_finality.txt b/forge-gui/res/cardsfolder/f/find_finality.txt index 2b85d2313fd..f8e64e222c4 100644 --- a/forge-gui/res/cardsfolder/f/find_finality.txt +++ b/forge-gui/res/cardsfolder/f/find_finality.txt @@ -15,4 +15,5 @@ SVar:DBPutCounter:DB$ PutCounter | Defined$ ChosenCard | CounterType$ P1P1 | Cou SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True DeckHas:Ability$Counters +SVar:SplitNeedsToPlay:Creature.YouCtrl+toughnessGE3 Oracle:You may put two +1/+1 counters on a creature you control. Then all creatures get -4/-4 until end of turn. diff --git a/forge-gui/res/cardsfolder/w/wildgrowth_walker.txt b/forge-gui/res/cardsfolder/w/wildgrowth_walker.txt index f19485090de..ae8937fde4e 100644 --- a/forge-gui/res/cardsfolder/w/wildgrowth_walker.txt +++ b/forge-gui/res/cardsfolder/w/wildgrowth_walker.txt @@ -6,4 +6,5 @@ T:Mode$ Explores | Execute$ DBPutCounter | ValidCard$ Creature.YouCtrl | Trigger SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterNum$ 1 | CounterType$ P1P1 | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 SVar:Picture:http://www.wizards.com/global/images/magic/general/wildgrowth_walker.jpg +SVar:AIPriorityModifier:1 Oracle:Whenever a creature you control explores, put a +1/+1 counter on Wildgrowth Walker and you gain 3 life. From f5c553c51ed5429ade9977d8b4d86a2ca6ca4b55 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 22 Jun 2019 08:22:14 +0300 Subject: [PATCH 63/64] - Most likely not the best idea in case the AI wants to just sweep the board --- forge-gui/res/cardsfolder/f/find_finality.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/f/find_finality.txt b/forge-gui/res/cardsfolder/f/find_finality.txt index f8e64e222c4..2b85d2313fd 100644 --- a/forge-gui/res/cardsfolder/f/find_finality.txt +++ b/forge-gui/res/cardsfolder/f/find_finality.txt @@ -15,5 +15,4 @@ SVar:DBPutCounter:DB$ PutCounter | Defined$ ChosenCard | CounterType$ P1P1 | Cou SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True DeckHas:Ability$Counters -SVar:SplitNeedsToPlay:Creature.YouCtrl+toughnessGE3 Oracle:You may put two +1/+1 counters on a creature you control. Then all creatures get -4/-4 until end of turn. From bc4c5bed1caaa0336db5aee3ed4852cefe175dc5 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 22 Jun 2019 10:22:37 +0000 Subject: [PATCH 64/64] Player: fix monarch and blessing --- forge-game/src/main/java/forge/game/player/Player.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index bfc182abb7c..8e6caf75d02 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2815,7 +2815,7 @@ public class Player extends GameEntity implements Comparable { public void createMonarchEffect() { final PlayerZone com = getZone(ZoneType.Command); if (monarchEffect == null) { - monarchEffect = new Card(-1, game); + monarchEffect = new Card(game.nextCardId(), null, false, game); monarchEffect.setOwner(this); monarchEffect.setImageKey("t:monarch"); monarchEffect.setName("The Monarch"); @@ -2869,7 +2869,7 @@ public class Player extends GameEntity implements Comparable { final PlayerZone com = getZone(ZoneType.Command); if(bless) { - blessingEffect = new Card(-1, game); + blessingEffect = new Card(game.nextCardId(), null, false, game); blessingEffect.setOwner(this); blessingEffect.setImageKey("t:blessing"); blessingEffect.setName("City's Blessing");