From a77eeab71dd986def37f9f3a7d7c8e202ea140cd Mon Sep 17 00:00:00 2001 From: Hellfish Date: Mon, 19 Nov 2012 20:03:00 +0000 Subject: [PATCH] *Variants: Created command zone view. *Variants: Moved effects and emblems to command zone. *Variants: Added a bunch of Vanguard cards (Thanks, Marc!) *Variants: Added a Vanguard home screen. --- .gitattributes | 17 +- res/cardsfolder/a/al_abaras_carpet.txt | 2 +- res/cardsfolder/a/alchemists_refuge.txt | 2 +- res/cardsfolder/a/angels_grace.txt | 4 +- res/cardsfolder/a/aquitects_will.txt | 2 +- .../a/arcbound_overseer_avatar.txt | 12 + res/cardsfolder/a/archangel_of_strife.txt | 8 +- .../a/ashling_the_pilgrim_avatar.txt | 9 + res/cardsfolder/a/ashnod.txt | 10 + res/cardsfolder/a/aven_mimeomancer.txt | 2 +- res/cardsfolder/b/barrin.txt | 9 + .../b/birds_of_paradise_avatar.txt | 10 + res/cardsfolder/b/blinding_beam.txt | 2 +- res/cardsfolder/c/cease_fire.txt | 2 +- res/cardsfolder/c/chameleon_blur.txt | 2 +- res/cardsfolder/c/channel.txt | 2 +- res/cardsfolder/c/chronatog_avatar.txt | 12 + res/cardsfolder/c/chronomantic_escape.txt | 2 +- res/cardsfolder/c/crovax.txt | 11 + res/cardsfolder/d/dauntless_escort.txt | 2 +- res/cardsfolder/d/dauntless_escort_avatar.txt | 9 + res/cardsfolder/d/deep_wood.txt | 2 +- res/cardsfolder/d/demoralize.txt | 4 +- res/cardsfolder/d/diamond_faerie_avatar.txt | 9 + res/cardsfolder/d/divine_light.txt | 2 +- res/cardsfolder/d/druids_deliverance.txt | 2 +- res/cardsfolder/d/due_respect.txt | 2 +- res/cardsfolder/e/eladamri.txt | 20 ++ .../e/eladamri_lord_of_leaves_avatar.txt | 10 + res/cardsfolder/e/elspeth_knight_errant.txt | 2 +- res/cardsfolder/e/endure.txt | 2 +- res/cardsfolder/e/ethereal_haze.txt | 2 +- res/cardsfolder/e/ethersworn_shieldmage.txt | 2 +- res/cardsfolder/f/falter.txt | 2 +- res/cardsfolder/f/festival.txt | 2 +- res/cardsfolder/f/flame_fusillade.txt | 2 +- res/cardsfolder/f/flaring_pain.txt | 2 +- res/cardsfolder/f/forfend.txt | 2 +- res/cardsfolder/g/gorilla_war_cry.txt | 2 +- res/cardsfolder/g/guardian_angel.txt | 2 +- res/cardsfolder/h/harmless_assault.txt | 2 +- res/cardsfolder/h/havengul_lich.txt | 2 +- res/cardsfolder/h/heavy_fog.txt | 2 +- res/cardsfolder/h/hero_of_oxid_ridge.txt | 2 +- res/cardsfolder/i/interdict.txt | 2 +- res/cardsfolder/i/island_sanctuary.txt | 2 +- res/cardsfolder/k/koth_of_the_hammer.txt | 2 +- res/cardsfolder/l/liege_of_the_tangle.txt | 2 +- .../l/liliana_of_the_dark_realms.txt | 2 +- res/cardsfolder/l/luminesce.txt | 2 +- res/cardsfolder/m/maddening_imp.txt | 2 +- res/cardsfolder/m/moonhold.txt | 4 +- res/cardsfolder/m/moonmist.txt | 2 +- res/cardsfolder/o/orims_chant.txt | 4 +- res/cardsfolder/o/oriss_samite_guardian.txt | 4 +- res/cardsfolder/p/pardic_miner.txt | 2 +- res/cardsfolder/p/praetors_counsel.txt | 2 +- res/cardsfolder/p/predatory_focus.txt | 2 +- res/cardsfolder/p/predatory_rampage.txt | 2 +- res/cardsfolder/p/prismatic_strands.txt | 2 +- res/cardsfolder/p/psychic_trance.txt | 2 +- res/cardsfolder/q/quicken.txt | 2 +- res/cardsfolder/r/radiant_kavu.txt | 2 +- res/cardsfolder/r/rootborn_defenses.txt | 2 +- res/cardsfolder/r/ruthless_invasion.txt | 2 +- res/cardsfolder/s/safe_passage.txt | 2 +- res/cardsfolder/s/scarecrow.txt | 2 +- res/cardsfolder/s/scouts_warning.txt | 2 +- res/cardsfolder/s/silence.txt | 2 +- res/cardsfolder/s/sirens_call.txt | 2 +- res/cardsfolder/s/sivvis_ruse.txt | 2 +- res/cardsfolder/s/snag.txt | 2 +- res/cardsfolder/s/solfatara.txt | 2 +- res/cardsfolder/s/sorin_lord_of_innistrad.txt | 2 +- res/cardsfolder/s/stigma_lasher.txt | 2 +- res/cardsfolder/t/tamiyo_the_moon_sage.txt | 4 +- res/cardsfolder/t/tanglesap.txt | 2 +- res/cardsfolder/t/tectonic_rift.txt | 2 +- res/cardsfolder/t/terrifying_presence.txt | 2 +- res/cardsfolder/t/titanias_song.txt | 2 +- res/cardsfolder/t/turf_wound.txt | 2 +- res/cardsfolder/u/undergrowth.txt | 2 +- res/cardsfolder/u/unstable_footing.txt | 2 +- res/cardsfolder/v/veiling_oddity.txt | 2 +- res/cardsfolder/v/veilstone_amulet.txt | 2 +- res/cardsfolder/v/venser_the_sojourner.txt | 2 +- res/cardsfolder/w/winding_canyons.txt | 2 +- res/cardsfolder/x/xantid_swarm.txt | 2 +- res/cardsfolder/y/yawgmoths_will.txt | 2 +- res/layouts/home_default.xml | 1 + res/layouts/match_default.xml | 2 + src/main/java/forge/Card.java | 4 +- src/main/java/forge/GameAction.java | 7 +- src/main/java/forge/card/CardRules.java | 29 ++ src/main/java/forge/card/CardRulesReader.java | 6 + src/main/java/forge/card/CardType.java | 9 + .../abilityfactory/effects/EffectEffect.java | 3 +- .../card/spellability/AbilityActivated.java | 2 +- .../java/forge/card/spellability/Spell.java | 2 +- src/main/java/forge/deck/Deck.java | 80 +++++- src/main/java/forge/deck/DeckRecognizer.java | 12 + src/main/java/forge/game/GameNew.java | 26 +- src/main/java/forge/game/GameState.java | 1 + src/main/java/forge/game/GameType.java | 6 + .../java/forge/game/MatchStartHelper.java | 38 ++- .../forge/game/PlayerStartConditions.java | 42 ++- .../java/forge/game/phase/CombatUtil.java | 2 +- src/main/java/forge/game/player/Player.java | 4 +- .../game/zone/PlayerZoneBattlefield.java | 2 +- src/main/java/forge/game/zone/ZoneType.java | 2 +- .../controllers/CEditorConstructed.java | 2 +- src/main/java/forge/gui/framework/EDocID.java | 15 +- src/main/java/forge/gui/home/EMenuGroup.java | 2 +- src/main/java/forge/gui/home/VHomeUI.java | 5 +- .../gui/home/quest/SSubmenuQuestUtil.java | 4 +- .../CSubmenuArchenemy.java | 2 +- .../gui/home/variant/CSubmenuVanguard.java | 176 ++++++++++++ .../VSubmenuArchenemy.java | 4 +- .../gui/home/variant/VSubmenuVanguard.java | 250 ++++++++++++++++++ src/main/java/forge/gui/match/CMatchUI.java | 10 +- src/main/java/forge/gui/match/VMatchUI.java | 37 +++ src/main/java/forge/item/CardDb.java | 9 + src/main/java/forge/item/CardPrinted.java | 29 ++ .../forge/properties/ForgePreferences.java | 2 +- 124 files changed, 1009 insertions(+), 128 deletions(-) create mode 100644 res/cardsfolder/a/arcbound_overseer_avatar.txt create mode 100644 res/cardsfolder/a/ashling_the_pilgrim_avatar.txt create mode 100644 res/cardsfolder/a/ashnod.txt create mode 100644 res/cardsfolder/b/barrin.txt create mode 100644 res/cardsfolder/b/birds_of_paradise_avatar.txt create mode 100644 res/cardsfolder/c/chronatog_avatar.txt create mode 100644 res/cardsfolder/c/crovax.txt create mode 100644 res/cardsfolder/d/dauntless_escort_avatar.txt create mode 100644 res/cardsfolder/d/diamond_faerie_avatar.txt create mode 100644 res/cardsfolder/e/eladamri.txt create mode 100644 res/cardsfolder/e/eladamri_lord_of_leaves_avatar.txt rename src/main/java/forge/gui/home/{multiplayer => variant}/CSubmenuArchenemy.java (98%) create mode 100644 src/main/java/forge/gui/home/variant/CSubmenuVanguard.java rename src/main/java/forge/gui/home/{multiplayer => variant}/VSubmenuArchenemy.java (95%) create mode 100644 src/main/java/forge/gui/home/variant/VSubmenuVanguard.java diff --git a/.gitattributes b/.gitattributes index b71093373c9..0fa6fcf1cf5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -405,6 +405,7 @@ res/cardsfolder/a/arcbound_crusher.txt svneol=native#text/plain res/cardsfolder/a/arcbound_hybrid.txt svneol=native#text/plain res/cardsfolder/a/arcbound_lancer.txt svneol=native#text/plain res/cardsfolder/a/arcbound_overseer.txt svneol=native#text/plain +res/cardsfolder/a/arcbound_overseer_avatar.txt -text res/cardsfolder/a/arcbound_ravager.txt svneol=native#text/plain res/cardsfolder/a/arcbound_reclaimer.txt svneol=native#text/plain res/cardsfolder/a/arcbound_slith.txt svneol=native#text/plain @@ -512,8 +513,10 @@ res/cardsfolder/a/ashenmoor_liege.txt svneol=native#text/plain res/cardsfolder/a/ashes_of_the_fallen.txt svneol=native#text/plain res/cardsfolder/a/ashes_to_ashes.txt svneol=native#text/plain res/cardsfolder/a/ashling_the_extinguisher.txt -text +res/cardsfolder/a/ashling_the_pilgrim_avatar.txt -text res/cardsfolder/a/ashlings_prerogative.txt -text res/cardsfolder/a/ashmouth_hound.txt -text +res/cardsfolder/a/ashnod.txt -text res/cardsfolder/a/ashnods_altar.txt svneol=native#text/plain res/cardsfolder/a/ashnods_battle_gear.txt svneol=native#text/plain res/cardsfolder/a/ashnods_cylix.txt -text @@ -746,6 +749,7 @@ res/cardsfolder/b/barren_glory.txt svneol=native#text/plain res/cardsfolder/b/barren_moor.txt svneol=native#text/plain res/cardsfolder/b/barrenton_cragtreads.txt svneol=native#text/plain res/cardsfolder/b/barrenton_medic.txt svneol=native#text/plain +res/cardsfolder/b/barrin.txt -text res/cardsfolder/b/barrin_master_wizard.txt svneol=native#text/plain res/cardsfolder/b/barrins_codex.txt svneol=native#text/plain res/cardsfolder/b/barrins_unmaking.txt -text @@ -878,6 +882,7 @@ res/cardsfolder/b/biorhythm.txt svneol=native#text/plain res/cardsfolder/b/birchlore_rangers.txt svneol=native#text/plain res/cardsfolder/b/bird_maiden.txt svneol=native#text/plain res/cardsfolder/b/birds_of_paradise.txt svneol=native#text/plain +res/cardsfolder/b/birds_of_paradise_avatar.txt -text res/cardsfolder/b/birthing_pod.txt -text res/cardsfolder/b/biting_tether.txt svneol=native#text/plain res/cardsfolder/b/bitter_ordeal.txt svneol=native#text/plain @@ -1635,6 +1640,7 @@ res/cardsfolder/c/chrome_steed.txt svneol=native#text/plain res/cardsfolder/c/chromescale_drake.txt svneol=native#text/plain res/cardsfolder/c/chromium.txt svneol=native#text/plain res/cardsfolder/c/chronatog.txt svneol=native#text/plain +res/cardsfolder/c/chronatog_avatar.txt -text res/cardsfolder/c/chronatog_totem.txt svneol=native#text/plain res/cardsfolder/c/chronic_flooding.txt -text res/cardsfolder/c/chronomantic_escape.txt -text @@ -1999,6 +2005,7 @@ res/cardsfolder/c/crossbow_infantry.txt svneol=native#text/plain res/cardsfolder/c/crosstown_courier.txt -text res/cardsfolder/c/crossway_vampire.txt -text res/cardsfolder/c/crosswinds.txt svneol=native#text/plain +res/cardsfolder/c/crovax.txt -text res/cardsfolder/c/crovax_ascendant_hero.txt svneol=native#text/plain res/cardsfolder/c/crovax_the_cursed.txt -text svneol=unset#text/plain res/cardsfolder/c/crowd_favorites.txt svneol=native#text/plain @@ -2203,6 +2210,7 @@ res/cardsfolder/d/daru_warchief.txt svneol=native#text/plain res/cardsfolder/d/daunting_defender.txt svneol=native#text/plain res/cardsfolder/d/dauntless_dourbark.txt svneol=native#text/plain res/cardsfolder/d/dauntless_escort.txt svneol=native#text/plain +res/cardsfolder/d/dauntless_escort_avatar.txt -text res/cardsfolder/d/dauthi_cutthroat.txt svneol=native#text/plain res/cardsfolder/d/dauthi_embrace.txt svneol=native#text/plain res/cardsfolder/d/dauthi_ghoul.txt svneol=native#text/plain @@ -2456,6 +2464,7 @@ res/cardsfolder/d/diabolic_servitude.txt -text svneol=unset#text/plain res/cardsfolder/d/diabolic_tutor.txt svneol=native#text/plain res/cardsfolder/d/diabolic_vision.txt svneol=native#text/plain res/cardsfolder/d/diamond_faerie.txt svneol=native#text/plain +res/cardsfolder/d/diamond_faerie_avatar.txt -text res/cardsfolder/d/diamond_kaleidoscope.txt svneol=native#text/plain res/cardsfolder/d/diamond_valley.txt svneol=native#text/plain res/cardsfolder/d/didgeridoo.txt svneol=native#text/plain @@ -2852,7 +2861,9 @@ res/cardsfolder/e/eiganjo_free_riders.txt svneol=native#text/plain res/cardsfolder/e/eightfold_maze.txt svneol=native#text/plain res/cardsfolder/e/ekundu_griffin.txt svneol=native#text/plain res/cardsfolder/e/el_hajjaj.txt svneol=native#text/plain +res/cardsfolder/e/eladamri.txt -text res/cardsfolder/e/eladamri_lord_of_leaves.txt svneol=native#text/plain +res/cardsfolder/e/eladamri_lord_of_leaves_avatar.txt -text res/cardsfolder/e/eladamris_call.txt svneol=native#text/plain res/cardsfolder/e/eladamris_vineyard.txt svneol=native#text/plain res/cardsfolder/e/eland_umbra.txt svneol=native#text/plain @@ -13089,8 +13100,6 @@ src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletBuild.java -text src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletContests.java -text src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletLoad.java -text src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletQuick.java -text -src/main/java/forge/gui/home/multiplayer/CSubmenuArchenemy.java -text -src/main/java/forge/gui/home/multiplayer/VSubmenuArchenemy.java -text src/main/java/forge/gui/home/package-info.java svneol=native#text/plain src/main/java/forge/gui/home/quest/CSubmenuChallenges.java -text src/main/java/forge/gui/home/quest/CSubmenuDuels.java -text @@ -13123,6 +13132,10 @@ src/main/java/forge/gui/home/settings/VSubmenuAvatars.java -text src/main/java/forge/gui/home/settings/VSubmenuDownloaders.java -text src/main/java/forge/gui/home/settings/VSubmenuPreferences.java -text src/main/java/forge/gui/home/settings/package-info.java svneol=native#text/plain +src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java -text +src/main/java/forge/gui/home/variant/CSubmenuVanguard.java -text +src/main/java/forge/gui/home/variant/VSubmenuArchenemy.java -text +src/main/java/forge/gui/home/variant/VSubmenuVanguard.java -text src/main/java/forge/gui/match/CMatchUI.java -text src/main/java/forge/gui/match/ControlWinLose.java -text src/main/java/forge/gui/match/GauntletWinLose.java -text diff --git a/res/cardsfolder/a/al_abaras_carpet.txt b/res/cardsfolder/a/al_abaras_carpet.txt index af1cecb2132..af8f3a28f12 100644 --- a/res/cardsfolder/a/al_abaras_carpet.txt +++ b/res/cardsfolder/a/al_abaras_carpet.txt @@ -3,7 +3,7 @@ ManaCost:5 Types:Artifact Text:no text A:AB$ Effect | Cost$ 5 T | Name$ Al-abara's Carpet Effect | StaticAbilities$ STPrevent | SpellDescription$ Prevent all damage that would be dealt to you this turn by attacking creatures without flying. -SVar:STPrevent:Mode$ PreventDamage | Target$ You | Source$ Creature.attacking+withoutFlying | Description$ Prevent all damage that would be dealt to you this turn by attacking creatures without flying. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Target$ You | Source$ Creature.attacking+withoutFlying | Description$ Prevent all damage that would be dealt to you this turn by attacking creatures without flying. SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/al_abaras_carpet.jpg diff --git a/res/cardsfolder/a/alchemists_refuge.txt b/res/cardsfolder/a/alchemists_refuge.txt index 1bbeb2d7659..0b51a824329 100644 --- a/res/cardsfolder/a/alchemists_refuge.txt +++ b/res/cardsfolder/a/alchemists_refuge.txt @@ -4,7 +4,7 @@ Types:Land Text:no text A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. A:AB$ Effect | Cost$ U G T | Name$ Refuge Effect | StaticAbilities$ QuickSpell | SpellDescription$ Until end of turn, you may cast nonland cards as though they had flash. -SVar:QuickSpell:Mode$ Continuous | Affected$ You | AddKeyword$ You may cast nonland cards as though they had flash. | Description$ You may cast nonland cards as though they had flash. +SVar:QuickSpell:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ You may cast nonland cards as though they had flash. | Description$ You may cast nonland cards as though they had flash. SVar:PlayMain1:TRUE SVar:RemRandomDeck:True SVar:RemAIDeck:True diff --git a/res/cardsfolder/a/angels_grace.txt b/res/cardsfolder/a/angels_grace.txt index b13f0e49c3f..8879ae3a270 100644 --- a/res/cardsfolder/a/angels_grace.txt +++ b/res/cardsfolder/a/angels_grace.txt @@ -4,8 +4,8 @@ Types:Instant Text:no text K:Split second A:SP$ Effect | Cost$ W | Name$ Angel's Grace Effect | Keywords$ AliFromCairo | StaticAbilities$ STCantLose,STOppsCantWin | AILogic$ Fog | SpellDescription$ You can't lose the game this turn and your opponents can't win the game this turn. Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. -SVar:STCantLose:Mode$ Continuous | Affected$ You | AddKeyword$ You can't lose the game. | Description$ You can't lose the game. -SVar:STOppsCantWin:Mode$ Continuous | Affected$ You | AddKeyword$ Your opponents can't win the game. | Description$ Your opponents can't win the game. +SVar:STCantLose:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ You can't lose the game. | Description$ You can't lose the game. +SVar:STOppsCantWin:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ Your opponents can't win the game. | Description$ Your opponents can't win the game. SVar:AliFromCairo:Damage that would reduce your life total to less than 1 reduces it to 1 instead. SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/angels_grace.jpg diff --git a/res/cardsfolder/a/aquitects_will.txt b/res/cardsfolder/a/aquitects_will.txt index ba3dd0b8a9d..3375c47903b 100644 --- a/res/cardsfolder/a/aquitects_will.txt +++ b/res/cardsfolder/a/aquitects_will.txt @@ -5,7 +5,7 @@ Text:no text A:SP$ Effect | Cost$ U | Name$ Flood Effect | StaticAbilities$ STFlood | Unique$ True | Duration$ Permanent | SubAbility$ TrigPutCounter | SpellDescription$ Put a flood counter on target land. That land is an island in addition to its other types for as long as it has a flood counter on it. If you control a Merfolk, draw a card. SVar:TrigPutCounter:DB$ PutCounter | Cost$ 0 | ValidTgts$ Land | CounterType$ FLOOD | CounterNum$ 1 | TgtPrompt$ Select target land | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Cost$ 0 | NumCards$ 1 | ConditionPresent$ Merfolk.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Merfolk, -SVar:STFlood:Mode$ Continuous | Affected$ Land.counters_GE1_FLOOD | AddType$ Island +SVar:STFlood:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Land.counters_GE1_FLOOD | AddType$ Island SVar:RemRandomDeck:True SVar:RemAIDeck:True SVar:Rarity:Common diff --git a/res/cardsfolder/a/arcbound_overseer_avatar.txt b/res/cardsfolder/a/arcbound_overseer_avatar.txt new file mode 100644 index 00000000000..bc90fd46b3a --- /dev/null +++ b/res/cardsfolder/a/arcbound_overseer_avatar.txt @@ -0,0 +1,12 @@ +Name:Arcbound Overseer Avatar +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:+0/+3 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ BuildCounter | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put a +1/+1 counter on target creature you control. +SVar:BuildCounter:AB$ PutCounter | Cost$ 0 | CounterType$ P1P1 | CounterNum$ 1 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ ChargeCounter | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put a charge counter on target permanent you control. +SVar:ChargeCounter:AB$ PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 1 | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control +SVar:Rarity:Special +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=182296&type=card +End \ No newline at end of file diff --git a/res/cardsfolder/a/archangel_of_strife.txt b/res/cardsfolder/a/archangel_of_strife.txt index 5dd76df57ea..d72fd5c1d19 100644 --- a/res/cardsfolder/a/archangel_of_strife.txt +++ b/res/cardsfolder/a/archangel_of_strife.txt @@ -11,10 +11,10 @@ SVar:WarChoice:DB$ Effect | Name$ Archangel War Effect | ChoiceDescription$ War SVar:PeaceChoice:DB$ Effect | Name$ Archangel Peace Effect | ChoiceDescription$ Peace | Duration$ UntilHostLeavesPlay | RememberEffect$ True SVar:Attacking:DB$ Effect | Name$ Archangel War Effect | ChoiceDescription$ War | EffectOwner$ Opponent | Duration$ UntilHostLeavesPlay | RememberEffect$ True SVar:Defensive:DB$ Effect | Name$ Archangel Peace Effect | ChoiceDescription$ Peace | EffectOwner$ Opponent | Duration$ UntilHostLeavesPlay | RememberEffect$ True -S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 3 | CheckSVar$ WarYou | SVarCompare$ GE1 | References$ WarYou -S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddToughness$ 3 | CheckSVar$ PeaceYou | SVarCompare$ GE1 | References$ PeaceYou -S:Mode$ Continuous | Affected$ Creature.YouDontCtrl | AddPower$ 3 | CheckSVar$ WarOpp | SVarCompare$ GE1 | References$ WarOpp -S:Mode$ Continuous | Affected$ Creature.YouDontCtrl | AddToughness$ 3 | CheckSVar$ PeaceOpp | SVarCompare$ GE1 | References$ PeaceOpp +S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddPower$ 3 | CheckSVar$ WarYou | SVarCompare$ GE1 | References$ WarYou +S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddToughness$ 3 | CheckSVar$ PeaceYou | SVarCompare$ GE1 | References$ PeaceYou +S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouDontCtrl | AddPower$ 3 | CheckSVar$ WarOpp | SVarCompare$ GE1 | References$ WarOpp +S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouDontCtrl | AddToughness$ 3 | CheckSVar$ PeaceOpp | SVarCompare$ GE1 | References$ PeaceOpp T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Defined$ Self | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:WarYou:Remembered$Valid Card.namedArchangel War Effect+YouCtrl diff --git a/res/cardsfolder/a/ashling_the_pilgrim_avatar.txt b/res/cardsfolder/a/ashling_the_pilgrim_avatar.txt new file mode 100644 index 00000000000..a7daaf8296c --- /dev/null +++ b/res/cardsfolder/a/ashling_the_pilgrim_avatar.txt @@ -0,0 +1,9 @@ +Name:Ashling the Pilgrim Avatar +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:-1/+6 +A:AB$ DamageAll | ActivationZone$ Command | Cost$ 2 | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. +SVar:Rarity:Special +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=182283&type=card +End \ No newline at end of file diff --git a/res/cardsfolder/a/ashnod.txt b/res/cardsfolder/a/ashnod.txt new file mode 100644 index 00000000000..9cbb0c4f046 --- /dev/null +++ b/res/cardsfolder/a/ashnod.txt @@ -0,0 +1,10 @@ +Name:Ashnod +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:+1/-8 +T:Mode$ DamageDone | ValidSource$ Creature | ValidTarget$ You | Execute$ TrigDestroy | TriggerZones$ Command | TriggerDescription$ Whenever a creature deals damage to you, destroy it. +SVar:TrigDestroy:AB$ Destroy | Cost$ 0 | Defined$ TriggeredSource +SVar:Rarity:Special +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=12329&type=card +End \ No newline at end of file diff --git a/res/cardsfolder/a/aven_mimeomancer.txt b/res/cardsfolder/a/aven_mimeomancer.txt index b42c9bd1a02..09a2a072b0d 100644 --- a/res/cardsfolder/a/aven_mimeomancer.txt +++ b/res/cardsfolder/a/aven_mimeomancer.txt @@ -6,7 +6,7 @@ PT:3/1 K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put a feather counter on target creature. If you do, that creature is 3/1 and has flying for as long as it has a feather counter on it. SVar:TrigPutCounter:AB$ PutCounter | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ FEATHER | CounterNum$ 1 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Targeted | staticAbilities$ MimeomancerStatic | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | StaticAbilities$ MimeomancerStatic | Permanent$ True SVar:MimeomancerStatic:Mode$ Continuous | Affected$ Card.Self+counters_GE1_FEATHER | SetPower$ 3 | SetToughness$ 1 | AddKeyword$ Flying | Description$ CARDNAME is 3/1 and has flying for as long as it has a feather counter on it. SVar:RemAIDeck:True SVar:Rarity:Rare diff --git a/res/cardsfolder/b/barrin.txt b/res/cardsfolder/b/barrin.txt new file mode 100644 index 00000000000..2030580e4bd --- /dev/null +++ b/res/cardsfolder/b/barrin.txt @@ -0,0 +1,9 @@ +Name:Barrin +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:+0/+6 +A:AB$ ChangeZone | ActivationZone$ Command | Cost$ Sac<1/Permanent> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. +SVar:Rarity:Special +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=4957&type=card +End \ No newline at end of file diff --git a/res/cardsfolder/b/birds_of_paradise_avatar.txt b/res/cardsfolder/b/birds_of_paradise_avatar.txt new file mode 100644 index 00000000000..c82c6b89912 --- /dev/null +++ b/res/cardsfolder/b/birds_of_paradise_avatar.txt @@ -0,0 +1,10 @@ +Name:Birds of Paradise Avatar +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:+0/-3 +S:Mode$ Continuous | EffectZone$ Command | Affected$ Land.YouCtrl | AddAbility$ AnyMana | Description$ Lands you control have "Tap: Add one mana of any color to your mana pool." +SVar:AnyMana:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color to your mana pool. +SVar:Rarity:Special +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=182291&type=card +End \ No newline at end of file diff --git a/res/cardsfolder/b/blinding_beam.txt b/res/cardsfolder/b/blinding_beam.txt index ecfd8b621fb..a5e5f3b0fb0 100644 --- a/res/cardsfolder/b/blinding_beam.txt +++ b/res/cardsfolder/b/blinding_beam.txt @@ -6,7 +6,7 @@ A:SP$ Tap | Cost$ 2 W | ValidTgts$ Creature | TargetMin$ 2 | TargetMax$ 2 | Tgt A:SP$ Effect | Cost$ 2 W | ValidTgts$ Player | TgtPrompt$ Select target player | IsCurse$ True | StaticAbilities$ DontUntap | Triggers$ RestoreSight | SVars$ ExileEffect | RememberObjects$ Targeted | Duration$ Permanent | SpellDescription$ or creatures don't untap during target player's next untap step. A:SP$ Effect | Cost$ 3 W | ValidTgts$ Player | TgtPrompt$ Select target player | IsCurse$ True | StaticAbilities$ DontUntap | Triggers$ RestoreSight | SVars$ ExileEffect | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | Duration$ Permanent | SubAbility$ BlindTheFoe | PrecostDesc$ Entwine | CostDesc$ 1 | NonBasicSpell$ True | SpellDescription$ (Choose both if you pay the entwine cost.) SVar:BlindTheFoe:DB$ Tap | ValidTgts$ Creature | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Select two target creatures -SVar:DontUntap:Mode$ Continuous | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ HIDDEN This card doesn't untap during your next untap step. +SVar:DontUntap:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ HIDDEN This card doesn't untap during your next untap step. SVar:RestoreSight:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.IsRemembered | TriggerZones$ Battlefield | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile SVar:RemAIDeck:True diff --git a/res/cardsfolder/c/cease_fire.txt b/res/cardsfolder/c/cease_fire.txt index 1b0703bf2d3..f7a6f6d239c 100644 --- a/res/cardsfolder/c/cease_fire.txt +++ b/res/cardsfolder/c/cease_fire.txt @@ -3,7 +3,7 @@ ManaCost:2 W Types:Instant Text:no text A:SP$ Effect | Cost$ 2 W | ValidTgts$ Player | Name$ Cease-Fire Effect | StaticAbilities$ STCantBeCast | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SubAbility$ DBDraw | SpellDescription$ Target player can't cast creature spells this turn. -SVar:STCantBeCast:Mode$ CantBeCast | ValidCard$ Creature | Caster$ Player.IsRemembered | Description$ Target player can't cast creature spells this turn. +SVar:STCantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Creature | Caster$ Player.IsRemembered | Description$ Target player can't cast creature spells this turn. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/cease_fire.jpg diff --git a/res/cardsfolder/c/chameleon_blur.txt b/res/cardsfolder/c/chameleon_blur.txt index f3e4a7cf81b..40a182b9c09 100644 --- a/res/cardsfolder/c/chameleon_blur.txt +++ b/res/cardsfolder/c/chameleon_blur.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Instant Text:no text A:SP$ Effect | Cost$ 3 G | Name$ Chameleon Blur Effect | StaticAbilities$ STPrevent | AILogic$ Fog | SpellDescription$ Prevent all damage that creatures would deal to players this turn. -SVar:STPrevent:Mode$ PreventDamage | Source$ Creature | Target$ Player | Description$ Prevent all damage that creatures would deal to players this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Source$ Creature | Target$ Player | Description$ Prevent all damage that creatures would deal to players this turn. SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/chameleon_blur.jpg diff --git a/res/cardsfolder/c/channel.txt b/res/cardsfolder/c/channel.txt index a393c9ee0da..6d1361e796b 100644 --- a/res/cardsfolder/c/channel.txt +++ b/res/cardsfolder/c/channel.txt @@ -3,7 +3,7 @@ ManaCost:G G Types:Sorcery Text:no text A:SP$ Effect | Cost$ G G | Name$ Channel Effect | Abilities$ ABMana | SpellDescription$ Until end of turn, any time you could activate a mana ability, you may pay 1 life. If you do, add 1 to your mana pool. -SVar:ABMana:AB$Mana | Cost$ PayLife<1> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. +SVar:ABMana:AB$Mana | Cost$ PayLife<1> | ActivationZone$ Command | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/channel.jpg diff --git a/res/cardsfolder/c/chronatog_avatar.txt b/res/cardsfolder/c/chronatog_avatar.txt new file mode 100644 index 00000000000..2f335894cf6 --- /dev/null +++ b/res/cardsfolder/c/chronatog_avatar.txt @@ -0,0 +1,12 @@ +Name:Chronatog Avatar +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:-1/+1 +S:Mode$ Continuous | EffectZone$ Command | Affected$ You | SetMaxHandSize$ -1 | Description$ You have no maximum hand size. +A:AB$ Draw | ActivationZone$ Command | Cost$ 0 | NumCards$ 3 | Defined$ You | ActivationLimit$ 1 | SubAbility$ DBSkipTurn | SpellDescription$ Draw three cards. You skip your next turn. Activate this ability only once each turn. +SVar:DBSkipTurn:DB$ AddTurn | NumTurns$ 1 | Defined$ Opponent +SVar:RemAIDeck:True +SVar:Rarity:Special +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=201898&type=card +End \ No newline at end of file diff --git a/res/cardsfolder/c/chronomantic_escape.txt b/res/cardsfolder/c/chronomantic_escape.txt index 6f23965cad0..47adb046be5 100644 --- a/res/cardsfolder/c/chronomantic_escape.txt +++ b/res/cardsfolder/c/chronomantic_escape.txt @@ -4,7 +4,7 @@ Types:Sorcery Text:no text K:Suspend:3:2 W A:SP$ Effect | Cost$ 4 W W | Name$ Chronomantic Escape Effect | StaticAbilities$ STCantAttack | Duration$ UntilYourNextTurn | SubAbility$ DBChange | SpellDescription$ Until your next turn, creatures can't attack you. Exile CARDNAME with three time counters on it. -SVar:STCantAttack:Mode$ CantAttack | ValidCard$ Creature | Target$ You | Description$ Creatures can't attack you. +SVar:STCantAttack:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature | Target$ You | Description$ Creatures can't attack you. SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | RememberChanged$ True | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ TIME | CounterNum$ 3 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/res/cardsfolder/c/crovax.txt b/res/cardsfolder/c/crovax.txt new file mode 100644 index 00000000000..8bcb5509455 --- /dev/null +++ b/res/cardsfolder/c/crovax.txt @@ -0,0 +1,11 @@ +Name:Crovax +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:+2/+0 +T:Mode$ DamageDone | ValidSource$ Creature+YouCtrl | ValidTarget$ Creature,Player | TriggerZones$ Command | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature you control deals damage to a creature or player, you gain 1 life. +SVar:TrigGainLife:AB$ GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 +SVar:Rarity:Special +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=4958&type=card +Oracle:Hand +2, life +0\nWhenever a creature you control deals damage to a creature or player, you gain 1 life. +End \ No newline at end of file diff --git a/res/cardsfolder/d/dauntless_escort.txt b/res/cardsfolder/d/dauntless_escort.txt index 0bc1de7e6d5..ec1f85384a3 100644 --- a/res/cardsfolder/d/dauntless_escort.txt +++ b/res/cardsfolder/d/dauntless_escort.txt @@ -4,7 +4,7 @@ Types:Creature Rhino Soldier Text:no text PT:3/3 A:AB$ Effect | Cost$ Sac<1/CARDNAME> | Name$ Dauntless Escort Effect | StaticAbilities$ KWPump | SpellDescription$ Creatures you control are indestructible this turn. -SVar:KWPump:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ HIDDEN Indestructible | Description$ Creatures you control are indestructible this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddHiddenKeyword$ HIDDEN Indestructible | Description$ Creatures you control are indestructible this turn. SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/dauntless_escort.jpg diff --git a/res/cardsfolder/d/dauntless_escort_avatar.txt b/res/cardsfolder/d/dauntless_escort_avatar.txt new file mode 100644 index 00000000000..8cc8300a6a4 --- /dev/null +++ b/res/cardsfolder/d/dauntless_escort_avatar.txt @@ -0,0 +1,9 @@ +Name:Dauntless Escort Avatar +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:+1/+1 +S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddKeyword$ Exalted | Description$ Creatures you control have exalted. (Whenever a creature you control attacks alone, it gets +1/+1 until end of turn for each instance of exalted among permanents you control.) +SVar:Rarity:Special +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=201898&type=card +End \ No newline at end of file diff --git a/res/cardsfolder/d/deep_wood.txt b/res/cardsfolder/d/deep_wood.txt index 779ddf759de..96310b0b151 100644 --- a/res/cardsfolder/d/deep_wood.txt +++ b/res/cardsfolder/d/deep_wood.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Instant Text:no text A:SP$ Effect | Cost$ 1 G | Name$ Deep Wood Effect | StaticAbilities$ STPrevent | AILogic$ Fog | OpponentTurn$ True | ActivationPhases$ Declare Attackers - Play Instants and Abilities | SpellDescription$ Cast CARDNAME only during the declare attackers step and only if you've been attacked this step. Prevent all damage that would be dealt to you this turn by attacking creatures. -SVar:STPrevent:Mode$ PreventDamage | Source$ Creature.attacking | Target$ You | Description$ Prevent all damage that would be dealt to you this turn by attacking creatures. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Source$ Creature.attacking | Target$ You | Description$ Prevent all damage that would be dealt to you this turn by attacking creatures. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/deep_wood.jpg SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/86.jpg diff --git a/res/cardsfolder/d/demoralize.txt b/res/cardsfolder/d/demoralize.txt index d4a8bc3d672..2c9ba4e5de9 100644 --- a/res/cardsfolder/d/demoralize.txt +++ b/res/cardsfolder/d/demoralize.txt @@ -4,8 +4,8 @@ Types:Instant Text:no text A:SP$ Effect | Cost$ 2 R | Name$ Demoralize Effect | StaticAbilities$ KWPump | SubAbility$ DBEffect2 | SpellDescription$ Each creature can't be blocked this turn except by two or more creatures. SVar:DBEffect2:DB$ Effect | Name$ Demoralize Effect 2 | StaticAbilities$ KWPump2 | SpellDescription$ Threshold - If seven or more cards are in your graveyard, creatures can't block this turn. -SVar:KWPump:Mode$ Continuous | Affected$ Creature | AddKeyword$ CARDNAME can't be blocked except by two or more creatures. | Description$ Each creature can't be blocked this turn except by two or more creatures. -SVar:KWPump2:Mode$ Continuous | Affected$ Creature | AddKeyword$ CARDNAME can't block. | Threshold$ True | Description$ Threshold - If seven or more cards are in your graveyard, creatures can't block this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature | AddKeyword$ CARDNAME can't be blocked except by two or more creatures. | Description$ Each creature can't be blocked this turn except by two or more creatures. +SVar:KWPump2:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature | AddKeyword$ CARDNAME can't block. | Threshold$ True | Description$ Threshold - If seven or more cards are in your graveyard, creatures can't block this turn. SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/demoralize.jpg diff --git a/res/cardsfolder/d/diamond_faerie_avatar.txt b/res/cardsfolder/d/diamond_faerie_avatar.txt new file mode 100644 index 00000000000..a96f2323fa2 --- /dev/null +++ b/res/cardsfolder/d/diamond_faerie_avatar.txt @@ -0,0 +1,9 @@ +Name:Diamond Faerie Avatar +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:+0/+5 +A:AB$ Pump | ActivationZone$ Command | Cost$ S | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ 1 | NumDef$ 1 | SpellDescription$ Target creature you control gets +1/+1 until end of turn. +SVar:Rarity:Special +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=182274&type=card +End \ No newline at end of file diff --git a/res/cardsfolder/d/divine_light.txt b/res/cardsfolder/d/divine_light.txt index 6397407c7d4..2188e278a44 100644 --- a/res/cardsfolder/d/divine_light.txt +++ b/res/cardsfolder/d/divine_light.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Instant Text:no text A:SP$ Effect | Cost$ W | Name$ Divine Light Effect | StaticAbilities$ STPrevent | SpellDescription$ Prevent all damage that would be dealt this turn to creatures you control. -SVar:STPrevent:Mode$ PreventDamage | Target$ Creature.YouCtrl | Description$ Prevent all damage that would be dealt this turn to creatures you control. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Target$ Creature.YouCtrl | Description$ Prevent all damage that would be dealt this turn to creatures you control. SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_light.jpg diff --git a/res/cardsfolder/d/druids_deliverance.txt b/res/cardsfolder/d/druids_deliverance.txt index 7a0615c8b1f..23ae96c8b55 100644 --- a/res/cardsfolder/d/druids_deliverance.txt +++ b/res/cardsfolder/d/druids_deliverance.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Instant Text:no text A:SP$ Effect | Cost$ 1 G | Name$ Druid's Deliverance Effect | StaticAbilities$ STPrevent | AILogic$ Fog | SubAbility$ DBChoose | SpellDescription$ Prevent all combat damage that would be dealt to you this turn. Populate. (Put a token onto the battlefield that's a copy of a creature token you control.) -SVar:STPrevent:Mode$ PreventDamage | CombatDamage$ True | Target$ You | Description$ Prevent all combat damage that would be dealt to you this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | CombatDamage$ True | Target$ You | Description$ Prevent all combat damage that would be dealt to you this turn. SVar:DBChoose:DB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | RememberChosen$ True SVar:DBCopy:DB$ CopyPermanent | Defined$ Remembered SVar:Rarity:Common diff --git a/res/cardsfolder/d/due_respect.txt b/res/cardsfolder/d/due_respect.txt index b28dd2e7835..d0db63f9eee 100644 --- a/res/cardsfolder/d/due_respect.txt +++ b/res/cardsfolder/d/due_respect.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Instant Text:no text A:SP$ Effect | Cost$ 1 W | Name$ Due Respect Effect | StaticAbilities$ STETBTapped | SubAbility$ DBDraw | AILogic$ BeginningOfOppTurn | SpellDescription$ Permanents enter the battlefield tapped this turn. -SVar:STETBTapped:Mode$ ETBTapped | ValidCard$ Permanent | Description$ Permanents enter the battlefield tapped this turn. +SVar:STETBTapped:Mode$ ETBTapped | EffectZone$ Command | ValidCard$ Permanent | Description$ Permanents enter the battlefield tapped this turn. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/due_respect.jpg diff --git a/res/cardsfolder/e/eladamri.txt b/res/cardsfolder/e/eladamri.txt new file mode 100644 index 00000000000..01e02429ebb --- /dev/null +++ b/res/cardsfolder/e/eladamri.txt @@ -0,0 +1,20 @@ +Name:Eladamri +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:-1/+15 +A:AB$ Effect | ActivationZone$ Command | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect damage from | ReplacementEffects$ SelflessCombat,SelflessNonCombat | Triggers$ OutOfSight | SVars$ CombatDmg,NonCombatDmg,RestDmgCombat,RestDmg,ExileEffect,X,Y | References$ SelflessCombat,SelflessNonCombat,OutOfSight,CombatDmg,NonCombatDmg,RestDmgCombat,RestDmg,ExileEffect,X,Y | RememberObjects$ Targeted | Duration$ Permanent | SpellDescription$ The next 1 damage that would be dealt to target creature you control is dealt to you instead. +SVar:SelflessCombat:Event$ DamageDone | ValidTarget$ Card.IsRemembered | IsCombat$ True | ReplaceWith$ CombatDmg | Description$ The next 1 damage that would be dealt to target creature you control is dealt to you instead. +SVar:SelflessNonCombat:Event$ DamageDone | ValidTarget$ Card.IsRemembered | IsCombat$ False | ReplaceWith$ NonCombatDmg | Secondary$ True | Description$ The next 1 damage that would be dealt to target creature you control is dealt to you instead. +SVar:CombatDmg:AB$ DealDamage | Cost$ 0 | Defined$ You | DamageSource$ ReplacedSource | CombatDamage$ True | NumDmg$ 1 | SubAbility$ RestDmgCombat | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE1 +SVar:NonCombatDmg:AB$ DealDamage | Cost$ 0 | Defined$ You | DamageSource$ ReplacedSource | NumDmg$ 1 | SubAbility$ RestDmg | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE1 +SVar:RestDmgCombat:DB$DealDamage | Defined$ Remembered | DamageSource$ ReplacedSource | CombatDamage$ True | NumDmg$ X | SubAbility$ ExileEffect +SVar:RestDmg:DB$DealDamage | Defined$ Remembered | DamageSource$ ReplacedSource | NumDmg$ X | SubAbility$ ExileEffect +SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Creature.IsRemembered | Execute$ ExileEffect | Static$ True +SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | Static$ True +SVar:X:ReplaceCount$DamageAmount/Minus.1 +SVar:Y:ReplaceCount$DamageAmount +SVar:Rarity:Special +SVar:Picture:http://www.wizards.com/global/images/magic/general/eladamri.jpg +Oracle:Hand -1, life +15\n{0}: The next 1 damage that would be dealt to target creature you control is dealt to you instead. +End \ No newline at end of file diff --git a/res/cardsfolder/e/eladamri_lord_of_leaves_avatar.txt b/res/cardsfolder/e/eladamri_lord_of_leaves_avatar.txt new file mode 100644 index 00000000000..ffb044f9d83 --- /dev/null +++ b/res/cardsfolder/e/eladamri_lord_of_leaves_avatar.txt @@ -0,0 +1,10 @@ +Name:Eladamri, Lord of Leaves Avatar +ManaCost:no cost +Types:Vanguard +Text:no text +HandLifeModifier:-1/+2 +T:Mode$ Phase | Phase$ Main1 | ValidPlayer$ Player | TriggerZones$ Command | Execute$ TrigAddMana | TriggerDescription$ At the beginning of each player's precombat main phase, that player adds {G}{G} to his or her mana pool. +SVar:TrigAddMana:AB$ Mana | Cost$ 0 | Produced$ G | Amount$ 2 | Defined$ TriggeredPlayer +SVar:Rarity:Special +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=195137&type=card +End \ No newline at end of file diff --git a/res/cardsfolder/e/elspeth_knight_errant.txt b/res/cardsfolder/e/elspeth_knight_errant.txt index d475c962452..a7f2edba061 100644 --- a/res/cardsfolder/e/elspeth_knight_errant.txt +++ b/res/cardsfolder/e/elspeth_knight_errant.txt @@ -6,7 +6,7 @@ Loyalty:4 A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | TokenAmount$ 1 | TokenName$ Soldier | TokenColors$ White | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | Planeswalker$ True | SpellDescription$ Put a 1/1 white Soldier creature token onto the battlefield. A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 3 | NumDef$ 3 | KW$ Flying | Planeswalker$ True | SpellDescription$ Target creature gets +3/+3 and gains flying until end of turn. A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Name$ Elspeth, Knight-Errant emblem | Image$ elspeth_knight_errant_emblem | StaticAbilities$ STIndestructible | Keywords$ Indestructible | Planeswalker$ True | Ultimate$ True | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Artifacts, creatures, enchantments, and lands you control are indestructible." -SVar:STIndestructible:Mode$ Continuous | Affected$ Artifact.YouCtrl,Creature.YouCtrl,Enchantment.YouCtrl,Land.YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Indestructible +SVar:STIndestructible:Mode$ Continuous | EffectZone$ Command | Affected$ Artifact.YouCtrl,Creature.YouCtrl,Enchantment.YouCtrl,Land.YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Indestructible SVar:Indestructible:Artifacts, creatures, enchantments, and lands you control are indestructible. SVar:Rarity:Mythic SVar:Picture:http://www.wizards.com/global/images/magic/general/elspeth_knight_errant.jpg diff --git a/res/cardsfolder/e/endure.txt b/res/cardsfolder/e/endure.txt index 3dd54efd78d..6631306de97 100644 --- a/res/cardsfolder/e/endure.txt +++ b/res/cardsfolder/e/endure.txt @@ -3,7 +3,7 @@ ManaCost:3 W W Types:Instant Text:no text A:SP$ Effect | Cost$ 3 W W | Name$ Endure Effect | StaticAbilities$ STPrevent | AILogic$ Fog | SpellDescription$ Prevent all damage that would be dealt to you and permanents you control this turn. -SVar:STPrevent:Mode$ PreventDamage | Target$ You,Permanent.YouCtrl | Description$ Prevent all damage that would be dealt to you and permanents you control this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Target$ You,Permanent.YouCtrl | Description$ Prevent all damage that would be dealt to you and permanents you control this turn. SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/endure.jpg diff --git a/res/cardsfolder/e/ethereal_haze.txt b/res/cardsfolder/e/ethereal_haze.txt index 3fd0b5b93f6..1f50757b0ab 100644 --- a/res/cardsfolder/e/ethereal_haze.txt +++ b/res/cardsfolder/e/ethereal_haze.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Instant Text:no text A:SP$ Effect | Cost$ W | Name$ Ethereal Haze Effect | StaticAbilities$ STPrevent | AILogic$ Fog | SpellDescription$ Prevent all damage that would be dealt by creatures this turn. -SVar:STPrevent:Mode$ PreventDamage | Source$ Creature | Description$ Prevent all damage that would be dealt by creatures this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Source$ Creature | Description$ Prevent all damage that would be dealt by creatures this turn. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/ethereal_haze.jpg SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/9.jpg diff --git a/res/cardsfolder/e/ethersworn_shieldmage.txt b/res/cardsfolder/e/ethersworn_shieldmage.txt index 4aa70f1943e..11aa5f1f3ac 100644 --- a/res/cardsfolder/e/ethersworn_shieldmage.txt +++ b/res/cardsfolder/e/ethersworn_shieldmage.txt @@ -6,7 +6,7 @@ PT:2/2 K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, prevent all damage that would be dealt to artifact creatures this turn. SVar:TrigEffect:DB$Effect | Name$ Ethersworn Shieldmage Effect | StaticAbilities$ STPrevent | SpellDescription$ Prevent all damage that would be dealt to artifact creatures this turn. -SVar:STPrevent:Mode$ PreventDamage | Target$ Creature.Artifact | Description$ Prevent all damage that would be dealt to artifact creatures this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Target$ Creature.Artifact | Description$ Prevent all damage that would be dealt to artifact creatures this turn. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/ethersworn_shieldmage.jpg SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/4.jpg diff --git a/res/cardsfolder/f/falter.txt b/res/cardsfolder/f/falter.txt index 5bc7ed1b8c9..cb21689c8dd 100644 --- a/res/cardsfolder/f/falter.txt +++ b/res/cardsfolder/f/falter.txt @@ -3,7 +3,7 @@ ManaCost:1 R Types:Instant Text:no text A:SP$ Effect | Cost$ 1 R | Name$ Falter Effect | StaticAbilities$ KWPump | AILogic$ Evasion | SpellDescription$ Creatures without flying can't block this turn. -SVar:KWPump:Mode$ Continuous | Affected$ Creature.withoutFlying | AddHiddenKeyword$ HIDDEN CARDNAME can't block. | Description$ Creatures without flying can't block this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.withoutFlying | AddHiddenKeyword$ HIDDEN CARDNAME can't block. | Description$ Creatures without flying can't block this turn. SVar:PlayMain1:TRUE SVar:RemAIDeck:True SVar:Rarity:Common diff --git a/res/cardsfolder/f/festival.txt b/res/cardsfolder/f/festival.txt index 8482deae37a..8a3f56c0c3e 100644 --- a/res/cardsfolder/f/festival.txt +++ b/res/cardsfolder/f/festival.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Instant Text:Cast Festival only during an opponent's upkeep. A:SP$ Effect | Cost$ W | Name$ Festival Effect | StaticAbilities$ KWPump | OpponentTurn$ True | ActivationPhases$ Upkeep | SpellDescription$ Creatures can't attack this turn. -SVar:KWPump:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ HIDDEN CARDNAME can't attack. | Description$ Creatures can't attack this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature | AddHiddenKeyword$ HIDDEN CARDNAME can't attack. | Description$ Creatures can't attack this turn. SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/festival.jpg diff --git a/res/cardsfolder/f/flame_fusillade.txt b/res/cardsfolder/f/flame_fusillade.txt index 2ce66b30a15..c22bed3c845 100644 --- a/res/cardsfolder/f/flame_fusillade.txt +++ b/res/cardsfolder/f/flame_fusillade.txt @@ -3,7 +3,7 @@ ManaCost:3 R Types:Sorcery Text:no text A:SP$ Effect | Cost$ 3 R | Name$ Flame Fusillade Effect | StaticAbilities$ STDamage | SVars$ ABDamage | SpellDescription$ Until end of turn, permanents you control gain "Tap: This permanent deals 1 damage to target creature or player." -SVar:STDamage:Mode$ Continuous | Affected$ Permanent.YouCtrl | AddAbility$ ABDamage | Description$ Until end of turn, permanents you control gain "Tap: This permanent deals 1 damage to target creature or player." +SVar:STDamage:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Permanent.YouCtrl | AddAbility$ ABDamage | Description$ Until end of turn, permanents you control gain "Tap: This permanent deals 1 damage to target creature or player." SVar:ABDamage:AB$ DealDamage | Cost$ T | NumDmg$ 1 | Tgt$ TgtCP | SpellDescription$ CARDNAME deals 1 damage to target creature or player SVar:RemAIDeck:True SVar:Rarity:Rare diff --git a/res/cardsfolder/f/flaring_pain.txt b/res/cardsfolder/f/flaring_pain.txt index 6c81c706db2..5a5f686387f 100644 --- a/res/cardsfolder/f/flaring_pain.txt +++ b/res/cardsfolder/f/flaring_pain.txt @@ -4,7 +4,7 @@ Types:Instant Text:no text K:Flashback R A:SP$ Effect | Cost$ 1 R | Name$ Flaring Pain Effect | StaticAbilities$ STCantPrevent | SpellDescription$ Damage can't be prevented this turn. -SVar:STCantPrevent:Mode$ Continuous | GlobalRule$ Damage can't be prevented. | Description$ Damage can't be prevented. +SVar:STCantPrevent:Mode$ Continuous | EffectZone$ Command | GlobalRule$ Damage can't be prevented. | Description$ Damage can't be prevented. SVar:RemAIDeck:True SVar:RemRandomDeck:True SVar:Rarity:Common diff --git a/res/cardsfolder/f/forfend.txt b/res/cardsfolder/f/forfend.txt index f04de0b2110..dba5d21e62a 100644 --- a/res/cardsfolder/f/forfend.txt +++ b/res/cardsfolder/f/forfend.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Instant Text:no text A:SP$ Effect | Cost$ 1 W | Name$ Forfend Effect | StaticAbilities$ STPrevent | SpellDescription$ Prevent all damage that would be dealt to creatures this turn. -SVar:STPrevent:Mode$ PreventDamage | Target$ Creature | Description$ Prevent all damage that would be dealt to creatures this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Target$ Creature | Description$ Prevent all damage that would be dealt to creatures this turn. SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/forfend.jpg diff --git a/res/cardsfolder/g/gorilla_war_cry.txt b/res/cardsfolder/g/gorilla_war_cry.txt index aba2270f622..ffd4f566f0c 100644 --- a/res/cardsfolder/g/gorilla_war_cry.txt +++ b/res/cardsfolder/g/gorilla_war_cry.txt @@ -4,7 +4,7 @@ Types:Instant Text:no text A:SP$ Effect | Cost$ 1 R | Name$ Gorilla War Cry Effect | StaticAbilities$ Blocking | ActivationPhases$ BeginCombat->Declare Attackers - Play Instants and Abilities | AILogic$ Evasion | SubAbility$ DBDraw | SpellDescription$ Cast CARDNAME only during combat before blockers are declared. Creatures can't be blocked this turn except by two or more creatures. SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Blocking:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ HIDDEN CARDNAME can't be blocked except by two or more creatures. | Description$ Creatures can't be blocked this turn except by two or more creatures. +SVar:Blocking:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature | AddHiddenKeyword$ HIDDEN CARDNAME can't be blocked except by two or more creatures. | Description$ Creatures can't be blocked this turn except by two or more creatures. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/gorilla_war_cry.jpg SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/108.jpg|2 diff --git a/res/cardsfolder/g/guardian_angel.txt b/res/cardsfolder/g/guardian_angel.txt index 9bb5f2dc4e0..e8cda2095f4 100644 --- a/res/cardsfolder/g/guardian_angel.txt +++ b/res/cardsfolder/g/guardian_angel.txt @@ -4,7 +4,7 @@ Types:Instant Text:no text A:SP$ PreventDamage | Cost$ X W | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | Amount$ X | References$ X | SubAbility$ GuardianEffect | SpellDescription$ Prevent the next X damage that would be dealt to target creature or player this turn. Until end of turn, you may pay 1 any time you could cast an instant. If you do, prevent the next 1 damage that would be dealt to that creature or player this turn. SVar:GuardianEffect:DB$ Effect | Name$ Guardian Angel Effect | Abilities$ ABProtect | RememberObjects$ Targeted | Triggers$ OutOfSight | SVars$ ExileEffect -SVar:ABProtect:AB$ PreventDamage | Cost$ 1 | InstantSpeed$ True | Defined$ Remembered | Amount$ 1 | SpellDescription$ You may pay 1 any time you could cast an instant. If you do, prevent the next 1 damage that would be dealt to that creature or player this turn. +SVar:ABProtect:AB$ PreventDamage | ActivationZone$ Command | Cost$ 1 | InstantSpeed$ True | Defined$ Remembered | Amount$ 1 | SpellDescription$ You may pay 1 any time you could cast an instant. If you do, prevent the next 1 damage that would be dealt to that creature or player this turn. SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Defined$ Remembered | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | Static$ True SVar:RemAIDeck:True diff --git a/res/cardsfolder/h/harmless_assault.txt b/res/cardsfolder/h/harmless_assault.txt index 7608b03e9a9..40ad6316586 100644 --- a/res/cardsfolder/h/harmless_assault.txt +++ b/res/cardsfolder/h/harmless_assault.txt @@ -3,7 +3,7 @@ ManaCost:2 W W Types:Instant Text:no text A:SP$ Effect | Cost$ 2 W W | Name$ Harmless Assault Effect | StaticAbilities$ STPrevent | AILogic$ Fog | SpellDescription$ Prevent all combat damage that would be dealt this turn by attacking creatures. -SVar:STPrevent:Mode$ PreventDamage | Source$ Creature.attacking | CombatDamage$ True | Description$ Prevent all combat damage that would be dealt this turn by attacking creatures. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Source$ Creature.attacking | CombatDamage$ True | Description$ Prevent all combat damage that would be dealt this turn by attacking creatures. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/harmless_assault.jpg SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/24.jpg diff --git a/res/cardsfolder/h/havengul_lich.txt b/res/cardsfolder/h/havengul_lich.txt index ecff39664e3..4e0522b8a49 100644 --- a/res/cardsfolder/h/havengul_lich.txt +++ b/res/cardsfolder/h/havengul_lich.txt @@ -9,7 +9,7 @@ SVar:PumpTheir:DB$Pump | Defined$ Remembered | ConditionCheckSVar$ SelectKW | Co SVar:FXCast:DB$Effect | Name$ Havengul Lich Delayed Trigger | Triggers$ DTCast | SVars$ StealAbs,STSteal,CleanupDT | RememberObjects$ Targeted SVar:DTCast:Mode$ SpellCast | ValidCard$ Card.IsRemembered | Execute$ StealAbs | TriggerDescription$ When you cast that card this turn, Havengul Lich gains all activated abilities of that card until end of turn. SVar:StealAbs:DB$Effect | Name$ Havengul Lich effect | RememberObjects$ TriggeredCard | StaticAbilities$ STSteal | SubAbility$ CleanupDT -SVar:STSteal:Mode$ Continuous | Affected$ EffectSource | EffectZone$ Battlefield | GainsAbilitiesOf$ Creature.IsRemembered | GainsAbilitiesOfZones$ Library,Hand,Stack,Battlefield,Graveyard,Exile,Command +SVar:STSteal:Mode$ Continuous | Affected$ EffectSource | EffectZone$ Command | GainsAbilitiesOf$ Creature.IsRemembered | GainsAbilitiesOfZones$ Library,Hand,Stack,Battlefield,Graveyard,Exile,Command T:Mode$ Phase | Phase$ Cleanup | Static$ True | Execute$ Cleanup | Secondary$ True | TriggerDescription$ A little behind the scenes. SVar:Cleanup:DB$Cleanup | ClearRemembered$ True SVar:CleanupDT:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile diff --git a/res/cardsfolder/h/heavy_fog.txt b/res/cardsfolder/h/heavy_fog.txt index 833aacb4b13..9ae77a22105 100644 --- a/res/cardsfolder/h/heavy_fog.txt +++ b/res/cardsfolder/h/heavy_fog.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Instant Text:no text A:SP$ Effect | Cost$ 1 G | Name$ Heavy Fog Effect | StaticAbilities$ STPrevent | AILogic$ Fog | OpponentTurn$ True | ActivationPhases$ Declare Attackers - Play Instants and Abilities | SpellDescription$ Cast CARDNAME only during the declare attackers step and only if you've been attacked this step. Prevent all damage that would be dealt to you this turn by attacking creatures. -SVar:STPrevent:Mode$ PreventDamage | Source$ Creature.attacking | Target$ You | Description$ Prevent all damage that would be dealt to you this turn by attacking creatures. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Source$ Creature.attacking | Target$ You | Description$ Prevent all damage that would be dealt to you this turn by attacking creatures. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/heavy_fog.jpg SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/136.jpg diff --git a/res/cardsfolder/h/hero_of_oxid_ridge.txt b/res/cardsfolder/h/hero_of_oxid_ridge.txt index 787711df210..8a480cf1079 100644 --- a/res/cardsfolder/h/hero_of_oxid_ridge.txt +++ b/res/cardsfolder/h/hero_of_oxid_ridge.txt @@ -8,7 +8,7 @@ T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ Tr T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigEffect | TriggerDescription$ When CARDNAME attacks, creatures with power 1 or less can't block this turn. SVar:TrigBattleCry:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Other | NumAtt$ 1 SVar:TrigEffect:AB$Effect | Cost$ 0 | Name$ Hero of Oxid Ridge Effect | StaticAbilities$ KWPump -SVar:KWPump:Mode$ Continuous | Affected$ Creature.powerLE1 | AddHiddenKeyword$ HIDDEN CARDNAME can't block. | Description$ Creatures with power 1 or less can't block this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.powerLE1 | AddHiddenKeyword$ HIDDEN CARDNAME can't block. | Description$ Creatures with power 1 or less can't block this turn. SVar:Rarity:Mythic SVar:Picture:http://www.wizards.com/global/images/magic/general/hero_of_oxid_ridge.jpg SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/66.jpg diff --git a/res/cardsfolder/i/interdict.txt b/res/cardsfolder/i/interdict.txt index f1fc3f00d9e..8f10336e1c2 100644 --- a/res/cardsfolder/i/interdict.txt +++ b/res/cardsfolder/i/interdict.txt @@ -4,7 +4,7 @@ Types:Instant Text:no text A:SP$ Counter | Cost$ 1 U | TargetType$ Activated | TgtPrompt$ Select target activated ability from an artifact, creature, enchantment, or land. | RememberTargets$ True | ValidTgts$ Artifact,Creature,Enchantment,Land | SubAbility$ DBEffect | SpellDescription$ Counter target activated ability from an artifact, creature, enchantment, or land. That permanent's activated abilities can't be activated this turn. (Mana abilities can't be targeted.) SVar:DBEffect:DB$ Effect | Name$ Interdict Effect | StaticAbilities$ STCantBeActivated | RememberObjects$ Remembered | SubAbility$ DBDraw -SVar:STCantBeActivated:Mode$ CantBeActivated | ValidCard$ Permanent.IsRemembered +SVar:STCantBeActivated:Mode$ CantBeActivated | EffectZone$ Command | ValidCard$ Permanent.IsRemembered SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/interdict.jpg diff --git a/res/cardsfolder/i/island_sanctuary.txt b/res/cardsfolder/i/island_sanctuary.txt index 9d25aa6ed6c..0ad61ab78f2 100644 --- a/res/cardsfolder/i/island_sanctuary.txt +++ b/res/cardsfolder/i/island_sanctuary.txt @@ -4,7 +4,7 @@ Types:Enchantment Text:no text R:Event$ Draw | ActiveZones$ Battlefield | ActivePhases$ Draw | PlayerTurn$ True | ValidPlayer$ You | Optional$ True | ReplaceWith$ SanctuaryEffect | Description$ If you would draw a card during your draw step, instead you may skip that draw. If you do, until your next turn, you can't be attacked except by creatures with flying and/or islandwalk. SVar:SanctuaryEffect:AB$ Effect | Cost$ 0 | Name$ Sanctuary Effect | StaticAbilities$ IslandRetreat | Duration$ UntilYourNextTurn -SVar:IslandRetreat:Mode$ CantAttack | ValidCard$ Creature.withoutFlying+withoutIslandwalk | Target$ You | Description$ Creatures without flying can't attack you. +SVar:IslandRetreat:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature.withoutFlying+withoutIslandwalk | Target$ You | Description$ Creatures without flying can't attack you. SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/island_sanctuary.jpg diff --git a/res/cardsfolder/k/koth_of_the_hammer.txt b/res/cardsfolder/k/koth_of_the_hammer.txt index c98d40fbd48..f536b03719b 100644 --- a/res/cardsfolder/k/koth_of_the_hammer.txt +++ b/res/cardsfolder/k/koth_of_the_hammer.txt @@ -7,7 +7,7 @@ A:AB$ Untap | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Moun SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental | Colors$ Red A:AB$ Mana | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Produced$ R | Amount$ X | References$ X | SpellDescription$ Add R to your mana pool for each Mountain you control. A:AB$ Effect | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Koth of the Hammer emblem | Image$ koth_of_the_hammer_emblem | StaticAbilities$ STDamage | SVars$ ABDealDamage | Stackable$ False | Keywords$ Damage | Duration$ Permanent | SpellDescription$ You get an emblem with "Mountains you control have '{T}: This land deals 1 damage to target creature or player." -SVar:STDamage:Mode$ Continuous | Affected$ Mountain.YouCtrl | AddAbility$ ABDealDamage | AffectedZone$ Battlefield +SVar:STDamage:Mode$ Continuous | EffectZone$ Command | Affected$ Mountain.YouCtrl | AddAbility$ ABDealDamage | AffectedZone$ Battlefield SVar:ABDealDamage:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ Deal 1 damage to target creature or player SVar:Damage:Mountains you control have '{T}: This land deals 1 damage to target creature or player. SVar:X:Count$Valid Mountain.YouCtrl diff --git a/res/cardsfolder/l/liege_of_the_tangle.txt b/res/cardsfolder/l/liege_of_the_tangle.txt index fbec1607da3..a4fa96d1310 100644 --- a/res/cardsfolder/l/liege_of_the_tangle.txt +++ b/res/cardsfolder/l/liege_of_the_tangle.txt @@ -9,7 +9,7 @@ T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | ValidTgts$ Land.YouCtrl | OptionalDecider$ You | TargetMax$ X | TgtPrompt$ Select lands you control | CounterType$ AWAKENING | CounterNum$ 1 | SubAbility$ DBEffect | References$ X SVar:X:Count$Valid Land.YouCtrl SVar:DBEffect:DB$ Effect | Cost$ 0 | Name$ Awakening Effect | StaticAbilities$ KWAnimateAll | Unique$ True | Duration$ Permanent -SVar:KWAnimateAll:Mode$ Continuous | Affected$ Card.counters_GE1_AWAKENING | SetPower$ 8 | SetToughness$ 8 | AddType$ Creature & Elemental | SetColor$ Green | Description$ Each of those lands is an 8/8 green Elemental creature for as long as it has an awakening counter on it. They're still lands. +SVar:KWAnimateAll:Mode$ Continuous | EffectZone$ Command | Affected$ Card.counters_GE1_AWAKENING | SetPower$ 8 | SetToughness$ 8 | AddType$ Creature & Elemental | SetColor$ Green | Description$ Each of those lands is an 8/8 green Elemental creature for as long as it has an awakening counter on it. They're still lands. SVar:MustBeBlocked:True SVar:Rarity:Mythic SVar:Picture:http://www.wizards.com/global/images/magic/general/liege_of_the_tangle.jpg diff --git a/res/cardsfolder/l/liliana_of_the_dark_realms.txt b/res/cardsfolder/l/liliana_of_the_dark_realms.txt index 23da5a3bbce..598f24ee7b0 100644 --- a/res/cardsfolder/l/liliana_of_the_dark_realms.txt +++ b/res/cardsfolder/l/liliana_of_the_dark_realms.txt @@ -10,7 +10,7 @@ SVar:X:Count$Valid Swamp.YouCtrl SVar:ABChoice:DB$ GenericChoice | Defined$ You | Cost$ 0 | Choices$ ABPump1,ABPump2 SVar:ABPump1:DB$ Pump | Cost$ 0 | Defined$ Targeted | NumAtt$ +X | NumDef$ +X | References$ X | ChoiceDescription$ +X/+X SVar:ABPump2:DB$ Pump | Cost$ 0 | Defined$ Targeted | NumAtt$ -X | NumDef$ -X | References$ X | ChoiceDescription$ -X/-X -SVar:SwampBoost:Mode$ Continuous | Affected$ Swamp.YouCtrl | AddAbility$ BlackTap | Description$ Swamps you control have 'T:Add BBBB to your mana pool.' +SVar:SwampBoost:Mode$ Continuous | EffectZone$ Command | Affected$ Swamp.YouCtrl | AffectedZone$ Battlefield | AddAbility$ BlackTap | Description$ Swamps you control have 'T:Add BBBB to your mana pool.' SVar:BlackTap:AB$ Mana | Cost$ T | Produced$ B | Amount$ 4 | SpellDescription$ Add B B B B to your mana pool. SVar:Rarity:Mythic SVar:Picture:http://www.wizards.com/global/images/magic/general/liliana_of_the_dark_realms.jpg diff --git a/res/cardsfolder/l/luminesce.txt b/res/cardsfolder/l/luminesce.txt index ed27952e4ec..83e5bcd13a9 100644 --- a/res/cardsfolder/l/luminesce.txt +++ b/res/cardsfolder/l/luminesce.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Instant Text:no text A:SP$ Effect | Cost$ W | Name$ Luminesce Effect | StaticAbilities$ STPrevent | SpellDescription$ Prevent all damage that black sources and red sources would deal this turn. -SVar:STPrevent:Mode$ PreventDamage | Source$ Card.Black,Card.Red | Description$ Prevent all damage that black sources and red sources would deal this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Source$ Card.Black,Card.Red | Description$ Prevent all damage that black sources and red sources would deal this turn. SVar:RemAIDeck:True SVar:RemRandomDeck:True SVar:Rarity:Uncommon diff --git a/res/cardsfolder/m/maddening_imp.txt b/res/cardsfolder/m/maddening_imp.txt index eafb9b4ff75..d1e93aec2b3 100644 --- a/res/cardsfolder/m/maddening_imp.txt +++ b/res/cardsfolder/m/maddening_imp.txt @@ -5,7 +5,7 @@ Text:no text PT:1/1 K:Flying A:AB$ Effect | Cost$ T | Name$ Maddening Imp Effect | StaticAbilities$ KWPump | ActivationPhases$ Upkeep->Main1 | OpponentTurn$ True | SpellDescription$ Non-Wall creatures the active player controls attack this turn if able. At the beginning of the next end step, destroy each of those creatures that didn't attack this turn. Activate this ability only during an opponent's turn and only before combat. | SubAbility$ DestroyPacifist -SVar:KWPump:Mode$ Continuous | Affected$ Creature.ActivePlayerCtrl+nonWall | AddHiddenKeyword$ CARDNAME attacks each turn if able. | Description$ Non-Wall creatures the active player controls attack this turn if able. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.ActivePlayerCtrl+nonWall | AffectedZone$ Battlefield | AddHiddenKeyword$ CARDNAME attacks each turn if able. | Description$ Non-Wall creatures the active player controls attack this turn if able. SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDestroy | TriggerDescription$ At the beginning of the next end step, destroy each of those creatures that didn't attack this turn. SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Creature.ActivePlayerCtrl+notAttackedThisTurn+nonWall SVar:RemAIDeck:True diff --git a/res/cardsfolder/m/moonhold.txt b/res/cardsfolder/m/moonhold.txt index ed69efbff1a..2957c85f96c 100644 --- a/res/cardsfolder/m/moonhold.txt +++ b/res/cardsfolder/m/moonhold.txt @@ -4,8 +4,8 @@ Types:Instant Text:no text A:SP$ Effect | Cost$ 2 RW | ValidTgts$ Player | IsCurse$ True | Name$ Moonhold Land Effect | StaticAbilities$ STCantPlayLand | EffectOwner$ Targeted | AILogic$ BeginningOfOppTurn | ConditionManaSpent$ R | SubAbility$ WPaid | SpellDescription$ Target player can't play land cards this turn if R was spent to cast CARDNAME and can't play creature cards this turn if W was spent to cast it. (Do both if R W was spent.) SVar:WPaid:DB$ Effect | Name$ Moonhold Creature Effect | IsCurse$ True | StaticAbilities$ STCantPlayCreats | EffectOwner$ Targeted | AILogic$ BeginningOfOppTurn | ConditionManaSpent$ W -SVar:STCantPlayLand:Mode$ CantPlayLand | Player$ You | Description$ You can't play land cards this turn. -SVar:STCantPlayCreats:Mode$ CantBeCast | ValidCard$ Creature | Caster$ You | Description$ You can't play creature cards this turn. +SVar:STCantPlayLand:Mode$ CantPlayLand | EffectZone$ Command | Player$ You | Description$ You can't play land cards this turn. +SVar:STCantPlayCreats:Mode$ CantBeCast | ValidCard$ Creature | EffectZone$ Command | Caster$ You | Description$ You can't play creature cards this turn. SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/moonhold.jpg SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/143.jpg diff --git a/res/cardsfolder/m/moonmist.txt b/res/cardsfolder/m/moonmist.txt index d3c12125135..dd137151a29 100644 --- a/res/cardsfolder/m/moonmist.txt +++ b/res/cardsfolder/m/moonmist.txt @@ -4,7 +4,7 @@ Types:Instant Text:no text A:SP$SetStateAll | Cost$ 1 G | ValidCards$ Creature.Human+DoubleFaced | Mode$ Transform | SubAbility$ DBCurseNonWolves | SpellDescription$ Transform all Humans. Prevent all combat damage that would be dealt this turn by creatures other than Werewolves and Wolves. (Only double-faced cards can be transformed.) SVar:DBCurseNonWolves:DB$Effect | Name$ Moonmist Effect. | StaticAbilities$ Curse -SVar:Curse:Mode$ PreventDamage | Source$ Creature.nonWerewolf+nonWolf | CombatDamage$ True | Description$ Prevent all combat damage that would be dealt this turn by creatures other than Werewolves and Wolves. +SVar:Curse:Mode$ PreventDamage | EffectZone$ Command | Source$ Creature.nonWerewolf+nonWolf | CombatDamage$ True | Description$ Prevent all combat damage that would be dealt this turn by creatures other than Werewolves and Wolves. SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/moonmist.jpg diff --git a/res/cardsfolder/o/orims_chant.txt b/res/cardsfolder/o/orims_chant.txt index 40b7b32e28d..fc915cc734a 100644 --- a/res/cardsfolder/o/orims_chant.txt +++ b/res/cardsfolder/o/orims_chant.txt @@ -3,9 +3,9 @@ ManaCost:W Types:Instant Text:no text A:SP$ Effect | Cost$ W | Name$ Orim's Chant Effect | IsCurse$ True | StaticAbilities$ CantBeCast | ValidTgts$ Player | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SpellDescription$ Target player can't cast spells this turn. If CARDNAME was kicked, creatures can't attack this turn. -SVar:CantBeCast:Mode$ CantBeCast | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Target player can't cast spells this turn. +SVar:CantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Target player can't cast spells this turn. A:SP$ Effect | Cost$ W W | SetAsKicked$ True | Name$ Orim's Chant Effect | IsCurse$ True | StaticAbilities$ CantBeCast,CantAttack | ValidTgts$ Player | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SpellDescription$ Kicker W W (You may pay an additional W W as you cast this spell.) -SVar:CantAttack:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ HIDDEN CARDNAME can't attack. | Description$ Creatures can't attack this turn. +SVar:CantAttack:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AffectedZone$ Battlefield | AddHiddenKeyword$ HIDDEN CARDNAME can't attack. | Description$ Creatures can't attack this turn. SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/orims_chant.jpg SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/11.jpg diff --git a/res/cardsfolder/o/oriss_samite_guardian.txt b/res/cardsfolder/o/oriss_samite_guardian.txt index 64aabf19e90..8316fb9675e 100644 --- a/res/cardsfolder/o/oriss_samite_guardian.txt +++ b/res/cardsfolder/o/oriss_samite_guardian.txt @@ -5,8 +5,8 @@ Text:no text PT:1/3 A:AB$ Pump | Cost$ T | KW$ HIDDEN Prevent all damage that would be dealt to CARDNAME. | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Prevent all damage that would be dealt to target creature this turn. A:AB$ Effect | Cost$ Discard<1/Card.namedOriss, Samite Guardian> | CostDesc$ Grandeur - Discard another card named CARDNAME:| Name$ Oriss Effect | IsCurse$ True | StaticAbilities$ CantBeCast,CantAttack | ValidTgts$ Player | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SpellDescription$ Target player can't cast spells this turn, and creatures that player controls can't attack this turn. -SVar:CantBeCast:Mode$ CantBeCast | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Targeted player can't cast spells this turn. -SVar:CantAttack:Mode$ Continuous | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ HIDDEN CARDNAME can't attack. | Description$ Creatures targeted player controls can't attack this turn. +SVar:CantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Targeted player can't cast spells this turn. +SVar:CantAttack:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ HIDDEN CARDNAME can't attack. | Description$ Creatures targeted player controls can't attack this turn. SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/oriss_samite_guardian.jpg diff --git a/res/cardsfolder/p/pardic_miner.txt b/res/cardsfolder/p/pardic_miner.txt index 84042c792cc..fade3a7e8ab 100644 --- a/res/cardsfolder/p/pardic_miner.txt +++ b/res/cardsfolder/p/pardic_miner.txt @@ -4,7 +4,7 @@ Types:Creature Dwarf Text:no text PT:1/1 A:AB$ Effect | Cost$ Sac<1/CARDNAME> | ValidTgts$ Player | Name$ Pardic Miner Effect | StaticAbilities$ STCantPlayLand | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SpellDescription$ Target player can't play lands this turn. -SVar:STCantPlayLand:Mode$ CantPlayLand | Player$ Player.IsRemembered | Description$ Target player can't play land cards this turn. +SVar:STCantPlayLand:Mode$ CantPlayLand | EffectZone$ Command | Player$ Player.IsRemembered | Description$ Target player can't play land cards this turn. SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_miner.jpg diff --git a/res/cardsfolder/p/praetors_counsel.txt b/res/cardsfolder/p/praetors_counsel.txt index ea0642cfa5b..db7392c51f2 100644 --- a/res/cardsfolder/p/praetors_counsel.txt +++ b/res/cardsfolder/p/praetors_counsel.txt @@ -5,7 +5,7 @@ Text:no text A:SP$ ChangeZoneAll | Cost$ 5 G G G | Origin$ Graveyard | Destination$ Hand | ChangeType$ Card.YouOwn | SubAbility$ DBChange | SpellDescription$ Return all cards from your graveyard to your hand. Exile CARDNAME. You have no maximum hand size for the rest of the game. SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | Name$ Praetor's Counsel Effect | StaticAbilities$ STHandSize | Duration$ Permanent -SVar:STHandSize:Mode$ Continuous | Affected$ You | SetMaxHandSize$ -1 | Description$ You have no maximum hand size. +SVar:STHandSize:Mode$ Continuous | EffectZone$ Command | Affected$ You | SetMaxHandSize$ -1 | Description$ You have no maximum hand size. SVar:Rarity:Mythic SVar:Picture:http://www.wizards.com/global/images/magic/general/praetors_counsel.jpg SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/88.jpg diff --git a/res/cardsfolder/p/predatory_focus.txt b/res/cardsfolder/p/predatory_focus.txt index 3f5b3956a5d..00d6b121b86 100644 --- a/res/cardsfolder/p/predatory_focus.txt +++ b/res/cardsfolder/p/predatory_focus.txt @@ -3,7 +3,7 @@ ManaCost:3 G G Types:Sorcery Text:no text A:SP$ Effect | Cost$ 3 G G | Name$ Predatory Focus Effect | StaticAbilities$ KWPump | AILogic$ Evasion | SpellDescription$ You may have creatures you control assign their combat damage this turn as though they weren't blocked. -SVar:KWPump:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ HIDDEN You may have CARDNAME assign its combat damage as though it weren't blocked. | Description$ You may have creatures you control assign their combat damage this turn as though they weren't blocked. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddHiddenKeyword$ HIDDEN You may have CARDNAME assign its combat damage as though it weren't blocked. | Description$ You may have creatures you control assign their combat damage this turn as though they weren't blocked. SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/predatory_focus.jpg SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/92.jpg diff --git a/res/cardsfolder/p/predatory_rampage.txt b/res/cardsfolder/p/predatory_rampage.txt index 092701b77c2..a01a3f77fb6 100644 --- a/res/cardsfolder/p/predatory_rampage.txt +++ b/res/cardsfolder/p/predatory_rampage.txt @@ -4,7 +4,7 @@ Types:Sorcery Text:no text A:SP$ PumpAll | Cost$ 3 G G | ValidCards$ Creature.YouCtrl | NumAtt$ +3 | NumDef$ +3 | SubAbility$ OppBlock | SpellDescription$ Creatures you control get +3/+3 until end of turn. Each creature your opponents control blocks this turn if able. SVar:OppBlock:DB$ Effect | Name$ Predatory Rampage Effect | StaticAbilities$ KWPump -SVar:KWPump:Mode$ Continuous | Affected$ Creature.OppCtrl | AddHiddenKeyword$ HIDDEN CARDNAME blocks each turn if able. | Description$ Each creature your opponents control blocks this turn if able. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.OppCtrl | AddHiddenKeyword$ HIDDEN CARDNAME blocks each turn if able. | Description$ Each creature your opponents control blocks this turn if able. SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/predatory_rampage.jpg SetInfo:M13|Rare|http://magiccards.info/scans/en/m13/180.jpg diff --git a/res/cardsfolder/p/prismatic_strands.txt b/res/cardsfolder/p/prismatic_strands.txt index 732624f7ddf..aab6ff31e53 100644 --- a/res/cardsfolder/p/prismatic_strands.txt +++ b/res/cardsfolder/p/prismatic_strands.txt @@ -5,7 +5,7 @@ Text:no text K:Flashback tapXType<1/Creature.White/white creature> A:SP$ ChooseColor | Cost$ 2 W | Defined$ You | AILogic$ MostProminentInHumanDeck | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | Name$ Prismatic Strands Effect | StaticAbilities$ STPrevent | SpellDescription$ Prevent all damage that sources of the color of your choice would deal this turn. -SVar:STPrevent:Mode$ PreventDamage | Target$ Creature,Player | Source$ Card.ChosenColor | Description$ Prevent all damage that sources of the chosen color would deal this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Target$ Creature,Player | Source$ Card.ChosenColor | Description$ Prevent all damage that sources of the chosen color would deal this turn. SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/prismatic_strands.jpg diff --git a/res/cardsfolder/p/psychic_trance.txt b/res/cardsfolder/p/psychic_trance.txt index cbaa5d1eed2..ea47fe32167 100644 --- a/res/cardsfolder/p/psychic_trance.txt +++ b/res/cardsfolder/p/psychic_trance.txt @@ -3,7 +3,7 @@ ManaCost:2 U U Types:Instant Text:no text A:SP$ Effect | Cost$ 2 U U | Name$ Psychic Trance Effect | StaticAbilities$ Static | SVars$ Counter | SpellDescription$ Until end of turn, Wizards you control gain "Tap: Counter target spell." -SVar:Static:Mode$ Continuous | Affected$ Card.Wizard+YouCtrl | AddAbility$ Counter | Description$ All Wizards you control have Tap: Counter target spell. +SVar:Static:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Card.Wizard+YouCtrl | AddAbility$ Counter | Description$ All Wizards you control have Tap: Counter target spell. SVar:Counter:AB$ Counter | Cost$ T | TargetType$ Spell | ValidTgts$ Card | SpellDescription$ Counter target spell SVar:RemRandomDeck:True SVar:RemAIDeck:True diff --git a/res/cardsfolder/q/quicken.txt b/res/cardsfolder/q/quicken.txt index ba548cc49ef..afbd7807f40 100644 --- a/res/cardsfolder/q/quicken.txt +++ b/res/cardsfolder/q/quicken.txt @@ -4,7 +4,7 @@ Types:Instant Text:no text A:SP$Effect | Cost$ U | Name$ Quicken effect | StaticAbilities$ QuickenStA | Triggers$ SpellCastTrig | SVars$ Quickened | SubAbility$ DBDraw | SpellDescription$ The next sorcery card you cast this turn can be cast as though it had flash. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:QuickenStA:Mode$ Continuous | Affected$ Sorcery.YouCtrl | AffectedZone$ Hand,Graveyard,Exile | AddHiddenKeyword$ HIDDEN Flash +SVar:QuickenStA:Mode$ Continuous | EffectZone$ Command | Affected$ Sorcery.YouCtrl | AffectedZone$ Hand,Graveyard,Exile | AddHiddenKeyword$ HIDDEN Flash SVar:SpellCastTrig:Mode$ SpellCast | ValidCard$ Sorcery | ValidActivatingPlayer$ You | Execute$ Quickened | Static$ True | TriggerDescription$ The next sorcery card you cast this turn can be cast as though it had flash. SVar:Quickened:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Graveyard SVar:RemAIDeck:True diff --git a/res/cardsfolder/r/radiant_kavu.txt b/res/cardsfolder/r/radiant_kavu.txt index 754a614246a..d35373a836a 100644 --- a/res/cardsfolder/r/radiant_kavu.txt +++ b/res/cardsfolder/r/radiant_kavu.txt @@ -4,7 +4,7 @@ Types:Creature Kavu Text:no text PT:3/3 A:AB$ Effect | Cost$ R G W | Name$ Radiant Kavu Effect | StaticAbilities$ STPrevent | SpellDescription$ Prevent all combat damage blue creatures and black creatures would deal this turn. -SVar:STPrevent:Mode$ PreventDamage | Source$ Creature.Blue,Creature.Black | CombatDamage$ True | Description$ Prevent all combat damage blue creatures and black creatures would deal this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Source$ Creature.Blue,Creature.Black | CombatDamage$ True | Description$ Prevent all combat damage blue creatures and black creatures would deal this turn. SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/radiant_kavu.jpg diff --git a/res/cardsfolder/r/rootborn_defenses.txt b/res/cardsfolder/r/rootborn_defenses.txt index 2a0d6d048f4..8af6f41761f 100644 --- a/res/cardsfolder/r/rootborn_defenses.txt +++ b/res/cardsfolder/r/rootborn_defenses.txt @@ -6,7 +6,7 @@ A:SP$ ChooseCard | Cost$ 2 W | Defined$ You | Amount$ 1 | Choices$ Creature.toke SVar:DBCopy:DB$ CopyPermanent | Defined$ Remembered | NumCopies$ 1 | SubAbility$ DBPumpAll SVar:DBPumpAll:DB$ Effect | Name$ Rootborn Defenses Effect | StaticAbilities$ KWPump | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:KWPump:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ HIDDEN Indestructible | Description$ Creatures you control are indestructible this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddHiddenKeyword$ HIDDEN Indestructible | Description$ Creatures you control are indestructible this turn. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/rootborn_defenses.jpg SetInfo:RTR|Common|http://magiccards.info/scans/en/rtr/19.jpg diff --git a/res/cardsfolder/r/ruthless_invasion.txt b/res/cardsfolder/r/ruthless_invasion.txt index 1466c5aedc9..40f03a1f9c0 100644 --- a/res/cardsfolder/r/ruthless_invasion.txt +++ b/res/cardsfolder/r/ruthless_invasion.txt @@ -3,7 +3,7 @@ ManaCost:3 PR Types:Sorcery Text:no text A:SP$ Effect | Cost$ 3 PR | Name$ Ruthless Invasion Effect | StaticAbilities$ KWPump | AILogic$ Evasion | SpellDescription$ Nonartifact creatures can't block this turn. -SVar:KWPump:Mode$ Continuous | Affected$ Creature.nonArtifact | AddKeyword$ CARDNAME can't block. | Description$ Nonartifact creatures can't block this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.nonArtifact | AddKeyword$ CARDNAME can't block. | Description$ Nonartifact creatures can't block this turn. SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/ruthless_invasion.jpg diff --git a/res/cardsfolder/s/safe_passage.txt b/res/cardsfolder/s/safe_passage.txt index ed9a0925bb2..ce297e8722d 100644 --- a/res/cardsfolder/s/safe_passage.txt +++ b/res/cardsfolder/s/safe_passage.txt @@ -3,7 +3,7 @@ ManaCost:2 W Types:Instant Text:no text A:SP$ Effect | Cost$ 2 W | Name$ Safe Passage Effect | StaticAbilities$ STPrevent | AILogic$ Fog | SpellDescription$ Prevent all damage that would be dealt to you and creatures you control this turn. -SVar:STPrevent:Mode$ PreventDamage | Target$ You,Creature.YouCtrl | Description$ Prevent all damage that would be dealt to you and creatures you control this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Target$ You,Creature.YouCtrl | Description$ Prevent all damage that would be dealt to you and creatures you control this turn. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/safe_passage.jpg SetInfo:M11|Common|http://magiccards.info/scans/en/m11/26.jpg diff --git a/res/cardsfolder/s/scarecrow.txt b/res/cardsfolder/s/scarecrow.txt index 311b38f5a26..c4a0323fa24 100644 --- a/res/cardsfolder/s/scarecrow.txt +++ b/res/cardsfolder/s/scarecrow.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Scarecrow Text:no text PT:2/2 A:AB$ Effect | Cost$ 6 T | Name$ Scarecrow Effect | StaticAbilities$ STPrevent | SpellDescription$ Prevent all damage that would be dealt to you this turn by creatures with flying. -SVar:STPrevent:Mode$ PreventDamage | Target$ You | Source$ Creature.withFlying | Description$ Prevent all damage that would be dealt to you this turn by creatures with flying. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Target$ You | Source$ Creature.withFlying | Description$ Prevent all damage that would be dealt to you this turn by creatures with flying. SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/scarecrow.jpg diff --git a/res/cardsfolder/s/scouts_warning.txt b/res/cardsfolder/s/scouts_warning.txt index 355e35858ca..0249efad034 100644 --- a/res/cardsfolder/s/scouts_warning.txt +++ b/res/cardsfolder/s/scouts_warning.txt @@ -4,7 +4,7 @@ Types:Instant Text:no text A:SP$Effect | Cost$ W | Name$ Scout's Warning effect | StaticAbilities$ ScoutFlash | Triggers$ SpellCastTrig | SVars$ WarningGiven | SubAbility$ DBDraw | SpellDescription$ The next creature card you play this turn can be played as though it had flash. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:ScoutFlash:Mode$ Continuous | Affected$ Creature.YouCtrl | AffectedZone$ Hand,Graveyard,Exile | AddHiddenKeyword$ HIDDEN Flash +SVar:ScoutFlash:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AffectedZone$ Hand,Graveyard,Exile | AddHiddenKeyword$ HIDDEN Flash SVar:SpellCastTrig:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ WarningGiven | Static$ True | TriggerDescription$ The next creature card you play this turn can be played as though it had flash. SVar:WarningGiven:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Graveyard SVar:RemAIDeck:True diff --git a/res/cardsfolder/s/silence.txt b/res/cardsfolder/s/silence.txt index 62ee70ff879..34a6fc6378b 100644 --- a/res/cardsfolder/s/silence.txt +++ b/res/cardsfolder/s/silence.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Instant Text:no text A:SP$ Effect | Cost$ W | Name$ Silence Effect | StaticAbilities$ STCantBeCast | AILogic$ BeginningOfOppTurn | SpellDescription$ Your opponents can't cast spells this turn. (Spells cast before this resolves are unaffected.) -SVar:STCantBeCast:Mode$ CantBeCast | ValidCard$ Card | Caster$ Opponent | Description$ Your opponents can't cast spells. +SVar:STCantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ Opponent | Description$ Your opponents can't cast spells. SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/silence.jpg SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/30.jpg diff --git a/res/cardsfolder/s/sirens_call.txt b/res/cardsfolder/s/sirens_call.txt index e77d5651c0b..63d0fafda18 100644 --- a/res/cardsfolder/s/sirens_call.txt +++ b/res/cardsfolder/s/sirens_call.txt @@ -3,7 +3,7 @@ ManaCost:U Types:Instant Text:no text A:SP$ Effect | Cost$ U | Name$ Siren's Call Effect | StaticAbilities$ KWPump | ActivationPhases$ Upkeep->BeginCombat | OpponentTurn$ True | SpellDescription$ Cast CARDNAME only during an opponent's turn, before attackers are declared. Creatures the active player controls attack this turn if able. At the beginning of the next end step, destroy all non-Wall creatures that player controls that didn't attack this turn. Ignore this effect for each creature the player didn't control continuously since the beginning of the turn. | SubAbility$ DestroyPacifist -SVar:KWPump:Mode$ Continuous | Affected$ Creature.ActivePlayerCtrl | AddHiddenKeyword$ CARDNAME attacks each turn if able. | Description$ Creatures the active player controls attack this turn if able. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.ActivePlayerCtrl | AddHiddenKeyword$ CARDNAME attacks each turn if able. | Description$ Creatures the active player controls attack this turn if able. SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDestroy | TriggerDescription$ At the beginning of the next end step, destroy all non-Wall creatures that player controls that didn't attack this turn. SVar:TrigDestroy:DB$DestroyAll | ValidCards$ Creature.ActivePlayerCtrl+notAttackedThisTurn+nonWall+notFirstTurnControlled | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True diff --git a/res/cardsfolder/s/sivvis_ruse.txt b/res/cardsfolder/s/sivvis_ruse.txt index dc29e52c103..b828aff0477 100644 --- a/res/cardsfolder/s/sivvis_ruse.txt +++ b/res/cardsfolder/s/sivvis_ruse.txt @@ -4,7 +4,7 @@ Types:Instant Text:no text S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | AddHiddenKeyword$ HIDDEN Alternative Cost 0 | CheckSVar$ X | CheckSecondSVar$ Y | Description$ If an opponent controls a Mountain and you control a Plains, you may cast CARDNAME without paying its mana cost. A:SP$ Effect | Cost$ 2 W W | Name$ Sivvi's Ruse Effect | StaticAbilities$ STPrevent | SpellDescription$ Prevent all damage that would be dealt this turn to creatures you control. -SVar:STPrevent:Mode$ PreventDamage | Target$ Creature.YouCtrl | Description$ Prevent all damage that would be dealt this turn to creatures you control. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Target$ Creature.YouCtrl | Description$ Prevent all damage that would be dealt this turn to creatures you control. SVar:X:Count$Valid Mountain.OppCtrl SVar:Y:Count$Valid Plains.YouCtrl SVar:RemAIDeck:True diff --git a/res/cardsfolder/s/snag.txt b/res/cardsfolder/s/snag.txt index 54db8208c50..2ac6c9ea2c1 100644 --- a/res/cardsfolder/s/snag.txt +++ b/res/cardsfolder/s/snag.txt @@ -4,7 +4,7 @@ Types:Instant Text:no text SVar:AltCost:Cost$ Discard<1/Forest> A:SP$ Effect | Cost$ 3 G | Name$ Snag Effect | StaticAbilities$ STPrevent | AILogic$ Fog | SpellDescription$ Prevent all combat damage that would be dealt by unblocked creatures this turn. -SVar:STPrevent:Mode$ PreventDamage | Source$ Creature.unblocked | CombatDamage$ True | Description$ Prevent all combat damage that would be dealt by unblocked creatures this turn. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Source$ Creature.unblocked | CombatDamage$ True | Description$ Prevent all combat damage that would be dealt by unblocked creatures this turn. SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/snag.jpg SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/124.jpg diff --git a/res/cardsfolder/s/solfatara.txt b/res/cardsfolder/s/solfatara.txt index ce401b68950..c28035f5ced 100644 --- a/res/cardsfolder/s/solfatara.txt +++ b/res/cardsfolder/s/solfatara.txt @@ -3,7 +3,7 @@ ManaCost:2 R Types:Instant Text:no text A:SP$ Effect | Cost$ 2 R | ValidTgts$ Player | Name$ Solfatara Effect | StaticAbilities$ STCantPlayLand | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SubAbility$ DBDraw | SpellDescription$ Target player can't play land cards this turn. -SVar:STCantPlayLand:Mode$ CantPlayLand | Player$ Player.IsRemembered | Description$ Target player can't play land cards this turn. +SVar:STCantPlayLand:Mode$ CantPlayLand | EffectZone$ Command | Player$ Player.IsRemembered | Description$ Target player can't play land cards this turn. SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/solfatara.jpg diff --git a/res/cardsfolder/s/sorin_lord_of_innistrad.txt b/res/cardsfolder/s/sorin_lord_of_innistrad.txt index ebaffdee094..d94f7eb92fb 100644 --- a/res/cardsfolder/s/sorin_lord_of_innistrad.txt +++ b/res/cardsfolder/s/sorin_lord_of_innistrad.txt @@ -5,7 +5,7 @@ Text:no text Loyalty:3 A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | TokenAmount$ 1 | TokenImage$ b 1 1 vampire dka | TokenName$ Vampire | TokenColors$ Black | TokenTypes$ Creature,Vampire | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Lifelink | Planeswalker$ True | SpellDescription$ Put a 1/1 black Vampire creature token with lifelink onto the battlefield. A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Name$ Sorin, Lord of Innistrad emblem | Image$ sorin_lord_of_innistrad_emblem | StaticAbilities$ STPump | Planeswalker$ True | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Creatures you control get +1/+0." -SVar:STPump:Mode$ Continuous | Affected$ Creature.YouCtrl | AffectedZone$ Battlefield | AddPower$ 1 +SVar:STPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddPower$ 1 A:AB$ Destroy | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Creature,Planeswalker.Other | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Select target creatures or other planeswalkers | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DBChangeZoneAll | SpellDescription$ Destroy up to 3 target creatures and/or other planeswalkers. Return each card put into a graveyard this way to the battlefield under your control. SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Cost$ 0 | ChangeType$ Card.IsRemembered | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True diff --git a/res/cardsfolder/s/stigma_lasher.txt b/res/cardsfolder/s/stigma_lasher.txt index b02d2ec4d30..8b048633efb 100644 --- a/res/cardsfolder/s/stigma_lasher.txt +++ b/res/cardsfolder/s/stigma_lasher.txt @@ -6,7 +6,7 @@ PT:2/2 K:Wither T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigEffect | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to a player, that player can't gain life for the rest of the game. SVar:TrigEffect:AB$Effect | Cost$ 0 | Name$ Stigma Lasher Effect | StaticAbilities$ CantGainLife | Duration$ Permanent | RememberObjects$ TriggeredAffected -SVar:CantGainLife:Mode$ Continuous | Affected$ Player.isRemembered | AddKeyword$ You can't gain life. | Description$ The damaged player can't gain life for the rest of the game. +SVar:CantGainLife:Mode$ Continuous | EffectZone$ Command | Affected$ Player.isRemembered | AddKeyword$ You can't gain life. | Description$ The damaged player can't gain life for the rest of the game. SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/stigma_lasher.jpg SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/62.jpg diff --git a/res/cardsfolder/t/tamiyo_the_moon_sage.txt b/res/cardsfolder/t/tamiyo_the_moon_sage.txt index 030e3a865eb..d24ce15c5a7 100644 --- a/res/cardsfolder/t/tamiyo_the_moon_sage.txt +++ b/res/cardsfolder/t/tamiyo_the_moon_sage.txt @@ -8,8 +8,8 @@ SVar:TamiyoPump:DB$Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This A:AB$ Draw | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Player | TgtPrompt$ Select target player | Defined$ You | NumCards$ X | References$ X | Planeswalker$ True | SpellDescription$ Draw a card for each tapped creature target player controls. SVar:X:Count$Valid Creature.tapped+TargetedPlayerCtrl A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Tamiyo, the Moon Sage emblem | Image$ tamiyo_the_moon_sage_emblem | StaticAbilities$ UnlimitedHand | Triggers$ TamiyoCardToGrave | SVars$ TamiyoReturn | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "You have no maximum hand size" and "Whenever a card is put into your graveyard from anywhere, you may return it to your hand." -SVar:UnlimitedHand:Mode$ Continuous | Affected$ You | SetMaxHandSize$ -1 | Description$ You have no maximum hand size. -SVar:TamiyoCardToGrave:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.nonToken+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TamiyoReturn | TriggerDescription$ Whenever a card is put into your graveyard from anywhere, you may return it to your hand. +SVar:UnlimitedHand:Mode$ Continuous | EffectZone$ Command | Affected$ You | SetMaxHandSize$ -1 | Description$ You have no maximum hand size. +SVar:TamiyoCardToGrave:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.nonToken+YouCtrl | OptionalDecider$ You | Execute$ TamiyoReturn | TriggerDescription$ Whenever a card is put into your graveyard from anywhere, you may return it to your hand. SVar:TamiyoReturn:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand SVar:Rarity:Mythic SVar:Picture:http://www.wizards.com/global/images/magic/general/tamiyo_the_moon_sage.jpg diff --git a/res/cardsfolder/t/tanglesap.txt b/res/cardsfolder/t/tanglesap.txt index d4a18f5ea5f..c5704fbb4fd 100644 --- a/res/cardsfolder/t/tanglesap.txt +++ b/res/cardsfolder/t/tanglesap.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Instant Text:no text A:SP$ Effect | Cost$ 1 G | Name$ Tanglesap Effect | StaticAbilities$ STPrevent | AILogic$ Fog | SpellDescription$ Prevent all combat damage that would be dealt this turn by creatures without trample. -SVar:STPrevent:Mode$ PreventDamage | Source$ Creature.withoutTrample | CombatDamage$ True | Description$ Prevent all combat damage that would be dealt this turn by creatures without trample. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Source$ Creature.withoutTrample | CombatDamage$ True | Description$ Prevent all combat damage that would be dealt this turn by creatures without trample. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/tanglesap.jpg SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/186.jpg diff --git a/res/cardsfolder/t/tectonic_rift.txt b/res/cardsfolder/t/tectonic_rift.txt index 337b4b2c0f5..3d9f2d57008 100644 --- a/res/cardsfolder/t/tectonic_rift.txt +++ b/res/cardsfolder/t/tectonic_rift.txt @@ -4,7 +4,7 @@ Types:Sorcery Text:no text A:SP$ Destroy | Cost$ 3 R | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ DBEffect | SpellDescription$ Destroy target land. Creatures without flying can't block this turn. SVar:DBEffect:DB$Effect | Name$ Tectonic Rift Effect | StaticAbilities$ KWPump -SVar:KWPump:Mode$ Continuous | Affected$ Creature.withoutFlying | AddHiddenKeyword$ HIDDEN CARDNAME can't block. | Description$ Creatures without flying can't block this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.withoutFlying | AddHiddenKeyword$ HIDDEN CARDNAME can't block. | Description$ Creatures without flying can't block this turn. SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/tectonic_rift.jpg SetInfo:M12|Uncommon|http://magiccards.info/scans/en/m12/157.jpg diff --git a/res/cardsfolder/t/terrifying_presence.txt b/res/cardsfolder/t/terrifying_presence.txt index f258c708f64..521a52d0d92 100644 --- a/res/cardsfolder/t/terrifying_presence.txt +++ b/res/cardsfolder/t/terrifying_presence.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Instant Text:no text A:SP$ Effect | Cost$ 1 G | Name$ Terrifying Presence Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature | StaticAbilities$ STPrevent | RememberObjects$ Targeted | SpellDescription$ Prevent all damage that would be dealt this turn by creatures other than target creature. -SVar:STPrevent:Mode$ PreventDamage | Source$ Creature.IsNotRemembered | CombatDamage$ True | Description$ Prevent all damage that would be dealt this turn by creatures other than target creature. +SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Source$ Creature.IsNotRemembered | CombatDamage$ True | Description$ Prevent all damage that would be dealt this turn by creatures other than target creature. SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/terrifying_presence.jpg diff --git a/res/cardsfolder/t/titanias_song.txt b/res/cardsfolder/t/titanias_song.txt index f182f7b927b..37defe43903 100644 --- a/res/cardsfolder/t/titanias_song.txt +++ b/res/cardsfolder/t/titanias_song.txt @@ -5,7 +5,7 @@ Text:no text S:Mode$ Continuous | Affected$ Artifact.nonCreature | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Creature | RemoveAllAbilities$ True | Description$ Each noncreature artifact is an artifact creature with power and toughness each equal to its converted mana cost. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigEffect | Static$ True | TriggerDescription$ If CARDNAME leaves the battlefield, this effect continues until end of turn. SVar:TrigEffect:AB$ Effect | Cost$ 0 | Name$ Titania's Song Effect | StaticAbilities$ KWAnimateAll | SVars$ AffectedX | References$ AffectedX -SVar:KWAnimateAll:Mode$ Continuous | Affected$ Artifact.nonCreature | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Creature | RemoveAllAbilities$ True | Description$ Each noncreature artifact is an artifact creature with power and toughness each equal to its converted mana cost. +SVar:KWAnimateAll:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Artifact.nonCreature | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Creature | RemoveAllAbilities$ True | Description$ Each noncreature artifact is an artifact creature with power and toughness each equal to its converted mana cost. SVar:AffectedX:Count$CardManaCost SVar:PlayMain1:TRUE SVar:RemRandomDeck:True diff --git a/res/cardsfolder/t/turf_wound.txt b/res/cardsfolder/t/turf_wound.txt index 174d506b769..4b7a1ac9925 100644 --- a/res/cardsfolder/t/turf_wound.txt +++ b/res/cardsfolder/t/turf_wound.txt @@ -3,7 +3,7 @@ ManaCost:2 R Types:Instant Text:no text A:SP$ Effect | Cost$ 2 R | ValidTgts$ Player | Name$ Turf Wound Effect | StaticAbilities$ STCantPlayLand | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SubAbility$ DBDraw | SpellDescription$ Target player can't play land cards this turn. -SVar:STCantPlayLand:Mode$ CantPlayLand | Player$ Player.IsRemembered | Description$ Target player can't play land cards this turn. +SVar:STCantPlayLand:Mode$ CantPlayLand | EffectZone$ Command | Player$ Player.IsRemembered | Description$ Target player can't play land cards this turn. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/turf_wound.jpg diff --git a/res/cardsfolder/u/undergrowth.txt b/res/cardsfolder/u/undergrowth.txt index 7141f60470a..bbcecf2b777 100644 --- a/res/cardsfolder/u/undergrowth.txt +++ b/res/cardsfolder/u/undergrowth.txt @@ -4,7 +4,7 @@ Types:Instant Text:As an additional cost to cast Undergrowth, you may pay 2 R. A:SP$ Fog | Cost$ G | SpellDescription$ Prevent all combat damage that would be dealt this turn. A:SP$ Effect | Cost$ 2 R G | Name$ Undergrowth Effect | StaticAbilities$ KWPump | SpellDescription$ If its additional cost was paid, CARDNAME doesn't affect combat damage that would be dealt by red creatures. -SVar:KWPump:Mode$ Continuous | Affected$ Creature.nonRed | AddHiddenKeyword$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | Description$ Prevent all combat damage this turn except that from red creatures. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.nonRed | AddHiddenKeyword$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | Description$ Prevent all combat damage this turn except that from red creatures. SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/undergrowth.jpg diff --git a/res/cardsfolder/u/unstable_footing.txt b/res/cardsfolder/u/unstable_footing.txt index 758ca46b0c1..70cd04d1225 100644 --- a/res/cardsfolder/u/unstable_footing.txt +++ b/res/cardsfolder/u/unstable_footing.txt @@ -4,7 +4,7 @@ Types:Instant Text:no text K:Kicker 3 R A:SP$ Effect | Cost$ R | Name$ Unstable Footing | StaticAbilities$ STCantPrevent | SubAbility$ DBDamage | SpellDescription$ Damage can't be prevented this turn. If CARDNAME was kicked, it deals 5 damage to target player. -SVar:STCantPrevent:Mode$ Continuous | GlobalRule$ Damage can't be prevented. | Description$ Damage can't be prevented. +SVar:STCantPrevent:Mode$ Continuous | EffectZone$ Command | GlobalRule$ Damage can't be prevented. | Description$ Damage can't be prevented. SVar:DBDamage:DB$ DealDamage | ValidTgts$ Player | TgtPrompt$ Select another target player | NumDmg$ 5 | NoPrevention$ True | Condition$ Kicked | ConditionDescription$ If it was kicked, SVar:RemAIDeck:True SVar:Rarity:Uncommon diff --git a/res/cardsfolder/v/veiling_oddity.txt b/res/cardsfolder/v/veiling_oddity.txt index 48229c6ae5c..0ee20cb7d75 100644 --- a/res/cardsfolder/v/veiling_oddity.txt +++ b/res/cardsfolder/v/veiling_oddity.txt @@ -6,7 +6,7 @@ PT:2/3 K:Suspend:4:1 U T:Mode$ CounterRemoved | ValidCard$ Card.Self | TriggerZones$ Exile | CounterType$ TIME | Execute$ TrigEffect | IsPresent$ Card.Self+counters_GE1_TIME | PresentZone$ Exile | PresentCompare$ EQ0 | TriggerDescription$ When the last time counter is removed from CARDNAME while it's exiled, creatures are unblockable this turn. SVar:TrigEffect:AB$ Effect | Cost$ 0 | Name$ Veiling Oddity Effect | StaticAbilities$ KWPump -SVar:KWPump:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ HIDDEN Unblockable | Description$ creatures are unblockable this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature | AddHiddenKeyword$ HIDDEN Unblockable | Description$ creatures are unblockable this turn. SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/veiling_oddity.jpg SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/51.jpg diff --git a/res/cardsfolder/v/veilstone_amulet.txt b/res/cardsfolder/v/veilstone_amulet.txt index 6d80f5ec0f5..b3208a3897d 100644 --- a/res/cardsfolder/v/veilstone_amulet.txt +++ b/res/cardsfolder/v/veilstone_amulet.txt @@ -4,7 +4,7 @@ Types:Artifact Text:no text T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigEffect | TriggerDescription$ Whenever you cast a spell, creatures you control can't be the targets of spells or abilities your opponents control this turn. SVar:TrigEffect:AB$Effect | Cost$ 0 | Name$ Veilstone Amulet Effect | StaticAbilities$ CantTarget -SVar:CantTarget:Mode$ CantTarget | ValidCard$ Creature.YouCtrl | Activator$ Opponent | Description$ Creatures you control can't be the targets of spells or abilities your opponents control +SVar:CantTarget:Mode$ CantTarget | EffectZone$ Command | ValidCard$ Creature.YouCtrl | Activator$ Opponent | Description$ Creatures you control can't be the targets of spells or abilities your opponents control SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/veilstone_amulet.jpg diff --git a/res/cardsfolder/v/venser_the_sojourner.txt b/res/cardsfolder/v/venser_the_sojourner.txt index 835b7001960..10adf620bf6 100644 --- a/res/cardsfolder/v/venser_the_sojourner.txt +++ b/res/cardsfolder/v/venser_the_sojourner.txt @@ -8,7 +8,7 @@ SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ Tr SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Effect | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Name$ Venser, the Sojourner Effect | Image$ venser_the_sojourner_emblem | StaticAbilities$ KWPump | SpellDescription$ Creatures are unblockable this turn. -SVar:KWPump:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ HIDDEN Unblockable | Description$ creatures are unblockable this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature | AddHiddenKeyword$ HIDDEN Unblockable | Description$ creatures are unblockable this turn. A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Venser, the Sojourner emblem | Triggers$ TrigSpellCast | SVars$ EffSpellCast | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Whenever you cast a spell, exile target permanent." SVar:TrigSpellCast:Mode$ SpellCast | ValidActivatingPlayer$ You | Execute$ EffSpellCast | TriggerDescription$ Whenever you cast a spell, exile target permanent. SVar:EffSpellCast:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent diff --git a/res/cardsfolder/w/winding_canyons.txt b/res/cardsfolder/w/winding_canyons.txt index b5e29e40191..4bc765a3f2e 100644 --- a/res/cardsfolder/w/winding_canyons.txt +++ b/res/cardsfolder/w/winding_canyons.txt @@ -4,7 +4,7 @@ Types:Land Text:no text A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. A:AB$ Effect | Cost$ 2 T | Name$ Winding Canyons Effect | StaticAbilities$ GiveFlash | SpellDescription$ Until end of turn, you may play creature cards as though they had flash. -SVar:GiveFlash:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ HIDDEN Flash | AffectedZone$ Exile,Graveyard,Hand,Library | Description$ Until end of turn, you may play creature cards as though they had flash. +SVar:GiveFlash:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddHiddenKeyword$ HIDDEN Flash | AffectedZone$ Exile,Graveyard,Hand,Library | Description$ Until end of turn, you may play creature cards as though they had flash. SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/winding_canyons.jpg diff --git a/res/cardsfolder/x/xantid_swarm.txt b/res/cardsfolder/x/xantid_swarm.txt index b4bd793854d..7ecf4caea3e 100644 --- a/res/cardsfolder/x/xantid_swarm.txt +++ b/res/cardsfolder/x/xantid_swarm.txt @@ -6,7 +6,7 @@ PT:0/1 K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigEffect | TriggerDescription$ When CARDNAME attacks, defending player can't cast spells this turn. SVar:TrigEffect:AB$ Effect | Cost$ 0 | Name$ Xantid Swarm Effect | StaticAbilities$ CantBeCast -SVar:CantBeCast:Mode$ CantBeCast | ValidCard$ Card | Caster$ DefendingPlayer | Description$ Defending player can't cast spells. +SVar:CantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ DefendingPlayer | Description$ Defending player can't cast spells. SVar:RemRandomDeck:True SVar:HasAttackEffect:TRUE SVar:Rarity:Rare diff --git a/res/cardsfolder/y/yawgmoths_will.txt b/res/cardsfolder/y/yawgmoths_will.txt index 9f9e8cded79..f8b07ae6e08 100644 --- a/res/cardsfolder/y/yawgmoths_will.txt +++ b/res/cardsfolder/y/yawgmoths_will.txt @@ -3,7 +3,7 @@ ManaCost:2 B Types:Sorcery Text:no text A:SP$ Effect | Cost$ 2 B | Name$ Yawgmoth's Will Effect | StaticAbilities$ STPlay | Keywords$ Exile | SpellDescription$ Until end of turn, you may play cards from your graveyard. If a card would be put into your graveyard from anywhere this turn, exile that card instead. -SVar:STPlay:Mode$ Continuous | Affected$ Card.YouCtrl | AffectedZone$ Graveyard | AddHiddenKeyword$ HIDDEN May be played | Description$ You may play cards from your graveyard. +SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.YouCtrl | AffectedZone$ Graveyard | AddHiddenKeyword$ HIDDEN May be played | Description$ You may play cards from your graveyard. SVar:Exile:If a card would be put into your graveyard from anywhere, exile it instead. SVar:RemAIDeck:True SVar:Rarity:Rare diff --git a/res/layouts/home_default.xml b/res/layouts/home_default.xml index 2a661eed3dd..50c5ac0b7c6 100644 --- a/res/layouts/home_default.xml +++ b/res/layouts/home_default.xml @@ -21,5 +21,6 @@ HOME_CONSTRUCTED HOME_DRAFT HOME_SEALED + HOME_VANGUARD \ No newline at end of file diff --git a/res/layouts/match_default.xml b/res/layouts/match_default.xml index 95a9086682e..69ee7243866 100644 --- a/res/layouts/match_default.xml +++ b/res/layouts/match_default.xml @@ -14,6 +14,7 @@ FIELD_1 + COMMAND_1 HAND_0 @@ -23,6 +24,7 @@ FIELD_0 + COMMAND_0 CARD_PICTURE diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index a6c6168480a..015d4b2727d 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -8058,7 +8058,7 @@ public class Card extends GameEntity implements Comparable { } // Prevent Damage static abilities - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { restDamage = stAb.applyAbility("PreventDamage", source, this, restDamage, isCombat); @@ -8844,7 +8844,7 @@ public class Card extends GameEntity implements Comparable { } // CantTarget static abilities - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { if (stAb.applyAbility("CantTarget", this, sa)) { diff --git a/src/main/java/forge/GameAction.java b/src/main/java/forge/GameAction.java index 9b689a9d721..e20ca507f0f 100644 --- a/src/main/java/forge/GameAction.java +++ b/src/main/java/forge/GameAction.java @@ -212,7 +212,8 @@ public class GameAction { } // Tokens outside the battlefield disappear immediately. - if (copied.isToken() && !zoneTo.is(ZoneType.Battlefield)) { + if ((copied.isToken() && !zoneTo.is(ZoneType.Battlefield) + && !((copied.isType("Emblem") || copied.isType("Effect")) && zoneTo.is(ZoneType.Command)))) { zoneTo.remove(copied); } @@ -778,6 +779,9 @@ public class GameAction { } else if (name.equals(ZoneType.Ante)) { final PlayerZone ante = c.getOwner().getZone(ZoneType.Ante); return this.moveTo(ante, c); + } else if (name.equals(ZoneType.Command)) { + final PlayerZone command = c.getOwner().getZone(ZoneType.Command); + return this.moveTo(command, c); } else { return this.moveToStack(c); } @@ -1916,6 +1920,7 @@ public class GameAction { List cardsOnBattlefield = Lists.newArrayList(game.getCardsIn(ZoneType.Battlefield)); cardsOnBattlefield.addAll(game.getCardsIn(ZoneType.Stack)); + cardsOnBattlefield.addAll(game.getCardsIn(ZoneType.Command)); if (!cardsOnBattlefield.contains(originalCard)) { cardsOnBattlefield.add(originalCard); } diff --git a/src/main/java/forge/card/CardRules.java b/src/main/java/forge/card/CardRules.java index efbbfa7ed89..4218cf5fc6d 100644 --- a/src/main/java/forge/card/CardRules.java +++ b/src/main/java/forge/card/CardRules.java @@ -46,6 +46,10 @@ public final class CardRules { private String toughness = null; private String loyalty = null; + + //Vanguard avatar modifiers + private Integer life = null; + private Integer hand = null; Map setsPrinted = null; @@ -256,6 +260,15 @@ public final class CardRules { this.iToughness = StringUtils.isNumeric(this.toughness) ? Integer.parseInt(this.toughness) : 0; } else if (this.getType().isPlaneswalker()) { this.loyalty = this.characteristics.getPtLine(); + } else if (this.getType().isVanguard()) { + String pt = this.characteristics.getPtLine(); + final int slashPos = this.characteristics.getPtLine() == null ? -1 : this.characteristics.getPtLine() + .indexOf('/'); + if (slashPos == -1) { + throw new RuntimeException(String.format("Vanguard '%s' has bad hand/life stats", this.getName())); + } + this.hand = Integer.parseInt(pt.substring(0,pt.indexOf('/'))); + this.life = Integer.parseInt(pt.substring(pt.indexOf('/')+1)); } if (this.characteristics.getSetsData().isEmpty()) { @@ -386,6 +399,22 @@ public final class CardRules { public List getKeywords() { return characteristics.getKeywords(); } + + /** + * @return the hand + */ + public Integer getHand() { + return hand; + } + + /** + * @return the life + */ + public Integer getLife() { + return life; + } + + } diff --git a/src/main/java/forge/card/CardRulesReader.java b/src/main/java/forge/card/CardRulesReader.java index 798cfb92fce..a342c935f7d 100644 --- a/src/main/java/forge/card/CardRulesReader.java +++ b/src/main/java/forge/card/CardRulesReader.java @@ -111,6 +111,12 @@ public class CardRulesReader { this.characteristics[this.curCharacteristics].setDeckNeeds(CardRulesReader.getValueAfterKey(line, "DeckNeeds:")); } break; + + case 'H': + if(line.startsWith("HandLifeModifier:")) { + this.characteristics[this.curCharacteristics].setPtLine(CardRulesReader.getValueAfterKey(line, "HandLifeModifier:")); + } + break; case 'K': if (line.startsWith("K:")) { diff --git a/src/main/java/forge/card/CardType.java b/src/main/java/forge/card/CardType.java index 387c0650dde..561b0281049 100644 --- a/src/main/java/forge/card/CardType.java +++ b/src/main/java/forge/card/CardType.java @@ -203,6 +203,15 @@ public final class CardType implements Comparable { public boolean isSorcery() { return this.coreType.contains(CardCoreType.Sorcery); } + + /** + * Checks if is vanguard. + * + * @return true if vanguard + */ + public boolean isVanguard() { + return this.coreType.contains(CardCoreType.Vanguard); + } /** * Checks if is enchantment. diff --git a/src/main/java/forge/card/abilityfactory/effects/EffectEffect.java b/src/main/java/forge/card/abilityfactory/effects/EffectEffect.java index f4b075546a4..5443c46c914 100644 --- a/src/main/java/forge/card/abilityfactory/effects/EffectEffect.java +++ b/src/main/java/forge/card/abilityfactory/effects/EffectEffect.java @@ -14,6 +14,7 @@ import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerType; import forge.game.player.Player; +import forge.game.zone.ZoneType; public class EffectEffect extends SpellEffect { @@ -223,7 +224,7 @@ public class EffectEffect extends SpellEffect { // TODO: Add targeting to the effect so it knows who it's dealing with Singletons.getModel().getGame().getTriggerHandler().suppressMode(TriggerType.ChangesZone); - Singletons.getModel().getGame().getAction().moveToPlay(eff); + Singletons.getModel().getGame().getAction().moveTo(ZoneType.Command, eff); Singletons.getModel().getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone); } diff --git a/src/main/java/forge/card/spellability/AbilityActivated.java b/src/main/java/forge/card/spellability/AbilityActivated.java index 3c2d16410a0..70ab2e7f7dd 100644 --- a/src/main/java/forge/card/spellability/AbilityActivated.java +++ b/src/main/java/forge/card/spellability/AbilityActivated.java @@ -93,7 +93,7 @@ public abstract class AbilityActivated extends SpellAbility implements java.io.S } // CantBeActivated static abilities - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { if (stAb.applyAbility("CantBeActivated", c, this)) { diff --git a/src/main/java/forge/card/spellability/Spell.java b/src/main/java/forge/card/spellability/Spell.java index 793b52983ce..d715ef174eb 100644 --- a/src/main/java/forge/card/spellability/Spell.java +++ b/src/main/java/forge/card/spellability/Spell.java @@ -119,7 +119,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable } // CantBeCast static abilities - final List allp = new ArrayList(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)); + final List allp = new ArrayList(Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))); allp.add(card); for (final Card ca : allp) { final ArrayList staticAbilities = ca.getStaticAbilities(); diff --git a/src/main/java/forge/deck/Deck.java b/src/main/java/forge/deck/Deck.java index 5df67228afe..4db81fdf680 100644 --- a/src/main/java/forge/deck/Deck.java +++ b/src/main/java/forge/deck/Deck.java @@ -62,6 +62,9 @@ public class Deck extends DeckBase { private final DeckSection main; private final DeckSection sideboard; + private final DeckSection commander; + private final DeckSection planes; + private final DeckSection schemes; // gameType is from Constant.GameType, like GameType.Regular /** @@ -82,6 +85,9 @@ public class Deck extends DeckBase { super(name0); this.main = new DeckSection(); this.sideboard = new DeckSection(); + this.commander = new DeckSection(); + this.planes = new DeckSection(); + this.schemes = new DeckSection(); } /** @@ -197,7 +203,9 @@ public class Deck extends DeckBase { d.getMain().set(Deck.readCardList(sections.get("main"))); d.getSideboard().set(Deck.readCardList(sections.get("sideboard"))); - + d.getCommander().set(Deck.readCardList(sections.get("commander"))); + d.getPlanes().set(Deck.readCardList(sections.get("planes"))); + d.getSchemes().set(Deck.readCardList(sections.get("schemes"))); return d; } @@ -270,6 +278,15 @@ public class Deck extends DeckBase { out.add(String.format("%s", "[sideboard]")); out.addAll(Deck.writeCardPool(this.getSideboard())); + + out.add(String.format("%s", "[commander]")); + out.addAll(Deck.writeCardPool(this.getCommander())); + + out.add(String.format("%s", "[planes]")); + out.addAll(Deck.writeCardPool(this.getPlanes())); + + out.add(String.format("%s", "[schemes]")); + out.addAll(Deck.writeCardPool(this.getSchemes())); return out; } @@ -326,9 +343,70 @@ public class Deck extends DeckBase { return false; } + if(type == GameType.Commander) + {//Must contain exactly 1 legendary Commander and no sideboard. + //TODO:Enforce color identity + if(getCommander().countAll() != 1) + return false; + + if(!getCommander().toFlatList().get(0).getType().contains("Legendary")) + return false; + + //No sideboarding in Commander + if(getSideboard().countAll() > 0) + return false; + } + else if(type == GameType.Planechase) + {//Must contain at least 10 planes/phenomenons, but max 2 phenomenons. Singleton. + if(getPlanes().countAll() < 10) + return false; + int phenoms = 0; + for(CardPrinted cp : getPlanes().toFlatList()) + { + if(cp.getType().contains("Phenomenon")) + phenoms++; + if(getPlanes().count(cp) > 1) + return false; + } + if(phenoms > 2) + return false; + } + else if(type == GameType.Archenemy) + {//Must contain at least 20 schemes, max 2 of each. + if(getSchemes().countAll() < 20) + return false; + + for(CardPrinted cp : getSchemes().toFlatList()) + { + if(getSchemes().count(cp) > 2) + return false; + } + } + return true; } + /** + * @return the commander + */ + public DeckSection getCommander() { + return commander; + } + + /** + * @return the planes + */ + public DeckSection getPlanes() { + return planes; + } + + /** + * @return the schemes + */ + public DeckSection getSchemes() { + return schemes; + } + public static final Function FN_NAME_SELECTOR = new Function() { @Override public String apply(Deck arg1) { diff --git a/src/main/java/forge/deck/DeckRecognizer.java b/src/main/java/forge/deck/DeckRecognizer.java index 6b236800db7..29c86a68a5b 100644 --- a/src/main/java/forge/deck/DeckRecognizer.java +++ b/src/main/java/forge/deck/DeckRecognizer.java @@ -245,6 +245,18 @@ public class DeckRecognizer { if (line.toLowerCase().contains("main")) { return true; } + if (line.toLowerCase().contains("commander")) { + return true; + } + if (line.toLowerCase().contains("planes")) { + return true; + } + if (line.toLowerCase().contains("schemes")) { + return true; + } + if (line.toLowerCase().contains("vanguard")) { + return true; + } return false; } diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java index 5b6f6fb4ad3..11f5cda3606 100644 --- a/src/main/java/forge/game/GameNew.java +++ b/src/main/java/forge/game/GameNew.java @@ -20,6 +20,7 @@ import forge.CardPredicates; import forge.CardUtil; import forge.GameAction; import forge.Singletons; +import forge.card.cardfactory.CardFactoryUtil; import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerType; import forge.control.input.InputControl; @@ -32,6 +33,7 @@ import forge.game.player.Player; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.match.views.VAntes; +import forge.item.CardDb; import forge.item.CardPrinted; import forge.properties.ForgePreferences.FPref; import forge.sound.Sounds; @@ -121,12 +123,12 @@ public class GameNew { for( Entry p : playersConditions.entrySet() ) { final Player player = p.getKey(); player.setStartingLife(p.getValue().getStartingLife()); + player.setMaxHandSize(p.getValue().getStartingHand()); // what if I call it for AI player? PlayerZone bf = player.getZone(ZoneType.Battlefield); - Iterable onTable = p.getValue().getCardsOnTable(); + Iterable onTable = p.getValue().getCardsOnBattlefield(); if (onTable != null) { for (final Card c : onTable) { - c.addController(player); c.setOwner(player); bf.add(c, false); c.setSickness(true); @@ -135,10 +137,22 @@ public class GameNew { } } + PlayerZone com = player.getZone(ZoneType.Command); + Iterable inCommand = p.getValue().getCardsInCommand(); + if (inCommand != null) { + for (final Card c : inCommand) { + c.setOwner(player); + com.add(c, false); + c.refreshUniqueNumber(); + } + } + prepareSingleLibrary(player, p.getValue().getDeck(), removedAnteCards, rAICards, canRandomFoil); player.updateObservers(); bf.updateObservers(); player.getZone(ZoneType.Hand).updateObservers(); + player.getZone(ZoneType.Command).updateObservers(); + player.getZone(ZoneType.Battlefield).updateObservers(); } @@ -190,7 +204,7 @@ public class GameNew { player.setNumLandsPlayed(0); // what if I call it for AI player? PlayerZone bf = player.getZone(ZoneType.Battlefield); - Iterable onTable = p.getValue().getCardsOnTable(); + Iterable onTable = p.getValue().getCardsOnBattlefield(); if (onTable != null) { for (final Card c : onTable) { c.addController(player); @@ -237,6 +251,7 @@ public class GameNew { final String nl = System.getProperty("line.separator"); final StringBuilder msg = new StringBuilder(); for (final Player p : game.getPlayers()) { + final List lib = p.getCardsIn(ZoneType.Library); Predicate goodForAnte = Predicates.not(CardPredicates.Presets.BASIC_LANDS); Card ante = Aggregates.random(Iterables.filter(lib, goodForAnte)); @@ -262,10 +277,9 @@ public class GameNew { } } - // Draw 7 cards + // Draw cards for (final Player p : game.getPlayers()) { - // Should this be p.getMaxHandSize() for Vanguard compatibility? - p.drawCards(7); + p.drawCards(p.getMaxHandSize()); } game.getPhaseHandler().setPhaseState(PhaseType.MULLIGAN); diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index 72a14e2f02a..af64104ee82 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -426,6 +426,7 @@ public class GameState { all.addAll(player.getZone(ZoneType.Library).getCards()); all.addAll(player.getZone(ZoneType.Battlefield).getCards(false)); all.addAll(player.getZone(ZoneType.Exile).getCards()); + all.addAll(player.getZone(ZoneType.Command).getCards()); } all.addAll(getStackZone().getCards()); return all; diff --git a/src/main/java/forge/game/GameType.java b/src/main/java/forge/game/GameType.java index dcfa614ffef..946d10419b9 100644 --- a/src/main/java/forge/game/GameType.java +++ b/src/main/java/forge/game/GameType.java @@ -32,6 +32,12 @@ public enum GameType { Commander(false, 100, 100, true), /** The Quest. */ Quest(true, 40), + /** The Vanguard. */ + Vanguard(false, 60), + /** The Planechase. */ + Planechase(false, 60), + /** The Archenemy. */ + Archenemy(false, 60), /** */ Gauntlet(true, 40); diff --git a/src/main/java/forge/game/MatchStartHelper.java b/src/main/java/forge/game/MatchStartHelper.java index f9012900514..df4947ad72a 100644 --- a/src/main/java/forge/game/MatchStartHelper.java +++ b/src/main/java/forge/game/MatchStartHelper.java @@ -1,10 +1,17 @@ package forge.game; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import com.google.common.base.Supplier; + +import forge.Card; +import forge.card.CardRules; import forge.deck.Deck; import forge.game.player.LobbyPlayer; +import forge.item.CardPrinted; /** * TODO: Write javadoc for this type. @@ -12,13 +19,35 @@ import forge.game.player.LobbyPlayer; */ public class MatchStartHelper { private final Map players = new HashMap(); - - public void addPlayer(LobbyPlayer player, PlayerStartConditions c) { + + public void addPlayer(final LobbyPlayer player, final PlayerStartConditions c) { players.put(player,c); } - public void addPlayer(LobbyPlayer player, Deck deck) { - players.put(player, new PlayerStartConditions(deck)); + public void addPlayer(final LobbyPlayer player, final Deck deck) { + PlayerStartConditions start = new PlayerStartConditions(deck); + players.put(player, start); + } + + public void addVanguardPlayer(final LobbyPlayer player, final Deck deck, final CardPrinted avatar) + { + PlayerStartConditions start = new PlayerStartConditions(deck); + + start.setStartingLife(start.getStartingLife() + avatar.getCard().getLife()); + start.setStartingHand(start.getStartingHand() + avatar.getCard().getHand()); + + start.setCardsInCommand(new Supplier>() { + + @Override + public Iterable get() { + List res = new ArrayList(); + res.add(avatar.toForgeCard()); + return res; + } + + }); + + players.put(player, start); } public Map getPlayerMap() @@ -26,5 +55,4 @@ public class MatchStartHelper { return players; } - } diff --git a/src/main/java/forge/game/PlayerStartConditions.java b/src/main/java/forge/game/PlayerStartConditions.java index 3dac637c4d9..8f388a2352c 100644 --- a/src/main/java/forge/game/PlayerStartConditions.java +++ b/src/main/java/forge/game/PlayerStartConditions.java @@ -3,13 +3,17 @@ package forge.game; import com.google.common.base.Supplier; import forge.Card; +import forge.card.CardRules; import forge.deck.Deck; +import forge.item.CardPrinted; public class PlayerStartConditions { private final Deck deck; private int startingLife = 20; - private Supplier> cardsOnTable = null; + private int startingHand = 7; + private Supplier> cardsOnBattlefield = null; + private Supplier> cardsInCommand = null; public PlayerStartConditions( Deck deck0 ) { deck = deck0; @@ -21,16 +25,44 @@ public class PlayerStartConditions { public final int getStartingLife() { return startingLife; } - public final Iterable getCardsOnTable() { - return cardsOnTable == null ? null : cardsOnTable.get(); + public final Iterable getCardsOnBattlefield() { + return cardsOnBattlefield == null ? null : cardsOnBattlefield.get(); } public final void setStartingLife(int startingLife) { this.startingLife = startingLife; } - public final void setCardsOnTable(Supplier> cardsOnTable) { - this.cardsOnTable = cardsOnTable; + public final void setCardsOnBattlefield(Supplier> cardsOnTable) { + this.cardsOnBattlefield = cardsOnTable; + } + + /** + * @return the startingHand + */ + public int getStartingHand() { + return startingHand; + } + + /** + * @param startingHand0 the startingHand to set + */ + public void setStartingHand(int startingHand0) { + this.startingHand = startingHand0; + } + + /** + * @return the cardsInCommand + */ + public Iterable getCardsInCommand() { + return cardsInCommand == null ? null : cardsInCommand.get(); + } + + /** + * @param cardsInCommand0 the cardsInCommand to set + */ + public void setCardsInCommand(Supplier> cardsInCommand0) { + this.cardsInCommand = cardsInCommand0; } diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index f270ee68b25..652b10e59e6 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -952,7 +952,7 @@ public class CombatUtil { } // CantBeActivated static abilities - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { if (stAb.applyAbility("CantAttack", c, defender)) { diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index f6bc113b4c4..901dd0abcae 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -668,7 +668,7 @@ public abstract class Player extends GameEntity implements Comparable { } // Prevent Damage static abilities - for (final Card ca : game.getCardsIn(ZoneType.Battlefield)) { + for (final Card ca : game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { restDamage = stAb.applyAbility("PreventDamage", source, this, restDamage, isCombat); @@ -1895,7 +1895,7 @@ public abstract class Player extends GameEntity implements Comparable { } // CantBeCast static abilities - for (final Card ca : game.getCardsIn(ZoneType.Battlefield)) { + for (final Card ca : game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { if (stAb.applyAbility("CantPlayLand", null, this)) { diff --git a/src/main/java/forge/game/zone/PlayerZoneBattlefield.java b/src/main/java/forge/game/zone/PlayerZoneBattlefield.java index 980223942ac..a70208561b9 100644 --- a/src/main/java/forge/game/zone/PlayerZoneBattlefield.java +++ b/src/main/java/forge/game/zone/PlayerZoneBattlefield.java @@ -84,7 +84,7 @@ public class PlayerZoneBattlefield extends PlayerZone { c.setTapped(true); } else { // ETBTapped static abilities - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { for (final StaticAbility stAb : ca.getStaticAbilities()) { if (stAb.applyAbility("ETBTapped", c)) { // it enters the battlefield this way, and should diff --git a/src/main/java/forge/game/zone/ZoneType.java b/src/main/java/forge/game/zone/ZoneType.java index d074768308a..143690851fc 100644 --- a/src/main/java/forge/game/zone/ZoneType.java +++ b/src/main/java/forge/game/zone/ZoneType.java @@ -34,7 +34,7 @@ public enum ZoneType { /** Ante. */ Ante(false); - public static final List STATIC_ABILITIES_SOURCE_ZONES = Arrays.asList(new ZoneType[]{Battlefield, Graveyard, Exile/*, Hand*/}); + public static final List STATIC_ABILITIES_SOURCE_ZONES = Arrays.asList(new ZoneType[]{Battlefield, Graveyard, Exile, Command/*, Hand*/}); private final boolean holdsHiddenInfo; private ZoneType(boolean holdsHidden) { diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java index a3249903465..663fc34874a 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java @@ -121,7 +121,7 @@ public final class CEditorConstructed extends ACEditorBase { @Override public void resetTables() { // Constructed mode can use all cards, no limitations. - this.getTableCatalog().setDeck(ItemPool.createFrom(CardDb.instance().getAllCards(), CardPrinted.class)); + this.getTableCatalog().setDeck(ItemPool.createFrom(CardDb.instance().getTraditionalCards(), CardPrinted.class)); this.getTableDeck().setDeck(this.controller.getModel().getMain()); } diff --git a/src/main/java/forge/gui/framework/EDocID.java b/src/main/java/forge/gui/framework/EDocID.java index fbecafe3c2c..fe9e7c20851 100644 --- a/src/main/java/forge/gui/framework/EDocID.java +++ b/src/main/java/forge/gui/framework/EDocID.java @@ -15,7 +15,6 @@ import forge.gui.home.gauntlet.VSubmenuGauntletBuild; import forge.gui.home.gauntlet.VSubmenuGauntletContests; import forge.gui.home.gauntlet.VSubmenuGauntletLoad; import forge.gui.home.gauntlet.VSubmenuGauntletQuick; -import forge.gui.home.multiplayer.VSubmenuArchenemy; import forge.gui.home.quest.VSubmenuChallenges; import forge.gui.home.quest.VSubmenuDuels; import forge.gui.home.quest.VSubmenuQuestData; @@ -27,6 +26,8 @@ import forge.gui.home.sanctioned.VSubmenuSealed; import forge.gui.home.settings.VSubmenuAvatars; import forge.gui.home.settings.VSubmenuDownloaders; import forge.gui.home.settings.VSubmenuPreferences; +import forge.gui.home.variant.VSubmenuArchenemy; +import forge.gui.home.variant.VSubmenuVanguard; import forge.gui.match.views.VAntes; import forge.gui.match.views.VCombat; import forge.gui.match.views.VDetail; @@ -74,6 +75,7 @@ public enum EDocID { /** */ HOME_CONSTRUCTED (VSubmenuConstructed.SINGLETON_INSTANCE), /** */ HOME_DRAFT (VSubmenuDraft.SINGLETON_INSTANCE), /** */ HOME_SEALED (VSubmenuSealed.SINGLETON_INSTANCE), /** */ + HOME_VANGUARD (VSubmenuVanguard.SINGLETON_INSTANCE), /** */ REPORT_MESSAGE (VMessage.SINGLETON_INSTANCE), /** */ REPORT_STACK (VStack.SINGLETON_INSTANCE), /** */ @@ -98,7 +100,16 @@ public enum EDocID { /** */ HAND_0 (null), /** */ HAND_1 (null), /** */ HAND_2 (null), /** */ - HAND_3 (null); + HAND_3 (null), /** */ + + COMMAND_0 (null), /** */ + COMMAND_1 (null), /** */ + COMMAND_2 (null), /** */ + COMMAND_3 (null), /** */ + COMMAND_4 (null), /** */ + COMMAND_5 (null), /** */ + COMMAND_6 (null), /** */ + COMMAND_7 (null); /** */ // End enum declarations, start enum methods. private IVDoc vDoc; diff --git a/src/main/java/forge/gui/home/EMenuGroup.java b/src/main/java/forge/gui/home/EMenuGroup.java index d86f494e2a5..b705cb6b935 100644 --- a/src/main/java/forge/gui/home/EMenuGroup.java +++ b/src/main/java/forge/gui/home/EMenuGroup.java @@ -11,7 +11,7 @@ public enum EMenuGroup { /** */ SANCTIONED ("Sanctioned Formats"), /** */ QUEST ("Quest Mode"), /** */ GAUNTLET ("Gauntlets"), /** */ - MULTIPLAYER ("Multiplayer"), /** */ + VARIANT ("Variant"), /** */ SETTINGS ("Game Settings"); private final String strTitle; diff --git a/src/main/java/forge/gui/home/VHomeUI.java b/src/main/java/forge/gui/home/VHomeUI.java index 592e89237ac..f2913f807d4 100644 --- a/src/main/java/forge/gui/home/VHomeUI.java +++ b/src/main/java/forge/gui/home/VHomeUI.java @@ -43,7 +43,6 @@ import forge.gui.home.gauntlet.VSubmenuGauntletBuild; import forge.gui.home.gauntlet.VSubmenuGauntletContests; import forge.gui.home.gauntlet.VSubmenuGauntletLoad; import forge.gui.home.gauntlet.VSubmenuGauntletQuick; -import forge.gui.home.multiplayer.VSubmenuArchenemy; import forge.gui.home.quest.VSubmenuChallenges; import forge.gui.home.quest.VSubmenuDuels; import forge.gui.home.quest.VSubmenuQuestData; @@ -55,6 +54,8 @@ import forge.gui.home.sanctioned.VSubmenuSealed; import forge.gui.home.settings.VSubmenuAvatars; import forge.gui.home.settings.VSubmenuDownloaders; import forge.gui.home.settings.VSubmenuPreferences; +import forge.gui.home.variant.VSubmenuArchenemy; +import forge.gui.home.variant.VSubmenuVanguard; import forge.gui.toolbox.ExperimentalLabel; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FSkin; @@ -118,6 +119,8 @@ public enum VHomeUI implements IVTopLevelUI { //allSubmenus.add(VSubmenuExit.SINGLETON_INSTANCE); allSubmenus.add(VSubmenuArchenemy.SINGLETON_INSTANCE); + + allSubmenus.add(VSubmenuVanguard.SINGLETON_INSTANCE); // For each group: init its panel final SortedMap allGroupPanels = new TreeMap(); diff --git a/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java b/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java index acdbab2b8c3..f3e3b45b65a 100644 --- a/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java +++ b/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java @@ -312,9 +312,9 @@ public class SSubmenuQuestUtil { humanStart.setStartingLife(qData.getAssets().getLife(qData.getMode()) + extraLifeHuman); aiStart.setStartingLife(lifeAI); - humanStart.setCardsOnTable(new Supplier>() { + humanStart.setCardsOnBattlefield(new Supplier>() { @Override public Iterable get() { return QuestUtil.getHumanStartingCards(qData, event); } }); - aiStart.setCardsOnTable(new Supplier>() { + aiStart.setCardsOnBattlefield(new Supplier>() { @Override public Iterable get() { return QuestUtil.getComputerStartingCards(event); } }); } // End isFantasy diff --git a/src/main/java/forge/gui/home/multiplayer/CSubmenuArchenemy.java b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java similarity index 98% rename from src/main/java/forge/gui/home/multiplayer/CSubmenuArchenemy.java rename to src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java index 62f415a81e4..7064fc64fdd 100644 --- a/src/main/java/forge/gui/home/multiplayer/CSubmenuArchenemy.java +++ b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java @@ -1,4 +1,4 @@ -package forge.gui.home.multiplayer; +package forge.gui.home.variant; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; diff --git a/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java b/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java new file mode 100644 index 00000000000..e335984ea51 --- /dev/null +++ b/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java @@ -0,0 +1,176 @@ +package forge.gui.home.variant; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Random; + +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; + +import com.google.common.collect.Iterables; + +import forge.Command; +import forge.Singletons; +import forge.control.Lobby; +import forge.deck.Deck; +import forge.game.GameType; +import forge.game.MatchController; +import forge.game.MatchStartHelper; +import forge.game.PlayerStartConditions; +import forge.game.player.LobbyPlayer; +import forge.game.player.PlayerType; +import forge.gui.SOverlayUtils; +import forge.gui.framework.ICDoc; +import forge.item.CardPrinted; +import forge.properties.ForgePreferences; +import forge.properties.ForgePreferences.FPref; + +/** + * Controls the constructed submenu in the home UI. + * + *

