refactor AF:Effect (wish I knew what it is)

This commit is contained in:
Maxmtg
2012-10-30 08:06:19 +00:00
parent 5e03520923
commit 2139345166
5 changed files with 426 additions and 602 deletions

3
.gitattributes vendored
View File

@@ -12474,7 +12474,6 @@ src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java svneol=nat
src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java svneol=native#text/plain
src/main/java/forge/card/abilityfactory/AbilityFactoryDelayedTrigger.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryDelayedTrigger.java svneol=native#text/plain
src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java svneol=native#text/plain
src/main/java/forge/card/abilityfactory/AbilityFactoryEffect.java svneol=native#text/plain
src/main/java/forge/card/abilityfactory/AbilityFactoryEndGameCondition.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryEndGameCondition.java svneol=native#text/plain
src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java svneol=native#text/plain
src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java svneol=native#text/plain
@@ -12507,6 +12506,7 @@ src/main/java/forge/card/abilityfactory/ai/DamagePreventAllAi.java -text
src/main/java/forge/card/abilityfactory/ai/DiscardAi.java -text src/main/java/forge/card/abilityfactory/ai/DiscardAi.java -text
src/main/java/forge/card/abilityfactory/ai/DrainManaAi.java -text src/main/java/forge/card/abilityfactory/ai/DrainManaAi.java -text
src/main/java/forge/card/abilityfactory/ai/DrawAi.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/ai/DrawAi.java svneol=native#text/plain
src/main/java/forge/card/abilityfactory/ai/EffectAi.java -text
src/main/java/forge/card/abilityfactory/ai/EndTurnAi.java -text src/main/java/forge/card/abilityfactory/ai/EndTurnAi.java -text
src/main/java/forge/card/abilityfactory/ai/LifeExchangeAi.java -text src/main/java/forge/card/abilityfactory/ai/LifeExchangeAi.java -text
src/main/java/forge/card/abilityfactory/ai/LifeGainAi.java -text src/main/java/forge/card/abilityfactory/ai/LifeGainAi.java -text
@@ -12534,6 +12534,7 @@ src/main/java/forge/card/abilityfactory/effects/DamagePreventEffect.java -text
src/main/java/forge/card/abilityfactory/effects/DiscardEffect.java -text src/main/java/forge/card/abilityfactory/effects/DiscardEffect.java -text
src/main/java/forge/card/abilityfactory/effects/DrainManaEffect.java -text src/main/java/forge/card/abilityfactory/effects/DrainManaEffect.java -text
src/main/java/forge/card/abilityfactory/effects/DrawEffect.java -text src/main/java/forge/card/abilityfactory/effects/DrawEffect.java -text
src/main/java/forge/card/abilityfactory/effects/EffectEffect.java -text
src/main/java/forge/card/abilityfactory/effects/EndTurnEffect.java -text src/main/java/forge/card/abilityfactory/effects/EndTurnEffect.java -text
src/main/java/forge/card/abilityfactory/effects/HelperAnimate.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/effects/HelperAnimate.java svneol=native#text/plain
src/main/java/forge/card/abilityfactory/effects/LifeExchangeEffect.java -text src/main/java/forge/card/abilityfactory/effects/LifeExchangeEffect.java -text

View File

