From 31e5b0d4c0adbbf80df6e44f7cdc6594bf6c9179 Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 25 Feb 2014 05:46:33 +0000 Subject: [PATCH] - Experimental: fixed state triggers so they will trigger during the middle of the resolution of a spell or ability. (e.g. Cloudshift an Enchantment creature would fire Tethered Griffin's trigger) --- .../src/main/java/forge/game/GameAction.java | 6 +++--- .../forge/game/trigger/TriggerHandler.java | 20 +++++++++++++++++-- .../res/cardsfolder/b/bronze_bombshell.txt | 2 +- ...rruk_relentless_garruk_the_veil_cursed.txt | 2 +- .../res/cardsfolder/l/lurebound_scarecrow.txt | 2 +- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index be57635d090..23cfd12bb92 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -763,6 +763,9 @@ public class GameAction { game.fireEvent(new GameEventCardStatsChanged(affectedCards)); } + final HashMap runParams = new HashMap(); + game.getTriggerHandler().runTrigger(TriggerType.Always, runParams, false); + } /** @@ -802,9 +805,6 @@ public class GameAction { this.checkStaticAbilities(); - final HashMap runParams = new HashMap(); - game.getTriggerHandler().runTrigger(TriggerType.Always, runParams, false); - for (Player p : game.getPlayers()) { for (Card c : p.getCardsIn(ZoneType.Battlefield)) { if (!c.getController().equals(p)) { // should not be here 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 1bb8b336e12..fb5b3ff42dc 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -155,8 +155,9 @@ public class TriggerHandler { } //runWaitingTrigger(new TriggerWaiting(mode, runParams)); - - if (game.getStack().isFrozen() || holdTrigger) { + if (mode == TriggerType.Always) { + runStateTrigger(runParams); + } else if (game.getStack().isFrozen() || holdTrigger) { waitingTriggers.add(new TriggerWaiting(mode, runParams)); } else { runWaitingTrigger(new TriggerWaiting(mode, runParams)); @@ -164,6 +165,21 @@ public class TriggerHandler { // Tell auto stop to stop } + public final boolean runStateTrigger(Map runParams) { + boolean checkStatics = false; + // only cards in play can run state triggers + List allCards = new ArrayList(game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))); + for (final Card c : allCards) { + for (final Trigger t : c.getTriggers()) { + if (canRunTrigger(t, TriggerType.Always, runParams)) { + this.runSingleTrigger(t, runParams); + checkStatics = true; + } + } + } + return checkStatics; + } + public final boolean runWaitingTriggers() { ArrayList waiting = new ArrayList(waitingTriggers); waitingTriggers.clear(); diff --git a/forge-gui/res/cardsfolder/b/bronze_bombshell.txt b/forge-gui/res/cardsfolder/b/bronze_bombshell.txt index 58811e5a00e..9ef49dea92b 100644 --- a/forge-gui/res/cardsfolder/b/bronze_bombshell.txt +++ b/forge-gui/res/cardsfolder/b/bronze_bombshell.txt @@ -2,7 +2,7 @@ Name:Bronze Bombshell ManaCost:4 Types:Artifact Creature Construct PT:4/1 -T:Mode$ Always | IsPresent$ Card.Self+OwnerDoesntControl | Execute$ TrigSac | TriggerDescription$ When a player other than CARDNAME's owner controls it, that player sacrifices it. If the player does, CARDNAME deals 7 damage to him or her. +T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+OwnerDoesntControl | Execute$ TrigSac | TriggerDescription$ When a player other than CARDNAME's owner controls it, that player sacrifices it. If the player does, CARDNAME deals 7 damage to him or her. SVar:TrigSac:AB$SacrificeAll | Cost$ 0 | Defined$ Self | RememberSacrificed$ True | SubAbility$ DBDmg SVar:DBDmg:DB$DealDamage | Defined$ You | NumDmg$ 7 | CheckSVar$ X | SVarCompare$ GE1 | References$ X SVar:X:Remembered$Amount diff --git a/forge-gui/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt b/forge-gui/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt index 1f830f53778..8a690fd4391 100644 --- a/forge-gui/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt +++ b/forge-gui/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt @@ -2,7 +2,7 @@ Name:Garruk Relentless ManaCost:3 G Types:Planeswalker Garruk Loyalty:3 -T:Mode$ Always | IsPresent$ Card.Self+counters_LE2_LOYALTY | Execute$ TrigTransform | TriggerDescription$ When CARDNAME has two or fewer loyalty counters on him, transform him. +T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_LE2_LOYALTY | Execute$ TrigTransform | TriggerDescription$ When CARDNAME has two or fewer loyalty counters on him, transform him. A:AB$ DealDamage | Cost$ AddCounter<0/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | SubAbility$ DamageThis | Planeswalker$ True | SpellDescription$ CARDNAME deals 3 damage to target creature. That creature deals damage equal to its power to him. A:AB$ Token | Cost$ AddCounter<0/LOYALTY> | TokenAmount$ 1 | TokenName$ Wolf | TokenColors$ Green | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenPower$ 2 | TokenToughness$ 2 | Planeswalker$ True | References$ Y | SpellDescription$ Put a 2/2 green Wolf creature token onto the battlefield. SVar:DamageThis:DB$ DealDamage | Defined$ Self | DamageSource$ Targeted | NumDmg$ Y diff --git a/forge-gui/res/cardsfolder/l/lurebound_scarecrow.txt b/forge-gui/res/cardsfolder/l/lurebound_scarecrow.txt index f9c2ae0f786..d15c99d79f9 100644 --- a/forge-gui/res/cardsfolder/l/lurebound_scarecrow.txt +++ b/forge-gui/res/cardsfolder/l/lurebound_scarecrow.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Scarecrow PT:4/4 K:ETBReplacement:Other:ChooseColor SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a color. | AILogic$ MostProminentComputerControls -T:Mode$ Always | CheckSVar$ X | SVarCompare$ EQ0 | TriggerZones$ Battlefield | Static$ True | Execute$ TrigSacrifice | TriggerDescription$ When you control no permanents of the chosen color, sacrifice CARDNAME. +T:Mode$ Always | CheckSVar$ X | SVarCompare$ EQ0 | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ When you control no permanents of the chosen color, sacrifice CARDNAME. SVar:TrigSacrifice:AB$ Sacrifice | Cost$ 0 SVar:X:Count$Valid Permanent.YouCtrl+ChosenColor SVar:NeedsToPlay:Permanent.nonColorless+YouCtrl