diff --git a/.gitattributes b/.gitattributes index b47b032cdb5..965bb691a19 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9334,6 +9334,7 @@ res/cardsfolder/s/swift_maneuver.txt svneol=native#text/plain res/cardsfolder/s/swiftfoot_boots.txt svneol=native#text/plain res/cardsfolder/s/swirling_sandstorm.txt svneol=native#text/plain res/cardsfolder/s/swirling_spriggan.txt -text +res/cardsfolder/s/switcheroo.txt -text res/cardsfolder/s/swooping_talon.txt -text res/cardsfolder/s/sword_dancer.txt svneol=native#text/plain res/cardsfolder/s/sword_of_body_and_mind.txt svneol=native#text/plain diff --git a/res/cardsfolder/s/switcheroo.txt b/res/cardsfolder/s/switcheroo.txt new file mode 100644 index 00000000000..d49162420ab --- /dev/null +++ b/res/cardsfolder/s/switcheroo.txt @@ -0,0 +1,11 @@ +Name:Switcheroo +ManaCost:4 U +Types:Sorcery +Text:no text +A:SP$ ExchangeControl | Cost$ 4 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 2 | TargetMax$ 2 | SpellDescription$ Exchange control of two target creatures. +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/switcheroo.jpg +SetInfo:M13|Uncommon|http://magiccards.info/scans/en/m13/71.jpg +Oracle:Exchange control of two target creatures. +End \ No newline at end of file diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactory.java b/src/main/java/forge/card/abilityfactory/AbilityFactory.java index 806d1eb3c98..ced0fdb5cd5 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactory.java @@ -782,6 +782,17 @@ public class AbilityFactory { } } + else if (this.api.equals("ExchangeControl")) { + final AbilityFactoryGainControl afControl = new AbilityFactoryGainControl(this); + if (this.isAb) { + spellAbility = afControl.getAbilityExchangeControl(); + } else if (this.isSp) { + spellAbility = afControl.getSpellExchangeControl(); + } else if (this.isDb) { + spellAbility = afControl.getDrawbackExchangeControl(); + } + } + else if (this.api.equals("Fight")) { final AbilityFactoryDealDamage dd = new AbilityFactoryDealDamage(this); if (this.isAb) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java index 9902a258214..b44a981e291 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java @@ -654,5 +654,230 @@ public class AbilityFactoryGainControl { host.clearGainControlTargets(); host.clearGainControlReleaseCommands(); } + + // ************************************************************************* + // ******************************* ExchangeControl *********************************** + // ************************************************************************* + /** + *
+ * getAbilityExchangeControl. + *
+ * + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public final SpellAbility getAbilityExchangeControl() { + class AbilityExchangeControl extends AbilityActivated { + public AbilityExchangeControl(final Card ca, final Cost co, final Target t) { + super(ca, co, t); + } + + @Override + public AbilityActivated getCopy() { + AbilityActivated res = new AbilityExchangeControl(getSourceCard(), + getPayCosts(), getTarget() == null ? null : new Target(getTarget())); + CardFactoryUtil.copySpellAbility(this, res); + return res; + } + + private static final long serialVersionUID = -1831356710492849854L; + private final AbilityFactory af = AbilityFactoryGainControl.this.af; + + @Override + public String getStackDescription() { + return exchangeControlStackDescription(this.af, this); + } + + @Override + public boolean canPlayAI() { + return exchangeControlCanPlayAI(this.af, this); + } + + @Override + public void resolve() { + exchangeControlResolve(this.af, this); + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return exchangeControlDoTriggerAI(this.af, this, mandatory); + } + } + + final SpellAbility abExchangeControl = new AbilityExchangeControl(this.af.getHostCard(), + this.af.getAbCost(), this.af.getAbTgt()); + + return abExchangeControl; + } + + /** + *+ * getSpellExchangeControl. + *
+ * + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public final SpellAbility getSpellExchangeControl() { + final SpellAbility spExchangeControl = new Spell(this.af.getHostCard(), this.af.getAbCost(), + this.af.getAbTgt()) { + private static final long serialVersionUID = 8004957182752960518L; + private final AbilityFactory af = AbilityFactoryGainControl.this.af; + private final HashMap+ * getDrawbackExchangeControl. + *
+ * + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public final SpellAbility getDrawbackExchangeControl() { + class DrawbackExchangeControl extends AbilitySub { + public DrawbackExchangeControl(final Card ca, final Target t) { + super(ca, t); + } + + @Override + public AbilitySub getCopy() { + AbilitySub res = new DrawbackExchangeControl(getSourceCard(), + getTarget() == null ? null : new Target(getTarget())); + CardFactoryUtil.copySpellAbility(this, res); + return res; + } + + private static final long serialVersionUID = -6169562107675964474L; + private final AbilityFactory af = AbilityFactoryGainControl.this.af; + + @Override + public String getStackDescription() { + return exchangeControlStackDescription(this.af, this); + } + + @Override + public void resolve() { + exchangeControlResolve(this.af, this); + } + + @Override + public boolean chkAIDrawback() { + // check AI life before playing this drawback? + return true; + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return exchangeControlDoTriggerAI(this.af, this, mandatory); + } + } + final SpellAbility dbExchangeControl = new DrawbackExchangeControl(this.af.getHostCard(),this.af.getAbTgt()); + + return dbExchangeControl; + } + + /** + *+ * exchangeControlStackDescription. + *
+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @return a {@link java.lang.String} object. + */ + private String exchangeControlStackDescription(final AbilityFactory af, final SpellAbility sa) { + final StringBuilder sb = new StringBuilder(); + final HashMap