@@ -723,13 +723,8 @@ public class AbilityFactory {
} }
else if (this.api.equals("Effect")) { else if (this.api.equals("Effect")) {
if (this.isAb) { ai = new EffectAi();
spellAbility = AbilityFactoryEffect.createAbilityEffect(this); se = new EffectEffect();
} else if (this.isSp) {
spellAbility = AbilityFactoryEffect.createSpellEffect(this);
} else if (this.isDb) {
spellAbility = AbilityFactoryEffect.createDrawbackEffect(this);
}
} }
else if (this.api.equals("EndTurn")) { else if (this.api.equals("EndTurn")) {

View File

@@ -1,594 +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 <http://www.gnu.org/licenses/>.
*/
package forge.card.abilityfactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import com.google.common.base.Predicate;
import forge.Card;
import forge.CardLists;
import forge.Command;
import forge.Singletons;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.cost.Cost;
import forge.card.replacement.ReplacementEffect;
import forge.card.replacement.ReplacementHandler;
import forge.card.spellability.AbilityActivated;
import forge.card.spellability.AbilitySub;
import forge.card.spellability.Spell;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler;
import forge.card.trigger.TriggerType;
import forge.game.GameState;
import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
/**
* <p>
* AbilityFactoryEffect class.
* </p>
*
* @author Forge
* @version $Id$
*/
public class AbilityFactoryEffect {
/**
* <p>
* createAbilityEffect.
* </p>
*
* @param abilityFactory
* a {@link forge.card.abilityfactory.AbilityFactory} object.
* @return a {@link forge.card.spellability.SpellAbility} object.
*/
public static SpellAbility createAbilityEffect(final AbilityFactory abilityFactory) {
class AbilityEffect extends AbilityActivated {
public AbilityEffect(final Card ca, final Cost co, final Target t) {
super(ca, co, t);
}
@Override
public AbilityActivated getCopy() {
AbilityActivated res = new AbilityEffect(getSourceCard(),
getPayCosts(), getTarget() == null ? null : new Target(getTarget()));
CardFactoryUtil.copySpellAbility(this, res);
return res;
}
private static final long serialVersionUID = 8869422603616247307L;
private final AbilityFactory af = abilityFactory;
@Override
public String getStackDescription() {
// when getStackDesc is called, just build exactly what is
// happening
return AbilityFactoryEffect.effectStackDescription(this.af, this);
}
@Override
public boolean canPlayAI() {
return AbilityFactoryEffect.effectCanPlayAI(getActivatingPlayer(), this.af, this);
}
@Override
public void resolve() {
AbilityFactoryEffect.effectResolve(this.af, this);
}
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryEffect.effectDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
}
}
final SpellAbility abEffect = new AbilityEffect(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
abilityFactory.getAbTgt());
return abEffect;
}
/**
* <p>
* createSpellEffect.
* </p>
*
* @param abilityFactory
* a {@link forge.card.abilityfactory.AbilityFactory} object.
* @return a {@link forge.card.spellability.SpellAbility} object.
*/
public static SpellAbility createSpellEffect(final AbilityFactory abilityFactory) {
final SpellAbility spEffect = new Spell(abilityFactory.getHostCard(), abilityFactory.getAbCost(),
abilityFactory.getAbTgt()) {
private static final long serialVersionUID = 6631124959690157874L;
private final AbilityFactory af = abilityFactory;
@Override
public String getStackDescription() {
// when getStackDesc is called, just build exactly what is
// happening
return AbilityFactoryEffect.effectStackDescription(this.af, this);
}
@Override
public boolean canPlayAI() {
return AbilityFactoryEffect.effectCanPlayAI(getActivatingPlayer(), this.af, this);
}
@Override
public void resolve() {
AbilityFactoryEffect.effectResolve(this.af, this);
}
};
return spEffect;
}
/**
* <p>
* createDrawbackEffect.
* </p>
*
* @param abilityFactory
* a {@link forge.card.abilityfactory.AbilityFactory} object.
* @return a {@link forge.card.spellability.SpellAbility} object.
*/
public static SpellAbility createDrawbackEffect(final AbilityFactory abilityFactory) {
class DrawbackEffect extends AbilitySub {
public DrawbackEffect(final Card ca, final Target t) {
super(ca, t);
}
@Override
public AbilitySub getCopy() {
AbilitySub res = new DrawbackEffect(getSourceCard(),
getTarget() == null ? null : new Target(getTarget()));
CardFactoryUtil.copySpellAbility(this, res);
return res;
}
private static final long serialVersionUID = 6631124959690157874L;
private final AbilityFactory af = abilityFactory;
@Override
public String getStackDescription() {
// when getStackDesc is called, just build exactly what is
// happening
return AbilityFactoryEffect.effectStackDescription(this.af, this);
}
@Override
public boolean canPlayAI() {
return AbilityFactoryEffect.effectCanPlayAI(getActivatingPlayer(), this.af, this);
}
@Override
public void resolve() {
AbilityFactoryEffect.effectResolve(this.af, this);
}
@Override
public boolean chkAIDrawback() {
return true;
}
@Override
public boolean doTrigger(final boolean mandatory) {
return AbilityFactoryEffect.effectDoTriggerAI(getActivatingPlayer(), this.af, this, mandatory);
}
}
final SpellAbility dbEffect = new DrawbackEffect(abilityFactory.getHostCard(), abilityFactory.getAbTgt());
return dbEffect;
}
/**
* <p>
* effectStackDescription.
* </p>
*
* @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.
*/
public static String effectStackDescription(final AbilityFactory af, final SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
if (sa instanceof AbilitySub) {
sb.append(" ");
} else {
sb.append(sa.getSourceCard().getName()).append(" - ");
}
sb.append(sa.getDescription());
final AbilitySub abSub = sa.getSubAbility();
if (abSub != null) {
sb.append(abSub.getStackDescription());
}
return sb.toString();
}
/**
* <p>
* effectCanPlayAI.
* </p>
*
* @param af
* a {@link forge.card.abilityfactory.AbilityFactory} object.
* @param sa
* a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean.
*/
public static boolean effectCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) {
final GameState game = Singletons.getModel().getGame();
final Random r = MyRandom.getRandom();
final HashMap<String, String> params = af.getMapParams();
boolean randomReturn = r.nextFloat() <= .6667;
final Player opp = ai.getOpponent();
String logic = "";
if (params.containsKey("AILogic")) {
logic = params.get("AILogic");
final PhaseHandler phase = game.getPhaseHandler();
if (logic.equals("BeginningOfOppTurn")) {
if (phase.isPlayerTurn(ai.getOpponent()) || phase.getPhase().isAfter(PhaseType.DRAW)) {
return false;
}
randomReturn = true;
} else if (logic.equals("Fog")) {
if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) {
return false;
}
if (!game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) {
return false;
}
if (game.getStack().size() != 0) {
return false;
}
if (game.getPhaseHandler().isPreventCombatDamageThisTurn()) {
return false;
}
if (!CombatUtil.lifeInDanger(ai, game.getCombat())) {
return false;
}
final Target tgt = sa.getTarget();
if (tgt != null) {
tgt.resetTargets();
List<Card> list = game.getCombat().getAttackerList();
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard());
list = CardLists.getTargetableCards(list, sa);
Card target = CardFactoryUtil.getBestCreatureAI(list);
if (target == null) {
return false;
}
tgt.addTarget(target);
}
randomReturn = true;
} else if (logic.equals("Always")) {
randomReturn = true;
} else if (logic.equals("Evasion")) {
List<Card> comp = ai.getCreaturesInPlay();
List<Card> human = opp.getCreaturesInPlay();
// only count creatures that can attack or block
comp = CardLists.filter(comp, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
return CombatUtil.canAttack(c, opp);
}
});
human = CardLists.filter(human, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
return CombatUtil.canBlock(c);
}
});
if (comp.size() < 2 || human.size() < 1) {
randomReturn = false;
}
}
} else { //no AILogic
return false;
}
final String stackable = params.get("Stackable");
if ((stackable != null) && stackable.equals("False")) {
String name = params.get("Name");
if (name == null) {
name = sa.getSourceCard().getName() + "'s Effect";
}
final List<Card> list = sa.getActivatingPlayer().getCardsIn(ZoneType.Battlefield, name);
if (list.size() != 0) {
return false;
}
}
final Target tgt = sa.getTarget();
if (tgt != null && tgt.canTgtPlayer()) {
tgt.resetTargets();
if (tgt.canOnlyTgtOpponent() || logic.equals("BeginningOfOppTurn")) {
tgt.addTarget(ai.getOpponent());
} else {
tgt.addTarget(ai);
}
}
final AbilitySub subAb = sa.getSubAbility();
if (subAb != null) {
randomReturn &= subAb.chkAIDrawback();
}
return randomReturn;
}
/**
* <p>
* effectDoTriggerAI.
* </p>
*
* @param af
* a {@link forge.card.abilityfactory.AbilityFactory} object.
* @param sa
* a {@link forge.card.spellability.SpellAbility} object.
* @param mandatory
* a boolean.
* @return a boolean.
*/
public static boolean effectDoTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) {
if (!ComputerUtil.canPayCost(sa, ai) && !mandatory) {
// payment it's usually
// not mandatory
return false;
}
// TODO: Add targeting effects
// check SubAbilities DoTrigger?
final AbilitySub abSub = sa.getSubAbility();
if (abSub != null) {
return abSub.doTrigger(mandatory);
}
return true;
}
/**
* <p>
* effectResolve.
* </p>
*
* @param af
* a {@link forge.card.abilityfactory.AbilityFactory} object.
* @param sa
* a {@link forge.card.spellability.SpellAbility} object.
*/
public static void effectResolve(final AbilityFactory af, final SpellAbility sa) {
final HashMap<String, String> params = af.getMapParams();
final Card card = af.getHostCard();
String[] effectAbilities = null;
String[] effectTriggers = null;
String[] effectSVars = null;
String[] effectKeywords = null;
String[] effectStaticAbilities = null;
String[] effectReplacementEffects = null;
String effectRemembered = null;
String effectImprinted = null;
Player ownerEff = null;
if (params.containsKey("Abilities")) {
effectAbilities = params.get("Abilities").split(",");
}
if (params.containsKey("Triggers")) {
effectTriggers = params.get("Triggers").split(",");
}
if (params.containsKey("StaticAbilities")) {
effectStaticAbilities = params.get("StaticAbilities").split(",");
}
if (params.containsKey("ReplacementEffects")) {
effectReplacementEffects = params.get("ReplacementEffects").split(",");
}
if (params.containsKey("SVars")) {
effectSVars = params.get("SVars").split(",");
}
if (params.containsKey("Keywords")) {
effectKeywords = params.get("Keywords").split(",");
}
if (params.containsKey("RememberObjects")) {
effectRemembered = params.get("RememberObjects");
}
if (params.containsKey("ImprintCards")) {
effectImprinted = params.get("ImprintCards");
}
// Effect eff = new Effect();
String name = params.get("Name");
if (name == null) {
name = sa.getSourceCard().getName() + "'s Effect";
}
// Unique Effects shouldn't be duplicated
if (params.containsKey("Unique") && Singletons.getModel().getGame().isCardInPlay(name)) {
return;
}
if (params.containsKey("EffectOwner")) {
ArrayList<Player> effectOwner;
effectOwner = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("EffectOwner"), sa);
ownerEff = effectOwner.get(0);
}
final Player controller = params.containsKey("EffectOwner") ? ownerEff : sa.getActivatingPlayer();
final Card eff = new Card();
eff.setName(name);
eff.addType("Effect"); // Or Emblem
eff.setToken(true); // Set token to true, so when leaving play it gets
// nuked
eff.addController(controller);
eff.setOwner(controller);
eff.setImageName(card.getImageName());
eff.setColor(card.getColor());
eff.setImmutable(true);
eff.setEffectSource(card);
if (params.containsKey("Image")) {
eff.setImageName(params.get("Image"));
}
// Effects should be Orange or something probably
final Card e = eff;
// Abilities, triggers and SVars work the same as they do for Token
// Grant abilities
if (effectAbilities != null) {
for (final String s : effectAbilities) {
final AbilityFactory abFactory = new AbilityFactory();
final String actualAbility = af.getHostCard().getSVar(s);
final SpellAbility grantedAbility = abFactory.getAbility(actualAbility, eff);
eff.addSpellAbility(grantedAbility);
}
}
// Grant triggers
if (effectTriggers != null) {
for (final String s : effectTriggers) {
final String actualTrigger = af.getHostCard().getSVar(s);
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, eff, true);
eff.addTrigger(parsedTrigger);
}
}
// Grant static abilities
if (effectStaticAbilities != null) {
for (final String s : effectStaticAbilities) {
eff.addStaticAbility(af.getHostCard().getSVar(s));
}
}
// Grant replacement effects
if (effectReplacementEffects != null) {
for (final String s : effectReplacementEffects) {
final String actualReplacement = af.getHostCard().getSVar(s);
final ReplacementEffect parsedReplacement = ReplacementHandler.parseReplacement(actualReplacement, eff);
eff.addReplacementEffect(parsedReplacement);
}
}
// Grant SVars
if (effectSVars != null) {
for (final String s : effectSVars) {
final String actualSVar = af.getHostCard().getSVar(s);
eff.setSVar(s, actualSVar);
}
}
// Grant Keywords
if (effectKeywords != null) {
for (final String s : effectKeywords) {
final String actualKeyword = af.getHostCard().getSVar(s);
eff.addIntrinsicKeyword(actualKeyword);
}
}
// Set Remembered
if (effectRemembered != null) {
for (final Object o : AbilityFactory.getDefinedObjects(card, effectRemembered, sa)) {
eff.addRemembered(o);
}
}
// Set Imprinted
if (effectImprinted != null) {
for (final Card c : AbilityFactory.getDefinedCards(card, effectImprinted, sa)) {
eff.addImprinted(c);
}
}
// Set Chosen Color(s)
if (!card.getChosenColor().isEmpty()) {
eff.setChosenColor(card.getChosenColor());
}
// Remember created effect
if (params.containsKey("RememberEffect")) {
Singletons.getModel().getGame().getCardState(card).addRemembered(eff);
}
// Duration
final String duration = params.get("Duration");
if ((duration == null) || !duration.equals("Permanent")) {
final Command endEffect = new Command() {
private static final long serialVersionUID = -5861759814760561373L;
@Override
public void execute() {
Singletons.getModel().getGame().getAction().exile(e);
}
};
if ((duration == null) || duration.equals("EndOfTurn")) {
Singletons.getModel().getGame().getEndOfTurn().addUntil(endEffect);
}
else if (duration.equals("UntilHostLeavesPlay")) {
card.addLeavesPlayCommand(endEffect);
}
else if (duration.equals("HostLeavesOrEOT")) {
Singletons.getModel().getGame().getEndOfTurn().addUntil(endEffect);
card.addLeavesPlayCommand(endEffect);
}
else if (duration.equals("UntilYourNextTurn")) {
Singletons.getModel().getGame().getCleanup().addUntilYourNextTurn(controller, endEffect);
}
}
// TODO: Add targeting to the effect so it knows who it's dealing with
Singletons.getModel().getGame().getTriggerHandler().suppressMode(TriggerType.ChangesZone);
Singletons.getModel().getGame().getAction().moveToPlay(eff);
Singletons.getModel().getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
}
} // end class AbilityFactoryEffect

