From ff10e33d3e21d72207cb5211dcecf3080dd130b3 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 6 Dec 2021 13:11:35 -0500 Subject: [PATCH 1/3] patient_zero.txt and support --- forge-game/src/main/java/forge/game/card/Card.java | 4 +++- forge-gui/res/cardsfolder/upcoming/patient_zero.txt | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/patient_zero.txt 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 cc9b8b24bbe..9ee9bb5ea5c 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6157,7 +6157,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public void onCleanupPhase(final Player turn) { - setDamage(0); + if (!this.hasKeyword("Damage isn't removed from CARDNAME during cleanup steps.")) { + setDamage(0); + } setHasBeenDealtDeathtouchDamage(false); resetReceivedDamageFromThisTurn(); setRegeneratedThisTurn(0); diff --git a/forge-gui/res/cardsfolder/upcoming/patient_zero.txt b/forge-gui/res/cardsfolder/upcoming/patient_zero.txt new file mode 100644 index 00000000000..122825b2c3c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/patient_zero.txt @@ -0,0 +1,8 @@ +Name:Patient Zero +ManaCost:1 B +Types:Creature Zombie +PT:2/2 +K:Lifelink +S:Mode$ Continuous | Affected$ Creature.OppCtrl | AddHiddenKeyword$ Damage isn't removed from CARDNAME during cleanup steps. | Description$ Damage isn't removed from creatures your opponents control during cleanup steps. +DeckHas:Ability$LifeGain +Oracle:Lifelink\nDamage isn't removed from creatures your opponents control during cleanup steps. From 35162c0c556286fa2872bc2d0e4459f229c3e4c8 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Mon, 6 Dec 2021 20:46:35 +0100 Subject: [PATCH 2/3] RestartGameEffect: fix Mindslaver activation carrying over --- .../src/main/java/forge/game/GameAction.java | 1 - .../game/ability/effects/MustBlockEffect.java | 1 - .../game/ability/effects/RestartGameEffect.java | 14 ++++++++++++++ .../src/main/java/forge/game/phase/Phase.java | 8 ++++++++ .../game/spellability/SpellAbilityRestriction.java | 4 ++-- .../java/forge/game/trigger/TriggerHandler.java | 4 ++++ 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 56a06649083..9e54cc48c58 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1967,7 +1967,6 @@ public class GameAction { } // If pl has Backup Plan as a Conspiracy draw that many extra hands - } // Choose starting hand for each player with multiple hands diff --git a/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java index 15c77fdbec2..0554eeb3d01 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java @@ -69,7 +69,6 @@ public class MustBlockEffect extends SpellAbilityEffect { } } } - } // mustBlockResolve() @Override 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 da7d6c479e5..056de0bd303 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 @@ -11,6 +11,7 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; +import forge.game.phase.Phase; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerHandler; @@ -38,17 +39,26 @@ public class RestartGameEffect extends SpellAbilityEffect { forge.game.trigger.Trigger.resetIDs(); TriggerHandler trigHandler = game.getTriggerHandler(); trigHandler.clearDelayedTrigger(); + trigHandler.clearPlayerDefinedDelayedTrigger(); trigHandler.suppressMode(TriggerType.ChangesZone); // Avoid Psychic Surgery trigger in new game trigHandler.suppressMode(TriggerType.Shuffled); game.getPhaseHandler().resetExtra(); + game.getPhaseHandler().setPlayerDeclaresAttackers(null); + game.getPhaseHandler().setPlayerDeclaresBlockers(null); + game.getUntap().clearCommands(); + game.getUpkeep().clearCommands(); + game.getEndOfCombat().clearCommands(); + game.getEndOfTurn().clearCommands(); + game.getCleanup().clearCommands(); game.getStack().reset(); game.clearCounterAddedThisTurn(); game.resetPlayersAttackedOnNextTurn(); game.resetPlayersAttackedOnNextTurn(); game.setMonarch(null); + game.setDayTime(null); GameAction action = game.getAction(); for (Player p: players) { @@ -57,9 +67,13 @@ public class RestartGameEffect extends SpellAbilityEffect { p.resetSpellCastThisGame(); p.onCleanupPhase(); p.setLandsPlayedLastTurn(0); + p.setSpellsCastLastTurn(0); + p.setLifeLostLastTurn(0); p.resetCommanderStats(); p.resetCompletedDungeons(); p.setBlessing(false); + p.clearController(); + p.setMustAttackEntity(null); CardCollection newLibrary = new CardCollection(p.getCardsIn(restartZones, false)); List filteredCards = null; diff --git a/forge-game/src/main/java/forge/game/phase/Phase.java b/forge-game/src/main/java/forge/game/phase/Phase.java index 3c950a017b9..7580a32b787 100644 --- a/forge-game/src/main/java/forge/game/phase/Phase.java +++ b/forge-game/src/main/java/forge/game/phase/Phase.java @@ -51,6 +51,14 @@ public class Phase implements java.io.Serializable { private final HashMap> untilEndMap = new HashMap<>(); private final HashMap> registerMap = new HashMap<>(); + public void clearCommands() { + at.clear(); + until.clear(); + untilMap.clear(); + untilEndMap.clear(); + registerMap.clear(); + } + /** *

* Add a hardcoded trigger that will execute "at ". 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 ca779eefe7a..11fff550ebc 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -604,7 +604,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { int activationLimit = AbilityUtils.calculateAmount(c, limit, sa); this.setActivationLimit(activationLimit); - if ((this.getActivationLimit() != -1) && (sa.getActivationsThisTurn() >= this.getActivationLimit())) { + if (this.getActivationLimit() != -1 && sa.getActivationsThisTurn() >= this.getActivationLimit()) { return false; } } @@ -614,7 +614,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { int gameActivationLimit = AbilityUtils.calculateAmount(c, limit, sa); this.setGameActivationLimit(gameActivationLimit); - if ((this.getGameActivationLimit() != -1) && (sa.getActivationsThisGame() >= this.getGameActivationLimit())) { + if (this.getGameActivationLimit() != -1 && sa.getActivationsThisGame() >= this.getGameActivationLimit()) { return 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 a1874547600..2244414ccc9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -93,6 +93,10 @@ public class TriggerHandler { playerDefinedDelayedTriggers.put(player, trig); } + public final void clearPlayerDefinedDelayedTrigger() { + playerDefinedDelayedTriggers.clear(); + } + public final void handlePlayerDefinedDelTriggers(final Player player) { delayedTriggers.addAll(playerDefinedDelayedTriggers.removeAll(player)); } From ceeb5f4589f107c1bb1f65a69299547c41536197 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Mon, 6 Dec 2021 22:43:50 +0100 Subject: [PATCH 3/3] Clean up --- .../java/forge/game/ability/effects/RestartGameEffect.java | 1 - .../java/forge/game/ability/effects/SkipPhaseEffect.java | 4 ++-- .../main/java/forge/game/ability/effects/SkipTurnEffect.java | 2 +- .../src/main/java/forge/game/spellability/AbilityStatic.java | 2 +- .../src/main/java/forge/game/spellability/AbilitySub.java | 2 +- .../src/main/java/forge/game/spellability/LandAbility.java | 2 ++ forge-game/src/main/java/forge/game/spellability/Spell.java | 1 - .../java/forge/game/spellability/SpellAbilityCondition.java | 5 +---- .../main/java/forge/game/spellability/SpellPermanent.java | 1 - 9 files changed, 8 insertions(+), 12 deletions(-) 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 056de0bd303..bcc9eb2f059 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 @@ -11,7 +11,6 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; -import forge.game.phase.Phase; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerHandler; diff --git a/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java index 186636874ff..43d6c2b5631 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java @@ -60,7 +60,7 @@ public class SkipPhaseEffect extends SpellAbilityEffect { final String name = hostCard.getName() + "'s Effect"; final String image = hostCard.getImageKey(); final boolean isNextThisTurn = duration != null && duration.equals("NextThisTurn"); - + final Card eff = createEffect(sa, player, name, image); final StringBuilder sb = new StringBuilder(); @@ -89,7 +89,7 @@ public class SkipPhaseEffect extends SpellAbilityEffect { sb.append(" of your next turn."); } } - + final String repeffstr = sb.toString(); ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true); // Set to layer to Control so it will be applied before "would begin your X phase/step" replacement effects diff --git a/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java index 3c71e7f67b4..4f64e1d89d2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java @@ -32,7 +32,7 @@ public class SkipTurnEffect extends SpellAbilityEffect { sb.append("skips his/her next ").append(numTurns).append(" turn(s)."); return sb.toString(); } - + @Override public void resolve(SpellAbility sa) { final Card hostCard = sa.getHostCard(); diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityStatic.java b/forge-game/src/main/java/forge/game/spellability/AbilityStatic.java index 9c769c5e982..726c45ec097 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityStatic.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityStatic.java @@ -60,7 +60,7 @@ public abstract class AbilityStatic extends Ability implements Cloneable { return this.getRestrictions().canPlay(c, this); } - + /** {@inheritDoc} */ @Override public final Object clone() { diff --git a/forge-game/src/main/java/forge/game/spellability/AbilitySub.java b/forge-game/src/main/java/forge/game/spellability/AbilitySub.java index 13aafddb2f3..f858fc15982 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilitySub.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilitySub.java @@ -102,7 +102,7 @@ public final class AbilitySub extends SpellAbility implements java.io.Serializab public void resolve() { effect.resolve(this); } - + /** {@inheritDoc} */ @Override public final Object clone() { diff --git a/forge-game/src/main/java/forge/game/spellability/LandAbility.java b/forge-game/src/main/java/forge/game/spellability/LandAbility.java index 04f2c3e60ce..37dda317c1a 100644 --- a/forge-game/src/main/java/forge/game/spellability/LandAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/LandAbility.java @@ -67,6 +67,7 @@ public class LandAbility extends Ability { return p.canPlayLand(land, false, this); } + @Override public void resolve() { getHostCard().setSplitStateToPlayAbility(this); @@ -81,6 +82,7 @@ public class LandAbility extends Ability { result.setState(CardStateName.Original, true); } } + @Override public String toUnsuppressedString() { StringBuilder sb = new StringBuilder("Play land"); diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index d24e50672e6..ca2615c9c96 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -132,7 +132,6 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable @Override public boolean isAbility() { return false; } - /** * @return the castFaceDown */ diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index 698066c157f..f80cfee20f1 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -230,7 +230,6 @@ public class SpellAbilityCondition extends SpellAbilityVariables { if (params.containsKey("ConditionTargetsSingleTarget")) { this.setTargetsSingleTarget(true); } - } // setConditions /** @@ -390,8 +389,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { int life = 1; if (this.getLifeTotal().equals("OpponentSmallest")) { life = activator.getOpponentsSmallestLifeTotal(); - } - else { + } else { life = AbilityUtils.getDefinedPlayers(host, this.getLifeTotal(), sa).getFirst().getLife(); } @@ -432,7 +430,6 @@ public class SpellAbilityCondition extends SpellAbilityVariables { if (matchTgt == null || matchTgt.getFirstTargetedSpell() == null || matchTgt.getFirstTargetedSpell().getTargets() == null) { return false; - } Set targets = new HashSet<>(); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java b/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java index 4d0a734746a..b9bcf6a7721 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java @@ -57,7 +57,6 @@ public class SpellPermanent extends SpellApiBased { if (this.getPayCosts().getTotalMana().countX() > 0 && StringUtils.isNotBlank(getHostCard().getSVar("X"))) { this.setSVar("X", this.getHostCard().getSVar("X")); } - } // Spell_Permanent() }