From 6dc8d7648afe4337f27a0953debd47c527d72a8c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 16 Dec 2019 18:41:36 -0500 Subject: [PATCH 01/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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 92e6c303adb578bde1051092e4cd52ceef21029c Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 27 Dec 2019 15:22:01 +0800 Subject: [PATCH 49/64] update translation text to use have placeholder string --- .../game/ability/effects/AbandonEffect.java | 2 +- .../game/ability/effects/AddTurnEffect.java | 2 +- .../ability/effects/AssignGroupEffect.java | 2 +- .../game/ability/effects/AttachEffect.java | 6 ++-- .../game/ability/effects/BidLifeEffect.java | 2 +- .../effects/ChangeCombatantsEffect.java | 2 +- .../ability/effects/ChangeTargetsEffect.java | 4 +-- .../ability/effects/ChangeZoneAllEffect.java | 14 ++------ .../ability/effects/ChangeZoneEffect.java | 34 ++++++++++++------- .../ability/effects/ChooseCardEffect.java | 6 ++-- .../ability/effects/ChooseCardNameEffect.java | 4 +-- .../ability/effects/ChooseColorEffect.java | 16 ++++----- .../ability/effects/ChooseNumberEffect.java | 4 +-- .../game/ability/effects/CloneEffect.java | 2 +- .../ability/effects/ControlGainEffect.java | 2 +- .../ability/effects/CopyPermanentEffect.java | 6 ++-- .../effects/CopySpellAbilityEffect.java | 4 +-- .../ability/effects/CountersMoveEffect.java | 34 +++++-------------- .../ability/effects/CountersPutEffect.java | 2 +- .../effects/CountersPutOrRemoveEffect.java | 2 +- .../ability/effects/CountersRemoveEffect.java | 9 ++--- .../ability/effects/DamageDealEffect.java | 2 +- .../forge/game/ability/effects/DigEffect.java | 17 ++++------ .../ability/effects/DigMultipleEffect.java | 3 +- .../game/ability/effects/DigUntilEffect.java | 2 +- .../game/ability/effects/DiscardEffect.java | 5 ++- .../game/ability/effects/DrawEffect.java | 2 +- .../game/ability/effects/EncodeEffect.java | 8 ++--- .../game/ability/effects/ManaEffect.java | 6 ++-- .../game/ability/effects/MillEffect.java | 2 +- .../ability/effects/MultiplePilesEffect.java | 2 +- .../game/ability/effects/PlayEffect.java | 3 +- .../game/ability/effects/PumpEffect.java | 2 +- .../ability/effects/RollPlanarDiceEffect.java | 2 +- .../ability/effects/RunSVarAbilityEffect.java | 6 ++-- .../game/ability/effects/SacrificeEffect.java | 28 +++++++-------- .../game/ability/effects/ScryEffect.java | 8 ++--- .../game/ability/effects/ShuffleEffect.java | 2 +- .../ability/effects/TapOrUntapEffect.java | 2 +- .../game/ability/effects/TokenEffect.java | 2 +- 40 files changed, 115 insertions(+), 148 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 b6bf52a8478..7e41ba9618e 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 @@ -24,7 +24,7 @@ public class AbandonEffect extends SpellAbilityEffect { Player controller = source.getController(); boolean isOptional = sa.hasParam("Optional"); - if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblWouldYoulikeAbandon") + " " + source + "?")) { + if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblWouldYoulikeAbandonConfirm", source.toString()))) { return; } 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 9edf0d3ecbd..2a1353e03be 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 @@ -62,7 +62,7 @@ public class AddTurnEffect extends SpellAbilityEffect { extra.setCantSetSchemesInMotion(true); } if (sa.hasParam("ShowMessage")) { - p.getGame().getAction().nofityOfValue(sa, p, p + " " + Localizer.getInstance().getMessage("lblTakesExtraTurn"), null); + p.getGame().getAction().nofityOfValue(sa, p, Localizer.getInstance().getMessage("lblPlayerTakesExtraTurn", p.toString()), null); } } } 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 03a455900a3..1f392ec35c4 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 @@ -50,7 +50,7 @@ public class AssignGroupEffect extends SpellAbilityEffect { Multimap result = ArrayListMultimap.create(); for (GameObject g : defined) { - final String title = Localizer.getInstance().getMessage("lblChooseAbilityFor") + " " + g.toString(); + final String title = Localizer.getInstance().getMessage("lblChooseAbilityForObject", 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 78b1b475dd8..4f805200be7 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 @@ -61,7 +61,7 @@ public class AttachEffect extends SpellAbilityEffect { // If Cast Targets will be checked on the Stack for (final Card attachment : attachments) { - String message = Localizer.getInstance().getMessage("lblDoYouWantAttach") + " " + attachment + " " + Localizer.getInstance().getMessage("lblTo") + " " + attachTo + "?"; + String message = Localizer.getInstance().getMessage("lblDoYouWantAttachSourceToTarget", attachment.toString(), attachTo.toString()); if ( sa.hasParam("Optional") && !p.getController().confirmAction(sa, null, message) ) continue; handleAttachment(attachment, attachTo, sa); @@ -174,7 +174,7 @@ public class AttachEffect extends SpellAbilityEffect { players.add(player); } } - final Player pa = p.getController().chooseSingleEntityForEffect(players, aura, source + " - " + Localizer.getInstance().getMessage("lblSelectAPlayerAttachTo")); + final Player pa = p.getController().chooseSingleEntityForEffect(players, aura, Localizer.getInstance().getMessage("lblSelectAPlayerAttachSourceTo", source.toString())); if (pa != null) { handleAura(source, pa); return true; @@ -187,7 +187,7 @@ public class AttachEffect extends SpellAbilityEffect { return false; } - final Card o = p.getController().chooseSingleEntityForEffect(list, aura, source + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo")); + final Card o = p.getController().chooseSingleEntityForEffect(list, aura, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", source.toString())); 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 1468724219c..22391ec5f5d 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 @@ -60,7 +60,7 @@ public class BidLifeEffect extends SpellAbilityEffect { if (result) { // a different choose number bid += p.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblBidLife") + ":", 1, 9); winner = p; - host.getGame().getAction().nofityOfValue(sa, p, Localizer.getInstance().getMessage("lblTopBidWith") + " " + bid + " " + Localizer.getInstance().getMessage("lbllife"), p); + host.getGame().getAction().nofityOfValue(sa, p, Localizer.getInstance().getMessage("lblTopBidWithValueLife", String.valueOf(bid)), p); } } } 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 5f82bd43f42..5c2c5c254f4 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 @@ -45,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, - Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c, false); + Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", c.toString()), 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 ee8c24184ff..d194043e9dc 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 @@ -51,8 +51,8 @@ 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, Localizer.getInstance().getMessage("lblDoYouWantChangeTargets") + " " + tgtSA.getHostCard() + "?")) { - continue; + if (isOptional && !chooser.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantChangeAbilityTargets", tgtSA.getHostCard().toString()))) { + continue; } if (changesOneTarget) { // 1. choose a target of target spell 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 c14492ddc09..cfe26c4814e 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 @@ -99,19 +99,9 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { final String targets = Lang.joinHomogenous(cards); final String message; if (sa.hasParam("OptionQuestion")) { - message = TextUtil.fastReplace(sa.getParam("OptionQuestion"), "TARGETS", targets); + message = TextUtil.fastReplace(sa.getParam("OptionQuestion"), "TARGETS", targets); } else { - final StringBuilder sb = new StringBuilder(); - - sb.append(Localizer.getInstance().getMessage("lblMove") + " "); - sb.append(targets); - sb.append(" " + Localizer.getInstance().getMessage("lblFrom") + " "); - sb.append(Lang.joinHomogenous(origin)); - sb.append(" " + Localizer.getInstance().getMessage("lblTo") + " "); - sb.append(destination); - sb.append("?"); - - message = sb.toString(); + message = Localizer.getInstance().getMessage("lblMoveTargetFromOriginToDestination", targets, Lang.joinHomogenous(origin), destination.toString()); } if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, message)) { 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 5bad714d73f..3e486f35043 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 @@ -440,7 +440,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { hostCard.addRemembered(CardUtil.getLKICopy(tgtC)); } - 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(),"?")); + final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantMoveTargetFromOriToDest", tgtC.toString(), origin.toString(), destination.toString())); if (optional && !player.getController().confirmAction(sa, null, prompt) ) continue; @@ -504,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 + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo")); + Card attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", tgtC.toString())); tgtC.attachToEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal permanent it fails continue; @@ -514,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 + " - " + Localizer.getInstance().getMessage("lblSelectAPlayerAttachTo")); + Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectAPlayerAttachSourceTo", tgtC.toString())); tgtC.attachToEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal player it fails @@ -561,7 +561,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } } } else { - defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblDeclareDefenderFor") + " " + movedCard ); + defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblDeclareDefenderForCard", movedCard.toString())); } if (defender != null) { combat.addAttacker(movedCard, defender); @@ -750,7 +750,14 @@ public class ChangeZoneEffect extends SpellAbilityEffect { final boolean optional = sa.hasParam("Optional"); if (optional) { - 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); + String prompt; + if (defined) { + prompt = Localizer.getInstance().getMessage("lblPutThatCardFromPlayerOriginToDestination", "{player's}", Lang.joinHomogenous(origin).toLowerCase(), destination.name().toLowerCase()); + } + else { + prompt = Localizer.getInstance().getMessage("lblSearchPlayerZoneConfirm", "{player's}", Lang.joinHomogenous(origin).toLowerCase()); + } + String message = MessageUtil.formatMessage(prompt , decider, player); if (!decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneGeneral, message)) { return; } @@ -822,7 +829,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { continue; } SpellAbility tgtSA = decider.getController().getAbilityToPlay(tgtCard, sas); - if (!decider.getController().confirmAction(tgtSA, null, Localizer.getInstance().getMessage("lblDoYouWantPlay") + " " + tgtCard + "?")) { + if (!decider.getController().confirmAction(tgtSA, null, Localizer.getInstance().getMessage("lblDoYouWantPlayCard", tgtCard.toString()))) { continue; } // if played, that card cannot be found @@ -854,7 +861,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(Localizer.getInstance().getMessage("lblSelectCardFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player); + String selectPrompt = sa.hasParam("SelectPrompt") ? sa.getParam("SelectPrompt") : MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardFromPlayerZone", "{player's}", Lang.joinHomogenous(origin).toLowerCase()), decider, player); final String totalcmc = sa.getParam("WithTotalCMC"); int totcmc = AbilityUtils.calculateAmount(source, totalcmc, sa); @@ -867,9 +874,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (! sa.hasParam("SelectPrompt")) { // new default messaging for multi select if (fetchList.size() > changeNum) { - selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectUpTo") + " " + changeNum + " " + Localizer.getInstance().getMessage("lblCardsFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player); + //Select up to %changeNum cards from %players %origin + selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectUpToNumCardFromPlayerZone", String.valueOf(changeNum), "{player's}", Lang.joinHomogenous(origin).toLowerCase()), decider, player); } else { - selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardsFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player); + selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardsFromPlayerZone", "{player's}", Lang.joinHomogenous(origin).toLowerCase()), decider, player); } } // ensure that selection is within maximum allowed changeNum @@ -931,7 +939,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (c == null) { final int num = Math.min(fetchList.size(), changeNum - i); - String message = Localizer.getInstance().getMessage("lblCancelSearchUpTo") + " " + num + " " + Localizer.getInstance().getMessage("lblMoreCard") + (num != 1 ? "s" : "") + " " + Localizer.getInstance().getMessage("lblCanBeSelected"); + String message = Localizer.getInstance().getMessage("lblCancelSearchUpToSelectNumCards", String.valueOf(num)); if (fetchList.isEmpty() || decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneGeneral, message)) { break; @@ -1002,7 +1010,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (!list.isEmpty()) { Card attachedTo = null; if (list.size() > 1) { - attachedTo = decider.getController().chooseSingleEntityForEffect(list, sa, c + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo")); + attachedTo = decider.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", c.toString())); } else { attachedTo = list.get(0); @@ -1020,7 +1028,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 + " - " + Localizer.getInstance().getMessage("lblSelectAPlayerAttachTo")); + Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", c.toString())); c.attachToEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal permanent it fails @@ -1043,7 +1051,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } } } else { - defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblDeclareDefenderFor") + " " + c ); + defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblDeclareDefenderForCard", c.toString())); } 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 020ba61fbbb..2c13373cecc 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 @@ -83,7 +83,7 @@ public class ChooseCardEffect extends SpellAbilityEffect { for (final String type : CardType.getBasicTypes()) { final CardCollectionView cl = CardLists.getType(land, type); if (!cl.isEmpty()) { - final String prompt = "Choose " + Lang.nounWithAmount(1, type); + final String prompt = Localizer.getInstance().getMessage("lblChoose") + " " + Lang.nounWithAmount(1, type); Card c = p.getController().chooseSingleEntityForEffect(cl, sa, prompt, false); if (c != null) { chosen.add(c); @@ -99,8 +99,8 @@ public class ChooseCardEffect extends SpellAbilityEffect { int chosenP = 0; while (!creature.isEmpty()) { Card c = p.getController().chooseSingleEntityForEffect(creature, sa, - Localizer.getInstance().getMessage("lblSelectCreatureWithTotalPowerLessOrEqualTo") + " " + (totP - chosenP - negativeNum) - + "\r\n(" + Localizer.getInstance().getMessage("lblSelected") + ":" + chosenPool + ")\r\n(" + Localizer.getInstance().getMessage("lblTotalPower") + ": " + chosenP + ")", chosenP <= totP); + Localizer.getInstance().getMessage("lblSelectCreatureWithTotalPowerLessOrEqualToNum", (totP - chosenP - negativeNum)) + + "\r\n(" + Localizer.getInstance().getMessage("lblSelected") + ":" + chosenPool + ")\r\n(" + Localizer.getInstance().getMessage("lblTotalPowerNum", chosenP) + ")", chosenP <= totP); if (c == null) { if (p.getController().confirmAction(sa, PlayerActionConfirmMode.OptionalChoose, Localizer.getInstance().getMessage("lblCancelChooseConfirm"))) { break; 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 dd72c9835ea..9e2f06a8958 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 @@ -104,7 +104,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { } else { // use CardFace because you might name a alternate name //"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") + "."; + final String message = validDesc.equals("card") ? Localizer.getInstance().getMessage("lblChooseACardName") : Localizer.getInstance().getMessage("lblChooseASpecificCard", validDesc); Predicate cpp = Predicates.alwaysTrue(); if (sa.hasParam("ValidCards")) { @@ -116,7 +116,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { host.setNamedCard(chosen); if(!randomChoice) { - p.getGame().getAction().nofityOfValue(sa, host, p.getName() + " " + Localizer.getInstance().getMessage("lblPicked") + " " + chosen, p); + p.getGame().getAction().nofityOfValue(sa, host, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), 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 8d91adfaaaa..365cc2f862a 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 @@ -50,27 +50,25 @@ public class ChooseColorEffect extends SpellAbilityEffect { List chosenColors; int cntMin = sa.hasParam("TwoColors") ? 2 : 1; int cntMax = sa.hasParam("TwoColors") ? 2 : sa.hasParam("OrColors") ? colorChoices.size() : 1; - String prompt; + String prompt = null; if (cntMax == 1) { prompt = Localizer.getInstance().getMessage("lblChooseAColor"); } else { - prompt = Localizer.getInstance().getMessage("lblChoose") + " " + Lang.getNumeral(cntMin); if (cntMax > cntMin) { - if (cntMax >= MagicColor.NUMBER_OR_COLORS) { - prompt += " " + Localizer.getInstance().getMessage("lblOrMore"); - } else { - prompt += " " + Localizer.getInstance().getMessage("lblTo") + " " + Lang.getNumeral(cntMax); - } + if (cntMax >= MagicColor.NUMBER_OR_COLORS) { + prompt = Localizer.getInstance().getMessage("lblAtLastChooseNumColors", Lang.getNumeral(cntMin)); + } else { + prompt = Localizer.getInstance().getMessage("lblChooseSpecifiedRangeColors", Lang.getNumeral(cntMin), Lang.getNumeral(cntMax)); + } } - 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() + " " + Localizer.getInstance().getMessage("lblPicked") + " " + Lang.joinHomogenous(chosenColors), p); + p.getGame().getAction().nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), Lang.joinHomogenous(chosenColors)), p); } } } 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 63e5ae38259..d54b3579625 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 @@ -73,7 +73,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect { card.setChosenNumber(chosen); } if (sa.hasParam("Notify")) { - p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " " + Localizer.getInstance().getMessage("lblPicked") + " " + chosen, p); + p.getGame().getAction().nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), chosen), p); } } } @@ -86,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(" " + Localizer.getInstance().getMessage("lblChose") + " ").append(num); + sb.append(Localizer.getInstance().getMessage("lblPlayerChoseNum", player.getName(), String.valueOf(num))); sb.append("\r\n"); if (num > highest) { highestNum.clear(); 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 a06f15dbec5..2edf442ac8f 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 @@ -94,7 +94,7 @@ public class CloneEffect extends SpellAbilityEffect { } final boolean optional = sa.hasParam("Optional"); - if (optional && !host.getController().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantCopy") + " " + cardToCopy + "?")) { + if (optional && !host.getController().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantCopyCard", cardToCopy))) { return; } 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 74ce08933ea..ba781a3f6a7 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 @@ -228,7 +228,7 @@ public class ControlGainEffect extends SpellAbilityEffect { final FCollectionView e = combat.getDefenders(); final GameEntity defender = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(e, sa, - Localizer.getInstance().getMessage("lblDeclareDefenderFor") + " " + tgtC); + Localizer.getInstance().getMessage("lblDeclareDefenderForCard", tgtC.toString())); 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 ef0cabec2e8..5cf859810d2 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 @@ -207,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, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c, false); + defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", c.toString()), 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, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c + " {" + Localizer.getInstance().getMessage("lblDefender") + ": " + defender + "}", false); + defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", c.toString()) + " {" + Localizer.getInstance().getMessage("lblDefender") + ": " + defender + "}", false); } } game.getCombat().addAttacker(copyInPlay, defender); @@ -244,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 + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo")); + Card attachedTo = activator.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", copyInPlay.toString())); 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 2e5288996f0..4333aae28e3 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 @@ -67,7 +67,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { } boolean isOptional = sa.hasParam("Optional"); - if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantCopyTheSpell") + " " + card + "?")) { + if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantCopyTheSpell", card.toString()))) { return; } @@ -85,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 = Localizer.getInstance().getMessage("lblSelectMultiSpellCopyToStack").replace("%d", Lang.getOrdinal(multi + 1)); + String prompt = Localizer.getInstance().getMessage("lblSelectMultiSpellCopyToStack", Lang.getOrdinal(multi + 1)); SpellAbility chosen = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa, prompt, ImmutableMap.of()); SpellAbility copiedSpell = CardFactory.copySpellAbilityAndPossiblyHost(card, chosen.getHostCard(), chosen, true); 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 d01f55be7ef..8bd8dd1fe81 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 @@ -110,11 +110,7 @@ public class CountersMoveEffect extends SpellAbilityEffect { // only select cards if the counterNum is any if (counterNum.equals("Any")) { - StringBuilder sb = new StringBuilder(); - - sb.append(Localizer.getInstance().getMessage("lblChooseTakeCountersCard").replace("%s", cType.getName())); - - srcCards = player.getController().chooseCardsForEffect(srcCards, sa, sb.toString(), 0, srcCards.size(), true); + srcCards = player.getController().chooseCardsForEffect(srcCards, sa, Localizer.getInstance().getMessage("lblChooseTakeCountersCard", cType.getName()), 0, srcCards.size(), true); } for (Card src : srcCards) { @@ -136,10 +132,7 @@ public class CountersMoveEffect extends SpellAbilityEffect { params.put("CounterType", cType); params.put("Source", src); params.put("Target", dest); - StringBuilder sb = new StringBuilder(); - 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); + cnum = player.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblTakeHowManyTargetCounterFromCard", cType.getName(), src.toString()), 0, cmax, params); } else { cnum = AbilityUtils.calculateAmount(host, counterNum, sa); } @@ -173,12 +166,8 @@ public class CountersMoveEffect extends SpellAbilityEffect { tgtCards = CardLists.getValidCards(tgtCards, sa.getParam("ValidDefined"), player, host, sa); if (counterNum.equals("Any")) { - StringBuilder sb = new StringBuilder(); - 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); + tgtCards = player.getController().chooseCardsForEffect(tgtCards, sa, + Localizer.getInstance().getMessage("lblChooseCardToGetCountersFrom", cType.getName(), source.toString()), 0, tgtCards.size(), true); } boolean updateSource = false; @@ -202,9 +191,7 @@ public class CountersMoveEffect extends SpellAbilityEffect { params.put("CounterType", cType); params.put("Source", source); params.put("Target", cur); - StringBuilder sb = new StringBuilder(); - 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); + int cnum = player.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblPutHowManyTargetCounterOnCard", cType.getName(), cur.toString()), 0, source.getCounters(cType), params); if (cnum > 0) { source.subtractCounter(cType, cnum); @@ -262,10 +249,7 @@ public class CountersMoveEffect extends SpellAbilityEffect { params.put("CounterType", cType); params.put("Source", source); params.put("Target", cur); - StringBuilder sb = new StringBuilder(); - 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); + cntToMove = pc.chooseNumber(sa, Localizer.getInstance().getMessage("lblTakeHowManyTargetCounterFromCard", cType.getName(), source.toString()), 0, cntToMove, params); } if (source.getCounters(cType) >= cntToMove) { @@ -298,10 +282,8 @@ public class CountersMoveEffect extends SpellAbilityEffect { params.put("CounterType", chosenType); params.put("Source", source); params.put("Target", dest); - StringBuilder sb = new StringBuilder(); - 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); + int chosenAmount = pc.chooseNumber(sa, Localizer.getInstance().getMessage("lblTakeHowManyTargetCounters", chosenType.getName()), + 0, Math.min(tgtCounters.get(chosenType), cntToMove), params); if (chosenAmount > 0) { dest.addCounter(chosenType, chosenAmount, player, true, table); 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 bdb4eb95f3c..b4fd88d8ae5 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 @@ -236,7 +236,7 @@ public class CountersPutEffect extends SpellAbilityEffect { continue; } - String message = Localizer.getInstance().getMessage("lblDoYouWantPutTargetP1P1CountersOn").replace("%d", String.valueOf(counterAmount)) + " " + gameCard + " ?"; + String message = Localizer.getInstance().getMessage("lblDoYouWantPutTargetP1P1CountersOnCard", String.valueOf(counterAmount), gameCard.toString()); Player chooser = pc.chooseSingleEntityForEffect(activator.getOpponents(), sa, Localizer.getInstance().getMessage("lblChooseAnOpponent")); if (chooser.getController().confirmAction(sa, PlayerActionConfirmMode.Tribute, message)) { 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 b02f91f0c0d..61e89d134ec 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 @@ -102,7 +102,7 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect { CounterType chosenType = pc.chooseCounterType(list, sa, prompt, params); params.put("CounterType", chosenType); - prompt = Localizer.getInstance().getMessage("lblWhatToDoWithTargetCounter").replace("%s", chosenType.getName()) + " "; + prompt = Localizer.getInstance().getMessage("lblWhatToDoWithTargetCounter", 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 7855b68162c..5698fb50bb0 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 @@ -130,10 +130,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { srcCards = game.getCardsIn(ZoneType.Battlefield); srcCards = CardLists.getValidCards(srcCards, sa.getParam("ValidSource"), player, card, sa); if (num.equals("Any")) { - StringBuilder sb = new StringBuilder(); - sb.append(Localizer.getInstance().getMessage("lblChooseCardtoTakeTargetCounters").replace("%s", counterType.getName())); - - srcCards = player.getController().chooseCardsForEffect(srcCards, sa, sb.toString(), 0, srcCards.size(), true); + srcCards = player.getController().chooseCardsForEffect(srcCards, sa, Localizer.getInstance().getMessage("lblChooseCardsToTakeTargetCounters", counterType.getName()), 0, srcCards.size(), true); } } else { srcCards = getTargetCards(sa); @@ -173,7 +170,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { Map params = Maps.newHashMap(); params.put("Target", gameCard); params.put("CounterType", type); - String title = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget").replace("%s", type); + String title = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", type); cntToRemove = pc.chooseNumber(sa, title, 0, cntToRemove, params); } @@ -217,7 +214,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { String prompt = Localizer.getInstance().getMessage("lblSelectCountersTypeToRemove"); CounterType chosenType = pc.chooseCounterType( ImmutableList.copyOf(tgtCounters.keySet()), sa, prompt, params); - prompt = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget").replace("%s", chosenType.getName()); + prompt = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", 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 0c537c98898..5ba5f4d8203 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 @@ -84,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, Localizer.getInstance().getMessage("lblDoyouWantDealTargetDamageTo").replace("%d", String.valueOf(dmg)) + " " + tgts + " ?")) { + if (decider != null && !decider.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantDealTargetDamageToTarget", String.valueOf(dmg), tgts.toString()))) { 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 15099d80991..bac2d4a7887 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 @@ -222,17 +222,17 @@ public class DigEffect extends SpellAbilityEffect { } chooser.getController().endTempShowCards(); if (!movedCards.isEmpty()) { - game.getAction().reveal(movedCards, chooser, true, chooser + " " + Localizer.getInstance().getMessage("lblPicked") + " "); + game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedChosen", chooser.getName(), "")); } } else if (allButOne) { movedCards = new CardCollection(valid); String prompt; if (destZone2.equals(ZoneType.Library) && libraryPosition2 == 0) { - prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop").replace("%s", "{player's}"); + prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop", "{player's}"); } else { - prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTarget").replace("%s", "{player's}") + " " + destZone2.name(); + prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTargetZone", "{player's}", destZone2.name()); } Card chosen = chooser.getController().chooseSingleEntityForEffect(valid, delayedReveal, sa, prompt, false, p); @@ -246,12 +246,12 @@ public class DigEffect extends SpellAbilityEffect { if (sa.hasParam("PrimaryPrompt")) { prompt = sa.getParam("PrimaryPrompt"); } else { - prompt = Localizer.getInstance().getMessage("lblChooseCardsPutInto") + " " + destZone1.name(); + prompt = Localizer.getInstance().getMessage("lblChooseCardsPutIntoZone", destZone1.name()); if (destZone1.equals(ZoneType.Library)) { if (libraryPosition == -1) { - prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayBottom").replace("%s", "{player's}"); + prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayBottom", "{player's}"); } else if (libraryPosition == 0) { - prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayTop").replace("%s", "{player's}"); + prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayTop", "{player's}"); } } } @@ -276,10 +276,7 @@ public class DigEffect extends SpellAbilityEffect { } if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) { - game.getAction().reveal(movedCards, chooser, true, - chooser + " " + Localizer.getInstance().getMessage("lblPicked") + " " + - (movedCards.size() == 1 ? Localizer.getInstance().getMessage("lblThisCard") : Localizer.getInstance().getMessage("lblTheseCards")) + - " " + Localizer.getInstance().getMessage("lblFrom") + " "); + game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedCardFrom", chooser.getName())); } } 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 b7afd1cc9cb..dfeccc06ade 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 @@ -82,8 +82,7 @@ public class DigMultipleEffect extends SpellAbilityEffect { CardCollection chosen = chooser.getController().chooseCardsForEffectMultiple(validMap, sa, Localizer.getInstance().getMessage("lblChooseCards")); if (!chosen.isEmpty()) { - game.getAction().reveal(chosen, chooser, true, - chooser + " " + Localizer.getInstance().getMessage("lblPicked") + " " + (chosen.size() == 1 ? Localizer.getInstance().getMessage("lblThisCard") : Localizer.getInstance().getMessage("lblTheseCards")) + " " + Localizer.getInstance().getMessage("lblFrom") + " "); + game.getAction().reveal(chosen, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedCardFrom", chooser.getName())); } 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 62b82dc6a44..dfa8b989fd5 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 @@ -160,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, - Localizer.getInstance().getMessage("lblDoYouWantPutCardTo") + " " + foundDest.name() + "?")) { + Localizer.getInstance().getMessage("lblDoYouWantPutCardToZone", 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 a44f1c6c6ad..cff66313247 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 @@ -206,7 +206,7 @@ public class DiscardEffect extends SpellAbilityEffect { if (!p.canDiscardBy(sa)) { continue; } - String message = Localizer.getInstance().getMessage("lblWouldYouLikeRandomDiscardTargetCard").replace("%d", String.valueOf(numCards)); + String message = Localizer.getInstance().getMessage("lblWouldYouLikeRandomDiscardTargetCard", String.valueOf(numCards)); boolean runDiscard = !sa.hasParam("Optional") || p.getController().confirmAction(sa, PlayerActionConfirmMode.Random, message); if (runDiscard) { @@ -326,8 +326,7 @@ public class DiscardEffect extends SpellAbilityEffect { } if (mode.startsWith("Reveal") ) { - p.getController().reveal(toBeDiscarded, ZoneType.Hand, p, - chooser + " " + Localizer.getInstance().getMessage("lblHasChosen") + " " + (toBeDiscarded.size() == 1 ? Localizer.getInstance().getMessage("lblThisCard") : Localizer.getInstance().getMessage("lblTheseCards")) + " " + Localizer.getInstance().getMessage("lblFrom") + " "); + p.getController().reveal(toBeDiscarded, ZoneType.Hand, p, Localizer.getInstance().getMessage("lblPlayerHasChosenCardsFrom", chooser.getName())); } 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 9684f09190f..c1912191dad 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 @@ -50,7 +50,7 @@ public class DrawEffect extends SpellAbilityEffect { for (final Player p : getDefinedPlayersOrTargeted(sa)) { if ((tgt == null) || p.canBeTargetedBy(sa)) - if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDraw") + " " + Lang.nounWithAmount(numCards, " card") + "?")) + if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDrawCards", Lang.nounWithAmount(numCards, " card")))) continue; int actualNum = numCards; 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 550b77e7711..89b6344abdd 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 @@ -45,9 +45,7 @@ public class EncodeEffect extends SpellAbilityEffect { // Handle choice of whether or not to encoded - final StringBuilder sb = new StringBuilder(); - sb.append(Localizer.getInstance().getMessage("lblDoYouWantExile") + " ").append(host).append(" " + Localizer.getInstance().getMessage("lblAndEncodeOntoAYouControlCreature")); - if (!player.getController().confirmAction(sa, null, sb.toString())) { + if (!player.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantExileCardAndEncodeOntoYouCreature", host.toString()))) { return; } @@ -58,11 +56,11 @@ public class EncodeEffect extends SpellAbilityEffect { Card choice = player.getController().chooseSingleEntityForEffect(choices, sa, Localizer.getInstance().getMessage("lblChooseACreatureYouControlToEncode") + " ", true); if (choice == null) { - return; + return; } StringBuilder codeLog = new StringBuilder(); - codeLog.append(Localizer.getInstance().getMessage("lblEncoding") + " ").append(host.toString()).append(" " + Localizer.getInstance().getMessage("lblTo") + " ").append(choice.toString()); + codeLog.append("Encoding ").append(host.toString()).append(" to ").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/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index a4812c22ddc..b55bcc90385 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 @@ -112,7 +112,7 @@ public class ManaEffect extends SpellAbilityEffect { return; } - game.action.nofityOfValue(sa, card, activator + " " + Localizer.getInstance().getMessage("lblPicked") + " " + choiceString, activator); + game.action.nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", activator.getName(), choiceString), activator); abMana.setExpressChoice(choiceString.toString()); } } @@ -142,7 +142,7 @@ public class ManaEffect extends SpellAbilityEffect { } choice = MagicColor.toShortString(val); - game.action.nofityOfValue(sa, card, act + " " + Localizer.getInstance().getMessage("lblPicked") + " " + choice, act); + game.action.nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", act.getName(), choice), act); abMana.setExpressChoice(choice); } } @@ -173,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(Localizer.getInstance().getMessage("lblChooseSingleColorFrom") + " " + s.toString(), sa, cs); + byte chosenColor = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs); sb.append(MagicColor.toShortString(chosenColor)); } } 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 8fb24cf9163..e8e0079a9bb 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 @@ -40,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(Localizer.getInstance().getMessage("lblDoYouWantPutLibraryCardsTo"), TextUtil.addSuffix(destination.toString(),"?")); + final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantPutLibraryCardsTo", 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 7bc72c9142e..ec3de6b43eb 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 @@ -86,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, Localizer.getInstance().getMessage("lblChooseCardsInPile") + " " + i, 0, size, false); + CardCollectionView pile = p.getController().chooseCardsForEffect(pool, sa, Localizer.getInstance().getMessage("lblChooseCardsInTargetPile", String.valueOf(i)), 0, size, false); pileList.add(pile); pool.removeAll(pile); } 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 9d65e3a36a5..49c1fceccc3 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 @@ -3,7 +3,6 @@ package forge.game.ability.effects; import java.util.ArrayList; import java.util.List; -import forge.util.TextUtil; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicate; @@ -163,7 +162,7 @@ public class PlayEffect extends SpellAbilityEffect { game.getAction().revealTo(tgtCard, activator); } - if (optional && !controller.getController().confirmAction(sa, null, TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantPlay"), TextUtil.addSuffix(tgtCard.toString(),"?")))) { + if (optional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantPlayCard", tgtCard.toString()))) { if (wasFaceDown) { tgtCard.turnFaceDownNoUpdate(); } 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 9d81c13e010..3f46f2aebd4 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 @@ -328,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(Localizer.getInstance().getMessage("lblApplyPumpTo") + " ", targets, "?"); + : Localizer.getInstance().getMessage("lblApplyPumpToTarget", targets); if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, message)) { return; 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 5493a77bb34..6f71242efdd 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 @@ -26,7 +26,7 @@ public class RollPlanarDiceEffect extends SpellAbilityEffect { game.getPhaseHandler().incPlanarDiceRolledthisTurn(); } PlanarDice result = PlanarDice.roll(activator, null); - String message = activator.getName() + " " + Localizer.getInstance().getMessage("lblRolled") + " " + result.toString(); + String message = Localizer.getInstance().getMessage("lblPlayerRolledResult", activator.getName(), result.toString()); game.getAction().nofityOfValue(sa, activator, message, null); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java index e812e83a209..ab24cfa830d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java @@ -18,14 +18,14 @@ public class RunSVarAbilityEffect extends SpellAbilityEffect { String sVars = sa.getParam("SVars"); List cards = getTargetCards(sa); if (sVars == null || cards.isEmpty()) { - return; + return; } List validSA = new ArrayList<>(); final boolean isTrigger = sa.hasParam("IsTrigger"); for (final Card tgtC : cards) { if (!tgtC.hasSVar(sVars)) { - continue; - } + continue; + } final SpellAbility actualSA = AbilityFactory.getAbility(tgtC.getSVar(sVars), tgtC); actualSA.setTrigger(isTrigger); actualSA.setActivatingPlayer(sa.getActivatingPlayer()); 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 b5411646c17..f4a84e42a43 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 @@ -157,21 +157,21 @@ public class SacrificeEffect extends SpellAbilityEffect { game.getTriggerHandler().runTrigger(TriggerType.Exploited, runParams, false); } if (wasDestroyed || wasSacrificed) { - countSacrificed++; - if (remSacrificed) { - card.addRemembered(lKICopy); - } + countSacrificed++; + if (remSacrificed) { + card.addRemembered(lKICopy); + } } } } if (remSVar != null) { - card.setSVar(remSVar, String.valueOf(countSacrificed)); - SpellAbility root = sa; - do { - root.setSVar(remSVar, String.valueOf(countSacrificed)); - root = root.getSubAbility(); - } while (root != null); + card.setSVar(remSVar, String.valueOf(countSacrificed)); + SpellAbility root = sa; + do { + root.setSVar(remSVar, String.valueOf(countSacrificed)); + root = root.getSubAbility(); + } while (root != null); } } @@ -194,10 +194,10 @@ public class SacrificeEffect extends SpellAbilityEffect { final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), num, sa); if (valid.equals("Self")) { - sb.append(Localizer.getInstance().getMessage("lblSacrifice") + " ").append(sa.getHostCard().toString()); + sb.append("Sacrifices ").append(sa.getHostCard().toString()); } else if (valid.equals("Card.AttachedBy")) { final Card toSac = sa.getHostCard().getEnchantingCard(); - sb.append(toSac.getController()).append(" " + Localizer.getInstance().getMessage("lblSacrifice") + " ").append(toSac).append("."); + sb.append(toSac.getController()).append(" Sacrifices ").append(toSac).append("."); } else { for (final Player p : tgts) { sb.append(p.getName()).append(" "); @@ -209,9 +209,9 @@ public class SacrificeEffect extends SpellAbilityEffect { } if (sa.hasParam("Destroy")) { - sb.append(Localizer.getInstance().getMessage("lblDestroys") + " "); + sb.append("Destroys "); } else { - sb.append(Localizer.getInstance().getMessage("lblSacrifice") + " "); + sb.append("Sacrifices "); } 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 aeb03cb8d95..a0436020c2f 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 @@ -42,10 +42,10 @@ 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, Localizer.getInstance().getMessage("lblDoYouWanttoScry"))) ) { - players.add(p); - } + if ( (!sa.usesTargeting() || p.canBeTargetedBy(sa)) && + (!isOptional || p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWanttoScry"))) ) { + players.add(p); + } } sa.getActivatingPlayer().getGame().getAction().scry(players, num, sa); } 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 1b5b4514920..b774c93d2d2 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 @@ -21,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, Localizer.getInstance().getMessage("lblHaveTargetShuffle").replace("%s", p + "")); + boolean mustShuffle = !optional || sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblHaveTargetShuffle", p.getName())); if (mustShuffle) p.shuffle(sa); } 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 872cb003a21..c70faeb6390 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 @@ -39,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, Localizer.getInstance().getMessage("lblTapOrUntap") + " " + tgtC + "?", PlayerController.BinaryChoiceType.TapOrUntap, + boolean tap = pc.chooseBinary(sa, Localizer.getInstance().getMessage("lblTapOrUntapTarget", 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 76dcdbbd966..38d780d8b9f 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 @@ -480,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, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c, false); + final GameEntity defender = controller.getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", c.toString()), false); combat.addAttacker(c, defender); combatChanged = true; } From 8cfc922d97778a24ba1e0102f141ac7ac62ef3cd Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 27 Dec 2019 15:22:52 +0800 Subject: [PATCH 50/64] update translation --- forge-gui/res/languages/de-DE.properties | 125 +++++++++++----------- forge-gui/res/languages/en-US.properties | 125 +++++++++++----------- forge-gui/res/languages/es-ES.properties | 125 +++++++++++----------- forge-gui/res/languages/zh-CN.properties | 127 +++++++++++------------ 4 files changed, 241 insertions(+), 261 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 90c389df1a5..719854ff135 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1246,6 +1246,7 @@ lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces an lblErrorEntityWithId=Error: Entity with ID lblNotFound=not found lblChooseAnnounceFor=Choose %s for %name +lblSacrifice=Sacrifice #AbstractGuiGame.java lblConcedeCurrentGame=Das Spiel wird als verloren gewertet.\n\nTrotzdem aufgeben? lblConcedeTitle=Spiel verloren geben? @@ -1620,59 +1621,58 @@ lblCurrentCard=Current Card lblSelectOfCardsTo=Select lblCardsTo=card(s) to #AbandonEffect.java -lblWouldYoulikeAbandon=Would you like to abandon the scheme +lblWouldYoulikeAbandonSource=Would you like to abandon the scheme {0}? #ActivateAbilityEffect.java lblChooseManaAbility=Choose a mana ability: #AddTurnEffect.java -lblTakesExtraTurn=takes an extra turn. +lblPlayerTakesExtraTurn={0} takes an extra turn. #AmassEffect.java. lblChooseAnArmy=Choose an army to put counters on #AssignGroupEffect.java -lblChooseAbilityFor=Choose ability for +lblChooseAbilityForObject=Choose ability for {0} #AttachEffect.java -lblDoYouWantAttach=Do you want to attach -lblSelectAPlayerAttachTo=Select a player to attach to. -lblSelectACardAttachTo=Select a card to attach to. +lblDoYouWantAttachSourceToTarget=Do you want to attach {0} to {1}? +lblSelectAPlayerAttachSourceTo={0} - Select a player to attach to. +lblSelectACardAttachSourceTo={0} - 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 +lblTopBidWithValueLife=topped bid with {0} life #BondEffect.java lblSelectACardPair=Select a card to pair with #ChangeCombatantsEffect.java -lblChooseDefenderToAttackWith=Choose which defender to attack with +lblChooseDefenderToAttackWithCard=Choose which defender to attack with {0} #ChangeTargetsEffect.java -lblDoYouWantChangeTargets=Do you want to change targets of +lblDoYouWantChangeAbilityTargets=Do you want to change targets of {0}? #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 +lblDoYouWantMoveTargetFromOriToDest=Do you want to move {0} from {1} to {2}? +lblPutThatCardFromPlayerOriginToDestination=Put that card from for {0} {1} to {2} +lblSearchPlayerZoneConfirm=Search {0} {1}? 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. +lblDoYouWantPlayCard=Do you want to play {0}? +lblSelectCardFromPlayerZone=Select a card from {0} {1} +lblSelectUpToNumCardFromPlayerZone=Select up to {0} cards from {1} {2} +lblSelectCardsFromPlayerZone=Select cards from {0} {1} +lblCancelSearchUpToSelectNumCards=Cancel Search? Up to {0} more card(s) can be selected. +#ChangeZoneAllEffect.java +lblMoveTargetFromOriginToDestination=Move {0} from {1} to {2}? #ChooseCardEffect.java -lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to -lblTotalPower=Total Power +lblChoose=Choose +lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to {0} +lblTotalPowerNum=Total Power: {0} lblCancelChooseConfirm=Cancel Choose? #ChooseCardNameEffect.java lblChooseACardName=Choose a card name -lblChooseA=Choose a -lblCardName=card name -lblPicked=picked +lblChooseASpecificCard=Choose a {0} card name. +lblPlayerPickedChosen={0} picked {1} #ChooseColorEffect.java lblChooseAColor=Choose a color -lblChoose=Choose -lblOrMore=or more +lblAtLastChooseNumColors=Choose {0} or more color +lblChooseSpecifiedRangeColors=Choose {0} to {1} color #ChooseDirectionEffect.java lblLeftClockwise=Left (clockwise) lblRightAntiClockwise=Right (anticlockwise) @@ -1681,7 +1681,7 @@ lblChooseDirection=Choose a direction lblChooseOne=Choose one #ChooseNumberEffect.java lblChooseNumber=Choose a number -lblChose=chose +lblPlayerChoseNum={0} chose {1} #ChoosePlayerEffect.java lblChoosePlayer=Choose a player #ChooseSourceEffect.java @@ -1692,26 +1692,24 @@ lblReveals=reveals lblWinsClash=wins clash lblLosesClash=loses clash #CloneEffect.java -lblDoYouWantCopy=Do you want to copy +lblDoYouWantCopy=Do you want to copy {0}? #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 +lblDoyouWantCopyTheSpell=Do you want to copy the spell {0}? +lblSelectMultiSpellCopyToStack=Select {0} 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 +lblChooseTakeCountersCard=Choose card to take {0} counters from +lblTakeHowManyTargetCounterFromCard=Take how many {0} counters from {1}? +lblChooseCardToGetCountersFrom=Choose cards to get {0} counters from {1}. +lblPutHowManyTargetCounterOnCard=Put how many {0} counters on {1}? +lblTakeHowManyTargetCounters=Take how many {0} counters? #CountersProliferateEffect.java lblChooseProliferateTarget=Choose any number of permanents and/or players for proliferate #CountersPutEffect.java @@ -1719,41 +1717,40 @@ 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 +lblDoYouWantPutTargetP1P1CountersOnCard=Do you want to put {0} +1/+1 counters on {1}? #CountersPutOrRemoveEffect.java lblSelectCounterTypeToAddOrRemove=Select type of counters to add or remove -lblWhatToDoWithTargetCounter=What to do with that '%s' counter +lblWhatToDoWithTargetCounter=What to do with that '{0}' 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 +lblCounters=counters +lblChooseCardsToTakeTargetCounters=Choose cards to take {0} counters from +lblSelectRemoveCountersNumberOfTarget=Select the number of {0} counters to remove lblSelectCountersTypeToRemove=Select type of counters to remove #DamageDealEffect.java -lblDoyouWantDealTargetDamageTo=Do you want to deal %d damage to +lblDoyouWantDealTargetDamageToTarget=Do you want to deal {0} damage to {1}? #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 +lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of {0} library +lblChooseACardLeaveTarget=Choose a card to leave in {0} {1} +lblChooseCardsPutIntoZone=Choose card(s) to put into {0} +lblChooseCardPutOnTargetLibarayBottom=Choose card(s) to put on the bottom of {0} library +lblChooseCardPutOnTargetLibarayTop=Choose card(s) to put on top of {0} library +lblPlayerPickedCardFrom={0} picked card(s) from 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 +lblDoYouWantPutCardToZone=Do you want to put that card to {0}? #DiscardEffect.java -lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard %d random card(s)? -lblHasChosen=has chosen +lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard {0} random card(s)? +lblPlayerHasChosenCardsFrom={0} has chosen card(s) from #DrawEffect.java -lblDoYouWantDraw=Do you want to draw +lblDoYouWantDrawCards=Do you want to draw {0}? lblHowMayCardDoYouWantDraw=How may cards do you want to draw? #EncodeEffect.java -lblAndEncodeOntoAYouControlCreature=and encode it onto a creature you control? +lblDoYouWantExileCardAndEncodeOntoYouCreature=Do you want to exile {0} 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? @@ -1768,15 +1765,15 @@ lblLifeTotal=Life Total #ManaEffect.java lblDoYouWantAddMana=Do you want to add mana? lblSelectManaProduce=Select Mana to Produce -lblChooseSingleColorFrom=Choose a single color from +lblChooseSingleColorFromTarget=Choose a single color from {0} #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 +lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? #MultiplePilesEffect.java -lblChooseCardsInPile=Choose cards in Pile +lblChooseCardsInTargetPile=Choose cards in Pile {0}? #PeekAndRevealEffect.java lblRevealingCardFrom=Revealing cards from lblRevealCardToOtherPlayers=Reveal cards to other players? @@ -1786,7 +1783,7 @@ lblSelectCardToPlay=Select a card to play #ProtectAllEffect.java lblChooseAProtection=Choose a protection #PumpEffect.java -lblApplyPumpTo=Apply pump to +lblApplyPumpToTarget=Apply pump to {0}? #RearrangeTopOfLibraryEffect.java lblDoyouWantShuffleTheLibrary=Do you want to shuffle the library? #RepeatEffect.java @@ -1794,22 +1791,20 @@ lblDoYouWantRepeatProcessAgain=Do you want to repeat this process again? #RevealHandEffect.java lblDoYouWantRevealYourHand=Do you want to reveal your hand? #RollPlanarDiceEffect.java -lblRolled=rolled +lblPlayerRolledResult={0} rolled {1} #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? +lblHaveTargetShuffle=Have {0} shuffle? #SurveilEffect.java lblDoYouWantSurveil=Do you want to surveil? #TapOrUntapAllEffect.java lblPermanents=Permanents -lblTapOrUntap=Tap or Untap +lblTapOrUntapTarget=Tap or Untap {0}? #TwoPilesEffect.java lblSelectCardForFaceDownPile=Select cards for a face down pile lblDivideCardIntoTwoPiles=Divide cards into two piles diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index ab4d0edb609..93ad087dea7 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1246,6 +1246,7 @@ lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces an lblErrorEntityWithId=Error: Entity with ID lblNotFound=not found lblChooseAnnounceFor=Choose %s for %name +lblSacrifice=Sacrifice #AbstractGuiGame.java lblConcedeCurrentGame=This will concede the current game and you will lose.\n\nConcede anyway? lblConcedeTitle=Concede Game? @@ -1620,59 +1621,58 @@ lblCurrentCard=Current Card lblSelectOfCardsTo=Select lblCardsTo=card(s) to #AbandonEffect.java -lblWouldYoulikeAbandon=Would you like to abandon the scheme +lblWouldYoulikeAbandonSource=Would you like to abandon the scheme {0}? #ActivateAbilityEffect.java lblChooseManaAbility=Choose a mana ability: #AddTurnEffect.java -lblTakesExtraTurn=takes an extra turn. +lblPlayerTakesExtraTurn={0} takes an extra turn. #AmassEffect.java. lblChooseAnArmy=Choose an army to put counters on #AssignGroupEffect.java -lblChooseAbilityFor=Choose ability for +lblChooseAbilityForObject=Choose ability for {0} #AttachEffect.java -lblDoYouWantAttach=Do you want to attach -lblSelectAPlayerAttachTo=Select a player to attach to. -lblSelectACardAttachTo=Select a card to attach to. +lblDoYouWantAttachSourceToTarget=Do you want to attach {0} to {1}? +lblSelectAPlayerAttachSourceTo={0} - Select a player to attach to. +lblSelectACardAttachSourceTo={0} - 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 +lblTopBidWithValueLife=topped bid with {0} life #BondEffect.java lblSelectACardPair=Select a card to pair with #ChangeCombatantsEffect.java -lblChooseDefenderToAttackWith=Choose which defender to attack with +lblChooseDefenderToAttackWithCard=Choose which defender to attack with {0} #ChangeTargetsEffect.java -lblDoYouWantChangeTargets=Do you want to change targets of +lblDoYouWantChangeAbilityTargets=Do you want to change targets of {0}? #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 +lblDoYouWantMoveTargetFromOriToDest=Do you want to move {0} from {1} to {2}? +lblPutThatCardFromPlayerOriginToDestination=Put that card from for {0} {1} to {2} +lblSearchPlayerZoneConfirm=Search {0} {1}? 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. +lblDoYouWantPlayCard=Do you want to play {0}? +lblSelectCardFromPlayerZone=Select a card from {0} {1} +lblSelectUpToNumCardFromPlayerZone=Select up to {0} cards from {1} {2} +lblSelectCardsFromPlayerZone=Select cards from {0} {1} +lblCancelSearchUpToSelectNumCards=Cancel Search? Up to {0} more card(s) can be selected. +#ChangeZoneAllEffect.java +lblMoveTargetFromOriginToDestination=Move {0} from {1} to {2}? #ChooseCardEffect.java -lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to -lblTotalPower=Total Power +lblChoose=Choose +lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to {0} +lblTotalPowerNum=Total Power: {0} lblCancelChooseConfirm=Cancel Choose? #ChooseCardNameEffect.java lblChooseACardName=Choose a card name -lblChooseA=Choose a -lblCardName=card name -lblPicked=picked +lblChooseASpecificCard=Choose a {0} card name. +lblPlayerPickedChosen={0} picked {1} #ChooseColorEffect.java lblChooseAColor=Choose a color -lblChoose=Choose -lblOrMore=or more +lblAtLastChooseNumColors=Choose {0} or more color +lblChooseSpecifiedRangeColors=Choose {0} to {1} color #ChooseDirectionEffect.java lblLeftClockwise=Left (clockwise) lblRightAntiClockwise=Right (anticlockwise) @@ -1681,7 +1681,7 @@ lblChooseDirection=Choose a direction lblChooseOne=Choose one #ChooseNumberEffect.java lblChooseNumber=Choose a number -lblChose=chose +lblPlayerChoseNum={0} chose {1} #ChoosePlayerEffect.java lblChoosePlayer=Choose a player #ChooseSourceEffect.java @@ -1692,26 +1692,24 @@ lblReveals=reveals lblWinsClash=wins clash lblLosesClash=loses clash #CloneEffect.java -lblDoYouWantCopy=Do you want to copy +lblDoYouWantCopy=Do you want to copy {0}? #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 +lblDoyouWantCopyTheSpell=Do you want to copy the spell {0}? +lblSelectMultiSpellCopyToStack=Select {0} 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 +lblChooseTakeCountersCard=Choose card to take {0} counters from +lblTakeHowManyTargetCounterFromCard=Take how many {0} counters from {1}? +lblChooseCardToGetCountersFrom=Choose cards to get {0} counters from {1}. +lblPutHowManyTargetCounterOnCard=Put how many {0} counters on {1}? +lblTakeHowManyTargetCounters=Take how many {0} counters? #CountersProliferateEffect.java lblChooseProliferateTarget=Choose any number of permanents and/or players for proliferate #CountersPutEffect.java @@ -1719,41 +1717,40 @@ 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 +lblDoYouWantPutTargetP1P1CountersOnCard=Do you want to put {0} +1/+1 counters on {1}? #CountersPutOrRemoveEffect.java lblSelectCounterTypeToAddOrRemove=Select type of counters to add or remove -lblWhatToDoWithTargetCounter=What to do with that '%s' counter +lblWhatToDoWithTargetCounter=What to do with that '{0}' 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 +lblCounters=counters +lblChooseCardsToTakeTargetCounters=Choose cards to take {0} counters from +lblSelectRemoveCountersNumberOfTarget=Select the number of {0} counters to remove lblSelectCountersTypeToRemove=Select type of counters to remove #DamageDealEffect.java -lblDoyouWantDealTargetDamageTo=Do you want to deal %d damage to +lblDoyouWantDealTargetDamageToTarget=Do you want to deal {0} damage to {1}? #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 +lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of {0} library +lblChooseACardLeaveTarget=Choose a card to leave in {0} {1} +lblChooseCardsPutIntoZone=Choose card(s) to put into {0} +lblChooseCardPutOnTargetLibarayBottom=Choose card(s) to put on the bottom of {0} library +lblChooseCardPutOnTargetLibarayTop=Choose card(s) to put on top of {0} library +lblPlayerPickedCardFrom={0} picked card(s) from 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 +lblDoYouWantPutCardToZone=Do you want to put that card to {0}? #DiscardEffect.java -lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard %d random card(s)? -lblHasChosen=has chosen +lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard {0} random card(s)? +lblPlayerHasChosenCardsFrom={0} has chosen card(s) from #DrawEffect.java -lblDoYouWantDraw=Do you want to draw +lblDoYouWantDrawCards=Do you want to draw {0}? lblHowMayCardDoYouWantDraw=How may cards do you want to draw? #EncodeEffect.java -lblAndEncodeOntoAYouControlCreature=and encode it onto a creature you control? +lblDoYouWantExileCardAndEncodeOntoYouCreature=Do you want to exile {0} 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? @@ -1768,15 +1765,15 @@ lblLifeTotal=Life Total #ManaEffect.java lblDoYouWantAddMana=Do you want to add mana? lblSelectManaProduce=Select Mana to Produce -lblChooseSingleColorFrom=Choose a single color from +lblChooseSingleColorFromTarget=Choose a single color from {0} #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 +lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? #MultiplePilesEffect.java -lblChooseCardsInPile=Choose cards in Pile +lblChooseCardsInTargetPile=Choose cards in Pile {0}? #PeekAndRevealEffect.java lblRevealingCardFrom=Revealing cards from lblRevealCardToOtherPlayers=Reveal cards to other players? @@ -1786,7 +1783,7 @@ lblSelectCardToPlay=Select a card to play #ProtectAllEffect.java lblChooseAProtection=Choose a protection #PumpEffect.java -lblApplyPumpTo=Apply pump to +lblApplyPumpToTarget=Apply pump to {0}? #RearrangeTopOfLibraryEffect.java lblDoyouWantShuffleTheLibrary=Do you want to shuffle the library? #RepeatEffect.java @@ -1794,22 +1791,20 @@ lblDoYouWantRepeatProcessAgain=Do you want to repeat this process again? #RevealHandEffect.java lblDoYouWantRevealYourHand=Do you want to reveal your hand? #RollPlanarDiceEffect.java -lblRolled=rolled +lblPlayerRolledResult={0} rolled {1} #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? +lblHaveTargetShuffle=Have {0} shuffle? #SurveilEffect.java lblDoYouWantSurveil=Do you want to surveil? #TapOrUntapAllEffect.java lblPermanents=Permanents -lblTapOrUntap=Tap or Untap +lblTapOrUntapTarget=Tap or Untap {0}? #TwoPilesEffect.java lblSelectCardForFaceDownPile=Select cards for a face down pile lblDivideCardIntoTwoPiles=Divide cards into two piles diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index e2cd6d0aaef..f269df2be2d 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1246,6 +1246,7 @@ lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces an lblErrorEntityWithId=Error: Entity with ID lblNotFound=not found lblChooseAnnounceFor=Choose %s for %name +lblSacrifice=Sacrifice #AbstractGuiGame.java lblConcedeCurrentGame=Esto concederá la partida actual y perderás.\n\n¿Conceder de todos modos? lblConcedeTitle=¿Conceder Partida? @@ -1620,59 +1621,58 @@ lblCurrentCard=Current Card lblSelectOfCardsTo=Select lblCardsTo=card(s) to #AbandonEffect.java -lblWouldYoulikeAbandon=Would you like to abandon the scheme +lblWouldYoulikeAbandonSource=Would you like to abandon the scheme {0}? #ActivateAbilityEffect.java lblChooseManaAbility=Choose a mana ability: #AddTurnEffect.java -lblTakesExtraTurn=takes an extra turn. +lblPlayerTakesExtraTurn={0} takes an extra turn. #AmassEffect.java. lblChooseAnArmy=Choose an army to put counters on #AssignGroupEffect.java -lblChooseAbilityFor=Choose ability for +lblChooseAbilityForObject=Choose ability for {0} #AttachEffect.java -lblDoYouWantAttach=Do you want to attach -lblSelectAPlayerAttachTo=Select a player to attach to. -lblSelectACardAttachTo=Select a card to attach to. +lblDoYouWantAttachSourceToTarget=Do you want to attach {0} to {1}? +lblSelectAPlayerAttachSourceTo={0} - Select a player to attach to. +lblSelectACardAttachSourceTo={0} - 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 +lblTopBidWithValueLife=topped bid with {0} life #BondEffect.java lblSelectACardPair=Select a card to pair with #ChangeCombatantsEffect.java -lblChooseDefenderToAttackWith=Choose which defender to attack with +lblChooseDefenderToAttackWithCard=Choose which defender to attack with {0} #ChangeTargetsEffect.java -lblDoYouWantChangeTargets=Do you want to change targets of +lblDoYouWantChangeAbilityTargets=Do you want to change targets of {0}? #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 +lblDoYouWantMoveTargetFromOriToDest=Do you want to move {0} from {1} to {2}? +lblPutThatCardFromPlayerOriginToDestination=Put that card from for {0} {1} to {2} +lblSearchPlayerZoneConfirm=Search {0} {1}? 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. +lblDoYouWantPlayCard=Do you want to play {0}? +lblSelectCardFromPlayerZone=Select a card from {0} {1} +lblSelectUpToNumCardFromPlayerZone=Select up to {0} cards from {1} {2} +lblSelectCardsFromPlayerZone=Select cards from {0} {1} +lblCancelSearchUpToSelectNumCards=Cancel Search? Up to {0} more card(s) can be selected. +#ChangeZoneAllEffect.java +lblMoveTargetFromOriginToDestination=Move {0} from {1} to {2}? #ChooseCardEffect.java -lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to -lblTotalPower=Total Power +lblChoose=Choose +lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to {0} +lblTotalPowerNum=Total Power: {0} lblCancelChooseConfirm=Cancel Choose? #ChooseCardNameEffect.java lblChooseACardName=Choose a card name -lblChooseA=Choose a -lblCardName=card name -lblPicked=picked +lblChooseASpecificCard=Choose a {0} card name. +lblPlayerPickedChosen={0} picked {1} #ChooseColorEffect.java lblChooseAColor=Choose a color -lblChoose=Choose -lblOrMore=or more +lblAtLastChooseNumColors=Choose {0} or more color +lblChooseSpecifiedRangeColors=Choose {0} to {1} color #ChooseDirectionEffect.java lblLeftClockwise=Left (clockwise) lblRightAntiClockwise=Right (anticlockwise) @@ -1681,7 +1681,7 @@ lblChooseDirection=Choose a direction lblChooseOne=Choose one #ChooseNumberEffect.java lblChooseNumber=Choose a number -lblChose=chose +lblPlayerChoseNum={0} chose {1} #ChoosePlayerEffect.java lblChoosePlayer=Choose a player #ChooseSourceEffect.java @@ -1692,26 +1692,24 @@ lblReveals=reveals lblWinsClash=wins clash lblLosesClash=loses clash #CloneEffect.java -lblDoYouWantCopy=Do you want to copy +lblDoYouWantCopy=Do you want to copy {0}? #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 +lblDoyouWantCopyTheSpell=Do you want to copy the spell {0}? +lblSelectMultiSpellCopyToStack=Select {0} 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 +lblChooseTakeCountersCard=Choose card to take {0} counters from +lblTakeHowManyTargetCounterFromCard=Take how many {0} counters from {1}? +lblChooseCardToGetCountersFrom=Choose cards to get {0} counters from {1}. +lblPutHowManyTargetCounterOnCard=Put how many {0} counters on {1}? +lblTakeHowManyTargetCounters=Take how many {0} counters? #CountersProliferateEffect.java lblChooseProliferateTarget=Choose any number of permanents and/or players for proliferate #CountersPutEffect.java @@ -1719,41 +1717,40 @@ 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 +lblDoYouWantPutTargetP1P1CountersOnCard=Do you want to put {0} +1/+1 counters on {1}? #CountersPutOrRemoveEffect.java lblSelectCounterTypeToAddOrRemove=Select type of counters to add or remove -lblWhatToDoWithTargetCounter=What to do with that '%s' counter +lblWhatToDoWithTargetCounter=What to do with that '{0}' 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 +lblCounters=counters +lblChooseCardsToTakeTargetCounters=Choose cards to take {0} counters from +lblSelectRemoveCountersNumberOfTarget=Select the number of {0} counters to remove lblSelectCountersTypeToRemove=Select type of counters to remove #DamageDealEffect.java -lblDoyouWantDealTargetDamageTo=Do you want to deal %d damage to +lblDoyouWantDealTargetDamageToTarget=Do you want to deal {0} damage to {1}? #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 +lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of {0} library +lblChooseACardLeaveTarget=Choose a card to leave in {0} {1} +lblChooseCardsPutIntoZone=Choose card(s) to put into {0} +lblChooseCardPutOnTargetLibarayBottom=Choose card(s) to put on the bottom of {0} library +lblChooseCardPutOnTargetLibarayTop=Choose card(s) to put on top of {0} library +lblPlayerPickedCardFrom={0} picked card(s) from 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 +lblDoYouWantPutCardToZone=Do you want to put that card to {0}? #DiscardEffect.java -lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard %d random card(s)? -lblHasChosen=has chosen +lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard {0} random card(s)? +lblPlayerHasChosenCardsFrom={0} has chosen card(s) from #DrawEffect.java -lblDoYouWantDraw=Do you want to draw +lblDoYouWantDrawCards=Do you want to draw {0}? lblHowMayCardDoYouWantDraw=How may cards do you want to draw? #EncodeEffect.java -lblAndEncodeOntoAYouControlCreature=and encode it onto a creature you control? +lblDoYouWantExileCardAndEncodeOntoYouCreature=Do you want to exile {0} 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? @@ -1768,15 +1765,15 @@ lblLifeTotal=Life Total #ManaEffect.java lblDoYouWantAddMana=Do you want to add mana? lblSelectManaProduce=Select Mana to Produce -lblChooseSingleColorFrom=Choose a single color from +lblChooseSingleColorFromTarget=Choose a single color from {0} #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 +lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? #MultiplePilesEffect.java -lblChooseCardsInPile=Choose cards in Pile +lblChooseCardsInTargetPile=Choose cards in Pile {0}? #PeekAndRevealEffect.java lblRevealingCardFrom=Revealing cards from lblRevealCardToOtherPlayers=Reveal cards to other players? @@ -1786,7 +1783,7 @@ lblSelectCardToPlay=Select a card to play #ProtectAllEffect.java lblChooseAProtection=Choose a protection #PumpEffect.java -lblApplyPumpTo=Apply pump to +lblApplyPumpToTarget=Apply pump to {0}? #RearrangeTopOfLibraryEffect.java lblDoyouWantShuffleTheLibrary=Do you want to shuffle the library? #RepeatEffect.java @@ -1794,22 +1791,20 @@ lblDoYouWantRepeatProcessAgain=Do you want to repeat this process again? #RevealHandEffect.java lblDoYouWantRevealYourHand=Do you want to reveal your hand? #RollPlanarDiceEffect.java -lblRolled=rolled +lblPlayerRolledResult={0} rolled {1} #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? +lblHaveTargetShuffle=Have {0} shuffle? #SurveilEffect.java lblDoYouWantSurveil=Do you want to surveil? #TapOrUntapAllEffect.java lblPermanents=Permanents -lblTapOrUntap=Tap or Untap +lblTapOrUntapTarget=Tap or Untap {0}? #TwoPilesEffect.java lblSelectCardForFaceDownPile=Select cards for a face down pile lblDivideCardIntoTwoPiles=Divide cards into two piles diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 9d02b163033..000126f77f9 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1035,7 +1035,7 @@ lblAny=任意 lblFantasy=幻想 lblGeneric=通用 #MatchController.java -lblChooseAbilityToPlay=选择使用的能力 +lblChooseAbilityToPlay=选择要使用的异能 lblSelected=选择 #ItemManager.java lblAdvancedSearch=高级搜索 @@ -1246,6 +1246,7 @@ lblErrorPleaseCheckID=错误:请检查ID,并确保他们之间用空格和/ lblErrorEntityWithId=错误:实体的ID lblNotFound=没有找到 lblChooseAnnounceFor=为%name选择%s +lblSacrifice=牺牲 #AbstractGuiGame.java lblConcedeCurrentGame=这局游戏认输。\n\n确认吗? lblConcedeTitle=这局游戏认输? @@ -1620,59 +1621,58 @@ lblCurrentCard=当前牌 lblSelectOfCardsTo=选择 lblCardsTo=牌到 #AbandonEffect.java -lblWouldYoulikeAbandon=你想要终止阴谋 +lblWouldYoulikeAbandonSource=你想要终止阴谋{0}吗? #ActivateAbilityEffect.java lblChooseManaAbility=选择一个法术力异能: #AddTurnEffect.java -lblTakesExtraTurn=获得一个额外回合。 +lblPlayerTakesExtraTurn={0}获得一个额外回合。 #AmassEffect.java. lblChooseAnArmy=选择一个军队将指示物放置在上面。 #AssignGroupEffect.java -lblChooseAbilityFor=选择一个异能 +lblChooseAbilityForObject=从{0}中选择一个异能 #AttachEffect.java -lblDoYouWantAttach=你想要装备 -lblSelectAPlayerAttachTo=选择一个要结附的牌手。 -lblSelectACardAttachTo=选择一个要结附的牌。 +lblDoYouWantAttachSourceToTarget=你想要将{0}装备到{1}吗? +lblSelectAPlayerAttachSourceTo={0} - 选择一个要结附的牌手。 +lblSelectACardAttachSourceTo={0} - 选择一个要结附的牌。 #BidLifeEffect.java lblChooseStartingBid=选择一个初始价钱 lblDoYouWantTopBid=你想要喊更高的价? 现在价钱 \= -lblTopBidWith=最高喊价 +lblTopBidWithValueLife=最高喊价为{0}生命 #BondEffect.java lblSelectACardPair=选择要组成搭档的牌 #ChangeCombatantsEffect.java lblChooseDefenderToAttackWith=选择守军进行进攻 #ChangeTargetsEffect.java -lblDoYouWantChangeTargets=你是否想要更改目标 +lblDoYouWantChangeAbilityTargets=你是否想要更改{0}的目标 #ChangeTextEffect.java lblChooseColorReplace=选择一个要替换的颜色词 lblChooseNewColor=选择一个新的颜色词 #ChangeZoneEffect.java -lblDoYouWantMove=你想要移动 -lblDeclareDefenderFor=声明阻挡者 +lblDoYouWantMoveTargetFromOriToDest=你想要将{0}从{1}移动到{2}吗? +lblPutThatCardFromPlayerOriginToDestination=将这张牌从{0}的{1}放到{2} +lblSearchPlayerZoneConfirm=搜索{0}的{1}? lblCardMatchSearchingTypeInAlternateZones=在你的备用区域搜索匹配类型的卡牌。 -lblPutThatCardFrom=放置这张牌从 lblLookingCardIn=看牌自 -lblDoYouWantPlay=你想要使用 -lblSelectCardFrom=选择一张牌从 -lblSelectUpTo=最多选择 -lblCardsFrom=牌张来自 -lblSelectCardsFrom=选择牌张来自 -lblCancelSearchUpTo=取消搜索?直到 -lblMoreCard=更多牌 -lblCanBeSelected=可以选择 +lblDoYouWantPlayCard=你想要使用{0}? +lblSelectCardFromPlayerZone=选择一张牌从{0}的{1} +lblSelectUpToNumCardFromPlayerZone=最多选择{0}张牌来自{1}的{2} +lblSelectCardsFromPlayerZone=选择牌张来自{0}的{1} +lblCancelSearchUpToSelectNumCards=取消搜索?最多可以搜索{0}张牌。 +#ChangeZoneAllEffect.java +lblMoveTargetFromOriginToDestination=将{0}从{1}移动到{2}? #ChooseCardEffect.java -lblSelectCreatureWithTotalPowerLessOrEqualTo=选择一些生物其力量合小于或等于 -lblTotalPower=总力量 +lblChoose=选择 +lblSelectCreatureWithTotalPowerLessOrEqualTo=选择一些生物其力量只和需小于或等于{0} +lblTotalPowerNum=总力量:{0} lblCancelChooseConfirm=取消选择? #ChooseCardNameEffect.java lblChooseACardName=选择一个牌名 -lblChooseA=选择一个 -lblCardName=牌名 -lblPicked=选取 +lblChooseASpecificCard=选择一个{0}牌名 +lblPlayerPickedChosen={0}选取了{1} #ChooseColorEffect.java lblChooseAColor=选择一个颜色 -lblChoose=选择 -lblOrMore=或更多 +lblAtLastChooseNumColors=选择{0}或更多颜色 +lblChooseSpecifiedRangeColors=选择{0}到{1}种颜色 #ChooseDirectionEffect.java lblLeftClockwise=左(顺时针) lblRightAntiClockwise=右(逆时针) @@ -1681,7 +1681,7 @@ lblChooseDirection=选择一个方向 lblChooseOne=选择一个 #ChooseNumberEffect.java lblChooseNumber=选择一个数 -lblChose=已选择 +lblPlayerChoseNum={0}已选择{1} #ChoosePlayerEffect.java lblChoosePlayer=选择一个牌手 #ChooseSourceEffect.java @@ -1692,26 +1692,24 @@ lblReveals=展示 lblWinsClash=比点赢了 lblLosesClash=比点输了 #CloneEffect.java -lblDoYouWantCopy=你想要复制 +lblDoYouWantCopy=你想要复制{0}吗? #ControlExchangeVariantEffect.java lblChooseCards=选择牌 #CopyPermanentEffect.java lblCopyPermanentConfirm=复制这个永久物? lblDefender=守军 #CopySpellAbilityEffect.java -lblDoyouWantCopyTheSpell=你想要复制这个咒语 -lblSelectMultiSpellCopyToStack=选择%d个咒语复制到堆叠 +lblDoyouWantCopyTheSpell=你想要复制咒语{0}吗? +lblSelectMultiSpellCopyToStack=选择{0}个咒语复制到堆叠 lblSelectASpellCopy=选择一个咒语进行复制 #CounterEffect.java lblRemoveDestination=要删除的目标 #CountersMoveEffect.java -lblChooseTakeCountersCard=选择牌获得%s指示物自 -lblTakeHowMany=获得几个 -lblCountersFrom=指示物自 -lblChooseCardToGet=选择牌获得 -lblPutHowMany=放置几个 -lblCountersOn=指示物在上面 -lblCounters=指示物 +lblChooseTakeCountersCard=选择牌获得{0}指示物自 +lblTakeHowManyTargetCounterFromCard={1}获得多少个{0}指示物? +lblChooseCardToGetCountersFrom=选择牌从{1}获取{0}指示物 +lblPutHowManyTargetCounterOnCard=放置多少个{0}指示物到{1}? +lblTakeHowManyTargetCounters=获得多少{0}指示物? #CountersProliferateEffect.java lblChooseProliferateTarget=选择任意数量的永久物和或牌手进行增殖 #CountersPutEffect.java @@ -1719,41 +1717,40 @@ lblChooseACreatureWithLeastToughness=选择防御力最小的生物 lblSelectCounterTypeAddTo=选择指示物类型以添加到 lblHowManyCounters=多少指示物? lblChooseAnOpponent=选择一个对手 -lblDoYouWantPutTargetP1P1CountersOn=你想要放置%d个+1+1指示物到 +lblDoYouWantPutTargetP1P1CountersOnCard=你想要放置{0}个+1+1指示物到{1}吗? #CountersPutOrRemoveEffect.java lblSelectCounterTypeToAddOrRemove=选择要添加或移除的指示物的类型 -lblWhatToDoWithTargetCounter=如何使用'%s'指示物 +lblWhatToDoWithTargetCounter=如何使用'{0}'指示物 #CountersRemoveEffect.java lblAllCounters=所有指示物 lblACounters=一个指示物 -lblChooseCardtoTakeTargetCounters=选择牌要获得%s指示物自 -lblSelectRemoveCountersNumberOfTarget=选择要删除的%s指示物的数量 +lblCounters=指示物 +lblChooseCardsToTakeTargetCounters=选择牌要获得{0}指示物自 +lblSelectRemoveCountersNumberOfTarget=选择要删除的{0}指示物的数量 lblSelectCountersTypeToRemove=选择要删除的指示物类型 #DamageDealEffect.java -lblDoyouWantDealTargetDamageTo=你想造成%d伤害给 +lblDoyouWantDealTargetDamageToTarget=你想对{1}造成{0}伤害吗? #DigEffect.java lblWouldYouLikeProceedWithOptionalAbility=你想继续以下可选的异能吗 -lblChooseACardToLeaveTargetLibraryTop=选择一张牌离开%s的牌库顶 -lblChooseACardLeaveTarget=选择一张牌离开%s -lblChooseCardsPutInto=选择牌放到 -lblChooseCardPutOnTargetLibarayBottom=选择牌放到%s的牌库底 -lblChooseCardPutOnTargetLibarayTop=选择牌放到%s的牌库顶 +lblChooseACardToLeaveTargetLibraryTop=选择一张牌离开{0}的牌库顶 +lblChooseACardLeaveTarget=选择一张牌离开{0}的{1} +lblChooseCardsPutIntoZone=选择牌放到{0} +lblChooseCardPutOnTargetLibarayBottom=选择牌放到{0}的牌库底 +lblChooseCardPutOnTargetLibarayTop=选择牌放到}0的牌库顶 +lblPlayerPickedCardFrom={0}选择了牌自 lblNoValidCards=没有有效的牌 -lblThisCard=这张牌 -lblTheseCards=这些牌 #DigUntilEffect.java lblDoYouWantDigYourLibrary=你想要挖掘你的牌库吗? -lblDoYouWantPutCardTo=你想把这张牌放到 +lblDoYouWantPutCardToZone=你想把这张牌放到{0}吗? #DiscardEffect.java lblWouldYouLikeRandomDiscardTargetCard=你想随机弃掉%d张牌吗? -lblHasChosen=选择了 +lblPlayerHasChosenCardsFrom={0}选择了牌自 #DrawEffect.java -lblDoYouWantDraw=你想抓 +lblDoYouWantDrawCards=你想抓{0}张牌吗? lblHowMayCardDoYouWantDraw=你想怎么抓牌? #EncodeEffect.java -lblAndEncodeOntoAYouControlCreature=和赋码到你控制的生物? +lblDoYouWantExileCardAndEncodeOntoYouCreature=你想放逐{0}并将之赋码到你控制的生物吗? lblChooseACreatureYouControlToEncode=选择你控制的生物进场赋码 -lblEncoding=已赋码 #ExploreEffect.java lblRevealedForExplore=勘察所展示 lblPutThisCardToYourGraveyard=把这张牌放到你的坟墓场? @@ -1768,25 +1765,25 @@ lblLifeTotal=生命总数 #ManaEffect.java lblDoYouWantAddMana=你想增加法术力吗? lblSelectManaProduce=选择要产出的法术力 -lblChooseSingleColorFrom=选择一种颜色自 +lblChooseSingleColorFromTarget=从{0}选择一种颜色 #ManifestEffect.java lblChooseCardToManifest=选择要显化的牌 #MeldEffect.java lblChooseCardToMeld=选择要融合的牌 #MillEffect.java -lblDoYouWantPutLibraryCardsTo=你想要从牌库中把牌放入 +lblDoYouWantPutLibraryCardsTo=你想要从牌库中把牌放入{0}吗? #MultiplePilesEffect.java -lblChooseCardsInPile=选择一堆卡 +lblChooseCardsInTargetPile=选择堆{0}中的牌? #PeekAndRevealEffect.java lblRevealingCardFrom=展示牌自 -lblRevealCardToOtherPlayers=想其他玩家展示牌? +lblRevealCardToOtherPlayers=向其他玩家展示牌? #PlayEffect.java -lblChooseUpTo=选择最多 +lblChooseUpTo=最多选择 lblSelectCardToPlay=选择要使用的牌 #ProtectAllEffect.java lblChooseAProtection=选择一个保护 #PumpEffect.java -lblApplyPumpTo=将pump用于 +lblApplyPumpToTarget=将pump用于{0}? #RearrangeTopOfLibraryEffect.java lblDoyouWantShuffleTheLibrary=你想要洗这个牌库吗? #RepeatEffect.java @@ -1794,22 +1791,20 @@ lblDoYouWantRepeatProcessAgain=你是否想再次重复这个过程? #RevealHandEffect.java lblDoYouWantRevealYourHand=你想展示你的手牌吗? #RollPlanarDiceEffect.java -lblRolled=已掷骰 +lblPlayerRolledResult={0}掷骰结果为{1} #SacrificeEffect.java lblDoYouWantPayEcho=你想支付返响费用 lblPayEcho=支付返响费用 lblDoYouWantSacrifice=你想牺牲吗? -lblSacrifice=牺牲 -lblDestroys=消灭 #SetStateEffect.java lblFaceDownCardCantTurnFaceUp=面朝下的牌不能面朝上 #ShuffleEffect.java -lblHaveTargetShuffle=%s洗牌了吗? +lblHaveTargetShuffle={0}洗牌了吗? #SurveilEffect.java lblDoYouWantSurveil=你想刺探吗? #TapOrUntapAllEffect.java lblPermanents=永久物 -lblTapOrUntap=横置或重置 +lblTapOrUntapTarget=横置还是重置{0}? #TwoPilesEffect.java lblSelectCardForFaceDownPile=选择一个面朝下的堆 lblDivideCardIntoTwoPiles=将牌分为两堆 From 80c6e306915c7f64f02ee19bef0fddb61ecfc600 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 27 Dec 2019 08:59:54 -0500 Subject: [PATCH 51/64] 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 52/64] 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 f20e61520b5644e2282066e7b8aec09ae3beda55 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Sat, 28 Dec 2019 20:06:51 +0800 Subject: [PATCH 53/64] update translation text to use have placeholder string --- .../src/main/java/forge/player/HumanPlay.java | 34 +++---- .../forge/player/PlayerControllerHuman.java | 90 +++++++++++-------- 2 files changed, 72 insertions(+), 52 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 26d3734bb17..de51420b4b5 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -25,7 +25,6 @@ import forge.match.input.InputPayMana; import forge.match.input.InputPayManaOfCostPayment; import forge.match.input.InputPayManaSimple; import forge.match.input.InputSelectCardsFromList; -import forge.util.Lang; import forge.util.TextUtil; import forge.util.collect.FCollectionView; import forge.util.gui.SGuiChoose; @@ -312,7 +311,7 @@ public class HumanPlay { return false; } - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantPay") + " " + amount + " " + Localizer.getInstance().getMessage("lblLife") + "?" + orString, sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantPayNLife", String.valueOf(amount)) + orString, sourceAbility)) { return false; } @@ -332,11 +331,15 @@ public class HumanPlay { return false; } - 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); + String message = null; + if (res.contains(p)) { + message = Localizer.getInstance().getMessage("lblDoYouWantLetThatPlayerDrawNCardOrDoAction", String.valueOf(amount), orString); + } + else { + message = Localizer.getInstance().getMessage("lblDoYouWantDrawNCardOrDoAction", String.valueOf(amount), orString); + } - if (!p.getController().confirmPayment(part, sb.toString(), sourceAbility)) { + if (!p.getController().confirmPayment(part, message, sourceAbility)) { return false; } @@ -370,7 +373,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, Localizer.getInstance().getMessage("lbllblDoYouWantMill") + " " + amount + " " + Localizer.getInstance().getMessage("lblCard") + (amount == 1 ? "" : "s") + "?" + orString, sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantMillNCardsOrDoAction", String.valueOf(amount), orString), sourceAbility)) { return false; } CardCollectionView listmill = p.getCardsIn(ZoneType.Library, amount); @@ -378,7 +381,7 @@ public class HumanPlay { } else if (part instanceof CostFlipCoin) { final int amount = getAmountFromPart(part, source, sourceAbility); - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantFlip") + " " + amount + " " + Localizer.getInstance().getMessage("lblCoin") + (amount == 1 ? "" : "s") + "?" + orString, sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantFlipNCoinOrDoAction", String.valueOf(amount), orString), sourceAbility)) { return false; } final int n = FlipCoinEffect.getFilpMultiplier(p); @@ -412,7 +415,7 @@ public class HumanPlay { } if (!mandatory) { - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantRemove") + " " + Lang.nounWithAmount(amount, counterType.getName() + " " + Localizer.getInstance().getMessage("lblCounterOfPointer")) + " " + Localizer.getInstance().getMessage("lblFrom") + " " + source + "?",sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantRemoveNTargetTypeCounterFromCard", String.valueOf(amount), counterType.getName(), source), sourceAbility)) { return false; } } @@ -432,7 +435,7 @@ public class HumanPlay { if (allCounters < amount) { return false; } if (!mandatory) { - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantRemoveCounters") + " " + part.getDescriptiveType() + " ?",sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantRemoveCountersFromCard", part.getDescriptiveType()), sourceAbility)) { return false; } } @@ -492,8 +495,7 @@ public class HumanPlay { return false; } if (from == ZoneType.Library) { - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantExile") + " " + nNeeded + - " " + Localizer.getInstance().getMessage("lblCard") + (nNeeded == 1 ? "" : "s") + " " + Localizer.getInstance().getMessage("lblFromYourLibrary"), sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantExileNCardsFromYourLibrary", String.valueOf(nNeeded)), sourceAbility)) { return false; } list = list.subList(0, nNeeded); @@ -502,7 +504,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(Localizer.getInstance().getMessage("lblExileFrom") + " " + from, CardView.getCollection(list))); + final Card c = p.getGame().getCard(SGuiChoose.oneOrNone(Localizer.getInstance().getMessage("lblExileFromZone", from.toString()), CardView.getCollection(list))); if (c == null) { return false; } @@ -538,7 +540,7 @@ public class HumanPlay { payableZone.add(player); } } - Player chosen = controller.getGame().getPlayer(SGuiChoose.oneOrNone(TextUtil.concatNoSpace(Localizer.getInstance().getMessage("lblPutCardFromWhose") + " ", from.toString(), "?"), PlayerView.getCollection(payableZone))); + Player chosen = controller.getGame().getPlayer(SGuiChoose.oneOrNone(Localizer.getInstance().getMessage("lblPutCardFromWhoseZone", from.toString()), PlayerView.getCollection(payableZone))); if (chosen == null) { return false; } @@ -629,7 +631,7 @@ public class HumanPlay { } if (!mandatory) { - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantSpend") + " " + Lang.nounWithAmount(amount, counterType.getName() + " " + Localizer.getInstance().getMessage("lblCounterOfPointer")) + "?",sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantSpendNTargetTypeCounter", String.valueOf(amount), counterType.getName()), sourceAbility)) { return false; } } @@ -675,7 +677,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(Localizer.getInstance().getMessage("lblSelectOfCardsTo") + " %d " + cpl.getDescriptiveType() + " " + Localizer.getInstance().getMessage("lblCardsTo") + " " + actionName); + inp.setMessage(Localizer.getInstance().getMessage("lblSelectNSpecifyTypeCardsToAction", cpl.getDescriptiveType(), actionName)); inp.setCancelAllowed(true); inp.showAndWait(); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 6d320a4ffdb..29e7cbb0a82 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -246,10 +246,10 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (newMain != null) { String errMsg; if (newMain.size() < deckMinSize) { - errMsg = TextUtil.concatNoSpace(localizer.getMessage("lblTooFewCardsMainDeck").replace("%s", String.valueOf(deckMinSize))); + errMsg = TextUtil.concatNoSpace(localizer.getMessage("lblTooFewCardsMainDeck", String.valueOf(deckMinSize))); } else { - errMsg = TextUtil.concatNoSpace(localizer.getMessage("lblTooManyCardsSideboard").replace("%s", String.valueOf(sbMax))); + errMsg = TextUtil.concatNoSpace(localizer.getMessage("lblTooManyCardsSideboard", String.valueOf(sbMax))); } getGui().showErrorDialog(errMsg, localizer.getMessage("lblInvalidDeck")); } @@ -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("lblChooseAnnounceFor").replace("%s", announce).replace("%name", ability.getHostCard().getName()) , min, + return getGui().getInteger(localizer.getMessage("lblChooseAnnounceForCard", announce, ability.getHostCard().getName()) , min, Integer.MAX_VALUE, min + 9); } @@ -336,14 +336,16 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return CardCollection.EMPTY; } - final StringBuilder builder = new StringBuilder(localizer.getMessage("lblSelectOfCardsTo") + " "); + String inpMessage = null; if (min == 0) { - builder.append(localizer.getMessage("lblUpTo") + " "); + inpMessage = localizer.getMessage("lblSelectUpToNumTargetToAction", message, action); + } + else { + inpMessage = localizer.getMessage("lblSelectNumTargetToAction", message, action); } - 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()); + inp.setMessage(inpMessage); inp.setCancelAllowed(min == 0); inp.showAndWait(); return new CardCollection(inp.getSelected()); @@ -654,17 +656,25 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public Player chooseStartingPlayer(final boolean isFirstGame) { if (game.getPlayers().size() == 2) { - String prompt = String.format( - isFirstGame ? localizer.getMessage("lblYouHaveWonTheCoinToss") : localizer.getMessage("lblYouLostTheLastGame"), - player.getName()); + String prompt = null; + if (isFirstGame) { + prompt = localizer.getMessage("lblYouHaveWonTheCoinToss", player.getName()); + } + else { + prompt = localizer.getMessage("lblYouLostTheLastGame", player.getName()); + } prompt += "\n\n" + localizer.getMessage("lblWouldYouLiketoPlayorDraw"); final InputConfirm inp = new InputConfirm(this, prompt, localizer.getMessage("lblPlay"), localizer.getMessage("lblDraw")); inp.showAndWait(); return inp.getResult() ? this.player : this.player.getOpponents().get(0); } else { - String prompt = String.format( - isFirstGame ? localizer.getMessage("lblYouHaveWonTheCoinToss") : localizer.getMessage("lblYouLostTheLastGame"), - player.getName()); + String prompt = null; + if (isFirstGame) { + prompt = localizer.getMessage("lblYouHaveWonTheCoinToss", player.getName()); + } + else { + prompt = localizer.getMessage("lblYouLostTheLastGame", player.getName()); + } prompt += "\n\n" + localizer.getMessage("lblWhoWouldYouLiketoStartthisGame"); final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList<>(this, 1, 1, new FCollection<>(game.getPlayersInTurnOrder())); @@ -678,7 +688,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public CardCollection orderBlockers(final Card attacker, final CardCollection blockers) { final CardView vAttacker = CardView.get(attacker); getGui().setPanelSelection(vAttacker); - return game.getCardList(getGui().order(localizer.getMessage("lblChooseDamageOrderFor").replace("%s", vAttacker.toString()), localizer.getMessage("lblDamagedFirst"), + return game.getCardList(getGui().order(localizer.getMessage("lblChooseDamageOrderFor", vAttacker.toString()), localizer.getMessage("lblDamagedFirst"), CardView.getCollection(blockers), vAttacker)); } @@ -703,7 +713,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final CardView vAttacker = CardView.get(attacker); getGui().setPanelSelection(vAttacker); return game.getCardList(getGui().insertInList( - localizer.getMessage("lblChooseBlockerAfterWhichToPlaceAttackert").replace("%s", vAttacker.toString()), + localizer.getMessage("lblChooseBlockerAfterWhichToPlaceAttackert", vAttacker.toString()), CardView.get(blocker), CardView.getCollection(oldBlockers))); } @@ -711,7 +721,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public CardCollection orderAttackers(final Card blocker, final CardCollection attackers) { final CardView vBlocker = CardView.get(blocker); getGui().setPanelSelection(vBlocker); - return game.getCardList(getGui().order(localizer.getMessage("lblChooseDamageOrderFor").replace("%s", vBlocker.toString()), localizer.getMessage("lblDamagedFirst"), + return game.getCardList(getGui().order(localizer.getMessage("lblChooseDamageOrderFor", vBlocker.toString()), localizer.getMessage("lblDamagedFirst"), CardView.getCollection(attackers), vBlocker)); } @@ -723,9 +733,9 @@ 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 = localizer.getMessage("lblLookingCardIn") + " {player's} " + zone.name().toLowerCase(); + message = localizer.getMessage("lblLookCardInPlayerZone", "{player's}", zone.name().toLowerCase()); } else { - message += "{player's} " + zone.name().toLowerCase(); + message += localizer.getMessage("lblPlayerZone", "{player's}", zone.name().toLowerCase()); } final String fm = MessageUtil.formatMessage(message, getLocalPlayerView(), owner); if (!cards.isEmpty()) { @@ -733,7 +743,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont getGui().reveal(fm, cards); endTempShowCards(); } else { - getGui().message(MessageUtil.formatMessage(localizer.getMessage("lblThereNoCardIn") + " {player's} " + zone.name().toLowerCase(), + getGui().message(MessageUtil.formatMessage(localizer.getMessage("lblThereNoCardInPlayerZone", "{player's}", zone.name().toLowerCase()), player, owner), fm); } } @@ -809,7 +819,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShowCard(c); getGui().setCard(view); boolean result = false; - result = InputConfirm.confirm(this, view, TextUtil.concatNoSpace(localizer.getMessage("lblPut") + " ", view.toString(), " " + localizer.getMessage("lblOnTheTopLibraryOrGraveyard")), + result = InputConfirm.confirm(this, view, localizer.getMessage("lblPutCardsOnTheTopLibraryOrGraveyard", view.toString()), true, ImmutableList.of(localizer.getMessage("lblLibrary"), localizer.getMessage("lblGraveyard"))); if (result) { toTop = topN; @@ -841,7 +851,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont getGui().setCard(c.getView()); boolean result = false; - result = InputConfirm.confirm(this, view, localizer.getMessage("lblPutCardOnTopOrBottomLibrary").replace("%s", view.toString()), + result = InputConfirm.confirm(this, view, localizer.getMessage("lblPutCardOnTopOrBottomLibrary", view.toString()), true, ImmutableList.of(localizer.getMessage("lblTop"), localizer.getMessage("lblBottom"))); endTempShowCards(); @@ -1003,7 +1013,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return super.hasAllTargets(); } }; - target.setMessage(localizer.getMessage("lblSelectNCardsToDiscardUnlessDiscarduType").replace("%s", uType)); + target.setMessage(localizer.getMessage("lblSelectNCardsToDiscardUnlessDiscarduType", uType)); target.showAndWait(); return new CardCollection(target.getSelected()); } @@ -1019,8 +1029,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final List options = Lists.newArrayList(); 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()), - " " + localizer.getMessage("lblManaFrom") + " ", m.getSourceCard().toString())); + options.add(localizer.getMessage("lblNColorManaFromCard", String.valueOf(1 + i), MagicColor.toLongString(m.getColor()), m.getSourceCard().toString())); } final String chosen = getGui().one(localizer.getMessage("lblPayManaFromManaPool"), options); final String idx = TextUtil.split(chosen, '.')[0]; @@ -1044,9 +1053,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont sortCreatureTypes(types); } if (isOptional) { - return getGui().oneOrNone(localizer.getMessage("lblChooseATargetType").replace("%s", kindOfType.toLowerCase()), types); + return getGui().oneOrNone(localizer.getMessage("lblChooseATargetType", kindOfType.toLowerCase()), types); } - return getGui().one(localizer.getMessage("lblChooseATargetType").replace("%s", kindOfType.toLowerCase()), types); + return getGui().one(localizer.getMessage("lblChooseATargetType", kindOfType.toLowerCase()), types); } // sort creature types such that those most prevalent in player's deck are @@ -1317,7 +1326,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } }; final String message = localizer.getMessage("lblCleanupPhase") + "\n" - + localizer.getMessage("lblSelectCardsToDiscardHandDownMaximum").replace("%d", String.valueOf(nDiscard)).replace("%max", String.valueOf(max)); + + localizer.getMessage("lblSelectCardsToDiscardHandDownMaximum", String.valueOf(nDiscard), String.valueOf(max)); inp.setMessage(message); inp.setCancelAllowed(false); inp.showAndWait(); @@ -1486,8 +1495,7 @@ 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(), " " + localizer.getMessage("lblActivated") + " ", - sa.getHostCard().toString(), " - " + localizer.getMessage("lblChooseAMode")); + final String modeTitle = localizer.getMessage("PlayerActivatedCardChooseMode", sa.getActivatingPlayer().toString(), sa.getHostCard().toString()); final List chosen = Lists.newArrayListWithCapacity(num); for (int i = 0; i < num; i++) { SpellAbilityView a; @@ -1770,7 +1778,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 + " " + localizer.getMessage("lblFrom") + " " + Lang.getPossessedObject(MessageUtil.mayBeYou(player, p), localizer.getMessage("lblDeck")), + getGui().reveal(localizer.getMessage("lblActionFromPlayerDeck", message, Lang.getPossessedObject(MessageUtil.mayBeYou(player, p), "")), ImmutableList.copyOf(removedAnteCards.get(p))); } } @@ -2356,11 +2364,21 @@ 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 ? localizer.getMessage("lblIn") + " " + targetZone.name().toLowerCase() - : noTriggers ? localizer.getMessage("lblOnTheBattlefield") : localizer.getMessage("lblOnTheStackOrInPlay"); + String message = null; + if (targetZone != ZoneType.Battlefield) { + message = localizer.getMessage("lblPutCardInWhichPlayerZone", targetZone.name().toLowerCase()); + } + else { + if (noTriggers) { + message = localizer.getMessage("lblPutCardInWhichPlayerBattlefield"); + } + else { + message = localizer.getMessage("lblPutCardInWhichPlayerPlayOrStack"); + } + } final Player p = repeatLast ? lastAddedPlayer - : game.getPlayer(getGui().oneOrNone(localizer.getMessage("lblPutCard") + " " + zoneStr + " " + localizer.getMessage("lblForWhichPlayer"), + : game.getPlayer(getGui().oneOrNone(message, PlayerView.getCollection(game.getPlayers()))); if (p == null) { return; @@ -2391,7 +2409,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont lastSummoningSickness = true; } else { lastSummoningSickness = getGui().confirm(forgeCard.getView(), - TextUtil.concatWithSpace(localizer.getMessage("lblShould"), forgeCard.toString(), localizer.getMessage("lblAffectedWithSummoningSickness"))); + localizer.getMessage("lblCardShouldBeSummoningSicknessConfirm", forgeCard.toString())); } } } @@ -2440,8 +2458,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } else if (targetZone == ZoneType.Library) { if (!repeatLast) { - lastTopOfTheLibrary = getGui().confirm(forgeCard.getView(), - TextUtil.concatWithSpace(localizer.getMessage("lblShould"), forgeCard.toString(), localizer.getMessage("lblBeAddedToLibraryTopOrBottom")), true, Arrays.asList(localizer.getMessage("lblTop"), localizer.getMessage("lblBottom"))); + lastTopOfTheLibrary = getGui().confirm(forgeCard.getView(), localizer.getMessage("lblCardShouldBeAddedToLibraryTopOrBottom", forgeCard.toString()), + true, Arrays.asList(localizer.getMessage("lblTop"), localizer.getMessage("lblBottom"))); } if (lastTopOfTheLibrary) { game.getAction().moveToLibrary(forgeCard, null); From f4ba889c84eb7d0439cf136875c64a375a6deafc Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Sat, 28 Dec 2019 20:07:03 +0800 Subject: [PATCH 54/64] update translation --- forge-gui/res/languages/de-DE.properties | 78 +++++++++++------------ forge-gui/res/languages/en-US.properties | 78 +++++++++++------------ forge-gui/res/languages/es-ES.properties | 78 +++++++++++------------ forge-gui/res/languages/zh-CN.properties | 80 +++++++++++------------- 4 files changed, 149 insertions(+), 165 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 719854ff135..d948c27b962 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1113,14 +1113,14 @@ lblSelectBlocker=Select creatures to block lblOrSelectBlockTarget= or select another attacker to declare blockers for. lblMorph=Morph #PlayerControllerHuman.java -lblYouHaveWonTheCoinToss=%s, du hast den Münzwurf gewonnen. -lblYouLostTheLastGame=%s, du hast das letzte Spiel verloren. +lblYouHaveWonTheCoinToss={0}, du hast den Münzwurf gewonnen. +lblYouLostTheLastGame={0}, du hast das letzte Spiel verloren. lblWouldYouLiketoPlayorDraw=Willst du lieber zuerst spielen oder ziehen? lblWhoWouldYouLiketoStartthisGame=Wer soll das Spiel beginnen? (Klicke auf das Portrait.) lblPlay=Spielen lblDraw=Ziehen -lblTooFewCardsMainDeck=Zu wenig Karten in deinem Deck (mindestens %s). Bitte passe dein Deck an. -lblTooManyCardsSideboard=Zu viele Karten in deinem Deck (maximal %s). Bitte passe dein Deck an. +lblTooFewCardsMainDeck=Zu wenig Karten in deinem Deck (mindestens {0}). Bitte passe dein Deck an. +lblTooManyCardsSideboard=Zu viele Karten in deinem Deck (maximal {0}). Bitte passe dein Deck an. lblAssignCombatDamageWerentBlocked=Möchtest du den Kampfschaden deklarieren, als wäre nicht geblockt worden? lblChosenCards=Wähle Karten lblAttacker=Angreifer @@ -1169,15 +1169,15 @@ lblSelectCardsToBePutIntoTheGraveyard=Wähle Karten, welche auf den Friedhof gel lblCardsToPutInTheGraveyard=Karten, welche auf den Friedhof gelegt werden sollen lblDiscardUpToNCards=Werfe bis zu %d Karte(n) ab lblDiscardNCards=Werfe %d Karte(n) ab -lblSelectNCardsToDiscardUnlessDiscarduType=Wähle bis zu %d Karte(n) zum abwerfen, außer du wirfst eine %s ab. +lblSelectNCardsToDiscardUnlessDiscarduType=Wähle bis zu %d Karte(n) zum abwerfen, außer du wirfst eine {0} ab. lblCleanupPhase=Aufräumphase -lblSelectCardsToDiscardHandDownMaximum=Werfe %d Karte(n) ab um dein Handmaximum von %max Karte(n) zu erfüllen. +lblSelectCardsToDiscardHandDownMaximum=Werfe {0} Karte(n) ab um dein Handmaximum von {1} Karte(n) zu erfüllen. lblChooseMinCardToDiscard=Wähle %d Karte(n) zm Abwerfen lblDiscarded=Abgeworfen -lblChooseDamageOrderFor=Wähle Schadensreihenfolge für %s +lblChooseDamageOrderFor=Wähle Schadensreihenfolge für {0} lblDamagedFirst=Zuerst geschädigt -lblChooseBlockerAfterWhichToPlaceAttackert=Wähle Blocker für Platz %s in der Schadensreihenfolge; Abbrechen für ersten Platz -lblPutCardOnTopOrBottomLibrary=Lege %s auf oder unter deine Bibliothek? +lblChooseBlockerAfterWhichToPlaceAttackert=Wähle Blocker für Platz {0} in der Schadensreihenfolge; Abbrechen für ersten Platz +lblPutCardOnTopOrBottomLibrary=Lege {0} auf oder unter deine Bibliothek? lblChooseOrderCardsPutIntoLibrary=Wähle die Reihenfolge der Karten, in der sie in die Bibliothek gelegt werden lblClosestToTop=Zuoberst lblChooseOrderCardsPutOntoBattlefield=Wähle die Reihenfolge der Karten, in der sie auf das Spielfeld gebracht werden @@ -1190,20 +1190,20 @@ 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 +lblSelectUpToNumTargetToAction=Select up to %d {0}(s) to {1}. +lblSelectNumTargetToAction=Select %d {0}(s) to {1}. 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? +lblThereNoCardInPlayerZone=There are no cards in {0} {1} +lblPutCardsOnTheTopLibraryOrGraveyard=Put {0} on the top of library or graveyard? lblLibrary=Library lblGraveyard=Graveyard lblTop=Top lblBottom=Bottom -lblManaFrom=mana from +lblNColorManaFromCard={0} {1} mana from {2} lblPayManaFromManaPool=Pay Mana from Mana Pool -lblChooseATargetType=Choose a %s type +lblChooseATargetType=Choose a {0} type lblUntap=Untap lblOdds=Odds lblEvens=Evens @@ -1217,21 +1217,17 @@ 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 +lblPlayerActivatedCardChooseMode={0} activated {1} - Choose a mode 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? +lblPutCardInWhichPlayerZone=Put card in {0} for which player? +lblPutCardInWhichPlayerBattlefield=Put card on the battlefield for which player? +lblPutCardInWhichPlayerPlayOrStack=Put card on the stack / in play for which player? +lblCardShouldBeSummoningSicknessConfirm=Should {0} be affected with Summoning Sickness? +lblCardShouldBeAddedToLibraryTopOrBottom=Should {0} 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? @@ -1245,8 +1241,11 @@ 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 +lblChooseAnnounceForCard=Choose {0} for {1} lblSacrifice=Sacrifice +lblLookCardInPlayerZone=Looking at cards in {0} {1} +lblPlayerZone={0} {1} +lblActionFromPlayerDeck={0} from {1} Deck #AbstractGuiGame.java lblConcedeCurrentGame=Das Spiel wird als verloren gewertet.\n\nTrotzdem aufgeben? lblConcedeTitle=Spiel verloren geben? @@ -1592,24 +1591,22 @@ lblSelectOrder=Select Order lblIfYouDo=if you do lblOr=or lblDoYouWantPay=Do you want to pay +lblDoYouWantPayNLife=Do you want to pay {0} life? 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 +lblDoYouWantMillNCardsOrDoAction=Do you want to mill {0} card(s)? {1} +lblDoYouWantFlipNCoinOrDoAction=Do you want to flip {0} coin(s)? {1} +lblDoYouWantRemoveNTargetTypeCounterFromCard=Do you want to remove {0} {1} counter from {2}? +lblDoYouWantRemoveCountersFromCard=Do you want to remove counters from {0}? +lblDoYouWantExileNCardsFromYourLibrary=Do you want to exile {0} card(s) from your library? 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? +lblDoYouWantSpendNTargetTypeCounter=Do you want to spend {0} {1} counter? +lblDoYouWantLetThatPlayerDrawNCardOrDoAction=Do you want to let that player draw {0} card(s)?{1} +lblDoYouWantDrawNCardOrDoAction=Do you want to draw {0} card(s)?{1} lblSelectRemoveCounterCard=Select a card to remove a counter lblSelectRemoveCounterType=Select type counters to remove -lblExileFrom=Exile from -lblPutCardFromWhose=Put cards from whose +lblExileFromZone=Exile from {0} +lblPutCardFromWhoseZone=Put cards from whose {0}? lblPutCardToLibrary=Put cards to Library lblPutIntoLibrary=put into library. lblGainControl=gain control. @@ -1618,8 +1615,7 @@ lbldiscard=discard. lblReveal=reveal lblTap=tap lblCurrentCard=Current Card -lblSelectOfCardsTo=Select -lblCardsTo=card(s) to +lblSelectNSpecifyTypeCardsToAction=Select %d {0} card(s) to {1} #AbandonEffect.java lblWouldYoulikeAbandonSource=Would you like to abandon the scheme {0}? #ActivateAbilityEffect.java diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 93ad087dea7..69100b0cc8b 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1113,14 +1113,14 @@ lblSelectBlocker=Select creatures to block lblOrSelectBlockTarget= or select another attacker to declare blockers for. lblMorph=Morph #PlayerControllerHuman.java -lblYouHaveWonTheCoinToss=%s, you have won the coin toss. -lblYouLostTheLastGame=%s, you lost the last game. +lblYouHaveWonTheCoinToss={0}, you have won the coin toss. +lblYouLostTheLastGame={0}, you lost the last game. lblWouldYouLiketoPlayorDraw=Would you like to play or draw? lblWhoWouldYouLiketoStartthisGame=Who would you like to start this game? (Click on the portrait.) lblPlay=Play lblDraw=Draw -lblTooFewCardsMainDeck=Too few cards in your main deck (minimum %s), please make modifications to your deck again. -lblTooManyCardsSideboard=Too many cards in your sideboard (maximum %s), please make modifications to your deck again. +lblTooFewCardsMainDeck=Too few cards in your main deck (minimum {0}), please make modifications to your deck again. +lblTooManyCardsSideboard=Too many cards in your sideboard (maximum {0}), please make modifications to your deck again. lblAssignCombatDamageWerentBlocked=Do you want to assign its combat damage as though it weren't blocked? lblChosenCards=Chosen Cards lblAttacker=Attacker @@ -1169,15 +1169,15 @@ lblSelectCardsToBePutIntoTheGraveyard=Select cards to be put into the graveyard lblCardsToPutInTheGraveyard=Cards to put in the graveyard lblDiscardUpToNCards=Discard up to %d card(s) lblDiscardNCards=Discard %d card(s) -lblSelectNCardsToDiscardUnlessDiscarduType=Select %d card(s) to discard, unless you discard a %s. +lblSelectNCardsToDiscardUnlessDiscarduType=Select %d card(s) to discard, unless you discard a {0}. lblCleanupPhase=Cleanup Phase -lblSelectCardsToDiscardHandDownMaximum=Select %d card(s) to discard to bring your hand down to the maximum of %max cards. +lblSelectCardsToDiscardHandDownMaximum=Select {0} card(s) to discard to bring your hand down to the maximum of {1} cards. lblChooseMinCardToDiscard=Choose %d card(s) to discard lblDiscarded=Discarded -lblChooseDamageOrderFor=Choose Damage Order for %s +lblChooseDamageOrderFor=Choose Damage Order for {0} lblDamagedFirst=Damaged First -lblChooseBlockerAfterWhichToPlaceAttackert=Choose blocker after which to place %s in damage order; cancel to place it first -lblPutCardOnTopOrBottomLibrary=Put %s on the top or bottom of your library? +lblChooseBlockerAfterWhichToPlaceAttackert=Choose blocker after which to place {0} in damage order; cancel to place it first +lblPutCardOnTopOrBottomLibrary=Put {0} on the top or bottom of your library? lblChooseOrderCardsPutIntoLibrary=Choose order of cards to put into the library lblClosestToTop=Closest to top lblChooseOrderCardsPutOntoBattlefield=Choose order of cards to put onto the battlefield @@ -1190,20 +1190,20 @@ lblChooseOrderCopiesCast=Choose order of copies to cast lblDelveHowManyCards=Delve how many cards? lblExileWhichCard=Exile which card? lblDestroy=destroy -lblUpTo=up to +lblSelectUpToNumTargetToAction=Select up to %d {0}(s) to {1}. +lblSelectNumTargetToAction=Select %d {0}(s) to {1}. 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? +lblThereNoCardInPlayerZone=There are no cards in {0} {1} +lblPutCardsOnTheTopLibraryOrGraveyard=Put {0} on the top of library or graveyard? lblLibrary=Library lblGraveyard=Graveyard lblTop=Top lblBottom=Bottom -lblManaFrom=mana from +lblNColorManaFromCard={0} {1} mana from {2} lblPayManaFromManaPool=Pay Mana from Mana Pool -lblChooseATargetType=Choose a %s type +lblChooseATargetType=Choose a {0} type lblUntap=Untap lblOdds=Odds lblEvens=Evens @@ -1217,21 +1217,17 @@ 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 +lblPlayerActivatedCardChooseMode={0} activated {1} - Choose a mode 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? +lblPutCardInWhichPlayerZone=Put card in {0} for which player? +lblPutCardInWhichPlayerBattlefield=Put card on the battlefield for which player? +lblPutCardInWhichPlayerPlayOrStack=Put card on the stack / in play for which player? +lblCardShouldBeSummoningSicknessConfirm=Should {0} be affected with Summoning Sickness? +lblCardShouldBeAddedToLibraryTopOrBottom=Should {0} 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? @@ -1245,8 +1241,11 @@ 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 +lblChooseAnnounceForCard=Choose {0} for {1} lblSacrifice=Sacrifice +lblLookCardInPlayerZone=Looking at cards in {0} {1} +lblPlayerZone={0} {1} +lblActionFromPlayerDeck={0} from {1} Deck #AbstractGuiGame.java lblConcedeCurrentGame=This will concede the current game and you will lose.\n\nConcede anyway? lblConcedeTitle=Concede Game? @@ -1592,24 +1591,22 @@ lblSelectOrder=Select Order lblIfYouDo=if you do lblOr=or lblDoYouWantPay=Do you want to pay +lblDoYouWantPayNLife=Do you want to pay {0} life? 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 +lblDoYouWantMillNCardsOrDoAction=Do you want to mill {0} card(s)? {1} +lblDoYouWantFlipNCoinOrDoAction=Do you want to flip {0} coin(s)? {1} +lblDoYouWantRemoveNTargetTypeCounterFromCard=Do you want to remove {0} {1} counter from {2}? +lblDoYouWantRemoveCountersFromCard=Do you want to remove counters from {0}? +lblDoYouWantExileNCardsFromYourLibrary=Do you want to exile {0} card(s) from your library? 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? +lblDoYouWantSpendNTargetTypeCounter=Do you want to spend {0} {1} counter? +lblDoYouWantLetThatPlayerDrawNCardOrDoAction=Do you want to let that player draw {0} card(s)?{1} +lblDoYouWantDrawNCardOrDoAction=Do you want to draw {0} card(s)?{1} lblSelectRemoveCounterCard=Select a card to remove a counter lblSelectRemoveCounterType=Select type counters to remove -lblExileFrom=Exile from -lblPutCardFromWhose=Put cards from whose +lblExileFromZone=Exile from {0} +lblPutCardFromWhoseZone=Put cards from whose {0}? lblPutCardToLibrary=Put cards to Library lblPutIntoLibrary=put into library. lblGainControl=gain control. @@ -1618,8 +1615,7 @@ lbldiscard=discard. lblReveal=reveal lblTap=tap lblCurrentCard=Current Card -lblSelectOfCardsTo=Select -lblCardsTo=card(s) to +lblSelectNSpecifyTypeCardsToAction=Select %d {0} card(s) to {1} #AbandonEffect.java lblWouldYoulikeAbandonSource=Would you like to abandon the scheme {0}? #ActivateAbilityEffect.java diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index f269df2be2d..7001086b4f2 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1113,14 +1113,14 @@ lblSelectBlocker=Select creatures to block lblOrSelectBlockTarget= or select another attacker to declare blockers for. lblMorph=Morph #PlayerControllerHuman.java -lblYouHaveWonTheCoinToss=%s, has ganado el lanzamiento de la moneda. -lblYouLostTheLastGame=%s, perdiste la última partida. +lblYouHaveWonTheCoinToss={0}, has ganado el lanzamiento de la moneda. +lblYouLostTheLastGame={0}, perdiste la última partida. lblWouldYouLiketoPlayorDraw=¿Quieres jugar o ceder? lblWhoWouldYouLiketoStartthisGame=¿Quién te gustaría que empezara esta partida? (Haz clic en el retrato) lblPlay=Jugar lblDraw=Ceder -lblTooFewCardsMainDeck=Muy pocas cartas en tu mazo principal (mínimo %s), por favor realiza modificaciones a tu mazo de nuevo. -lblTooManyCardsSideboard=Demasiadas cartas en tu banquillo (máximo %s), por favor realiza modificaciones a tu mazo de nuevo. +lblTooFewCardsMainDeck=Muy pocas cartas en tu mazo principal (mínimo {0}), por favor realiza modificaciones a tu mazo de nuevo. +lblTooManyCardsSideboard=Demasiadas cartas en tu banquillo (máximo {0}), por favor realiza modificaciones a tu mazo de nuevo. lblAssignCombatDamageWerentBlocked=¿Quieres asignar su daño de combate como si no estuviera bloqueado? lblChosenCards=Cartas elegidas lblAttacker=Atacante @@ -1169,15 +1169,15 @@ lblSelectCardsToBePutIntoTheGraveyard=Selecciona las cartas para ponerlas en el lblCardsToPutInTheGraveyard=Cartas para poner en el Cementerio lblDiscardUpToNCards=Descarta hasta %d carta(s) lblDiscardNCards=Descarta %d carta(s) -lblSelectNCardsToDiscardUnlessDiscarduType=Selecciona %d carta(s) para descartar, a menos que descartes un %s. +lblSelectNCardsToDiscardUnlessDiscarduType=Selecciona %d carta(s) para descartar, a menos que descartes un {0}. lblCleanupPhase=Fase de Limpieza -lblSelectCardsToDiscardHandDownMaximum=Selecciona %d carta(s) a descartar para reducir tu mano al máximo de %max cartas. +lblSelectCardsToDiscardHandDownMaximum=Selecciona {0} carta(s) a descartar para reducir tu mano al máximo de {1} cartas. lblChooseMinCardToDiscard=Elige %d carta(s) para descartar lblDiscarded=Descartado -lblChooseDamageOrderFor=Selecciona el Orden de Daños para %s +lblChooseDamageOrderFor=Selecciona el Orden de Daños para {0} lblDamagedFirst=Dañado Primero -lblChooseBlockerAfterWhichToPlaceAttackert=Elige un bloqueador después del cual colocar %s en el orden de daño; cancela para colocarlo primero. -lblPutCardOnTopOrBottomLibrary=¿Poner %s en la parte superior o inferior de tu biblioteca? +lblChooseBlockerAfterWhichToPlaceAttackert=Elige un bloqueador después del cual colocar {0} en el orden de daño; cancela para colocarlo primero. +lblPutCardOnTopOrBottomLibrary=¿Poner {0} en la parte superior o inferior de tu biblioteca? lblChooseOrderCardsPutIntoLibrary=Elige el orden de las cartas para poner en la biblioteca lblClosestToTop=Más cerca de la parte superior lblChooseOrderCardsPutOntoBattlefield=Elige el orden de las cartas que quieres poner en el campo de batalla @@ -1190,20 +1190,20 @@ 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 +lblSelectUpToNumTargetToAction=Select up to %d {0}(s) to {1}. +lblSelectNumTargetToAction=Select %d {0}(s) to {1}. 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? +lblThereNoCardInPlayerZone=There are no cards in {0} {1} +lblPutCardsOnTheTopLibraryOrGraveyard=Put {0} on the top of library or graveyard? lblLibrary=Library lblGraveyard=Graveyard lblTop=Top lblBottom=Bottom -lblManaFrom=mana from +lblNColorManaFromCard={0} {1} mana from {2} lblPayManaFromManaPool=Pay Mana from Mana Pool -lblChooseATargetType=Choose a %s type +lblChooseATargetType=Choose a {0} type lblUntap=Untap lblOdds=Odds lblEvens=Evens @@ -1217,21 +1217,17 @@ 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 +lblPlayerActivatedCardChooseMode={0} activated {1} - Choose a mode 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? +lblPutCardInWhichPlayerZone=Put card in {0} for which player? +lblPutCardInWhichPlayerBattlefield=Put card on the battlefield for which player? +lblPutCardInWhichPlayerPlayOrStack=Put card on the stack / in play for which player? +lblCardShouldBeSummoningSicknessConfirm=Should {0} be affected with Summoning Sickness? +lblCardShouldBeAddedToLibraryTopOrBottom=Should {0} 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? @@ -1245,8 +1241,11 @@ 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 +lblChooseAnnounceForCard=Choose {0} for {1} lblSacrifice=Sacrifice +lblLookCardInPlayerZone=Looking at cards in {0} {1} +lblPlayerZone={0} {1} +lblActionFromPlayerDeck={0} from {1} Deck #AbstractGuiGame.java lblConcedeCurrentGame=Esto concederá la partida actual y perderás.\n\n¿Conceder de todos modos? lblConcedeTitle=¿Conceder Partida? @@ -1592,24 +1591,22 @@ lblSelectOrder=Select Order lblIfYouDo=if you do lblOr=or lblDoYouWantPay=Do you want to pay +lblDoYouWantPayNLife=Do you want to pay {0} life? 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 +lblDoYouWantMillNCardsOrDoAction=Do you want to mill {0} card(s)? {1} +lblDoYouWantFlipNCoinOrDoAction=Do you want to flip {0} coin(s)? {1} +lblDoYouWantRemoveNTargetTypeCounterFromCard=Do you want to remove {0} {1} counter from {2}? +lblDoYouWantRemoveCountersFromCard=Do you want to remove counters from {0}? +lblDoYouWantExileNCardsFromYourLibrary=Do you want to exile {0} card(s) from your library? 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? +lblDoYouWantSpendNTargetTypeCounter=Do you want to spend {0} {1} counter? +lblDoYouWantLetThatPlayerDrawNCardOrDoAction=Do you want to let that player draw {0} card(s)?{1} +lblDoYouWantDrawNCardOrDoAction=Do you want to draw {0} card(s)?{1} lblSelectRemoveCounterCard=Select a card to remove a counter lblSelectRemoveCounterType=Select type counters to remove -lblExileFrom=Exile from -lblPutCardFromWhose=Put cards from whose +lblExileFromZone=Exile from {0} +lblPutCardFromWhoseZone=Put cards from whose {0}? lblPutCardToLibrary=Put cards to Library lblPutIntoLibrary=put into library. lblGainControl=gain control. @@ -1618,8 +1615,7 @@ lbldiscard=discard. lblReveal=reveal lblTap=tap lblCurrentCard=Current Card -lblSelectOfCardsTo=Select -lblCardsTo=card(s) to +lblSelectNSpecifyTypeCardsToAction=Select %d {0} card(s) to {1} #AbandonEffect.java lblWouldYoulikeAbandonSource=Would you like to abandon the scheme {0}? #ActivateAbilityEffect.java diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 000126f77f9..872dd72bb41 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1113,14 +1113,14 @@ lblSelectBlocker=选择进行阻挡的生物 lblOrSelectBlockTarget= 或者为其他进攻者选择阻挡者。 lblMorph=变身 #PlayerControllerHuman.java -lblYouHaveWonTheCoinToss=%s,你赢得了这次掷硬币。 -lblYouLostTheLastGame=%s,最后一场比赛你输了。 +lblYouHaveWonTheCoinToss={0},你赢得了这次掷硬币。 +lblYouLostTheLastGame={0},最后一场比赛你输了。 lblWouldYouLiketoPlayorDraw=你想先手还是后手? lblWhoWouldYouLiketoStartthisGame=你想谁先开始游戏?(单击头像) lblPlay=先手 lblDraw=后手 -lblTooFewCardsMainDeck=主牌中卡牌数过少(最少为%s),请重新修改套牌。 -lblTooManyCardsSideboard=备牌中卡牌数过多(最多为%s),请重新修改套牌。 +lblTooFewCardsMainDeck=主牌中卡牌数过少(最少为{0}),请重新修改套牌。 +lblTooManyCardsSideboard=备牌中卡牌数过多(最多为{0}),请重新修改套牌。 lblAssignCombatDamageWerentBlocked=是否要像没有被阻挡一样分配战斗伤害? lblChosenCards=选择牌 lblAttacker=进攻者 @@ -1169,15 +1169,15 @@ lblSelectCardsToBePutIntoTheGraveyard=选择要放于坟场的卡牌 lblCardsToPutInTheGraveyard=放于坟场的卡牌 lblDiscardUpToNCards=最多弃%d张牌 lblDiscardNCards=弃%d张牌 -lblSelectNCardsToDiscardUnlessDiscarduType=选择要丢弃的%d张牌,除非你丢弃%s。 +lblSelectNCardsToDiscardUnlessDiscarduType=选择要丢弃的%d张牌,除非你丢弃{0}。 lblCleanupPhase=清除步骤 -lblSelectCardsToDiscardHandDownMaximum=选择要丢弃的%d张牌,以使你的手牌数量减少到%max张。 +lblSelectCardsToDiscardHandDownMaximum=选择要丢弃的{0}张牌,以使你的手牌数量减少到{1}张。 lblChooseMinCardToDiscard=选择%d张牌弃掉 lblDiscarded=弃牌 -lblChooseDamageOrderFor=选择%s造成伤害的顺序 +lblChooseDamageOrderFor=选择{0}造成伤害的顺序 lblDamagedFirst=先造成伤害 -lblChooseBlockerAfterWhichToPlaceAttackert=选择%s后造成伤害的阻挡者; cancel to place it first -lblPutCardOnTopOrBottomLibrary=将%s放到牌库顶还是底? +lblChooseBlockerAfterWhichToPlaceAttackert=选择{0}后造成伤害的阻挡者; cancel to place it first +lblPutCardOnTopOrBottomLibrary=将{0}放到牌库顶还是底? lblChooseOrderCardsPutIntoLibrary=选择要放入牌库中的牌的顺序 lblClosestToTop=最接近顶部 lblChooseOrderCardsPutOntoBattlefield=选择要放入战场中的牌的顺序 @@ -1190,20 +1190,20 @@ lblChooseOrderCopiesCast=选择要复制品的释放顺序。 lblDelveHowManyCards=掘穴多少张牌? lblExileWhichCard=放逐哪张牌? lblDestroy=消灭 -lblUpTo=最多 +lblSelectUpToNumTargetToAction=选择最多%d个{0}用于{1}。 +lblSelectNumTargetToAction=选择%d个{0}用于{1}。 lblHighestBidder=最高出价者 lblUseTriggeredAbilityOf=使用触发异能 lblExertAttackersConfirm=进攻者耗竭? -lblThereNoCardIn=里面没有牌 -lblPut=放到 -lblOnTheTopLibraryOrGraveyard=牌库顶或坟场? +lblThereNoCardInPlayerZone={0}的{1}中没有牌 +lblPutCardsOnTheTopLibraryOrGraveyard=将{0}放到牌库顶还是坟场? lblLibrary=牌库 lblGraveyard=坟场 lblTop=顶 lblBottom=底 -lblManaFrom=法术力自 +lblNColorManaFromCard={2}产{0}个{1}法术力 lblPayManaFromManaPool=从法术力池支付法术力 -lblChooseATargetType=选择一个%s类型 +lblChooseATargetType=选择一个{0}类型 lblUntap=重置 lblOdds=赔率 lblEvens=偶数 @@ -1217,21 +1217,17 @@ lblWinTheFlip=赢得此掷 lblLoseTheFlip=输掉此掷 lblChooseAResult=选择一个结果 lblSelectPreventionShieldToUse=选择一个保护罩使用 -lblChooseAMode=选择一种模式 -lblActivated=已启动 +lblPlayerActivatedCardChooseMode={0}激活了{1} - 选择一个模式 lblNoPlayerHasPriorityCannotAddedManaToPool=目前没有牌手具有优先权,因此无法向法术力池中加入法术力。 lblOverwriteExistFileConfirm=覆盖已有的文件? lblFileExists=文件已存在! lblSelectGameStateFile=选择游戏状态文件 lblFileNotFound=文件未找到 -lblIn=在 -lblOnTheBattlefield=在战场上 -lblOnTheStackOrInPlay=在堆叠/在使用 -lblPutCard=放置牌 -lblForWhichPlayer=哪个牌手? -lblShould=应该 -lblAffectedWithSummoningSickness=被召唤失调效应影响? -lblBeAddedToLibraryTopOrBottom=被添加到牌库顶还是底? +lblPutCardInWhichPlayerZone=将牌放于哪个牌手的{0}中? +lblPutCardInWhichPlayerBattlefield=将牌放于哪个牌手的战场? +lblPutCardInWhichPlayerPlayOrStack=将牌放于哪个牌手的堆叠/使哪个牌手使用牌? +lblCardShouldBeSummoningSicknessConfirm={0}是否应该受到召唤失调的影响? +lblCardShouldBeAddedToLibraryTopOrBottom=将{0}添加到牌库顶还是底? lblExileCardsFromPlayerHandConfirm=从哪位玩家手中放逐牌? lblChooseCardsExile=选择要放逐的牌 lblExileCardsFromPlayerBattlefieldConfirm=从哪个玩家的战场放逐牌? @@ -1245,8 +1241,11 @@ lblRestartingActionSequence=重新启动行动序列 lblErrorPleaseCheckID=错误:请检查ID,并确保他们之间用空格和/或逗号分隔。 lblErrorEntityWithId=错误:实体的ID lblNotFound=没有找到 -lblChooseAnnounceFor=为%name选择%s +lblChooseAnnounceFor=为{0}选择{1} lblSacrifice=牺牲 +lblLookCardInPlayerZone=查看{0}的{1}中的牌 +lblPlayerZone={0}的{1} +lblActionFromPlayerDeck=从{1}的套牌{0} #AbstractGuiGame.java lblConcedeCurrentGame=这局游戏认输。\n\n确认吗? lblConcedeTitle=这局游戏认输? @@ -1589,27 +1588,25 @@ lblFinalMatch=决赛 #DualListBox.java lblSelectOrder=选择顺序 #HumanPlay.java -lblIfYouDo=如果你 +lblIfYouDo=如果你如此做 lblOr=或 lblDoYouWantPay=你想要支付 +lblDoYouWantPayNLife=你想要支付{0}点生命吗? lblDoyouWantTo=你想要 -lblDoYouWantMill=你想要磨 -lblDoYouWantFlip=你想要抛 -lblDoYouWantRemove=你想要移除 -lblDoYouWantRemoveCounters=你想要删除指示物从 -lblDoYouWantExile=你想要放逐 +lblDoYouWantMillNCardsOrDoAction=你想要磨{0}张牌吗? {1} +lblDoYouWantFlipNCoinOrDoAction=你想要抛{0}个硬币吗? {1} +lblDoYouWantRemoveNTargetTypeCounterFromCard=你想要从{2}移除{0}个{1}指示物吗? +lblDoYouWantRemoveCountersFromCard=你想要从{0}删除指示物吗? +lblDoYouWantExileNCardsFromYourLibrary=你想要从你的牌库放逐{0}张牌吗? lblDoYouWantExileAllCardYouGraveyard=你想要放逐坟场中的所有牌吗? lblDoYouWantDiscardYourHand=你想要弃掉你的手牌吗? -lblDoYouWantSpend=你想要花费 -lblLetThatPlayer=让那个牌手 -lblCoin=硬币 -lblCounterOfPointer=指示物 -lblFrom=从 -lblFromYourLibrary=从你的牌库? +lblDoYouWantSpendNTargetTypeCounter=你想要花费{0}个{1}指示物吗? +lblDoYouWantLetThatPlayerDrawNCardOrDoAction=你想要抓让该牌手{0}张牌吗?{1} +lblDoYouWantDrawNCardOrDoAction=你想要抓{0}张牌吗?{1} lblSelectRemoveCounterCard=选择一张牌删除指示物 lblSelectRemoveCounterType=选择一个指示物类型删除 -lblExileFrom=放逐自 -lblPutCardFromWhose=谁放置牌 +lblExileFromZone=从{0}中放逐 +lblPutCardFromWhoseZone=将牌放入谁的{0}? lblPutCardToLibrary=将牌放入牌库 lblPutIntoLibrary=放入牌库。 lblGainControl=获得控制权。 @@ -1618,8 +1615,7 @@ lbldiscard=弃牌。 lblReveal=展示 lblTap=横置 lblCurrentCard=当前牌 -lblSelectOfCardsTo=选择 -lblCardsTo=牌到 +lblSelectNSpecifyTypeCardsToAction=选择%d张{0}牌用于{1} #AbandonEffect.java lblWouldYoulikeAbandonSource=你想要终止阴谋{0}吗? #ActivateAbilityEffect.java From e8c5a58d854e3157c9f4a1f4bec9c6a94ed75e4d Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 29 Dec 2019 08:06:17 -0500 Subject: [PATCH 55/64] 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 56/64] 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 57/64] 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 58/64] 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 From cea6d3a9df370d5d36a3b78aa024ee328deddf92 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Mon, 30 Dec 2019 08:48:07 +0800 Subject: [PATCH 59/64] update simplified chinese translation --- forge-gui/res/languages/zh-CN.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 872dd72bb41..f14b80b0682 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -327,7 +327,7 @@ lblOk=确认 lblReset=重置 lblAuto=自动 #VAssignDamage.java -lbLAssignDamageDealtBy=分配对%s造成的伤害 +lbLAssignDamageDealtBy=对%s造成的伤害进行分配 lblLClickDamageMessage=左键单击:分配一点伤害。(左键加Ctrl):分配致命伤害。 lblRClickDamageMessage=右键单击:取消分配一点伤害。(左键加Ctrl):取消分配的所有伤害 lblTotalDamageText=可用的伤害值:未知 @@ -1241,7 +1241,7 @@ lblRestartingActionSequence=重新启动行动序列 lblErrorPleaseCheckID=错误:请检查ID,并确保他们之间用空格和/或逗号分隔。 lblErrorEntityWithId=错误:实体的ID lblNotFound=没有找到 -lblChooseAnnounceFor=为{0}选择{1} +lblChooseAnnounceForCard=为{1}选择{0} lblSacrifice=牺牲 lblLookCardInPlayerZone=查看{0}的{1}中的牌 lblPlayerZone={0}的{1} From 40b43b00c24667e6a3c4cebc449b943062230686 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Mon, 30 Dec 2019 01:25:02 +0000 Subject: [PATCH 60/64] Updated pioneer deckgen data with lots more up-to-date meta data (cherry picked from commit f490497) (cherry picked from commit 729dfea) --- forge-gui/res/deckgendecks/Pioneer.lda.dat | Bin 98545 -> 110713 bytes forge-gui/res/deckgendecks/Pioneer.raw.dat | Bin 95690 -> 103668 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/forge-gui/res/deckgendecks/Pioneer.lda.dat b/forge-gui/res/deckgendecks/Pioneer.lda.dat index ca93fcd330486c3953da24390ade551ce2e82b36..73455e28c648c21aa06b530eda73708fda8d0849 100644 GIT binary patch literal 110713 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 #bOEQHI`_t874~w$M(+@<1{6*P05PnGn&5 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 diff --git a/forge-gui/res/deckgendecks/Pioneer.raw.dat b/forge-gui/res/deckgendecks/Pioneer.raw.dat index a67085499764bf7fbf714a750a3f43867e4363b2..b6ef1958117f3614d94cf9332efb9cba02295859 100644 GIT binary patch literal 103668 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 L0dN-(mCyKpQxV!u From c9f33415e131b321cae75549cc8edca65ef06ea3 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Mon, 30 Dec 2019 10:35:16 +0800 Subject: [PATCH 61/64] translate enum ZoneType --- .../ability/effects/ChangeZoneEffect.java | 10 ++-- .../forge/game/ability/effects/DigEffect.java | 2 +- .../game/ability/effects/DigUntilEffect.java | 2 +- .../main/java/forge/game/zone/ZoneType.java | 47 +++++++++++++------ .../src/main/java/forge/player/HumanPlay.java | 4 +- .../forge/player/PlayerControllerHuman.java | 8 ++-- 6 files changed, 46 insertions(+), 27 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 3e486f35043..a27bc73f4ca 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 @@ -752,10 +752,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (optional) { String prompt; if (defined) { - prompt = Localizer.getInstance().getMessage("lblPutThatCardFromPlayerOriginToDestination", "{player's}", Lang.joinHomogenous(origin).toLowerCase(), destination.name().toLowerCase()); + prompt = Localizer.getInstance().getMessage("lblPutThatCardFromPlayerOriginToDestination", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase(), destination.name().toLowerCase()); } else { - prompt = Localizer.getInstance().getMessage("lblSearchPlayerZoneConfirm", "{player's}", Lang.joinHomogenous(origin).toLowerCase()); + prompt = Localizer.getInstance().getMessage("lblSearchPlayerZoneConfirm", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase()); } String message = MessageUtil.formatMessage(prompt , decider, player); if (!decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneGeneral, message)) { @@ -861,7 +861,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(Localizer.getInstance().getMessage("lblSelectCardFromPlayerZone", "{player's}", Lang.joinHomogenous(origin).toLowerCase()), decider, player); + String selectPrompt = sa.hasParam("SelectPrompt") ? sa.getParam("SelectPrompt") : MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardFromPlayerZone", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase()), decider, player); final String totalcmc = sa.getParam("WithTotalCMC"); int totcmc = AbilityUtils.calculateAmount(source, totalcmc, sa); @@ -875,9 +875,9 @@ public class ChangeZoneEffect extends SpellAbilityEffect { // new default messaging for multi select if (fetchList.size() > changeNum) { //Select up to %changeNum cards from %players %origin - selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectUpToNumCardFromPlayerZone", String.valueOf(changeNum), "{player's}", Lang.joinHomogenous(origin).toLowerCase()), decider, player); + selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectUpToNumCardFromPlayerZone", String.valueOf(changeNum), "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase()), decider, player); } else { - selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardsFromPlayerZone", "{player's}", Lang.joinHomogenous(origin).toLowerCase()), decider, player); + selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardsFromPlayerZone", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase()), decider, player); } } // ensure that selection is within maximum allowed changeNum 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 bac2d4a7887..e1cf5cd9527 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 @@ -246,7 +246,7 @@ public class DigEffect extends SpellAbilityEffect { if (sa.hasParam("PrimaryPrompt")) { prompt = sa.getParam("PrimaryPrompt"); } else { - prompt = Localizer.getInstance().getMessage("lblChooseCardsPutIntoZone", destZone1.name()); + prompt = Localizer.getInstance().getMessage("lblChooseCardsPutIntoZone", destZone1.getTranslatedName()); if (destZone1.equals(ZoneType.Library)) { if (libraryPosition == -1) { prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayBottom", "{player's}"); 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 dfa8b989fd5..b99c372277e 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 @@ -160,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, - Localizer.getInstance().getMessage("lblDoYouWantPutCardToZone", foundDest.name()))) { + Localizer.getInstance().getMessage("lblDoYouWantPutCardToZone", foundDest.getTranslatedName()))) { continue; } else { Card m = null; diff --git a/forge-game/src/main/java/forge/game/zone/ZoneType.java b/forge-game/src/main/java/forge/game/zone/ZoneType.java index 3383a83cb14..e9157309546 100644 --- a/forge-game/src/main/java/forge/game/zone/ZoneType.java +++ b/forge-game/src/main/java/forge/game/zone/ZoneType.java @@ -1,32 +1,38 @@ package forge.game.zone; +import forge.util.Localizer; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import com.google.common.base.Function; + /** * The Enum Zone. */ public enum ZoneType { - Hand(true), - Library(true), - Graveyard(false), - Battlefield(false), - Exile(false), - Flashback(false), - Command(false), - Stack(false), - Sideboard(true), - Ante(false), - SchemeDeck(true), - PlanarDeck(true), - None(true); + Hand(true, Localizer.getInstance().getMessage("lblHandZone")), + Library(true, Localizer.getInstance().getMessage("lblLibraryZone")), + Graveyard(false, Localizer.getInstance().getMessage("lblGraveyardZone")), + Battlefield(false, Localizer.getInstance().getMessage("lblBattlefieldZone")), + Exile(false, Localizer.getInstance().getMessage("lblExileZone")), + Flashback(false, Localizer.getInstance().getMessage("lblFlashbackZone")), + Command(false, Localizer.getInstance().getMessage("lblCommandZone")), + Stack(false, Localizer.getInstance().getMessage("lblStackZone")), + Sideboard(true, Localizer.getInstance().getMessage("lblSideboardZone")), + Ante(false, Localizer.getInstance().getMessage("lblAnteZone")), + SchemeDeck(true, Localizer.getInstance().getMessage("lblSchemeDeckZone")), + PlanarDeck(true, Localizer.getInstance().getMessage("lblPlanarDeckZone")), + None(true, Localizer.getInstance().getMessage("lblNoneZone")); public static final List STATIC_ABILITIES_SOURCE_ZONES = Arrays.asList(Battlefield, Graveyard, Exile, Command/*, Hand*/); private final boolean holdsHiddenInfo; - ZoneType(boolean holdsHidden) { + private final String zoneName; + ZoneType(boolean holdsHidden, String name) { holdsHiddenInfo = holdsHidden; + zoneName = name; } public static ZoneType smartValueOf(final String value) { @@ -64,6 +70,10 @@ public enum ZoneType { return !holdsHiddenInfo; } + public String getTranslatedName() { + return zoneName; + } + public static boolean isHidden(final String origin) { List zone = ZoneType.listValueOf(origin); @@ -82,4 +92,13 @@ public enum ZoneType { public static boolean isKnown(final String origin) { return !isHidden(origin); } + + public static class Accessors { + public static Function GET_TRANSLATED_NAME = new Function() { + @Override + public String apply(final ZoneType arg0) { + return arg0.getTranslatedName(); + } + }; + } } diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index de51420b4b5..9fda7312c54 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -504,7 +504,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(Localizer.getInstance().getMessage("lblExileFromZone", from.toString()), CardView.getCollection(list))); + final Card c = p.getGame().getCard(SGuiChoose.oneOrNone(Localizer.getInstance().getMessage("lblExileFromZone", from.getTranslatedName()), CardView.getCollection(list))); if (c == null) { return false; } @@ -540,7 +540,7 @@ public class HumanPlay { payableZone.add(player); } } - Player chosen = controller.getGame().getPlayer(SGuiChoose.oneOrNone(Localizer.getInstance().getMessage("lblPutCardFromWhoseZone", from.toString()), PlayerView.getCollection(payableZone))); + Player chosen = controller.getGame().getPlayer(SGuiChoose.oneOrNone(Localizer.getInstance().getMessage("lblPutCardFromWhoseZone", from.getTranslatedName()), PlayerView.getCollection(payableZone))); if (chosen == null) { return false; } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 29e7cbb0a82..650479a14a7 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -733,9 +733,9 @@ 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 = localizer.getMessage("lblLookCardInPlayerZone", "{player's}", zone.name().toLowerCase()); + message = localizer.getMessage("lblLookCardInPlayerZone", "{player's}", zone.getTranslatedName().toLowerCase()); } else { - message += localizer.getMessage("lblPlayerZone", "{player's}", zone.name().toLowerCase()); + message += localizer.getMessage("lblPlayerZone", "{player's}", zone.getTranslatedName().toLowerCase()); } final String fm = MessageUtil.formatMessage(message, getLocalPlayerView(), owner); if (!cards.isEmpty()) { @@ -743,7 +743,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont getGui().reveal(fm, cards); endTempShowCards(); } else { - getGui().message(MessageUtil.formatMessage(localizer.getMessage("lblThereNoCardInPlayerZone", "{player's}", zone.name().toLowerCase()), + getGui().message(MessageUtil.formatMessage(localizer.getMessage("lblThereNoCardInPlayerZone", "{player's}", zone.getTranslatedName().toLowerCase()), player, owner), fm); } } @@ -2366,7 +2366,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final ZoneType targetZone = repeatLast ? lastAddedZone : zone; String message = null; if (targetZone != ZoneType.Battlefield) { - message = localizer.getMessage("lblPutCardInWhichPlayerZone", targetZone.name().toLowerCase()); + message = localizer.getMessage("lblPutCardInWhichPlayerZone", targetZone.getTranslatedName().toLowerCase()); } else { if (noTriggers) { From e47ee567bfcab5aa81e6406526e362648e33bb8d Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Mon, 30 Dec 2019 10:35:38 +0800 Subject: [PATCH 62/64] update translation --- forge-gui/res/languages/de-DE.properties | 16 +++++++++++++++- forge-gui/res/languages/en-US.properties | 16 +++++++++++++++- forge-gui/res/languages/es-ES.properties | 16 +++++++++++++++- forge-gui/res/languages/zh-CN.properties | 14 ++++++++++++++ 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index d948c27b962..4f5fa4c27ed 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1837,4 +1837,18 @@ 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 +lblWalkTo=Planeswalk to +#ZoneType.java +lblHandZone=hand +lblLibraryZone=library +lblGraveyardZone=graveyard +lblBattlefieldZone=battlefield +lblExileZone=exile +lblFlashbackZone=flashback +lblCommandZone=command +lblStackZone=stack +lblSideboardZone=sideboard +lblAnteZone=ante +lblSchemeDeckZone=schemedeck +lblPlanarDeckZone=planardeck +lblNoneZone=none \ 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 69100b0cc8b..19278413d65 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1837,4 +1837,18 @@ 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 +lblWalkTo=Planeswalk to +#ZoneType.java +lblHandZone=hand +lblLibraryZone=library +lblGraveyardZone=graveyard +lblBattlefieldZone=battlefield +lblExileZone=exile +lblFlashbackZone=flashback +lblCommandZone=command +lblStackZone=stack +lblSideboardZone=sideboard +lblAnteZone=ante +lblSchemeDeckZone=schemedeck +lblPlanarDeckZone=planardeck +lblNoneZone=none \ 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 7001086b4f2..17c9dc4b3dc 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1837,4 +1837,18 @@ 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 +lblWalkTo=Planeswalk to +#ZoneType.java +lblHandZone=hand +lblLibraryZone=library +lblGraveyardZone=graveyard +lblBattlefieldZone=battlefield +lblExileZone=exile +lblFlashbackZone=flashback +lblCommandZone=command +lblStackZone=stack +lblSideboardZone=sideboard +lblAnteZone=ante +lblSchemeDeckZone=schemedeck +lblPlanarDeckZone=planardeck +lblNoneZone=none \ 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 f14b80b0682..bb7d335121e 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1838,3 +1838,17 @@ lblRepeatAddCard=重复上一张添加的牌 lblRemoveFromGame=从游戏中删除牌 lblRiggedRoll=触发时空骰 lblWalkTo=时空换入 +#ZoneType.java +lblHandZone=手牌 +lblLibraryZone=牌库 +lblGraveyardZone=坟场 +lblBattlefieldZone=战场 +lblExileZone=放逐区 +lblFlashbackZone=返照 +lblCommandZone=指挥官区 +lblStackZone=堆叠 +lblSideboardZone=备牌 +lblAnteZone=赌注牌区 +lblSchemeDeckZone=魔王套牌 +lblPlanarDeckZone=时空套牌 +lblNoneZone=空 \ No newline at end of file From 4793425c582dc09d420d237f974ec87b1db6b6f1 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Mon, 30 Dec 2019 19:08:57 +0800 Subject: [PATCH 63/64] translate ZoneType --- .../java/forge/game/ability/effects/ChangeZoneAllEffect.java | 2 +- .../src/main/java/forge/game/ability/effects/DigEffect.java | 2 +- .../src/main/java/forge/game/ability/effects/MillEffect.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 cfe26c4814e..6f9af54a757 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 @@ -101,7 +101,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { if (sa.hasParam("OptionQuestion")) { message = TextUtil.fastReplace(sa.getParam("OptionQuestion"), "TARGETS", targets); } else { - message = Localizer.getInstance().getMessage("lblMoveTargetFromOriginToDestination", targets, Lang.joinHomogenous(origin), destination.toString()); + message = Localizer.getInstance().getMessage("lblMoveTargetFromOriginToDestination", targets, Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME), destination.toString()); } if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, message)) { 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 e1cf5cd9527..48569298711 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 @@ -232,7 +232,7 @@ public class DigEffect extends SpellAbilityEffect { prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop", "{player's}"); } else { - prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTargetZone", "{player's}", destZone2.name()); + prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTargetZone", "{player's}", destZone2.getTranslatedName()); } Card chosen = chooser.getController().chooseSingleEntityForEffect(valid, delayedReveal, sa, prompt, false, p); 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 e8e0079a9bb..7b28f2427b4 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 @@ -40,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(Localizer.getInstance().getMessage("lblDoYouWantPutLibraryCardsTo", destination.toString())); + final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantPutLibraryCardsTo", destination.getTranslatedName())); if (!p.getController().confirmAction(sa, null, prompt)) { continue; } From c81d9f6bc218a5abe2327ccb2d6b607b0bd5fac2 Mon Sep 17 00:00:00 2001 From: Adam Pantel <> Date: Fri, 27 Dec 2019 07:28:21 -0500 Subject: [PATCH 64/64] Add null check for Volrath's Shapeshifter --- forge-game/src/main/java/forge/game/card/CardFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index f41e3542467..34aec26647b 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -875,7 +875,7 @@ public class CardFactory { } } - if (sa.hasParam("GainTextOf")) { + if (sa.hasParam("GainTextOf") && originalState != null) { state.setSetCode(originalState.getSetCode()); state.setRarity(originalState.getRarity()); state.setImageKey(originalState.getImageKey());