diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index bca037461c5..1c3cd26a61e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -1079,7 +1079,7 @@ public class DamageDealAi extends DamageAiBase { saTgt.resetTargets(); saTgt.getTargets().add(tgtCreature != null && dmg < opponent.getLife() ? tgtCreature : opponent); - sa.setXManaCostPaid(dmg); + saTgt.setXManaCostPaid(dmg); return true; } diff --git a/forge-core/src/main/java/forge/util/FileUtil.java b/forge-core/src/main/java/forge/util/FileUtil.java index d12ef2741ff..269a4c552a6 100644 --- a/forge-core/src/main/java/forge/util/FileUtil.java +++ b/forge-core/src/main/java/forge/util/FileUtil.java @@ -29,6 +29,7 @@ import java.io.OutputStream; import java.io.PrintWriter; import java.io.Reader; import java.net.URL; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -208,7 +209,8 @@ public final class FileUtil { if ((file == null) || !file.exists()) { return new ArrayList<>(); } - return FileUtil.readAllLines(new FileReader(file), false); + Charset charset = Charset.forName("UTF-8"); + return FileUtil.readAllLines(new FileReader(file, charset), false); } catch (final Exception ex) { throw new RuntimeException("FileUtil : readFile() error, " + ex); } 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 4b37c69f0b3..e625c7ab55b 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 @@ -100,7 +100,12 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { changingTgtSA.resetTargets(); List candidates = changingTgtSA.getTargetRestrictions().getAllCandidates(changingTgtSA, true); if (sa.hasParam("RandomTargetRestriction")) { - candidates.removeIf(c -> !c.isValid(sa.getParam("RandomTargetRestriction").split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa)); + candidates.removeIf(new java.util.function.Predicate() { + @Override + public boolean test(GameEntity c) { + return !c.isValid(sa.getParam("RandomTargetRestriction").split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); + } + }); } GameEntity choice = Aggregates.random(candidates); changingTgtSA.getTargets().add(choice); 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 7a0af1f764f..ea4cf2586e5 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 @@ -3,6 +3,7 @@ package forge.game.ability.effects; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.function.Predicate; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -166,7 +167,12 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { if (sa.hasParam("RandomTarget")){ List candidates = copy.getTargetRestrictions().getAllCandidates(chosenSA, true); if (sa.hasParam("RandomTargetRestriction")) { - candidates.removeIf(c -> !c.isValid(sa.getParam("RandomTargetRestriction").split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa)); + candidates.removeIf(new Predicate() { + @Override + public boolean test(GameEntity c) { + return !c.isValid(sa.getParam("RandomTargetRestriction").split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); + } + }); } GameEntity choice = Aggregates.random(candidates); resetFirstTargetOnCopy(copy, choice, chosenSA); 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 898d56af362..1932709764e 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 @@ -87,6 +87,20 @@ public class DigEffect extends SpellAbilityEffect { final boolean mayBeSkipped = sa.hasParam("PromptToSkipOptionalAbility"); final String optionalAbilityPrompt = sa.hasParam("OptionalAbilityPrompt") ? sa.getParam("OptionalAbilityPrompt") : ""; + boolean remZone1 = false; + boolean remZone2 = false; + if (sa.hasParam("RememberChanged")) { + remZone1 = true; + } + if (sa.hasParam("RememberMovedToZone")) { + if (sa.getParam("RememberMovedToZone").contains("1")) { + remZone1 = true; + } + if (sa.getParam("RememberMovedToZone").contains("2")) { + remZone2 = true; + } + } + boolean changeAll = false; boolean allButOne = false; @@ -341,7 +355,7 @@ public class DigEffect extends SpellAbilityEffect { if (sa.hasParam("ForgetOtherRemembered")) { host.clearRemembered(); } - if (sa.hasParam("RememberChanged")) { + if (remZone1) { host.addRemembered(c); } rest.remove(c); @@ -376,6 +390,9 @@ public class DigEffect extends SpellAbilityEffect { if (m != null && !origin.equals(m.getZone().getZoneType())) { table.put(origin, m.getZone().getZoneType(), m); } + if (remZone2) { + host.addRemembered(m); + } } } else { @@ -395,6 +412,9 @@ public class DigEffect extends SpellAbilityEffect { } c.setExiledWith(effectHost); c.setExiledBy(effectHost.getController()); + if (remZone2) { + host.addRemembered(c); + } } } } diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 898443abe87..f82a9bf8089 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -595,6 +595,8 @@ public class CombatUtil { walkTypes.add("Land.Legendary"); } else if (keyword.equals("Nonbasic landwalk")) { walkTypes.add("Land.nonBasic"); + } else if (keyword.equals("Artifact landwalk")) { + walkTypes.add("Land.Artifact"); } else if (keyword.equals("Snow landwalk")) { walkTypes.add("Land.Snow"); } else if (keyword.endsWith("walk")) { diff --git a/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt b/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt index 764df2925ed..888f37d3bb2 100644 --- a/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt +++ b/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt @@ -1,10 +1,10 @@ Name:Infuse with Vitality ManaCost:B G Types:Instant -A:SP$ Pump | Cost$ B G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Deathtouch | SpellDescription$ Until end of turn, target creature gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control." | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Triggers$ SupernaturalStaminaChangeZone | sVars$ SupernaturalStaminaTrigChangeZone | Defined$ ParentTarget -SVar:SupernaturalStaminaChangeZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ SupernaturalStaminaTrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control. -SVar:SupernaturalStaminaTrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy | SubAbility$ DBGainLife +A:SP$ Pump | Cost$ B G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Deathtouch | StackDescription$ Until end of turn, {c:Targeted} gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control." | SpellDescription$ Until end of turn, target creature gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control." | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Triggers$ DiesTrigger | Defined$ ParentTarget | SubAbility$ DBGainLife | StackDescription$ None +SVar:DiesTrigger:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 DeckHas:Ability$LifeGain Oracle:Until end of turn, target creature gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control."\nYou gain 2 life. diff --git a/forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt b/forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt index 1b8959c4f54..17c60b9b9ec 100644 --- a/forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt +++ b/forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt @@ -8,7 +8,7 @@ A:AB$ Token | Cost$ SubCounter | Planeswalker$ True | TokenScript$ gu SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -A:AB$ ChangeZone | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Origin$ Library | Destination$ Exile | ChangeType$ Instant.SharesColorWith Card.Self,Sorcery.SharesColorWith Card.Self | ChangeNum$ 1 | SubAbility$ DBPlay | RememberChanged$ True | SpellDescription$ Search your library for an instant or sorcery card that shares a color with this planeswalker, exile that card, then shuffle. You may cast that card without paying its mana cost. +A:AB$ ChangeZone | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Library | Destination$ Exile | ChangeType$ Instant.SharesColorWith Card.Self,Sorcery.SharesColorWith Card.Self | ChangeNum$ 1 | SubAbility$ DBPlay | RememberChanged$ True | SpellDescription$ Search your library for an instant or sorcery card that shares a color with this planeswalker, exile that card, then shuffle. You may cast that card without paying its mana cost. SVar:DBPlay:DB$ Play | Defined$ Remembered | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup DeckHints:Type$Instant|Sorcery DeckHas:Ability$Token & Ability$Counters diff --git a/forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt b/forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt index e946a419be1..db2e3c7a657 100644 --- a/forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt +++ b/forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt @@ -22,7 +22,7 @@ Loyalty:4 S:Mode$ ReduceCost | ValidCard$ Instant,Sorcery | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Instant and sorcery spells you cast cost {1} less to cast. A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | TargetMin$ 0 | TargetMax$ 1 | Power$ 0 | Toughness$ 2 | Duration$ UntilYourNextTurn | SpellDescription$ Up to one target creature has base power and toughness 0/2 until your next turn. A:AB$ Draw | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | NumCards$ 3 | SpellDescription$ Draw three cards. -A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent | TgtPrompt$ Select up to five target permanents | TargetMin$ 0 | TargetMax$ 5 | Origin$ Battlefield | Destination$ Exile | RememberLKI$ True | SubAbility$ DBRepeat | SpellDescription$ Exile up to five target permanents. For each permanent exiled this way, its controller creates a 4/4 blue and red Elemental creature token. +A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Permanent | TgtPrompt$ Select up to five target permanents | TargetMin$ 0 | TargetMax$ 5 | Origin$ Battlefield | Destination$ Exile | RememberLKI$ True | SubAbility$ DBRepeat | SpellDescription$ Exile up to five target permanents. For each permanent exiled this way, its controller creates a 4/4 blue and red Elemental creature token. SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ DirectRemembered | UseImprinted$ True | RepeatSubAbility$ DBToken | SubAbility$ DBCleanup | ChangeZoneTables$ True SVar:DBToken:DB$ Token | TokenScript$ ur_4_4_elemental | TokenOwner$ ImprintedController SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt b/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt new file mode 100644 index 00000000000..0182357296c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt @@ -0,0 +1,8 @@ +Name:Arcbound Mouser +ManaCost:W +Types:Artifact Creature Cat +PT:0/0 +K:Lifelink +K:Modular:1 +DeckHas:Ability$Counters & Ability$LifeGain +Oracle:Lifelink\nModular 1 (This creature enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/calibrated_blast.txt b/forge-gui/res/cardsfolder/upcoming/calibrated_blast.txt new file mode 100644 index 00000000000..14630b8f383 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/calibrated_blast.txt @@ -0,0 +1,10 @@ +Name:Calibrated Blast +ManaCost:2 R +Types:Instant +A:SP$ DigUntil | Valid$ Card.nonLand | ValidDescription$ nonland | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | RememberFound$ True | SubAbility$ DBImmediateTrigger | StackDescription$ Reveal cards from the top of your library until you reveal a nonland card. Put the revealed cards on the bottom of your library in a random order. | SpellDescription$ Reveal cards from the top of your library until you reveal a nonland card. Put the revealed cards on the bottom of your library in a random order. When you reveal a nonland card this way, CARDNAME deals damage equal to that card's mana value to any target. +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand | Execute$ TrigDamage | TriggerDescription$ When you reveal a nonland card this way, CARDNAME deals damage equal to that card's mana value to any target. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$CardManaCost +K:Flashback:3 R R +Oracle:Reveal cards from the top of your library until you reveal a nonland card. Put the revealed cards on the bottom of your library in a random order. When you reveal a nonland card this way, Calibrated Blast deals damage equal to that card's mana value to any target.\nFlashback {3}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/constable_of_the_realm.txt b/forge-gui/res/cardsfolder/upcoming/constable_of_the_realm.txt new file mode 100644 index 00000000000..e3319aa3907 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/constable_of_the_realm.txt @@ -0,0 +1,10 @@ +Name:Constable of the Realm +ManaCost:4 W +Types:Creature Giant Soldier +PT:3/3 +K:Renown:2 +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | CounterType$ P1P1 | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, exile up to one other target nonland permanent until CARDNAME leaves the battlefield. +SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Permanent.Other+nonLand | TgtPrompt$ Select up to one other target nonland permanent | TargetMin$ 0 | TargetMax$ 1 | Origin$ Battlefield | Destination$ Exile | Duration$ UntilHostLeavesPlay +DeckHas:Ability$Counters +DeckHints:Ability$Counters & Ability$Proliferate +Oracle:Renown 2 (When this creature deals combat damage to a player, if it isn't renowned, put two +1/+1 counters on it and it becomes renowned.)\nWhenever one or more +1/+1 counters are put on Constable of the Realm, exile up to one other target nonland permanent until Constable of the Realm leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt b/forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt new file mode 100644 index 00000000000..032cd61081d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt @@ -0,0 +1,8 @@ +Name:Darkmoss Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Darkmoss Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {B} or {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/dermotaxi.txt b/forge-gui/res/cardsfolder/upcoming/dermotaxi.txt new file mode 100644 index 00000000000..103cf04837c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dermotaxi.txt @@ -0,0 +1,9 @@ +Name:Dermotaxi +ManaCost:2 +Types:Artifact Vehicle +PT:0/0 +K:ETBReplacement:Other:Imprint +SVar:Imprint:DB$ ChangeZone | Imprint$ True | ChangeType$ Creature | ChangeNum$ 1 | Origin$ Graveyard | Destination$ Exile | Mandatory$ True | Hidden$ True | Chooser$ You | SpellDescription$ Imprint - As CARDNAME enters the battlefield, exile a creature card from a graveyard. +A:AB$ Clone | Cost$ tapXType<2/Creature> | Defined$ Imprinted | Duration$ UntilEndOfTurn | AddTypes$ Vehicle & Artifact | StackDescription$ Until end of turn, CARDNAME becomes a copy of {c:Imprinted}, except it’s a Vehicle artifact in addition to its other types. | SpellDescription$ Until end of turn, CARDNAME becomes a copy of the imprinted card, except it’s a Vehicle artifact in addition to its other types. +SVar:NeedsToPlay:Creature.inZoneGraveyard +Oracle:Imprint — As Dermotaxi enters the battlefield, exile a creature card from a graveyard.\nTap two untapped creatures you control: Until end of turn, Dermotaxi becomes a copy of the imprinted card, except it’s a Vehicle artifact in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/discerning_taste.txt b/forge-gui/res/cardsfolder/upcoming/discerning_taste.txt new file mode 100644 index 00000000000..a3dabc0f9e7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/discerning_taste.txt @@ -0,0 +1,10 @@ +Name:Discerning Taste +ManaCost:2 B +Types:Sorcery +A:SP$ Dig | DigNum$ 4 | DestinationZone2$ Graveyard | RememberMovedToZone$ 2 | SubAbility$ DBLifeGain | StackDescription$ SpellDescription | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. You gain life equal to the greatest power among creature cards put into your graveyard this way. +SVar:DBLifeGain:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup | StackDescription$ None +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$GreatestPowerGraveyard_Creature.IsRemembered +DeckHints:Ability$Graveyard +DeckHas:Ability$LifeGain +Oracle:Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. You gain life equal to the greatest power among creature cards put into your graveyard this way. diff --git a/forge-gui/res/cardsfolder/upcoming/dress_down.txt b/forge-gui/res/cardsfolder/upcoming/dress_down.txt new file mode 100644 index 00000000000..859adf7117e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dress_down.txt @@ -0,0 +1,13 @@ +Name:Dress Down +ManaCost:1 U +Types:Enchantment +K:Flash +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 | RemoveAllAbilities$ True | Description$ All creatures lose all abilities. +T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, sacrifice CARDNAME. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self +SVar:EndOfTurnLeavePlay:True +AI:RemoveDeck:Random +DeckHas:Ability$Sacrifice +Oracle:Flash\nWhen Dress Down enters the battlefield, draw a card.\nAll creatures lose all abilities.\nAt the beginning of the end step, sacrifice Dress Down. diff --git a/forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt b/forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt new file mode 100644 index 00000000000..3a35bfe6a8a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt @@ -0,0 +1,8 @@ +Name:Drossforge Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Drossforge Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {B} or {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt b/forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt new file mode 100644 index 00000000000..3d3ef383fe9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt @@ -0,0 +1,9 @@ +Name:Ghost-Lit Drifter +ManaCost:2 U +Types:Creature Spirit +PT:2/2 +K:Flying +A:AB$ Pump | Cost$ 2 U | ValidTgts$ Creature.Other | KW$ Flying | TgtPrompt$ Select another target creature | SpellDescription$ Another target creature gains flying until end of turn. +A:AB$ Pump | Cost$ X U Discard<1/CARDNAME> | TargetMin$ X | TargetMax$ X | KW$ Flying | ValidTgts$ Creature | TgtPrompt$ Select X target creatures | ActivationZone$ Hand | PrecostDesc$ Channel — | SpellDescription$ X target creatures gain flying until end of turn. +SVar:X:Count$xPaid +Oracle:Flying\n{2}{U}: Another target creature gains flying until end of turn.\nChannel — {X}{U}, discard Ghost-Lit Drifter: X target creatures gain flying until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/glorious_enforcer.txt b/forge-gui/res/cardsfolder/upcoming/glorious_enforcer.txt new file mode 100644 index 00000000000..372a1f2b377 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/glorious_enforcer.txt @@ -0,0 +1,11 @@ +Name:Glorious Enforcer +ManaCost:5 W W +Types:Creature Angel +PT:5/5 +K:Flying +K:Lifelink +T:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | Execute$ TrigPump | CheckSVar$ Y | SVarCompare$ GTX | TriggerDescription$ At the beginning of each combat, if you have more life than an opponent, CARDNAME gains double strike until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Double Strike +SVar:X:PlayerCountOpponents$LowestLifeTotal +SVar:Y:Count$YourLifeTotal +Oracle:Flying, lifelink\nAt the beginning of each combat, if you have more life than an opponent, Glorious Enforcer gains double strike until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt b/forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt new file mode 100644 index 00000000000..bdfabe1f328 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt @@ -0,0 +1,8 @@ +Name:Goldmire Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Goldmire Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {W} or {B}. diff --git a/forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt b/forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt new file mode 100644 index 00000000000..27d66b0d212 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt @@ -0,0 +1,8 @@ +Name:Harmonic Prodigy +ManaCost:1 R +Types:Creature Human Wizard +PT:1/3 +K:Prowess +S:Mode$ Panharmonicon | ValidCard$ Shaman.YouCtrl,Wizard.Other+YouCtrl | Description$ If an ability of a Shaman or another Wizard you control triggers, that ability triggers an additional time. +DeckHints:Type$Shaman|Wizard +Oracle:Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)\nIf an ability of a Shaman or another Wizard you control triggers, that ability triggers an additional time. diff --git a/forge-gui/res/cardsfolder/upcoming/junk_winder.txt b/forge-gui/res/cardsfolder/upcoming/junk_winder.txt new file mode 100644 index 00000000000..df1adbab75e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/junk_winder.txt @@ -0,0 +1,10 @@ +Name:Junk Winder +ManaCost:5 U U +Types:Creature Serpent +PT:5/6 +K:Affinity:Permanent.token +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Permanent.token+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever a token enters the battlefield under your control, tap target nonland permanent an opponent controls. It doesn't untap during its controller's next untap step. +SVar:TrigTap:DB$ Tap | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Choose target nonland permanent an opponent controls | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +DeckNeeds:Ability$Token +Oracle:Affinity for tokens (This spell costs {1} less to cast for each token you control.)\nWhenever a token enters the battlefield under your control, tap target nonland permanent an opponent controls. It doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt b/forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt new file mode 100644 index 00000000000..5720eadfbb0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt @@ -0,0 +1,8 @@ +Name:Landscaper Colos +ManaCost:5 W +Types:Creature Goat Beast +PT:4/6 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, put target card from an opponent's graveyard on the bottom of their library. +SVar:TrigChange:DB$ ChangeZone | ValidTgts$ Card.OppOwn | TgtPrompt$ Select target card in an opponent's graveyard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 +K:TypeCycling:Basic:1 W +Oracle:When Landscaper Colos enters the battlefield, put target card from an opponent's graveyard on the bottom of their library.\nBasic landcycling {1}{W} ({1}{W}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/upcoming/mental_journey.txt b/forge-gui/res/cardsfolder/upcoming/mental_journey.txt new file mode 100644 index 00000000000..ceb40a54a56 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mental_journey.txt @@ -0,0 +1,6 @@ +Name:Mental Journey +ManaCost:4 U U +Types:Instant +A:SP$ Draw | Cost$ 4 U U | NumCards$ 3 | SpellDescription$ Draw three cards. +K:TypeCycling:Basic:1 U +Oracle:Draw three cards.\nBasic landcycling {1}{U} ({1}{U}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt b/forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt new file mode 100644 index 00000000000..d541d050c8e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt @@ -0,0 +1,8 @@ +Name:Mistvault Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Mistvault Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {U} or {B}. diff --git a/forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt b/forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt new file mode 100644 index 00000000000..7916287fbc3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt @@ -0,0 +1,8 @@ +Name:Mystic Redaction +ManaCost:2 U +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ At the beginning of your upkeep, scry 1. +SVar:TrigScry:DB$ Scry | ScryNum$ 1 +T:Mode$ Discarded | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever you discard a card, each opponent mills two cards. +SVar:TrigMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 2 +Oracle:At the beginning of your upkeep, scry 1.\nWhenever you discard a card, each opponent mills two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/out_of_time.txt b/forge-gui/res/cardsfolder/upcoming/out_of_time.txt new file mode 100644 index 00000000000..1cc025d449b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/out_of_time.txt @@ -0,0 +1,15 @@ +Name:Out of Time +ManaCost:1 W W +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap all creatures, then phase them out until CARDNAME leaves the battlefield. Put a time counter on CARDNAME for each creature phased out this way. +SVar:TrigUntap:DB$ UntapAll | ValidCards$ Creature | RememberUntapped$ True | SubAbility$ DBPhase +SVar:DBPhase:DB$ Phases | Defined$ Remembered | WontPhaseInNormal$ True | ConditionPresent$ Card.Self | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | Triggers$ TrigComeBack | RememberObjects$ Remembered | ImprintCards$ Self | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnPhasedIn$ True | SubAbility$ DBPutCounter +SVar:TrigComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ DBPhaseIn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ These creatures phase out until CARDNAME leaves the battlefield. +SVar:DBPhaseIn:DB$ Phases | Defined$ Remembered | PhaseInOrOut$ True | SubAbility$ DBExileSelf +SVar:DBExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self +SVar:DBPutCounter:DB$ PutCounter | CounterType$ TIME | CounterNum$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$RememberedSize +K:Vanishing:0 +Oracle:When Out of Time enters the battlefield, untap all creatures, then phase them out until Out of Time leaves the battlefield. Put a time counter on Out of Time for each creature phased out this way.\nVanishing (At the beginning of your upkeep, remove a time counter from this enchantment. When the last is removed, sacrifice it.) diff --git a/forge-gui/res/cardsfolder/upcoming/phantasmal_dreadmaw.txt b/forge-gui/res/cardsfolder/upcoming/phantasmal_dreadmaw.txt new file mode 100644 index 00000000000..1cedb5aca9b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/phantasmal_dreadmaw.txt @@ -0,0 +1,9 @@ +Name:Phantasmal Dreadmaw +ManaCost:2 U U +Types:Creature Dinosaur Illusion +PT:6/6 +K:Trample +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 | Defined$ Self +SVar:Targeting:Dies +Oracle:Flying\nWhen Phantasmal Dreadmaw becomes the target of a spell or ability, sacrifice it. diff --git a/forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt b/forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt new file mode 100644 index 00000000000..a5fad386479 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt @@ -0,0 +1,8 @@ +Name:Razortide Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Razortide Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {W} or {U}. diff --git a/forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt b/forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt new file mode 100644 index 00000000000..c5a0e5b9015 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt @@ -0,0 +1,8 @@ +Name:Rustvale Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Rustvale Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {R} or {W}. diff --git a/forge-gui/res/cardsfolder/upcoming/serras_emissary.txt b/forge-gui/res/cardsfolder/upcoming/serras_emissary.txt new file mode 100644 index 00000000000..0f5d4e890b8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/serras_emissary.txt @@ -0,0 +1,10 @@ +Name:Serra's Emissary +ManaCost:4 W W W +Types:Creature Angel +PT:7/7 +K:Flying +K:ETBReplacement:Other:ChooseCT +SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Card | AILogic$ MostProminentOppControls | SpellDescription$ As CARDNAME enters the battlefield, choose a card type. +S:Mode$ Continuous | Affected$ You,Creature.YouCtrl | AddKeyword$ Protection from ChosenType | Description$ You and creatures you control have protection from the chosen type. +SVar:PlayMain1:TRUE +Oracle:As Serra's Emissary enters the battlefield, choose a card type. \nYou and creatures you control have protection from the chosen type. diff --git a/forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt b/forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt new file mode 100644 index 00000000000..2e7a7f50f34 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt @@ -0,0 +1,8 @@ +Name:Silverbluff Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Silverbluff Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {U} or {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt b/forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt new file mode 100644 index 00000000000..0e855ae30c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt @@ -0,0 +1,8 @@ +Name:Slagwoods Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Slagwoods Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {R} or {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/so_shiny.txt b/forge-gui/res/cardsfolder/upcoming/so_shiny.txt new file mode 100644 index 00000000000..7a05396db2c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/so_shiny.txt @@ -0,0 +1,13 @@ +Name:So Shiny +ManaCost:2 U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | AILogic$ KeepTapped +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | IsPresent$ Card.YouCtrl+token | PresentCompare$ GE1 | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, if you control a token, tap enchanted creature, then scry 2. +SVar:TrigTap:DB$ Tap | Defined$ Enchanted | SubAbility$ DBScry +SVar:DBScry:DB$ Scry | ScryNum$ 2 +S:Mode$ Continuous | Affected$ Creature.AttachedBy | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature doesn't untap during its controller's untap step. +DeckNeeds:Ability$Token +SVar:NeedsToPlayVar:Y GE1 +SVar:Y:Count$Valid Permanent.token+YouCtrl +Oracle:Enchant creature\nWhen So Shiny enters the battlefield, if you control a token, tap enchanted creature, then scry 2.\nEnchanted creature doesn't untap during its controller's untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/step_through.txt b/forge-gui/res/cardsfolder/upcoming/step_through.txt new file mode 100644 index 00000000000..07fc4d92541 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/step_through.txt @@ -0,0 +1,6 @@ +Name:Step Through +ManaCost:3 U U +Types:Sorcery +K:TypeCycling:Wizard:2 +A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return two target creatures to their owners' hands. +Oracle:Return two target creatures to their owners' hands.\nWizardcycling {2} ({2}, Discard this card: Search your library for a Wizard card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/upcoming/subtlety.txt b/forge-gui/res/cardsfolder/upcoming/subtlety.txt new file mode 100644 index 00000000000..26551f9bd68 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/subtlety.txt @@ -0,0 +1,10 @@ +Name:Subtlety +ManaCost:2 U U +Types:Creature Elemental Incarnation +PT:3/3 +K:Flash +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTuck | TriggerDescription$ When CARDNAME enters the battlefield, choose up to one target creature spell or planeswalker spell. Its owner puts it on the top or bottom of their library. +SVar:TrigTuck:DB$ ChangeZone | ValidTgts$ Card.inZoneStack+Creature,Card.inZoneStack+Planeswalker | TgtZone$ Stack | TgtPrompt$ Select up to one target creature spell or planeswalker spell | AlternativeDecider$ TargetedController | Origin$ Stack | Fizzle$ True | Destination$ Library | LibraryPosition$ 0 | DestinationAlternative$ Library | LibraryPositionAlternative$ -1 | AlternativeDestinationMessage$ Would you like to put the card on the top of your library (and not on the bottom)? | SpellDescription$ Choose up to one target creature spell or planeswalker spell. Its owner puts it on the top or bottom of their library. +K:Evoke:ExileFromHand<1/Card.Blue+Other> +Oracle:Flash\nFlying\nWhen Subtlety enters the battlefield, choose up to one target creature spell or planeswalker spell. Its owner puts it on the top or bottom of their library.\nEvoke — Exile a blue card from your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/suspend.txt b/forge-gui/res/cardsfolder/upcoming/suspend.txt new file mode 100644 index 00000000000..05857c8994f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/suspend.txt @@ -0,0 +1,7 @@ +Name:Suspend +ManaCost:U +Types:Instant +A:SP$ ChangeZone | A:SP$ ChangeZone | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBPutCounter | SpellDescription$ Exile target creature and put two time counters on it. If it doesn't have suspend, it gains suspend. +SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterNum$ 2 | CounterType$ TIME | SubAbility$ DBPump +SVar:DBPump:DB$ PumpAll | ValidCards$ Card.IsRemembered+withoutSuspend | PumpZone$ Exile | KW$ Suspend | Permanent$ True | SubAbility$ DBCleanup | StackDescription$ If it doesn't have suspend, it gains suspend. +Oracle:Exile target creature and put two time counters on it. If it doesn't have suspend, it gains suspend. (At the beginning of its owner's upkeep, remove a time counter from that card. When the last is removed, the player plays it without paying its mana cost. If it's a creature, it has haste.) diff --git a/forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt b/forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt new file mode 100644 index 00000000000..0c52eaad5ad --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt @@ -0,0 +1,8 @@ +Name:Tanglepool Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Tanglepool Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {G} or {U}. diff --git a/forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt b/forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt new file mode 100644 index 00000000000..7a9b0684e68 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt @@ -0,0 +1,8 @@ +Name:Thornglint Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Thornglint Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {G} or {W}. diff --git a/forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt b/forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt new file mode 100644 index 00000000000..bf5e490605d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt @@ -0,0 +1,6 @@ +Name:Vectis Gloves +ManaCost:2 +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddKeyword$ Artifact landwalk | Description$ Equipped creature gets +2/+0 and has artifact landwalk. (It can’t be blocked as long as defending player controls an artifact land.) +K:Equip:2 +Oracle:Equipped creature gets +2/+0 and has artifact landwalk. (It can’t be blocked as long as defending player controls an artifact land.)\nEquip {2} diff --git a/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt b/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt index f4652a64568..54f40a8fe8f 100644 --- a/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt +++ b/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt @@ -13,6 +13,9 @@ Type=Other 18 U Shenanigans 19 R Ayula, Queen Among Bears 20 R Deep Forest Hermit +22 U Llanowar Tribe +23 U Scale Up +26 M The First Sliver 28 U Ingenious Infiltrator 30 U Soulherder 32 M Sword of Truth and Justice diff --git a/forge-gui/res/editions/Modern Horizons 2.txt b/forge-gui/res/editions/Modern Horizons 2.txt index 7429ed91797..7f828066d38 100644 --- a/forge-gui/res/editions/Modern Horizons 2.txt +++ b/forge-gui/res/editions/Modern Horizons 2.txt @@ -7,34 +7,64 @@ MciCode=mh2 Type=Other [cards] +3 C Arcbound Mouser 8 C Break Ties +10 U Constable of the Realm +18 C Landscaper Colos 19 C Late to Dinner 25 U Prismatic Ending 30 M Serra's Emissary 35 R Timeless Dragon +39 R Disapprove 44 R Fractured Sanity +48 U Junk Winder 50 U Lucid Dreams +51 C Mental Journey +53 U Mystic Redaction +55 C Phantasmal Dreadmaw 58 R Rise and Shine 59 R Rishadan Dockhand 63 C So Shiny +66 C Step Through 67 M Subtlety +68 C Suspend +70 U Sweep the Skies +73 U Vedalken Rogue +76 C Bone Shards +82 C Discerning Taste +85 U Flay Essence 87 M Grief 89 C Kitchen Imp 94 U Necromancer's Familiar +96 R Persist 97 R Profane Tutor 102 M Tourach, Dread Chanter 103 C Tourach's Canticle 105 U Underworld Hermit 106 R Unmarked Grave +109 C World-Weary 110 U Young Necromancer +113 U Arcbound Whelp +114 C Battle Plan +118 R Calibrated Blast 120 R Chef's Kiss +121 U Dragon's Rage Channeler 125 U Flametongue Yearling +127 C Glavanic Relay +129 R Glimpse of Tomorrow +132 R Harmonic Prodigy +137 R Obsidian Charmaw +140 C Skophos Reaver 142 U Spreading Insurrection 147 C Abundant Harvest 148 R Aeve, Progenitor Ooze 151 M Chatterfang, Squirrel General 152 C Chatterstorm -167 C "Bushitoad" +158 U Gifts of the Fae +162 R Gaea's Will +166 R Ignoble Hierarch +169 C Orchard Strider +170 C Rift Sower 172 U Scurry Oak 174 U Squirrel Sanctuary 175 U Squirrel Sovereign @@ -43,96 +73,148 @@ Type=Other 178 M Thrasta, Tempest's Roar 182 R Verdant Command 184 U Arcbound Shikari +186 R Asmoranomardicadaistinaculdacar 189 R Carth the Lion 192 M Dakkon, Shadow Slayer 194 C Drey Keeper 197 M Garth One-Eye +198 R General Ferrous Rokiric 202 M Grist, the Hunger Tide +201 U Graceful Restoration +204 R Lonis, Cryptozoologist 208 R Priest of Fell Rites 211 U Ravenous Squirrel +212 U Road // Ruin 218 R Yusri, Fortune's Flame +219 R Academy Manufacturer 222 C Bottle Golems 223 U Brainstone 225 R Diamond Lion 228 U Liquimetal Torque 229 U Monoskelion 234 M Scion of Draco -237 U Steel Camel +237 U Steel Dromedary 238 M Sword of Hearth and Home +239 C Tormod's Cryptkeeper +240 U The Underworld Cookbook +241 U Vectis Gloves 242 R Void Mirror 243 R Zabaz, the Glimmerwasp 244 R Arid Mesa +245 C Darkmoss Bridge +246 C Drossforge Bridge +247 C Goldmire Bridge 248 R Marsh Flats +249 C Mistvault Bridge 250 R Misty Rainforest +252 C Razortide Bridge +253 C Rustvale Bridge 254 R Scalding Tarn +255 C Silverbluff Bridge +256 C Slagwoods Bridge +257 C Tanglepool Bridge +258 C Thornglint Bridge 259 R Urza's Saga 260 R Verdant Catacombs +264 U Seal of Cleansing +266 U Soul Snare 267 U Counterspell 269 U Seal of Removal 271 R Wonder +274 U Greed 275 R Patriarch's Bidding 276 U Skirge Familiar 277 R Chance Encounter +278 U Flame Rift 279 R Goblin Bombardment +281 M Imperial Recruiter 282 U Mogg Salvage +285 U Quirion Ranger 286 R Squirrel Mob 296 U Extruder 300 U Zuran Orb 301 M Cabal Coffers +302 U Mishra's Factory 304 M Dakkon, Shadow Slayer -308 U Counterspell +306 M Grist, the Hunger Tide +308 R Counterspell 309 M Subtlety 311 M Grief 312 M Tourach, Dread Chanter +314 M Imperial Recruiter 316 M Chatterfang, Squirrel General 318 M Thrasta, Tempest's Roar 323 M Scion of Draco 324 M Sword of Hearth and Home 325 M Cabal Coffers +326 R Mishra's Factory 329 C Late to Dinner 333 M Serra's Emissary +334 R Disapprove 336 R Fractured Sanity +338 U Mystic Redaction 340 R Rise and Shine +343 C Kitchen Imp +345 R Persist 347 U Underworld Hermit 350 U Flametongue Yearling +352 R Harmonic Prodigy 354 C Abundant Harvest 357 R Sylvan Anthem 359 R Verdant Command 360 U Arcbound Shikari 363 M Dakkon, Shadow Slayer -364 U Prismatic Ending 365 M Garth One-Eye +366 R General Ferrous Rokiric +368 M Grist, the Hunger Tide 372 R Priest of Fell Rites 375 U Ravenous Squirrel +376 U Road // Ruin 380 R Urza's Saga -385 R Timeless Dragon +384 U Prismatic Ending +388 R Timeless Dragon 391 R Rishadan Dockhand +392 C Step Through +395 C Bone Shards +400 R Persist 401 R Profane Tutor +402 M Tourach, Dread Chanter +407 R Glimpse of Tomorrow 409 R Aeve, Progenitor Ooze 410 M Chatterfang, Squirrel General 411 C Chatterstorm 415 U Squirrel Sovereign +417 R Asmoranomardicadaistinaculdacar 418 R Carth the Lion 420 M Garth One-Eye 426 U Brainstone 427 R Diamond Lion +428 U Liquimetal Torque +429 U Monoskelion +431 M Scion of Draco 433 M Sword of Hearth and Home +434 U The Underworld Cookbook 435 R Void Mirror 436 R Arid Mesa 437 R Marsh Flats 438 R Misty Rainforest 439 R Scalding Tarn 440 R Verdant Catacombs -443 R Timeless Dragon +442 R Out of Time +445 R Timeless Dragon 447 R Rishadan Dockhand +448 R Suspend 452 R Profane Tutor 453 R Unmarked Grave 457 R Chef's Kiss +458 R Glimpse of Tomorrow 459 R Aeve, Progenitor Ooze +463 R Asmoranomardicadaistinaculdacar 464 R Carth the Lion 468 R Yusri, Fortune's Flame 470 R Diamond Lion 473 R Void Mirror +474 R Zabaz, the Glimmerwasp 475 R Arid Mesa 476 R Marsh Flats 477 R Misty Rainforest diff --git a/forge-gui/src/main/java/forge/util/OperatingSystem.java b/forge-gui/src/main/java/forge/util/OperatingSystem.java index 933f2a77886..e3cbb571ba1 100644 --- a/forge-gui/src/main/java/forge/util/OperatingSystem.java +++ b/forge-gui/src/main/java/forge/util/OperatingSystem.java @@ -2,6 +2,8 @@ package forge.util; import forge.gui.FThreads; +import java.awt.event.KeyEvent; + public class OperatingSystem { private static String os = System.getProperty("os.name").toLowerCase(); @@ -47,7 +49,10 @@ public class OperatingSystem { try { //use robot to simulate user action so system standby timer resets java.awt.Robot robot = new java.awt.Robot(); - robot.keyPress(0xF002); //simulate F15 key press since that won't do anything noticable + if (isMac()) + robot.keyPress(KeyEvent.VK_F1); // F15 increases Display Brightness by default. Switch to F1 + else + robot.keyPress(KeyEvent.VK_F15); //simulate F15 key press since that won't do anything noticeable delayedKeepAwakeTask = ThreadUtil.delay(30000, keepSystemAwake); //repeat every 30 seconds until flag cleared }