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.
|
||||
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
|
||||
|
||||
@@ -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."))) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 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<Card> list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield);
|
||||
final List<Card> list = game.getCardsIn(ZoneType.Battlefield);
|
||||
for (final Card c : list) {
|
||||
c.resetPreventNextDamage();
|
||||
c.resetReceivedDamageFromThisTurn();
|
||||
@@ -409,9 +416,9 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
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))
|
||||
c.setDrawnThisTurn(false);
|
||||
|
||||
@@ -423,7 +430,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
player.resetAttackersDeclaredThisTurn();
|
||||
}
|
||||
this.getPlayerTurn().removeKeyword("Skip all combat phases of this turn.");
|
||||
Singletons.getModel().getGame().getCleanup().executeUntilTurn(this.getNextTurn());
|
||||
game.getCleanup().executeUntilTurn(this.getNextTurn());
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -435,12 +442,12 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
final HashMap<String, Object> runParams = new HashMap<String, Object>();
|
||||
runParams.put("Phase", phase.Name);
|
||||
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
|
||||
Singletons.getModel().getGame().getStack().unfreezeStack();
|
||||
game.getStack().unfreezeStack();
|
||||
|
||||
// UNTAP
|
||||
if (phase != PhaseType.UNTAP) {
|
||||
@@ -467,13 +474,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
this.needToNextPhase = false;
|
||||
|
||||
// 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.");
|
||||
return;
|
||||
}
|
||||
this.bPhaseEffects = true;
|
||||
if (!Singletons.getModel().getGame().isCardInPlay("Upwelling")) {
|
||||
for (Player p : Singletons.getModel().getGame().getPlayers()) {
|
||||
if (!game.isCardInPlay("Upwelling")) {
|
||||
for (Player p : game.getPlayers()) {
|
||||
int burn = p.getManaPool().clearPool();
|
||||
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MANABURN)) {
|
||||
p.loseLife(burn, null);
|
||||
@@ -482,7 +489,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
}
|
||||
|
||||
if (this.getPhase() == PhaseType.COMBAT_DECLARE_ATTACKERS) {
|
||||
Singletons.getModel().getGame().getStack().unfreezeStack();
|
||||
game.getStack().unfreezeStack();
|
||||
this.nCombatsThisTurn++;
|
||||
} else if (this.getPhase() == PhaseType.UNTAP) {
|
||||
this.nCombatsThisTurn = 0;
|
||||
@@ -490,7 +497,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
|
||||
if (this.getPhase() == PhaseType.COMBAT_END) {
|
||||
//SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc());
|
||||
Singletons.getModel().getGame().getCombat().reset();
|
||||
game.getCombat().reset();
|
||||
this.resetAttackedThisCombat(this.getPlayerTurn());
|
||||
this.bCombat = false;
|
||||
}
|
||||
@@ -503,7 +510,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
}
|
||||
|
||||
if (this.is(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
|
||||
Singletons.getModel().getGame().getStack().unfreezeStack();
|
||||
game.getStack().unfreezeStack();
|
||||
}
|
||||
|
||||
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.extraCombats--;
|
||||
Singletons.getModel().getGame().getCombat().reset();
|
||||
Singletons.getModel().getGame().getCombat().setAttackingPlayer(player);
|
||||
Singletons.getModel().getGame().getCombat().setDefendingPlayer(opp);
|
||||
game.getCombat().reset();
|
||||
game.getCombat().setAttackingPlayer(player);
|
||||
game.getCombat().setDefendingPlayer(opp);
|
||||
this.phaseIndex = PhaseType.COMBAT_DECLARE_ATTACKERS.Index;
|
||||
} else {
|
||||
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
|
||||
// this to handleBeginPhase
|
||||
if (this.getPhase() == PhaseType.UNTAP) {
|
||||
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());
|
||||
@@ -559,15 +566,15 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
*/
|
||||
private Player handleNextTurn() {
|
||||
|
||||
Singletons.getModel().getGame().getStack().setCardsCastLastTurn();
|
||||
Singletons.getModel().getGame().getStack().clearCardsCastThisTurn();
|
||||
game.getStack().setCardsCastLastTurn();
|
||||
game.getStack().clearCardsCastThisTurn();
|
||||
|
||||
for (final Player p1 : Singletons.getModel().getGame().getPlayers()) {
|
||||
for (final Player p1 : game.getPlayers()) {
|
||||
for (final ZoneType z : Player.ALL_ZONES) {
|
||||
p1.getZone(z).resetCardsAddedThisTurn();
|
||||
}
|
||||
}
|
||||
for( Player p : Singletons.getModel().getGame().getPlayers() )
|
||||
for( Player p : game.getPlayers() )
|
||||
{
|
||||
p.resetProwl();
|
||||
p.setLifeLostThisTurn(0);
|
||||
@@ -826,20 +833,20 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
// pass the priority to other player
|
||||
this.setPriorityPlayer(actingPlayer.getOpponent());
|
||||
Singletons.getModel().getMatch().getInput().resetInput();
|
||||
Singletons.getModel().getGame().getStack().chooseOrderOfSimultaneousStackEntryAll();
|
||||
game.getStack().chooseOrderOfSimultaneousStackEntryAll();
|
||||
} else {
|
||||
if (Singletons.getModel().getGame().getStack().size() == 0) {
|
||||
if (game.getStack().size() == 0) {
|
||||
// end phase
|
||||
this.needToNextPhase = true;
|
||||
this.pPlayerPriority = this.getPlayerTurn(); // this needs to be
|
||||
// set early
|
||||
// as we exit the phase
|
||||
} else {
|
||||
if (!Singletons.getModel().getGame().getStack().hasSimultaneousStackEntries()) {
|
||||
Singletons.getModel().getGame().getStack().resolveStack();
|
||||
if (!game.getStack().hasSimultaneousStackEntries()) {
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* <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
|
||||
// devSetupGameState code
|
||||
// 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)
|
||||
&& this.isHuman()
|
||||
&& Preferences.DEV_MODE) {
|
||||
return PhaseHandler.canCastSorcery(this);
|
||||
return Player.canCastSorcery(this);
|
||||
}
|
||||
|
||||
// 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")
|
||||
.size() > 0));
|
||||
}
|
||||
@@ -2780,4 +2780,48 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
|
||||
// 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