diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 40572eb2d93..2f929466932 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -1185,6 +1185,12 @@ public void onCleanupPhase() { for (Player player : getRegisteredPlayers()) { player.onCleanupPhase(); } + for (final Card c : getCardsIncludePhasingIn(ZoneType.Battlefield)) { + c.onCleanupPhase(getPhaseHandler().getPlayerTurn()); + } + for (final Card card : getCardsInGame()) { + card.resetActivationsPerTurn(); + } } public void addCounterAddedThisTurn(Player putter, CounterType cType, Card card, Integer value) { diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index fb743a13032..2fe099b93c7 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -82,12 +82,6 @@ public GameAction(Game game0) { game = game0; } - public final void resetActivationsPerTurn() { - for (final Card card : game.getCardsInGame()) { - card.resetActivationsPerTurn(); - } - } - public Card changeZone(final Zone zoneFrom, Zone zoneTo, final Card c, Integer position, SpellAbility cause) { return changeZone(zoneFrom, zoneTo, c, position, cause, null); } 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 681782e39ba..6af9ea532e9 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -7271,10 +7271,6 @@ public void onEndOfCombat(final Player active) { } public void onCleanupPhase(final Player turn) { - if (!StaticAbilityNoCleanupDamage.damageNotRemoved(this)) { - setDamage(0); - } - setHasBeenDealtDeathtouchDamage(false); resetExcessDamage(); setRegeneratedThisTurn(0); resetShieldCount(); 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 943411ac261..794bfdf891a 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -374,7 +374,6 @@ public static void checkDeclaredAttacker(final Game game, final Card c, final Co final GameEntity defender = combat.getDefenderByAttacker(c); final List otherAttackers = combat.getAttackers(); - // Run triggers if (triggers) { final Map runParams = AbilityKey.newMap(); runParams.put(AbilityKey.Attacker, c); 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 1f046934248..109d3f08d0b 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -36,6 +36,7 @@ import forge.game.replacement.ReplacementType; import forge.game.spellability.SpellAbility; +import forge.game.staticability.StaticAbilityNoCleanupDamage; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.zone.Zone; @@ -180,8 +181,6 @@ private void advanceToNextPhase() { } playerTurn.incrementTurn(); - game.getAction().resetActivationsPerTurn(); - final int lands = CardLists.count(playerTurn.getLandsInPlay(), CardPredicates.UNTAPPED); playerTurn.setNumPowerSurgeLands(lands); } @@ -395,7 +394,10 @@ private void onPhaseBegin() { // Rule 514.2 // Reset Damage received map for (final Card c : game.getCardsIncludePhasingIn(ZoneType.Battlefield)) { - c.onCleanupPhase(playerTurn); + if (!StaticAbilityNoCleanupDamage.damageNotRemoved(c)) { + c.setDamage(0); + } + c.setHasBeenDealtDeathtouchDamage(false); } game.getEndOfTurn().executeUntil(); 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 771a70059ec..82b91ce630b 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1994,8 +1994,8 @@ public final void createSpeedEffect() { final PlayerZone com = getZone(ZoneType.Command); DetachedCardEffect eff = new DetachedCardEffect(this, "Speed Effect"); String trigger = "Mode$ LifeLost | ValidPlayer$ Opponent | TriggerZones$ Command | ActivationLimit$ 1 | " + - "PlayerTurn$ True | TriggerDescription$ Your speed increases once on each of your turns when an " + - "opponent loses life."; + "PlayerTurn$ True | CheckSVar$ Count$YourSpeed | SVarCompare$ LT4 | " + + "TriggerDescription$ Your speed increases once on each of your turns when an opponent loses life."; String speedUp = "DB$ ChangeSpeed"; Trigger lifeLostTrigger = TriggerHandler.parseTrigger(trigger, eff, true); lifeLostTrigger.setOverridingAbility(AbilityFactory.getAbility(speedUp, eff)); 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 c5a93220546..1ac4c6c930f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java @@ -56,9 +56,6 @@ public TriggerAttackerBlockedByCreature(final Map params, final public final boolean performTest(final Map runParams) { final Object a = runParams.get(AbilityKey.Attacker), b = runParams.get(AbilityKey.Blocker); - if (!(a instanceof Card && b instanceof Card)) { - return false; - } final Card attacker = (Card) a, blocker = (Card) b; diff --git a/forge-gui/res/cardsfolder/b/battle_cry.txt b/forge-gui/res/cardsfolder/b/battle_cry.txt index 95b5b1076e4..f2378b1904a 100644 --- a/forge-gui/res/cardsfolder/b/battle_cry.txt +++ b/forge-gui/res/cardsfolder/b/battle_cry.txt @@ -3,7 +3,7 @@ ManaCost:2 W Types:Instant A:SP$ UntapAll | ValidCards$ Creature.White+YouCtrl | SubAbility$ Battlecry | SpellDescription$ Untap all white creatures you control. Whenever a creature blocks this turn, it gets +0/+1 until end of turn. SVar:Battlecry:DB$ Effect | Triggers$ TrigBlocking -SVar:TrigBlocking:Mode$ AttackerBlocked | Execute$ Pump | TriggerDescription$ Whenever a creature blocks this turn, it gets +0/+1 until end of turn. +SVar:TrigBlocking:Mode$ Blocks | Execute$ Pump | TriggerDescription$ Whenever a creature blocks this turn, it gets +0/+1 until end of turn. SVar:Pump:DB$ Pump | Defined$ TriggeredBlockerLKICopy | NumDef$ 1 AI:RemoveDeck:All Oracle:Untap all white creatures you control.\nWhenever a creature blocks this turn, it gets +0/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/i/ian_malcolm_chaotician.txt b/forge-gui/res/cardsfolder/i/ian_malcolm_chaotician.txt index 570cbeb9fac..12310fcf903 100644 --- a/forge-gui/res/cardsfolder/i/ian_malcolm_chaotician.txt +++ b/forge-gui/res/cardsfolder/i/ian_malcolm_chaotician.txt @@ -4,5 +4,5 @@ Types:Legendary Creature Human Scientist PT:2/2 T:Mode$ Drawn | ValidPlayer$ Player | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever a player draws their second card each turn, that player exiles the top card of their library. SVar:TrigDig:DB$ Dig | Defined$ TriggeredPlayer | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Card | RememberChanged$ True | DestinationZone$ Exile -S:Mode$ Continuous | Affected$ Card.ExiledWithSource+YouDontOwn | MayPlay$ True | MayPlayLimit$ 1 | MayPlayIgnoreType$ True | MayPlayPlayer$ ActivePlayer | EffectZone$ Battlefield | AffectedZone$ Exile | Description$ During each player's turn, that player may cast a spell from among the cards they don't own exiled with CARDNAME and mana of any type can be spent to cast it. +S:Mode$ Continuous | Affected$ Card.ExiledWithSource+!OwnedBy ActivePlayer | MayPlay$ True | MayPlayLimit$ 1 | MayPlayIgnoreType$ True | MayPlayPlayer$ ActivePlayer | EffectZone$ Battlefield | AffectedZone$ Exile | Description$ During each player's turn, that player may cast a spell from among the cards they don't own exiled with CARDNAME and mana of any type can be spent to cast it. Oracle:Whenever a player draws their second card each turn, that player exiles the top card of their library.\nDuring each player's turn, that player may cast a spell from among the cards they don't own exiled with Ian Malcolm, Chaotician, and mana of any type can be spent to cast it. diff --git a/forge-gui/res/cardsfolder/m/mage_hunters_onslaught.txt b/forge-gui/res/cardsfolder/m/mage_hunters_onslaught.txt index 2f758976bd1..611966b31a7 100644 --- a/forge-gui/res/cardsfolder/m/mage_hunters_onslaught.txt +++ b/forge-gui/res/cardsfolder/m/mage_hunters_onslaught.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Sorcery A:SP$ Destroy | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | SubAbility$ DBEffect | SpellDescription$ Destroy target creature or planeswalker. SVar:DBEffect:DB$ Effect | Triggers$ TrigBlocking -SVar:TrigBlocking:Mode$ AttackerBlocked | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature blocks this turn, its controller loses 1 life. +SVar:TrigBlocking:Mode$ Blocks | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature blocks this turn, its controller loses 1 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredBlockerController | LifeAmount$ 1 Oracle:Destroy target creature or planeswalker.\nWhenever a creature blocks this turn, its controller loses 1 life. diff --git a/forge-gui/res/cardsfolder/s/swashbuckler_extraordinaire.txt b/forge-gui/res/cardsfolder/s/swashbuckler_extraordinaire.txt index 95def3f9642..7940eb58594 100644 --- a/forge-gui/res/cardsfolder/s/swashbuckler_extraordinaire.txt +++ b/forge-gui/res/cardsfolder/s/swashbuckler_extraordinaire.txt @@ -6,10 +6,10 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigTreasure:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ You T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, you may sacrifice one or more Treasures. When you do, up to that many target creatures gain double strike until end of turn. SVar:TrigSac:DB$ Sacrifice | Defined$ You | Amount$ X | SacValid$ Treasure | SacMessage$ treasure | Optional$ True | RememberSacrificed$ True | SubAbility$ TrigImmediateTrig -SVar:TrigImmediateTrig:DB$ ImmediateTrigger | Execute$ DBPump | TriggerDescription$ When you do, up to that many target creatures gain double strike until end of turn. -SVar:DBPump:DB$ Pump | ValidTgts$ Creature | KW$ Double Strike | TargetMin$ 0 | TargetMax$ DBSize | SubAbility$ DBCleanup | TgtPrompt$ Select target creatures | StackDescription$ {c:Targeted} gain double strike until end of turn. | SpellDescription$ Up to that many target creatures gain double strike until end of turn. +SVar:TrigImmediateTrig:DB$ ImmediateTrigger | Execute$ DBPump | ConditionDefined$ RememberedLKI | ConditionPresent$ Card | RememberObjects$ RememberedLKI | SubAbility$ DBCleanup | TriggerDescription$ When you do, up to that many target creatures gain double strike until end of turn. +SVar:DBPump:DB$ Pump | ValidTgts$ Creature | KW$ Double Strike | TargetMin$ 0 | TargetMax$ DBSize | TgtPrompt$ Select target creatures | StackDescription$ {c:Targeted} gain double strike until end of turn. | SpellDescription$ Up to that many target creatures gain double strike until end of turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:DBSize:Count$RememberedSize +SVar:DBSize:TriggerRemembered$Amount SVar:X:Count$Valid Treasure.YouCtrl AI:RemoveDeck:All DeckHas:Ability$Token|Sacrifice & Type$Treasure|Artifact