diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 4ff68ec5b22..c6d6279710b 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -863,7 +863,7 @@ public class CardFactoryUtil { //Lands do not have SpellPermanents. if (sourceCard.isLand()) { return (Singletons.getModel().getGame().getZoneOf(sourceCard).is(ZoneType.Hand) || sourceCard.hasKeyword("May be played")) - && PhaseHandler.canCastSorcery(sourceCard.getController()); + && Player.canCastSorcery(sourceCard.getController()); } else { return sourceCard.getSpellPermanent().canPlay(); @@ -1035,7 +1035,7 @@ public class CardFactoryUtil { @Override public boolean canPlay() { - return super.canPlay() && PhaseHandler.canCastSorcery(sourceCard.getController()); + return super.canPlay() && Player.canCastSorcery(sourceCard.getController()); } @Override @@ -1110,7 +1110,7 @@ public class CardFactoryUtil { return true; } - return PhaseHandler.canCastSorcery(sourceCard.getOwner()); + return Player.canCastSorcery(sourceCard.getOwner()); } @Override diff --git a/src/main/java/forge/card/spellability/Spell.java b/src/main/java/forge/card/spellability/Spell.java index a7e6a63bcac..9c47209d49d 100644 --- a/src/main/java/forge/card/spellability/Spell.java +++ b/src/main/java/forge/card/spellability/Spell.java @@ -29,7 +29,6 @@ import forge.card.cost.Cost; import forge.card.cost.CostPayment; import forge.card.staticability.StaticAbility; import forge.error.ErrorViewer; -import forge.game.phase.PhaseHandler; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.util.Expressions; @@ -102,7 +101,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable activator = this.getSourceCard().getController(); } - if (!(card.isInstant() || PhaseHandler.canCastSorcery(activator) || card.hasKeyword("Flash") + if (!(card.isInstant() || Player.canCastSorcery(activator) || card.hasKeyword("Flash") || this.getRestrictions().isInstantSpeed() || activator.hasKeyword("You may cast nonland cards as though they had flash.") || card.hasStartOfKeyword("You may cast CARDNAME as though it had flash."))) { diff --git a/src/main/java/forge/card/spellability/SpellAbilityCondition.java b/src/main/java/forge/card/spellability/SpellAbilityCondition.java index 1dcfdcf1c50..6de7a2a3c08 100644 --- a/src/main/java/forge/card/spellability/SpellAbilityCondition.java +++ b/src/main/java/forge/card/spellability/SpellAbilityCondition.java @@ -27,7 +27,6 @@ import forge.CardLists; import forge.Singletons; import forge.card.abilityfactory.AbilityFactory; import forge.card.cardfactory.CardFactoryUtil; -import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -194,7 +193,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { } } - if (this.isSorcerySpeed() && !PhaseHandler.canCastSorcery(activator)) { + if (this.isSorcerySpeed() && !Player.canCastSorcery(activator)) { return false; } diff --git a/src/main/java/forge/card/spellability/SpellAbilityRestriction.java b/src/main/java/forge/card/spellability/SpellAbilityRestriction.java index 9088734936a..3d0e1e8ecb1 100644 --- a/src/main/java/forge/card/spellability/SpellAbilityRestriction.java +++ b/src/main/java/forge/card/spellability/SpellAbilityRestriction.java @@ -27,7 +27,6 @@ import forge.CardLists; import forge.Singletons; import forge.card.abilityfactory.AbilityFactory; import forge.card.cardfactory.CardFactoryUtil; -import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.zone.Zone; @@ -294,7 +293,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { System.out.println(c.getName() + " Did not have activator set in SpellAbilityRestriction.canPlay()"); } - if (this.isSorcerySpeed() && !PhaseHandler.canCastSorcery(activator)) { + if (this.isSorcerySpeed() && !Player.canCastSorcery(activator)) { return false; } diff --git a/src/main/java/forge/card/spellability/SpellPermanent.java b/src/main/java/forge/card/spellability/SpellPermanent.java index 87afc7ce775..7f400a5bdc0 100644 --- a/src/main/java/forge/card/spellability/SpellPermanent.java +++ b/src/main/java/forge/card/spellability/SpellPermanent.java @@ -39,7 +39,6 @@ import forge.card.replacement.ReplacementEffect; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerType; import forge.control.input.Input; -import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.ComputerAIGeneral; import forge.game.player.ComputerUtil; @@ -311,7 +310,7 @@ public class SpellPermanent extends Spell { // Prevent the computer from summoning Ball Lightning type creatures after attacking if (card.hasStartOfKeyword("You may cast CARDNAME as though it had flash. If") - && !PhaseHandler.couldCastSorcery(card.getController(), this)) { + && !Player.couldCastSorcery(card.getController(), this)) { return false; } diff --git a/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java b/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java index c01e4ecd400..d0cf36b7817 100644 --- a/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java +++ b/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java @@ -24,7 +24,6 @@ import forge.Card; import forge.Singletons; import forge.card.spellability.AbilityMana; import forge.card.spellability.SpellAbility; -import forge.game.phase.PhaseHandler; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -58,7 +57,7 @@ public class StaticAbilityCantBeCast { return false; } - if (params.containsKey("OnlySorcerySpeed") && (activator != null) && PhaseHandler.canCastSorcery(activator)) { + if (params.containsKey("OnlySorcerySpeed") && (activator != null) && Player.canCastSorcery(activator)) { return false; } diff --git a/src/main/java/forge/card/trigger/TriggerSpellAbilityCast.java b/src/main/java/forge/card/trigger/TriggerSpellAbilityCast.java index c4208b68f43..e3d9aecc669 100644 --- a/src/main/java/forge/card/trigger/TriggerSpellAbilityCast.java +++ b/src/main/java/forge/card/trigger/TriggerSpellAbilityCast.java @@ -25,7 +25,6 @@ import forge.Card; import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityStackInstance; -import forge.game.phase.PhaseHandler; import forge.game.player.Player; /** @@ -168,11 +167,11 @@ public class TriggerSpellAbilityCast extends Trigger { if (this.getMapParams().containsKey("SpellSpeed")) { if (this.getMapParams().get("SpellSpeed").equals("NotSorcerySpeed")) { boolean notSorcerySpeed = true; - if (PhaseHandler.couldCastSorcery(this.getHostCard().getController(), spellAbility)) { + if (Player.couldCastSorcery(this.getHostCard().getController(), spellAbility)) { notSorcerySpeed = false; } else if (this.getHostCard().hasKeyword("You may cast CARDNAME as though it had flash. If you cast it any time a " + "sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning" - + " of the next cleanup step.") && !PhaseHandler.couldCastSorcery(this.getHostCard().getController(), spellAbility)) { + + " of the next cleanup step.") && !Player.couldCastSorcery(this.getHostCard().getController(), spellAbility)) { boolean instantmentCast = true; // for these cards the trigger must only fire if using their own ability to cast at instant speed if (this.getHostCard().hasKeyword("Flash") || this.getHostCard().hasKeyword("HIDDEN Flash") diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index 8e5429116a0..53ae02e7d63 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -56,7 +56,7 @@ public class GameState { private final EndOfCombat endOfCombat = new EndOfCombat(); private final Untap untap = new Untap(); private final Upkeep upkeep = new Upkeep(); - private PhaseHandler phaseHandler = new PhaseHandler(); + private final PhaseHandler phaseHandler; private final MagicStack stack; private final StaticEffects staticEffects = new StaticEffects(); private final TriggerHandler triggerHandler = new TriggerHandler(); @@ -85,6 +85,7 @@ public class GameState { roPlayers = Collections.unmodifiableList(players); action = new GameAction(this); stack = new MagicStack(this); + phaseHandler = new PhaseHandler(this); } /** diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 164baf2a5ac..24f3d8ed0dd 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -28,8 +28,8 @@ import forge.CardLists; import forge.CardPredicates; import forge.GameActionUtil; import forge.Singletons; -import forge.card.spellability.SpellAbility; import forge.card.trigger.TriggerType; +import forge.game.GameState; import forge.game.player.Player; import forge.game.player.PlayerType; import forge.game.zone.ZoneType; @@ -83,6 +83,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { /** The need to next phase init. */ private int needToNextPhaseInit = 0; + private final GameState game; + + public PhaseHandler(final GameState game0) + { + game = game0; + } + /** *
* isPlayerTurn.
@@ -176,8 +183,8 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
* a {@link forge.game.player.Player} object.
*/
public final void setPriority(final Player p) {
- if (Singletons.getModel().getGame().getStack() != null) {
- Singletons.getModel().getGame().getStack().chooseOrderOfSimultaneousStackEntryAll();
+ if (game.getStack() != null) {
+ game.getStack().chooseOrderOfSimultaneousStackEntryAll();
}
this.pFirstPriority = p;
@@ -282,7 +289,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
final PhaseType phase = this.getPhase();
final Player turn = this.getPlayerTurn();
this.setSkipPhase(true);
- Singletons.getModel().getGame().getAction().checkStateEffects();
+ game.getAction().checkStateEffects();
if (this.isAutoPassedPhase(turn, phase)) {
this.setAutoPass(false);
@@ -344,14 +351,14 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
if (!this.inCombat()) {
this.setNeedToNextPhase(true);
} else {
- Singletons.getModel().getGame().getCombat().verifyCreaturesInPlay();
+ game.getCombat().verifyCreaturesInPlay();
// no first strikers, skip this step
- if (!Singletons.getModel().getGame().getCombat().assignCombatDamage(true)) {
+ if (!game.getCombat().assignCombatDamage(true)) {
this.setNeedToNextPhase(true);
} else {
Combat.dealAssignedDamage();
- Singletons.getModel().getGame().getAction().checkStateEffects();
+ game.getAction().checkStateEffects();
CombatUtil.showCombat();
}
}
@@ -361,13 +368,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
if (!this.inCombat()) {
this.setNeedToNextPhase(true);
} else {
- Singletons.getModel().getGame().getCombat().verifyCreaturesInPlay();
+ game.getCombat().verifyCreaturesInPlay();
- if (!Singletons.getModel().getGame().getCombat().assignCombatDamage(false)) {
+ if (!game.getCombat().assignCombatDamage(false)) {
this.setNeedToNextPhase(true);
} else {
Combat.dealAssignedDamage();
- Singletons.getModel().getGame().getAction().checkStateEffects();
+ game.getAction().checkStateEffects();
CombatUtil.showCombat();
}
}
@@ -375,8 +382,8 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
case COMBAT_END:
// End Combat always happens
- Singletons.getModel().getGame().getEndOfCombat().executeUntil();
- Singletons.getModel().getGame().getEndOfCombat().executeAt();
+ game.getEndOfCombat().executeUntil();
+ game.getEndOfCombat().executeAt();
CombatUtil.showCombat();
//SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc());
break;
@@ -387,12 +394,12 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
break;
case END_OF_TURN:
- Singletons.getModel().getGame().getEndOfTurn().executeAt();
+ game.getEndOfTurn().executeAt();
break;
case CLEANUP:
// Reset Damage received map
- final List
- * canCastSorcery.
- *
- * couldCastSorcery.
- * for conditions the stack must only have the sa being checked
- *
+ * canCastSorcery.
+ *
+ * couldCastSorcery.
+ * for conditions the stack must only have the sa being checked
+ *