- Reintegrated the Schemes branch.

This commit is contained in:
Sloth
2012-12-10 19:48:05 +00:00
62 changed files with 1387 additions and 113 deletions

35
.gitattributes vendored
View File

@@ -22,6 +22,7 @@ res/blockdata/setdata.txt svneol=native#text/plain
res/blockdata/starters.txt -text
res/booster-decks -text
res/cardTemplateScript.py -text svneol=unset#text/x-python
res/cardsfolder/a/a_display_of_my_dark_power.txt -text
res/cardsfolder/a/abandon_hope.txt -text
res/cardsfolder/a/abandoned_outpost.txt svneol=native#text/plain
res/cardsfolder/a/abattoir_ghoul.txt -text
@@ -210,6 +211,7 @@ res/cardsfolder/a/ali_from_cairo.txt svneol=native#text/plain
res/cardsfolder/a/alibans_tower.txt svneol=native#text/plain
res/cardsfolder/a/all_hallows_eve.txt svneol=native#text/plain
res/cardsfolder/a/all_is_dust.txt svneol=native#text/plain
res/cardsfolder/a/all_shall_smolder_in_my_wake.txt -text
res/cardsfolder/a/all_suns_dawn.txt svneol=native#text/plain
res/cardsfolder/a/allay.txt svneol=native#text/plain
res/cardsfolder/a/alley_grifters.txt svneol=native#text/plain
@@ -376,6 +378,7 @@ res/cardsfolder/a/appetite_for_brains.txt -text
res/cardsfolder/a/apprentice_necromancer.txt svneol=native#text/plain
res/cardsfolder/a/apprentice_sorcerer.txt svneol=native#text/plain
res/cardsfolder/a/apprentice_wizard.txt svneol=native#text/plain
res/cardsfolder/a/approach_my_molten_realm.txt -text
res/cardsfolder/a/aquamoeba.txt svneol=native#text/plain
res/cardsfolder/a/aquamorph_entity.txt -text
res/cardsfolder/a/aquastrand_spider.txt -text
@@ -840,6 +843,7 @@ res/cardsfolder/b/befoul.txt svneol=native#text/plain
res/cardsfolder/b/beguiler_of_wills.txt -text
res/cardsfolder/b/behemoth_sledge.txt svneol=native#text/plain
res/cardsfolder/b/behemoths_herald.txt -text
res/cardsfolder/b/behold_the_power_of_destruction.txt -text
res/cardsfolder/b/belbes_armor.txt svneol=native#text/plain
res/cardsfolder/b/belbes_percher.txt svneol=native#text/plain
res/cardsfolder/b/belbes_portal.txt svneol=native#text/plain
@@ -2164,6 +2168,7 @@ res/cardsfolder/d/damping_matrix.txt -text
res/cardsfolder/d/dance_of_many.txt svneol=native#text/plain
res/cardsfolder/d/dance_of_shadows.txt svneol=native#text/plain
res/cardsfolder/d/dance_of_the_dead.txt svneol=native#text/plain
res/cardsfolder/d/dance_pathetic_marionette.txt -text
res/cardsfolder/d/dancing_scimitar.txt svneol=native#text/plain
res/cardsfolder/d/dandan.txt svneol=native#text/plain
res/cardsfolder/d/dangerous_wager.txt -text
@@ -2992,6 +2997,7 @@ res/cardsfolder/e/emberstrike_duo.txt svneol=native#text/plain
res/cardsfolder/e/emberwilde_augur.txt svneol=native#text/plain
res/cardsfolder/e/emberwilde_caliph.txt svneol=native#text/plain
res/cardsfolder/e/emblem_of_the_warmind.txt svneol=native#text/plain
res/cardsfolder/e/embrace_my_diabolical_vision.txt -text
res/cardsfolder/e/emerald_charm.txt svneol=native#text/plain
res/cardsfolder/e/emerald_dragonfly.txt svneol=native#text/plain
res/cardsfolder/e/emerald_medallion.txt svneol=native#text/plain
@@ -3160,6 +3166,9 @@ res/cardsfolder/e/everglove_courier.txt svneol=native#text/plain
res/cardsfolder/e/everlasting_torment.txt -text
res/cardsfolder/e/evermind.txt -text
res/cardsfolder/e/evernight_shade.txt -text
res/cardsfolder/e/every_hope_shall_vanish.txt -text
res/cardsfolder/e/every_last_vestige_shall_rot.txt -text
res/cardsfolder/e/evil_comes_to_fruition.txt -text
res/cardsfolder/e/evil_eye_of_orms_by_gore.txt svneol=native#text/plain
res/cardsfolder/e/evil_eye_of_urborg.txt svneol=native#text/plain
res/cardsfolder/e/evil_presence.txt svneol=native#text/plain
@@ -4809,6 +4818,8 @@ res/cardsfolder/h/hypnox.txt -text
res/cardsfolder/h/hypochondria.txt svneol=native#text/plain
res/cardsfolder/h/hysterical_blindness.txt -text
res/cardsfolder/h/hystrodon.txt svneol=native#text/plain
res/cardsfolder/i/i_call_on_the_ancient_magics.txt -text
res/cardsfolder/i/i_know_all_i_see_all.txt -text
res/cardsfolder/i/ib_halfheart_goblin_tactician.txt -text svneol=unset#text/plain
res/cardsfolder/i/icatian_crier.txt svneol=native#text/plain
res/cardsfolder/i/icatian_javelineers.txt svneol=native#text/plain
@@ -4842,6 +4853,7 @@ res/cardsfolder/i/igneous_golem.txt svneol=native#text/plain
res/cardsfolder/i/igneous_pouncer.txt svneol=native#text/plain
res/cardsfolder/i/ignite_disorder.txt svneol=native#text/plain
res/cardsfolder/i/ignite_memories.txt svneol=native#text/plain
res/cardsfolder/i/ignite_the_cloneforge.txt -text
res/cardsfolder/i/ignoble_soldier.txt -text
res/cardsfolder/i/ignorant_bliss.txt -text
res/cardsfolder/i/ihsans_shade.txt svneol=native#text/plain
@@ -4879,6 +4891,7 @@ res/cardsfolder/i/imperious_perfect.txt svneol=native#text/plain
res/cardsfolder/i/implements_of_sacrifice.txt svneol=native#text/plain
res/cardsfolder/i/implode.txt svneol=native#text/plain
res/cardsfolder/i/imposing_visage.txt -text
res/cardsfolder/i/imprison_this_insolent_wretch.txt -text
res/cardsfolder/i/impromptu_raid.txt -text
res/cardsfolder/i/improvised_armor.txt svneol=native#text/plain
res/cardsfolder/i/imps_taunt.txt -text
@@ -5802,6 +5815,7 @@ res/cardsfolder/l/long_forgotten_gohei.txt svneol=native#text/plain
res/cardsfolder/l/long_term_plans.txt svneol=native#text/plain
res/cardsfolder/l/longbow_archer.txt svneol=native#text/plain
res/cardsfolder/l/longhorn_firebeast.txt -text
res/cardsfolder/l/look_skyward_and_despair.txt -text
res/cardsfolder/l/looming_hoverguard.txt svneol=native#text/plain
res/cardsfolder/l/looming_shade.txt svneol=native#text/plain
res/cardsfolder/l/looter_il_kor.txt svneol=native#text/plain
@@ -6484,6 +6498,7 @@ res/cardsfolder/m/morphling.txt svneol=native#text/plain
res/cardsfolder/m/morsel_theft.txt svneol=native#text/plain
res/cardsfolder/m/morselhoarder.txt svneol=native#text/plain
res/cardsfolder/m/mortal_combat.txt svneol=native#text/plain
res/cardsfolder/m/mortal_flesh_is_weak.txt -text
res/cardsfolder/m/mortal_wound.txt svneol=native#text/plain
res/cardsfolder/m/mortarpod.txt svneol=native#text/plain
res/cardsfolder/m/mortician_beetle.txt svneol=native#text/plain
@@ -6564,6 +6579,8 @@ res/cardsfolder/m/muzzle.txt svneol=native#text/plain
res/cardsfolder/m/mwonvuli_acid_moss.txt svneol=native#text/plain
res/cardsfolder/m/mwonvuli_beast_tracker.txt -text
res/cardsfolder/m/mwonvuli_ooze.txt svneol=native#text/plain
res/cardsfolder/m/my_genius_knows_no_bounds.txt -text
res/cardsfolder/m/my_wish_is_your_command.txt -text
res/cardsfolder/m/mycoid_shepherd.txt svneol=native#text/plain
res/cardsfolder/m/mycologist.txt svneol=native#text/plain
res/cardsfolder/m/mycoloth.txt svneol=native#text/plain
@@ -6857,6 +6874,7 @@ res/cardsfolder/n/norwood_riders.txt svneol=native#text/plain
res/cardsfolder/n/norwood_warrior.txt svneol=native#text/plain
res/cardsfolder/n/nostalgic_dreams.txt -text
res/cardsfolder/n/nosy_goblin.txt svneol=native#text/plain
res/cardsfolder/n/nothing_can_stop_me_now.txt -text
res/cardsfolder/n/notorious_assassin.txt svneol=native#text/plain
res/cardsfolder/n/notorious_throng.txt -text svneol=unset#text/plain
res/cardsfolder/n/nourish.txt svneol=native#text/plain
@@ -7231,6 +7249,7 @@ res/cardsfolder/p/peppersmoke.txt svneol=native#text/plain
res/cardsfolder/p/peregrine_drake.txt svneol=native#text/plain
res/cardsfolder/p/peregrine_griffin.txt svneol=native#text/plain
res/cardsfolder/p/peregrine_mask.txt svneol=native#text/plain
res/cardsfolder/p/perhaps_youve_met_my_cohort.txt -text
res/cardsfolder/p/perilous_forays.txt svneol=native#text/plain
res/cardsfolder/p/perilous_myr.txt svneol=native#text/plain
res/cardsfolder/p/perilous_research.txt svneol=native#text/plain
@@ -7428,6 +7447,7 @@ res/cardsfolder/p/platinum_angel.txt svneol=native#text/plain
res/cardsfolder/p/platinum_emperion.txt svneol=native#text/plain
res/cardsfolder/p/plaxcaster_frogling.txt -text
res/cardsfolder/p/plaxmanta.txt -text
res/cardsfolder/p/plots-that-span-centuries.txt -text
res/cardsfolder/p/plover_knights.txt svneol=native#text/plain
res/cardsfolder/p/plow_through_reito.txt -text
res/cardsfolder/p/plow_under.txt svneol=native#text/plain
@@ -7891,6 +7911,7 @@ res/cardsfolder/r/reality_ripple.txt -text
res/cardsfolder/r/reality_spasm.txt svneol=native#text/plain
res/cardsfolder/r/reality_strobe.txt svneol=native#text/plain
res/cardsfolder/r/realm_razer.txt -text svneol=unset#text/plain
res/cardsfolder/r/realms_befitting_my_majesty.txt -text
res/cardsfolder/r/realms_uncharted.txt -text
res/cardsfolder/r/reanimate.txt svneol=native#text/plain
res/cardsfolder/r/reap.txt -text
@@ -8253,6 +8274,7 @@ res/cardsfolder/r/rootgrapple.txt svneol=native#text/plain
res/cardsfolder/r/rooting_kavu.txt -text
res/cardsfolder/r/rootrunner.txt svneol=native#text/plain
res/cardsfolder/r/roots.txt svneol=native#text/plain
res/cardsfolder/r/roots_of_all_evil.txt -text
res/cardsfolder/r/rootwalla.txt svneol=native#text/plain
res/cardsfolder/r/rootwater_alligator.txt svneol=native#text/plain
res/cardsfolder/r/rootwater_commando.txt svneol=native#text/plain
@@ -10211,10 +10233,13 @@ res/cardsfolder/t/the_abyss.txt svneol=native#text/plain
res/cardsfolder/t/the_brute.txt svneol=native#text/plain
res/cardsfolder/t/the_fallen.txt -text
res/cardsfolder/t/the_hive.txt svneol=native#text/plain
res/cardsfolder/t/the_iron_guardian_stirs.txt -text
res/cardsfolder/t/the_lady_of_the_mountain.txt svneol=native#text/plain
res/cardsfolder/t/the_pieces_are_coming_together.txt -text
res/cardsfolder/t/the_rack.txt svneol=native#text/plain
res/cardsfolder/t/the_tabernacle_at_pendrell_vale.txt svneol=native#text/plain
res/cardsfolder/t/the_unspeakable.txt svneol=native#text/plain
res/cardsfolder/t/the_very_soil_shall_shake.txt -text
res/cardsfolder/t/the_wretched.txt -text svneol=unset#text/plain
res/cardsfolder/t/theft_of_dreams.txt svneol=native#text/plain
res/cardsfolder/t/thelonite_druid.txt -text
@@ -10433,6 +10458,7 @@ res/cardsfolder/t/tomorrow_azamis_familiar.txt -text
res/cardsfolder/t/tonic_peddler.txt svneol=native#text/plain
res/cardsfolder/t/tooth_and_claw.txt -text
res/cardsfolder/t/tooth_and_nail.txt svneol=native#text/plain
res/cardsfolder/t/tooth_claw_and_tail.txt -text
res/cardsfolder/t/tooth_of_chiss_goria.txt svneol=native#text/plain
res/cardsfolder/t/tooth_of_ramos.txt svneol=native#text/plain
res/cardsfolder/t/topan_ascetic.txt svneol=native#text/plain
@@ -11361,6 +11387,7 @@ res/cardsfolder/w/wheel_of_torture.txt svneol=native#text/plain
res/cardsfolder/w/where_ancients_tread.txt svneol=native#text/plain
res/cardsfolder/w/whetstone.txt svneol=native#text/plain
res/cardsfolder/w/whetwheel.txt svneol=native#text/plain
res/cardsfolder/w/which_of_you_burns_brightest.txt -text
res/cardsfolder/w/whimwader.txt svneol=native#text/plain
res/cardsfolder/w/whip_sergeant.txt svneol=native#text/plain
res/cardsfolder/w/whip_silk.txt svneol=native#text/plain
@@ -11661,6 +11688,9 @@ res/cardsfolder/y/yosei_the_morning_star.txt svneol=native#text/plain
res/cardsfolder/y/yotian_soldier.txt svneol=native#text/plain
res/cardsfolder/y/young_wei_recruits.txt svneol=native#text/plain
res/cardsfolder/y/young_wolf.txt -text
res/cardsfolder/y/your_fate_is_thrice_sealed.txt -text
res/cardsfolder/y/your_puny_minds_cannot_fathom.txt -text
res/cardsfolder/y/your_will_is_not_your_own.txt -text
res/cardsfolder/y/youthful_knight.txt svneol=native#text/plain
res/cardsfolder/y/yuan_shao_the_indecisive.txt svneol=native#text/plain
res/cardsfolder/y/yuan_shaos_infantry.txt svneol=native#text/plain
@@ -12791,6 +12821,7 @@ src/main/java/forge/card/abilityfactory/ai/TwoPilesAi.java -text
src/main/java/forge/card/abilityfactory/ai/UnattachAllAi.java -text
src/main/java/forge/card/abilityfactory/ai/UntapAi.java -text
src/main/java/forge/card/abilityfactory/ai/UntapAllAi.java -text
src/main/java/forge/card/abilityfactory/effects/AbandonEffect.java -text
src/main/java/forge/card/abilityfactory/effects/AddTurnEffect.java -text
src/main/java/forge/card/abilityfactory/effects/AnimateAllEffect.java -text
src/main/java/forge/card/abilityfactory/effects/AnimateEffect.java -text
@@ -12875,6 +12906,7 @@ src/main/java/forge/card/abilityfactory/effects/RevealHandEffect.java -text
src/main/java/forge/card/abilityfactory/effects/SacrificeAllEffect.java -text
src/main/java/forge/card/abilityfactory/effects/SacrificeEffect.java -text
src/main/java/forge/card/abilityfactory/effects/ScryEffect.java -text
src/main/java/forge/card/abilityfactory/effects/SetInMotionEffect.java -text
src/main/java/forge/card/abilityfactory/effects/SetStateAllEffect.java -text
src/main/java/forge/card/abilityfactory/effects/SetStateEffect.java -text
src/main/java/forge/card/abilityfactory/effects/ShuffleEffect.java -text
@@ -12933,6 +12965,7 @@ src/main/java/forge/card/replacement/ReplaceDraw.java -text
src/main/java/forge/card/replacement/ReplaceGainLife.java -text
src/main/java/forge/card/replacement/ReplaceGameLoss.java -text
src/main/java/forge/card/replacement/ReplaceMoved.java -text
src/main/java/forge/card/replacement/ReplaceSetInMotion.java -text
src/main/java/forge/card/replacement/ReplacementEffect.java -text
src/main/java/forge/card/replacement/ReplacementHandler.java -text
src/main/java/forge/card/replacement/ReplacementLayer.java -text
@@ -12991,6 +13024,7 @@ src/main/java/forge/card/trigger/TriggerLifeLost.java svneol=native#text/plain
src/main/java/forge/card/trigger/TriggerLosesGame.java -text
src/main/java/forge/card/trigger/TriggerPhase.java svneol=native#text/plain
src/main/java/forge/card/trigger/TriggerSacrificed.java svneol=native#text/plain
src/main/java/forge/card/trigger/TriggerSetInMotion.java -text
src/main/java/forge/card/trigger/TriggerShuffled.java svneol=native#text/plain
src/main/java/forge/card/trigger/TriggerSpellAbilityCast.java svneol=native#text/plain
src/main/java/forge/card/trigger/TriggerTaps.java svneol=native#text/plain
@@ -13187,6 +13221,7 @@ src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java -text
src/main/java/forge/gui/deckeditor/controllers/CEditorPreferences.java -text
src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java svneol=native#text/plain
src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java -text
src/main/java/forge/gui/deckeditor/controllers/CEditorScheme.java -text
src/main/java/forge/gui/deckeditor/controllers/CFilters.java -text
src/main/java/forge/gui/deckeditor/controllers/CProbabilities.java -text
src/main/java/forge/gui/deckeditor/controllers/CStatistics.java -text

