diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 0f0af2e3c97..990ab51e3df 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -727,7 +727,6 @@ public class PlayerControllerAi extends PlayerController { @Override public List chooseSaToActivateFromOpeningHand(List usableFromOpeningHand) { - // AI would play everything. But limits to one copy of (Leyline of Singularity) and (Gemstone Caverns) return brains.chooseSaToActivateFromOpeningHand(usableFromOpeningHand); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java index e9a597697c1..5f95d0c4dd8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java @@ -42,7 +42,7 @@ public class ChooseGenericEffect extends SpellAbilityEffect { } final SpellAbility fallback = sa.getAdditionalAbility("FallbackAbility"); final int amount = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("ChoiceAmount", "1"), sa); - + final List tgtPlayers = getDefinedPlayersOrTargeted(sa); for (final Player p : tgtPlayers) { @@ -61,7 +61,7 @@ public class ChooseGenericEffect extends SpellAbilityEffect { } } abilities.removeAll(saToRemove); - + if (sa.usesTargeting() && sa.getTargets().contains(p) && !p.canBeTargetedBy(sa)) { continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java index 8b22962918e..1d1871b7b4c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java @@ -36,9 +36,7 @@ public class DrainManaEffect extends SpellAbilityEffect { } if (sa.hasParam("DrainMana")) { - for (Mana mana : drained) { - sa.getActivatingPlayer().getManaPool().addMana(mana); - } + sa.getActivatingPlayer().getManaPool().add(drained); } if (sa.hasParam("RememberDrainedMana")) { sa.getHostCard().addRemembered(Integer.valueOf(drained.size())); diff --git a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java index d57058e1ac9..b1c98c06a8b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java @@ -20,7 +20,7 @@ public class EncodeEffect extends SpellAbilityEffect { if (sa.getHostCard().isToken()) { return ""; } - + final StringBuilder sb = new StringBuilder(); sb.append(sa.getActivatingPlayer()); diff --git a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java index 89324718c2a..f9e4653dceb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java @@ -171,8 +171,6 @@ public class FlipCoinEffect extends SpellAbilityEffect { } } } - - // AllZone.getTriggerHandler().runTrigger("FlipsACoin",runParams); } /** 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 873392468b8..885646b5b37 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -431,6 +431,7 @@ public class PhaseHandler implements java.io.Serializable { } nUpkeepsThisTurn = 0; + nCombatsThisTurn = 0; nMain2sThisTurn = 0; game.getStack().resetMaxDistinctSources(); @@ -479,10 +480,6 @@ public class PhaseHandler implements java.io.Serializable { } switch (phase) { - case UNTAP: - nCombatsThisTurn = 0; - break; - case UPKEEP: for (Card c : game.getCardsIncludePhasingIn(ZoneType.Battlefield)) { c.getDamageHistory().setNotAttackedSinceLastUpkeepOf(playerTurn); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 6e40b52e377..25a41f579c4 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -330,7 +330,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { } if (this.getFirstCombatOnly()) { - if (game.getPhaseHandler().getNumCombat() > 1) { + if (game.getPhaseHandler().getNumCombat() > (game.getPhaseHandler().inCombat() ? 1 : 0)) { return false; } } diff --git a/forge-gui/res/cardsfolder/a/archangel_of_strife.txt b/forge-gui/res/cardsfolder/a/archangel_of_strife.txt index a9bde07ae90..9abf5789f33 100644 --- a/forge-gui/res/cardsfolder/a/archangel_of_strife.txt +++ b/forge-gui/res/cardsfolder/a/archangel_of_strife.txt @@ -5,11 +5,11 @@ PT:6/6 K:Flying K:ETBReplacement:Other:ChooseEach SVar:ChooseEach:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoice | SubAbility$ DBRemember | ClearRememberedBeforeLoop$ True | SpellDescription$ As CARDNAME enters the battlefield, each player chooses war or peace. Creatures controlled by players who chose war get +3/+0. Creatures controlled by players who chose peace get +0/+3. -SVar:DBChoice:DB$ GenericChoice | Defined$ Player.IsRemembered | Choices$ WarChoice,PeaceChoice +SVar:DBChoice:DB$ GenericChoice | Defined$ Player.IsRemembered | Choices$ WarChoice,PeaceChoice | ShowChoice$ ExceptSelf SVar:WarChoice:DB$ Pump | Defined$ Player.IsRemembered | NoteCards$ Self | NoteCardsFor$ Strife | SpellDescription$ War SVar:PeaceChoice:DB$ Pump | Defined$ Player.IsRemembered | ClearNotedCardsFor$ Strife | SpellDescription$ Peace -SVar:DBRemember:DB$ Pump | RememberObjects$ Player.NotedForStrife +SVar:DBRemember:DB$ Pump | RememberObjects$ Player.NotedForStrife | ImprintCards$ Self S:Mode$ Continuous | AffectedZone$ Battlefield | Affected$ Creature.ControlledBy Remembered | AddPower$ 3 | Description$ Creatures controlled by players who chose war get +3/+0. -S:Mode$ Continuous | AffectedZone$ Battlefield | Affected$ Creature.!ControlledBy Remembered | AddToughness$ 3 | Description$ Creatures controlled by players who chose peace get +0/+3. +S:Mode$ Continuous | AffectedZone$ Battlefield | Affected$ Creature.!ControlledBy Remembered | AddToughness$ 3 | IsPresent$ Card.IsImprinted | Description$ Creatures controlled by players who chose peace get +0/+3. AI:RemoveDeck:Random Oracle:Flying\nAs Archangel of Strife enters the battlefield, each player chooses war or peace.\nCreatures controlled by players who chose war get +3/+0.\nCreatures controlled by players who chose peace get +0/+3. diff --git a/forge-gui/res/cardsfolder/h/hoarders_greed.txt b/forge-gui/res/cardsfolder/h/hoarders_greed.txt index 6797be6a83c..a9d31c44931 100644 --- a/forge-gui/res/cardsfolder/h/hoarders_greed.txt +++ b/forge-gui/res/cardsfolder/h/hoarders_greed.txt @@ -1,10 +1,10 @@ Name:Hoarder's Greed ManaCost:3 B Types:Sorcery -A:SP$ Repeat | Cost$ 3 B | RepeatCheckSVar$ CheckRepeat | RepeatSVarCompare$ GT0 | RepeatSubAbility$ DBLoseLife | SubAbility$ DBReset | StackDescription$ SpellDescription | SpellDescription$ You lose 2 life and draw two cards, then clash with an opponent. If you win, repeat this process. +A:SP$ Repeat | Cost$ 3 B | RepeatCheckSVar$ CheckRepeat | RepeatSVarCompare$ GT0 | RepeatSubAbility$ DBLoseLife | StackDescription$ SpellDescription | SpellDescription$ You lose 2 life and draw two cards, then clash with an opponent. If you win, repeat this process. SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw | SpellDescription$ You lose 2 life and draw two cards, then clash with an opponent. If you win, repeat this process. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 2 | SubAbility$ DBClash -SVar:DBClash:DB$ Clash | LoseSubAbility$ DBStoreSVar +SVar:DBClash:DB$ Clash | WinSubAbility$ DBStoreSVar | OtherwiseSubAbility$ DBReset SVar:DBStoreSVar:DB$ StoreSVar | SVar$ CheckRepeat | Type$ Number | Expression$ 1 SVar:DBReset:DB$ StoreSVar | SVar$ CheckRepeat | Type$ Number | Expression$ 0 SVar:CheckRepeat:Number$0 diff --git a/forge-gui/res/cardsfolder/s/sea_troll.txt b/forge-gui/res/cardsfolder/s/sea_troll.txt index d2c0857494c..cdcfea66e43 100644 --- a/forge-gui/res/cardsfolder/s/sea_troll.txt +++ b/forge-gui/res/cardsfolder/s/sea_troll.txt @@ -2,12 +2,5 @@ Name:Sea Troll ManaCost:2 U Types:Creature Troll PT:2/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.Blue | Execute$ TrigRemember | Static$ True -T:Mode$ AttackerBlocked | ValidCard$ Creature.Blue | ValidBlocker$ Card.Self | Execute$ TrigRemember | Static$ True -SVar:TrigRemember:DB$ StoreSVar | SVar$ CheckActivation | Type$ Number | Expression$ 1 -A:AB$ Regenerate | Cost$ U | CheckSVar$ CheckActivation | SpellDescription$ Regenerate CARDNAME. Activate only if CARDNAME blocked or was blocked by a blue creature this turn. -SVar:CheckSVar:Number$0 -T:Mode$ Phase | Phase$ Cleanup | TriggerZones$ Battlefield | Execute$ DBCleanup | Static$ True -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ DBCleanup | Static$ True -SVar:DBCleanup:DB$ StoreSVar | SVar$ CheckActivation | Type$ Number | Expression$ 0 +A:AB$ Regenerate | Cost$ U | IsPresent$ Card.Self+blockedValidThisTurn Creature.Blue,Card.Self+blockedByValidThisTurn Creature.Blue | SpellDescription$ Regenerate CARDNAME. Activate only if CARDNAME blocked or was blocked by a blue creature this turn. Oracle:{U}: Regenerate Sea Troll. Activate only if Sea Troll blocked or was blocked by a blue creature this turn. diff --git a/forge-gui/res/cardsfolder/s/sirens_ruse.txt b/forge-gui/res/cardsfolder/s/sirens_ruse.txt index 4219db9170d..ad061e509ac 100644 --- a/forge-gui/res/cardsfolder/s/sirens_ruse.txt +++ b/forge-gui/res/cardsfolder/s/sirens_ruse.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Pump | Cost$ 1 U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | RememberObjects$ Targeted | SubAbility$ DBRememberPirate | SpellDescription$ Exile target creature you control, then return that card to the battlefield under its owner's control. If a Pirate was exiled this way, draw a card. | StackDescription$ SpellDescription SVar:DBRememberPirate:DB$ StoreSVar | SVar$ WasPirate | Type$ Number | Expression$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Pirate | ConditionCompare$ EQ1 | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Defined$ ParentTarget | Origin$ Battlefield | Destination$ Exile | ForgetOtherRemembered$ True | RememberChanged$ True | SubAbility$ DBReturn -SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | GainControl$ True | SubAbility$ DBPirateDraw +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBPirateDraw SVar:DBPirateDraw:DB$ Draw | NumCards$ 1 | ConditionCheckSVar$ WasPirate | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBReinitialize SVar:DBReinitialize:DB$ StoreSVar | SVar$ WasPirate | Type$ Number | Expression$ 0 diff --git a/forge-gui/res/cardsfolder/t/tezzeret_betrayer_of_flesh.txt b/forge-gui/res/cardsfolder/t/tezzeret_betrayer_of_flesh.txt index d496969394a..40d666582ff 100644 --- a/forge-gui/res/cardsfolder/t/tezzeret_betrayer_of_flesh.txt +++ b/forge-gui/res/cardsfolder/t/tezzeret_betrayer_of_flesh.txt @@ -2,11 +2,11 @@ Name:Tezzeret, Betrayer of Flesh ManaCost:2 U U Types:Legendary Planeswalker Tezzeret Loyalty:4 -T:Mode$ AbilityCast | ValidActivatingPlayer$ You | ValidCard$ Artifact | Static$ True | CheckSVar$ ArtAct | SVarCompare$ NE1 | Execute$ TrigStore -SVar:TrigStore:DB$ Pump | NoteNumber$ 1 +T:Mode$ AbilityCast | ValidCard$ Artifact | Static$ True | CheckSVar$ ArtAct | SVarCompare$ NE1 | Execute$ TrigStore +SVar:TrigStore:DB$ Pump | Defined$ TriggeredActivator | NoteNumber$ 1 SVar:ArtAct:Count$NotedNumber T:Mode$ TurnBegin | Execute$ TrigReset | Static$ True -SVar:TrigReset:DB$ Pump | NoteNumber$ 0 +SVar:TrigReset:DB$ Pump | Defined$ Player | NoteNumber$ 0 S:Mode$ ReduceCost | ValidCard$ Artifact.YouCtrl | Type$ Ability | Amount$ 2 | CheckSVar$ ArtAct | SVarCompare$ NE1 | OnlyFirstActivation$ True | AffectedZone$ Battlefield | Description$ The first activated ability of an artifact you activate each turn costs {2} less to activate. A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 2 | SpellDescription$ Draw two cards. Then discard two cards unless you discard an artifact card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose | UnlessType$ Artifact diff --git a/forge-gui/res/cardsfolder/upcoming/spiteful_repossession.txt b/forge-gui/res/cardsfolder/upcoming/spiteful_repossession.txt index 39bf758856f..2b7f1e8ad7d 100644 --- a/forge-gui/res/cardsfolder/upcoming/spiteful_repossession.txt +++ b/forge-gui/res/cardsfolder/upcoming/spiteful_repossession.txt @@ -2,12 +2,10 @@ Name:Spiteful Repossession ManaCost:4 R Types:Sorcery A:SP$ RepeatEach | RepeatPlayers$ Opponent | RepeatSubAbility$ DBDamage | DamageMap$ True | SubAbility$ DBTreasure | SpellDescription$ CARDNAME deals damage to each opponent who controls more lands than you equal to the difference. -SVar:DBDamage:DB$ DealDamage | Defined$ Remembered | NumDmg$ Y | ConditionCheckSVar$ Y | SubAbility$ DBTally -SVar:DBTally:DB$ StoreSVar | SVar$ Z | Type$ CountSVar | Expression$ Z/Plus.Y -SVar:DBTreasure:DB$ Token | TokenAmount$ Z | TokenScript$ c_a_treasure_sac | SubAbility$ DBReset | SpellDescription$ Then create a number of Treasure tokens equal to the damage dealt this way. -SVar:DBReset:DB$ StoreSVar | SVar$ Z | Type$ Number | Expression$ 0 +SVar:DBDamage:DB$ DealDamage | Defined$ Remembered | NumDmg$ Y | ConditionCheckSVar$ Y +SVar:DBTreasure:DB$ Token | TokenAmount$ Z | TokenScript$ c_a_treasure_sac | SpellDescription$ Then create a number of Treasure tokens equal to the damage dealt this way. SVar:X:Count$Valid Land.YouCtrl SVar:Y:Count$Valid Land.RememberedPlayerCtrl/Minus.X -SVar:Z:Number$0 +SVar:Z:Count$TotalDamageDoneByThisTurn DeckHas:Ability$Token|Sacrifice & Type$Treasure|Artifact Oracle:Spiteful Repossession deals damage to each opponent who controls more lands than you equal to the difference. Then create a number of Treasure tokens equal to the damage dealt this way. diff --git a/forge-gui/res/cardsfolder/v/vizkopa_confessor.txt b/forge-gui/res/cardsfolder/v/vizkopa_confessor.txt index d3ed19a740a..4055fa90bcb 100644 --- a/forge-gui/res/cardsfolder/v/vizkopa_confessor.txt +++ b/forge-gui/res/cardsfolder/v/vizkopa_confessor.txt @@ -3,12 +3,10 @@ ManaCost:3 W B Types:Creature Human Cleric PT:1/3 K:Extort -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ PayLife | TriggerDescription$ When CARDNAME enters the battlefield, pay any amount of life. Target opponent reveals that many cards from their hand. You choose one of them and exile it. -SVar:PayLife:AB$ StoreSVar | Cost$ PayLife | SVar$ LifePaidOnETB | Type$ Calculate | Expression$ X | SubAbility$ OppRevealX -SVar:OppRevealX:DB$ Reveal | ValidTgts$ Opponent | NumCards$ LifePaidOnETB | RememberRevealed$ True | SubAbility$ PickOne +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ OppRevealX | TriggerDescription$ When CARDNAME enters the battlefield, pay any amount of life. Target opponent reveals that many cards from their hand. You choose one of them and exile it. +SVar:OppRevealX:AB$ Reveal | Cost$ PayLife | ValidTgts$ Opponent | NumCards$ X | RememberRevealed$ True | SubAbility$ PickOne SVar:PickOne:DB$ ChooseCard | Defined$ You | Amount$ 1 | Mandatory$ True | ChoiceTitle$ Choose card to exile | Choices$ Card.IsRemembered | ChoiceZone$ Hand | SubAbility$ MoveChosen SVar:MoveChosen:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | Defined$ ChosenCard | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:LifePaidOnETB:Number$0 SVar:X:Count$xPaid Oracle:Extort (Whenever you cast a spell, you may pay {W/B}. If you do, each opponent loses 1 life and you gain that much life.)\nWhen Vizkopa Confessor enters the battlefield, pay any amount of life. Target opponent reveals that many cards from their hand. You choose one of them and exile it. diff --git a/forge-gui/res/cardsfolder/w/world_at_war.txt b/forge-gui/res/cardsfolder/w/world_at_war.txt index 5938d4e33f0..62b05cfdebe 100644 --- a/forge-gui/res/cardsfolder/w/world_at_war.txt +++ b/forge-gui/res/cardsfolder/w/world_at_war.txt @@ -2,7 +2,7 @@ Name:World at War ManaCost:3 R R Types:Sorcery A:SP$ AddPhase | Cost$ 3 R R | ExtraPhase$ Combat | AfterPhase$ Main2 | FollowedBy$ Main2 | BeforeFirstPostCombatMainEnd$ True | ExtraPhaseDelayedTrigger$ DelTrigUntap | ExtraPhaseDelayedTriggerExcute$ TrigUntapAll | SpellDescription$ After the first postcombat main phase this turn, there's an additional combat phase followed by an additional main phase. At the beginning of that combat, untap all creatures that attacked this turn. -SVar:DelTrigUntap:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerDescription$ At the beginning of that combat, untap all creatures that attacked this turn. +SVar:DelTrigUntap:Mode$ Phase | Phase$ BeginCombat | TriggerDescription$ At the beginning of that combat, untap all creatures that attacked this turn. SVar:TrigUntapAll:DB$ UntapAll | ValidCards$ Creature.attackedThisTurn K:Rebound Oracle:After the first postcombat main phase this turn, there's an additional combat phase followed by an additional main phase. At the beginning of that combat, untap all creatures that attacked this turn.\nRebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.)