mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
- Added Cairn Wanderer, Concerted Effort, and Death-Mask Duplicant
This commit is contained in:
@@ -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()
|
||||
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
Reference in New Issue
Block a user