(C at beginning of class name denotes a control class.) + * + */ +public enum CSubmenuVanguard implements ICDoc { + /** */ + SINGLETON_INSTANCE; + private final VSubmenuVanguard view = VSubmenuVanguard.SINGLETON_INSTANCE; + + + /* (non-Javadoc) + * @see forge.gui.home.ICSubmenu#initialize() + */ + @Override + public void update() { + // Nothing to see here... + } + + /* (non-Javadoc) + * @see forge.gui.home.ICSubmenu#initialize() + */ + @Override + public void initialize() { + final ForgePreferences prefs = Singletons.getModel().getPreferences(); + view.getDcAi().initialize(); + view.getDcHuman().initialize(); + + // Checkbox event handling + view.getBtnStart().addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent arg0) { + startGame(); + } + }); + + // Checkbox event handling + view.getCbSingletons().addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent arg0) { + prefs.setPref(FPref.DECKGEN_SINGLETONS, + String.valueOf(view.getCbSingletons().isSelected())); + prefs.save(); + } + }); + + view.getCbArtifacts().addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent arg0) { + prefs.setPref( + FPref.DECKGEN_ARTIFACTS, String.valueOf(view.getCbArtifacts().isSelected())); + prefs.save(); + } + }); + + view.getCbRemoveSmall().addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent arg0) { + prefs.setPref( + FPref.DECKGEN_NOSMALL, String.valueOf(view.getCbRemoveSmall().isSelected())); + prefs.save(); + } + }); + + // Pre-select checkboxes + view.getCbSingletons().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_SINGLETONS)); + view.getCbArtifacts().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); + view.getCbRemoveSmall().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_NOSMALL)); + } + + + + /** @param lists0   {@link java.util.List}<{@link javax.swing.JList}> */ + private void startGame() { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + SOverlayUtils.startGameOverlay(); + SOverlayUtils.showOverlay(); + } + }); + + final SwingWorker worker = new SwingWorker() { + @Override + public Object doInBackground() { + Deck humanDeck = VSubmenuVanguard.SINGLETON_INSTANCE.getDcHuman().getDeck(); + Deck aiDeck = VSubmenuVanguard.SINGLETON_INSTANCE.getDcAi().getDeck(); + Object selAiAv = VSubmenuVanguard.SINGLETON_INSTANCE.getAvAi().getSelectedValue(); + Object selHumanAv = VSubmenuVanguard.SINGLETON_INSTANCE.getAvHuman().getSelectedValue(); + + Lobby lobby = Singletons.getControl().getLobby(); + LobbyPlayer humanPlayer = lobby.findLocalPlayer(PlayerType.HUMAN); + LobbyPlayer aiPlayer = lobby.findLocalPlayer(PlayerType.COMPUTER); + + PlayerStartConditions aiCond = new PlayerStartConditions(aiDeck); + PlayerStartConditions humanCond = new PlayerStartConditions(humanDeck); + + MatchStartHelper helper = new MatchStartHelper(); + + final CardPrinted aiVanguard,humanVanguard; + Iterable all = VSubmenuVanguard.SINGLETON_INSTANCE.getAllAvatars(); + if(selAiAv instanceof String) + { + //Random is the only string in the list so grab a random avatar. + Random r = new Random(); + aiVanguard = Iterables.get(all,r.nextInt(Iterables.size(all))); + } + else + { + aiVanguard = (CardPrinted)selAiAv; + } + if(selHumanAv instanceof String) + { + //Random is the only string in the list so grab a random avatar. + Random r = new Random(); + humanVanguard = Iterables.get(all,r.nextInt(Iterables.size(all))); + } + else + { + humanVanguard = (CardPrinted)selHumanAv; + } + helper.addVanguardPlayer(humanPlayer, humanDeck, humanVanguard); + helper.addVanguardPlayer(aiPlayer, aiDeck, aiVanguard); + + MatchController mc = Singletons.getModel().getMatch(); + mc.initMatch(GameType.Vanguard, helper.getPlayerMap()); + mc.startRound(); + + return null; + } + + @Override + public void done() { + SOverlayUtils.hideOverlay(); + } + }; + worker.execute(); + } + + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#getCommandOnSelect() + */ + @Override + public Command getCommandOnSelect() { + return null; + } +} diff --git a/src/main/java/forge/gui/home/multiplayer/VSubmenuArchenemy.java b/src/main/java/forge/gui/home/variant/VSubmenuArchenemy.java similarity index 95% rename from src/main/java/forge/gui/home/multiplayer/VSubmenuArchenemy.java rename to src/main/java/forge/gui/home/variant/VSubmenuArchenemy.java index ec3e8eb3f95..6a1edccfe85 100644 --- a/src/main/java/forge/gui/home/multiplayer/VSubmenuArchenemy.java +++ b/src/main/java/forge/gui/home/variant/VSubmenuArchenemy.java @@ -1,4 +1,4 @@ -package forge.gui.home.multiplayer; +package forge.gui.home.variant; import java.util.ArrayList; import java.util.List; @@ -103,7 +103,7 @@ public enum VSubmenuArchenemy implements IVSubmenu { */ @Override public EMenuGroup getGroupEnum() { - return EMenuGroup.MULTIPLAYER; + return EMenuGroup.VARIANT; } /* (non-Javadoc) diff --git a/src/main/java/forge/gui/home/variant/VSubmenuVanguard.java b/src/main/java/forge/gui/home/variant/VSubmenuVanguard.java new file mode 100644 index 00000000000..45cfe340117 --- /dev/null +++ b/src/main/java/forge/gui/home/variant/VSubmenuVanguard.java @@ -0,0 +1,250 @@ +package forge.gui.home.variant; + +import java.util.Arrays; +import java.util.Vector; + +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.ScrollPaneConstants; +import javax.swing.SwingConstants; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + +import net.miginfocom.swing.MigLayout; +import forge.card.CardCoreType; +import forge.card.CardRules; +import forge.card.CardRulesPredicates; +import forge.game.player.PlayerType; +import forge.gui.framework.DragCell; +import forge.gui.framework.DragTab; +import forge.gui.framework.EDocID; +import forge.gui.home.EMenuGroup; +import forge.gui.home.IVSubmenu; +import forge.gui.home.LblHeader; +import forge.gui.home.StartButton; +import forge.gui.home.VHomeUI; +import forge.gui.toolbox.FCheckBox; +import forge.gui.toolbox.FDeckChooser; +import forge.gui.toolbox.FLabel; +import forge.gui.toolbox.FList; +import forge.gui.toolbox.FSkin; +import forge.item.CardDb; +import forge.item.CardPrinted; + +/** + * Assembles Swing components of constructed submenu singleton. + * + *

(V at beginning of class name denotes a view class.) + * + */ +public enum VSubmenuVanguard implements IVSubmenu { + /** */ + SINGLETON_INSTANCE; + + // Fields used with interface IVDoc + private DragCell parentCell; + private final DragTab tab = new DragTab("Vanguard Mode"); + + /** */ + private final LblHeader lblTitle = new LblHeader("Variant: Vanguard"); + + private final JPanel pnlStart = new JPanel(new MigLayout("insets 0, gap 0, wrap 2")); + + private final StartButton btnStart = new StartButton(); + + private final JCheckBox cbSingletons = new FCheckBox("Singleton Mode"); + private final JCheckBox cbArtifacts = new FCheckBox("Remove Artifacts"); + private final JCheckBox cbRemoveSmall = new FCheckBox("Remove Small Creatures"); + + private final FDeckChooser dcHuman = new FDeckChooser("Select your deck:", PlayerType.HUMAN); + private final FDeckChooser dcAi = new FDeckChooser("Select AI deck:", PlayerType.COMPUTER); + + private final FList avHuman = new FList(); + private final FList avAi = new FList(); + private final JScrollPane scrHuman = new JScrollPane(avHuman, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + private final JScrollPane scrAi = new JScrollPane(avAi, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + + private final Predicate avatarTypePred = CardPrinted.Predicates.type("Vanguard"); + private final Iterable allAvatars = Iterables.filter(CardDb.instance().getAllCards(), avatarTypePred); + + private final FLabel lblAvatarHuman = new FLabel.Builder() + .text("Human avatar:") + .fontAlign(SwingConstants.CENTER) + .build(); + private final FLabel lblAvatarAi = new FLabel.Builder() + .text("AI Avatar:") + .fontAlign(SwingConstants.CENTER) + .build(); + + private VSubmenuVanguard() { + + lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + + Predicate typePred = CardPrinted.Predicates.type("Vanguard"); + + Vector listData = new Vector(); + listData.add("Random"); + for(CardPrinted cp : Iterables.filter(CardDb.instance().getAllCards(), typePred)) + { + listData.add(cp); + } + + avHuman.setListData(listData); + avAi.setListData(listData); + avHuman.setSelectedIndex(0); + avAi.setSelectedIndex(0); + + final String strCheckboxConstraints = "w 200px!, h 30px!, gap 0 20px 0 0"; + pnlStart.setOpaque(false); + pnlStart.add(cbSingletons, strCheckboxConstraints); + pnlStart.add(btnStart, "span 1 3, growx, pushx, align center"); + pnlStart.add(cbArtifacts, strCheckboxConstraints); + pnlStart.add(cbRemoveSmall, strCheckboxConstraints); + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getGroupEnum() + */ + @Override + public EMenuGroup getGroupEnum() { + return EMenuGroup.VARIANT; + } + + public final FDeckChooser getDcHuman() { + return dcHuman; + } + + public final FDeckChooser getDcAi() { + return dcAi; + } + + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getMenuTitle() + */ + @Override + public String getMenuTitle() { + return "Vanguard"; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#getItemEnum() + */ + @Override + public EDocID getItemEnum() { + return EDocID.HOME_VANGUARD; + } + + /* (non-Javadoc) + * @see forge.gui.home.IVSubmenu#populate() + */ + @Override + public void populate() { + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll(); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, wrap 2, ax right")); + + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 80%!, h 40px!, gap 0 0 15px 15px, span 2, ax right"); + + dcAi.populate(); + dcHuman.populate(); + + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(dcAi, "w 44%!, gap 0 0 20px 20px, growy, pushy"); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(dcHuman, "w 44%!, gap 4% 4% 20px 20px, growy, pushy"); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblAvatarAi, "w 44%!, gap 0 0 0px 0px"); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblAvatarHuman, "w 44%!, gap 4% 4% 0px 0px"); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(scrAi, "w 44%!, gap 0 0 20px 20px, growy, pushy"); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(scrHuman, "w 44%!, gap 4% 4% 20px 20px, growy, pushy"); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlStart, "span 2, gap 0 0 50px 50px, ax center"); + + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate(); + VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf(); + } + + + /** @return {@link javax.swing.JButton} */ + public JButton getBtnStart() { + return this.btnStart; + } + + + /** @return {@link javax.swing.JCheckBox} */ + public JCheckBox getCbSingletons() { + return cbSingletons; + } + + /** @return {@link javax.swing.JCheckBox} */ + public JCheckBox getCbArtifacts() { + return cbArtifacts; + } + + /** @return {@link javax.swing.JCheckBox} */ + public JCheckBox getCbRemoveSmall() { + return cbRemoveSmall; + } + + //========== Overridden from IVDoc + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getDocumentID() + */ + @Override + public EDocID getDocumentID() { + return EDocID.HOME_VANGUARD; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getTabLabel() + */ + @Override + public DragTab getTabLabel() { + return tab; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getLayoutControl() + */ + @Override + public CSubmenuVanguard getLayoutControl() { + return CSubmenuVanguard.SINGLETON_INSTANCE; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell) + */ + @Override + public void setParentCell(DragCell cell0) { + this.parentCell = cell0; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getParentCell() + */ + @Override + public DragCell getParentCell() { + return parentCell; + } + + /** + * @return the avHuman + */ + public FList getAvHuman() { + return avHuman; + } + + /** + * @return the avAi + */ + public FList getAvAi() { + return avAi; + } + + /** + * @return the allAvatars + */ + public Iterable getAllAvatars() { + return allAvatars; + } +} diff --git a/src/main/java/forge/gui/match/CMatchUI.java b/src/main/java/forge/gui/match/CMatchUI.java index 347a22ef5b0..57476486767 100644 --- a/src/main/java/forge/gui/match/CMatchUI.java +++ b/src/main/java/forge/gui/match/CMatchUI.java @@ -35,6 +35,7 @@ import forge.gui.match.controllers.CDetail; import forge.gui.match.controllers.CMessage; import forge.gui.match.controllers.CPicture; import forge.gui.match.nonsingleton.CField; +import forge.gui.match.nonsingleton.VCommand; import forge.gui.match.nonsingleton.VField; import forge.gui.match.nonsingleton.VHand; import forge.gui.toolbox.FSkin; @@ -87,12 +88,15 @@ public enum CMatchUI implements CardContainer { // Instantiate all required field slots (user at 0) <-- that's not guaranteed final List fields = new ArrayList(); + final List commands = new ArrayList(); VField humanField = new VField(EDocID.valueOf("FIELD_0"), localPlayer); + VCommand humanCommand = new VCommand(EDocID.COMMAND_0, localPlayer); fields.add(0, humanField); + commands.add(0, humanCommand); setAvatar(humanField, FSkin.getAvatars().get(Integer.parseInt(indices[0]))); humanField.getLayoutControl().initialize(); - + humanCommand.getLayoutControl().initialize(); int i = 1; for (Player p : players) { @@ -103,6 +107,9 @@ public enum CMatchUI implements CardContainer { setAvatar(f, getPlayerAvatar(p, Integer.parseInt(indices[i%2]))); f.getLayoutControl().initialize(); fields.add(f); + VCommand c = new VCommand(EDocID.valueOf("COMMAND_" + i), p); + c.getLayoutControl().initialize(); + commands.add(c); i++; } @@ -121,6 +128,7 @@ public enum CMatchUI implements CardContainer { // } // Replace old instances + VMatchUI.SINGLETON_INSTANCE.setCommandViews(commands); VMatchUI.SINGLETON_INSTANCE.setFieldViews(fields); VMatchUI.SINGLETON_INSTANCE.setHandViews(hands); } diff --git a/src/main/java/forge/gui/match/VMatchUI.java b/src/main/java/forge/gui/match/VMatchUI.java index 62baffb0d3f..0eb183e5f8d 100644 --- a/src/main/java/forge/gui/match/VMatchUI.java +++ b/src/main/java/forge/gui/match/VMatchUI.java @@ -13,6 +13,7 @@ import forge.gui.framework.IVTopLevelUI; import forge.gui.framework.SLayoutIO; import forge.gui.framework.SRearrangingUtil; import forge.gui.framework.VEmptyDoc; +import forge.gui.match.nonsingleton.VCommand; import forge.gui.match.nonsingleton.VField; import forge.gui.match.nonsingleton.VHand; import forge.gui.match.views.VDev; @@ -31,6 +32,7 @@ public enum VMatchUI implements IVTopLevelUI { /** */ SINGLETON_INSTANCE; + private List lstCommands = new ArrayList(); private List lstFields = new ArrayList(); private List lstHands = new ArrayList(); @@ -43,6 +45,12 @@ public enum VMatchUI implements IVTopLevelUI { EDocID.valueOf("FIELD_" + i).setDoc( new VEmptyDoc(EDocID.valueOf("FIELD_" + i))); } + + // Create empty docs for all field slots + for (int i = 0; i < 8; i++) { + EDocID.valueOf("COMMAND_" + i).setDoc( + new VEmptyDoc(EDocID.valueOf("COMMAND_" + i))); + } // Create empty docs for all hand slots for (int i = 0; i < 4; i++) { @@ -95,6 +103,21 @@ public enum VMatchUI implements IVTopLevelUI { lstFields.get(1).getParentCell().addDoc(lstFields.get(i)); } } + + // Add extra players alternatively to existing user/AI field panels. + for (int i = 2; i < lstCommands.size(); i++) { + // If already in layout, no need to add again. + if (lstCommands.get(i).getParentCell() != null) { + continue; + } + + if (i % 2 == 0) { + lstCommands.get(0).getParentCell().addDoc(lstCommands.get(i)); + } + else { + lstCommands.get(1).getParentCell().addDoc(lstCommands.get(i)); + } + } // Add extra hands to existing hand panel. for (int i = 0; i < lstHands.size(); i++) { @@ -156,4 +179,18 @@ public enum VMatchUI implements IVTopLevelUI { public JButton getBtnOK() { return VMessage.SINGLETON_INSTANCE.getBtnOK(); } + + /** + * @return the lstCommands + */ + public List getCommandViews() { + return lstCommands; + } + + /** + * @param lstCommands0 the lstCommands to set + */ + public void setCommandViews(List lstCommands0) { + this.lstCommands = lstCommands0; + } } diff --git a/src/main/java/forge/item/CardDb.java b/src/main/java/forge/item/CardDb.java index 24e5bb5bd42..3422d69f542 100644 --- a/src/main/java/forge/item/CardDb.java +++ b/src/main/java/forge/item/CardDb.java @@ -363,6 +363,15 @@ public final class CardDb { public Iterable getAllCards() { return this.allCardsFlat; } + + /** + * Gets all "traditional" (non-scheme/vanguard/plane) cards + * + * @return the cards + */ + public Iterable getTraditionalCards() { + return Iterables.filter(getAllCards(), CardPrinted.Predicates.Presets.TRADITIONAL); + } /** * Gets the card. diff --git a/src/main/java/forge/item/CardPrinted.java b/src/main/java/forge/item/CardPrinted.java index 4cf96159e33..437fc39efe4 100644 --- a/src/main/java/forge/item/CardPrinted.java +++ b/src/main/java/forge/item/CardPrinted.java @@ -318,6 +318,16 @@ public final class CardPrinted implements Comparable, InventoryItem * Number of filters based on CardPrinted values. */ public abstract static class Predicates { + + /** + * Type. + * @param t + * the type to search for + * @return + */ + public static Predicate type(final String t) { + return new PredicateType(t); + } /** * Rarity. @@ -426,6 +436,21 @@ public final class CardPrinted implements Comparable, InventoryItem this.mustContain = shouldContain; } } + + private static class PredicateType implements Predicate { + private final String operand; + + @Override + public boolean apply(final CardPrinted card) { + return card.getType().contains(operand); + } + + + public PredicateType(final String op) { + operand = op; + } + + } private static class PredicateName extends PredicateString { private final String operand; @@ -489,6 +514,10 @@ public final class CardPrinted implements Comparable, InventoryItem /** The Constant exceptLands. */ public static final Predicate EXCEPT_LANDS = Predicates.rarity(false, CardRarity.BasicLand); + + public static final Predicate NONTRADITIONAL = com.google.common.base.Predicates.or(Predicates.type("Vanguard"),Predicates.type("Scheme"),Predicates.type("Plane")); + + public static final Predicate TRADITIONAL = com.google.common.base.Predicates.not(Presets.NONTRADITIONAL); } } } diff --git a/src/main/java/forge/properties/ForgePreferences.java b/src/main/java/forge/properties/ForgePreferences.java index 564985d0a46..1f89540f29b 100644 --- a/src/main/java/forge/properties/ForgePreferences.java +++ b/src/main/java/forge/properties/ForgePreferences.java @@ -76,7 +76,7 @@ public class ForgePreferences { SUBMENU_CURRENTMENU (EMenuItem.CONSTRUCTED.toString()), /** */ SUBMENU_SANCTIONED ("false"), /** */ SUBMENU_GAUNTLET ("false"), /** */ - SUBMENU_MULTIPLAYER ("false"), /** */ + SUBMENU_VARIANT ("false"), /** */ SUBMENU_QUEST ("false"), /** */ SUBMENU_SETTINGS ("false"), /** */ SUBMENU_UTILITIES ("false"), /** */