diff --git a/.gitattributes b/.gitattributes index 7229ed564e4..a2c069e49ab 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2122,7 +2122,6 @@ res/cardsfolder/d/desolation_angel.txt svneol=native#text/plain res/cardsfolder/d/desolation_giant.txt svneol=native#text/plain res/cardsfolder/d/desperate_charge.txt svneol=native#text/plain res/cardsfolder/d/desperate_ravings.txt -text -res/cardsfolder/d/desperate_ritual.txt svneol=native#text/plain res/cardsfolder/d/despise.txt svneol=native#text/plain res/cardsfolder/d/despoil.txt svneol=native#text/plain res/cardsfolder/d/despondency.txt svneol=native#text/plain @@ -9077,7 +9076,6 @@ res/cardsfolder/t/throat_slitter.txt svneol=native#text/plain res/cardsfolder/t/throne_of_bone.txt svneol=native#text/plain res/cardsfolder/t/throne_of_empires.txt -text res/cardsfolder/t/throne_of_geth.txt svneol=native#text/plain -res/cardsfolder/t/through_the_breach.txt svneol=native#text/plain res/cardsfolder/t/thrull_champion.txt svneol=native#text/plain res/cardsfolder/t/thrull_retainer.txt -text res/cardsfolder/t/thrull_surgeon.txt svneol=native#text/plain @@ -11048,7 +11046,6 @@ src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java svneol=nat src/main/java/forge/card/abilityfactory/AbilityFactoryReveal.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactorySacrifice.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactorySetState.java svneol=native#text/plain -src/main/java/forge/card/abilityfactory/AbilityFactorySplice.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryToken.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryTurns.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java svneol=native#text/plain diff --git a/res/cardsfolder/d/desperate_ritual.txt b/res/cardsfolder/d/desperate_ritual.txt deleted file mode 100644 index 3b37bdaede7..00000000000 --- a/res/cardsfolder/d/desperate_ritual.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Desperate Ritual -ManaCost:1 R -Types:Instant Arcane -Text:no text -A:SP$ Mana | Cost$ R | Produced$ R | Amount$ 3 | SpellDescription$ Add R R R to your mana pool. -S:Mode$ Continuous | Affected$ Arcane.YouCtrl | EffectZone$ Stack | AffectedZone$ Stack| AddAbility$ Mana | Description$ Splice onto Arcane {1}{R} -SVar:Mana:SP$ Mana | Cost$ 1 R | Produced$ R | Amount$ 3 | SpellDescription$ Add R R R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/desperate_ritual.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/163.jpg -Oracle:Add {R}{R}{R} to your mana pool. -End diff --git a/res/cardsfolder/t/through_the_breach.txt b/res/cardsfolder/t/through_the_breach.txt deleted file mode 100644 index 53147178f19..00000000000 --- a/res/cardsfolder/t/through_the_breach.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Through the Breach -ManaCost:4 R -Types:Instant Arcane -Text:(Note: Splice onto Arcane is not properly implemented. It will create an instance of this spell on the stack rather than adding it to the first spell) -A:SP$ ChangeZone | Cost$ 4 R | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ForgetOtherRemembered$ True | SpellDescription$ You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice the creature at the beginning of the next end step. -SVar:DBPump:DB$Pump | KW$ Haste & HIDDEN At the beginning of the end step, sacrifice CARDNAME. | Defined$ Remembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -T:Mode$ SpellCast | ValidCard$ Card.Arcane+YouCtrl | Execute$ TrigSplice | TriggerZones$ Hand | OptionalDecider$ You | TriggerDescription$ Splice onto Arcane 2 R R (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -SVar:TrigSplice:AB$ChangeZone | Cost$ 2 R R | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ForgetOtherRemembered$ True | SpellDescription$ Splice CARDNAME onto Arcane. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/through_the_breach.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/193.jpg -Oracle:You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice that creature at the beginning of the next end step.\nSplice onto Arcane {2}{R}{R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -End \ No newline at end of file diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactorySplice.java b/src/main/java/forge/card/abilityfactory/AbilityFactorySplice.java deleted file mode 100644 index 858968481ff..00000000000 --- a/src/main/java/forge/card/abilityfactory/AbilityFactorySplice.java +++ /dev/null @@ -1,490 +0,0 @@ -/* - * 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 . - */ -package forge.card.abilityfactory; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.Card; -import forge.ComputerUtil; -import forge.card.cardfactory.CardFactoryUtil; -import forge.card.cost.Cost; -import forge.card.cost.CostUtil; -import forge.card.spellability.AbilityActivated; -import forge.card.spellability.AbilitySub; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.SpellAbilityStackInstance; -import forge.card.spellability.Target; -import forge.card.spellability.TargetSelection; -import forge.util.MyRandom; - -//Examples: -//A:SP$ Splice | Cost$ 1 G | TargetType$ Arcane | SpellDescription$ Counter target activated ability. - -/** - *

