package forge.card.trigger;
import forge.AllZone;
import forge.Card;
import forge.Player;
import forge.card.spellability.Cost;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbility_StackInstance;
import java.util.HashMap;
/**
* <p>Trigger_SpellAbilityCast class.</p>
*
* @author Forge
* @version $Id: $
*/
public class Trigger_SpellAbilityCast extends Trigger {
/**
* <p>Constructor for Trigger_SpellAbilityCast.</p>
*
* @param params a {@link java.util.HashMap} object.
* @param host a {@link forge.Card} object.
*/
public Trigger_SpellAbilityCast(HashMap<String, String> params, Card host) {
super(params, host);
}
/** {@inheritDoc} */
@Override
public boolean performTest(java.util.Map<String, Object> runParams) {
SpellAbility SA = (SpellAbility) runParams.get("CastSA");
Card cast = SA.getSourceCard();
SpellAbility_StackInstance si = AllZone.getStack().getInstanceFromSpellAbility(SA);
if (mapParams.get("Mode").equals("SpellCast")) {
if (!SA.isSpell()) {
return false;
}
} else if (mapParams.get("Mode").equals("AbilityCast")) {
if (!SA.isAbility()) {
return false;
}
} else if (mapParams.get("Mode").equals("SpellAbilityCast")) {
//Empty block for readability.
}
if (mapParams.containsKey("ValidControllingPlayer")) {
if (!matchesValid(cast.getController(), mapParams.get("ValidControllingPlayer").split(","), hostCard)) {
return false;
}
}
if (mapParams.containsKey("ValidActivatingPlayer")) {
if (!matchesValid(si.getActivatingPlayer(), mapParams.get("ValidActivatingPlayer").split(","), hostCard)) {
return false;
}
}
if (mapParams.containsKey("ValidCard")) {
if (!matchesValid(cast, mapParams.get("ValidCard").split(","), hostCard)) {
return false;
}
}
if (mapParams.containsKey("TargetsValid")) {
SpellAbility sa = si.getSpellAbility();
if (sa.getTarget() == null) {
if (sa.getTargetCard() == null) {
if (sa.getTargetList() == null) {
if (sa.getTargetPlayer() == null) {
return false;
} else {
if (!matchesValid(sa.getTargetPlayer(), mapParams.get("TargetsValid").split(","), hostCard)) {
return false;
}
}
} else {
boolean validTgtFound = false;
for (Card tgt : sa.getTargetList()) {
if (matchesValid(tgt, mapParams.get("TargetsValid").split(","), hostCard)) {
validTgtFound = true;
break;
}
}
if (!validTgtFound) {
return false;
}
}
} else {
if (!matchesValid(sa.getTargetCard(), mapParams.get("TargetsValid").split(","), hostCard)) {
return false;
}
}
} else {
if (sa.getTarget().doesTarget()) {
boolean validTgtFound = false;
for (Card tgt : sa.getTarget().getTargetCards()) {
if (tgt.isValidCard(mapParams.get("TargetsValid").split(","), hostCard.getController(), hostCard)) {
validTgtFound = true;
break;
}
}
for (Player p : sa.getTarget().getTargetPlayers()) {
if (matchesValid(p, mapParams.get("TargetsValid").split(","), hostCard)) {
validTgtFound = true;
break;
}
}
if (!validTgtFound) {
return false;
}
} else {
return false;
}
}
}
if (mapParams.containsKey("NonTapCost")) {
Cost cost = (Cost) (runParams.get("Cost"));
if (cost.getTap()) return false;
}
return true;
}
/** {@inheritDoc} */
@Override
public Trigger getCopy() {
Trigger copy = new Trigger_SpellAbilityCast(mapParams, hostCard);
if (overridingAbility != null) {
copy.setOverridingAbility(overridingAbility);
}
copy.setName(name);
copy.setID(ID);
return copy;
}
/** {@inheritDoc} */
@Override
public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject("Card", ((SpellAbility) runParams.get("CastSA")).getSourceCard());
sa.setTriggeringObject("SpellAbility", runParams.get("CastSA"));
sa.setTriggeringObject("Player", runParams.get("Player"));
sa.setTriggeringObject("Activator", runParams.get("Activator"));
}
}