AbilityFactory.getAbility is now static - no need to create instance of AbilityFactory to parse an ability

This commit is contained in:
Maxmtg
2013-02-12 05:57:06 +00:00
parent 429a5bd110
commit d243a21296
22 changed files with 45 additions and 97 deletions

View File

@@ -17,7 +17,6 @@
*/
package forge.card.ability;
import java.util.HashMap;
import java.util.Map;
@@ -39,17 +38,7 @@ import forge.game.zone.ZoneType;
* @author Forge
* @version $Id$
*/
public class AbilityFactory {
/**
* <p>
* Constructor for AbilityFactory.
* </p>
*/
public AbilityFactory() {
}
// *******************************************************
public final class AbilityFactory {
/**
* <p>
@@ -62,7 +51,7 @@ public class AbilityFactory {
* a {@link forge.Card} object.
* @return a {@link forge.card.spellability.SpellAbility} object.
*/
public final SpellAbility getAbility(final String abString, final Card hostCard) {
public static final SpellAbility getAbility(final String abString, final Card hostCard) {
SpellAbility spellAbility = null;
@@ -70,22 +59,17 @@ public class AbilityFactory {
boolean isSp = false;
boolean isDb = false;
ApiType api = null;
Card hostC = hostCard;
Map<String, String> mapParams = new HashMap<String, String>();
Map<String, String> mapParams;
try {
mapParams = AbilityUtils.getMapParams(abString);
}
catch (RuntimeException ex) {
throw new RuntimeException(hostCard.getName() + ": " + ex.getMessage());
}
// parse universal parameters
ApiType api = null;
if (mapParams.containsKey("AB")) {
isAb = true;
api = ApiType.smartValueOf(mapParams.get("AB"));
@@ -108,7 +92,7 @@ public class AbilityFactory {
}
Target abTgt = mapParams.containsKey("ValidTgts") ? readTarget(hostC, mapParams) : null;
Target abTgt = mapParams.containsKey("ValidTgts") ? readTarget(hostCard, mapParams) : null;
// ***********************************
// Match API keywords. These are listed in alphabetical order.
@@ -151,11 +135,6 @@ public class AbilityFactory {
}
// //////////////////////
//
// End API matching. The above APIs are listed in alphabetical order.
//
// //////////////////////
if (spellAbility == null) {
final StringBuilder msg = new StringBuilder();
@@ -172,7 +151,7 @@ public class AbilityFactory {
if (mapParams.containsKey("References")) {
for (String svar : mapParams.get("References").split(",")) {
spellAbility.setSVar(svar, hostC.getSVar(svar));
spellAbility.setSVar(svar, hostCard.getSVar(svar));
}
}
@@ -214,7 +193,7 @@ public class AbilityFactory {
return spellAbility;
}
private Target readTarget(Card hostC, Map<String, String> mapParams) {
private static final Target readTarget(Card hostC, Map<String, String> mapParams) {
final String min = mapParams.containsKey("TargetMin") ? mapParams.get("TargetMin") : "1";
final String max = mapParams.containsKey("TargetMax") ? mapParams.get("TargetMax") : "1";
@@ -279,7 +258,7 @@ public class AbilityFactory {
* a {@link forge.card.spellability.SpellAbility} object.
* @param mapParams
*/
private void makeRestrictions(final SpellAbility sa, Map<String, String> mapParams) {
private static final void makeRestrictions(final SpellAbility sa, Map<String, String> mapParams) {
// SpellAbilityRestrictions should be added in here
final SpellAbilityRestriction restrict = sa.getRestrictions();
if (mapParams.containsKey("Flashback")) {
@@ -297,7 +276,7 @@ public class AbilityFactory {
* a {@link forge.card.spellability.SpellAbility} object.
* @param mapParams
*/
private void makeConditions(final SpellAbility sa, Map<String, String> mapParams) {
private static final void makeConditions(final SpellAbility sa, Map<String, String> mapParams) {
// SpellAbilityRestrictions should be added in here
final SpellAbilityCondition condition = sa.getConditions();
if (mapParams.containsKey("Flashback")) {
@@ -315,11 +294,10 @@ public class AbilityFactory {
*
* @return a {@link forge.card.spellability.AbilitySub} object.
*/
private final AbilitySub getSubAbility(Card hostCard, String sSub) {
private static final AbilitySub getSubAbility(Card hostCard, String sSub) {
if (!sSub.equals("")) {
final AbilityFactory afDB = new AbilityFactory();
return (AbilitySub) afDB.getAbility(sSub, hostCard);
return (AbilitySub) AbilityFactory.getAbility(sSub, hostCard);
}
System.out.println("SubAbility not found for: " + hostCard);

View File

@@ -12,7 +12,6 @@ import forge.CardLists;
import forge.CardUtil;
import forge.Command;
import forge.Constant;
import forge.Constant.Color;
import forge.CounterType;
import forge.Singletons;
import forge.card.cardfactory.CardFactoryUtil;

View File

@@ -7,12 +7,11 @@ import forge.card.spellability.SpellAbility;
import forge.game.player.AIPlayer;
public class DelayedTriggerAi extends SpellAiLogic {
private static AbilityFactory tempCreator = new AbilityFactory();
@Override
public boolean chkAIDrawback(SpellAbility sa, AIPlayer ai) {
final String svarName = sa.getParam("Execute");
final SpellAbility trigsa = tempCreator.getAbility(sa.getSourceCard().getSVar(svarName), sa.getSourceCard());
final SpellAbility trigsa = AbilityFactory.getAbility(sa.getSourceCard().getSVar(svarName), sa.getSourceCard());
trigsa.setActivatingPlayer(ai);
if (trigsa instanceof AbilitySub) {
@@ -25,7 +24,7 @@ public class DelayedTriggerAi extends SpellAiLogic {
@Override
protected boolean doTriggerAINoCost(AIPlayer ai, SpellAbility sa, boolean mandatory) {
final String svarName = sa.getParam("Execute");
final SpellAbility trigsa = tempCreator.getAbility(sa.getSourceCard().getSVar(svarName), sa.getSourceCard());
final SpellAbility trigsa = AbilityFactory.getAbility(sa.getSourceCard().getSVar(svarName), sa.getSourceCard());
trigsa.setActivatingPlayer(ai);
if (!sa.hasParam("OptionalDecider")) {
@@ -38,7 +37,7 @@ public class DelayedTriggerAi extends SpellAiLogic {
@Override
protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) {
final String svarName = sa.getParam("Execute");
final SpellAbility trigsa = tempCreator.getAbility(sa.getSourceCard().getSVar(svarName), sa.getSourceCard());
final SpellAbility trigsa = AbilityFactory.getAbility(sa.getSourceCard().getSVar(svarName), sa.getSourceCard());
trigsa.setActivatingPlayer(ai);
return trigsa.canPlayAI();
}

View File

@@ -149,9 +149,8 @@ public class AnimateAllEffect extends AnimateEffectBase {
final ArrayList<SpellAbility> addedAbilities = new ArrayList<SpellAbility>();
if (abilities.size() > 0) {
for (final String s : abilities) {
final AbilityFactory newAF = new AbilityFactory();
final String actualAbility = host.getSVar(s);
final SpellAbility grantedAbility = newAF.getAbility(actualAbility, c);
final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, c);
addedAbilities.add(grantedAbility);
c.addSpellAbility(grantedAbility);
}

View File

@@ -163,9 +163,8 @@ public class AnimateEffect extends AnimateEffectBase {
final ArrayList<SpellAbility> addedAbilities = new ArrayList<SpellAbility>();
if (abilities.size() > 0) {
for (final String s : abilities) {
final AbilityFactory newAF = new AbilityFactory();
final String actualAbility = host.getSVar(s);
final SpellAbility grantedAbility = newAF.getAbility(actualAbility, c);
final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, c);
addedAbilities.add(grantedAbility);
c.addSpellAbility(grantedAbility);
}

View File

@@ -21,8 +21,7 @@ public class CharmEffect extends SpellEffect {
List<AbilitySub> choices = new ArrayList<AbilitySub>();
for (final String saChoice : saChoices) {
final String ab = source.getSVar(saChoice);
final AbilityFactory charmAF = new AbilityFactory();
choices.add((AbilitySub) charmAF.getAbility(ab, source));
choices.add((AbilitySub) AbilityFactory.getAbility(ab, source));
}
return choices;
}

View File

@@ -49,12 +49,11 @@ public class ChooseGenericEffect extends SpellEffect {
continue;
}
SpellAbility chosenSA = null;
AbilityFactory afChoice = new AbilityFactory();
if (p.isHuman()) {
String choice = GuiChoose.one("Choose one", choices.values());
chosenSA = afChoice.getAbility(host.getSVar(choices.inverse().get(choice)), host);
chosenSA = AbilityFactory.getAbility(host.getSVar(choices.inverse().get(choice)), host);
} else { //Computer AI
chosenSA = afChoice.getAbility(host.getSVar(sa.getParam("Choices").split(",")[0]), host);
chosenSA = AbilityFactory.getAbility(host.getSVar(sa.getParam("Choices").split(",")[0]), host);
}
chosenSA.setActivatingPlayer(sa.getSourceCard().getController());
((AbilitySub) chosenSA).setParent(sa);

View File

@@ -25,7 +25,6 @@ public class ClashEffect extends SpellEffect {
*/
@Override
public void resolve(SpellAbility sa) {
final AbilityFactory afOutcomes = new AbilityFactory();
final boolean victory = sa.getSourceCard().getController().clashWithOpponent(sa.getSourceCard());
// Run triggers
@@ -34,7 +33,7 @@ public class ClashEffect extends SpellEffect {
if (victory) {
if (sa.hasParam("WinSubAbility")) {
final SpellAbility win = afOutcomes.getAbility(
final SpellAbility win = AbilityFactory.getAbility(
sa.getSourceCard().getSVar(sa.getParam("WinSubAbility")), sa.getSourceCard());
win.setActivatingPlayer(sa.getSourceCard().getController());
((AbilitySub) win).setParent(sa);
@@ -44,7 +43,7 @@ public class ClashEffect extends SpellEffect {
runParams.put("Won", "True");
} else {
if (sa.hasParam("OtherwiseSubAbility")) {
final SpellAbility otherwise = afOutcomes.getAbility(
final SpellAbility otherwise = AbilityFactory.getAbility(
sa.getSourceCard().getSVar(sa.getParam("OtherwiseSubAbility")), sa.getSourceCard());
otherwise.setActivatingPlayer(sa.getSourceCard().getController());
((AbilitySub) otherwise).setParent(sa);

View File

@@ -120,10 +120,9 @@ public class EffectEffect extends SpellEffect {
// Grant abilities
if (effectAbilities != null) {
for (final String s : effectAbilities) {
final AbilityFactory abFactory = new AbilityFactory();
final String actualAbility = hostCard.getSVar(s);
final SpellAbility grantedAbility = abFactory.getAbility(actualAbility, eff);
final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, eff);
eff.addSpellAbility(grantedAbility);
}
}

View File

@@ -37,7 +37,6 @@ public class FlipCoinEffect extends SpellEffect {
caller.add(player);
}
final AbilityFactory afOutcomes = new AbilityFactory();
final boolean victory = GuiDialog.flipCoin(caller.get(0), sa.getSourceCard());
// Run triggers
@@ -52,7 +51,7 @@ public class FlipCoinEffect extends SpellEffect {
host.addRemembered(host);
}
if (sa.hasParam("WinSubAbility")) {
final SpellAbility win = afOutcomes.getAbility(host.getSVar(sa.getParam("WinSubAbility")), host);
final SpellAbility win = AbilityFactory.getAbility(host.getSVar(sa.getParam("WinSubAbility")), host);
win.setActivatingPlayer(player);
((AbilitySub) win).setParent(sa);
@@ -64,7 +63,7 @@ public class FlipCoinEffect extends SpellEffect {
host.addRemembered(host);
}
if (sa.hasParam("LoseSubAbility")) {
final SpellAbility lose = afOutcomes.getAbility(host.getSVar(sa.getParam("LoseSubAbility")), host);
final SpellAbility lose = AbilityFactory.getAbility(host.getSVar(sa.getParam("LoseSubAbility")), host);
lose.setActivatingPlayer(player);
((AbilitySub) lose).setParent(sa);

View File

@@ -25,11 +25,10 @@ public class RepeatEachEffect extends SpellEffect {
*/
@Override
public void resolve(SpellAbility sa) {
final AbilityFactory afRepeat = new AbilityFactory();
Card source = sa.getSourceCard();
// setup subability to repeat
final SpellAbility repeat = afRepeat.getAbility(sa.getSourceCard().getSVar(sa.getParam("RepeatSubAbility")), source);
final SpellAbility repeat = AbilityFactory.getAbility(sa.getSourceCard().getSVar(sa.getParam("RepeatSubAbility")), source);
repeat.setActivatingPlayer(sa.getActivatingPlayer());
((AbilitySub) repeat).setParent(sa);

View File

@@ -24,11 +24,10 @@ public class RepeatEffect extends SpellEffect {
@Override
public void resolve(SpellAbility sa) {
final AbilityFactory afRepeat = new AbilityFactory();
Card source = sa.getSourceCard();
// setup subability to repeat
final SpellAbility repeat = afRepeat.getAbility(sa.getSourceCard().getSVar(sa.getParam("RepeatSubAbility")), source);
final SpellAbility repeat = AbilityFactory.getAbility(sa.getSourceCard().getSVar(sa.getParam("RepeatSubAbility")), source);
repeat.setActivatingPlayer(sa.getActivatingPlayer());
((AbilitySub) repeat).setParent(sa);

View File

@@ -212,11 +212,10 @@ public class TokenEffect extends SpellEffect {
// Grant abilities
if (this.tokenAbilities != null) {
final AbilityFactory af = new AbilityFactory();
for (final String s : this.tokenAbilities) {
final String actualAbility = host.getSVar(s);
for (final Card c : tokens) {
final SpellAbility grantedAbility = af.getAbility(actualAbility, c);
final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, c);
c.addSpellAbility(grantedAbility);
// added ability to intrinsic list so copies and clones work
c.getIntrinsicAbilities().add(actualAbility);
@@ -234,7 +233,7 @@ public class TokenEffect extends SpellEffect {
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, c, true);
final String ability = host.getSVar(parsedTrigger.getMapParams().get("Execute"));
parsedTrigger.setOverridingAbility(new AbilityFactory().getAbility(ability, c));
parsedTrigger.setOverridingAbility(AbilityFactory.getAbility(ability, c));
c.addTrigger(parsedTrigger);
}
}

View File

@@ -137,8 +137,7 @@ public class TwoPilesEffect extends SpellEffect {
// take action on the chosen pile
if (sa.hasParam("ChosenPile")) {
final AbilityFactory afPile = new AbilityFactory();
final SpellAbility action = afPile.getAbility(card.getSVar(sa.getParam("ChosenPile")), card);
final SpellAbility action = AbilityFactory.getAbility(card.getSVar(sa.getParam("ChosenPile")), card);
action.setActivatingPlayer(sa.getActivatingPlayer());
((AbilitySub) action).setParent(sa);
@@ -158,8 +157,7 @@ public class TwoPilesEffect extends SpellEffect {
card.addRemembered(c);
}
}
final AbilityFactory afPile = new AbilityFactory();
final SpellAbility action = afPile.getAbility(card.getSVar(sa.getParam("UnchosenPile")), card);
final SpellAbility action = AbilityFactory.getAbility(card.getSVar(sa.getParam("UnchosenPile")), card);
action.setActivatingPlayer(sa.getActivatingPlayer());
((AbilitySub) action).setParent(sa);

View File

@@ -646,13 +646,12 @@ public class CardFactoryCreatures {
final StringBuilder keywordBuilder = new StringBuilder("HIDDEN CARDNAME can't block ");
keywordBuilder.append(this.getSourceCard().toString());
final AbilityFactory createAb = new AbilityFactory();
final StringBuilder abilityBuilder = new StringBuilder("AB$Pump | Cost$ ");
abilityBuilder.append(theCost);
abilityBuilder.append(" | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | KW$ ");
abilityBuilder.append(keywordBuilder.toString());
abilityBuilder.append(" | SpellDescription$ Target creature can't block CARDNAME this turn.");
final SpellAbility myAb = createAb.getAbility(abilityBuilder.toString(), card);
final SpellAbility myAb = AbilityFactory.getAbility(abilityBuilder.toString(), card);
myAb.getTarget().setTargetChoices(this.getChosenTarget().getTargetChoices());
myAb.resolve();

View File

@@ -957,8 +957,7 @@ public class CardFactoryUtil {
sb.append(" Discard<1/CARDNAME> | ActivationZone$ Hand | PrecostDesc$ Cycling ");
sb.append("| SpellDescription$ Draw a card.");
AbilityFactory af = new AbilityFactory();
SpellAbility cycle = af.getAbility(sb.toString(), sourceCard);
SpellAbility cycle = AbilityFactory.getAbility(sb.toString(), sourceCard);
cycle.setIsCycling(true);
return cycle;
@@ -992,8 +991,7 @@ public class CardFactoryUtil {
sb.append(" | SpellDescription$ Search your library for a ").append(desc).append(" card, reveal it,");
sb.append(" and put it into your hand. Then shuffle your library.");
AbilityFactory af = new AbilityFactory();
SpellAbility cycle = af.getAbility(sb.toString(), sourceCard);
SpellAbility cycle = AbilityFactory.getAbility(sb.toString(), sourceCard);
cycle.setIsCycling(true);
return cycle;
@@ -3685,9 +3683,8 @@ public class CardFactoryUtil {
final ArrayList<String> ia = card.getIntrinsicAbilities();
if (ia.size() > 0) {
for (int i = 0; i < ia.size(); i++) {
final AbilityFactory af = new AbilityFactory();
// System.out.println(cardName);
final SpellAbility sa = af.getAbility(ia.get(i), card);
final SpellAbility sa = AbilityFactory.getAbility(ia.get(i), card);
if (sa.hasParam("SetAsKicked")) {
sa.addOptionalAdditionalCosts("Kicker");
}
@@ -4154,12 +4151,11 @@ public class CardFactoryUtil {
card.addTrigger(haunterETB);
card.addTrigger(haunterDies);
} else {
final AbilityFactory af = new AbilityFactory();
final String abString = card.getSVar(hauntSVarName).replace("AB$", "SP$")
.replace("Cost$ 0", "Cost$ " + card.getManaCost())
+ " | SpellDescription$ " + abilityDescription;
final SpellAbility sa = af.getAbility(abString, card);
final SpellAbility sa = AbilityFactory.getAbility(abString, card);
card.addSpellAbility(sa);
}
@@ -4381,8 +4377,7 @@ public class CardFactoryUtil {
abilityStr.append("| PrecostDesc$ Equip | SpellDescription$ (Attach to target creature you control. Equip only as a sorcery.)");
}
// instantiate attach ability
final AbilityFactory af = new AbilityFactory();
final SpellAbility sa = af.getAbility(abilityStr.toString(), card);
final SpellAbility sa = AbilityFactory.getAbility(abilityStr.toString(), card);
card.addSpellAbility(sa);
// add ability to instrinic strings so copies/clones create the ability also
card.getIntrinsicAbilities().add(abilityStr.toString());
@@ -4393,8 +4388,7 @@ public class CardFactoryUtil {
if (kw.startsWith("ETBReplacement")) {
String[] splitkw = kw.split(":");
ReplacementLayer layer = ReplacementLayer.smartValueOf(splitkw[1]);
AbilityFactory af = new AbilityFactory();
SpellAbility repAb = af.getAbility(card.getSVar(splitkw[2]), card);
SpellAbility repAb = AbilityFactory.getAbility(card.getSVar(splitkw[2]), card);
String desc = repAb.getDescription();
setupETBReplacementAbility(repAb);

View File

@@ -184,9 +184,7 @@ public class ReplacementHandler {
final String effectSVar = mapParams.get("ReplaceWith");
final String effectAbString = replacementEffect.getHostCard().getSVar(effectSVar);
final AbilityFactory abilityFactory = new AbilityFactory();
effectSA = abilityFactory.getAbility(effectAbString, replacementEffect.getHostCard());
effectSA = AbilityFactory.getAbility(effectAbString, replacementEffect.getHostCard());
effectSA.setTrigger(true);
SpellAbility tailend = effectSA;

View File

@@ -474,12 +474,11 @@ public class SpellPermanent extends Spell {
}
// Maybe better considerations
final AbilityFactory af = new AbilityFactory();
final String execute = params.get("Execute");
if (execute == null) {
continue;
}
final SpellAbility exSA = af.getAbility(card.getSVar(execute), card);
final SpellAbility exSA = AbilityFactory.getAbility(card.getSVar(execute), card);
if (api != null) {
if (exSA.getApi() != api) {

View File

@@ -390,8 +390,7 @@ public class StaticAbilityContinuous {
if (addAbilities != null) {
for (final String abilty : addAbilities) {
if (abilty.startsWith("AB")) { // grant the ability
final AbilityFactory af = new AbilityFactory();
final SpellAbility sa = af.getAbility(abilty, affectedCard);
final SpellAbility sa = AbilityFactory.getAbility(abilty, affectedCard);
sa.setType("Temporary");
sa.setOriginalHost(hostCard);
affectedCard.addSpellAbility(sa);

View File

@@ -478,8 +478,6 @@ public class TriggerHandler {
}
}
final AbilityFactory abilityFactory = new AbilityFactory();
SpellAbility sa = null;
Card host = game.getCardState(regtrig.getHostCard());
@@ -496,7 +494,7 @@ public class TriggerHandler {
}
};
} else {
sa = abilityFactory.getAbility(host.getSVar(triggerParams.get("Execute")), host);
sa = AbilityFactory.getAbility(host.getSVar(triggerParams.get("Execute")), host);
}
}
sa.setTrigger(true);

View File

@@ -119,7 +119,6 @@ public class InputMulligan extends Input {
// Human Leylines & Chancellors
ButtonUtil.reset();
final AbilityFactory af = new AbilityFactory();
final GameAction ga = game.getAction();
for (Player p : game.getPlayers()) {
@@ -134,7 +133,7 @@ public class InputMulligan extends Input {
if (kw.startsWith("MayEffectFromOpeningHand")) {
final String effName = kw.split(":")[1];
final SpellAbility effect = af.getAbility(c.getSVar(effName), c);
final SpellAbility effect = AbilityFactory.getAbility(c.getSVar(effName), c);
if (GuiDialog.confirm(c, "Use this card's ability?")) {
// If we ever let the AI memorize cards in the players
// hand, this would be a place to do so.
@@ -156,7 +155,7 @@ public class InputMulligan extends Input {
if (kw.startsWith("MayEffectFromOpeningHand")) {
final String effName = kw.split(":")[1];
final SpellAbility effect = af.getAbility(c.getSVar(effName), c);
final SpellAbility effect = AbilityFactory.getAbility(c.getSVar(effName), c);
// Is there a better way for the AI to decide this?
if (effect.doTrigger(false, (AIPlayer)p)) {

View File

@@ -1172,8 +1172,7 @@ public final class GameActionUtil {
for (String landType : Constant.Color.BASIC_LANDS) {
if (land.isType(landType)) {
final AbilityFactory af = new AbilityFactory();
final SpellAbility sa = af.getAbility("AB$ Mana | Cost$ T | Produced$ " + produces.get(landType)
final SpellAbility sa = AbilityFactory.getAbility("AB$ Mana | Cost$ T | Produced$ " + produces.get(landType)
+ " | SpellDescription$ Add " + produces.get(landType) + " to your mana pool.", land);
sa.setType("BasicLandTypeMana");
land.addSpellAbility(sa);
@@ -1336,8 +1335,7 @@ public final class GameActionUtil {
}
String newSubSAString = c.getCharacteristics().getIntrinsicAbility().get(0);
newSubSAString = newSubSAString.replace("SP", "DB");
final AbilityFactory af = new AbilityFactory();
final AbilitySub newSubSA = (AbilitySub) af.getAbility(newSubSAString, source);
final AbilitySub newSubSA = (AbilitySub) AbilityFactory.getAbility(newSubSAString, source);
ArrayList<SpellAbility> addSAs = new ArrayList<SpellAbility>();
// Add the subability to all existing variants
for (SpellAbility s : allSAs) {