- Added Cairn Wanderer, Concerted Effort, and Death-Mask Duplicant

This commit is contained in:
swordshine
2013-04-07 05:04:12 +00:00
parent 0dbfc078e0
commit 4c6e09b8be
7 changed files with 150 additions and 55 deletions

View File

@@ -9,11 +9,70 @@ import forge.Command;
import forge.Singletons;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
public class PumpAllEffect extends SpellAbilityEffect {
private void applyPumpAll(final SpellAbility sa, final List<Card> list, final int a,
final int d, final List<String> keywords, final ArrayList<ZoneType> affectedZones) {
for (final Card tgtC : list) {
// only pump things in the affected zones.
boolean found = false;
for (final ZoneType z : affectedZones) {
if (tgtC.isInZone(z)) {
found = true;
break;
}
}
if (!found) {
continue;
}
tgtC.addTempAttackBoost(a);
tgtC.addTempDefenseBoost(d);
for (int i = 0; i < keywords.size(); i++) {
tgtC.addExtrinsicKeyword(keywords.get(i));
if (keywords.get(i).equals("Suspend")) {
tgtC.setSuspend(true);
}
}
if (sa.hasParam("RememberAllPumped")) {
sa.getSourceCard().addRemembered(tgtC);
}
if (!sa.hasParam("Permanent")) {
// If not Permanent, remove Pumped at EOT
final Command untilEOT = new Command() {
private static final long serialVersionUID = 5415795460189457660L;
@Override
public void execute() {
tgtC.addTempAttackBoost(-1 * a);
tgtC.addTempDefenseBoost(-1 * d);
if (keywords.size() > 0) {
for (int i = 0; i < keywords.size(); i++) {
tgtC.removeExtrinsicKeyword(keywords.get(i));
}
}
}
};
if (sa.hasParam("UntilUntaps")) {
sa.getSourceCard().addUntapCommand(untilEOT);
} else if (sa.hasParam("UntilEndOfCombat")) {
Singletons.getModel().getGame().getEndOfCombat().addUntil(untilEOT);
} else {
Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT);
}
}
}
}
@Override
protected String getStackDescription(SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
@@ -65,65 +124,16 @@ public class PumpAllEffect extends SpellAbilityEffect {
list = AbilityUtils.filterListByType(list, valid, sa);
final List<String> keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) : new ArrayList<String>();
List<String> keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) : new ArrayList<String>();
final int a = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumAtt"), sa);
final int d = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumDef"), sa);
final String remember = sa.getParam("RememberAllPumped");
for (final Card tgtC : list) {
// only pump things in the affected zones.
boolean found = false;
for (final ZoneType z : affectedZones) {
if (tgtC.isInZone(z)) {
found = true;
break;
}
}
if (!found) {
continue;
}
tgtC.addTempAttackBoost(a);
tgtC.addTempDefenseBoost(d);
for (int i = 0; i < keywords.size(); i++) {
tgtC.addExtrinsicKeyword(keywords.get(i));
if (keywords.get(i).equals("Suspend")) {
tgtC.setSuspend(true);
}
}
if (remember != null) {
sa.getSourceCard().addRemembered(tgtC);
}
if (!sa.hasParam("Permanent")) {
// If not Permanent, remove Pumped at EOT
final Command untilEOT = new Command() {
private static final long serialVersionUID = 5415795460189457660L;
@Override
public void execute() {
tgtC.addTempAttackBoost(-1 * a);
tgtC.addTempDefenseBoost(-1 * d);
if (keywords.size() > 0) {
for (int i = 0; i < keywords.size(); i++) {
tgtC.removeExtrinsicKeyword(keywords.get(i));
}
}
}
};
if (sa.hasParam("UntilUntaps")) {
sa.getSourceCard().addUntapCommand(untilEOT);
} else if (sa.hasParam("UntilEndOfCombat")) {
Singletons.getModel().getGame().getEndOfCombat().addUntil(untilEOT);
} else {
Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT);
}
}
if (sa.hasParam("SharedKeywordsZone")) {
List<ZoneType> zones = ZoneType.listValueOf(sa.getParam("SharedKeywordsZone"));
String[] restrictions = sa.hasParam("SharedRestrictions") ? sa.getParam("SharedRestrictions").split(",") : new String[] {"Card"};
keywords = CardFactoryUtil.sharedKeywords(sa.getParam("KW").split(" & "), restrictions, zones, sa.getSourceCard());
}
this.applyPumpAll(sa, list, a, d, keywords, affectedZones);
} // pumpAllResolve()
}

View File

@@ -2170,6 +2170,53 @@ public class CardFactoryUtil {
return true;
}
/**
* <p>
* sharedKeywords.
* </p>
*
* @param kw
* a {@link forge.CardList} object.
* @return a List<String>.
*/
public static List<String> sharedKeywords(final String[] kw, final String[] restrictions,
final List<ZoneType> zones, final Card host) {
final List<String> filteredkw = new ArrayList<String>();
final Player p = host.getController();
List<Card> cardlist = new ArrayList<Card>(p.getGame().getCardsIn(zones));
final List<String> landkw = new ArrayList<String>();
final List<String> protectionkw = new ArrayList<String>();
final List<String> allkw = new ArrayList<String>();
cardlist = CardLists.getValidCards(cardlist, restrictions, p, host);
for (Card c : cardlist) {
for (String k : c.getKeyword()) {
if (k.endsWith("walk")) {
if (!landkw.contains(k)) {
landkw.add(k);
}
} else if (k.startsWith("Protection")) {
if (!protectionkw.contains(k)) {
protectionkw.add(k);
}
}
if (!allkw.contains(k)) {
allkw.add(k);
}
}
}
for (String keyword : kw) {
if (keyword.equals("Protection")) {
filteredkw.addAll(protectionkw);
} else if (keyword.equals("Landwalk")) {
filteredkw.addAll(landkw);
} else if (allkw.contains(keyword)) {
filteredkw.add(keyword);
}
}
return filteredkw;
}
/**
* <p>

View File

@@ -160,6 +160,12 @@ public class StaticAbilityContinuous {
addKeywords[w] = addKeywords[w].replaceAll("ChosenName", "Card.named" + chosenName);
}
}
if (params.containsKey("SharedKeywordsZone")) {
List<ZoneType> zones = ZoneType.listValueOf(params.get("SharedKeywordsZone"));
String[] restrictions = params.containsKey("SharedRestrictions") ? params.get("SharedRestrictions").split(",") : new String[] {"Card"};
List<String> kw = CardFactoryUtil.sharedKeywords(addKeywords, restrictions, zones, hostCard);
addKeywords = kw.toArray(new String[kw.size()]);
}
}
if (params.containsKey("AddHiddenKeyword")) {