diff --git a/.gitattributes b/.gitattributes index c6581d519bd..97b8d2e2f73 100644 --- a/.gitattributes +++ b/.gitattributes @@ -705,6 +705,7 @@ forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java svneol= forge-game/src/main/java/forge/game/trigger/TriggerTaps.java svneol=native#text/plain forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java svneol=native#text/plain forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java -text +forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java -text forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java svneol=native#text/plain forge-game/src/main/java/forge/game/trigger/TriggerType.java -text forge-game/src/main/java/forge/game/trigger/TriggerUnequip.java svneol=native#text/plain @@ -1892,6 +1893,7 @@ forge-gui/res/cardsfolder/a/arbiter_of_knollridge.txt svneol=native#text/plain forge-gui/res/cardsfolder/a/arbiter_of_the_ideal.txt -text forge-gui/res/cardsfolder/a/arbor_colossus.txt -text forge-gui/res/cardsfolder/a/arbor_elf.txt svneol=native#text/plain +forge-gui/res/cardsfolder/a/arboria.txt -text forge-gui/res/cardsfolder/a/arc_blade.txt svneol=native#text/plain forge-gui/res/cardsfolder/a/arc_lightning.txt svneol=native#text/plain forge-gui/res/cardsfolder/a/arc_mage.txt svneol=native#text/plain diff --git a/forge-game/src/main/java/forge/game/ability/effects/CleanUpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CleanUpEffect.java index ac5e50d27da..e5e2f947c52 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CleanUpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CleanUpEffect.java @@ -5,6 +5,7 @@ import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; +import forge.game.player.Player; import forge.game.spellability.SpellAbility; public class CleanUpEffect extends SpellAbilityEffect { @@ -26,6 +27,11 @@ public class CleanUpEffect extends SpellAbilityEffect { source.removeRemembered(card); } } + if (sa.hasParam("ForgetDefinedPlayer")) { + for (final Player player : AbilityUtils.getDefinedPlayers(source, sa.getParam("ForgetDefinedPlayer"), sa)) { + source.removeRemembered(player); + } + } if (sa.hasParam("ClearImprinted")) { source.clearImprintedCards(); game.getCardState(source).clearImprintedCards(); 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 b9325cd5f10..1c9fc903851 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -443,6 +443,10 @@ public class PhaseHandler implements java.io.Serializable { bPreventCombatDamageThisTurn = false; if (!bRepeatCleanup) { setPlayerTurn(handleNextTurn()); + // "Trigger" for begin turn to get around a phase skipping + final HashMap runParams = new HashMap(); + runParams.put("Player", playerTurn); + game.getTriggerHandler().runTrigger(TriggerType.TurnBegin, runParams, false); } planarDiceRolledthisTurn = 0; // Play the End Turn sound 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 ba8bab47f37..0134a6a418e 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1825,6 +1825,10 @@ public class Player extends GameEntity implements Comparable { if (equals(sourceController) || isOpponentOf(sourceController)) { return false; } + } else if (property.equals("Active")) { + if (!equals(game.getPhaseHandler().getPlayerTurn())) { + return false; + } } else if (property.equals("NonActive")) { if (equals(game.getPhaseHandler().getPlayerTurn())) { return false; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java new file mode 100644 index 00000000000..4ef79b5978e --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java @@ -0,0 +1,27 @@ +package forge.game.trigger; + +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +// Turn Begin isn't a "real" trigger, but is useful for Advanced Scripting Techniques +public class TriggerTurnBegin extends Trigger { + public TriggerTurnBegin(final java.util.Map params, final Card host, final boolean intrinsic) { + super(params, host, intrinsic); + } + + @Override + public final boolean performTest(final java.util.Map runParams2) { + if (this.mapParams.containsKey("ValidPlayer")) { + if (!matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), + this.getHostCard())) { + return false; + } + } + return true; + } + + @Override + public final void setTriggeringObjects(final SpellAbility sa) { + sa.setTriggeringObject("Player", this.getRunParams().get("Player")); + } +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 3697c0488f0..5968689c480 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -69,6 +69,7 @@ public enum TriggerType { Taps(TriggerTaps.class), TapsForMana(TriggerTapsForMana.class), Transformed(TriggerTransformed.class), + TurnBegin(TriggerTurnBegin.class), TurnFaceUp(TriggerTurnFaceUp.class), Unequip(TriggerUnequip.class), Untaps(TriggerUntaps.class), diff --git a/forge-gui/res/cardsfolder/a/arboria.txt b/forge-gui/res/cardsfolder/a/arboria.txt new file mode 100644 index 00000000000..978e98d0c0e --- /dev/null +++ b/forge-gui/res/cardsfolder/a/arboria.txt @@ -0,0 +1,13 @@ +Name:Arboria +ManaCost:2 G G +Types:World Enchantment +# Sorry for the double negative. Players can only be attacked if they did "something" on their last turn +S:Mode$ CantAttack | ValidCard$ Creature | Target$ Player.IsNotRemembered | Description$ Creatures can't attack a player unless that player cast a spell or put a nontoken permanent onto the battlefield during his or her last turn. +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Player.Active+IsNotRemembered | Static$ True | Execute$ RememberCaster +SVar:RememberCaster:DB$ Pump | Defined$ TriggeredCardController | RememberObjects$ TriggeredCardController +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.ActivePlayerCtrl+nonToken | Static$ True | Execute$ RememberController +SVar:RememberController:DB$ Pump | Defined$ TriggeredCardController | RememberObjects$ TriggeredCardController +T:Mode$ TurnBegin | ValidPlayer$ Player | Execute$ ClearActivePlayer | Static$ True +SVar:ClearActivePlayer:DB$ Cleanup | ForgetDefinedPlayer$ ActivePlayer +SVar:Picture:http://www.wizards.com/global/images/magic/general/arboria.jpg +Oracle:Creatures can't attack a player unless that player cast a spell or put a nontoken permanent onto the battlefield during his or her last turn.