View File

@@ -0,0 +1,164 @@
package forge.card.abilityfactory.ai;
import java.util.List;
import java.util.Random;
import com.google.common.base.Predicate;
import forge.Card;
import forge.CardLists;
import forge.Singletons;
import forge.card.abilityfactory.SpellAiLogic;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target;
import forge.game.GameState;
import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
public class EffectAi extends SpellAiLogic {
/**
* <p>
* effectCanPlayAI.
* </p>
*
* @param af
* a {@link forge.card.abilityfactory.AbilityFactory} object.
* @param sa
* a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean.
*/
@Override
public boolean canPlayAI(Player ai, java.util.Map<String,String> params, SpellAbility sa) {
final GameState game = Singletons.getModel().getGame();
final Random r = MyRandom.getRandom();
boolean randomReturn = r.nextFloat() <= .6667;
final Player opp = ai.getOpponent();
String logic = "";
if (params.containsKey("AILogic")) {
logic = params.get("AILogic");
final PhaseHandler phase = game.getPhaseHandler();
if (logic.equals("BeginningOfOppTurn")) {
if (phase.isPlayerTurn(ai.getOpponent()) || phase.getPhase().isAfter(PhaseType.DRAW)) {
return false;
}
randomReturn = true;
} else if (logic.equals("Fog")) {
if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) {
return false;
}
if (!game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) {
return false;
}
if (game.getStack().size() != 0) {
return false;
}
if (game.getPhaseHandler().isPreventCombatDamageThisTurn()) {
return false;
}
if (!CombatUtil.lifeInDanger(ai, game.getCombat())) {
return false;
}
final Target tgt = sa.getTarget();
if (tgt != null) {
tgt.resetTargets();
List<Card> list = game.getCombat().getAttackerList();
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard());
list = CardLists.getTargetableCards(list, sa);
Card target = CardFactoryUtil.getBestCreatureAI(list);
if (target == null) {
return false;
}
tgt.addTarget(target);
}
randomReturn = true;
} else if (logic.equals("Always")) {
randomReturn = true;
} else if (logic.equals("Evasion")) {
List<Card> comp = ai.getCreaturesInPlay();
List<Card> human = opp.getCreaturesInPlay();
// only count creatures that can attack or block
comp = CardLists.filter(comp, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
return CombatUtil.canAttack(c, opp);
}
});
human = CardLists.filter(human, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
return CombatUtil.canBlock(c);
}
});
if (comp.size() < 2 || human.size() < 1) {
randomReturn = false;
}
}
} else { //no AILogic
return false;
}
final String stackable = params.get("Stackable");
if ((stackable != null) && stackable.equals("False")) {
String name = params.get("Name");
if (name == null) {
name = sa.getSourceCard().getName() + "'s Effect";
}
final List<Card> list = sa.getActivatingPlayer().getCardsIn(ZoneType.Battlefield, name);
if (list.size() != 0) {
return false;
}
}
final Target tgt = sa.getTarget();
if (tgt != null && tgt.canTgtPlayer()) {
tgt.resetTargets();
if (tgt.canOnlyTgtOpponent() || logic.equals("BeginningOfOppTurn")) {
tgt.addTarget(ai.getOpponent());
} else {
tgt.addTarget(ai);
}
}
final AbilitySub subAb = sa.getSubAbility();
if (subAb != null) {
randomReturn &= subAb.chkAIDrawback();
}
return randomReturn;
}
/**
* <p>
* effectDoTriggerAI.
* </p>
*
* @param af
* a {@link forge.card.abilityfactory.AbilityFactory} object.
* @param sa
* a {@link forge.card.spellability.SpellAbility} object.
* @param mandatory
* a boolean.
* @return a boolean.
*/
@Override
public boolean doTriggerAINoCost(Player aiPlayer, java.util.Map<String,String> params, SpellAbility sa, boolean mandatory) {
// TODO: Add targeting effects
// check SubAbilities DoTrigger?
final AbilitySub abSub = sa.getSubAbility();
if (abSub != null) {
return abSub.doTrigger(mandatory);
}
return true;
}
}

