passes GameState to phaseHandler, moved player related static calls to player/Player.java

This commit is contained in:
Maxmtg
2012-10-20 00:02:57 +00:00
parent e7983cf9e1
commit df946206ba
10 changed files with 104 additions and 102 deletions

View File

@@ -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

View File

@@ -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."))) {

View File

@@ -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;
} }

View File

@@ -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;
} }

View File

@@ -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;
} }

View File

@@ -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;
} }

View File

@@ -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")

View File

@@ -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);
} }
/** /**

View File

@@ -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

View File

@@ -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;
}
} }