mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 10:48:00 +00:00
passes GameState to phaseHandler, moved player related static calls to player/Player.java
This commit is contained in:
@@ -863,7 +863,7 @@ public class CardFactoryUtil {
|
|||||||
//Lands do not have SpellPermanents.
|
//Lands do not have SpellPermanents.
|
||||||
if (sourceCard.isLand()) {
|
if (sourceCard.isLand()) {
|
||||||
return (Singletons.getModel().getGame().getZoneOf(sourceCard).is(ZoneType.Hand) || sourceCard.hasKeyword("May be played"))
|
return (Singletons.getModel().getGame().getZoneOf(sourceCard).is(ZoneType.Hand) || sourceCard.hasKeyword("May be played"))
|
||||||
&& PhaseHandler.canCastSorcery(sourceCard.getController());
|
&& Player.canCastSorcery(sourceCard.getController());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return sourceCard.getSpellPermanent().canPlay();
|
return sourceCard.getSpellPermanent().canPlay();
|
||||||
@@ -1035,7 +1035,7 @@ public class CardFactoryUtil {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canPlay() {
|
public boolean canPlay() {
|
||||||
return super.canPlay() && PhaseHandler.canCastSorcery(sourceCard.getController());
|
return super.canPlay() && Player.canCastSorcery(sourceCard.getController());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1110,7 +1110,7 @@ public class CardFactoryUtil {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return PhaseHandler.canCastSorcery(sourceCard.getOwner());
|
return Player.canCastSorcery(sourceCard.getOwner());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import forge.card.cost.Cost;
|
|||||||
import forge.card.cost.CostPayment;
|
import forge.card.cost.CostPayment;
|
||||||
import forge.card.staticability.StaticAbility;
|
import forge.card.staticability.StaticAbility;
|
||||||
import forge.error.ErrorViewer;
|
import forge.error.ErrorViewer;
|
||||||
import forge.game.phase.PhaseHandler;
|
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
import forge.util.Expressions;
|
import forge.util.Expressions;
|
||||||
@@ -102,7 +101,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable
|
|||||||
activator = this.getSourceCard().getController();
|
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()
|
|| this.getRestrictions().isInstantSpeed()
|
||||||
|| activator.hasKeyword("You may cast nonland cards as though they had flash.")
|
|| activator.hasKeyword("You may cast nonland cards as though they had flash.")
|
||||||
|| card.hasStartOfKeyword("You may cast CARDNAME as though it had flash."))) {
|
|| card.hasStartOfKeyword("You may cast CARDNAME as though it had flash."))) {
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import forge.CardLists;
|
|||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.card.abilityfactory.AbilityFactory;
|
import forge.card.abilityfactory.AbilityFactory;
|
||||||
import forge.card.cardfactory.CardFactoryUtil;
|
import forge.card.cardfactory.CardFactoryUtil;
|
||||||
import forge.game.phase.PhaseHandler;
|
|
||||||
import forge.game.phase.PhaseType;
|
import forge.game.phase.PhaseType;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.ZoneType;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import forge.CardLists;
|
|||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.card.abilityfactory.AbilityFactory;
|
import forge.card.abilityfactory.AbilityFactory;
|
||||||
import forge.card.cardfactory.CardFactoryUtil;
|
import forge.card.cardfactory.CardFactoryUtil;
|
||||||
import forge.game.phase.PhaseHandler;
|
|
||||||
import forge.game.phase.PhaseType;
|
import forge.game.phase.PhaseType;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.Zone;
|
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()");
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ import forge.card.replacement.ReplacementEffect;
|
|||||||
import forge.card.trigger.Trigger;
|
import forge.card.trigger.Trigger;
|
||||||
import forge.card.trigger.TriggerType;
|
import forge.card.trigger.TriggerType;
|
||||||
import forge.control.input.Input;
|
import forge.control.input.Input;
|
||||||
import forge.game.phase.PhaseHandler;
|
|
||||||
import forge.game.phase.PhaseType;
|
import forge.game.phase.PhaseType;
|
||||||
import forge.game.player.ComputerAIGeneral;
|
import forge.game.player.ComputerAIGeneral;
|
||||||
import forge.game.player.ComputerUtil;
|
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
|
// Prevent the computer from summoning Ball Lightning type creatures after attacking
|
||||||
if (card.hasStartOfKeyword("You may cast CARDNAME as though it had flash. If")
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import forge.Card;
|
|||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.card.spellability.AbilityMana;
|
import forge.card.spellability.AbilityMana;
|
||||||
import forge.card.spellability.SpellAbility;
|
import forge.card.spellability.SpellAbility;
|
||||||
import forge.game.phase.PhaseHandler;
|
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
|
||||||
@@ -58,7 +57,7 @@ public class StaticAbilityCantBeCast {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.containsKey("OnlySorcerySpeed") && (activator != null) && PhaseHandler.canCastSorcery(activator)) {
|
if (params.containsKey("OnlySorcerySpeed") && (activator != null) && Player.canCastSorcery(activator)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import forge.Card;
|
|||||||
import forge.card.cost.Cost;
|
import forge.card.cost.Cost;
|
||||||
import forge.card.spellability.SpellAbility;
|
import forge.card.spellability.SpellAbility;
|
||||||
import forge.card.spellability.SpellAbilityStackInstance;
|
import forge.card.spellability.SpellAbilityStackInstance;
|
||||||
import forge.game.phase.PhaseHandler;
|
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -168,11 +167,11 @@ public class TriggerSpellAbilityCast extends Trigger {
|
|||||||
if (this.getMapParams().containsKey("SpellSpeed")) {
|
if (this.getMapParams().containsKey("SpellSpeed")) {
|
||||||
if (this.getMapParams().get("SpellSpeed").equals("NotSorcerySpeed")) {
|
if (this.getMapParams().get("SpellSpeed").equals("NotSorcerySpeed")) {
|
||||||
boolean notSorcerySpeed = true;
|
boolean notSorcerySpeed = true;
|
||||||
if (PhaseHandler.couldCastSorcery(this.getHostCard().getController(), spellAbility)) {
|
if (Player.couldCastSorcery(this.getHostCard().getController(), spellAbility)) {
|
||||||
notSorcerySpeed = false;
|
notSorcerySpeed = false;
|
||||||
} else if (this.getHostCard().hasKeyword("You may cast CARDNAME as though it had flash. If you cast it any time a "
|
} 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"
|
+ "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;
|
boolean instantmentCast = true;
|
||||||
// for these cards the trigger must only fire if using their own ability to cast at instant speed
|
// 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")
|
if (this.getHostCard().hasKeyword("Flash") || this.getHostCard().hasKeyword("HIDDEN Flash")
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public class GameState {
|
|||||||
private final EndOfCombat endOfCombat = new EndOfCombat();
|
private final EndOfCombat endOfCombat = new EndOfCombat();
|
||||||
private final Untap untap = new Untap();
|
private final Untap untap = new Untap();
|
||||||
private final Upkeep upkeep = new Upkeep();
|
private final Upkeep upkeep = new Upkeep();
|
||||||
private PhaseHandler phaseHandler = new PhaseHandler();
|
private final PhaseHandler phaseHandler;
|
||||||
private final MagicStack stack;
|
private final MagicStack stack;
|
||||||
private final StaticEffects staticEffects = new StaticEffects();
|
private final StaticEffects staticEffects = new StaticEffects();
|
||||||
private final TriggerHandler triggerHandler = new TriggerHandler();
|
private final TriggerHandler triggerHandler = new TriggerHandler();
|
||||||
@@ -85,6 +85,7 @@ public class GameState {
|
|||||||
roPlayers = Collections.unmodifiableList(players);
|
roPlayers = Collections.unmodifiableList(players);
|
||||||
action = new GameAction(this);
|
action = new GameAction(this);
|
||||||
stack = new MagicStack(this);
|
stack = new MagicStack(this);
|
||||||
|
phaseHandler = new PhaseHandler(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ import forge.CardLists;
|
|||||||
import forge.CardPredicates;
|
import forge.CardPredicates;
|
||||||
import forge.GameActionUtil;
|
import forge.GameActionUtil;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.card.spellability.SpellAbility;
|
|
||||||
import forge.card.trigger.TriggerType;
|
import forge.card.trigger.TriggerType;
|
||||||
|
import forge.game.GameState;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.player.PlayerType;
|
import forge.game.player.PlayerType;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
@@ -83,6 +83,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
/** The need to next phase init. */
|
/** The need to next phase init. */
|
||||||
private int needToNextPhaseInit = 0;
|
private int needToNextPhaseInit = 0;
|
||||||
|
|
||||||
|
private final GameState game;
|
||||||
|
|
||||||
|
public PhaseHandler(final GameState game0)
|
||||||
|
{
|
||||||
|
game = game0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* isPlayerTurn.
|
* isPlayerTurn.
|
||||||
@@ -176,8 +183,8 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
* a {@link forge.game.player.Player} object.
|
* a {@link forge.game.player.Player} object.
|
||||||
*/
|
*/
|
||||||
public final void setPriority(final Player p) {
|
public final void setPriority(final Player p) {
|
||||||
if (Singletons.getModel().getGame().getStack() != null) {
|
if (game.getStack() != null) {
|
||||||
Singletons.getModel().getGame().getStack().chooseOrderOfSimultaneousStackEntryAll();
|
game.getStack().chooseOrderOfSimultaneousStackEntryAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.pFirstPriority = p;
|
this.pFirstPriority = p;
|
||||||
@@ -282,7 +289,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
final PhaseType phase = this.getPhase();
|
final PhaseType phase = this.getPhase();
|
||||||
final Player turn = this.getPlayerTurn();
|
final Player turn = this.getPlayerTurn();
|
||||||
this.setSkipPhase(true);
|
this.setSkipPhase(true);
|
||||||
Singletons.getModel().getGame().getAction().checkStateEffects();
|
game.getAction().checkStateEffects();
|
||||||
|
|
||||||
if (this.isAutoPassedPhase(turn, phase)) {
|
if (this.isAutoPassedPhase(turn, phase)) {
|
||||||
this.setAutoPass(false);
|
this.setAutoPass(false);
|
||||||
@@ -344,14 +351,14 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
if (!this.inCombat()) {
|
if (!this.inCombat()) {
|
||||||
this.setNeedToNextPhase(true);
|
this.setNeedToNextPhase(true);
|
||||||
} else {
|
} else {
|
||||||
Singletons.getModel().getGame().getCombat().verifyCreaturesInPlay();
|
game.getCombat().verifyCreaturesInPlay();
|
||||||
|
|
||||||
// no first strikers, skip this step
|
// no first strikers, skip this step
|
||||||
if (!Singletons.getModel().getGame().getCombat().assignCombatDamage(true)) {
|
if (!game.getCombat().assignCombatDamage(true)) {
|
||||||
this.setNeedToNextPhase(true);
|
this.setNeedToNextPhase(true);
|
||||||
} else {
|
} else {
|
||||||
Combat.dealAssignedDamage();
|
Combat.dealAssignedDamage();
|
||||||
Singletons.getModel().getGame().getAction().checkStateEffects();
|
game.getAction().checkStateEffects();
|
||||||
CombatUtil.showCombat();
|
CombatUtil.showCombat();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -361,13 +368,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
if (!this.inCombat()) {
|
if (!this.inCombat()) {
|
||||||
this.setNeedToNextPhase(true);
|
this.setNeedToNextPhase(true);
|
||||||
} else {
|
} else {
|
||||||
Singletons.getModel().getGame().getCombat().verifyCreaturesInPlay();
|
game.getCombat().verifyCreaturesInPlay();
|
||||||
|
|
||||||
if (!Singletons.getModel().getGame().getCombat().assignCombatDamage(false)) {
|
if (!game.getCombat().assignCombatDamage(false)) {
|
||||||
this.setNeedToNextPhase(true);
|
this.setNeedToNextPhase(true);
|
||||||
} else {
|
} else {
|
||||||
Combat.dealAssignedDamage();
|
Combat.dealAssignedDamage();
|
||||||
Singletons.getModel().getGame().getAction().checkStateEffects();
|
game.getAction().checkStateEffects();
|
||||||
CombatUtil.showCombat();
|
CombatUtil.showCombat();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -375,8 +382,8 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
|
|
||||||
case COMBAT_END:
|
case COMBAT_END:
|
||||||
// End Combat always happens
|
// End Combat always happens
|
||||||
Singletons.getModel().getGame().getEndOfCombat().executeUntil();
|
game.getEndOfCombat().executeUntil();
|
||||||
Singletons.getModel().getGame().getEndOfCombat().executeAt();
|
game.getEndOfCombat().executeAt();
|
||||||
CombatUtil.showCombat();
|
CombatUtil.showCombat();
|
||||||
//SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc());
|
//SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc());
|
||||||
break;
|
break;
|
||||||
@@ -387,12 +394,12 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case END_OF_TURN:
|
case END_OF_TURN:
|
||||||
Singletons.getModel().getGame().getEndOfTurn().executeAt();
|
game.getEndOfTurn().executeAt();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CLEANUP:
|
case CLEANUP:
|
||||||
// Reset Damage received map
|
// Reset Damage received map
|
||||||
final List<Card> list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield);
|
final List<Card> list = game.getCardsIn(ZoneType.Battlefield);
|
||||||
for (final Card c : list) {
|
for (final Card c : list) {
|
||||||
c.resetPreventNextDamage();
|
c.resetPreventNextDamage();
|
||||||
c.resetReceivedDamageFromThisTurn();
|
c.resetReceivedDamageFromThisTurn();
|
||||||
@@ -409,9 +416,9 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
c.clearBlockedThisTurn();
|
c.clearBlockedThisTurn();
|
||||||
}
|
}
|
||||||
|
|
||||||
Singletons.getModel().getGame().getEndOfTurn().executeUntil();
|
game.getEndOfTurn().executeUntil();
|
||||||
|
|
||||||
for (Player player : Singletons.getModel().getGame().getPlayers()) {
|
for (Player player : game.getPlayers()) {
|
||||||
for (Card c : player.getCardsIn(ZoneType.Hand))
|
for (Card c : player.getCardsIn(ZoneType.Hand))
|
||||||
c.setDrawnThisTurn(false);
|
c.setDrawnThisTurn(false);
|
||||||
|
|
||||||
@@ -423,7 +430,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
player.resetAttackersDeclaredThisTurn();
|
player.resetAttackersDeclaredThisTurn();
|
||||||
}
|
}
|
||||||
this.getPlayerTurn().removeKeyword("Skip all combat phases of this turn.");
|
this.getPlayerTurn().removeKeyword("Skip all combat phases of this turn.");
|
||||||
Singletons.getModel().getGame().getCleanup().executeUntilTurn(this.getNextTurn());
|
game.getCleanup().executeUntilTurn(this.getNextTurn());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -435,12 +442,12 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
final HashMap<String, Object> runParams = new HashMap<String, Object>();
|
final HashMap<String, Object> runParams = new HashMap<String, Object>();
|
||||||
runParams.put("Phase", phase.Name);
|
runParams.put("Phase", phase.Name);
|
||||||
runParams.put("Player", turn);
|
runParams.put("Player", turn);
|
||||||
Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.Phase, runParams);
|
game.getTriggerHandler().runTrigger(TriggerType.Phase, runParams);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// This line fixes Combat Damage triggers not going off when they should
|
// This line fixes Combat Damage triggers not going off when they should
|
||||||
Singletons.getModel().getGame().getStack().unfreezeStack();
|
game.getStack().unfreezeStack();
|
||||||
|
|
||||||
// UNTAP
|
// UNTAP
|
||||||
if (phase != PhaseType.UNTAP) {
|
if (phase != PhaseType.UNTAP) {
|
||||||
@@ -467,13 +474,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
this.needToNextPhase = false;
|
this.needToNextPhase = false;
|
||||||
|
|
||||||
// If the Stack isn't empty why is nextPhase being called?
|
// If the Stack isn't empty why is nextPhase being called?
|
||||||
if (Singletons.getModel().getGame().getStack().size() != 0) {
|
if (game.getStack().size() != 0) {
|
||||||
Log.debug("Phase.nextPhase() is called, but Stack isn't empty.");
|
Log.debug("Phase.nextPhase() is called, but Stack isn't empty.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.bPhaseEffects = true;
|
this.bPhaseEffects = true;
|
||||||
if (!Singletons.getModel().getGame().isCardInPlay("Upwelling")) {
|
if (!game.isCardInPlay("Upwelling")) {
|
||||||
for (Player p : Singletons.getModel().getGame().getPlayers()) {
|
for (Player p : game.getPlayers()) {
|
||||||
int burn = p.getManaPool().clearPool();
|
int burn = p.getManaPool().clearPool();
|
||||||
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MANABURN)) {
|
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MANABURN)) {
|
||||||
p.loseLife(burn, null);
|
p.loseLife(burn, null);
|
||||||
@@ -482,7 +489,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.getPhase() == PhaseType.COMBAT_DECLARE_ATTACKERS) {
|
if (this.getPhase() == PhaseType.COMBAT_DECLARE_ATTACKERS) {
|
||||||
Singletons.getModel().getGame().getStack().unfreezeStack();
|
game.getStack().unfreezeStack();
|
||||||
this.nCombatsThisTurn++;
|
this.nCombatsThisTurn++;
|
||||||
} else if (this.getPhase() == PhaseType.UNTAP) {
|
} else if (this.getPhase() == PhaseType.UNTAP) {
|
||||||
this.nCombatsThisTurn = 0;
|
this.nCombatsThisTurn = 0;
|
||||||
@@ -490,7 +497,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
|
|
||||||
if (this.getPhase() == PhaseType.COMBAT_END) {
|
if (this.getPhase() == PhaseType.COMBAT_END) {
|
||||||
//SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc());
|
//SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc());
|
||||||
Singletons.getModel().getGame().getCombat().reset();
|
game.getCombat().reset();
|
||||||
this.resetAttackedThisCombat(this.getPlayerTurn());
|
this.resetAttackedThisCombat(this.getPlayerTurn());
|
||||||
this.bCombat = false;
|
this.bCombat = false;
|
||||||
}
|
}
|
||||||
@@ -503,7 +510,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.is(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
|
if (this.is(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
|
||||||
Singletons.getModel().getGame().getStack().unfreezeStack();
|
game.getStack().unfreezeStack();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.is(PhaseType.COMBAT_END) && (this.extraCombats > 0)) {
|
if (this.is(PhaseType.COMBAT_END) && (this.extraCombats > 0)) {
|
||||||
@@ -516,9 +523,9 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
|
|
||||||
this.bCombat = true;
|
this.bCombat = true;
|
||||||
this.extraCombats--;
|
this.extraCombats--;
|
||||||
Singletons.getModel().getGame().getCombat().reset();
|
game.getCombat().reset();
|
||||||
Singletons.getModel().getGame().getCombat().setAttackingPlayer(player);
|
game.getCombat().setAttackingPlayer(player);
|
||||||
Singletons.getModel().getGame().getCombat().setDefendingPlayer(opp);
|
game.getCombat().setDefendingPlayer(opp);
|
||||||
this.phaseIndex = PhaseType.COMBAT_DECLARE_ATTACKERS.Index;
|
this.phaseIndex = PhaseType.COMBAT_DECLARE_ATTACKERS.Index;
|
||||||
} else {
|
} else {
|
||||||
if (!this.bRepeat) { // for when Cleanup needs to repeat itself
|
if (!this.bRepeat) { // for when Cleanup needs to repeat itself
|
||||||
@@ -529,13 +536,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Singletons.getModel().getGame().getGameLog().add("Phase", this.getPlayerTurn() + " " + this.getPhase().Name, 6);
|
game.getGameLog().add("Phase", this.getPlayerTurn() + " " + this.getPhase().Name, 6);
|
||||||
|
|
||||||
// **** Anything BELOW Here is actually in the next phase. Maybe move
|
// **** Anything BELOW Here is actually in the next phase. Maybe move
|
||||||
// this to handleBeginPhase
|
// this to handleBeginPhase
|
||||||
if (this.getPhase() == PhaseType.UNTAP) {
|
if (this.getPhase() == PhaseType.UNTAP) {
|
||||||
this.turn++;
|
this.turn++;
|
||||||
Singletons.getModel().getGame().getGameLog().add("Turn", "Turn " + this.turn + " (" + this.getPlayerTurn() + ")", 0);
|
game.getGameLog().add("Turn", "Turn " + this.turn + " (" + this.getPlayerTurn() + ")", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
PhaseUtil.visuallyActivatePhase(this.getPhase());
|
PhaseUtil.visuallyActivatePhase(this.getPhase());
|
||||||
@@ -559,15 +566,15 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
*/
|
*/
|
||||||
private Player handleNextTurn() {
|
private Player handleNextTurn() {
|
||||||
|
|
||||||
Singletons.getModel().getGame().getStack().setCardsCastLastTurn();
|
game.getStack().setCardsCastLastTurn();
|
||||||
Singletons.getModel().getGame().getStack().clearCardsCastThisTurn();
|
game.getStack().clearCardsCastThisTurn();
|
||||||
|
|
||||||
for (final Player p1 : Singletons.getModel().getGame().getPlayers()) {
|
for (final Player p1 : game.getPlayers()) {
|
||||||
for (final ZoneType z : Player.ALL_ZONES) {
|
for (final ZoneType z : Player.ALL_ZONES) {
|
||||||
p1.getZone(z).resetCardsAddedThisTurn();
|
p1.getZone(z).resetCardsAddedThisTurn();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for( Player p : Singletons.getModel().getGame().getPlayers() )
|
for( Player p : game.getPlayers() )
|
||||||
{
|
{
|
||||||
p.resetProwl();
|
p.resetProwl();
|
||||||
p.setLifeLostThisTurn(0);
|
p.setLifeLostThisTurn(0);
|
||||||
@@ -826,20 +833,20 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
// pass the priority to other player
|
// pass the priority to other player
|
||||||
this.setPriorityPlayer(actingPlayer.getOpponent());
|
this.setPriorityPlayer(actingPlayer.getOpponent());
|
||||||
Singletons.getModel().getMatch().getInput().resetInput();
|
Singletons.getModel().getMatch().getInput().resetInput();
|
||||||
Singletons.getModel().getGame().getStack().chooseOrderOfSimultaneousStackEntryAll();
|
game.getStack().chooseOrderOfSimultaneousStackEntryAll();
|
||||||
} else {
|
} else {
|
||||||
if (Singletons.getModel().getGame().getStack().size() == 0) {
|
if (game.getStack().size() == 0) {
|
||||||
// end phase
|
// end phase
|
||||||
this.needToNextPhase = true;
|
this.needToNextPhase = true;
|
||||||
this.pPlayerPriority = this.getPlayerTurn(); // this needs to be
|
this.pPlayerPriority = this.getPlayerTurn(); // this needs to be
|
||||||
// set early
|
// set early
|
||||||
// as we exit the phase
|
// as we exit the phase
|
||||||
} else {
|
} else {
|
||||||
if (!Singletons.getModel().getGame().getStack().hasSimultaneousStackEntries()) {
|
if (!game.getStack().hasSimultaneousStackEntries()) {
|
||||||
Singletons.getModel().getGame().getStack().resolveStack();
|
game.getStack().resolveStack();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Singletons.getModel().getGame().getStack().chooseOrderOfSimultaneousStackEntryAll();
|
game.getStack().chooseOrderOfSimultaneousStackEntryAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -910,50 +917,6 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* canCastSorcery.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param player
|
|
||||||
* a {@link forge.game.player.Player} object.
|
|
||||||
* @return a boolean.
|
|
||||||
*/
|
|
||||||
public static boolean canCastSorcery(final Player player) {
|
|
||||||
PhaseHandler now = Singletons.getModel().getGame().getPhaseHandler();
|
|
||||||
return now.isPlayerTurn(player) && now.getPhase().isMain() && Singletons.getModel().getGame().getStack().size() == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* couldCastSorcery.
|
|
||||||
* for conditions the stack must only have the sa being checked
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param player
|
|
||||||
* a {@link forge.game.player.Player} object.
|
|
||||||
* @param sa
|
|
||||||
* a {@link forge.game.player.SpellAbility} object.
|
|
||||||
* @return a boolean .
|
|
||||||
*/
|
|
||||||
public static boolean couldCastSorcery(final Player player, final SpellAbility sa) {
|
|
||||||
PhaseHandler now = Singletons.getModel().getGame().getPhaseHandler();
|
|
||||||
final Card source = sa.getRootSpellAbility().getSourceCard();
|
|
||||||
boolean onlyThis = true;
|
|
||||||
if (Singletons.getModel().getGame().getStack().size() != 0) {
|
|
||||||
for (final Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Stack)) {
|
|
||||||
if (card != source) {
|
|
||||||
onlyThis = false;
|
|
||||||
//System.out.println("StackCard: " + card + " vs SourceCard: " + source);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//System.out.println("now.isPlayerTurn(player) - " + now.isPlayerTurn(player));
|
|
||||||
//System.out.println("now.getPhase().isMain() - " + now.getPhase().isMain());
|
|
||||||
//System.out.println("onlyThis - " + onlyThis);
|
|
||||||
return now.isPlayerTurn(player) && now.getPhase().isMain() && onlyThis;
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is a hack for the setup game state mode, do not use outside of
|
// this is a hack for the setup game state mode, do not use outside of
|
||||||
// devSetupGameState code
|
// devSetupGameState code
|
||||||
// as it avoids calling any of the phase effects that may be necessary in a
|
// as it avoids calling any of the phase effects that may be necessary in a
|
||||||
|
|||||||
@@ -1824,7 +1824,7 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
|
|||||||
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.DEV_UNLIMITED_LAND)
|
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.DEV_UNLIMITED_LAND)
|
||||||
&& this.isHuman()
|
&& this.isHuman()
|
||||||
&& Preferences.DEV_MODE) {
|
&& Preferences.DEV_MODE) {
|
||||||
return PhaseHandler.canCastSorcery(this);
|
return Player.canCastSorcery(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CantBeCast static abilities
|
// CantBeCast static abilities
|
||||||
@@ -1838,7 +1838,7 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return PhaseHandler.canCastSorcery(this)
|
return Player.canCastSorcery(this)
|
||||||
&& ((this.numLandsPlayed < this.maxLandsToPlay) || (this.getCardsIn(ZoneType.Battlefield, "Fastbond")
|
&& ((this.numLandsPlayed < this.maxLandsToPlay) || (this.getCardsIn(ZoneType.Battlefield, "Fastbond")
|
||||||
.size() > 0));
|
.size() > 0));
|
||||||
}
|
}
|
||||||
@@ -2779,5 +2779,49 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
|
|||||||
// ... no worries about size =
|
// ... no worries about size =
|
||||||
// 0
|
// 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* canCastSorcery.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param player
|
||||||
|
* a {@link forge.game.player.Player} object.
|
||||||
|
* @return a boolean.
|
||||||
|
*/
|
||||||
|
public static boolean canCastSorcery(final Player player) {
|
||||||
|
PhaseHandler now = Singletons.getModel().getGame().getPhaseHandler();
|
||||||
|
return now.isPlayerTurn(player) && now.getPhase().isMain() && Singletons.getModel().getGame().getStack().size() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* couldCastSorcery.
|
||||||
|
* for conditions the stack must only have the sa being checked
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param player
|
||||||
|
* a {@link forge.game.player.Player} object.
|
||||||
|
* @param sa
|
||||||
|
* a {@link forge.game.player.SpellAbility} object.
|
||||||
|
* @return a boolean .
|
||||||
|
*/
|
||||||
|
public static boolean couldCastSorcery(final Player player, final SpellAbility sa) {
|
||||||
|
PhaseHandler now = Singletons.getModel().getGame().getPhaseHandler();
|
||||||
|
final Card source = sa.getRootSpellAbility().getSourceCard();
|
||||||
|
boolean onlyThis = true;
|
||||||
|
if (Singletons.getModel().getGame().getStack().size() != 0) {
|
||||||
|
for (final Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Stack)) {
|
||||||
|
if (card != source) {
|
||||||
|
onlyThis = false;
|
||||||
|
//System.out.println("StackCard: " + card + " vs SourceCard: " + source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//System.out.println("now.isPlayerTurn(player) - " + now.isPlayerTurn(player));
|
||||||
|
//System.out.println("now.getPhase().isMain() - " + now.getPhase().isMain());
|
||||||
|
//System.out.println("onlyThis - " + onlyThis);
|
||||||
|
return now.isPlayerTurn(player) && now.getPhase().isMain() && onlyThis;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user