View File

@@ -80,7 +80,7 @@ for currentSet in setCodes :
if currentSet == 'VG4' or currentSet == 'VGO' or currentSet == 'VG ' : continue
if currentSet == 'FVD' or currentSet == 'FVE' or currentSet == 'FVR' : continue
if currentSet == 'SDC' or currentSet == 'AST' or currentSet == 'DKM' : continue
if currentSet == 'BTD' or currentSet == 'ARC' or currentSet == 'COM' : continue
if currentSet == 'BTD' or currentSet == 'COM' : continue
#if currentSet == 'CHR' or currentSet == 'MED' or currentSet == 'H09' : continue
if currentSet == 'ME2' or currentSet == 'ME3' or currentSet == 'ME4' : continue
if currentSet == 'ATH' or currentSet == 'HOP' or currentSet == 'BRB' : continue

View File

@@ -92,3 +92,4 @@ Index:82|Code2:M13|Code3:M13|Name:Magic 2013
Index:83|Code2:RTR|Code3:RTR|Name:Return to Ravnica
Index:86|Code2:VAN|Code3:VAN|Name:Vanguard
Index:87|Code2:ARC|Code3:ARC|Name:Archenemy

View File

@@ -0,0 +1,13 @@
Name:A Display of My Dark Power
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, until your next turn, whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced.
SVar:DarkEffect:AB$ Effect | Cost$ 0 | Name$ Dark Power Scheme | Duration$ UntilYourNextTurn | Triggers$ DarkPower | SVars$ DarkMana
SVar:DarkPower:Mode$ TapsForMana | ValidCard$ Land | Execute$ DarkMana | TriggerZones$ Command | Static$ True | TriggerDescription$ Whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced.
SVar:DarkMana:AB$ ManaReflected | Cost$ 0 | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredPlayer
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/a_display_of_my_dark_power.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/a-display-of-my-dark-power.jpg
Oracle:When you set this scheme in motion, until your next turn, whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced.
End

View File

