From eabcf47b279212474aba5a415b58fa3948407a5a Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sat, 14 Sep 2019 15:14:40 -0600 Subject: [PATCH 01/34] more mechanical, samey transformations --- .../src/main/java/forge/game/GameEntity.java | 2 +- .../java/forge/game/ability/AbilityKey.java | 9 + .../java/forge/game/phase/PhaseHandler.java | 65 +++--- .../main/java/forge/game/player/Player.java | 188 +++++++++--------- 4 files changed, 137 insertions(+), 127 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index 3445ce9a5ad..9549c75dea7 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -170,7 +170,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { int restDamage = damage; // first try to replace the damage - final Map repParams = Maps.newHashMap(); + final Map repParams = Maps.newHashMap(); repParams.put("Event", "DamageDone"); repParams.put("Affected", this); repParams.put("DamageSource", source); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityKey.java b/forge-game/src/main/java/forge/game/ability/AbilityKey.java index 599e7bcc8c5..db84de74dc6 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityKey.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityKey.java @@ -26,6 +26,7 @@ public enum AbilityKey { Cause("Cause"), Causer("Causer"), Championed("Championed"), + CostStack("CostStack"), CounterAmount("CounterAmount"), CounteredSA("CounteredSA"), CounterType("CounterType"), @@ -44,14 +45,21 @@ public enum AbilityKey { Exploited("Exploited"), Event("Event"), Fighter("Fighter"), + FirstTime("FirstTime"), Fizzle("Fizzle"), IsCombatDamage("IsCombatDamage"), PayingMana("PayingMana"), + Phase("Phase"), 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"), @@ -61,6 +69,7 @@ public enum AbilityKey { Result("Result"), Scheme("Scheme"), Source("Source"), + SourceSA("SourceSA"), SpellAbilityStackInstance("SpellAbilityStackInstance"), StackSa("StackSa"), StackSi("StackSi"), diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index dde7fd43cc0..e5f6c9ed1f4 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -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 runParams = Maps.newHashMap(); - runParams.put("Phase", phase.nameForScripts); - runParams.put("Player", playerTurn); - game.getTriggerHandler().runTriggerOld(TriggerType.Phase, runParams, false); + final Map 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 runParams = Maps.newHashMap(); - runParams.put("Player", playerTurn); - game.getTriggerHandler().runTriggerOld(TriggerType.TurnBegin, runParams, false); + final Map 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 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 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 bdRunParams = Maps.newHashMap(); - bdRunParams.put("Blockers", declaredBlockers); - bdRunParams.put("Attackers", blockedAttackers); - game.getTriggerHandler().runTriggerOld(TriggerType.BlockersDeclared, bdRunParams, false); + final Map 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 runParams = Maps.newHashMap(); - runParams.put("Blocker", c1); - runParams.put("Attackers", combat.getAttackersBlockedBy(c1)); - game.getTriggerHandler().runTriggerOld(TriggerType.Blocks, runParams, false); + final Map 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 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 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 runParams2 = Maps.newHashMap(); - runParams2.put("Attacker", a); - runParams2.put("Blocker", b); - game.getTriggerHandler().runTriggerOld(TriggerType.AttackerBlockedByCreature, runParams2, false); + final Map runParams = AbilityKey.newMap(); + runParams.put(AbilityKey.Attacker, a); + runParams.put(AbilityKey.Blocker, b); + game.getTriggerHandler().runTrigger(TriggerType.AttackerBlockedByCreature, runParams, false); } a.getDamageHistory().setCreatureGotBlockedThisCombat(true); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index d4b5334caac..2f200c91380 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -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; @@ -246,9 +247,9 @@ public class Player extends GameEntity implements Comparable { game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); // Run triggers - final Map runParams = Maps.newHashMap(); - runParams.put("Scheme", activeScheme); - game.getTriggerHandler().runTriggerOld(TriggerType.SetInMotion, runParams, false); + final Map runParams = AbilityKey.newMap(); + runParams.put(AbilityKey.Scheme, activeScheme); + game.getTriggerHandler().runTrigger(TriggerType.SetInMotion, runParams, false); } @@ -445,12 +446,12 @@ public class Player extends GameEntity implements Comparable { } // Run triggers - final Map 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 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 +479,17 @@ public class Player extends GameEntity implements Comparable { 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 +499,11 @@ public class Player extends GameEntity implements Comparable { lifeLostThisTurn += toLose; // Run triggers - final Map runParams = Maps.newHashMap(); - runParams.put("Player", this); - runParams.put("LifeAmount", toLose); - runParams.put("FirstTime", firstLost); - game.getTriggerHandler().runTriggerOld(TriggerType.LifeLost, runParams, false); + final Map 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 +527,10 @@ public class Player extends GameEntity implements Comparable { loseLife(lifePayment); // Run triggers - final Map runParams = Maps.newHashMap(); - runParams.put("Player", this); - runParams.put("LifeAmount", lifePayment); - game.getTriggerHandler().runTriggerOld(TriggerType.PayLife, runParams, false); + final Map runParams = AbilityKey.newMap(); + runParams.put(AbilityKey.Player, this); + runParams.put(AbilityKey.LifeAmount, lifePayment); + game.getTriggerHandler().runTrigger(TriggerType.PayLife, runParams, false); return true; } @@ -611,14 +610,14 @@ public class Player extends GameEntity implements Comparable { } // Run triggers - final Map runParams = Maps.newHashMap(); - runParams.put("DamageSource", source); - runParams.put("DamageTarget", this); - runParams.put("DamageAmount", amount); - runParams.put("IsCombatDamage", isCombat); + final Map 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 +907,7 @@ public class Player extends GameEntity implements Comparable { } int addAmount = n; - if(addAmount <= 0) { + if (addAmount <= 0) { // Can't add negative or 0 counters, bail out now return 0; } @@ -922,29 +921,29 @@ public class Player extends GameEntity implements Comparable { 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 runParams = Maps.newHashMap(); - runParams.put("Player", this); - runParams.put("Source", this); - runParams.put("CounterType", counterType); + final Map 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 +1282,14 @@ public class Player extends GameEntity implements Comparable { 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 +1306,7 @@ public class Player extends GameEntity implements Comparable { int numToTop = 0; if (toGrave != null) { - for(Card c : toGrave) { + for (Card c : toGrave) { getGame().getAction().moveToGraveyard(c, cause); numToGrave++; } @@ -1315,7 +1314,7 @@ public class Player extends GameEntity implements Comparable { 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 +1323,10 @@ public class Player extends GameEntity implements Comparable { getGame().fireEvent(new GameEventSurveil(this, numToTop, numToGrave)); surveilThisTurn++; - final Map runParams = Maps.newHashMap(); - runParams.put("Player", this); - runParams.put("NumThisTurn", surveilThisTurn); - getGame().getTriggerHandler().runTriggerOld(TriggerType.Surveil, runParams, false); + final Map 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 +1414,11 @@ public class Player extends GameEntity implements Comparable { view.updateNumDrawnThisTurn(this); // Run triggers - final Map runParams = Maps.newHashMap(); - runParams.put("Card", c); - runParams.put("Number", numDrawnThisTurn); - runParams.put("Player", this); - game.getTriggerHandler().runTriggerOld(TriggerType.Drawn, runParams, false); + final Map 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 +1602,12 @@ public class Player extends GameEntity implements Comparable { } } } - final Map 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 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 +1685,10 @@ public class Player extends GameEntity implements Comparable { getZone(ZoneType.Library).setCards(getController().cheatShuffle(list)); // Run triggers - final Map runParams = Maps.newHashMap(); - runParams.put("Player", this); - runParams.put("Source", sa); - game.getTriggerHandler().runTriggerOld(TriggerType.Shuffled, runParams, false); + final Map 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 +1716,7 @@ public class Player extends GameEntity implements Comparable { game.fireEvent(new GameEventLandPlayed(this, land)); // Run triggers - final Map 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(); } @@ -2152,10 +2149,10 @@ public class Player extends GameEntity implements Comparable { } public final void addInvestigatedThisTurn() { investigatedThisTurn++; - Map runParams = Maps.newHashMap(); - runParams.put("Player", this); - runParams.put("Num", investigatedThisTurn); - game.getTriggerHandler().runTriggerOld(TriggerType.Investigated, runParams,false); + final Map 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 +2170,14 @@ public class Player extends GameEntity implements Comparable { sacrificedThisTurn.add(cpy); // Run triggers - final Map runParams = Maps.newHashMap(); + final Map 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() { @@ -2524,9 +2521,9 @@ public class Player extends GameEntity implements Comparable { game.setActivePlanes(currentPlanes); //Run PlaneswalkedTo triggers here. - Map runParams = Maps.newHashMap(); - runParams.put("Cards", currentPlanes); - game.getTriggerHandler().runTriggerOld(TriggerType.PlaneswalkedTo, runParams,false); + final Map runParams = AbilityKey.newMap(); + runParams.put(AbilityKey.Cards, currentPlanes); + game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedTo, runParams,false); view.updateCurrentPlaneName(currentPlanes.toString().replaceAll(" \\(.*","").replace("[","")); } @@ -2535,8 +2532,9 @@ public class Player extends GameEntity implements Comparable { */ public void leaveCurrentPlane() { - final Map runParams = new ImmutableMap.Builder().put("Cards", new CardCollection(currentPlanes)).build(); - game.getTriggerHandler().runTriggerOld(TriggerType.PlaneswalkedFrom, runParams,false); + final Map 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); From 65ab715b91637a3bbe90654422dcb1aef6d814c4 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sat, 14 Sep 2019 15:52:02 -0600 Subject: [PATCH 02/34] eliminate all but the last call to `runTriggerOld` --- .../java/forge/game/ability/AbilityKey.java | 10 ++++ .../SpellAbilityStackInstance.java | 16 ++--- .../forge/game/trigger/TriggerHandler.java | 2 +- .../main/java/forge/game/zone/MagicStack.java | 60 +++++++++---------- 4 files changed, 50 insertions(+), 38 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityKey.java b/forge-game/src/main/java/forge/game/ability/AbilityKey.java index db84de74dc6..5b4e47df779 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityKey.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityKey.java @@ -8,6 +8,7 @@ import java.util.Map; */ public enum AbilityKey { AbilityMana("AbilityMana"), + Activator("Activator"), Affected("Affected"), Attach("Attach"), AllVotes("AllVotes"), @@ -20,17 +21,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"), @@ -74,7 +82,9 @@ public enum AbilityKey { StackSa("StackSa"), StackSi("StackSi"), Target("Target"), + Targets("Targets"), Transformer("Transformer"), + Vehicle("Vehicle"), Won("Won"); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index 0bce8ed92ec..4b781bd5942 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -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; @@ -342,23 +343,24 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { } // Run BecomesTargetTrigger - Map runParams = new HashMap<>(); - runParams.put("SourceSA", ability); + final Map runParams = AbilityKey.newMap(); + runParams.put(AbilityKey.SourceSA, ability); Set 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); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index bb47aa14a35..2d896b4a7cd 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -328,7 +328,7 @@ public class TriggerHandler { // `runTriggerOld` into `runTrigger` and change the code inside to just always use a `Map`. // 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 runParams, boolean holdTrigger) { + private void runTriggerOld(final TriggerType mode, final Map runParams, boolean holdTrigger) { if (suppressedModes.contains(mode)) { return; } diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 660f109844b..a70ed6c30cb 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -285,17 +285,17 @@ public class MagicStack /* extends MyObservable */ implements Iterable runParams = Maps.newHashMap(); + Map runParams = AbilityKey.newMap(); if (!(sp instanceof AbilityStatic) && !sp.isCopied()) { // Run SpellAbilityCast triggers - runParams.put("Cost", sp.getPayCosts()); - runParams.put("Player", sp.getHostCard().getController()); - runParams.put("Activator", sp.getActivatingPlayer()); - runParams.put("CastSA", si.getSpellAbility(true)); - runParams.put("CastSACMC", si.getSpellAbility(true).getHostCard().getCMC()); - runParams.put("CurrentStormCount", thisTurnCast.size()); - runParams.put("CurrentCastSpells", new CardCollection(thisTurnCast)); - game.getTriggerHandler().runTriggerOld(TriggerType.SpellAbilityCast, runParams, true); + runParams.put(AbilityKey.Cost, sp.getPayCosts()); + runParams.put(AbilityKey.Player, sp.getHostCard().getController()); + runParams.put(AbilityKey.Activator, sp.getActivatingPlayer()); + runParams.put(AbilityKey.CastSA, si.getSpellAbility(true)); + runParams.put(AbilityKey.CastSACMC, si.getSpellAbility(true).getHostCard().getCMC()); + runParams.put(AbilityKey.CurrentStormCount, thisTurnCast.size()); + runParams.put(AbilityKey.CurrentCastSpells, new CardCollection(thisTurnCast)); + game.getTriggerHandler().runTrigger(TriggerType.SpellAbilityCast, runParams, true); // Run SpellCast triggers if (sp.isSpell()) { @@ -303,39 +303,39 @@ public class MagicStack /* extends MyObservable */ implements Iterable distinctObjects = Sets.newHashSet(); for (final TargetChoices tc : chosenTargets) { if (tc != null && tc.getTargetCards() != null) { @@ -361,26 +361,26 @@ public class MagicStack /* extends MyObservable */ implements Iterable Date: Sat, 14 Sep 2019 16:51:55 -0600 Subject: [PATCH 03/34] push `toStingMap` down a layer --- .../forge/game/trigger/TriggerHandler.java | 78 +++++++++---------- .../forge/game/trigger/TriggerWaiting.java | 7 +- 2 files changed, 41 insertions(+), 44 deletions(-) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 2d896b4a7cd..02b6b6f1117 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -248,7 +248,7 @@ public class TriggerHandler { List trigger = Lists.newArrayList(); for (final Trigger t : activeTriggers) { - if (canRunTrigger(t,wt.getMode(),wt.getParams())) { + if (canRunTrigger(t,wt.getMode(),toStringMap(wt.getParams()))) { trigger.add(t); } } @@ -322,13 +322,6 @@ public class TriggerHandler { } public final void runTrigger(final TriggerType mode, final Map 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`. - // The reason we can't just call them both `runTrigger` is because we get a `same erasure` compile error if we do. - @Deprecated - private void runTriggerOld(final TriggerType mode, final Map runParams, boolean holdTrigger) { if (suppressedModes.contains(mode)) { return; } @@ -342,10 +335,10 @@ public class TriggerHandler { } } - private void runStateTrigger(Map runParams) { + private void runStateTrigger(final Map runParams) { for (final Trigger t: activeTriggers) { - if (canRunTrigger(t, TriggerType.Always, runParams)) { - runSingleTrigger(t, runParams); + if (canRunTrigger(t, TriggerType.Always, toStringMap(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 runParams = wt.getParams(); + final Map runParams = wt.getParams(); final Player playerAP = game.getPhaseHandler().getPlayerTurn(); if (playerAP == null) { @@ -382,20 +375,20 @@ public class TriggerHandler { // Static triggers for (final Trigger t : Lists.newArrayList(activeTriggers)) { - if (t.isStatic() && canRunTrigger(t, mode, runParams)) { - runSingleTrigger(t, runParams); + if (t.isStatic() && canRunTrigger(t, mode, toStringMap(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,27 +418,30 @@ public class TriggerHandler { private boolean runNonStaticTriggersForPlayer(final Player player, final TriggerWaiting wt, final List delayedTriggersWorkingCopy ) { - final TriggerType mode = wt.getMode(); - final Map runParams = wt.getParams(); + final TriggerType mode = wt.getMode(); + final Map runParams = wt.getParams(); + final Map stringRunParams = toStringMap(runParams); final List triggers = wt.getTriggers() != null ? wt.getTriggers() : activeTriggers; Card card = null; boolean checkStatics = false; 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 (!t.isStatic() && t.getHostCard().getController().equals(player) && canRunTrigger(t, mode, stringRunParams)) { + 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; } @@ -462,8 +458,8 @@ public class TriggerHandler { for (final Trigger deltrig : delayedTriggersWorkingCopy) { if (deltrig.getHostCard().getController().equals(player)) { - if (isTriggerActive(deltrig) && canRunTrigger(deltrig, mode, runParams)) { - runSingleTrigger(deltrig, runParams); + if (isTriggerActive(deltrig) && canRunTrigger(deltrig, mode, stringRunParams)) { + runSingleTrigger(deltrig, stringRunParams); delayedTriggers.remove(deltrig); } } @@ -698,7 +694,7 @@ public class TriggerHandler { } } - private int handlePanharmonicon(final Trigger t, final Map runParams, final Player p) { + private int handlePanharmonicon(final Trigger t, final Map 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()) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java b/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java index 0bf489d05fd..d5fa10ae934 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java @@ -1,5 +1,6 @@ package forge.game.trigger; +import forge.game.ability.AbilityKey; import forge.util.TextUtil; import java.util.List; @@ -10,10 +11,10 @@ import java.util.Map; */ public class TriggerWaiting { private TriggerType mode; - private Map params; + private Map params; private List triggers = null; - public TriggerWaiting(TriggerType m, Map p) { + public TriggerWaiting(TriggerType m, Map p) { mode = m; params = p; } @@ -22,7 +23,7 @@ public class TriggerWaiting { return mode; } - public Map getParams() { + public Map getParams() { return params; } From 42d069580486b75993427017fd1bf1f4097d4335 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sat, 14 Sep 2019 19:44:27 -0600 Subject: [PATCH 04/34] push down `toStringMap` further, which required using `AbilityKey` inside `TriggerWaiting` and several other places. --- .../src/main/java/forge/game/GameAction.java | 4 +- .../java/forge/game/ability/AbilityKey.java | 28 +++++++++++-- .../java/forge/game/ability/AbilityUtils.java | 42 ++++++++++--------- .../effects/ChangeCombatantsEffect.java | 9 ++-- .../src/main/java/forge/game/card/Card.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 3 +- .../java/forge/game/card/CardProperty.java | 5 ++- .../main/java/forge/game/card/CardUtil.java | 3 +- .../main/java/forge/game/combat/Combat.java | 8 ++-- .../forge/game/spellability/SpellAbility.java | 15 +++---- .../SpellAbilityStackInstance.java | 8 ++-- .../main/java/forge/game/trigger/Trigger.java | 24 +++++------ .../forge/game/trigger/TriggerAbandoned.java | 3 +- .../java/forge/game/trigger/TriggerAdapt.java | 5 ++- .../forge/game/trigger/TriggerAttached.java | 7 ++-- .../game/trigger/TriggerAttackerBlocked.java | 15 +++---- .../TriggerAttackerBlockedByCreature.java | 9 ++-- .../trigger/TriggerAttackerUnblocked.java | 9 ++-- .../trigger/TriggerAttackerUnblockedOnce.java | 9 ++-- .../trigger/TriggerAttackersDeclared.java | 7 ++-- .../forge/game/trigger/TriggerAttacks.java | 11 ++--- .../game/trigger/TriggerBecomeMonarch.java | 5 ++- .../game/trigger/TriggerBecomeMonstrous.java | 7 ++-- .../game/trigger/TriggerBecomeRenowned.java | 5 ++- .../game/trigger/TriggerBecomesTarget.java | 11 ++--- .../trigger/TriggerBecomesTargetOnce.java | 11 ++--- .../game/trigger/TriggerBlockersDeclared.java | 7 ++-- .../forge/game/trigger/TriggerBlocks.java | 7 ++-- .../forge/game/trigger/TriggerChampioned.java | 7 ++-- .../trigger/TriggerChangesController.java | 5 ++- .../game/trigger/TriggerChangesZone.java | 5 ++- .../game/trigger/TriggerChangesZoneAll.java | 7 ++-- .../game/trigger/TriggerCounterAdded.java | 13 +++--- .../game/trigger/TriggerCounterAddedAll.java | 7 ++-- .../game/trigger/TriggerCounterAddedOnce.java | 17 ++++---- .../game/trigger/TriggerCounterRemoved.java | 5 ++- .../trigger/TriggerCounterRemovedOnce.java | 9 ++-- .../forge/game/trigger/TriggerCountered.java | 13 +++--- .../forge/game/trigger/TriggerCrewed.java | 9 ++-- .../forge/game/trigger/TriggerCycled.java | 5 ++- .../game/trigger/TriggerDamageDealtOnce.java | 13 +++--- .../forge/game/trigger/TriggerDamageDone.java | 15 +++---- .../game/trigger/TriggerDamageDoneOnce.java | 13 +++--- .../game/trigger/TriggerDamagePrevented.java | 13 +++--- .../trigger/TriggerDamagePreventedOnce.java | 9 ++-- .../forge/game/trigger/TriggerDestroyed.java | 9 ++-- .../forge/game/trigger/TriggerDevoured.java | 5 ++- .../forge/game/trigger/TriggerDiscarded.java | 9 ++-- .../java/forge/game/trigger/TriggerDrawn.java | 7 ++-- .../forge/game/trigger/TriggerEvolved.java | 5 ++- .../forge/game/trigger/TriggerExerted.java | 7 ++-- .../forge/game/trigger/TriggerExiled.java | 5 ++- .../forge/game/trigger/TriggerExploited.java | 9 ++-- .../forge/game/trigger/TriggerExplores.java | 5 ++- .../java/forge/game/trigger/TriggerFight.java | 5 ++- .../game/trigger/TriggerFlippedCoin.java | 5 ++- .../forge/game/trigger/TriggerHandler.java | 22 +++++----- .../game/trigger/TriggerInvestigated.java | 5 ++- .../forge/game/trigger/TriggerLandPlayed.java | 5 ++- .../forge/game/trigger/TriggerLifeGained.java | 9 ++-- .../forge/game/trigger/TriggerLifeLost.java | 9 ++-- .../forge/game/trigger/TriggerLosesGame.java | 5 ++- .../trigger/TriggerPayCumulativeUpkeep.java | 7 ++-- .../forge/game/trigger/TriggerPayEcho.java | 3 +- .../forge/game/trigger/TriggerPayLife.java | 9 ++-- .../java/forge/game/trigger/TriggerPhase.java | 5 ++- .../forge/game/trigger/TriggerPhaseIn.java | 5 ++- .../forge/game/trigger/TriggerPhaseOut.java | 5 ++- .../forge/game/trigger/TriggerPlanarDice.java | 5 ++- .../game/trigger/TriggerPlaneswalkedFrom.java | 5 ++- .../game/trigger/TriggerPlaneswalkedTo.java | 5 ++- .../game/trigger/TriggerRegenerated.java | 7 ++-- .../forge/game/trigger/TriggerRevealed.java | 5 ++- .../forge/game/trigger/TriggerSacrificed.java | 5 ++- .../java/forge/game/trigger/TriggerScry.java | 5 ++- .../game/trigger/TriggerSearchedLibrary.java | 5 ++- .../game/trigger/TriggerSetInMotion.java | 3 +- .../forge/game/trigger/TriggerShuffled.java | 5 ++- .../game/trigger/TriggerSpellAbilityCast.java | 25 +++++------ .../game/trigger/TriggerSpellAbilityCopy.java | 13 +++--- .../forge/game/trigger/TriggerSurveil.java | 5 ++- .../java/forge/game/trigger/TriggerTaps.java | 5 ++- .../game/trigger/TriggerTapsForMana.java | 11 ++--- .../game/trigger/TriggerTransformed.java | 5 ++- .../forge/game/trigger/TriggerTurnBegin.java | 5 ++- .../forge/game/trigger/TriggerTurnFaceUp.java | 5 ++- .../forge/game/trigger/TriggerUnattach.java | 9 ++-- .../forge/game/trigger/TriggerUntaps.java | 5 ++- .../java/forge/game/trigger/TriggerVote.java | 5 ++- .../forge/game/trigger/WrappedAbility.java | 15 +++---- .../forge/player/PlayerControllerHuman.java | 13 +++--- 91 files changed, 441 insertions(+), 334 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index cebd914147e..908f2bc678e 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -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()) { diff --git a/forge-game/src/main/java/forge/game/ability/AbilityKey.java b/forge-game/src/main/java/forge/game/ability/AbilityKey.java index 5b4e47df779..e21772646c3 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityKey.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityKey.java @@ -10,8 +10,9 @@ public enum AbilityKey { AbilityMana("AbilityMana"), Activator("Activator"), Affected("Affected"), - Attach("Attach"), AllVotes("AllVotes"), + Amount("Amount"), + Attach("Attach"), AttachSource("AttachSource"), AttachTarget("AttachTarget"), Attacked("Attacked"), @@ -51,14 +52,12 @@ public enum AbilityKey { Devoured("Devoured"), EchoPaid("EchoPaid"), Exploited("Exploited"), + Explorer("Explorer"), Event("Event"), Fighter("Fighter"), FirstTime("FirstTime"), Fizzle("Fizzle"), IsCombatDamage("IsCombatDamage"), - PayingMana("PayingMana"), - Phase("Phase"), - Player("Player"), IndividualCostPaymentInstance("IndividualCostPaymentInstance"), IsMadness("IsMadness"), LifeAmount("LifeAmount"), @@ -71,14 +70,23 @@ public enum AbilityKey { 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"), @@ -99,10 +107,22 @@ 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) { + return null; + } + public static EnumMap newMap() { return new EnumMap<>(AbilityKey.class); } + public static EnumMap newMap(Map map) { + return new EnumMap<>(map); + } + public static Map mapFromCard(forge.game.card.Card card) { final Map runParams = newMap(); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index fa03796fa5a..4d62b166867 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -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) { @@ -641,12 +643,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 +697,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 +709,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 +779,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 +1006,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 +1017,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 +1028,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 +1254,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 +1392,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 +1610,7 @@ public class AbilityUtils { // Count$TriggeredPayingMana.. 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()) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java index bc74c3b9533..6135aa48c18 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java @@ -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()); } } } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index cef51f069ee..99ecc3df0ea 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1048,7 +1048,7 @@ public class Card extends GameEntity implements Comparable { } } - 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()) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index b6d21204033..becbc16de03 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -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; @@ -948,7 +949,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")) { diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 1411664dd18..3a2969c98eb 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -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; } diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 7bf0cfe1390..95cdce8d1ed 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -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; @@ -411,7 +412,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)) { diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 7cf10bb47a3..0b7b6dfb8f7 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -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()); } } } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 88fe88e9833..05f3c43814c 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -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 paidLists = Maps.newHashMap(); - private Map triggeringObjects = Maps.newHashMap(); + private Map triggeringObjects = AbilityKey.newMap(); private HashMap replacingObjects = Maps.newHashMap(); @@ -552,19 +553,19 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return sa; } - public Map getTriggeringObjects() { + public Map getTriggeringObjects() { return triggeringObjects; } - public void setTriggeringObjects(final Map triggeredObjects) { - triggeringObjects = Maps.newHashMap(triggeredObjects); + public void setTriggeringObjects(final Map 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() { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index 4b781bd5942..7153cd12baa 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -92,7 +92,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { // is Kicked, is Buyback // Triggers - private final Map triggeringObjects; + private final Map triggeringObjects; private final List triggerRemembered; private final Map storedSVars = Maps.newHashMap(); @@ -364,7 +364,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { } } - public boolean addTriggeringObject(String trigObj, Object value) { + public boolean addTriggeringObject(AbilityKey trigObj, Object value) { if (!triggeringObjects.containsKey(trigObj)) { triggeringObjects.put(trigObj, value); return true; @@ -372,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; @@ -380,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); } diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index 05886532f3b..18b0e3c6f50 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -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 storedTriggeredObjects = null; + private Map storedTriggeredObjects = null; private List 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 storedTriggeredObjects) { - this.storedTriggeredObjects = Maps.newHashMap(storedTriggeredObjects); + public final void setStoredTriggeredObjects(final Map 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 getStoredTriggeredObjects() { + public final Map getStoredTriggeredObjects() { return this.storedTriggeredObjects; } @@ -363,9 +363,9 @@ public abstract class Trigger extends TriggerReplacementBase { } - public boolean meetsRequirementsOnTriggeredObjects(Game game, Map runParams) { + public boolean meetsRequirementsOnTriggeredObjects(Game game, final Map 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(); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java index a07aff661d8..dcb65899236 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java @@ -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 diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java index 5a603b715c8..ab2f92ccba2 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java index f185d57a441..96fdfd28ae6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 89136658f35..20fef05e093 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java index be66cc09438..7ddb60acdef 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java index c9ac21fc4bd..a8e9d41209a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java index 66ed8f5c01b..23567718e5c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java index 72f9649bba1..f9be4cacdd6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java index 0f28b513ce6..cc35af51e0c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java index 17d9840f804..d52c072f825 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java index 5a70ce99648..1e6643e767f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java index ab84910d4cf..d6086fc7133 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java index 097262f0c51..4e87946af5f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java index bd8a2868c51..368a1bc2281 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java b/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java index 15e1cc02550..c7ec35ae012 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java index 441348ace95..6388a1ed6a2 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java index 2604e2d55c7..d95e92662ad 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java index 31a073b8508..0648a26418d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java index 87c150ee7b7..1cd778b509b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java index f49005ac74a..f2a36fa0f45 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java index 26f64523bdc..7b87470996a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java index 94b49909f02..859fd6b8787 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java index 549a3d81670..4baeaff29c5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java index 46e0bc5fa41..1f344bfad12 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java index 4e02b6d8df4..a96eb1df4c9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java index 0b11585be24..ae5087b29e2 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java b/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java index e784432b422..655fa1d591a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java index d62f0f8f58c..82359ed0c66 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java index 7b4331ddb06..7a8dee7acec 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java index dc9df9b8fcc..1c9751d0321 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java index d5a9634cc39..f80a9c9e3c6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java index bb8adf982c6..5807e02e70a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java index c1fb8ce35c2..b2cbf8ce369 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java index cd533694d4f..22a39539d54 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java index ac8002f5682..9d2ab4a1d8e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java index 0c60b064149..5b046239a43 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java index 7e236166d20..30fae66a797 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java index 71c0af1aac8..615c5e94f10 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java index d4006d908e5..b70e1fd4894 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java index 3592a8d0adf..0842e0732ae 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java index dd566071c3c..49437a4b948 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java index 69e458136a9..54f1ff15f54 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java index e45b2eeda7e..aecf04ca0db 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java index 3d4795f9be7..45dbc6a8346 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 02b6b6f1117..87d51dc130d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -248,7 +248,7 @@ public class TriggerHandler { List trigger = Lists.newArrayList(); for (final Trigger t : activeTriggers) { - if (canRunTrigger(t,wt.getMode(),toStringMap(wt.getParams()))) { + if (canRunTrigger(t,wt.getMode(),wt.getParams())) { trigger.add(t); } } @@ -337,7 +337,7 @@ public class TriggerHandler { private void runStateTrigger(final Map runParams) { for (final Trigger t: activeTriggers) { - if (canRunTrigger(t, TriggerType.Always, toStringMap(runParams))) { + if (canRunTrigger(t, TriggerType.Always, runParams)) { runSingleTrigger(t, toStringMap(runParams)); } } @@ -375,7 +375,7 @@ public class TriggerHandler { // Static triggers for (final Trigger t : Lists.newArrayList(activeTriggers)) { - if (t.isStatic() && canRunTrigger(t, mode, toStringMap(runParams))) { + if (t.isStatic() && canRunTrigger(t, mode, runParams)) { runSingleTrigger(t, toStringMap(runParams)); checkStatics = true; @@ -427,7 +427,7 @@ public class TriggerHandler { boolean checkStatics = false; for (final Trigger t : triggers) { - if (!t.isStatic() && t.getHostCard().getController().equals(player) && canRunTrigger(t, mode, stringRunParams)) { + if (!t.isStatic() && t.getHostCard().getController().equals(player) && canRunTrigger(t, mode, runParams)) { if (runParams.containsKey(AbilityKey.Card) && runParams.get(AbilityKey.Card) instanceof Card) { card = (Card) runParams.get(AbilityKey.Card); if (runParams.containsKey(AbilityKey.Destination) @@ -458,7 +458,7 @@ public class TriggerHandler { for (final Trigger deltrig : delayedTriggersWorkingCopy) { if (deltrig.getHostCard().getController().equals(player)) { - if (isTriggerActive(deltrig) && canRunTrigger(deltrig, mode, stringRunParams)) { + if (isTriggerActive(deltrig) && canRunTrigger(deltrig, mode, runParams)) { runSingleTrigger(deltrig, stringRunParams); delayedTriggers.remove(deltrig); } @@ -501,7 +501,7 @@ public class TriggerHandler { return true; } - private boolean canRunTrigger(final Trigger regtrig, final TriggerType mode, final Map runParams) { + private boolean canRunTrigger(final Trigger regtrig, final TriggerType mode, final Map runParams) { if (regtrig.getMode() != mode) { return false; // Not the right mode. } @@ -514,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()) { @@ -531,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; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java index 89f3a10341d..4673c43daaf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java @@ -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} */ diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java index 0622263bdce..42facf2e807 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java index 599594075a5..9b13cc0d680 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java index d905e1c8b07..a592a376217 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java index 931ef32c740..e55850fa631 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java index bf13399f36e..51a74fa139e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java index f9e7ecabf45..d6f94a2ea0f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java @@ -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 diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java index 4616f0db3a9..9ff7bd8f4a8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java index 3fbe945effc..974d40259e7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java index c3b4aa6e789..d519d56959e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java index d0abe3e4747..7adcb00cc8b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java index 55bbcbd4b5c..4e1ccdf0a7e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java index f6ab67086ea..9cee000a7fe 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java index 169a9b070a3..5644c090053 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java index cd9f836c466..8eea96379ef 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java index c7614ca9d95..b86e7b10439 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java index 64e545483fb..aac417535ef 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java index 70be461dde3..bd0f3cadac5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java index 538b82670ff..05fd3e062dc 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java index 0cebd807951..1811c949573 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java @@ -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 diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java index e8abae4f522..ed801458055 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java index 43fde3f60c0..db43216f341 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java index 26bb022c137..4dc044312ac 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java index 2d3ee1dbb19..374e97aa73a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java @@ -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} */ diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java index 44185a79ef7..421a34d71ac 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 348492cb775..5474f5fc6b8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java index b1237117a44..ab5944ab9b0 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java index aa0ac8a718d..0c6c879c4b9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java @@ -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(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java index 41d27376928..8aa74bb14d3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java @@ -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 TriggerTurnFaceUp 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("Turn Face up: ").append(sa.getTriggeringObject("Card")); + sb.append("Turn Face up: ").append(sa.getTriggeringObject(AbilityKey.Card)); return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java index 8b96b06fd3f..f68eb51c482 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java @@ -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; @@ -72,15 +73,15 @@ public class TriggerUnattach extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject("Object", getRunParams().get("Object")); - sa.setTriggeringObject("Attach", getRunParams().get("Attach")); + sa.setTriggeringObject(AbilityKey.Object, getRunParams().get("Object")); + sa.setTriggeringObject(AbilityKey.Attach, getRunParams().get("Attach")); } @Override public String getImportantStackObjects(SpellAbility sa) { StringBuilder sb = new StringBuilder(); - sb.append("Object: ").append(sa.getTriggeringObject("Object")).append(", "); - sb.append("Attachment: ").append(sa.getTriggeringObject("Attach")); + sb.append("Object: ").append(sa.getTriggeringObject(AbilityKey.Object)).append(", "); + sb.append("Attachment: ").append(sa.getTriggeringObject(AbilityKey.Attach)); return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java index 7c583f1467d..f06243482c8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java @@ -17,6 +17,7 @@ */ package forge.game.trigger; +import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.spellability.SpellAbility; @@ -66,13 +67,13 @@ public class TriggerUntaps 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("Untapped: ").append(sa.getTriggeringObject("Card")); + sb.append("Untapped: ").append(sa.getTriggeringObject(AbilityKey.Card)); return sb.toString(); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java index 4ed2b85ad2d..07481b9571a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java @@ -23,6 +23,7 @@ import java.util.Map; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; +import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -65,13 +66,13 @@ public class TriggerVote extends Trigger { public final void setTriggeringObjects(final SpellAbility sa) { @SuppressWarnings("unchecked") final ListMultimap votes = (ArrayListMultimap) this.getRunParams().get("AllVotes"); - sa.setTriggeringObject("OtherVoters", getVoters(this.getHostCard().getController(), votes, true, true)); + sa.setTriggeringObject(AbilityKey.OtherVoters, getVoters(this.getHostCard().getController(), votes, true, true)); } @Override public String getImportantStackObjects(SpellAbility sa) { StringBuilder sb = new StringBuilder(); - sb.append("Voters: ").append(sa.getTriggeringObject("OtherVoters")); + sb.append("Voters: ").append(sa.getTriggeringObject(AbilityKey.OtherVoters)); return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index e48396c53a6..23354269263 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -3,6 +3,7 @@ package forge.game.trigger; import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.GameObject; +import forge.game.ability.AbilityKey; import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; @@ -101,27 +102,27 @@ public class WrappedAbility extends Ability { } @Override - public Map getTriggeringObjects() { + public Map getTriggeringObjects() { return sa.getTriggeringObjects(); } @Override - public void setTriggeringObjects(final Map triggeredObjects) { + public void setTriggeringObjects(final Map triggeredObjects) { sa.setTriggeringObjects(triggeredObjects); } @Override - public void setTriggeringObject(final String type, final Object o) { + public void setTriggeringObject(final AbilityKey type, final Object o) { sa.setTriggeringObject(type, o); } @Override - public Object getTriggeringObject(final String type) { + public Object getTriggeringObject(final AbilityKey type) { return sa.getTriggeringObject(type); } @Override - public boolean hasTriggeringObject(final String type) { + public boolean hasTriggeringObject(final AbilityKey type) { return sa.hasTriggeringObject(type); } @@ -532,8 +533,8 @@ public class WrappedAbility extends Ability { } } } - final Map triggerMap = new HashMap<>(sa.getTriggeringObjects()); - for (Entry ev : triggerMap.entrySet()) { + final Map triggerMap = AbilityKey.newMap(sa.getTriggeringObjects()); + for (Entry ev : triggerMap.entrySet()) { if (ev.getValue() instanceof Card) { Card card = (Card) ev.getValue(); Card current = game.getCardState(card); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index fa694747a27..c3504690564 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -21,6 +21,7 @@ import forge.deck.DeckSection; import forge.events.UiEventNextGameDecision; import forge.game.*; 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.*; @@ -631,15 +632,15 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont "CARDNAME", regtrig.getHostCard().getName())); buildQuestion.append(")"); } - final Map tos = sa.getTriggeringObjects(); - if (tos.containsKey("Attacker")) { - buildQuestion.append("\nAttacker: ").append(tos.get("Attacker")); + final Map tos = sa.getTriggeringObjects(); + if (tos.containsKey(AbilityKey.Attacker)) { + buildQuestion.append("\nAttacker: ").append(tos.get(AbilityKey.Attacker)); } - if (tos.containsKey("Card")) { - final Card card = (Card) tos.get("Card"); + if (tos.containsKey(AbilityKey.Card)) { + final Card card = (Card) tos.get(AbilityKey.Card); if (card != null && (card.getController() == player || game.getZoneOf(card) == null || game.getZoneOf(card).getZoneType().isKnown())) { - buildQuestion.append("\nTriggered by: ").append(tos.get("Card")); + buildQuestion.append("\nTriggered by: ").append(tos.get(AbilityKey.Card)); } } From dae5a51acc2e64988e20aefa31f846e63d070ec6 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sat, 14 Sep 2019 20:12:52 -0600 Subject: [PATCH 05/34] add `fromString` test and make it pass. --- .../java/forge/game/ability/AbilityKey.java | 180 +++++++++++++++++- .../forge/game/ability/AbilityKeyTest.java | 11 ++ 2 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java diff --git a/forge-game/src/main/java/forge/game/ability/AbilityKey.java b/forge-game/src/main/java/forge/game/ability/AbilityKey.java index e21772646c3..361b922adf3 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityKey.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityKey.java @@ -112,7 +112,185 @@ public enum AbilityKey { * @return the corresponding key if there is one or null otherwise */ public static AbilityKey fromString(String s) { - return null; + 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 EnumMap newMap() { diff --git a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java new file mode 100644 index 00000000000..ff760b11676 --- /dev/null +++ b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java @@ -0,0 +1,11 @@ +package forge.game.ability; + +import junit.framework.TestCase; + +public class AbilityKeyTest extends TestCase { + public void testFromStringWorksForAllKeys() { + for (AbilityKey key : AbilityKey.values()) { + assertEquals(key, AbilityKey.fromString(key.toString())); + } + } +} From 0637c69bfe901babf30a015d11386699407b602b Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 15 Sep 2019 10:59:42 +0800 Subject: [PATCH 06/34] Add Irencrag Feat --- forge-gui/res/cardsfolder/upcoming/irencrag_feat.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/irencrag_feat.txt diff --git a/forge-gui/res/cardsfolder/upcoming/irencrag_feat.txt b/forge-gui/res/cardsfolder/upcoming/irencrag_feat.txt new file mode 100644 index 00000000000..039ce222f8e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/irencrag_feat.txt @@ -0,0 +1,11 @@ +Name:Irencrag Feat +ManaCost:1 R R R +Types:Sorcery +A:SP$ Mana | Cost$ 1 R R R | Produced$ R | Amount$ 7 | SubAbility$ DBEffect | SpellDescription$ Add seven {R}. You can cast only one more spell this turn. +SVar:DBEffect:DB$ Effect | Name$ CARDNAME Effect | StaticAbilities$ STCantBeCast | SVars$ NumCount,TrigRem | Triggers$ StaticRem +SVar:STCantBeCast:Mode$ CantBeCast | Caster$ You | EffectZone$ Command | CheckSVar$ NumCount | SVarCompare$ GE1 | References$ NumCount | Description$ You can cast only one more spell this turn. +SVar:NumCount:Remembered$Amount +SVar:StaticRem:Mode$ SpellCast | ValidActivatingPlayer$ You | Static$ True | Secondary$ True | Execute$ TrigRem +SVar:TrigRem:DB$ Pump | RememberObjects$ TriggeredCard +AI:RemoveDeck:All +Oracle:Add seven {R}. You can cast only one more spell this turn. From b69682064d1d6157c5d1194d22e2213daf5f3370 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sat, 14 Sep 2019 21:11:25 -0600 Subject: [PATCH 07/34] fix empty EnumMap IllegalArgumentException bug and add a test for it --- .../main/java/forge/game/ability/AbilityKey.java | 4 ++++ .../java/forge/game/spellability/SpellAbility.java | 6 +++--- .../java/forge/game/ability/AbilityKeyTest.java | 13 +++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityKey.java b/forge-game/src/main/java/forge/game/ability/AbilityKey.java index 361b922adf3..fe5b8bb1162 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityKey.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityKey.java @@ -298,6 +298,10 @@ public enum AbilityKey { } public static EnumMap newMap(Map map) { + // The EnumMap constructor throws IllegalArgumentException if the map is empty. + if (map.isEmpty()) { + return newMap(); + } return new EnumMap<>(map); } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 05f3c43814c..fb7c64c7d80 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -139,7 +139,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private HashMap paidLists = Maps.newHashMap(); - private Map triggeringObjects = AbilityKey.newMap(); + private EnumMap triggeringObjects = AbilityKey.newMap(); private HashMap replacingObjects = Maps.newHashMap(); @@ -569,7 +569,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return triggeringObjects.containsKey(type); } public void resetTriggeringObjects() { - triggeringObjects = Maps.newHashMap(); + triggeringObjects = AbilityKey.newMap(); } public List getTriggerRemembered() { @@ -878,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()); diff --git a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java index ff760b11676..38f22e85736 100644 --- a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java +++ b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java @@ -1,11 +1,24 @@ package forge.game.ability; +import com.google.common.collect.Maps; import junit.framework.TestCase; +import java.util.EnumMap; +import java.util.Map; + public class AbilityKeyTest extends TestCase { public void testFromStringWorksForAllKeys() { for (AbilityKey key : AbilityKey.values()) { assertEquals(key, AbilityKey.fromString(key.toString())); } } + + public void testCopyingEmptyMapWorks() { + Map map = Maps.newHashMap(); + + Map newMap = AbilityKey.newMap(map); + + // An actual copy should be made. + assertNotSame(map, newMap); + } } From 8a160c88d0c580f6f73c063f2d1931bcafa5218e Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sat, 14 Sep 2019 21:16:55 -0600 Subject: [PATCH 08/34] No unused imports. Even in the tests. --- forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java index 38f22e85736..699151a4033 100644 --- a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java +++ b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java @@ -3,7 +3,6 @@ package forge.game.ability; import com.google.common.collect.Maps; import junit.framework.TestCase; -import java.util.EnumMap; import java.util.Map; public class AbilityKeyTest extends TestCase { From 9446af4808b776f0bdcab0846487efd8571fff36 Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 15 Sep 2019 13:19:55 +0800 Subject: [PATCH 09/34] Add two cards --- .../res/cardsfolder/upcoming/opportunistic_dragon.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/wishclaw_talisman.txt | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/opportunistic_dragon.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wishclaw_talisman.txt diff --git a/forge-gui/res/cardsfolder/upcoming/opportunistic_dragon.txt b/forge-gui/res/cardsfolder/upcoming/opportunistic_dragon.txt new file mode 100644 index 00000000000..31f4b0caccd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/opportunistic_dragon.txt @@ -0,0 +1,9 @@ +Name:Opportunistic Dragon +ManaCost:2 R R +Types:Creature Dragon +PT:4/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainControl | TriggerDescription$ When CARDNAME enters the battlefield, choose target Human or artifact an opponent controls. For as long as CARDNAME remains on the battlefield, gain control of that permanent, it loses all abilities, and it can't attack or block. +SVar:TrigGainControl:DB$ GainControl | ValidTgts$ Human.OppCtrl,Artifact.OppCtrl | TgtPrompt$ Select target Human or artifact an opponent controls | LoseControl$ LeavesPlay | SubAbility$ DBPump +SVar:DBPump:DB$ Animate | Defined$ Targeted | HiddenKeywords$ CARDNAME can't attack or block. | RemoveAllAbilities$ True | UntilHostLeavesPlay$ True +Oracle:Flying\nWhen Opportunistic Dragon enters the battlefield, choose target Human or artifact an opponent controls. For as long as Opportunistic Dragon remains on the battlefield, gain control of that permanent, it loses all abilities, and it can't attack or block. diff --git a/forge-gui/res/cardsfolder/upcoming/wishclaw_talisman.txt b/forge-gui/res/cardsfolder/upcoming/wishclaw_talisman.txt new file mode 100644 index 00000000000..8b8319c45ff --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wishclaw_talisman.txt @@ -0,0 +1,9 @@ +Name:Wishclaw Talisman +ManaCost:1 B +Types:Artifact +K:etbCounter:WISH:3 +A:AB$ ChangeZone | Cost$ 1 T SubCounter<1/WISH> | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | SubAbility$ DBChoose | PlayerTurn$ True | SpellDescription$ Search your library for a card and put that card into your hand, then shuffle your library. An opponent gains control of CARDNAME. Activate this ability only during your turn. +SVar:DBChoose:DB$ ChoosePlayer | Choices$ Player.Opponent | SubAbility$ DBGainControl +SVar:DBGainControl:DB$ GainControl | Defined$ Self | NewController$ ChosenPlayer | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenPlayer$ True +Oracle:Wishclaw Talisman enters the battlefield with three wish counters on it.\n{1}, {T}, Remove a wish counter from Wishclaw Talisman: Search your library for a card, put it into your hand, then shuffle your library. An opponent gains control of Wishclaw Talisman. Activate this ability only during your turn. From c079467b9adaffc1b3a440d711682bc94c6bb74e Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 15 Sep 2019 13:36:43 +0800 Subject: [PATCH 10/34] Add two cards --- .../cardsfolder/upcoming/emry_lurker_of_the_loch.txt | 12 ++++++++++++ .../res/cardsfolder/upcoming/insatiable_appetite.txt | 9 +++++++++ 2 files changed, 21 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/emry_lurker_of_the_loch.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/insatiable_appetite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/emry_lurker_of_the_loch.txt b/forge-gui/res/cardsfolder/upcoming/emry_lurker_of_the_loch.txt new file mode 100644 index 00000000000..ea83b59b17c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/emry_lurker_of_the_loch.txt @@ -0,0 +1,12 @@ +Name:Emry, Lurker of the Loch +ManaCost:2 U +Types:Legendary Creature Merfolk Wizard +PT:1/2 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ This spell costs {1} less to cast for each artifact you control. +SVar:X:Count$Valid Artifact.YouCtrl +DeckNeeds:Type$Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield, put the top four cards of your library into your graveyard. +SVar:TrigMill:DB$ Mill | NumCards$ 4 | Defined$ You +A:AB$ Effect | Cost$ T | TgtZone$ Graveyard | ValidTgts$ Artifact.YouOwn | TgtPrompt$ Select target artifact card in your graveyard | SpellDescription$ Choose target artifact card in your graveyard. You may cast that card this turn. | RememberObjects$ Targeted | StaticAbilities$ STPlay | ExileOnMoved$ Graveyard +SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Graveyard | Description$ You may cast that card this turn. +Oracle:This spell costs {1} less to cast for each artifact you control.\nWhen Emry, Lurker of the Loch enters the battlefield, put the top four cards of your library into your graveyard.\n{T}: Choose target artifact card in your graveyard. You may cast that card this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/insatiable_appetite.txt b/forge-gui/res/cardsfolder/upcoming/insatiable_appetite.txt new file mode 100644 index 00000000000..4657f1f06a5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/insatiable_appetite.txt @@ -0,0 +1,9 @@ +Name:Insatiable Appetite +ManaCost:1 G +Types:Instant +A:SP$ Sacrifice | Cost$ 1 G | SacValid$ Food | Optional$ True | RememberSacrificed$ True | SubAbility$ DBPump | SpellDescription$ You may sacrifice a Food. If you do, target creature gets +5/+5 until end of turn. Otherwise, that creature gets +3/+3 until end of turn. +SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target Creature | NumAtt$ +X | NumDef$ +X | References$ X,Y | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$Compare Y GE1.5.3 +SVar:Y:Remembered$Amount +Oracle:You may sacrifice a Food. If you do, target creature gets +5/+5 until end of turn. Otherwise, that creature gets +3/+3 until end of turn. From 86f344450d23d325c42ecd0f793a80cd8028ed20 Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 15 Sep 2019 19:04:18 +0800 Subject: [PATCH 11/34] Fix Midnight Clock --- forge-gui/res/cardsfolder/upcoming/midnight_clock.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt b/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt index a92cf6c1230..73795f49801 100644 --- a/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt +++ b/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt @@ -7,7 +7,7 @@ AI:RemoveDeck:Random T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each upkeep, put an hour counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ HOUR | CounterNum$ 1 T:Mode$ CounterAdded | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ HOUR | CounterAmount$ EQ12 | Execute$ TrigChangeAll | TriggerDescription$ When the twelfth hour counter is put on CARDNAME, shuffle your hand and graveyard into your library, then draw seven cards. Exile CARDNAME. -SVar:TrigChangeAll:DB$ ChangeZoneAll | Origin$ Graveyard,Hand | Destination$ Library | ChangeType$ Card.YouOwn | SubAbility$ DBDraw +SVar:TrigChangeAll:DB$ ChangeZoneAll | Origin$ Graveyard,Hand | Destination$ Library | ChangeType$ Card.YouOwn | Shuffle$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 7 | SubAbility$ DBExile SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile Oracle:{T}: Add {U}.\n{2}{U}: Put an hour counter on Midnight Clock.\nAt the beginning of each upkeep, put an hour counter on Midnight Clock.\nWhen the twelfth hour counter is put on Midnight Clock, shuffle your hand and graveyard into your library, then draw seven cards. Exile Midnight Clock. From 83c6473a7c1f8c8f4063eb4fc51587dabbdce0a9 Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 15 Sep 2019 19:23:55 +0800 Subject: [PATCH 12/34] Add Vantress Gargoyle --- .../main/java/forge/game/player/PlayerProperty.java | 9 +++++++++ .../res/cardsfolder/upcoming/vantress_gargoyle.txt | 11 +++++++++++ 2 files changed, 20 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/vantress_gargoyle.txt diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index 88038cad515..5970a266813 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -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; diff --git a/forge-gui/res/cardsfolder/upcoming/vantress_gargoyle.txt b/forge-gui/res/cardsfolder/upcoming/vantress_gargoyle.txt new file mode 100644 index 00000000000..c702ababf39 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vantress_gargoyle.txt @@ -0,0 +1,11 @@ +Name:Vantress Gargoyle +ManaCost:1 U +Types:Artifact Creature Gargoyle +PT:5/4 +K:Flying +S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefender$ HasCardsInGraveyard_Card_GE7 | Description$ CARDNAME can't attack unless defending player has seven or more cards in their graveyard. +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | CheckSVar$ X | SVarCompare$ LT4 | Description$ CARDNAME can't block unless you have four or more cards in hand. +SVar:X:Count$InYourHand +A:AB$ Mill | Cost$ T | NumCards$ 1 | Defined$ Player | SpellDescription$ Each player puts the top card of their library into their graveyard. +AI:RemoveDeck:Random +Oracle:Flying\nVantress Gargoyle can't attack unless defending player has seven or more cards in their graveyard.\nVantress Gargoyle can't block unless you have four or more cards in hand.\n{T}: Each player puts the top card of their library into their graveyard. From bfaf054e88e972e17f873a59241e434923012bbf Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 15 Sep 2019 20:10:27 +0800 Subject: [PATCH 13/34] Add Wildborn Preserver --- .../game/ability/effects/ImmediateTriggerEffect.java | 5 +++++ forge-gui/res/cardsfolder/s/scattering_stroke.txt | 2 +- .../res/cardsfolder/upcoming/wildborn_preserver.txt | 12 ++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/wildborn_preserver.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java index 8fe2f8b4813..7b0e66c1c42 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java @@ -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()); diff --git a/forge-gui/res/cardsfolder/s/scattering_stroke.txt b/forge-gui/res/cardsfolder/s/scattering_stroke.txt index 7202902e5d5..dd9466ff27c 100644 --- a/forge-gui/res/cardsfolder/s/scattering_stroke.txt +++ b/forge-gui/res/cardsfolder/s/scattering_stroke.txt @@ -8,4 +8,4 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:AddMana:DB$ Mana | Produced$ C | Amount$ X | References$ X SVar:X:Count$TriggerRememberAmount SVar:Picture:http://www.wizards.com/global/images/magic/general/scattering_stroke.jpg -Oracle:Counter target spell. Clash with an opponent. If you win, at the beginning of your next main phase, you may add an amount of {C} equal to that spell's converted mana cost.. (Each clashing player reveals the top card of their library, then puts that card on the top or bottom. A player wins if their card had a higher converted mana cost.) +Oracle:Counter target spell. Clash with an opponent. If you win, at the beginning of your next main phase, you may add an amount of {C} equal to that spell's converted mana cost. (Each clashing player reveals the top card of their library, then puts that card on the top or bottom. A player wins if their card had a higher converted mana cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/wildborn_preserver.txt b/forge-gui/res/cardsfolder/upcoming/wildborn_preserver.txt new file mode 100644 index 00000000000..b8ef5ca1567 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wildborn_preserver.txt @@ -0,0 +1,12 @@ +Name:Wildborn Preserver +ManaCost:1 G +Types:Creature Elf Archer +PT:2/2 +K:Flash +K:Reach +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonHuman+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigImmediateTrig | TriggerDescription$ Whenever another non-Human creature enters the battlefield under your control, you may pay {X}. When you do, put X +1/+1 counters on CARDNAME. +SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ X | Execute$ TrigPutCounter | RememberDefinedNumber$ X | References$ X | TriggerDescription$ When you do, put X +1/+1 counters on CARDNAME. +SVar:X:Count$xPaid +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Y | References$ Y +SVar:Y:Count$TriggerRememberAmount +Oracle:Flash\nReach\nWhenever another non-Human creature enters the battlefield under your control, you may pay {X}. When you do, put X +1/+1 counters on Wildborn Preserver. From 243726d307b7c5403158bfbca3ca4222dbee739d Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 15 Sep 2019 21:37:24 +0800 Subject: [PATCH 14/34] Refactor "For each color among permanents you control, add one mana of that color" --- .../forge/game/ability/effects/ManaEffect.java | 15 ++++++++++++++- .../java/forge/game/card/CardFactoryUtil.java | 10 ++++------ forge-gui/res/cardsfolder/b/bloom_tender.txt | 6 +----- .../res/cardsfolder/upcoming/faeburrow_elder.txt | 7 ++----- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 12a02922419..25269a4f4c1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -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()) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index b6d21204033..a1566899fd1 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1102,13 +1102,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")) { diff --git a/forge-gui/res/cardsfolder/b/bloom_tender.txt b/forge-gui/res/cardsfolder/b/bloom_tender.txt index e717ae667e6..db8383f11e5 100644 --- a/forge-gui/res/cardsfolder/b/bloom_tender.txt +++ b/forge-gui/res/cardsfolder/b/bloom_tender.txt @@ -2,11 +2,7 @@ Name:Bloom Tender ManaCost:1 G Types:Creature Elf Druid PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ W | ConditionPresent$ Permanent.YouCtrl+White | SubAbility$ DBManaU | SpellDescription$ For each color among permanents you control, add one mana of that color. -SVar:DBManaU:DB$ Mana | Produced$ U | ConditionPresent$ Permanent.YouCtrl+Blue | SubAbility$ DBManaB -SVar:DBManaB:DB$ Mana | Produced$ B | ConditionPresent$ Permanent.YouCtrl+Black | SubAbility$ DBManaR -SVar:DBManaR:DB$ Mana | Produced$ R | ConditionPresent$ Permanent.YouCtrl+Red | SubAbility$ DBManaG -SVar:DBManaG:DB$ Mana | Produced$ G | ConditionPresent$ Permanent.YouCtrl+Green +A:AB$ Mana | Cost$ T | Produced$ Special EachColorAmong_Permanent.YouCtrl | SpellDescription$ For each color among permanents you control, add one mana of that color. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bloom_tender.jpg Oracle:{T}: For each color among permanents you control, add one mana of that color. diff --git a/forge-gui/res/cardsfolder/upcoming/faeburrow_elder.txt b/forge-gui/res/cardsfolder/upcoming/faeburrow_elder.txt index f510b652df7..46ee607e76c 100644 --- a/forge-gui/res/cardsfolder/upcoming/faeburrow_elder.txt +++ b/forge-gui/res/cardsfolder/upcoming/faeburrow_elder.txt @@ -5,9 +5,6 @@ PT:0/0 K:Vigilance S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each color among permanents you control. SVar:X:Count$ColorsCtrl Permanent.YouCtrl+inZoneBattlefield -A:AB$ Mana | Cost$ T | Produced$ W | ConditionPresent$ Permanent.YouCtrl+White | SubAbility$ DBManaU | SpellDescription$ For each color among permanents you control, add one mana of that color. -SVar:DBManaU:DB$ Mana | Produced$ U | ConditionPresent$ Permanent.YouCtrl+Blue | SubAbility$ DBManaB -SVar:DBManaB:DB$ Mana | Produced$ B | ConditionPresent$ Permanent.YouCtrl+Black | SubAbility$ DBManaR -SVar:DBManaR:DB$ Mana | Produced$ R | ConditionPresent$ Permanent.YouCtrl+Red | SubAbility$ DBManaG -SVar:DBManaG:DB$ Mana | Produced$ G | ConditionPresent$ Permanent.YouCtrl+Green +A:AB$ Mana | Cost$ T | Produced$ Special EachColorAmong_Permanent.YouCtrl | SpellDescription$ For each color among permanents you control, add one mana of that color. +AI:RemoveDeck:All Oracle:Vigilance\nFaeburrow Elder gets +1/+1 for each color among permanents you control.\n{T}: For each color among permanents you control, add one mana of that color. From f1cbaa9d9595c0ac70eb50b2ed1a567f1a416a0a Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 16 Sep 2019 08:29:00 +0800 Subject: [PATCH 15/34] Fix SVar name --- forge-gui/res/cardsfolder/upcoming/midnight_clock.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt b/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt index 73795f49801..33a384fb9c5 100644 --- a/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt +++ b/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt @@ -9,5 +9,5 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ HOUR | Counter T:Mode$ CounterAdded | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ HOUR | CounterAmount$ EQ12 | Execute$ TrigChangeAll | TriggerDescription$ When the twelfth hour counter is put on CARDNAME, shuffle your hand and graveyard into your library, then draw seven cards. Exile CARDNAME. SVar:TrigChangeAll:DB$ ChangeZoneAll | Origin$ Graveyard,Hand | Destination$ Library | ChangeType$ Card.YouOwn | Shuffle$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 7 | SubAbility$ DBExile -SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile +SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile Oracle:{T}: Add {U}.\n{2}{U}: Put an hour counter on Midnight Clock.\nAt the beginning of each upkeep, put an hour counter on Midnight Clock.\nWhen the twelfth hour counter is put on Midnight Clock, shuffle your hand and graveyard into your library, then draw seven cards. Exile Midnight Clock. From c42f0037551c5d475c1247441dc304fbb230c948 Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 16 Sep 2019 16:12:00 +0800 Subject: [PATCH 16/34] Add Folio of Fancies --- .../res/cardsfolder/upcoming/folio_of_fancies.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/folio_of_fancies.txt diff --git a/forge-gui/res/cardsfolder/upcoming/folio_of_fancies.txt b/forge-gui/res/cardsfolder/upcoming/folio_of_fancies.txt new file mode 100644 index 00000000000..f9dd3d0a9e0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/folio_of_fancies.txt @@ -0,0 +1,12 @@ +Name:Folio of Fancies +ManaCost:1 U +Types:Artifact +S:Mode$ Continuous | Affected$ Player | SetMaxHandSize$ Unlimited | Description$ Players have no maximum hand size. +SVar:NonStackingEffect:True +A:AB$ Draw | Cost$ X X T | NumCards$ X | References$ X | Defined$ Player | SpellDescription$ Each player draws X cards. +SVar:X:Count$xPaid +A:AB$ RepeatEach | Cost$ 2 U T | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBMill | SpellDescription$ Each opponent puts a number of cards equal to the number of cards in their hand from the top of their library into their graveyard. +SVar:DBMill:DB$ Mill | Defined$ Remembered | NumCards$ Y | References$ Y +SVar:Y:Count$ValidHand Card.RememberedPlayerCtrl +AI:RemoveDeck:All +Oracle:Players have no maximum hand size.\n{X}{X}, {T}: Each player draws X cards.\n{2}{U}, {T}: Each opponent puts a number of cards equal to the number of cards in their hand from the top of their library into their graveyard. From 0e5884d7573fab7e084d77a7d16bf13da34e1a8d Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 16 Sep 2019 16:35:06 +0800 Subject: [PATCH 17/34] Add Henge Walker --- .../src/main/java/forge/game/CardTraitBase.java | 14 +++++++++++++- .../res/cardsfolder/upcoming/henge_walker.txt | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/henge_walker.txt diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index a56db98f6f9..e51ab5202c0 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -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; } } diff --git a/forge-gui/res/cardsfolder/upcoming/henge_walker.txt b/forge-gui/res/cardsfolder/upcoming/henge_walker.txt new file mode 100644 index 00000000000..e85b1bdfef4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/henge_walker.txt @@ -0,0 +1,6 @@ +Name:Henge Walker +ManaCost:3 +Types:Artifact Creature Golem +PT:2/2 +K:etbCounter:P1P1:1:Adamant$ Any:Adamant — If at least three mana of the same color was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. +Oracle:Adamant — If at least three mana of the same color was spent to cast this spell, Henge Walker enters the battlefield with a +1/+1 counter on it. From 12b05147e70de9b89439d7859721daf10fb198f2 Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 16 Sep 2019 18:27:10 +0800 Subject: [PATCH 18/34] Update two Adamant cards --- forge-game/src/main/java/forge/game/card/CardUtil.java | 3 ++- forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt | 4 +--- forge-gui/res/cardsfolder/upcoming/garenbrig_paladin.txt | 4 +--- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 7bf0cfe1390..1bb94cdcdb4 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -56,7 +56,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 modifiableKeywordEndings = ImmutableList.builder().add( "walk", "cycling", "offering").build(); diff --git a/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt b/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt index b76ada65fcd..456f35744c0 100644 --- a/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt +++ b/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt @@ -3,7 +3,5 @@ ManaCost:3 R Types:Creature Human Knight PT:4/1 K:Haste -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | Adamant$ Red | ReplaceWith$ ETBAddCounter | Description$ Adamant — If at least three red mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. -SVar:ETBAddCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToPlay -SVar:MoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:etbCounter:P1P1:1:Adamant$ Red:Adamant — If at least three red mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. Oracle:Haste\nAdamant — If at least three red mana was spent to cast this spell, Embereth Paladin enters the battlefield with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/garenbrig_paladin.txt b/forge-gui/res/cardsfolder/upcoming/garenbrig_paladin.txt index cdb510b7e22..8c81772b74d 100644 --- a/forge-gui/res/cardsfolder/upcoming/garenbrig_paladin.txt +++ b/forge-gui/res/cardsfolder/upcoming/garenbrig_paladin.txt @@ -2,8 +2,6 @@ Name:Garenbrig Paladin ManaCost:4 G Types:Creature Giant Knight PT:4/4 -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | Adamant$ Green | ReplaceWith$ ETBAddCounter | Description$ Adamant — If at least three green mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. -SVar:ETBAddCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToPlay -SVar:MoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:etbCounter:P1P1:1:Adamant$ Green:Adamant — If at least three green mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. K:CantBeBlockedBy Creature.powerLE2 Oracle:Adamant — If at least three green mana was spent to cast this spell, Garenbrig Paladin enters the battlefield with a +1/+1 counter on it.\nGarenbrig Paladin can't be blocked by creatures with power 2 or less. From 716faf4706f23d8814a8544c86c96c6a03f44f45 Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 16 Sep 2019 18:35:31 +0800 Subject: [PATCH 19/34] Add Clockwork Servant --- forge-gui/res/cardsfolder/upcoming/clockwork_servant.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/clockwork_servant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/clockwork_servant.txt b/forge-gui/res/cardsfolder/upcoming/clockwork_servant.txt new file mode 100644 index 00000000000..fff1fe161a5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/clockwork_servant.txt @@ -0,0 +1,7 @@ +Name:Clockwork Servant +ManaCost:3 +Types:Artifact Creature Gnome +PT:2/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Adamant$ Any | Execute$ TrigDraw | TriggerDescription$ Adamant — When CARDNAME enters the battlefield, if at least three mana of the same color was spent to cast it, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:Adamant — When Clockwork Servant enters the battlefield, if at least three mana of the same color was spent to cast it, draw a card. From e0f2802eda44767626d638fd26091629d538a4d2 Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 16 Sep 2019 18:49:46 +0800 Subject: [PATCH 20/34] Add Sundering Stroke --- .../src/main/java/forge/game/ability/AbilityUtils.java | 3 ++- forge-gui/res/cardsfolder/upcoming/sundering_stroke.txt | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/sundering_stroke.txt diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index fa03796fa5a..f8abf7b00b0 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1620,7 +1620,8 @@ public class AbilityUtils { // Count$Adamant... 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); } diff --git a/forge-gui/res/cardsfolder/upcoming/sundering_stroke.txt b/forge-gui/res/cardsfolder/upcoming/sundering_stroke.txt new file mode 100644 index 00000000000..e34f7f05e6a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sundering_stroke.txt @@ -0,0 +1,7 @@ +Name:Sundering Stroke +ManaCost:6 R +Types:Sorcery +A:SP$ DealDamage | Cost$ 6 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to distribute damage to | NumDmg$ 7 | TargetMin$ 1 | TargetMax$ 3 | DividedAsYouChoose$ 7 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ DBDmgAll | StackDescription$ SpellDescription | SpellDescription$ CARDNAME deals 7 damage divided as you choose among one, two, or three targets. If at least seven red mana was spent to cast this spell, instead CARDNAME deals 7 damage to each of those permanents and/or players. +SVar:DBDmgAll:DB$ DealDamage | Defined$ Targeted | NumDmg$ 7 | ConditionCheckSVar$ X | References$ X | StackDescription$ None +SVar:X:Count$Adamant_7.Red.1.0 +Oracle:Sundering Stroke deals 7 damage divided as you choose among one, two, or three targets. If at least seven red mana was spent to cast this spell, instead Sundering Stroke deals 7 damage to each of those permanents and/or players. From 70f640b41424723d1d755b476d8abce368ecc318 Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 16 Sep 2019 20:10:08 +0800 Subject: [PATCH 21/34] Add two cards --- forge-gui/res/cardsfolder/p/psychic_intrusion.txt | 4 +--- .../res/cardsfolder/upcoming/blow_your_house_down.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/covetous_urge.txt | 9 +++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/blow_your_house_down.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/covetous_urge.txt diff --git a/forge-gui/res/cardsfolder/p/psychic_intrusion.txt b/forge-gui/res/cardsfolder/p/psychic_intrusion.txt index fd16b080671..1d0a7051b39 100644 --- a/forge-gui/res/cardsfolder/p/psychic_intrusion.txt +++ b/forge-gui/res/cardsfolder/p/psychic_intrusion.txt @@ -2,10 +2,8 @@ Name:Psychic Intrusion ManaCost:3 U B Types:Sorcery A:SP$ ChangeZone | Cost$ 3 U B | Origin$ Hand,Graveyard | Destination$ Exile | ValidTgts$ Opponent | DefinedPlayer$ Targeted | Chooser$ You | TgtPrompt$ Select target opponent | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | RememberChanged$ True | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Target opponent reveals their hand. You choose a nonland card from that player's graveyard or hand and exile it. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell. -SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCastPI | SVars$ TrigRemoveSelf | RememberObjects$ Remembered | Duration$ Permanent | SubAbility$ DBCleanup +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | Duration$ Permanent | ExileOnMoved$ Exile | SubAbility$ DBCleanup SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may cast that card and you may spend mana as though it were mana of any color to cast it. -SVar:TriggerCastPI:Mode$ SpellCast | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Execute$ TrigRemoveSelf | Static$ True -SVar:TrigRemoveSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_intrusion.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/blow_your_house_down.txt b/forge-gui/res/cardsfolder/upcoming/blow_your_house_down.txt new file mode 100644 index 00000000000..94decc095c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blow_your_house_down.txt @@ -0,0 +1,6 @@ +Name:Blow Your House Down +ManaCost:2 R +Types:Sorcery +A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 3 | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | TgtPrompt$ Select target creature | SubAbility$ DBDestroy | SpellDescription$ Up to three target creatures can't block this turn. Destroy any of them that are Walls. +SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Targeted.Wall +Oracle:Up to three target creatures can't block this turn. Destroy any of them that are Walls. diff --git a/forge-gui/res/cardsfolder/upcoming/covetous_urge.txt b/forge-gui/res/cardsfolder/upcoming/covetous_urge.txt new file mode 100644 index 00000000000..97b9ce91901 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/covetous_urge.txt @@ -0,0 +1,9 @@ +Name:Covetous Urge +ManaCost:U/B U/B U/B U/B +Types:Sorcery +A:SP$ ChangeZone | Cost$ U/B U/B U/B U/B | Origin$ Hand,Graveyard | Destination$ Exile | ValidTgts$ Opponent | DefinedPlayer$ Targeted | Chooser$ You | TgtPrompt$ Select target opponent | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | RememberChanged$ True | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Target opponent reveals their hand. You choose a nonland card from that player's graveyard or hand and exile it. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell. +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | Duration$ Permanent | ExileOnMoved$ Exile | SubAbility$ DBCleanup +SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may cast that card and you may spend mana as though it were mana of any color to cast it. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +AI:RemoveDeck:All +Oracle:Target opponent reveals their hand. You choose a nonland card from that player's graveyard or hand and exile it. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell. From c8cb56c416a79dcef7ba4e4b6aa5bf0a568445bf Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 16 Sep 2019 20:20:07 +0800 Subject: [PATCH 22/34] Update a script --- forge-gui/res/cardsfolder/p/prahv.txt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/forge-gui/res/cardsfolder/p/prahv.txt b/forge-gui/res/cardsfolder/p/prahv.txt index eec7a7065c7..be2396dbeac 100644 --- a/forge-gui/res/cardsfolder/p/prahv.txt +++ b/forge-gui/res/cardsfolder/p/prahv.txt @@ -4,12 +4,7 @@ Types:Plane Ravnica S:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature.YouCtrl | CheckSVar$ CheckThisTurnCast | Description$ If you cast a spell this turn, you can't attack with creatures. SVar:CheckThisTurnCast:Count$ThisTurnCast_Card.YouCtrl S:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ You | CheckSVar$ CheckThisTurnAttacked | Description$ If you attacked with creatures this turn, you can't cast spells. -SVar:CheckThisTurnAttacked:Number$0 -T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Execute$ DBStoreSVar | Static$ True -SVar:DBStoreSVar:DB$ StoreSVar | SVar$ CheckThisTurnAttacked | Type$ Number | Expression$ 1 -T:Mode$ PlaneswalkedFrom | ValidCard$ Plane.Self | Execute$ DBReset | Static$ True -T:Mode$ Phase | Phase$ Cleanup | Execute$ DBReset | Static$ True -SVar:DBReset:DB$ StoreSVar | SVar$ CheckThisTurnAttacked | Type$ Number | Expression$ 0 +SVar:CheckThisTurnAttacked:Count$AttackersDeclared T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, you gain life equal to the number of cards in your hand. SVar:RolledChaos:DB$ GainLife | LifeAmount$ PrahvX | References$ PrahvX | Defined$ You SVar:PrahvX:Count$InYourHand From 4b031c6928bbb3e863a52eebf7de076d4874bc4b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 16 Sep 2019 13:31:54 +0000 Subject: [PATCH 23/34] Fix Cinder Cloud and Noxious Gearhulk Interaction with Cards with CDA (Noxious Gearhulk -> Malignus, as reported on forums) --- forge-gui/res/cardsfolder/c/cinder_cloud.txt | 2 +- forge-gui/res/cardsfolder/n/noxious_gearhulk.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/cinder_cloud.txt b/forge-gui/res/cardsfolder/c/cinder_cloud.txt index 18be7982e0e..f0d280b4d84 100644 --- a/forge-gui/res/cardsfolder/c/cinder_cloud.txt +++ b/forge-gui/res/cardsfolder/c/cinder_cloud.txt @@ -1,7 +1,7 @@ Name:Cinder Cloud ManaCost:3 R R Types:Instant -A:SP$ Destroy | Cost$ 3 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberDestroyed$ True | SubAbility$ DBDamage | SpellDescription$ Destroy target creature. If a white creature dies this way, Cinder Cloud deals damage to that creature's controller equal to the creature's power. +A:SP$ Destroy | Cost$ 3 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberLKI$ True | SubAbility$ DBDamage | SpellDescription$ Destroy target creature. If a white creature dies this way, Cinder Cloud deals damage to that creature's controller equal to the creature's power. SVar:DBDamage:DB$ DealDamage | Defined$ RememberedController | NumDmg$ Z | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE1 | References$ Y,Z SVar:Y:RememberedLKI$Valid Creature.White SVar:Z:RememberedLKI$CardPower diff --git a/forge-gui/res/cardsfolder/n/noxious_gearhulk.txt b/forge-gui/res/cardsfolder/n/noxious_gearhulk.txt index 501c4a800cc..52ced432ad1 100644 --- a/forge-gui/res/cardsfolder/n/noxious_gearhulk.txt +++ b/forge-gui/res/cardsfolder/n/noxious_gearhulk.txt @@ -4,7 +4,7 @@ Types: Artifact Creature Construct PT:5/4 K:Menace T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | OptionalDecider$ You | RememberLKI$ True | TriggerDescription$ When CARDNAME enters the battlefield, you may destroy another target creature. If a creature is destroyed this way, you gain life equal to its toughness. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature. | RememberDestroyed$ True | SubAbility$ DBGainLife +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature. | RememberLKI$ True | SubAbility$ DBGainLife SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:RememberedLKI$CardToughness From e98cb0043de6c66668065678b3122e407a9f0b29 Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 16 Sep 2019 22:05:14 +0800 Subject: [PATCH 24/34] Add Robber of the Rich --- .../main/java/forge/ai/ability/DamageDealAi.java | 2 +- .../src/main/java/forge/ai/ability/DestroyAi.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 7 +++++++ .../main/java/forge/game/combat/CombatUtil.java | 2 +- .../game/combat/GlobalAttackRestrictions.java | 2 +- .../src/main/java/forge/game/player/Player.java | 15 +++++++++------ .../forge/game/staticability/StaticAbility.java | 2 +- .../cardsfolder/upcoming/robber_of_the_rich.txt | 15 +++++++++++++++ 8 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/robber_of_the_rich.txt diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index f4af5ec56dc..40141ae80a4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -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)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index 69c5bf22fc0..fd7632bc44d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -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; } } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index a1566899fd1..dde9459e34d 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1329,6 +1329,13 @@ public class CardFactoryUtil { return doXMath(cc.getAttackersDeclaredThisTurn(), m, c); } + // Count$CardAttackedThisTurn_ + 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 // Count$LastTurnCast if (sq[0].contains("ThisTurnCast") || sq[0].contains("LastTurnCast")) { diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 2b17d5b3003..1578b1d1d81 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -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) { diff --git a/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java b/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java index dc8eabe113f..da168fe0cab 100644 --- a/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java +++ b/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java @@ -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; diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 887af26d406..f03e5a075a7 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -124,7 +124,7 @@ public class Player extends GameEntity implements Comparable { 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; @@ -1824,11 +1824,14 @@ public class Player extends GameEntity implements Comparable { 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() { @@ -2389,7 +2392,7 @@ public class Player extends GameEntity implements Comparable { resetNumDrawnThisTurn(); resetNumDiscardedThisTurn(); setNumCardsInHandStartedThisTurnWith(getCardsIn(ZoneType.Hand).size()); - setAttackedWithCreatureThisTurn(false); + clearCreaturesAttackedThisTurn(); setActivateLoyaltyAbilityThisTurn(false); setTappedLandForManaThisTurn(false); setLandsPlayedLastTurn(getLandsPlayedThisTurn()); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 3906fe03688..ca2446d0e8d 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -527,7 +527,7 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone } if (hasParam("PlayerAttackedWithCreatureThisTurn") - && !player.getAttackedWithCreatureThisTurn()) { + && player.getCreaturesAttackedThisTurn().isEmpty()) { return false; } diff --git a/forge-gui/res/cardsfolder/upcoming/robber_of_the_rich.txt b/forge-gui/res/cardsfolder/upcoming/robber_of_the_rich.txt new file mode 100644 index 00000000000..57fbc9b8631 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/robber_of_the_rich.txt @@ -0,0 +1,15 @@ +Name:Robber of the Rich +ManaCost:1 R +Types:Creature Human Archer Rogue +PT:2/2 +K:Reach +K:Haste +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | CheckSVar$ X | SVarCompare$ GTY | References$ X,Y | TriggerDescription$ Whenever CARDNAME attacks, if defending player has more cards in hand than you, exile the top card of their library. +SVar:TrigExile:DB$ Mill | Defined$ TriggeredDefendingPlayer | NumCards$ 1 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ STPlay | SVars$ Z | SubAbility$ DBCleanup | ExileOnMoved$ Exile | Duration$ Permanent +SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | CheckSVar$ Z | References$ Z | Description$ During any turn you attacked with a Rogue, you may cast that card and you may spend mana as though it were mana of any color to cast that spell. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$ValidHand Card.DefenderCtrl +SVar:Y:Count$InYourHand +SVar:Z:Count$CreaturesAttackedThisTurn_Rogue +Oracle:Reach, haste\nWhenever Robber of the Rich attacks, if defending player has more cards in hand than you, exile the top card of their library. During any turn you attacked with a Rogue, you may cast that card and you may spend mana as though it were mana of any color to cast that spell. From 72079ad60944ff4306edb8e1ffd920a5f2acadf4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 16 Sep 2019 17:57:22 +0000 Subject: [PATCH 25/34] Fix Cinder Cloud and Noxious Gearhulk Interaction with Cards with CDA (Noxious Gearhulk -> Malignus, as reported on forums) --- forge-gui-android/AndroidManifest.xml | 3 +-- forge-gui-android/src/forge/app/Main.java | 13 ++++--------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/forge-gui-android/AndroidManifest.xml b/forge-gui-android/AndroidManifest.xml index f207f20d405..5edbcfad66e 100644 --- a/forge-gui-android/AndroidManifest.xml +++ b/forge-gui-android/AndroidManifest.xml @@ -7,8 +7,7 @@ - - + diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index b9d26086c2b..66728960885 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -17,13 +17,10 @@ import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.PowerManager; -import android.provider.Settings; -import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; import android.view.WindowManager; import android.webkit.MimeTypeMap; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.android.AndroidApplication; -import forge.FThreads; import forge.Forge; import forge.interfaces.IDeviceAdapter; import forge.model.FModel; @@ -37,7 +34,6 @@ import java.io.OutputStream; import java.util.concurrent.Callable; public class Main extends AndroidApplication { - public int time = -2; @Override protected void onCreate(Bundle savedInstanceState) { @@ -239,17 +235,16 @@ public class Main extends AndroidApplication { @Override public void preventSystemSleep(final boolean preventSleep) { - if (time == -2) - time = Settings.System.getInt(getContentResolver(), SCREEN_OFF_TIMEOUT, 0); - FThreads.invokeInEdtNowOrLater(new Runnable() { //must set window flags from EDT thread + // Setting getWindow() Flags needs to run on UI thread. + // Should fix android.view.ViewRoot$CalledFromWrongThreadException: + // Only the original thread that created a view hierarchy can touch its views. + runOnUiThread(new Runnable() { @Override public void run() { if (preventSleep) { - Settings.System.putInt(getContentResolver(), SCREEN_OFF_TIMEOUT, Integer.MAX_VALUE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } else { - Settings.System.putInt(getContentResolver(), SCREEN_OFF_TIMEOUT, time); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } From b462f0dba18c70cec05862fa50a1c3f8fe37ee02 Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 17 Sep 2019 10:52:25 +0800 Subject: [PATCH 26/34] Update trigger description --- forge-gui/res/cardsfolder/upcoming/robber_of_the_rich.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/robber_of_the_rich.txt b/forge-gui/res/cardsfolder/upcoming/robber_of_the_rich.txt index 57fbc9b8631..575d5a15686 100644 --- a/forge-gui/res/cardsfolder/upcoming/robber_of_the_rich.txt +++ b/forge-gui/res/cardsfolder/upcoming/robber_of_the_rich.txt @@ -4,7 +4,7 @@ Types:Creature Human Archer Rogue PT:2/2 K:Reach K:Haste -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | CheckSVar$ X | SVarCompare$ GTY | References$ X,Y | TriggerDescription$ Whenever CARDNAME attacks, if defending player has more cards in hand than you, exile the top card of their library. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | CheckSVar$ X | SVarCompare$ GTY | References$ X,Y | TriggerDescription$ Whenever CARDNAME attacks, if defending player has more cards in hand than you, exile the top card of their library. During any turn you attacked with a Rogue, you may cast that card and you may spend mana as though it were mana of any color to cast that spell. SVar:TrigExile:DB$ Mill | Defined$ TriggeredDefendingPlayer | NumCards$ 1 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ STPlay | SVars$ Z | SubAbility$ DBCleanup | ExileOnMoved$ Exile | Duration$ Permanent SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | CheckSVar$ Z | References$ Z | Description$ During any turn you attacked with a Rogue, you may cast that card and you may spend mana as though it were mana of any color to cast that spell. From 5d1618104e22336a71418f8a32f3be8cc75dc1a8 Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 17 Sep 2019 15:22:06 +0800 Subject: [PATCH 27/34] Add three cards --- forge-gui/res/cardsfolder/upcoming/ardenvale_paladin.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/mystical_dispute.txt | 8 ++++++++ .../res/cardsfolder/upcoming/rally_for_the_throne.txt | 8 ++++++++ 3 files changed, 22 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ardenvale_paladin.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mystical_dispute.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rally_for_the_throne.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ardenvale_paladin.txt b/forge-gui/res/cardsfolder/upcoming/ardenvale_paladin.txt new file mode 100644 index 00000000000..74fbc6bddca --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ardenvale_paladin.txt @@ -0,0 +1,6 @@ +Name:Ardenvale Paladin +ManaCost:3 W +Types:Creature Human Knight +PT:2/5 +K:etbCounter:P1P1:1:Adamant$ White:Adamant — If at least three white mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. +Oracle:Adamant — If at least three white mana was spent to cast this spell, Ardenvale Paladin enters the battlefield with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/mystical_dispute.txt b/forge-gui/res/cardsfolder/upcoming/mystical_dispute.txt new file mode 100644 index 00000000000..2bc300fc49a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mystical_dispute.txt @@ -0,0 +1,8 @@ +Name:Mystical Dispute +ManaCost:2 U +Types:Instant +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ XBlue | Relative$ True | EffectZone$ All | Description$ CARDNAME costs {2} less to cast if it targets a blue spell. +SVar:XBlue:Count$Compare CheckTgt GE1.2.0 +SVar:CheckTgt:Targeted$Valid Card.Blue +A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 3 | References$ XBlue,CheckTgt | SpellDescription$ This spell costs {2} less to cast if it targets a blue spell. Counter target spell unless its controller pays {3}. +Oracle:This spell costs {2} less to cast if it targets a blue spell.\nCounter target spell unless its controller pays {3}. diff --git a/forge-gui/res/cardsfolder/upcoming/rally_for_the_throne.txt b/forge-gui/res/cardsfolder/upcoming/rally_for_the_throne.txt new file mode 100644 index 00000000000..38416eb5e4d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rally_for_the_throne.txt @@ -0,0 +1,8 @@ +Name:Rally for the Throne +ManaCost:2 W +Types:Instant +A:SP$ Token | Cost$ 2 W | TokenAmount$ 2 | TokenScript$ w_1_1_human | TokenOwner$ You | LegacyImage$ w 1 1 human eld | SubAbility$ DBGainLife | SpellDescription$ Create two 1/1 white Human creature tokens. Adamant — If at least three white mana was spent to cast this spell, you gain 1 life for each creature you control. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ Y | ConditionCheckSVar$ X | References$ X,Y +SVar:X:Count$Adamant.White.1.0 +SVar:Y:Count$Valid Creature.YouCtrl +Oracle:Create two 1/1 white Human creature tokens.\nAdamant — If at least three white mana was spent to cast this spell, you gain 1 life for each creature you control. From d56568b4997ffdf7cb47d9c9b641fa6cdb323e7f Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 17 Sep 2019 15:22:19 +0800 Subject: [PATCH 28/34] Add Cauldron's Gift --- .../java/forge/game/ability/effects/ChangeZoneEffect.java | 5 ++++- forge-gui/res/cardsfolder/upcoming/cauldrons_gift.txt | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/cauldrons_gift.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 7debeb1d96a..128c49d24a8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -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); diff --git a/forge-gui/res/cardsfolder/upcoming/cauldrons_gift.txt b/forge-gui/res/cardsfolder/upcoming/cauldrons_gift.txt new file mode 100644 index 00000000000..da233a0b65b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cauldrons_gift.txt @@ -0,0 +1,7 @@ +Name:Cauldron's Gift +ManaCost:4 B +Types:Sorcery +A:SP$ Mill | Cost$ 4 B | NumCards$ 4 | Defined$ You | SubAbility$ DBChangeZone | ConditionCheckSVar$ X | References$ X | SpellDescription$ Adamant — If at least three black mana was spent to cast this spell, put the top four cards of your library into your graveyard. You may choose a creature card in your graveyard. If you do, return it to the battlefield with an additional +1/+1 counter on it. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouOwn | Hidden$ True | ChangeNum$ 1 | WithCounters$ P1P1_1 +SVar:X:Count$Adamant.Black.1.0 +Oracle:Adamant — If at least three black mana was spent to cast this spell, put the top four cards of your library into your graveyard.\nYou may choose a creature card in your graveyard. If you do, return it to the battlefield with an additional +1/+1 counter on it. From 2d9d53a19dd41acc8126ad0c2d20441280ac9356 Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 17 Sep 2019 20:45:25 +0800 Subject: [PATCH 29/34] Update Hollow One --- .../src/main/java/forge/game/ability/AbilityUtils.java | 9 +++------ .../src/main/java/forge/game/cost/CostAdjustment.java | 3 +++ forge-gui/res/cardsfolder/h/hollow_one.txt | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index f8abf7b00b0..eb8ac91c253 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -462,12 +462,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) { diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 554a7697404..25c4ca28ca7 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -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); diff --git a/forge-gui/res/cardsfolder/h/hollow_one.txt b/forge-gui/res/cardsfolder/h/hollow_one.txt index feccc64423e..a5899c928f7 100644 --- a/forge-gui/res/cardsfolder/h/hollow_one.txt +++ b/forge-gui/res/cardsfolder/h/hollow_one.txt @@ -2,8 +2,8 @@ Name:Hollow One ManaCost:5 Types:Artifact Creature Golem PT:4/4 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Y | EffectZone$ All | Description$ CARDNAME costs {2} less to cast for each card you've cycled or discarded this turn. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Y | Relative$ True | EffectZone$ All | Description$ This spell costs {2} less to cast for each card you've cycled or discarded this turn. K:Cycling:2 SVar:Y:PlayerCountPropertyYou$CardsDiscardedThisTurn/Twice SVar:Picture:http://www.wizards.com/global/images/magic/general/hollow_one.jpg -Oracle:Hollow One costs {2} less to cast for each card you've cycled or discarded this turn.\nCycling {2} ({2}, Discard this card: Draw a card.) \ No newline at end of file +Oracle:This spell costs {2} less to cast for each card you've cycled or discarded this turn.\nCycling {2} ({2}, Discard this card: Draw a card.) From cf9a72fc42dff1e0a98e623c992e4ccbd5a890c7 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 18 Sep 2019 10:24:04 +0800 Subject: [PATCH 30/34] Add Once Upon a Time --- .../forge/game/ability/effects/RestartGameEffect.java | 1 + .../src/main/java/forge/game/card/CardFactoryUtil.java | 5 +++++ forge-game/src/main/java/forge/game/player/Player.java | 9 ++++++++- forge-gui/res/cardsfolder/upcoming/once_upon_a_time.txt | 7 +++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/once_upon_a_time.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java index 4641d05d75f..61848eba1f3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java @@ -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(); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index dde9459e34d..4490a81a8e4 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -917,6 +917,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); @@ -926,6 +930,7 @@ public class CardFactoryUtil { } } + if (sq[0].equals("StormCount")) { return doXMath(game.getStack().getSpellsCastThisTurn().size() - 1, m, c); } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index f03e5a075a7..b7aec94aa23 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -84,6 +84,7 @@ public class Player extends GameEntity implements Comparable { private final Map assignedDamage = Maps.newHashMap(); private final Map assignedCombatDamage = Maps.newHashMap(); private int spellsCastThisTurn = 0; + private int spellsCastThisGame = 0; private int spellsCastLastTurn = 0; private int landsPlayedThisTurn = 0; private int landsPlayedLastTurn = 0; @@ -2209,6 +2210,7 @@ public class Player extends GameEntity implements Comparable { } 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 { 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; } diff --git a/forge-gui/res/cardsfolder/upcoming/once_upon_a_time.txt b/forge-gui/res/cardsfolder/upcoming/once_upon_a_time.txt new file mode 100644 index 00000000000..13c6d4baada --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/once_upon_a_time.txt @@ -0,0 +1,7 @@ +Name:Once Upon a Time +ManaCost:1 G +Types:Instant +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | CheckSVar$ X | SVarCompare$ EQ0 | MayPlay$ True | MayPlayWithoutManaCost$ True | Description$ If this spell is the first spell you've cast this game, you may cast it without paying its mana cost. +SVar:X:Count$YouCastThisGame +A:SP$ Dig | Cost$ 1 G | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Card.Creature,Card.Land | RestRandomOrder$ True | SpellDescription$ Look at the top five cards of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +Oracle:If this spell is the first spell you've cast this game, you may cast it without paying its mana cost.\nLook at the top five cards of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. From 87fffa0dddf330623cd3f5f4c2974bd7590434d3 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 18 Sep 2019 12:29:05 +0800 Subject: [PATCH 31/34] Add Dance of the Manse --- .../src/main/java/forge/game/card/CardFactoryUtil.java | 1 - forge-gui/res/cardsfolder/upcoming/dance_of_the_manse.txt | 8 ++++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/dance_of_the_manse.txt diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 4490a81a8e4..d31f304b90b 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -930,7 +930,6 @@ public class CardFactoryUtil { } } - if (sq[0].equals("StormCount")) { return doXMath(game.getStack().getSpellsCastThisTurn().size() - 1, m, c); } diff --git a/forge-gui/res/cardsfolder/upcoming/dance_of_the_manse.txt b/forge-gui/res/cardsfolder/upcoming/dance_of_the_manse.txt new file mode 100644 index 00000000000..b9d1a86e96f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dance_of_the_manse.txt @@ -0,0 +1,8 @@ +Name:Dance of the Manse +ManaCost:X W U +Types:Sorcery +A:SP$ ChangeZone | Cost$ X W U | Announce$ X | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Artifact.cmcLEX,Enchantment.cmcLEX | TgtPrompt$ Select target artifact or enchantment in your graveyard | TargetMin$ 0 | TargetMax$ X | SubAbility$ DBAnimate | SpellDescription$ Return up to X target artifact and/or non-Aura enchantment cards with converted mana cost X or less from your graveyard to the battlefield. If X is 6 or more, those permanents are 4/4 creatures in addition to their other types. +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Creature | Power$ 4 | Toughness$ 4 | Permanent$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE6 | References$ X +SVar:X:Count$xPaid +AI:RemoveDeck:All +Oracle:Return up to X target artifact and/or non-Aura enchantment cards each with converted mana cost X or less from your graveyard to the battlefield. If X is 6 or more, those permanents are 4/4 creatures in addition to their other types. From 97ebdff83528708ca55c9cd77d23f76af3d65bd6 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 18 Sep 2019 12:46:52 +0800 Subject: [PATCH 32/34] Add Clackbridge Troll --- .../res/cardsfolder/upcoming/clackbridge_troll.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/clackbridge_troll.txt diff --git a/forge-gui/res/cardsfolder/upcoming/clackbridge_troll.txt b/forge-gui/res/cardsfolder/upcoming/clackbridge_troll.txt new file mode 100644 index 00000000000..8a640e10fc2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/clackbridge_troll.txt @@ -0,0 +1,13 @@ +Name:Clackbridge Troll +ManaCost:3 B B +Types:Creature Troll +PT:8/8 +K:Haste +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TripleGoat | TriggerDescription$ When CARDNAME enters the battlefield, target opponent creates three 0/1 white Goat creature tokens. +SVar:TripleGoat:DB$ Token | TokenAmount$ 3 | TokenScript$ w_0_1_goat | LegacyImage$ w 0 1 goat eld | ValidTgts$ Opponent | TokenOwner$ Targeted +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigTap | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, any opponent may sacrifice a creature. If a player does, tap CARDNAME, you gain 3 life, and you draw a card. +SVar:TrigTap:DB$ Tap | Defined$ Self | SubAbility$ DBDraw | UnlessCost$ Sac<1/Creature> | UnlessPayer$ Player.Opponent | UnlessSwitched$ True | UnlessAI$ LifeLE10 | UnlessResolveSubs$ WhenPaid | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | NumCards$ 1 | Defined$ You +Oracle:Trample, haste\nWhen Clackbridge Troll enters the battlefield, target opponent creates three 0/1 white Goat creature tokens.\nAt the beginning of combat on your turn, any opponent may sacrifice a creature. If a player does, tap Clackbridge Troll, you gain 3 life, and you draw a card. From 9d6aa6b7559f1b8d703a35bb74cdfa62f28e3c90 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 18 Sep 2019 10:58:06 +0200 Subject: [PATCH 33/34] Updated german translation Contributed by twosat at https://www.slightlymagic.net/forum/viewtopic.php?f=26&t=23215#p230047 --- forge-gui/res/languages/de-DE.properties | 184 +++++++++++------------ 1 file changed, 92 insertions(+), 92 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 71643ddb8f7..5142a6a34ce 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -176,11 +176,11 @@ nlEnableMusic=Hintergrundmusik während des Spiels nlAltSoundSystem=Nutze alternatives Sound-System (nur nutzen, wenn es Probleme mit fehlenden Geräuschen gibt) KeyboardShortcuts=Tastenkombinationen # VSubmenuAchievements.java -lblAchievements=Erfolge +lblAchievements=Errungenschaften # VSubmenuDownloaders.java btnDownloadSetPics=Bilder(LQ) Sets herunterladen +btnDownloadPicsHQ=Bilder(HQ Karten herunterladen (Sehr langsam!) btnDownloadPics=Bilder(LQ) Karten herunterladen -btnDownloadPicsHQ=Bilder(HQ) Karten herunterladen (Sehr langsam!) btnDownloadQuestImages=Bilder für Quests herunterladen btnDownloadAchievementImages=Bilder für Erfolge herunterladen btnReportBug=Einen Fehler melden @@ -191,7 +191,7 @@ btnHowToPlay=Wie man spielt btnDownloadPrices=Kartenpreise herunterladen btnLicensing=Lizenzhinweis lblDownloadPics=Lädt ein Standardbild pro Karte. -lblDownloadPicsHQ=Lädt ein Standardbild (HQ) pro Karte. +lblDownloadPicsHQ=Lädt ein HQ-Standardbild pro Karte. lblDownloadSetPics=Lädt alle Bilder pro Karte. Eines für jedes Set, in welchem die Karte auftauchte. lblDownloadQuestImages=Lädt die Bilder für den Quest-Modus. lblDownloadAchievementImages=Lädt die Bilder zu den möglichen Erfolgen. Verschönert die Trophäensammlung. @@ -389,7 +389,7 @@ lblVanguardDesc=Jeder Spieler hat eine eigene spielbeeinflussende \"Avatar\"-Kar lblCommander=Commander lblCommanderDesc=Jeder Spieler hat eine legendäre \"General\"-Karte, welche (fast) jederzeit gespielt werden kann und die Farben des Decks bestimmt. lblOathbreaker=Eidbrecher -lblOathbreakerDesc=Jeder Spieler hat eine Planeswalker-Karte als "Eidbrecher", die jederzeit gewirkt werden kann und die Deckfarben festlegt. Jeder Spieler hat auch einen Signaturzauber, der gewirkt werden kann, wenn sein Eidbrecher auf dem Schlachtfeld ist. +lblOathbreakerDesc=Jeder Spieler hat eine Plainswalker-Karte als seinen "Eidbrecher", welche jederzeit gespielt werdeb kann und die Farben des Decks festlegt. Jeder Spieler hat außerdem noch einnen "Signatur"-Spruch, welcher gespielt werden kann, solange der Eidbrecher im Spiel ist. lblTinyLeaders=Kleine Anführer lblTinyLeadersDesc=Jeder Spieler hat eine legendäre \"General\"-Karte, welche (fast) jederzeit gespielt werden kann und die Farben des Decks bestimmt. Alle Karten haben umgewandelte Manakosten von max. 3. lblBrawl=Brawl @@ -523,12 +523,12 @@ lblQuestDesc2=Erstelle und verbessere dein Deck mit Karten aus deiner wachsenden lblQuestDesc3=Dann wechsle zu Duellen und Herausforderungen um durch Kämpfe weitere Karten zu erhalten. lblBuildaNewDeck=Erstelle ein neues Deck #Decktype.java -lblCustomUserDecks=Benutzererzeugte Decks +lblCustomUserDecks=Selbsterstelles Decks lblConstructedDecks=Konstruierte Decks lblCommanderDecks=Commander Decks lblRandomCommanderDecks=Zufälliges Commander Deck lblRandomCommanderCard-basedDecks=Zufälliges Commander Deck (kartenbasiert) -lblOathbreakerDecks=Eidbrecher-Decks +lblOathbreakerDecks=Oathbreaker-Decks lblTinyLeadersDecks=Kleine-Anführer-Decks lblBrawlDecks=Brawl Decks lblSchemeDecks=Komplott-Decks @@ -785,8 +785,8 @@ lblfromdeck=vom Deck lbltosideboard=zum Sideboard lblfromsideboard=vom Sideboard lblascommander=als Kommandeur -lblasoathbreaker=als Eidbrecher -lblassignaturespell=als Signaturzauber +lblasoathbreaker=als "Eidbrecher" +lblassignaturespell=als "Signatur"-Spruch lblasavatar=als Avatar lblfromschemedeck=vom Komplottdeck lblfromplanardeck=vom Weltendeck @@ -796,7 +796,7 @@ lbltoplanardeck=zum Weltendeck lbltoconspiracydeck=zum Verschwörungsdeck lblMove=Verschieben #VDock.java -lblDock=Symbolleiste +lblDock=Anhängen lblViewDeckList=Zeige Deckliste lblRevertLayout=Layout zurücksetzen lblOpenLayout=Lade Layout @@ -849,8 +849,8 @@ ttbtnRandDeck5=Erzeugt konstuiertes Deck in fünf Farben lblCurrentDeck2=aktuelles Deck lblUntitled=Unbenannt #VPrompt.java -lblPrompt=Meldungen -lblGameSetup=Spielvorbereitung +lblPrompt=Abfrage +lblGameSetup=Spielaufbau #ColumnDef.java lblAIStatus=KI-Status lblCMC=UMK @@ -885,88 +885,88 @@ ttToughness=Widerstand ttType=Typ #HomeScreen.java lblNewGame=Neues Spiel -lblLoadGame=Spiel laden -lblPlayOnline=Online spielen -lblSettings=Spieleinstellungen +lblLoadGame=Lade Spiel +lblPlayOnline=Spiele im Netz +lblSettings=Einstellungen #SettingsPage.java -lblAutomaticBugReports=Automatic Bug Reports -lblBattlefieldTextureFiltering=Battlefield Texture Filtering -lblCompactListItems=Compact List Items -lblCompactTabs=Compact Tabs -lblCardOverlays=Card Overlays -lblDisableCardEffect=Disable Card 'Effect' Images -lblDynamicBackgroundPlanechase=Dynamic Background Planechase -lblGameplayOptions=Gameplay Options -lblGeneralSettings=General Settings -lblHotSeatMode=Hot Seat Mode -lblLandscapeMode=Landscape Mode -lblLater=Later -lblMinimizeScreenLock=Minimize on Screen Lock -lblOrderGraveyard=Order Graveyard -lblRestartForge=Restart Forge -lblRestartForgeDescription=You must restart Forge for this change to take effect. -lblRotateZoomPlanesPhenomena=Rotate Zoom Image of Planes/Phenomena -lblRotateZoomSplit=Rotate Zoom Image of Split Cards -lblShowCardIDOverlays=Show Card ID Overlays -lblShowCardManaCostOverlays=Show Card Mana Cost Overlays -lblShowCardNameOverlays=Show Card Name Overlays -lblShowCardOverlays=Show Card Overlays -lblShowCardPTOverlays=Show Card P/T Overlays -lblShowMatchBackground=Show Match Background -lblVibrateAfterLongPress=Vibrate After Long Press -lblVibrateWhenLosingLife=Vibrate When Losing Life -lblVibrationOptions=Vibration Options -nlAutomaticBugReports=Automatically send bug reports to the developers, without prompting. -nlBattlefieldTextureFiltering=Filter card art on battlefield to make it less pixelated on large screens (restart required, may reduce performance). -nlCompactListItems=Show only a single line of text for cards and decks on all list views by default. -nlCompactTabs=Show smaller tabs on the top of tab page screens (such as this screen). -nlDisableCardEffect=Disable the zoomed image for the 'Effect' cards. -nlDynamicBackgroundPlanechase=Use current plane images as background (Planes Card images must be on the cache/pics/planechase folder). -nlHotSeatMode=When starting a game with 2 human players, use single prompt to control both players. -nlLandscapeMode=Use landscape (horizontal) orientation for app instead of portrait (vertical). -nlMinimizeScreenLock=Minimize Forge when screen is locked (enable if you experience graphic glitches after locking your screen). -nlOrderGraveyard=Determines when to allow to order cards going to graveyard (never/always/only with relevant cards). -nlRotateZoomPlanesPhenomena=Rotates the zoomed image of Plane or Phenomenon cards. -nlRotateZoomSplit=Rotates the zoomed image of split cards. -nlShowCardIDOverlays=Show id overlays for cards, otherwise they're hidden. -nlShowCardManaCostOverlays=Show mana cost overlays for cards, otherwise they're hidden. -nlShowCardNameOverlays=Show name overlays for cards, otherwise they're hidden. -nlShowCardOverlays=Show name, mana cost, p/t, and id overlays for cards, otherwise they're hidden. -nlShowCardPTOverlays=Show power/toughness/loyalty overlays for cards, otherwise they're hidden. -nlShowMatchBackground=Show match background image on battlefield, otherwise background texture shown instead. -nlTheme=Sets the theme that determines how display components are skinned. -nlVibrateAfterLongPress=Enable quick vibration to signify a long press, such as for card zooming. -nlVibrateWhenLosingLife=Enable vibration when your player loses life or takes damage during a game. +lblAutomaticBugReports=Automatischer Fehlerbericht +lblBattlefieldTextureFiltering=Texturenfilter Spielfeld +lblCompactListItems=kompakte Liste +lblCompactTabs=kompakte Tabs +lblCardOverlays=Karten-Overlays +lblDisableCardEffect=Karten-"Effekt"-Anzeige abschalten +lblDynamicBackgroundPlanechase=Weltenjagd dynamischer Hintergrund +lblGameplayOptions=Spiel-Optionen +lblGeneralSettings=allgem. Einstellungen +lblHotSeatMode=Hot-Seat-Modus +lblLandscapeMode=Querformat +lblLater=Später +lblMinimizeScreenLock=Minimiere bei Bildschirmsperre +lblOrderGraveyard=Friedhof-Reihenfolge +lblRestartForge=Neustart +lblRestartForgeDescription=Um die Änderung zu übernehmen mußt du Forge neu starten. +lblRotateZoomPlanesPhenomena=Drehe die Bilder von Welten und Phänomenen +lblRotateZoomSplit=Drehe vergößerte Bilder von geteilten Karten +lblShowCardIDOverlays=Blende die ID der Karten ein +lblShowCardManaCostOverlays=Blende die Manakosten der Karten ein +lblShowCardNameOverlays=Blende den Namen der Karten ein +lblShowCardOverlays=Zeige Karten-Einblendungen an +lblShowCardPTOverlays=Blende Stärke und Widerstand ein +lblShowMatchBackground=Zeige Duell hintergund an +lblVibrateAfterLongPress=Vibieren nach langem Tastendruck +lblVibrateWhenLosingLife=Vibrieren nach Lebenspunktverlust +lblVibrationOptions=Vibrationsoptionen +nlAutomaticBugReports=Sende automatisch einen Fehlerbericht, ohne Bestätigung. +nlBattlefieldTextureFiltering=Nutze den Texturenfilter um Kartenbilder auf großen Anzeigen weniger grob wirken zu lassen (bedingt Neustart). +nlCompactListItems=Zeige in allen Listen für jeder Karte und jedes Deck nur eine Zeile. +nlCompactTabs=Nutz kompaktere Karteikartenreiter (Tabulatoren/Tabs). +nlDisableCardEffect=Schaltet Effekt-Anzeigen für vergrößerte Karten ab. +nlDynamicBackgroundPlanechase=Nutzt das Bild der aktuellen Weltenkarte als Hintergrund (Die Bilder müssen sich im Pfad cache/pics/planechase befinden). +nlHotSeatMode=Bei Start eines Spiels mit zwei menschlichen Spielern nutzen beide die selben Steuerelemente! +nlLandscapeMode=Nutze die horizontale Anzeige statt der vertikalen. +nlMinimizeScreenLock=Minimiere Forge wenn der Sperrbildschirm aktiviert wird. Hilft manchmal bei Grafikproblemen in diesem Zusammenhang. +nlOrderGraveyard=Entscheidet, wann auf die Reihenfolge, in welcher Karten auf den Friedhof wandern, geachtet wird. (Niemals, immer oder nur wenn bestimmte Karten es nötig machen.) +nlRotateZoomPlanesPhenomena=Rotiert die vergrößerte Anzeige von Welten- und Phänomen-Karten. +nlRotateZoomSplit=Rotiert die vergrößerte Anzeige von geteilten Karten. +nlShowCardIDOverlays=Blendet die ID-Nummer über die Karten. +nlShowCardManaCostOverlays=Blendet die Manakosten über die Karten. +nlShowCardNameOverlays=Blendet die Namen über die Karten. +nlShowCardOverlays=Aktiviert die Einblendungen übder den Karten. +nlShowCardPTOverlays=Blendet die Stärke und Widerstand über die Karten. +nlShowMatchBackground=Zeige Bilder im Spielfeldhintergrund. +nlTheme=Wähle ein Thema um die Bildschirmanzeigen anzupassen. +nlVibrateAfterLongPress=Aktiviert Vabration bei langen Druck, z.B. beim Zoomen. +nlVibrateWhenLosingLife=Aktiviert eine Vibration bei jedem Lebenspunktverlust. #MatchScreen.java -lblPlayers=Players -lblLog=Log -lblDev=Dev -lblStack=Stack -lblMustWaitPriority=Must wait for priority... +lblPlayers=Spieler +lblLog=Bericht +lblDev=Entw. +lblStack=Stapel +lblMustWaitPriority=Warte auf Priorität... #FDeckEditor.java -lblImportFromClipboard=Import from Clipboard -lblSaveAs=Save As... -lblNameNewCopyDeck=Enter name for new copy of deck -lblRenameDeck=Rename Deck -lblNewNameDeck=Enter new name for deck -lblDeleteDeck=Delete Deck -lblDelete=Delete -lblConfirmDelete=Are you sure you want to delete -lblNameNewDeck=Enter name for new deck -lblSaveChangesCurrentDeck=Save changes to current deck? -lblAddFavorites=Add to Favorites -lblRemoveFavorites=Remove from Favorites -lblChangePreferredArt=Change Preferred Art -lblSelectPreferredArt=Select preferred art for -lblTo=to +lblImportFromClipboard=Aus Zwischenablage +lblSaveAs=Speichern als... +lblNameNewCopyDeck=Name für das neue Deck +lblRenameDeck=Umbenennen +lblNewNameDeck=Gib eine neuen Namen ein +lblDeleteDeck=Deck löschen +lblDelete=Löschen +lblConfirmDelete=Willst du wirklich löschen +lblNameNewDeck=Gib einen Namen ein +lblSaveChangesCurrentDeck=Änderungen sichern? +lblAddFavorites=Zu den Favoriten hinzufügen +lblRemoveFavorites=Von den Favoriten entfernen +lblChangePreferredArt=Setze bevorzugte Form +lblSelectPreferredArt=Wähle bevorzugte Form für +lblTo=zu lblAvatar=Avatar -lblCards=Cards -lblPlanes=Planes -lblSchemes=Schemes -lblToMainDeck=to Main Deck -lblHowMany=how many? -lblInventory=Inventory -lblCollection=Collection -lblCatalog=Catalog -lblCommanders=Commanders -lblOathbreakers=Oathbreakers \ No newline at end of file +lblCards=Karten +lblPlanes=Welten +lblSchemes=Verschwörungen +lblToMainDeck=zum Haupt-Deck +lblHowMany=wie viel? +lblInventory=Inhaltsverzeichnis +lblCollection=Sammlung +lblCatalog=Katalog +lblCommanders=Komandeure +lblOathbreakers=Eidbrecher From f89cc76a76da15e382a01b9520b2796408a64236 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 18 Sep 2019 17:45:30 +0800 Subject: [PATCH 34/34] Update Once Upon a Time --- forge-gui/res/cardsfolder/upcoming/once_upon_a_time.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/once_upon_a_time.txt b/forge-gui/res/cardsfolder/upcoming/once_upon_a_time.txt index 13c6d4baada..d4a0ca42d5f 100644 --- a/forge-gui/res/cardsfolder/upcoming/once_upon_a_time.txt +++ b/forge-gui/res/cardsfolder/upcoming/once_upon_a_time.txt @@ -1,7 +1,7 @@ Name:Once Upon a Time ManaCost:1 G Types:Instant -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | CheckSVar$ X | SVarCompare$ EQ0 | MayPlay$ True | MayPlayWithoutManaCost$ True | Description$ If this spell is the first spell you've cast this game, you may cast it without paying its mana cost. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ All | CheckSVar$ X | SVarCompare$ EQ0 | MayPlay$ True | MayPlayDontGrantZonePermissions$ True | MayPlayWithoutManaCost$ True | Description$ If this spell is the first spell you've cast this game, you may cast it without paying its mana cost. SVar:X:Count$YouCastThisGame A:SP$ Dig | Cost$ 1 G | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Card.Creature,Card.Land | RestRandomOrder$ True | SpellDescription$ Look at the top five cards of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. Oracle:If this spell is the first spell you've cast this game, you may cast it without paying its mana cost.\nLook at the top five cards of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.