package forge.card.staticAbility;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
import forge.CardUtil;
import forge.Player;
import forge.StaticEffect;
import forge.card.abilityFactory.AbilityFactory;
import forge.card.cardFactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler;
public class StaticAbility_Continuous {
public static void applyContinuousAbility(StaticAbility stAb) {
HashMap<String, String> params = stAb.getMapParams();
Card hostCard = stAb.getHostCard();
StaticEffect se = new StaticEffect();
CardList affectedCards = getAffectedCards(stAb);
se.setAffectedCards(affectedCards);
se.setParams(params);
se.setTimestamp(hostCard.getTimestamp());
AllZone.getStaticEffects().addStaticEffect(se);
int powerBonus = 0;
int toughnessBonus = 0;
int setPower = -1;
int setToughness = -1;
String addKeywords[] = null;
String addAbilities[] = null;
String addSVars[] = null;
String addTypes[] = null;
String addColors = null;
String addTriggers[] = null;
if (params.containsKey("SetPower")) {
String setP = params.get("SetPower");
setPower = setP.matches("[0-9][0-9]?") ? Integer.parseInt(setP) : CardFactoryUtil.xCount(hostCard, hostCard.getSVar(setP).split("\\$")[1]);
}
if (params.containsKey("SetToughness")) {
String setT = params.get("SetToughness");
setToughness = setT.matches("[0-9][0-9]?") ? Integer.parseInt(setT) : CardFactoryUtil.xCount(hostCard, hostCard.getSVar(setT).split("\\$")[1]);
}
if (params.containsKey("AddPower")) {
if (params.get("AddPower").equals("X")) {
powerBonus = CardFactoryUtil.xCount(hostCard, hostCard.getSVar("X").split("\\$")[1]);
se.setXValue(powerBonus);
}
else if (params.get("AddPower").equals("Y")) {
powerBonus = CardFactoryUtil.xCount(hostCard, hostCard.getSVar("Y").split("\\$")[1]);
se.setYValue(powerBonus);
}
else powerBonus = Integer.valueOf(params.get("AddPower"));
}
if (params.containsKey("AddToughness")) {
if (params.get("AddToughness").equals("X")) {
toughnessBonus = CardFactoryUtil.xCount(hostCard, hostCard.getSVar("X").split("\\$")[1]);
se.setXValue(toughnessBonus);
}
else if (params.get("AddToughness").equals("Y")) {
toughnessBonus = CardFactoryUtil.xCount(hostCard, hostCard.getSVar("Y").split("\\$")[1]);
se.setYValue(toughnessBonus);
}
else toughnessBonus = Integer.valueOf(params.get("AddToughness"));
}
if (params.containsKey("AddKeyword"))
addKeywords = params.get("AddKeyword").split(" & ");
if (params.containsKey("AddAbility")) {
String sVars[] = params.get("AddAbility").split(" & ");
for(int i = 0 ; i < sVars.length ; i++)
sVars[i] = hostCard.getSVar(sVars[i]);
addAbilities = sVars;
}
if (params.containsKey("AddSVar"))
addSVars = params.get("AddSVar").split(" & ");
if (params.containsKey("AddType")) {
addTypes = params.get("AddType").split(" & ");
if(addTypes[0].equals("ChosenType")) {
String chosenType = hostCard.getChosenType();
addTypes[0] = chosenType;
se.setChosenType(chosenType);
}
}
if (params.containsKey("AddColor"))
addColors = CardUtil.getShortColorsString(new ArrayList<String>(Arrays.asList(params.get("AddColor").split(" & "))));
if (params.containsKey("SetColor")) {
addColors = CardUtil.getShortColorsString(new ArrayList<String>(Arrays.asList(params.get("SetColor").split(" & "))));
se.setOverwriteColors(true);
}
if (params.containsKey("AddTrigger")) {
String sVars[] = params.get("AddTrigger").split(" & ");
for(int i = 0 ; i < sVars.length ; i++)
sVars[i] = hostCard.getSVar(sVars[i]);
addTriggers = sVars;
}
//start modifying the cards
for (int i = 0; i < affectedCards.size(); i++) {
Card affectedCard = affectedCards.get(i);
// set P/T
if(params.containsKey("CharacteristicDefining")) {
if (setPower != -1)
affectedCard.setBaseAttack(setPower);
if (setToughness != -1)
affectedCard.setBaseDefense(setToughness);
}
else //non CharacteristicDefining
if (setPower != -1 || setToughness != -1)
affectedCard.addNewPT(setPower, setToughness, hostCard.getTimestamp());
// add P/T bonus
affectedCard.addSemiPermanentAttackBoost(powerBonus);
affectedCard.addSemiPermanentDefenseBoost(toughnessBonus);
// add keywords
if (addKeywords != null)
for (String keyword : addKeywords)
affectedCard.addExtrinsicKeyword(keyword);
// add abilities
if (addAbilities != null)
for (String abilty : addAbilities)
if (abilty.startsWith("AB")) { // grant the ability
AbilityFactory AF = new AbilityFactory();
SpellAbility sa = AF.getAbility(abilty, affectedCard);
sa.setType("Temporary");
affectedCard.addSpellAbility(sa);
}
// add SVars
if (addSVars != null)
for (String sVar : addSVars)
affectedCard.setSVar(sVar, hostCard.getSVar(sVar));
// add Types
if (addTypes != null)
for (String type : addTypes)
affectedCard.addType(type);
// add colors
if (addColors != null) {
long t = affectedCard.addColor(addColors, affectedCard, !se.isOverwriteColors(), true);
se.addTimestamp(affectedCard, t);
}
// add triggers
if (addTriggers != null)
for (String trigger : addTriggers) {
Trigger actualTrigger = TriggerHandler.parseTrigger(trigger,affectedCard);
actualTrigger.setTemporary(true);
affectedCard.addTrigger(actualTrigger);
AllZone.getTriggerHandler().registerTrigger(actualTrigger);
}
}
}
private static CardList getAffectedCards(StaticAbility stAb) {
HashMap<String, String> params = stAb.getMapParams();
Card hostCard = stAb.getHostCard();
Player controller = hostCard.getController();
if(params.containsKey("CharacteristicDefining"))
return new CardList(hostCard); // will always be the card itself
// non - CharacteristicDefining
CardList affectedCards;
String affectedZone = "Battlefield"; // default
if (params.containsKey("AffectedZone"))
affectedZone = params.get("AffectedZone");
affectedCards = AllZoneUtil.getCardsInZone(affectedZone);
if (params.containsKey("Affected")) {
if (params.get("Affected").contains("Self") && !params.get("Affected").contains(","))
affectedCards = new CardList(hostCard);
else if (params.get("Affected").contains("EnchantedBy"))
affectedCards = new CardList(hostCard.getEnchantingCard());
}
if (params.containsKey("Affected"))
affectedCards = affectedCards.getValidCards(params.get("Affected").split(","), controller, hostCard);
return affectedCards;
}
}