@@ -0,0 +1,13 @@
Name:All Shall Smolder in My Wake
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ Ignite | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, destroy up to one target artifact, up to one target enchantment, and up to one target nonbasic land.
SVar:Ignite:AB$ Destroy | Cost$ 0 | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to destroy | SubAbility$ Burn
SVar:Burn:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment to destroy | SubAbility$ Smolder
SVar:Smolder:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land to destroy
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/all_shall_smolder_in_my_wake.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/all-shall-smolder-in-my-wake.jpg
Oracle:When you set this scheme in motion, destroy up to one target artifact, up to one target enchantment, and up to one target nonbasic land.
End

View File

@@ -0,0 +1,16 @@
Name:Approach My Molten Realm
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ MoltenEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, until your next turn, if a source would deal damage, it deals double that damage instead.
SVar:MoltenEffect:AB$ Effect | Cost$ 0 | Name$ Molten Realm Effect | ReplacementEffects$ MoltenRealm,MoltenRealmCombat | SVars$ DmgTimes2,DmgTimes2Combat,MoltenX | Duration$ UntilYourNextTurn
SVar:MoltenRealm:Event$ DamageDone | ActiveZones$ Command | ValidSource$ Card | ReplaceWith$ DmgTimes2 | IsCombat$ False | Description$ Until your next turn, if a source would deal damage, it deals double that damage instead.
SVar:MoltenRealmCombat:Event$ DamageDone | ActiveZones$ Command | ValidSource$ Card | ReplaceWith$ DmgTimes2Combat | IsCombat$ True | Secondary$ True | Description$ Until your next turn, if a source would deal damage, it deals double that damage instead.
SVar:DmgTimes2:AB$ DealDamage | Cost$ 0 | Defined$ ReplacedTarget | DamageSource$ ReplacedSource | NumDmg$ MoltenX | References$ MoltenX
SVar:DmgTimes2Combat:AB$ DealDamage | Cost$ 0 | CombatDamage$ True | Defined$ ReplacedTarget | DamageSource$ ReplacedSource | NumDmg$ MoltenX | References$ MoltenX
SVar:MoltenX:ReplaceCount$DamageAmount/Twice
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/approach_my_molten_realm.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/approach-my-molten-realm.jpg
Oracle:When you set this scheme in motion, until your next turn, if a source would deal damage, it deals double that damage instead.
End

View File

@@ -0,0 +1,11 @@
Name:Behold the Power of Destruction
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, destroy all nonland permanents target opponent controls.
SVar:DarkEffect:AB$ DestroyAll | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ValidCards$ Permanent.nonLand
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/behold_the_power_of_destruction.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/behold-the-power-of-destruction.jpg
Oracle:When you set this scheme in motion, destroy all nonland permanents target opponent controls.
End

View File

@@ -0,0 +1,14 @@
Name:Dance, Pathetic Marionette
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ LibraryDance | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each opponent reveals cards from the top of his or her library until he or she reveals a creature card. Choose one of the revealed creature cards and put it onto the battlefield under your control. Put all other cards revealed this way into their owners' graveyards.
SVar:LibraryDance:AB$ DigUntil | Cost$ 0 | Defined$ Player.Opponent | Valid$ Creature | ValidDescription$ creature | RememberFound$ True | NoMoveFound$ True | FoundDestination$ Library | FoundLibraryPosition$ 0 | RevealedDestination$ Graveyard | SubAbility$ MakeItDance
SVar:MakeItDance:DB$ ChangeZone | Defined$ Remembered | ChangeNum$ 1 | Origin$ Library | Destination$ Battlefield | Mandatory$ True | SelectPrompt$ Choose one of the revealed creature cards: | GainControl$ True | ForgetChanged$ True | SubAbility$ TakeOutTheTrash
SVar:TakeOutTheTrash:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/dance_pathetic_marionette.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/dance-pathetic-marionette.jpg
Oracle:When you set this scheme in motion, each opponent reveals cards from the top of his or her library until he or she reveals a creature card. Choose one of the revealed creature cards and put it onto the battlefield under your control. Put all other cards revealed this way into their owners' graveyards.
End

View File

@@ -0,0 +1,14 @@
Name:Embrace My Diabolical Vision
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ GraveEmbrace | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each player shuffles his or her hand and graveyard into his or her library. You draw seven cards, then each other player draws four cards.
SVar:GraveEmbrace:AB$ ChangeZoneAll | Cost$ 0 | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SubAbility$ EmbraceShuffle
SVar:EmbraceShuffle:DB$ ChangeZoneAll | ChangeType$ Card | Origin$ Hand | Destination$ Library | Shuffle$ True | SubAbility$ MyVision
SVar:MyVision:DB$ Draw | Defined$ You | NumCards$ 7 | SubAbility$ PitifulDraw
SVar:PitifulDraw:DB$ Draw | Defined$ Player.Other | NumCards$ 4
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/embrace_my_diabolical_vision.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/embrace-my-diabolical-vision.jpg
Oracle:When you set this scheme in motion, each player shuffles his or her hand and graveyard into his or her library. You draw seven cards, then each other player draws four cards.
End

View File

@@ -0,0 +1,11 @@
Name:Every Hope Shall Vanish
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DiscardHope | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each opponent reveals his or her hand. Choose a nonland card from each of those hands. Those players discard those cards.
SVar:DiscardHope:AB$ Discard | Cost$ 0 | Defined$ Player.Opponent | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand | NumCards$ 1
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/every_hope_shall_vanish.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/every-hope-shall-vanish.jpg
Oracle:When you set this scheme in motion, each opponent reveals his or her hand. Choose a nonland card from each of those hands. Those players discard those cards.
End

View File

@@ -0,0 +1,12 @@
Name:Every Last Vestige Shall Rot
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ MoveToBottom | TriggerZones$ Command | OptionalDecider$ You | TriggerDescription$ When you set this scheme in motion, you may pay X. If you do, put each nonland permanent target player controls with converted mana cost X or less on the bottom of its owner's library.
SVar:MoveToBottom:AB$ ChangeZoneAll | Cost$ X | ChangeType$ Permanent.nonLand+cmcLEX | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Battlefield | Destination$ Library | LibraryPosition$ -1
SVar:X:Count$xPaid
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/every_last_vestige_shall_rot.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/every-last-vestige-shall-rot.jpg
Oracle:When you set this scheme in motion, you may pay {X}. If you do, put each nonland permanent target player controls with converted mana cost X or less on the bottom of its owner's library.
End

View File

@@ -0,0 +1,13 @@
Name:Evil Comes to Fruition
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ NewEvil | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, put seven 0/1 green Plant creature tokens onto the battlefield. If you control ten or more lands, put seven 3/3 green Elemental creature tokens onto the battlefield instead.
SVar:NewEvil:AB$ Token | Cost$ 0 | TokenAmount$ 7 | TokenName$ Plant | TokenTypes$ Creature,Plant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 0 | TokenToughness$ 1 | ConditionPresent$ Land.YouCtrl | ConditionCompare$ LT10 | SubAbility$ MatureEvil
SVar:MatureEvil:DB$ Token | Cost$ 0 | TokenAmount$ 7 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | ConditionPresent$ Land.YouCtrl | ConditionCompare$ GE10
SVar:X:Count$NumTypeYouCtrl.Land
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/evil_comes_to_fruition.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/evil-comes-to-fruition.jpg
Oracle:When you set this scheme in motion, put seven 0/1 green Plant creature tokens onto the battlefield. If you control ten or more lands, put seven 3/3 green Elemental creature tokens onto the battlefield instead.
End

View File

@@ -0,0 +1,12 @@
Name:I Call on the Ancient Magics
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ OppTutor | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each other player searches his or her library for a card, reveals it, and puts it into his or her hand. Then you search your library for two cards and put them into your hand. Each player shuffles his or her library.
SVar:OppTutor:AB$ ChangeZone | Cost$ 0 | DefinedPlayer$ Player.Other | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Reveal$ True | Mandatory$ True | SubAbility$ MyMagic
SVar:MyMagic:DB$ ChangeZone | DefinedPlayer$ You | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 2 | Mandatory$ True
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/i_call_on_the_ancient_magics.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/i-call-on-the-ancient-magics.jpg
Oracle:When you set this scheme in motion, each other player searches his or her library for a card, reveals it, and puts it into his or her hand. Then you search your library for two cards and put them into your hand. Each player shuffles his or her library.
End

View File

