From 6dc8d7648afe4337f27a0953debd47c527d72a8c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Dec 2019 18:41:36 -0500 Subject: [PATCH 01/54] Fixing "you may search your library and/or your graveyard" cards so your library isn't auto-searched (and shuffled) --- forge-gui/res/cardsfolder/a/ajanis_aid.txt | 2 +- forge-gui/res/cardsfolder/a/angraths_fury.txt | 2 +- forge-gui/res/cardsfolder/c/chandras_flame_wave.txt | 2 +- forge-gui/res/cardsfolder/c/chandras_outburst.txt | 2 +- forge-gui/res/cardsfolder/d/domris_nodorog.txt | 2 +- forge-gui/res/cardsfolder/d/dovins_dismissal.txt | 2 +- forge-gui/res/cardsfolder/e/ethereal_elk.txt | 2 +- forge-gui/res/cardsfolder/g/gideons_battle_cry.txt | 2 +- forge-gui/res/cardsfolder/g/gideons_resolve.txt | 2 +- forge-gui/res/cardsfolder/g/goldmane_griffin.txt | 2 +- forge-gui/res/cardsfolder/g/grasping_current.txt | 2 +- forge-gui/res/cardsfolder/j/jaces_ruse.txt | 2 +- forge-gui/res/cardsfolder/l/liberating_combustion.txt | 2 +- forge-gui/res/cardsfolder/l/lilianas_influence.txt | 2 +- forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt | 2 +- forge-gui/res/cardsfolder/o/okos_hospitality.txt | 2 +- forge-gui/res/cardsfolder/r/rals_dispersal.txt | 2 +- forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt | 2 +- forge-gui/res/cardsfolder/r/rowans_stalwarts.txt | 2 +- forge-gui/res/cardsfolder/s/sorins_guide.txt | 2 +- forge-gui/res/cardsfolder/s/sun_blessed_mount.txt | 2 +- forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt | 2 +- forge-gui/res/cardsfolder/v/visage_of_bolas.txt | 2 +- forge-gui/res/cardsfolder/v/vraskas_scorn.txt | 2 +- forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt | 2 +- forge-gui/res/cardsfolder/y/yanlings_harbinger.txt | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/ajanis_aid.txt b/forge-gui/res/cardsfolder/a/ajanis_aid.txt index 4aebeaab1a2..83422cc69d9 100644 --- a/forge-gui/res/cardsfolder/a/ajanis_aid.txt +++ b/forge-gui/res/cardsfolder/a/ajanis_aid.txt @@ -2,7 +2,7 @@ Name:Ajani's Aid ManaCost:2 G W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Valiant Protector, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedAjani; Valiant Protector | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedAjani; Valiant Protector | ChangeNum$ 1 | Optional$ True A:AB$ ChooseCard | Cost$ Sac<1/CARDNAME> | Choices$ Creature | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SVars$ DBEffect | RememberChosen$ True | SpellDescription$ Prevent all combat damage a creature of your choice would deal this turn. SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | RememberObjects$ Remembered | SVars$ RPreventNextFromSource | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 SVar:RPreventNextFromSource:Event$ DamageDone | CombatDamage$ True | ValidSource$ Card.IsRemembered | Prevent$ True | PreventionEffect$ True | Description$ Prevent all combat damage a creature of your choice would deal this turn. diff --git a/forge-gui/res/cardsfolder/a/angraths_fury.txt b/forge-gui/res/cardsfolder/a/angraths_fury.txt index 54c273e75fc..32b96159103 100644 --- a/forge-gui/res/cardsfolder/a/angraths_fury.txt +++ b/forge-gui/res/cardsfolder/a/angraths_fury.txt @@ -3,7 +3,7 @@ ManaCost:3 B R Types:Sorcery A:SP$ Destroy | Cost$ 3 B R | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBDealDamage | SpellDescription$ Destroy target creature. CARDNAME deals 3 damage to target player or planeswalker. You may search your library and/or graveyard for a card named Angrath, Minotaur Pirate, reveal it, and put it into your hand. If you search your library this way, shuffle it. SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 3 | SubAbility$ DBSearch -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedAngrath; Minotaur Pirate | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedAngrath; Minotaur Pirate | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Angrath, Minotaur Pirate SVar:Picture:http://www.wizards.com/global/images/magic/general/angraths_fury.jpg Oracle:Destroy target creature. Angrath's Fury deals 3 damage to target player or planeswalker. You may search your library and/or graveyard for a card named Angrath, Minotaur Pirate, reveal it, and put it into your hand. If you search your library this way, shuffle it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt b/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt index a1cb566e033..f71d13056ea 100644 --- a/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt +++ b/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt @@ -2,6 +2,6 @@ Name:Chandra's Flame Wave ManaCost:3 R R Types:Sorcery A:SP$ DamageAll | Cost$ 3 R R | ValidTgts$ Player | NumDmg$ 2 | ValidPlayers$ Targeted | ValidCards$ Creature.TargetedPlayerCtrl | ValidDescription$ target player and each creature that player controls. | SubAbility$ DBSearch | SpellDescription$ CARDNAME deals 2 damage to target player and each creature that player controls. Search your library and/or graveyard for a card named Chandra, Flame's Fury, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedChandra; Flame's Fury | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedChandra; Flame's Fury | ChangeNum$ 1 | Optional$ True DeckHints:Name$Chandra, Flame's Fury Oracle:Chandra's Flame Wave deals 2 damage to target player and each creature that player controls. Search your library and/or graveyard for a card named Chandra, Flame's Fury, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/c/chandras_outburst.txt b/forge-gui/res/cardsfolder/c/chandras_outburst.txt index 1f41bcb20f3..271a88857c9 100644 --- a/forge-gui/res/cardsfolder/c/chandras_outburst.txt +++ b/forge-gui/res/cardsfolder/c/chandras_outburst.txt @@ -2,6 +2,6 @@ Name:Chandra's Outburst ManaCost:3 R R Types:Sorcery A:SP$ DealDamage | Cost$ 3 R R | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 4 | SubAbility$ DBSearch | SpellDescription$ CARDNAME deals 4 damage to target player or planeswalker. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedChandra; Bold Pyromancer | ChangeNum$ 1 +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedChandra; Bold Pyromancer | ChangeNum$ 1 DeckNeeds:Name$Chandra, Bold Pyromancer Oracle:Chandra's Outburst deals 4 damage to target player or planeswalker.\nSearch your library and/or graveyard for a card named Chandra, Bold Pyromancer, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/d/domris_nodorog.txt b/forge-gui/res/cardsfolder/d/domris_nodorog.txt index 63564138bf9..2436b124fab 100644 --- a/forge-gui/res/cardsfolder/d/domris_nodorog.txt +++ b/forge-gui/res/cardsfolder/d/domris_nodorog.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:5/2 K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDomri; City Smasher | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedDomri; City Smasher | ChangeNum$ 1 | Optional$ True DeckHints:Name$Domri, City Smasher Oracle:Trample\nWhen Domri's Nodorog enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/d/dovins_dismissal.txt b/forge-gui/res/cardsfolder/d/dovins_dismissal.txt index 4ad9b8a5e86..aa84261ae5e 100644 --- a/forge-gui/res/cardsfolder/d/dovins_dismissal.txt +++ b/forge-gui/res/cardsfolder/d/dovins_dismissal.txt @@ -2,6 +2,6 @@ Name:Dovin's Dismissal ManaCost:2 W U Types:Instant A:SP$ ChangeZone | Cost$ 2 W U | ValidTgts$ Creature.tapped | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target tapped creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SubAbility$ DBSearch | SpellDescription$ Put up to one target tapped creature on top of its owner's library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDovin; Architect of Law | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedDovin; Architect of Law | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Dovin, Architect of Law Oracle:Put up to one target tapped creature on top of its owner's library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/e/ethereal_elk.txt b/forge-gui/res/cardsfolder/e/ethereal_elk.txt index 5796059969b..028212a92be 100644 --- a/forge-gui/res/cardsfolder/e/ethereal_elk.txt +++ b/forge-gui/res/cardsfolder/e/ethereal_elk.txt @@ -4,6 +4,6 @@ Types:Creature Elk Spirit PT:3/3 K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Vivien, Nature's Avenger, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedVivien; Nature's Avenger | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedVivien; Nature's Avenger | ChangeNum$ 1 | Optional$ True DeckHints:Name$Vivien, Nature's Avenger Oracle:Trample\nWhen Ethereal Elk enters the battlefield, you may search your library and/or graveyard for a card named Vivien, Nature's Avenger, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt b/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt index 3b8fd338e99..d22c7e0ab6f 100644 --- a/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt +++ b/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt @@ -2,7 +2,7 @@ Name:Gideon's Battle Cry ManaCost:2 W W Types:Sorcery A:SP$ PutCounterAll | Cost$ 2 W W | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBSearch | SpellDescription$ Put a +1/+1 counter on each creature you control. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedGideon; the Oathsworn | ChangeNum$ 1 +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedGideon; the Oathsworn | ChangeNum$ 1 | Optional$ True DeckHas:Ability$Counters DeckHints:Name$Gideon, the Oathsworn Oracle:Put a +1/+1 counter on each creature you control. You may search your library and/or graveyard for a card named Gideon, the Oathsworn, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/g/gideons_resolve.txt b/forge-gui/res/cardsfolder/g/gideons_resolve.txt index 1ecc2aada69..0bfb6e097d0 100644 --- a/forge-gui/res/cardsfolder/g/gideons_resolve.txt +++ b/forge-gui/res/cardsfolder/g/gideons_resolve.txt @@ -2,7 +2,7 @@ Name:Gideon's Resolve ManaCost:4 W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Gideon, Martial Paragon, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedGideon; Martial Paragon | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedGideon; Martial Paragon | ChangeNum$ 1 | Optional$ True S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures you control get +1/+1. SVar:PlayMain1:TRUE DeckHints:Name$Gideon, Martial Paragon diff --git a/forge-gui/res/cardsfolder/g/goldmane_griffin.txt b/forge-gui/res/cardsfolder/g/goldmane_griffin.txt index 1eae39450c9..6d735cfb5fb 100644 --- a/forge-gui/res/cardsfolder/g/goldmane_griffin.txt +++ b/forge-gui/res/cardsfolder/g/goldmane_griffin.txt @@ -5,6 +5,6 @@ PT:3/2 K:Flying K:Vigilance T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Valiant it, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedAjani; Inspiring Leader | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedAjani; Inspiring Leader | ChangeNum$ 1 | Optional$ True DeckHints:Name$Ajani, Inspiring Leader Oracle:Flying, vigilance\nWhen Goldmane Griffin enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Inspiring Leader, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/g/grasping_current.txt b/forge-gui/res/cardsfolder/g/grasping_current.txt index 479635023cb..71203a17db4 100644 --- a/forge-gui/res/cardsfolder/g/grasping_current.txt +++ b/forge-gui/res/cardsfolder/g/grasping_current.txt @@ -2,7 +2,7 @@ Name:Grasping Current ManaCost:4 U Types:Sorcery A:SP$ ChangeZone | Cost$ 4 U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return up to two target creatures to their owner's hand. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedJace; Ingenious Mind-Mage | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, and put it into your hand. If you searched your library this way, shuffle it. +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedJace; Ingenious Mind-Mage | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, and put it into your hand. If you searched your library this way, shuffle it. DeckHints:Name$Jace, Ingenious Mind-Mage SVar:Picture:http://www.wizards.com/global/images/magic/general/grasping_current.jpg Oracle:Return up to two target creatures to their owner's hand.\nSearch your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, and put it into your hand. If you searched your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/j/jaces_ruse.txt b/forge-gui/res/cardsfolder/j/jaces_ruse.txt index 72f07430c79..801cff7581e 100644 --- a/forge-gui/res/cardsfolder/j/jaces_ruse.txt +++ b/forge-gui/res/cardsfolder/j/jaces_ruse.txt @@ -2,6 +2,6 @@ Name:Jace's Ruse ManaCost:3 U U Types:Sorcery A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return up to two target creatures to their owner's hand. You may search your library and/or graveyard for a card named Jace, Arcane Wizards, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedJace; Arcane Strategist | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedJace; Arcane Strategist | ChangeNum$ 1 | Optional$ True DeckHints:Name$Jace, Arcane Strategist Oracle:Return up to two target creatures to their owner's hand. You may search your library and/or graveyard for a card named Jace, Arcane Strategist, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/l/liberating_combustion.txt b/forge-gui/res/cardsfolder/l/liberating_combustion.txt index 42d5557ff39..92cc21bd2c2 100644 --- a/forge-gui/res/cardsfolder/l/liberating_combustion.txt +++ b/forge-gui/res/cardsfolder/l/liberating_combustion.txt @@ -2,7 +2,7 @@ Name:Liberating Combustion ManaCost:4 R Types:Sorcery A:SP$ DealDamage | Cost$ 4 R | ValidTgts$ Creature | NumDmg$ 6 | SubAbility$ DBSearch | SpellDescription$ CARDNAME deals 6 damage to target creature. You may search your library and/or graveyard for a card named Chandra, Pyrogenius, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedChandra; Pyrogenius | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedChandra; Pyrogenius | ChangeNum$ 1 | Optional$ True DeckHints:Name$Chandra, Pyrogenius SVar:Picture:http://www.wizards.com/global/images/magic/general/liberating_combustion.jpg Oracle:Liberating Combustion deals 6 damage to target creature. You may search your library and/or graveyard for a card named Chandra, Pyrogenius, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/l/lilianas_influence.txt b/forge-gui/res/cardsfolder/l/lilianas_influence.txt index 2d313b13ae4..bbc9d2ec8e7 100644 --- a/forge-gui/res/cardsfolder/l/lilianas_influence.txt +++ b/forge-gui/res/cardsfolder/l/lilianas_influence.txt @@ -2,7 +2,7 @@ Name:Liliana's Influence ManaCost:4 B B Types:Sorcery A:SP$ PutCounterAll | Cost$ 4 B B | ValidCards$ Creature.YouDontCtrl | CounterType$ M1M1 | CounterNum$ 1 | SubAbility$ DBShuffle | IsCurse$ True | SubAbility$ DBSearch | SpellDescription$ Put a -1/-1 counter on each creature you don't control. You may search your library and/or graveyard for a card named Liliana, Death Wielder, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedLiliana; Death Wielder | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedLiliana; Death Wielder | ChangeNum$ 1 | Optional$ True DeckHints:Name$Liliana, Death Wielder SVar:Picture:http://www.wizards.com/global/images/magic/general/lilianas_influence.jpg Oracle:Put a -1/-1 counter on each creature you don't control. You may search your library and/or graveyard for a card named Liliana, Death Wielder, reveal it, and put it into your hand. If you search your library this way, shuffle it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt b/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt index 93b157bafb4..02ccfd15ec4 100644 --- a/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt +++ b/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt @@ -3,6 +3,6 @@ ManaCost:1 W U Types:Legendary Creature Human Cleric PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Teferi, Timebender, reveal it, then put it into your hand. If you searched your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedTeferi; Timebender | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedTeferi; Timebender | ChangeNum$ 1 | Optional$ True DeckHints:Name$Teferi, Timebender Oracle:When Niambi, Faithful Healer enters the battlefield, you may search your library and/or graveyard for a card named Teferi, Timebender, reveal it, then put it into your hand. If you searched your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/o/okos_hospitality.txt b/forge-gui/res/cardsfolder/o/okos_hospitality.txt index 6551ca3c462..98b59ad20e7 100644 --- a/forge-gui/res/cardsfolder/o/okos_hospitality.txt +++ b/forge-gui/res/cardsfolder/o/okos_hospitality.txt @@ -2,6 +2,6 @@ Name:Oko's Hospitality ManaCost:3 G U Types:Instant A:SP$ AnimateAll | Cost$ 3 G U | ValidCards$ Creature.YouCtrl | Power$ 3 | Toughness$ 3 | SubAbility$ DBSearch | SpellDescription$ Creatures you control have base power and toughness 3/3 until end of turn. You may search your library and/or graveyard for a card named Oko, the Trickster, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedOko; the Trickster | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedOko; the Trickster | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Oko, the Trickster Oracle:Creatures you control have base power and toughness 3/3 until end of turn. You may search your library and/or graveyard for a card named Oko, the Trickster, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/r/rals_dispersal.txt b/forge-gui/res/cardsfolder/r/rals_dispersal.txt index bf091ea1034..0d0d0fd078e 100644 --- a/forge-gui/res/cardsfolder/r/rals_dispersal.txt +++ b/forge-gui/res/cardsfolder/r/rals_dispersal.txt @@ -2,6 +2,6 @@ Name:Ral's Dispersal ManaCost:3 U U Types:Instant A:SP$ ChangeZone | Cost$ 3 U U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return target creature to its owner's hand. You may search you library and/or graveyard for a card named, Ral, Caller of Storms and put it in your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedRal; Caller of Storms | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedRal; Caller of Storms | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Ral, Caller of Storms Oracle:Return target creature to its owner's hand. You may search you library and/or graveyard for a card named Ral, Caller of Storms, reveal it, and put it in to your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt b/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt index 1c919d8bbaa..e075fa4c0bf 100644 --- a/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt +++ b/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt @@ -2,6 +2,6 @@ Name:Rhythmic Water Vortex ManaCost:3 U U Types:Sorcery A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return up to two target creatures to their owner's hand. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedMu Yanling | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Mu Yanling, reveal it, and put it into your hand. If you searched your library this way, shuffle it. +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedMu Yanling | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Mu Yanling, reveal it, and put it into your hand. If you searched your library this way, shuffle it. DeckHints:Name$Mu Yanling Oracle:Return up to two target creatures to their owner's hand.\nSearch your library and/or graveyard for a card named Mu Yanling, reveal it, and put it into your hand. If you searched your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt b/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt index e4c3dc1c89a..cb026f19367 100644 --- a/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt +++ b/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt @@ -3,6 +3,6 @@ ManaCost:4 R Types:Creature Human Knight PT:5/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Rowan, Fearless Sparkmage, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedRowan; Fearless Sparkmage | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedRowan; Fearless Sparkmage | ChangeNum$ 1 | Optional$ True DeckHints:Name$Rowan, Fearless Sparkmage Oracle:When Rowan's Stalwarts enters the battlefield, you may search your library and/or graveyard for a card named Rowan, Fearless Sparkmage, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/s/sorins_guide.txt b/forge-gui/res/cardsfolder/s/sorins_guide.txt index 97942b00ccf..c2d30694e37 100644 --- a/forge-gui/res/cardsfolder/s/sorins_guide.txt +++ b/forge-gui/res/cardsfolder/s/sorins_guide.txt @@ -3,6 +3,6 @@ ManaCost:3 B B Types:Creature Vampire PT:4/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named flying, Vampire CARDNAME, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedSorin; Vampire Lord | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedSorin; Vampire Lord | ChangeNum$ 1 | Optional$ True DeckHints:Name$Sorin, Vampire Lord Oracle:When Sorin's Guide enters the battlefield, you may search your library and/or graveyard for a card named Sorin, Vampire Lord, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt b/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt index 4ff2711a72c..92a0b9dfde9 100644 --- a/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt +++ b/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt @@ -3,7 +3,7 @@ ManaCost:3 R W Types:Creature Dinosaur PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Huatli, Dinosaur Knight, reveal it, then put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedHuatli; Dinosaur Knight | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedHuatli; Dinosaur Knight | ChangeNum$ 1 | Optional$ True DeckHints:Name$Huatli, Dinosaur Knight SVar:Picture:http://www.wizards.com/global/images/magic/general/sun_blessed_mount.jpg Oracle:When Sun-Blessed Mount enters the battlefield, you may search your library and/or graveyard for a card named Huatli, Dinosaur Knight, reveal it, then put it into your hand. If you searched your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt b/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt index 7426200799b..c2852ea3c81 100644 --- a/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt +++ b/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt @@ -2,7 +2,7 @@ Name:Tezzeret's Betrayal ManaCost:3 U B Types:Sorcery A:SP$ Destroy | Cost$ 3 U B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBSearch | SpellDescription$ Destroy target creature. You may search your library and/or graveyard for a card named Tezzeret, Master of Metal, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedTezzeret; Master of Metal | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedTezzeret; Master of Metal | ChangeNum$ 1 | Optional$ True DeckHints:Name$Tezzeret, Master of Metal SVar:Picture:http://www.wizards.com/global/images/magic/general/tezzerets_betrayal.jpg Oracle:Destroy target creature. You may search your library and/or graveyard for a card named Tezzeret, Master of Metal, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/v/visage_of_bolas.txt b/forge-gui/res/cardsfolder/v/visage_of_bolas.txt index e7b93034995..0781da4fdd5 100644 --- a/forge-gui/res/cardsfolder/v/visage_of_bolas.txt +++ b/forge-gui/res/cardsfolder/v/visage_of_bolas.txt @@ -2,7 +2,7 @@ Name:Visage of Bolas ManaCost:4 Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Nicol Bolas, the Deceiver, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedNicol Bolas; the Deceiver | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedNicol Bolas; the Deceiver | ChangeNum$ 1 | Optional$ True A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. diff --git a/forge-gui/res/cardsfolder/v/vraskas_scorn.txt b/forge-gui/res/cardsfolder/v/vraskas_scorn.txt index 445cac701e7..5f3742e5133 100644 --- a/forge-gui/res/cardsfolder/v/vraskas_scorn.txt +++ b/forge-gui/res/cardsfolder/v/vraskas_scorn.txt @@ -2,7 +2,7 @@ Name:Vraska's Scorn ManaCost:2 B B Types:Sorcery A:SP$ LoseLife | Cost$ 2 B B | ValidTgts$ Opponent | LifeAmount$ 4 | SubAbility$ DBSearch | SpellDescription$ Target opponent loses 4 life. You may search your library and/or graveyard for a card named Vraska, Scheming Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedVraska; Scheming Gorgon | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedVraska; Scheming Gorgon | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Vraska, Scheming Gorgon SVar:Picture:http://www.wizards.com/global/images/magic/general/vraskas_scorn.jpg Oracle:Target opponent loses 4 life. You may search your library and/or graveyard for a card named Vraska, Scheming Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt b/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt index 1a6c3cb90d1..95a3ebec906 100644 --- a/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt +++ b/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt @@ -3,7 +3,7 @@ ManaCost:4 B G Types:Sorcery A:SP$ Destroy | Cost$ 4 B G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBGainLife | SpellDescription$ Destroy target creature. You gain life equal to its toughness. You may search your library and/or graveyard from a card named Vraska, Regal Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup | References$ X | SubAbility$ DBSearch -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedVraska; Regal Gorgon | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedVraska; Regal Gorgon | ChangeNum$ 1 | Optional$ True SVar:X:TargetedLKI$CardToughness DeckNeeds:Name$Vraska, Regal Gorgon Oracle:Destroy target creature. You gain life equal to its toughness. You may search your library and/or graveyard from a card named Vraska, Regal Gorgon, reveal it, and put it in to your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt b/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt index 8514bd32ba1..5754357ec31 100644 --- a/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt +++ b/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt @@ -4,6 +4,6 @@ Types:Creature Bird PT:2/4 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Mu Yanling, Celestial Wind, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedMu Yanling; Celestial Wind | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedMu Yanling; Celestial Wind | ChangeNum$ 1 | Optional$ True DeckHints:Name$Mu Yanling, Celestial Wind Oracle:Flying\nWhen Yanling's Harbinger enters the battlefield, you may search your library and/or graveyard for a card named Mu Yanling, Celestial Wind, reveal it, and put it into your hand. If you search your library this way, shuffle it. From e35904e727852f60d06be509849c0e8e44167310 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Dec 2019 19:32:50 -0500 Subject: [PATCH 02/54] Another round of THB --- .../cardsfolder/upcoming/ashiok_nightmare_muse.txt | 2 +- .../upcoming/ashiok_sculptor_of_fears.txt | 9 +++++++++ .../cardsfolder/upcoming/elspeth_undaunted_hero.txt | 11 +++++++++++ .../res/cardsfolder/upcoming/hero_of_the_winds.txt | 9 +++++++++ .../res/cardsfolder/upcoming/medomais_prophecy.txt | 12 ++++++++++++ forge-gui/res/cardsfolder/upcoming/memory_drain.txt | 6 ++++++ .../res/cardsfolder/upcoming/minions_return.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/mires_grasp.txt | 7 +++++++ forge-gui/res/editions/Theros Beyond Death.txt | 1 + 9 files changed, 66 insertions(+), 1 deletion(-) create mode 100755 forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/memory_drain.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/minions_return.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/mires_grasp.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt b/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt index 3b301ba9849..448f20b4de4 100644 --- a/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt +++ b/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt @@ -2,7 +2,7 @@ Name:Ashiok, Nightmare Muse ManaCost:3 U B Types:Legendary Planeswalker Ashiok Loyalty:5 -A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ ub_2_3_nightmare_mill | TokenOwner$ You | LegacyImage$ ub 2 3 Nightmare mill thb | SubAbility$ DBDraw | SpellDescription$ Create a 2/3 blue and black Nightmare creature token with "Whenever this creature attacks or blocks, each opponent exiles the top two cards of their library." +A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ ub_2_3_nightmare_mill | TokenOwner$ You | LegacyImage$ ub 2 3 Nightmare mill thb | SpellDescription$ Create a 2/3 blue and black Nightmare creature token with "Whenever this creature attacks or blocks, each opponent exiles the top two cards of their library." A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBExile | SpellDescription$ Return target nonland permanent to its owner’s hand, then that player exiles a card from their hand. SVar:DBExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | DefinedPlayer$ TargetedOwner | Chooser$ TargetedOwner A:AB$ Play | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Valid$ Card.nonLand+faceUp+OwnedBy Player.Opponent | ValidZone$ Exile | WithoutManaCost$ True | Amount$ 3 | Optional$ True | SpellDescription$ You may cast up to three face-up cards your opponents own from exile without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt b/forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt new file mode 100755 index 00000000000..6e94b1c9366 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt @@ -0,0 +1,9 @@ +Name:Ashiok, Sculptor of Fears +ManaCost:4 U B +Types:Legendary Planeswalker Ashiok +Loyalty:4 +A:AB$ Draw | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | NumCards$ 1 | SubAbility$ DBMill | SpellDescription$ Draw a card. Each player puts the top two cards of their library into their graveyard. +SVar:DBMill:DB$ Mill | Defined$ Player | NumCards$ 2 +A:AB$ ChangeZone | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. +A:AB$ GainControl | Cost$ SubCounter<11/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | AllValid$ Creature.TargetedPlayerCtrl | NewController$ You | StackDescription$ SpellDescription | SpellDescription$ Gain control of all creatures target opponent controls. +Oracle:+2: Draw a card. Each player puts the top two cards of their library into their graveyard.\n−5: Put target creature card from a graveyard onto the battlefield under you control.\n−11: Gain control of all creatures target opponent controls. diff --git a/forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt b/forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt new file mode 100755 index 00000000000..b9ce2ca3763 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt @@ -0,0 +1,11 @@ +Name:Elspeth, Undaunted Hero +ManaCost:2 W W W +Types:Legendary Planeswalker Elspeth +Loyalty:5 +A:AB$ PutCounter | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | CounterNum$ 1 | CounterType$ P1P1 | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creatures | SpellDescription$ Put a +1/+1 counter on each of up to two target creatures. +DeckHas:Ability$Counters +A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Battlefield | ChangeType$ Card.namedSunlit Hoplite | ChangeNum$ 1 | StackDescription$ SpellDescription |SpellDescription$ Search your library and/or graveyard for a card named Sunlit Hoplite and put it onto the battlefield. If you search your library this way, shuffle it. +DeckHints:Name$Sunlit Hoplite +A:AB$ PumpAll | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +X | NumDef$ +X | References$ X | KW$ Flying | SpellDescription$ Until end of turn, creatures you control gain flying and get +X/+X, where X is your devotion to white. +SVar:X:Count$Devotion.White +Oracle:+2: Put a +1/+1 counter on each of up to two target creatures.\n−2: Search your library and/or graveyard for a card named Sunlit Hoplite and put it onto the battlefield. If you search your library this way, shuffle it.\n−8: Until end of turn, creatures you control gain flying and get +X/+X, where X is your devotion to white. diff --git a/forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt b/forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt new file mode 100755 index 00000000000..731fd1cddf7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt @@ -0,0 +1,9 @@ +Name:Hero of the Winds +ManaCost:3 W +Types:Creature Human Soldier +PT:1/4 +K:Flying +T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPumpAll | TriggerDescription$ Whenever you cast a spell that targets CARDNAME, creatures you control get +1/+0 until end of turn. +SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 +SVar:BuffedBy:Card +Oracle:Flying\nWhenever you cast a spell that targets Hero of the Winds, creatures you control get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt b/forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt new file mode 100644 index 00000000000..c57b689280b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt @@ -0,0 +1,12 @@ +Name:Medomai's Prophecy +ManaCost:1 U +Types:Enchantment Saga +K:Saga:4:DBScry,DBNameCard,DBEffect,DBLook +SVar:DBScry:DB$ Scry | ScryNum$ 2 | SpellDescription$ Scry 2. +SVar:DBNameCard:DB$ NameCard | SpellDescription$ Choose a card name. +SVar:DBEffect:DB$ Effect | Name$ Medomai's Prophecy Effect | Triggers$ NamedCardCast | SVars$ NamedCardCast,TrigDraw,ExileEffect | SpellDescription$ When you cast a spell with the chosen name for the first time this turn, draw two cards. +SVar:DBLook:DB$ Dig | Defined$ Player | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | SpellDescription$ Look at the top card of each player's library. +SVar:NamedCardCast:Mode$ SpellCast | ValidCard$ Card.NamedCard | ValidActivatingPlayer$ You | TriggerZones$ Command | Execute$ TrigDraw | TriggerDescription$ When you cast a spell with the chosen name for the first time this turn, draw two cards. +SVar:TrigDraw:DB$ Draw | NumCards$ 2 | SubAbility$ ExileEffect +SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after IV.)\nI — Scry 2.\nII — Choose a card name.\nIII — When you cast a spell with the chosen name for the first time this turn, draw two cards.\nIV - Look at the top card of each player's library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/memory_drain.txt b/forge-gui/res/cardsfolder/upcoming/memory_drain.txt new file mode 100755 index 00000000000..2744cacf801 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/memory_drain.txt @@ -0,0 +1,6 @@ +Name:Memory Drain +ManaCost:2 U U +Types:Instant +A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ DBScry | SpellDescription$ Counter target spell. Scry 2. +SVar:DBScry:DB$Scry | ScryNum$ 2 +Oracle:Counter target spell. Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/minions_return.txt b/forge-gui/res/cardsfolder/upcoming/minions_return.txt new file mode 100644 index 00000000000..15aa8619e06 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/minions_return.txt @@ -0,0 +1,10 @@ +Name:Minion's Return +ManaCost:2 B +Types:Enchantment Aura +K:Flash +K:Enchant creature +A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AITgts$ Card.nonToken | AILogic$ Pump +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChange | TriggerDescription$ When enchanted creature dies, return that card to the battlefield under your control. +SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredCard +Oracle:Flash\nEnchant creature\nWhen enchanted creature dies, return that card to the battlefield under your control. + diff --git a/forge-gui/res/cardsfolder/upcoming/mires_grasp.txt b/forge-gui/res/cardsfolder/upcoming/mires_grasp.txt new file mode 100755 index 00000000000..1f1ffa2a267 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mires_grasp.txt @@ -0,0 +1,7 @@ +Name:Mire's Grasp +ManaCost:1 B +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -3 | AddToughness$ -3 | Description$ Enchanted creature gets -3/-3. +Oracle:Enchant creature\nEnchanted creature gets -3/-3. diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index bbfad143cc8..ea061ae8553 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -18,6 +18,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 43 R Ashiok's Erasure 48 C Eidolon of Philosophy 51 C Ichthyomorphosis +56 U Medomai's Prophecy 102 U Inevitable End 126 C Arena Trickster 136 U Furious Rise From e1e085d61034a5d10d8a0a2c659ab81f7478736e Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Dec 2019 19:37:39 -0500 Subject: [PATCH 03/54] Another round of THB --- forge-gui/res/editions/Theros Beyond Death.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index ea061ae8553..504c05fa060 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -11,21 +11,25 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 4 U Banishing Light 7 U Commanding Presence 9 U Daxos, Blessed by the Sun -23 C Indomitable Will -26 C Karametra’s Blessing +23 C Hero of the Winds +25 C Indomitable Will +26 C Karametra's Blessing 28 C Leonin of the Lost Pride 42 U Alirios, Enraptured 43 R Ashiok's Erasure 48 C Eidolon of Philosophy 51 C Ichthyomorphosis +54 C Memory Drain 56 U Medomai's Prophecy 102 U Inevitable End +104 U Minion's Return +106 C Mire’s Grasp 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel 140 C Incendiary Oracle 141 C Infuriate -142 C Iroas’s Blessing +142 C Iroas's Blessing 143 C Irreverent Revelers 164 C Aspect of Lamprey 174 C Ilysian Caryatid From 8344522e124a1aabeef78f7227bbc8d534aa3382 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Dec 2019 19:41:12 -0500 Subject: [PATCH 04/54] Fixing apostrophes in THB list --- forge-gui/res/editions/Theros Beyond Death.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index 504c05fa060..ba02e0178b3 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -23,7 +23,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 56 U Medomai's Prophecy 102 U Inevitable End 104 U Minion's Return -106 C Mire’s Grasp +106 C Mire's Grasp 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel From 488fa4a4dd17246eb806fda1b8d168e1b7233241 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 17 Dec 2019 09:56:23 -0500 Subject: [PATCH 05/54] 7 THB N creatures (mostly vanilla) --- .../res/cardsfolder/upcoming/naiad_of_hidden_coves.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt | 5 +++++ forge-gui/res/editions/Theros Beyond Death.txt | 9 ++++++++- 8 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt diff --git a/forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt b/forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt new file mode 100644 index 00000000000..a79f90b9014 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt @@ -0,0 +1,6 @@ +Name:Naiad of Hidden Coves +ManaCost:2 U +Types:Enchantment Creature Nymph +PT:2/3 +S:Mode$ ReduceCost | Type$ Spell | Activator$ You | Amount$ 1 | Condition$ NotPlayerTurn | Description$ As long as it's not your turn, spells you cast cost {1} less to cast. +Oracle:As long as it's not your turn, spells you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt b/forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt new file mode 100644 index 00000000000..d25eb0d4f10 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt @@ -0,0 +1,8 @@ +Name:Nylea's Huntmaster +ManaCost:3 G +Types:Creature Centaur Shaman +PT:4/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +X/+0 until end of turn, where X is your devotion to green. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.) +SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | References$ X +SVar:X:Count$Devotion.Green +Oracle:When Nylea's Huntmaster enters the battlefield, target creature gets +X/+0 until end of turn, where X is your devotion to green. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.) diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt new file mode 100644 index 00000000000..d6fb1c1b0a3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Brute +ManaCost:3 R R +Types:Enchantment Creature Cyclops +PT:7/3 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt new file mode 100755 index 00000000000..0f65320bbf6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Colossus +ManaCost:3 G G G +Types:Enchantment Creature Giant +PT:6/7 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt new file mode 100755 index 00000000000..b0c0313bc38 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Courser +ManaCost:1 W W +Types:Enchantment Creature Centaur Scout +PT:2/4 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt new file mode 100644 index 00000000000..93842a7b373 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Marauder +ManaCost:2 B B +Types:Enchantment Creature Minotaur +PT:4/3 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt new file mode 100644 index 00000000000..6acf482eeaf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Seaguard +ManaCost:2 U U +Types:Enchantment Creature Merfolk Soldier +PT:2/5 +Oracle: diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index ba02e0178b3..3688d0a4d71 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -15,15 +15,19 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 25 C Indomitable Will 26 C Karametra's Blessing 28 C Leonin of the Lost Pride +29 C Nyxborn Courser 42 U Alirios, Enraptured 43 R Ashiok's Erasure 48 C Eidolon of Philosophy 51 C Ichthyomorphosis 54 C Memory Drain -56 U Medomai's Prophecy +53 U Medomai's Prophecy +56 C Naiad of Hidden Coves +57 C Nyxborn Seaguard 102 U Inevitable End 104 U Minion's Return 106 C Mire's Grasp +109 C Nyxborn Marauder 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel @@ -31,9 +35,12 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 141 C Infuriate 142 C Iroas's Blessing 143 C Irreverent Revelers +144 C Nyxborn Brute 164 C Aspect of Lamprey 174 C Ilysian Caryatid 176 U Klothys's Design +187 C Nylea's Huntmaster +191 C Nyxborn Colossus 208 M Ashiok, Nightmare Muse 219 U Hero of the Nyxborn 243 R Labyrinth of Skophos From 655737dcb54351339bac932163f24c5a6c53cc2c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 17 Dec 2019 12:26:47 -0500 Subject: [PATCH 06/54] 3 THB Omens --- .../res/cardsfolder/upcoming/omen_of_the_dead.txt | 8 ++++++++ .../res/cardsfolder/upcoming/omen_of_the_hunt.txt | 8 ++++++++ .../res/cardsfolder/upcoming/omen_of_the_sea.txt | 9 +++++++++ forge-gui/res/editions/Theros Beyond Death.txt | 13 +++++++++++++ 4 files changed, 38 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt new file mode 100644 index 00000000000..c1f26a34885 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt @@ -0,0 +1,8 @@ +Name:Omen of the Dead +ManaCost:B +Types:Enchantment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return target creature card from your graveyard to your hand. +SVar:TrigReturn:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl +A:AB$ Scry | Cost$ 2 B Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. +Oracle:Flash\nWhen Omen of the Dead enters the battlefield, return target creature card from your graveyard to your hand.\n{2}{B}, Sacrifice Omen of the Dead: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt new file mode 100644 index 00000000000..f2a97bcd1ac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt @@ -0,0 +1,8 @@ +Name:Omen of the Hunt +ManaCost:2 G +Types:Enchantment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. +SVar:TrigSearch:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | ShuffleNonMandatory$ True +A:AB$ Scry | Cost$ 2 G Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. +Oracle:Flash\nWhen Omen of the Hunt enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.\n{2}{G}, Sacrifice Omen of the Hunt: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt new file mode 100644 index 00000000000..31104af47df --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt @@ -0,0 +1,9 @@ +Name:Omen of the Sea +ManaCost:1 U +Types:Enchantment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 2, then draw a card. +SVar:TrigScry:DB$Scry | ScryNum$ 2 | SubAbility$ DBDraw +SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 +A:AB$ Scry | Cost$ 2 U Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. +Oracle:Flash\nWhen Omen of the Sea enters the battlefield, scry 2, then draw a card.\n{2}{U}, Sacrifice Omen of the Sea: Scry 2. diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index 3688d0a4d71..f45b6089ce3 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -24,10 +24,12 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 53 U Medomai's Prophecy 56 C Naiad of Hidden Coves 57 C Nyxborn Seaguard +58 C Omen of the Sea 102 U Inevitable End 104 U Minion's Return 106 C Mire's Grasp 109 C Nyxborn Marauder +110 C Omen of the Dead 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel @@ -41,6 +43,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 176 U Klothys's Design 187 C Nylea's Huntmaster 191 C Nyxborn Colossus +192 C Omen of the Hunt 208 M Ashiok, Nightmare Muse 219 U Hero of the Nyxborn 243 R Labyrinth of Skophos @@ -62,6 +65,16 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 285 L Mountain 286 L Forest 287 L Forest +288 R Grasping Giant +289 R Victory’s Envoy +290 R Sphinx Mindbreaker +291 R Serpent of Yawning Depths +292 R Demon of Loathing +293 R Underworld Sentinel +294 R Deathbellow War Cry +295 R Terror of Mount Velus +296 R Ironscale Hydra +297 R Treeshaker Chimera [tokens] From 0eed744018769d2ef48bea2ecbb891ec6c1ae41c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 17 Dec 2019 15:14:41 -0500 Subject: [PATCH 07/54] 3 THB Theme Booster rares --- .../res/cardsfolder/upcoming/deathbellow_war_cry.txt | 5 +++++ .../res/cardsfolder/upcoming/demon_of_loathing.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/grasping_giant.txt | 11 +++++++++++ 3 files changed, 26 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/grasping_giant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt b/forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt new file mode 100644 index 00000000000..ae84aa2c002 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt @@ -0,0 +1,5 @@ +Name:Deathbellow War Cry +ManaCost:5 R R R +Types:Sorcery +A:SP$ ChangeZone | Cost$ 5 R R R | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Minotaur | ChangeNum$ 4 | DifferentNames$ True | SpellDescription$ Search your library for up to four Minotaur creature cards with different names, put them onto the battlefield, then shuffle your library. +Oracle:Search your library for up to four Minotaur creature cards with different names, put them onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt b/forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt new file mode 100644 index 00000000000..1d5494b135b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt @@ -0,0 +1,10 @@ +Name:Demon of Loathing +ManaCost:5 B B +Types:Creature Demon +PT:7/7 +K:Flying +K:Trample +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player sacrifices a creature. +SVar:TrigSac:DB$Sacrifice | Defined$ TriggeredTarget | SacValid$ Creature +SVar:MustBeBlocked:True +Oracle:Flying, trample\nWhenever Demon of Loathing deals combat damage to a player, that player sacrifices a creature. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/grasping_giant.txt b/forge-gui/res/cardsfolder/upcoming/grasping_giant.txt new file mode 100644 index 00000000000..0fa57133606 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grasping_giant.txt @@ -0,0 +1,11 @@ +Name:Grasping Giant +ManaCost:5 W +Types:Creature Giant +PT:5/7 +K:Vigilance +T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, exile that creature until CARDNAME leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredBlocker | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigReturn | Secondary$ True | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, exile that creature until CARDNAME leaves the battlefield. +SVar:TrigReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:Vigilance\nWhenever Grasping Giant becomes blocked by a creature, exile that creature until Grasping Giant leaves the battlefield. \ No newline at end of file From f97312dcf208abe2cb538826b1a184f6ac061188 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Wed, 18 Dec 2019 02:21:38 -0500 Subject: [PATCH 08/54] 3 THB Theme Booster rares --- forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt | 7 +++++++ .../res/cardsfolder/upcoming/rage_scarred_berserker.txt | 7 +++++++ .../cardsfolder/upcoming/serpent_of_yawning_depths.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/setessan_champion.txt | 8 ++++++++ forge-gui/res/editions/Theros Beyond Death.txt | 8 ++++++++ 7 files changed, 49 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/setessan_champion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt b/forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt new file mode 100644 index 00000000000..8f00b76e3d4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt @@ -0,0 +1,7 @@ +Name:Ironscale Hydra +ManaCost:3 G G +Types:Creature Hydra +PT:5/5 +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ValidSource$ Creature | IsCombat$ True | ReplaceWith$ Counters | Description$ If a creature would deal combat damage to CARDNAME, prevent that damage and put a +1/+1 counter on CARDNAME. +SVar:Counters:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +Oracle:If a creature would deal combat damage to Ironscale Hydra, prevent that damage and put a +1/+1 counter on Ironscale Hydra. diff --git a/forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt b/forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt new file mode 100644 index 00000000000..0fa5dfd37c5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt @@ -0,0 +1,6 @@ +Name:Phalanx Tactics +ManaCost:1 W +Types:Instant +A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +1 | TgtPrompt$ Select target creature you control | SubAbility$ DBPumpAll | SpellDescription$ Target creature you control gets +2/+1 until end of turn. Each other creature you control gets +1/+1 until end of turn. +SVar:DBPumpAll:DB$PumpAll | ValidCards$ Targeted.Other+YouCtrl+Creature | NumAtt$ +1 | NumDef$ +1 +Oracle:Target creature you control gets +2/+1 until end of turn. Each other creature you control gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt b/forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt new file mode 100644 index 00000000000..34bfa932987 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt @@ -0,0 +1,7 @@ +Name:Pious Wayfarer +ManaCost:W +Types:Creature Human Scout +PT:1/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, target creature gets +1/+1 until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 1 | NumDef$ 1 +Oracle:Constellation — Whenever an enchantment enters the battlefield under your control, target creature gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt b/forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt new file mode 100644 index 00000000000..c1aa42d68f3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt @@ -0,0 +1,7 @@ +Name:Rage-Scarred Berserker +ManaCost:4 B +Types:Creature Minotaur Berserker +PT:5/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +1/+0 and gains indestructible until end of turn. +SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ Indestructible +Oracle:When Rage-Scarred Berserker enters the battlefield, target creature gets +1/+0 and gains indestructible until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt b/forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt new file mode 100644 index 00000000000..c902315c251 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt @@ -0,0 +1,6 @@ +Name:Serpent of Yawning Depths +ManaCost:4 U U +Types:Enchantment Creature Serpent +PT:6/6 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Kraken+YouCtrl,Creature.Leviathan+YouCtrl,Creature.Octopus+YouCtrl,Creature.Serpent+YouCtrl | ValidBlocker$ Creature.nonKraken+nonLeviathan+nonOctopus+nonSerpent | Description$ Krakens, Leviathans, Octopuses, and Serpents you control can't be blocked except by Krakens, Leviathans, Octopuses, and Serpents. +Oracle:Krakens, Leviathans, Octopuses, and Serpents you control can't be blocked except by Krakens, Leviathans, Octopuses, and Serpents. diff --git a/forge-gui/res/cardsfolder/upcoming/setessan_champion.txt b/forge-gui/res/cardsfolder/upcoming/setessan_champion.txt new file mode 100644 index 00000000000..1afded1fa19 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/setessan_champion.txt @@ -0,0 +1,8 @@ +Name:Setessan Champion +ManaCost:2 G +Types:Creature Human Warrior +PT:1/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, put a +1/+1 counter on CARDNAME and draw a card. +SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | NumCards$ 1 +Oracle:Constellation - Whenever an enchantment enters the battlefield under your control, put a +1/+1 counter on Setessan Champion and draw a card. diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index f45b6089ce3..398f80c79c1 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -16,6 +16,9 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 26 C Karametra's Blessing 28 C Leonin of the Lost Pride 29 C Nyxborn Courser +31 U Phalanx Tactics +32 C Pious Wayfarer +34 C Revoke Existence 42 U Alirios, Enraptured 43 R Ashiok's Erasure 48 C Eidolon of Philosophy @@ -30,6 +33,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 106 C Mire's Grasp 109 C Nyxborn Marauder 110 C Omen of the Dead +113 C Rage-Scarred Berserker 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel @@ -38,12 +42,14 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 142 C Iroas's Blessing 143 C Irreverent Revelers 144 C Nyxborn Brute +149 C Portent of Betrayal 164 C Aspect of Lamprey 174 C Ilysian Caryatid 176 U Klothys's Design 187 C Nylea's Huntmaster 191 C Nyxborn Colossus 192 C Omen of the Hunt +198 R Setessan Champion 208 M Ashiok, Nightmare Muse 219 U Hero of the Nyxborn 243 R Labyrinth of Skophos @@ -52,6 +58,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 252 L Swamp 253 L Mountain 254 L Forest +258 U Daxos, Blessed by the Sun 269 M Athreos, Shroud-Veiled 270 M Elspeth, Undaunted Hero 274 M Ashiok, Sculptor of Fears @@ -75,6 +82,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 295 R Terror of Mount Velus 296 R Ironscale Hydra 297 R Treeshaker Chimera +331 R Setessan Champion [tokens] From c97b3901610c87296c4adb8c640d14d629294824 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 19 Dec 2019 22:26:53 -0700 Subject: [PATCH 09/54] S THB cards and some edits --- .../res/cardsfolder/upcoming/heroes_of_the_revel.txt | 6 +++--- forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt | 2 +- forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt | 2 +- forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt | 4 ++-- forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt | 6 ++++++ .../res/cardsfolder/upcoming/setessan_skirmisher.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/setessan_training.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt | 8 ++++++++ .../res/cardsfolder/upcoming/sphinx_mindbreaker.txt | 8 ++++++++ .../res/cardsfolder/upcoming/staggering_insight.txt | 9 +++++++++ forge-gui/res/editions/Theros Beyond Death.txt | 2 +- .../{r_2_2_satyr_noblock.txt => r_1_1_satyr_noblock.txt} | 2 +- 12 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/setessan_training.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/staggering_insight.txt rename forge-gui/res/tokenscripts/{r_2_2_satyr_noblock.txt => r_1_1_satyr_noblock.txt} (94%) diff --git a/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt b/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt index 136afb781dd..9543c304b34 100644 --- a/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt +++ b/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt @@ -2,8 +2,8 @@ Name:Heroes of the Revel ManaCost:4 R Types:Creature Satyr Soldier PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 2/2 red Satyr creature token with "This creature can't block." -SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_2_2_satyr_noblock | TokenOwner$ You | LegacyImage$ r 2 2 satyr noblock thb +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 red Satyr creature token with "This creature can't block." +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_1_1_satyr_noblock | TokenOwner$ You | LegacyImage$ r 1 1 satyr noblock thb T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a spell that targets CARDNAME, creatures you control get +1/+0 until end of turn. SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 -Oracle:When Heroes of the Revel enters the battlefield, create a 2/2 red Satyr creature token with "This creature can't block."\nWhenever you cast a spell that targets Heroes of the Revel, creatures you control get +1/+0 until end of turn. +Oracle:When Heroes of the Revel enters the battlefield, create a 1/1 red Satyr creature token with "This creature can't block."\nWhenever you cast a spell that targets Heroes of the Revel, creatures you control get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt index c1f26a34885..5ad2f12cf2c 100644 --- a/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Enchantment K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return target creature card from your graveyard to your hand. -SVar:TrigReturn:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl +SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl A:AB$ Scry | Cost$ 2 B Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. Oracle:Flash\nWhen Omen of the Dead enters the battlefield, return target creature card from your graveyard to your hand.\n{2}{B}, Sacrifice Omen of the Dead: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt index f2a97bcd1ac..7e44fdc961f 100644 --- a/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. -SVar:TrigSearch:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | ShuffleNonMandatory$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | ShuffleNonMandatory$ True A:AB$ Scry | Cost$ 2 G Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. Oracle:Flash\nWhen Omen of the Hunt enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.\n{2}{G}, Sacrifice Omen of the Hunt: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt index 31104af47df..bee65b13e7b 100644 --- a/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Enchantment K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 2, then draw a card. -SVar:TrigScry:DB$Scry | ScryNum$ 2 | SubAbility$ DBDraw -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 +SVar:TrigScry:DB$ Scry | ScryNum$ 2 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 A:AB$ Scry | Cost$ 2 U Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. Oracle:Flash\nWhen Omen of the Sea enters the battlefield, scry 2, then draw a card.\n{2}{U}, Sacrifice Omen of the Sea: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt b/forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt new file mode 100644 index 00000000000..2b0ae2d7494 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt @@ -0,0 +1,6 @@ +Name:Satyr's Cunning +ManaCost:R +Types:Sorcery +A:SP$ Token | Cost$ R | TokenAmount$ 1 | TokenScript$ r_1_1_satyr_noblock | TokenOwner$ You | LegacyImage$ r 1 1 satyr noblock thb | SpellDescription$ Create a 1/1 red Satyr creature token with "This creature can't block." +K:Escape:2 R ExileFromGrave<2/Card.Other> +Oracle:Create a 1/1 red Satyr creature token with "This creature can't block."\nEscape — {2}{R}, Exile two other cards from your graveyard. (You may cast this card from your graveyard for its escape cost). \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt b/forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt new file mode 100644 index 00000000000..6794213d93f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt @@ -0,0 +1,7 @@ +Name:Setessan Skirmisher +ManaCost:1 G +Types:Creature Human Warrior +PT:2/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, CARDNAME gets +1/+1 until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +1 | NumDef$ +1 +Oracle:Constellation - Whenever an enchantment enters the battlefield under your control, CARDNAME gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/setessan_training.txt b/forge-gui/res/cardsfolder/upcoming/setessan_training.txt new file mode 100644 index 00000000000..624e1bd236b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/setessan_training.txt @@ -0,0 +1,9 @@ +Name:Setessan Training +ManaCost:1 G +Types:Enchantment Aura +K:Enchant creature you control +A:SP$ Attach | Cost$ 1 G | ValidTgts$ Creature.YouCtrl | AILogic$ Pump +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddKeyword$ Trample | Description$ Enchanted creature gets +1/+0 and has trample. +Oracle:Enchant creature you control\nWhen Setessan Training enters the battlefield, draw a card.\nEnchanted creature gets +1/+0 and has trample. diff --git a/forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt b/forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt new file mode 100644 index 00000000000..8b8287aeb2c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt @@ -0,0 +1,8 @@ +Name:Skola Grovedancer +ManaCost:1 G +Types:Enchantment Creature Satyr Druid +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Land.nonToken+YouOwn | TriggerZones$ Battlefield | Execute$ DBGainLife | TriggerDescription$ Whenever a land card is put into your graveyard from anywhere, you gain 1 life. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +A:AB$ Mill | Cost$ 2 G | Defined$ You | NumCards$ 1 | SpellDescription$ Put the top card of your library into your graveyard. +Oracle:Whenever a land card is put into your graveyard from anywhere, you gain 1 life.\n{2}{G}: Put the top card of your library into your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt b/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt new file mode 100644 index 00000000000..78d6eede617 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt @@ -0,0 +1,8 @@ +Name:Sphinx Mindbreaker +ManaCost:5 U U +Types:Creature Sphinx +PT:6/6 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBMill | TriggerDescription$ When CARDNAME enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. +SVar:DBMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 10 +Oracle:When Sphinx Mindrender enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/staggering_insight.txt b/forge-gui/res/cardsfolder/upcoming/staggering_insight.txt new file mode 100644 index 00000000000..c0913131379 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/staggering_insight.txt @@ -0,0 +1,9 @@ +Name:Staggering Insight +ManaCost:W U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ W U | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Lifelink | AddTrigger$ TriggerDamageDone | Description$ Enchanted creature gets +1/+1 and has lifelink and "Whenever this creature deals combat damage to a player, draw a card." +SVar:TriggerDamageDone:Mode$ DamageDone | ValidSource$ Card.Self | CombatDamage$ True | ValidTarget$ Player | Execute$ DBDraw | TriggerDescription$ Whenever this creature deals combat damage to a player, draw a card. +SVar:DBDraw:DB$ Draw | DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:Enchant creature\nEnchanted creature gets +1/+1 and has lifelink and "Whenever this creature deals combat damage to a player, draw a card." diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index 398f80c79c1..bbcee6d95ee 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -86,7 +86,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand [tokens] -r_2_2_satyr_noblock +r_1_1_satyr_noblock u_3_2_reflection ub_2_3_nightmare_mill w_1_1_human_soldier \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/r_2_2_satyr_noblock.txt b/forge-gui/res/tokenscripts/r_1_1_satyr_noblock.txt similarity index 94% rename from forge-gui/res/tokenscripts/r_2_2_satyr_noblock.txt rename to forge-gui/res/tokenscripts/r_1_1_satyr_noblock.txt index 26b583a1347..686eb9da76f 100644 --- a/forge-gui/res/tokenscripts/r_2_2_satyr_noblock.txt +++ b/forge-gui/res/tokenscripts/r_1_1_satyr_noblock.txt @@ -2,6 +2,6 @@ Name:Satyr ManaCost:no cost Types:Creature Satyr Colors:red -PT:2/2 +PT:1/1 K:CARDNAME can't block. Oracle:This creature can't block. From 47121019d41ab19b8f168949d26d545298861d31 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 19 Dec 2019 23:49:30 -0700 Subject: [PATCH 10/54] Chainweb aracnir - escaping with counters --- .../res/cardsfolder/upcoming/chainweb_aracnir.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt diff --git a/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt b/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt new file mode 100644 index 00000000000..061551ec708 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt @@ -0,0 +1,11 @@ +Name:Chainweb Aracnir +ManaCost:G +Types:Creature Spider +PT:1/2 +K:Reach +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals damage equal to its power to target creature with flying an opponent controls. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl+withFlying | TgtPrompt$ Select target creature with flying an opponent controls | NumDmg$ X | References$ X +SVar:X:Count$CardPower +K:Escape:3 G G ExileFromGrave<4/Card.Other> +K:etbCounter:P1P1:3:Escape$ True:CARDNAME escapes with three +1/+1 counters on it. +Oracle:Reach\nWhen Chainweb Aracnir enters the battlefield, it deals damage equal to its power to target creature with flying an opponent controls.\nEscape — {2}{G}{G}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nChainweb Aracnir escapes with three +1/+1 counters on it. From 3da4db3edcae990e0edbbf815800206ebd90f4da Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 20 Dec 2019 00:18:12 -0700 Subject: [PATCH 11/54] Chainweb aracnir - escaping with counters --- forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt b/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt index 061551ec708..11db7fd6bf0 100644 --- a/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt +++ b/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt @@ -7,5 +7,5 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl+withFlying | TgtPrompt$ Select target creature with flying an opponent controls | NumDmg$ X | References$ X SVar:X:Count$CardPower K:Escape:3 G G ExileFromGrave<4/Card.Other> -K:etbCounter:P1P1:3:Escape$ True:CARDNAME escapes with three +1/+1 counters on it. +K:etbCounter:P1P1:3:ValidCard$ Card.Self+escaped:CARDNAME escapes with three +1/+1 counters on it. Oracle:Reach\nWhen Chainweb Aracnir enters the battlefield, it deals damage equal to its power to target creature with flying an opponent controls.\nEscape — {2}{G}{G}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nChainweb Aracnir escapes with three +1/+1 counters on it. From 5cbf5649c0c2c15f70b1028e357e0d497659141a Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 20 Dec 2019 22:54:59 -0700 Subject: [PATCH 12/54] 4 more THB cards 12/20 --- .../res/cardsfolder/upcoming/elspeth_suns_nemesis.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt | 6 ++++++ .../res/cardsfolder/upcoming/terror_of_mount_velus.txt | 9 +++++++++ .../res/cardsfolder/upcoming/thaumaturges_familiar.txt | 8 ++++++++ 4 files changed, 32 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt b/forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt new file mode 100755 index 00000000000..6a0a65454c8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt @@ -0,0 +1,9 @@ +Name:Elspeth, Sun's Nemesis +ManaCost:2 W W +Types:Legendary Planeswalker Elspeth +Loyalty:5 +A:AB$ Pump | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +2 | NumDef$ +1 | SpellDescription$ Up to two target creatures you control each get +2/+1 until end of turn. +A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 2 | TokenScript$ w_1_1_human_soldier | TokenOwner$ You | LegacyImage$ w 1 1 human soldier the | SpellDescription$ Create two 1/1 white Human Soldier creature tokens. +A:AB$ GainLife | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | Ultimate$ True | LifeAmount$ 5 | SpellDescription$ You gain 5 life. +K:Escape:4 W W ExileFromGrave<4/Card.Other> +Oracle:−1: Up to two target creatures you control each get +2/+1 until end of turn.\n−2: Create two 1/1 white Human Soldier creature tokens.\n−3: You gain 5 life.\nEscape—{4}{W}{W}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt b/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt new file mode 100644 index 00000000000..e6dceaa0c0a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt @@ -0,0 +1,6 @@ +Name:Fruit of Tizerius +ManaCost:B +Types:Sorcery +A:SP$ LoseLife | Cost$ B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 2 | SpellDescription$ Target player loses 2 life. +K:Escape:3 B ExileFromGrave<3/Card.Other> +Oracle:Target player loses 2 life.\nEscape — {3}{B}, Exile three other cards from your graveyard. (You may cast this card from your graveyard for its escape cost). diff --git a/forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt b/forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt new file mode 100644 index 00000000000..fb831bfd924 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt @@ -0,0 +1,9 @@ +Name:Terror of Mount Velus +ManaCost:5 R R +Types:Creature Dragon +PT:5/5 +K:Flying +K:Double Strike +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, creatures you control gain double strike until end of turn. +SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Double Strike +Oracle:Flying, double strike\nWhen Terror of Mount Velus enters the battlefield, creatures you control gain double strike until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt b/forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt new file mode 100644 index 00000000000..8cca46af5c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt @@ -0,0 +1,8 @@ +Name:Thaumaturge's Familiar +ManaCost:3 +Types:Artifact Creature Bird +PT:1/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 1. +SVar:TrigScry:DB$ Scry | ScryNum$ 1 +Oracle:Flying\nWhen Thaumaturge's Familiar enters the battlefield, scry 1. \ No newline at end of file From ae5986f101b08bea8540e28d9497acef3752b0ef Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 21 Dec 2019 07:33:37 -0700 Subject: [PATCH 13/54] The Akroan War --- forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt diff --git a/forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt b/forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt new file mode 100644 index 00000000000..4e86bb85bac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt @@ -0,0 +1,9 @@ +Name:The Akroan War +ManaCost:3 R +Types:Enchantment Saga +K:Saga:3:DBGainControl,DBAllAttack,DBDamageTapped +SVar:DBGainControl:DB$ GainControl | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ LeavesPlay | SpellDescription$ Gain control of target creature for as long as CARDNAME remains on the battlefield. +SVar:DBAllAttack:DB$ PumpAll | ValidCards$ Creature.OppCtrl | UntilYourNextTurn$ True | KW$ HIDDEN CARDNAME attacks each combat if able. | SpellDescription$ Until your next turn, creatures your opponents control attack each turn if able. +SVar:DBDamageTapped:DB$ EachDamage | ValidCards$ Creature.tapped | NumDmg$ X | References$ X | DamageDesc$ damage equal to its power | DefinedCards$ Self | SpellDescription$ Each tapped creature deals damage to itself equal to its power. +SVar:X:Count$CardPower +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Gain control of target creature for as long as The Akroan War remains on the battlefield.\nII — Until your next turn, creatures your opponents control attack each combat if able.\nIII — Each tapped creature deals damage to itself equal to its power. From bd35e224a44be21f56f1fe03e995266cbf2933a9 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 22 Dec 2019 17:14:15 -0500 Subject: [PATCH 14/54] Few more THB --- .../res/cardsfolder/upcoming/sphinx_mindbreaker.txt | 2 +- forge-gui/res/cardsfolder/upcoming/threnody_singer.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/thundering_chariot.txt | 9 +++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/threnody_singer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt b/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt index 78d6eede617..f38b4928da5 100644 --- a/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt +++ b/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt @@ -5,4 +5,4 @@ PT:6/6 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBMill | TriggerDescription$ When CARDNAME enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. SVar:DBMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 10 -Oracle:When Sphinx Mindrender enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. \ No newline at end of file +Oracle:When Sphinx Mindbreaker enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/threnody_singer.txt b/forge-gui/res/cardsfolder/upcoming/threnody_singer.txt new file mode 100644 index 00000000000..baca2e89c7a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/threnody_singer.txt @@ -0,0 +1,10 @@ +Name:Threnody Singer +ManaCost:1 U +Types:Creature Siren +PT:1/3 +K:Flash +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature an opponent controls gets -X/-0 until end of turn, where X is your devotion to blue. (Each {U} in the mana costs of permanents you control counts toward your devotion to blue.) +SVar:DBPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | IsCurse$ True | NumAtt$ -X | References$ X | +SVar:X:Count$Devotion.Blue +Oracle:Flash\nFlying\nWhen Threnody Singer enters the battlefield, target creature an opponent controls gets -X/-0 until end of turn, where X is your devotion to blue. (Each {U} in the mana costs of permanents you control counts toward your devotion to blue.) diff --git a/forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt b/forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt new file mode 100644 index 00000000000..0986a4e5870 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt @@ -0,0 +1,9 @@ +Name:Thundering Chariot +ManaCost:4 +Types:Artifact Vehicle +PT:3/3 +K:First Strike +K:Trample +K:Haste +K:Crew:1 +Oracle:First strike, trample, haste\nCrew 1 From 1f6cbd7d19274cf1ce6ed5509b879900ca56e711 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 23 Dec 2019 11:53:37 -0500 Subject: [PATCH 15/54] Last THB leaks/spoilers --- forge-gui/res/cardsfolder/u/underworld_dreams.txt | 5 ++--- .../res/cardsfolder/upcoming/treacherous_blessing.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/treeshaker_chimera.txt | 8 ++++++++ .../res/cardsfolder/upcoming/triton_waverider.txt | 7 +++++++ .../res/cardsfolder/upcoming/underworld_rage_hound.txt | 8 ++++++++ .../res/cardsfolder/upcoming/underworld_sentinel.txt | 9 +++++++++ .../res/cardsfolder/upcoming/venomous_hierophant.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt | 7 +++++++ .../res/cardsfolder/upcoming/voracious_typhon.txt | 7 +++++++ .../res/cardsfolder/upcoming/warbriar_blessing.txt | 9 +++++++++ .../res/cardsfolder/upcoming/warden_of_the_chained.txt | 8 ++++++++ .../res/cardsfolder/upcoming/wolfwillow_haven.txt | 9 +++++++++ 12 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/triton_waverider.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt diff --git a/forge-gui/res/cardsfolder/u/underworld_dreams.txt b/forge-gui/res/cardsfolder/u/underworld_dreams.txt index b4115b7fc64..9bdbfbe375d 100644 --- a/forge-gui/res/cardsfolder/u/underworld_dreams.txt +++ b/forge-gui/res/cardsfolder/u/underworld_dreams.txt @@ -1,7 +1,6 @@ Name:Underworld Dreams ManaCost:B B B Types:Enchantment -T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever an opponent draws a card, CARDNAME deals 1 damage to them. +T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever an opponent draws a card, CARDNAME deals 1 damage to that player. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredPlayer | NumDmg$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/underworld_dreams.jpg -Oracle:Whenever an opponent draws a card, Underworld Dreams deals 1 damage to them. +Oracle:Whenever an opponent draws a card, Underworld Dreams deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt b/forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt new file mode 100644 index 00000000000..a7fb21241d6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt @@ -0,0 +1,10 @@ +Name:Treacherous Blessing +ManaCost:2 B +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw three cards. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 3 +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever you cast a spell, you lose 1 life. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 1 +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When CARDNAME becomes the target of a spell or ability, sacrifice it. +SVar:TrigSac:DB$ Sacrifice | ValidCard$ Card.Self +Oracle:When Treacherous Blessing enters the battlefield, draw three cards.\nWhenever you cast a spell, you lose 1 life.\nWhen Treacherous Blessing becomes the target of a spell, sacrifice it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt b/forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt new file mode 100644 index 00000000000..f08a3fcde81 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt @@ -0,0 +1,8 @@ +Name:Treeshaker Chimera +ManaCost:5 G G +Types:Creature Chimera +PT:8/5 +K:All creatures able to block CARDNAME do so. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, draw three cards. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 3 +Oracle:All creatures able to block Treeshaker Chimera do so.\nWhen Treeshaker Chimera dies, draw three cards. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/triton_waverider.txt b/forge-gui/res/cardsfolder/upcoming/triton_waverider.txt new file mode 100644 index 00000000000..0a1b88e2216 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/triton_waverider.txt @@ -0,0 +1,7 @@ +Name:Triton Waverider +ManaCost:3 U +Types:Creature Merfolk Wizard +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, CARDNAME gets flying until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Flying +Oracle:Constellation - Whenever an enchantment enters the battlefield under your control, Triton Waverider gets flying until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt b/forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt new file mode 100644 index 00000000000..0a6acaae5a8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt @@ -0,0 +1,8 @@ +Name:Underworld Rage-Hound +ManaCost:1 R +Types:Creature Elemental Hound +PT:3/1 +K:CARDNAME attacks each combat if able. +K:Escape:3 R ExileFromGrave<3/Card.Other> +K:etbCounter:P1P1:1:ValidCard$ Card.Self+escaped:CARDNAME escapes with a +1/+1 counter on it. +Oracle:Underworld Rage-Hound attacks each combat if able.\nEscape — {3}{R}, Exile three other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nUnderworld Rage-Hound escapes with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt b/forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt new file mode 100755 index 00000000000..032b187caba --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt @@ -0,0 +1,9 @@ +Name:Underworld Sentinel +ManaCost:3 B B +Types:Creature Skeleton Soldier +PT:4/5 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, exile target creature card from your graveyard. +SVar:TrigExile:DB$ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | RememberChanged$ True +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, put all cards exiled with it onto the battlefield. +SVar:TrigReturn:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered+ExiledWithSource | Origin$ Exile | Destination$ Battlefield +Oracle:Whenever Underworld Sentinel attacks, exile target creature card from your graveyard.\nWhen Underworld Sentinel dies, put all cards exiled with it onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt b/forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt new file mode 100644 index 00000000000..1db65612c67 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt @@ -0,0 +1,8 @@ +Name:Venomous Hierophant +ManaCost:3 B +Types:Creature Gorgon Cleric +PT:3/3 +K:Deathtouch +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME enters the battlefield, put the top three cards of your library into your graveyard. +SVar:TrigMill:DB$Mill | NumCards$ 3 | Defined$ You +Oracle:Deathtouch\nWhen Venomous Hierophant enters the battlefield, put the top three cards of your library into your graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt b/forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt new file mode 100755 index 00000000000..f5e7564b017 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt @@ -0,0 +1,7 @@ +Name:Victory's Envoy +ManaCost:3 W W +Types:Creature Human Cleric +PT:3/3 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on each other creature you control. +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.Other+YouCtrl | CounterType$ P1P1 | CounterNum$ 1 +Oracle:At the beginning of your upkeep, put a +1/1 counter on each other creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt b/forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt new file mode 100644 index 00000000000..252dea34905 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt @@ -0,0 +1,7 @@ +Name:Voracious Typhon +ManaCost:2 G G +Types:Creature Snake Beast +PT:4/4 +K:Escape:5 G G ExileFromGrave<4/Card.Other> +K:etbCounter:P1P1:3:ValidCard$ Card.Self+escaped:CARDNAME escapes with three +1/+1 counters on it. +Oracle:Escape — {5}{G}{G}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nVoracious Typhon escapes with three +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt b/forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt new file mode 100644 index 00000000000..bca5082e950 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt @@ -0,0 +1,9 @@ +Name:Warbriar Blessing +ManaCost:1 G +Types:Enchantment Aura +K:Enchant creature you control +A:SP$ Attach | Cost$ 1 G | ValidTgts$ Creature.YouCtrl | AILogic$ Pump +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFight | TriggerDescription$ When CARDNAME enters the battlefield, enchanted creature fights up to one target creature you don't control. +SVar:TrigFight:DB$ Fight | Defined$ Enchanted | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose up to one target creature you don't control | TargetMin$ 0 | TargetMax$ 1 +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddToughness$ 2 | Description$ Enchanted creature gets +0/+2. +Oracle:Enchant creature you control\nWhen Warbriar Blessing enters the battlefield, enchanted creature fights up to one target creature you don't control\nEnchanted creature gets +0/+2. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt b/forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt new file mode 100644 index 00000000000..e23b79d2e6a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt @@ -0,0 +1,8 @@ +Name:Warden of the Chained +ManaCost:1 R G +Types:Creature Minotaur Warrior +PT:4/4 +K:Trample +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack. | CheckSVar$ X | SVarCompare$ EQ0 | Description$ CARDNAME can't attack unless you control another creature with power 4 or greater. +SVar:X:Count$Valid Creature.powerGE4+YouCtrl+Other +Oracle:Trample\nWarden of the Chained can't attack unless you control another creature with power 4 or greater. diff --git a/forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt b/forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt new file mode 100644 index 00000000000..a8e726206ad --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt @@ -0,0 +1,9 @@ +Name:Wolfwillow Haven +ManaCost:1 G +Types:Enchantment Aura +K:Enchant land +A:SP$ Attach | Cost$ 1 G | ValidTgts$ Land | AILogic$ Pump +T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted land is tapped for mana, its controller adds an additional {G}. +SVar:TrigMana:DB$ Mana | Produced$ G | Amount$ 1 | Defined$ TriggeredCardController +A:AB$ Token | Cost$ 4 G Sac<1/CARDNAME> | TokenAmount$ 1 | TokenScript$ g_2_2_wolf | TokenOwner$ You | LegacyImage$ g 2 2 wolf thb | PlayerTurn$ True | SpellDescription$ Create a 2/2 green Wolf creature token. Activate this ability only during your turn. +Oracle:Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional {G}.\n{4}{G},Sacrifice Wolfwillow Haven: Create a 2/2 green Wolf creature token. Activate this ability only during your turn. From c81f93551e0e324674f97bb6a55b04d605b144c9 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 23 Dec 2019 13:12:59 -0500 Subject: [PATCH 16/54] Contributor :) --- forge-gui/release-files/CONTRIBUTORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/release-files/CONTRIBUTORS.txt b/forge-gui/release-files/CONTRIBUTORS.txt index e8072d2e3d0..ffae9fb7a4b 100644 --- a/forge-gui/release-files/CONTRIBUTORS.txt +++ b/forge-gui/release-files/CONTRIBUTORS.txt @@ -19,6 +19,7 @@ mcrawford620 Meerkov Myrd nefigah +Northmoc OgreBattlecruiser pfps Ryan1729 From 074467e65eb2bea1863e54e854944d68137cffba Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 24 Dec 2019 09:24:30 -0500 Subject: [PATCH 17/54] Fix for issue #1219 --- forge-gui/res/cardsfolder/g/goblin_goon.txt | 6 +++--- forge-gui/res/cardsfolder/m/mogg_toady.txt | 6 +++--- forge-gui/res/cardsfolder/m/monstrous_hound.txt | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/goblin_goon.txt b/forge-gui/res/cardsfolder/g/goblin_goon.txt index 9e033694361..2f4ed831921 100644 --- a/forge-gui/res/cardsfolder/g/goblin_goon.txt +++ b/forge-gui/res/cardsfolder/g/goblin_goon.txt @@ -2,9 +2,9 @@ Name:Goblin Goon ManaCost:3 R Types:Creature Goblin Mutant PT:6/6 -S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ CARDNAME can't attack. & CARDNAME can't block. | CheckSVar$ X | SVarCompare$ LEY | Description$ CARDNAME can't attack unless you control more creatures than defending player. CARDNAME can't block unless you control more creatures than attacking player. +S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefender$ hasFewerCreaturesInPlayThanYou | Description$ CARDNAME can't attack unless you control more creatures than defending player. +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | CheckSVar$ Y | SVarCompare$ GEX | Description$ CARDNAME can't block unless you control more creatures than attacking player. SVar:X:Count$Valid Creature.YouCtrl -SVar:Y:Count$Valid Creature.YouDontCtrl +SVar:Y:Count$Valid Creature.ActivePlayerCtrl SVar:BuffedBy:Creature -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_goon.jpg Oracle:Goblin Goon can't attack unless you control more creatures than defending player.\nGoblin Goon can't block unless you control more creatures than attacking player. diff --git a/forge-gui/res/cardsfolder/m/mogg_toady.txt b/forge-gui/res/cardsfolder/m/mogg_toady.txt index dae4a3a2d08..708375ed69d 100644 --- a/forge-gui/res/cardsfolder/m/mogg_toady.txt +++ b/forge-gui/res/cardsfolder/m/mogg_toady.txt @@ -2,9 +2,9 @@ Name:Mogg Toady ManaCost:1 R Types:Creature Goblin PT:2/2 -S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ CARDNAME can't attack. & CARDNAME can't block. | CheckSVar$ X | SVarCompare$ LEY | References$ X,Y | Description$ CARDNAME can't attack unless you control more creatures than defending player.CARDNAME can't block unless you control more creatures than attacking player. +S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefender$ hasFewerCreaturesInPlayThanYou | Description$ CARDNAME can't attack unless you control more creatures than defending player. +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | CheckSVar$ Y | SVarCompare$ GEX | Description$ CARDNAME can't block unless you control more creatures than attacking player. SVar:X:Count$Valid Creature.YouCtrl -SVar:Y:Count$Valid Creature.YouDontCtrl +SVar:Y:Count$Valid Creature.ActivePlayerCtrl SVar:BuffedBy:Creature -SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_toady.jpg Oracle:Mogg Toady can't attack unless you control more creatures than defending player.\nMogg Toady can't block unless you control more creatures than attacking player. diff --git a/forge-gui/res/cardsfolder/m/monstrous_hound.txt b/forge-gui/res/cardsfolder/m/monstrous_hound.txt index 3f1660cd13e..1d1d9a05e88 100644 --- a/forge-gui/res/cardsfolder/m/monstrous_hound.txt +++ b/forge-gui/res/cardsfolder/m/monstrous_hound.txt @@ -2,8 +2,8 @@ Name:Monstrous Hound ManaCost:3 R Types:Creature Hound PT:4/4 -S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ CARDNAME can't attack. & CARDNAME can't block. | CheckSVar$ X | SVarCompare$ LEY | References$ X,Y | Description$ CARDNAME can't attack unless you control more lands than defending player. CARDNAME can't block unless you control more lands than attacking player. +S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefender$ hasFewerLandsInPlayThanYou | Description$ CARDNAME can’t attack unless you control more lands than defending player. +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | CheckSVar$ Y | SVarCompare$ GEX | Description$ CARDNAME can't block unless you control more lands than attacking player. SVar:X:Count$Valid Land.YouCtrl -SVar:Y:Count$Valid Land.YouDontCtrl -SVar:Picture:http://www.wizards.com/global/images/magic/general/monstrous_hound.jpg +SVar:Y:Count$Valid Land.ActivePlayerCtrl Oracle:Monstrous Hound can't attack unless you control more lands than defending player.\nMonstrous Hound can't block unless you control more lands than attacking player. From 15424d2feaad292025ab4dc4b4364972c0ebe2de Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 20 Dec 2019 12:30:18 +0800 Subject: [PATCH 18/54] translate "OK","No" --- .../src/main/java/forge/match/input/InputConfirm.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputConfirm.java b/forge-gui/src/main/java/forge/match/input/InputConfirm.java index 0d70400d207..33f8d2f665f 100644 --- a/forge-gui/src/main/java/forge/match/input/InputConfirm.java +++ b/forge-gui/src/main/java/forge/match/input/InputConfirm.java @@ -28,6 +28,7 @@ import forge.game.spellability.SpellAbility; import forge.model.FModel; import forge.player.PlayerControllerHuman; import forge.properties.ForgePreferences; +import forge.util.Localizer; /** *

@@ -49,7 +50,7 @@ public class InputConfirm extends InputSyncronizedBase { private CardView card; // simple interface to hide ugliness deciding how to confirm - protected static ImmutableList defaultOptions = ImmutableList.of("Yes", "No"); + protected static ImmutableList defaultOptions = ImmutableList.of(Localizer.getInstance().getMessage("lblYes"), Localizer.getInstance().getMessage("lblNo")); public static boolean confirm(final PlayerControllerHuman controller, final CardView card, final String message) { return InputConfirm.confirm(controller, card, message, true, defaultOptions); } @@ -86,7 +87,7 @@ public class InputConfirm extends InputSyncronizedBase { } public InputConfirm(final PlayerControllerHuman controller, String message0) { - this(controller, message0, "Yes", "No", true); + this(controller, message0, Localizer.getInstance().getMessage("lblYes"), Localizer.getInstance().getMessage("lblNo"), true); } public InputConfirm(final PlayerControllerHuman controller, String message0, String yesButtonText0, String noButtonText0) { @@ -105,7 +106,7 @@ public class InputConfirm extends InputSyncronizedBase { } public InputConfirm(final PlayerControllerHuman controller, String message0, SpellAbility sa0) { - this(controller, message0, "Yes", "No", true, sa0); + this(controller, message0, Localizer.getInstance().getMessage("lblYes"), Localizer.getInstance().getMessage("lblNo"), true, sa0); } public InputConfirm(final PlayerControllerHuman controller, String message0, String yesButtonText0, String noButtonText0, SpellAbility sa0) { @@ -124,7 +125,7 @@ public class InputConfirm extends InputSyncronizedBase { } public InputConfirm(final PlayerControllerHuman controller, String message0, CardView card0) { - this(controller, message0, "Yes", "No", true, card0); + this(controller, message0, Localizer.getInstance().getMessage("lblYes"), Localizer.getInstance().getMessage("lblNo"), true, card0); } public InputConfirm(final PlayerControllerHuman controller, String message0, String yesButtonText0, String noButtonText0, CardView card0) { From dae91de27ed59ff48324eb1072aa8fdf93d68eee Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 20 Dec 2019 12:31:32 +0800 Subject: [PATCH 19/54] translate "Select Order" --- .../src/main/java/forge/gui/DualListBox.java | 15 ++++++++------- .../src/forge/toolbox/DualListBox.java | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java b/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java index 02f7034d946..c76162a7aae 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java +++ b/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java @@ -37,6 +37,7 @@ import forge.toolbox.FList; import forge.toolbox.FPanel; import forge.toolbox.FScrollPane; import forge.view.FDialog; +import forge.util.Localizer; // An input box for handling the order of choices. // Left box has the original choices @@ -150,13 +151,13 @@ public class DualListBox extends FDialog { removeAllButton.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) { _removeAll(); } }); // Dual List Complete Buttons - okButton = new FButton("OK"); + okButton = new FButton(Localizer.getInstance().getMessage("lblOK")); okButton.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) { _finish(); } }); - autoButton = new FButton("Auto"); + autoButton = new FButton(Localizer.getInstance().getMessage("lblAuto")); autoButton.addActionListener(new ActionListener() {@Override public void actionPerformed(ActionEvent e) { _addAll(); _finish(); } }); final FPanel leftPanel = new FPanel(new BorderLayout()); - selectOrder = new FLabel.Builder().text("Select Order:").build(); + selectOrder = new FLabel.Builder().text(Localizer.getInstance().getMessage("lblSelectOrder") + ":").build(); leftPanel.add(selectOrder, BorderLayout.NORTH); leftPanel.add(new FScrollPane(sourceList, true), BorderLayout.CENTER); leftPanel.add(okButton, BorderLayout.SOUTH); @@ -265,8 +266,8 @@ public class DualListBox extends FDialog { addAllButton.setVisible(false); removeAllButton.setVisible(false); autoButton.setEnabled(false); - selectOrder.setText(String.format("Sideboard (%d):", sourceListModel.getSize())); - orderedLabel.setText(String.format("Main Deck (%d):", destListModel.getSize())); + selectOrder.setText(Localizer.getInstance().getMessage("lblSideboard") + String.format(" (%d):", sourceListModel.getSize())); + orderedLabel.setText(Localizer.getInstance().getMessage("ttMain") + String.format(" (%d):", destListModel.getSize())); } } @@ -487,8 +488,8 @@ public class DualListBox extends FDialog { if (sideboardingMode) { removeAllButton.setVisible(false); addAllButton.setVisible(false); - selectOrder.setText(String.format("Sideboard (%d):", sourceListModel.getSize())); - orderedLabel.setText(String.format("Main Deck (%d):", destListModel.getSize())); + selectOrder.setText(Localizer.getInstance().getMessage("lblSideboard") + String.format(" (%d):", sourceListModel.getSize())); + orderedLabel.setText(Localizer.getInstance().getMessage("ttMain") + String.format(" (%d):", destListModel.getSize())); } boolean anySize = targetRemainingSourcesMax < 0; diff --git a/forge-gui-mobile/src/forge/toolbox/DualListBox.java b/forge-gui-mobile/src/forge/toolbox/DualListBox.java index 8498e331e29..3f1693f28f0 100644 --- a/forge-gui-mobile/src/forge/toolbox/DualListBox.java +++ b/forge-gui-mobile/src/forge/toolbox/DualListBox.java @@ -123,7 +123,7 @@ public class DualListBox extends FDialog { } }); - selectOrder = add(new FLabel.Builder().align(Align.center).text("Select Order").build()); + selectOrder = add(new FLabel.Builder().align(Align.center).text(Localizer.getInstance().getMessage("lblSelectOrder")).build()); orderedLabel = add(new FLabel.Builder().align(Align.center).build()); setButtonState(); From 2e25c837757329ae5b890d327722ec4fc285d20c Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 20 Dec 2019 12:34:28 +0800 Subject: [PATCH 20/54] translate desktop AddBasicLandDialog.java --- .../forge/screens/deckeditor/AddBasicLandsDialog.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java index 5ee535771e8..923bdaee6ce 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java @@ -56,6 +56,7 @@ import forge.toolbox.FSkin; import forge.toolbox.FTextField; import forge.toolbox.FSkin.SkinnedPanel; import forge.view.arcane.CardPanel; +import forge.util.Localizer; import java.awt.event.MouseEvent; import java.util.Map; @@ -67,7 +68,7 @@ public class AddBasicLandsDialog { private static final int ADD_BTN_SIZE = 30; private static final int LAND_PANEL_PADDING = 3; - private final FComboBoxPanel cbLandSet = new FComboBoxPanel<>("Land Set:", FlowLayout.CENTER, Iterables.filter(StaticData.instance().getEditions(), CardEdition.Predicates.hasBasicLands)); + private final FComboBoxPanel cbLandSet = new FComboBoxPanel<>(Localizer.getInstance().getMessage("lblLandSet") + ":", FlowLayout.CENTER, Iterables.filter(StaticData.instance().getEditions(), CardEdition.Predicates.hasBasicLands)); private final MainPanel panel = new MainPanel(); private final LandPanel pnlPlains = new LandPanel("Plains"); @@ -123,7 +124,7 @@ public class AddBasicLandsDialog { updateDeckInfoLabel(); } }); - lblDeckInfo.setToolTipText("Deck statistics. Double click to auto-suggest basic lands."); + lblDeckInfo.setToolTipText(Localizer.getInstance().getMessage("lblDeckStatisticsAutoSuggest")); cbLandSet.addActionListener(new ActionListener() { @Override @@ -215,7 +216,7 @@ public class AddBasicLandsDialog { } public CardPool show() { - optionPane = new FOptionPane(null, "Add Basic Lands", null, panel, ImmutableList.of("OK", "Cancel"), 0); + optionPane = new FOptionPane(null, Localizer.getInstance().getMessage("lblAddBasicLands"), null, panel, ImmutableList.of(Localizer.getInstance().getMessage("lblOK"), Localizer.getInstance().getMessage("lblCancel")), 0); panel.revalidate(); panel.repaint(); optionPane.setVisible(true); @@ -382,9 +383,9 @@ public class AddBasicLandsDialog { if (landSet == null) { return; } int artChoiceCount = FModel.getMagicDb().getCommonCards().getArtCount(cardName, landSet.getCode()); - cbLandArt.addItem("Assorted Art"); + cbLandArt.addItem(Localizer.getInstance().getMessage("lblAssortedArt")); for (int i = 1; i <= artChoiceCount; i++) { - cbLandArt.addItem("Card Art " + i); + cbLandArt.addItem(Localizer.getInstance().getMessage("lblCardArt") + " " + i); } } From 19be99d106dfc338fd2a5216e7a7efccf4f96e45 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 20 Dec 2019 12:36:30 +0800 Subject: [PATCH 21/54] translate all confirmPayment message argument --- .../src/main/java/forge/player/HumanPlay.java | 63 ++++++++++--------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index bf9244ffd0c..26d3734bb17 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -29,6 +29,7 @@ import forge.util.Lang; import forge.util.TextUtil; import forge.util.collect.FCollectionView; import forge.util.gui.SGuiChoose; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -282,19 +283,19 @@ public class HumanPlay { String orString = prompt == null ? sourceAbility.getStackDescription().trim() : ""; if (!orString.isEmpty()) { if (sourceAbility.hasParam("UnlessSwitched")) { - orString = TextUtil.concatWithSpace(" (if you do:", orString, ")"); + orString = TextUtil.concatWithSpace(" (" + Localizer.getInstance().getMessage("lblIfYouDo") + ":", orString, ")"); } else { - orString = TextUtil.concatWithSpace(" (or:", orString, ")"); + orString = TextUtil.concatWithSpace(" (" + Localizer.getInstance().getMessage("lblOr") + ":", orString, ")"); } } if (parts.isEmpty() || (costPart.getAmount().equals("0") && parts.size() < 2)) { - return p.getController().confirmPayment(costPart, "Do you want to pay {0}?" + orString, sourceAbility); + return p.getController().confirmPayment(costPart, Localizer.getInstance().getMessage("lblDoYouWantPay") + " {0}?" + orString, sourceAbility); } // 0 mana costs were slipping through because CostPart.getAmount returns 1 else if (costPart instanceof CostPartMana && parts.size() < 2) { if (((CostPartMana) costPart).getManaToPay().isZero()) { - return p.getController().confirmPayment(costPart, "Do you want to pay {0}?" + orString, sourceAbility); + return p.getController().confirmPayment(costPart, Localizer.getInstance().getMessage("lblDoYouWantPay") + " {0}?" + orString, sourceAbility); } } @@ -311,7 +312,7 @@ public class HumanPlay { return false; } - if (!p.getController().confirmPayment(part, "Do you want to pay " + amount + " life?" + orString, sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantPay") + " " + amount + " " + Localizer.getInstance().getMessage("lblLife") + "?" + orString, sourceAbility)) { return false; } @@ -331,9 +332,9 @@ public class HumanPlay { return false; } - StringBuilder sb = new StringBuilder("Do you want to "); - sb.append(res.contains(p) ? "" : "let that player "); - sb.append("draw ").append(Lang.nounWithAmount(amount, " card")).append("?").append(orString); + StringBuilder sb = new StringBuilder(Localizer.getInstance().getMessage("lblDoyouWantTo") + " "); + sb.append(res.contains(p) ? "" : Localizer.getInstance().getMessage("lblLetThatPlayer") + " "); + sb.append(Localizer.getInstance().getMessage("lblDraw") + " ").append(Lang.nounWithAmount(amount, " " + Localizer.getInstance().getMessage("lblCard"))).append("?").append(orString); if (!p.getController().confirmPayment(part, sb.toString(), sourceAbility)) { return false; @@ -355,7 +356,7 @@ public class HumanPlay { String desc = part.toString(); desc = desc.substring(0, 1).toLowerCase() + desc.substring(1); - if (!p.getController().confirmPayment(part, "Do you want to "+ desc + "?" + orString, sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoyouWantTo") + " " + desc + "?" + orString, sourceAbility)) { return false; } PaymentDecision pd = part.accept(hcd); @@ -369,7 +370,7 @@ public class HumanPlay { final int amount = getAmountFromPart(part, source, sourceAbility); final CardCollectionView list = p.getCardsIn(ZoneType.Library); if (list.size() < amount) { return false; } - if (!p.getController().confirmPayment(part, "Do you want to mill " + amount + " card" + (amount == 1 ? "" : "s") + "?" + orString, sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lbllblDoYouWantMill") + " " + amount + " " + Localizer.getInstance().getMessage("lblCard") + (amount == 1 ? "" : "s") + "?" + orString, sourceAbility)) { return false; } CardCollectionView listmill = p.getCardsIn(ZoneType.Library, amount); @@ -377,7 +378,7 @@ public class HumanPlay { } else if (part instanceof CostFlipCoin) { final int amount = getAmountFromPart(part, source, sourceAbility); - if (!p.getController().confirmPayment(part, "Do you want to flip " + amount + " coin" + (amount == 1 ? "" : "s") + "?" + orString, sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantFlip") + " " + amount + " " + Localizer.getInstance().getMessage("lblCoin") + (amount == 1 ? "" : "s") + "?" + orString, sourceAbility)) { return false; } final int n = FlipCoinEffect.getFilpMultiplier(p); @@ -411,7 +412,7 @@ public class HumanPlay { } if (!mandatory) { - if (!p.getController().confirmPayment(part, "Do you want to remove " + Lang.nounWithAmount(amount, counterType.getName() + " counter") + " from " + source + "?",sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantRemove") + " " + Lang.nounWithAmount(amount, counterType.getName() + " " + Localizer.getInstance().getMessage("lblCounterOfPointer")) + " " + Localizer.getInstance().getMessage("lblFrom") + " " + source + "?",sourceAbility)) { return false; } } @@ -431,7 +432,7 @@ public class HumanPlay { if (allCounters < amount) { return false; } if (!mandatory) { - if (!p.getController().confirmPayment(part, "Do you want to remove counters from " + part.getDescriptiveType() + " ?",sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantRemoveCounters") + " " + part.getDescriptiveType() + " ?",sourceAbility)) { return false; } } @@ -447,7 +448,7 @@ public class HumanPlay { }); if (list.isEmpty()) { return false; } InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, 1, 1, list, sourceAbility); - inp.setMessage("Select a card to remove a counter"); + inp.setMessage(Localizer.getInstance().getMessage("lblSelectRemoveCounterCard")); inp.setCancelAllowed(true); inp.showAndWait(); if (inp.hasCancelled()) { @@ -462,7 +463,7 @@ public class HumanPlay { } } if (typeChoices.size() > 1) { - String cprompt = "Select type counters to remove"; + String cprompt = Localizer.getInstance().getMessage("lblSelectRemoveCounterType"); counterType = controller.getGui().one(cprompt, typeChoices); } else { @@ -477,7 +478,7 @@ public class HumanPlay { ZoneType from = ZoneType.Graveyard; if ("All".equals(part.getType())) { - if (!p.getController().confirmPayment(part, "Do you want to exile all cards in your graveyard?", sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantExileAllCardYouGraveyard"), sourceAbility)) { return false; } @@ -491,8 +492,8 @@ public class HumanPlay { return false; } if (from == ZoneType.Library) { - if (!p.getController().confirmPayment(part, "Do you want to exile " + nNeeded + - " card" + (nNeeded == 1 ? "" : "s") + " from your library?", sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantExile") + " " + nNeeded + + " " + Localizer.getInstance().getMessage("lblCard") + (nNeeded == 1 ? "" : "s") + " " + Localizer.getInstance().getMessage("lblFromYourLibrary"), sourceAbility)) { return false; } list = list.subList(0, nNeeded); @@ -501,7 +502,7 @@ public class HumanPlay { // replace this with input CardCollection newList = new CardCollection(); for (int i = 0; i < nNeeded; i++) { - final Card c = p.getGame().getCard(SGuiChoose.oneOrNone("Exile from " + from, CardView.getCollection(list))); + final Card c = p.getGame().getCard(SGuiChoose.oneOrNone(Localizer.getInstance().getMessage("lblExileFrom") + " " + from, CardView.getCollection(list))); if (c == null) { return false; } @@ -537,7 +538,7 @@ public class HumanPlay { payableZone.add(player); } } - Player chosen = controller.getGame().getPlayer(SGuiChoose.oneOrNone(TextUtil.concatNoSpace("Put cards from whose ", from.toString(), "?"), PlayerView.getCollection(payableZone))); + Player chosen = controller.getGame().getPlayer(SGuiChoose.oneOrNone(TextUtil.concatNoSpace(Localizer.getInstance().getMessage("lblPutCardFromWhose") + " ", from.toString(), "?"), PlayerView.getCollection(payableZone))); if (chosen == null) { return false; } @@ -549,7 +550,7 @@ public class HumanPlay { return false; } - final Card c = p.getGame().getCard(SGuiChoose.oneOrNone("Put cards to Library", CardView.getCollection(typeList))); + final Card c = p.getGame().getCard(SGuiChoose.oneOrNone(Localizer.getInstance().getMessage("lblPutCardToLibrary"), CardView.getCollection(typeList))); if (c != null) { typeList.remove(c); @@ -561,7 +562,7 @@ public class HumanPlay { } } else { // Tainted Specter, Gurzigost, etc. - boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "put into library." + orString); + boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblPutIntoLibrary") + orString); if (!hasPaid) { return false; } @@ -578,18 +579,18 @@ public class HumanPlay { else if (part instanceof CostGainControl) { int amount = Integer.parseInt(part.getAmount()); CardCollectionView list = CardLists.getValidCards(p.getGame().getCardsIn(ZoneType.Battlefield), part.getType(), p, source); - boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "gain control." + orString); + boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblGainControl") + orString); if (!hasPaid) { return false; } } else if (part instanceof CostReturn) { CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Battlefield), part.getType(), p, source); int amount = getAmountFromPartX(part, source, sourceAbility); - boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "return to hand." + orString); + boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblReturnToHand") + orString); if (!hasPaid) { return false; } } else if (part instanceof CostDiscard) { if ("Hand".equals(part.getType())) { - if (!p.getController().confirmPayment(part, "Do you want to discard your hand?", sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantDiscardYourHand"), sourceAbility)) { return false; } @@ -597,21 +598,21 @@ public class HumanPlay { } else { CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), part.getType(), p, source); int amount = getAmountFromPartX(part, source, sourceAbility); - boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "discard." + orString); + boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lbldiscard") + orString); if (!hasPaid) { return false; } } } else if (part instanceof CostReveal) { CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), part.getType(), p, source); int amount = getAmountFromPartX(part, source, sourceAbility); - boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "reveal." + orString); + boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblReveal") + orString); if (!hasPaid) { return false; } } else if (part instanceof CostTapType) { CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Battlefield), part.getType(), p, source); list = CardLists.filter(list, Presets.UNTAPPED); int amount = getAmountFromPartX(part, source, sourceAbility); - boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "tap." + orString); + boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblTap") + orString); if (!hasPaid) { return false; } } else if (part instanceof CostPartMana) { @@ -628,7 +629,7 @@ public class HumanPlay { } if (!mandatory) { - if (!p.getController().confirmPayment(part, "Do you want to spend " + Lang.nounWithAmount(amount, counterType.getName() + " counter") + "?",sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantSpend") + " " + Lang.nounWithAmount(amount, counterType.getName() + " " + Localizer.getInstance().getMessage("lblCounterOfPointer")) + "?",sourceAbility)) { return false; } } @@ -658,7 +659,7 @@ public class HumanPlay { } if (prompt == null) { - String promptCurrent = current == null ? "" : "Current Card: " + current; + String promptCurrent = current == null ? "" : Localizer.getInstance().getMessage("lblCurrentCard") + ": " + current; prompt = source + "\n" + promptCurrent; } @@ -674,7 +675,7 @@ public class HumanPlay { if (list.size() < amount) { return false; } // unable to pay (not enough cards) InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, amount, amount, list, sourceAbility); - inp.setMessage("Select %d " + cpl.getDescriptiveType() + " card(s) to " + actionName); + inp.setMessage(Localizer.getInstance().getMessage("lblSelectOfCardsTo") + " %d " + cpl.getDescriptiveType() + " " + Localizer.getInstance().getMessage("lblCardsTo") + " " + actionName); inp.setCancelAllowed(true); inp.showAndWait(); From 56fdf15b6ff2ab10ceb3bbe1b91306e3e88192df Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 20 Dec 2019 12:36:53 +0800 Subject: [PATCH 22/54] update translation --- forge-gui/res/languages/de-DE.properties | 37 +++++++++++++++++++++++- forge-gui/res/languages/en-US.properties | 37 +++++++++++++++++++++++- forge-gui/res/languages/es-ES.properties | 37 +++++++++++++++++++++++- forge-gui/res/languages/zh-CN.properties | 37 +++++++++++++++++++++++- 4 files changed, 144 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 6530e62f940..b7f7a125d9e 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1062,6 +1062,7 @@ lblSelect=Wähle %s #AddBasicLandsDialog.java lblLandSet=Länder aus Set lblAddBasicLandsAutoSuggest=Füge Standardländer zu %s hinzu.\n(Doppelklicke Statistik für Vorschlag) +lblDeckStatisticsAutoSuggest=Deck statistics. Double click to auto-suggest basic lands. lblAssortedArt=Div. Versionen lblCardArt=Karte Vers.%d lblNonLandCount=%d Nichtländer @@ -1525,4 +1526,38 @@ lblQuestStatistics=Quest Statistics lblWinner=Winner lblQuarterfinals=QUARTERFINALS lblSemifinals=SEMIFINALS -lblFinalMatch=FINAL MATCH \ No newline at end of file +lblFinalMatch=FINAL MATCH +#DualListBox.java +lblSelectOrder=Select Order +#HumanPlay.java +lblIfYouDo=if you do +lblOr=or +lblDoYouWantPay=Do you want to pay +lblDoyouWantTo=Do you want to +lblDoYouWantMill=Do you want to mill +lblDoYouWantFlip=Do you want to flip +lblDoYouWantRemove=Do you want to remove +lblDoYouWantRemoveCounters=Do you want to remove counters from +lblDoYouWantExile=Do you want to exile +lblDoYouWantExileAllCardYouGraveyard=Do you want to exile all cards in your graveyard? +lblDoYouWantDiscardYourHand=Do you want to discard your hand? +lblDoYouWantSpend=Do you want to spend +lblLetThatPlayer=let that player +lblCoin=coin +lblCounterOfPointer=counter +lblFrom=from +lblFromYourLibrary=from your library? +lblSelectRemoveCounterCard=Select a card to remove a counter +lblSelectRemoveCounterType=Select type counters to remove +lblExileFrom=Exile from +lblPutCardFromWhose=Put cards from whose +lblPutCardToLibrary=Put cards to Library +lblPutIntoLibrary=put into library. +lblGainControl=gain control. +lblReturnToHand=return to hand. +lbldiscard=discard. +lblReveal=reveal. +lblTap=tap. +lblCurrentCard=Current Card +lblSelectOfCardsTo=Select +lblCardsTo=card(s) to \ No newline at end of file diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 455f9c79f50..a5c3b65fdf3 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1062,6 +1062,7 @@ lblSelect=Select %s #AddBasicLandsDialog.java lblLandSet=Land Set lblAddBasicLandsAutoSuggest=Add Basic Lands to %s\n(double-tap statistics to auto-suggest) +lblDeckStatisticsAutoSuggest=Deck statistics. Double click to auto-suggest basic lands. lblAssortedArt=Assorted Art lblCardArt=Card Art %d lblNonLandCount=%d non-lands @@ -1525,4 +1526,38 @@ lblQuestStatistics=Quest Statistics lblWinner=Winner lblQuarterfinals=QUARTERFINALS lblSemifinals=SEMIFINALS -lblFinalMatch=FINAL MATCH \ No newline at end of file +lblFinalMatch=FINAL MATCH +#DualListBox.java +lblSelectOrder=Select Order +#HumanPlay.java +lblIfYouDo=if you do +lblOr=or +lblDoYouWantPay=Do you want to pay +lblDoyouWantTo=Do you want to +lblDoYouWantMill=Do you want to mill +lblDoYouWantFlip=Do you want to flip +lblDoYouWantRemove=Do you want to remove +lblDoYouWantRemoveCounters=Do you want to remove counters from +lblDoYouWantExile=Do you want to exile +lblDoYouWantExileAllCardYouGraveyard=Do you want to exile all cards in your graveyard? +lblDoYouWantDiscardYourHand=Do you want to discard your hand? +lblDoYouWantSpend=Do you want to spend +lblLetThatPlayer=let that player +lblCoin=coin +lblCounterOfPointer=counter +lblFrom=from +lblFromYourLibrary=from your library? +lblSelectRemoveCounterCard=Select a card to remove a counter +lblSelectRemoveCounterType=Select type counters to remove +lblExileFrom=Exile from +lblPutCardFromWhose=Put cards from whose +lblPutCardToLibrary=Put cards to Library +lblPutIntoLibrary=put into library. +lblGainControl=gain control. +lblReturnToHand=return to hand. +lbldiscard=discard. +lblReveal=reveal. +lblTap=tap. +lblCurrentCard=Current Card +lblSelectOfCardsTo=Select +lblCardsTo=card(s) to \ No newline at end of file diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 07f624976b1..e333ce3c909 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1062,6 +1062,7 @@ lblSelect=Seleccionar %s #AddBasicLandsDialog.java lblLandSet=Conjunto de Tierras lblAddBasicLandsAutoSuggest=Añadir Tierras Básicas a %s\n(para autosugerir toca dos veces en las estadísticas) +lblDeckStatisticsAutoSuggest=Deck statistics. Double click to auto-suggest basic lands. lblAssortedArt=Arte Variado lblCardArt=Arte de Carta %d lblNonLandCount=%d no tierras @@ -1525,4 +1526,38 @@ lblQuestStatistics=Quest Statistics lblWinner=Winner lblQuarterfinals=QUARTERFINALS lblSemifinals=SEMIFINALS -lblFinalMatch=FINAL MATCH \ No newline at end of file +lblFinalMatch=FINAL MATCH +#DualListBox.java +lblSelectOrder=Select Order +#HumanPlay.java +lblIfYouDo=if you do +lblOr=or +lblDoYouWantPay=Do you want to pay +lblDoyouWantTo=Do you want to +lblDoYouWantMill=Do you want to mill +lblDoYouWantFlip=Do you want to flip +lblDoYouWantRemove=Do you want to remove +lblDoYouWantRemoveCounters=Do you want to remove counters from +lblDoYouWantExile=Do you want to exile +lblDoYouWantExileAllCardYouGraveyard=Do you want to exile all cards in your graveyard? +lblDoYouWantDiscardYourHand=Do you want to discard your hand? +lblDoYouWantSpend=Do you want to spend +lblLetThatPlayer=let that player +lblCoin=coin +lblCounterOfPointer=counter +lblFrom=from +lblFromYourLibrary=from your library? +lblSelectRemoveCounterCard=Select a card to remove a counter +lblSelectRemoveCounterType=Select type counters to remove +lblExileFrom=Exile from +lblPutCardFromWhose=Put cards from whose +lblPutCardToLibrary=Put cards to Library +lblPutIntoLibrary=put into library. +lblGainControl=gain control. +lblReturnToHand=return to hand. +lbldiscard=discard. +lblReveal=reveal. +lblTap=tap. +lblCurrentCard=Current Card +lblSelectOfCardsTo=Select +lblCardsTo=card(s) to \ No newline at end of file diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index d383c0e8ce6..4af80bf244f 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1062,6 +1062,7 @@ lblSelect=选择%s #AddBasicLandsDialog.java lblLandSet=地牌的系列 lblAddBasicLandsAutoSuggest=添加基本地到%s\n(双击自动添加) +lblDeckStatisticsAutoSuggest=套牌统计。 双击自动添加基本地。 lblAssortedArt=各种画 lblCardArt=卡图%d lblNonLandCount=%d张非地牌 @@ -1525,4 +1526,38 @@ lblQuestStatistics=冒险统计 lblWinner=优胜者 lblQuarterfinals=四分之一决赛 lblSemifinals=半决赛 -lblFinalMatch=决赛 \ No newline at end of file +lblFinalMatch=决赛 +#DualListBox.java +lblSelectOrder=选择顺序 +#HumanPlay.java +lblIfYouDo=如果你 +lblOr=或 +lblDoYouWantPay=你想要支付 +lblDoyouWantTo=你想要 +lblDoYouWantMill=你想要磨 +lblDoYouWantFlip=你想要抛 +lblDoYouWantRemove=你想要移除 +lblDoYouWantRemoveCounters=你想要删除指示物从 +lblDoYouWantExile=你想要放逐 +lblDoYouWantExileAllCardYouGraveyard=你想要放逐坟场中的所有牌吗? +lblDoYouWantDiscardYourHand=你想要弃掉你的手牌吗? +lblDoYouWantSpend=你想要花费 +lblLetThatPlayer=让那个牌手 +lblCoin=硬币 +lblCounterOfPointer=指示物 +lblFrom=从 +lblFromYourLibrary=从你的牌库? +lblSelectRemoveCounterCard=选择一张牌删除指示物 +lblSelectRemoveCounterType=选择一个指示物类型删除 +lblExileFrom=放逐自 +lblPutCardFromWhose=谁放置牌 +lblPutCardToLibrary=将牌放入牌库 +lblPutIntoLibrary=放入牌库。 +lblGainControl=获得控制权。 +lblReturnToHand=返回手牌。 +lbldiscard=弃牌。 +lblReveal=展示。 +lblTap=横置。 +lblCurrentCard=当前牌 +lblSelectOfCardsTo=选择 +lblCardsTo=牌到 \ No newline at end of file From c44d91281edca07ece19265d308b2f8bbc462092 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Mon, 23 Dec 2019 22:53:38 +0800 Subject: [PATCH 23/54] translate ability/effects all interactive message(in Android because Chinese word wrap doesn't work,do not translate StackDescription for now) --- .../game/ability/effects/AbandonEffect.java | 3 +- .../effects/ActivateAbilityEffect.java | 3 +- .../game/ability/effects/AddTurnEffect.java | 3 +- .../game/ability/effects/AmassEffect.java | 3 +- .../ability/effects/AssignGroupEffect.java | 3 +- .../game/ability/effects/AttachEffect.java | 7 +- .../game/ability/effects/BidLifeEffect.java | 9 +- .../game/ability/effects/BondEffect.java | 3 +- .../effects/ChangeCombatantsEffect.java | 3 +- .../ability/effects/ChangeTargetsEffect.java | 3 +- .../ability/effects/ChangeTextEffect.java | 5 +- .../ability/effects/ChangeZoneAllEffect.java | 7 +- .../ability/effects/ChangeZoneEffect.java | 33 +-- .../ability/effects/ChooseCardEffect.java | 9 +- .../ability/effects/ChooseCardNameEffect.java | 8 +- .../ability/effects/ChooseColorEffect.java | 13 +- .../effects/ChooseDirectionEffect.java | 5 +- .../ability/effects/ChooseGenericEffect.java | 3 +- .../ability/effects/ChooseNumberEffect.java | 7 +- .../ability/effects/ChoosePlayerEffect.java | 3 +- .../ability/effects/ChooseSourceEffect.java | 3 +- .../game/ability/effects/ClashEffect.java | 9 +- .../game/ability/effects/CloneEffect.java | 5 +- .../effects/ControlExchangeVariantEffect.java | 5 +- .../ability/effects/ControlGainEffect.java | 3 +- .../ability/effects/CopyPermanentEffect.java | 11 +- .../effects/CopySpellAbilityEffect.java | 11 +- .../game/ability/effects/CounterEffect.java | 3 +- .../ability/effects/CountersMoveEffect.java | 22 +- .../effects/CountersProliferateEffect.java | 3 +- .../ability/effects/CountersPutEffect.java | 11 +- .../effects/CountersPutOrRemoveEffect.java | 5 +- .../ability/effects/CountersRemoveEffect.java | 13 +- .../ability/effects/DamageDealEffect.java | 3 +- .../forge/game/ability/effects/DigEffect.java | 27 ++- .../ability/effects/DigMultipleEffect.java | 7 +- .../game/ability/effects/DigUntilEffect.java | 5 +- .../game/ability/effects/DiscardEffect.java | 7 +- .../game/ability/effects/DrawEffect.java | 5 +- .../game/ability/effects/EncodeEffect.java | 7 +- .../game/ability/effects/ExploreEffect.java | 5 +- .../game/ability/effects/FlipCoinEffect.java | 7 +- .../game/ability/effects/LifeSetEffect.java | 3 +- .../game/ability/effects/ManaEffect.java | 13 +- .../ability/effects/ManaReflectedEffect.java | 9 +- .../game/ability/effects/ManifestEffect.java | 3 +- .../game/ability/effects/MeldEffect.java | 3 +- .../game/ability/effects/MillEffect.java | 3 +- .../ability/effects/MultiplePilesEffect.java | 3 +- .../ability/effects/PeekAndRevealEffect.java | 5 +- .../game/ability/effects/PlayEffect.java | 7 +- .../ability/effects/ProtectAllEffect.java | 3 +- .../game/ability/effects/ProtectEffect.java | 5 +- .../game/ability/effects/PumpEffect.java | 5 +- .../effects/RearrangeTopOfLibraryEffect.java | 3 +- .../effects/RemoveFromCombatEffect.java | 4 +- .../ability/effects/RepeatEachEffect.java | 5 +- .../game/ability/effects/RepeatEffect.java | 17 +- .../ability/effects/ReplaceDamageEffect.java | 2 +- .../effects/ReplaceSplitDamageEffect.java | 2 +- .../ability/effects/RevealHandEffect.java | 3 +- .../ability/effects/RollPlanarDiceEffect.java | 3 +- .../game/ability/effects/SacrificeEffect.java | 15 +- .../game/ability/effects/ScryEffect.java | 4 +- .../game/ability/effects/SetStateEffect.java | 3 +- .../game/ability/effects/ShuffleEffect.java | 3 +- .../game/ability/effects/SurveilEffect.java | 3 +- .../ability/effects/TapOrUntapAllEffect.java | 5 +- .../ability/effects/TapOrUntapEffect.java | 3 +- .../game/ability/effects/TokenEffect.java | 5 +- .../game/ability/effects/TwoPilesEffect.java | 9 +- .../game/ability/effects/UntapEffect.java | 3 +- .../game/ability/effects/VoteEffect.java | 7 +- .../ability/effects/ZoneExchangeEffect.java | 3 +- forge-gui/res/languages/de-DE.properties | 206 ++++++++++++++++- forge-gui/res/languages/en-US.properties | 206 ++++++++++++++++- forge-gui/res/languages/es-ES.properties | 206 ++++++++++++++++- forge-gui/res/languages/zh-CN.properties | 216 +++++++++++++++++- 78 files changed, 1096 insertions(+), 212 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java index b748ce2d4a5..b6bf52a8478 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java @@ -8,6 +8,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; +import forge.util.Localizer; import java.util.Map; @@ -23,7 +24,7 @@ public class AbandonEffect extends SpellAbilityEffect { Player controller = source.getController(); boolean isOptional = sa.hasParam("Optional"); - if (isOptional && !controller.getController().confirmAction(sa, null, "Would you like to abandon the scheme " + source + "?")) { + if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblWouldYoulikeAbandon") + " " + source + "?")) { return; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java index 3114cf48501..5975717f05f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java @@ -9,6 +9,7 @@ import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.collect.FCollection; import forge.util.Lang; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; @@ -51,7 +52,7 @@ public class ActivateAbilityEffect extends SpellAbilityEffect { continue; } SpellAbility manaAb = p.getController().chooseSingleSpellForEffect( - possibleAb, sa, "Choose a mana ability:", ImmutableMap.of()); + possibleAb, sa, Localizer.getInstance().getMessage("lblChooseManaAbility"), ImmutableMap.of()); p.getController().playChosenSpellAbility(manaAb); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java index aa211535156..9edf0d3ecbd 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java @@ -8,6 +8,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerHandler; +import forge.util.Localizer; import java.util.List; @@ -61,7 +62,7 @@ public class AddTurnEffect extends SpellAbilityEffect { extra.setCantSetSchemesInMotion(true); } if (sa.hasParam("ShowMessage")) { - p.getGame().getAction().nofityOfValue(sa, p, p + " takes an extra turn.", null); + p.getGame().getAction().nofityOfValue(sa, p, p + " " + Localizer.getInstance().getMessage("lblTakesExtraTurn"), null); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java index 960a0c38563..b7dd51336e9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AmassEffect.java @@ -17,6 +17,7 @@ import forge.game.player.PlayerController; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Lang; +import forge.util.Localizer; public class AmassEffect extends SpellAbilityEffect { @@ -80,7 +81,7 @@ public class AmassEffect extends SpellAbilityEffect { } CardCollectionView tgtCards = CardLists.getType(activator.getCardsIn(ZoneType.Battlefield), "Army"); - tgtCards = pc.chooseCardsForEffect(tgtCards, sa, "Choose an army to put counters on", 1, 1, false); + tgtCards = pc.chooseCardsForEffect(tgtCards, sa, Localizer.getInstance().getMessage("lblChooseAnArmy"), 1, 1, false); GameEntityCounterTable table = new GameEntityCounterTable(); for(final Card tgtCard : tgtCards) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java index e3e53dc6fa0..03a455900a3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java @@ -16,6 +16,7 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; +import forge.util.Localizer; public class AssignGroupEffect extends SpellAbilityEffect { @@ -49,7 +50,7 @@ public class AssignGroupEffect extends SpellAbilityEffect { Multimap result = ArrayListMultimap.create(); for (GameObject g : defined) { - final String title = "Choose ability for " + g.toString(); + final String title = Localizer.getInstance().getMessage("lblChooseAbilityFor") + " " + g.toString(); Map params = Maps.newHashMap(); params.put("Affected", g); diff --git a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java index 3e1b4f5e11d..78b1b475dd8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java @@ -16,6 +16,7 @@ import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.collect.FCollection; import forge.util.Lang; +import forge.util.Localizer; import java.util.List; @@ -60,7 +61,7 @@ public class AttachEffect extends SpellAbilityEffect { // If Cast Targets will be checked on the Stack for (final Card attachment : attachments) { - String message = "Do you want to attach " + attachment + " to " + attachTo + "?"; + String message = Localizer.getInstance().getMessage("lblDoYouWantAttach") + " " + attachment + " " + Localizer.getInstance().getMessage("lblTo") + " " + attachTo + "?"; if ( sa.hasParam("Optional") && !p.getController().confirmAction(sa, null, message) ) continue; handleAttachment(attachment, attachTo, sa); @@ -173,7 +174,7 @@ public class AttachEffect extends SpellAbilityEffect { players.add(player); } } - final Player pa = p.getController().chooseSingleEntityForEffect(players, aura, source + " - Select a player to attach to."); + final Player pa = p.getController().chooseSingleEntityForEffect(players, aura, source + " - " + Localizer.getInstance().getMessage("lblSelectAPlayerAttachTo")); if (pa != null) { handleAura(source, pa); return true; @@ -186,7 +187,7 @@ public class AttachEffect extends SpellAbilityEffect { return false; } - final Card o = p.getController().chooseSingleEntityForEffect(list, aura, source + " - Select a card to attach to."); + final Card o = p.getController().chooseSingleEntityForEffect(list, aura, source + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo")); if (o != null) { handleAura(source, o); //source.enchantEntity((Card) o); diff --git a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java index 36026b174dc..1468724219c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java @@ -11,6 +11,7 @@ import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.util.collect.FCollection; +import forge.util.Localizer; public class BidLifeEffect extends SpellAbilityEffect { @Override @@ -27,7 +28,7 @@ public class BidLifeEffect extends SpellAbilityEffect { if (sa.hasParam("StartBidding")) { String start = sa.getParam("StartBidding"); if ("Any".equals(start)) { - startBidding = activator.getController().announceRequirements(sa, "Choose a starting bid", true); + startBidding = activator.getController().announceRequirements(sa, Localizer.getInstance().getMessage("lblChooseStartingBid"), true); } else { startBidding = AbilityUtils.calculateAmount(host, start, sa); } @@ -54,12 +55,12 @@ public class BidLifeEffect extends SpellAbilityEffect { willBid = false; for (final Player p : bidPlayers) { final boolean result = p.getController().confirmBidAction(sa, PlayerActionConfirmMode.BidLife, - "Do you want to top bid? Current Bid =" + bid, bid, winner); + Localizer.getInstance().getMessage("lblDoYouWantTopBid") + bid, bid, winner); willBid |= result; if (result) { // a different choose number - bid += p.getController().chooseNumber(sa, "Bid life:", 1, 9); + bid += p.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblBidLife") + ":", 1, 9); winner = p; - host.getGame().getAction().nofityOfValue(sa, p, "topped bid with " + bid + " life", p); + host.getGame().getAction().nofityOfValue(sa, p, Localizer.getInstance().getMessage("lblTopBidWith") + " " + bid + " " + Localizer.getInstance().getMessage("lbllife"), p); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/BondEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BondEffect.java index 153e7ad749c..b41e6a265c5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BondEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BondEffect.java @@ -6,6 +6,7 @@ import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.Localizer; import java.util.List; @@ -30,7 +31,7 @@ public class BondEffect extends SpellAbilityEffect { Card partner = cards.getFirst(); // skip choice if only one card on list if (cards.size() > 1) { - partner = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(cards, sa, "Select a card to pair with"); + partner = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(cards, sa, Localizer.getInstance().getMessage("lblSelectACardPair")); } // pair choices together diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java index 6135aa48c18..5f82bd43f42 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java @@ -13,6 +13,7 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetRestrictions; import forge.util.collect.FCollectionView; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; @@ -44,7 +45,7 @@ public class ChangeCombatantsEffect extends SpellAbilityEffect { final GameEntity originalDefender = combat.getDefenderByAttacker(c); final FCollectionView defs = combat.getDefenders(); final GameEntity defender = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(defs, sa, - "Choose which defender to attack with " + c, false); + Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c, false); if (originalDefender != null && !originalDefender.equals(defender)) { AttackingBand ab = combat.getBandOfAttacker(c); if (ab != null) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java index 40a427fb5f5..ee8c24184ff 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java @@ -11,6 +11,7 @@ import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetChoices; import forge.game.zone.MagicStack; import forge.util.Aggregates; +import forge.util.Localizer; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -50,7 +51,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { // Redirect rules read 'you MAY choose new targets' ... okay! // TODO: Don't even ask to change targets, if the SA and subs don't actually have targets boolean isOptional = sa.hasParam("Optional"); - if (isOptional && !chooser.getController().confirmAction(sa, null, "Do you want to change targets of " + tgtSA.getHostCard() + "?")) { + if (isOptional && !chooser.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantChangeTargets") + " " + tgtSA.getHostCard() + "?")) { continue; } if (changesOneTarget) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java index 131eecbcff7..67e6773f08c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java @@ -14,6 +14,7 @@ import forge.game.card.Card; import forge.game.event.GameEventCardStatsChanged; import forge.game.spellability.SpellAbility; import forge.util.TextUtil; +import forge.util.Localizer; public class ChangeTextEffect extends SpellAbilityEffect { @@ -33,7 +34,7 @@ public class ChangeTextEffect extends SpellAbilityEffect { final String[] changedColorWordsArray = sa.getParam("ChangeColorWord").split(" "); if (changedColorWordsArray[0].equals("Choose")) { originalColor = sa.getActivatingPlayer().getController().chooseColor( - "Choose a color word to replace", sa, ColorSet.ALL_COLORS); + Localizer.getInstance().getMessage("lblChooseColorReplace"), sa, ColorSet.ALL_COLORS); changedColorWordOriginal = TextUtil.capitalize(MagicColor.toLongString(originalColor)); } else { changedColorWordOriginal = changedColorWordsArray[0]; @@ -48,7 +49,7 @@ public class ChangeTextEffect extends SpellAbilityEffect { possibleNewColors = ColorSet.fromMask(originalColor).inverse(); } final byte newColor = sa.getActivatingPlayer().getController().chooseColor( - "Choose a new color word", sa, possibleNewColors); + Localizer.getInstance().getMessage("lblChooseNewColor"), sa, possibleNewColors); changedColorWordNew = TextUtil.capitalize(MagicColor.toLongString(newColor)); } else { changedColorWordNew = changedColorWordsArray[1]; diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java index c636bfd9117..c14492ddc09 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java @@ -14,6 +14,7 @@ import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.util.Lang; import forge.util.TextUtil; +import forge.util.Localizer; import java.util.List; import java.util.Map; @@ -102,11 +103,11 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { } else { final StringBuilder sb = new StringBuilder(); - sb.append("Move "); + sb.append(Localizer.getInstance().getMessage("lblMove") + " "); sb.append(targets); - sb.append(" from "); + sb.append(" " + Localizer.getInstance().getMessage("lblFrom") + " "); sb.append(Lang.joinHomogenous(origin)); - sb.append(" to "); + sb.append(" " + Localizer.getInstance().getMessage("lblTo") + " "); sb.append(destination); sb.append("?"); 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 128c49d24a8..5bad714d73f 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 @@ -32,6 +32,7 @@ import forge.util.MessageUtil; import forge.util.TextUtil; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; +import forge.util.Localizer; import java.util.List; import java.util.Map; @@ -439,7 +440,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { hostCard.addRemembered(CardUtil.getLKICopy(tgtC)); } - final String prompt = TextUtil.concatWithSpace("Do you want to move", tgtC.toString(), "from", origin.toString(), "to", TextUtil.addSuffix(destination.toString(),"?")); + final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantMove"), tgtC.toString(), Localizer.getInstance().getMessage("lblFrom"), origin.toString(), Localizer.getInstance().getMessage("lblTo"), TextUtil.addSuffix(destination.toString(),"?")); if (optional && !player.getController().confirmAction(sa, null, prompt) ) continue; @@ -503,7 +504,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), tgtC.getController(), tgtC); } if (!list.isEmpty()) { - Card attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - Select a card to attach to."); + Card attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo")); tgtC.attachToEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal permanent it fails continue; @@ -513,7 +514,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (sa.hasParam("AttachedToPlayer")) { FCollectionView list = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("AttachedToPlayer"), sa); if (!list.isEmpty()) { - Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - Select a player to attach to."); + Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - " + Localizer.getInstance().getMessage("lblSelectAPlayerAttachTo")); tgtC.attachToEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal player it fails @@ -560,7 +561,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } } } else { - defender = player.getController().chooseSingleEntityForEffect(e, sa, "Declare a defender for " + movedCard ); + defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblDeclareDefenderFor") + " " + movedCard ); } if (defender != null) { combat.addAttacker(movedCard, defender); @@ -727,7 +728,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); sb.append(sa.getParam("AlternativeMessage")).append(" "); - sb.append(altFetchList.size()).append(" cards match your searching type in Alternate Zones."); + sb.append(altFetchList.size()).append(" " + Localizer.getInstance().getMessage("lblCardMatchSearchingTypeInAlternateZones")); if (!decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneFromAltSource, sb.toString())) { origin = alt; @@ -749,7 +750,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { final boolean optional = sa.hasParam("Optional"); if (optional) { - String message = MessageUtil.formatMessage(defined ? "Put that card from {player's} " + Lang.joinHomogenous(origin).toLowerCase() + " to " + destination.name().toLowerCase() : "Search {player's} " + Lang.joinHomogenous(origin).toLowerCase() + "?", decider, player); + String message = MessageUtil.formatMessage(defined ? Localizer.getInstance().getMessage("lblPutThatCardFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase() + " " + Localizer.getInstance().getMessage("lblTo") + " " + destination.name().toLowerCase() : Localizer.getInstance().getMessage("lblSearch") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase() + "?", decider, player); if (!decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneGeneral, message)) { return; } @@ -801,10 +802,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect { final int fetchNum = Math.min(player.getCardsIn(ZoneType.Library).size(), 4); CardCollectionView shown = !decider.hasKeyword("LimitSearchLibrary") ? player.getCardsIn(ZoneType.Library) : player.getCardsIn(ZoneType.Library, fetchNum); // Look at whole library before moving onto choosing a card - delayedReveal = new DelayedReveal(shown, ZoneType.Library, PlayerView.get(player), source.getName() + " - Looking at cards in "); + delayedReveal = new DelayedReveal(shown, ZoneType.Library, PlayerView.get(player), source.getName() + " - " + Localizer.getInstance().getMessage("lblLookingCardIn") + " "); } else if (origin.contains(ZoneType.Hand) && player.isOpponentOf(decider)) { - delayedReveal = new DelayedReveal(player.getCardsIn(ZoneType.Hand), ZoneType.Hand, PlayerView.get(player), source.getName() + " - Looking at cards in "); + delayedReveal = new DelayedReveal(player.getCardsIn(ZoneType.Hand), ZoneType.Hand, PlayerView.get(player), source.getName() + " - " + Localizer.getInstance().getMessage("lblLookingCardIn") + " "); } } @@ -821,7 +822,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { continue; } SpellAbility tgtSA = decider.getController().getAbilityToPlay(tgtCard, sas); - if (!decider.getController().confirmAction(tgtSA, null, "Do you want to play " + tgtCard + "?")) { + if (!decider.getController().confirmAction(tgtSA, null, Localizer.getInstance().getMessage("lblDoYouWantPlay") + " " + tgtCard + "?")) { continue; } // if played, that card cannot be found @@ -853,7 +854,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { final boolean champion = sa.hasParam("Champion"); final boolean forget = sa.hasParam("ForgetChanged"); final boolean imprint = sa.hasParam("Imprint"); - String selectPrompt = sa.hasParam("SelectPrompt") ? sa.getParam("SelectPrompt") : MessageUtil.formatMessage("Select a card from {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player); + String selectPrompt = sa.hasParam("SelectPrompt") ? sa.getParam("SelectPrompt") : MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player); final String totalcmc = sa.getParam("WithTotalCMC"); int totcmc = AbilityUtils.calculateAmount(source, totalcmc, sa); @@ -866,9 +867,9 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (! sa.hasParam("SelectPrompt")) { // new default messaging for multi select if (fetchList.size() > changeNum) { - selectPrompt = MessageUtil.formatMessage("Select up to " + changeNum + " cards from {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player); + selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectUpTo") + " " + changeNum + " " + Localizer.getInstance().getMessage("lblCardsFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player); } else { - selectPrompt = MessageUtil.formatMessage("Select cards from {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player); + selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardsFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player); } } // ensure that selection is within maximum allowed changeNum @@ -930,7 +931,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (c == null) { final int num = Math.min(fetchList.size(), changeNum - i); - String message = "Cancel Search? Up to " + num + " more card" + (num != 1 ? "s" : "") + " can be selected."; + String message = Localizer.getInstance().getMessage("lblCancelSearchUpTo") + " " + num + " " + Localizer.getInstance().getMessage("lblMoreCard") + (num != 1 ? "s" : "") + " " + Localizer.getInstance().getMessage("lblCanBeSelected"); if (fetchList.isEmpty() || decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneGeneral, message)) { break; @@ -1001,7 +1002,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (!list.isEmpty()) { Card attachedTo = null; if (list.size() > 1) { - attachedTo = decider.getController().chooseSingleEntityForEffect(list, sa, c + " - Select a card to attach to."); + attachedTo = decider.getController().chooseSingleEntityForEffect(list, sa, c + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo")); } else { attachedTo = list.get(0); @@ -1019,7 +1020,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (sa.hasParam("AttachedToPlayer")) { FCollectionView list = AbilityUtils.getDefinedPlayers(source, sa.getParam("AttachedToPlayer"), sa); if (!list.isEmpty()) { - Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, c + " - Select a player to attach to."); + Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, c + " - " + Localizer.getInstance().getMessage("lblSelectAPlayerAttachTo")); c.attachToEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal permanent it fails @@ -1042,7 +1043,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } } } else { - defender = player.getController().chooseSingleEntityForEffect(e, sa, "Declare a defender for " + c ); + defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblDeclareDefenderFor") + " " + c ); } if (defender != null) { combat.addAttacker(c, defender); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java index d87d9da4b85..020ba61fbbb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java @@ -18,6 +18,7 @@ import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.Aggregates; import forge.util.Lang; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; @@ -98,10 +99,10 @@ public class ChooseCardEffect extends SpellAbilityEffect { int chosenP = 0; while (!creature.isEmpty()) { Card c = p.getController().chooseSingleEntityForEffect(creature, sa, - "Select creature(s) with total power less than or equal to " + (totP - chosenP - negativeNum) - + "\r\n(Selected:" + chosenPool + ")\r\n" + "(Total Power: " + chosenP + ")", chosenP <= totP); + Localizer.getInstance().getMessage("lblSelectCreatureWithTotalPowerLessOrEqualTo") + " " + (totP - chosenP - negativeNum) + + "\r\n(" + Localizer.getInstance().getMessage("lblSelected") + ":" + chosenPool + ")\r\n(" + Localizer.getInstance().getMessage("lblTotalPower") + ": " + chosenP + ")", chosenP <= totP); if (c == null) { - if (p.getController().confirmAction(sa, PlayerActionConfirmMode.OptionalChoose, "Cancel Choose?")) { + if (p.getController().confirmAction(sa, PlayerActionConfirmMode.OptionalChoose, Localizer.getInstance().getMessage("lblCancelChooseConfirm"))) { break; } } else { @@ -118,7 +119,7 @@ public class ChooseCardEffect extends SpellAbilityEffect { if (sa.hasParam("AtRandom") && !choices.isEmpty()) { Aggregates.random(choices, validAmount, chosen); } else { - String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a card "; + String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " "; chosen.addAll(p.getController().chooseCardsForEffect(choices, sa, title, minAmount, validAmount, !sa.hasParam("Mandatory"))); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java index 4938ecb370e..dd72c9835ea 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java @@ -22,6 +22,7 @@ import forge.game.spellability.TargetRestrictions; import forge.item.PaperCard; import forge.util.Aggregates; import forge.util.ComparableOp; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; @@ -99,10 +100,11 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { } } Collections.sort(faces); - chosen = p.getController().chooseCardName(sa, faces, "Choose a card name"); + chosen = p.getController().chooseCardName(sa, faces, Localizer.getInstance().getMessage("lblChooseACardName")); } else { // use CardFace because you might name a alternate name - final String message = validDesc.equals("card") ? "Name a card" : "Name a " + validDesc + " card."; + //"name a card" in mtg card oracle text is "choose a card name",change text + final String message = validDesc.equals("card") ? Localizer.getInstance().getMessage("lblChooseACardName") : Localizer.getInstance().getMessage("lblChooseA") + validDesc + Localizer.getInstance().getMessage("lblCardName") + "."; Predicate cpp = Predicates.alwaysTrue(); if (sa.hasParam("ValidCards")) { @@ -114,7 +116,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { host.setNamedCard(chosen); if(!randomChoice) { - p.getGame().getAction().nofityOfValue(sa, host, p.getName() + " picked " + chosen, p); + p.getGame().getAction().nofityOfValue(sa, host, p.getName() + " " + Localizer.getInstance().getMessage("lblPicked") + " " + chosen, p); p.setNamedCard(chosen); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java index 7b7a0f2740c..8d91adfaaaa 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java @@ -7,6 +7,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.util.Lang; +import forge.util.Localizer; import java.util.ArrayList; import java.util.Arrays; @@ -51,25 +52,25 @@ public class ChooseColorEffect extends SpellAbilityEffect { int cntMax = sa.hasParam("TwoColors") ? 2 : sa.hasParam("OrColors") ? colorChoices.size() : 1; String prompt; if (cntMax == 1) { - prompt = "Choose a color"; + prompt = Localizer.getInstance().getMessage("lblChooseAColor"); } else { - prompt = "Choose " + Lang.getNumeral(cntMin); + prompt = Localizer.getInstance().getMessage("lblChoose") + " " + Lang.getNumeral(cntMin); if (cntMax > cntMin) { if (cntMax >= MagicColor.NUMBER_OR_COLORS) { - prompt += " or more"; + prompt += " " + Localizer.getInstance().getMessage("lblOrMore"); } else { - prompt += " to " + Lang.getNumeral(cntMax); + prompt += " " + Localizer.getInstance().getMessage("lblTo") + " " + Lang.getNumeral(cntMax); } } - prompt += " colors"; + prompt += " " + Localizer.getInstance().getMessage("lblColors"); } chosenColors = p.getController().chooseColors(prompt, sa, cntMin, cntMax, colorChoices); if (chosenColors.isEmpty()) { return; } card.setChosenColors(chosenColors); - p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " picked " + Lang.joinHomogenous(chosenColors), p); + p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " " + Localizer.getInstance().getMessage("lblPicked") + " " + Lang.joinHomogenous(chosenColors), p); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java index 3c0dac6f8a1..a02bf0206e9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java @@ -10,6 +10,7 @@ import forge.game.player.Player; import forge.game.player.PlayerController.BinaryChoiceType; import forge.game.spellability.SpellAbility; import forge.util.collect.FCollection; +import forge.util.Localizer; public class ChooseDirectionEffect extends SpellAbilityEffect { @Override @@ -18,11 +19,11 @@ public class ChooseDirectionEffect extends SpellAbilityEffect { final Game game = source.getGame(); final FCollection left = new FCollection<>(game.getPlayers()); // TODO: We'd better set up turn order UI here - final String info = "Left (clockwise): " + left + "\r\nRight (anticlockwise):" + Lists.reverse(left); + final String info = Localizer.getInstance().getMessage("lblLeftClockwise") + ": " + left + "\r\n" + Localizer.getInstance().getMessage("lblRightAntiClockwise") + ":" + Lists.reverse(left); sa.getActivatingPlayer().getController().notifyOfValue(sa, source, info); boolean chosen = sa.getActivatingPlayer().getController().chooseBinary(sa, - "Choose a direction", BinaryChoiceType.LeftOrRight); + Localizer.getInstance().getMessage("lblChooseDirection"), BinaryChoiceType.LeftOrRight); source.setChosenDirection(chosen ? Direction.Left : Direction.Right); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java index 9073e1a9342..c5a46346887 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java @@ -9,6 +9,7 @@ import forge.game.event.GameEventCardModeChosen; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.MyRandom; +import forge.util.Localizer; import java.util.List; @@ -69,7 +70,7 @@ public class ChooseGenericEffect extends SpellAbilityEffect { int idxChosen = MyRandom.getRandom().nextInt(abilities.size()); chosenSA = abilities.get(idxChosen); } else { - chosenSA = p.getController().chooseSingleSpellForEffect(abilities, sa, "Choose one", + chosenSA = p.getController().chooseSingleSpellForEffect(abilities, sa, Localizer.getInstance().getMessage("lblChooseOne"), ImmutableMap.of()); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java index ce31edd85ad..63e5ae38259 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java @@ -10,6 +10,7 @@ import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.util.MyRandom; +import forge.util.Localizer; import java.util.List; import java.util.Map; @@ -57,7 +58,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect { chosen = MyRandom.getRandom().nextInt(max - min) + min; p.getGame().getAction().nofityOfValue(sa, p, Integer.toString(chosen), null); } else { - String title = sa.hasParam("ListTitle") ? sa.getParam("ListTitle") : "Choose a number"; + String title = sa.hasParam("ListTitle") ? sa.getParam("ListTitle") : Localizer.getInstance().getMessage("lblChooseNumber"); if (anyNumber) { Integer value = p.getController().announceRequirements(sa, title, true); chosen = (value == null ? 0 : value); @@ -72,7 +73,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect { card.setChosenNumber(chosen); } if (sa.hasParam("Notify")) { - p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " picked " + chosen, p); + p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " " + Localizer.getInstance().getMessage("lblPicked") + " " + chosen, p); } } } @@ -85,7 +86,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect { for (Entry ev : chooseMap.entrySet()) { int num = ev.getValue(); Player player = ev.getKey(); - sb.append(player).append(" chose ").append(num); + sb.append(player).append(" " + Localizer.getInstance().getMessage("lblChose") + " ").append(num); sb.append("\r\n"); if (num > highest) { highestNum.clear(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java index eddc7475bcc..0d57e4a4c2c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java @@ -9,6 +9,7 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.util.Aggregates; import forge.util.collect.FCollectionView; +import forge.util.Localizer; import java.util.List; @@ -37,7 +38,7 @@ public class ChoosePlayerEffect extends SpellAbilityEffect { final FCollectionView choices = sa.hasParam("Choices") ? AbilityUtils.getDefinedPlayers( sa.getHostCard(), sa.getParam("Choices"), sa) : sa.getActivatingPlayer().getGame().getPlayersInTurnOrder(); - final String choiceDesc = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a player"; + final String choiceDesc = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChoosePlayer"); final boolean random = sa.hasParam("Random"); for (final Player p : tgtPlayers) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java index 465f37bb92c..b35e17c0a25 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java @@ -12,6 +12,7 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; @@ -134,7 +135,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect { final CardCollection chosen = new CardCollection(); if (tgt == null || p.canBeTargetedBy(sa)) { for (int i = 0; i < validAmount; i++) { - final String choiceTitle = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a source "; + final String choiceTitle = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseSource") + " "; Card o = null; do { o = p.getController().chooseSingleEntityForEffect(sourcesToChooseFrom, sa, choiceTitle); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java index 332d0ced088..191b1db43e9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java @@ -12,6 +12,7 @@ import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; +import forge.util.Localizer; import java.util.Map; @@ -74,7 +75,7 @@ public class ClashEffect extends SpellAbilityEffect { */ final Card source = sa.getHostCard(); final Player player = source.getController(); - final Player opponent = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(player.getOpponents(), sa, "Choose a opponent") ; + final Player opponent = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(player.getOpponents(), sa, Localizer.getInstance().getMessage("lblChooseOpponent")) ; final ZoneType lib = ZoneType.Library; if (sa.hasParam("RememberClasher")) { @@ -110,11 +111,11 @@ public class ClashEffect extends SpellAbilityEffect { // TODO: Split cards will return two CMC values, so both players may become winners of clash - reveal.append(player).append(" reveals: ").append(pCard.getName()).append(". CMC = ").append(pCMC); + reveal.append(player).append(" " + Localizer.getInstance().getMessage("lblReveals") + ": ").append(pCard.getName()).append(". " + Localizer.getInstance().getMessage("lblCMC") + "= ").append(pCMC); reveal.append("\r\n"); - reveal.append(opponent).append(" reveals: ").append(oCard.getName()).append(". CMC = ").append(oCMC); + reveal.append(opponent).append(" " + Localizer.getInstance().getMessage("lblReveals") + ": ").append(oCard.getName()).append(". " + Localizer.getInstance().getMessage("lblCMC") + "= ").append(oCMC); reveal.append("\r\n\r\n"); - reveal.append(player).append(pCMC > oCMC ? " wins clash." : " loses clash."); + reveal.append(player).append(pCMC > oCMC ? " " + Localizer.getInstance().getMessage("lblWinsClash") + "." : " " + Localizer.getInstance().getMessage("lblLosesClash") + "."); player.getGame().getAction().nofityOfValue(sa, source, reveal.toString(), null); clashMoveToTopOrBottom(player, pCard, sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index 5ca1a765d2f..a06f15dbec5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -9,6 +9,7 @@ import forge.game.event.GameEventCardStatsChanged; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.Localizer; import java.util.Arrays; import java.util.List; @@ -78,7 +79,7 @@ public class CloneEffect extends SpellAbilityEffect { choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host); - String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a card "; + String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " "; cardToCopy = activator.getController().chooseSingleEntityForEffect(choices, sa, title, false); } else if (sa.hasParam("Defined")) { List cloneSources = AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa); @@ -93,7 +94,7 @@ public class CloneEffect extends SpellAbilityEffect { } final boolean optional = sa.hasParam("Optional"); - if (optional && !host.getController().getController().confirmAction(sa, null, "Do you want to copy " + cardToCopy + "?")) { + if (optional && !host.getController().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantCopy") + " " + cardToCopy + "?")) { return; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeVariantEffect.java index 3ed40b451ec..f39c38616d8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeVariantEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeVariantEffect.java @@ -7,6 +7,7 @@ import forge.game.card.CardCollectionView; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.Localizer; import java.util.List; @@ -35,9 +36,9 @@ public class ControlExchangeVariantEffect extends SpellAbilityEffect { CardCollectionView list2 = AbilityUtils.filterListByType(player2.getCardsIn(zone), type, sa); int max = Math.min(list1.size(), list2.size()); // choose the same number of cards - CardCollectionView chosen1 = activator.getController().chooseCardsForEffect(list1, sa, "Choose cards: " + player1, 0, max, true); + CardCollectionView chosen1 = activator.getController().chooseCardsForEffect(list1, sa, Localizer.getInstance().getMessage("lblChooseCards") + ":" + player1, 0, max, true); int num = chosen1.size(); - CardCollectionView chosen2 = activator.getController().chooseCardsForEffect(list2, sa, "Choose cards: " + player2, num, num, true); + CardCollectionView chosen2 = activator.getController().chooseCardsForEffect(list2, sa, Localizer.getInstance().getMessage("lblChooseCards") + ":" + player2, num, num, true); // check all cards can be controlled by the other player for (final Card c : chosen1) { if (!c.canBeControlledBy(player2)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index ec26b621f1d..74ce08933ea 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -22,6 +22,7 @@ import forge.game.spellability.Ability; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.collect.FCollectionView; +import forge.util.Localizer; public class ControlGainEffect extends SpellAbilityEffect { /* (non-Javadoc) @@ -227,7 +228,7 @@ public class ControlGainEffect extends SpellAbilityEffect { final FCollectionView e = combat.getDefenders(); final GameEntity defender = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(e, sa, - "Declare a defender for " + tgtC); + Localizer.getInstance().getMessage("lblDeclareDefenderFor") + " " + tgtC); if (defender != null) { combat.addAttacker(tgtC, defender); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index d544b9a21fc..ef0cabec2e8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -27,6 +27,7 @@ import forge.util.Aggregates; import forge.util.TextUtil; import forge.util.collect.FCollectionView; import forge.util.PredicateString.StringOp; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; @@ -64,7 +65,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect { final long timestamp = game.getNextTimestamp(); if (sa.hasParam("Optional")) { - if (!activator.getController().confirmAction(sa, null, "Copy this permanent?")) { + if (!activator.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblCopyPermanentConfirm"))) { return; } } @@ -145,7 +146,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect { CardCollectionView choices = game.getCardsIn(ZoneType.Battlefield); choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host); if (!choices.isEmpty()) { - String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a card "; + String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") +" "; Card choosen = chooser.getController().chooseSingleEntityForEffect(choices, sa, title, false); @@ -206,12 +207,12 @@ public class CopyPermanentEffect extends SpellAbilityEffect { GameEntity defender; if ("True".equals(attacked)) { FCollectionView defs = game.getCombat().getDefenders(); - defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, "Choose which defender to attack with " + c, false); + defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c, false); } else { defender = AbilityUtils.getDefinedPlayers(host, sa.getParam("CopyAttacking"), sa).get(0); if (sa.hasParam("ChoosePlayerOrPlaneswalker") && defender != null) { FCollectionView defs = game.getCombat().getDefendersControlledBy((Player) defender); - defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, "Choose which defender to attack with " + c + " {defender: "+ defender + "}", false); + defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c + " {" + Localizer.getInstance().getMessage("lblDefender") + ": " + defender + "}", false); } } game.getCombat().addAttacker(copyInPlay, defender); @@ -243,7 +244,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect { list = CardLists.getValidCards(list, sa.getParam("AttachedTo"), copyInPlay.getController(), copyInPlay); } if (!list.isEmpty()) { - Card attachedTo = activator.getController().chooseSingleEntityForEffect(list, sa, copyInPlay + " - Select a card to attach to."); + Card attachedTo = activator.getController().chooseSingleEntityForEffect(list, sa, copyInPlay + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo")); copyInPlay.attachToEntity(attachedTo); } else { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java index a1db15665f8..2e5288996f0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java @@ -15,6 +15,7 @@ import forge.game.player.Player; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.util.Lang; +import forge.util.Localizer; import java.util.ArrayList; import java.util.Iterator; @@ -66,7 +67,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { } boolean isOptional = sa.hasParam("Optional"); - if (isOptional && !controller.getController().confirmAction(sa, null, "Do you want to copy the spell " + card + "?")) { + if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantCopyTheSpell") + " " + card + "?")) { return; } @@ -84,7 +85,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { final int spellCount = Integer.parseInt(sa.getParam("CopyMultipleSpells")); for (int multi = 0; multi < spellCount && !tgtSpells.isEmpty(); multi++) { - String prompt = "Select " + Lang.getOrdinal(multi + 1) + " spell to copy to stack"; + String prompt = Localizer.getInstance().getMessage("lblSelectMultiSpellCopyToStack").replace("%d", Lang.getOrdinal(multi + 1)); SpellAbility chosen = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa, prompt, ImmutableMap.of()); SpellAbility copiedSpell = CardFactory.copySpellAbilityAndPossiblyHost(card, chosen.getHostCard(), chosen, true); @@ -96,7 +97,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { } else if (sa.hasParam("CopyForEachCanTarget")) { SpellAbility chosenSA = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa, - "Select a spell to copy", ImmutableMap.of()); + Localizer.getInstance().getMessage("lblSelectASpellCopy"), ImmutableMap.of()); chosenSA.setActivatingPlayer(controller); // Find subability or rootability that has targets SpellAbility targetedSA = chosenSA; @@ -144,7 +145,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { valid.remove(originalTarget); mayChooseNewTargets = false; if (sa.hasParam("ChooseOnlyOne")) { - Card choice = controller.getController().chooseSingleEntityForEffect(valid, sa, "Choose one"); + Card choice = controller.getController().chooseSingleEntityForEffect(valid, sa, Localizer.getInstance().getMessage("lblChooseOne")); SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(card, chosenSA.getHostCard(), chosenSA, true); resetFirstTargetOnCopy(copy, choice, targetedSA); copies.add(copy); @@ -164,7 +165,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { } else { SpellAbility chosenSA = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa, - "Select a spell to copy", ImmutableMap.of()); + Localizer.getInstance().getMessage("lblSelectASpellCopy"), ImmutableMap.of()); chosenSA.setActivatingPlayer(controller); for (int i = 0; i < amount; i++) { SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost( diff --git a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java index f82231f20b4..1ddeb41db0d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java @@ -12,6 +12,7 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.SpellPermanent; import forge.game.trigger.TriggerType; +import forge.util.Localizer; import java.util.Arrays; import java.util.List; @@ -174,7 +175,7 @@ public class CounterEffect extends SpellAbilityEffect { String destination = srcSA.hasParam("Destination") ? srcSA.getParam("Destination") : tgtSA.isAftermath() ? "Exile" : "Graveyard"; if (srcSA.hasParam("DestinationChoice")) {//Hinder List pos = Arrays.asList(srcSA.getParam("DestinationChoice").split(",")); - destination = srcSA.getActivatingPlayer().getController().chooseSomeType("a destination to remove", tgtSA, pos, null); + destination = srcSA.getActivatingPlayer().getController().chooseSomeType(Localizer.getInstance().getMessage("lblRemoveDestination"), tgtSA, pos, null); } if (tgtSA.isAbility()) { // For Ability-targeted counterspells - do not move it anywhere, diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java index 8e1a82e0d1e..d01f55be7ef 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java @@ -12,6 +12,7 @@ import forge.game.player.Player; import forge.game.player.PlayerController; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.Localizer; import java.util.List; import java.util.Map; @@ -110,7 +111,8 @@ public class CountersMoveEffect extends SpellAbilityEffect { // only select cards if the counterNum is any if (counterNum.equals("Any")) { StringBuilder sb = new StringBuilder(); - sb.append("Choose cards to take ").append(cType.getName()).append(" counters from"); + + sb.append(Localizer.getInstance().getMessage("lblChooseTakeCountersCard").replace("%s", cType.getName())); srcCards = player.getController().chooseCardsForEffect(srcCards, sa, sb.toString(), 0, srcCards.size(), true); } @@ -135,8 +137,8 @@ public class CountersMoveEffect extends SpellAbilityEffect { params.put("Source", src); params.put("Target", dest); StringBuilder sb = new StringBuilder(); - sb.append("Take how many ").append(cType.getName()); - sb.append(" counters from ").append(src).append("?"); + sb.append(Localizer.getInstance().getMessage("lblTakeHowMany") + " ").append(cType.getName()); + sb.append(" " + Localizer.getInstance().getMessage("lblCountersFrom") + " ").append(src).append("?"); cnum = player.getController().chooseNumber(sa, sb.toString(), 0, cmax, params); } else { cnum = AbilityUtils.calculateAmount(host, counterNum, sa); @@ -172,8 +174,8 @@ public class CountersMoveEffect extends SpellAbilityEffect { if (counterNum.equals("Any")) { StringBuilder sb = new StringBuilder(); - sb.append("Choose cards to get ").append(cType.getName()); - sb.append(" counters from ").append(source).append("."); + sb.append(Localizer.getInstance().getMessage("lblChooseCardToGet") + " ").append(cType.getName()); + sb.append(" " + Localizer.getInstance().getMessage("lblCountersFrom") + " ").append(source).append("."); tgtCards = player.getController().chooseCardsForEffect( tgtCards, sa, sb.toString(), 0, tgtCards.size(), true); @@ -201,7 +203,7 @@ public class CountersMoveEffect extends SpellAbilityEffect { params.put("Source", source); params.put("Target", cur); StringBuilder sb = new StringBuilder(); - sb.append("Put how many ").append(cType.getName()).append(" counters on ").append(cur).append("?"); + sb.append(Localizer.getInstance().getMessage("lblPutHowMany") + " ").append(cType.getName()).append(" " + Localizer.getInstance().getMessage("lblCountersOn") + " ").append(cur).append("?"); int cnum = player.getController().chooseNumber(sa, sb.toString(), 0, source.getCounters(cType), params); if (cnum > 0) { @@ -261,8 +263,8 @@ public class CountersMoveEffect extends SpellAbilityEffect { params.put("Source", source); params.put("Target", cur); StringBuilder sb = new StringBuilder(); - sb.append("Take how many ").append(cType.getName()); - sb.append(" counters from ").append(source).append("?"); + sb.append(Localizer.getInstance().getMessage("lblTakeHowMany") + " ").append(cType.getName()); + sb.append(" " + Localizer.getInstance().getMessage("lblCountersFrom") + " ").append(source).append("?"); cntToMove = pc.chooseNumber(sa, sb.toString(), 0, cntToMove, params); } @@ -289,7 +291,7 @@ public class CountersMoveEffect extends SpellAbilityEffect { Map params = Maps.newHashMap(); params.put("Source", source); params.put("Target", dest); - String title = "Select type counters to remove"; + String title = Localizer.getInstance().getMessage("lblSelectRemoveCounterType"); CounterType chosenType = pc.chooseCounterType(typeChoices, sa, title, params); params = Maps.newHashMap(); @@ -297,7 +299,7 @@ public class CountersMoveEffect extends SpellAbilityEffect { params.put("Source", source); params.put("Target", dest); StringBuilder sb = new StringBuilder(); - sb.append("Take how many ").append(chosenType.getName()).append(" counters?"); + sb.append(Localizer.getInstance().getMessage("lblTakeHowMany") + " ").append(chosenType.getName()).append(" " + Localizer.getInstance().getMessage("lblCounters") + "?"); int chosenAmount = pc.chooseNumber( sa, sb.toString(), 0, Math.min(tgtCounters.get(chosenType), cntToMove), params); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java index 5f6d56a5218..587cc53995c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java @@ -14,6 +14,7 @@ import forge.game.player.PlayerPredicates; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.collect.FCollection; +import forge.util.Localizer; import java.util.List; @@ -42,7 +43,7 @@ public class CountersProliferateEffect extends SpellAbilityEffect { list.addAll(CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.hasCounters())); List result = pc.chooseEntitiesForEffect(list, 0, list.size(), null, sa, - "Choose any number of permanents and/or players for proliferate", p); + Localizer.getInstance().getMessage("lblChooseProliferateTarget"), p); GameEntityCounterTable table = new GameEntityCounterTable(); for (final GameEntity ge : result) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 607e12f3593..bdb4eb95f3c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -26,6 +26,7 @@ import forge.game.trigger.TriggerType; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.util.Aggregates; +import forge.util.Localizer; import java.util.Map; import java.util.Iterator; @@ -129,7 +130,7 @@ public class CountersPutEffect extends SpellAbilityEffect { if (sa.hasParam("Bolster")) { CardCollection creatsYouCtrl = CardLists.filter(activator.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); CardCollection leastToughness = new CardCollection(Aggregates.listWithMin(creatsYouCtrl, CardPredicates.Accessors.fnGetDefense)); - tgtCards.addAll(pc.chooseCardsForEffect(leastToughness, sa, "Choose a creature with the least toughness", 1, 1, false)); + tgtCards.addAll(pc.chooseCardsForEffect(leastToughness, sa, Localizer.getInstance().getMessage("lblChooseACreatureWithLeastToughness"), 1, 1, false)); tgtObjects.addAll(tgtCards); } else { tgtObjects.addAll(getDefinedOrTargeted(sa, "Defined")); @@ -183,7 +184,7 @@ public class CountersPutEffect extends SpellAbilityEffect { Map params = Maps.newHashMap(); params.put("Target", obj); StringBuilder sb = new StringBuilder(); - sb.append("Select counter type to add to "); + sb.append(Localizer.getInstance().getMessage("lblSelectCounterTypeAddTo") + " "); sb.append(obj); counterType = pc.chooseCounterType(choices, sa, sb.toString(), params); } @@ -199,7 +200,7 @@ public class CountersPutEffect extends SpellAbilityEffect { Map params = Maps.newHashMap(); params.put("Target", obj); params.put("CounterType", counterType); - counterAmount = pc.chooseNumber(sa, "How many counters?", 0, counterAmount, params); + counterAmount = pc.chooseNumber(sa, Localizer.getInstance().getMessage("lblHowManyCounters"), 0, counterAmount, params); } // Adapt need extra logic @@ -235,8 +236,8 @@ public class CountersPutEffect extends SpellAbilityEffect { continue; } - String message = "Do you want to put " + counterAmount + " +1/+1 counters on " + gameCard + " ?"; - Player chooser = pc.chooseSingleEntityForEffect(activator.getOpponents(), sa, "Choose an opponent"); + String message = Localizer.getInstance().getMessage("lblDoYouWantPutTargetP1P1CountersOn").replace("%d", String.valueOf(counterAmount)) + " " + gameCard + " ?"; + Player chooser = pc.chooseSingleEntityForEffect(activator.getOpponents(), sa, Localizer.getInstance().getMessage("lblChooseAnOpponent")); if (chooser.getController().confirmAction(sa, PlayerActionConfirmMode.Tribute, message)) { gameCard.setTributed(true); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java index fb1f4c58e51..b02f91f0c0d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java @@ -13,6 +13,7 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.util.Lang; +import forge.util.Localizer; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -97,11 +98,11 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect { list = Lists.newArrayList(ctype); } - String prompt = "Select type of counters to add or remove"; + String prompt = Localizer.getInstance().getMessage("lblSelectCounterTypeToAddOrRemove"); CounterType chosenType = pc.chooseCounterType(list, sa, prompt, params); params.put("CounterType", chosenType); - prompt = "What to do with that '" + chosenType.getName() + "' counter "; + prompt = Localizer.getInstance().getMessage("lblWhatToDoWithTargetCounter").replace("%s", chosenType.getName()) + " "; Boolean putCounter = pc.chooseBinary(sa, prompt, BinaryChoiceType.AddOrRemove, params); if (putCounter) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java index 5338477cae1..7855b68162c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java @@ -13,6 +13,7 @@ import forge.game.player.PlayerController; import forge.game.spellability.SpellAbility; import forge.game.zone.Zone; import forge.game.zone.ZoneType; +import forge.util.Localizer; import java.util.Map; @@ -84,8 +85,8 @@ public class CountersRemoveEffect extends SpellAbilityEffect { } if (sa.hasParam("Optional")) { - String ctrs = cntToRemove > 1 ? "counters" : num.equals("All") ? "all counters" : "a counter"; - if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, "Remove " + ctrs + "?")) { + String ctrs = cntToRemove > 1 ? Localizer.getInstance().getMessage("lblCounters") : num.equals("All") ? Localizer.getInstance().getMessage("lblAllCounters") : Localizer.getInstance().getMessage("lblACounters"); + if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRemove") + " " + ctrs + "?")) { return; } } @@ -130,7 +131,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { srcCards = CardLists.getValidCards(srcCards, sa.getParam("ValidSource"), player, card, sa); if (num.equals("Any")) { StringBuilder sb = new StringBuilder(); - sb.append("Choose cards to take ").append(counterType.getName()).append(" counters from"); + sb.append(Localizer.getInstance().getMessage("lblChooseCardtoTakeTargetCounters").replace("%s", counterType.getName())); srcCards = player.getController().chooseCardsForEffect(srcCards, sa, sb.toString(), 0, srcCards.size(), true); } @@ -172,7 +173,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { Map params = Maps.newHashMap(); params.put("Target", gameCard); params.put("CounterType", type); - String title = "Select the number of " + type + " counters to remove"; + String title = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget").replace("%s", type); cntToRemove = pc.chooseNumber(sa, title, 0, cntToRemove, params); } @@ -213,10 +214,10 @@ public class CountersRemoveEffect extends SpellAbilityEffect { Map params = Maps.newHashMap(); params.put("Target", entity); - String prompt = "Select type of counters to remove"; + String prompt = Localizer.getInstance().getMessage("lblSelectCountersTypeToRemove"); CounterType chosenType = pc.chooseCounterType( ImmutableList.copyOf(tgtCounters.keySet()), sa, prompt, params); - prompt = "Select the number of " + chosenType.getName() + " counters to remove"; + prompt = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget").replace("%s", chosenType.getName()); int max = Math.min(cntToRemove, tgtCounters.get(chosenType)); params = Maps.newHashMap(); params.put("Target", entity); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index bfb6258496d..0c537c98898 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -13,6 +13,7 @@ import forge.game.card.CardUtil; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Lang; +import forge.util.Localizer; import java.util.List; import java.util.Map; @@ -83,7 +84,7 @@ public class DamageDealEffect extends DamageBaseEffect { List tgts = getTargets(sa); if (sa.hasParam("OptionalDecider")) { Player decider = Iterables.getFirst(AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("OptionalDecider"), sa), null); - if (decider != null && !decider.getController().confirmAction(sa, null, "Do you want to deal " + dmg + " damage to " + tgts + " ?")) { + if (decider != null && !decider.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantDealTargetDamageTo").replace("%d", String.valueOf(dmg)) + " " + tgts + " ?")) { return; } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index dca94e86b5d..15099d80991 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -22,6 +22,7 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.util.Lang; import forge.util.TextUtil; +import forge.util.Localizer; import java.util.*; @@ -128,7 +129,7 @@ public class DigEffect extends SpellAbilityEffect { game.getAction().reveal(top, p, false); } else if (sa.hasParam("RevealOptional")) { - String question = TextUtil.concatWithSpace("Reveal:", TextUtil.addSuffix(Lang.joinHomogenous(top),"?")); + String question = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblReveal") + ":", TextUtil.addSuffix(Lang.joinHomogenous(top),"?")); hasRevealed = p.getController().confirmAction(sa, null, question); if (hasRevealed) { @@ -151,7 +152,7 @@ public class DigEffect extends SpellAbilityEffect { } else if (!sa.hasParam("NoLooking")) { // show the user the revealed cards - delayedReveal = new DelayedReveal(top, srcZone, PlayerView.get(p), host.getName() + " - Looking at cards in "); + delayedReveal = new DelayedReveal(top, srcZone, PlayerView.get(p), host.getName() + " - " + Localizer.getInstance().getMessage("lblLookingCardIn") + " "); if (noMove) { // Let the activating player see the cards even if they're not moved @@ -194,7 +195,7 @@ public class DigEffect extends SpellAbilityEffect { // Optional abilities that use a dialog box to prompt the user to skip the ability (e.g. Explorer's Scope, Quest for Ula's Temple) if (optional && mayBeSkipped && !valid.isEmpty()) { - String prompt = !optionalAbilityPrompt.isEmpty() ? optionalAbilityPrompt : "Would you like to proceed with the optional ability for " + sa.getHostCard() + "?\n\n(" + sa.getDescription() + ")"; + String prompt = !optionalAbilityPrompt.isEmpty() ? optionalAbilityPrompt : Localizer.getInstance().getMessage("lblWouldYouLikeProceedWithOptionalAbility") + " " + sa.getHostCard() + "?\n\n(" + sa.getDescription() + ")"; if (!p.getController().confirmAction(sa, null, TextUtil.fastReplace(prompt, "CARDNAME", sa.getHostCard().getName()))) { return; } @@ -214,24 +215,24 @@ public class DigEffect extends SpellAbilityEffect { } for (final byte pair : MagicColor.COLORPAIR) { Card chosen = chooser.getController().chooseSingleEntityForEffect(CardLists.filter(valid, CardPredicates.isExactlyColor(pair)), - delayedReveal, sa, "Choose one", false, p); + delayedReveal, sa, Localizer.getInstance().getMessage("lblChooseOne"), false, p); if (chosen != null) { movedCards.add(chosen); } } chooser.getController().endTempShowCards(); if (!movedCards.isEmpty()) { - game.getAction().reveal(movedCards, chooser, true, chooser + " picked "); + game.getAction().reveal(movedCards, chooser, true, chooser + " " + Localizer.getInstance().getMessage("lblPicked") + " "); } } else if (allButOne) { movedCards = new CardCollection(valid); String prompt; if (destZone2.equals(ZoneType.Library) && libraryPosition2 == 0) { - prompt = "Choose a card to leave on top of {player's} library"; + prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop").replace("%s", "{player's}"); } else { - prompt = "Choose a card to leave in {player's} " + destZone2.name(); + prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTarget").replace("%s", "{player's}") + " " + destZone2.name(); } Card chosen = chooser.getController().chooseSingleEntityForEffect(valid, delayedReveal, sa, prompt, false, p); @@ -245,19 +246,19 @@ public class DigEffect extends SpellAbilityEffect { if (sa.hasParam("PrimaryPrompt")) { prompt = sa.getParam("PrimaryPrompt"); } else { - prompt = "Choose card(s) to put into " + destZone1.name(); + prompt = Localizer.getInstance().getMessage("lblChooseCardsPutInto") + " " + destZone1.name(); if (destZone1.equals(ZoneType.Library)) { if (libraryPosition == -1) { - prompt = "Choose card(s) to put on the bottom of {player's} library"; + prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayBottom").replace("%s", "{player's}"); } else if (libraryPosition == 0) { - prompt = "Choose card(s) to put on top of {player's} library"; + prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayTop").replace("%s", "{player's}"); } } } movedCards = new CardCollection(); if (valid.isEmpty()) { - chooser.getController().notifyOfValue(sa, null, "No valid cards"); + chooser.getController().notifyOfValue(sa, null, Localizer.getInstance().getMessage("lblNoValidCards")); } else { if ( p == chooser ) { // the digger can still see all the dug cards when choosing chooser.getController().tempShowCards(top); @@ -276,7 +277,9 @@ public class DigEffect extends SpellAbilityEffect { if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) { game.getAction().reveal(movedCards, chooser, true, - chooser + " picked " + (movedCards.size() == 1 ? "this card" : "these cards") + " from "); + chooser + " " + Localizer.getInstance().getMessage("lblPicked") + " " + + (movedCards.size() == 1 ? Localizer.getInstance().getMessage("lblThisCard") : Localizer.getInstance().getMessage("lblTheseCards")) + + " " + Localizer.getInstance().getMessage("lblFrom") + " "); } } if (sa.hasParam("ForgetOtherRemembered")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java index 1ca132be140..b7afd1cc9cb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java @@ -16,6 +16,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; +import forge.util.Localizer; public class DigMultipleEffect extends SpellAbilityEffect { @@ -74,15 +75,15 @@ public class DigMultipleEffect extends SpellAbilityEffect { } if (validMap.isEmpty()) { - chooser.getController().notifyOfValue(sa, null, "No valid cards"); + chooser.getController().notifyOfValue(sa, null, Localizer.getInstance().getMessage("lblNoValidCards")); continue; } - CardCollection chosen = chooser.getController().chooseCardsForEffectMultiple(validMap, sa, "Choose cards"); + CardCollection chosen = chooser.getController().chooseCardsForEffectMultiple(validMap, sa, Localizer.getInstance().getMessage("lblChooseCards")); if (!chosen.isEmpty()) { game.getAction().reveal(chosen, chooser, true, - chooser + " picked " + (chosen.size() == 1 ? "this card" : "these cards") + " from "); + chooser + " " + Localizer.getInstance().getMessage("lblPicked") + " " + (chosen.size() == 1 ? Localizer.getInstance().getMessage("lblThisCard") : Localizer.getInstance().getMessage("lblTheseCards")) + " " + Localizer.getInstance().getMessage("lblFrom") + " "); } for (Card c : chosen) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java index 57d5303a45e..62b82dc6a44 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java @@ -11,6 +11,7 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.util.MyRandom; +import forge.util.Localizer; import java.util.*; @@ -113,7 +114,7 @@ public class DigUntilEffect extends SpellAbilityEffect { continue; } if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) { - if (optional && !p.getController().confirmAction(sa, null, "Do you want to dig your library?")) { + if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDigYourLibrary"))) { continue; } CardCollection found = new CardCollection(); @@ -159,7 +160,7 @@ public class DigUntilEffect extends SpellAbilityEffect { final Card c = itr.next(); final ZoneType origin = c.getZone().getZoneType(); if (optionalFound && !p.getController().confirmAction(sa, null, - "Do you want to put that card to " + foundDest.name() + "?")) { + Localizer.getInstance().getMessage("lblDoYouWantPutCardTo") + " " + foundDest.name() + "?")) { continue; } else { Card m = null; diff --git a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java index 4218d8897f7..a44f1c6c6ad 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java @@ -15,6 +15,7 @@ import forge.game.zone.ZoneType; import forge.util.Lang; import forge.util.Aggregates; import forge.util.TextUtil; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; @@ -205,7 +206,7 @@ public class DiscardEffect extends SpellAbilityEffect { if (!p.canDiscardBy(sa)) { continue; } - String message = "Would you like to discard " + numCards + " random card(s)?"; + String message = Localizer.getInstance().getMessage("lblWouldYouLikeRandomDiscardTargetCard").replace("%d", String.valueOf(numCards)); boolean runDiscard = !sa.hasParam("Optional") || p.getController().confirmAction(sa, PlayerActionConfirmMode.Random, message); if (runDiscard) { @@ -257,7 +258,7 @@ public class DiscardEffect extends SpellAbilityEffect { final CardCollectionView dPHand = p.getCardsIn(ZoneType.Hand); for (final Player opp : p.getAllOtherPlayers()) { - opp.getController().reveal(dPHand, ZoneType.Hand, p, "Reveal "); + opp.getController().reveal(dPHand, ZoneType.Hand, p, Localizer.getInstance().getMessage("lblReveal") + " "); } if (!p.canDiscardBy(sa)) { @@ -326,7 +327,7 @@ public class DiscardEffect extends SpellAbilityEffect { if (mode.startsWith("Reveal") ) { p.getController().reveal(toBeDiscarded, ZoneType.Hand, p, - chooser + " has chosen " + (toBeDiscarded.size() == 1 ? "this card" : "these cards") + " from "); + chooser + " " + Localizer.getInstance().getMessage("lblHasChosen") + " " + (toBeDiscarded.size() == 1 ? Localizer.getInstance().getMessage("lblThisCard") : Localizer.getInstance().getMessage("lblTheseCards")) + " " + Localizer.getInstance().getMessage("lblFrom") + " "); } for (Card card : toBeDiscarded) { if (card == null) { continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java index 2e6b5225529..9684f09190f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java @@ -8,6 +8,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.util.Lang; +import forge.util.Localizer; import java.util.List; @@ -49,12 +50,12 @@ public class DrawEffect extends SpellAbilityEffect { for (final Player p : getDefinedPlayersOrTargeted(sa)) { if ((tgt == null) || p.canBeTargetedBy(sa)) - if (optional && !p.getController().confirmAction(sa, null, "Do you want to draw " + Lang.nounWithAmount(numCards, " card") + "?")) + if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDraw") + " " + Lang.nounWithAmount(numCards, " card") + "?")) continue; int actualNum = numCards; if (upto) { - actualNum = p.getController().chooseNumber(sa, "How may cards do you want to draw?", 0, numCards); + actualNum = p.getController().chooseNumber(sa, "lblHowMayCardDoYouWantDraw", 0, numCards); } final CardCollectionView drawn = p.drawCards(actualNum); diff --git a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java index 7b0754c09cf..550b77e7711 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java @@ -8,6 +8,7 @@ import forge.game.card.CardCollectionView; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.Localizer; public class EncodeEffect extends SpellAbilityEffect { @Override @@ -45,7 +46,7 @@ public class EncodeEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); - sb.append("Do you want to exile ").append(host).append(" and encode it onto a creature you control?"); + sb.append(Localizer.getInstance().getMessage("lblDoYouWantExile") + " ").append(host).append(" " + Localizer.getInstance().getMessage("lblAndEncodeOntoAYouControlCreature")); if (!player.getController().confirmAction(sa, null, sb.toString())) { return; } @@ -54,14 +55,14 @@ public class EncodeEffect extends SpellAbilityEffect { Card movedCard = game.getAction().moveTo(ZoneType.Exile, host, sa); // choose a creature - Card choice = player.getController().chooseSingleEntityForEffect(choices, sa, "Choose a creature you control to encode ", true); + Card choice = player.getController().chooseSingleEntityForEffect(choices, sa, Localizer.getInstance().getMessage("lblChooseACreatureYouControlToEncode") + " ", true); if (choice == null) { return; } StringBuilder codeLog = new StringBuilder(); - codeLog.append("Encoding ").append(host.toString()).append(" to ").append(choice.toString()); + codeLog.append(Localizer.getInstance().getMessage("lblEncoding") + " ").append(host.toString()).append(" " + Localizer.getInstance().getMessage("lblTo") + " ").append(choice.toString()); game.getGameLog().add(GameLogEntryType.STACK_RESOLVE, codeLog.toString()); // store hostcard in encoded array diff --git a/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java index 4b4586fb1de..c31e4db297a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java @@ -14,6 +14,7 @@ import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; import forge.util.Lang; +import forge.util.Localizer; import java.util.List; @@ -54,7 +55,7 @@ public class ExploreEffect extends SpellAbilityEffect { boolean revealedLand = false; CardCollection top = pl.getTopXCardsFromLibrary(1); if (!top.isEmpty()) { - game.getAction().reveal(top, pl, false, "Revealed for Explore - "); + game.getAction().reveal(top, pl, false, Localizer.getInstance().getMessage("lblRevealedForExplore") + " - "); final Card r = top.getFirst(); if (r.isLand()) { game.getAction().moveTo(ZoneType.Hand, r, sa); @@ -63,7 +64,7 @@ public class ExploreEffect extends SpellAbilityEffect { // TODO find better way to choose optional send away final Card choosen = pc.chooseSingleCardForZoneChange( ZoneType.Graveyard, Lists.newArrayList(ZoneType.Library), sa, top, null, - "Put this card in your graveyard?", true, pl); + Localizer.getInstance().getMessage("lblPutThisCardToYourGraveyard"), true, pl); if (choosen != null) { game.getAction().moveTo(ZoneType.Graveyard, choosen, sa); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java index be2dc1333f1..5a22c55676c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java @@ -12,6 +12,7 @@ import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.util.MyRandom; +import forge.util.Localizer; import java.util.HashSet; import java.util.List; @@ -163,7 +164,7 @@ public class FlipCoinEffect extends SpellAbilityEffect { if (result) { numSuccesses++; } - flipper.getGame().getAction().nofityOfValue(sa, flipper, result ? "heads" : "tails", null); + flipper.getGame().getAction().nofityOfValue(sa, flipper, result ? Localizer.getInstance().getMessage("lblHeads") : Localizer.getInstance().getMessage("lblTails"), null); } while (sa.hasParam("FlipUntilYouLose") && result != false); if (sa.hasParam("FlipUntilYouLose") && sa.hasAdditionalAbility("LoseSubAbility")) { @@ -193,7 +194,7 @@ public class FlipCoinEffect extends SpellAbilityEffect { do { Set flipResults = new HashSet<>(); - final boolean choice = caller.getController().chooseBinary(sa, sa.getHostCard().getName() + " - Call coin flip", PlayerController.BinaryChoiceType.HeadsOrTails); + final boolean choice = caller.getController().chooseBinary(sa, sa.getHostCard().getName() + " - " + Localizer.getInstance().getMessage("lblCallCoinFlip"), PlayerController.BinaryChoiceType.HeadsOrTails); for (int i = 0; i < multiplier; i++) { flipResults.add(MyRandom.getRandom().nextBoolean()); } @@ -206,7 +207,7 @@ public class FlipCoinEffect extends SpellAbilityEffect { numSuccesses++; } - caller.getGame().getAction().nofityOfValue(sa, caller, wonFlip ? "win" : "lose", null); + caller.getGame().getAction().nofityOfValue(sa, caller, wonFlip ? Localizer.getInstance().getMessage("lblWin") : Localizer.getInstance().getMessage("lblLose"), null); // Run triggers final Map runParams = AbilityKey.newMap(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java index 5224b7792a6..a58f214fa07 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java @@ -5,6 +5,7 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; +import forge.util.Localizer; import java.util.ArrayList; import java.util.List; @@ -34,7 +35,7 @@ public class LifeSetEffect extends SpellAbilityEffect { if (!redistribute) { p.setLife(lifeAmount, sa.getHostCard()); } else { - int life = sa.getActivatingPlayer().getController().chooseNumber(sa, "Life Total: " + p, lifetotals, p); + int life = sa.getActivatingPlayer().getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblLifeTotal") + ": " + p, lifetotals, p); p.setLife(life, sa.getHostCard()); lifetotals.remove((Integer) life); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 25269a4f4c1..a4812c22ddc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -17,6 +17,7 @@ import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; @@ -39,7 +40,7 @@ public class ManaEffect extends SpellAbilityEffect { final boolean optional = sa.hasParam("Optional"); final Game game = sa.getActivatingPlayer().getGame(); - if (optional && !sa.getActivatingPlayer().getController().confirmAction(sa, null, "Do you want to add mana?")) { + if (optional && !sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantAddMana"))) { return; } @@ -91,7 +92,7 @@ public class ManaEffect extends SpellAbilityEffect { // just use the first possible color. choice = colorsProduced[differentChoice ? nMana : 0]; } else { - byte chosenColor = activator.getController().chooseColor("Select Mana to Produce", sa, + byte chosenColor = activator.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, differentChoice ? fullOptions : colorOptions); if (chosenColor == 0) throw new RuntimeException("ManaEffect::resolve() /*combo mana*/ - " + activator + " color mana choice is empty for " + card.getName()); @@ -111,7 +112,7 @@ public class ManaEffect extends SpellAbilityEffect { return; } - game.action.nofityOfValue(sa, card, activator + " picked " + choiceString, activator); + game.action.nofityOfValue(sa, card, activator + " " + Localizer.getInstance().getMessage("lblPicked") + " " + choiceString, activator); abMana.setExpressChoice(choiceString.toString()); } } @@ -135,13 +136,13 @@ public class ManaEffect extends SpellAbilityEffect { mask |= MagicColor.fromName(colorsNeeded.charAt(nChar)); } colorMenu = mask == 0 ? ColorSet.ALL_COLORS : ColorSet.fromMask(mask); - byte val = p.getController().chooseColor("Select Mana to Produce", sa, colorMenu); + byte val = p.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu); if (0 == val) { throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + act + " color mana choice is empty for " + card.getName()); } choice = MagicColor.toShortString(val); - game.action.nofityOfValue(sa, card, act + " picked " + choice, act); + game.action.nofityOfValue(sa, card, act + " " + Localizer.getInstance().getMessage("lblPicked") + " " + choice, act); abMana.setExpressChoice(choice); } } @@ -172,7 +173,7 @@ public class ManaEffect extends SpellAbilityEffect { if (cs.isMonoColor()) sb.append(MagicColor.toShortString(s.getColorMask())); else /* (cs.isMulticolor()) */ { - byte chosenColor = sa.getActivatingPlayer().getController().chooseColor("Choose a single color from " + s.toString(), sa, cs); + byte chosenColor = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFrom") + " " + s.toString(), sa, cs); sb.append(MagicColor.toShortString(chosenColor)); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java index e0a46fb56b0..3d19c777592 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java @@ -8,6 +8,7 @@ import forge.game.card.CardUtil; import forge.game.player.Player; import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; +import forge.util.Localizer; import java.util.Collection; import java.util.List; @@ -68,7 +69,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect { } if (mask == 0 && !expressChoiceColors.isEmpty() && colors.contains("colorless")) { - baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless("Select Mana to Produce", sa.getHostCard(), ColorSet.fromMask(mask))); + baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromMask(mask))); } else { // Nothing set previously so ask player if needed if (mask == 0) { @@ -78,14 +79,14 @@ public class ManaReflectedEffect extends SpellAbilityEffect { baseMana = MagicColor.toShortString(colors.iterator().next()); } else { if (colors.contains("colorless")) { - baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless("Select Mana to Produce", sa.getHostCard(), ColorSet.fromNames(colors))); + baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromNames(colors))); } else { - baseMana = MagicColor.toShortString(player.getController().chooseColor("Select Mana to Produce", sa, ColorSet.fromNames(colors))); + baseMana = MagicColor.toShortString(player.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, ColorSet.fromNames(colors))); } } } else { colorMenu = ColorSet.fromMask(mask); - byte color = sa.getActivatingPlayer().getController().chooseColor("Select Mana to Produce", sa, colorMenu); + byte color = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu); if (color == 0) { System.err.println("Unexpected behavior in ManaReflectedEffect: " + sa.getActivatingPlayer() + " - color mana choice is empty for " + sa.getHostCard().getName()); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java index 15eff821b32..3a5d74e5d27 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java @@ -13,6 +13,7 @@ import forge.game.card.CardUtil; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.Localizer; public class ManifestEffect extends SpellAbilityEffect { @Override @@ -42,7 +43,7 @@ public class ManifestEffect extends SpellAbilityEffect { continue; } - String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose cards to manifest "; + String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseCardToManifest") + " "; tgtCards = new CardCollection(activator.getController().chooseEntitiesForEffect(choices, amount, amount, null, sa, title, p)); } else if ("TopOfLibrary".equals(defined)) { tgtCards = p.getTopXCardsFromLibrary(amount); diff --git a/forge-game/src/main/java/forge/game/ability/effects/MeldEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MeldEffect.java index 45a0aa66841..b89a17b08e0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MeldEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MeldEffect.java @@ -13,6 +13,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.PlayerZoneBattlefield; import forge.game.zone.ZoneType; +import forge.util.Localizer; public class MeldEffect extends SpellAbilityEffect { @Override @@ -35,7 +36,7 @@ public class MeldEffect extends SpellAbilityEffect { return; } - Card secondary = controller.getController().chooseSingleEntityForEffect(field, sa, "Choose card to meld with"); + Card secondary = controller.getController().chooseSingleEntityForEffect(field, sa, Localizer.getInstance().getMessage("lblChooseCardToMeld")); secondary = game.getAction().exile(secondary, sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java index eca41963660..8fb24cf9163 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java @@ -13,6 +13,7 @@ import forge.game.zone.ZoneType; import forge.util.Lang; import forge.util.TextUtil; +import forge.util.Localizer; public class MillEffect extends SpellAbilityEffect { @Override @@ -39,7 +40,7 @@ public class MillEffect extends SpellAbilityEffect { for (final Player p : getTargetPlayers(sa)) { if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) { if (sa.hasParam("Optional")) { - final String prompt = TextUtil.concatWithSpace("Do you want to put card(s) from library to", TextUtil.addSuffix(destination.toString(),"?")); + final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantPutLibraryCardsTo"), TextUtil.addSuffix(destination.toString(),"?")); if (!p.getController().confirmAction(sa, null, prompt)) { continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java index 503c1a15e34..7bc72c9142e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java @@ -15,6 +15,7 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.Aggregates; +import forge.util.Localizer; import java.util.List; import java.util.Map; @@ -85,7 +86,7 @@ public class MultiplePilesEffect extends SpellAbilityEffect { for (int i = 1; i < piles; i++) { int size = pool.size(); - CardCollectionView pile = p.getController().chooseCardsForEffect(pool, sa, "Choose cards in Pile " + i, 0, size, false); + CardCollectionView pile = p.getController().chooseCardsForEffect(pool, sa, Localizer.getInstance().getMessage("lblChooseCardsInPile") + " " + i, 0, size, false); pileList.add(pile); pool.removeAll(pile); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java index 0c686e465cf..4fcdb306b7d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java @@ -11,6 +11,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; +import forge.util.Localizer; import java.util.List; @@ -52,11 +53,11 @@ public class PeekAndRevealEffect extends SpellAbilityEffect { CardCollectionView revealableCards = CardLists.getValidCards(peekCards, revealValid, sa.getActivatingPlayer(), sa.getHostCard()); boolean doReveal = !sa.hasParam("NoReveal") && !revealableCards.isEmpty(); if (!sa.hasParam("NoPeek")) { - peekingPlayer.getController().reveal(peekCards, ZoneType.Library, peekingPlayer, source + " - Revealing cards from "); + peekingPlayer.getController().reveal(peekCards, ZoneType.Library, peekingPlayer, source + " - " + Localizer.getInstance().getMessage("lblRevealingCardFrom") + " "); } if( doReveal && sa.hasParam("RevealOptional") ) - doReveal = peekingPlayer.getController().confirmAction(sa, null, "Reveal cards to other players?"); + doReveal = peekingPlayer.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRevealCardToOtherPlayers")); if (doReveal) { peekingPlayer.getGame().getAction().reveal(revealableCards, peekingPlayer); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 4056b367799..9d65e3a36a5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -32,6 +32,7 @@ import forge.game.zone.ZoneType; import forge.item.PaperCard; import forge.util.Aggregates; import forge.util.Lang; +import forge.util.Localizer; public class PlayEffect extends SpellAbilityEffect { @Override @@ -117,7 +118,7 @@ public class PlayEffect extends SpellAbilityEffect { final int choicenum = AbilityUtils.calculateAmount(source, sa.getParam("ChoiceNum"), sa); tgtCards = new CardCollection( activator.getController().chooseCardsForEffect(choice, sa, - source + " - Choose up to " + Lang.nounWithNumeral(choicenum, "card"), 0, choicenum, true + source + " - " + Localizer.getInstance().getMessage("lblChooseUpTo") + " " + Lang.nounWithNumeral(choicenum, "card"), 0, choicenum, true ) ); } @@ -144,7 +145,7 @@ public class PlayEffect extends SpellAbilityEffect { final CardCollection saidNoTo = new CardCollection(); while (tgtCards.size() > saidNoTo.size() && saidNoTo.size() < amount && amount > 0) { activator.getController().tempShowCards(showCards); - Card tgtCard = controller.getController().chooseSingleEntityForEffect(tgtCards, sa, "Select a card to play"); + Card tgtCard = controller.getController().chooseSingleEntityForEffect(tgtCards, sa, Localizer.getInstance().getMessage("lblSelectCardToPlay")); activator.getController().endTempShowCards(); if (tgtCard == null) { return; @@ -162,7 +163,7 @@ public class PlayEffect extends SpellAbilityEffect { game.getAction().revealTo(tgtCard, activator); } - if (optional && !controller.getController().confirmAction(sa, null, TextUtil.concatWithSpace("Do you want to play", TextUtil.addSuffix(tgtCard.toString(),"?")))) { + if (optional && !controller.getController().confirmAction(sa, null, TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantPlay"), TextUtil.addSuffix(tgtCard.toString(),"?")))) { if (wasFaceDown) { tgtCard.turnFaceDownNoUpdate(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java index 6f09ea7e577..88f6fc9a419 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java @@ -17,6 +17,7 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Lang; import forge.util.TextUtil; +import forge.util.Localizer; import java.util.ArrayList; import java.util.List; @@ -51,7 +52,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { final List gains = new ArrayList<>(); if (isChoice) { Player choser = sa.getActivatingPlayer(); - final String choice = choser.getController().chooseProtectionType("Choose a protection", sa, choices); + final String choice = choser.getController().chooseProtectionType(Localizer.getInstance().getMessage("lblChooseAProtection"), sa, choices); if( null == choice) return; gains.add(choice); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java index dd4769a547a..dd116979891 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java @@ -12,6 +12,7 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.util.Lang; import forge.util.TextUtil; +import forge.util.Localizer; import java.util.ArrayList; import java.util.Arrays; @@ -106,9 +107,9 @@ public class ProtectEffect extends SpellAbilityEffect { if (isChoice && !choices.isEmpty()) { Player choser = sa.getActivatingPlayer(); if (sa.hasParam("Choser") && sa.getParam("Choser").equals("Controller") && !tgtCards.isEmpty()) { - choser = tgtCards.get(0).getController(); + choser = tgtCards.get(0).getController(); } - final String choice = choser.getController().chooseProtectionType("Choose a protection", sa, choices); + final String choice = choser.getController().chooseProtectionType(Localizer.getInstance().getMessage("lblChooseAProtection"), sa, choices); if( null == choice) return; gains.add(choice); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 75d8693b8f0..9d81c13e010 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -15,6 +15,7 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Aggregates; import forge.util.Lang; +import forge.util.Localizer; import java.util.Arrays; import java.util.List; @@ -214,7 +215,7 @@ public class PumpEffect extends SpellAbilityEffect { sb.append(atk); sb.append("/"); if (def >= 0) { - sb.append("+"); + sb.append("+"); } sb.append(def); sb.append(" "); @@ -327,7 +328,7 @@ public class PumpEffect extends SpellAbilityEffect { final String targets = Lang.joinHomogenous(tgtCards); final String message = sa.hasParam("OptionQuestion") ? TextUtil.fastReplace(sa.getParam("OptionQuestion"), "TARGETS", targets) - : TextUtil.concatNoSpace("Apply pump to ", targets, "?"); + : TextUtil.concatNoSpace(Localizer.getInstance().getMessage("lblApplyPumpTo") + " ", targets, "?"); if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, message)) { return; diff --git a/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java index eb3c8c1ae23..ef8046245f4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java @@ -10,6 +10,7 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.Lang; +import forge.util.Localizer; import java.util.List; @@ -116,7 +117,7 @@ public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect { Card next = orderedCards.get(i); player.getGame().getAction().moveToLibrary(next, 0, sa); } - if (mayshuffle && activator.getController().confirmAction(sa, null, "Do you want to shuffle the library?")) { + if (mayshuffle && activator.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantShuffleTheLibrary"))) { player.shuffle(sa); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java index d08365cb039..0f778f4dc01 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java @@ -36,7 +36,7 @@ public class RemoveFromCombatEffect extends SpellAbilityEffect { final TargetRestrictions tgt = sa.getTargetRestrictions(); for (final Card c : getTargetCards(sa)) { - final Combat combat = game.getPhaseHandler().getCombat(); + final Combat combat = game.getPhaseHandler().getCombat(); if (combat != null && (tgt == null || c.canBeTargetedBy(sa))) { // Unblock creatures that were blocked only by this card (e.g. Ydwen Efreet) if (sa.hasParam("UnblockCreaturesBlockedOnlyBy")) { @@ -58,7 +58,7 @@ public class RemoveFromCombatEffect extends SpellAbilityEffect { } } - combat.removeFromCombat(c); + combat.removeFromCombat(c); if (rem) { sa.getHostCard().addRemembered(c); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java index b182bcc265e..fa834da87b2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java @@ -14,6 +14,7 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Aggregates; import forge.util.collect.FCollection; +import forge.util.Localizer; import java.util.List; import java.util.Map; @@ -167,7 +168,7 @@ public class RepeatEachEffect extends SpellAbilityEffect { if (random) { p = Aggregates.random(game.getPlayers()); } else { - p = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(game.getPlayers(), sa, "Choose a player"); + p = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(game.getPlayers(), sa, Localizer.getInstance().getMessage("lblChoosePlayer")); } if (recordMap.containsKey(p)) { recordMap.get(p).add(0, card); @@ -188,7 +189,7 @@ public class RepeatEachEffect extends SpellAbilityEffect { valid = CardLists.filterControlledBy(valid, game.getNextPlayerAfter(p, source.getChosenDirection())); } - Card card = p.getController().chooseSingleEntityForEffect(valid, sa, "Choose a card"); + Card card = p.getController().chooseSingleEntityForEffect(valid, sa, Localizer.getInstance().getMessage("lblChooseaCard")); if (recordMap.containsKey(p)) { recordMap.get(p).add(0, card); } else { diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java index 38ab0400770..e22f817af6e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java @@ -12,6 +12,7 @@ import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Expressions; +import forge.util.Localizer; public class RepeatEffect extends SpellAbilityEffect { @@ -49,14 +50,14 @@ public class RepeatEffect extends SpellAbilityEffect { if (maxRepeat != null && maxRepeat <= count) { // TODO Replace Infinite Loop Break with a game draw. Here are the scenarios that can cause this: // Helm of Obedience vs Graveyard to Library replacement effect - - if(source.getName().equals("Helm of Obedience")) { + + if(source.getName().equals("Helm of Obedience")) { StringBuilder infLoop = new StringBuilder(sa.getHostCard().toString()); - infLoop.append(" - To avoid an infinite loop, this repeat has been broken "); - infLoop.append(" and the game will now continue in the current state, ending the loop early. "); - infLoop.append("Once Draws are available this probably should change to a Draw."); - System.out.println(infLoop.toString()); - } + infLoop.append(" - To avoid an infinite loop, this repeat has been broken "); + infLoop.append(" and the game will now continue in the current state, ending the loop early. "); + infLoop.append("Once Draws are available this probably should change to a Draw."); + System.out.println(infLoop.toString()); + } break; } } while (checkRepeatConditions(sa)); @@ -129,7 +130,7 @@ public class RepeatEffect extends SpellAbilityEffect { Player decider = sa.hasParam("RepeatOptionalDecider") ? AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("RepeatOptionalDecider"), sa).get(0) : sa.getActivatingPlayer(); - return decider.getController().confirmAction(sa, null, "Do you want to repeat this process again?"); + return decider.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantRepeatProcessAgain")); } return true; diff --git a/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java index 6261fac4440..028980c02bf 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java @@ -45,7 +45,7 @@ public class ReplaceDamageEffect extends SpellAbilityEffect { prevent -= n; if (card.getType().hasStringType("Effect") && prevent <= 0) { - game.getAction().exile(card, null); + game.getAction().exile(card, null); } else if (!StringUtils.isNumeric(varValue)) { card.setSVar(varValue, "Number$" + prevent); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java index 048d41e1c17..f06565f1486 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java @@ -51,7 +51,7 @@ public class ReplaceSplitDamageEffect extends SpellAbilityEffect { prevent -= n; if (card.getType().hasStringType("Effect") && prevent <= 0) { - game.getAction().exile(card, null); + game.getAction().exile(card, null); } else if (!StringUtils.isNumeric(varValue)) { card.setSVar(varValue, "Number$" + prevent); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RevealHandEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RevealHandEffect.java index 91b6171c024..350cc2acc99 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RevealHandEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RevealHandEffect.java @@ -7,6 +7,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; +import forge.util.Localizer; import java.util.List; @@ -41,7 +42,7 @@ public class RevealHandEffect extends SpellAbilityEffect { for (final Player p : getTargetPlayers(sa)) { if ((tgt == null) || p.canBeTargetedBy(sa)) { - if (optional && !p.getController().confirmAction(sa, null, "Do you want to reveal your hand?")) { + if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantRevealYourHand"))) { continue; } final CardCollectionView hand = p.getCardsIn(ZoneType.Hand); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RollPlanarDiceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RollPlanarDiceEffect.java index bf91ec8b6a3..5493a77bb34 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RollPlanarDiceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RollPlanarDiceEffect.java @@ -5,6 +5,7 @@ import forge.game.PlanarDice; import forge.game.ability.SpellAbilityEffect; import forge.game.player.Player; import forge.game.spellability.SpellAbility; +import forge.util.Localizer; /** * TODO: Write javadoc for this type. @@ -25,7 +26,7 @@ public class RollPlanarDiceEffect extends SpellAbilityEffect { game.getPhaseHandler().incPlanarDiceRolledthisTurn(); } PlanarDice result = PlanarDice.roll(activator, null); - String message = activator.getName() + " rolled " + result.toString(); + String message = activator.getName() + " " + Localizer.getInstance().getMessage("lblRolled") + " " + result.toString(); game.getAction().nofityOfValue(sa, activator, message, null); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java index f4e3c887497..b5411646c17 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java @@ -15,6 +15,7 @@ import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; import forge.util.Aggregates; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import java.util.List; @@ -30,11 +31,11 @@ public class SacrificeEffect extends SpellAbilityEffect { if (sa.hasParam("Echo")) { boolean isPaid; if (activator.hasKeyword("You may pay 0 rather than pay the echo cost for permanents you control.") - && activator.getController().confirmAction(sa, null, "Do you want to pay Echo {0}?")) { + && activator.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantPayEcho") + " {0}?")) { isPaid = true; } else { isPaid = activator.getController().payManaOptional(card, new Cost(sa.getParam("Echo"), true), - sa, "Pay Echo", ManaPaymentPurpose.Echo); + sa, Localizer.getInstance().getMessage("lblPayEcho"), ManaPaymentPurpose.Echo); } final Map runParams = AbilityKey.mapFromCard(card); runParams.put(AbilityKey.EchoPaid, isPaid); @@ -117,7 +118,7 @@ public class SacrificeEffect extends SpellAbilityEffect { if (sa.hasParam("Random")) { choosenToSacrifice = Aggregates.random(validTargets, Math.min(amount, validTargets.size()), new CardCollection()); - } else if (sa.hasParam("OptionalSacrifice") && !p.getController().confirmAction(sa, null, "Do you want to sacrifice?")) { + } else if (sa.hasParam("OptionalSacrifice") && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantSacrifice"))) { choosenToSacrifice = CardCollection.EMPTY; } else { boolean isOptional = sa.hasParam("Optional"); @@ -193,10 +194,10 @@ public class SacrificeEffect extends SpellAbilityEffect { final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), num, sa); if (valid.equals("Self")) { - sb.append("Sacrifice ").append(sa.getHostCard().toString()); + sb.append(Localizer.getInstance().getMessage("lblSacrifice") + " ").append(sa.getHostCard().toString()); } else if (valid.equals("Card.AttachedBy")) { final Card toSac = sa.getHostCard().getEnchantingCard(); - sb.append(toSac.getController()).append(" sacrifices ").append(toSac).append("."); + sb.append(toSac.getController()).append(" " + Localizer.getInstance().getMessage("lblSacrifice") + " ").append(toSac).append("."); } else { for (final Player p : tgts) { sb.append(p.getName()).append(" "); @@ -208,9 +209,9 @@ public class SacrificeEffect extends SpellAbilityEffect { } if (sa.hasParam("Destroy")) { - sb.append("Destroys "); + sb.append(Localizer.getInstance().getMessage("lblDestroys") + " "); } else { - sb.append("Sacrifices "); + sb.append(Localizer.getInstance().getMessage("lblSacrifice") + " "); } sb.append(amount).append(" ").append(msg).append("."); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java index 290a490e7ad..aeb03cb8d95 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java @@ -4,6 +4,8 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.player.Player; import forge.game.spellability.SpellAbility; +import forge.util.Localizer; + import java.util.List; import com.google.common.collect.Lists; @@ -41,7 +43,7 @@ public class ScryEffect extends SpellAbilityEffect { // Optional here for spells that have optional multi-player scrying for (final Player p : getTargetPlayers(sa)) { if ( (!sa.usesTargeting() || p.canBeTargetedBy(sa)) && - (!isOptional || p.getController().confirmAction(sa, null, "Do you want to scry?")) ) { + (!isOptional || p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWanttoScry"))) ) { players.add(p); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java index bd366ab9e24..e25e9cc2ef3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java @@ -15,6 +15,7 @@ import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.TextUtil; +import forge.util.Localizer; import java.util.Iterator; import java.util.List; @@ -76,7 +77,7 @@ public class SetStateEffect extends SpellAbilityEffect { && !tgt.getState(CardStateName.Original).getType().isPermanent()) { Card lki = CardUtil.getLKICopy(tgt); lki.turnFaceUp(true, false); - game.getAction().reveal(new CardCollection(lki), lki.getOwner(), true, "Face-down card can't turn face up"); + game.getAction().reveal(new CardCollection(lki), lki.getOwner(), true, Localizer.getInstance().getMessage("lblFaceDownCardCantTurnFaceUp")); continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java index a7711c0356b..1b5b4514920 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java @@ -4,6 +4,7 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; +import forge.util.Localizer; import java.util.Iterator; import java.util.List; @@ -20,7 +21,7 @@ public class ShuffleEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { - boolean mustShuffle = !optional || sa.getActivatingPlayer().getController().confirmAction(sa, null, "Have " + p + " shuffle?"); + boolean mustShuffle = !optional || sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblHaveTargetShuffle").replace("%s", p + "")); if (mustShuffle) p.shuffle(sa); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/SurveilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SurveilEffect.java index f93f1765383..5729b4d7191 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SurveilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SurveilEffect.java @@ -5,6 +5,7 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Lang; +import forge.util.Localizer; public class SurveilEffect extends SpellAbilityEffect { @Override @@ -33,7 +34,7 @@ public class SurveilEffect extends SpellAbilityEffect { for (final Player p : getTargetPlayers(sa)) { if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) { - if (isOptional && !p.getController().confirmAction(sa, null, "Do you want to surveil?")) { + if (isOptional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantSurveil"))) { continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapAllEffect.java index 537f0ff78c8..f6f8399939d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapAllEffect.java @@ -11,6 +11,7 @@ import forge.game.player.PlayerController; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.collect.FCollection; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import java.util.List; @@ -55,11 +56,11 @@ public class TapOrUntapAllEffect extends SpellAbilityEffect { // Default to tapping for AI boolean toTap = true; - StringBuilder sb = new StringBuilder("Tap or Untap "); + StringBuilder sb = new StringBuilder(Localizer.getInstance().getMessage("lblTapOrUntap") + " "); if (sa.hasParam("ValidMessage")) { sb.append(sa.getParam("ValidMessage")); } else { - sb.append("Permanents"); + sb.append(Localizer.getInstance().getMessage("lblPermanents")); } sb.append("?"); diff --git a/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapEffect.java index aa8be2fa169..872cb003a21 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapEffect.java @@ -5,6 +5,7 @@ import forge.game.card.Card; import forge.game.player.PlayerController; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import java.util.List; @@ -38,7 +39,7 @@ public class TapOrUntapEffect extends SpellAbilityEffect { for (final Card tgtC : tgtCards) { if (tgtC.isInPlay() && ((tgt == null) || tgtC.canBeTargetedBy(sa))) { // If the effected card is controlled by the same controller of the SA, default to untap. - boolean tap = pc.chooseBinary(sa, "Tap or Untap " + tgtC + "?", PlayerController.BinaryChoiceType.TapOrUntap, + boolean tap = pc.chooseBinary(sa, Localizer.getInstance().getMessage("lblTapOrUntap") + " " + tgtC + "?", PlayerController.BinaryChoiceType.TapOrUntap, !tgtC.getController().equals(sa.getActivatingPlayer()) ); if (tap) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index 49fd4e62a98..76dcdbbd966 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -48,6 +48,7 @@ import forge.game.spellability.SpellAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerHandler; import forge.game.zone.ZoneType; +import forge.util.Localizer; import forge.item.PaperToken; import forge.util.collect.FCollectionView; import forge.util.MyRandom; @@ -116,7 +117,7 @@ public class TokenEffect extends SpellAbilityEffect { if (mapParams.hasParam("TokenAltImages")) { this.tokenAltImages = mapParams.getParam("TokenAltImages").split(","); for (int i = 0; i < tokenAltImages.length; i++) { - this.tokenAltImages[i] = PaperToken.makeTokenFileName(this.tokenAltImages[i].trim()); + this.tokenAltImages[i] = PaperToken.makeTokenFileName(this.tokenAltImages[i].trim()); } } else { this.tokenAltImages = null; @@ -479,7 +480,7 @@ public class TokenEffect extends SpellAbilityEffect { // into battlefield attacking only should work if you are the attacking player if (combat.getAttackingPlayer().equals(controller)) { final FCollectionView defs = combat.getDefenders(); - final GameEntity defender = controller.getController().chooseSingleEntityForEffect(defs, sa, "Choose which defender to attack with " + c, false); + final GameEntity defender = controller.getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c, false); combat.addAttacker(c, defender); combatChanged = true; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java index 37febec93c9..9c4d2d881a3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java @@ -11,6 +11,7 @@ import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; +import forge.util.Localizer; import java.util.List; @@ -88,8 +89,8 @@ public class TwoPilesEffect extends SpellAbilityEffect { return; } - String title = "One".equals(sa.getParamOrDefault("FaceDown", "False")) ? "Select cards for a face down pile" : - "Divide cards into two piles"; + String title = "One".equals(sa.getParamOrDefault("FaceDown", "False")) ? Localizer.getInstance().getMessage("lblSelectCardForFaceDownPile") : + Localizer.getInstance().getMessage("lblDivideCardIntoTwoPiles"); card.clearRemembered(); @@ -106,13 +107,13 @@ public class TwoPilesEffect extends SpellAbilityEffect { CardCollectionView chosenPile = pile1WasChosen ? pile1 : pile2; CardCollectionView unchosenPile = !pile1WasChosen ? pile1 : pile2; - StringBuilder notification = new StringBuilder(chooser + " chooses Pile " + (pile1WasChosen ? "1" : "2") + ":\n"); + StringBuilder notification = new StringBuilder(chooser + " " + Localizer.getInstance().getMessage("lblChoosesPile") + " " + (pile1WasChosen ? "1" : "2") + ":\n"); if (!chosenPile.isEmpty()) { for (Card c : chosenPile) { notification.append(c.getName()).append("\n"); } } else { - notification.append("(Empty pile)"); + notification.append("(" + Localizer.getInstance().getMessage("lblEmptyPile") + ")"); } p.getGame().getAction().nofityOfValue(sa, chooser, notification.toString(), chooser); diff --git a/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java index aaa3ecf897b..584a1739ffb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java @@ -10,6 +10,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; @@ -80,7 +81,7 @@ public class UntapEffect extends SpellAbilityEffect { valid, sa.getActivatingPlayer(), sa.getHostCard()); list = CardLists.filter(list, Presets.TAPPED); - final CardCollectionView selected = p.getController().chooseCardsForEffect(list, sa, "Select cards to untap", mandatory ? num : 0, num, !mandatory); + final CardCollectionView selected = p.getController().chooseCardsForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectCardToUntap"), mandatory ? num : 0, num, !mandatory); if (selected != null) { for (final Card c : selected) { c.untap(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java b/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java index d4c911f24f4..769e758388c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java @@ -27,6 +27,7 @@ import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; +import forge.util.Localizer; public class VoteEffect extends SpellAbilityEffect { @@ -88,14 +89,14 @@ public class VoteEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { int voteAmount = p.getKeywords().getAmount("You get an additional vote.") + 1; int optionalVotes = p.getKeywords().getAmount("You may vote an additional time."); - voteAmount += p.getController().chooseNumber(sa, "How many additional votes do you want?", 0, optionalVotes); + voteAmount += p.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblHowManyAdditionalVotesDoYouWant"), 0, optionalVotes); Player realVoter = voter == null ? p : voter; for (int i = 0; i < voteAmount; i++) { - Object result = realVoter.getController().vote(sa, host + "Vote:", voteType, votes); + Object result = realVoter.getController().vote(sa, host + Localizer.getInstance().getMessage("lblVote") + ":", voteType, votes); votes.put(result, p); - host.getGame().getAction().nofityOfValue(sa, p, result + "\r\nCurrent Votes:" + votes, p); + host.getGame().getAction().nofityOfValue(sa, p, result + "\r\n" + Localizer.getInstance().getMessage("lblCurrentVote") + ":" + votes, p); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java index c30045f9314..1353090efd6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java @@ -9,6 +9,7 @@ import forge.game.card.CardLists; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.Localizer; public class ZoneExchangeEffect extends SpellAbilityEffect { @@ -69,7 +70,7 @@ public class ZoneExchangeEffect extends SpellAbilityEffect { return; } - Card object2 = p.getController().chooseSingleEntityForEffect(list, sa, "Choose a card", !sa.hasParam("Mandatory")); + Card object2 = p.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblChooseaCard"), !sa.hasParam("Mandatory")); if (object2 == null || !object2.isInZone(zone2) || (type != null && !object2.getType().hasStringType(type))) { return; } diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index b7f7a125d9e..b2838f08e71 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1556,8 +1556,210 @@ lblPutIntoLibrary=put into library. lblGainControl=gain control. lblReturnToHand=return to hand. lbldiscard=discard. -lblReveal=reveal. +lblReveal=reveal lblTap=tap. lblCurrentCard=Current Card lblSelectOfCardsTo=Select -lblCardsTo=card(s) to \ No newline at end of file +lblCardsTo=card(s) to +#AbandonEffect.java +lblWouldYoulikeAbandon=Would you like to abandon the scheme +#ActivateAbilityEffect.java +lblChooseManaAbility=Choose a mana ability: +#AddTurnEffect.java +lblTakesExtraTurn=takes an extra turn. +#AmassEffect.java. +lblChooseAnArmy=Choose an army to put counters on +#AssignGroupEffect.java +lblChooseAbilityFor=Choose ability for +#AttachEffect.java +lblDoYouWantAttach=Do you want to attach +lblSelectAPlayerAttachTo=Select a player to attach to. +lblSelectACardAttachTo=Select a card to attach to. +#BidLifeEffect.java +lblChooseStartingBid=Choose a starting bid +lblDoYouWantTopBid=Do you want to top bid? Current Bid \= +lblTopBidWith=topped bid with +#BondEffect.java +lblSelectACardPair=Select a card to pair with +#ChangeCombatantsEffect.java +lblChooseDefenderToAttackWith=Choose which defender to attack with +#ChangeTargetsEffect.java +lblDoYouWantChangeTargets=Do you want to change targets of +#ChangeTextEffect.java +lblChooseColorReplace=Choose a color word to replace +lblChooseNewColor=Choose a new color word +#ChangeZoneEffect.java +lblDoYouWantMove=Do you want to move +lblDeclareDefenderFor=Declare a defender for +lblCardMatchSearchingTypeInAlternateZones=cards match your searching type in Alternate Zones. +lblPutThatCardFrom=Put that card from +lblLookingCardIn=Looking at cards in +lblDoYouWantPlay=Do you want to play +lblSelectCardFrom=Select a card from +lblSelectUpTo=Select up to +lblCardsFrom=cards from +lblSelectCardsFrom=Select cards from +lblCancelSearchUpTo=Cancel Search? Up to +lblMoreCard=more card +lblCanBeSelected=can be selected. +#ChooseCardEffect.java +lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to +lblTotalPower=Total Power +lblCancelChooseConfirm=Cancel Choose? +#ChooseCardNameEffect.java +lblChooseACardName=Choose a card name +lblChooseA=Choose a +lblCardName=card name +lblPicked=picked +#ChooseColorEffect.java +lblChooseAColor=Choose a color +lblChoose=Choose +lblOrMore=or more +#ChooseDirectionEffect.java +lblLeftClockwise=Left (clockwise) +lblRightAntiClockwise=Right (anticlockwise) +lblChooseDirection=Choose a direction +#ChooseGenericEffect.java +lblChooseOne=Choose one +#ChooseNumberEffect.java +lblChooseNumber=Choose a number +lblChose=chose +#ChoosePlayerEffect.java +lblChoosePlayer=Choose a player +#ChooseSourceEffect.java +lblChooseSource=Choose a source +#ClashEffect.java +lblChooseOpponent=Choose a opponent +lblReveals=reveals +lblWinsClash=wins clash +lblLosesClash=loses clash +#CloneEffect.java +lblDoYouWantCopy=Do you want to copy +#ControlExchangeVariantEffect.java +lblChooseCards=Choose cards +#CopyPermanentEffect.java +lblCopyPermanentConfirm=Copy this permanent? +lblDefender=defender +#CopySpellAbilityEffect.java +lblDoyouWantCopyTheSpell=Do you want to copy the spell +lblSelectMultiSpellCopyToStack=Select %d spell to copy to stack +lblSelectASpellCopy=Select a spell to copy +#CounterEffect.java +lblRemoveDestination=a destination to remove +#CountersMoveEffect.java +lblChooseTakeCountersCard=Choose card to take %s counters from +lblTakeHowMany=Take how many +lblCountersFrom=counters from +lblChooseCardToGet=Choose cards to get +lblPutHowMany=Put how many +lblCountersOn=counters on +lblCounters=counters +#CountersProliferateEffect.java +lblChooseProliferateTarget=Choose any number of permanents and/or players for proliferate +#CountersPutEffect.java +lblChooseACreatureWithLeastToughness=Choose a creature with the least toughness +lblSelectCounterTypeAddTo=Select counter type to add to +lblHowManyCounters=How many counters? +lblChooseAnOpponent=Choose an opponent +lblDoYouWantPutTargetP1P1CountersOn=Do you want to put %d +1/+1 counters on +#CountersPutOrRemoveEffect.java +lblSelectCounterTypeToAddOrRemove=Select type of counters to add or remove +lblWhatToDoWithTargetCounter=What to do with that '%s' counter +#CountersRemoveEffect.java +lblAllCounters=all counters +lblACounters=a counter +lblChooseCardtoTakeTargetCounters=Choose cards to take %s counters from +lblSelectRemoveCountersNumberOfTarget=Select the number of %s counters to remove +lblSelectCountersTypeToRemove=Select type of counters to remove +#DamageDealEffect.java +lblDoyouWantDealTargetDamageTo=Do you want to deal %d damage to +#DigEffect.java +lblWouldYouLikeProceedWithOptionalAbility=Would you like to proceed with the optional ability for +lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of %s library +lblChooseACardLeaveTarget=Choose a card to leave in %s +lblChooseCardsPutInto=Choose card(s) to put into +lblChooseCardPutOnTargetLibarayBottom=Choose card(s) to put on the bottom of %s library +lblChooseCardPutOnTargetLibarayTop=Choose card(s) to put on top of %s library +lblNoValidCards=No valid cards +lblThisCard=this card +lblTheseCards=these cards +#DigUntilEffect.java +lblDoYouWantDigYourLibrary=Do you want to dig your library? +lblDoYouWantPutCardTo=Do you want to put that card to +#DiscardEffect.java +lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard %d random card(s)? +lblHasChosen=has chosen +#DrawEffect.java +lblDoYouWantDraw=Do you want to draw +lblHowMayCardDoYouWantDraw=How may cards do you want to draw? +#EncodeEffect.java +lblAndEncodeOntoAYouControlCreature=and encode it onto a creature you control? +lblChooseACreatureYouControlToEncode=Choose a creature you control to encode +lblEncoding=Encoding +#ExploreEffect.java +lblRevealedForExplore=Revealed for Explore +lblPutThisCardToYourGraveyard=Put this card in your graveyard? +#FlipCoinEffect.java +lblHeads=heads +lblTails=tails +lblCallCoinFlip=Call coin flip +lblWin=win +lblLose=lose +#LifeSetEffect.java +lblLifeTotal=Life Total +#ManaEffect.java +lblDoYouWantAddMana=Do you want to add mana? +lblSelectManaProduce=Select Mana to Produce +lblChooseSingleColorFrom=Choose a single color from +#ManifestEffect.java +lblChooseCardToManifest=Choose cards to manifest +#MeldEffect.java +lblChooseCardToMeld=Choose card to meld with +#MillEffect.java +lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to +#MultiplePilesEffect.java +lblChooseCardsInPile=Choose cards in Pile +#PeekAndRevealEffect.java +lblRevealingCardFrom=Revealing cards from +lblRevealCardToOtherPlayers=Reveal cards to other players? +#PlayEffect.java +lblChooseUpTo=Choose up to +lblSelectCardToPlay=Select a card to play +#ProtectAllEffect.java +lblChooseAProtection=Choose a protection +#PumpEffect.java +lblApplyPumpTo=Apply pump to +#RearrangeTopOfLibraryEffect.java +lblDoyouWantShuffleTheLibrary=Do you want to shuffle the library? +#RepeatEffect.java +lblDoYouWantRepeatProcessAgain=Do you want to repeat this process again? +#RevealHandEffect.java +lblDoYouWantRevealYourHand=Do you want to reveal your hand? +#RollPlanarDiceEffect.java +lblRolled=rolled +#SacrificeEffect.java +lblDoYouWantPayEcho=Do you want to pay Echo +lblPayEcho=Pay Echo +lblDoYouWantSacrifice=Do you want to sacrifice? +lblSacrifice=Sacrifice +lblDestroys=Destroys +#SetStateEffect.java +lblFaceDownCardCantTurnFaceUp=Face-down card can't turn face up +#ShuffleEffect.java +lblHaveTargetShuffle=Have %s shuffle? +#SurveilEffect.java +lblDoYouWantSurveil=Do you want to surveil? +#TapOrUntapAllEffect.java +lblPermanents=Permanents +lblTapOrUntap=Tap or Untap +#TwoPilesEffect.java +lblSelectCardForFaceDownPile=Select cards for a face down pile +lblDivideCardIntoTwoPiles=Divide cards into two piles +lblChoosesPile=chooses Pile +lblEmptyPile=Empty pile +#UntapEffect.java +lblSelectCardToUntap=Select cards to untap +#VoteEffect.java +lblVote=Vote +lblCurrentVote=Current Votes +lblHowManyAdditionalVotesDoYouWant=How many additional votes do you want? \ No newline at end of file diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index a5c3b65fdf3..d3cc449fa9b 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1556,8 +1556,210 @@ lblPutIntoLibrary=put into library. lblGainControl=gain control. lblReturnToHand=return to hand. lbldiscard=discard. -lblReveal=reveal. +lblReveal=reveal lblTap=tap. lblCurrentCard=Current Card lblSelectOfCardsTo=Select -lblCardsTo=card(s) to \ No newline at end of file +lblCardsTo=card(s) to +#AbandonEffect.java +lblWouldYoulikeAbandon=Would you like to abandon the scheme +#ActivateAbilityEffect.java +lblChooseManaAbility=Choose a mana ability: +#AddTurnEffect.java +lblTakesExtraTurn=takes an extra turn. +#AmassEffect.java. +lblChooseAnArmy=Choose an army to put counters on +#AssignGroupEffect.java +lblChooseAbilityFor=Choose ability for +#AttachEffect.java +lblDoYouWantAttach=Do you want to attach +lblSelectAPlayerAttachTo=Select a player to attach to. +lblSelectACardAttachTo=Select a card to attach to. +#BidLifeEffect.java +lblChooseStartingBid=Choose a starting bid +lblDoYouWantTopBid=Do you want to top bid? Current Bid \= +lblTopBidWith=topped bid with +#BondEffect.java +lblSelectACardPair=Select a card to pair with +#ChangeCombatantsEffect.java +lblChooseDefenderToAttackWith=Choose which defender to attack with +#ChangeTargetsEffect.java +lblDoYouWantChangeTargets=Do you want to change targets of +#ChangeTextEffect.java +lblChooseColorReplace=Choose a color word to replace +lblChooseNewColor=Choose a new color word +#ChangeZoneEffect.java +lblDoYouWantMove=Do you want to move +lblDeclareDefenderFor=Declare a defender for +lblCardMatchSearchingTypeInAlternateZones=cards match your searching type in Alternate Zones. +lblPutThatCardFrom=Put that card from +lblLookingCardIn=Looking at cards in +lblDoYouWantPlay=Do you want to play +lblSelectCardFrom=Select a card from +lblSelectUpTo=Select up to +lblCardsFrom=cards from +lblSelectCardsFrom=Select cards from +lblCancelSearchUpTo=Cancel Search? Up to +lblMoreCard=more card +lblCanBeSelected=can be selected. +#ChooseCardEffect.java +lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to +lblTotalPower=Total Power +lblCancelChooseConfirm=Cancel Choose? +#ChooseCardNameEffect.java +lblChooseACardName=Choose a card name +lblChooseA=Choose a +lblCardName=card name +lblPicked=picked +#ChooseColorEffect.java +lblChooseAColor=Choose a color +lblChoose=Choose +lblOrMore=or more +#ChooseDirectionEffect.java +lblLeftClockwise=Left (clockwise) +lblRightAntiClockwise=Right (anticlockwise) +lblChooseDirection=Choose a direction +#ChooseGenericEffect.java +lblChooseOne=Choose one +#ChooseNumberEffect.java +lblChooseNumber=Choose a number +lblChose=chose +#ChoosePlayerEffect.java +lblChoosePlayer=Choose a player +#ChooseSourceEffect.java +lblChooseSource=Choose a source +#ClashEffect.java +lblChooseOpponent=Choose a opponent +lblReveals=reveals +lblWinsClash=wins clash +lblLosesClash=loses clash +#CloneEffect.java +lblDoYouWantCopy=Do you want to copy +#ControlExchangeVariantEffect.java +lblChooseCards=Choose cards +#CopyPermanentEffect.java +lblCopyPermanentConfirm=Copy this permanent? +lblDefender=defender +#CopySpellAbilityEffect.java +lblDoyouWantCopyTheSpell=Do you want to copy the spell +lblSelectMultiSpellCopyToStack=Select %d spell to copy to stack +lblSelectASpellCopy=Select a spell to copy +#CounterEffect.java +lblRemoveDestination=a destination to remove +#CountersMoveEffect.java +lblChooseTakeCountersCard=Choose card to take %s counters from +lblTakeHowMany=Take how many +lblCountersFrom=counters from +lblChooseCardToGet=Choose cards to get +lblPutHowMany=Put how many +lblCountersOn=counters on +lblCounters=counters +#CountersProliferateEffect.java +lblChooseProliferateTarget=Choose any number of permanents and/or players for proliferate +#CountersPutEffect.java +lblChooseACreatureWithLeastToughness=Choose a creature with the least toughness +lblSelectCounterTypeAddTo=Select counter type to add to +lblHowManyCounters=How many counters? +lblChooseAnOpponent=Choose an opponent +lblDoYouWantPutTargetP1P1CountersOn=Do you want to put %d +1/+1 counters on +#CountersPutOrRemoveEffect.java +lblSelectCounterTypeToAddOrRemove=Select type of counters to add or remove +lblWhatToDoWithTargetCounter=What to do with that '%s' counter +#CountersRemoveEffect.java +lblAllCounters=all counters +lblACounters=a counter +lblChooseCardtoTakeTargetCounters=Choose cards to take %s counters from +lblSelectRemoveCountersNumberOfTarget=Select the number of %s counters to remove +lblSelectCountersTypeToRemove=Select type of counters to remove +#DamageDealEffect.java +lblDoyouWantDealTargetDamageTo=Do you want to deal %d damage to +#DigEffect.java +lblWouldYouLikeProceedWithOptionalAbility=Would you like to proceed with the optional ability for +lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of %s library +lblChooseACardLeaveTarget=Choose a card to leave in %s +lblChooseCardsPutInto=Choose card(s) to put into +lblChooseCardPutOnTargetLibarayBottom=Choose card(s) to put on the bottom of %s library +lblChooseCardPutOnTargetLibarayTop=Choose card(s) to put on top of %s library +lblNoValidCards=No valid cards +lblThisCard=this card +lblTheseCards=these cards +#DigUntilEffect.java +lblDoYouWantDigYourLibrary=Do you want to dig your library? +lblDoYouWantPutCardTo=Do you want to put that card to +#DiscardEffect.java +lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard %d random card(s)? +lblHasChosen=has chosen +#DrawEffect.java +lblDoYouWantDraw=Do you want to draw +lblHowMayCardDoYouWantDraw=How may cards do you want to draw? +#EncodeEffect.java +lblAndEncodeOntoAYouControlCreature=and encode it onto a creature you control? +lblChooseACreatureYouControlToEncode=Choose a creature you control to encode +lblEncoding=Encoding +#ExploreEffect.java +lblRevealedForExplore=Revealed for Explore +lblPutThisCardToYourGraveyard=Put this card in your graveyard? +#FlipCoinEffect.java +lblHeads=heads +lblTails=tails +lblCallCoinFlip=Call coin flip +lblWin=win +lblLose=lose +#LifeSetEffect.java +lblLifeTotal=Life Total +#ManaEffect.java +lblDoYouWantAddMana=Do you want to add mana? +lblSelectManaProduce=Select Mana to Produce +lblChooseSingleColorFrom=Choose a single color from +#ManifestEffect.java +lblChooseCardToManifest=Choose cards to manifest +#MeldEffect.java +lblChooseCardToMeld=Choose card to meld with +#MillEffect.java +lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to +#MultiplePilesEffect.java +lblChooseCardsInPile=Choose cards in Pile +#PeekAndRevealEffect.java +lblRevealingCardFrom=Revealing cards from +lblRevealCardToOtherPlayers=Reveal cards to other players? +#PlayEffect.java +lblChooseUpTo=Choose up to +lblSelectCardToPlay=Select a card to play +#ProtectAllEffect.java +lblChooseAProtection=Choose a protection +#PumpEffect.java +lblApplyPumpTo=Apply pump to +#RearrangeTopOfLibraryEffect.java +lblDoyouWantShuffleTheLibrary=Do you want to shuffle the library? +#RepeatEffect.java +lblDoYouWantRepeatProcessAgain=Do you want to repeat this process again? +#RevealHandEffect.java +lblDoYouWantRevealYourHand=Do you want to reveal your hand? +#RollPlanarDiceEffect.java +lblRolled=rolled +#SacrificeEffect.java +lblDoYouWantPayEcho=Do you want to pay Echo +lblPayEcho=Pay Echo +lblDoYouWantSacrifice=Do you want to sacrifice? +lblSacrifice=Sacrifice +lblDestroys=Destroys +#SetStateEffect.java +lblFaceDownCardCantTurnFaceUp=Face-down card can't turn face up +#ShuffleEffect.java +lblHaveTargetShuffle=Have %s shuffle? +#SurveilEffect.java +lblDoYouWantSurveil=Do you want to surveil? +#TapOrUntapAllEffect.java +lblPermanents=Permanents +lblTapOrUntap=Tap or Untap +#TwoPilesEffect.java +lblSelectCardForFaceDownPile=Select cards for a face down pile +lblDivideCardIntoTwoPiles=Divide cards into two piles +lblChoosesPile=chooses Pile +lblEmptyPile=Empty pile +#UntapEffect.java +lblSelectCardToUntap=Select cards to untap +#VoteEffect.java +lblVote=Vote +lblCurrentVote=Current Votes +lblHowManyAdditionalVotesDoYouWant=How many additional votes do you want? \ No newline at end of file diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index e333ce3c909..cefb592ae04 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1556,8 +1556,210 @@ lblPutIntoLibrary=put into library. lblGainControl=gain control. lblReturnToHand=return to hand. lbldiscard=discard. -lblReveal=reveal. +lblReveal=reveal lblTap=tap. lblCurrentCard=Current Card lblSelectOfCardsTo=Select -lblCardsTo=card(s) to \ No newline at end of file +lblCardsTo=card(s) to +#AbandonEffect.java +lblWouldYoulikeAbandon=Would you like to abandon the scheme +#ActivateAbilityEffect.java +lblChooseManaAbility=Choose a mana ability: +#AddTurnEffect.java +lblTakesExtraTurn=takes an extra turn. +#AmassEffect.java. +lblChooseAnArmy=Choose an army to put counters on +#AssignGroupEffect.java +lblChooseAbilityFor=Choose ability for +#AttachEffect.java +lblDoYouWantAttach=Do you want to attach +lblSelectAPlayerAttachTo=Select a player to attach to. +lblSelectACardAttachTo=Select a card to attach to. +#BidLifeEffect.java +lblChooseStartingBid=Choose a starting bid +lblDoYouWantTopBid=Do you want to top bid? Current Bid \= +lblTopBidWith=topped bid with +#BondEffect.java +lblSelectACardPair=Select a card to pair with +#ChangeCombatantsEffect.java +lblChooseDefenderToAttackWith=Choose which defender to attack with +#ChangeTargetsEffect.java +lblDoYouWantChangeTargets=Do you want to change targets of +#ChangeTextEffect.java +lblChooseColorReplace=Choose a color word to replace +lblChooseNewColor=Choose a new color word +#ChangeZoneEffect.java +lblDoYouWantMove=Do you want to move +lblDeclareDefenderFor=Declare a defender for +lblCardMatchSearchingTypeInAlternateZones=cards match your searching type in Alternate Zones. +lblPutThatCardFrom=Put that card from +lblLookingCardIn=Looking at cards in +lblDoYouWantPlay=Do you want to play +lblSelectCardFrom=Select a card from +lblSelectUpTo=Select up to +lblCardsFrom=cards from +lblSelectCardsFrom=Select cards from +lblCancelSearchUpTo=Cancel Search? Up to +lblMoreCard=more card +lblCanBeSelected=can be selected. +#ChooseCardEffect.java +lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to +lblTotalPower=Total Power +lblCancelChooseConfirm=Cancel Choose? +#ChooseCardNameEffect.java +lblChooseACardName=Choose a card name +lblChooseA=Choose a +lblCardName=card name +lblPicked=picked +#ChooseColorEffect.java +lblChooseAColor=Choose a color +lblChoose=Choose +lblOrMore=or more +#ChooseDirectionEffect.java +lblLeftClockwise=Left (clockwise) +lblRightAntiClockwise=Right (anticlockwise) +lblChooseDirection=Choose a direction +#ChooseGenericEffect.java +lblChooseOne=Choose one +#ChooseNumberEffect.java +lblChooseNumber=Choose a number +lblChose=chose +#ChoosePlayerEffect.java +lblChoosePlayer=Choose a player +#ChooseSourceEffect.java +lblChooseSource=Choose a source +#ClashEffect.java +lblChooseOpponent=Choose a opponent +lblReveals=reveals +lblWinsClash=wins clash +lblLosesClash=loses clash +#CloneEffect.java +lblDoYouWantCopy=Do you want to copy +#ControlExchangeVariantEffect.java +lblChooseCards=Choose cards +#CopyPermanentEffect.java +lblCopyPermanentConfirm=Copy this permanent? +lblDefender=defender +#CopySpellAbilityEffect.java +lblDoyouWantCopyTheSpell=Do you want to copy the spell +lblSelectMultiSpellCopyToStack=Select %d spell to copy to stack +lblSelectASpellCopy=Select a spell to copy +#CounterEffect.java +lblRemoveDestination=a destination to remove +#CountersMoveEffect.java +lblChooseTakeCountersCard=Choose card to take %s counters from +lblTakeHowMany=Take how many +lblCountersFrom=counters from +lblChooseCardToGet=Choose cards to get +lblPutHowMany=Put how many +lblCountersOn=counters on +lblCounters=counters +#CountersProliferateEffect.java +lblChooseProliferateTarget=Choose any number of permanents and/or players for proliferate +#CountersPutEffect.java +lblChooseACreatureWithLeastToughness=Choose a creature with the least toughness +lblSelectCounterTypeAddTo=Select counter type to add to +lblHowManyCounters=How many counters? +lblChooseAnOpponent=Choose an opponent +lblDoYouWantPutTargetP1P1CountersOn=Do you want to put %d +1/+1 counters on +#CountersPutOrRemoveEffect.java +lblSelectCounterTypeToAddOrRemove=Select type of counters to add or remove +lblWhatToDoWithTargetCounter=What to do with that '%s' counter +#CountersRemoveEffect.java +lblAllCounters=all counters +lblACounters=a counter +lblChooseCardtoTakeTargetCounters=Choose cards to take %s counters from +lblSelectRemoveCountersNumberOfTarget=Select the number of %s counters to remove +lblSelectCountersTypeToRemove=Select type of counters to remove +#DamageDealEffect.java +lblDoyouWantDealTargetDamageTo=Do you want to deal %d damage to +#DigEffect.java +lblWouldYouLikeProceedWithOptionalAbility=Would you like to proceed with the optional ability for +lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of %s library +lblChooseACardLeaveTarget=Choose a card to leave in %s +lblChooseCardsPutInto=Choose card(s) to put into +lblChooseCardPutOnTargetLibarayBottom=Choose card(s) to put on the bottom of %s library +lblChooseCardPutOnTargetLibarayTop=Choose card(s) to put on top of %s library +lblNoValidCards=No valid cards +lblThisCard=this card +lblTheseCards=these cards +#DigUntilEffect.java +lblDoYouWantDigYourLibrary=Do you want to dig your library? +lblDoYouWantPutCardTo=Do you want to put that card to +#DiscardEffect.java +lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard %d random card(s)? +lblHasChosen=has chosen +#DrawEffect.java +lblDoYouWantDraw=Do you want to draw +lblHowMayCardDoYouWantDraw=How may cards do you want to draw? +#EncodeEffect.java +lblAndEncodeOntoAYouControlCreature=and encode it onto a creature you control? +lblChooseACreatureYouControlToEncode=Choose a creature you control to encode +lblEncoding=Encoding +#ExploreEffect.java +lblRevealedForExplore=Revealed for Explore +lblPutThisCardToYourGraveyard=Put this card in your graveyard? +#FlipCoinEffect.java +lblHeads=heads +lblTails=tails +lblCallCoinFlip=Call coin flip +lblWin=win +lblLose=lose +#LifeSetEffect.java +lblLifeTotal=Life Total +#ManaEffect.java +lblDoYouWantAddMana=Do you want to add mana? +lblSelectManaProduce=Select Mana to Produce +lblChooseSingleColorFrom=Choose a single color from +#ManifestEffect.java +lblChooseCardToManifest=Choose cards to manifest +#MeldEffect.java +lblChooseCardToMeld=Choose card to meld with +#MillEffect.java +lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to +#MultiplePilesEffect.java +lblChooseCardsInPile=Choose cards in Pile +#PeekAndRevealEffect.java +lblRevealingCardFrom=Revealing cards from +lblRevealCardToOtherPlayers=Reveal cards to other players? +#PlayEffect.java +lblChooseUpTo=Choose up to +lblSelectCardToPlay=Select a card to play +#ProtectAllEffect.java +lblChooseAProtection=Choose a protection +#PumpEffect.java +lblApplyPumpTo=Apply pump to +#RearrangeTopOfLibraryEffect.java +lblDoyouWantShuffleTheLibrary=Do you want to shuffle the library? +#RepeatEffect.java +lblDoYouWantRepeatProcessAgain=Do you want to repeat this process again? +#RevealHandEffect.java +lblDoYouWantRevealYourHand=Do you want to reveal your hand? +#RollPlanarDiceEffect.java +lblRolled=rolled +#SacrificeEffect.java +lblDoYouWantPayEcho=Do you want to pay Echo +lblPayEcho=Pay Echo +lblDoYouWantSacrifice=Do you want to sacrifice? +lblSacrifice=Sacrifice +lblDestroys=Destroys +#SetStateEffect.java +lblFaceDownCardCantTurnFaceUp=Face-down card can't turn face up +#ShuffleEffect.java +lblHaveTargetShuffle=Have %s shuffle? +#SurveilEffect.java +lblDoYouWantSurveil=Do you want to surveil? +#TapOrUntapAllEffect.java +lblPermanents=Permanents +lblTapOrUntap=Tap or Untap +#TwoPilesEffect.java +lblSelectCardForFaceDownPile=Select cards for a face down pile +lblDivideCardIntoTwoPiles=Divide cards into two piles +lblChoosesPile=chooses Pile +lblEmptyPile=Empty pile +#UntapEffect.java +lblSelectCardToUntap=Select cards to untap +#VoteEffect.java +lblVote=Vote +lblCurrentVote=Current Votes +lblHowManyAdditionalVotesDoYouWant=How many additional votes do you want? \ No newline at end of file diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 4af80bf244f..b9ada2e0721 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -94,7 +94,7 @@ cbHideReminderText=隐藏提示文字 cbOpenPacksIndiv=逐个打开补充包 cbTokensInSeparateRow=在单独一行中显示衍生物 cbStackCreatures=堆叠生物 -cbFilterLandsByColorId=在启动式异能中按颜色筛选地 +cbFilterLandsByColorId=在起动式异能中按颜色筛选地 cbShowStormCount=在提示窗中显示风暴计数 cbRemindOnPriority=获得优先权时高亮提示 cbUseSentry=自动提交错误报告 @@ -117,7 +117,7 @@ nlUseSentry=启用后,会自动向开发人员提交错误报告。 GamePlay=游戏 nlpMulliganRule=选择调度规则 nlpAiProfiles=选择你的人工智能对手 -nlpStackAdditions=选择何时因效应进入堆叠而提供视觉提醒:从不,总是,任何由人工智能释放或启动以及由任何玩家触发的效应。 +nlpStackAdditions=选择何时因效应进入堆叠而提供视觉提醒:从不,总是,任何由人工智能释放或起动以及由任何玩家触发的效应。 nlAnte=确定游戏是否使用赌注 nlAnteMatchRarity=尝试为所有玩家生成同稀有度赌注 nlEnableAICheats=允许人工智能进行作弊以获得优势(对于已经设置了作弊洗牌的人工智能)。 @@ -1135,7 +1135,7 @@ lblDoNextActioninSequence=按顺序执行下一步操作 lblPleaseDefineanActionSequenceFirst=请先定义一个动作序列。 lblRememberActionSequence=记住动作序列 lblYouMustHavePrioritytoUseThisFeature=你必须有使用此功能的优先权。 -lblNameTheCard=命名牌 +lblNameTheCard=选择牌名 lblWhichPlayerShouldRoll=哪位玩家掷骰子? lblChooseResult=选择结果 lblChosenCardNotPermanentorCantExistIndependentlyontheBattleground=选择的牌不是永久物,也不能在战场单独存在。\n如果你想释放费永久物咒语或者你想释放永久物咒语并将之放于堆叠上,请按"Cast Spell/Play Land"按钮。 @@ -1247,7 +1247,7 @@ lblLoadingThePuzzle=加载新的谜题中 #InputPassPriority.java lblCastSpell=释放咒语 lblPlayLand=使用地 -lblActivateAbility=启动式异能 +lblActivateAbility=起动式异能 lblYouHaveManaFloatingInYourManaPoolCouldBeLostIfPassPriority=你的法术力池中还有剩余的法术力,如果现在让过优先权,这些法术力可能会丢失。 lblYouWillTakeManaBurnDamageEqualAmountFloatingManaLostThisWay=你将受到等同于通过这种方式失去的剩余法术力数量的法术力灼烧伤害。 lblManaFloating=剩余法术力 @@ -1372,7 +1372,7 @@ lblSearcher=搜寻者 #TriggerShuffled.java lblShuffler=洗牌者 #TriggerSpellAbilityCast.java -lblActivator=启动自 +lblActivator=起动自 #TriggerSpellAbilityCast.java lblSpellAbility=咒语异能 #TriggerTaps.java @@ -1556,8 +1556,210 @@ lblPutIntoLibrary=放入牌库。 lblGainControl=获得控制权。 lblReturnToHand=返回手牌。 lbldiscard=弃牌。 -lblReveal=展示。 +lblReveal=展示 lblTap=横置。 lblCurrentCard=当前牌 lblSelectOfCardsTo=选择 -lblCardsTo=牌到 \ No newline at end of file +lblCardsTo=牌到 +#AbandonEffect.java +lblWouldYoulikeAbandon=你想要终止阴谋 +#ActivateAbilityEffect.java +lblChooseManaAbility=选择一个法术力异能: +#AddTurnEffect.java +lblTakesExtraTurn=获得一个额外回合。 +#AmassEffect.java. +lblChooseAnArmy=选择一个军队将指示物放置在上面。 +#AssignGroupEffect.java +lblChooseAbilityFor=选择一个异能 +#AttachEffect.java +lblDoYouWantAttach=你想要装备 +lblSelectAPlayerAttachTo=选择一个要结附的牌手。 +lblSelectACardAttachTo=选择一个要结附的牌。 +#BidLifeEffect.java +lblChooseStartingBid=选择一个初始价钱 +lblDoYouWantTopBid=你想要喊更高的价? 现在价钱 \= +lblTopBidWith=最高喊价 +#BondEffect.java +lblSelectACardPair=选择要组成搭档的牌 +#ChangeCombatantsEffect.java +lblChooseDefenderToAttackWith=选择守军进行进攻 +#ChangeTargetsEffect.java +lblDoYouWantChangeTargets=你是否想要更改目标 +#ChangeTextEffect.java +lblChooseColorReplace=选择一个要替换的颜色词 +lblChooseNewColor=选择一个新的颜色词 +#ChangeZoneEffect.java +lblDoYouWantMove=你想要移动 +lblDeclareDefenderFor=声明阻挡者 +lblCardMatchSearchingTypeInAlternateZones=在你的备用区域搜索匹配类型的卡牌。 +lblPutThatCardFrom=放置这张牌从 +lblLookingCardIn=看这张牌于 +lblDoYouWantPlay=你想要使用 +lblSelectCardFrom=选择一张牌从 +lblSelectUpTo=最多选择 +lblCardsFrom=牌张来自 +lblSelectCardsFrom=选择牌张来自 +lblCancelSearchUpTo=取消搜索?直到 +lblMoreCard=更多牌 +lblCanBeSelected=可以选择 +#ChooseCardEffect.java +lblSelectCreatureWithTotalPowerLessOrEqualTo=选择一些生物其力量合小于或等于 +lblTotalPower=总力量 +lblCancelChooseConfirm=取消选择? +#ChooseCardNameEffect.java +lblChooseACardName=选择一个牌名 +lblChooseA=选择一个 +lblCardName=牌名 +lblPicked=选取 +#ChooseColorEffect.java +lblChooseAColor=选择一个颜色 +lblChoose=选择 +lblOrMore=或更多 +#ChooseDirectionEffect.java +lblLeftClockwise=左(顺时针) +lblRightAntiClockwise=右(逆时针) +lblChooseDirection=选择一个方向 +#ChooseGenericEffect.java +lblChooseOne=选择一个 +#ChooseNumberEffect.java +lblChooseNumber=选择一个数 +lblChose=已选择 +#ChoosePlayerEffect.java +lblChoosePlayer=选择一个牌手 +#ChooseSourceEffect.java +lblChooseSource=选择一个来源 +#ClashEffect.java +lblChooseOpponent=选择一个对手 +lblReveals=展示 +lblWinsClash=比点赢了 +lblLosesClash=比点输了 +#CloneEffect.java +lblDoYouWantCopy=你想要复制 +#ControlExchangeVariantEffect.java +lblChooseCards=选择牌 +#CopyPermanentEffect.java +lblCopyPermanentConfirm=复制这个永久物? +lblDefender=守军 +#CopySpellAbilityEffect.java +lblDoyouWantCopyTheSpell=你想要复制这个咒语 +lblSelectMultiSpellCopyToStack=选择%d个咒语复制到堆叠 +lblSelectASpellCopy=选择一个咒语进行复制 +#CounterEffect.java +lblRemoveDestination=要删除的目标 +#CountersMoveEffect.java +lblChooseTakeCountersCard=选择牌获得%s指示物自 +lblTakeHowMany=获得几个 +lblCountersFrom=指示物自 +lblChooseCardToGet=选择牌获得 +lblPutHowMany=放置几个 +lblCountersOn=指示物在上面 +lblCounters=指示物 +#CountersProliferateEffect.java +lblChooseProliferateTarget=选择任意数量的永久物和或牌手进行增殖 +#CountersPutEffect.java +lblChooseACreatureWithLeastToughness=选择防御力最小的生物 +lblSelectCounterTypeAddTo=选择指示物类型以添加到 +lblHowManyCounters=多少指示物? +lblChooseAnOpponent=选择一个对手 +lblDoYouWantPutTargetP1P1CountersOn=你想要放置%d个+1+1指示物到 +#CountersPutOrRemoveEffect.java +lblSelectCounterTypeToAddOrRemove=选择要添加或移除的指示物的类型 +lblWhatToDoWithTargetCounter=如何使用'%s'指示物 +#CountersRemoveEffect.java +lblAllCounters=所有指示物 +lblACounters=一个指示物 +lblChooseCardtoTakeTargetCounters=选择牌要获得%s指示物自 +lblSelectRemoveCountersNumberOfTarget=选择要删除的%s指示物的数量 +lblSelectCountersTypeToRemove=选择要删除的指示物类型 +#DamageDealEffect.java +lblDoyouWantDealTargetDamageTo=你想造成%d伤害给 +#DigEffect.java +lblWouldYouLikeProceedWithOptionalAbility=你想继续以下可选的异能吗 +lblChooseACardToLeaveTargetLibraryTop=选择一张牌离开%s的牌库顶 +lblChooseACardLeaveTarget=选择一张牌离开%s +lblChooseCardsPutInto=选择牌放到 +lblChooseCardPutOnTargetLibarayBottom=选择牌放到%s的牌库底 +lblChooseCardPutOnTargetLibarayTop=选择牌放到%s的牌库顶 +lblNoValidCards=没有有效的牌 +lblThisCard=这张牌 +lblTheseCards=这些牌 +#DigUntilEffect.java +lblDoYouWantDigYourLibrary=你想要挖掘你的牌库吗? +lblDoYouWantPutCardTo=你想把这张牌放到 +#DiscardEffect.java +lblWouldYouLikeRandomDiscardTargetCard=你想随机弃掉%d张牌吗? +lblHasChosen=选择了 +#DrawEffect.java +lblDoYouWantDraw=你想抓 +lblHowMayCardDoYouWantDraw=你想怎么抓牌? +#EncodeEffect.java +lblAndEncodeOntoAYouControlCreature=和赋码到你控制的生物? +lblChooseACreatureYouControlToEncode=选择你控制的生物进场赋码 +lblEncoding=已赋码 +#ExploreEffect.java +lblRevealedForExplore=勘察所展示 +lblPutThisCardToYourGraveyard=把这张牌放到你的坟墓场? +#FlipCoinEffect.java +lblHeads=正面 +lblTails=背面 +lblCallCoinFlip=掷骰子 +lblWin=赢 +lblLose=输 +#LifeSetEffect.java +lblLifeTotal=生命总数 +#ManaEffect.java +lblDoYouWantAddMana=你想增加法术力吗? +lblSelectManaProduce=选择要产出的法术力 +lblChooseSingleColorFrom=选择一种颜色自 +#ManifestEffect.java +lblChooseCardToManifest=选择要显化的牌 +#MeldEffect.java +lblChooseCardToMeld=选择要融合的牌 +#MillEffect.java +lblDoYouWantPutLibraryCardsTo=你想要从牌库中把牌放入 +#MultiplePilesEffect.java +lblChooseCardsInPile=选择一堆卡 +#PeekAndRevealEffect.java +lblRevealingCardFrom=展示牌自 +lblRevealCardToOtherPlayers=想其他玩家展示牌? +#PlayEffect.java +lblChooseUpTo=选择最多 +lblSelectCardToPlay=选择要使用的牌 +#ProtectAllEffect.java +lblChooseAProtection=选择一个保护 +#PumpEffect.java +lblApplyPumpTo=将pump用于 +#RearrangeTopOfLibraryEffect.java +lblDoyouWantShuffleTheLibrary=你想要洗这个牌库吗? +#RepeatEffect.java +lblDoYouWantRepeatProcessAgain=你是否想再次重复这个过程? +#RevealHandEffect.java +lblDoYouWantRevealYourHand=你想展示你的手牌吗? +#RollPlanarDiceEffect.java +lblRolled=rolled +#SacrificeEffect.java +lblDoYouWantPayEcho=你想支付返响费用 +lblPayEcho=支付返响费用 +lblDoYouWantSacrifice=你想牺牲吗? +lblSacrifice=牺牲 +lblDestroys=消灭 +#SetStateEffect.java +lblFaceDownCardCantTurnFaceUp=面朝下的牌不能面朝上 +#ShuffleEffect.java +lblHaveTargetShuffle=%s洗牌了吗? +#SurveilEffect.java +lblDoYouWantSurveil=你想刺探吗? +#TapOrUntapAllEffect.java +lblPermanents=永久物 +lblTapOrUntap=横置或重置 +#TwoPilesEffect.java +lblSelectCardForFaceDownPile=选择一个面朝下的堆 +lblDivideCardIntoTwoPiles=将牌分为两堆 +lblChoosesPile=选择堆 +lblEmptyPile=空堆 +#UntapEffect.java +lblSelectCardToUntap=选择要重置的牌 +#VoteEffect.java +lblVote=投票 +lblCurrentVote=当前投票 +lblHowManyAdditionalVotesDoYouWant=你想要额外投多少票? \ No newline at end of file From a1fe5c5db1463243b149cd84f25a9c76f6f80b57 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Tue, 24 Dec 2019 11:42:46 +0800 Subject: [PATCH 24/54] update interactive message translate --- forge-gui/res/languages/de-DE.properties | 58 +++++- forge-gui/res/languages/en-US.properties | 58 +++++- forge-gui/res/languages/es-ES.properties | 58 +++++- forge-gui/res/languages/zh-CN.properties | 62 +++++- .../forge/player/PlayerControllerHuman.java | 180 +++++++++--------- 5 files changed, 320 insertions(+), 96 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index b2838f08e71..5ba605f565c 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1188,6 +1188,62 @@ lblChooseOrderCardsPutIntoSchemeDeck=Wähle die Reihenfolge der Karten, in der s lblChooseOrderCopiesCast=Wähle die Reihenfolge für die Kopien lblDelveHowManyCards=Wühlen - Wie viele Karten? lblExileWhichCard=Schicke welche Karte ins Exil? +lblDestroy=destroy +lblUpTo=up to +lblHighestBidder=Highest Bidder +lblUseTriggeredAbilityOf=Use triggered ability of +lblExertAttackersConfirm=Exert Attackers? +lblThereNoCardIn=There are no cards in +lblPut=Put +lblOnTheTopLibraryOrGraveyard=on the top of library or graveyard? +lblLibrary=Library +lblGraveyard=Graveyard +lblTop=Top +lblBottom=Bottom +lblManaFrom=mana from +lblPayManaFromManaPool=Pay Mana from Mana Pool +lblChooseATargetType=Choose a %s type +lblUntap=Untap +lblOdds=Odds +lblEvens=Evens +lblLeaveTapped=Leave tapped +lblUntapAndSkipThisTurn=Untap (and skip this turn) +lblLeft=Left +lblRight=Right +lblAddCounter=Add Counter +lblRemoveCounter=Remove Counter +lblWinTheFlip=win the flip +lblLoseTheFlip=lose the flip +lblChooseAResult=Choose a result +lblSelectPreventionShieldToUse=select which prevention shield to use +lblChooseAMode=Choose a mode +lblActivated=activated +lblNoPlayerHasPriorityCannotAddedManaToPool=No player has priority at the moment, so mana cannot be added to their pool. +lblOverwriteExistFileConfirm=Overwrite existing file? +lblFileExists=File exists! +lblSelectGameStateFile=Select Game State File +lblFileNotFound=File not found +lblIn=in +lblOnTheBattlefield=on the battlefield +lblOnTheStackOrInPlay=on the stack / in play +lblPutCard=Put card +lblForWhichPlayer=for which player? +lblShould=Should +lblAffectedWithSummoningSickness=be affected with Summoning Sickness? +lblBeAddedToLibraryTopOrBottom=be added to the top or to the bottom of the library? +lblExileCardsFromPlayerHandConfirm=Exile card(s) from which player's hand? +lblChooseCardsExile=Choose cards to exile +lblExileCardsFromPlayerBattlefieldConfirm=Exile card(s) from which player's battlefield? +lblRemoveCardBelongingWitchPlayer=Remove card(s) belonging to which player? +lblRemoveCardFromWhichZone=Remove card(s) from which zone? +lblChooseCardsRemoveFromGame=Choose cards to remove from game +lblRemoved=Removed +lblEnterASequence=Enter a sequence (card IDs and/or "opponent"/"me"). (e.g. 7, opponent, 18) +lblActionSequenceCleared=Action sequence cleared. +lblRestartingActionSequence=Restarting action sequence. +lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces and/or commas. +lblErrorEntityWithId=Error: Entity with ID +lblNotFound=not found #AbstractGuiGame.java lblConcedeCurrentGame=Das Spiel wird als verloren gewertet.\n\nTrotzdem aufgeben? lblConcedeTitle=Spiel verloren geben? @@ -1557,7 +1613,7 @@ lblGainControl=gain control. lblReturnToHand=return to hand. lbldiscard=discard. lblReveal=reveal -lblTap=tap. +lblTap=tap lblCurrentCard=Current Card lblSelectOfCardsTo=Select lblCardsTo=card(s) to diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index d3cc449fa9b..06b052d005e 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1188,6 +1188,62 @@ lblChooseOrderCardsPutIntoSchemeDeck=Choose order of cards to put into the schem lblChooseOrderCopiesCast=Choose order of copies to cast lblDelveHowManyCards=Delve how many cards? lblExileWhichCard=Exile which card? +lblDestroy=destroy +lblUpTo=up to +lblHighestBidder=Highest Bidder +lblUseTriggeredAbilityOf=Use triggered ability of +lblExertAttackersConfirm=Exert Attackers? +lblThereNoCardIn=There are no cards in +lblPut=Put +lblOnTheTopLibraryOrGraveyard=on the top of library or graveyard? +lblLibrary=Library +lblGraveyard=Graveyard +lblTop=Top +lblBottom=Bottom +lblManaFrom=mana from +lblPayManaFromManaPool=Pay Mana from Mana Pool +lblChooseATargetType=Choose a %s type +lblUntap=Untap +lblOdds=Odds +lblEvens=Evens +lblLeaveTapped=Leave tapped +lblUntapAndSkipThisTurn=Untap (and skip this turn) +lblLeft=Left +lblRight=Right +lblAddCounter=Add Counter +lblRemoveCounter=Remove Counter +lblWinTheFlip=win the flip +lblLoseTheFlip=lose the flip +lblChooseAResult=Choose a result +lblSelectPreventionShieldToUse=select which prevention shield to use +lblChooseAMode=Choose a mode +lblActivated=activated +lblNoPlayerHasPriorityCannotAddedManaToPool=No player has priority at the moment, so mana cannot be added to their pool. +lblOverwriteExistFileConfirm=Overwrite existing file? +lblFileExists=File exists! +lblSelectGameStateFile=Select Game State File +lblFileNotFound=File not found +lblIn=in +lblOnTheBattlefield=on the battlefield +lblOnTheStackOrInPlay=on the stack / in play +lblPutCard=Put card +lblForWhichPlayer=for which player? +lblShould=Should +lblAffectedWithSummoningSickness=be affected with Summoning Sickness? +lblBeAddedToLibraryTopOrBottom=be added to the top or to the bottom of the library? +lblExileCardsFromPlayerHandConfirm=Exile card(s) from which player's hand? +lblChooseCardsExile=Choose cards to exile +lblExileCardsFromPlayerBattlefieldConfirm=Exile card(s) from which player's battlefield? +lblRemoveCardBelongingWitchPlayer=Remove card(s) belonging to which player? +lblRemoveCardFromWhichZone=Remove card(s) from which zone? +lblChooseCardsRemoveFromGame=Choose cards to remove from game +lblRemoved=Removed +lblEnterASequence=Enter a sequence (card IDs and/or "opponent"/"me"). (e.g. 7, opponent, 18) +lblActionSequenceCleared=Action sequence cleared. +lblRestartingActionSequence=Restarting action sequence. +lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces and/or commas. +lblErrorEntityWithId=Error: Entity with ID +lblNotFound=not found #AbstractGuiGame.java lblConcedeCurrentGame=This will concede the current game and you will lose.\n\nConcede anyway? lblConcedeTitle=Concede Game? @@ -1557,7 +1613,7 @@ lblGainControl=gain control. lblReturnToHand=return to hand. lbldiscard=discard. lblReveal=reveal -lblTap=tap. +lblTap=tap lblCurrentCard=Current Card lblSelectOfCardsTo=Select lblCardsTo=card(s) to diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index cefb592ae04..db61fed8d32 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1188,6 +1188,62 @@ lblChooseOrderCardsPutIntoSchemeDeck=Elige el orden de las cartas que quieres po lblChooseOrderCopiesCast=Elige el orden de las copias que se van a invocar lblDelveHowManyCards=¿Excavar cuántas cartas? lblExileWhichCard=¿Exiliar qué carta? +lblDestroy=destroy +lblUpTo=up to +lblHighestBidder=Highest Bidder +lblUseTriggeredAbilityOf=Use triggered ability of +lblExertAttackersConfirm=Exert Attackers? +lblThereNoCardIn=There are no cards in +lblPut=Put +lblOnTheTopLibraryOrGraveyard=on the top of library or graveyard? +lblLibrary=Library +lblGraveyard=Graveyard +lblTop=Top +lblBottom=Bottom +lblManaFrom=mana from +lblPayManaFromManaPool=Pay Mana from Mana Pool +lblChooseATargetType=Choose a %s type +lblUntap=Untap +lblOdds=Odds +lblEvens=Evens +lblLeaveTapped=Leave tapped +lblUntapAndSkipThisTurn=Untap (and skip this turn) +lblLeft=Left +lblRight=Right +lblAddCounter=Add Counter +lblRemoveCounter=Remove Counter +lblWinTheFlip=win the flip +lblLoseTheFlip=lose the flip +lblChooseAResult=Choose a result +lblSelectPreventionShieldToUse=select which prevention shield to use +lblChooseAMode=Choose a mode +lblActivated=activated +lblNoPlayerHasPriorityCannotAddedManaToPool=No player has priority at the moment, so mana cannot be added to their pool. +lblOverwriteExistFileConfirm=Overwrite existing file? +lblFileExists=File exists! +lblSelectGameStateFile=Select Game State File +lblFileNotFound=File not found +lblIn=in +lblOnTheBattlefield=on the battlefield +lblOnTheStackOrInPlay=on the stack / in play +lblPutCard=Put card +lblForWhichPlayer=for which player? +lblShould=Should +lblAffectedWithSummoningSickness=be affected with Summoning Sickness? +lblBeAddedToLibraryTopOrBottom=be added to the top or to the bottom of the library? +lblExileCardsFromPlayerHandConfirm=Exile card(s) from which player's hand? +lblChooseCardsExile=Choose cards to exile +lblExileCardsFromPlayerBattlefieldConfirm=Exile card(s) from which player's battlefield? +lblRemoveCardBelongingWitchPlayer=Remove card(s) belonging to which player? +lblRemoveCardFromWhichZone=Remove card(s) from which zone? +lblChooseCardsRemoveFromGame=Choose cards to remove from game +lblRemoved=Removed +lblEnterASequence=Enter a sequence (card IDs and/or "opponent"/"me"). (e.g. 7, opponent, 18) +lblActionSequenceCleared=Action sequence cleared. +lblRestartingActionSequence=Restarting action sequence. +lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces and/or commas. +lblErrorEntityWithId=Error: Entity with ID +lblNotFound=not found #AbstractGuiGame.java lblConcedeCurrentGame=Esto concederá la partida actual y perderás.\n\n¿Conceder de todos modos? lblConcedeTitle=¿Conceder Partida? @@ -1557,7 +1613,7 @@ lblGainControl=gain control. lblReturnToHand=return to hand. lbldiscard=discard. lblReveal=reveal -lblTap=tap. +lblTap=tap lblCurrentCard=Current Card lblSelectOfCardsTo=Select lblCardsTo=card(s) to diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index b9ada2e0721..9ff9e6d7a65 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1188,6 +1188,62 @@ lblChooseOrderCardsPutIntoSchemeDeck=选择要放入魔王套牌中的牌的顺 lblChooseOrderCopiesCast=选择要复制品的释放顺序。 lblDelveHowManyCards=掘穴多少张牌? lblExileWhichCard=放逐哪张牌? +lblDestroy=消灭 +lblUpTo=最多 +lblHighestBidder=最高出价者 +lblUseTriggeredAbilityOf=使用触发异能 +lblExertAttackersConfirm=进攻者耗竭? +lblThereNoCardIn=里面没有牌 +lblPut=放到 +lblOnTheTopLibraryOrGraveyard=牌库顶或坟场? +lblLibrary=牌库 +lblGraveyard=坟场 +lblTop=顶 +lblBottom=底 +lblManaFrom=法术力自 +lblPayManaFromManaPool=从法术力池支付法术力 +lblChooseATargetType=选择一个%s类型 +lblUntap=重置 +lblOdds=赔率 +lblEvens=偶数 +lblLeaveTapped=轻按一下 +lblUntapAndSkipThisTurn=取消点击(并跳过当前回合) +lblLeft=左 +lblRight=右 +lblAddCounter=增加指示物 +lblRemoveCounter=移除指示物 +lblWinTheFlip=赢得此掷 +lblLoseTheFlip=输掉此掷 +lblChooseAResult=选择一个结果 +lblSelectPreventionShieldToUse=选择一个保护罩使用 +lblChooseAMode=选择一种模式 +lblActivated=已启动 +lblNoPlayerHasPriorityCannotAddedManaToPool=目前没有牌手具有优先权,因此无法向法术力池中加入法术力。 +lblOverwriteExistFileConfirm=覆盖已有的文件? +lblFileExists=文件已存在! +lblSelectGameStateFile=选择游戏状态文件 +lblFileNotFound=文件未找到 +lblIn=在 +lblOnTheBattlefield=在战场上 +lblOnTheStackOrInPlay=在堆叠/在使用 +lblPutCard=放置牌 +lblForWhichPlayer=哪个牌手? +lblShould=应该 +lblAffectedWithSummoningSickness=被召唤失调效应影响? +lblBeAddedToLibraryTopOrBottom=被添加到牌库顶还是底? +lblExileCardsFromPlayerHandConfirm=从哪位玩家手中放逐牌? +lblChooseCardsExile=选择要放逐的牌 +lblExileCardsFromPlayerBattlefieldConfirm=从哪个玩家的战场放逐牌? +lblRemoveCardBelongingWitchPlayer=删除属于哪个玩家的牌? +lblRemoveCardFromWhichZone=从哪个区域删除牌? +lblChooseCardsRemoveFromGame=选择要从游戏中移除的牌 +lblRemoved=已移除 +lblEnterASequence=输入一个序列 (card IDs and/or "opponent"/"me"). (例如 7, opponent, 18) +lblActionSequenceCleared=行动序列已清除。 +lblRestartingActionSequence=重新启动行动序列 +lblErrorPleaseCheckID=错误:请检查ID,并确保他们之间用空格和/或逗号分隔。 +lblErrorEntityWithId=错误:实体的ID +lblNotFound=没有找到 #AbstractGuiGame.java lblConcedeCurrentGame=这局游戏认输。\n\n确认吗? lblConcedeTitle=这局游戏认输? @@ -1557,7 +1613,7 @@ lblGainControl=获得控制权。 lblReturnToHand=返回手牌。 lbldiscard=弃牌。 lblReveal=展示 -lblTap=横置。 +lblTap=横置 lblCurrentCard=当前牌 lblSelectOfCardsTo=选择 lblCardsTo=牌到 @@ -1593,7 +1649,7 @@ lblDoYouWantMove=你想要移动 lblDeclareDefenderFor=声明阻挡者 lblCardMatchSearchingTypeInAlternateZones=在你的备用区域搜索匹配类型的卡牌。 lblPutThatCardFrom=放置这张牌从 -lblLookingCardIn=看这张牌于 +lblLookingCardIn=看牌自 lblDoYouWantPlay=你想要使用 lblSelectCardFrom=选择一张牌从 lblSelectUpTo=最多选择 @@ -1736,7 +1792,7 @@ lblDoYouWantRepeatProcessAgain=你是否想再次重复这个过程? #RevealHandEffect.java lblDoYouWantRevealYourHand=你想展示你的手牌吗? #RollPlanarDiceEffect.java -lblRolled=rolled +lblRolled=已转动 #SacrificeEffect.java lblDoYouWantPayEcho=你想支付返响费用 lblPayEcho=支付返响费用 diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 45361909b01..02b0e90013c 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -313,20 +313,20 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public Integer announceRequirements(final SpellAbility ability, final String announce, final boolean canChooseZero) { final int min = canChooseZero ? 0 : 1; - return getGui().getInteger("Choose " + announce + " for " + ability.getHostCard().getName(), min, + return getGui().getInteger(localizer.getMessage("Choose %s for ").replace("%s", announce) + ability.getHostCard().getName(), min, Integer.MAX_VALUE, min + 9); } @Override public CardCollectionView choosePermanentsToSacrifice(final SpellAbility sa, final int min, final int max, final CardCollectionView valid, final String message) { - return choosePermanentsTo(min, max, valid, message, "sacrifice", sa); + return choosePermanentsTo(min, max, valid, message, localizer.getMessage("lblSacrifice"), sa); } @Override public CardCollectionView choosePermanentsToDestroy(final SpellAbility sa, final int min, final int max, final CardCollectionView valid, final String message) { - return choosePermanentsTo(min, max, valid, message, "destroy", sa); + return choosePermanentsTo(min, max, valid, message, localizer.getMessage("lblDestroy"), sa); } private CardCollectionView choosePermanentsTo(final int min, int max, final CardCollectionView valid, @@ -336,11 +336,11 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return CardCollection.EMPTY; } - final StringBuilder builder = new StringBuilder("Select "); + final StringBuilder builder = new StringBuilder(localizer.getMessage("lblSelectOfCardsTo") + " "); if (min == 0) { - builder.append("up to "); + builder.append(localizer.getMessage("lblUpTo") + " "); } - builder.append("%d ").append(message).append("(s) to ").append(action).append("."); + builder.append("%d ").append(message).append("(s) " + localizer.getMessage("lblTo") + " ").append(action).append("."); final InputSelectCardsFromList inp = new InputSelectCardsFromList(this, min, max, valid, sa); inp.setMessage(builder.toString()); @@ -396,12 +396,12 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont getGui().setPanelSelection(CardView.get(sa.getHostCard())); if (useSelectCardsInput(sourceList)) { - tempShowCards(sourceList); + tempShowCards(sourceList); final InputSelectCardsFromList sc = new InputSelectCardsFromList(this, min, max, sourceList, sa); sc.setMessage(title); sc.setCancelAllowed(isOptional); sc.showAndWait(); - endTempShowCards(); + endTempShowCards(); return new CardCollection(sc.getSelected()); } @@ -454,7 +454,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont input.setCancelAllowed(isOptional); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); input.showAndWait(); - endTempShowCards(); + endTempShowCards(); return Iterables.getFirst(input.getSelected(), null); } @@ -493,7 +493,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont input.setCancelAllowed(true); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); input.showAndWait(); - endTempShowCards(); + endTempShowCards(); return (List) input.getSelected(); } final List chosen = getGui().chooseEntitiesForEffect(title, @@ -597,7 +597,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public boolean confirmBidAction(final SpellAbility sa, final PlayerActionConfirmMode bidlife, final String string, final int bid, final Player winner) { - return InputConfirm.confirm(this, sa, string + " Highest Bidder " + winner); + return InputConfirm.confirm(this, sa, string + " " + localizer.getMessage("lblHighestBidder") + " " + winner); } @Override @@ -623,7 +623,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return true; } - final StringBuilder buildQuestion = new StringBuilder("Use triggered ability of "); + final StringBuilder buildQuestion = new StringBuilder(localizer.getMessage("lblUseTriggeredAbilityOf") + " "); buildQuestion.append(regtrig.getHostCard().toString()).append("?"); if (!FModel.getPreferences().getPrefBoolean(FPref.UI_COMPACT_PROMPT) && !FModel.getPreferences().getPrefBoolean(FPref.UI_DETAILED_SPELLDESC_IN_PROMPT)) { @@ -690,7 +690,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } List chosen; List choices = new ArrayList<>(mapCVtoC.keySet()); - chosen = getGui().order("Exert Attackers?", "Exerted", 0, choices.size(), choices, null, null, false); + chosen = getGui().order(localizer.getMessage("lblExertAttackersConfirm"), localizer.getMessage("lblExerted"), 0, choices.size(), choices, null, null, false); List chosenCards = new ArrayList<>(); for (CardView cardView : chosen) { chosenCards.add(mapCVtoC.get(cardView)); @@ -723,7 +723,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public void reveal(final List cards, final ZoneType zone, final PlayerView owner, String message) { if (StringUtils.isBlank(message)) { - message = "Looking at cards in {player's} " + zone.name().toLowerCase(); + message = localizer.getMessage("lblLookingCardIn") + " {player's} " + zone.name().toLowerCase(); } else { message += "{player's} " + zone.name().toLowerCase(); } @@ -733,7 +733,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont getGui().reveal(fm, cards); endTempShowCards(); } else { - getGui().message(MessageUtil.formatMessage("There are no cards in {player's} " + zone.name().toLowerCase(), + getGui().message(MessageUtil.formatMessage(localizer.getMessage("lblThereNoCardIn") + " {player's} " + zone.name().toLowerCase(), player, owner), fm); } } @@ -748,12 +748,12 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont CardCollection toBottom = new CardCollection(); CardCollection toTop = new CardCollection(); for (int i = 0; i=0 && manipulable.contains(result.get(i)); i-- ) { + for (int i = result.size()-1; i>=0 && manipulable.contains(result.get(i)); i-- ) { toBottom.add(result.get(i)); - } + } } return ImmutablePair.of(toTop,toBottom); } @@ -764,34 +764,34 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont CardCollection toTop = null; tempShowCards(topN); - if ( FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) && - (!GuiBase.getInterface().isLibgdxPort()) ) { - CardCollectionView cardList = player.getCardsIn(ZoneType.Library); - ImmutablePair result = - arrangeForMove(localizer.getMessage("lblMoveCardstoToporBbottomofLibrary"), cardList, topN, true, true); - toTop = result.getLeft(); - toBottom = result.getRight(); - } else { - if (topN.size() == 1) { - if (willPutCardOnTop(topN.get(0))) { - toTop = topN; - } else { - toBottom = topN; - } - } else { - toBottom = game.getCardList(getGui().many(localizer.getMessage("lblSelectCardsToBeOutOnTheBottomOfYourLibrary"), - localizer.getMessage("lblCardsToPutOnTheBottom"), -1, CardView.getCollection(topN), null)); - topN.removeAll(toBottom); - if (topN.isEmpty()) { - toTop = null; - } else if (topN.size() == 1) { - toTop = topN; - } else { - toTop = game.getCardList(getGui().order(localizer.getMessage("lblArrangeCardsToBePutOnTopOfYourLibrary"), - localizer.getMessage("lblTopOfLibrary"), CardView.getCollection(topN), null)); - } - } - } + if ( FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) && + (!GuiBase.getInterface().isLibgdxPort()) ) { + CardCollectionView cardList = player.getCardsIn(ZoneType.Library); + ImmutablePair result = + arrangeForMove(localizer.getMessage("lblMoveCardstoToporBbottomofLibrary"), cardList, topN, true, true); + toTop = result.getLeft(); + toBottom = result.getRight(); + } else { + if (topN.size() == 1) { + if (willPutCardOnTop(topN.get(0))) { + toTop = topN; + } else { + toBottom = topN; + } + } else { + toBottom = game.getCardList(getGui().many(localizer.getMessage("lblSelectCardsToBeOutOnTheBottomOfYourLibrary"), + localizer.getMessage("lblCardsToPutOnTheBottom"), -1, CardView.getCollection(topN), null)); + topN.removeAll(toBottom); + if (topN.isEmpty()) { + toTop = null; + } else if (topN.size() == 1) { + toTop = topN; + } else { + toTop = game.getCardList(getGui().order(localizer.getMessage("lblArrangeCardsToBePutOnTopOfYourLibrary"), + localizer.getMessage("lblTopOfLibrary"), CardView.getCollection(topN), null)); + } + } + } endTempShowCards(); return ImmutablePair.of(toTop, toBottom); } @@ -809,8 +809,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShowCard(c); getGui().setCard(view); boolean result = false; - result = InputConfirm.confirm(this, view, TextUtil.concatNoSpace("Put ", view.toString(), " on the top of library or graveyard?"), - true, ImmutableList.of("Library", "Graveyard")); + result = InputConfirm.confirm(this, view, TextUtil.concatNoSpace(localizer.getMessage("lblPut") + " ", view.toString(), " " + localizer.getMessage("lblOnTheTopLibraryOrGraveyard")), + true, ImmutableList.of(localizer.getMessage("lblLibrary"), localizer.getMessage("lblGraveyard"))); if (result) { toTop = topN; } else { @@ -842,7 +842,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont boolean result = false; result = InputConfirm.confirm(this, view, localizer.getMessage("lblPutCardOnTopOrBottomLibrary").replace("%s", view.toString()), - true, ImmutableList.of("Top", "Bottom")); + true, ImmutableList.of(localizer.getMessage("lblTop"), localizer.getMessage("lblBottom"))); endTempShowCards(); return result; @@ -1020,9 +1020,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (int i = 0; i < manaChoices.size(); i++) { final Mana m = manaChoices.get(i); options.add(TextUtil.concatNoSpace(String.valueOf(1 + i), ". ", MagicColor.toLongString(m.getColor()), - " mana from ", m.getSourceCard().toString())); + " " + localizer.getMessage("lblManaFrom") + " ", m.getSourceCard().toString())); } - final String chosen = getGui().one("Pay Mana from Mana Pool", options); + final String chosen = getGui().one(localizer.getMessage("lblPayManaFromManaPool"), options); final String idx = TextUtil.split(chosen, '.')[0]; return manaChoices.get(Integer.parseInt(idx) - 1); } @@ -1044,9 +1044,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont sortCreatureTypes(types); } if (isOptional) { - return getGui().oneOrNone("Choose a " + kindOfType.toLowerCase() + " type", types); + return getGui().oneOrNone(localizer.getMessage("lblChooseATargetType").replace("%s", kindOfType.toLowerCase()), types); } - return getGui().one("Choose a " + kindOfType.toLowerCase() + " type", types); + return getGui().one(localizer.getMessage("lblChooseATargetType").replace("%s", kindOfType.toLowerCase()), types); } // sort creature types such that those most prevalent in player's deck are @@ -1374,28 +1374,28 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final List labels; switch (kindOfChoice) { case HeadsOrTails: - labels = ImmutableList.of("Heads", "Tails"); + labels = ImmutableList.of(localizer.getMessage("lblHeads"), localizer.getMessage("lblTails")); break; case TapOrUntap: - labels = ImmutableList.of("Tap", "Untap"); + labels = ImmutableList.of(localizer.getMessage("lblTap"), localizer.getMessage("lblUntap")); break; case OddsOrEvens: - labels = ImmutableList.of("Odds", "Evens"); + labels = ImmutableList.of(localizer.getMessage("lblOdds"), localizer.getMessage("lblEvens")); break; case UntapOrLeaveTapped: - labels = ImmutableList.of("Untap", "Leave tapped"); + labels = ImmutableList.of(localizer.getMessage("lblUntap"), localizer.getMessage("lblLeaveTapped")); break; case UntapTimeVault: - labels = ImmutableList.of("Untap (and skip this turn)", "Leave tapped"); + labels = ImmutableList.of(localizer.getMessage("lblUntapAndSkipThisTurn"), localizer.getMessage("lblLeaveTapped")); break; case PlayOrDraw: - labels = ImmutableList.of("Play", "Draw"); + labels = ImmutableList.of(localizer.getMessage("lblPlay"), localizer.getMessage("lblDraw")); break; case LeftOrRight: - labels = ImmutableList.of("Left", "Right"); + labels = ImmutableList.of(localizer.getMessage("lblLeft"), localizer.getMessage("lblRight")); break; case AddOrRemove: - labels = ImmutableList.of("Add Counter", "Remove Counter"); + labels = ImmutableList.of(localizer.getMessage("lblAddCounter"), localizer.getMessage("lblRemoveCounter")); break; default: labels = ImmutableList.copyOf(kindOfChoice.toString().split("Or")); @@ -1407,8 +1407,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public boolean chooseFlipResult(final SpellAbility sa, final Player flipper, final boolean[] results, final boolean call) { - final String[] labelsSrc = call ? new String[] { "heads", "tails" } - : new String[] { "win the flip", "lose the flip" }; + final String[] labelsSrc = call ? new String[] { localizer.getMessage("lblHeads"), localizer.getMessage("lblTails") } + : new String[] { localizer.getMessage("lblWinTheFlip"), localizer.getMessage("lblLoseTheFlip") }; final List sortedResults = new ArrayList(); for (boolean result : results) { sortedResults.add(labelsSrc[result ? 0 : 1]); @@ -1418,13 +1418,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (!call) { Collections.reverse(sortedResults); } - return getGui().one(sa.getHostCard().getName() + " - Choose a result", sortedResults).equals(labelsSrc[0]); + return getGui().one(sa.getHostCard().getName() + " - " + localizer.getMessage("lblChooseAResult"), sortedResults).equals(labelsSrc[0]); } @Override public Card chooseProtectionShield(final GameEntity entityBeingDamaged, final List options, final Map choiceMap) { - final String title = entityBeingDamaged + " - select which prevention shield to use"; + final String title = entityBeingDamaged + " - " + localizer.getMessage("lblSelectPreventionShieldToUse"); return choiceMap.get(getGui().one(title, options)); } @@ -1486,8 +1486,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont game.getTracker().freeze(); // refreeze if the tracker was frozen prior to this update } final List choices = new ArrayList<>(spellViewCache.keySet()); - final String modeTitle = TextUtil.concatNoSpace(sa.getActivatingPlayer().toString(), " activated ", - sa.getHostCard().toString(), " - Choose a mode"); + final String modeTitle = TextUtil.concatNoSpace(sa.getActivatingPlayer().toString(), " " + localizer.getMessage("lblActivated") + " ", + sa.getHostCard().toString(), " - " + localizer.getMessage("lblChooseAMode")); final List chosen = Lists.newArrayListWithCapacity(num); for (int i = 0; i < num; i++) { SpellAbilityView a; @@ -1770,7 +1770,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public void revealAnte(final String message, final Multimap removedAnteCards) { for (final Player p : removedAnteCards.keySet()) { - getGui().reveal(message + " from " + Lang.getPossessedObject(MessageUtil.mayBeYou(player, p), "deck"), + getGui().reveal(message + " " + localizer.getMessage("lblFrom") + " " + Lang.getPossessedObject(MessageUtil.mayBeYou(player, p), localizer.getMessage("lblDeck")), ImmutableList.copyOf(removedAnteCards.get(p))); } } @@ -2008,7 +2008,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public void generateMana() { final Player pPriority = game.getPhaseHandler().getPriorityPlayer(); if (pPriority == null) { - getGui().message("No player has priority at the moment, so mana cannot be added to their pool."); + getGui().message(localizer.getMessage("lblNoPlayerHasPriorityCannotAddedManaToPool")); return; } @@ -2046,7 +2046,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont state.initFromGame(game); final File f = GuiBase.getInterface().getSaveFile(new File(ForgeConstants.USER_GAMES_DIR, "state.txt")); if (f != null - && (!f.exists() || getGui().showConfirmDialog("Overwrite existing file?", "File exists!"))) { + && (!f.exists() || getGui().showConfirmDialog(localizer.getMessage("lblOverwriteExistFileConfirm"), localizer.getMessage("lblFileExists")))) { try (BufferedWriter bw = new BufferedWriter(new FileWriter(f))) { bw.write(state.toString()); } @@ -2074,7 +2074,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont gamesDir.mkdir(); } - final String filename = GuiBase.getInterface().showFileDialog("Select Game State File", + final String filename = GuiBase.getInterface().showFileDialog(localizer.getMessage("lblSelectGameStateFile"), ForgeConstants.USER_GAMES_DIR); if (filename == null) { return; @@ -2086,7 +2086,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont state.parse(fstream); fstream.close(); } catch (final FileNotFoundException fnfe) { - SOptionPane.showErrorDialog("File not found: " + filename); + SOptionPane.showErrorDialog(localizer.getMessage("lblFileNotFound") + ": " + filename); return; } catch (final Exception e) { SOptionPane.showErrorDialog(localizer.getMessage("lblErrorLoadingBattleSetupFile")); @@ -2356,11 +2356,11 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont private void addCardToZone(ZoneType zone, final boolean repeatLast, final boolean noTriggers) { final ZoneType targetZone = repeatLast ? lastAddedZone : zone; - String zoneStr = targetZone != ZoneType.Battlefield ? "in " + targetZone.name().toLowerCase() - : noTriggers ? "on the battlefield" : "on the stack / in play"; + String zoneStr = targetZone != ZoneType.Battlefield ? localizer.getMessage("lblIn") + " " + targetZone.name().toLowerCase() + : noTriggers ? localizer.getMessage("lblOnTheBattlefield") : localizer.getMessage("lblOnTheStackOrInPlay"); final Player p = repeatLast ? lastAddedPlayer - : game.getPlayer(getGui().oneOrNone("Put card " + zoneStr + " for which player?", + : game.getPlayer(getGui().oneOrNone(localizer.getMessage("lblPutCard") + " " + zoneStr + " " + localizer.getMessage("lblForWhichPlayer"), PlayerView.getCollection(game.getPlayers()))); if (p == null) { return; @@ -2391,7 +2391,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont lastSummoningSickness = true; } else { lastSummoningSickness = getGui().confirm(forgeCard.getView(), - TextUtil.concatWithSpace("Should", forgeCard.toString(), "be affected with Summoning Sickness?")); + TextUtil.concatWithSpace(localizer.getMessage("lblShould"), forgeCard.toString(), localizer.getMessage("lblAffectedWithSummoningSickness"))); } } } @@ -2420,7 +2420,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (choices.size() == 1) { sa = choices.iterator().next(); } else { - sa = repeatLast ? lastAddedSA : getGui().oneOrNone("Choose", (FCollection) choices); + sa = repeatLast ? lastAddedSA : getGui().oneOrNone(localizer.getMessage("lblChoose"), (FCollection) choices); } if (sa == null) { return; // happens if cancelled @@ -2441,7 +2441,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } else if (targetZone == ZoneType.Library) { if (!repeatLast) { lastTopOfTheLibrary = getGui().confirm(forgeCard.getView(), - TextUtil.concatWithSpace("Should", forgeCard.toString(), "be added to the top or to the bottom of the library?"), true, Arrays.asList("Top", "Bottom")); + TextUtil.concatWithSpace(localizer.getMessage("lblShould"), forgeCard.toString(), localizer.getMessage("lblBeAddedToLibraryTopOrBottom")), true, Arrays.asList(localizer.getMessage("lblTop"), localizer.getMessage("lblBottom"))); } if (lastTopOfTheLibrary) { game.getAction().moveToLibrary(forgeCard, null); @@ -2467,7 +2467,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont */ @Override public void exileCardsFromHand() { - final Player p = game.getPlayer(getGui().oneOrNone("Exile card(s) from which player's hand?", + final Player p = game.getPlayer(getGui().oneOrNone(localizer.getMessage("lblExileCardsFromPlayerHandConfirm"), PlayerView.getCollection(game.getPlayers()))); if (p == null) { return; @@ -2476,7 +2476,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final CardCollection selection; CardCollectionView cardsInHand = p.getCardsIn(ZoneType.Hand); - selection = game.getCardList(getGui().many("Choose cards to exile", "Discarded", 0, -1, + selection = game.getCardList(getGui().many(localizer.getMessage("lblChooseCardsExile"), localizer.getMessage("lblDiscarded"), 0, -1, CardView.getCollection(cardsInHand), null)); if (selection != null && selection.size() > 0) { @@ -2502,7 +2502,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont */ @Override public void exileCardsFromBattlefield() { - final Player p = game.getPlayer(getGui().oneOrNone("Exile card(s) from which player's battlefield?", + final Player p = game.getPlayer(getGui().oneOrNone(localizer.getMessage("lblExileCardsFromPlayerBattlefieldConfirm"), PlayerView.getCollection(game.getPlayers()))); if (p == null) { return; @@ -2511,7 +2511,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final CardCollection selection; CardCollectionView cardsInPlay = p.getCardsIn(ZoneType.Battlefield); - selection = game.getCardList(getGui().many("Choose cards to exile", "Discarded", 0, -1, + selection = game.getCardList(getGui().many(localizer.getMessage("lblChooseCardsExile"), localizer.getMessage("lblDiscarded"), 0, -1, CardView.getCollection(cardsInPlay), null)); if (selection != null && selection.size() > 0) { @@ -2537,19 +2537,19 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont */ @Override public void removeCardsFromGame() { - final Player p = game.getPlayer(getGui().oneOrNone("Remove card(s) belonging to which player?", + final Player p = game.getPlayer(getGui().oneOrNone(localizer.getMessage("lblRemoveCardBelongingWitchPlayer"), PlayerView.getCollection(game.getPlayers()))); if (p == null) { return; } - final String zone = getGui().one("Remove card(s) from which zone?", + final String zone = getGui().one(localizer.getMessage("lblRemoveCardFromWhichZone"), Arrays.asList("Hand", "Battlefield", "Library", "Graveyard", "Exile")); final CardCollection selection; CardCollectionView cards = p.getCardsIn(ZoneType.smartValueOf(zone)); - selection = game.getCardList(getGui().many("Choose cards to remove from game", "Removed", 0, -1, + selection = game.getCardList(getGui().many(localizer.getMessage("lblChooseCardsRemoveFromGame"), localizer.getMessage("lblRemoved"), 0, -1, CardView.getCollection(cards), null)); if (selection != null && selection.size() > 0) { @@ -2687,14 +2687,14 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // A more informative prompt would be useful, but the dialog seems // to // like to clip text in long messages... - final String prompt = "Enter a sequence (card IDs and/or \"opponent\"/\"me\"). (e.g. 7, opponent, 18)"; + final String prompt = localizer.getMessage("lblEnterASequence"); String textSequence = getGui().showInputDialog(prompt, dialogTitle, FSkinProp.ICO_QUEST_NOTES, rememberedSequenceText); if (textSequence == null || textSequence.trim().isEmpty()) { rememberedActions.clear(); if (!rememberedSequenceText.isEmpty()) { rememberedSequenceText = ""; - getGui().message("Action sequence cleared.", dialogTitle); + getGui().message(localizer.getMessage("lblActionSequenceCleared"), dialogTitle); } return; } @@ -2703,7 +2703,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // but don't change rememberedActions. if (textSequence.equals(rememberedSequenceText)) { if (currentIndex > 0 && currentIndex < rememberedActions.size()) { - getGui().message("Restarting action sequence.", dialogTitle); + getGui().message(localizer.getMessage("lblRestartingActionSequence"), dialogTitle); } return; } @@ -2731,7 +2731,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } if (entityInfo.isEmpty()) { - getGui().message("Error: Check IDs and ensure they're separated by spaces and/or commas.", dialogTitle); + getGui().message(localizer.getMessage("lblErrorPleaseCheckID"), dialogTitle); return; } @@ -2762,7 +2762,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } if (!found) { - getGui().message("Error: Entity with ID " + entity.getKey() + " not found.", dialogTitle); + getGui().message(localizer.getMessage("lblErrorEntityWithId") + " " + entity.getKey() + " " + localizer.getMessage("lblNotFound") + ".", dialogTitle); rememberedActions.clear(); return; } From 437587766bed7821bfdbc04325b64b2241229fb0 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 25 Dec 2019 14:06:35 +0800 Subject: [PATCH 25/54] translate pay mana message --- .../src/main/java/forge/match/input/InputPayMana.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/match/input/InputPayMana.java index de1da8bf5b6..abe241e6d1f 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayMana.java @@ -30,6 +30,7 @@ import forge.player.HumanPlay; import forge.player.PlayerControllerHuman; import forge.util.Evaluator; import forge.util.ITriggerEvent; +import forge.util.Localizer; public abstract class InputPayMana extends InputSyncronizedBase { private static final long serialVersionUID = 718128600948280315L; @@ -310,7 +311,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { final SpellAbility chosen; if (chosenAbility == null) { ArrayList choices = new ArrayList<>(abilitiesMap.keySet()); - chosen = abilitiesMap.size() > 1 && choice ? abilitiesMap.get(getController().getGui().one("Choose mana ability", choices)) : abilitiesMap.get(choices.get(0)); + chosen = abilitiesMap.size() > 1 && choice ? abilitiesMap.get(getController().getGui().one(Localizer.getInstance().getMessage("lblChooseManaAbility"), choices)) : abilitiesMap.get(choices.get(0)); } else { chosen = chosenAbility; } @@ -438,9 +439,9 @@ public abstract class InputPayMana extends InputSyncronizedBase { protected void updateButtons() { if (supportAutoPay()) { - getController().getGui().updateButtons(getOwner(), "Auto", "Cancel", false, true, false); + getController().getGui().updateButtons(getOwner(), Localizer.getInstance().getMessage("lblAuto"), Localizer.getInstance().getMessage("lblCancel"), false, true, false); } else { - getController().getGui().updateButtons(getOwner(), "", "Cancel", false, true, false); + getController().getGui().updateButtons(getOwner(), "", Localizer.getInstance().getMessage("lblCancel"), false, true, false); } } @@ -462,7 +463,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { canPayManaCost = proc.getResult(); } if (canPayManaCost) { //enabled Auto button if mana cost can be paid - getController().getGui().updateButtons(getOwner(), "Auto", "Cancel", true, true, true); + getController().getGui().updateButtons(getOwner(), Localizer.getInstance().getMessage("lblAuto"), Localizer.getInstance().getMessage("lblCancel"), true, true, true); } } showMessage(getMessage(), saPaidFor.getView()); From 65efbc57f3873c0575c153c7458ff7346a07bc05 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 25 Dec 2019 14:06:59 +0800 Subject: [PATCH 26/54] translate dev menu --- .../java/forge/screens/match/views/VDev.java | 51 ++++++++++--------- .../forge/screens/match/views/VDevMenu.java | 49 +++++++++--------- 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VDev.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VDev.java index 7f2096bf123..7d1993aa1cc 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VDev.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VDev.java @@ -35,6 +35,7 @@ import forge.screens.match.controllers.CDev; import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedLabel; +import forge.util.Localizer; /** * Assembles Swing components of players report. @@ -45,7 +46,7 @@ public class VDev implements IVDoc, IDevListener { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Dev Mode"); + private final DragTab tab = new DragTab(Localizer.getInstance().getMessage("lblDevMode")); // Top-level containers private final JPanel viewport = new JPanel(new MigLayout("wrap, insets 0, ax center")); @@ -54,31 +55,31 @@ public class VDev implements IVDoc, IDevListener { ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); // Dev labels - private final DevLabel lblUnlimitedLands = new DevLabel("Play Unlimited Lands"); - private final DevLabel lblViewAll = new DevLabel("View All Cards"); - private final DevLabel lblGenerateMana = new DevLabel("Generate Mana"); - private final DevLabel lblSetupGame = new DevLabel("Setup Game State"); - private final DevLabel lblDumpGame = new DevLabel("Dump Game State"); - private final DevLabel lblTutor = new DevLabel("Tutor for Card"); - private final DevLabel lblAddCounterPermanent = new DevLabel("Add Counters to Card"); - private final DevLabel lblSubCounterPermanent = new DevLabel("Sub Counters from Card"); - private final DevLabel lblTapPermanent = new DevLabel("Tap Permanents"); - private final DevLabel lblUntapPermanent = new DevLabel("Untap Permanents"); - private final DevLabel lblSetLife = new DevLabel("Set Player Life"); - private final DevLabel lblWinGame = new DevLabel("Win Game"); - private final DevLabel lblCardToBattlefield = new DevLabel("Add Card to Battlefield"); - private final DevLabel lblExileFromPlay = new DevLabel("Exile Card from Play"); - private final DevLabel lblCardToHand = new DevLabel("Add Card to Hand"); - private final DevLabel lblExileFromHand = new DevLabel("Exile Card from Hand"); - private final DevLabel lblCardToLibrary = new DevLabel("Add Card to Library"); - private final DevLabel lblCardToGraveyard = new DevLabel("Add Card to Graveyard"); - private final DevLabel lblCardToExile = new DevLabel("Add Card to Exile"); - private final DevLabel lblCastSpell = new DevLabel("Cast Spell/Play Land"); - private final DevLabel lblRepeatAddCard = new DevLabel("Repeat Last Add Card"); - private final DevLabel lblRemoveFromGame = new DevLabel("Remove Card from Game"); + private final DevLabel lblUnlimitedLands = new DevLabel(Localizer.getInstance().getMessage("lblUnlimitedLands")); + private final DevLabel lblViewAll = new DevLabel(Localizer.getInstance().getMessage("lblViewAll")); + private final DevLabel lblGenerateMana = new DevLabel(Localizer.getInstance().getMessage("lblGenerateMana")); + private final DevLabel lblSetupGame = new DevLabel(Localizer.getInstance().getMessage("lblSetupGame")); + private final DevLabel lblDumpGame = new DevLabel(Localizer.getInstance().getMessage("lblDumpGame")); + private final DevLabel lblTutor = new DevLabel(Localizer.getInstance().getMessage("lblTutor")); + private final DevLabel lblAddCounterPermanent = new DevLabel(Localizer.getInstance().getMessage("lblAddCounterPermanent")); + private final DevLabel lblSubCounterPermanent = new DevLabel(Localizer.getInstance().getMessage("lblSubCounterPermanent")); + private final DevLabel lblTapPermanent = new DevLabel(Localizer.getInstance().getMessage("lblTapPermanent")); + private final DevLabel lblUntapPermanent = new DevLabel(Localizer.getInstance().getMessage("lblUntapPermanent")); + private final DevLabel lblSetLife = new DevLabel(Localizer.getInstance().getMessage("lblSetLife")); + private final DevLabel lblWinGame = new DevLabel(Localizer.getInstance().getMessage("lblWinGame")); + private final DevLabel lblCardToBattlefield = new DevLabel(Localizer.getInstance().getMessage("lblCardToBattlefield")); + private final DevLabel lblExileFromPlay = new DevLabel(Localizer.getInstance().getMessage("lblExileFromPlay")); + private final DevLabel lblCardToHand = new DevLabel(Localizer.getInstance().getMessage("lblCardToHand")); + private final DevLabel lblExileFromHand = new DevLabel(Localizer.getInstance().getMessage("lblExileFromHand")); + private final DevLabel lblCardToLibrary = new DevLabel(Localizer.getInstance().getMessage("lblCardToLibrary")); + private final DevLabel lblCardToGraveyard = new DevLabel(Localizer.getInstance().getMessage("lblCardToGraveyard")); + private final DevLabel lblCardToExile = new DevLabel(Localizer.getInstance().getMessage("lblCardToExile")); + private final DevLabel lblCastSpell = new DevLabel(Localizer.getInstance().getMessage("lblCastSpellOrPlayLand")); + private final DevLabel lblRepeatAddCard = new DevLabel(Localizer.getInstance().getMessage("lblRepeatAddCard")); + private final DevLabel lblRemoveFromGame = new DevLabel(Localizer.getInstance().getMessage("lblRemoveFromGame")); - private final DevLabel lblRiggedRoll = new DevLabel("Rigged Planar Roll"); - private final DevLabel lblWalkTo = new DevLabel("Planeswalk to"); + private final DevLabel lblRiggedRoll = new DevLabel(Localizer.getInstance().getMessage("lblRiggedRoll")); + private final DevLabel lblWalkTo = new DevLabel(Localizer.getInstance().getMessage("lblWalkTo")); private final CDev controller; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java index 60617edfaa5..8b754ea1001 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java @@ -7,11 +7,12 @@ import forge.screens.match.MatchController; import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; import forge.util.ThreadUtil; +import forge.util.Localizer; public class VDevMenu extends FDropDownMenu { @Override protected void buildMenu() { - addItem(new FMenuItem("Generate Mana", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblGenerateMana"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { //must invoke all these in game thread since they may require synchronous user input @@ -22,7 +23,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Tutor for Card", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblTutor"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -33,7 +34,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Cast Spell/Play Land", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblCastSpellOrPlayLand"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -44,7 +45,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Add Card to Hand", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblCardToHand"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -55,7 +56,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Add Card to Battlefield", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblCardToBattlefield"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -66,7 +67,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Add Card to Library", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblCardToLibrary"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -77,7 +78,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Add Card to Graveyard", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblCardToGraveyard"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -88,7 +89,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Add Card to Exile", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblCardToExile"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -99,7 +100,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Repeat Last Add Card", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblRepeatAddCard"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -110,7 +111,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Exile Card from Hand", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblExileFromHand"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -121,7 +122,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Exile Card from Play", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblExileFromPlay"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -132,7 +133,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Remove Card from Game", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblRemoveFromGame"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -143,7 +144,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Set Player Life", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblSetLife"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -154,7 +155,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Win Game", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblWinGame"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -165,7 +166,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Setup Game State", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblSetupGame"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -176,7 +177,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Dump Game State", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblDumpGame"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -189,7 +190,7 @@ public class VDevMenu extends FDropDownMenu { })); final boolean unlimitedLands = MatchController.instance.getGameController().canPlayUnlimitedLands(); - addItem(new FCheckBoxMenuItem("Play Unlimited Lands", unlimitedLands, + addItem(new FCheckBoxMenuItem(Localizer.getInstance().getMessage("lblUnlimitedLands"), unlimitedLands, new FEventHandler() { @Override public void handleEvent(FEvent e) { @@ -197,14 +198,14 @@ public class VDevMenu extends FDropDownMenu { } })); final boolean viewAll = MatchController.instance.getGameController().mayLookAtAllCards(); - addItem(new FCheckBoxMenuItem("View All Cards", viewAll, + addItem(new FCheckBoxMenuItem(Localizer.getInstance().getMessage("lblViewAll"), viewAll, new FEventHandler() { @Override public void handleEvent(FEvent e) { MatchController.instance.getGameController().cheat().setViewAllCards(!viewAll); } })); - addItem(new FMenuItem("Add Counters to Card", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblAddCounterPermanent"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -215,7 +216,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Sub Counters from Card", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblSubCounterPermanent"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -226,7 +227,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Tap Permanents", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblTapPermanent"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -237,7 +238,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Untap Permanents", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblUntapPermanent"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -248,7 +249,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Rigged Planar Roll", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblRiggedRoll"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { @@ -259,7 +260,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem("Planeswalk to", new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblRiggedRoll"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { From 011811d183f41807eed60cf63d3a0e541d2f553a Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 25 Dec 2019 14:07:28 +0800 Subject: [PATCH 27/54] translate mobile AssignDamage view --- .../screens/match/views/VAssignDamage.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java b/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java index 7ea91363826..ffd5d47283a 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java @@ -42,6 +42,7 @@ import forge.util.Callback; import forge.util.TextUtil; import forge.util.Utils; import forge.util.WaitCallback; +import forge.util.Localizer; import java.util.ArrayList; import java.util.HashMap; @@ -64,8 +65,8 @@ public class VAssignDamage extends FDialog { private final GameEntityView defender; - private final FLabel lblTotalDamage = add(new FLabel.Builder().text("Available damage points: Unknown").align(Align.center).build()); - private final FLabel lblAssignRemaining = add(new FLabel.Builder().text("Distribute the remaining damage points among lethally wounded entities").align(Align.center).build()); + private final FLabel lblTotalDamage = add(new FLabel.Builder().text(Localizer.getInstance().getMessage("lblTotalDamageText")).align(Align.center).build()); + private final FLabel lblAssignRemaining = add(new FLabel.Builder().text(Localizer.getInstance().getMessage("lblAssignRemainingText")).align(Align.center).build()); private final AttDefCardPanel pnlAttacker; private final DefendersPanel pnlDefenders; @@ -93,7 +94,7 @@ public class VAssignDamage extends FDialog { * @param overrideOrder override combatant order */ public VAssignDamage(final CardView attacker, final List blockers, final int damage0, final GameEntityView defender0, boolean overrideOrder, final WaitCallback> waitCallback) { - super("Assign damage dealt by " + attacker, 3); + super(Localizer.getInstance().getMessage("lbLAssignDamageDealtBy").replace("%s",attacker.toString()) , 3); callback = waitCallback; totalDamageToAssign = damage0; @@ -106,7 +107,7 @@ public class VAssignDamage extends FDialog { pnlAttacker = add(new AttDefCardPanel(attacker)); pnlDefenders = add(new DefendersPanel(blockers)); - initButton(0, "Auto", new FEventHandler() { + initButton(0, Localizer.getInstance().getMessage("lblAuto"), new FEventHandler() { @Override public void handleEvent(FEvent e) { resetAssignedDamage(); @@ -114,13 +115,13 @@ public class VAssignDamage extends FDialog { finish(); } }); - initButton(1, "OK", new FEventHandler() { + initButton(1, Localizer.getInstance().getMessage("lblOK"), new FEventHandler() { @Override public void handleEvent(FEvent e) { finish(); } }); - initButton(2, "Reset", new FEventHandler() { + initButton(2, Localizer.getInstance().getMessage("lblReset"), new FEventHandler() { @Override public void handleEvent(FEvent e) { resetAssignedDamage(); @@ -411,7 +412,7 @@ public class VAssignDamage extends FDialog { StringBuilder sb = new StringBuilder(); sb.append(dmg); if(overkill >= 0) { - sb.append(" (Lethal"); + sb.append(" (" + Localizer.getInstance().getMessage("lblLethal")); if(overkill > 0) sb.append(" +").append(overkill); sb.append(")"); @@ -420,7 +421,7 @@ public class VAssignDamage extends FDialog { dt.label.setText(sb.toString()); } - lblTotalDamage.setText(TextUtil.concatNoSpace("Available damage points: ", + lblTotalDamage.setText(TextUtil.concatNoSpace(Localizer.getInstance().getMessage("lblAvailableDamagePoints") + ": ", String.valueOf(damageLeft), " (of ", String.valueOf(totalDamageToAssign), ")")); setButtonEnabled(1, damageLeft == 0); lblAssignRemaining.setVisible(allHaveLethal && damageLeft > 0); From e965b899c0ad2f3260b615c05567fdd0aab47865 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 25 Dec 2019 14:07:59 +0800 Subject: [PATCH 28/54] update translation --- forge-gui/res/languages/de-DE.properties | 29 ++++++++++++++++++++- forge-gui/res/languages/en-US.properties | 29 ++++++++++++++++++++- forge-gui/res/languages/es-ES.properties | 29 ++++++++++++++++++++- forge-gui/res/languages/zh-CN.properties | 33 +++++++++++++++++++++--- 4 files changed, 114 insertions(+), 6 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 5ba605f565c..03511b6bc48 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -333,6 +333,7 @@ lblRClickDamageMessage=Rechtsklick: 1 Schaden zurücknehmen. (Rechtsklick + STRG lblTotalDamageText=Gesamtschaden: Unbekannt lblAssignRemainingText=Verteile verbleibenden Schaden unter tödlich Verwundeten lblLethal=Tödlich +lblAvailableDamagePoints=Available damage points #KeyboardShortcuts.java lblSHORTCUT_SHOWSTACK=Duell: Zeige Stapelfenster lblSHORTCUT_SHOWCOMBAT=Duell: Zeige Kampffenster @@ -1818,4 +1819,30 @@ lblSelectCardToUntap=Select cards to untap #VoteEffect.java lblVote=Vote lblCurrentVote=Current Votes -lblHowManyAdditionalVotesDoYouWant=How many additional votes do you want? \ No newline at end of file +lblHowManyAdditionalVotesDoYouWant=How many additional votes do you want? +#InputPayMana.java +lblChooseManaAbility=Choose mana ability +#VDevMenu.java +lblUnlimitedLands=Play Unlimited Lands +lblGenerateMana=Generate Mana +lblViewAll=View All Cards +lblSetupGame=Setup Game State +lblDumpGame=Dump Game State +lblTutor=Tutor for Card +lblAddCounterPermanent=Add Counters to Card +lblSubCounterPermanent=Sub Counters from Card +lblTapPermanent=Tap Permanents +lblUntapPermanent=Untap Permanents +lblSetLife=Set Player Life +lblCardToBattlefield=Add Card to Battlefield +lblExileFromPlay=Exile Card from Play +lblCardToHand=Add Card to Hand +lblExileFromHand=Exile Card from Hand +lblCardToLibrary=Add Card to Library +lblCardToGraveyard=Add Card to Graveyard +lblCardToExile=Add Card to Exile +lblCastSpellOrPlayLand=Cast Spell/Play Land +lblRepeatAddCard=Repeat Last Add Card +lblRemoveFromGame=Remove Card from Game +lblRiggedRoll=Rigged Planar Roll +lblWalkTo=Planeswalk to \ No newline at end of file diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 06b052d005e..01e19fb22d7 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -333,6 +333,7 @@ lblRClickDamageMessage=Right click: Unassign 1 damage. (Right Click + Control): lblTotalDamageText=Available damage points: Unknown lblAssignRemainingText=Distribute the remaining damage points among lethally wounded entities lblLethal=Lethal +lblAvailableDamagePoints=Available damage points #KeyboardShortcuts.java lblSHORTCUT_SHOWSTACK=Match: show stack panel lblSHORTCUT_SHOWCOMBAT=Match: show combat panel @@ -1818,4 +1819,30 @@ lblSelectCardToUntap=Select cards to untap #VoteEffect.java lblVote=Vote lblCurrentVote=Current Votes -lblHowManyAdditionalVotesDoYouWant=How many additional votes do you want? \ No newline at end of file +lblHowManyAdditionalVotesDoYouWant=How many additional votes do you want? +#InputPayMana.java +lblChooseManaAbility=Choose mana ability +#VDevMenu.java +lblUnlimitedLands=Play Unlimited Lands +lblGenerateMana=Generate Mana +lblViewAll=View All Cards +lblSetupGame=Setup Game State +lblDumpGame=Dump Game State +lblTutor=Tutor for Card +lblAddCounterPermanent=Add Counters to Card +lblSubCounterPermanent=Sub Counters from Card +lblTapPermanent=Tap Permanents +lblUntapPermanent=Untap Permanents +lblSetLife=Set Player Life +lblCardToBattlefield=Add Card to Battlefield +lblExileFromPlay=Exile Card from Play +lblCardToHand=Add Card to Hand +lblExileFromHand=Exile Card from Hand +lblCardToLibrary=Add Card to Library +lblCardToGraveyard=Add Card to Graveyard +lblCardToExile=Add Card to Exile +lblCastSpellOrPlayLand=Cast Spell/Play Land +lblRepeatAddCard=Repeat Last Add Card +lblRemoveFromGame=Remove Card from Game +lblRiggedRoll=Rigged Planar Roll +lblWalkTo=Planeswalk to \ No newline at end of file diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index db61fed8d32..ff7583dca61 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -333,6 +333,7 @@ lblRClickDamageMessage=Clic derecho: Desasignar 1 daño. (Clic derecho + Control lblTotalDamageText=Puntos de daño disponibles: Desconocido lblAssignRemainingText=Distribuye los puntos de daño restantes entre las entidades letalmente heridas. lblLethal=Letal +lblAvailableDamagePoints=Available damage points #KeyboardShortcuts.java lblSHORTCUT_SHOWSTACK=Partida: mostrar panel de pila lblSHORTCUT_SHOWCOMBAT=Partida: mostrar panel de combate @@ -1818,4 +1819,30 @@ lblSelectCardToUntap=Select cards to untap #VoteEffect.java lblVote=Vote lblCurrentVote=Current Votes -lblHowManyAdditionalVotesDoYouWant=How many additional votes do you want? \ No newline at end of file +lblHowManyAdditionalVotesDoYouWant=How many additional votes do you want? +#InputPayMana.java +lblChooseManaAbility=Choose mana ability +#VDevMenu.java +lblUnlimitedLands=Play Unlimited Lands +lblGenerateMana=Generate Mana +lblViewAll=View All Cards +lblSetupGame=Setup Game State +lblDumpGame=Dump Game State +lblTutor=Tutor for Card +lblAddCounterPermanent=Add Counters to Card +lblSubCounterPermanent=Sub Counters from Card +lblTapPermanent=Tap Permanents +lblUntapPermanent=Untap Permanents +lblSetLife=Set Player Life +lblCardToBattlefield=Add Card to Battlefield +lblExileFromPlay=Exile Card from Play +lblCardToHand=Add Card to Hand +lblExileFromHand=Exile Card from Hand +lblCardToLibrary=Add Card to Library +lblCardToGraveyard=Add Card to Graveyard +lblCardToExile=Add Card to Exile +lblCastSpellOrPlayLand=Cast Spell/Play Land +lblRepeatAddCard=Repeat Last Add Card +lblRemoveFromGame=Remove Card from Game +lblRiggedRoll=Rigged Planar Roll +lblWalkTo=Planeswalk to \ No newline at end of file diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 9ff9e6d7a65..cf7d8781285 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -333,6 +333,7 @@ lblRClickDamageMessage=右键单击:取消分配一点伤害。(左键加Ctr lblTotalDamageText=可用的伤害值:未知 lblAssignRemainingText=对受到致命伤害的对象分配过量的伤害 lblLethal=致死 +lblAvailableDamagePoints=可用的伤害值 #KeyboardShortcuts.java lblSHORTCUT_SHOWSTACK=匹配:显示堆叠面板 lblSHORTCUT_SHOWCOMBAT=匹配:显示战斗面板 @@ -1410,7 +1411,7 @@ lblPhasedIn=已跃回 #TriggerPhaseOut.java lblPhasedOut=已跃离 #TriggerRoller.java -lblRoller=回滚者 +lblRoller=掷骰者 #TriggerPlaneswalkedFrom.java lblPlaneswalkedFrom=时空旅行自 #TriggerPlaneswalkedTo.java @@ -1792,7 +1793,7 @@ lblDoYouWantRepeatProcessAgain=你是否想再次重复这个过程? #RevealHandEffect.java lblDoYouWantRevealYourHand=你想展示你的手牌吗? #RollPlanarDiceEffect.java -lblRolled=已转动 +lblRolled=已掷骰 #SacrificeEffect.java lblDoYouWantPayEcho=你想支付返响费用 lblPayEcho=支付返响费用 @@ -1818,4 +1819,30 @@ lblSelectCardToUntap=选择要重置的牌 #VoteEffect.java lblVote=投票 lblCurrentVote=当前投票 -lblHowManyAdditionalVotesDoYouWant=你想要额外投多少票? \ No newline at end of file +lblHowManyAdditionalVotesDoYouWant=你想要额外投多少票? +#InputPayMana.java +lblChooseManaAbility=选择法术力异能 +#VDevMenu.java +lblUnlimitedLands=使用地不受限制 +lblGenerateMana=产生法术力 +lblViewAll=查看所有牌 +lblSetupGame=设定游戏状态 +lblDumpGame=转储游戏状态 +lblTutor=导师牌 +lblAddCounterPermanent=向牌添加指示物 +lblSubCounterPermanent=从牌减少指示物 +lblTapPermanent=横置永久物 +lblUntapPermanent=重置永久物 +lblSetLife=设置牌手生命值 +lblCardToBattlefield=将牌添加到战场 +lblExileFromPlay=从牌手放逐牌 +lblCardToHand=添加牌到手牌 +lblExileFromHand=从手牌放逐牌 +lblCardToLibrary=添加牌到牌库 +lblCardToGraveyard=添加牌到坟场 +lblCardToExile=添加牌到放逐区 +lblCastSpellOrPlayLand=释放咒语/使用地 +lblRepeatAddCard=重复上一张添加的牌 +lblRemoveFromGame=从游戏中删除牌 +lblRiggedRoll=触发时空骰 +lblWalkTo=时空换入 From 2285541b6dff952327bb51d46ab1e694091ebbbe Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Wed, 25 Dec 2019 18:42:35 +0800 Subject: [PATCH 29/54] fix missing translate --- forge-gui/res/languages/de-DE.properties | 1 + forge-gui/res/languages/en-US.properties | 1 + forge-gui/res/languages/es-ES.properties | 1 + forge-gui/res/languages/zh-CN.properties | 1 + forge-gui/src/main/java/forge/player/PlayerControllerHuman.java | 2 +- 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 03511b6bc48..90c389df1a5 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1245,6 +1245,7 @@ lblRestartingActionSequence=Restarting action sequence. lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces and/or commas. lblErrorEntityWithId=Error: Entity with ID lblNotFound=not found +lblChooseAnnounceFor=Choose %s for %name #AbstractGuiGame.java lblConcedeCurrentGame=Das Spiel wird als verloren gewertet.\n\nTrotzdem aufgeben? lblConcedeTitle=Spiel verloren geben? diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 01e19fb22d7..ab4d0edb609 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1245,6 +1245,7 @@ lblRestartingActionSequence=Restarting action sequence. lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces and/or commas. lblErrorEntityWithId=Error: Entity with ID lblNotFound=not found +lblChooseAnnounceFor=Choose %s for %name #AbstractGuiGame.java lblConcedeCurrentGame=This will concede the current game and you will lose.\n\nConcede anyway? lblConcedeTitle=Concede Game? diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index ff7583dca61..e2cd6d0aaef 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1245,6 +1245,7 @@ lblRestartingActionSequence=Restarting action sequence. lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces and/or commas. lblErrorEntityWithId=Error: Entity with ID lblNotFound=not found +lblChooseAnnounceFor=Choose %s for %name #AbstractGuiGame.java lblConcedeCurrentGame=Esto concederá la partida actual y perderás.\n\n¿Conceder de todos modos? lblConcedeTitle=¿Conceder Partida? diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index cf7d8781285..9d02b163033 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1245,6 +1245,7 @@ lblRestartingActionSequence=重新启动行动序列 lblErrorPleaseCheckID=错误:请检查ID,并确保他们之间用空格和/或逗号分隔。 lblErrorEntityWithId=错误:实体的ID lblNotFound=没有找到 +lblChooseAnnounceFor=为%name选择%s #AbstractGuiGame.java lblConcedeCurrentGame=这局游戏认输。\n\n确认吗? lblConcedeTitle=这局游戏认输? diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 02b0e90013c..6d320a4ffdb 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -313,7 +313,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public Integer announceRequirements(final SpellAbility ability, final String announce, final boolean canChooseZero) { final int min = canChooseZero ? 0 : 1; - return getGui().getInteger(localizer.getMessage("Choose %s for ").replace("%s", announce) + ability.getHostCard().getName(), min, + return getGui().getInteger(localizer.getMessage("lblChooseAnnounceFor").replace("%s", announce).replace("%name", ability.getHostCard().getName()) , min, Integer.MAX_VALUE, min + 9); } From fb0c0bd807bb7b8c28167cce3d1c94f15c1792d4 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Thu, 26 Dec 2019 08:25:06 +0800 Subject: [PATCH 30/54] fix typo --- forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java index 8b754ea1001..4bc24b8ceda 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java @@ -260,7 +260,7 @@ public class VDevMenu extends FDropDownMenu { }); } })); - addItem(new FMenuItem(Localizer.getInstance().getMessage("lblRiggedRoll"), new FEventHandler() { + addItem(new FMenuItem(Localizer.getInstance().getMessage("lblWalkTo"), new FEventHandler() { @Override public void handleEvent(FEvent e) { ThreadUtil.invokeInGameThread(new Runnable() { From 97fe8dc35bc221161c65d98a0189e97253d0abf4 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Dec 2019 18:41:36 -0500 Subject: [PATCH 31/54] Fixing "you may search your library and/or your graveyard" cards so your library isn't auto-searched (and shuffled) --- forge-gui/res/cardsfolder/a/ajanis_aid.txt | 2 +- forge-gui/res/cardsfolder/a/angraths_fury.txt | 2 +- forge-gui/res/cardsfolder/c/chandras_flame_wave.txt | 2 +- forge-gui/res/cardsfolder/c/chandras_outburst.txt | 2 +- forge-gui/res/cardsfolder/d/domris_nodorog.txt | 2 +- forge-gui/res/cardsfolder/d/dovins_dismissal.txt | 2 +- forge-gui/res/cardsfolder/e/ethereal_elk.txt | 2 +- forge-gui/res/cardsfolder/g/gideons_battle_cry.txt | 2 +- forge-gui/res/cardsfolder/g/gideons_resolve.txt | 2 +- forge-gui/res/cardsfolder/g/goldmane_griffin.txt | 2 +- forge-gui/res/cardsfolder/g/grasping_current.txt | 2 +- forge-gui/res/cardsfolder/j/jaces_ruse.txt | 2 +- forge-gui/res/cardsfolder/l/liberating_combustion.txt | 2 +- forge-gui/res/cardsfolder/l/lilianas_influence.txt | 2 +- forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt | 2 +- forge-gui/res/cardsfolder/o/okos_hospitality.txt | 2 +- forge-gui/res/cardsfolder/r/rals_dispersal.txt | 2 +- forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt | 2 +- forge-gui/res/cardsfolder/r/rowans_stalwarts.txt | 2 +- forge-gui/res/cardsfolder/s/sorins_guide.txt | 2 +- forge-gui/res/cardsfolder/s/sun_blessed_mount.txt | 2 +- forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt | 2 +- forge-gui/res/cardsfolder/v/visage_of_bolas.txt | 2 +- forge-gui/res/cardsfolder/v/vraskas_scorn.txt | 2 +- forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt | 2 +- forge-gui/res/cardsfolder/y/yanlings_harbinger.txt | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/ajanis_aid.txt b/forge-gui/res/cardsfolder/a/ajanis_aid.txt index 4aebeaab1a2..83422cc69d9 100644 --- a/forge-gui/res/cardsfolder/a/ajanis_aid.txt +++ b/forge-gui/res/cardsfolder/a/ajanis_aid.txt @@ -2,7 +2,7 @@ Name:Ajani's Aid ManaCost:2 G W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Valiant Protector, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedAjani; Valiant Protector | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedAjani; Valiant Protector | ChangeNum$ 1 | Optional$ True A:AB$ ChooseCard | Cost$ Sac<1/CARDNAME> | Choices$ Creature | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SVars$ DBEffect | RememberChosen$ True | SpellDescription$ Prevent all combat damage a creature of your choice would deal this turn. SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | RememberObjects$ Remembered | SVars$ RPreventNextFromSource | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 SVar:RPreventNextFromSource:Event$ DamageDone | CombatDamage$ True | ValidSource$ Card.IsRemembered | Prevent$ True | PreventionEffect$ True | Description$ Prevent all combat damage a creature of your choice would deal this turn. diff --git a/forge-gui/res/cardsfolder/a/angraths_fury.txt b/forge-gui/res/cardsfolder/a/angraths_fury.txt index 54c273e75fc..32b96159103 100644 --- a/forge-gui/res/cardsfolder/a/angraths_fury.txt +++ b/forge-gui/res/cardsfolder/a/angraths_fury.txt @@ -3,7 +3,7 @@ ManaCost:3 B R Types:Sorcery A:SP$ Destroy | Cost$ 3 B R | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBDealDamage | SpellDescription$ Destroy target creature. CARDNAME deals 3 damage to target player or planeswalker. You may search your library and/or graveyard for a card named Angrath, Minotaur Pirate, reveal it, and put it into your hand. If you search your library this way, shuffle it. SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 3 | SubAbility$ DBSearch -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedAngrath; Minotaur Pirate | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedAngrath; Minotaur Pirate | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Angrath, Minotaur Pirate SVar:Picture:http://www.wizards.com/global/images/magic/general/angraths_fury.jpg Oracle:Destroy target creature. Angrath's Fury deals 3 damage to target player or planeswalker. You may search your library and/or graveyard for a card named Angrath, Minotaur Pirate, reveal it, and put it into your hand. If you search your library this way, shuffle it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt b/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt index a1cb566e033..f71d13056ea 100644 --- a/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt +++ b/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt @@ -2,6 +2,6 @@ Name:Chandra's Flame Wave ManaCost:3 R R Types:Sorcery A:SP$ DamageAll | Cost$ 3 R R | ValidTgts$ Player | NumDmg$ 2 | ValidPlayers$ Targeted | ValidCards$ Creature.TargetedPlayerCtrl | ValidDescription$ target player and each creature that player controls. | SubAbility$ DBSearch | SpellDescription$ CARDNAME deals 2 damage to target player and each creature that player controls. Search your library and/or graveyard for a card named Chandra, Flame's Fury, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedChandra; Flame's Fury | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedChandra; Flame's Fury | ChangeNum$ 1 | Optional$ True DeckHints:Name$Chandra, Flame's Fury Oracle:Chandra's Flame Wave deals 2 damage to target player and each creature that player controls. Search your library and/or graveyard for a card named Chandra, Flame's Fury, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/c/chandras_outburst.txt b/forge-gui/res/cardsfolder/c/chandras_outburst.txt index 1f41bcb20f3..271a88857c9 100644 --- a/forge-gui/res/cardsfolder/c/chandras_outburst.txt +++ b/forge-gui/res/cardsfolder/c/chandras_outburst.txt @@ -2,6 +2,6 @@ Name:Chandra's Outburst ManaCost:3 R R Types:Sorcery A:SP$ DealDamage | Cost$ 3 R R | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 4 | SubAbility$ DBSearch | SpellDescription$ CARDNAME deals 4 damage to target player or planeswalker. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedChandra; Bold Pyromancer | ChangeNum$ 1 +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedChandra; Bold Pyromancer | ChangeNum$ 1 DeckNeeds:Name$Chandra, Bold Pyromancer Oracle:Chandra's Outburst deals 4 damage to target player or planeswalker.\nSearch your library and/or graveyard for a card named Chandra, Bold Pyromancer, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/d/domris_nodorog.txt b/forge-gui/res/cardsfolder/d/domris_nodorog.txt index 63564138bf9..2436b124fab 100644 --- a/forge-gui/res/cardsfolder/d/domris_nodorog.txt +++ b/forge-gui/res/cardsfolder/d/domris_nodorog.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:5/2 K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDomri; City Smasher | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedDomri; City Smasher | ChangeNum$ 1 | Optional$ True DeckHints:Name$Domri, City Smasher Oracle:Trample\nWhen Domri's Nodorog enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/d/dovins_dismissal.txt b/forge-gui/res/cardsfolder/d/dovins_dismissal.txt index 4ad9b8a5e86..aa84261ae5e 100644 --- a/forge-gui/res/cardsfolder/d/dovins_dismissal.txt +++ b/forge-gui/res/cardsfolder/d/dovins_dismissal.txt @@ -2,6 +2,6 @@ Name:Dovin's Dismissal ManaCost:2 W U Types:Instant A:SP$ ChangeZone | Cost$ 2 W U | ValidTgts$ Creature.tapped | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target tapped creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SubAbility$ DBSearch | SpellDescription$ Put up to one target tapped creature on top of its owner's library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDovin; Architect of Law | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedDovin; Architect of Law | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Dovin, Architect of Law Oracle:Put up to one target tapped creature on top of its owner's library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/e/ethereal_elk.txt b/forge-gui/res/cardsfolder/e/ethereal_elk.txt index 5796059969b..028212a92be 100644 --- a/forge-gui/res/cardsfolder/e/ethereal_elk.txt +++ b/forge-gui/res/cardsfolder/e/ethereal_elk.txt @@ -4,6 +4,6 @@ Types:Creature Elk Spirit PT:3/3 K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Vivien, Nature's Avenger, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedVivien; Nature's Avenger | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedVivien; Nature's Avenger | ChangeNum$ 1 | Optional$ True DeckHints:Name$Vivien, Nature's Avenger Oracle:Trample\nWhen Ethereal Elk enters the battlefield, you may search your library and/or graveyard for a card named Vivien, Nature's Avenger, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt b/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt index 3b8fd338e99..d22c7e0ab6f 100644 --- a/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt +++ b/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt @@ -2,7 +2,7 @@ Name:Gideon's Battle Cry ManaCost:2 W W Types:Sorcery A:SP$ PutCounterAll | Cost$ 2 W W | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBSearch | SpellDescription$ Put a +1/+1 counter on each creature you control. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedGideon; the Oathsworn | ChangeNum$ 1 +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedGideon; the Oathsworn | ChangeNum$ 1 | Optional$ True DeckHas:Ability$Counters DeckHints:Name$Gideon, the Oathsworn Oracle:Put a +1/+1 counter on each creature you control. You may search your library and/or graveyard for a card named Gideon, the Oathsworn, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/g/gideons_resolve.txt b/forge-gui/res/cardsfolder/g/gideons_resolve.txt index 1ecc2aada69..0bfb6e097d0 100644 --- a/forge-gui/res/cardsfolder/g/gideons_resolve.txt +++ b/forge-gui/res/cardsfolder/g/gideons_resolve.txt @@ -2,7 +2,7 @@ Name:Gideon's Resolve ManaCost:4 W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Gideon, Martial Paragon, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedGideon; Martial Paragon | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedGideon; Martial Paragon | ChangeNum$ 1 | Optional$ True S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures you control get +1/+1. SVar:PlayMain1:TRUE DeckHints:Name$Gideon, Martial Paragon diff --git a/forge-gui/res/cardsfolder/g/goldmane_griffin.txt b/forge-gui/res/cardsfolder/g/goldmane_griffin.txt index 1eae39450c9..6d735cfb5fb 100644 --- a/forge-gui/res/cardsfolder/g/goldmane_griffin.txt +++ b/forge-gui/res/cardsfolder/g/goldmane_griffin.txt @@ -5,6 +5,6 @@ PT:3/2 K:Flying K:Vigilance T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Valiant it, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedAjani; Inspiring Leader | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedAjani; Inspiring Leader | ChangeNum$ 1 | Optional$ True DeckHints:Name$Ajani, Inspiring Leader Oracle:Flying, vigilance\nWhen Goldmane Griffin enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Inspiring Leader, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/g/grasping_current.txt b/forge-gui/res/cardsfolder/g/grasping_current.txt index 479635023cb..71203a17db4 100644 --- a/forge-gui/res/cardsfolder/g/grasping_current.txt +++ b/forge-gui/res/cardsfolder/g/grasping_current.txt @@ -2,7 +2,7 @@ Name:Grasping Current ManaCost:4 U Types:Sorcery A:SP$ ChangeZone | Cost$ 4 U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return up to two target creatures to their owner's hand. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedJace; Ingenious Mind-Mage | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, and put it into your hand. If you searched your library this way, shuffle it. +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedJace; Ingenious Mind-Mage | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, and put it into your hand. If you searched your library this way, shuffle it. DeckHints:Name$Jace, Ingenious Mind-Mage SVar:Picture:http://www.wizards.com/global/images/magic/general/grasping_current.jpg Oracle:Return up to two target creatures to their owner's hand.\nSearch your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, and put it into your hand. If you searched your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/j/jaces_ruse.txt b/forge-gui/res/cardsfolder/j/jaces_ruse.txt index 72f07430c79..801cff7581e 100644 --- a/forge-gui/res/cardsfolder/j/jaces_ruse.txt +++ b/forge-gui/res/cardsfolder/j/jaces_ruse.txt @@ -2,6 +2,6 @@ Name:Jace's Ruse ManaCost:3 U U Types:Sorcery A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return up to two target creatures to their owner's hand. You may search your library and/or graveyard for a card named Jace, Arcane Wizards, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedJace; Arcane Strategist | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedJace; Arcane Strategist | ChangeNum$ 1 | Optional$ True DeckHints:Name$Jace, Arcane Strategist Oracle:Return up to two target creatures to their owner's hand. You may search your library and/or graveyard for a card named Jace, Arcane Strategist, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/l/liberating_combustion.txt b/forge-gui/res/cardsfolder/l/liberating_combustion.txt index 42d5557ff39..92cc21bd2c2 100644 --- a/forge-gui/res/cardsfolder/l/liberating_combustion.txt +++ b/forge-gui/res/cardsfolder/l/liberating_combustion.txt @@ -2,7 +2,7 @@ Name:Liberating Combustion ManaCost:4 R Types:Sorcery A:SP$ DealDamage | Cost$ 4 R | ValidTgts$ Creature | NumDmg$ 6 | SubAbility$ DBSearch | SpellDescription$ CARDNAME deals 6 damage to target creature. You may search your library and/or graveyard for a card named Chandra, Pyrogenius, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedChandra; Pyrogenius | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedChandra; Pyrogenius | ChangeNum$ 1 | Optional$ True DeckHints:Name$Chandra, Pyrogenius SVar:Picture:http://www.wizards.com/global/images/magic/general/liberating_combustion.jpg Oracle:Liberating Combustion deals 6 damage to target creature. You may search your library and/or graveyard for a card named Chandra, Pyrogenius, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/l/lilianas_influence.txt b/forge-gui/res/cardsfolder/l/lilianas_influence.txt index 2d313b13ae4..bbc9d2ec8e7 100644 --- a/forge-gui/res/cardsfolder/l/lilianas_influence.txt +++ b/forge-gui/res/cardsfolder/l/lilianas_influence.txt @@ -2,7 +2,7 @@ Name:Liliana's Influence ManaCost:4 B B Types:Sorcery A:SP$ PutCounterAll | Cost$ 4 B B | ValidCards$ Creature.YouDontCtrl | CounterType$ M1M1 | CounterNum$ 1 | SubAbility$ DBShuffle | IsCurse$ True | SubAbility$ DBSearch | SpellDescription$ Put a -1/-1 counter on each creature you don't control. You may search your library and/or graveyard for a card named Liliana, Death Wielder, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedLiliana; Death Wielder | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedLiliana; Death Wielder | ChangeNum$ 1 | Optional$ True DeckHints:Name$Liliana, Death Wielder SVar:Picture:http://www.wizards.com/global/images/magic/general/lilianas_influence.jpg Oracle:Put a -1/-1 counter on each creature you don't control. You may search your library and/or graveyard for a card named Liliana, Death Wielder, reveal it, and put it into your hand. If you search your library this way, shuffle it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt b/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt index 93b157bafb4..02ccfd15ec4 100644 --- a/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt +++ b/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt @@ -3,6 +3,6 @@ ManaCost:1 W U Types:Legendary Creature Human Cleric PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Teferi, Timebender, reveal it, then put it into your hand. If you searched your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedTeferi; Timebender | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedTeferi; Timebender | ChangeNum$ 1 | Optional$ True DeckHints:Name$Teferi, Timebender Oracle:When Niambi, Faithful Healer enters the battlefield, you may search your library and/or graveyard for a card named Teferi, Timebender, reveal it, then put it into your hand. If you searched your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/o/okos_hospitality.txt b/forge-gui/res/cardsfolder/o/okos_hospitality.txt index 6551ca3c462..98b59ad20e7 100644 --- a/forge-gui/res/cardsfolder/o/okos_hospitality.txt +++ b/forge-gui/res/cardsfolder/o/okos_hospitality.txt @@ -2,6 +2,6 @@ Name:Oko's Hospitality ManaCost:3 G U Types:Instant A:SP$ AnimateAll | Cost$ 3 G U | ValidCards$ Creature.YouCtrl | Power$ 3 | Toughness$ 3 | SubAbility$ DBSearch | SpellDescription$ Creatures you control have base power and toughness 3/3 until end of turn. You may search your library and/or graveyard for a card named Oko, the Trickster, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedOko; the Trickster | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedOko; the Trickster | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Oko, the Trickster Oracle:Creatures you control have base power and toughness 3/3 until end of turn. You may search your library and/or graveyard for a card named Oko, the Trickster, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/r/rals_dispersal.txt b/forge-gui/res/cardsfolder/r/rals_dispersal.txt index bf091ea1034..0d0d0fd078e 100644 --- a/forge-gui/res/cardsfolder/r/rals_dispersal.txt +++ b/forge-gui/res/cardsfolder/r/rals_dispersal.txt @@ -2,6 +2,6 @@ Name:Ral's Dispersal ManaCost:3 U U Types:Instant A:SP$ ChangeZone | Cost$ 3 U U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return target creature to its owner's hand. You may search you library and/or graveyard for a card named, Ral, Caller of Storms and put it in your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedRal; Caller of Storms | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedRal; Caller of Storms | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Ral, Caller of Storms Oracle:Return target creature to its owner's hand. You may search you library and/or graveyard for a card named Ral, Caller of Storms, reveal it, and put it in to your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt b/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt index 1c919d8bbaa..e075fa4c0bf 100644 --- a/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt +++ b/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt @@ -2,6 +2,6 @@ Name:Rhythmic Water Vortex ManaCost:3 U U Types:Sorcery A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return up to two target creatures to their owner's hand. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedMu Yanling | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Mu Yanling, reveal it, and put it into your hand. If you searched your library this way, shuffle it. +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedMu Yanling | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Mu Yanling, reveal it, and put it into your hand. If you searched your library this way, shuffle it. DeckHints:Name$Mu Yanling Oracle:Return up to two target creatures to their owner's hand.\nSearch your library and/or graveyard for a card named Mu Yanling, reveal it, and put it into your hand. If you searched your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt b/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt index e4c3dc1c89a..cb026f19367 100644 --- a/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt +++ b/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt @@ -3,6 +3,6 @@ ManaCost:4 R Types:Creature Human Knight PT:5/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Rowan, Fearless Sparkmage, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedRowan; Fearless Sparkmage | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedRowan; Fearless Sparkmage | ChangeNum$ 1 | Optional$ True DeckHints:Name$Rowan, Fearless Sparkmage Oracle:When Rowan's Stalwarts enters the battlefield, you may search your library and/or graveyard for a card named Rowan, Fearless Sparkmage, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/s/sorins_guide.txt b/forge-gui/res/cardsfolder/s/sorins_guide.txt index 97942b00ccf..c2d30694e37 100644 --- a/forge-gui/res/cardsfolder/s/sorins_guide.txt +++ b/forge-gui/res/cardsfolder/s/sorins_guide.txt @@ -3,6 +3,6 @@ ManaCost:3 B B Types:Creature Vampire PT:4/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named flying, Vampire CARDNAME, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedSorin; Vampire Lord | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedSorin; Vampire Lord | ChangeNum$ 1 | Optional$ True DeckHints:Name$Sorin, Vampire Lord Oracle:When Sorin's Guide enters the battlefield, you may search your library and/or graveyard for a card named Sorin, Vampire Lord, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt b/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt index 4ff2711a72c..92a0b9dfde9 100644 --- a/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt +++ b/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt @@ -3,7 +3,7 @@ ManaCost:3 R W Types:Creature Dinosaur PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Huatli, Dinosaur Knight, reveal it, then put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedHuatli; Dinosaur Knight | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedHuatli; Dinosaur Knight | ChangeNum$ 1 | Optional$ True DeckHints:Name$Huatli, Dinosaur Knight SVar:Picture:http://www.wizards.com/global/images/magic/general/sun_blessed_mount.jpg Oracle:When Sun-Blessed Mount enters the battlefield, you may search your library and/or graveyard for a card named Huatli, Dinosaur Knight, reveal it, then put it into your hand. If you searched your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt b/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt index 7426200799b..c2852ea3c81 100644 --- a/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt +++ b/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt @@ -2,7 +2,7 @@ Name:Tezzeret's Betrayal ManaCost:3 U B Types:Sorcery A:SP$ Destroy | Cost$ 3 U B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBSearch | SpellDescription$ Destroy target creature. You may search your library and/or graveyard for a card named Tezzeret, Master of Metal, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedTezzeret; Master of Metal | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedTezzeret; Master of Metal | ChangeNum$ 1 | Optional$ True DeckHints:Name$Tezzeret, Master of Metal SVar:Picture:http://www.wizards.com/global/images/magic/general/tezzerets_betrayal.jpg Oracle:Destroy target creature. You may search your library and/or graveyard for a card named Tezzeret, Master of Metal, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/v/visage_of_bolas.txt b/forge-gui/res/cardsfolder/v/visage_of_bolas.txt index e7b93034995..0781da4fdd5 100644 --- a/forge-gui/res/cardsfolder/v/visage_of_bolas.txt +++ b/forge-gui/res/cardsfolder/v/visage_of_bolas.txt @@ -2,7 +2,7 @@ Name:Visage of Bolas ManaCost:4 Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Nicol Bolas, the Deceiver, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedNicol Bolas; the Deceiver | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedNicol Bolas; the Deceiver | ChangeNum$ 1 | Optional$ True A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. diff --git a/forge-gui/res/cardsfolder/v/vraskas_scorn.txt b/forge-gui/res/cardsfolder/v/vraskas_scorn.txt index 445cac701e7..5f3742e5133 100644 --- a/forge-gui/res/cardsfolder/v/vraskas_scorn.txt +++ b/forge-gui/res/cardsfolder/v/vraskas_scorn.txt @@ -2,7 +2,7 @@ Name:Vraska's Scorn ManaCost:2 B B Types:Sorcery A:SP$ LoseLife | Cost$ 2 B B | ValidTgts$ Opponent | LifeAmount$ 4 | SubAbility$ DBSearch | SpellDescription$ Target opponent loses 4 life. You may search your library and/or graveyard for a card named Vraska, Scheming Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedVraska; Scheming Gorgon | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedVraska; Scheming Gorgon | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Vraska, Scheming Gorgon SVar:Picture:http://www.wizards.com/global/images/magic/general/vraskas_scorn.jpg Oracle:Target opponent loses 4 life. You may search your library and/or graveyard for a card named Vraska, Scheming Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt b/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt index 1a6c3cb90d1..95a3ebec906 100644 --- a/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt +++ b/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt @@ -3,7 +3,7 @@ ManaCost:4 B G Types:Sorcery A:SP$ Destroy | Cost$ 4 B G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBGainLife | SpellDescription$ Destroy target creature. You gain life equal to its toughness. You may search your library and/or graveyard from a card named Vraska, Regal Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup | References$ X | SubAbility$ DBSearch -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedVraska; Regal Gorgon | ChangeNum$ 1 | Optional$ True +SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedVraska; Regal Gorgon | ChangeNum$ 1 | Optional$ True SVar:X:TargetedLKI$CardToughness DeckNeeds:Name$Vraska, Regal Gorgon Oracle:Destroy target creature. You gain life equal to its toughness. You may search your library and/or graveyard from a card named Vraska, Regal Gorgon, reveal it, and put it in to your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt b/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt index 8514bd32ba1..5754357ec31 100644 --- a/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt +++ b/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt @@ -4,6 +4,6 @@ Types:Creature Bird PT:2/4 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Mu Yanling, Celestial Wind, reveal it, and put it into your hand. If you search your library this way, shuffle it. -SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedMu Yanling; Celestial Wind | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedMu Yanling; Celestial Wind | ChangeNum$ 1 | Optional$ True DeckHints:Name$Mu Yanling, Celestial Wind Oracle:Flying\nWhen Yanling's Harbinger enters the battlefield, you may search your library and/or graveyard for a card named Mu Yanling, Celestial Wind, reveal it, and put it into your hand. If you search your library this way, shuffle it. From 7023521fb263596c1f3349d4585bc10a081cd168 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Dec 2019 19:32:50 -0500 Subject: [PATCH 32/54] Another round of THB --- .../cardsfolder/upcoming/ashiok_nightmare_muse.txt | 2 +- .../upcoming/ashiok_sculptor_of_fears.txt | 9 +++++++++ .../cardsfolder/upcoming/elspeth_undaunted_hero.txt | 11 +++++++++++ .../res/cardsfolder/upcoming/hero_of_the_winds.txt | 9 +++++++++ .../res/cardsfolder/upcoming/medomais_prophecy.txt | 12 ++++++++++++ forge-gui/res/cardsfolder/upcoming/memory_drain.txt | 6 ++++++ .../res/cardsfolder/upcoming/minions_return.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/mires_grasp.txt | 7 +++++++ forge-gui/res/editions/Theros Beyond Death.txt | 1 + 9 files changed, 66 insertions(+), 1 deletion(-) create mode 100755 forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/memory_drain.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/minions_return.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/mires_grasp.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt b/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt index 3b301ba9849..448f20b4de4 100644 --- a/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt +++ b/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt @@ -2,7 +2,7 @@ Name:Ashiok, Nightmare Muse ManaCost:3 U B Types:Legendary Planeswalker Ashiok Loyalty:5 -A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ ub_2_3_nightmare_mill | TokenOwner$ You | LegacyImage$ ub 2 3 Nightmare mill thb | SubAbility$ DBDraw | SpellDescription$ Create a 2/3 blue and black Nightmare creature token with "Whenever this creature attacks or blocks, each opponent exiles the top two cards of their library." +A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ ub_2_3_nightmare_mill | TokenOwner$ You | LegacyImage$ ub 2 3 Nightmare mill thb | SpellDescription$ Create a 2/3 blue and black Nightmare creature token with "Whenever this creature attacks or blocks, each opponent exiles the top two cards of their library." A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBExile | SpellDescription$ Return target nonland permanent to its owner’s hand, then that player exiles a card from their hand. SVar:DBExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | DefinedPlayer$ TargetedOwner | Chooser$ TargetedOwner A:AB$ Play | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Valid$ Card.nonLand+faceUp+OwnedBy Player.Opponent | ValidZone$ Exile | WithoutManaCost$ True | Amount$ 3 | Optional$ True | SpellDescription$ You may cast up to three face-up cards your opponents own from exile without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt b/forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt new file mode 100755 index 00000000000..6e94b1c9366 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt @@ -0,0 +1,9 @@ +Name:Ashiok, Sculptor of Fears +ManaCost:4 U B +Types:Legendary Planeswalker Ashiok +Loyalty:4 +A:AB$ Draw | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | NumCards$ 1 | SubAbility$ DBMill | SpellDescription$ Draw a card. Each player puts the top two cards of their library into their graveyard. +SVar:DBMill:DB$ Mill | Defined$ Player | NumCards$ 2 +A:AB$ ChangeZone | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. +A:AB$ GainControl | Cost$ SubCounter<11/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | AllValid$ Creature.TargetedPlayerCtrl | NewController$ You | StackDescription$ SpellDescription | SpellDescription$ Gain control of all creatures target opponent controls. +Oracle:+2: Draw a card. Each player puts the top two cards of their library into their graveyard.\n−5: Put target creature card from a graveyard onto the battlefield under you control.\n−11: Gain control of all creatures target opponent controls. diff --git a/forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt b/forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt new file mode 100755 index 00000000000..b9ce2ca3763 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt @@ -0,0 +1,11 @@ +Name:Elspeth, Undaunted Hero +ManaCost:2 W W W +Types:Legendary Planeswalker Elspeth +Loyalty:5 +A:AB$ PutCounter | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | CounterNum$ 1 | CounterType$ P1P1 | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creatures | SpellDescription$ Put a +1/+1 counter on each of up to two target creatures. +DeckHas:Ability$Counters +A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Battlefield | ChangeType$ Card.namedSunlit Hoplite | ChangeNum$ 1 | StackDescription$ SpellDescription |SpellDescription$ Search your library and/or graveyard for a card named Sunlit Hoplite and put it onto the battlefield. If you search your library this way, shuffle it. +DeckHints:Name$Sunlit Hoplite +A:AB$ PumpAll | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +X | NumDef$ +X | References$ X | KW$ Flying | SpellDescription$ Until end of turn, creatures you control gain flying and get +X/+X, where X is your devotion to white. +SVar:X:Count$Devotion.White +Oracle:+2: Put a +1/+1 counter on each of up to two target creatures.\n−2: Search your library and/or graveyard for a card named Sunlit Hoplite and put it onto the battlefield. If you search your library this way, shuffle it.\n−8: Until end of turn, creatures you control gain flying and get +X/+X, where X is your devotion to white. diff --git a/forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt b/forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt new file mode 100755 index 00000000000..731fd1cddf7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt @@ -0,0 +1,9 @@ +Name:Hero of the Winds +ManaCost:3 W +Types:Creature Human Soldier +PT:1/4 +K:Flying +T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPumpAll | TriggerDescription$ Whenever you cast a spell that targets CARDNAME, creatures you control get +1/+0 until end of turn. +SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 +SVar:BuffedBy:Card +Oracle:Flying\nWhenever you cast a spell that targets Hero of the Winds, creatures you control get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt b/forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt new file mode 100644 index 00000000000..c57b689280b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt @@ -0,0 +1,12 @@ +Name:Medomai's Prophecy +ManaCost:1 U +Types:Enchantment Saga +K:Saga:4:DBScry,DBNameCard,DBEffect,DBLook +SVar:DBScry:DB$ Scry | ScryNum$ 2 | SpellDescription$ Scry 2. +SVar:DBNameCard:DB$ NameCard | SpellDescription$ Choose a card name. +SVar:DBEffect:DB$ Effect | Name$ Medomai's Prophecy Effect | Triggers$ NamedCardCast | SVars$ NamedCardCast,TrigDraw,ExileEffect | SpellDescription$ When you cast a spell with the chosen name for the first time this turn, draw two cards. +SVar:DBLook:DB$ Dig | Defined$ Player | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | SpellDescription$ Look at the top card of each player's library. +SVar:NamedCardCast:Mode$ SpellCast | ValidCard$ Card.NamedCard | ValidActivatingPlayer$ You | TriggerZones$ Command | Execute$ TrigDraw | TriggerDescription$ When you cast a spell with the chosen name for the first time this turn, draw two cards. +SVar:TrigDraw:DB$ Draw | NumCards$ 2 | SubAbility$ ExileEffect +SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after IV.)\nI — Scry 2.\nII — Choose a card name.\nIII — When you cast a spell with the chosen name for the first time this turn, draw two cards.\nIV - Look at the top card of each player's library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/memory_drain.txt b/forge-gui/res/cardsfolder/upcoming/memory_drain.txt new file mode 100755 index 00000000000..2744cacf801 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/memory_drain.txt @@ -0,0 +1,6 @@ +Name:Memory Drain +ManaCost:2 U U +Types:Instant +A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ DBScry | SpellDescription$ Counter target spell. Scry 2. +SVar:DBScry:DB$Scry | ScryNum$ 2 +Oracle:Counter target spell. Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/minions_return.txt b/forge-gui/res/cardsfolder/upcoming/minions_return.txt new file mode 100644 index 00000000000..15aa8619e06 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/minions_return.txt @@ -0,0 +1,10 @@ +Name:Minion's Return +ManaCost:2 B +Types:Enchantment Aura +K:Flash +K:Enchant creature +A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AITgts$ Card.nonToken | AILogic$ Pump +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChange | TriggerDescription$ When enchanted creature dies, return that card to the battlefield under your control. +SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredCard +Oracle:Flash\nEnchant creature\nWhen enchanted creature dies, return that card to the battlefield under your control. + diff --git a/forge-gui/res/cardsfolder/upcoming/mires_grasp.txt b/forge-gui/res/cardsfolder/upcoming/mires_grasp.txt new file mode 100755 index 00000000000..1f1ffa2a267 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mires_grasp.txt @@ -0,0 +1,7 @@ +Name:Mire's Grasp +ManaCost:1 B +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -3 | AddToughness$ -3 | Description$ Enchanted creature gets -3/-3. +Oracle:Enchant creature\nEnchanted creature gets -3/-3. diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index bbfad143cc8..ea061ae8553 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -18,6 +18,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 43 R Ashiok's Erasure 48 C Eidolon of Philosophy 51 C Ichthyomorphosis +56 U Medomai's Prophecy 102 U Inevitable End 126 C Arena Trickster 136 U Furious Rise From d4a47260cb03a2b7c487ceb48d5724cf3d48a869 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Dec 2019 19:37:39 -0500 Subject: [PATCH 33/54] Another round of THB --- forge-gui/res/editions/Theros Beyond Death.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index ea061ae8553..504c05fa060 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -11,21 +11,25 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 4 U Banishing Light 7 U Commanding Presence 9 U Daxos, Blessed by the Sun -23 C Indomitable Will -26 C Karametra’s Blessing +23 C Hero of the Winds +25 C Indomitable Will +26 C Karametra's Blessing 28 C Leonin of the Lost Pride 42 U Alirios, Enraptured 43 R Ashiok's Erasure 48 C Eidolon of Philosophy 51 C Ichthyomorphosis +54 C Memory Drain 56 U Medomai's Prophecy 102 U Inevitable End +104 U Minion's Return +106 C Mire’s Grasp 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel 140 C Incendiary Oracle 141 C Infuriate -142 C Iroas’s Blessing +142 C Iroas's Blessing 143 C Irreverent Revelers 164 C Aspect of Lamprey 174 C Ilysian Caryatid From 272663dc4af63ec8087d13b68c1f6ff8f71433f3 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Dec 2019 19:41:12 -0500 Subject: [PATCH 34/54] Fixing apostrophes in THB list --- forge-gui/res/editions/Theros Beyond Death.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index 504c05fa060..ba02e0178b3 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -23,7 +23,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 56 U Medomai's Prophecy 102 U Inevitable End 104 U Minion's Return -106 C Mire’s Grasp +106 C Mire's Grasp 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel From 2d28139ca0d9f8fffa7e0390f7602680e452958c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 17 Dec 2019 09:56:23 -0500 Subject: [PATCH 35/54] 7 THB N creatures (mostly vanilla) --- .../res/cardsfolder/upcoming/naiad_of_hidden_coves.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt | 5 +++++ forge-gui/res/editions/Theros Beyond Death.txt | 9 ++++++++- 8 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt diff --git a/forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt b/forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt new file mode 100644 index 00000000000..a79f90b9014 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt @@ -0,0 +1,6 @@ +Name:Naiad of Hidden Coves +ManaCost:2 U +Types:Enchantment Creature Nymph +PT:2/3 +S:Mode$ ReduceCost | Type$ Spell | Activator$ You | Amount$ 1 | Condition$ NotPlayerTurn | Description$ As long as it's not your turn, spells you cast cost {1} less to cast. +Oracle:As long as it's not your turn, spells you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt b/forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt new file mode 100644 index 00000000000..d25eb0d4f10 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt @@ -0,0 +1,8 @@ +Name:Nylea's Huntmaster +ManaCost:3 G +Types:Creature Centaur Shaman +PT:4/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +X/+0 until end of turn, where X is your devotion to green. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.) +SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | References$ X +SVar:X:Count$Devotion.Green +Oracle:When Nylea's Huntmaster enters the battlefield, target creature gets +X/+0 until end of turn, where X is your devotion to green. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.) diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt new file mode 100644 index 00000000000..d6fb1c1b0a3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Brute +ManaCost:3 R R +Types:Enchantment Creature Cyclops +PT:7/3 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt new file mode 100755 index 00000000000..0f65320bbf6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Colossus +ManaCost:3 G G G +Types:Enchantment Creature Giant +PT:6/7 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt new file mode 100755 index 00000000000..b0c0313bc38 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Courser +ManaCost:1 W W +Types:Enchantment Creature Centaur Scout +PT:2/4 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt new file mode 100644 index 00000000000..93842a7b373 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Marauder +ManaCost:2 B B +Types:Enchantment Creature Minotaur +PT:4/3 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt new file mode 100644 index 00000000000..6acf482eeaf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Seaguard +ManaCost:2 U U +Types:Enchantment Creature Merfolk Soldier +PT:2/5 +Oracle: diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index ba02e0178b3..3688d0a4d71 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -15,15 +15,19 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 25 C Indomitable Will 26 C Karametra's Blessing 28 C Leonin of the Lost Pride +29 C Nyxborn Courser 42 U Alirios, Enraptured 43 R Ashiok's Erasure 48 C Eidolon of Philosophy 51 C Ichthyomorphosis 54 C Memory Drain -56 U Medomai's Prophecy +53 U Medomai's Prophecy +56 C Naiad of Hidden Coves +57 C Nyxborn Seaguard 102 U Inevitable End 104 U Minion's Return 106 C Mire's Grasp +109 C Nyxborn Marauder 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel @@ -31,9 +35,12 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 141 C Infuriate 142 C Iroas's Blessing 143 C Irreverent Revelers +144 C Nyxborn Brute 164 C Aspect of Lamprey 174 C Ilysian Caryatid 176 U Klothys's Design +187 C Nylea's Huntmaster +191 C Nyxborn Colossus 208 M Ashiok, Nightmare Muse 219 U Hero of the Nyxborn 243 R Labyrinth of Skophos From 12848af74547b7422302b16b21e16576b757ca20 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 17 Dec 2019 12:26:47 -0500 Subject: [PATCH 36/54] 3 THB Omens --- .../res/cardsfolder/upcoming/omen_of_the_dead.txt | 8 ++++++++ .../res/cardsfolder/upcoming/omen_of_the_hunt.txt | 8 ++++++++ .../res/cardsfolder/upcoming/omen_of_the_sea.txt | 9 +++++++++ forge-gui/res/editions/Theros Beyond Death.txt | 13 +++++++++++++ 4 files changed, 38 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt new file mode 100644 index 00000000000..c1f26a34885 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt @@ -0,0 +1,8 @@ +Name:Omen of the Dead +ManaCost:B +Types:Enchantment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return target creature card from your graveyard to your hand. +SVar:TrigReturn:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl +A:AB$ Scry | Cost$ 2 B Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. +Oracle:Flash\nWhen Omen of the Dead enters the battlefield, return target creature card from your graveyard to your hand.\n{2}{B}, Sacrifice Omen of the Dead: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt new file mode 100644 index 00000000000..f2a97bcd1ac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt @@ -0,0 +1,8 @@ +Name:Omen of the Hunt +ManaCost:2 G +Types:Enchantment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. +SVar:TrigSearch:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | ShuffleNonMandatory$ True +A:AB$ Scry | Cost$ 2 G Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. +Oracle:Flash\nWhen Omen of the Hunt enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.\n{2}{G}, Sacrifice Omen of the Hunt: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt new file mode 100644 index 00000000000..31104af47df --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt @@ -0,0 +1,9 @@ +Name:Omen of the Sea +ManaCost:1 U +Types:Enchantment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 2, then draw a card. +SVar:TrigScry:DB$Scry | ScryNum$ 2 | SubAbility$ DBDraw +SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 +A:AB$ Scry | Cost$ 2 U Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. +Oracle:Flash\nWhen Omen of the Sea enters the battlefield, scry 2, then draw a card.\n{2}{U}, Sacrifice Omen of the Sea: Scry 2. diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index 3688d0a4d71..f45b6089ce3 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -24,10 +24,12 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 53 U Medomai's Prophecy 56 C Naiad of Hidden Coves 57 C Nyxborn Seaguard +58 C Omen of the Sea 102 U Inevitable End 104 U Minion's Return 106 C Mire's Grasp 109 C Nyxborn Marauder +110 C Omen of the Dead 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel @@ -41,6 +43,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 176 U Klothys's Design 187 C Nylea's Huntmaster 191 C Nyxborn Colossus +192 C Omen of the Hunt 208 M Ashiok, Nightmare Muse 219 U Hero of the Nyxborn 243 R Labyrinth of Skophos @@ -62,6 +65,16 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 285 L Mountain 286 L Forest 287 L Forest +288 R Grasping Giant +289 R Victory’s Envoy +290 R Sphinx Mindbreaker +291 R Serpent of Yawning Depths +292 R Demon of Loathing +293 R Underworld Sentinel +294 R Deathbellow War Cry +295 R Terror of Mount Velus +296 R Ironscale Hydra +297 R Treeshaker Chimera [tokens] From 9d5837bb87ab0b9884a51f6aa4e8890d29682f5c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 17 Dec 2019 15:14:41 -0500 Subject: [PATCH 37/54] 3 THB Theme Booster rares --- .../res/cardsfolder/upcoming/deathbellow_war_cry.txt | 5 +++++ .../res/cardsfolder/upcoming/demon_of_loathing.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/grasping_giant.txt | 11 +++++++++++ 3 files changed, 26 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/grasping_giant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt b/forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt new file mode 100644 index 00000000000..ae84aa2c002 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt @@ -0,0 +1,5 @@ +Name:Deathbellow War Cry +ManaCost:5 R R R +Types:Sorcery +A:SP$ ChangeZone | Cost$ 5 R R R | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Minotaur | ChangeNum$ 4 | DifferentNames$ True | SpellDescription$ Search your library for up to four Minotaur creature cards with different names, put them onto the battlefield, then shuffle your library. +Oracle:Search your library for up to four Minotaur creature cards with different names, put them onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt b/forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt new file mode 100644 index 00000000000..1d5494b135b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt @@ -0,0 +1,10 @@ +Name:Demon of Loathing +ManaCost:5 B B +Types:Creature Demon +PT:7/7 +K:Flying +K:Trample +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player sacrifices a creature. +SVar:TrigSac:DB$Sacrifice | Defined$ TriggeredTarget | SacValid$ Creature +SVar:MustBeBlocked:True +Oracle:Flying, trample\nWhenever Demon of Loathing deals combat damage to a player, that player sacrifices a creature. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/grasping_giant.txt b/forge-gui/res/cardsfolder/upcoming/grasping_giant.txt new file mode 100644 index 00000000000..0fa57133606 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grasping_giant.txt @@ -0,0 +1,11 @@ +Name:Grasping Giant +ManaCost:5 W +Types:Creature Giant +PT:5/7 +K:Vigilance +T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, exile that creature until CARDNAME leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredBlocker | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigReturn | Secondary$ True | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, exile that creature until CARDNAME leaves the battlefield. +SVar:TrigReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:Vigilance\nWhenever Grasping Giant becomes blocked by a creature, exile that creature until Grasping Giant leaves the battlefield. \ No newline at end of file From db270d0c7c0fff1734e3837ed8766784b153e52a Mon Sep 17 00:00:00 2001 From: Northmoc Date: Wed, 18 Dec 2019 02:21:38 -0500 Subject: [PATCH 38/54] 3 THB Theme Booster rares --- forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt | 7 +++++++ .../res/cardsfolder/upcoming/rage_scarred_berserker.txt | 7 +++++++ .../cardsfolder/upcoming/serpent_of_yawning_depths.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/setessan_champion.txt | 8 ++++++++ forge-gui/res/editions/Theros Beyond Death.txt | 8 ++++++++ 7 files changed, 49 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/setessan_champion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt b/forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt new file mode 100644 index 00000000000..8f00b76e3d4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt @@ -0,0 +1,7 @@ +Name:Ironscale Hydra +ManaCost:3 G G +Types:Creature Hydra +PT:5/5 +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ValidSource$ Creature | IsCombat$ True | ReplaceWith$ Counters | Description$ If a creature would deal combat damage to CARDNAME, prevent that damage and put a +1/+1 counter on CARDNAME. +SVar:Counters:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +Oracle:If a creature would deal combat damage to Ironscale Hydra, prevent that damage and put a +1/+1 counter on Ironscale Hydra. diff --git a/forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt b/forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt new file mode 100644 index 00000000000..0fa5dfd37c5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt @@ -0,0 +1,6 @@ +Name:Phalanx Tactics +ManaCost:1 W +Types:Instant +A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +1 | TgtPrompt$ Select target creature you control | SubAbility$ DBPumpAll | SpellDescription$ Target creature you control gets +2/+1 until end of turn. Each other creature you control gets +1/+1 until end of turn. +SVar:DBPumpAll:DB$PumpAll | ValidCards$ Targeted.Other+YouCtrl+Creature | NumAtt$ +1 | NumDef$ +1 +Oracle:Target creature you control gets +2/+1 until end of turn. Each other creature you control gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt b/forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt new file mode 100644 index 00000000000..34bfa932987 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt @@ -0,0 +1,7 @@ +Name:Pious Wayfarer +ManaCost:W +Types:Creature Human Scout +PT:1/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, target creature gets +1/+1 until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 1 | NumDef$ 1 +Oracle:Constellation — Whenever an enchantment enters the battlefield under your control, target creature gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt b/forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt new file mode 100644 index 00000000000..c1aa42d68f3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt @@ -0,0 +1,7 @@ +Name:Rage-Scarred Berserker +ManaCost:4 B +Types:Creature Minotaur Berserker +PT:5/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +1/+0 and gains indestructible until end of turn. +SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ Indestructible +Oracle:When Rage-Scarred Berserker enters the battlefield, target creature gets +1/+0 and gains indestructible until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt b/forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt new file mode 100644 index 00000000000..c902315c251 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt @@ -0,0 +1,6 @@ +Name:Serpent of Yawning Depths +ManaCost:4 U U +Types:Enchantment Creature Serpent +PT:6/6 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Kraken+YouCtrl,Creature.Leviathan+YouCtrl,Creature.Octopus+YouCtrl,Creature.Serpent+YouCtrl | ValidBlocker$ Creature.nonKraken+nonLeviathan+nonOctopus+nonSerpent | Description$ Krakens, Leviathans, Octopuses, and Serpents you control can't be blocked except by Krakens, Leviathans, Octopuses, and Serpents. +Oracle:Krakens, Leviathans, Octopuses, and Serpents you control can't be blocked except by Krakens, Leviathans, Octopuses, and Serpents. diff --git a/forge-gui/res/cardsfolder/upcoming/setessan_champion.txt b/forge-gui/res/cardsfolder/upcoming/setessan_champion.txt new file mode 100644 index 00000000000..1afded1fa19 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/setessan_champion.txt @@ -0,0 +1,8 @@ +Name:Setessan Champion +ManaCost:2 G +Types:Creature Human Warrior +PT:1/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, put a +1/+1 counter on CARDNAME and draw a card. +SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | NumCards$ 1 +Oracle:Constellation - Whenever an enchantment enters the battlefield under your control, put a +1/+1 counter on Setessan Champion and draw a card. diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index f45b6089ce3..398f80c79c1 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -16,6 +16,9 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 26 C Karametra's Blessing 28 C Leonin of the Lost Pride 29 C Nyxborn Courser +31 U Phalanx Tactics +32 C Pious Wayfarer +34 C Revoke Existence 42 U Alirios, Enraptured 43 R Ashiok's Erasure 48 C Eidolon of Philosophy @@ -30,6 +33,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 106 C Mire's Grasp 109 C Nyxborn Marauder 110 C Omen of the Dead +113 C Rage-Scarred Berserker 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel @@ -38,12 +42,14 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 142 C Iroas's Blessing 143 C Irreverent Revelers 144 C Nyxborn Brute +149 C Portent of Betrayal 164 C Aspect of Lamprey 174 C Ilysian Caryatid 176 U Klothys's Design 187 C Nylea's Huntmaster 191 C Nyxborn Colossus 192 C Omen of the Hunt +198 R Setessan Champion 208 M Ashiok, Nightmare Muse 219 U Hero of the Nyxborn 243 R Labyrinth of Skophos @@ -52,6 +58,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 252 L Swamp 253 L Mountain 254 L Forest +258 U Daxos, Blessed by the Sun 269 M Athreos, Shroud-Veiled 270 M Elspeth, Undaunted Hero 274 M Ashiok, Sculptor of Fears @@ -75,6 +82,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 295 R Terror of Mount Velus 296 R Ironscale Hydra 297 R Treeshaker Chimera +331 R Setessan Champion [tokens] From b54ce90df1e10ce35020fb96517732d17a5a2107 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 19 Dec 2019 22:26:53 -0700 Subject: [PATCH 39/54] S THB cards and some edits --- .../res/cardsfolder/upcoming/heroes_of_the_revel.txt | 6 +++--- forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt | 2 +- forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt | 2 +- forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt | 4 ++-- forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt | 6 ++++++ .../res/cardsfolder/upcoming/setessan_skirmisher.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/setessan_training.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt | 8 ++++++++ .../res/cardsfolder/upcoming/sphinx_mindbreaker.txt | 8 ++++++++ .../res/cardsfolder/upcoming/staggering_insight.txt | 9 +++++++++ forge-gui/res/editions/Theros Beyond Death.txt | 2 +- .../{r_2_2_satyr_noblock.txt => r_1_1_satyr_noblock.txt} | 2 +- 12 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/setessan_training.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/staggering_insight.txt rename forge-gui/res/tokenscripts/{r_2_2_satyr_noblock.txt => r_1_1_satyr_noblock.txt} (94%) diff --git a/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt b/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt index 136afb781dd..9543c304b34 100644 --- a/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt +++ b/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt @@ -2,8 +2,8 @@ Name:Heroes of the Revel ManaCost:4 R Types:Creature Satyr Soldier PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 2/2 red Satyr creature token with "This creature can't block." -SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_2_2_satyr_noblock | TokenOwner$ You | LegacyImage$ r 2 2 satyr noblock thb +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 red Satyr creature token with "This creature can't block." +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_1_1_satyr_noblock | TokenOwner$ You | LegacyImage$ r 1 1 satyr noblock thb T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a spell that targets CARDNAME, creatures you control get +1/+0 until end of turn. SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 -Oracle:When Heroes of the Revel enters the battlefield, create a 2/2 red Satyr creature token with "This creature can't block."\nWhenever you cast a spell that targets Heroes of the Revel, creatures you control get +1/+0 until end of turn. +Oracle:When Heroes of the Revel enters the battlefield, create a 1/1 red Satyr creature token with "This creature can't block."\nWhenever you cast a spell that targets Heroes of the Revel, creatures you control get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt index c1f26a34885..5ad2f12cf2c 100644 --- a/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Enchantment K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return target creature card from your graveyard to your hand. -SVar:TrigReturn:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl +SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl A:AB$ Scry | Cost$ 2 B Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. Oracle:Flash\nWhen Omen of the Dead enters the battlefield, return target creature card from your graveyard to your hand.\n{2}{B}, Sacrifice Omen of the Dead: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt index f2a97bcd1ac..7e44fdc961f 100644 --- a/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. -SVar:TrigSearch:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | ShuffleNonMandatory$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | ShuffleNonMandatory$ True A:AB$ Scry | Cost$ 2 G Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. Oracle:Flash\nWhen Omen of the Hunt enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.\n{2}{G}, Sacrifice Omen of the Hunt: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt index 31104af47df..bee65b13e7b 100644 --- a/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Enchantment K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 2, then draw a card. -SVar:TrigScry:DB$Scry | ScryNum$ 2 | SubAbility$ DBDraw -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 +SVar:TrigScry:DB$ Scry | ScryNum$ 2 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 A:AB$ Scry | Cost$ 2 U Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2. Oracle:Flash\nWhen Omen of the Sea enters the battlefield, scry 2, then draw a card.\n{2}{U}, Sacrifice Omen of the Sea: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt b/forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt new file mode 100644 index 00000000000..2b0ae2d7494 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt @@ -0,0 +1,6 @@ +Name:Satyr's Cunning +ManaCost:R +Types:Sorcery +A:SP$ Token | Cost$ R | TokenAmount$ 1 | TokenScript$ r_1_1_satyr_noblock | TokenOwner$ You | LegacyImage$ r 1 1 satyr noblock thb | SpellDescription$ Create a 1/1 red Satyr creature token with "This creature can't block." +K:Escape:2 R ExileFromGrave<2/Card.Other> +Oracle:Create a 1/1 red Satyr creature token with "This creature can't block."\nEscape — {2}{R}, Exile two other cards from your graveyard. (You may cast this card from your graveyard for its escape cost). \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt b/forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt new file mode 100644 index 00000000000..6794213d93f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt @@ -0,0 +1,7 @@ +Name:Setessan Skirmisher +ManaCost:1 G +Types:Creature Human Warrior +PT:2/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, CARDNAME gets +1/+1 until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +1 | NumDef$ +1 +Oracle:Constellation - Whenever an enchantment enters the battlefield under your control, CARDNAME gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/setessan_training.txt b/forge-gui/res/cardsfolder/upcoming/setessan_training.txt new file mode 100644 index 00000000000..624e1bd236b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/setessan_training.txt @@ -0,0 +1,9 @@ +Name:Setessan Training +ManaCost:1 G +Types:Enchantment Aura +K:Enchant creature you control +A:SP$ Attach | Cost$ 1 G | ValidTgts$ Creature.YouCtrl | AILogic$ Pump +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddKeyword$ Trample | Description$ Enchanted creature gets +1/+0 and has trample. +Oracle:Enchant creature you control\nWhen Setessan Training enters the battlefield, draw a card.\nEnchanted creature gets +1/+0 and has trample. diff --git a/forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt b/forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt new file mode 100644 index 00000000000..8b8287aeb2c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt @@ -0,0 +1,8 @@ +Name:Skola Grovedancer +ManaCost:1 G +Types:Enchantment Creature Satyr Druid +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Land.nonToken+YouOwn | TriggerZones$ Battlefield | Execute$ DBGainLife | TriggerDescription$ Whenever a land card is put into your graveyard from anywhere, you gain 1 life. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +A:AB$ Mill | Cost$ 2 G | Defined$ You | NumCards$ 1 | SpellDescription$ Put the top card of your library into your graveyard. +Oracle:Whenever a land card is put into your graveyard from anywhere, you gain 1 life.\n{2}{G}: Put the top card of your library into your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt b/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt new file mode 100644 index 00000000000..78d6eede617 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt @@ -0,0 +1,8 @@ +Name:Sphinx Mindbreaker +ManaCost:5 U U +Types:Creature Sphinx +PT:6/6 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBMill | TriggerDescription$ When CARDNAME enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. +SVar:DBMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 10 +Oracle:When Sphinx Mindrender enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/staggering_insight.txt b/forge-gui/res/cardsfolder/upcoming/staggering_insight.txt new file mode 100644 index 00000000000..c0913131379 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/staggering_insight.txt @@ -0,0 +1,9 @@ +Name:Staggering Insight +ManaCost:W U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ W U | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Lifelink | AddTrigger$ TriggerDamageDone | Description$ Enchanted creature gets +1/+1 and has lifelink and "Whenever this creature deals combat damage to a player, draw a card." +SVar:TriggerDamageDone:Mode$ DamageDone | ValidSource$ Card.Self | CombatDamage$ True | ValidTarget$ Player | Execute$ DBDraw | TriggerDescription$ Whenever this creature deals combat damage to a player, draw a card. +SVar:DBDraw:DB$ Draw | DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:Enchant creature\nEnchanted creature gets +1/+1 and has lifelink and "Whenever this creature deals combat damage to a player, draw a card." diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index 398f80c79c1..bbcee6d95ee 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -86,7 +86,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand [tokens] -r_2_2_satyr_noblock +r_1_1_satyr_noblock u_3_2_reflection ub_2_3_nightmare_mill w_1_1_human_soldier \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/r_2_2_satyr_noblock.txt b/forge-gui/res/tokenscripts/r_1_1_satyr_noblock.txt similarity index 94% rename from forge-gui/res/tokenscripts/r_2_2_satyr_noblock.txt rename to forge-gui/res/tokenscripts/r_1_1_satyr_noblock.txt index 26b583a1347..686eb9da76f 100644 --- a/forge-gui/res/tokenscripts/r_2_2_satyr_noblock.txt +++ b/forge-gui/res/tokenscripts/r_1_1_satyr_noblock.txt @@ -2,6 +2,6 @@ Name:Satyr ManaCost:no cost Types:Creature Satyr Colors:red -PT:2/2 +PT:1/1 K:CARDNAME can't block. Oracle:This creature can't block. From 86f472d29f530d59fb5e9069a5005a80e2699961 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 19 Dec 2019 23:49:30 -0700 Subject: [PATCH 40/54] Chainweb aracnir - escaping with counters --- .../res/cardsfolder/upcoming/chainweb_aracnir.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt diff --git a/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt b/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt new file mode 100644 index 00000000000..061551ec708 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt @@ -0,0 +1,11 @@ +Name:Chainweb Aracnir +ManaCost:G +Types:Creature Spider +PT:1/2 +K:Reach +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals damage equal to its power to target creature with flying an opponent controls. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl+withFlying | TgtPrompt$ Select target creature with flying an opponent controls | NumDmg$ X | References$ X +SVar:X:Count$CardPower +K:Escape:3 G G ExileFromGrave<4/Card.Other> +K:etbCounter:P1P1:3:Escape$ True:CARDNAME escapes with three +1/+1 counters on it. +Oracle:Reach\nWhen Chainweb Aracnir enters the battlefield, it deals damage equal to its power to target creature with flying an opponent controls.\nEscape — {2}{G}{G}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nChainweb Aracnir escapes with three +1/+1 counters on it. From 470fe4b8773c4bf8af4698812eb26c4549fdb9bd Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 20 Dec 2019 00:18:12 -0700 Subject: [PATCH 41/54] Chainweb aracnir - escaping with counters --- forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt b/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt index 061551ec708..11db7fd6bf0 100644 --- a/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt +++ b/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt @@ -7,5 +7,5 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl+withFlying | TgtPrompt$ Select target creature with flying an opponent controls | NumDmg$ X | References$ X SVar:X:Count$CardPower K:Escape:3 G G ExileFromGrave<4/Card.Other> -K:etbCounter:P1P1:3:Escape$ True:CARDNAME escapes with three +1/+1 counters on it. +K:etbCounter:P1P1:3:ValidCard$ Card.Self+escaped:CARDNAME escapes with three +1/+1 counters on it. Oracle:Reach\nWhen Chainweb Aracnir enters the battlefield, it deals damage equal to its power to target creature with flying an opponent controls.\nEscape — {2}{G}{G}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nChainweb Aracnir escapes with three +1/+1 counters on it. From 70bc280cf1f0a226ba2dfd29facd778d09d11170 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 20 Dec 2019 22:54:59 -0700 Subject: [PATCH 42/54] 4 more THB cards 12/20 --- .../res/cardsfolder/upcoming/elspeth_suns_nemesis.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt | 6 ++++++ .../res/cardsfolder/upcoming/terror_of_mount_velus.txt | 9 +++++++++ .../res/cardsfolder/upcoming/thaumaturges_familiar.txt | 8 ++++++++ 4 files changed, 32 insertions(+) create mode 100755 forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt b/forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt new file mode 100755 index 00000000000..6a0a65454c8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt @@ -0,0 +1,9 @@ +Name:Elspeth, Sun's Nemesis +ManaCost:2 W W +Types:Legendary Planeswalker Elspeth +Loyalty:5 +A:AB$ Pump | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +2 | NumDef$ +1 | SpellDescription$ Up to two target creatures you control each get +2/+1 until end of turn. +A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 2 | TokenScript$ w_1_1_human_soldier | TokenOwner$ You | LegacyImage$ w 1 1 human soldier the | SpellDescription$ Create two 1/1 white Human Soldier creature tokens. +A:AB$ GainLife | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | Ultimate$ True | LifeAmount$ 5 | SpellDescription$ You gain 5 life. +K:Escape:4 W W ExileFromGrave<4/Card.Other> +Oracle:−1: Up to two target creatures you control each get +2/+1 until end of turn.\n−2: Create two 1/1 white Human Soldier creature tokens.\n−3: You gain 5 life.\nEscape—{4}{W}{W}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt b/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt new file mode 100644 index 00000000000..e6dceaa0c0a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt @@ -0,0 +1,6 @@ +Name:Fruit of Tizerius +ManaCost:B +Types:Sorcery +A:SP$ LoseLife | Cost$ B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 2 | SpellDescription$ Target player loses 2 life. +K:Escape:3 B ExileFromGrave<3/Card.Other> +Oracle:Target player loses 2 life.\nEscape — {3}{B}, Exile three other cards from your graveyard. (You may cast this card from your graveyard for its escape cost). diff --git a/forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt b/forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt new file mode 100644 index 00000000000..fb831bfd924 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt @@ -0,0 +1,9 @@ +Name:Terror of Mount Velus +ManaCost:5 R R +Types:Creature Dragon +PT:5/5 +K:Flying +K:Double Strike +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, creatures you control gain double strike until end of turn. +SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Double Strike +Oracle:Flying, double strike\nWhen Terror of Mount Velus enters the battlefield, creatures you control gain double strike until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt b/forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt new file mode 100644 index 00000000000..8cca46af5c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt @@ -0,0 +1,8 @@ +Name:Thaumaturge's Familiar +ManaCost:3 +Types:Artifact Creature Bird +PT:1/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 1. +SVar:TrigScry:DB$ Scry | ScryNum$ 1 +Oracle:Flying\nWhen Thaumaturge's Familiar enters the battlefield, scry 1. \ No newline at end of file From 6fcd744132d1f50c9e1efaf9a9ccff6c5f022592 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 21 Dec 2019 07:33:37 -0700 Subject: [PATCH 43/54] The Akroan War --- forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt diff --git a/forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt b/forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt new file mode 100644 index 00000000000..4e86bb85bac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt @@ -0,0 +1,9 @@ +Name:The Akroan War +ManaCost:3 R +Types:Enchantment Saga +K:Saga:3:DBGainControl,DBAllAttack,DBDamageTapped +SVar:DBGainControl:DB$ GainControl | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ LeavesPlay | SpellDescription$ Gain control of target creature for as long as CARDNAME remains on the battlefield. +SVar:DBAllAttack:DB$ PumpAll | ValidCards$ Creature.OppCtrl | UntilYourNextTurn$ True | KW$ HIDDEN CARDNAME attacks each combat if able. | SpellDescription$ Until your next turn, creatures your opponents control attack each turn if able. +SVar:DBDamageTapped:DB$ EachDamage | ValidCards$ Creature.tapped | NumDmg$ X | References$ X | DamageDesc$ damage equal to its power | DefinedCards$ Self | SpellDescription$ Each tapped creature deals damage to itself equal to its power. +SVar:X:Count$CardPower +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Gain control of target creature for as long as The Akroan War remains on the battlefield.\nII — Until your next turn, creatures your opponents control attack each combat if able.\nIII — Each tapped creature deals damage to itself equal to its power. From 9a495e516aaa853139dde91889a3f080899e5fee Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 22 Dec 2019 17:14:15 -0500 Subject: [PATCH 44/54] Few more THB --- .../res/cardsfolder/upcoming/sphinx_mindbreaker.txt | 2 +- forge-gui/res/cardsfolder/upcoming/threnody_singer.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/thundering_chariot.txt | 9 +++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/threnody_singer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt b/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt index 78d6eede617..f38b4928da5 100644 --- a/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt +++ b/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt @@ -5,4 +5,4 @@ PT:6/6 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBMill | TriggerDescription$ When CARDNAME enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. SVar:DBMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 10 -Oracle:When Sphinx Mindrender enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. \ No newline at end of file +Oracle:When Sphinx Mindbreaker enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/threnody_singer.txt b/forge-gui/res/cardsfolder/upcoming/threnody_singer.txt new file mode 100644 index 00000000000..baca2e89c7a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/threnody_singer.txt @@ -0,0 +1,10 @@ +Name:Threnody Singer +ManaCost:1 U +Types:Creature Siren +PT:1/3 +K:Flash +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature an opponent controls gets -X/-0 until end of turn, where X is your devotion to blue. (Each {U} in the mana costs of permanents you control counts toward your devotion to blue.) +SVar:DBPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | IsCurse$ True | NumAtt$ -X | References$ X | +SVar:X:Count$Devotion.Blue +Oracle:Flash\nFlying\nWhen Threnody Singer enters the battlefield, target creature an opponent controls gets -X/-0 until end of turn, where X is your devotion to blue. (Each {U} in the mana costs of permanents you control counts toward your devotion to blue.) diff --git a/forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt b/forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt new file mode 100644 index 00000000000..0986a4e5870 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt @@ -0,0 +1,9 @@ +Name:Thundering Chariot +ManaCost:4 +Types:Artifact Vehicle +PT:3/3 +K:First Strike +K:Trample +K:Haste +K:Crew:1 +Oracle:First strike, trample, haste\nCrew 1 From dc34c4e985b1c5e59c28bbfbb6f23505b8b1bddc Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 23 Dec 2019 11:53:37 -0500 Subject: [PATCH 45/54] Last THB leaks/spoilers --- forge-gui/res/cardsfolder/u/underworld_dreams.txt | 5 ++--- .../res/cardsfolder/upcoming/treacherous_blessing.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/treeshaker_chimera.txt | 8 ++++++++ .../res/cardsfolder/upcoming/triton_waverider.txt | 7 +++++++ .../res/cardsfolder/upcoming/underworld_rage_hound.txt | 8 ++++++++ .../res/cardsfolder/upcoming/underworld_sentinel.txt | 9 +++++++++ .../res/cardsfolder/upcoming/venomous_hierophant.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt | 7 +++++++ .../res/cardsfolder/upcoming/voracious_typhon.txt | 7 +++++++ .../res/cardsfolder/upcoming/warbriar_blessing.txt | 9 +++++++++ .../res/cardsfolder/upcoming/warden_of_the_chained.txt | 8 ++++++++ .../res/cardsfolder/upcoming/wolfwillow_haven.txt | 9 +++++++++ 12 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/triton_waverider.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt diff --git a/forge-gui/res/cardsfolder/u/underworld_dreams.txt b/forge-gui/res/cardsfolder/u/underworld_dreams.txt index b4115b7fc64..9bdbfbe375d 100644 --- a/forge-gui/res/cardsfolder/u/underworld_dreams.txt +++ b/forge-gui/res/cardsfolder/u/underworld_dreams.txt @@ -1,7 +1,6 @@ Name:Underworld Dreams ManaCost:B B B Types:Enchantment -T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever an opponent draws a card, CARDNAME deals 1 damage to them. +T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever an opponent draws a card, CARDNAME deals 1 damage to that player. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredPlayer | NumDmg$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/underworld_dreams.jpg -Oracle:Whenever an opponent draws a card, Underworld Dreams deals 1 damage to them. +Oracle:Whenever an opponent draws a card, Underworld Dreams deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt b/forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt new file mode 100644 index 00000000000..a7fb21241d6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt @@ -0,0 +1,10 @@ +Name:Treacherous Blessing +ManaCost:2 B +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw three cards. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 3 +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever you cast a spell, you lose 1 life. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 1 +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When CARDNAME becomes the target of a spell or ability, sacrifice it. +SVar:TrigSac:DB$ Sacrifice | ValidCard$ Card.Self +Oracle:When Treacherous Blessing enters the battlefield, draw three cards.\nWhenever you cast a spell, you lose 1 life.\nWhen Treacherous Blessing becomes the target of a spell, sacrifice it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt b/forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt new file mode 100644 index 00000000000..f08a3fcde81 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt @@ -0,0 +1,8 @@ +Name:Treeshaker Chimera +ManaCost:5 G G +Types:Creature Chimera +PT:8/5 +K:All creatures able to block CARDNAME do so. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, draw three cards. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 3 +Oracle:All creatures able to block Treeshaker Chimera do so.\nWhen Treeshaker Chimera dies, draw three cards. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/triton_waverider.txt b/forge-gui/res/cardsfolder/upcoming/triton_waverider.txt new file mode 100644 index 00000000000..0a1b88e2216 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/triton_waverider.txt @@ -0,0 +1,7 @@ +Name:Triton Waverider +ManaCost:3 U +Types:Creature Merfolk Wizard +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, CARDNAME gets flying until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Flying +Oracle:Constellation - Whenever an enchantment enters the battlefield under your control, Triton Waverider gets flying until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt b/forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt new file mode 100644 index 00000000000..0a6acaae5a8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt @@ -0,0 +1,8 @@ +Name:Underworld Rage-Hound +ManaCost:1 R +Types:Creature Elemental Hound +PT:3/1 +K:CARDNAME attacks each combat if able. +K:Escape:3 R ExileFromGrave<3/Card.Other> +K:etbCounter:P1P1:1:ValidCard$ Card.Self+escaped:CARDNAME escapes with a +1/+1 counter on it. +Oracle:Underworld Rage-Hound attacks each combat if able.\nEscape — {3}{R}, Exile three other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nUnderworld Rage-Hound escapes with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt b/forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt new file mode 100755 index 00000000000..032b187caba --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt @@ -0,0 +1,9 @@ +Name:Underworld Sentinel +ManaCost:3 B B +Types:Creature Skeleton Soldier +PT:4/5 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, exile target creature card from your graveyard. +SVar:TrigExile:DB$ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | RememberChanged$ True +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, put all cards exiled with it onto the battlefield. +SVar:TrigReturn:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered+ExiledWithSource | Origin$ Exile | Destination$ Battlefield +Oracle:Whenever Underworld Sentinel attacks, exile target creature card from your graveyard.\nWhen Underworld Sentinel dies, put all cards exiled with it onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt b/forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt new file mode 100644 index 00000000000..1db65612c67 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt @@ -0,0 +1,8 @@ +Name:Venomous Hierophant +ManaCost:3 B +Types:Creature Gorgon Cleric +PT:3/3 +K:Deathtouch +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME enters the battlefield, put the top three cards of your library into your graveyard. +SVar:TrigMill:DB$Mill | NumCards$ 3 | Defined$ You +Oracle:Deathtouch\nWhen Venomous Hierophant enters the battlefield, put the top three cards of your library into your graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt b/forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt new file mode 100755 index 00000000000..f5e7564b017 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt @@ -0,0 +1,7 @@ +Name:Victory's Envoy +ManaCost:3 W W +Types:Creature Human Cleric +PT:3/3 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on each other creature you control. +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.Other+YouCtrl | CounterType$ P1P1 | CounterNum$ 1 +Oracle:At the beginning of your upkeep, put a +1/1 counter on each other creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt b/forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt new file mode 100644 index 00000000000..252dea34905 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt @@ -0,0 +1,7 @@ +Name:Voracious Typhon +ManaCost:2 G G +Types:Creature Snake Beast +PT:4/4 +K:Escape:5 G G ExileFromGrave<4/Card.Other> +K:etbCounter:P1P1:3:ValidCard$ Card.Self+escaped:CARDNAME escapes with three +1/+1 counters on it. +Oracle:Escape — {5}{G}{G}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nVoracious Typhon escapes with three +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt b/forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt new file mode 100644 index 00000000000..bca5082e950 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt @@ -0,0 +1,9 @@ +Name:Warbriar Blessing +ManaCost:1 G +Types:Enchantment Aura +K:Enchant creature you control +A:SP$ Attach | Cost$ 1 G | ValidTgts$ Creature.YouCtrl | AILogic$ Pump +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFight | TriggerDescription$ When CARDNAME enters the battlefield, enchanted creature fights up to one target creature you don't control. +SVar:TrigFight:DB$ Fight | Defined$ Enchanted | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose up to one target creature you don't control | TargetMin$ 0 | TargetMax$ 1 +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddToughness$ 2 | Description$ Enchanted creature gets +0/+2. +Oracle:Enchant creature you control\nWhen Warbriar Blessing enters the battlefield, enchanted creature fights up to one target creature you don't control\nEnchanted creature gets +0/+2. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt b/forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt new file mode 100644 index 00000000000..e23b79d2e6a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt @@ -0,0 +1,8 @@ +Name:Warden of the Chained +ManaCost:1 R G +Types:Creature Minotaur Warrior +PT:4/4 +K:Trample +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack. | CheckSVar$ X | SVarCompare$ EQ0 | Description$ CARDNAME can't attack unless you control another creature with power 4 or greater. +SVar:X:Count$Valid Creature.powerGE4+YouCtrl+Other +Oracle:Trample\nWarden of the Chained can't attack unless you control another creature with power 4 or greater. diff --git a/forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt b/forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt new file mode 100644 index 00000000000..a8e726206ad --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt @@ -0,0 +1,9 @@ +Name:Wolfwillow Haven +ManaCost:1 G +Types:Enchantment Aura +K:Enchant land +A:SP$ Attach | Cost$ 1 G | ValidTgts$ Land | AILogic$ Pump +T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted land is tapped for mana, its controller adds an additional {G}. +SVar:TrigMana:DB$ Mana | Produced$ G | Amount$ 1 | Defined$ TriggeredCardController +A:AB$ Token | Cost$ 4 G Sac<1/CARDNAME> | TokenAmount$ 1 | TokenScript$ g_2_2_wolf | TokenOwner$ You | LegacyImage$ g 2 2 wolf thb | PlayerTurn$ True | SpellDescription$ Create a 2/2 green Wolf creature token. Activate this ability only during your turn. +Oracle:Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional {G}.\n{4}{G},Sacrifice Wolfwillow Haven: Create a 2/2 green Wolf creature token. Activate this ability only during your turn. From ef71a7befc1ecedd5004532bd9ca8ab121ee71b3 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 23 Dec 2019 13:12:59 -0500 Subject: [PATCH 46/54] Contributor :) --- forge-gui/release-files/CONTRIBUTORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/release-files/CONTRIBUTORS.txt b/forge-gui/release-files/CONTRIBUTORS.txt index e8072d2e3d0..ffae9fb7a4b 100644 --- a/forge-gui/release-files/CONTRIBUTORS.txt +++ b/forge-gui/release-files/CONTRIBUTORS.txt @@ -19,6 +19,7 @@ mcrawford620 Meerkov Myrd nefigah +Northmoc OgreBattlecruiser pfps Ryan1729 From 9bf2d57715b030ba6cc52bda8f4b2af1dd319bb9 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 24 Dec 2019 09:24:30 -0500 Subject: [PATCH 47/54] Fix for issue #1219 --- forge-gui/res/cardsfolder/g/goblin_goon.txt | 6 +++--- forge-gui/res/cardsfolder/m/mogg_toady.txt | 6 +++--- forge-gui/res/cardsfolder/m/monstrous_hound.txt | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/goblin_goon.txt b/forge-gui/res/cardsfolder/g/goblin_goon.txt index 9e033694361..2f4ed831921 100644 --- a/forge-gui/res/cardsfolder/g/goblin_goon.txt +++ b/forge-gui/res/cardsfolder/g/goblin_goon.txt @@ -2,9 +2,9 @@ Name:Goblin Goon ManaCost:3 R Types:Creature Goblin Mutant PT:6/6 -S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ CARDNAME can't attack. & CARDNAME can't block. | CheckSVar$ X | SVarCompare$ LEY | Description$ CARDNAME can't attack unless you control more creatures than defending player. CARDNAME can't block unless you control more creatures than attacking player. +S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefender$ hasFewerCreaturesInPlayThanYou | Description$ CARDNAME can't attack unless you control more creatures than defending player. +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | CheckSVar$ Y | SVarCompare$ GEX | Description$ CARDNAME can't block unless you control more creatures than attacking player. SVar:X:Count$Valid Creature.YouCtrl -SVar:Y:Count$Valid Creature.YouDontCtrl +SVar:Y:Count$Valid Creature.ActivePlayerCtrl SVar:BuffedBy:Creature -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_goon.jpg Oracle:Goblin Goon can't attack unless you control more creatures than defending player.\nGoblin Goon can't block unless you control more creatures than attacking player. diff --git a/forge-gui/res/cardsfolder/m/mogg_toady.txt b/forge-gui/res/cardsfolder/m/mogg_toady.txt index dae4a3a2d08..708375ed69d 100644 --- a/forge-gui/res/cardsfolder/m/mogg_toady.txt +++ b/forge-gui/res/cardsfolder/m/mogg_toady.txt @@ -2,9 +2,9 @@ Name:Mogg Toady ManaCost:1 R Types:Creature Goblin PT:2/2 -S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ CARDNAME can't attack. & CARDNAME can't block. | CheckSVar$ X | SVarCompare$ LEY | References$ X,Y | Description$ CARDNAME can't attack unless you control more creatures than defending player.CARDNAME can't block unless you control more creatures than attacking player. +S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefender$ hasFewerCreaturesInPlayThanYou | Description$ CARDNAME can't attack unless you control more creatures than defending player. +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | CheckSVar$ Y | SVarCompare$ GEX | Description$ CARDNAME can't block unless you control more creatures than attacking player. SVar:X:Count$Valid Creature.YouCtrl -SVar:Y:Count$Valid Creature.YouDontCtrl +SVar:Y:Count$Valid Creature.ActivePlayerCtrl SVar:BuffedBy:Creature -SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_toady.jpg Oracle:Mogg Toady can't attack unless you control more creatures than defending player.\nMogg Toady can't block unless you control more creatures than attacking player. diff --git a/forge-gui/res/cardsfolder/m/monstrous_hound.txt b/forge-gui/res/cardsfolder/m/monstrous_hound.txt index 3f1660cd13e..1d1d9a05e88 100644 --- a/forge-gui/res/cardsfolder/m/monstrous_hound.txt +++ b/forge-gui/res/cardsfolder/m/monstrous_hound.txt @@ -2,8 +2,8 @@ Name:Monstrous Hound ManaCost:3 R Types:Creature Hound PT:4/4 -S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ CARDNAME can't attack. & CARDNAME can't block. | CheckSVar$ X | SVarCompare$ LEY | References$ X,Y | Description$ CARDNAME can't attack unless you control more lands than defending player. CARDNAME can't block unless you control more lands than attacking player. +S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefender$ hasFewerLandsInPlayThanYou | Description$ CARDNAME can’t attack unless you control more lands than defending player. +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | CheckSVar$ Y | SVarCompare$ GEX | Description$ CARDNAME can't block unless you control more lands than attacking player. SVar:X:Count$Valid Land.YouCtrl -SVar:Y:Count$Valid Land.YouDontCtrl -SVar:Picture:http://www.wizards.com/global/images/magic/general/monstrous_hound.jpg +SVar:Y:Count$Valid Land.ActivePlayerCtrl Oracle:Monstrous Hound can't attack unless you control more lands than defending player.\nMonstrous Hound can't block unless you control more lands than attacking player. From 762dc60600d1f7b2cc368475bc7f6938f8c2234e Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 26 Dec 2019 10:07:18 -0500 Subject: [PATCH 48/54] TBD - card typo fix and card list update --- ...t_of_tizerius.txt => fruit_of_tizerus.txt} | 2 +- .../res/editions/Theros Beyond Death.txt | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) rename forge-gui/res/cardsfolder/upcoming/{fruit_of_tizerius.txt => fruit_of_tizerus.txt} (94%) diff --git a/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt b/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerus.txt similarity index 94% rename from forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt rename to forge-gui/res/cardsfolder/upcoming/fruit_of_tizerus.txt index e6dceaa0c0a..c8a9a620b7e 100644 --- a/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerius.txt +++ b/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerus.txt @@ -1,4 +1,4 @@ -Name:Fruit of Tizerius +Name:Fruit of Tizerus ManaCost:B Types:Sorcery A:SP$ LoseLife | Cost$ B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 2 | SpellDescription$ Target player loses 2 life. diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index bbcee6d95ee..b49089b8dbb 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -11,6 +11,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 4 U Banishing Light 7 U Commanding Presence 9 U Daxos, Blessed by the Sun +14 M Elspeth, Sun's Nemesis 23 C Hero of the Winds 25 C Indomitable Will 26 C Karametra's Blessing @@ -28,12 +29,20 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 56 C Naiad of Hidden Coves 57 C Nyxborn Seaguard 58 C Omen of the Sea +75 U Threnody Singer +76 C Triton Waverider +96 C Fruit of Tizerus +99 U Gray Merchant of Asphodel 102 U Inevitable End 104 U Minion's Return 106 C Mire's Grasp 109 C Nyxborn Marauder 110 C Omen of the Dead 113 C Rage-Scarred Berserker +117 R Treacherous Blessing +121 U Underworld Dreams +122 C Venomous Hierophant +124 R The Akroan War 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel @@ -43,15 +52,31 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 143 C Irreverent Revelers 144 C Nyxborn Brute 149 C Portent of Betrayal +152 C Satyr's Cunning +159 C Thrill of Possibility +163 C Underworld Rage-Hound +164 C Wrap in Flames 164 C Aspect of Lamprey +167 C Chainweb Aracnir 174 C Ilysian Caryatid 176 U Klothys's Design 187 C Nylea's Huntmaster 191 C Nyxborn Colossus 192 C Omen of the Hunt 198 R Setessan Champion +200 C Setessan Skirmisher +201 C Setessan Training +202 C Skola Grovedancer +203 C Voracious Typhon +204 C Warbriar Blessing +205 U Wolfwillow Haven 208 M Ashiok, Nightmare Muse 219 U Hero of the Nyxborn +220 M Klothys, God of Destiny +228 U Staggering Insight +230 U Warden of the Chained +238 C Thaumaturge's Familiar +239 U Thundering Chariot 243 R Labyrinth of Skophos 250 L Plains 251 L Island @@ -86,6 +111,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand [tokens] +g_2_2_wolf r_1_1_satyr_noblock u_3_2_reflection ub_2_3_nightmare_mill From 80c6e306915c7f64f02ee19bef0fddb61ecfc600 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 27 Dec 2019 08:59:54 -0500 Subject: [PATCH 49/54] The Binding of the Titans --- .../upcoming/the_binding_of_the_titans.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/the_binding_of_the_titans.txt diff --git a/forge-gui/res/cardsfolder/upcoming/the_binding_of_the_titans.txt b/forge-gui/res/cardsfolder/upcoming/the_binding_of_the_titans.txt new file mode 100644 index 00000000000..48cb8445a71 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_binding_of_the_titans.txt @@ -0,0 +1,11 @@ +Name:The Binding of the Titans +ManaCost:1 G +Types:Enchantment Saga +K:Saga:3:DBAllMill,DBExileGain,DBReturn +SVar:DBAllMill:DB$ Mill | Defined$ Player | NumCards$ 3 | SpellDescription$ Each player puts the top three cards of their library into their graveyard. +SVar:DBExileGain:DB$ ChangeZone | ValidTgts$ Card | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target cards in graveyards. | RememberChanged$ True | SubAbility$ DBGainLife | SpellDescription$ Exile up to two target cards from graveyards. For each creature card exiled this way, you gain 1 life. +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature or land card in your graveyard. | ValidTgts$ Creature.YouCtrl,Land.YouCtrl | SpellDescription$ Return target creature or land card from your graveyard to your hand. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$Valid Creature +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI - Each player puts the top three cards of their library into their graveyard.\nII - Exile up to two target cards from graveyards. For each creature card exiled this way, you gain 1 life.\nIII - Return target creature or land card from your graveyard to your hand. \ No newline at end of file From 4b01074d0f00d5fbf16c2dcdb8adc4f741a472ad Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 27 Dec 2019 09:02:38 -0500 Subject: [PATCH 50/54] Edition update --- forge-gui/res/editions/Theros Beyond Death.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index b49089b8dbb..1554a637d2d 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -57,6 +57,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 163 C Underworld Rage-Hound 164 C Wrap in Flames 164 C Aspect of Lamprey +166 U The Binding of the Titans 167 C Chainweb Aracnir 174 C Ilysian Caryatid 176 U Klothys's Design From e8c5a58d854e3157c9f4a1f4bec9c6a94ed75e4d Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 29 Dec 2019 08:06:17 -0500 Subject: [PATCH 51/54] Allure of the Unknown --- .../res/cardsfolder/upcoming/allure_of_the_unknown.txt | 8 ++++++++ forge-gui/res/editions/Theros Beyond Death.txt | 1 + 2 files changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/allure_of_the_unknown.txt diff --git a/forge-gui/res/cardsfolder/upcoming/allure_of_the_unknown.txt b/forge-gui/res/cardsfolder/upcoming/allure_of_the_unknown.txt new file mode 100644 index 00000000000..60aa94cafbc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/allure_of_the_unknown.txt @@ -0,0 +1,8 @@ +Name:Allure of the Unknown +ManaCost:3 B R +Types:Sorcery +A:SP$ ChoosePlayer | Cost$ 3 B R | Defined$ You | Choices$ Player.Opponent | SubAbility$ DBDig | ChoiceTitle$ Choose an opponent | SpellDescription$ Reveal the top six cards of your library. An opponent exiles a nonland card from among them, then you put the rest into your hand. That opponent may cast the exiled card without paying its mana cost. | StackDescription$ SpellDescription +SVar:DBDig:DB$ Dig | DigNum$ 6 | Reveal$ True | Choser$ Player.Chosen | ChangeNum$ 1 | ChangeValid$ Card.nonLand | AILogic$ BestCard | DestinationZone$ Exile | DestinationZone2$ Hand | RememberChanged$ True | SubAbility$ DBPlay +SVar:DBPlay:DB$ Play | WithoutManaCost$ True | Controller$ Player.Chosen | Optional$ True | OptionalDecider$ Player.Chosen | ValidZone$ Exile | Valid$ Card.IsRemembered | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenPlayer$ True +Oracle:Reveal the top six cards of your library. An opponent exiles a nonland card from among them, then you put the rest into your hand. That opponent may cast the exiled card without paying its mana cost. \ No newline at end of file diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index 1554a637d2d..0e75ca391b3 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -71,6 +71,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 203 C Voracious Typhon 204 C Warbriar Blessing 205 U Wolfwillow Haven +207 R Allure of the Unknown 208 M Ashiok, Nightmare Muse 219 U Hero of the Nyxborn 220 M Klothys, God of Destiny From c4712e705cc8050c3a32fe256aeb5af83686df84 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 29 Dec 2019 08:31:30 -0500 Subject: [PATCH 52/54] Gallia the satyr bear :) --- .../upcoming/gallia_of_the_endless_dance.txt | 11 +++++++++++ forge-gui/res/editions/Theros Beyond Death.txt | 1 + 2 files changed, 12 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt b/forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt new file mode 100644 index 00000000000..9558777de3b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt @@ -0,0 +1,11 @@ +Name:Gallia of the Endless Dance +ManaCost:R G +Types:Legendary Creature Satyr +PT:2/2 +K:Haste +S:Mode$ Continuous | Affected$ Card.Satyr+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Haste | Description$ Other Satyrs you control get +1/+1 and have haste. +T:Mode$ AttackersDeclared | Execute$ TrigDiscard | CheckSVar$ AttackerCount | SVarCompare$ GE3 | NoResolvingCheck$ True | TriggerZones$ Battlefield | AttackingPlayer$ You | OptionalDecider$ You | TriggerDescription$ Whenever you attack with three or more creatures, you may discard a card at random. If you do, draw two cards. +SVar:AttackerCount:Count$Valid Creature.attacking +SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ Random | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 2 +Oracle:Haste\nOther Satyrs you control get +1/+1 and have haste.\nWhenever you attack with three or more creatures, you may discard a card at random. If you do, draw two cards. \ No newline at end of file diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index 0e75ca391b3..92afbb1fb41 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -73,6 +73,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 205 U Wolfwillow Haven 207 R Allure of the Unknown 208 M Ashiok, Nightmare Muse +217 R Gallia of the Endless Dance 219 U Hero of the Nyxborn 220 M Klothys, God of Destiny 228 U Staggering Insight From 5b185d2fe365f5e4e84b387b47a69973660f687d Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 29 Dec 2019 12:17:23 -0500 Subject: [PATCH 53/54] fixing Gallia --- .../res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt | 5 +++-- forge-gui/res/editions/Theros Beyond Death.txt | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt b/forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt index 9558777de3b..c96cca41d15 100644 --- a/forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt +++ b/forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt @@ -6,6 +6,7 @@ K:Haste S:Mode$ Continuous | Affected$ Card.Satyr+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Haste | Description$ Other Satyrs you control get +1/+1 and have haste. T:Mode$ AttackersDeclared | Execute$ TrigDiscard | CheckSVar$ AttackerCount | SVarCompare$ GE3 | NoResolvingCheck$ True | TriggerZones$ Battlefield | AttackingPlayer$ You | OptionalDecider$ You | TriggerDescription$ Whenever you attack with three or more creatures, you may discard a card at random. If you do, draw two cards. SVar:AttackerCount:Count$Valid Creature.attacking -SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ Random | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 2 +SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ Random | RememberDiscarded$ True | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Haste\nOther Satyrs you control get +1/+1 and have haste.\nWhenever you attack with three or more creatures, you may discard a card at random. If you do, draw two cards. \ No newline at end of file diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index 92afbb1fb41..f7aa2b5d314 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -40,6 +40,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 110 C Omen of the Dead 113 C Rage-Scarred Berserker 117 R Treacherous Blessing +118 R Tymaret Calls the Dead 121 U Underworld Dreams 122 C Venomous Hierophant 124 R The Akroan War From fb9c7290b2c2cb7a20f6758dbc86fc4e2e6ff20b Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 29 Dec 2019 14:05:13 -0500 Subject: [PATCH 54/54] Tymaret Calls the Dead --- .../cardsfolder/upcoming/tymaret_calls_the_dead.txt | 13 +++++++++++++ forge-gui/res/editions/Theros Beyond Death.txt | 1 + 2 files changed, 14 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/tymaret_calls_the_dead.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tymaret_calls_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/tymaret_calls_the_dead.txt new file mode 100644 index 00000000000..85fd6f00781 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tymaret_calls_the_dead.txt @@ -0,0 +1,13 @@ +Name:Tymaret Calls the Dead +ManaCost:2 B +Types:Enchantment Saga +K:Saga:3:DBMill,DBMill,DBGainLife +SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 3 | SubAbility$ DBChooseCard | SpellDescription$ Put the top three cards of your library into your graveyard. Then you may exile a creature or enchantment card from your graveyard. If you do, create a 2/2 black Zombie creature token. +SVar:DBChooseCard:DB$ ChooseCard | Choices$ Creature.YouCtrl,Enchantment.YouCtrl | Optional$ Yes | ChoiceTitle$ Choose a creature or enchantment to exile | ChoiceZone$ Graveyard | Amount$ 1 | AILogic$ WorstCard | SubAbility$ DBChangeZone +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ ChosenCard | RememberChanged$ True | SubAbility$ DBToken +SVar:DBToken:DB$ Token | LegacyImage$ b 2 2 zombie thb | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenAmount$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True | ClearRemembered$ True +SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X | SubAbility$ DBScry | SpellDescription$ You gain X life and scry X, where X is the number of Zombies you control. +SVar:DBScry:DB$ Scry | ScryNum$ X | References$ X +SVar:X:Count$Valid Zombie.YouCtrl +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI,II — Put the top three cards of your library into your graveyard. Then you may exile a creature or enchantment card from your graveyard. If you do, create a 2/2 black Zombie creature token.\nIII — You gain X life and scry X, where X is the number of Zombies you control. diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index f7aa2b5d314..deb406d3411 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -115,6 +115,7 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand [tokens] +b_2_2_zombie g_2_2_wolf r_1_1_satyr_noblock u_3_2_reflection