- * AbilityFactorySplice class. - *

- * - * @author Forge - * @version $Id$ - */ -public class AbilityFactorySplice { - - private AbilityFactory abilityFactory = null; - private HashMap params = null; - private String unlessCost = null; - - /** - *

- * Constructor for AbilityFactorySplice. - *

- * - * @param newAbilityFactory - * a {@link forge.card.abilityfactory.AbilityFactory} object. - */ - public AbilityFactorySplice(final AbilityFactory newAbilityFactory) { - this.abilityFactory = newAbilityFactory; - this.params = this.abilityFactory.getMapParams(); - - if (this.params.containsKey("UnlessCost")) { - this.unlessCost = this.params.get("UnlessCost").trim(); - } - - } - - /** - *

- * getAbilitySplice. - *

- * - * @param abilityFactory - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public final SpellAbility getAbilitySplice(final AbilityFactory abilityFactory) { - final SpellAbility abilitySplice = new AbilityActivated(abilityFactory.getHostCard(), abilityFactory.getAbCost(), - abilityFactory.getAbTgt()) { - private static final long serialVersionUID = -3895990436431818899L; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is - // happening - return AbilityFactorySplice.this - .spliceStackDescription(AbilityFactorySplice.this.abilityFactory, this); - } - - @Override - public boolean canPlayAI() { - return AbilityFactorySplice.this.spliceCanPlayAI(AbilityFactorySplice.this.abilityFactory, this); - } - - @Override - public void resolve() { - AbilityFactorySplice.this.spliceResolve(AbilityFactorySplice.this.abilityFactory, this); - } - - @Override - public boolean doTrigger(final boolean mandatory) { - return AbilityFactorySplice.this.spliceCanPlayAI(AbilityFactorySplice.this.abilityFactory, this); - } - - }; - return abilitySplice; - } - - /** - *

- * getSpellSplice. - *

- * - * @param abilityFactory - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public final SpellAbility getSpellSplice(final AbilityFactory abilityFactory) { - final SpellAbility spellAbilitySplice = new Spell(abilityFactory.getHostCard(), abilityFactory.getAbCost(), - abilityFactory.getAbTgt()) { - private static final long serialVersionUID = -4272851734871573693L; - - @Override - public String getStackDescription() { - return AbilityFactorySplice.this - .spliceStackDescription(AbilityFactorySplice.this.abilityFactory, this); - } - - @Override - public boolean canPlayAI() { - return AbilityFactorySplice.this.spliceCanPlayAI(AbilityFactorySplice.this.abilityFactory, this); - } - - @Override - public void resolve() { - AbilityFactorySplice.this.spliceResolve(AbilityFactorySplice.this.abilityFactory, this); - } - - }; - return spellAbilitySplice; - } - - /** - *

- * getDrawbackSplice. - *

- * - * @param abilityFactory - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public final SpellAbility getDrawbackSplice(final AbilityFactory abilityFactory) { - final SpellAbility drawbackSplice = new AbilitySub(abilityFactory.getHostCard(), abilityFactory.getAbTgt()) { - private static final long serialVersionUID = -4272851734871573693L; - - @Override - public String getStackDescription() { - return AbilityFactorySplice.this - .spliceStackDescription(AbilityFactorySplice.this.abilityFactory, this); - } - - @Override - public boolean canPlayAI() { - return AbilityFactorySplice.this.spliceCanPlayAI(AbilityFactorySplice.this.abilityFactory, this); - } - - @Override - public void resolve() { - AbilityFactorySplice.this.spliceResolve(AbilityFactorySplice.this.abilityFactory, this); - } - - @Override - public boolean chkAIDrawback() { - return AbilityFactorySplice.this.spliceDoTriggerAI(AbilityFactorySplice.this.abilityFactory, this, - true); - } - - @Override - public boolean doTrigger(final boolean mandatory) { - return AbilityFactorySplice.this.spliceDoTriggerAI(AbilityFactorySplice.this.abilityFactory, this, - mandatory); - } - - }; - return drawbackSplice; - } - - /** - *

- * spliceCanPlayAI. - *

- * - * @param abilityFactory - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @param spellAbility - * a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean spliceCanPlayAI(final AbilityFactory abilityFactory, final SpellAbility spellAbility) { - boolean toReturn = true; - final Cost abCost = abilityFactory.getAbCost(); - final Card source = spellAbility.getSourceCard(); - if (AllZone.getStack().size() < 1) { - return false; - } - - if (abCost != null) { - // AI currently disabled for these costs - if (!CostUtil.checkSacrificeCost(abCost, source)) { - return false; - } - if (!CostUtil.checkLifeCost(abCost, source, 4)) { - return false; - } - } - - final Target tgt = spellAbility.getTarget(); - if (tgt != null) { - - final SpellAbility topSA = AllZone.getStack().peekAbility(); - if (!CardFactoryUtil.isCounterable(topSA.getSourceCard()) || topSA.getActivatingPlayer().isComputer()) { - return false; - } - - tgt.resetTargets(); - if (TargetSelection.matchSpellAbility(spellAbility, topSA, tgt)) { - tgt.addTarget(topSA); - } else { - return false; - } - } - - if (this.unlessCost != null) { - // Is this Usable Mana Sources? Or Total Available Mana? - final int usableManaSources = CardFactoryUtil.getUsableManaSources(AllZone.getHumanPlayer()); - int toPay = 0; - boolean setPayX = false; - if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) { - setPayX = true; - toPay = ComputerUtil.determineLeftoverMana(spellAbility); - } else { - toPay = AbilityFactory.calculateAmount(source, this.unlessCost, spellAbility); - } - - if (toPay == 0) { - return false; - } - - if (toPay <= usableManaSources) { - // If this is a reusable Resource, feel free to play it most of - // the time - if (!spellAbility.getPayCosts().isReusuableResource() || (MyRandom.getRandom().nextFloat() < .4)) { - return false; - } - } - - if (setPayX) { - source.setSVar("PayX", Integer.toString(toPay)); - } - } - - // TODO Improve AI - - // Will return true if this spell can counter (or is Reusable and can - // force the Human into making decisions) - - // But really it should be more picky about how it counters things - - final AbilitySub subAb = spellAbility.getSubAbility(); - if (subAb != null) { - toReturn &= subAb.chkAIDrawback(); - } - - return toReturn; - } - - /** - *

- * spliceDoTriggerAI. - *

- * - * @param abilityFactory - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @param spellAbility - * a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory - * a boolean. - * @return a boolean. - */ - private boolean spliceDoTriggerAI(final AbilityFactory abilityFactory, final SpellAbility spellAbility, final boolean mandatory) { - boolean toReturn = true; - if (AllZone.getStack().size() < 1) { - return false; - } - - final Target tgt = spellAbility.getTarget(); - if (tgt != null) { - final SpellAbility topSA = AllZone.getStack().peekAbility(); - if (!CardFactoryUtil.isCounterable(topSA.getSourceCard()) || topSA.getActivatingPlayer().isComputer()) { - return false; - } - - tgt.resetTargets(); - if (TargetSelection.matchSpellAbility(spellAbility, topSA, tgt)) { - tgt.addTarget(topSA); - } else { - return false; - } - - final Card source = spellAbility.getSourceCard(); - if (this.unlessCost != null) { - // Is this Usable Mana Sources? Or Total Available Mana? - final int usableManaSources = CardFactoryUtil.getUsableManaSources(AllZone.getHumanPlayer()); - int toPay = 0; - boolean setPayX = false; - if (this.unlessCost.equals("X") && source.getSVar(this.unlessCost).equals("Count$xPaid")) { - setPayX = true; - toPay = ComputerUtil.determineLeftoverMana(spellAbility); - } else { - toPay = AbilityFactory.calculateAmount(source, this.unlessCost, spellAbility); - } - - if (toPay == 0) { - return false; - } - - if (toPay <= usableManaSources) { - // If this is a reusable Resource, feel free to play it most - // of the time - if (!spellAbility.getPayCosts().isReusuableResource() || (MyRandom.getRandom().nextFloat() < .4)) { - return false; - } - } - - if (setPayX) { - source.setSVar("PayX", Integer.toString(toPay)); - } - } - } - - // TODO Improve AI - - // Will return true if this spell can counter (or is Reusable and can - // force the Human into making decisions) - - // But really it should be more picky about how it counters things - - final AbilitySub subAb = spellAbility.getSubAbility(); - if (subAb != null) { - toReturn &= subAb.chkAIDrawback(); - } - - return toReturn; - } - - /** - *

- * spliceResolve. - *

- * - * @param abilityFactory - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @param spellAbility - * a {@link forge.card.spellability.SpellAbility} object. - */ - private void spliceResolve(final AbilityFactory abilityFactory, final SpellAbility spellAbility) { - - // TODO Before this resolves we should see if any of our targets are - // still on the stack - ArrayList sas; - - final Target tgt = abilityFactory.getAbTgt(); - if (tgt != null) { - sas = tgt.getTargetSAs(); - } else { - sas = AbilityFactory.getDefinedSpellAbilities(spellAbility.getSourceCard(), this.params.get("Defined"), spellAbility); - } - - if (this.params.containsKey("ForgetOtherTargets")) { - if (this.params.get("ForgetOtherTargets").equals("True")) { - abilityFactory.getHostCard().clearRemembered(); - } - } - - for (final SpellAbility tgtSA : sas) { - final Card tgtSACard = tgtSA.getSourceCard(); - - if (tgtSA.isSpell() && !CardFactoryUtil.isCounterable(tgtSACard)) { - continue; - } - - final SpellAbilityStackInstance si = AllZone.getStack().getInstanceFromSpellAbility(tgtSA); - if (si == null) { - continue; - } - - this.removeFromStack(tgtSA, spellAbility, si); - - // Destroy Permanent may be able to be turned into a SubAbility - if (tgtSA.isAbility() && this.params.containsKey("DestroyPermanent")) { - AllZone.getGameAction().destroy(tgtSACard); - } - - if (this.params.containsKey("RememberTargets")) { - if (this.params.get("RememberTargets").equals("True")) { - abilityFactory.getHostCard().addRemembered(tgtSACard); - } - } - } - } // end spliceResolve - - /** - *

- * spliceStackDescription. - *

- * - * @param abilityFactory - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @param spellAbility - * a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private String spliceStackDescription(final AbilityFactory abilityFactory, final SpellAbility spellAbility) { - - final StringBuilder sb = new StringBuilder(); - - if (!(spellAbility instanceof AbilitySub)) { - sb.append(spellAbility.getSourceCard().getName()).append(" - "); - } else { - sb.append(" "); - } - - ArrayList sas; - - final Target tgt = abilityFactory.getAbTgt(); - if (tgt != null) { - sas = tgt.getTargetSAs(); - } else { - sas = AbilityFactory.getDefinedSpellAbilities(spellAbility.getSourceCard(), this.params.get("Defined"), spellAbility); - } - - sb.append("splicing"); - - boolean isAbility = false; - for (final SpellAbility tgtSA : sas) { - sb.append(" "); - sb.append(tgtSA.getSourceCard()); - isAbility = tgtSA.isAbility(); - if (isAbility) { - sb.append("'s ability"); - } - } - - if (isAbility && this.params.containsKey("DestroyPermanent")) { - sb.append(" and destroy it"); - } - - sb.append("."); - - final AbilitySub abSub = spellAbility.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } // end spliceStackDescription - - /** - *

- * removeFromStack. - *

- * - * @param targetSpellAbility - * a {@link forge.card.spellability.SpellAbility} object. - * @param sourceSpellAbility - * a {@link forge.card.spellability.SpellAbility} object. - * @param spellAbilityStackInstance - * a {@link forge.card.spellability.SpellAbilityStackInstance} - * object. - */ - private void removeFromStack(final SpellAbility targetSpellAbility, final SpellAbility sourceSpellAbility, final SpellAbilityStackInstance spellAbilityStackInstance) { - AllZone.getStack().remove(spellAbilityStackInstance); - } - -} // end class AbilityFactorySplice