@@ -0,0 +1,13 @@
Name:I Know All, I See All
ManaCost:no cost
Types:Ongoing Scheme
Text:no text
S:Mode$ Continuous | EffectZone$ Command | Affected$ Permanent.YouCtrl | AddHiddenKeyword$ CARDNAME untaps during each other player's untap step. | Description$ Untap all permanents you control during each other player's untap step.
T:Mode$ Phase | Phase$ End of Turn | Execute$ Abandon | TriggerZones$ Command | CheckSVar$ X | SVarCompare$ GE3 | TriggerDescription$ At the beginning of each end step, if three or more cards were put into your graveyard this turn from anywhere, abandon this scheme.
SVar:Abandon:AB$ Abandon | Cost$ 0
SVar:X:Count$ThisTurnEntered_Graveyard_Card.YouOwn
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/i_know_all_i_see_all.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/i-know-all-i-see-all.jpg
Oracle:(An ongoing scheme remains face up until it's abandoned.)\nUntap all permanents you control during each opponent's untap step.\nAt the beginning of each end step, if three or more cards were put into your graveyard this turn from anywhere, abandon this scheme.
End

View File

@@ -0,0 +1,11 @@
Name:Ignite the Cloneforge!
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, put a token onto the battlefield that's a copy of target permanent an opponent controls.
SVar:DarkEffect:AB$ CopyPermanent | Cost$ 0 | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/ignite_the_cloneforge.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/ignite-the-cloneforge.jpg
Oracle:When you set this scheme in motion, put a token onto the battlefield that's a copy of target permanent an opponent controls.
End

View File

@@ -0,0 +1,15 @@
Name:Imprison This Insolent Wretch
ManaCost:no cost
Types:Ongoing Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ ChooseTheWretch | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, choose an opponent.
SVar:ChooseTheWretch:AB$ ChoosePlayer | Cost$ 0 | Defined$ You | Choices$ Opponent | AILogic$ Curse
S:Mode$ Continuous | EffectZone$ Command | Affected$ Permanent.ChosenCtrl | AffectedZone$ Battlefield | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Permanents the chosen player controls don't untap during his or her untap step.
T:Mode$ Attacks | ValidCard$ Card | Attacked$ Player.Chosen | Execute$ Abandon | TriggerZones$ Command | TriggerDescription$ When the chosen player is attacked or becomes the target of a spell or ability, abandon this scheme.
T:Mode$ SpellAbilityCast | TargetsValid$ Player.Chosen | TriggerZones$ Command | Execute$ Abandon | Secondary$ True | TriggerDescription$ When the chosen player is attacked or becomes the target of a spell or ability, abandon this scheme.
SVar:Abandon:AB$ Abandon | Cost$ 0
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/imprison_this_insolent_wretch.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/imprison-this-insolent-wretch.jpg
Oracle:When you set this scheme in motion, choose an opponent.\nPermanents the chosen player controls don't untap during his or her untap step.\nWhen the chosen player is attacked or becomes the target of a spell or ability, abandon this scheme.
End

View File

@@ -0,0 +1,11 @@
Name:Look Skyward and Despair
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, put a 5/5 red Dragon creature token with flying onto the battlefield.
SVar:DarkEffect:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Dragon | TokenTypes$ Creature,Dragon | TokenOwner$ You | TokenColors$ Red | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/look_skyward_and_despair.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/look-skyward-and-despair.jpg
Oracle:When you set this scheme in motion, put a 5/5 red Dragon creature token with flying onto the battlefield.
End

View File

@@ -0,0 +1,12 @@
Name:Mortal Flesh Is Weak
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ ShowTheWeakness | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each opponent's life total becomes the lowest life total among your opponents.
SVar:ShowTheWeakness:AB$ SetLife | Cost$ 0 | Defined$ Player.Opponent | LifeAmount$ X | References$ X
SVar:X:Count$LowestLifeTotal Opponent
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/mortal_flesh_is_weak.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/mortal-flesh-is-weak.jpg
Oracle:When you set this scheme in motion, each opponent's life total becomes the lowest life total among your opponents.
End

View File

@@ -0,0 +1,13 @@
Name:My Genius Knows No Bounds
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ GeniusLife | TriggerZones$ Command | OptionalDecider$ You | TriggerDescription$ When you set this scheme in motion, you may pay X. If you do, you gain X life and draw X cards.
SVar:GeniusLife:AB$ GainLife | Cost$ X | Defined$ You | LifeAmount$ X | SubAbility$ GeniusCards
SVar:GeniusCards:DB$ Draw | Defined$ You | NumCards$ X
SVar:X:Count$xPaid
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/my_genius_knows_no_bounds.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/my-genius-knows-no-bounds.jpg
Oracle:When you set this scheme in motion, you may pay {X}. If you do, you gain X life and draw X cards.
End

View File

@@ -0,0 +1,13 @@
Name:My Wish Is Your Command
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ MyWish | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each opponent reveals his or her hand. You may choose a noncreature, nonland card revealed this way and cast it without paying its mana cost.
SVar:MyWish:AB$ RevealHand | Cost$ 0 | Defined$ Player.Opponent | RememberRevealed$ True | SubAbility$ MyPleasure
SVar:MyPleasure:DB$ Play | Valid$ Card.nonCreature+nonLand+IsRemembered | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/my_wish_is_your_command.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/my-wish-is-your-command.jpg
Oracle:When you set this scheme in motion, each opponent reveals his or her hand. You may choose a noncreature, nonland card revealed this way and cast it without paying its mana cost.
End

View File

@@ -0,0 +1,13 @@
Name:Nothing Can Stop Me Now
ManaCost:no cost
Types:Ongoing Scheme
Text:(An ongoing scheme remains face up until it's abandoned.)
S:Mode$ PreventDamage | EffectZone$ Command | Target$ You | Source$ Card.OppCtrl | Amount$ 1 | Description$ If a source an opponent controls would deal damage to you, prevent 1 of that damage.
T:Mode$ Phase | Phase$ End of Turn | CheckSVar$ X | SVarCompare$ GE5 | TriggerZones$ Command | Execute$ Abandon | TriggerDescription$ At the beginning of each end step, if you've been dealt 5 or more damage this turn, abandon this scheme.
SVar:Abandon:AB$ Abandon | Cost$ 0
SVar:X:Count$YourDamageThisTurn
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/nothing_can_stop_me_now.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/nothing-can-stop-me-now.jpg
Oracle:(An ongoing scheme remains face up until it's abandoned.)\nIf a source an opponent controls would deal damage to you, prevent 1 of that damage.\nAt the beginning of each end step, if you've been dealt 5 or more damage this turn, abandon this scheme.
End

View File

@@ -0,0 +1,11 @@
Name:Perhaps You've Met My Cohort
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, search your library for a planeswalker card and put that card onto the battlefield, then shuffle your library.
SVar:DarkEffect:AB$ ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Planeswalker.YouOwn | ChangeNum$ 1
SVar:Rarity:Rare
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/perhaps_youve_met_my_cohort.jpg
SetInfo:ARC|Rare|http://magiccards.info/extras/scheme/archenemy/perhaps-youve-met-my-cohort.jpg
Oracle:When you set this scheme in motion, search your library for a planeswalker card, put it onto the battlefield, then shuffle your library.
End

View File

@@ -0,0 +1,14 @@
Name:Plots That Span Centuries
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ PlotEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, the next time you would set a scheme in motion, set three schemes in motion instead.
SVar:PlotEffect:AB$ Effect | Cost$ 0 | Name$ Plots Scheme | Duration$ Permanent | ReplacementEffects$ PlotPower | SVars$ PlotRep,ExilePlot
SVar:PlotPower:Event$ SetInMotion | ReplaceWith$ PlotRep | Description$ The next time you would set a scheme in motion, set three schemes in motion instead.
SVar:PlotRep:AB$ SetInMotion | Cost$ 0 | RepeatNum$ 3 | SubAbility$ ExilePlot
SVar:ExilePlot:DB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Command | Destination$ Exile
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/plots_that_span_centuries.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/plots-that-span-centuries.jpg
Oracle:When you set this scheme in motion, the next time you would set a scheme in motion, set three schemes in motion instead.
End

View File

@@ -0,0 +1,11 @@
Name:Realms Befitting My Majesty
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | ValidCard$ Card.Self | Execute$ GetRealms | TriggerZones$ Command | OptionalDecider$ You | TriggerDescription$ When you set this scheme in motion, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle your library.
SVar:GetRealms:AB$ ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 2
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/realms_befitting_my_majesty.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/realms-befitting-my-majesty.jpg
Oracle:When you set this scheme in motion, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle your library.
End

View File

@@ -2,7 +2,7 @@ Name:Repay in Kind
ManaCost:5 B B
Types:Sorcery
Text:no text
A:SP$ SetLife | Cost$ 5 B B | Defined$ Each | LifeAmount$ X | References$ X | SpellDescription$ Each player's life total becomes the lowest life total among all players.
A:SP$ SetLife | Cost$ 5 B B | Defined$ Player | LifeAmount$ X | References$ X | SpellDescription$ Each player's life total becomes the lowest life total among all players.
SVar:X:Count$LowestLifeTotal
SVar:Rarity:Rare
SVar:Picture:http://www.wizards.com/global/images/magic/general/repay_in_kind.jpg

View File

@@ -0,0 +1,11 @@
Name:Roots of All Evil
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ GetSaps | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, put five 1/1 green Saproling creature tokens onto the battlefield.
SVar:GetSaps:DB$ Token | Cost$ 0 | TokenAmount$ 5 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1
SVar:Rarity:Common
SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=212602&type=card
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/roots-of-all-evil.jpg
Oracle:When you set this scheme in motion, put five 1/1 green Saproling creature tokens onto the battlefield.
End

View File

@@ -0,0 +1,11 @@
Name:The Iron Guardian Stirs
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, put a 4/6 colorless Golem creature token onto the battlefield.
SVar:DarkEffect:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Golem | TokenTypes$ Artifact,Creature,Golem | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 4 | TokenToughness$ 6
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/the_iron_guardian_stirs.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/the-iron-guardian-stirs.jpg
Oracle:When you set this scheme in motion, put a 4/6 colorless Golem artifact creature token onto the battlefield.
End

View File

@@ -0,0 +1,12 @@
Name:The Pieces Are Coming Together
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ ConstructDestiny | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, draw two cards. Artifact spells you cast this turn cost 2 less to cast.
SVar:ConstructDestiny:AB$ Effect | Cost$ 0 | Name$ Pieces Coming Together | StaticAbilities$ CheapParts
SVar:CheapParts:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Artifact | Type$ Spell | Activator$ You | Amount$ 2 | Description$ Artifact spells you cast this turn cost 2 less to cast.
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/the_pieces_are_coming_together.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/the-pieces-are-coming-together.jpg
Oracle:When you set this scheme in motion, draw two cards. Artifact spells you cast this turn cost {2} less to cast.
End

View File

@@ -0,0 +1,12 @@
Name:The Very Soil Shall Shake
ManaCost:no cost
Types:Ongoing Scheme
Text:no text
S:Mode$ Continuous | Affected$ Creature.YouCtrl | EffectZone$ Command | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Trample | Description$ Creatures you control get +2/+2 and have trample.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | Execute$ Abandon | TriggerDescription$ When a creature you control dies, abandon this scheme.
SVar:Abandon:AB$ Abandon | Cost$ 0
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/the_very_soil_shall_shake.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/the-very-soil-shall-shake.jpg
Oracle:(An ongoing scheme remains face up until it's abandoned.)\nCreatures you control get +2/+2 and have trample.\nWhen a creature you control dies, abandon this scheme.
End

View File

@@ -0,0 +1,11 @@
Name:Tooth, Claw, and Tail
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, destroy up to three target nonland permanents.
SVar:DarkEffect:AB$ Destroy | Cost$ 0 | TargetMin$ 0 | TargetMax$ 3 | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/tooth_claw_and_tail.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/tooth-claw-and-tail.jpg
Oracle:When you set this scheme in motion, destroy up to three target nonland permanents.
End

View File

@@ -0,0 +1,12 @@
Name:Which of You Burns Brightest?
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$ Command | OptionalDecider$ You | TriggerDescription$ When you set this scheme in motion, you may pay X. If you do, this scheme deals X damage to target opponent and each creature he or she controls.
SVar:DarkEffect:AB$ DamageAll | Cost$ X | NumDmg$ X | ValidTgts$ Player | TgtPrompt$ Select a player | ValidCards$ Creature | ValidPlayers$ Targeted | ValidDescription$ target player and each creature he or she controls. | References$ X
SVar:X:Count$xPaid
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/which_of_you_burns_brightest.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/which-of-you-burns-brightest.jpg
Oracle:When you set this scheme in motion, you may pay {X}. If you do, this scheme deals X damage to target opponent and each creature he or she controls.
End

View File

@@ -0,0 +1,11 @@
Name:Your Fate Is Thrice Sealed
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ RevealFate | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, reveal the top three cards of your library. Put all land cards revealed this way onto the battlefield and the rest into your hand.
SVar:RevealFate:AB$ Dig | Cost$ 0 | DigNum$ 3 | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone$ Battlefield | DestinationZone2$ Hand |
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/your_fate_is_thrice_sealed.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/your-fate-is-thrice-sealed.jpg
Oracle:When you set this scheme in motion, reveal the top three cards of your library. Put all land cards revealed this way onto the battlefield and the rest into your hand.
End

View File

@@ -0,0 +1,13 @@
Name:Your Puny Minds Cannot Fathom
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ GreatMind | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, draw four cards. You have no maximum hand size until your next turn.
SVar:GreatMind:AB$ Draw | Cost$ 0 | Defined$ You | NumCards$ 4 | SubAbility$ Unfathomable
SVar:Unfathomable:DB$ Effect | Name$ Unfathomable Mind Effect | StaticAbilities$ STHandSize | Duration$ UntilYourNextTurn
SVar:STHandSize:Mode$ Continuous | EffectZone$ Command | Affected$ You | SetMaxHandSize$ Unlimited | Description$ You have no maximum hand size.
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/your_puny_minds_cannot_fathom.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/your-puny-minds-cannot-fathom.jpg
Oracle:When you set this scheme in motion, draw four cards. You have no maximum hand size until your next turn.
End

View File

@@ -0,0 +1,12 @@
Name:Your Will Is Not Your Own
ManaCost:no cost
Types:Scheme
Text:no text
T:Mode$ SetInMotion | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, gain control of target creature an opponent controls until end of turn. Untap that creature. It gets +3/+3 and gains haste and trample until end of turn.
SVar:DarkEffect:AB$ GainControl | Cost$ 0 | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | Untap$ True | LoseControl$ EOT | SubAbility$ DBPump
SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +3 | NumDef$ +3 | KW$ Haste & Trample
SVar:Rarity:Common
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/your_will_is_not_your_own.jpg
SetInfo:ARC|Common|http://magiccards.info/extras/scheme/archenemy/your-will-is-not-your-own.jpg
Oracle:When you set this scheme in motion, gain control of target creature an opponent controls until end of turn. Untap that creature. It gets +3/+3 and gains haste and trample until end of turn.
End

View File

@@ -5431,6 +5431,10 @@ public class Card extends GameEntity implements Comparable<Card> {
return this.typeContains("Equipment");
}
public final boolean isScheme() {
return this.typeContains("Scheme");
}
/**
* <p>
* isPlaneswalker.

View File

@@ -46,6 +46,7 @@ import forge.card.spellability.AbilityStatic;
import forge.card.spellability.Spell;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityRequirements;
import forge.card.spellability.SpellAbilityStackInstance;
import forge.card.spellability.Target;
import forge.card.spellability.TargetSelection;
import forge.card.staticability.StaticAbility;
@@ -1064,6 +1065,7 @@ public class GameAction {
}
} // if isEquipped()
if (c.isEquipping()) {
final Card equippedCreature = c.getEquipping().get(0);
if (!equippedCreature.isCreature() || !equippedCreature.isInPlay()) {

View File

@@ -213,6 +213,15 @@ public final class CardType implements Comparable<CardType> {
return this.coreType.contains(CardCoreType.Vanguard);
}
/**
* Checks if is scheme.
*
* @return true if scheme
*/
public boolean isScheme() {
return this.coreType.contains(CardCoreType.Scheme);
}
/**
* Checks if is enchantment.
*

View File

@@ -10,6 +10,7 @@ import forge.card.abilityfactory.effects.*;
*/
public enum ApiType {
Abandon (AbandonEffect.class, AlwaysPlayAi.class),
AddTurn (AddTurnEffect.class, AddTurnAi.class),
Animate (AnimateEffect.class, AnimateAi.class),
AnimateAll (AnimateAllEffect.class, AnimateAllAi.class),
@@ -91,6 +92,7 @@ public enum ApiType {
Sacrifice (SacrificeEffect.class, SacrificeAi.class),
SacrificeAll (SacrificeAllEffect.class, SacrificeAllAi.class),
Scry (ScryEffect.class, ScryAi.class),
SetInMotion (SetInMotionEffect.class, AlwaysPlayAi.class),
SetLife (LifeSetEffect.class, LifeSetAi.class),
SetState (SetStateEffect.class, SetStateAi.class),
SetStateAll (SetStateAllEffect.class, SetStateAllAi.class),

View File

@@ -1310,8 +1310,9 @@ public class ChangeZoneAi extends SpellAiLogic {
player.shuffle();
}
if (!ZoneType.Battlefield.equals(destination) && !"Card".equals(type) && !defined) {
final String picked = sa.getSourceCard().getName() + " - Computer picked:";
if ((!ZoneType.Battlefield.equals(destination) && !"Card".equals(type) && !defined)
|| (sa.hasParam("Reveal") && !fetched.isEmpty())) {
final String picked = player + " picked:";
if (fetched.size() > 0) {
GuiChoose.one(picked, fetched);
} else {

View File

@@ -0,0 +1,33 @@
package forge.card.abilityfactory.effects;
import forge.Card;
import forge.Singletons;
import forge.card.abilityfactory.AbilityFactory;
import forge.card.abilityfactory.SpellEffect;
import forge.card.spellability.SpellAbility;
import forge.card.trigger.TriggerType;
import forge.game.GameState;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
public class AbandonEffect extends SpellEffect {
private GameState game = Singletons.getModel().getGame();
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility)
*/
@Override
public void resolve(SpellAbility sa) {
Card source = sa.getSourceCard();
Player controller = source.getController();
game.getTriggerHandler().suppressMode(TriggerType.ChangesZone);
controller.getZone(ZoneType.Command).remove(source);
game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
controller.getSchemeDeck().add(source);
}
}

View File

@@ -65,7 +65,8 @@ public class ChangeZoneAllEffect extends SpellEffect {
final int libraryPos = sa.hasParam("LibraryPosition") ? Integer.parseInt(sa.getParam("LibraryPosition")) : 0;
if (sa.getActivatingPlayer().isHuman() && destination.equals(ZoneType.Library) && !sa.hasParam("Shuffle")) {
if (sa.getActivatingPlayer().isHuman() && destination.equals(ZoneType.Library) && !sa.hasParam("Shuffle")
&& cards.size() >= 2) {
cards = GuiChoose.getOrderChoices("Choose order of cards to put into the library", "Put first", 0, cards, null, null);
}

View File

@@ -133,6 +133,8 @@ public class DigUntilEffect extends SpellEffect {
if (sa.hasParam("GainControl") && foundDest.equals(ZoneType.Battlefield)) {
c.addController(sa.getSourceCard());
Singletons.getModel().getGame().getAction().moveTo(c.getController().getZone(foundDest), c);
} else if (sa.hasParam("NoMoveFound") && foundDest.equals(ZoneType.Library)) {
//Don't do anything
} else {
Singletons.getModel().getGame().getAction().moveTo(foundDest, c, foundLibPos);
}

View File

@@ -0,0 +1,38 @@
package forge.card.abilityfactory.effects;
import forge.Card;
import forge.Singletons;
import forge.card.abilityfactory.AbilityFactory;
import forge.card.abilityfactory.SpellEffect;
import forge.card.spellability.SpellAbility;
import forge.card.trigger.TriggerType;
import forge.game.GameState;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
public class SetInMotionEffect extends SpellEffect {
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility)
*/
@Override
public void resolve(SpellAbility sa) {
System.out.println("AF_SIM");
Card source = sa.getSourceCard();
Player controller = source.getController();
int repeats = 1;
if(sa.hasParam("RepeatNum"))
{
repeats = AbilityFactory.calculateAmount(sa.getSourceCard(), sa.getParam("RepeatNum"), sa);
}
for(int i=0;i<repeats;i++)
{
controller.setSchemeInMotion();
}
}
}

View File

@@ -2271,9 +2271,15 @@ public class CardFactoryUtil {
// Count$LowestLifeTotal
if (sq[0].contains("LowestLifeTotal")) {
final String[] playerType = sq[0].split(" ");
if (playerType.length > 1 && playerType[1].equals("Opponent")) {
return CardFactoryUtil.doXMath(
Aggregates.min(cardController.getOpponents(), Player.Accessors.FN_GET_LIFE), m, c);
} else {
return CardFactoryUtil.doXMath(
Aggregates.min(Singletons.getModel().getGame().getPlayers(), Player.Accessors.FN_GET_LIFE), m, c);
}
}
// Count$TopOfLibraryCMC
if (sq[0].contains("TopOfLibraryCMC")) {

View File

@@ -0,0 +1,69 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.card.replacement;
import java.util.HashMap;
import forge.Card;
/**
* TODO: Write javadoc for this type.
*
*/
public class ReplaceSetInMotion extends ReplacementEffect {
/**
* Instantiates a new replace draw.
*
* @param params the params
* @param host the host
*/
public ReplaceSetInMotion(final HashMap<String, String> params, final Card host) {
super(params, host);
}
/* (non-Javadoc)
* @see forge.card.replacement.ReplacementEffect#canReplace(java.util.HashMap)
*/
@Override
public boolean canReplace(HashMap<String, Object> runParams) {
if (!runParams.get("Event").equals("SetInMotion")) {
return false;
}
if (this.getMapParams().containsKey("ValidPlayer")) {
if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard())) {
return false;
}
}
return true;
}
/* (non-Javadoc)
* @see forge.card.replacement.ReplacementEffect#getCopy()
*/
@Override
public ReplacementEffect getCopy() {
ReplacementEffect res = new ReplaceSetInMotion(this.getMapParams(), this.getHostCard());
res.setOverridingAbility(this.getOverridingAbility());
res.setActiveZone(validHostZones);
res.setLayer(getLayer());
return res;
}
}

View File

@@ -282,6 +282,8 @@ public class ReplacementHandler {
ret = new ReplaceGameLoss(mapParams, host);
} else if (eventToReplace.equals("Moved")) {
ret = new ReplaceMoved(mapParams, host);
} else if (eventToReplace.equals("SetInMotion")) {
ret = new ReplaceSetInMotion(mapParams, host);
}
String activeZones = mapParams.get("ActiveZones");

View File

@@ -0,0 +1,79 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.card.trigger;
import forge.Card;
import forge.card.spellability.SpellAbility;
/**
* <p>
* Trigger_LifeGained class.
* </p>
*
* @author Forge
* @version $Id: TriggerLifeGained.java 17802 2012-10-31 08:05:14Z Max mtg $
*/
public class TriggerSetInMotion extends Trigger {
/**
* <p>
* Constructor for Trigger_LifeGained.
* </p>
*
* @param params
* a {@link java.util.HashMap} object.
* @param host
* a {@link forge.Card} object.
* @param intrinsic
* the intrinsic
*/
public TriggerSetInMotion(final java.util.Map<String, String> params, final Card host, final boolean intrinsic) {
super(params, host, intrinsic);
}
/** {@inheritDoc} */
@Override
public final boolean performTest(final java.util.Map<String, Object> runParams2) {
if (this.getMapParams().containsKey("ValidCard")) {
if (!matchesValid(runParams2.get("Scheme"), this.getMapParams().get("ValidCard").split(","),
this.getHostCard())) {
return false;
}
}
return true;
}
/** {@inheritDoc} */
@Override
public final Trigger getCopy() {
final Trigger copy = new TriggerSetInMotion(this.getMapParams(), this.getHostCard(), this.isIntrinsic());
if (this.getOverridingAbility() != null) {
copy.setOverridingAbility(this.getOverridingAbility());
}
copyFieldsTo(copy);
return copy;
}
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Scheme", this.getRunParams().get("Scheme"));
}
}

View File

@@ -47,7 +47,8 @@ public enum TriggerType {
Discarded(TriggerDiscarded.class),
Shuffled(TriggerShuffled.class),
LandPlayed(TriggerLandPlayed.class),
LosesGame(TriggerLosesGame.class);
LosesGame(TriggerLosesGame.class),
SetInMotion(TriggerSetInMotion.class);
private final Class<? extends Trigger> classTrigger;
private TriggerType(Class<? extends Trigger> clasz) {

View File

@@ -154,6 +154,7 @@ public class Deck extends DeckBase {
result.sideboard.addAll(this.sideboard);
result.avatar = this.avatar;
result.commander = this.commander;
result.schemes.addAll(this.schemes);
}
/*

View File

@@ -16,17 +16,22 @@ import javax.swing.JOptionPane;
import org.apache.commons.lang3.ArrayUtils;
import com.google.common.collect.Iterables;
import forge.Singletons;
import forge.deck.generate.Generate2ColorDeck;
import forge.deck.generate.Generate3ColorDeck;
import forge.deck.generate.Generate5ColorDeck;
import forge.deck.generate.GenerateThemeDeck;
import forge.game.player.PlayerType;
import forge.item.CardDb;
import forge.item.CardPrinted;
import forge.item.ItemPool;
import forge.item.ItemPoolView;
import forge.quest.QuestEvent;
import forge.quest.QuestEventManager;
import forge.util.IStorage;
import forge.util.MyRandom;
/**
* Utility collection for various types of decks.
@@ -302,4 +307,32 @@ public class DeckgenUtil {
}
return result;
}
public static Deck generateSchemeDeck() {
Deck res = new Deck();
Iterable<CardPrinted> allSchemes = Iterables.filter(CardDb.instance().getAllNonTraditionalCards(),CardPrinted.Predicates.type("Scheme"));
for(int i=0;i<20;i++) {
CardPrinted cp = Iterables.get(allSchemes, MyRandom.getRandom().nextInt(Iterables.size(allSchemes)));
int appearances = 0;
for(CardPrinted added : res.getSchemes().toFlatList()) {
if(added.getName().equals(cp.getName()))
{
appearances++;
}
}
if(appearances < 2)
{
res.getSchemes().add(cp);
}
else
{
i--;
}
}
return res;
}
}

View File

@@ -144,11 +144,18 @@ public class GameNew {
if (inCommand != null) {
for (final Card c : inCommand) {
c.setOwner(player);
com.add(c, false);
c.refreshUniqueNumber();
}
}
Iterable<Card> schemes = p.getValue().getSchemes();
if(schemes != null) {
player.setSchemeDeck(schemes);
}
prepareSingleLibrary(player, p.getValue().getDeck(), removedAnteCards, rAICards, canRandomFoil);
player.updateObservers();
bf.updateObservers();

View File

@@ -50,6 +50,29 @@ public class MatchStartHelper {
players.put(player, start);
}
public void addArchenemy(final LobbyPlayer player, final Deck deck, final Iterable<CardPrinted> schemes) {
PlayerStartConditions start = new PlayerStartConditions(deck);
start.setStartingLife(40);
start.setSchemes(new Supplier<Iterable<Card>>() {
@Override
public Iterable<Card> get() {
List<Card> res = new ArrayList<Card>();
for(CardPrinted cp : schemes)
{
res.add(cp.toForgeCard());
}
return res;
}
});
players.put(player, start);
}
public Map<LobbyPlayer, PlayerStartConditions> getPlayerMap() {
return players;

View File

@@ -14,6 +14,7 @@ public class PlayerStartConditions {
private int startingHand = 7;
private Supplier<Iterable<Card>> cardsOnBattlefield = null;
private Supplier<Iterable<Card>> cardsInCommand = null;
private Supplier<Iterable<Card>> schemes = null;
public PlayerStartConditions(Deck deck0) {
deck = deck0;
@@ -65,5 +66,19 @@ public class PlayerStartConditions {
this.cardsInCommand = cardsInCommand0;
}
/**
* @return the schemes
*/
public Iterable<Card> getSchemes() {
return schemes == null ? null : schemes.get();
}
/**
* @param schemes0 the schemes to set
*/
public void setSchemes(Supplier<Iterable<Card>> s) {
this.schemes = s;
}
}

View File

@@ -27,6 +27,7 @@ import forge.Card;
import forge.CardLists;
import forge.CardPredicates;
import forge.Singletons;
import forge.card.spellability.SpellAbilityStackInstance;
import forge.card.trigger.TriggerType;
import forge.game.GameState;
import forge.game.event.EndOfTurnEvent;
@@ -270,6 +271,11 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
}
break;
case MAIN1:
if(this.getPlayerTurn().isArchenemy())
this.getPlayerTurn().setSchemeInMotion();
break;
case COMBAT_BEGIN:
//PhaseUtil.verifyCombat();
if (playerTurn.isSkippingCombat()) {
@@ -712,6 +718,36 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
return;
}
//904.10. If a non-ongoing scheme card is face up in the
//command zone, and it isn't the source of a triggered ability
//that has triggered but not yet left the stack, that scheme card
//is turned face down and put on the bottom of its owner's scheme
//deck the next time a player would receive priority.
//(This is a state-based action. See rule 704.)
for (int i=0; i<game.getCardsIn(ZoneType.Command).size();i++) {
Card c = game.getCardsIn(ZoneType.Command).get(i);
if(c.isScheme() && !c.isType("Ongoing"))
{
boolean foundonstack = false;
for(SpellAbilityStackInstance si : game.getStack().getStack()) {
if(si.getSourceCard().equals(c))
{
foundonstack = true;
break;
}
}
if(!foundonstack)
{
game.getTriggerHandler().suppressMode(TriggerType.ChangesZone);
c.getController().getZone(ZoneType.Command).remove(c);
i--;
game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
c.getController().getSchemeDeck().add(c);
}
}
}
final Player actingPlayer = this.getPriorityPlayer();
final Player firstAction = this.getFirstPriority();

View File

@@ -143,6 +143,9 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
private PlayerStatistics stats = new PlayerStatistics();
private final List<Card> schemeDeck = new ArrayList<Card>();
private Card activeScheme = null;
/** The Constant ALL_ZONES. */
public static final List<ZoneType> ALL_ZONES = Collections.unmodifiableList(Arrays.asList(ZoneType.Battlefield,
ZoneType.Library, ZoneType.Graveyard, ZoneType.Hand, ZoneType.Exile, ZoneType.Command, ZoneType.Ante));
@@ -206,6 +209,55 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
public abstract boolean isComputer();
public abstract PlayerType getType();
public List<Card> getSchemeDeck()
{
return schemeDeck;
}
public void setSchemeDeck(Iterable<Card> sd)
{
schemeDeck.clear();
for(Card c : sd)
{
schemeDeck.add(c);
c.setOwner(this);
}
CardLists.shuffle(schemeDeck);
}
public boolean isArchenemy()
{
//Only the archenemy has schemes.
return schemeDeck.size() > 0;
}
public void setSchemeInMotion()
{
// Replacement effects
final HashMap<String, Object> repRunParams = new HashMap<String, Object>();
repRunParams.put("Event", "SetInMotion");
repRunParams.put("Affected", this);
if (game.getReplacementHandler().run(repRunParams) != ReplacementResult.NotReplaced) {
return;
}
game.getTriggerHandler().suppressMode(TriggerType.ChangesZone);
activeScheme = schemeDeck.get(0);
schemeDeck.remove(0);
this.getZone(ZoneType.Command).add(activeScheme);
game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
// Run triggers
final HashMap<String, Object> runParams = new HashMap<String, Object>();
runParams.put("Scheme", activeScheme);
game.getTriggerHandler().runTrigger(TriggerType.SetInMotion, runParams);
}
/**
* <p>
* getOpponent. Used by current-generation AI.

View File

@@ -0,0 +1,164 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui.deckeditor.controllers;
import java.util.List;
import com.google.common.base.Supplier;
import com.google.common.collect.Iterables;
import forge.Singletons;
import forge.deck.Deck;
import forge.gui.deckeditor.SEditorIO;
import forge.gui.deckeditor.SEditorUtil;
import forge.gui.deckeditor.tables.DeckController;
import forge.gui.deckeditor.tables.SColumnUtil;
import forge.gui.deckeditor.tables.SColumnUtil.ColumnName;
import forge.gui.deckeditor.tables.TableColumnInfo;
import forge.gui.deckeditor.tables.EditorTableView;
import forge.gui.deckeditor.views.VCardCatalog;
import forge.gui.deckeditor.views.VCurrentDeck;
import forge.gui.framework.EDocID;
import forge.item.CardDb;
import forge.item.CardPrinted;
import forge.item.InventoryItem;
import forge.item.ItemPool;
import forge.properties.ForgePreferences.FPref;
/**
* Child controller for constructed deck editor UI.
* This is the least restrictive mode;
* all cards are available.
*
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
*
* @author Forge
* @version $Id: CEditorConstructed.java 18430 2012-11-27 22:42:36Z Hellfish $
*/
public final class CEditorScheme extends ACEditorBase<CardPrinted, Deck> {
private final DeckController<Deck> controller;
//=========== Constructor
/**
* Child controller for constructed deck editor UI.
* This is the least restrictive mode;
* all cards are available.
*/
public CEditorScheme() {
super();
final EditorTableView<CardPrinted> tblCatalog = new EditorTableView<CardPrinted>(true, CardPrinted.class);
final EditorTableView<CardPrinted> tblDeck = new EditorTableView<CardPrinted>(true, CardPrinted.class);
VCardCatalog.SINGLETON_INSTANCE.setTableView(tblCatalog.getTable());
VCurrentDeck.SINGLETON_INSTANCE.setTableView(tblDeck.getTable());
this.setTableCatalog(tblCatalog);
this.setTableDeck(tblDeck);
final Supplier<Deck> newCreator = new Supplier<Deck>() {
@Override
public Deck get() {
return new Deck();
}
};
this.controller = new DeckController<Deck>(Singletons.getModel().getDecks().getScheme(), this, newCreator);
}
//=========== Overridden from ACEditorBase
/* (non-Javadoc)
* @see forge.gui.deckeditor.ACEditorBase#addCard()
*/
@Override
public void addCard() {
final InventoryItem item = this.getTableCatalog().getSelectedCard();
if ((item == null) || !(item instanceof CardPrinted)) {
return;
}
final CardPrinted card = (CardPrinted) item;
this.getTableDeck().addCard(card);
this.controller.notifyModelChanged();
VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().setText("*Current Deck");
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.ACEditorBase#removeCard()
*/
@Override
public void removeCard() {
final InventoryItem item = this.getTableDeck().getSelectedCard();
if ((item == null) || !(item instanceof CardPrinted)) {
return;
}
final CardPrinted card = (CardPrinted) item;
this.getTableDeck().removeCard(card);
this.controller.notifyModelChanged();
VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().setText("*Current Deck");
}
/*
* (non-Javadoc)
*
* @see forge.gui.deckeditor.ACEditorBase#updateView()
*/
@Override
public void resetTables() {
this.getTableCatalog().setDeck(ItemPool.createFrom(Iterables.filter(CardDb.instance().getAllNonTraditionalCards(),CardPrinted.Predicates.type("Scheme")), CardPrinted.class));
this.getTableDeck().setDeck(this.controller.getModel().getSchemes());
}
/*
* (non-Javadoc)
*
* @see forge.gui.deckeditor.ACEditorBase#getController()
*/
@Override
public DeckController<Deck> getDeckController() {
return this.controller;
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.ACEditorBase#show(forge.Command)
*/
@Override
public void init() {
final List<TableColumnInfo<InventoryItem>> lstCatalogCols = SColumnUtil.getCatalogDefaultColumns();
lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY));
this.getTableCatalog().setup(VCardCatalog.SINGLETON_INSTANCE, lstCatalogCols);
this.getTableDeck().setup(VCurrentDeck.SINGLETON_INSTANCE, SColumnUtil.getDeckDefaultColumns());
SEditorUtil.resetUI();
this.controller.newModel();
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#exit()
*/
@Override
public boolean exit() {
// Override the submenu save choice - tell it to go to "constructed".
Singletons.getModel().getPreferences().setPref(FPref.SUBMENU_CURRENTMENU, EDocID.HOME_ARCHENEMY.toString());
return SEditorIO.confirmSaveChanges();
}
}

View File

@@ -68,7 +68,7 @@ public enum EDocID { /** */
HOME_GAUNTLETLOAD (VSubmenuGauntletLoad.SINGLETON_INSTANCE), /** */
HOME_GAUNTLETQUICK (VSubmenuGauntletQuick.SINGLETON_INSTANCE), /** */
HOME_GAUNTLETCONTESTS (VSubmenuGauntletContests.SINGLETON_INSTANCE), /** */
HOME_MULTITEST (VSubmenuArchenemy.SINGLETON_INSTANCE), /** */
HOME_ARCHENEMY (VSubmenuArchenemy.SINGLETON_INSTANCE), /** */
HOME_PREFERENCES (VSubmenuPreferences.SINGLETON_INSTANCE), /** */
HOME_AVATARS (VSubmenuAvatars.SINGLETON_INSTANCE), /** */
HOME_UTILITIES (VSubmenuDownloaders.SINGLETON_INSTANCE), /** */

View File

@@ -2,25 +2,38 @@ package forge.gui.home.variant;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JRadioButton;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import com.google.common.collect.Iterables;
import forge.Command;
import forge.GameActionUtil;
import forge.Singletons;
import forge.control.FControl;
import forge.control.Lobby;
import forge.deck.Deck;
import forge.deck.DeckgenUtil;
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.deckeditor.CDeckEditorUI;
import forge.gui.deckeditor.controllers.CEditorScheme;
import forge.gui.framework.ICDoc;
import forge.gui.toolbox.FDeckChooser;
import forge.item.CardPrinted;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
/**
* Controls the deck editor submenu option in the home UI.
* Controls the constructed submenu in the home UI.
*
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
*
@@ -28,48 +41,81 @@ import forge.gui.framework.ICDoc;
public enum CSubmenuArchenemy implements ICDoc {
/** */
SINGLETON_INSTANCE;
private final VSubmenuArchenemy view = VSubmenuArchenemy.SINGLETON_INSTANCE;
/* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#update()
* @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() {
view.getDcHuman().initialize();
VSubmenuArchenemy.SINGLETON_INSTANCE.getLblEditor().setCommand(new Command() {
@Override
public void execute() {
CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(new CEditorScheme());
FControl.SINGLETON_INSTANCE.changeState(FControl.DECK_EDITOR_CONSTRUCTED);
}
});
final ForgePreferences prefs = Singletons.getModel().getPreferences();
for (FDeckChooser fdc : view.getDeckChoosers()) {
fdc.initialize();
}
// Checkbox event handling
view.getBtnStart().addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent arg0) {
start();
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));
}
/* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#update()
*/
@Override
public void update() { }
/* (non-Javadoc)
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
*/
@Override
public Command getCommandOnSelect() {
return null;
}
private void start() {
// Retrieve selections
JRadioButton radTemp = null;
for (JRadioButton rad : view.getFieldRadios()) {
if (rad.isSelected()) { radTemp = rad; break; } }
final int numFields = (radTemp == null ? 2 : Integer.valueOf(radTemp.getText()));
// Boilerplate start game code
/** @param lists0 &emsp; {@link java.util.List}<{@link javax.swing.JList}> */
private void startGame() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
@@ -81,21 +127,79 @@ public enum CSubmenuArchenemy implements ICDoc {
final SwingWorker<Object, Void> worker = new SwingWorker<Object, Void>() {
@Override
public Object doInBackground() {
Deck humanDeck = view.getDcHuman().getDeck();
Random rnd = new Random();
String nl = System.getProperty("line.separator");
boolean usedDefaults = false;
MatchStartHelper starter = new MatchStartHelper();
Lobby lobby = Singletons.getControl().getLobby();
List<Deck> playerDecks = new ArrayList<Deck>();
for (int i = 0; i < view.getNumPlayers(); i++) {
Deck d = view.getDeckChoosers().get(i).getDeck();
PlayerStartConditions humanStart = new PlayerStartConditions(humanDeck);
starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), humanStart);
humanStart.setStartingLife(10 + 10 * numFields); // will have 40 life to play against 3 opponents
for (int i = 0; i < numFields; i++) {
starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), DeckgenUtil.getRandomColorDeck(PlayerType.COMPUTER));
if (d == null) {
//ERROR!
GameActionUtil.showInfoDialg("No deck selected for player " + (i + 1));
return null;
}
playerDecks.add(d);
}
List<CardPrinted> schemes = null;
Object obj = view.getArchenemySchemes().getSelectedValue();
boolean useDefault = VSubmenuArchenemy.SINGLETON_INSTANCE.getCbUseDefaultSchemes().isSelected();
useDefault &= !playerDecks.get(0).getSchemes().isEmpty();
System.out.println(useDefault);
if (useDefault) {
schemes = playerDecks.get(0).getSchemes().toFlatList();
System.out.println(schemes.toString());
usedDefaults = true;
} else {
if (obj instanceof String) {
String sel = (String)obj;
if(sel.equals("Random"))
{
schemes = Iterables.get(view.getAllSchemeDecks(), rnd.nextInt(Iterables.size(view.getAllSchemeDecks()))).getSchemes().toFlatList();
}
else
{
//Generate
schemes = DeckgenUtil.generateSchemeDeck().getSchemes().toFlatList();
}
} else {
schemes = ((Deck)obj).getSchemes().toFlatList();
}
}
if (schemes == null) {
//ERROR!
GameActionUtil.showInfoDialg("No scheme deck selected!");
return null;
}
if (usedDefaults) {
GameActionUtil.showInfoDialg("Using default scheme deck.");
}
Lobby lobby = Singletons.getControl().getLobby();
MatchStartHelper helper = new MatchStartHelper();
for (int i = 0; i < view.getNumPlayers(); i++) {
LobbyPlayer player = lobby.findLocalPlayer(i == 0 ? PlayerType.HUMAN : PlayerType.COMPUTER);
if(i == 0)
{
helper.addArchenemy(player, playerDecks.get(i), schemes);
}
else
{
helper.addPlayer(player, playerDecks.get(i));
}
}
MatchController mc = Singletons.getModel().getMatch();
mc.initMatch(GameType.Constructed, starter.getPlayerMap());
mc.initMatch(GameType.Archenemy, helper.getPlayerMap());
mc.startRound();
return null;
@@ -108,4 +212,13 @@ public enum CSubmenuArchenemy implements ICDoc {
};
worker.execute();
}
/* (non-Javadoc)
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
*/
@Override
public Command getCommandOnSelect() {
return null;
}
}

View File

@@ -1,29 +1,51 @@
package forge.gui.home.variant;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.google.common.collect.Iterables;
import net.miginfocom.swing.MigLayout;
import forge.Singletons;
import forge.deck.Deck;
import forge.game.player.PlayerType;
import forge.gui.CardDetailPanel;
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.ExperimentalLabel;
import forge.gui.toolbox.FCheckBox;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.FPanel;
import forge.gui.toolbox.FRadioButton;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTabbedPane;
import forge.item.CardDb;
import forge.item.CardPrinted;
/**
* Assembles Swing components of deck editor submenu option singleton.
* Assembles Swing components of constructed submenu singleton.
*
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
*
@@ -34,72 +56,142 @@ public enum VSubmenuArchenemy implements IVSubmenu<CSubmenuArchenemy> {
// Fields used with interface IVDoc
private DragCell parentCell;
private final DragTab tab = new DragTab("Multiplayer Test");
private final JPanel pnlFields;
private final DragTab tab = new DragTab("Archenemy Mode");
/** */
private final List<JRadioButton> fieldRadios = new ArrayList<JRadioButton>();
private final StartButton btnStart = new StartButton();
private final ButtonGroup grpFields = new ButtonGroup();
private final LblHeader lblTitle = new LblHeader("Variant: Archenemy");
private final FDeckChooser dcHuman = new FDeckChooser("Choose your deck", PlayerType.HUMAN);
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 ExperimentalLabel lblEditor = new ExperimentalLabel("Scheme Deck Editor");
private final FTabbedPane tabPane = new FTabbedPane();
private final List<FPanel> playerPanels = new ArrayList<FPanel>();
private final List<FDeckChooser> deckChoosers = new ArrayList<FDeckChooser>();
private final FList archenemySchemes = new FList();
private final List<Deck> allSchemeDecks = new ArrayList<Deck>();
private final JCheckBox cbUseDefaultSchemes = new FCheckBox("Use default scheme decks if possible.");
private final List<JRadioButton> fieldRadios = new ArrayList<JRadioButton>();
private final ButtonGroup grpFields = new ButtonGroup();
private int currentNumTabsShown = 8;
//////////////////////////////
private VSubmenuArchenemy() {
FRadioButton temp;
for (int i = 2; i < 8; i++) {
temp = new FRadioButton();
temp.setText(String.valueOf(i));
fieldRadios.add(temp);
grpFields.add(temp);
}
lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
//This listener will look for any of the radio buttons being selected
//and call the method that shows/hides tabs appropriately.
ItemListener iListener = new ItemListener() {
pnlFields = new FPanel();
pnlFields.setLayout(new MigLayout("insets 0, gap 0, wrap"));
pnlFields.add(new FLabel.Builder().text("How many AI opponents are you ready to handle?").build(), "h 30px!");
for (JRadioButton rad : fieldRadios) {
pnlFields.add(rad, "w 100px!, h 30px!, gap 30px 0 0 0");
}
fieldRadios.get(0).setSelected(true);
}
/** @return {@link javax.swing.JButton} */
public JButton getBtnStart() {
return btnStart;
}
/** @return {@link java.util.List} */
public List<JRadioButton> getFieldRadios() {
return fieldRadios;
}
/* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#populate()
*/
@Override
public void populate() {
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, wrap 2"));
public void itemStateChanged(ItemEvent arg0) {
FRadioButton aButton = (FRadioButton) arg0.getSource();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlFields, "w 41%!, gap 6% 6% 50px 0, growy, pushy");
dcHuman.populate();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(dcHuman, "w 41%!, gap 0 0 50px 0, growy, pushy");
if (arg0.getStateChange() == ItemEvent.SELECTED) {
changeTabs(Integer.parseInt(aButton.getText()));
}
}
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(new FLabel.Builder()
.text("Starts a new game with preconstructed 2 color decks for each field.")
.build(), "gap 0 0 50px 5px, ax center, span 2");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(btnStart, "gap 0 0 50px 50px, ax center, span 2");
};
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate();
//Create all 8 player settings panel
FRadioButton tempRadio = null;
FPanel tempPanel;
FDeckChooser tempChooser;
//Settings panel
FPanel settingsPanel = new FPanel();
settingsPanel.setLayout(new MigLayout("wrap 2"));
FPanel radioPane = new FPanel();
radioPane.setLayout(new MigLayout("wrap 1"));
radioPane.setOpaque(false);
radioPane.add(new FLabel.Builder().text("Set number of opponents").build(), "wrap");
for (int i = 1; i < 8; i++) {
tempRadio = new FRadioButton();
tempRadio.setText(String.valueOf(i));
fieldRadios.add(tempRadio);
grpFields.add(tempRadio);
tempRadio.setSelected(true);
tempRadio.addItemListener(iListener);
radioPane.add(tempRadio, "wrap,align 50% 50%");
}
settingsPanel.add(radioPane, "span 1 2");
settingsPanel.add(cbUseDefaultSchemes);
settingsPanel.add(lblEditor);
tabPane.add("Settings", settingsPanel);
//Player panels (Human + 7 AIs)
for (int i = 0; i < 8; i++) {
tempPanel = new FPanel();
tempPanel.setLayout(new MigLayout("insets 0, gap 0 , wrap 2, flowy"));
tempChooser = new FDeckChooser("Select deck:", i == 0 ? PlayerType.HUMAN : PlayerType.COMPUTER);
tempChooser.initialize();
deckChoosers.add(tempChooser);
tempPanel.add(tempChooser, "span 1 2, w 44%!, gap 0 0 20px 20px, growy, pushy, wrap");
if(i == 0)
{
tempPanel.add(new FLabel.Builder().text("Select Scheme deck:").build(), "flowy");
Vector<Object> listData = new Vector<Object>();
listData.add("Random");
listData.add("Generate");
for(Deck schemeDeck : Singletons.getModel().getDecks().getScheme()) {
listData.add(schemeDeck);
}
archenemySchemes.setListData(listData);
archenemySchemes.setSelectedIndex(0);
archenemySchemes.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrSchemes = new FScrollPane(archenemySchemes, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
tempPanel.add(scrSchemes, "h 90%!,wrap");
}
playerPanels.add(tempPanel);
if (i == 0) {
tabPane.add("Human", tempPanel);
} else {
tabPane.add("Opponent " + i, tempPanel);
}
}
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);
}
private void changeTabs(int toShow) {
if (toShow < currentNumTabsShown) {
for (int i = currentNumTabsShown; i > toShow + 1; i--) {
tabPane.remove(i);
}
currentNumTabsShown = tabPane.getComponentCount() - 1;
}
else {
for (int i = currentNumTabsShown; i <= toShow; i++) {
tabPane.add("Opponent " + i, playerPanels.get(i));
}
currentNumTabsShown = tabPane.getComponentCount() - 1;
}
}
/* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#getGroup()
* @see forge.gui.home.IVSubmenu#getGroupEnum()
*/
@Override
public EMenuGroup getGroupEnum() {
@@ -119,7 +211,52 @@ public enum VSubmenuArchenemy implements IVSubmenu<CSubmenuArchenemy> {
*/
@Override
public EDocID getItemEnum() {
return EDocID.HOME_MULTITEST;
return EDocID.HOME_ARCHENEMY;
}
/* (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 1, ax right"));
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 80%!, h 40px!, gap 0 0 15px 15px, span 2, ax right");
for (FDeckChooser fdc : deckChoosers) {
fdc.populate();
}
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(tabPane, "gap 0 0 50px 50px, growx, growy");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlStart, "span 1, 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
@@ -129,7 +266,7 @@ public enum VSubmenuArchenemy implements IVSubmenu<CSubmenuArchenemy> {
*/
@Override
public EDocID getDocumentID() {
return EDocID.HOME_MULTITEST;
return EDocID.HOME_ARCHENEMY;
}
/* (non-Javadoc)
@@ -164,7 +301,43 @@ public enum VSubmenuArchenemy implements IVSubmenu<CSubmenuArchenemy> {
return parentCell;
}
public final FDeckChooser getDcHuman() {
return dcHuman;
/**
*
* @return a deckchooser for every player
*/
public List<FDeckChooser> getDeckChoosers() {
return deckChoosers;
}
public int getNumPlayers() {
return currentNumTabsShown;
}
/**
* @return the lblEditor
*/
public ExperimentalLabel getLblEditor() {
return lblEditor;
}
/**
* @return the cbUseDefaultSchemes
*/
public JCheckBox getCbUseDefaultSchemes() {
return cbUseDefaultSchemes;
}
/**
* @return the archenemySchemes
*/
public FList getArchenemySchemes() {
return archenemySchemes;
}
/**
* @return the allSchemeDecks
*/
public List<Deck> getAllSchemeDecks() {
return allSchemeDecks;
}
}

View File

@@ -112,7 +112,8 @@ public final class CardPrinted implements Comparable<CardPrinted>, InventoryItem
}
public boolean isTraditional() {
return !getCard().getType().isVanguard();
return !(getCard().getType().isVanguard()
|| getCard().getType().isScheme());
}
/**