View File

@@ -0,0 +1,258 @@
package forge.card.abilityfactory.effects;
import java.util.ArrayList;
import forge.Card;
import forge.Command;
import forge.Singletons;
import forge.card.abilityfactory.AbilityFactory;
import forge.card.abilityfactory.SpellEffect;
import forge.card.replacement.ReplacementEffect;
import forge.card.replacement.ReplacementHandler;
import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler;
import forge.card.trigger.TriggerType;
import forge.game.player.Player;
public class EffectEffect extends SpellEffect {
/**
* <p>
* effectStackDescription.
* </p>
*
* @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.
*/
@Override
public String getStackDescription(java.util.Map<String,String> params, SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
if (sa instanceof AbilitySub) {
sb.append(" ");
} else {
sb.append(sa.getSourceCard().getName()).append(" - ");
}
sb.append(sa.getDescription());
final AbilitySub abSub = sa.getSubAbility();
if (abSub != null) {
sb.append(abSub.getStackDescription());
}
return sb.toString();
}
/**
* <p>
* effectResolve.
* </p>
*
* @param af
* a {@link forge.card.abilityfactory.AbilityFactory} object.
* @param sa
* a {@link forge.card.spellability.SpellAbility} object.
*/
@Override
public void resolve(java.util.Map<String,String> params, SpellAbility sa) {
final Card hostCard = sa.getAbilityFactory().getHostCard();
String[] effectAbilities = null;
String[] effectTriggers = null;
String[] effectSVars = null;
String[] effectKeywords = null;
String[] effectStaticAbilities = null;
String[] effectReplacementEffects = null;
String effectRemembered = null;
String effectImprinted = null;
Player ownerEff = null;
if (params.containsKey("Abilities")) {
effectAbilities = params.get("Abilities").split(",");
}
if (params.containsKey("Triggers")) {
effectTriggers = params.get("Triggers").split(",");
}
if (params.containsKey("StaticAbilities")) {
effectStaticAbilities = params.get("StaticAbilities").split(",");
}
if (params.containsKey("ReplacementEffects")) {
effectReplacementEffects = params.get("ReplacementEffects").split(",");
}
if (params.containsKey("SVars")) {
effectSVars = params.get("SVars").split(",");
}
if (params.containsKey("Keywords")) {
effectKeywords = params.get("Keywords").split(",");
}
if (params.containsKey("RememberObjects")) {
effectRemembered = params.get("RememberObjects");
}
if (params.containsKey("ImprintCards")) {
effectImprinted = params.get("ImprintCards");
}
// Effect eff = new Effect();
String name = params.get("Name");
if (name == null) {
name = sa.getSourceCard().getName() + "'s Effect";
}
// Unique Effects shouldn't be duplicated
if (params.containsKey("Unique") && Singletons.getModel().getGame().isCardInPlay(name)) {
return;
}
if (params.containsKey("EffectOwner")) {
ArrayList<Player> effectOwner;
effectOwner = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("EffectOwner"), sa);
ownerEff = effectOwner.get(0);
}
final Player controller = params.containsKey("EffectOwner") ? ownerEff : sa.getActivatingPlayer();
final Card eff = new Card();
eff.setName(name);
eff.addType("Effect"); // Or Emblem
eff.setToken(true); // Set token to true, so when leaving play it gets
// nuked
eff.addController(controller);
eff.setOwner(controller);
eff.setImageName(hostCard.getImageName());
eff.setColor(hostCard.getColor());
eff.setImmutable(true);
eff.setEffectSource(hostCard);
if (params.containsKey("Image")) {
eff.setImageName(params.get("Image"));
}
// Effects should be Orange or something probably
final Card e = eff;
// Abilities, triggers and SVars work the same as they do for Token
// 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);
eff.addSpellAbility(grantedAbility);
}
}
// Grant triggers
if (effectTriggers != null) {
for (final String s : effectTriggers) {
final String actualTrigger = hostCard.getSVar(s);
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, eff, true);
eff.addTrigger(parsedTrigger);
}
}
// Grant static abilities
if (effectStaticAbilities != null) {
for (final String s : effectStaticAbilities) {
eff.addStaticAbility(hostCard.getSVar(s));
}
}
// Grant replacement effects
if (effectReplacementEffects != null) {
for (final String s : effectReplacementEffects) {
final String actualReplacement = hostCard.getSVar(s);
final ReplacementEffect parsedReplacement = ReplacementHandler.parseReplacement(actualReplacement, eff);
eff.addReplacementEffect(parsedReplacement);
}
}
// Grant SVars
if (effectSVars != null) {
for (final String s : effectSVars) {
final String actualSVar = hostCard.getSVar(s);
eff.setSVar(s, actualSVar);
}
}
// Grant Keywords
if (effectKeywords != null) {
for (final String s : effectKeywords) {
final String actualKeyword = hostCard.getSVar(s);
eff.addIntrinsicKeyword(actualKeyword);
}
}
// Set Remembered
if (effectRemembered != null) {
for (final Object o : AbilityFactory.getDefinedObjects(hostCard, effectRemembered, sa)) {
eff.addRemembered(o);
}
}
// Set Imprinted
if (effectImprinted != null) {
for (final Card c : AbilityFactory.getDefinedCards(hostCard, effectImprinted, sa)) {
eff.addImprinted(c);
}
}
// Set Chosen Color(s)
if (!hostCard.getChosenColor().isEmpty()) {
eff.setChosenColor(hostCard.getChosenColor());
}
// Remember created effect
if (params.containsKey("RememberEffect")) {
Singletons.getModel().getGame().getCardState(hostCard).addRemembered(eff);
}
// Duration
final String duration = params.get("Duration");
if ((duration == null) || !duration.equals("Permanent")) {
final Command endEffect = new Command() {
private static final long serialVersionUID = -5861759814760561373L;
@Override
public void execute() {
Singletons.getModel().getGame().getAction().exile(e);
}
};
if ((duration == null) || duration.equals("EndOfTurn")) {
Singletons.getModel().getGame().getEndOfTurn().addUntil(endEffect);
}
else if (duration.equals("UntilHostLeavesPlay")) {
hostCard.addLeavesPlayCommand(endEffect);
}
else if (duration.equals("HostLeavesOrEOT")) {
Singletons.getModel().getGame().getEndOfTurn().addUntil(endEffect);
hostCard.addLeavesPlayCommand(endEffect);
}
else if (duration.equals("UntilYourNextTurn")) {
Singletons.getModel().getGame().getCleanup().addUntilYourNextTurn(controller, endEffect);
}
}
// TODO: Add targeting to the effect so it knows who it's dealing with
Singletons.getModel().getGame().getTriggerHandler().suppressMode(TriggerType.ChangesZone);
Singletons.getModel().getGame().getAction().moveToPlay(eff);
Singletons.getModel().getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
}
} // end class AbilityFactoryEffect