package forge.card.abilityFactory;
import forge.AllZone;
import forge.card.spellability.Ability_Activated;
import forge.card.spellability.Ability_Sub;
import forge.card.spellability.Spell;
import forge.card.spellability.SpellAbility;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler;
import java.util.HashMap;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 5/18/11
* Time: 8:53 PM
* To change this template use File | Settings | File Templates.
*
* @author Forge
* @version $Id: $
*/
public class AbilityFactory_DelayedTrigger {
/** Constant <code>tempCreator</code> */
private static AbilityFactory tempCreator = new AbilityFactory();
/**
* <p>getAbility.</p>
*
* @param af a {@link forge.card.abilityFactory.AbilityFactory} object.
* @return a {@link forge.card.spellability.SpellAbility} object.
* @since 1.0.15
*/
public static SpellAbility getAbility(final AbilityFactory af) {
final SpellAbility ability = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) {
private static final long serialVersionUID = -7502962478028160305L;
@Override
public boolean canPlayAI() {
return delTrigCanPlayAI(af, this);
}
@Override
public void resolve() {
doResolve(af, this);
}
@Override
public String getStackDescription() {
return delTrigStackDescription(af, this);
}
@Override
public boolean doTrigger(boolean mandatory) {
return doTriggerAI(af, this, mandatory);
}
};
return ability;
}
/**
* <p>getSpell.</p>
*
* @param af a {@link forge.card.abilityFactory.AbilityFactory} object.
* @return a {@link forge.card.spellability.SpellAbility} object.
* @since 1.0.15
*/
public static SpellAbility getSpell(final AbilityFactory af) {
final SpellAbility spell = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) {
private static final long serialVersionUID = -6981410664429186904L;
@Override
public boolean canPlayAI() {
return delTrigCanPlayAI(af, this);
}
@Override
public void resolve() {
doResolve(af, this);
}
@Override
public String getStackDescription() {
return delTrigStackDescription(af, this);
}
};
return spell;
}
/**
* <p>getDrawback.</p>
*
* @param AF a {@link forge.card.abilityFactory.AbilityFactory} object.
* @return a {@link forge.card.spellability.Ability_Sub} object.
*/
public static Ability_Sub getDrawback(final AbilityFactory AF) {
final Ability_Sub drawback = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) {
private static final long serialVersionUID = 6192972525033429820L;
@Override
public boolean chkAI_Drawback() {
return doChkAI_Drawback(AF, this);
}
@Override
public boolean doTrigger(boolean mandatory) {
return doTriggerAI(AF, this, mandatory);
}
@Override
public void resolve() {
doResolve(AF, this);
}
};
return drawback;
}
/**
* <p>doChkAI_Drawback.</p>
*
* @param AF a {@link forge.card.abilityFactory.AbilityFactory} object.
* @param SA a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean.
*/
private static boolean doChkAI_Drawback(final AbilityFactory AF, final SpellAbility SA) {
HashMap<String, String> params = AF.getMapParams();
String svarName = params.get("Execute");
SpellAbility trigsa = tempCreator.getAbility(AF.getHostCard().getSVar(svarName), AF.getHostCard());
if (trigsa instanceof Ability_Sub) {
return ((Ability_Sub) trigsa).chkAI_Drawback();
} else {
return trigsa.canPlayAI();
}
}
/**
* <p>doTriggerAI.</p>
*
* @param AF a {@link forge.card.abilityFactory.AbilityFactory} object.
* @param SA a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean.
*/
private static boolean doTriggerAI(final AbilityFactory AF, final SpellAbility SA, boolean mandatory) {
HashMap<String, String> params = AF.getMapParams();
String svarName = params.get("Execute");
SpellAbility trigsa = tempCreator.getAbility(AF.getHostCard().getSVar(svarName), AF.getHostCard());
if (!params.containsKey("OptionalDecider")) {
return trigsa.doTrigger(true);
} else {
return trigsa.doTrigger(!params.get("OptionalDecider").equals("You"));
}
}
/**
* <p>delTrigCanPlayAI.</p>
*
* @param af a {@link forge.card.abilityFactory.AbilityFactory} object.
* @param sa a {@link forge.card.spellability.SpellAbility} object.
* @return a boolean.
*/
private static boolean delTrigCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
HashMap<String, String> params = af.getMapParams();
String svarName = params.get("Execute");
SpellAbility trigsa = tempCreator.getAbility(af.getHostCard().getSVar(svarName), af.getHostCard());
return trigsa.canPlayAI();
}
/**
* <p>delTrigStackDescription.</p>
*
* @param af a {@link forge.card.abilityFactory.AbilityFactory} object.
* @param sa a {@link forge.card.spellability.SpellAbility} object.
*/
private static String delTrigStackDescription(AbilityFactory af, SpellAbility sa) {
HashMap<String, String> mapParams = af.getMapParams();
StringBuilder sb = new StringBuilder();
if (sa instanceof Ability_Sub)
sb.append(" ");
else
sb.append(sa.getSourceCard()).append(" - ");
if(mapParams.containsKey("SpellDescription")) {
sb.append(mapParams.get("SpellDescription"));
}
else if(mapParams.containsKey("TriggerDescription")) {
sb.append(mapParams.get("TriggerDescription"));
}
Ability_Sub abSub = sa.getSubAbility();
if (abSub != null) {
sb.append(abSub.getStackDescription());
}
return sb.toString();
}
/**
* <p>doResolve.</p>
*
* @param AF a {@link forge.card.abilityFactory.AbilityFactory} object.
* @param SA a {@link forge.card.spellability.SpellAbility} object.
*/
private static void doResolve(AbilityFactory AF, SpellAbility SA) {
HashMap<String, String> mapParams = AF.getMapParams();
if (mapParams.containsKey("Cost"))
mapParams.remove("Cost");
if (mapParams.containsKey("SpellDescription")) {
mapParams.put("TriggerDescription", mapParams.get("SpellDescription"));
mapParams.remove("SpellDescription");
}
Trigger delTrig = TriggerHandler.parseTrigger(mapParams, AF.getHostCard());
AllZone.getTriggerHandler().registerDelayedTrigger(delTrig);
}
}