This commit is contained in:
Alessandro Coli
2019-09-18 19:51:31 +02:00
144 changed files with 1260 additions and 697 deletions

View File

@@ -156,7 +156,7 @@ public class DamageDealAi extends DamageAiBase {
}
}
}
if (ai.getAttackedWithCreatureThisTurn()) {
if (!ai.getCreaturesAttackedThisTurn().isEmpty()) {
dmg = Integer.parseInt(logic.substring(logic.indexOf(".") + 1));
}
} else if ("WildHunt".equals(logic)) {

View File

@@ -63,7 +63,7 @@ public class DestroyAi extends SpellAbilityAi {
}
} else if ("AtEOTIfNotAttacking".equals(sa.getParam("AILogic"))) {
PhaseHandler ph = ai.getGame().getPhaseHandler();
if (!ph.is(PhaseType.END_OF_TURN) || ai.getAttackedWithCreatureThisTurn()) {
if (!ph.is(PhaseType.END_OF_TURN) || !ai.getCreaturesAttackedThisTurn().isEmpty()) {
return false;
}
}

View File

@@ -259,7 +259,19 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView {
return false;
}
final String payingMana = StringUtils.join(hostCard.getCastSA().getPayingMana());
if (StringUtils.countMatches(payingMana, MagicColor.toShortString(params.get("Adamant"))) < 3) {
final String color = params.get("Adamant");
if ("Any".equals(color)) {
boolean bFlag = false;
for (byte c : MagicColor.WUBRG) {
if (StringUtils.countMatches(payingMana, MagicColor.toShortString(c)) >= 3) {
bFlag = true;
break;
}
}
if (!bFlag) {
return false;
}
} else if (StringUtils.countMatches(payingMana, MagicColor.toShortString(color)) < 3) {
return false;
}
}

View File

@@ -54,6 +54,8 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
import java.util.*;
import static forge.util.EnumMapUtil.toStringMap;
/**
* Methods for common actions performed during a game.
*
@@ -297,7 +299,7 @@ public class GameAction {
repParams.putAll(params);
}
ReplacementResult repres = game.getReplacementHandler().run(EnumMapUtil.toStringMap(repParams));
ReplacementResult repres = game.getReplacementHandler().run(toStringMap(repParams));
if (repres != ReplacementResult.NotReplaced) {
// reset failed manifested Cards back to original
if (c.isManifested()) {

View File

@@ -170,7 +170,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
int restDamage = damage;
// first try to replace the damage
final Map<String, Object> repParams = Maps.newHashMap();
final Map<String, Object> repParams = Maps.newHashMap();
repParams.put("Event", "DamageDone");
repParams.put("Affected", this);
repParams.put("DamageSource", source);

View File

@@ -8,9 +8,11 @@ import java.util.Map;
*/
public enum AbilityKey {
AbilityMana("AbilityMana"),
Activator("Activator"),
Affected("Affected"),
Attach("Attach"),
AllVotes("AllVotes"),
Amount("Amount"),
Attach("Attach"),
AttachSource("AttachSource"),
AttachTarget("AttachTarget"),
Attacked("Attacked"),
@@ -20,16 +22,24 @@ public enum AbilityKey {
AttackedTarget("AttackedTarget"),
Blocker("Blocker"),
Blockers("Blockers"),
CastSA("CastSA"),
CastSACMC("CastSACMC"),
Card("Card"),
Cards("Cards"),
CardLKI("CardLKI"),
Cause("Cause"),
Causer("Causer"),
Championed("Championed"),
CopySA("CopySA"),
Cost("Cost"),
CostStack("CostStack"),
CounterAmount("CounterAmount"),
CounteredSA("CounteredSA"),
CounterType("CounterType"),
Crew("Crew"),
CumulativeUpkeepPaid("CumulativeUpkeepPaid"),
CurrentCastSpells("CurrentCastSpells"),
CurrentStormCount("CurrentStormCount"),
DamageAmount("DamageAmount"),
DamageSource("DamageSource"),
DamageSources("DamageSources"),
@@ -42,30 +52,47 @@ public enum AbilityKey {
Devoured("Devoured"),
EchoPaid("EchoPaid"),
Exploited("Exploited"),
Explorer("Explorer"),
Event("Event"),
Fighter("Fighter"),
FirstTime("FirstTime"),
Fizzle("Fizzle"),
IsCombatDamage("IsCombatDamage"),
PayingMana("PayingMana"),
Player("Player"),
IndividualCostPaymentInstance("IndividualCostPaymentInstance"),
IsMadness("IsMadness"),
LifeAmount("LifeAmount"),
MonstrosityAmount("MonstrosityAmount"),
NewCounterAmount("NewCounterAmount"),
Num("Num"), // TODO confirm that this and NumThisTurn can be merged
NumBlockers("NumBlockers"),
NumThisTurn("NumThisTurn"),
Number("Number"),
Object("Object"),
Objects("Objects"),
OtherAttackers("OtherAttackers"),
OtherVoters("OtherVoters"),
Origin("Origin"),
OriginalController("OriginalController"),
OriginalDefender("OriginalDefender"),
PayingMana("PayingMana"),
Phase("Phase"),
Player("Player"),
Produced("Produced"),
Result("Result"),
Scheme("Scheme"),
Source("Source"),
Sources("Sources"),
SourceSA("SourceSA"),
SpellAbility("SpellAbility"),
SpellAbilityStackInstance("SpellAbilityStackInstance"),
SpellAbilityTargetingCards("SpellAbilityTargetingCards"),
StackInstance("StackInstance"),
StackSa("StackSa"),
StackSi("StackSi"),
Target("Target"),
Targets("Targets"),
Transformer("Transformer"),
Vehicle("Vehicle"),
Won("Won");
@@ -80,10 +107,204 @@ public enum AbilityKey {
return key;
}
/**
* @param s A string that would be output from toString
* @return the corresponding key if there is one or null otherwise
*/
public static AbilityKey fromString(String s) {
switch (s) {
case "AbilityMana":
return AbilityMana;
case "Activator":
return Activator;
case "Affected":
return Affected;
case "AllVotes":
return AllVotes;
case "Amount":
return Amount;
case "Attach":
return Attach;
case "AttachSource":
return AttachSource;
case "AttachTarget":
return AttachTarget;
case "Attacked":
return Attacked;
case "Attacker":
return Attacker;
case "Attackers":
return Attackers;
case "AttackingPlayer":
return AttackingPlayer;
case "AttackedTarget":
return AttackedTarget;
case "Blocker":
return Blocker;
case "Blockers":
return Blockers;
case "CastSA":
return CastSA;
case "CastSACMC":
return CastSACMC;
case "Card":
return Card;
case "Cards":
return Cards;
case "CardLKI":
return CardLKI;
case "Cause":
return Cause;
case "Causer":
return Causer;
case "Championed":
return Championed;
case "CopySA":
return CopySA;
case "Cost":
return Cost;
case "CostStack":
return CostStack;
case "CounterAmount":
return CounterAmount;
case "CounteredSA":
return CounteredSA;
case "CounterType":
return CounterType;
case "Crew":
return Crew;
case "CumulativeUpkeepPaid":
return CumulativeUpkeepPaid;
case "CurrentCastSpells":
return CurrentCastSpells;
case "CurrentStormCount":
return CurrentStormCount;
case "DamageAmount":
return DamageAmount;
case "DamageSource":
return DamageSource;
case "DamageSources":
return DamageSources;
case "DamageTarget":
return DamageTarget;
case "DamageTargets":
return DamageTargets;
case "Defender":
return Defender;
case "Defenders":
return Defenders;
case "DefendingPlayer":
return DefendingPlayer;
case "Destination":
return Destination;
case "Devoured":
return Devoured;
case "EchoPaid":
return EchoPaid;
case "Exploited":
return Exploited;
case "Explorer":
return Explorer;
case "Event":
return Event;
case "Fighter":
return Fighter;
case "FirstTime":
return FirstTime;
case "Fizzle":
return Fizzle;
case "IsCombatDamage":
return IsCombatDamage;
case "IndividualCostPaymentInstance":
return IndividualCostPaymentInstance;
case "IsMadness":
return IsMadness;
case "LifeAmount":
return LifeAmount;
case "MonstrosityAmount":
return MonstrosityAmount;
case "NewCounterAmount":
return NewCounterAmount;
case "Num":
return Num;
case "NumBlockers":
return NumBlockers;
case "NumThisTurn":
return NumThisTurn;
case "Number":
return Number;
case "Object":
return Object;
case "Objects":
return Objects;
case "OtherAttackers":
return OtherAttackers;
case "OtherVoters":
return OtherVoters;
case "Origin":
return Origin;
case "OriginalController":
return OriginalController;
case "OriginalDefender":
return OriginalDefender;
case "PayingMana":
return PayingMana;
case "Phase":
return Phase;
case "Player":
return Player;
case "Produced":
return Produced;
case "Result":
return Result;
case "Scheme":
return Scheme;
case "Source":
return Source;
case "Sources":
return Sources;
case "SourceSA":
return SourceSA;
case "SpellAbility":
return SpellAbility;
case "SpellAbilityStackInstance":
return SpellAbilityStackInstance;
case "SpellAbilityTargetingCards":
return SpellAbilityTargetingCards;
case "StackInstance":
return StackInstance;
case "StackSa":
return StackSa;
case "StackSi":
return StackSi;
case "Target":
return Target;
case "Targets":
return Targets;
case "Transformer":
return Transformer;
case "Vehicle":
return Vehicle;
case "Won":
return Won;
default:
return null;
}
}
public static <V> EnumMap<AbilityKey, V> newMap() {
return new EnumMap<>(AbilityKey.class);
}
public static <V> EnumMap<AbilityKey, V> newMap(Map<AbilityKey, V> map) {
// The EnumMap constructor throws IllegalArgumentException if the map is empty.
if (map.isEmpty()) {
return newMap();
}
return new EnumMap<>(map);
}
public static Map<AbilityKey, Object> mapFromCard(forge.game.card.Card card) {
final Map<AbilityKey, Object> runParams = newMap();

View File

@@ -139,13 +139,15 @@ public class AbilityUtils {
final SpellAbility root = sa.getRootAbility();
if (defined.contains("LKICopy")) { //Triggered*LKICopy
int lkiPosition = defined.indexOf("LKICopy");
final Object crd = root.getTriggeringObject(defined.substring(9, lkiPosition));
AbilityKey type = AbilityKey.fromString(defined.substring(9, lkiPosition));
final Object crd = root.getTriggeringObject(type);
if (crd instanceof Card) {
c = (Card) crd;
}
}
else {
final Object crd = root.getTriggeringObject(defined.substring(9));
AbilityKey type = AbilityKey.fromString(defined.substring(9));
final Object crd = root.getTriggeringObject(type);
if (crd instanceof Card) {
c = game.getCardState((Card) crd);
} else if (crd instanceof Iterable) {
@@ -462,12 +464,9 @@ public class AbilityUtils {
players.remove(game.getPhaseHandler().getPlayerTurn());
val = CardFactoryUtil.playerXCount(players, calcX[1], card);
}
else if (hType.startsWith("PropertyYou") && !(ability instanceof SpellAbility)) {
// Related to the controller of the card with ability when the ability is static (or otherwise not a SpellAbility)
// TODO: This doesn't work in situations when the controller of the card is different from the spell caster
// (e.g. opponent's Hollow One exiled by Hostage Taker - cost reduction will not work in this scenario, requires
// a more significant rework).
players.add(card.getController());
else if (hType.startsWith("PropertyYou") && ability instanceof SpellAbility) {
// Hollow One
players.add(((SpellAbility) ability).getActivatingPlayer());
val = CardFactoryUtil.playerXCount(players, calcX[1], card);
}
else if (hType.startsWith("Property") && ability instanceof SpellAbility) {
@@ -641,12 +640,12 @@ public class AbilityUtils {
}
if (calcX[0].startsWith("TriggeredPlayer") || calcX[0].startsWith("TriggeredTarget")) {
final SpellAbility root = sa.getRootAbility();
Object o = root.getTriggeringObject(calcX[0].substring(9));
Object o = root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(9)));
return o instanceof Player ? CardFactoryUtil.playerXProperty((Player) o, calcX[1], card) * multiplier : 0;
}
if (calcX[0].equals("TriggeredSpellAbility")) {
final SpellAbility root = sa.getRootAbility();
SpellAbility sat = (SpellAbility) root.getTriggeringObject("SpellAbility");
SpellAbility sat = (SpellAbility) root.getTriggeringObject(AbilityKey.SpellAbility);
return calculateAmount(sat.getHostCard(), calcX[1], sat);
}
// Added on 9/30/12 (ArsenalNut) - Ended up not using but might be useful in future
@@ -695,11 +694,11 @@ public class AbilityUtils {
}
else if (calcX[0].startsWith("TriggerObjects")) {
final SpellAbility root = sa.getRootAbility();
list = (CardCollection) root.getTriggeringObject(calcX[0].substring(14));
list = (CardCollection) root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(14)));
}
else if (calcX[0].startsWith("Triggered")) {
final SpellAbility root = sa.getRootAbility();
list = new CardCollection((Card) root.getTriggeringObject(calcX[0].substring(9)));
list = new CardCollection((Card) root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(9))));
}
else if (calcX[0].startsWith("TriggerCount")) {
// TriggerCount is similar to a regular Count, but just
@@ -707,7 +706,7 @@ public class AbilityUtils {
final SpellAbility root = sa.getRootAbility();
final String[] l = calcX[1].split("/");
final String m = CardFactoryUtil.extractOperators(calcX[1]);
final int count = (Integer) root.getTriggeringObject(l[0]);
final int count = (Integer) root.getTriggeringObject(AbilityKey.fromString(l[0]));
return CardFactoryUtil.doXMath(count, m, card) * multiplier;
}
@@ -777,19 +776,19 @@ public class AbilityUtils {
final Object o;
if (type.startsWith("Triggered")) {
if (type.contains("Card")) {
o = sa.getTriggeringObject("Card");
o = sa.getTriggeringObject(AbilityKey.Card);
}
else if (type.contains("Object")) {
o = sa.getTriggeringObject("Object");
o = sa.getTriggeringObject(AbilityKey.Object);
}
else if (type.contains("Attacker")) {
o = sa.getTriggeringObject("Attacker");
o = sa.getTriggeringObject(AbilityKey.Attacker);
}
else if (type.contains("Blocker")) {
o = sa.getTriggeringObject("Blocker");
o = sa.getTriggeringObject(AbilityKey.Blocker);
}
else {
o = sa.getTriggeringObject("Card");
o = sa.getTriggeringObject(AbilityKey.Card);
}
if (!(o instanceof Card)) {
@@ -1004,7 +1003,7 @@ public class AbilityUtils {
if (defParsed.endsWith("Controller")) {
String triggeringType = defParsed.substring(9);
triggeringType = triggeringType.substring(0, triggeringType.length() - 10);
final Object c = root.getTriggeringObject(triggeringType);
final Object c = root.getTriggeringObject(AbilityKey.fromString(triggeringType));
if (c instanceof Card) {
o = ((Card) c).getController();
}
@@ -1015,7 +1014,7 @@ public class AbilityUtils {
else if (defParsed.endsWith("Opponent")) {
String triggeringType = defParsed.substring(9);
triggeringType = triggeringType.substring(0, triggeringType.length() - 8);
final Object c = root.getTriggeringObject(triggeringType);
final Object c = root.getTriggeringObject(AbilityKey.fromString(triggeringType));
if (c instanceof Card) {
o = ((Card) c).getController().getOpponents();
}
@@ -1026,14 +1025,14 @@ public class AbilityUtils {
else if (defParsed.endsWith("Owner")) {
String triggeringType = defParsed.substring(9);
triggeringType = triggeringType.substring(0, triggeringType.length() - 5);
final Object c = root.getTriggeringObject(triggeringType);
final Object c = root.getTriggeringObject(AbilityKey.fromString(triggeringType));
if (c instanceof Card) {
o = ((Card) c).getOwner();
}
}
else {
final String triggeringType = defParsed.substring(9);
o = root.getTriggeringObject(triggeringType);
o = root.getTriggeringObject(AbilityKey.fromString(triggeringType));
}
if (o != null) {
if (o instanceof Player) {
@@ -1252,13 +1251,13 @@ public class AbilityUtils {
final SpellAbility root = sa.getRootAbility();
final String triggeringType = defined.substring(9);
final Object o = root.getTriggeringObject(triggeringType);
final Object o = root.getTriggeringObject(AbilityKey.fromString(triggeringType));
if (o instanceof SpellAbility) {
s = (SpellAbility) o;
// if there is no target information in SA but targets are listed in SpellAbilityTargeting cards, copy that
// information so it's not lost if the calling code is interested in targets of the triggered SA.
if (triggeringType.equals("SpellAbility")) {
final CardCollectionView tgtList = (CardCollectionView)root.getTriggeringObject("SpellAbilityTargetingCards");
final CardCollectionView tgtList = (CardCollectionView)root.getTriggeringObject(AbilityKey.SpellAbilityTargetingCards);
if (s.getTargets() != null && s.getTargets().getNumTargeted() == 0) {
if (tgtList != null && tgtList.size() > 0) {
TargetChoices tc = new TargetChoices();
@@ -1390,7 +1389,7 @@ public class AbilityUtils {
cost = new Cost(source.getManaCost(), true);
}
else if (unlessCost.equals("TriggeredSpellManaCost")) {
SpellAbility triggered = (SpellAbility) sa.getRootAbility().getTriggeringObject("SpellAbility");
SpellAbility triggered = (SpellAbility) sa.getRootAbility().getTriggeringObject(AbilityKey.SpellAbility);
Card triggeredCard = triggered.getHostCard();
if (triggeredCard.getManaCost() == null) {
cost = new Cost(ManaCost.ZERO, true);
@@ -1608,7 +1607,7 @@ public class AbilityUtils {
// Count$TriggeredPayingMana.<Color1>.<Color2>
if (sq[0].startsWith("TriggeredPayingMana")) {
final SpellAbility root = sa.getRootAbility();
String mana = (String) root.getTriggeringObject("PayingMana");
String mana = (String) root.getTriggeringObject(AbilityKey.PayingMana);
int count = 0;
Matcher mat = Pattern.compile(StringUtils.join(sq, "|", 1, sq.length)).matcher(mana);
while (mat.find()) {
@@ -1620,7 +1619,8 @@ public class AbilityUtils {
// Count$Adamant.<Color>.<True>.<False>
if (sq[0].startsWith("Adamant")) {
final String payingMana = StringUtils.join(sa.getRootAbility().getPayingMana());
final boolean adamant = StringUtils.countMatches(payingMana, MagicColor.toShortString(sq[1])) >= 3;
final int num = sq[0].length() > 7 ? Integer.parseInt(sq[0].split("_")[1]) : 3;
final boolean adamant = StringUtils.countMatches(payingMana, MagicColor.toShortString(sq[1])) >= num;
return CardFactoryUtil.doXMath(Integer.parseInt(sq[adamant ? 2 : 3]), expr, c);
}

View File

@@ -2,6 +2,7 @@ package forge.game.ability.effects;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.combat.AttackingBand;
@@ -54,12 +55,12 @@ public class ChangeCombatantsEffect extends SpellAbilityEffect {
// retarget triggers to the new defender (e.g. Ulamog, Ceaseless Hunger + Portal Mage)
for (SpellAbilityStackInstance si : game.getStack()) {
if (si.isTrigger() && c.equals(si.getSourceCard())
&& si.getTriggeringObject("Attacker") != null) {
si.addTriggeringObject("OriginalDefender", originalDefender);
&& si.getTriggeringObject(AbilityKey.Attacker) != null) {
si.addTriggeringObject(AbilityKey.OriginalDefender, originalDefender);
if (defender instanceof Player) {
si.updateTriggeringObject("DefendingPlayer", defender);
si.updateTriggeringObject(AbilityKey.DefendingPlayer, defender);
} else if (defender instanceof Card) {
si.updateTriggeringObject("DefendingPlayer", ((Card)defender).getController());
si.updateTriggeringObject(AbilityKey.DefendingPlayer, ((Card)defender).getController());
}
}
}

View File

@@ -980,7 +980,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
c.setController(newController, game.getNextTimestamp());
}
if (sa.hasParam("WithCounters")) {
String[] parse = sa.getParam("WithCounters").split("_");
c.addEtbCounter(CounterType.getType(parse[0]), Integer.parseInt(parse[1]), player);
}
if (sa.hasParam("Transformed")) {
if (c.isDoubleFaced()) {
c.changeCardState("Transform", null);

View File

@@ -65,6 +65,11 @@ public class ImmediateTriggerEffect extends SpellAbilityEffect {
}
}
if (sa.hasParam("RememberDefinedNumber")) {
immediateTrig.addRemembered((Integer) AbilityUtils.calculateAmount(sa.getHostCard(),
sa.getParam("RememberDefinedNumber"), sa));
}
if (mapParams.containsKey("Execute") || sa.hasAdditionalAbility("Execute")) {
SpellAbility overridingSA = sa.getAdditionalAbility("Execute");
overridingSA.setActivatingPlayer(sa.getActivatingPlayer());

View File

@@ -9,15 +9,18 @@ import forge.game.GameActionUtil;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists;
import forge.game.mana.Mana;
import forge.game.player.Player;
import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Iterables;
import java.util.List;
public class ManaEffect extends SpellAbilityEffect {
@@ -181,6 +184,16 @@ public class ManaEffect extends SpellAbilityEffect {
}
String cs = manaType.toString();
abMana.setExpressChoice(cs);
} else if (type.startsWith("EachColorAmong")) {
final String res = type.split("_")[1];
final CardCollection list = CardLists.getValidCards(card.getGame().getCardsIn(ZoneType.Battlefield),
res, sa.getActivatingPlayer(), card, sa);
byte colors = 0;
for (Card c : list) {
colors |= c.determineColor().getColor();
}
if (colors == 0) return;
abMana.setExpressChoice(ColorSet.fromMask(colors));
}
if (abMana.getExpressChoice().isEmpty()) {

View File

@@ -70,6 +70,7 @@ public class RestartGameEffect extends SpellAbilityEffect {
player.setStartingLife(psc.getStartingLife());
player.setPoisonCounters(0, sa.getHostCard());
player.resetSpellCastThisGame();
player.setLandsPlayedLastTurn(0);
player.resetLandsPlayedThisTurn();
player.resetInvestigatedThisTurn();

View File

@@ -1048,7 +1048,7 @@ public class Card extends GameEntity implements Comparable<Card> {
}
}
public final Object getTriggeringObject(final String typeIn) {
public final Object getTriggeringObject(final AbilityKey typeIn) {
Object triggered = null;
if (!currentState.getTriggers().isEmpty()) {
for (final Trigger t : currentState.getTriggers()) {

View File

@@ -35,6 +35,7 @@ import forge.game.GameEntity;
import forge.game.GameEntityCounterTable;
import forge.game.GameLogEntryType;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.CardPredicates.Presets;
@@ -917,6 +918,10 @@ public class CardFactoryUtil {
return doXMath(cc.getSurveilThisTurn(), m, c);
}
if (sq[0].equals("YouCastThisGame")) {
return doXMath(cc.getSpellsCastThisGame(), m, c);
}
if (sq[0].equals("FirstSpellTotalManaSpent")) {
try{
return doXMath(c.getFirstSpellAbility().getTotalManaSpent(), m, c);
@@ -948,7 +953,7 @@ public class CardFactoryUtil {
// TriggeringObjects
if (sq[0].startsWith("Triggered")) {
return doXMath(xCount((Card) c.getTriggeringObject("Card"), sq[0].substring(9)), m, c);
return doXMath(xCount((Card) c.getTriggeringObject(AbilityKey.Card), sq[0].substring(9)), m, c);
}
if (sq[0].contains("YourStartingLife")) {
@@ -1102,13 +1107,11 @@ public class CardFactoryUtil {
final String restriction = l[0].substring(11);
final String[] rest = restriction.split(",");
final CardCollection list = CardLists.getValidCards(cc.getGame().getCardsInGame(), rest, cc, c, null);
int n = 0;
for (final byte col : MagicColor.WUBRG) {
if (!CardLists.getColor(list, col).isEmpty()) {
n++;
}
byte n = 0;
for (final Card card : list) {
n |= card.determineColor().getColor();
}
return doXMath(n, m, c);
return doXMath(ColorSet.fromMask(n).countColors(), m, c);
}
if (sq[0].contains("CreatureType")) {
@@ -1331,6 +1334,13 @@ public class CardFactoryUtil {
return doXMath(cc.getAttackersDeclaredThisTurn(), m, c);
}
// Count$CardAttackedThisTurn_<Valid>
if (sq[0].contains("CreaturesAttackedThisTurn")) {
final String[] workingCopy = l[0].split("_");
final String validFilter = workingCopy[1];
return doXMath(CardLists.getType(cc.getCreaturesAttackedThisTurn(), validFilter).size(), m, c);
}
// Count$ThisTurnCast <Valid>
// Count$LastTurnCast <Valid>
if (sq[0].contains("ThisTurnCast") || sq[0].contains("LastTurnCast")) {

View File

@@ -6,6 +6,7 @@ import forge.card.MagicColor;
import forge.game.Direction;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.card.CardPredicates.Presets;
import forge.game.combat.AttackingBand;
@@ -874,7 +875,7 @@ public class CardProperty {
}
return false;
case "TriggeredCard":
final Object triggeringObject = source.getTriggeringObject(restriction.substring("Triggered".length()));
final Object triggeringObject = source.getTriggeringObject(AbilityKey.fromString(restriction.substring("Triggered".length())));
if (!(triggeringObject instanceof Card)) {
return false;
}
@@ -957,7 +958,7 @@ public class CardProperty {
if (spellAbility == null) {
System.out.println("Looking at TriggeredCard but no SA?");
} else {
Card triggeredCard = ((Card)spellAbility.getTriggeringObject("Card"));
Card triggeredCard = ((Card) spellAbility.getTriggeringObject(AbilityKey.Card));
if (triggeredCard != null && card.sharesNameWith(triggeredCard)) {
return true;
}

View File

@@ -25,6 +25,7 @@ import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.player.Player;
@@ -56,7 +57,8 @@ public final class CardUtil {
"Transmute", "Replicate", "Recover", "Suspend", "Aura swap",
"Fortify", "Transfigure", "Champion", "Evoke", "Prowl", "IfReach",
"Reinforce", "Unearth", "Level up", "Miracle", "Overload",
"Scavenge", "Bestow", "Outlast", "Dash", "Surge", "Emerge", "Hexproof:").build();
"Scavenge", "Bestow", "Outlast", "Dash", "Surge", "Emerge", "Hexproof:",
"etbCounter").build();
/** List of keyword endings of keywords that could be modified by text changes. */
public static final ImmutableList<String> modifiableKeywordEndings = ImmutableList.<String>builder().add(
"walk", "cycling", "offering").build();
@@ -411,7 +413,7 @@ public final class CardUtil {
}
} else if (reflectProperty.equals("Produced")) {
// Why is this name so similar to the one below?
final String producedColors = abMana instanceof AbilitySub ? (String) abMana.getRootAbility().getTriggeringObject("Produced") : (String) abMana.getTriggeringObject("Produced");
final String producedColors = abMana instanceof AbilitySub ? (String) abMana.getRootAbility().getTriggeringObject(AbilityKey.Produced) : (String) abMana.getTriggeringObject(AbilityKey.Produced);
for (final String col : MagicColor.Constant.ONLY_COLORS) {
final String s = MagicColor.toShortString(col);
if (producedColors.contains(s)) {

View File

@@ -546,13 +546,13 @@ public class Combat {
Game game = c.getGame();
for (SpellAbilityStackInstance si : game.getStack()) {
if (si.isTrigger() && c.equals(si.getSourceCard())) {
GameEntity origDefender = (GameEntity)si.getTriggeringObject("OriginalDefender");
GameEntity origDefender = (GameEntity)si.getTriggeringObject(AbilityKey.OriginalDefender);
if (origDefender != null) {
si.updateTriggeringObject("Defender", origDefender);
si.updateTriggeringObject(AbilityKey.Defender, origDefender);
if (origDefender instanceof Player) {
si.updateTriggeringObject("DefendingPlayer", origDefender);
si.updateTriggeringObject(AbilityKey.DefendingPlayer, origDefender);
} else if (origDefender instanceof Card) {
si.updateTriggeringObject("DefendingPlayer", ((Card)origDefender).getController());
si.updateTriggeringObject(AbilityKey.DefendingPlayer, ((Card)origDefender).getController());
}
}
}

View File

@@ -317,7 +317,7 @@ public class CombatUtil {
c.getDamageHistory().setCreatureAttackedThisCombat(true);
c.getDamageHistory().clearNotAttackedSinceLastUpkeepOf();
c.getController().setAttackedWithCreatureThisTurn(true);
c.getController().addCreaturesAttackedThisTurn(c);
c.getController().incrementAttackersDeclaredThisTurn();
if (combat.getDefenderByAttacker(c) != null && combat.getDefenderByAttacker(c) instanceof Player) {

View File

@@ -150,7 +150,7 @@ public class GlobalAttackRestrictions {
final Game game = attackingPlayer.getGame();
/* if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.onlyOneAttackerATurn)) {
if (attackingPlayer.getAttackedWithCreatureThisTurn()) {
if (!attackingPlayer.getAttackedWithCreatureThisTurn().isEmpty()) {
max = 0;
} else {
max = 1;

View File

@@ -381,6 +381,9 @@ public class CostAdjustment {
} else if ("Undaunted".equals(amount)) {
value = card.getController().getOpponents().size();
} else if (staticAbility.hasParam("Relative")) {
// TODO: update cards with "This spell costs X less to cast...if you..."
// The caster is sa.getActivatingPlayer()
// cards like Hostage Taker can cast spells from other players.
value = AbilityUtils.calculateAmount(hostCard, amount, sa);
} else {
value = AbilityUtils.calculateAmount(hostCard, amount, staticAbility);

View File

@@ -23,6 +23,7 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import forge.card.mana.ManaCost;
import forge.game.*;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
@@ -412,10 +413,10 @@ public class PhaseHandler implements java.io.Serializable {
if (!skipped) {
// Run triggers if phase isn't being skipped
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Phase", phase.nameForScripts);
runParams.put("Player", playerTurn);
game.getTriggerHandler().runTriggerOld(TriggerType.Phase, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Phase, phase.nameForScripts);
runParams.put(AbilityKey.Player, playerTurn);
game.getTriggerHandler().runTrigger(TriggerType.Phase, runParams, false);
}
// This line fixes Combat Damage triggers not going off when they should
@@ -487,9 +488,9 @@ public class PhaseHandler implements java.io.Serializable {
if (!bRepeatCleanup) {
setPlayerTurn(handleNextTurn());
// "Trigger" for begin turn to get around a phase skipping
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Player", playerTurn);
game.getTriggerHandler().runTriggerOld(TriggerType.TurnBegin, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Player, playerTurn);
game.getTriggerHandler().runTrigger(TriggerType.TurnBegin, runParams, false);
}
planarDiceRolledthisTurn = 0;
// Play the End Turn sound
@@ -577,11 +578,11 @@ public class PhaseHandler implements java.io.Serializable {
for (final Card c : combat.getAttackers()) {
attackedTarget.add(combat.getDefenderByAttacker(c));
}
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Attackers", combat.getAttackers());
runParams.put("AttackingPlayer", combat.getAttackingPlayer());
runParams.put("AttackedTarget", attackedTarget);
game.getTriggerHandler().runTriggerOld(TriggerType.AttackersDeclared, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Attackers, combat.getAttackers());
runParams.put(AbilityKey.AttackingPlayer, combat.getAttackingPlayer());
runParams.put(AbilityKey.AttackedTarget, attackedTarget);
game.getTriggerHandler().runTrigger(TriggerType.AttackersDeclared, runParams, false);
}
for (final Card c : combat.getAttackers()) {
@@ -690,10 +691,10 @@ public class PhaseHandler implements java.io.Serializable {
}
}
// fire blockers declared trigger
final Map<String, Object> bdRunParams = Maps.newHashMap();
bdRunParams.put("Blockers", declaredBlockers);
bdRunParams.put("Attackers", blockedAttackers);
game.getTriggerHandler().runTriggerOld(TriggerType.BlockersDeclared, bdRunParams, false);
final Map<AbilityKey, Object> bdRunParams = AbilityKey.newMap();
bdRunParams.put(AbilityKey.Blockers, declaredBlockers);
bdRunParams.put(AbilityKey.Attackers, blockedAttackers);
game.getTriggerHandler().runTrigger(TriggerType.BlockersDeclared, bdRunParams, false);
}
for (final Card c1 : combat.getAllBlockers()) {
@@ -703,10 +704,10 @@ public class PhaseHandler implements java.io.Serializable {
if (!c1.getDamageHistory().getCreatureBlockedThisCombat()) {
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Blocker", c1);
runParams.put("Attackers", combat.getAttackersBlockedBy(c1));
game.getTriggerHandler().runTriggerOld(TriggerType.Blocks, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Blocker, c1);
runParams.put(AbilityKey.Attackers, combat.getAttackersBlockedBy(c1));
game.getTriggerHandler().runTrigger(TriggerType.Blocks, runParams, false);
}
c1.getDamageHistory().setCreatureBlockedThisCombat(true);
@@ -724,13 +725,15 @@ public class PhaseHandler implements java.io.Serializable {
}
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Attacker", a);
runParams.put("Blockers", blockers);
runParams.put("NumBlockers", blockers.size());
runParams.put("Defender", combat.getDefenderByAttacker(a));
runParams.put("DefendingPlayer", combat.getDefenderPlayerByAttacker(a));
game.getTriggerHandler().runTriggerOld(TriggerType.AttackerBlocked, runParams, false);
{
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Attacker, a);
runParams.put(AbilityKey.Blockers, blockers);
runParams.put(AbilityKey.NumBlockers, blockers.size());
runParams.put(AbilityKey.Defender, combat.getDefenderByAttacker(a));
runParams.put(AbilityKey.DefendingPlayer, combat.getDefenderPlayerByAttacker(a));
game.getTriggerHandler().runTrigger(TriggerType.AttackerBlocked, runParams, false);
}
// Run this trigger once for each blocker
for (final Card b : blockers) {
@@ -738,10 +741,10 @@ public class PhaseHandler implements java.io.Serializable {
b.addBlockedThisTurn(a);
a.addBlockedByThisTurn(b);
final Map<String, Object> runParams2 = Maps.newHashMap();
runParams2.put("Attacker", a);
runParams2.put("Blocker", b);
game.getTriggerHandler().runTriggerOld(TriggerType.AttackerBlockedByCreature, runParams2, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Attacker, a);
runParams.put(AbilityKey.Blocker, b);
game.getTriggerHandler().runTrigger(TriggerType.AttackerBlockedByCreature, runParams, false);
}
a.getDamageHistory().setCreatureGotBlockedThisCombat(true);

View File

@@ -24,6 +24,7 @@ import forge.LobbyPlayer;
import forge.card.MagicColor;
import forge.game.*;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.effects.DetachedCardEffect;
@@ -83,6 +84,7 @@ public class Player extends GameEntity implements Comparable<Player> {
private final Map<Card, Integer> assignedDamage = Maps.newHashMap();
private final Map<Card, Integer> assignedCombatDamage = Maps.newHashMap();
private int spellsCastThisTurn = 0;
private int spellsCastThisGame = 0;
private int spellsCastLastTurn = 0;
private int landsPlayedThisTurn = 0;
private int landsPlayedLastTurn = 0;
@@ -123,7 +125,7 @@ public class Player extends GameEntity implements Comparable<Player> {
private ManaPool manaPool = new ManaPool(this);
private GameEntity mustAttackEntity = null;
private GameEntity mustAttackEntityThisTurn = null;
private boolean attackedWithCreatureThisTurn = false;
private CardCollection creatureAttackedThisTurn = new CardCollection();
private boolean activateLoyaltyAbilityThisTurn = false;
private boolean tappedLandForManaThisTurn = false;
private int attackersDeclaredThisTurn = 0;
@@ -246,9 +248,9 @@ public class Player extends GameEntity implements Comparable<Player> {
game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Scheme", activeScheme);
game.getTriggerHandler().runTriggerOld(TriggerType.SetInMotion, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Scheme, activeScheme);
game.getTriggerHandler().runTrigger(TriggerType.SetInMotion, runParams, false);
}
@@ -445,12 +447,12 @@ public class Player extends GameEntity implements Comparable<Player> {
}
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Player", this);
runParams.put("LifeAmount", lifeGain);
runParams.put("Source", source);
runParams.put("SourceSA", sa);
game.getTriggerHandler().runTriggerOld(TriggerType.LifeGained, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Player, this);
runParams.put(AbilityKey.LifeAmount, lifeGain);
runParams.put(AbilityKey.Source, source);
runParams.put(AbilityKey.SourceSA, sa);
game.getTriggerHandler().runTrigger(TriggerType.LifeGained, runParams, false);
game.fireEvent(new GameEventPlayerLivesChanged(this, oldLife, life));
}
@@ -478,19 +480,17 @@ public class Player extends GameEntity implements Comparable<Player> {
life -= toLose;
view.updateLife(this);
lifeLost = toLose;
if(manaBurn) {
game.fireEvent(new GameEventManaBurn(this,lifeLost,true));
if (manaBurn) {
game.fireEvent(new GameEventManaBurn(this, lifeLost, true));
} else {
game.fireEvent(new GameEventPlayerLivesChanged(this, oldLife, life));
game.fireEvent(new GameEventPlayerLivesChanged(this, oldLife, life));
}
}
else if (toLose == 0) {
} else if (toLose == 0) {
// Rule 118.4
// this is for players being able to pay 0 life nothing to do
// no trigger for lost no life
return 0;
}
else {
} else {
System.out.println("Player - trying to lose negative life");
return 0;
}
@@ -500,11 +500,11 @@ public class Player extends GameEntity implements Comparable<Player> {
lifeLostThisTurn += toLose;
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Player", this);
runParams.put("LifeAmount", toLose);
runParams.put("FirstTime", firstLost);
game.getTriggerHandler().runTriggerOld(TriggerType.LifeLost, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Player, this);
runParams.put(AbilityKey.LifeAmount, toLose);
runParams.put(AbilityKey.FirstTime, firstLost);
game.getTriggerHandler().runTrigger(TriggerType.LifeLost, runParams, false);
return lifeLost;
}
@@ -528,10 +528,10 @@ public class Player extends GameEntity implements Comparable<Player> {
loseLife(lifePayment);
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Player", this);
runParams.put("LifeAmount", lifePayment);
game.getTriggerHandler().runTriggerOld(TriggerType.PayLife, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Player, this);
runParams.put(AbilityKey.LifeAmount, lifePayment);
game.getTriggerHandler().runTrigger(TriggerType.PayLife, runParams, false);
return true;
}
@@ -611,14 +611,14 @@ public class Player extends GameEntity implements Comparable<Player> {
}
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("DamageSource", source);
runParams.put("DamageTarget", this);
runParams.put("DamageAmount", amount);
runParams.put("IsCombatDamage", isCombat);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.DamageSource, source);
runParams.put(AbilityKey.DamageTarget, this);
runParams.put(AbilityKey.DamageAmount, amount);
runParams.put(AbilityKey.IsCombatDamage, isCombat);
// Defending player at the time the damage was dealt
runParams.put("DefendingPlayer", game.getCombat() != null ? game.getCombat().getDefendingPlayerRelatedTo(source) : null);
game.getTriggerHandler().runTriggerOld(TriggerType.DamageDone, runParams, false);
runParams.put(AbilityKey.DefendingPlayer, game.getCombat() != null ? game.getCombat().getDefendingPlayerRelatedTo(source) : null);
game.getTriggerHandler().runTrigger(TriggerType.DamageDone, runParams, false);
game.fireEvent(new GameEventPlayerDamaged(this, source, amount, isCombat, infect));
@@ -908,7 +908,7 @@ public class Player extends GameEntity implements Comparable<Player> {
}
int addAmount = n;
if(addAmount <= 0) {
if (addAmount <= 0) {
// Can't add negative or 0 counters, bail out now
return 0;
}
@@ -922,29 +922,29 @@ public class Player extends GameEntity implements Comparable<Player> {
repParams.put("EffectOnly", applyMultiplier);
switch (getGame().getReplacementHandler().run(repParams)) {
case NotReplaced:
break;
case Updated: {
addAmount = (int) repParams.get("CounterNum");
break;
}
default:
return 0;
case NotReplaced:
break;
case Updated: {
addAmount = (int) repParams.get("CounterNum");
break;
}
default:
return 0;
}
final int oldValue = getCounters(counterType);
final int newValue = addAmount + oldValue;
this.setCounters(counterType, newValue, fireEvents);
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Player", this);
runParams.put("Source", this);
runParams.put("CounterType", counterType);
final Map<AbilityKey, Object> runParams = Maps.newHashMap();
runParams.put(AbilityKey.Player, this);
runParams.put(AbilityKey.Source, this);
runParams.put(AbilityKey.CounterType, counterType);
for (int i = 0; i < addAmount; i++) {
getGame().getTriggerHandler().runTriggerOld(TriggerType.CounterAdded, runParams, false);
getGame().getTriggerHandler().runTrigger(TriggerType.CounterAdded, runParams, false);
}
if (addAmount > 0) {
getGame().getTriggerHandler().runTriggerOld(TriggerType.CounterAddedOnce, runParams, false);
getGame().getTriggerHandler().runTrigger(TriggerType.CounterAddedOnce, runParams, false);
}
if (table != null) {
table.put(this, counterType, addAmount);
@@ -1283,14 +1283,14 @@ public class Player extends GameEntity implements Comparable<Player> {
repParams.put("SurveilNum", num);
switch (getGame().getReplacementHandler().run(repParams)) {
case NotReplaced:
break;
case Updated: {
num = (int) repParams.get("SurveilNum");
break;
}
default:
return;
case NotReplaced:
break;
case Updated: {
num = (int) repParams.get("SurveilNum");
break;
}
default:
return;
}
final CardCollection topN = new CardCollection(this.getCardsIn(ZoneType.Library, num));
@@ -1307,7 +1307,7 @@ public class Player extends GameEntity implements Comparable<Player> {
int numToTop = 0;
if (toGrave != null) {
for(Card c : toGrave) {
for (Card c : toGrave) {
getGame().getAction().moveToGraveyard(c, cause);
numToGrave++;
}
@@ -1315,7 +1315,7 @@ public class Player extends GameEntity implements Comparable<Player> {
if (toTop != null) {
Collections.reverse(toTop); // the last card in list will become topmost in library, have to revert thus.
for(Card c : toTop) {
for (Card c : toTop) {
getGame().getAction().moveToLibrary(c, cause);
numToTop++;
}
@@ -1324,10 +1324,10 @@ public class Player extends GameEntity implements Comparable<Player> {
getGame().fireEvent(new GameEventSurveil(this, numToTop, numToGrave));
surveilThisTurn++;
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Player", this);
runParams.put("NumThisTurn", surveilThisTurn);
getGame().getTriggerHandler().runTriggerOld(TriggerType.Surveil, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Player, this);
runParams.put(AbilityKey.NumThisTurn, surveilThisTurn);
getGame().getTriggerHandler().runTrigger(TriggerType.Surveil, runParams, false);
}
public int getSurveilThisTurn() {
@@ -1415,11 +1415,11 @@ public class Player extends GameEntity implements Comparable<Player> {
view.updateNumDrawnThisTurn(this);
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Card", c);
runParams.put("Number", numDrawnThisTurn);
runParams.put("Player", this);
game.getTriggerHandler().runTriggerOld(TriggerType.Drawn, runParams, false);
final Map<AbilityKey, Object> runParams = Maps.newHashMap();
runParams.put(AbilityKey.Card, c);
runParams.put(AbilityKey.Number, numDrawnThisTurn);
runParams.put(AbilityKey.Player, this);
game.getTriggerHandler().runTrigger(TriggerType.Drawn, runParams, false);
}
else { // Lose by milling is always on. Give AI many cards it cannot play if you want it not to undertake actions
triedToDrawFromEmptyLibrary = true;
@@ -1603,12 +1603,12 @@ public class Player extends GameEntity implements Comparable<Player> {
}
}
}
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Player", this);
runParams.put("Card", c);
runParams.put("Cause", cause);
runParams.put("IsMadness", Boolean.valueOf(discardMadness));
game.getTriggerHandler().runTriggerOld(TriggerType.Discarded, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Player, this);
runParams.put(AbilityKey.Card, c);
runParams.put(AbilityKey.Cause, cause);
runParams.put(AbilityKey.IsMadness, discardMadness);
game.getTriggerHandler().runTrigger(TriggerType.Discarded, runParams, false);
game.getGameLog().add(GameLogEntryType.DISCARD, sb.toString());
return newCard;
}
@@ -1686,10 +1686,10 @@ public class Player extends GameEntity implements Comparable<Player> {
getZone(ZoneType.Library).setCards(getController().cheatShuffle(list));
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Player", this);
runParams.put("Source", sa);
game.getTriggerHandler().runTriggerOld(TriggerType.Shuffled, runParams, false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Player, this);
runParams.put(AbilityKey.Source, sa);
game.getTriggerHandler().runTrigger(TriggerType.Shuffled, runParams, false);
// Play the shuffle sound
game.fireEvent(new GameEventShuffle(this));
@@ -1717,9 +1717,7 @@ public class Player extends GameEntity implements Comparable<Player> {
game.fireEvent(new GameEventLandPlayed(this, land));
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Card", land);
game.getTriggerHandler().runTriggerOld(TriggerType.LandPlayed, runParams, false);
game.getTriggerHandler().runTrigger(TriggerType.LandPlayed, AbilityKey.mapFromCard(land), false);
game.getStack().unfreezeStack();
addLandPlayedThisTurn();
}
@@ -1827,11 +1825,14 @@ public class Player extends GameEntity implements Comparable<Player> {
activateLoyaltyAbilityThisTurn = b;
}
public final boolean getAttackedWithCreatureThisTurn() {
return attackedWithCreatureThisTurn;
public final CardCollection getCreaturesAttackedThisTurn() {
return creatureAttackedThisTurn;
}
public final void setAttackedWithCreatureThisTurn(final boolean b) {
attackedWithCreatureThisTurn = b;
public final void addCreaturesAttackedThisTurn(final Card c) {
creatureAttackedThisTurn.add(c);
}
public final void clearCreaturesAttackedThisTurn() {
creatureAttackedThisTurn.clear();
}
public final int getAttackersDeclaredThisTurn() {
@@ -2152,10 +2153,10 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public final void addInvestigatedThisTurn() {
investigatedThisTurn++;
Map<String,Object> runParams = Maps.newHashMap();
runParams.put("Player", this);
runParams.put("Num", investigatedThisTurn);
game.getTriggerHandler().runTriggerOld(TriggerType.Investigated, runParams,false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Player, this);
runParams.put(AbilityKey.Num, investigatedThisTurn);
game.getTriggerHandler().runTrigger(TriggerType.Investigated, runParams,false);
}
public final void resetInvestigatedThisTurn() {
investigatedThisTurn = 0;
@@ -2173,14 +2174,14 @@ public class Player extends GameEntity implements Comparable<Player> {
sacrificedThisTurn.add(cpy);
// Run triggers
final Map<String, Object> runParams = Maps.newHashMap();
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
// use a copy that preserves last known information about the card (e.g. for Savra, Queen of the Golgari + Painter's Servant)
runParams.put("Card", cpy);
runParams.put("Player", this);
runParams.put("Cause", source);
runParams.put("CostStack", game.costPaymentStack);
runParams.put("IndividualCostPaymentInstance", game.costPaymentStack.peek());
game.getTriggerHandler().runTriggerOld(TriggerType.Sacrificed, runParams, false);
runParams.put(AbilityKey.Card, cpy);
runParams.put(AbilityKey.Player, this);
runParams.put(AbilityKey.Cause, source);
runParams.put(AbilityKey.CostStack, game.costPaymentStack);
runParams.put(AbilityKey.IndividualCostPaymentInstance, game.costPaymentStack.peek());
game.getTriggerHandler().runTrigger(TriggerType.Sacrificed, runParams, false);
}
public final void resetSacrificedThisTurn() {
@@ -2209,6 +2210,7 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public final void addSpellCastThisTurn() {
spellsCastThisTurn++;
spellsCastThisGame++;
achievementTracker.spellsCast++;
if (spellsCastThisTurn > achievementTracker.maxStormCount) {
achievementTracker.maxStormCount = spellsCastThisTurn;
@@ -2220,7 +2222,12 @@ public class Player extends GameEntity implements Comparable<Player> {
public final void setSpellsCastLastTurn(int num) {
spellsCastLastTurn = num;
}
public final int getSpellsCastThisGame() {
return spellsCastThisGame;
}
public final void resetSpellCastThisGame() {
spellsCastThisGame = 0;
}
public final int getLifeGainedByTeamThisTurn() {
return lifeGainedByTeamThisTurn;
}
@@ -2392,7 +2399,7 @@ public class Player extends GameEntity implements Comparable<Player> {
resetNumDrawnThisTurn();
resetNumDiscardedThisTurn();
setNumCardsInHandStartedThisTurnWith(getCardsIn(ZoneType.Hand).size());
setAttackedWithCreatureThisTurn(false);
clearCreaturesAttackedThisTurn();
setActivateLoyaltyAbilityThisTurn(false);
setTappedLandForManaThisTurn(false);
setLandsPlayedLastTurn(getLandsPlayedThisTurn());
@@ -2524,9 +2531,9 @@ public class Player extends GameEntity implements Comparable<Player> {
game.setActivePlanes(currentPlanes);
//Run PlaneswalkedTo triggers here.
Map<String,Object> runParams = Maps.newHashMap();
runParams.put("Cards", currentPlanes);
game.getTriggerHandler().runTriggerOld(TriggerType.PlaneswalkedTo, runParams,false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Cards, currentPlanes);
game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedTo, runParams,false);
view.updateCurrentPlaneName(currentPlanes.toString().replaceAll(" \\(.*","").replace("[",""));
}
@@ -2535,8 +2542,9 @@ public class Player extends GameEntity implements Comparable<Player> {
*/
public void leaveCurrentPlane() {
final Map<String, Object> runParams = new ImmutableMap.Builder<String, Object>().put("Cards", new CardCollection(currentPlanes)).build();
game.getTriggerHandler().runTriggerOld(TriggerType.PlaneswalkedFrom, runParams,false);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.Cards, new CardCollection(currentPlanes));
game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedFrom, runParams,false);
for (final Card plane : currentPlanes) {
//game.getZoneOf(plane).remove(plane);

View File

@@ -225,6 +225,15 @@ public class PlayerProperty {
if (!Expressions.compare(list.size(), comparator, y)) {
return false;
}
} else if (property.startsWith("HasCardsIn")) { // HasCardsIn[zonetype]_[cardtype]_[comparator]
final String[] type = property.substring(10).split("_");
final CardCollectionView list = CardLists.getValidCards(player.getCardsIn(ZoneType.smartValueOf(type[0])), type[1], sourceController, source);
String comparator = type[2];
String compareTo = comparator.substring(2);
int y = StringUtils.isNumeric(compareTo) ? Integer.parseInt(compareTo) : 0;
if (!Expressions.compare(list.size(), comparator, y)) {
return false;
}
} else if (property.startsWith("withMore")) {
final String cardType = property.split("sThan")[0].substring(8);
final Player controller = "Active".equals(property.split("sThan")[1]) ? game.getPhaseHandler().getPlayerTurn() : sourceController;

View File

@@ -24,6 +24,7 @@ import com.google.common.collect.Maps;
import forge.card.mana.ManaCost;
import forge.game.*;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.Card;
@@ -138,7 +139,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
private HashMap<String, CardCollection> paidLists = Maps.newHashMap();
private Map<String, Object> triggeringObjects = Maps.newHashMap();
private EnumMap<AbilityKey, Object> triggeringObjects = AbilityKey.newMap();
private HashMap<String, Object> replacingObjects = Maps.newHashMap();
@@ -552,23 +553,23 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
return sa;
}
public Map<String, Object> getTriggeringObjects() {
public Map<AbilityKey, Object> getTriggeringObjects() {
return triggeringObjects;
}
public void setTriggeringObjects(final Map<String, Object> triggeredObjects) {
triggeringObjects = Maps.newHashMap(triggeredObjects);
public void setTriggeringObjects(final Map<AbilityKey, Object> triggeredObjects) {
triggeringObjects = AbilityKey.newMap(triggeredObjects);
}
public Object getTriggeringObject(final String type) {
public Object getTriggeringObject(final AbilityKey type) {
return triggeringObjects.get(type);
}
public void setTriggeringObject(final String type, final Object o) {
public void setTriggeringObject(final AbilityKey type, final Object o) {
triggeringObjects.put(type, o);
}
public boolean hasTriggeringObject(final String type) {
public boolean hasTriggeringObject(final AbilityKey type) {
return triggeringObjects.containsKey(type);
}
public void resetTriggeringObjects() {
triggeringObjects = Maps.newHashMap();
triggeringObjects = AbilityKey.newMap();
}
public List<Object> getTriggerRemembered() {
@@ -877,7 +878,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
clone.originalMapParams = Maps.newHashMap(this.originalMapParams);
clone.mapParams = Maps.newHashMap(this.mapParams);
clone.triggeringObjects = Maps.newHashMap(this.triggeringObjects);
clone.triggeringObjects = AbilityKey.newMap(this.triggeringObjects);
if (getPayCosts() != null) {
clone.setPayCosts(getPayCosts().copy());

View File

@@ -18,6 +18,7 @@
package forge.game.spellability;
import forge.game.IIdentifiable;
import forge.game.ability.AbilityKey;
import forge.game.ability.ApiType;
import forge.game.card.Card;
import forge.game.card.CardCollection;
@@ -91,7 +92,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView {
// is Kicked, is Buyback
// Triggers
private final Map<String, Object> triggeringObjects;
private final Map<AbilityKey, Object> triggeringObjects;
private final List<Object> triggerRemembered;
private final Map<String, String> storedSVars = Maps.newHashMap();
@@ -342,27 +343,28 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView {
}
// Run BecomesTargetTrigger
Map<String, Object> runParams = new HashMap<>();
runParams.put("SourceSA", ability);
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.SourceSA, ability);
Set<Object> distinctObjects = new HashSet<>();
for (final Object tgt : target.getTargets()) {
if (distinctObjects.contains(tgt)) {
continue;
}
distinctObjects.add(tgt);
if (tgt instanceof Card && !((Card) tgt).hasBecomeTargetThisTurn()) {
runParams.put("FirstTime", null);
runParams.put(AbilityKey.FirstTime, null);
((Card) tgt).setBecameTargetThisTurn(true);
}
runParams.put("Target", tgt);
getSourceCard().getGame().getTriggerHandler().runTriggerOld(TriggerType.BecomesTarget, runParams, false);
runParams.put(AbilityKey.Target, tgt);
getSourceCard().getGame().getTriggerHandler().runTrigger(TriggerType.BecomesTarget, runParams, false);
}
runParams.put("Targets", target.getTargets());
getSourceCard().getGame().getTriggerHandler().runTriggerOld(TriggerType.BecomesTargetOnce, runParams, false);
runParams.put(AbilityKey.Targets, target.getTargets());
getSourceCard().getGame().getTriggerHandler().runTrigger(TriggerType.BecomesTargetOnce, runParams, false);
}
}
public boolean addTriggeringObject(String trigObj, Object value) {
public boolean addTriggeringObject(AbilityKey trigObj, Object value) {
if (!triggeringObjects.containsKey(trigObj)) {
triggeringObjects.put(trigObj, value);
return true;
@@ -370,7 +372,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView {
return false;
}
public boolean updateTriggeringObject(String trigObj, Object value) {
public boolean updateTriggeringObject(AbilityKey trigObj, Object value) {
if (triggeringObjects.containsKey(trigObj)) {
triggeringObjects.replace(trigObj, value);
return true;
@@ -378,7 +380,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView {
return false;
}
public Object getTriggeringObject(String trigObj) {
public Object getTriggeringObject(AbilityKey trigObj) {
if (triggeringObjects.containsKey(trigObj)) {
return triggeringObjects.get(trigObj);
}

View File

@@ -527,7 +527,7 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
}
if (hasParam("PlayerAttackedWithCreatureThisTurn")
&& !player.getAttackedWithCreatureThisTurn()) {
&& player.getCreaturesAttackedThisTurn().isEmpty()) {
return false;
}

View File

@@ -21,6 +21,7 @@ import forge.game.Game;
import forge.game.GameEntity;
import forge.game.TriggerReplacementBase;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityKey;
import forge.game.ability.ApiType;
import forge.game.ability.effects.CharmEffect;
import forge.game.card.Card;
@@ -36,7 +37,6 @@ import forge.game.zone.ZoneType;
import java.util.*;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.util.TextUtil;
@@ -70,7 +70,7 @@ public abstract class Trigger extends TriggerReplacementBase {
private TriggerType mode;
private Map<String, Object> storedTriggeredObjects = null;
private Map<AbilityKey, Object> storedTriggeredObjects = null;
private List<Object> triggerRemembered = Lists.newArrayList();
@@ -87,8 +87,8 @@ public abstract class Trigger extends TriggerReplacementBase {
* a {@link java.util.HashMap} object.
* @since 1.0.15
*/
public final void setStoredTriggeredObjects(final Map<String, Object> storedTriggeredObjects) {
this.storedTriggeredObjects = Maps.newHashMap(storedTriggeredObjects);
public final void setStoredTriggeredObjects(final Map<AbilityKey, Object> storedTriggeredObjects) {
this.storedTriggeredObjects = AbilityKey.newMap(storedTriggeredObjects);
}
/**
@@ -99,7 +99,7 @@ public abstract class Trigger extends TriggerReplacementBase {
* @return a {@link java.util.HashMap} object.
* @since 1.0.15
*/
public final Map<String, Object> getStoredTriggeredObjects() {
public final Map<AbilityKey, Object> getStoredTriggeredObjects() {
return this.storedTriggeredObjects;
}
@@ -363,9 +363,9 @@ public abstract class Trigger extends TriggerReplacementBase {
}
public boolean meetsRequirementsOnTriggeredObjects(Game game, Map<String, Object> runParams) {
public boolean meetsRequirementsOnTriggeredObjects(Game game, final Map<AbilityKey, Object> runParams) {
if ("True".equals(this.mapParams.get("EvolveCondition"))) {
final Card moved = (Card) runParams.get("Card");
final Card moved = (Card) runParams.get(AbilityKey.Card);
if (moved == null) {
return false;
// final StringBuilder sb = new StringBuilder();
@@ -381,26 +381,26 @@ public abstract class Trigger extends TriggerReplacementBase {
String condition = this.mapParams.get("Condition");
if ("AltCost".equals(condition)) {
final Card moved = (Card) runParams.get("Card");
final Card moved = (Card) runParams.get(AbilityKey.Card);
if( null != moved && !moved.isOptionalCostPaid(OptionalCost.AltCost))
return false;
} else if ("AttackedPlayerWithMostLife".equals(condition)) {
GameEntity attacked = (GameEntity) runParams.get("Attacked");
GameEntity attacked = (GameEntity) runParams.get(AbilityKey.Attacked);
if (attacked == null) {
// Check "Defender" too because once triggering objects are set on TriggerAttacks, the value of Attacked
// ends up being in Defender at that point.
attacked = (GameEntity) runParams.get("Defender");
attacked = (GameEntity) runParams.get(AbilityKey.Defender);
}
if (attacked == null || !attacked.isValid("Player.withMostLife",
this.getHostCard().getController(), this.getHostCard(), null)) {
return false;
}
} else if ("AttackedPlayerWhoAttackedYouLastTurn".equals(condition)) {
GameEntity attacked = (GameEntity) runParams.get("Attacked");
GameEntity attacked = (GameEntity) runParams.get(AbilityKey.Attacked);
if (attacked == null) {
// Check "Defender" too because once triggering objects are set on TriggerAttacks, the value of Attacked
// ends up being in Defender at that point.
attacked = (GameEntity) runParams.get("DefendingPlayer");
attacked = (GameEntity) runParams.get(AbilityKey.DefendingPlayer);
}
Player attacker = this.getHostCard().getController();

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -62,7 +63,7 @@ public class TriggerAbandoned extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Scheme", this.getRunParams().get("Scheme"));
sa.setTriggeringObject(AbilityKey.Scheme, this.getRunParams().get("Scheme"));
}
@Override

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -63,13 +64,13 @@ public class TriggerAdapt extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Adapt: ").append(sa.getTriggeringObject("Card"));
sb.append("Adapt: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -72,14 +73,14 @@ public class TriggerAttached extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Source", this.getRunParams().get("AttachSource"));
sa.setTriggeringObject("Target", this.getRunParams().get("AttachTarget"));
sa.setTriggeringObject(AbilityKey.Source, this.getRunParams().get("AttachSource"));
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("AttachTarget"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Attachee: ").append(sa.getTriggeringObject("Target"));
sb.append("Attachee: ").append(sa.getTriggeringObject(AbilityKey.Target));
return sb.toString();
}
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CardLists;
import forge.game.spellability.SpellAbility;
@@ -84,18 +85,18 @@ public class TriggerAttackerBlocked extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Attacker", getRunParams().get("Attacker"));
sa.setTriggeringObject("Blockers", getRunParams().get("Blockers"));
sa.setTriggeringObject("Defender", getRunParams().get("Defender"));
sa.setTriggeringObject("DefendingPlayer", getRunParams().get("DefendingPlayer"));
sa.setTriggeringObject("NumBlockers", getRunParams().get("NumBlockers"));
sa.setTriggeringObject(AbilityKey.Attacker, getRunParams().get("Attacker"));
sa.setTriggeringObject(AbilityKey.Blockers, getRunParams().get("Blockers"));
sa.setTriggeringObject(AbilityKey.Defender, getRunParams().get("Defender"));
sa.setTriggeringObject(AbilityKey.DefendingPlayer, getRunParams().get("DefendingPlayer"));
sa.setTriggeringObject(AbilityKey.NumBlockers, getRunParams().get("NumBlockers"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Attacker: ").append(sa.getTriggeringObject("Attacker")).append(", ");
sb.append("Number Blockers: ").append(sa.getTriggeringObject("NumBlockers"));
sb.append("Attacker: ").append(sa.getTriggeringObject(AbilityKey.Attacker)).append(", ");
sb.append("Number Blockers: ").append(sa.getTriggeringObject(AbilityKey.NumBlockers));
return sb.toString();
}
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -87,15 +88,15 @@ public class TriggerAttackerBlockedByCreature extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Attacker", this.getRunParams().get("Attacker"));
sa.setTriggeringObject("Blocker", this.getRunParams().get("Blocker"));
sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker"));
sa.setTriggeringObject(AbilityKey.Blocker, this.getRunParams().get("Blocker"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Attacker: ").append(sa.getTriggeringObject("Attacker")).append(", ");
sb.append("Blocker: ").append(sa.getTriggeringObject("Blocker"));
sb.append("Attacker: ").append(sa.getTriggeringObject(AbilityKey.Attacker)).append(", ");
sb.append("Blocker: ").append(sa.getTriggeringObject(AbilityKey.Blocker));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -69,15 +70,15 @@ public class TriggerAttackerUnblocked extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Attacker", this.getRunParams().get("Attacker"));
sa.setTriggeringObject("Defender", this.getRunParams().get("Defender"));
sa.setTriggeringObject("DefendingPlayer", this.getRunParams().get("DefendingPlayer"));
sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker"));
sa.setTriggeringObject(AbilityKey.Defender, this.getRunParams().get("Defender"));
sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Attacker: ").append(sa.getTriggeringObject("Attacker"));
sb.append("Attacker: ").append(sa.getTriggeringObject(AbilityKey.Attacker));
return sb.toString();
}
}

View File

@@ -18,6 +18,7 @@
package forge.game.trigger;
import forge.game.GameEntity;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -84,15 +85,15 @@ public class TriggerAttackerUnblockedOnce extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("AttackingPlayer", this.getRunParams().get("AttackingPlayer"));
sa.setTriggeringObject("Defenders", this.getRunParams().get("Defenders"));
sa.setTriggeringObject(AbilityKey.AttackingPlayer, this.getRunParams().get("AttackingPlayer"));
sa.setTriggeringObject(AbilityKey.Defenders, this.getRunParams().get("Defenders"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("AttackingPlayer: ").append(sa.getTriggeringObject("AttackingPlayer"));
sb.append("Defenders: ").append(sa.getTriggeringObject("Defenders"));
sb.append("AttackingPlayer: ").append(sa.getTriggeringObject(AbilityKey.AttackingPlayer));
sb.append("Defenders: ").append(sa.getTriggeringObject(AbilityKey.Defenders));
return sb.toString();
}
}

View File

@@ -18,6 +18,7 @@
package forge.game.trigger;
import forge.game.GameEntity;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -86,14 +87,14 @@ public class TriggerAttackersDeclared extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Attackers", this.getRunParams().get("Attackers"));
sa.setTriggeringObject("AttackingPlayer", this.getRunParams().get("AttackingPlayer"));
sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers"));
sa.setTriggeringObject(AbilityKey.AttackingPlayer, this.getRunParams().get("AttackingPlayer"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Number Attackers: ").append(sa.getTriggeringObject("Attackers"));
sb.append("Number Attackers: ").append(sa.getTriggeringObject(AbilityKey.Attackers));
return sb.toString();
}
}

View File

@@ -18,6 +18,7 @@
package forge.game.trigger;
import forge.game.GameEntity;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -124,17 +125,17 @@ public class TriggerAttacks extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Attacker", this.getRunParams().get("Attacker"));
sa.setTriggeringObject("Defender", this.getRunParams().get("Attacked"));
sa.setTriggeringObject("Defenders", this.getRunParams().get("Defenders"));
sa.setTriggeringObject("DefendingPlayer", this.getRunParams().get("DefendingPlayer"));
sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker"));
sa.setTriggeringObject(AbilityKey.Defender, this.getRunParams().get("Attacked"));
sa.setTriggeringObject(AbilityKey.Defenders, this.getRunParams().get("Defenders"));
sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Attacker: ").append(sa.getTriggeringObject("Attacker"));
sb.append("Attacker: ").append(sa.getTriggeringObject(AbilityKey.Attacker));
return sb.toString();
}
}

View File

@@ -3,6 +3,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -35,13 +36,13 @@ public class TriggerBecomeMonarch extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Player: ").append(sa.getTriggeringObject("Player")).append(", ");
sb.append("Player: ").append(sa.getTriggeringObject(AbilityKey.Player)).append(", ");
return sb.toString();
}
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -64,14 +65,14 @@ public class TriggerBecomeMonstrous extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", getRunParams().get("Card"));
sa.setTriggeringObject("MonstrosityAmount", getRunParams().get("MonstrosityAmount"));
sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.MonstrosityAmount, getRunParams().get("MonstrosityAmount"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Monstrous: ").append(sa.getTriggeringObject("Card"));
sb.append("Monstrous: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -62,13 +63,13 @@ public class TriggerBecomeRenowned extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Renowned: ").append(sa.getTriggeringObject("Card"));
sb.append("Renowned: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -88,16 +89,16 @@ public class TriggerBecomesTarget extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("SourceSA", this.getRunParams().get("SourceSA"));
sa.setTriggeringObject("Source", ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard());
sa.setTriggeringObject("Target", this.getRunParams().get("Target"));
sa.setTriggeringObject(AbilityKey.SourceSA, this.getRunParams().get("SourceSA"));
sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard());
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("Target"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Source: ").append(((SpellAbility) sa.getTriggeringObject("SourceSA")).getHostCard()).append(", ");
sb.append("Target: ").append(sa.getTriggeringObject("Target"));
sb.append("Source: ").append(((SpellAbility) sa.getTriggeringObject(AbilityKey.SourceSA)).getHostCard()).append(", ");
sb.append("Target: ").append(sa.getTriggeringObject(AbilityKey.Target));
return sb.toString();
}
}

View File

@@ -18,6 +18,7 @@
package forge.game.trigger;
import forge.game.GameObject;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -80,16 +81,16 @@ public class TriggerBecomesTargetOnce extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("SourceSA", this.getRunParams().get("SourceSA"));
sa.setTriggeringObject("Source", ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard());
sa.setTriggeringObject("Targets", this.getRunParams().get("Targets"));
sa.setTriggeringObject(AbilityKey.SourceSA, this.getRunParams().get("SourceSA"));
sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard());
sa.setTriggeringObject(AbilityKey.Targets, this.getRunParams().get("Targets"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Source: ").append(((SpellAbility) sa.getTriggeringObject("SourceSA")).getHostCard()).append(", ");
sb.append("Targets: ").append(sa.getTriggeringObject("Targets"));
sb.append("Source: ").append(((SpellAbility) sa.getTriggeringObject(AbilityKey.SourceSA)).getHostCard()).append(", ");
sb.append("Targets: ").append(sa.getTriggeringObject(AbilityKey.Targets));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -51,14 +52,14 @@ public class TriggerBlockersDeclared extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Blockers", this.getRunParams().get("Blockers"));
sa.setTriggeringObject("Attackers", this.getRunParams().get("Attackers"));
sa.setTriggeringObject(AbilityKey.Blockers, this.getRunParams().get("Blockers"));
sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Blockers: ").append(sa.getTriggeringObject("Blockers"));
sb.append("Blockers: ").append(sa.getTriggeringObject(AbilityKey.Blockers));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -88,14 +89,14 @@ public class TriggerBlocks extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Blocker", this.getRunParams().get("Blocker"));
sa.setTriggeringObject("Attackers", this.getRunParams().get("Attackers"));
sa.setTriggeringObject(AbilityKey.Blocker, this.getRunParams().get("Blocker"));
sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Blocker: ").append(sa.getTriggeringObject("Blocker"));
sb.append("Blocker: ").append(sa.getTriggeringObject(AbilityKey.Blocker));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -71,14 +72,14 @@ public class TriggerChampioned extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Championed", this.getRunParams().get("Championed"));
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Championed, this.getRunParams().get("Championed"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Championed: ").append(sa.getTriggeringObject("Championed"));
sb.append("Championed: ").append(sa.getTriggeringObject(AbilityKey.Championed));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -70,13 +71,13 @@ public class TriggerChangesController extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Changed Controller: ").append(sa.getTriggeringObject("Card"));
sb.append("Changed Controller: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -18,6 +18,7 @@
package forge.game.trigger;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.card.CardFactoryUtil;
@@ -217,13 +218,13 @@ public class TriggerChangesZone extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Zone Changer: ").append(sa.getTriggeringObject("Card"));
sb.append("Zone Changer: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}

View File

@@ -3,6 +3,7 @@ package forge.game.trigger;
import java.util.List;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.*;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
@@ -26,14 +27,14 @@ public class TriggerChangesZoneAll extends Trigger {
CardCollection allCards = this.filterCards(table);
sa.setTriggeringObject("Cards", allCards);
sa.setTriggeringObject("Amount", allCards.size());
sa.setTriggeringObject(AbilityKey.Cards, allCards);
sa.setTriggeringObject(AbilityKey.Amount, allCards.size());
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Amount: ").append(sa.getTriggeringObject("Amount"));
sb.append("Amount: ").append(sa.getTriggeringObject(AbilityKey.Amount));
return sb.toString();
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CounterType;
import forge.game.player.Player;
@@ -121,19 +122,19 @@ public class TriggerCounterAdded extends Trigger {
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
if (this.getRunParams().containsKey("Card"))
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
if (this.getRunParams().containsKey("Player"))
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Added once: ");
if (sa.hasTriggeringObject("Card"))
sb.append(sa.getTriggeringObject("Card"));
if (sa.hasTriggeringObject("Player"))
sb.append(sa.getTriggeringObject("Player"));
if (sa.hasTriggeringObject(AbilityKey.Card))
sb.append(sa.getTriggeringObject(AbilityKey.Card));
if (sa.hasTriggeringObject(AbilityKey.Player))
sb.append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
}

View File

@@ -6,6 +6,7 @@ import com.google.common.collect.Lists;
import forge.game.GameEntity;
import forge.game.GameEntityCounterTable;
import forge.game.ability.AbilityKey;
import forge.game.card.*;
import forge.game.spellability.SpellAbility;
@@ -33,14 +34,14 @@ public class TriggerCounterAddedAll extends Trigger {
amount += v;
}
sa.setTriggeringObject("Objects", Lists.newArrayList(all.keySet()));
sa.setTriggeringObject("Amount", amount);
sa.setTriggeringObject(AbilityKey.Objects, Lists.newArrayList(all.keySet()));
sa.setTriggeringObject(AbilityKey.Amount, amount);
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Amount: ").append(sa.getTriggeringObject("Amount"));
sb.append("Amount: ").append(sa.getTriggeringObject(AbilityKey.Amount));
return sb.toString();
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CounterType;
import forge.game.player.Player;
@@ -106,22 +107,22 @@ public class TriggerCounterAddedOnce extends Trigger {
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
if (this.getRunParams().containsKey("Card"))
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
if (this.getRunParams().containsKey("Player"))
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject("Amount", this.getRunParams().get("CounterAmount"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Amount, this.getRunParams().get("CounterAmount"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Added once: ");
if (sa.hasTriggeringObject("Card"))
sb.append(sa.getTriggeringObject("Card"));
if (sa.hasTriggeringObject("Player"))
sb.append(sa.getTriggeringObject("Player"));
if (sa.hasTriggeringObject(AbilityKey.Card))
sb.append(sa.getTriggeringObject(AbilityKey.Card));
if (sa.hasTriggeringObject(AbilityKey.Player))
sb.append(sa.getTriggeringObject(AbilityKey.Player));
sb.append(" Amount: ").append(sa.getTriggeringObject("Amount"));
sb.append(" Amount: ").append(sa.getTriggeringObject(AbilityKey.Amount));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CounterType;
import forge.game.spellability.SpellAbility;
@@ -82,13 +83,13 @@ public class TriggerCounterRemoved extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Removed from: ").append(sa.getTriggeringObject("Card"));
sb.append("Removed from: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CounterType;
import forge.game.spellability.SpellAbility;
@@ -73,15 +74,15 @@ public class TriggerCounterRemovedOnce extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject("Amount", this.getRunParams().get("CounterAmount"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Amount, this.getRunParams().get("CounterAmount"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Removed from: ").append(sa.getTriggeringObject("Card"));
sb.append(" Amount: ").append(sa.getTriggeringObject("Amount"));
sb.append("Removed from: ").append(sa.getTriggeringObject(AbilityKey.Card));
sb.append(" Amount: ").append(sa.getTriggeringObject(AbilityKey.Amount));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -92,17 +93,17 @@ public class TriggerCountered extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject("Cause", this.getRunParams().get("Cause"));
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject("CounteredSA", this.getRunParams().get("CounteredSA"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.CounteredSA, this.getRunParams().get("CounteredSA"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Countered: ").append(sa.getTriggeringObject("Card")).append(", ");
sb.append("Cause: ").append(sa.getTriggeringObject("Cause"));
sb.append("Countered: ").append(sa.getTriggeringObject(AbilityKey.Card)).append(", ");
sb.append("Cause: ").append(sa.getTriggeringObject(AbilityKey.Cause));
return sb.toString();
}
}

View File

@@ -1,5 +1,6 @@
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.spellability.SpellAbility;
@@ -38,16 +39,16 @@ public class TriggerCrewed extends Trigger {
@Override
public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject("Vehicle", this.getRunParams().get("Vehicle"));
sa.setTriggeringObject("Crew", this.getRunParams().get("Crew"));
sa.setTriggeringObject(AbilityKey.Vehicle, this.getRunParams().get("Vehicle"));
sa.setTriggeringObject(AbilityKey.Crew, this.getRunParams().get("Crew"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Vehicle: ").append(sa.getTriggeringObject("Vehicle"));
sb.append("Vehicle: ").append(sa.getTriggeringObject(AbilityKey.Vehicle));
sb.append(" ");
sb.append("Crew: ").append(sa.getTriggeringObject("Crew"));
sb.append("Crew: ").append(sa.getTriggeringObject(AbilityKey.Crew));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -49,13 +50,13 @@ public class TriggerCycled extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Cycled: ").append(sa.getTriggeringObject("Card"));
sb.append("Cycled: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}

View File

@@ -18,6 +18,7 @@
package forge.game.trigger;
import forge.game.GameEntity;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
import forge.util.Expressions;
@@ -105,17 +106,17 @@ public class TriggerDamageDealtOnce extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Source", this.getRunParams().get("DamageSource"));
sa.setTriggeringObject("Targets", this.getRunParams().get("DamageTargets"));
sa.setTriggeringObject("DamageAmount", this.getRunParams().get("DamageAmount"));
sa.setTriggeringObject(AbilityKey.Source, this.getRunParams().get("DamageSource"));
sa.setTriggeringObject(AbilityKey.Targets, this.getRunParams().get("DamageTargets"));
sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Damage Source: ").append(sa.getTriggeringObject("Source")).append(", ");
sb.append("Damaged: ").append(sa.getTriggeringObject("Targets")).append(", ");
sb.append("Amount: ").append(sa.getTriggeringObject("DamageAmount"));
sb.append("Damage Source: ").append(sa.getTriggeringObject(AbilityKey.Source)).append(", ");
sb.append("Damaged: ").append(sa.getTriggeringObject(AbilityKey.Targets)).append(", ");
sb.append("Amount: ").append(sa.getTriggeringObject(AbilityKey.DamageAmount));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CardUtil;
import forge.game.spellability.SpellAbility;
@@ -118,19 +119,19 @@ public class TriggerDamageDone extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Source", CardUtil.getLKICopy((Card)this.getRunParams().get("DamageSource")));
sa.setTriggeringObject("Target", this.getRunParams().get("DamageTarget"));
sa.setTriggeringObject("DamageAmount", this.getRunParams().get("DamageAmount"));
sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)this.getRunParams().get("DamageSource")));
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget"));
sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount"));
// This parameter is here because LKI information related to combat doesn't work properly
sa.setTriggeringObject("DefendingPlayer", this.getRunParams().get("DefendingPlayer"));
sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Damage Source: ").append(sa.getTriggeringObject("Source")).append(", ");
sb.append("Damaged: ").append(sa.getTriggeringObject("Target")).append(", ");
sb.append("Amount: ").append(sa.getTriggeringObject("DamageAmount"));
sb.append("Damage Source: ").append(sa.getTriggeringObject(AbilityKey.Source)).append(", ");
sb.append("Damaged: ").append(sa.getTriggeringObject(AbilityKey.Target)).append(", ");
sb.append("Amount: ").append(sa.getTriggeringObject(AbilityKey.DamageAmount));
return sb.toString();
}
}

View File

@@ -4,6 +4,7 @@ import java.util.Map;
import java.util.Set;
import forge.game.GameEntity;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -58,12 +59,12 @@ public class TriggerDamageDoneOnce extends Trigger {
@Override
public void setTriggeringObjects(SpellAbility sa) {
if (this.getRunParams().containsKey("DamageTarget")) {
sa.setTriggeringObject("Target", this.getRunParams().get("DamageTarget"));
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget"));
}
if (this.getRunParams().containsKey("DamageSources")) {
sa.setTriggeringObject("Sources", this.getRunParams().get("DamageSources"));
sa.setTriggeringObject(AbilityKey.Sources, this.getRunParams().get("DamageSources"));
}
sa.setTriggeringObject("DamageAmount", this.getRunParams().get("DamageAmount"));
sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount"));
}
@@ -71,10 +72,10 @@ public class TriggerDamageDoneOnce extends Trigger {
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
if (sa.getTriggeringObject("Target") != null) {
sb.append("Damaged: ").append(sa.getTriggeringObject("Target")).append(", ");
if (sa.getTriggeringObject(AbilityKey.Target) != null) {
sb.append("Damaged: ").append(sa.getTriggeringObject(AbilityKey.Target)).append(", ");
}
sb.append("Amount: ").append(sa.getTriggeringObject("DamageAmount"));
sb.append("Amount: ").append(sa.getTriggeringObject(AbilityKey.DamageAmount));
return sb.toString();
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CardUtil;
import forge.game.spellability.SpellAbility;
@@ -102,17 +103,17 @@ public class TriggerDamagePrevented extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Source", CardUtil.getLKICopy((Card)this.getRunParams().get("DamageSource")));
sa.setTriggeringObject("Target", this.getRunParams().get("DamageTarget"));
sa.setTriggeringObject("DamageAmount", this.getRunParams().get("DamageAmount"));
sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)this.getRunParams().get("DamageSource")));
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget"));
sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Damage Source: ").append(sa.getTriggeringObject("Source")).append(", ");
sb.append("Damage Target: ").append(sa.getTriggeringObject("Target")).append(", ");
sb.append("Amount: ").append(sa.getTriggeringObject("DamageAmount"));
sb.append("Damage Source: ").append(sa.getTriggeringObject(AbilityKey.Source)).append(", ");
sb.append("Damage Target: ").append(sa.getTriggeringObject(AbilityKey.Target)).append(", ");
sb.append("Amount: ").append(sa.getTriggeringObject(AbilityKey.DamageAmount));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
import forge.util.Expressions;
@@ -93,15 +94,15 @@ public class TriggerDamagePreventedOnce extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Target", this.getRunParams().get("DamageTarget"));
sa.setTriggeringObject("DamageAmount", this.getRunParams().get("DamageAmount"));
sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget"));
sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Damage Target: ").append(sa.getTriggeringObject("Target")).append(", ");
sb.append("Amount: ").append(sa.getTriggeringObject("DamageAmount"));
sb.append("Damage Target: ").append(sa.getTriggeringObject(AbilityKey.Target)).append(", ");
sb.append("Amount: ").append(sa.getTriggeringObject(AbilityKey.DamageAmount));
return sb.toString();
}
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -67,15 +68,15 @@ public class TriggerDestroyed extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject("Causer", this.getRunParams().get("Causer"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Causer, this.getRunParams().get("Causer"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Destroyed: ").append(sa.getTriggeringObject("Card")).append(", ");
sb.append("Destroyer: ").append(sa.getTriggeringObject("Causer"));
sb.append("Destroyed: ").append(sa.getTriggeringObject(AbilityKey.Card)).append(", ");
sb.append("Destroyer: ").append(sa.getTriggeringObject(AbilityKey.Causer));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -60,13 +61,13 @@ public class TriggerDevoured extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Devoured", this.getRunParams().get("Devoured"));
sa.setTriggeringObject(AbilityKey.Devoured, this.getRunParams().get("Devoured"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Devoured: ").append(sa.getTriggeringObject("Devoured"));
sb.append("Devoured: ").append(sa.getTriggeringObject(AbilityKey.Devoured));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -85,15 +86,15 @@ public class TriggerDiscarded extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject("Cause", this.getRunParams().get("Cause"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Discarded: ").append(sa.getTriggeringObject("Card")).append(", ");
sb.append("Cause: ").append(sa.getTriggeringObject("Cause"));
sb.append("Discarded: ").append(sa.getTriggeringObject(AbilityKey.Card)).append(", ");
sb.append("Cause: ").append(sa.getTriggeringObject(AbilityKey.Cause));
return sb.toString();
}
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import forge.game.Game;
import forge.game.GameStage;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -80,14 +81,14 @@ public class TriggerDrawn extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", getRunParams().get("Card"));
sa.setTriggeringObject("Player", getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Player: ").append(sa.getTriggeringObject("Player"));
sb.append("Player: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -61,13 +62,13 @@ public class TriggerEvolved extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Evolved: ").append(sa.getTriggeringObject("Card"));
sb.append("Evolved: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -1,5 +1,6 @@
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -32,14 +33,14 @@ public class TriggerExerted extends Trigger {
@Override
public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Exerted: ").append(sa.getTriggeringObject("Card"));
sb.append("Exerted: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -96,13 +97,13 @@ public class TriggerExiled extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Exiled: ").append(sa.getTriggeringObject("Card"));
sb.append("Exiled: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -71,15 +72,15 @@ public class TriggerExploited extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Exploited", this.getRunParams().get("Exploited"));
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Exploited, this.getRunParams().get("Exploited"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Exploited: ").append(sa.getTriggeringObject("Exploited")).append(", ");
sb.append("Exploiter: ").append(sa.getTriggeringObject("Card"));
sb.append("Exploited: ").append(sa.getTriggeringObject(AbilityKey.Exploited)).append(", ");
sb.append("Exploiter: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -61,14 +62,14 @@ public class TriggerExplores extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Explorer", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Explorer, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Explorer: ").append(sa.getTriggeringObject("Explorer"));
sb.append("Explorer: ").append(sa.getTriggeringObject(AbilityKey.Explorer));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -62,13 +63,13 @@ public class TriggerFight extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Fighter", this.getRunParams().get("Fighter"));
sa.setTriggeringObject(AbilityKey.Fighter, this.getRunParams().get("Fighter"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Fighter: ").append(sa.getTriggeringObject("Fighter"));
sb.append("Fighter: ").append(sa.getTriggeringObject(AbilityKey.Fighter));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -69,13 +70,13 @@ public class TriggerFlippedCoin extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Player: ").append(sa.getTriggeringObject("Player"));
sb.append("Player: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
}

View File

@@ -322,13 +322,6 @@ public class TriggerHandler {
}
public final void runTrigger(final TriggerType mode, final Map<AbilityKey, Object> runParams, boolean holdTrigger) {
runTriggerOld(mode, toStringMap(runParams), holdTrigger);
}
// The plan is to slowly refactor any usages of `runTriggerOld` to use `runTrigger`. Then we can just inline
// `runTriggerOld` into `runTrigger` and change the code inside to just always use a `Map<TriggerKey, Object>`.
// The reason we can't just call them both `runTrigger` is because we get a `same erasure` compile error if we do.
@Deprecated
public final void runTriggerOld(final TriggerType mode, final Map<String, Object> runParams, boolean holdTrigger) {
if (suppressedModes.contains(mode)) {
return;
}
@@ -342,10 +335,10 @@ public class TriggerHandler {
}
}
private void runStateTrigger(Map<String, Object> runParams) {
private void runStateTrigger(final Map<AbilityKey, Object> runParams) {
for (final Trigger t: activeTriggers) {
if (canRunTrigger(t, TriggerType.Always, runParams)) {
runSingleTrigger(t, runParams);
runSingleTrigger(t, toStringMap(runParams));
}
}
}
@@ -367,7 +360,7 @@ public class TriggerHandler {
private boolean runWaitingTrigger(final TriggerWaiting wt) {
final TriggerType mode = wt.getMode();
final Map<String, Object> runParams = wt.getParams();
final Map<AbilityKey, Object> runParams = wt.getParams();
final Player playerAP = game.getPhaseHandler().getPlayerTurn();
if (playerAP == null) {
@@ -383,19 +376,19 @@ public class TriggerHandler {
// Static triggers
for (final Trigger t : Lists.newArrayList(activeTriggers)) {
if (t.isStatic() && canRunTrigger(t, mode, runParams)) {
runSingleTrigger(t, runParams);
runSingleTrigger(t, toStringMap(runParams));
checkStatics = true;
}
}
if (runParams.containsKey("Destination")) {
if (runParams.containsKey(AbilityKey.Destination)) {
// Check static abilities when a card enters the battlefield
if (runParams.get("Destination") instanceof String) {
final String type = (String) runParams.get("Destination");
if (runParams.get(AbilityKey.Destination) instanceof String) {
final String type = (String) runParams.get(AbilityKey.Destination);
checkStatics |= type.equals("Battlefield");
} else {
final ZoneType zone = (ZoneType) runParams.get("Destination");
final ZoneType zone = (ZoneType) runParams.get(AbilityKey.Destination);
checkStatics |= zone.equals(ZoneType.Battlefield);
}
}
@@ -425,8 +418,9 @@ public class TriggerHandler {
private boolean runNonStaticTriggersForPlayer(final Player player, final TriggerWaiting wt, final List<Trigger> delayedTriggersWorkingCopy ) {
final TriggerType mode = wt.getMode();
final Map<String, Object> runParams = wt.getParams();
final TriggerType mode = wt.getMode();
final Map<AbilityKey, Object> runParams = wt.getParams();
final Map<String, Object> stringRunParams = toStringMap(runParams);
final List<Trigger> triggers = wt.getTriggers() != null ? wt.getTriggers() : activeTriggers;
Card card = null;
@@ -434,18 +428,20 @@ public class TriggerHandler {
for (final Trigger t : triggers) {
if (!t.isStatic() && t.getHostCard().getController().equals(player) && canRunTrigger(t, mode, runParams)) {
if (runParams.containsKey("Card") && runParams.get("Card") instanceof Card) {
card = (Card) runParams.get("Card");
if (runParams.containsKey("Destination") && !ZoneType.Battlefield.name().equals(runParams.get("Destination"))) {
if (runParams.containsKey(AbilityKey.Card) && runParams.get(AbilityKey.Card) instanceof Card) {
card = (Card) runParams.get(AbilityKey.Card);
if (runParams.containsKey(AbilityKey.Destination)
&& !ZoneType.Battlefield.name().equals(runParams.get(AbilityKey.Destination))) {
card = CardUtil.getLKICopy(card);
if (card.isCloned() || !t.isIntrinsic()) {
runParams.put("Card", card);
runParams.put(AbilityKey.Card, card);
}
}
}
if (t.getMapParams().containsKey("OncePerEffect")) {
SpellAbilityStackInstance si = (SpellAbilityStackInstance) runParams.get("SpellAbilityStackInstance");
SpellAbilityStackInstance si =
(SpellAbilityStackInstance) runParams.get(AbilityKey.SpellAbilityStackInstance);
if (si != null) {
si.addOncePerEffectTrigger(t);
}
@@ -454,7 +450,7 @@ public class TriggerHandler {
int x = 1 + handlePanharmonicon(t, runParams, player);
for (int i = 0; i < x; ++i) {
runSingleTrigger(t, runParams);
runSingleTrigger(t, stringRunParams);
}
checkStatics = true;
}
@@ -463,7 +459,7 @@ public class TriggerHandler {
for (final Trigger deltrig : delayedTriggersWorkingCopy) {
if (deltrig.getHostCard().getController().equals(player)) {
if (isTriggerActive(deltrig) && canRunTrigger(deltrig, mode, runParams)) {
runSingleTrigger(deltrig, runParams);
runSingleTrigger(deltrig, stringRunParams);
delayedTriggers.remove(deltrig);
}
}
@@ -505,7 +501,7 @@ public class TriggerHandler {
return true;
}
private boolean canRunTrigger(final Trigger regtrig, final TriggerType mode, final Map<String, Object> runParams) {
private boolean canRunTrigger(final Trigger regtrig, final TriggerType mode, final Map<AbilityKey, Object> runParams) {
if (regtrig.getMode() != mode) {
return false; // Not the right mode.
}
@@ -518,7 +514,7 @@ public class TriggerHandler {
return false; // Conditions aren't right.
}
if (!regtrig.performTest(runParams)) {
if (!regtrig.performTest(toStringMap(runParams))) {
return false; // Test failed.
}
if (regtrig.isSuppressed()) {
@@ -535,10 +531,10 @@ public class TriggerHandler {
// Torpor Orb check
if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCreatureETBTriggers)
&& !regtrig.isStatic() && mode.equals(TriggerType.ChangesZone)) {
if (runParams.get("Destination") instanceof String) {
final String dest = (String) runParams.get("Destination");
if (dest.equals("Battlefield") && runParams.get("Card") instanceof Card) {
final Card card = (Card) runParams.get("Card");
if (runParams.get(AbilityKey.Destination) instanceof String) {
final String dest = (String) runParams.get(AbilityKey.Destination);
if (dest.equals("Battlefield") && runParams.get(AbilityKey.Card) instanceof Card) {
final Card card = (Card) runParams.get(AbilityKey.Card);
if (card.isCreature()) {
return false;
}
@@ -698,7 +694,7 @@ public class TriggerHandler {
}
}
private int handlePanharmonicon(final Trigger t, final Map<String, Object> runParams, final Player p) {
private int handlePanharmonicon(final Trigger t, final Map<AbilityKey, Object> runParams, final Player p) {
Card host = t.getHostCard();
// not a changesZone trigger or changesZoneAll
@@ -727,10 +723,10 @@ public class TriggerHandler {
final String kw = ki.getOriginal();
if (kw.startsWith("Panharmonicon")) {
// Enter the Battlefield Trigger
if (runParams.get("Destination") instanceof String) {
final String dest = (String) runParams.get("Destination");
if ("Battlefield".equals(dest) && runParams.get("Card") instanceof Card) {
final Card card = (Card) runParams.get("Card");
if (runParams.get(AbilityKey.Destination) instanceof String) {
final String dest = (String) runParams.get(AbilityKey.Destination);
if ("Battlefield".equals(dest) && runParams.get(AbilityKey.Card) instanceof Card) {
final Card card = (Card) runParams.get(AbilityKey.Card);
final String valid = kw.split(":")[1];
if (card.isValid(valid.split(","), p, ck, null)) {
n++;
@@ -739,12 +735,12 @@ public class TriggerHandler {
}
} else if (kw.startsWith("Dieharmonicon")) {
// 700.4. The term dies means "is put into a graveyard from the battlefield."
if (runParams.get("Origin") instanceof String) {
final String origin = (String) runParams.get("Origin");
if ("Battlefield".equals(origin) && runParams.get("Destination") instanceof String) {
final String dest = (String) runParams.get("Destination");
if ("Graveyard".equals(dest) && runParams.get("Card") instanceof Card) {
final Card card = (Card) runParams.get("Card");
if (runParams.get(AbilityKey.Destination) instanceof String) {
final String origin = (String) runParams.get(AbilityKey.Destination);
if ("Battlefield".equals(origin) && runParams.get(AbilityKey.Destination) instanceof String) {
final String dest = (String) runParams.get(AbilityKey.Destination);
if ("Graveyard".equals(dest) && runParams.get(AbilityKey.Card) instanceof Card) {
final Card card = (Card) runParams.get(AbilityKey.Card);
final String valid = kw.split(":")[1];
if (card.isValid(valid.split(","), p, ck, null)) {
n++;
@@ -756,7 +752,7 @@ public class TriggerHandler {
}
}
} else if (t.getMode() == TriggerType.ChangesZoneAll) {
final CardZoneTable table = (CardZoneTable) runParams.get("Cards");
final CardZoneTable table = (CardZoneTable) runParams.get(AbilityKey.Cards);
// iterate over all cards
for (final Card ck : p.getCardsIn(ZoneType.Battlefield)) {
for (final KeywordInterface ki : ck.getKeywords()) {

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -52,14 +53,14 @@ public class TriggerInvestigated extends Trigger {
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Player: ").append(sa.getTriggeringObject("Player"));
sb.append("Player: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
/** {@inheritDoc} */

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -51,13 +52,13 @@ public class TriggerLandPlayed extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Land played: ").append(sa.getTriggeringObject("Card"));
sb.append("Land played: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -73,15 +74,15 @@ public class TriggerLifeGained extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("LifeAmount", getRunParams().get("LifeAmount"));
sa.setTriggeringObject("Player", getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.LifeAmount, getRunParams().get("LifeAmount"));
sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Player: ").append(sa.getTriggeringObject("Player")).append(", ");
sb.append("Gained Amount: ").append(sa.getTriggeringObject("LifeAmount"));
sb.append("Player: ").append(sa.getTriggeringObject(AbilityKey.Player)).append(", ");
sb.append("Gained Amount: ").append(sa.getTriggeringObject(AbilityKey.LifeAmount));
return sb.toString();
}
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -70,15 +71,15 @@ public class TriggerLifeLost extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("LifeAmount", this.getRunParams().get("LifeAmount"));
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.LifeAmount, this.getRunParams().get("LifeAmount"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Player: ").append(sa.getTriggeringObject("Player")).append(", ");
sb.append("Lost Amount: ").append(sa.getTriggeringObject("LifeAmount"));
sb.append("Player: ").append(sa.getTriggeringObject(AbilityKey.Player)).append(", ");
sb.append("Lost Amount: ").append(sa.getTriggeringObject(AbilityKey.LifeAmount));
return sb.toString();
}
}

View File

@@ -1,5 +1,6 @@
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -38,13 +39,13 @@ public class TriggerLosesGame extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Player: ").append(sa.getTriggeringObject("Player"));
sb.append("Player: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -69,14 +70,14 @@ public class TriggerPayCumulativeUpkeep extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject("PayingMana", this.getRunParams().get("PayingMana"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.PayingMana, this.getRunParams().get("PayingMana"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Mana: ").append(sa.getTriggeringObject("PayingMana"));
sb.append("Mana: ").append(sa.getTriggeringObject(AbilityKey.PayingMana));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -69,7 +70,7 @@ public class TriggerPayEcho extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -60,15 +61,15 @@ public class TriggerPayLife extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("LifeAmount", getRunParams().get("LifeAmount"));
sa.setTriggeringObject("Player", getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.LifeAmount, getRunParams().get("LifeAmount"));
sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Player: ").append(sa.getTriggeringObject("Player")).append(", ");
sb.append("paid Amount: ").append(sa.getTriggeringObject("LifeAmount"));
sb.append("Player: ").append(sa.getTriggeringObject(AbilityKey.Player)).append(", ");
sb.append("paid Amount: ").append(sa.getTriggeringObject(AbilityKey.LifeAmount));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -59,13 +60,13 @@ public class TriggerPhase extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Phase: ").append(sa.getTriggeringObject("Player"));
sb.append("Phase: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
}

View File

@@ -1,5 +1,6 @@
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -27,13 +28,13 @@ public class TriggerPhaseIn extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Phased In: ").append(sa.getTriggeringObject("Card"));
sb.append("Phased In: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -1,5 +1,6 @@
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -35,13 +36,13 @@ public class TriggerPhaseOut extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Phased Out: ").append(sa.getTriggeringObject("Card"));
sb.append("Phased Out: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}
}

View File

@@ -1,6 +1,7 @@
package forge.game.trigger;
import forge.game.PlanarDice;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -55,13 +56,13 @@ public class TriggerPlanarDice extends Trigger {
*/
@Override
public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Roller: ").append(sa.getTriggeringObject("Player"));
sb.append("Roller: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
}

View File

@@ -1,5 +1,6 @@
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.spellability.SpellAbility;
@@ -52,13 +53,13 @@ public class TriggerPlaneswalkedFrom extends Trigger {
*/
@Override
public void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Cards", this.getRunParams().get("Cards"));
sa.setTriggeringObject(AbilityKey.Cards, this.getRunParams().get("Cards"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Planeswalked From: ").append(sa.getTriggeringObject("Cards"));
sb.append("Planeswalked From: ").append(sa.getTriggeringObject(AbilityKey.Cards));
return sb.toString();
}

View File

@@ -1,5 +1,6 @@
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -52,13 +53,13 @@ public class TriggerPlaneswalkedTo extends Trigger {
*/
@Override
public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject("Cards", this.getRunParams().get("Cards"));
sa.setTriggeringObject(AbilityKey.Cards, this.getRunParams().get("Cards"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Planeswalked To: ").append(sa.getTriggeringObject("Cards"));
sb.append("Planeswalked To: ").append(sa.getTriggeringObject(AbilityKey.Cards));
return sb.toString();
}
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -67,14 +68,14 @@ public class TriggerRegenerated extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject("Cause", this.getRunParams().get("Cause"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Regenerated: ").append(sa.getTriggeringObject("Card"));
sb.append("Regenerated: ").append(sa.getTriggeringObject(AbilityKey.Card));
//sb.append("Destroyer: ").append(sa.getTriggeringObject("Causer"));
return sb.toString();
}

View File

@@ -2,6 +2,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -31,13 +32,13 @@ public class TriggerRevealed extends Trigger {
@Override
public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Revealed: ").append(sa.getTriggeringObject("Card"));
sb.append("Revealed: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.cost.IndividualCostPaymentInstance;
import forge.game.player.Player;
@@ -125,13 +126,13 @@ public class TriggerSacrificed extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Sacrificed: ").append(sa.getTriggeringObject("Card"));
sb.append("Sacrificed: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -61,13 +62,13 @@ public class TriggerScry extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Scryer: ").append(sa.getTriggeringObject("Player"));
sb.append("Scryer: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.List;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -73,13 +74,13 @@ public class TriggerSearchedLibrary extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Searcher: ").append(sa.getTriggeringObject("Player"));
sb.append("Searcher: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
}

View File

@@ -18,6 +18,7 @@
package forge.game.trigger;
import forge.card.CardType;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -76,7 +77,7 @@ public class TriggerSetInMotion extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Scheme", this.getRunParams().get("Scheme"));
sa.setTriggeringObject(AbilityKey.Scheme, this.getRunParams().get("Scheme"));
}
@Override

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -73,13 +74,13 @@ public class TriggerShuffled extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Shuffler: ").append(sa.getTriggeringObject("Player"));
sb.append("Shuffler: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
}

View File

@@ -26,6 +26,7 @@ import com.google.common.collect.Sets;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameObject;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists;
@@ -265,23 +266,23 @@ public class TriggerSpellAbilityCast extends Trigger {
public final void setTriggeringObjects(final SpellAbility sa) {
final SpellAbility castSA = (SpellAbility) getRunParams().get("CastSA");
final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(castSA);
sa.setTriggeringObject("Card", castSA.getHostCard());
sa.setTriggeringObject("SpellAbility", castSA);
sa.setTriggeringObject("StackInstance", si);
sa.setTriggeringObject("SpellAbilityTargetingCards", (si != null ? si.getSpellAbility(true) : castSA).getTargets().getTargetCards());
sa.setTriggeringObject("Player", getRunParams().get("Player"));
sa.setTriggeringObject("Activator", getRunParams().get("Activator"));
sa.setTriggeringObject("CurrentStormCount", getRunParams().get("CurrentStormCount"));
sa.setTriggeringObject("CurrentCastSpells", getRunParams().get("CurrentCastSpells"));
sa.setTriggeringObject("CastSACMC", getRunParams().get("CastSACMC"));
sa.setTriggeringObject(AbilityKey.Card, castSA.getHostCard());
sa.setTriggeringObject(AbilityKey.SpellAbility, castSA);
sa.setTriggeringObject(AbilityKey.StackInstance, si);
sa.setTriggeringObject(AbilityKey.SpellAbilityTargetingCards, (si != null ? si.getSpellAbility(true) : castSA).getTargets().getTargetCards());
sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Activator, getRunParams().get("Activator"));
sa.setTriggeringObject(AbilityKey.CurrentStormCount, getRunParams().get("CurrentStormCount"));
sa.setTriggeringObject(AbilityKey.CurrentCastSpells, getRunParams().get("CurrentCastSpells"));
sa.setTriggeringObject(AbilityKey.CastSACMC, getRunParams().get("CastSACMC"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Card: ").append(sa.getTriggeringObject("Card")).append(", ");
sb.append("Activator: ").append(sa.getTriggeringObject("Activator")).append(", ");
sb.append("SpellAbility: ").append(sa.getTriggeringObject("SpellAbility"));
sb.append("Card: ").append(sa.getTriggeringObject(AbilityKey.Card)).append(", ");
sb.append("Activator: ").append(sa.getTriggeringObject(AbilityKey.Activator)).append(", ");
sb.append("SpellAbility: ").append(sa.getTriggeringObject(AbilityKey.SpellAbility));
return sb.toString();
}
}

View File

@@ -19,6 +19,7 @@ package forge.game.trigger;
import java.util.Map;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
@@ -92,17 +93,17 @@ public class TriggerSpellAbilityCopy extends Trigger {
public final void setTriggeringObjects(final SpellAbility sa) {
final SpellAbility copySA = (SpellAbility) getRunParams().get("CopySA");
final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(copySA);
sa.setTriggeringObject("Card", copySA.getHostCard());
sa.setTriggeringObject("SpellAbility", copySA);
sa.setTriggeringObject("StackInstance", si);
sa.setTriggeringObject(AbilityKey.Card, copySA.getHostCard());
sa.setTriggeringObject(AbilityKey.SpellAbility, copySA);
sa.setTriggeringObject(AbilityKey.StackInstance, si);
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Card: ").append(sa.getTriggeringObject("Card")).append(", ");
sb.append("Activator: ").append(sa.getTriggeringObject("Activator")).append(", ");
sb.append("SpellAbility: ").append(sa.getTriggeringObject("SpellAbility"));
sb.append("Card: ").append(sa.getTriggeringObject(AbilityKey.Card)).append(", ");
sb.append("Activator: ").append(sa.getTriggeringObject(AbilityKey.Activator)).append(", ");
sb.append("SpellAbility: ").append(sa.getTriggeringObject(AbilityKey.SpellAbility));
return sb.toString();
}
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -48,14 +49,14 @@ public class TriggerSurveil extends Trigger {
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Player: ").append(sa.getTriggeringObject("Player"));
sb.append("Player: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
/** {@inheritDoc} */

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -77,13 +78,13 @@ public class TriggerTaps extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Tapped: ").append(sa.getTriggeringObject("Card"));
sb.append("Tapped: ").append(sa.getTriggeringObject(AbilityKey.Card));
return sb.toString();
}

View File

@@ -18,6 +18,7 @@
package forge.game.trigger;
import forge.card.MagicColor;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -104,16 +105,16 @@ public class TriggerTapsForMana extends Trigger {
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject("Produced", this.getRunParams().get("Produced"));
sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Produced, this.getRunParams().get("Produced"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Tapped for Mana: ").append(sa.getTriggeringObject("Card"));
sb.append("Produced: ").append(sa.getTriggeringObject("Produced"));
sb.append("Tapped for Mana: ").append(sa.getTriggeringObject(AbilityKey.Card));
sb.append("Produced: ").append(sa.getTriggeringObject(AbilityKey.Produced));
return sb.toString();
}

View File

@@ -17,6 +17,7 @@
*/
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -58,13 +59,13 @@ public class TriggerTransformed extends Trigger {
*/
@Override
public void setTriggeringObjects(SpellAbility sa) {
sa.setTriggeringObject("Transformer", this.getRunParams().get("Transformer"));
sa.setTriggeringObject(AbilityKey.Transformer, this.getRunParams().get("Transformer"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Transformed: ").append(sa.getTriggeringObject("Transformer"));
sb.append("Transformed: ").append(sa.getTriggeringObject(AbilityKey.Transformer));
return sb.toString();
}

View File

@@ -1,5 +1,6 @@
package forge.game.trigger;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
@@ -20,13 +21,13 @@ public class TriggerTurnBegin extends Trigger {
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Player: ").append(sa.getTriggeringObject("Player"));
sb.append("Player: ").append(sa.getTriggeringObject(AbilityKey.Player));
return sb.toString();
}
}

Some files were not shown because too many files have changed in this diff Show More