diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index ec9e55e9cdf..1ec49695f19 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -61,6 +61,7 @@ import forge.card.trigger.Trigger; import forge.card.trigger.TriggerType; import forge.card.trigger.ZCTrigger; import forge.game.GameActionUtil; +import forge.game.GameState; import forge.game.GlobalRuleChange; import forge.game.event.CardEquippedEvent; import forge.game.event.CounterAddedEvent; @@ -264,7 +265,7 @@ public class Card extends GameEntity implements Comparable { || (cur == CardCharacteristicName.Transformed && state == CardCharacteristicName.Original)) { HashMap runParams = new HashMap(); runParams.put("Transformer", this); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.Transformed, runParams, false); + getGame().getTriggerHandler().runTrigger(TriggerType.Transformed, runParams, false); } return true; @@ -369,12 +370,12 @@ public class Card extends GameEntity implements Comparable { HashMap repParams = new HashMap(); repParams.put("Event", "TurnFaceUp"); repParams.put("Affected", this); - Singletons.getModel().getGame().getReplacementHandler().run(repParams); + getGame().getReplacementHandler().run(repParams); // Run triggers final Map runParams = new TreeMap(); runParams.put("Card", this); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.TurnFaceUp, runParams, false); + getGame().getTriggerHandler().runTrigger(TriggerType.TurnFaceUp, runParams, false); } return result; } @@ -1193,11 +1194,11 @@ public class Card extends GameEntity implements Comparable { runParams.put("Card", this); runParams.put("CounterType", counterType); for (int i = 0; i < addAmount; i++) { - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.CounterAdded, runParams, false); + getGame().getTriggerHandler().runTrigger(TriggerType.CounterAdded, runParams, false); } // play the Add Counter sound - Singletons.getModel().getGame().getEvents().post(new CounterAddedEvent(addAmount)); + getGame().getEvents().post(new CounterAddedEvent(addAmount)); this.updateObservers(); } @@ -1264,23 +1265,23 @@ public class Card extends GameEntity implements Comparable { runParams.put("Card", this); runParams.put("CounterType", counterName); for (int i = 0; i < delta; i++) { - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.CounterRemoved, runParams, false); + getGame().getTriggerHandler().runTrigger(TriggerType.CounterRemoved, runParams, false); } if (counterName.equals(CounterType.TIME) && (newValue == 0)) { final boolean hasVanish = CardFactoryUtil.hasKeyword(this, "Vanishing") != -1; if (hasVanish && this.isInPlay()) { - Singletons.getModel().getGame().getAction().sacrifice(this, null); + getGame().getAction().sacrifice(this, null); } - if (this.hasSuspend() && Singletons.getModel().getGame().isCardExiled(this)) { + if (this.hasSuspend() && getGame().isCardExiled(this)) { getOwner().getController().playFromSuspend(this); } } // Play the Subtract Counter sound - Singletons.getModel().getGame().getEvents().post(new CounterRemovedEvent(delta)); + getGame().getEvents().post(new CounterRemovedEvent(delta)); this.updateObservers(); } @@ -3171,7 +3172,7 @@ public class Card extends GameEntity implements Comparable { */ public final void addEquipping(final Card c) { this.equipping.add(c); - this.setTimestamp(Singletons.getModel().getGame().getNextTimestamp()); + this.setTimestamp(getGame().getNextTimestamp()); this.updateObservers(); } @@ -3199,7 +3200,7 @@ public class Card extends GameEntity implements Comparable { */ public final void equipCard(final Card c) { if (c.hasKeyword("CARDNAME can't be equipped.")) { - Singletons.getModel().getGame().getGameLog().add("ResolveStack", "Trying to equip " + c.getName() + getGame().getGameLog().add("ResolveStack", "Trying to equip " + c.getName() + " but it can't be equipped.", 2); return; } @@ -3209,7 +3210,7 @@ public class Card extends GameEntity implements Comparable { final String[] k = parse.split(" ", 2); final String[] restrictions = k[1].split(","); if (c.isValid(restrictions, this.getController(), this)) { - Singletons.getModel().getGame().getGameLog().add("ResolveStack", "Trying to equip " + c.getName() + getGame().getGameLog().add("ResolveStack", "Trying to equip " + c.getName() + " but it can't be equipped.", 2); return; } @@ -3221,7 +3222,7 @@ public class Card extends GameEntity implements Comparable { c.addEquippedBy(this); // Play the Equip sound - Singletons.getModel().getGame().getEvents().post(new CardEquippedEvent()); + getGame().getEvents().post(new CardEquippedEvent()); // run trigger final HashMap runParams = new HashMap(); runParams.put("AttachSource", this); @@ -3246,7 +3247,7 @@ public class Card extends GameEntity implements Comparable { final Map runParams = new TreeMap(); runParams.put("Equipment", this); runParams.put("Card", c); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.Unequip, runParams, false); + getGame().getTriggerHandler().runTrigger(TriggerType.Unequip, runParams, false); } /** @@ -3373,7 +3374,7 @@ public class Card extends GameEntity implements Comparable { */ public final void addEnchanting(final GameEntity e) { this.enchanting = e; - this.setTimestamp(Singletons.getModel().getGame().getNextTimestamp()); + this.setTimestamp(getGame().getNextTimestamp()); this.updateObservers(); } @@ -3402,7 +3403,7 @@ public class Card extends GameEntity implements Comparable { */ public final void enchantEntity(final GameEntity entity) { if (entity.hasKeyword("CARDNAME can't be enchanted.")) { - Singletons.getModel().getGame().getGameLog().add("ResolveStack", "Trying to enchant " + entity.getName() + getGame().getGameLog().add("ResolveStack", "Trying to enchant " + entity.getName() + " but it can't be enchanted.", 2); return; } @@ -3895,7 +3896,7 @@ public class Card extends GameEntity implements Comparable { return 0; } - if (Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.toughnessAssignsDamage)) { + if (getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.toughnessAssignsDamage)) { return this.getNetDefense(); } return this.getNetAttack(); @@ -4133,12 +4134,12 @@ public class Card extends GameEntity implements Comparable { // Run triggers final Map runParams = new TreeMap(); runParams.put("Card", this); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.Taps, runParams, false); + getGame().getTriggerHandler().runTrigger(TriggerType.Taps, runParams, false); } this.setTapped(true); // Play the Tap sound - Singletons.getModel().getGame().getEvents().post(new SetTappedEvent(true)); + getGame().getEvents().post(new SetTappedEvent(true)); } /** @@ -4151,10 +4152,10 @@ public class Card extends GameEntity implements Comparable { // Run triggers final Map runParams = new TreeMap(); runParams.put("Card", this); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.Untaps, runParams, false); + getGame().getTriggerHandler().runTrigger(TriggerType.Untaps, runParams, false); // Play the Untap sound - Singletons.getModel().getGame().getEvents().post(new SetTappedEvent(false)); + getGame().getEvents().post(new SetTappedEvent(false)); } for (final Command var : this.untapCommandList) { @@ -4884,9 +4885,9 @@ public class Card extends GameEntity implements Comparable { // Suppressed Exiling is as close as we can get to // "ceasing to exist" - Singletons.getModel().getGame().getTriggerHandler().suppressMode(TriggerType.ChangesZone); - Singletons.getModel().getGame().getAction().exile(this); - Singletons.getModel().getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + getGame().getTriggerHandler().suppressMode(TriggerType.ChangesZone); + getGame().getAction().exile(this); + getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone); } return true; } @@ -5278,10 +5279,10 @@ public class Card extends GameEntity implements Comparable { return false; } } else if (property.startsWith("DefenderCtrl")) { - if (!Singletons.getModel().getGame().getPhaseHandler().inCombat()) { + if (!getGame().getPhaseHandler().inCombat()) { return false; } - if (!Singletons.getModel().getGame().getCombat().getDefendingPlayerRelatedTo(source).contains(this.getController())) { + if (!getGame().getCombat().getDefendingPlayerRelatedTo(source).contains(this.getController())) { return false; } } else if (property.startsWith("EnchantedPlayerCtrl")) { @@ -5295,7 +5296,7 @@ public class Card extends GameEntity implements Comparable { } } else if (property.startsWith("RememberedPlayerCtrl")) { if (source.getRemembered().isEmpty()) { - final Card newCard = Singletons.getModel().getGame().getCardState(source); + final Card newCard = getGame().getCardState(source); for (final Object o : newCard.getRemembered()) { if (o instanceof Player) { if (!this.getController().equals(o)) { @@ -5341,11 +5342,11 @@ public class Card extends GameEntity implements Comparable { } } } else if (property.startsWith("ActivePlayerCtrl")) { - if (!Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(this.getController())) { + if (!getGame().getPhaseHandler().isPlayerTurn(this.getController())) { return false; } } else if (property.startsWith("NonActivePlayerCtrl")) { - if (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(this.getController())) { + if (getGame().getPhaseHandler().isPlayerTurn(this.getController())) { return false; } } else if (property.startsWith("YouOwn")) { @@ -5655,7 +5656,7 @@ public class Card extends GameEntity implements Comparable { } } else if (restriction.equals("MostProminentColor")) { for (final String color : CardUtil.getColors(this)) { - if (CardFactoryUtil.isMostProminentColor(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), color)) { + if (CardFactoryUtil.isMostProminentColor(getGame().getCardsIn(ZoneType.Battlefield), color)) { return true; } } @@ -5679,7 +5680,7 @@ public class Card extends GameEntity implements Comparable { } String color = props[1]; - return CardFactoryUtil.isMostProminentColor(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), color); + return CardFactoryUtil.isMostProminentColor(getGame().getCardsIn(ZoneType.Battlefield), color); } else if (property.startsWith("notSharesColorWith")) { if (property.equals("notSharesColorWith")) { if (this.sharesColorWith(source)) { @@ -5777,7 +5778,7 @@ public class Card extends GameEntity implements Comparable { return false; } else if (restriction.equals("EachTopLibrary")) { final List list = new ArrayList(); - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : getGame().getPlayers()) { final Card top = p.getCardsIn(ZoneType.Library).get(0); list.add(top); } @@ -5804,14 +5805,14 @@ public class Card extends GameEntity implements Comparable { } return false; } else if (restriction.equals(ZoneType.Graveyard.toString())) { - for (final Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Graveyard)) { + for (final Card card : getGame().getCardsIn(ZoneType.Graveyard)) { if (this.getName().equals(card.getName())) { return true; } } return false; } else if (restriction.equals(ZoneType.Battlefield.toString())) { - for (final Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (final Card card : getGame().getCardsIn(ZoneType.Battlefield)) { if (this.getName().equals(card.getName())) { return true; } @@ -5842,7 +5843,7 @@ public class Card extends GameEntity implements Comparable { } return false; } else if (restriction.equals("NonToken")) { - final List list = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), + final List list = CardLists.filter(getGame().getCardsIn(ZoneType.Battlefield), Presets.NON_TOKEN); for (final Card card : list) { if (this.getName().equals(card.getName())) { @@ -5959,11 +5960,11 @@ public class Card extends GameEntity implements Comparable { return false; } } else if (property.startsWith("enteredBattlefieldThisTurn")) { - if (!(this.getTurnInZone() == Singletons.getModel().getGame().getPhaseHandler().getTurn())) { + if (!(this.getTurnInZone() == getGame().getPhaseHandler().getTurn())) { return false; } } else if (property.startsWith("notEnteredBattlefieldThisTurn")) { - if (this.getTurnInZone() == Singletons.getModel().getGame().getPhaseHandler().getTurn()) { + if (this.getTurnInZone() == getGame().getPhaseHandler().getTurn()) { return false; } } else if (property.startsWith("firstTurnControlled")) { @@ -6039,7 +6040,7 @@ public class Card extends GameEntity implements Comparable { return false; } } else if (property.startsWith("greatestPower")) { - final List list = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES); + final List list = CardLists.filter(getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES); for (final Card crd : list) { if (crd.getNetAttack() > this.getNetAttack()) { return false; @@ -6053,21 +6054,21 @@ public class Card extends GameEntity implements Comparable { } } } else if (property.startsWith("leastPower")) { - final List list = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES); + final List list = CardLists.filter(getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES); for (final Card crd : list) { if (crd.getNetAttack() < this.getNetAttack()) { return false; } } } else if (property.startsWith("leastToughness")) { - final List list = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES); + final List list = CardLists.filter(getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES); for (final Card crd : list) { if (crd.getNetDefense() < this.getNetDefense()) { return false; } } } else if (property.startsWith("greatestCMC")) { - final List list = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES); + final List list = CardLists.filter(getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES); for (final Card crd : list) { if (crd.isSplitCard()) { if (crd.getCMC(Card.SplitCMCMode.LeftSplitCMC) > this.getCMC() || crd.getCMC(Card.SplitCMCMode.RightSplitCMC) > this.getCMC()) { @@ -6083,7 +6084,7 @@ public class Card extends GameEntity implements Comparable { List list = new ArrayList(); for (final Object o : source.getRemembered()) { if (o instanceof Card) { - list.add(Singletons.getModel().getGame().getCardState((Card) o)); + list.add(getGame().getCardState((Card) o)); } } if (!list.contains(this)) { @@ -6094,7 +6095,7 @@ public class Card extends GameEntity implements Comparable { return false; } } else if (property.startsWith("lowestCMC")) { - final List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final List list = getGame().getCardsIn(ZoneType.Battlefield); for (final Card crd : list) { if (!crd.isLand() && !crd.isImmutable()) { if (crd.isSplitCard()) { @@ -6146,7 +6147,7 @@ public class Card extends GameEntity implements Comparable { return false; } } else if (property.startsWith("suspended")) { - if (!this.hasSuspend() || !Singletons.getModel().getGame().isCardExiled(this) + if (!this.hasSuspend() || !getGame().isCardExiled(this) || !(this.getCounters(CounterType.getType("TIME")) >= 1)) { return false; } @@ -6244,7 +6245,7 @@ public class Card extends GameEntity implements Comparable { return false; } } else if (property.equals("attackedBySourceThisCombat")) { - final GameEntity defender = Singletons.getModel().getGame().getCombat().getDefenderByAttacker(source); + final GameEntity defender = getGame().getCombat().getDefenderByAttacker(source); if (defender instanceof Card) { if (!this.equals((Card) defender)) { return false; @@ -6319,7 +6320,7 @@ public class Card extends GameEntity implements Comparable { return false; } } else if (property.startsWith("unblocked")) { - if (!Singletons.getModel().getGame().getCombat().isUnblocked(this)) { + if (!getGame().getCombat().isUnblocked(this)) { return false; } } else if (property.startsWith("kicked")) { @@ -6704,7 +6705,7 @@ public class Card extends GameEntity implements Comparable { * @return a boolean. */ public final boolean isAttacking() { - return Singletons.getModel().getGame().getCombat().isAttacking(this); + return getGame().getCombat().isAttacking(this); } /** @@ -6715,7 +6716,7 @@ public class Card extends GameEntity implements Comparable { * @return a boolean. */ public final boolean isAttacking(GameEntity ge) { - Combat combat = Singletons.getModel().getGame().getCombat(); + Combat combat = getGame().getCombat(); if (!combat.isAttacking(this)) { return false; } @@ -6730,7 +6731,7 @@ public class Card extends GameEntity implements Comparable { * @return a boolean. */ public final boolean isBlocking() { - final List blockers = Singletons.getModel().getGame().getCombat().getAllBlockers(); + final List blockers = getGame().getCombat().getAllBlockers(); return blockers.contains(this); } @@ -6742,7 +6743,7 @@ public class Card extends GameEntity implements Comparable { * @return a boolean. */ public final boolean isBlocked() { - return Singletons.getModel().getGame().getCombat().isBlocked(this); + return getGame().getCombat().isBlocked(this); } /** @@ -6755,7 +6756,7 @@ public class Card extends GameEntity implements Comparable { * @return a boolean. */ public final boolean isBlocking(final Card attacker) { - return Singletons.getModel().getGame().getCombat().getAttackersBlockedBy(this).contains(attacker); + return getGame().getCombat().getAttackersBlockedBy(this).contains(attacker); } /** @@ -6768,7 +6769,7 @@ public class Card extends GameEntity implements Comparable { * @return a boolean. */ public final boolean isBlockedBy(final Card blocker) { - return Singletons.getModel().getGame().getCombat().getAttackersBlockedBy(blocker).contains(this); + return getGame().getCombat().getAttackersBlockedBy(blocker).contains(this); } // ///////////////////////// @@ -6778,7 +6779,7 @@ public class Card extends GameEntity implements Comparable { // //////////////////////// // all damage to cards is now handled in Card.java, no longer - // Singletons.getModel().getGameAction()... + // getGameAction()... /** *

* addReceivedDamageFromThisTurn. @@ -7089,11 +7090,11 @@ public class Card extends GameEntity implements Comparable { public final int staticDamagePrevention(final int damage, final int possiblePrevention, final Card source, final boolean isCombat) { - if (Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) { + if (getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) { return damage; } - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (final Card ca : getGame().getCardsIn(ZoneType.Battlefield)) { for (final ReplacementEffect re : ca.getReplacementEffects()) { Map params = re.getMapParams(); if (!"DamageDone".equals(params.get("Event")) || !params.containsKey("PreventionEffect")) { @@ -7148,11 +7149,11 @@ public class Card extends GameEntity implements Comparable { @Override public final int staticDamagePrevention(final int damageIn, final Card source, final boolean isCombat, final boolean isTest) { - if (Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) { + if (getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) { return damageIn; } - if (isCombat && Singletons.getModel().getGame().getPhaseHandler().isPreventCombatDamageThisTurn()) { + if (isCombat && getGame().getPhaseHandler().isPreventCombatDamageThisTurn()) { return 0; } @@ -7211,7 +7212,7 @@ public class Card extends GameEntity implements Comparable { } // Prevent Damage static abilities - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { + for (final Card ca : getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { restDamage = stAb.applyAbility("PreventDamage", source, this, restDamage, isCombat, isTest); @@ -7224,7 +7225,7 @@ public class Card extends GameEntity implements Comparable { return 0; } - if (source.isCreature() && Singletons.getModel().getGame().isCardInPlay("Well-Laid Plans") + if (source.isCreature() && getGame().isCardInPlay("Well-Laid Plans") && source.sharesColorWith(this)) { return 0; } @@ -7250,7 +7251,7 @@ public class Card extends GameEntity implements Comparable { @Override public final int preventDamage(final int damage, final Card source, final boolean isCombat) { - if (Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention) + if (getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention) || source.hasKeyword("Damage that would be dealt by CARDNAME can't be prevented.")) { return damage; } @@ -7270,7 +7271,7 @@ public class Card extends GameEntity implements Comparable { repParams.put("IsCombat", isCombat); repParams.put("Prevention", true); - if (Singletons.getModel().getGame().getReplacementHandler().run(repParams) != ReplacementResult.NotReplaced) { + if (getGame().getReplacementHandler().run(repParams) != ReplacementResult.NotReplaced) { return 0; } @@ -7316,7 +7317,7 @@ public class Card extends GameEntity implements Comparable { public final int staticReplaceDamage(final int damage, final Card source, final boolean isCombat) { int restDamage = damage; - for (Card c : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (Card c : getGame().getCardsIn(ZoneType.Battlefield)) { if (c.getName().equals("Sulfuric Vapors")) { if (source.isSpell() && source.isRed()) { restDamage += 1; @@ -7397,7 +7398,7 @@ public class Card extends GameEntity implements Comparable { repParams.put("DamageAmount", damageIn); repParams.put("IsCombat", isCombat); - if (Singletons.getModel().getGame().getReplacementHandler().run(repParams) != ReplacementResult.NotReplaced) { + if (getGame().getReplacementHandler().run(repParams) != ReplacementResult.NotReplaced) { return 0; } @@ -7460,14 +7461,14 @@ public class Card extends GameEntity implements Comparable { runParams.put("DamageTarget", this); runParams.put("DamageAmount", damageToAdd); runParams.put("IsCombatDamage", isCombat); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.DamageDone, runParams, false); + getGame().getTriggerHandler().runTrigger(TriggerType.DamageDone, runParams, false); String additionalLog = ""; if (this.isPlaneswalker()) { this.subtractCounter(CounterType.LOYALTY, damageToAdd); additionalLog = String.format("(Removing %d Loyalty Counters)", damageToAdd); } else { - boolean wither = (Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.alwaysWither) + boolean wither = (getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.alwaysWither) || source.hasKeyword("Wither") || source.hasKeyword("Infect")); GameActionUtil.executeDamageToCreatureEffects(source, this, damageToAdd); @@ -7477,14 +7478,14 @@ public class Card extends GameEntity implements Comparable { additionalLog = "(As -1/-1 Counters)"; } if (source.hasKeyword("Deathtouch") && this.isCreature()) { - Singletons.getModel().getGame().getAction().destroy(this, null); + getGame().getAction().destroy(this, null); additionalLog = "(Deathtouch)"; } else if (this.isInPlay() && !wither) { this.damage += damageToAdd; } } - Singletons.getModel().getGame().getGameLog().add("Damage", String.format("Dealing %d damage to %s. %s", + getGame().getGameLog().add("Damage", String.format("Dealing %d damage to %s. %s", damageToAdd, this.getName(), additionalLog), 3); return true; } @@ -7859,7 +7860,7 @@ public class Card extends GameEntity implements Comparable { * @return boolean */ public boolean isInZone(final ZoneType zone) { - return Singletons.getModel().getGame().isCardInZone(this, zone); + return getGame().isCardInZone(this, zone); } public final boolean canBeDestroyed() { @@ -7881,7 +7882,7 @@ public class Card extends GameEntity implements Comparable { } // CantTarget static abilities - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { + for (final Card ca : getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { if (stAb.applyAbility("CantTarget", this, sa)) { @@ -8203,7 +8204,7 @@ public class Card extends GameEntity implements Comparable { int xPaid = 0; // 2012-07-22 - If a card is on the stack, count the xManaCost in with it's CMC - if (Singletons.getModel().getGame().getCardsIn(ZoneType.Stack).contains(this) && getManaCost() != null) { + if (getGame().getCardsIn(ZoneType.Stack).contains(this) && getManaCost() != null) { xPaid = getXManaCostPaid() * getManaCost().countX(); } @@ -8296,4 +8297,20 @@ public class Card extends GameEntity implements Comparable { public Iterable getOptionalCostsPaid() { return costsPaid; } public boolean isOptionalCostPaid(OptionalCost cost) { return costsPaid.contains(cost); } + /** + * Fetch GameState for this card from references to players who may own or control this card. + */ + public GameState getGame() { + + Player controller = getController(); + if (null != controller) + return controller.getGame(); + + Player owner = getOwner(); + if (null != owner) + return owner.getGame(); + + throw new IllegalStateException("Card " + toString() + " has no means to determine the game it belongs to!"); + } + } // end Card class diff --git a/src/main/java/forge/CardUtil.java b/src/main/java/forge/CardUtil.java index 17b569b11dc..5d32fbb578c 100644 --- a/src/main/java/forge/CardUtil.java +++ b/src/main/java/forge/CardUtil.java @@ -30,6 +30,7 @@ import forge.card.ability.ApiType; import forge.card.spellability.AbilityManaPart; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.properties.NewConstants; @@ -88,15 +89,15 @@ public final class CardUtil { * @param src a Card object * @return a List that matches the given criteria */ - public static List getThisTurnEntered(final ZoneType to, final ZoneType from, final String valid, - final Card src) { + public static List getThisTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src) { List res = new ArrayList(); + final GameState game = src.getGame(); if (to != ZoneType.Stack) { - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { res.addAll(p.getZone(to).getCardsAddedThisTurn(from)); } } else { - res.addAll(Singletons.getModel().getGame().getStackZone().getCardsAddedThisTurn(from)); + res.addAll(game.getStackZone().getCardsAddedThisTurn(from)); } res = CardLists.getValidCards(res, valid, src.getController(), src); @@ -106,8 +107,8 @@ public final class CardUtil { public static List getThisTurnCast(final String valid, final Card src) { List res = new ArrayList(); - - res.addAll(Singletons.getModel().getGame().getStack().getCardsCastThisTurn()); + final GameState game = src.getGame(); + res.addAll(game.getStack().getCardsCastThisTurn()); res = CardLists.getValidCards(res, valid, src.getController(), src); @@ -116,8 +117,8 @@ public final class CardUtil { public static List getLastTurnCast(final String valid, final Card src) { List res = new ArrayList(); - - res.addAll(Singletons.getModel().getGame().getStack().getCardsCastLastTurn()); + final GameState game = src.getGame(); + res.addAll(game.getStack().getCardsCastLastTurn()); res = CardLists.getValidCards(res, valid, src.getController(), src); @@ -181,12 +182,13 @@ public final class CardUtil { public static List getRadiance(final Card source, final Card origin, final String[] valid) { final List res = new ArrayList(); + final GameState game = source.getGame(); for (final CardColor col : origin.getColor()) { for (final String strCol : col.toStringList()) { if (strCol.equalsIgnoreCase("Colorless")) { continue; } - for (final Card c : Singletons.getModel().getGame().getColoredCardsInPlay(strCol)) { + for (final Card c : game.getColoredCardsInPlay(strCol)) { if (!res.contains(c) && c.isValid(valid, source.getController(), source) && !c.equals(origin)) { res.add(c); } @@ -248,7 +250,8 @@ public final class CardUtil { if (validCard.startsWith("Defined.")) { cards = AbilityUtils.getDefinedCards(card, validCard.replace("Defined.", ""), abMana); } else { - cards = CardLists.getValidCards(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), validCard, abMana.getActivatingPlayer(), card); + final GameState game = sa.getActivatingPlayer().getGame(); + cards = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), validCard, abMana.getActivatingPlayer(), card); } // remove anything cards that is already in parents diff --git a/src/main/java/forge/CounterType.java b/src/main/java/forge/CounterType.java index cc9b05fba95..7c38fb2565e 100644 --- a/src/main/java/forge/CounterType.java +++ b/src/main/java/forge/CounterType.java @@ -289,4 +289,12 @@ public enum CounterType { final String replacedName = name.replace("/", "").replaceAll("\\+", "p").replaceAll("\\-", "m").toUpperCase(); return Enum.valueOf(CounterType.class, replacedName); } + + // although this should be in AI's code + public boolean isNegativeCounter() { + CounterType c = this; + return (c == CounterType.AGE) || (c == CounterType.BLAZE) || (c == CounterType.BRIBERY) || (c == CounterType.DOOM) + || (c == CounterType.ICE) || (c == CounterType.M1M1) || (c == CounterType.M0M2) || (c == CounterType.M0M1) + || (c == CounterType.TIME); + } } diff --git a/src/main/java/forge/StaticEffects.java b/src/main/java/forge/StaticEffects.java index 3b0c07052ac..06607daf0a3 100644 --- a/src/main/java/forge/StaticEffects.java +++ b/src/main/java/forge/StaticEffects.java @@ -29,6 +29,7 @@ import forge.card.TriggerReplacementBase; import forge.card.replacement.ReplacementEffect; import forge.card.spellability.SpellAbility; import forge.card.staticability.StaticAbility; +import forge.game.GameState; import forge.game.GlobalRuleChange; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -63,8 +64,6 @@ public class StaticEffects { this.removeStaticEffect(this.staticEffects.get(i)); } this.staticEffects = new ArrayList(); - - Singletons.getModel().getGame().getTriggerHandler().cleanUpTemporaryTriggers(); } public void setGlobalRuleChange(GlobalRuleChange change) { @@ -374,11 +373,12 @@ public class StaticEffects { *

* rePopulateStateBasedList. *

+ * @param game */ - public final void rePopulateStateBasedList() { + public final void rePopulateStateBasedList(GameState game) { this.reset(); - final List cards = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final List cards = game.getCardsIn(ZoneType.Battlefield); Log.debug("== Start add state effects =="); for (Card c : cards) { diff --git a/src/main/java/forge/card/TriggerReplacementBase.java b/src/main/java/forge/card/TriggerReplacementBase.java index 9fe57ce4aff..a9a07073ddd 100644 --- a/src/main/java/forge/card/TriggerReplacementBase.java +++ b/src/main/java/forge/card/TriggerReplacementBase.java @@ -9,10 +9,10 @@ import forge.Card; import forge.CardLists; import forge.CardUtil; import forge.GameEntity; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.Zone; import forge.game.zone.ZoneType; @@ -155,8 +155,8 @@ public abstract class TriggerReplacementBase { } protected boolean meetsCommonRequirements(Map params) { - - Player hostController = this.getHostCard().getController(); + final Player hostController = this.getHostCard().getController(); + final GameState game = hostController.getGame(); if ("True".equalsIgnoreCase(params.get("Metalcraft")) && !hostController.hasMetalcraft()) return false; if ("True".equalsIgnoreCase(params.get("Threshold")) && !hostController.hasThreshold()) return false; @@ -167,7 +167,7 @@ public abstract class TriggerReplacementBase { if ("You".equalsIgnoreCase(params.get("PlayersPoisoned")) && hostController.getPoisonCounters() == 0) return false; if ("Opponent".equalsIgnoreCase(params.get("PlayersPoisoned")) && hostController.getOpponent().getPoisonCounters() == 0) return false; if ("Each".equalsIgnoreCase(params.get("PlayersPoisoned"))) { - for( Player p : Singletons.getModel().getGame().getPlayers()) + for( Player p : game.getPlayers()) if( p.getPoisonCounters() == 0 ) return false; } @@ -281,14 +281,14 @@ public abstract class TriggerReplacementBase { } if (params.containsKey("CheckSVar")) { - final int sVar = AbilityUtils.calculateAmount(Singletons.getModel().getGame().getCardState(this.getHostCard()), params.get("CheckSVar"), null); + final int sVar = AbilityUtils.calculateAmount(game.getCardState(this.getHostCard()), params.get("CheckSVar"), null); String comparator = "GE1"; if (params.containsKey("SVarCompare")) { comparator = params.get("SVarCompare"); } final String svarOperator = comparator.substring(0, 2); final String svarOperand = comparator.substring(2); - final int operandValue = AbilityUtils.calculateAmount(Singletons.getModel().getGame().getCardState(this.getHostCard()), + final int operandValue = AbilityUtils.calculateAmount(game.getCardState(this.getHostCard()), svarOperand, null); if (!Expressions.compare(sVar, svarOperator, operandValue)) { return false; diff --git a/src/main/java/forge/card/ability/AbilityUtils.java b/src/main/java/forge/card/ability/AbilityUtils.java index 8517088a163..7a2d04468a4 100644 --- a/src/main/java/forge/card/ability/AbilityUtils.java +++ b/src/main/java/forge/card/ability/AbilityUtils.java @@ -12,7 +12,6 @@ import forge.CardLists; import forge.CardUtil; import forge.Constant; import forge.CounterType; -import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.Cost; import forge.card.mana.ManaCostBeingPaid; @@ -79,7 +78,8 @@ public class AbilityUtils { public static List getDefinedCards(final Card hostCard, final String def, final SpellAbility sa) { final List cards = new ArrayList(); final String defined = (def == null) ? "Self" : def; // default to Self - + final GameState game = sa.getActivatingPlayer().getGame(); + Card c = null; if (defined.equals("Self")) { @@ -142,7 +142,7 @@ public class AbilityUtils { else { final Object crd = root.getTriggeringObject(defined.substring(9)); if (crd instanceof Card) { - c = Singletons.getModel().getGame().getCardState((Card) crd); + c = game.getCardState((Card) crd); } else if (crd instanceof List) { for (final Card cardItem : (List) crd) { cards.add(cardItem); @@ -153,7 +153,7 @@ public class AbilityUtils { final SpellAbility root = sa.getRootAbility(); final Object crd = root.getReplacingObject(defined.substring(8)); if (crd instanceof Card) { - c = Singletons.getModel().getGame().getCardState((Card) crd); + c = game.getCardState((Card) crd); } else if (crd instanceof List) { for (final Card cardItem : (List) crd) { cards.add(cardItem); @@ -161,26 +161,26 @@ public class AbilityUtils { } } else if (defined.equals("Remembered")) { if (hostCard.getRemembered().isEmpty()) { - final Card newCard = Singletons.getModel().getGame().getCardState(hostCard); + final Card newCard = game.getCardState(hostCard); for (final Object o : newCard.getRemembered()) { if (o instanceof Card) { - cards.add(Singletons.getModel().getGame().getCardState((Card) o)); + cards.add(game.getCardState((Card) o)); } } } for (final Object o : hostCard.getRemembered()) { if (o instanceof Card) { - cards.add(Singletons.getModel().getGame().getCardState((Card) o)); + cards.add(game.getCardState((Card) o)); } } } else if (defined.equals("Clones")) { for (final Card clone : hostCard.getClones()) { - cards.add(Singletons.getModel().getGame().getCardState(clone)); + cards.add(game.getCardState(clone)); } } else if (defined.equals("Imprinted")) { for (final Card imprint : hostCard.getImprinted()) { - cards.add(Singletons.getModel().getGame().getCardState(imprint)); + cards.add(game.getCardState(imprint)); } } else if (defined.startsWith("ThisTurnEntered")) { final String[] workingCopy = defined.split("_"); @@ -196,11 +196,11 @@ public class AbilityUtils { validFilter = workingCopy[2]; } for (final Card cl : CardUtil.getThisTurnEntered(destination, origin, validFilter, hostCard)) { - cards.add(Singletons.getModel().getGame().getCardState(cl)); + cards.add(game.getCardState(cl)); } } else if (defined.equals("ChosenCard")) { for (final Card chosen : hostCard.getChosenCard()) { - cards.add(Singletons.getModel().getGame().getCardState(chosen)); + cards.add(game.getCardState(chosen)); } } else { List list = null; @@ -226,22 +226,16 @@ public class AbilityUtils { else if (defined.startsWith("Valid ")) { String validDefined = defined.substring("Valid ".length()); - GameState game = Singletons.getModel().getGame(); - list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), validDefined.split(","), hostCard.getController(), hostCard); } else if (defined.startsWith("ValidHand ")) { String validDefined = defined.substring("ValidHand ".length()); - GameState game = Singletons.getModel().getGame(); - list = CardLists.getValidCards(game.getCardsIn(ZoneType.Hand), validDefined.split(","), hostCard.getController(), hostCard); } else if (defined.startsWith("ValidAll ")) { String validDefined = defined.substring("ValidAll ".length()); - GameState game = Singletons.getModel().getGame(); - list = CardLists.getValidCards(game.getCardsInGame(), validDefined.split(","), hostCard.getController(), hostCard); } @@ -292,6 +286,7 @@ public class AbilityUtils { public static int calculateAmount(final Card card, String amount, final SpellAbility ability) { // return empty strings and constants if (StringUtils.isBlank(amount)) { return 0; } + final GameState game = card.getController().getGame(); // Strip and save sign for calculations final boolean startsWithPlus = amount.charAt(0) == '+'; @@ -366,7 +361,7 @@ public class AbilityUtils { final String hType = calcX[0].substring(11); final ArrayList players = new ArrayList(); if (hType.equals("Players") || hType.equals("")) { - players.addAll(Singletons.getModel().getGame().getPlayers()); + players.addAll(game.getPlayers()); return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; } else if (hType.equals("Opponents")) { players.addAll(card.getController().getOpponents()); @@ -382,8 +377,8 @@ public class AbilityUtils { } return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; } else if (hType.equals("NonActive")) { - players.addAll(Singletons.getModel().getGame().getPlayers()); - players.remove(Singletons.getModel().getGame().getPhaseHandler().getPlayerTurn()); + players.addAll(game.getPlayers()); + players.remove(game.getPhaseHandler().getPlayerTurn()); return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; } return 0; @@ -393,10 +388,10 @@ public class AbilityUtils { // Add whole Remembered list to handlePaid final List list = new ArrayList(); if (card.getRemembered().isEmpty()) { - final Card newCard = Singletons.getModel().getGame().getCardState(card); + final Card newCard = game.getCardState(card); for (final Object o : newCard.getRemembered()) { if (o instanceof Card) { - list.add(Singletons.getModel().getGame().getCardState((Card) o)); + list.add(game.getCardState((Card) o)); } } } @@ -410,7 +405,7 @@ public class AbilityUtils { } else { for (final Object o : card.getRemembered()) { if (o instanceof Card) { - list.add(Singletons.getModel().getGame().getCardState((Card) o)); + list.add(game.getCardState((Card) o)); } } } @@ -422,7 +417,7 @@ public class AbilityUtils { // Add whole Imprinted list to handlePaid final List list = new ArrayList(); for (final Card c : card.getImprinted()) { - list.add(Singletons.getModel().getGame().getCardState(c)); + list.add(game.getCardState(c)); } return CardFactoryUtil.handlePaid(list, calcX[1], card) * multiplier; @@ -434,7 +429,7 @@ public class AbilityUtils { if (card.isEnchanting()) { Object o = card.getEnchanting(); if (o instanceof Card) { - list.add(Singletons.getModel().getGame().getCardState((Card) o)); + list.add(game.getCardState((Card) o)); } } return CardFactoryUtil.handlePaid(list, calcX[1], card) * multiplier; @@ -704,6 +699,7 @@ public class AbilityUtils { public static List getDefinedPlayers(final Card card, final String def, final SpellAbility sa) { final List players = new ArrayList(); final String defined = (def == null) ? "You" : def; + final GameState game = sa.getActivatingPlayer().getGame(); if (defined.equals("Targeted")) { final SpellAbility saTargeting = sa.getSATargetingPlayer(); @@ -893,12 +889,12 @@ public class AbilityUtils { } } } else if (defined.equals("AttackingPlayer")) { - final Player p = Singletons.getModel().getGame().getCombat().getAttackingPlayer(); + final Player p = game.getCombat().getAttackingPlayer(); if (!players.contains(p)) { players.add(p); } } else if (defined.equals("DefendingPlayer")) { - players.addAll(Singletons.getModel().getGame().getCombat().getDefendingPlayerRelatedTo(card)); + players.addAll(game.getCombat().getDefendingPlayerRelatedTo(card)); } else if (defined.equals("ChosenPlayer")) { final Player p = card.getChosenPlayer(); if (!players.contains(p)) { @@ -910,7 +906,7 @@ public class AbilityUtils { players.add(p); } } else if (defined.startsWith("Flipped")) { - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { if (null != sa.getSourceCard().getFlipResult(p)) { if (sa.getSourceCard().getFlipResult(p).equals(defined.substring(7))) { players.add(p); @@ -920,11 +916,11 @@ public class AbilityUtils { } else if (defined.equals("You")) { players.add(sa.getActivatingPlayer()); } else if (defined.equals("Each")) { - players.addAll(Singletons.getModel().getGame().getPlayers()); + players.addAll(game.getPlayers()); } else if (defined.equals("Opponent")) { players.add(sa.getActivatingPlayer().getOpponent()); } else { - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { if (p.isValid(defined, sa.getActivatingPlayer(), sa.getSourceCard())) { players.add(p); } @@ -950,7 +946,8 @@ public class AbilityUtils { final SpellAbility sa) { final ArrayList sas = new ArrayList(); final String defined = (def == null) ? "Self" : def; // default to Self - + final GameState game = sa.getActivatingPlayer().getGame(); + SpellAbility s = null; // TODO - this probably needs to be fleshed out a bit, but the basics @@ -974,7 +971,7 @@ public class AbilityUtils { for (final Object o : card.getRemembered()) { if (o instanceof Card) { final Card rem = (Card) o; - sas.addAll(Singletons.getModel().getGame().getCardState(rem).getSpellAbilities()); + sas.addAll(game.getCardState(rem).getSpellAbilities()); } } } else if (defined.equals("Imprinted")) { @@ -995,7 +992,7 @@ public class AbilityUtils { final SpellAbility root = sa.getRootAbility(); final Object crd = root.getTriggeringObject("Card"); if (crd instanceof Card) { - triggeredCard = Singletons.getModel().getGame().getCardState((Card) crd); + triggeredCard = game.getCardState((Card) crd); } //find the imprinted card that does not share a name with the triggered card for (final SpellAbility spell : imprintedCards) { if (!spell.getSourceCard().getName().equals(triggeredCard.getName())) { @@ -1057,8 +1054,7 @@ public class AbilityUtils { return; } - final GameState game = Singletons.getModel().getGame(); - AbilityUtils.resolveApiAbility(sa, usedStack, game); + AbilityUtils.resolveApiAbility(sa, usedStack, sa.getActivatingPlayer().getGame()); } private static void resolveSubAbilities(final SpellAbility sa, boolean usedStack, final GameState game) { diff --git a/src/main/java/forge/card/ability/SpellAbilityAi.java b/src/main/java/forge/card/ability/SpellAbilityAi.java index f6451d40f27..1fa8ac29227 100644 --- a/src/main/java/forge/card/ability/SpellAbilityAi.java +++ b/src/main/java/forge/card/ability/SpellAbilityAi.java @@ -1,7 +1,6 @@ package forge.card.ability; -import forge.Singletons; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; import forge.game.ai.ComputerUtilCost; @@ -81,7 +80,7 @@ public abstract class SpellAbilityAi { return false; } - if (sa.getRestrictions().getPlaneswalker() && Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.MAIN2)) { + if (sa.getRestrictions().getPlaneswalker() && ai.getGame().getPhaseHandler().is(PhaseType.MAIN2)) { return true; } if (sa.isTrigger()) { @@ -91,7 +90,7 @@ public abstract class SpellAbilityAi { return false; } - PhaseHandler phase = Singletons.getModel().getGame().getPhaseHandler(); + PhaseHandler phase = ai.getGame().getPhaseHandler(); return phase.is(PhaseType.END_OF_TURN) && phase.getNextTurn().equals(ai); } diff --git a/src/main/java/forge/card/ability/ai/AnimateAi.java b/src/main/java/forge/card/ability/ai/AnimateAi.java index f8f4b69bde1..6529e4dfc96 100644 --- a/src/main/java/forge/card/ability/ai/AnimateAi.java +++ b/src/main/java/forge/card/ability/ai/AnimateAi.java @@ -6,11 +6,11 @@ import com.google.common.collect.Iterables; import forge.Card; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; import forge.game.player.Player; @@ -34,7 +34,8 @@ public class AnimateAi extends SpellAbilityAi { protected boolean canPlayAI(AIPlayer aiPlayer, SpellAbility sa) { final Target tgt = sa.getTarget(); final Card source = sa.getSourceCard(); - + final GameState game = aiPlayer.getGame(); + // TODO - add some kind of check to answer // "Am I going to attack with this?" // TODO - add some kind of check for during human turn to answer @@ -42,8 +43,8 @@ public class AnimateAi extends SpellAbilityAi { // don't use instant speed animate abilities outside computers // Combat_Begin step - if (!Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_BEGIN) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(aiPlayer) + if (!game.getPhaseHandler().is(PhaseType.COMBAT_BEGIN) + && game.getPhaseHandler().isPlayerTurn(aiPlayer) && !SpellAbilityAi.isSorcerySpeed(sa) && !sa.hasParam("ActivationPhases") && !sa.hasParam("Permanent")) { return false; @@ -51,7 +52,7 @@ public class AnimateAi extends SpellAbilityAi { Player opponent = aiPlayer.getWeakestOpponent(); // don't animate if the AI won't attack anyway - if (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(aiPlayer) + if (game.getPhaseHandler().isPlayerTurn(aiPlayer) && aiPlayer.getLife() < 6 && opponent.getLife() > 6 && Iterables.any(opponent.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES)) { @@ -60,14 +61,14 @@ public class AnimateAi extends SpellAbilityAi { // don't use instant speed animate abilities outside humans // Combat_Declare_Attackers_InstantAbility step - if ((!Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY) - || (Singletons.getModel().getGame().getCombat().getAttackers().isEmpty())) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(opponent)) { + if ((!game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY) + || (game.getCombat().getAttackers().isEmpty())) + && game.getPhaseHandler().isPlayerTurn(opponent)) { return false; } // don't activate during main2 unless this effect is permanent - if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.MAIN2) && !sa.hasParam("Permanent")) { + if (game.getPhaseHandler().is(PhaseType.MAIN2) && !sa.hasParam("Permanent")) { return false; } @@ -77,7 +78,7 @@ public class AnimateAi extends SpellAbilityAi { boolean bFlag = false; for (final Card c : defined) { bFlag |= (!c.isCreature() && !c.isTapped() - && !(c.getTurnInZone() == Singletons.getModel().getGame().getPhaseHandler().getTurn()) + && !(c.getTurnInZone() == game.getPhaseHandler().getTurn()) && !c.isEquipping()); // for creatures that could be improved (like Figure of Destiny) diff --git a/src/main/java/forge/card/ability/ai/AttachAi.java b/src/main/java/forge/card/ability/ai/AttachAi.java index 7c958d12903..e8aa5b4714e 100644 --- a/src/main/java/forge/card/ability/ai/AttachAi.java +++ b/src/main/java/forge/card/ability/ai/AttachAi.java @@ -14,7 +14,6 @@ import forge.Card; import forge.CardLists; import forge.CardPredicates; import forge.CardUtil; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; import forge.card.ability.SpellAbilityAi; @@ -79,7 +78,7 @@ public class AttachAi extends SpellAbilityAi { source.setSVar("PayX", Integer.toString(xPay)); } - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY) + if (ai.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY) && !"Curse".equals(sa.getParam("AILogic"))) { return false; } @@ -264,7 +263,7 @@ public class AttachAi extends SpellAbilityAi { private static Player attachToPlayerAIPreferences(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { List targetable = new ArrayList(); - for (final Player player : Singletons.getModel().getGame().getPlayers()) { + for (final Player player : aiPlayer.getGame().getPlayers()) { if (sa.canTarget(player)) { targetable.add(player); } @@ -880,7 +879,7 @@ public class AttachAi extends SpellAbilityAi { return null; } - List list = Singletons.getModel().getGame().getCardsIn(tgt.getZone()); + List list = aiPlayer.getGame().getCardsIn(tgt.getZone()); list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), attachSource); // TODO If Attaching without casting, don't need to actually target. @@ -1023,7 +1022,7 @@ public class AttachAi extends SpellAbilityAi { * @return true, if is useful keyword */ private static boolean isUsefulAttachKeyword(final String keyword, final Card card, final SpellAbility sa, final int powerBonus) { - final PhaseHandler ph = Singletons.getModel().getGame().getPhaseHandler(); + final PhaseHandler ph = sa.getActivatingPlayer().getGame().getPhaseHandler(); if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) { return false; } diff --git a/src/main/java/forge/card/ability/ai/BecomesBlockedAi.java b/src/main/java/forge/card/ability/ai/BecomesBlockedAi.java index a5c6609c673..8bc24781881 100644 --- a/src/main/java/forge/card/ability/ai/BecomesBlockedAi.java +++ b/src/main/java/forge/card/ability/ai/BecomesBlockedAi.java @@ -5,7 +5,6 @@ import java.util.List; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; @@ -20,7 +19,7 @@ public class BecomesBlockedAi extends SpellAbilityAi { final Card source = sa.getSourceCard(); final Target tgt = sa.getTarget(); - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = aiPlayer.getGame().getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); list = CardLists.getTargetableCards(list, sa); diff --git a/src/main/java/forge/card/ability/ai/ChangeZoneAllAi.java b/src/main/java/forge/card/ability/ai/ChangeZoneAllAi.java index 6a5869113cd..d6d753e87c1 100644 --- a/src/main/java/forge/card/ability/ai/ChangeZoneAllAi.java +++ b/src/main/java/forge/card/ability/ai/ChangeZoneAllAi.java @@ -5,7 +5,6 @@ import java.util.Random; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -101,7 +100,7 @@ public class ChangeZoneAllAi extends SpellAbilityAi { } // Don't cast during main1? - if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.MAIN1, ai)) { + if (ai.getGame().getPhaseHandler().is(PhaseType.MAIN1, ai)) { return false; } } else if (origin.equals(ZoneType.Graveyard)) { diff --git a/src/main/java/forge/card/ability/ai/ChooseCardAi.java b/src/main/java/forge/card/ability/ai/ChooseCardAi.java index fce3b6aa02f..1c907f81d1a 100644 --- a/src/main/java/forge/card/ability/ai/ChooseCardAi.java +++ b/src/main/java/forge/card/ability/ai/ChooseCardAi.java @@ -4,7 +4,6 @@ import java.util.List; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; @@ -34,7 +33,7 @@ public class ChooseCardAi extends SpellAbilityAi { if (sa.hasParam("ChoiceZone")) { choiceZone = ZoneType.smartValueOf(sa.getParam("ChoiceZone")); } - List choices = Singletons.getModel().getGame().getCardsIn(choiceZone); + List choices = ai.getGame().getCardsIn(choiceZone); if (sa.hasParam("Choices")) { choices = CardLists.getValidCards(choices, sa.getParam("Choices"), host.getController(), host); } diff --git a/src/main/java/forge/card/ability/ai/ChooseSourceAi.java b/src/main/java/forge/card/ability/ai/ChooseSourceAi.java index 3bbd2a83b2c..efd88607f8f 100644 --- a/src/main/java/forge/card/ability/ai/ChooseSourceAi.java +++ b/src/main/java/forge/card/ability/ai/ChooseSourceAi.java @@ -7,13 +7,13 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtilCombat; import forge.game.ai.ComputerUtilCost; import forge.game.phase.PhaseType; @@ -65,9 +65,10 @@ public class ChooseSourceAi extends SpellAbilityAi { } } if (sa.hasParam("AILogic")) { + final GameState game = ai.getGame(); if (sa.getParam("AILogic").equals("NeedsPrevention")) { - if (!Singletons.getModel().getGame().getStack().isEmpty()) { - final SpellAbility topStack = Singletons.getModel().getGame().getStack().peekAbility(); + if (!game.getStack().isEmpty()) { + final SpellAbility topStack = game.getStack().peekAbility(); if (sa.hasParam("Choices") && !topStack.getSourceCard().isValid(sa.getParam("Choices"), ai, source)) { return false; } @@ -98,21 +99,21 @@ public class ChooseSourceAi extends SpellAbilityAi { } return true; } - if (!Singletons.getModel().getGame().getPhaseHandler().getPhase() + if (!game.getPhaseHandler().getPhase() .equals(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { return false; } - List choices = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List choices = game.getCardsIn(ZoneType.Battlefield); if (sa.hasParam("Choices")) { choices = CardLists.getValidCards(choices, sa.getParam("Choices"), host.getController(), host); } choices = CardLists.filter(choices, new Predicate() { @Override public boolean apply(final Card c) { - if (!c.isAttacking(ai) || !Singletons.getModel().getGame().getCombat().isUnblocked(c)) { + if (!c.isAttacking(ai) || !game.getCombat().isUnblocked(c)) { return false; } - return ComputerUtilCombat.damageIfUnblocked(c, ai, Singletons.getModel().getGame().getCombat()) > 0; + return ComputerUtilCombat.damageIfUnblocked(c, ai, game.getCombat()) > 0; } }); if (choices.isEmpty()) { diff --git a/src/main/java/forge/card/ability/ai/CloneAi.java b/src/main/java/forge/card/ability/ai/CloneAi.java index 9260778c939..23b52c84233 100644 --- a/src/main/java/forge/card/ability/ai/CloneAi.java +++ b/src/main/java/forge/card/ability/ai/CloneAi.java @@ -3,11 +3,11 @@ package forge.card.ability.ai; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; @@ -18,6 +18,7 @@ public class CloneAi extends SpellAbilityAi { protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) { final Target tgt = sa.getTarget(); final Card source = sa.getSourceCard(); + final GameState game = source.getGame(); boolean useAbility = true; @@ -33,7 +34,7 @@ public class CloneAi extends SpellAbilityAi { // TODO - add some kind of check for during human turn to answer // "Can I use this to block something?" - PhaseHandler phase = Singletons.getModel().getGame().getPhaseHandler(); + PhaseHandler phase = game.getPhaseHandler(); // don't use instant speed clone abilities outside computers // Combat_Begin step if (!phase.is(PhaseType.COMBAT_BEGIN) @@ -45,7 +46,7 @@ public class CloneAi extends SpellAbilityAi { // don't use instant speed clone abilities outside humans // Combat_Declare_Attackers_InstantAbility step if ((!phase.is(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY) - || Singletons.getModel().getGame().getCombat().getAttackers().isEmpty()) + || game.getCombat().getAttackers().isEmpty()) && !phase.isPlayerTurn(ai)) { return false; } diff --git a/src/main/java/forge/card/ability/ai/ControlGainAi.java b/src/main/java/forge/card/ability/ai/ControlGainAi.java index ad632f20567..ce3637c0561 100644 --- a/src/main/java/forge/card/ability/ai/ControlGainAi.java +++ b/src/main/java/forge/card/ability/ai/ControlGainAi.java @@ -25,11 +25,11 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; @@ -113,7 +113,7 @@ public class ControlGainAi extends SpellAbilityAi { // Don't steal something if I can't Attack without, or prevent it from // blocking at least if ((lose != null) && lose.contains("EOT") - && Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)) { + && ai.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)) { return false; } @@ -184,9 +184,10 @@ public class ControlGainAi extends SpellAbilityAi { @Override public boolean chkAIDrawback(SpellAbility sa, final AIPlayer ai) { + final GameState game = ai.getGame(); if ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) { if (sa.hasParam("AllValid")) { - List tgtCards = CardLists.filterControlledBy(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), ai.getOpponent()); + List tgtCards = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), ai.getOpponent()); tgtCards = AbilityUtils.filterListByType(tgtCards, sa.getParam("AllValid"), sa); if (tgtCards.isEmpty()) { return false; @@ -195,7 +196,7 @@ public class ControlGainAi extends SpellAbilityAi { final List lose = sa.hasParam("LoseControl") ? Arrays.asList(sa.getParam("LoseControl").split(",")) : null; if ((lose != null) && lose.contains("EOT") - && Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { + && game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { return false; } } else { diff --git a/src/main/java/forge/card/ability/ai/CopyPermanentAi.java b/src/main/java/forge/card/ability/ai/CopyPermanentAi.java index 0ca6e5bcc7f..570ca6d3719 100644 --- a/src/main/java/forge/card/ability/ai/CopyPermanentAi.java +++ b/src/main/java/forge/card/ability/ai/CopyPermanentAi.java @@ -9,7 +9,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; import forge.CardPredicates.Presets; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; @@ -29,7 +28,7 @@ public class CopyPermanentAi extends SpellAbilityAi { // Card source = sa.getSourceCard(); // TODO - I'm sure someone can do this AI better - if (sa.hasParam("AtEOT") && !Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.MAIN1)) { + if (sa.hasParam("AtEOT") && !aiPlayer.getGame().getPhaseHandler().is(PhaseType.MAIN1)) { return false; } else { double chance = .4; // 40 percent chance with instant speed stuff @@ -56,7 +55,7 @@ public class CopyPermanentAi extends SpellAbilityAi { final Target abTgt = sa.getTarget(); if (abTgt != null) { - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = aiPlayer.getGame().getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source); list = CardLists.getTargetableCards(list, sa); list = CardLists.filter(list, new Predicate() { diff --git a/src/main/java/forge/card/ability/ai/CounterAi.java b/src/main/java/forge/card/ability/ai/CounterAi.java index 2cf860964d1..6f49d5b9280 100644 --- a/src/main/java/forge/card/ability/ai/CounterAi.java +++ b/src/main/java/forge/card/ability/ai/CounterAi.java @@ -1,13 +1,13 @@ package forge.card.ability.ai; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCost; import forge.game.ai.ComputerUtilMana; @@ -21,7 +21,8 @@ public class CounterAi extends SpellAbilityAi { boolean toReturn = true; final Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); - if (Singletons.getModel().getGame().getStack().isEmpty()) { + final GameState game = ai.getGame(); + if (game.getStack().isEmpty()) { return false; } @@ -38,7 +39,7 @@ public class CounterAi extends SpellAbilityAi { final Target tgt = sa.getTarget(); if (tgt != null) { - final SpellAbility topSA = Singletons.getModel().getGame().getStack().peekAbility(); + final SpellAbility topSA = game.getStack().peekAbility(); if (!CardFactoryUtil.isCounterableBy(topSA.getSourceCard(), sa) || topSA.getActivatingPlayer() == ai) { // might as well check for player's friendliness return false; @@ -110,10 +111,11 @@ public class CounterAi extends SpellAbilityAi { final Target tgt = sa.getTarget(); if (tgt != null) { - if (Singletons.getModel().getGame().getStack().isEmpty()) { + final GameState game = ai.getGame(); + if (game.getStack().isEmpty()) { return false; } - final SpellAbility topSA = Singletons.getModel().getGame().getStack().peekAbility(); + final SpellAbility topSA = game.getStack().peekAbility(); if (!CardFactoryUtil.isCounterableBy(topSA.getSourceCard(), sa) || topSA.getActivatingPlayer() == ai) { return false; } diff --git a/src/main/java/forge/card/ability/ai/CountersProliferateAi.java b/src/main/java/forge/card/ability/ai/CountersProliferateAi.java index 3ce7e08a476..caaa2e71d0e 100644 --- a/src/main/java/forge/card/ability/ai/CountersProliferateAi.java +++ b/src/main/java/forge/card/ability/ai/CountersProliferateAi.java @@ -8,7 +8,6 @@ import forge.Card; import forge.CardLists; import forge.CounterType; import forge.card.ability.SpellAbilityAi; -import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; import forge.game.player.AIPlayer; import forge.game.zone.ZoneType; @@ -23,7 +22,7 @@ public class CountersProliferateAi extends SpellAbilityAi { @Override public boolean apply(final Card crd) { for (final CounterType c1 : CounterType.values()) { - if (crd.getCounters(c1) != 0 && !CardFactoryUtil.isNegativeCounter(c1)) { + if (crd.getCounters(c1) != 0 && !c1.isNegativeCounter()) { return true; } } @@ -35,7 +34,7 @@ public class CountersProliferateAi extends SpellAbilityAi { @Override public boolean apply(final Card crd) { for (final CounterType c1 : CounterType.values()) { - if (crd.getCounters(c1) != 0 && CardFactoryUtil.isNegativeCounter(c1)) { + if (crd.getCounters(c1) != 0 && c1.isNegativeCounter()) { return true; } } diff --git a/src/main/java/forge/card/ability/ai/CountersPutAi.java b/src/main/java/forge/card/ability/ai/CountersPutAi.java index f8c2fafc313..6aaf5e7bf5b 100644 --- a/src/main/java/forge/card/ability/ai/CountersPutAi.java +++ b/src/main/java/forge/card/ability/ai/CountersPutAi.java @@ -9,7 +9,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; import forge.CounterType; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -151,7 +150,7 @@ public class CountersPutAi extends SpellAbilityAi { } // Don't use non P1P1/M1M1 counters before main 2 if possible - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) + if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases") && !(type.equals("P1P1") || type.equals("M1M1"))) { return false; diff --git a/src/main/java/forge/card/ability/ai/CountersPutAllAi.java b/src/main/java/forge/card/ability/ai/CountersPutAllAi.java index d63ac7b9e22..4648fb58747 100644 --- a/src/main/java/forge/card/ability/ai/CountersPutAllAi.java +++ b/src/main/java/forge/card/ability/ai/CountersPutAllAi.java @@ -7,7 +7,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -105,7 +104,7 @@ public class CountersPutAllAi extends SpellAbilityAi { } //Check for cards that could profit from the ability - PhaseHandler phase = Singletons.getModel().getGame().getPhaseHandler(); + PhaseHandler phase = ai.getGame().getPhaseHandler(); if (type.equals("P1P1") && sa.isAbility() && source.isCreature() && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost() && sa instanceof AbilitySub diff --git a/src/main/java/forge/card/ability/ai/CountersRemoveAi.java b/src/main/java/forge/card/ability/ai/CountersRemoveAi.java index 932bad6ebfa..66b508dd0ca 100644 --- a/src/main/java/forge/card/ability/ai/CountersRemoveAi.java +++ b/src/main/java/forge/card/ability/ai/CountersRemoveAi.java @@ -4,7 +4,6 @@ import java.util.Random; import forge.Card; import forge.CounterType; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; @@ -66,7 +65,7 @@ public class CountersRemoveAi extends SpellAbilityAi { return false; } - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) + if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases") && !type.equals("M1M1")) { return false; diff --git a/src/main/java/forge/card/ability/ai/DamageAiBase.java b/src/main/java/forge/card/ability/ai/DamageAiBase.java index 2729d8be16e..d0c44e7a781 100644 --- a/src/main/java/forge/card/ability/ai/DamageAiBase.java +++ b/src/main/java/forge/card/ability/ai/DamageAiBase.java @@ -6,9 +6,9 @@ import com.google.common.collect.Iterables; import forge.Card; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.ai.ComputerUtilCombat; import forge.game.phase.PhaseType; import forge.game.player.Player; @@ -17,6 +17,7 @@ import forge.game.zone.ZoneType; public abstract class DamageAiBase extends SpellAbilityAi { protected boolean shouldTgtP(final Player comp, final SpellAbility sa, final int d, final boolean noPrevention) { int restDamage = d; + final GameState game = comp.getGame(); final Player enemy = comp.getOpponent(); if (!sa.canTarget(enemy)) { return false; @@ -44,8 +45,8 @@ public abstract class DamageAiBase extends SpellAbilityAi { if (sa.isSpell()) { // If this is a spell, cast it instead of discarding - if ((Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.END_OF_TURN) || Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.MAIN2)) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(comp) && (hand.size() > comp.getMaxHandSize())) { + if ((game.getPhaseHandler().is(PhaseType.END_OF_TURN) || game.getPhaseHandler().is(PhaseType.MAIN2)) + && game.getPhaseHandler().isPlayerTurn(comp) && (hand.size() > comp.getMaxHandSize())) { return true; } } diff --git a/src/main/java/forge/card/ability/ai/DamageAllAi.java b/src/main/java/forge/card/ability/ai/DamageAllAi.java index 6a8ea75c1ef..8fe050b245a 100644 --- a/src/main/java/forge/card/ability/ai/DamageAllAi.java +++ b/src/main/java/forge/card/ability/ai/DamageAllAi.java @@ -8,7 +8,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -86,7 +85,7 @@ public class DamageAllAi extends SpellAbilityAi { } // wait until stack is empty (prevents duplicate kills) - if (!Singletons.getModel().getGame().getStack().isEmpty()) { + if (!ai.getGame().getStack().isEmpty()) { return false; } diff --git a/src/main/java/forge/card/ability/ai/DamageDealAi.java b/src/main/java/forge/card/ability/ai/DamageDealAi.java index baac5c59c1d..ef37ee912d0 100644 --- a/src/main/java/forge/card/ability/ai/DamageDealAi.java +++ b/src/main/java/forge/card/ability/ai/DamageDealAi.java @@ -8,13 +8,13 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCombat; @@ -81,7 +81,7 @@ public class DamageDealAi extends DamageAiBase { if (source.getName().equals("Stuffy Doll")) { // Now stuffy sits around for blocking // TODO(sol): this should also happen if Stuffy is going to die - return Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.END_OF_TURN, ai.getOpponent()); + return ai.getGame().getPhaseHandler().is(PhaseType.END_OF_TURN, ai.getOpponent()); } if (sa.isAbility()) { @@ -133,7 +133,7 @@ public class DamageDealAi extends DamageAiBase { final Player pl, final boolean mandatory) { // wait until stack is empty (prevents duplicate kills) - if (!saMe.isTrigger() && !Singletons.getModel().getGame().getStack().isEmpty()) { + if (!saMe.isTrigger() && !ai.getGame().getStack().isEmpty()) { return null; } final Target tgt = saMe.getTarget(); @@ -226,7 +226,8 @@ public class DamageDealAi extends DamageAiBase { final boolean isTrigger, final boolean mandatory) { final Card source = saMe.getSourceCard(); final boolean noPrevention = saMe.hasParam("NoPrevention"); - final PhaseHandler phase = Singletons.getModel().getGame().getPhaseHandler(); + final GameState game = source.getGame(); + final PhaseHandler phase = game.getPhaseHandler(); final boolean divided = saMe.hasParam("DividedAsYouChoose"); // target loop diff --git a/src/main/java/forge/card/ability/ai/DamagePreventAi.java b/src/main/java/forge/card/ability/ai/DamagePreventAi.java index 34907616167..2d625f66818 100644 --- a/src/main/java/forge/card/ability/ai/DamagePreventAi.java +++ b/src/main/java/forge/card/ability/ai/DamagePreventAi.java @@ -6,12 +6,12 @@ import java.util.List; import forge.Card; import forge.CardLists; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCombat; @@ -27,6 +27,7 @@ public class DamagePreventAi extends SpellAbilityAi { @Override protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) { final Card hostCard = sa.getSourceCard(); + final GameState game = ai.getGame(); boolean chance = false; final Cost cost = sa.getPayCosts(); @@ -56,7 +57,7 @@ public class DamagePreventAi extends SpellAbilityAi { sa.getParam("Defined"), sa); // react to threats on the stack - if (Singletons.getModel().getGame().getStack().size() > 0) { + if (game.getStack().size() > 0) { final ArrayList threatenedObjects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa); for (final Object o : objects) { if (threatenedObjects.contains(o)) { @@ -64,7 +65,7 @@ public class DamagePreventAi extends SpellAbilityAi { } } } else { - PhaseHandler handler = Singletons.getModel().getGame().getPhaseHandler(); + PhaseHandler handler = game.getPhaseHandler(); if (handler.is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { boolean flag = false; for (final Object o : objects) { @@ -75,8 +76,8 @@ public class DamagePreventAi extends SpellAbilityAi { // Don't need to worry about Combat Damage during AI's turn final Player p = (Player) o; if (!handler.isPlayerTurn(p)) { - flag |= (p == ai && ((ComputerUtilCombat.wouldLoseLife(ai, Singletons.getModel().getGame().getCombat()) && sa - .isAbility()) || ComputerUtilCombat.lifeInDanger(ai, Singletons.getModel().getGame().getCombat()))); + flag |= (p == ai && ((ComputerUtilCombat.wouldLoseLife(ai, game.getCombat()) && sa + .isAbility()) || ComputerUtilCombat.lifeInDanger(ai, game.getCombat()))); } } } @@ -90,7 +91,7 @@ public class DamagePreventAi extends SpellAbilityAi { } // targeted // react to threats on the stack - else if (Singletons.getModel().getGame().getStack().size() > 0) { + else if (game.getStack().size() > 0) { tgt.resetTargets(); // check stack for something on the stack will kill anything i // control @@ -118,10 +119,10 @@ public class DamagePreventAi extends SpellAbilityAi { } } // Protect combatants - else if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { - if (sa.canTarget(ai) && ComputerUtilCombat.wouldLoseLife(ai, Singletons.getModel().getGame().getCombat()) - && (ComputerUtilCombat.lifeInDanger(ai, Singletons.getModel().getGame().getCombat()) || sa.isAbility()) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai.getOpponent())) { + else if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { + if (sa.canTarget(ai) && ComputerUtilCombat.wouldLoseLife(ai, game.getCombat()) + && (ComputerUtilCombat.lifeInDanger(ai, game.getCombat()) || sa.isAbility()) + && game.getPhaseHandler().isPlayerTurn(ai.getOpponent())) { tgt.addTarget(ai); chance = true; } else { @@ -180,7 +181,8 @@ public class DamagePreventAi extends SpellAbilityAi { final Target tgt = sa.getTarget(); tgt.resetTargets(); // filter AIs battlefield by what I can target - List targetables = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final GameState game = ai.getGame(); + List targetables = game.getCardsIn(ZoneType.Battlefield); targetables = CardLists.getValidCards(targetables, tgt.getValidTgts(), ai, sa.getSourceCard()); final List compTargetables = CardLists.filterControlledBy(targetables, ai); @@ -195,7 +197,7 @@ public class DamagePreventAi extends SpellAbilityAi { if (compTargetables.size() > 0) { final List combatants = CardLists.filter(compTargetables, CardPredicates.Presets.CREATURES); CardLists.sortByEvaluateCreature(combatants); - if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { + if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { for (final Card c : combatants) { if (ComputerUtilCombat.combatantWouldBeDestroyed(ai, c)) { tgt.addTarget(c); diff --git a/src/main/java/forge/card/ability/ai/DamagePreventAllAi.java b/src/main/java/forge/card/ability/ai/DamagePreventAllAi.java index 69a7073126e..097212a7b46 100644 --- a/src/main/java/forge/card/ability/ai/DamagePreventAllAi.java +++ b/src/main/java/forge/card/ability/ai/DamagePreventAllAi.java @@ -2,7 +2,6 @@ package forge.card.ability.ai; import forge.Card; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; @@ -39,12 +38,12 @@ public class DamagePreventAllAi extends SpellAbilityAi { return false; } - if (Singletons.getModel().getGame().getStack().size() > 0) { + if (ai.getGame().getStack().size() > 0) { // TODO check stack for something on the stack will kill anything i // control } // Protect combatants - else if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { + else if (ai.getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { // TODO } diff --git a/src/main/java/forge/card/ability/ai/DebuffAi.java b/src/main/java/forge/card/ability/ai/DebuffAi.java index 6592bb7e6a6..73353c2f344 100644 --- a/src/main/java/forge/card/ability/ai/DebuffAi.java +++ b/src/main/java/forge/card/ability/ai/DebuffAi.java @@ -8,7 +8,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -52,12 +51,12 @@ public class DebuffAi extends SpellAbilityAi { } final SpellAbilityRestriction restrict = sa.getRestrictions(); - final PhaseHandler ph = Singletons.getModel().getGame().getPhaseHandler(); + final PhaseHandler ph = ai.getGame().getPhaseHandler(); // Phase Restrictions if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY) - || !Singletons.getModel().getGame().getStack().isEmpty()) { + || !ai.getGame().getStack().isEmpty()) { // Instant-speed pumps should not be cast outside of combat when the // stack is empty if (!SpellAbilityAi.isSorcerySpeed(sa)) { @@ -126,7 +125,7 @@ public class DebuffAi extends SpellAbilityAi { */ private boolean debuffTgtAI(final Player ai, final SpellAbility sa, final List kws, final boolean mandatory) { // this would be for evasive things like Flying, Unblockable, etc - if (!mandatory && Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { + if (!mandatory && ai.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { return false; } @@ -217,7 +216,7 @@ public class DebuffAi extends SpellAbilityAi { * @return a boolean. */ private boolean debuffMandatoryTarget(final Player ai, final SpellAbility sa, final boolean mandatory) { - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = ai.getGame().getCardsIn(ZoneType.Battlefield); final Target tgt = sa.getTarget(); list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); diff --git a/src/main/java/forge/card/ability/ai/DebuffAllAi.java b/src/main/java/forge/card/ability/ai/DebuffAllAi.java index 2a4dce2e8cc..860bf5e2d55 100644 --- a/src/main/java/forge/card/ability/ai/DebuffAllAi.java +++ b/src/main/java/forge/card/ability/ai/DebuffAllAi.java @@ -7,7 +7,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.game.phase.CombatUtil; @@ -49,7 +48,7 @@ public class DebuffAllAi extends SpellAbilityAi { }); // don't use DebuffAll after Combat_Begin until AI is improved - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) { + if (ai.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) { return false; } diff --git a/src/main/java/forge/card/ability/ai/DestroyAi.java b/src/main/java/forge/card/ability/ai/DestroyAi.java index 11b6058be3a..bfeb417f7bf 100644 --- a/src/main/java/forge/card/ability/ai/DestroyAi.java +++ b/src/main/java/forge/card/ability/ai/DestroyAi.java @@ -9,7 +9,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; import forge.CounterType; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -172,7 +171,7 @@ public class DestroyAi extends SpellAbilityAi { final Player opp = ai.getOpponent(); if (tgt != null) { List list; - list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + list = ai.getGame().getCardsIn(ZoneType.Battlefield); list = CardLists.getTargetableCards(list, sa); list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); diff --git a/src/main/java/forge/card/ability/ai/DigAi.java b/src/main/java/forge/card/ability/ai/DigAi.java index b44b50aeeff..6db09e3e195 100644 --- a/src/main/java/forge/card/ability/ai/DigAi.java +++ b/src/main/java/forge/card/ability/ai/DigAi.java @@ -2,7 +2,6 @@ package forge.card.ability.ai; import java.util.Random; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; @@ -47,7 +46,7 @@ public class DigAi extends SpellAbilityAi { } // Don't use draw abilities before main 2 if possible - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases") + if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases") && !sa.hasParam("DestinationZone")) { return false; } diff --git a/src/main/java/forge/card/ability/ai/DiscardAi.java b/src/main/java/forge/card/ability/ai/DiscardAi.java index 2ef1e2bc2ea..0ef106b9b67 100644 --- a/src/main/java/forge/card/ability/ai/DiscardAi.java +++ b/src/main/java/forge/card/ability/ai/DiscardAi.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Random; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -95,7 +94,7 @@ public class DiscardAi extends SpellAbilityAi { // TODO: Implement support for Discard AI for cards with AnyNumber set to true. // Don't use draw abilities before main 2 if possible - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) + if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases")) { return false; } diff --git a/src/main/java/forge/card/ability/ai/DrawAi.java b/src/main/java/forge/card/ability/ai/DrawAi.java index d7cff15a780..7ba870f3b53 100644 --- a/src/main/java/forge/card/ability/ai/DrawAi.java +++ b/src/main/java/forge/card/ability/ai/DrawAi.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Random; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -32,6 +31,7 @@ import forge.card.cost.PaymentDecision; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCost; import forge.game.ai.ComputerUtilMana; @@ -56,6 +56,7 @@ public class DrawAi extends SpellAbilityAi { final Target tgt = sa.getTarget(); final Card source = sa.getSourceCard(); final Cost abCost = sa.getPayCosts(); + final GameState game = ai.getGame(); if (abCost != null) { // AI currently disabled for these costs @@ -103,12 +104,12 @@ public class DrawAi extends SpellAbilityAi { } // Don't use draw abilities before main 2 if possible - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) + if (game.getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases")) { return false; } - if ((!Singletons.getModel().getGame().getPhaseHandler().getNextTurn().equals(ai) - || Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.END_OF_TURN)) + if ((!game.getPhaseHandler().getNextTurn().equals(ai) + || game.getPhaseHandler().getPhase().isBefore(PhaseType.END_OF_TURN)) && !sa.hasParam("PlayerTurn") && !SpellAbilityAi.isSorcerySpeed(sa) && ai.getCardsIn(ZoneType.Hand).size() > 1) { return false; @@ -126,8 +127,8 @@ public class DrawAi extends SpellAbilityAi { if (SpellAbilityAi.isSorcerySpeed(sa)) { randomReturn = true; } - if ((Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.END_OF_TURN) - && Singletons.getModel().getGame().getPhaseHandler().getNextTurn().equals(ai))) { + if ((game.getPhaseHandler().is(PhaseType.END_OF_TURN) + && game.getPhaseHandler().getNextTurn().equals(ai))) { randomReturn = true; } @@ -142,6 +143,7 @@ public class DrawAi extends SpellAbilityAi { final Target tgt = sa.getTarget(); final Card source = sa.getSourceCard(); final boolean drawback = (sa instanceof AbilitySub); + final GameState game = ai.getGame(); Player opp = ai.getOpponent(); int computerHandSize = ai.getCardsIn(ZoneType.Hand).size(); @@ -209,7 +211,7 @@ public class DrawAi extends SpellAbilityAi { } if (((computerHandSize + numCards) > computerMaxHandSize) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai)) { + && game.getPhaseHandler().isPlayerTurn(ai)) { if (xPaid) { numCards = computerMaxHandSize - computerHandSize; source.setSVar("PayX", Integer.toString(numCards)); @@ -247,7 +249,7 @@ public class DrawAi extends SpellAbilityAi { } if ((computerHandSize + numCards > computerMaxHandSize) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai) + && game.getPhaseHandler().isPlayerTurn(ai) && !sa.isTrigger()) { // Don't draw too many cards and then risk discarding cards at // EOT diff --git a/src/main/java/forge/card/ability/ai/EffectAi.java b/src/main/java/forge/card/ability/ai/EffectAi.java index 937afb351a5..89091693e7f 100644 --- a/src/main/java/forge/card/ability/ai/EffectAi.java +++ b/src/main/java/forge/card/ability/ai/EffectAi.java @@ -7,7 +7,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; @@ -25,7 +24,7 @@ import forge.util.MyRandom; public class EffectAi extends SpellAbilityAi { @Override protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) { - final GameState game = Singletons.getModel().getGame(); + final GameState game = ai.getGame(); final Random r = MyRandom.getRandom(); boolean randomReturn = r.nextFloat() <= .6667; final Player opp = ai.getOpponent(); diff --git a/src/main/java/forge/card/ability/ai/FogAi.java b/src/main/java/forge/card/ability/ai/FogAi.java index e6af2c41383..4155f1b5c6f 100644 --- a/src/main/java/forge/card/ability/ai/FogAi.java +++ b/src/main/java/forge/card/ability/ai/FogAi.java @@ -1,9 +1,9 @@ package forge.card.ability.ai; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.ai.ComputerUtilCombat; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; @@ -15,38 +15,40 @@ public class FogAi extends SpellAbilityAi { */ @Override protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) { + final GameState game = ai.getGame(); // AI should only activate this during Human's Declare Blockers phase - if (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) { + if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) { return false; } - if (!Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { + if (!game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { return false; } // Only cast when Stack is empty, so Human uses spells/abilities first - if (!Singletons.getModel().getGame().getStack().isEmpty()) { + if (!game.getStack().isEmpty()) { return false; } // Don't cast it, if the effect is already in place - if (Singletons.getModel().getGame().getPhaseHandler().isPreventCombatDamageThisTurn()) { + if (game.getPhaseHandler().isPreventCombatDamageThisTurn()) { return false; } // Cast it if life is in danger - return ComputerUtilCombat.lifeInDanger(ai, Singletons.getModel().getGame().getCombat()); + return ComputerUtilCombat.lifeInDanger(ai, game.getCombat()); } @Override public boolean chkAIDrawback(SpellAbility sa, AIPlayer ai) { // AI should only activate this during Human's turn boolean chance; + final GameState game = ai.getGame(); // should really check if other player is attacking this player - if (ai.isOpponentOf(Singletons.getModel().getGame().getPhaseHandler().getPlayerTurn())) { - chance = Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE); + if (ai.isOpponentOf(game.getPhaseHandler().getPlayerTurn())) { + chance = game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE); } else { - chance = Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DAMAGE); + chance = game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DAMAGE); } return chance; @@ -54,11 +56,12 @@ public class FogAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(AIPlayer aiPlayer, SpellAbility sa, boolean mandatory) { + final GameState game = aiPlayer.getGame(); boolean chance; - if (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer().getOpponent())) { - chance = Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE); + if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer().getOpponent())) { + chance = game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE); } else { - chance = Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DAMAGE); + chance = game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DAMAGE); } return chance; diff --git a/src/main/java/forge/card/ability/ai/LifeGainAi.java b/src/main/java/forge/card/ability/ai/LifeGainAi.java index 26b2797a0ca..285ba4e5345 100644 --- a/src/main/java/forge/card/ability/ai/LifeGainAi.java +++ b/src/main/java/forge/card/ability/ai/LifeGainAi.java @@ -3,13 +3,13 @@ package forge.card.ability.ai; import java.util.Random; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCombat; import forge.game.ai.ComputerUtilCost; @@ -34,6 +34,7 @@ public class LifeGainAi extends SpellAbilityAi { final Random r = MyRandom.getRandom(); final Cost abCost = sa.getPayCosts(); final Card source = sa.getSourceCard(); + final GameState game = source.getGame(); final int life = ai.getLife(); final String amountStr = sa.getParam("LifeAmount"); int lifeAmount = 0; @@ -62,13 +63,13 @@ public class LifeGainAi extends SpellAbilityAi { return false; } } - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS) + if (game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS) && !sa.hasParam("ActivationPhases")) { return false; } boolean lifeCritical = life <= 5; - lifeCritical |= (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DAMAGE) && ComputerUtilCombat - .lifeInDanger(ai, Singletons.getModel().getGame().getCombat())); + lifeCritical |= (game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DAMAGE) && ComputerUtilCombat + .lifeInDanger(ai, game.getCombat())); if (abCost != null && !lifeCritical) { if (!ComputerUtilCost.checkSacrificeCost(ai, abCost, source, false)) { @@ -93,13 +94,13 @@ public class LifeGainAi extends SpellAbilityAi { } // Don't use lifegain before main 2 if possible - if (!lifeCritical && Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) + if (!lifeCritical && game.getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases")) { return false; } // Don't use lifegain before main 2 if possible - if (!lifeCritical && (!Singletons.getModel().getGame().getPhaseHandler().getNextTurn().equals(ai) - || Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.END_OF_TURN)) + if (!lifeCritical && (!game.getPhaseHandler().getNextTurn().equals(ai) + || game.getPhaseHandler().getPhase().isBefore(PhaseType.END_OF_TURN)) && !sa.hasParam("PlayerTurn") && !SpellAbilityAi.isSorcerySpeed(sa)) { return false; } diff --git a/src/main/java/forge/card/ability/ai/LifeLoseAi.java b/src/main/java/forge/card/ability/ai/LifeLoseAi.java index 86e7a717cc4..2b3873d91ed 100644 --- a/src/main/java/forge/card/ability/ai/LifeLoseAi.java +++ b/src/main/java/forge/card/ability/ai/LifeLoseAi.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Random; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -110,7 +109,7 @@ public class LifeLoseAi extends SpellAbilityAi { } // Don't use loselife before main 2 if possible - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) + if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases") && !priority) { return false; } diff --git a/src/main/java/forge/card/ability/ai/LifeSetAi.java b/src/main/java/forge/card/ability/ai/LifeSetAi.java index 2023f3bba0e..33ddc1ce4c3 100644 --- a/src/main/java/forge/card/ability/ai/LifeSetAi.java +++ b/src/main/java/forge/card/ability/ai/LifeSetAi.java @@ -4,7 +4,6 @@ import java.util.Random; import forge.Card; import forge.CounterType; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; @@ -32,7 +31,7 @@ public class LifeSetAi extends SpellAbilityAi { } // Don't use setLife before main 2 if possible - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) + if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases")) { return false; } diff --git a/src/main/java/forge/card/ability/ai/MillAi.java b/src/main/java/forge/card/ability/ai/MillAi.java index 45f183b6505..49352ef5a66 100644 --- a/src/main/java/forge/card/ability/ai/MillAi.java +++ b/src/main/java/forge/card/ability/ai/MillAi.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Random; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -53,7 +52,7 @@ public class MillAi extends SpellAbilityAi { final Random r = MyRandom.getRandom(); // Don't use draw abilities before main 2 if possible - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases")) { + if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases")) { return false; } @@ -68,8 +67,7 @@ public class MillAi extends SpellAbilityAi { chance = .667; // 66.7% chance for sorcery speed } - if ((Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.END_OF_TURN) - && Singletons.getModel().getGame().getPhaseHandler().getNextTurn().equals(ai))) { + if ((ai.getGame().getPhaseHandler().is(PhaseType.END_OF_TURN) && ai.getGame().getPhaseHandler().getNextTurn().equals(ai))) { chance = .9; // 90% for end of opponents turn } diff --git a/src/main/java/forge/card/ability/ai/MustBlockAi.java b/src/main/java/forge/card/ability/ai/MustBlockAi.java index 1777fee8fdf..fb62bbe1eeb 100644 --- a/src/main/java/forge/card/ability/ai/MustBlockAi.java +++ b/src/main/java/forge/card/ability/ai/MustBlockAi.java @@ -7,7 +7,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; @@ -39,7 +38,7 @@ public class MustBlockAi extends SpellAbilityAi { final Target abTgt = sa.getTarget(); // only use on creatures that can attack - if (!Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)) { + if (!ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)) { return false; } diff --git a/src/main/java/forge/card/ability/ai/PermanentCreatureAi.java b/src/main/java/forge/card/ability/ai/PermanentCreatureAi.java index 978e86e224f..e6be91c1fde 100644 --- a/src/main/java/forge/card/ability/ai/PermanentCreatureAi.java +++ b/src/main/java/forge/card/ability/ai/PermanentCreatureAi.java @@ -7,7 +7,6 @@ import com.google.common.collect.Iterables; import forge.Card; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.game.GameState; @@ -28,7 +27,7 @@ public class PermanentCreatureAi extends SpellAbilityAi { @Override protected boolean canPlayAI(AIPlayer aiPlayer, SpellAbility sa) { String logic = sa.getParam("AILogic"); - GameState game = Singletons.getModel().getGame(); + GameState game = aiPlayer.getGame(); if ("ZeroToughness".equals(logic)) { // If Creature has Zero Toughness, make sure some static ability is in play diff --git a/src/main/java/forge/card/ability/ai/PermanentNoncreatureAi.java b/src/main/java/forge/card/ability/ai/PermanentNoncreatureAi.java index 8f556b98f3c..95de190e8e3 100644 --- a/src/main/java/forge/card/ability/ai/PermanentNoncreatureAi.java +++ b/src/main/java/forge/card/ability/ai/PermanentNoncreatureAi.java @@ -1,9 +1,7 @@ package forge.card.ability.ai; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; -import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; @@ -20,7 +18,6 @@ public class PermanentNoncreatureAi extends SpellAbilityAi { @Override protected boolean canPlayAI(AIPlayer aiPlayer, SpellAbility sa) { String logic = sa.getParam("AILogic"); - GameState game = Singletons.getModel().getGame(); if ("DontCast".equals(logic)) { return false; @@ -29,7 +26,7 @@ public class PermanentNoncreatureAi extends SpellAbilityAi { } // Wait for Main2 if possible - if (game.getPhaseHandler().is(PhaseType.MAIN1) + if (aiPlayer.getGame().getPhaseHandler().is(PhaseType.MAIN1) && !ComputerUtil.castPermanentInMain1(aiPlayer, sa)) { return false; } diff --git a/src/main/java/forge/card/ability/ai/PhasesAi.java b/src/main/java/forge/card/ability/ai/PhasesAi.java index 109ed45f6cb..ff2f157d08e 100644 --- a/src/main/java/forge/card/ability/ai/PhasesAi.java +++ b/src/main/java/forge/card/ability/ai/PhasesAi.java @@ -5,11 +5,11 @@ import java.util.Random; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.player.AIPlayer; import forge.game.zone.ZoneType; import forge.util.MyRandom; @@ -61,7 +61,7 @@ public class PhasesAi extends SpellAbilityAi { return true; } else if (mandatory) { // not enough preferred targets, but mandatory so keep going: - return phasesUnpreferredTargeting(sa, mandatory); + return phasesUnpreferredTargeting(aiPlayer.getGame(), sa, mandatory); } return false; @@ -133,12 +133,11 @@ public class PhasesAi extends SpellAbilityAi { * a boolean. * @return a boolean. */ - private boolean phasesUnpreferredTargeting(final SpellAbility sa, - final boolean mandatory) { + private boolean phasesUnpreferredTargeting(final GameState game, final SpellAbility sa, final boolean mandatory) { final Card source = sa.getSourceCard(); final Target tgt = sa.getTarget(); - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getTargetableCards(CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source), sa); return false; diff --git a/src/main/java/forge/card/ability/ai/PlayAi.java b/src/main/java/forge/card/ability/ai/PlayAi.java index 1302736e654..486c23d1bcc 100644 --- a/src/main/java/forge/card/ability/ai/PlayAi.java +++ b/src/main/java/forge/card/ability/ai/PlayAi.java @@ -6,7 +6,6 @@ import java.util.Random; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -47,7 +46,7 @@ public class PlayAi extends SpellAbilityAi { } // don't use this as a response - if (!Singletons.getModel().getGame().getStack().isEmpty()) { + if (!ai.getGame().getStack().isEmpty()) { return false; } @@ -58,7 +57,7 @@ public class PlayAi extends SpellAbilityAi { final Target tgt = sa.getTarget(); if (tgt != null) { ZoneType zone = tgt.getZone().get(0); - cards = CardLists.getValidCards(Singletons.getModel().getGame().getCardsIn(zone), tgt.getValidTgts(), ai, source); + cards = CardLists.getValidCards(ai.getGame().getCardsIn(zone), tgt.getValidTgts(), ai, source); if (cards.isEmpty()) { return false; } diff --git a/src/main/java/forge/card/ability/ai/PoisonAi.java b/src/main/java/forge/card/ability/ai/PoisonAi.java index b179005fa96..80f3023f93c 100644 --- a/src/main/java/forge/card/ability/ai/PoisonAi.java +++ b/src/main/java/forge/card/ability/ai/PoisonAi.java @@ -3,7 +3,6 @@ package forge.card.ability.ai; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -51,7 +50,7 @@ public class PoisonAi extends SpellAbilityAi { } // Don't use poison before main 2 if possible - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) + if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases")) { return false; } diff --git a/src/main/java/forge/card/ability/ai/ProtectAi.java b/src/main/java/forge/card/ability/ai/ProtectAi.java index aed7f6808bb..aeab8d6cf07 100644 --- a/src/main/java/forge/card/ability/ai/ProtectAi.java +++ b/src/main/java/forge/card/ability/ai/ProtectAi.java @@ -8,7 +8,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; import forge.Constant; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -68,7 +67,7 @@ public class ProtectAi extends SpellAbilityAi { */ private static List getProtectCreatures(final Player ai, final SpellAbility sa) { final ArrayList gains = AbilityUtils.getProtectionList(sa); - final GameState game = Singletons.getModel().getGame(); + final GameState game = ai.getGame(); List list = ai.getCreaturesInPlay(); list = CardLists.filter(list, new Predicate() { @@ -113,6 +112,7 @@ public class ProtectAi extends SpellAbilityAi { @Override protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) { final Card hostCard = sa.getSourceCard(); + final GameState game = ai.getGame(); // if there is no target and host card isn't in play, don't activate if ((sa.getTarget() == null) && !hostCard.isInPlay()) { return false; @@ -138,13 +138,13 @@ public class ProtectAi extends SpellAbilityAi { } // Phase Restrictions - if ((Singletons.getModel().getGame().getStack().size() == 0) && Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE)) { + if ((game.getStack().size() == 0) && game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE)) { // Instant-speed protections should not be cast outside of combat // when the stack is empty if (!SpellAbilityAi.isSorcerySpeed(sa)) { return false; } - } else if (Singletons.getModel().getGame().getStack().size() > 0) { + } else if (game.getStack().size() > 0) { // TODO protection something only if the top thing on the stack will // kill it via damage or destroy return false; @@ -172,7 +172,8 @@ public class ProtectAi extends SpellAbilityAi { } // protectPlayAI() private boolean protectTgtAI(final Player ai, final SpellAbility sa, final boolean mandatory) { - if (!mandatory && Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { + final GameState game = ai.getGame(); + if (!mandatory && game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { return false; } @@ -195,16 +196,16 @@ public class ProtectAi extends SpellAbilityAi { * Or, add protection (to make it unblockable) when Compy is attacking. */ - if (Singletons.getModel().getGame().getStack().isEmpty()) { + if (game.getStack().isEmpty()) { // If the cost is tapping, don't activate before declare // attack/block if ((sa.getPayCosts() != null) && sa.getPayCosts().hasTapCost()) { - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai)) { + if (game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) + && game.getPhaseHandler().isPlayerTurn(ai)) { list.remove(sa.getSourceCard()); } - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai)) { + if (game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS) + && game.getPhaseHandler().isPlayerTurn(ai)) { list.remove(sa.getSourceCard()); } } @@ -250,9 +251,9 @@ public class ProtectAi extends SpellAbilityAi { } // protectTgtAI() private static boolean protectMandatoryTarget(final Player ai, final SpellAbility sa, final boolean mandatory) { + final GameState game = ai.getGame(); - - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = game.getCardsIn(ZoneType.Battlefield); final Target tgt = sa.getTarget(); list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); diff --git a/src/main/java/forge/card/ability/ai/PumpAi.java b/src/main/java/forge/card/ability/ai/PumpAi.java index 77e9e5e113c..36f69f3a985 100644 --- a/src/main/java/forge/card/ability/ai/PumpAi.java +++ b/src/main/java/forge/card/ability/ai/PumpAi.java @@ -9,7 +9,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; import forge.CardPredicates.Presets; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -18,6 +17,7 @@ import forge.card.cost.CostTapType; import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityRestriction; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCost; @@ -49,7 +49,8 @@ public class PumpAi extends PumpAiBase { @Override protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) { final Cost cost = sa.getPayCosts(); - final PhaseHandler ph = Singletons.getModel().getGame().getPhaseHandler(); + final GameState game = ai.getGame(); + final PhaseHandler ph = game.getPhaseHandler(); final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) : new ArrayList(); final String numDefense = sa.hasParam("NumDef") ? sa.getParam("NumDef") : ""; final String numAttack = sa.hasParam("NumAtt") ? sa.getParam("NumAtt") : ""; @@ -70,7 +71,7 @@ public class PumpAi extends PumpAiBase { return false; } - if (Singletons.getModel().getGame().getStack().isEmpty() && hasTapCost(cost, sa.getSourceCard())) { + if (game.getStack().isEmpty() && hasTapCost(cost, sa.getSourceCard())) { if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) && ph.isPlayerTurn(ai)) { return false; } @@ -83,13 +84,13 @@ public class PumpAi extends PumpAiBase { } // Phase Restrictions - if ((Singletons.getModel().getGame().getStack().size() == 0) && ph.getPhase().isBefore(PhaseType.COMBAT_BEGIN)) { + if ((game.getStack().size() == 0) && ph.getPhase().isBefore(PhaseType.COMBAT_BEGIN)) { // Instant-speed pumps should not be cast outside of combat when the // stack is empty if (!sa.isCurse() && !SpellAbilityAi.isSorcerySpeed(sa)) { return false; } - } else if (Singletons.getModel().getGame().getStack().size() > 0) { + } else if (game.getStack().size() > 0) { if (!keywords.contains("Shroud") && !keywords.contains("Hexproof")) { return false; } @@ -181,10 +182,11 @@ public class PumpAi extends PumpAiBase { private boolean pumpTgtAI(final Player ai, final SpellAbility sa, final int defense, final int attack, final boolean mandatory) { final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) : new ArrayList(); + final GameState game = ai.getGame(); if (!mandatory && !sa.isTrigger() - && Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY) + && game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY) && !(sa.isCurse() && (defense < 0)) && !this.containsNonCombatKeyword(keywords) && !sa.hasParam("UntilYourNextTurn")) { @@ -197,7 +199,7 @@ public class PumpAi extends PumpAiBase { List list = new ArrayList(); if (sa.hasParam("AILogic")) { if (sa.getParam("AILogic").equals("HighestPower")) { - list = CardLists.getValidCards(CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES), tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); + list = CardLists.getValidCards(CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES), tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); list = CardLists.getTargetableCards(list, sa); CardLists.sortByPowerDesc(list); if (!list.isEmpty()) { @@ -216,7 +218,7 @@ public class PumpAi extends PumpAiBase { } else { if (!tgt.canTgtCreature()) { ZoneType zone = tgt.getZone().get(0); - list = Singletons.getModel().getGame().getCardsIn(zone); + list = game.getCardsIn(zone); } else { list = this.getPumpCreatures(ai, sa, defense, attack, keywords); } @@ -227,16 +229,16 @@ public class PumpAi extends PumpAiBase { } list = CardLists.getValidCards(list, tgt.getValidTgts(), ai, sa.getSourceCard()); - if (Singletons.getModel().getGame().getStack().size() == 0) { + if (game.getStack().size() == 0) { // If the cost is tapping, don't activate before declare // attack/block if ((sa.getPayCosts() != null) && sa.getPayCosts().hasTapCost()) { - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai)) { + if (game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) + && game.getPhaseHandler().isPlayerTurn(ai)) { list.remove(sa.getSourceCard()); } - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(opp)) { + if (game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS) + && game.getPhaseHandler().isPlayerTurn(opp)) { list.remove(sa.getSourceCard()); } } @@ -283,7 +285,8 @@ public class PumpAi extends PumpAiBase { } // pumpTgtAI() private boolean pumpMandatoryTarget(final Player ai, final SpellAbility sa, final boolean mandatory) { - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final GameState game = ai.getGame(); + List list = game.getCardsIn(ZoneType.Battlefield); final Target tgt = sa.getTarget(); final Player opp = ai.getOpponent(); list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); diff --git a/src/main/java/forge/card/ability/ai/PumpAiBase.java b/src/main/java/forge/card/ability/ai/PumpAiBase.java index 9921cb8a9fb..4345bb0dfc6 100644 --- a/src/main/java/forge/card/ability/ai/PumpAiBase.java +++ b/src/main/java/forge/card/ability/ai/PumpAiBase.java @@ -11,7 +11,6 @@ import forge.Card; import forge.CardLists; import forge.CardPredicates; import forge.CardUtil; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.game.GameState; @@ -52,7 +51,8 @@ public abstract class PumpAiBase extends SpellAbilityAi { * @return true, if is useful keyword */ public boolean isUsefulCurseKeyword(final Player ai, final String keyword, final Card card, final SpellAbility sa) { - final PhaseHandler ph = Singletons.getModel().getGame().getPhaseHandler(); + final GameState game = ai.getGame(); + final PhaseHandler ph = game.getPhaseHandler(); final Player human = ai.getOpponent(); //int attack = getNumAttack(sa); //int defense = getNumDefense(sa); @@ -157,7 +157,8 @@ public abstract class PumpAiBase extends SpellAbilityAi { * @return true, if is useful keyword */ public boolean isUsefulPumpKeyword(final Player ai, final String keyword, final Card card, final SpellAbility sa, final int attack) { - final PhaseHandler ph = Singletons.getModel().getGame().getPhaseHandler(); + final GameState game = ai.getGame(); + final PhaseHandler ph = game.getPhaseHandler(); final Player opp = ai.getOpponent(); //int defense = getNumDefense(sa); if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) { @@ -179,10 +180,10 @@ public abstract class PumpAiBase extends SpellAbilityAi { } else if (keyword.endsWith("Flying")) { if (ph.isPlayerTurn(opp) && ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY) - && !CardLists.getKeyword(Singletons.getModel().getGame().getCombat().getAttackers(), "Flying").isEmpty() + && !CardLists.getKeyword(game.getCombat().getAttackers(), "Flying").isEmpty() && !card.hasKeyword("Reach") && CombatUtil.canBlock(card) - && ComputerUtilCombat.lifeInDanger(ai, Singletons.getModel().getGame().getCombat())) { + && ComputerUtilCombat.lifeInDanger(ai, game.getCombat())) { return true; } Predicate flyingOrReach = Predicates.or(CardPredicates.hasKeyword("Flying"), CardPredicates.hasKeyword("Reach")); @@ -196,9 +197,9 @@ public abstract class PumpAiBase extends SpellAbilityAi { } else if (keyword.endsWith("Horsemanship")) { if (ph.isPlayerTurn(opp) && ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY) - && !CardLists.getKeyword(Singletons.getModel().getGame().getCombat().getAttackers(), "Horsemanship").isEmpty() + && !CardLists.getKeyword(game.getCombat().getAttackers(), "Horsemanship").isEmpty() && CombatUtil.canBlock(card) - && ComputerUtilCombat.lifeInDanger(ai, Singletons.getModel().getGame().getCombat())) { + && ComputerUtilCombat.lifeInDanger(ai, game.getCombat())) { return true; } if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || card.isAttacking()) @@ -219,7 +220,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { } else if (keyword.endsWith("Indestructible")) { return true; } else if (keyword.endsWith("Deathtouch")) { - Combat combat = Singletons.getModel().getGame().getCombat(); + Combat combat = game.getCombat(); if (ph.isPlayerTurn(opp) && ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY)) { List attackers = combat.getAttackers(); for (Card attacker : attackers) { @@ -312,7 +313,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { } else if (keyword.equals("Reach")) { if (ph.isPlayerTurn(ai) || !ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY) - || CardLists.getKeyword(Singletons.getModel().getGame().getCombat().getAttackers(), "Flying").isEmpty() + || CardLists.getKeyword(game.getCombat().getAttackers(), "Flying").isEmpty() || card.hasKeyword("Flying") || !CombatUtil.canBlock(card)) { return false; @@ -324,7 +325,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { } int canBlockNum = 1 + card.getKeywordAmount("CARDNAME can block an additional creature."); int possibleBlockNum = 0; - for (Card attacker : Singletons.getModel().getGame().getCombat().getAttackers()) { + for (Card attacker : game.getCombat().getAttackers()) { if (CombatUtil.canBlock(attacker, card)) { possibleBlockNum++; if (possibleBlockNum > canBlockNum) { @@ -383,7 +384,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { protected boolean shouldPumpCard(final Player ai, final SpellAbility sa, final Card c, final int defense, final int attack, final List keywords) { - final GameState game = Singletons.getModel().getGame(); + final GameState game = ai.getGame(); PhaseHandler phase = game.getPhaseHandler(); if (!c.canBeTargetedBy(sa)) { @@ -413,7 +414,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { if (defense > 0 && ComputerUtilCombat.blockerWouldBeDestroyed(ai, c)) { return true; } - List blockedBy = Singletons.getModel().getGame().getCombat().getAttackersBlockedBy(c); + List blockedBy = game.getCombat().getAttackersBlockedBy(c); // For now, Only care the first creature blocked by a card. // TODO Add in better BlockAdditional support if (!blockedBy.isEmpty() && attack > 0 && !ComputerUtilCombat.attackerWouldBeDestroyed(ai, blockedBy.get(0))) { @@ -490,6 +491,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { */ protected List getCurseCreatures(final Player ai, final SpellAbility sa, final int defense, final int attack, final List keywords) { List list = ai.getOpponent().getCreaturesInPlay(); + final GameState game = ai.getGame(); list = CardLists.getTargetableCards(list, sa); if (list.isEmpty()) { @@ -507,11 +509,11 @@ public abstract class PumpAiBase extends SpellAbilityAi { } }); // leaves all creatures that will be destroyed } // -X/-X end - else if (attack < 0 && !Singletons.getModel().getGame().getPhaseHandler().isPreventCombatDamageThisTurn()) { + else if (attack < 0 && !game.getPhaseHandler().isPreventCombatDamageThisTurn()) { // spells that give -X/0 - boolean isMyTurn = Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai); + boolean isMyTurn = game.getPhaseHandler().isPlayerTurn(ai); if (isMyTurn) { - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_BEGIN)) { + if (game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_BEGIN)) { // TODO: Curse creatures that will block AI's creatures, if AI is going to attack. list = new ArrayList(); } else { @@ -519,7 +521,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { } } else { // Human active, only curse attacking creatures - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { + if (game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { diff --git a/src/main/java/forge/card/ability/ai/PumpAllAi.java b/src/main/java/forge/card/ability/ai/PumpAllAi.java index 74bea8da8c2..133069dc86f 100644 --- a/src/main/java/forge/card/ability/ai/PumpAllAi.java +++ b/src/main/java/forge/card/ability/ai/PumpAllAi.java @@ -8,10 +8,10 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCombat; @@ -30,12 +30,13 @@ public class PumpAllAi extends PumpAiBase { protected boolean canPlayAI(final AIPlayer ai, final SpellAbility sa) { String valid = ""; final Card source = sa.getSourceCard(); + final GameState game = ai.getGame(); final int power = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumAtt"), sa); final int defense = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumDef"), sa); final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) : new ArrayList(); - final PhaseType phase = Singletons.getModel().getGame().getPhaseHandler().getPhase(); + final PhaseType phase = game.getPhaseHandler().getPhase(); if (ComputerUtil.preventRunAwayActivations(sa)) { return false; @@ -80,8 +81,8 @@ public class PumpAllAi extends PumpAiBase { else if (power < 0) { // -X/-0 if (phase.isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY) || phase.isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY) - || Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer()) - || Singletons.getModel().getGame().getPhaseHandler().isPreventCombatDamageThisTurn()) { + || game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer()) + || game.getPhaseHandler().isPreventCombatDamageThisTurn()) { return false; } int totalPower = 0; @@ -91,8 +92,8 @@ public class PumpAllAi extends PumpAiBase { } totalPower += Math.min(c.getNetAttack(), power * -1); if (phase == PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY - && Singletons.getModel().getGame().getCombat().getUnblockedAttackers().contains(c)) { - if (ComputerUtilCombat.lifeInDanger(sa.getActivatingPlayer(), Singletons.getModel().getGame().getCombat())) { + && game.getCombat().getUnblockedAttackers().contains(c)) { + if (ComputerUtilCombat.lifeInDanger(sa.getActivatingPlayer(), game.getCombat())) { return true; } totalPower += Math.min(c.getNetAttack(), power * -1); diff --git a/src/main/java/forge/card/ability/ai/RegenerateAi.java b/src/main/java/forge/card/ability/ai/RegenerateAi.java index 42e45397e45..39208cc127c 100644 --- a/src/main/java/forge/card/ability/ai/RegenerateAi.java +++ b/src/main/java/forge/card/ability/ai/RegenerateAi.java @@ -23,12 +23,12 @@ import java.util.List; import forge.Card; import forge.CardLists; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCombat; @@ -59,8 +59,10 @@ public class RegenerateAi extends SpellAbilityAi { @Override protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) { final Card hostCard = sa.getSourceCard(); - boolean chance = false; final Cost abCost = sa.getPayCosts(); + final GameState game = ai.getGame(); + + boolean chance = false; if (abCost != null) { // AI currently disabled for these costs if (!ComputerUtilCost.checkLifeCost(ai, abCost, hostCard, 4, null)) { @@ -82,7 +84,7 @@ public class RegenerateAi extends SpellAbilityAi { // them final List list = AbilityUtils.getDefinedCards(hostCard, sa.getParam("Defined"), sa); - if (Singletons.getModel().getGame().getStack().size() > 0) { + if (game.getStack().size() > 0) { final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa); for (final Card c : list) { @@ -91,7 +93,7 @@ public class RegenerateAi extends SpellAbilityAi { } } } else { - if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { + if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { boolean flag = false; for (final Card c : list) { @@ -116,7 +118,7 @@ public class RegenerateAi extends SpellAbilityAi { return false; } - if (Singletons.getModel().getGame().getStack().size() > 0) { + if (game.getStack().size() > 0) { // check stack for something on the stack will kill anything i // control final ArrayList objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa); @@ -135,7 +137,7 @@ public class RegenerateAi extends SpellAbilityAi { chance = true; } } else { - if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { + if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { final List combatants = CardLists.filter(targetables, CardPredicates.Presets.CREATURES); CardLists.sortByEvaluateCreature(combatants); @@ -173,10 +175,11 @@ public class RegenerateAi extends SpellAbilityAi { private static boolean regenMandatoryTarget(final Player ai, final SpellAbility sa, final boolean mandatory) { final Card hostCard = sa.getSourceCard(); + final GameState game = ai.getGame(); final Target tgt = sa.getTarget(); tgt.resetTargets(); // filter AIs battlefield by what I can target - List targetables = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List targetables = game.getCardsIn(ZoneType.Battlefield); targetables = CardLists.getValidCards(targetables, tgt.getValidTgts(), ai, hostCard); targetables = CardLists.getTargetableCards(targetables, sa); final List compTargetables = CardLists.filterControlledBy(targetables, ai); @@ -192,7 +195,7 @@ public class RegenerateAi extends SpellAbilityAi { if (compTargetables.size() > 0) { final List combatants = CardLists.filter(compTargetables, CardPredicates.Presets.CREATURES); CardLists.sortByEvaluateCreature(combatants); - if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { + if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { for (final Card c : combatants) { if ((c.getShield() == 0) && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c)) { tgt.addTarget(c); diff --git a/src/main/java/forge/card/ability/ai/RegenerateAllAi.java b/src/main/java/forge/card/ability/ai/RegenerateAllAi.java index 2ad08b200b1..f6fe6f84ff5 100644 --- a/src/main/java/forge/card/ability/ai/RegenerateAllAi.java +++ b/src/main/java/forge/card/ability/ai/RegenerateAllAi.java @@ -6,10 +6,10 @@ import java.util.List; import forge.Card; import forge.CardLists; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCombat; import forge.game.ai.ComputerUtilCost; @@ -24,6 +24,7 @@ public class RegenerateAllAi extends SpellAbilityAi { final Card hostCard = sa.getSourceCard(); boolean chance = false; final Cost abCost = sa.getPayCosts(); + final GameState game = ai.getGame(); if (abCost != null) { // AI currently disabled for these costs if (!ComputerUtilCost.checkSacrificeCost(ai, abCost, hostCard)) { @@ -46,7 +47,7 @@ public class RegenerateAllAi extends SpellAbilityAi { valid = sa.getParam("ValidCards"); } - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard); list = CardLists.filter(list, CardPredicates.isController(ai)); @@ -55,7 +56,7 @@ public class RegenerateAllAi extends SpellAbilityAi { } int numSaved = 0; - if (Singletons.getModel().getGame().getStack().size() > 0) { + if (game.getStack().size() > 0) { final ArrayList objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa); for (final Card c : list) { @@ -64,7 +65,7 @@ public class RegenerateAllAi extends SpellAbilityAi { } } } else { - if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { + if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY)) { final List combatants = CardLists.filter(list, CardPredicates.Presets.CREATURES); for (final Card c : combatants) { diff --git a/src/main/java/forge/card/ability/ai/StoreSVarAi.java b/src/main/java/forge/card/ability/ai/StoreSVarAi.java index 252345b6d14..8a75e0c7ed2 100644 --- a/src/main/java/forge/card/ability/ai/StoreSVarAi.java +++ b/src/main/java/forge/card/ability/ai/StoreSVarAi.java @@ -1,7 +1,6 @@ package forge.card.ability.ai; import forge.Card; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.game.ai.ComputerUtil; @@ -16,7 +15,7 @@ public class StoreSVarAi extends SpellAbilityAi { final Card source = sa.getSourceCard(); if (ComputerUtil.waitForBlocking(sa) || ai.getLife() + 1 >= source.getNetDefense() - || (ai.getLife() > 5 && !ComputerUtilCombat.lifeInSeriousDanger(ai, Singletons.getModel().getGame().getCombat()))) { + || (ai.getLife() > 5 && !ComputerUtilCombat.lifeInSeriousDanger(ai, ai.getGame().getCombat()))) { return false; } diff --git a/src/main/java/forge/card/ability/ai/TapAi.java b/src/main/java/forge/card/ability/ai/TapAi.java index 29f40ffb98c..4ee43aa03e9 100644 --- a/src/main/java/forge/card/ability/ai/TapAi.java +++ b/src/main/java/forge/card/ability/ai/TapAi.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Random; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; @@ -19,7 +18,7 @@ public class TapAi extends TapAiBase { @Override protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) { - final PhaseHandler phase = Singletons.getModel().getGame().getPhaseHandler(); + final PhaseHandler phase = ai.getGame().getPhaseHandler(); final Player turn = phase.getPlayerTurn(); if (turn.isOpponentOf(ai) && phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { diff --git a/src/main/java/forge/card/ability/ai/TapAiBase.java b/src/main/java/forge/card/ability/ai/TapAiBase.java index 238c8f78543..5f075786ad4 100644 --- a/src/main/java/forge/card/ability/ai/TapAiBase.java +++ b/src/main/java/forge/card/ability/ai/TapAiBase.java @@ -9,10 +9,10 @@ import forge.Card; import forge.CardLists; import forge.CardPredicates; import forge.CardPredicates.Presets; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCard; import forge.game.phase.CombatUtil; @@ -115,6 +115,7 @@ public abstract class TapAiBase extends SpellAbilityAi { */ protected boolean tapPrefTargeting(final Player ai, final Card source, final Target tgt, final SpellAbility sa, final boolean mandatory) { final Player opp = ai.getOpponent(); + final GameState game = ai.getGame(); List tapList = opp.getCardsIn(ZoneType.Battlefield); tapList = CardLists.filter(tapList, Presets.UNTAPPED); tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source); @@ -159,7 +160,7 @@ public abstract class TapAiBase extends SpellAbilityAi { } } - PhaseHandler phase = Singletons.getModel().getGame().getPhaseHandler(); + PhaseHandler phase = game.getPhaseHandler(); if (phase.isPlayerTurn(ai) && phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { // Tap creatures possible blockers before combat during AI's turn. @@ -167,7 +168,7 @@ public abstract class TapAiBase extends SpellAbilityAi { List attackers; if (phase.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { //Combat has already started - attackers = Singletons.getModel().getGame().getCombat().getAttackers(); + attackers = game.getCombat().getAttackers(); } else { attackers = CardLists.filter(ai.getCreaturesInPlay(), new Predicate() { @Override @@ -240,8 +241,9 @@ public abstract class TapAiBase extends SpellAbilityAi { protected boolean tapUnpreferredTargeting(final Player ai, final SpellAbility sa, final boolean mandatory) { final Card source = sa.getSourceCard(); final Target tgt = sa.getTarget(); + final GameState game = ai.getGame(); - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); list = CardLists.getTargetableCards(list, sa); diff --git a/src/main/java/forge/card/ability/ai/TapAllAi.java b/src/main/java/forge/card/ability/ai/TapAllAi.java index 38061a9647d..d66c4e3f7a8 100644 --- a/src/main/java/forge/card/ability/ai/TapAllAi.java +++ b/src/main/java/forge/card/ability/ai/TapAllAi.java @@ -9,10 +9,10 @@ import com.google.common.collect.Iterables; import forge.Card; import forge.CardLists; import forge.CardPredicates.Presets; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.phase.CombatUtil; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; @@ -33,8 +33,9 @@ public class TapAllAi extends SpellAbilityAi { final Card source = sa.getSourceCard(); final Player opp = ai.getOpponent(); + final GameState game = ai.getGame(); - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) { + if (game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_BEGIN)) { return false; } @@ -43,7 +44,7 @@ public class TapAllAi extends SpellAbilityAi { valid = sa.getParam("ValidCards"); } - List validTappables = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List validTappables = game.getCardsIn(ZoneType.Battlefield); final Target tgt = sa.getTarget(); @@ -81,7 +82,7 @@ public class TapAllAi extends SpellAbilityAi { return false; } // in AI's turn, check if there are possible attackers, before tapping blockers - if (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai) && !SpellAbilityAi.isSorcerySpeed(sa)) { + if (game.getPhaseHandler().isPlayerTurn(ai) && !SpellAbilityAi.isSorcerySpeed(sa)) { validTappables = ai.getCardsIn(ZoneType.Battlefield); final boolean any = Iterables.any(validTappables, new Predicate() { @Override @@ -108,7 +109,8 @@ public class TapAllAi extends SpellAbilityAi { * @return a {@link forge.CardList} object. */ private List getTapAllTargets(final String valid, final Card source) { - List tmpList = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final GameState game = source.getGame(); + List tmpList = game.getCardsIn(ZoneType.Battlefield); tmpList = CardLists.getValidCards(tmpList, valid, source.getController(), source); tmpList = CardLists.filter(tmpList, Presets.UNTAPPED); return tmpList; diff --git a/src/main/java/forge/card/ability/ai/TokenAi.java b/src/main/java/forge/card/ability/ai/TokenAi.java index 1360c38c576..af26dd38a1f 100644 --- a/src/main/java/forge/card/ability/ai/TokenAi.java +++ b/src/main/java/forge/card/ability/ai/TokenAi.java @@ -3,12 +3,12 @@ package forge.card.ability.ai; import java.util.Random; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCost; import forge.game.ai.ComputerUtilMana; @@ -67,6 +67,7 @@ public class TokenAi extends SpellAbilityAi { @Override protected boolean canPlayAI(AIPlayer ai, SpellAbility sa) { final Cost cost = sa.getPayCosts(); + final GameState game = ai.getGame(); readParameters(sa); if (ComputerUtil.preventRunAwayActivations(sa)) { @@ -95,7 +96,7 @@ public class TokenAi extends SpellAbilityAi { } } - PhaseHandler ph = Singletons.getModel().getGame().getPhaseHandler(); + PhaseHandler ph = game.getPhaseHandler(); // Don't generate tokens without haste before main 2 if possible if (ph.getPhase().isBefore(PhaseType.MAIN2) && ph.isPlayerTurn(ai) && !haste @@ -109,7 +110,7 @@ public class TokenAi extends SpellAbilityAi { && !SpellAbilityAi.isSorcerySpeed(sa) && !haste) { return false; } - if ((ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) || Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn( + if ((ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) || game.getPhaseHandler().isPlayerTurn( opp)) && oneShot) { return false; @@ -163,7 +164,7 @@ public class TokenAi extends SpellAbilityAi { return true; } - if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY)) { + if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY)) { return true; } if (sa.isAbility()) { diff --git a/src/main/java/forge/card/ability/ai/UnattachAllAi.java b/src/main/java/forge/card/ability/ai/UnattachAllAi.java index 9878d54bb67..782e5122455 100644 --- a/src/main/java/forge/card/ability/ai/UnattachAllAi.java +++ b/src/main/java/forge/card/ability/ai/UnattachAllAi.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.Random; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -51,7 +50,7 @@ public class UnattachAllAi extends SpellAbilityAi { source.setSVar("PayX", Integer.toString(xPay)); } - if (Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY) + if (ai.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY) && !"Curse".equals(sa.getParam("AILogic"))) { return false; } diff --git a/src/main/java/forge/card/ability/ai/UntapAi.java b/src/main/java/forge/card/ability/ai/UntapAi.java index 3d30f3dd7be..301cb8f2258 100644 --- a/src/main/java/forge/card/ability/ai/UntapAi.java +++ b/src/main/java/forge/card/ability/ai/UntapAi.java @@ -6,7 +6,6 @@ import java.util.Random; import forge.Card; import forge.CardLists; import forge.CardPredicates.Presets; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; import forge.card.cost.Cost; @@ -187,12 +186,11 @@ public class UntapAi extends SpellAbilityAi { * a boolean. * @return a boolean. */ - private boolean untapUnpreferredTargeting(final SpellAbility sa, - final boolean mandatory) { + private boolean untapUnpreferredTargeting(final SpellAbility sa, final boolean mandatory) { final Card source = sa.getSourceCard(); final Target tgt = sa.getTarget(); - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = sa.getActivatingPlayer().getGame().getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); list = CardLists.getTargetableCards(list, sa); diff --git a/src/main/java/forge/card/ability/ai/UntapAllAi.java b/src/main/java/forge/card/ability/ai/UntapAllAi.java index 8cf2becbcd9..72acab5402b 100644 --- a/src/main/java/forge/card/ability/ai/UntapAllAi.java +++ b/src/main/java/forge/card/ability/ai/UntapAllAi.java @@ -4,7 +4,6 @@ import java.util.List; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; @@ -20,7 +19,7 @@ public class UntapAllAi extends SpellAbilityAi { final AbilitySub abSub = sa.getSubAbility(); if (abSub != null) { String valid = ""; - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = aiPlayer.getGame().getCardsIn(ZoneType.Battlefield); if (sa.hasParam("ValidCards")) { valid = sa.getParam("ValidCards"); } diff --git a/src/main/java/forge/card/ability/effects/AbandonEffect.java b/src/main/java/forge/card/ability/effects/AbandonEffect.java index 16bb6f44bc5..4370a0b28b6 100644 --- a/src/main/java/forge/card/ability/effects/AbandonEffect.java +++ b/src/main/java/forge/card/ability/effects/AbandonEffect.java @@ -1,8 +1,6 @@ package forge.card.ability.effects; - import forge.Card; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.trigger.TriggerType; @@ -12,7 +10,6 @@ import forge.game.zone.ZoneType; public class AbandonEffect extends SpellAbilityEffect { - private GameState game = Singletons.getModel().getGame(); /* (non-Javadoc) * @see forge.card.abilityfactory.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility) @@ -22,6 +19,8 @@ public class AbandonEffect extends SpellAbilityEffect { Card source = sa.getSourceCard(); Player controller = source.getController(); + final GameState game = controller.getGame(); + game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); controller.getZone(ZoneType.Command).remove(source); game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); diff --git a/src/main/java/forge/card/ability/effects/AddPhaseEffect.java b/src/main/java/forge/card/ability/effects/AddPhaseEffect.java index 28cde68254e..8f9fcb39348 100644 --- a/src/main/java/forge/card/ability/effects/AddPhaseEffect.java +++ b/src/main/java/forge/card/ability/effects/AddPhaseEffect.java @@ -1,6 +1,5 @@ package forge.card.ability.effects; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.game.phase.PhaseHandler; @@ -14,7 +13,7 @@ public class AddPhaseEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - PhaseHandler phaseHandler = Singletons.getModel().getGame().getPhaseHandler(); + PhaseHandler phaseHandler = sa.getActivatingPlayer().getGame().getPhaseHandler(); PhaseType extra = PhaseType.smartValueOf(sa.getParam("ExtraPhase")); PhaseType after; diff --git a/src/main/java/forge/card/ability/effects/AddTurnEffect.java b/src/main/java/forge/card/ability/effects/AddTurnEffect.java index 42176c6d9e4..e3792d20283 100644 --- a/src/main/java/forge/card/ability/effects/AddTurnEffect.java +++ b/src/main/java/forge/card/ability/effects/AddTurnEffect.java @@ -2,7 +2,6 @@ package forge.card.ability.effects; import java.util.List; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; @@ -52,7 +51,7 @@ public class AddTurnEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { for (int i = 0; i < numTurns; i++) { - ExtraTurn extra = Singletons.getModel().getGame().getPhaseHandler().addExtraTurn(p); + ExtraTurn extra = p.getGame().getPhaseHandler().addExtraTurn(p); if (sa.hasParam("LoseAtEndStep")) { extra.setLoseAtEndStep(true); } diff --git a/src/main/java/forge/card/ability/effects/AnimateAllEffect.java b/src/main/java/forge/card/ability/effects/AnimateAllEffect.java index 919d1c319e1..4593ee36e86 100644 --- a/src/main/java/forge/card/ability/effects/AnimateAllEffect.java +++ b/src/main/java/forge/card/ability/effects/AnimateAllEffect.java @@ -9,7 +9,6 @@ import forge.Card; import forge.CardLists; import forge.CardUtil; import forge.Command; -import forge.Singletons; import forge.card.TriggerReplacementBase; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; @@ -19,6 +18,7 @@ import forge.card.spellability.Target; import forge.card.staticability.StaticAbility; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -33,7 +33,6 @@ public class AnimateAllEffect extends AnimateEffectBase { public void resolve(final SpellAbility sa) { final Card host = sa.getSourceCard(); final Map svars = host.getSVars(); - long timest = -1; // AF specific sa int power = -1; @@ -44,11 +43,10 @@ public class AnimateAllEffect extends AnimateEffectBase { if (sa.hasParam("Toughness")) { toughness = AbilityUtils.calculateAmount(host, sa.getParam("Toughness"), sa); } + final GameState game = sa.getActivatingPlayer().getGame(); // Every Animate event needs a unique time stamp - timest = Singletons.getModel().getGame().getNextTimestamp(); - - final long timestamp = timest; + final long timestamp = game.getNextTimestamp(); final boolean permanent = sa.hasParam("Permanent"); @@ -134,7 +132,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } if ((tgtPlayers == null) || tgtPlayers.isEmpty()) { - list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + list = game.getCardsIn(ZoneType.Battlefield); } else { list = new ArrayList(tgtPlayers.get(0).getCardsIn(ZoneType.Battlefield)); } @@ -243,9 +241,9 @@ public class AnimateAllEffect extends AnimateEffectBase { if (!permanent) { if (sa.hasParam("UntilEndOfCombat")) { - Singletons.getModel().getGame().getEndOfCombat().addUntil(unanimate); + game.getEndOfCombat().addUntil(unanimate); } else { - Singletons.getModel().getGame().getEndOfTurn().addUntil(unanimate); + game.getEndOfTurn().addUntil(unanimate); } } } diff --git a/src/main/java/forge/card/ability/effects/AnimateEffect.java b/src/main/java/forge/card/ability/effects/AnimateEffect.java index 91c7adc2c1d..c733647973d 100644 --- a/src/main/java/forge/card/ability/effects/AnimateEffect.java +++ b/src/main/java/forge/card/ability/effects/AnimateEffect.java @@ -8,7 +8,6 @@ import java.util.Map; import forge.Card; import forge.CardUtil; import forge.Command; -import forge.Singletons; import forge.card.TriggerReplacementBase; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; @@ -18,6 +17,7 @@ import forge.card.spellability.Target; import forge.card.staticability.StaticAbility; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; +import forge.game.GameState; public class AnimateEffect extends AnimateEffectBase { @@ -29,7 +29,7 @@ public class AnimateEffect extends AnimateEffectBase { final Card source = sa.getSourceCard(); final Card host = sa.getSourceCard(); final Map svars = host.getSVars(); - long timest = -1; + String animateRemembered = null; //if host is not on the battlefield don't apply @@ -53,10 +53,11 @@ public class AnimateEffect extends AnimateEffectBase { toughness = AbilityUtils.calculateAmount(host, sa.getParam("Toughness"), sa); } + final GameState game = sa.getActivatingPlayer().getGame(); // Every Animate event needs a unique time stamp - timest = Singletons.getModel().getGame().getNextTimestamp(); + final long timestamp = game.getNextTimestamp(); + - final long timestamp = timest; final boolean permanent = sa.hasParam("Permanent"); @@ -264,17 +265,17 @@ public class AnimateEffect extends AnimateEffectBase { if (!permanent) { if (sa.hasParam("UntilEndOfCombat")) { - Singletons.getModel().getGame().getEndOfCombat().addUntil(unanimate); + game.getEndOfCombat().addUntil(unanimate); } else if (sa.hasParam("UntilHostLeavesPlay")) { host.addLeavesPlayCommand(unanimate); } else if (sa.hasParam("UntilYourNextUpkeep")) { - Singletons.getModel().getGame().getUpkeep().addUntil(host.getController(), unanimate); + game.getUpkeep().addUntil(host.getController(), unanimate); } else if (sa.hasParam("UntilControllerNextUntap")) { - Singletons.getModel().getGame().getUntap().addUntil(c.getController(), unanimate); + game.getUntap().addUntil(c.getController(), unanimate); } else if (sa.hasParam("UntilYourNextTurn")) { - Singletons.getModel().getGame().getCleanup().addUntil(host.getController(), unanimate); + game.getCleanup().addUntil(host.getController(), unanimate); } else { - Singletons.getModel().getGame().getEndOfTurn().addUntil(unanimate); + game.getEndOfTurn().addUntil(unanimate); } } } diff --git a/src/main/java/forge/card/ability/effects/AttachEffect.java b/src/main/java/forge/card/ability/effects/AttachEffect.java index fb232da73cf..d19ec768140 100644 --- a/src/main/java/forge/card/ability/effects/AttachEffect.java +++ b/src/main/java/forge/card/ability/effects/AttachEffect.java @@ -7,13 +7,13 @@ import forge.Card; import forge.CardLists; import forge.Command; import forge.GameEntity; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; import forge.card.ability.SpellAbilityEffect; import forge.card.ability.ai.AttachAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -28,10 +28,12 @@ public class AttachEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { if (sa.getSourceCard().isAura() && sa.isSpell()) { + final Player ap = sa.getActivatingPlayer(); // The Spell_Permanent (Auras) version of this AF needs to // move the card into play before Attaching - sa.getSourceCard().setController(sa.getActivatingPlayer(), 0); - final Card c = Singletons.getModel().getGame().getAction().moveTo(sa.getActivatingPlayer().getZone(ZoneType.Battlefield), sa.getSourceCard()); + + sa.getSourceCard().setController(ap, 0); + final Card c = ap.getGame().getAction().moveTo(ap.getZone(ZoneType.Battlefield), sa.getSourceCard()); sa.setSourceCard(c); } @@ -182,13 +184,14 @@ public class AttachEffect extends SpellAbilityEffect { return false; } aura.setActivatingPlayer(source.getController()); + final GameState game = source.getGame(); final Target tgt = aura.getTarget(); if (source.getController().isHuman()) { if (tgt.canTgtPlayer()) { final ArrayList players = new ArrayList(); - for (Player player : Singletons.getModel().getGame().getPlayers()) { + for (Player player : game.getPlayers()) { if (player.isValid(tgt.getValidTgts(), aura.getActivatingPlayer(), source)) { players.add(player); } @@ -200,7 +203,7 @@ public class AttachEffect extends SpellAbilityEffect { return true; } } else { - List list = Singletons.getModel().getGame().getCardsIn(tgt.getZone()); + List list = game.getCardsIn(tgt.getZone()); list = CardLists.getValidCards(list, tgt.getValidTgts(), aura.getActivatingPlayer(), source); if (list.isEmpty()) { return false; diff --git a/src/main/java/forge/card/ability/effects/BecomesBlockedEffect.java b/src/main/java/forge/card/ability/effects/BecomesBlockedEffect.java index 10d1922ad99..414317a5b4a 100644 --- a/src/main/java/forge/card/ability/effects/BecomesBlockedEffect.java +++ b/src/main/java/forge/card/ability/effects/BecomesBlockedEffect.java @@ -6,13 +6,13 @@ import java.util.List; import org.apache.commons.lang3.StringUtils; import forge.Card; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.Ability; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.card.trigger.TriggerType; +import forge.game.GameState; public class BecomesBlockedEffect extends SpellAbilityEffect { @@ -31,20 +31,21 @@ public class BecomesBlockedEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { + final GameState game = sa.getActivatingPlayer().getGame(); final Target tgt = sa.getTarget(); for (final Card c : getTargetCards(sa)) { if ((tgt == null) || c.canBeTargetedBy(sa)) { - Singletons.getModel().getGame().getCombat().setBlocked(c); + game.getCombat().setBlocked(c); if (!c.getDamageHistory().getCreatureGotBlockedThisCombat()) { final HashMap runParams = new HashMap(); runParams.put("Attacker", c); runParams.put("Blocker", null); runParams.put("NumBlockers", 0); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.AttackerBlocked, runParams, false); + game.getTriggerHandler().runTrigger(TriggerType.AttackerBlocked, runParams, false); // Bushido for (final Ability ab : CardFactoryUtil.getBushidoEffects(c)) { - Singletons.getModel().getGame().getStack().add(ab); + game.getStack().add(ab); } } } diff --git a/src/main/java/forge/card/ability/effects/BondEffect.java b/src/main/java/forge/card/ability/effects/BondEffect.java index 268d0becc81..ab398837950 100644 --- a/src/main/java/forge/card/ability/effects/BondEffect.java +++ b/src/main/java/forge/card/ability/effects/BondEffect.java @@ -3,7 +3,6 @@ package forge.card.ability.effects; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; @@ -21,7 +20,7 @@ public class BondEffect extends SpellAbilityEffect { } // find list of valid cards to pair with - List cards = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List cards = sa.getActivatingPlayer().getGame().getCardsIn(ZoneType.Battlefield); cards = AbilityUtils.filterListByType(cards, sa.getParam("ValidCards"), sa); if (cards.isEmpty()) { return; diff --git a/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java b/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java index 00deb458af9..c6757debb74 100644 --- a/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java +++ b/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java @@ -8,10 +8,10 @@ import com.google.common.collect.Iterables; import forge.Card; import forge.CardCharacteristicName; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -40,9 +40,10 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { List cards = new ArrayList(); List tgtPlayers = getTargetPlayersEmptyAsDefault(sa); + final GameState game = sa.getActivatingPlayer().getGame(); if ((tgtPlayers == null) || tgtPlayers.isEmpty() || sa.hasParam("UseAllOriginZones")) { - cards = Singletons.getModel().getGame().getCardsIn(origin); + cards = game.getCardsIn(origin); } else { for (final Player p : tgtPlayers) { cards.addAll(p.getCardsIn(origin)); @@ -81,10 +82,10 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { } if (sa.hasParam("GainControl")) { - c.setController(sa.getActivatingPlayer(), Singletons.getModel().getGame().getNextTimestamp()); - Singletons.getModel().getGame().getAction().moveToPlay(c, sa.getActivatingPlayer()); + c.setController(sa.getActivatingPlayer(), game.getNextTimestamp()); + game.getAction().moveToPlay(c, sa.getActivatingPlayer()); } else { - final Card movedCard = Singletons.getModel().getGame().getAction().moveTo(destination, c, libraryPos); + final Card movedCard = game.getAction().moveTo(destination, c, libraryPos); if (sa.hasParam("ExileFaceDown")) { movedCard.setState(CardCharacteristicName.FaceDown); } @@ -94,20 +95,20 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { } if (remember != null) { - Singletons.getModel().getGame().getCardState(sa.getSourceCard()).addRemembered(c); + game.getCardState(sa.getSourceCard()).addRemembered(c); } if (forget != null) { - Singletons.getModel().getGame().getCardState(sa.getSourceCard()).removeRemembered(c); + game.getCardState(sa.getSourceCard()).removeRemembered(c); } if (imprint != null) { - Singletons.getModel().getGame().getCardState(sa.getSourceCard()).addImprinted(c); + game.getCardState(sa.getSourceCard()).addImprinted(c); } } // if Shuffle parameter exists, and any amount of cards were owned by // that player, then shuffle that library if (sa.hasParam("Shuffle")) { - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { if (Iterables.any(cards, CardPredicates.isOwner(p))) { p.shuffle(); } diff --git a/src/main/java/forge/card/ability/effects/ChooseCardEffect.java b/src/main/java/forge/card/ability/effects/ChooseCardEffect.java index f266c04c79a..278b5815b10 100644 --- a/src/main/java/forge/card/ability/effects/ChooseCardEffect.java +++ b/src/main/java/forge/card/ability/effects/ChooseCardEffect.java @@ -8,12 +8,12 @@ import org.apache.commons.lang3.StringUtils; import forge.Card; import forge.CardLists; import forge.CardPredicates.Presets; -import forge.Singletons; import forge.card.CardType; import forge.card.ability.SpellAbilityEffect; import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.util.Aggregates; @@ -34,6 +34,7 @@ public class ChooseCardEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card host = sa.getSourceCard(); + final GameState game = sa.getActivatingPlayer().getGame(); final ArrayList chosen = new ArrayList(); final Target tgt = sa.getTarget(); @@ -43,7 +44,7 @@ public class ChooseCardEffect extends SpellAbilityEffect { if (sa.hasParam("ChoiceZone")) { choiceZone = ZoneType.smartValueOf(sa.getParam("ChoiceZone")); } - List choices = Singletons.getModel().getGame().getCardsIn(choiceZone); + List choices = game.getCardsIn(choiceZone); if (sa.hasParam("Choices")) { choices = CardLists.getValidCards(choices, sa.getParam("Choices"), host.getController(), host); } @@ -57,7 +58,7 @@ public class ChooseCardEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { if (sa.hasParam("EachBasicType")) { // Get all lands, - List land = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), Presets.LANDS); + List land = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.LANDS); String eachBasic = sa.getParam("EachBasicType"); if (eachBasic.equals("Controlled")) { land = CardLists.filterControlledBy(land, p); diff --git a/src/main/java/forge/card/ability/effects/ChooseCardNameEffect.java b/src/main/java/forge/card/ability/effects/ChooseCardNameEffect.java index 3b203d248c1..00fcc1358f1 100644 --- a/src/main/java/forge/card/ability/effects/ChooseCardNameEffect.java +++ b/src/main/java/forge/card/ability/effects/ChooseCardNameEffect.java @@ -13,7 +13,6 @@ import com.google.common.collect.Lists; import forge.Card; import forge.CardLists; import forge.CardPredicates.Presets; -import forge.Singletons; import forge.card.CardRulesPredicates; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; @@ -100,7 +99,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { chosen = ComputerUtilCard.getMostProminentCardName(p.getOpponent().getCardsIn(ZoneType.Library)); } } else { - List list = CardLists.filterControlledBy(Singletons.getModel().getGame().getCardsInGame(), p.getOpponent()); + List list = CardLists.filterControlledBy(p.getGame().getCardsInGame(), p.getOpponent()); list = CardLists.filter(list, Predicates.not(Presets.LANDS)); if (!list.isEmpty()) { chosen = list.get(0).getName(); diff --git a/src/main/java/forge/card/ability/effects/ChooseColorEffect.java b/src/main/java/forge/card/ability/effects/ChooseColorEffect.java index 0786724192a..d836dcdb35a 100644 --- a/src/main/java/forge/card/ability/effects/ChooseColorEffect.java +++ b/src/main/java/forge/card/ability/effects/ChooseColorEffect.java @@ -9,10 +9,10 @@ import forge.Card; import forge.CardLists; import forge.CardPredicates; import forge.Constant; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -67,25 +67,26 @@ public class ChooseColorEffect extends SpellAbilityEffect { } else { List chosen = new ArrayList(); Player ai = sa.getActivatingPlayer(); + final GameState game = ai.getGame(); Player opp = ai.getOpponent(); if (sa.hasParam("AILogic")) { final String logic = sa.getParam("AILogic"); if (logic.equals("MostProminentInHumanDeck")) { - chosen.add(ComputerUtilCard.getMostProminentColor(CardLists.filterControlledBy(Singletons.getModel().getGame().getCardsInGame(), opp))); + chosen.add(ComputerUtilCard.getMostProminentColor(CardLists.filterControlledBy(game.getCardsInGame(), opp))); } else if (logic.equals("MostProminentInComputerDeck")) { - chosen.add(ComputerUtilCard.getMostProminentColor(CardLists.filterControlledBy(Singletons.getModel().getGame().getCardsInGame(), ai))); + chosen.add(ComputerUtilCard.getMostProminentColor(CardLists.filterControlledBy(game.getCardsInGame(), ai))); } else if (logic.equals("MostProminentDualInComputerDeck")) { - List prominence = ComputerUtilCard.getColorByProminence(CardLists.filterControlledBy(Singletons.getModel().getGame().getCardsInGame(), ai)); + List prominence = ComputerUtilCard.getColorByProminence(CardLists.filterControlledBy(game.getCardsInGame(), ai)); chosen.add(prominence.get(0)); chosen.add(prominence.get(1)); } else if (logic.equals("MostProminentInGame")) { - chosen.add(ComputerUtilCard.getMostProminentColor(Singletons.getModel().getGame().getCardsInGame())); + chosen.add(ComputerUtilCard.getMostProminentColor(game.getCardsInGame())); } else if (logic.equals("MostProminentHumanCreatures")) { List list = opp.getCreaturesInPlay(); if (list.isEmpty()) { - list = CardLists.filter(CardLists.filterControlledBy(Singletons.getModel().getGame().getCardsInGame(), opp), CardPredicates.Presets.CREATURES); + list = CardLists.filter(CardLists.filterControlledBy(game.getCardsInGame(), opp), CardPredicates.Presets.CREATURES); } chosen.add(ComputerUtilCard.getMostProminentColor(list)); } @@ -96,11 +97,11 @@ public class ChooseColorEffect extends SpellAbilityEffect { chosen.add(ComputerUtilCard.getMostProminentColor(ai.getOpponent().getCardsIn(ZoneType.Battlefield))); } else if (logic.equals("MostProminentPermanent")) { - final List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final List list = game.getCardsIn(ZoneType.Battlefield); chosen.add(ComputerUtilCard.getMostProminentColor(list)); } else if (logic.equals("MostProminentAttackers")) { - chosen.add(ComputerUtilCard.getMostProminentColor(Singletons.getModel().getGame().getCombat().getAttackers())); + chosen.add(ComputerUtilCard.getMostProminentColor(game.getCombat().getAttackers())); } else if (logic.equals("MostProminentKeywordInComputerDeck")) { List list = ai.getAllCards(); diff --git a/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java b/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java index 97c8619374e..e22022e2bb0 100644 --- a/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java +++ b/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java @@ -3,7 +3,6 @@ package forge.card.ability.effects; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; @@ -34,7 +33,7 @@ public class ChoosePlayerEffect extends SpellAbilityEffect { final Target tgt = sa.getTarget(); final List choices = sa.hasParam("Choices") ? AbilityUtils.getDefinedPlayers( - sa.getSourceCard(), sa.getParam("Choices"), sa) : Singletons.getModel().getGame().getPlayers(); + sa.getSourceCard(), sa.getParam("Choices"), sa) : sa.getActivatingPlayer().getGame().getPlayers(); final String choiceDesc = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a player"; diff --git a/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java b/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java index d0f1422bbcc..781b5aea653 100644 --- a/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java +++ b/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java @@ -10,7 +10,6 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; import forge.card.ability.SpellAbilityEffect; @@ -18,6 +17,7 @@ import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityStackInstance; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCombat; import forge.game.player.Player; @@ -41,11 +41,12 @@ public class ChooseSourceEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card host = sa.getSourceCard(); final ArrayList chosen = new ArrayList(); + final GameState game = sa.getActivatingPlayer().getGame(); final Target tgt = sa.getTarget(); final List tgtPlayers = getTargetPlayers(sa); - Stack stack = Singletons.getModel().getGame().getStack().getStack(); + Stack stack = game.getStack().getStack(); List permanentSources = new ArrayList(); List stackSources = new ArrayList(); @@ -54,7 +55,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect { List sourcesToChooseFrom = new ArrayList(); // Get the list of permanent cards - permanentSources = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + permanentSources = game.getCardsIn(ZoneType.Battlefield); // Get the list of cards that produce effects on the stack if (stack != null) { @@ -142,8 +143,8 @@ public class ChooseSourceEffect extends SpellAbilityEffect { } else { if (sa.hasParam("AILogic") && sa.getParam("AILogic").equals("NeedsPrevention")) { final Player ai = sa.getActivatingPlayer(); - if (!Singletons.getModel().getGame().getStack().isEmpty()) { - final SpellAbility topStack = Singletons.getModel().getGame().getStack().peekAbility(); + if (!game.getStack().isEmpty()) { + final SpellAbility topStack = game.getStack().peekAbility(); if (sa.hasParam("Choices") && !topStack.getSourceCard().isValid(sa.getParam("Choices"), ai, host)) { break; } @@ -177,10 +178,10 @@ public class ChooseSourceEffect extends SpellAbilityEffect { sourcesToChooseFrom = CardLists.filter(sourcesToChooseFrom, new Predicate() { @Override public boolean apply(final Card c) { - if (!c.isAttacking(ai) || !Singletons.getModel().getGame().getCombat().isUnblocked(c)) { + if (!c.isAttacking(ai) || !game.getCombat().isUnblocked(c)) { return false; } - return ComputerUtilCombat.damageIfUnblocked(c, ai, Singletons.getModel().getGame().getCombat()) > 0; + return ComputerUtilCombat.damageIfUnblocked(c, ai, game.getCombat()) > 0; } }); chosen.add(ComputerUtilCard.getBestCreatureAI(sourcesToChooseFrom)); diff --git a/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java b/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java index 70010f69bfe..ba61e0af9cd 100644 --- a/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java +++ b/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java @@ -10,11 +10,11 @@ import forge.Card; import forge.CardLists; import forge.CardPredicates; import forge.Constant; -import forge.Singletons; import forge.card.CardType; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -52,6 +52,7 @@ public class ChooseTypeEffect extends SpellAbilityEffect { final List tgtPlayers = getTargetPlayers(sa); for (final Player p : tgtPlayers) { + final GameState game = p.getGame(); if ((tgt == null) || p.canBeTargetedBy(sa)) { if (type.equals("Card")) { @@ -95,7 +96,7 @@ public class ChooseTypeEffect extends SpellAbilityEffect { if (sa.hasParam("AILogic")) { final String logic = sa.getParam("AILogic"); if (logic.equals("MostProminentOnBattlefield")) { - chosen = ComputerUtilCard.getMostProminentCreatureType(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)); + chosen = ComputerUtilCard.getMostProminentCreatureType(game.getCardsIn(ZoneType.Battlefield)); } else if (logic.equals("MostProminentComputerControls")) { chosen = ComputerUtilCard.getMostProminentCreatureType(ai.getCardsIn(ZoneType.Battlefield)); @@ -103,11 +104,11 @@ public class ChooseTypeEffect extends SpellAbilityEffect { else if (logic.equals("MostProminentHumanControls")) { chosen = ComputerUtilCard.getMostProminentCreatureType(opp.getCardsIn(ZoneType.Battlefield)); if (!CardType.isACreatureType(chosen) || invalidTypes.contains(chosen)) { - chosen = ComputerUtilCard.getMostProminentCreatureType(CardLists.filterControlledBy(Singletons.getModel().getGame().getCardsInGame(), opp)); + chosen = ComputerUtilCard.getMostProminentCreatureType(CardLists.filterControlledBy(game.getCardsInGame(), opp)); } } else if (logic.equals("MostProminentInComputerDeck")) { - chosen = ComputerUtilCard.getMostProminentCreatureType(CardLists.filterControlledBy(Singletons.getModel().getGame().getCardsInGame(), ai)); + chosen = ComputerUtilCard.getMostProminentCreatureType(CardLists.filterControlledBy(game.getCardsInGame(), ai)); } else if (logic.equals("MostProminentInComputerGraveyard")) { chosen = ComputerUtilCard.getMostProminentCreatureType(ai.getCardsIn(ZoneType.Graveyard)); diff --git a/src/main/java/forge/card/ability/effects/ClashEffect.java b/src/main/java/forge/card/ability/effects/ClashEffect.java index 143a3eafe1c..4b3dbcbc54c 100644 --- a/src/main/java/forge/card/ability/effects/ClashEffect.java +++ b/src/main/java/forge/card/ability/effects/ClashEffect.java @@ -3,7 +3,6 @@ package forge.card.ability.effects; import java.util.HashMap; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; @@ -59,7 +58,8 @@ public class ClashEffect extends SpellAbilityEffect { runParams.put("Won", "False"); } - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.Clashed, runParams, false); + + sa.getSourceCard().getGame().getTriggerHandler().runTrigger(TriggerType.Clashed, runParams, false); } /** diff --git a/src/main/java/forge/card/ability/effects/CleanUpEffect.java b/src/main/java/forge/card/ability/effects/CleanUpEffect.java index 1c5fbe9a7da..b8a21d6354a 100644 --- a/src/main/java/forge/card/ability/effects/CleanUpEffect.java +++ b/src/main/java/forge/card/ability/effects/CleanUpEffect.java @@ -2,10 +2,10 @@ package forge.card.ability.effects; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; public class CleanUpEffect extends SpellAbilityEffect { @@ -15,10 +15,11 @@ public class CleanUpEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { Card source = sa.getSourceCard(); + final GameState game = source.getGame(); if (sa.hasParam("ClearRemembered")) { source.clearRemembered(); - Singletons.getModel().getGame().getCardState(source).clearRemembered(); + game.getCardState(source).clearRemembered(); } if (sa.hasParam("ForgetDefined")) { for (final Card card : AbilityUtils.getDefinedCards(source, sa.getParam("ForgetDefined"), sa)) { @@ -32,7 +33,7 @@ public class CleanUpEffect extends SpellAbilityEffect { source.setSVar("ChosenX", ""); } if (sa.hasParam("ClearTriggered")) { - Singletons.getModel().getGame().getTriggerHandler().clearDelayedTrigger(source); + game.getTriggerHandler().clearDelayedTrigger(source); } if (sa.hasParam("ClearCoinFlips")) { source.clearFlipResult(); diff --git a/src/main/java/forge/card/ability/effects/CloneEffect.java b/src/main/java/forge/card/ability/effects/CloneEffect.java index 1abd0d7140f..7a69fcdb9bc 100644 --- a/src/main/java/forge/card/ability/effects/CloneEffect.java +++ b/src/main/java/forge/card/ability/effects/CloneEffect.java @@ -18,6 +18,7 @@ import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; +import forge.game.GameState; import forge.gui.GuiDialog; import forge.properties.ForgePreferences.FPref; @@ -199,11 +200,12 @@ public class CloneEffect extends SpellAbilityEffect { } }; + final GameState game = sa.getActivatingPlayer().getGame(); String duration = sa.getParam("Duration"); if (duration.equals("UntilEndOfTurn")) { - Singletons.getModel().getGame().getEndOfTurn().addUntil(unclone); + game.getEndOfTurn().addUntil(unclone); } else if (duration.equals("UntilYourNextTurn")) { - Singletons.getModel().getGame().getCleanup().addUntil(host.getController(), unclone); + game.getCleanup().addUntil(host.getController(), unclone); } } diff --git a/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java b/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java index 1b22e74431e..6beff52e453 100644 --- a/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java +++ b/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; @@ -67,7 +66,7 @@ public class ControlExchangeEffect extends SpellAbilityEffect { } final Player player2 = object2.getController(); - final long tStamp = Singletons.getModel().getGame().getNextTimestamp(); + final long tStamp = sa.getActivatingPlayer().getGame().getNextTimestamp(); object2.setController(object1.getController(), tStamp); object1.setController(player2, tStamp); } diff --git a/src/main/java/forge/card/ability/effects/ControlGainEffect.java b/src/main/java/forge/card/ability/effects/ControlGainEffect.java index c70529e5689..9926a567209 100644 --- a/src/main/java/forge/card/ability/effects/ControlGainEffect.java +++ b/src/main/java/forge/card/ability/effects/ControlGainEffect.java @@ -6,13 +6,13 @@ import java.util.List; import forge.Card; import forge.Command; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.mana.ManaCost; import forge.card.spellability.Ability; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -85,8 +85,20 @@ public class ControlGainEffect extends SpellAbilityEffect { final List lose = sa.hasParam("LoseControl") ? Arrays.asList(sa.getParam("LoseControl").split(",")) : null; final Target tgt = sa.getTarget(); + final List controllers; + + if (sa.hasParam("NewController")) { + controllers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("NewController"), sa); + } else if (tgt != null && tgt.getTargetPlayers() != null && tgt.canTgtPlayer()) { + controllers = tgt.getTargetPlayers(); + } else + controllers = new ArrayList(); + + final Player newController = controllers.isEmpty() ? sa.getActivatingPlayer() : controllers.get(0); + final GameState game = newController.getGame(); + if (sa.hasParam("AllValid")) { - tgtCards = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + tgtCards = game.getCardsIn(ZoneType.Battlefield); tgtCards = AbilityUtils.filterListByType(tgtCards, sa.getParam("AllValid"), sa); } else if (sa.hasParam("Defined")) { tgtCards = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); @@ -94,21 +106,7 @@ public class ControlGainEffect extends SpellAbilityEffect { tgtCards = getTargetCards(sa); } - List controllers = new ArrayList(); - if (sa.hasParam("NewController")) { - controllers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("NewController"), sa); - } else if (tgt != null && tgt.getTargetPlayers() != null && tgt.canTgtPlayer()) { - controllers = tgt.getTargetPlayers(); - } - - Player newController; - - if (controllers.size() == 0) { - newController = sa.getActivatingPlayer(); - } else { - newController = controllers.get(0); - } // check for lose control criteria right away if (lose != null && lose.contains("LeavesPlay") && !source.isInZone(ZoneType.Battlefield)) { return; @@ -127,7 +125,7 @@ public class ControlGainEffect extends SpellAbilityEffect { return; } - long tStamp = Singletons.getModel().getGame().getNextTimestamp(); + long tStamp = game.getNextTimestamp(); if (lose != null) { tgtC.addTempController(newController, tStamp); } else { @@ -155,7 +153,7 @@ public class ControlGainEffect extends SpellAbilityEffect { sa.getSourceCard().addChangeControllerCommand(this.getLoseControlCommand(tgtC, tStamp, bTapOnLose, source, kws)); } if (lose.contains("EOT")) { - Singletons.getModel().getGame().getEndOfTurn().addAt(this.getLoseControlCommand(tgtC, tStamp, bTapOnLose, source, kws)); + game.getEndOfTurn().addAt(this.getLoseControlCommand(tgtC, tStamp, bTapOnLose, source, kws)); } } @@ -192,14 +190,15 @@ public class ControlGainEffect extends SpellAbilityEffect { @Override public void run() { + final GameState game = hostCard.getGame(); final Ability ability = new Ability(hostCard, ManaCost.ZERO) { @Override public void resolve() { if (bNoRegen) { - Singletons.getModel().getGame().getAction().destroyNoRegeneration(c, null); + game.getAction().destroyNoRegeneration(c, null); } else { - Singletons.getModel().getGame().getAction().destroy(c, null); + game.getAction().destroy(c, null); } } }; @@ -210,7 +209,7 @@ public class ControlGainEffect extends SpellAbilityEffect { } ability.setStackDescription(sb.toString()); - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability); + game.getStack().addSimultaneousStackEntry(ability); } }; diff --git a/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java b/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java index 11ef9d3a649..f3fd3a6f139 100644 --- a/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java +++ b/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java @@ -15,7 +15,6 @@ import forge.Card; import forge.CardCharacteristicName; import forge.CardLists; import forge.Command; -import forge.Singletons; import forge.card.CardRulesPredicates; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; @@ -25,6 +24,7 @@ import forge.card.mana.ManaCost; import forge.card.spellability.Ability; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.player.HumanPlayer; import forge.game.player.Player; @@ -56,6 +56,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect { @Override public void resolve(final SpellAbility sa) { final Card hostCard = sa.getSourceCard(); + final GameState game = hostCard.getGame(); final ArrayList keywords = new ArrayList(); if (sa.hasParam("Keywords")) { keywords.addAll(Arrays.asList(sa.getParam("Keywords").split(" & "))); @@ -224,7 +225,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect { continue; } } - copy = Singletons.getModel().getGame().getAction().moveToPlay(copy); + copy = game.getAction().moveToPlay(copy); copy.setCloneOrigin(hostCard); sa.getSourceCard().addClone(copy); @@ -255,9 +256,9 @@ public class CopyPermanentEffect extends SpellAbilityEffect { if (sa.getParam("AtEOT").equals("Sacrifice")) { // maybe do a setSacrificeAtEOT, but // probably not. - Singletons.getModel().getGame().getAction().sacrifice(target[index], sa); + game.getAction().sacrifice(target[index], sa); } else if (sa.getParam("AtEOT").equals("Exile")) { - Singletons.getModel().getGame().getAction().exile(target[index]); + game.getAction().exile(target[index]); } } @@ -270,11 +271,11 @@ public class CopyPermanentEffect extends SpellAbilityEffect { @Override public void run() { sac.setStackDescription(sa.getParam("AtEOT") + " " + target[index] + "."); - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(sac); + game.getStack().addSimultaneousStackEntry(sac); } }; // Command if (sa.hasParam("AtEOT")) { - Singletons.getModel().getGame().getEndOfTurn().addAt(atEOT); + game.getEndOfTurn().addAt(atEOT); } // end copied Kiki code diff --git a/src/main/java/forge/card/ability/effects/CounterEffect.java b/src/main/java/forge/card/ability/effects/CounterEffect.java index dffc1b272bc..f1d49aa27de 100644 --- a/src/main/java/forge/card/ability/effects/CounterEffect.java +++ b/src/main/java/forge/card/ability/effects/CounterEffect.java @@ -5,9 +5,9 @@ import java.util.HashMap; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.cardfactory.CardFactoryUtil; +import forge.game.GameState; import forge.game.player.AIPlayer; import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityStackInstance; @@ -18,14 +18,15 @@ import forge.gui.GuiChoose; public class CounterEffect extends SpellAbilityEffect { @Override protected String getStackDescription(SpellAbility sa) { + final GameState game = sa.getActivatingPlayer().getGame(); final StringBuilder sb = new StringBuilder(); final List sas; if (sa.hasParam("AllType")) { sas = new ArrayList(); - for (int i = 0; i < Singletons.getModel().getGame().getStack().size(); i++) { - SpellAbility spell = Singletons.getModel().getGame().getStack().peekAbility(i); + for (int i = 0; i < game.getStack().size(); i++) { + SpellAbility spell = game.getStack().peekAbility(i); if (sa.getParam("AllType").equals("Spell") && !spell.isSpell()) { continue; } @@ -62,14 +63,15 @@ public class CounterEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { + final GameState game = sa.getActivatingPlayer().getGame(); // TODO Before this resolves we should see if any of our targets are // still on the stack final List sas; if (sa.hasParam("AllType")) { sas = new ArrayList(); - for (int i = 0; i < Singletons.getModel().getGame().getStack().size(); i++) { - SpellAbility spell = Singletons.getModel().getGame().getStack().peekAbility(i); + for (int i = 0; i < game.getStack().size(); i++) { + SpellAbility spell = game.getStack().peekAbility(i); if (sa.getParam("AllType").equals("Spell") && !spell.isSpell()) { continue; } @@ -97,7 +99,7 @@ public class CounterEffect extends SpellAbilityEffect { continue; } - final SpellAbilityStackInstance si = Singletons.getModel().getGame().getStack().getInstanceFromSpellAbility(tgtSA); + final SpellAbilityStackInstance si = game.getStack().getInstanceFromSpellAbility(tgtSA); if (si == null) { continue; } @@ -106,7 +108,7 @@ public class CounterEffect extends SpellAbilityEffect { // Destroy Permanent may be able to be turned into a SubAbility if (tgtSA.isAbility() && sa.hasParam("DestroyPermanent")) { - Singletons.getModel().getGame().getAction().destroy(tgtSACard, sa); + game.getAction().destroy(tgtSACard, sa); } if (sa.hasParam("RememberCountered")) { @@ -132,7 +134,8 @@ public class CounterEffect extends SpellAbilityEffect { * @param sa */ private void removeFromStack(final SpellAbility tgtSA, final SpellAbility srcSA, final SpellAbilityStackInstance si) { - Singletons.getModel().getGame().getStack().remove(si); + final GameState game = tgtSA.getActivatingPlayer().getGame(); + game.getStack().remove(si); String destination = srcSA.hasParam("Destination") ? srcSA.getParam("Destination") : "Graveyard"; if (srcSA.hasParam("DestinationChoice")) {//Hinder @@ -148,29 +151,29 @@ public class CounterEffect extends SpellAbilityEffect { // For Ability-targeted counterspells - do not move it anywhere, // even if Destination$ is specified. } else if (tgtSA.isFlashBackAbility()) { - Singletons.getModel().getGame().getAction().exile(tgtSA.getSourceCard()); + game.getAction().exile(tgtSA.getSourceCard()); } else if (destination.equals("Graveyard")) { - Singletons.getModel().getGame().getAction().moveToGraveyard(tgtSA.getSourceCard()); + game.getAction().moveToGraveyard(tgtSA.getSourceCard()); } else if (destination.equals("Exile")) { - Singletons.getModel().getGame().getAction().exile(tgtSA.getSourceCard()); + game.getAction().exile(tgtSA.getSourceCard()); } else if (destination.equals("TopOfLibrary")) { - Singletons.getModel().getGame().getAction().moveToLibrary(tgtSA.getSourceCard()); + game.getAction().moveToLibrary(tgtSA.getSourceCard()); } else if (destination.equals("Hand")) { - Singletons.getModel().getGame().getAction().moveToHand(tgtSA.getSourceCard()); + game.getAction().moveToHand(tgtSA.getSourceCard()); } else if (destination.equals("Battlefield")) { if (tgtSA instanceof SpellPermanent) { Card c = tgtSA.getSourceCard(); System.out.println(c + " is SpellPermanent"); c.setController(srcSA.getActivatingPlayer(), 0); - Singletons.getModel().getGame().getAction().moveToPlay(c, srcSA.getActivatingPlayer()); + game.getAction().moveToPlay(c, srcSA.getActivatingPlayer()); } else { - Card c = Singletons.getModel().getGame().getAction().moveToPlay(tgtSA.getSourceCard(), srcSA.getActivatingPlayer()); + Card c = game.getAction().moveToPlay(tgtSA.getSourceCard(), srcSA.getActivatingPlayer()); c.setController(srcSA.getActivatingPlayer(), 0); } } else if (destination.equals("BottomOfLibrary")) { - Singletons.getModel().getGame().getAction().moveToBottomOfLibrary(tgtSA.getSourceCard()); + game.getAction().moveToBottomOfLibrary(tgtSA.getSourceCard()); } else if (destination.equals("ShuffleIntoLibrary")) { - Singletons.getModel().getGame().getAction().moveToBottomOfLibrary(tgtSA.getSourceCard()); + game.getAction().moveToBottomOfLibrary(tgtSA.getSourceCard()); tgtSA.getSourceCard().getController().shuffle(); } else { throw new IllegalArgumentException("AbilityFactory_CounterMagic: Invalid Destination argument for card " diff --git a/src/main/java/forge/card/ability/effects/CountersProliferateEffect.java b/src/main/java/forge/card/ability/effects/CountersProliferateEffect.java index fbd425a47d1..1cc6640b6c1 100644 --- a/src/main/java/forge/card/ability/effects/CountersProliferateEffect.java +++ b/src/main/java/forge/card/ability/effects/CountersProliferateEffect.java @@ -10,9 +10,7 @@ import forge.CardLists; import forge.CounterType; import forge.FThreads; import forge.GameEntity; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; -import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; import forge.control.input.InputProliferate; import forge.game.player.Player; @@ -58,10 +56,10 @@ public class CountersProliferateEffect extends SpellAbilityEffect { @Override public boolean apply(Card crd) { for (final Entry c1 : crd.getCounters().entrySet()) { - if (CardFactoryUtil.isNegativeCounter(c1.getKey()) && enemies.contains(crd.getController())) { + if (c1.getKey().isNegativeCounter() && enemies.contains(crd.getController())) { return true; } - if (!CardFactoryUtil.isNegativeCounter(c1.getKey()) && allies.contains(crd.getController())) { + if (!c1.getKey().isNegativeCounter() && allies.contains(crd.getController())) { return true; } } @@ -69,7 +67,7 @@ public class CountersProliferateEffect extends SpellAbilityEffect { } }; - List cardsToProliferate = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), predProliferate); + List cardsToProliferate = CardLists.filter(ai.getGame().getCardsIn(ZoneType.Battlefield), predProliferate); List playersToPoison = new ArrayList(); for (Player e : enemies) { if (e.getPoisonCounters() > 0) { @@ -104,12 +102,12 @@ public class CountersProliferateEffect extends SpellAbilityEffect { // computer for (final Card c : cardsToProliferate) { for (final Entry c1 : c.getCounters().entrySet()) { - if (CardFactoryUtil.isNegativeCounter(c1.getKey()) && enemies.contains(c.getController())) + if (c1.getKey().isNegativeCounter() && enemies.contains(c.getController())) { c.addCounter(c1.getKey(), 1, true); break; } - if (!CardFactoryUtil.isNegativeCounter(c1.getKey()) && allies.contains(c.getController())) + if (!c1.getKey().isNegativeCounter() && allies.contains(c.getController())) { c.addCounter(c1.getKey(), 1, true); break; diff --git a/src/main/java/forge/card/ability/effects/CountersPutAllEffect.java b/src/main/java/forge/card/ability/effects/CountersPutAllEffect.java index adefc030ac0..1f66a4aadd2 100644 --- a/src/main/java/forge/card/ability/effects/CountersPutAllEffect.java +++ b/src/main/java/forge/card/ability/effects/CountersPutAllEffect.java @@ -5,11 +5,11 @@ import java.util.List; import forge.Card; import forge.CardLists; import forge.CounterType; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -43,8 +43,9 @@ public class CountersPutAllEffect extends SpellAbilityEffect { final int counterAmount = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("CounterNum"), sa); final String valid = sa.getParam("ValidCards"); final ZoneType zone = sa.hasParam("ValidZone") ? ZoneType.smartValueOf(sa.getParam("ValidZone")) : ZoneType.Battlefield; + final GameState game = sa.getActivatingPlayer().getGame(); - List cards = Singletons.getModel().getGame().getCardsIn(zone); + List cards = game.getCardsIn(zone); cards = CardLists.getValidCards(cards, valid, sa.getSourceCard().getController(), sa.getSourceCard()); final Target tgt = sa.getTarget(); @@ -54,7 +55,7 @@ public class CountersPutAllEffect extends SpellAbilityEffect { } for (final Card tgtCard : cards) { - if (Singletons.getModel().getGame().getZoneOf(tgtCard).is(ZoneType.Battlefield)) { + if (game.getZoneOf(tgtCard).is(ZoneType.Battlefield)) { tgtCard.addCounter(CounterType.valueOf(type), counterAmount, true); } else { // adding counters to something like re-suspend cards diff --git a/src/main/java/forge/card/ability/effects/CountersPutEffect.java b/src/main/java/forge/card/ability/effects/CountersPutEffect.java index 7005fca8b66..2b9b98fc88e 100644 --- a/src/main/java/forge/card/ability/effects/CountersPutEffect.java +++ b/src/main/java/forge/card/ability/effects/CountersPutEffect.java @@ -6,7 +6,6 @@ import java.util.List; import forge.Card; import forge.CounterType; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; @@ -108,7 +107,7 @@ public class CountersPutEffect extends SpellAbilityEffect { if (max != -1) { counterAmount = max - tgtCard.getCounters(counterType); } - final Zone zone = Singletons.getModel().getGame().getZoneOf(tgtCard); + final Zone zone = tgtCard.getGame().getZoneOf(tgtCard); if (zone == null || zone.is(ZoneType.Battlefield) || zone.is(ZoneType.Stack)) { if (remember) { final int value = tgtCard.getTotalCountersToAdd(counterType, counterAmount, true); diff --git a/src/main/java/forge/card/ability/effects/CountersRemoveAllEffect.java b/src/main/java/forge/card/ability/effects/CountersRemoveAllEffect.java index 09686b6c751..2565cdb1d25 100644 --- a/src/main/java/forge/card/ability/effects/CountersRemoveAllEffect.java +++ b/src/main/java/forge/card/ability/effects/CountersRemoveAllEffect.java @@ -5,11 +5,11 @@ import java.util.List; import forge.Card; import forge.CardLists; import forge.CounterType; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -47,8 +47,9 @@ public class CountersRemoveAllEffect extends SpellAbilityEffect { int counterAmount = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("CounterNum"), sa); final String valid = sa.getParam("ValidCards"); final ZoneType zone = sa.hasParam("ValidZone") ? ZoneType.smartValueOf(sa.getParam("ValidZone")) : ZoneType.Battlefield; - - List cards = Singletons.getModel().getGame().getCardsIn(zone); + final GameState game = sa.getActivatingPlayer().getGame(); + + List cards = game.getCardsIn(zone); cards = CardLists.getValidCards(cards, valid, sa.getSourceCard().getController(), sa.getSourceCard()); final Target tgt = sa.getTarget(); diff --git a/src/main/java/forge/card/ability/effects/CountersRemoveEffect.java b/src/main/java/forge/card/ability/effects/CountersRemoveEffect.java index 785d5f4901c..e13c50eca33 100644 --- a/src/main/java/forge/card/ability/effects/CountersRemoveEffect.java +++ b/src/main/java/forge/card/ability/effects/CountersRemoveEffect.java @@ -6,11 +6,11 @@ import java.util.Map; import forge.Card; import forge.CounterType; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -55,6 +55,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card card = sa.getSourceCard(); + final GameState game = card.getGame(); final String type = sa.getParam("CounterType"); int counterAmount = 0; if (!sa.getParam("CounterNum").equals("All") && !sa.getParam("CounterNum").equals("Remembered")) { @@ -80,7 +81,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { } for (final Card tgtCard : getTargetCards(sa)) { if ((tgt == null) || tgtCard.canBeTargetedBy(sa)) { - final Zone zone = Singletons.getModel().getGame().getZoneOf(tgtCard); + final Zone zone = game.getZoneOf(tgtCard); if (sa.getParam("CounterNum").equals("All")) { counterAmount = tgtCard.getCounters(counterType); } else if (sa.getParam("CounterNum").equals("Remembered")) { diff --git a/src/main/java/forge/card/ability/effects/DamageAllEffect.java b/src/main/java/forge/card/ability/effects/DamageAllEffect.java index 527ca1bb462..e3c39c30122 100644 --- a/src/main/java/forge/card/ability/effects/DamageAllEffect.java +++ b/src/main/java/forge/card/ability/effects/DamageAllEffect.java @@ -5,11 +5,11 @@ import java.util.List; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -46,6 +46,7 @@ public class DamageAllEffect extends SpellAbilityEffect { final List definedSources = AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("DamageSource"), sa); final Card card = definedSources.get(0); final Card source = sa.getSourceCard(); + final GameState game = sa.getActivatingPlayer().getGame(); final String damage = sa.getParam("NumDmg"); final int dmg = AbilityUtils.calculateAmount(sa.getSourceCard(), damage, sa); @@ -64,7 +65,7 @@ public class DamageAllEffect extends SpellAbilityEffect { } if (sa.hasParam("ValidCards")) { - list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + list = game.getCardsIn(ZoneType.Battlefield); } if (targetPlayer != null) { diff --git a/src/main/java/forge/card/ability/effects/DamageEachEffect.java b/src/main/java/forge/card/ability/effects/DamageEachEffect.java index 571f1a60047..cb307f27443 100644 --- a/src/main/java/forge/card/ability/effects/DamageEachEffect.java +++ b/src/main/java/forge/card/ability/effects/DamageEachEffect.java @@ -5,7 +5,6 @@ import java.util.List; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.cardfactory.CardFactoryUtil; @@ -61,7 +60,7 @@ public class DamageEachEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card card = sa.getSourceCard(); - List sources = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List sources = card.getGame().getCardsIn(ZoneType.Battlefield); if (sa.hasParam("ValidCards")) { sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), card.getController(), card); } diff --git a/src/main/java/forge/card/ability/effects/DamagePreventAllEffect.java b/src/main/java/forge/card/ability/effects/DamagePreventAllEffect.java index 0ba2745931d..0387ffba651 100644 --- a/src/main/java/forge/card/ability/effects/DamagePreventAllEffect.java +++ b/src/main/java/forge/card/ability/effects/DamagePreventAllEffect.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -19,6 +19,7 @@ public class DamagePreventAllEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card source = sa.getSourceCard(); + final GameState game = sa.getActivatingPlayer().getGame(); final int numDam = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("Amount"), sa); String players = ""; @@ -29,7 +30,7 @@ public class DamagePreventAllEffect extends SpellAbilityEffect { } if (sa.hasParam("ValidCards")) { - list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + list = game.getCardsIn(ZoneType.Battlefield); } list = AbilityUtils.filterListByType(list, sa.getParam("ValidCards"), sa); @@ -39,7 +40,7 @@ public class DamagePreventAllEffect extends SpellAbilityEffect { } if (!players.equals("")) { - final ArrayList playerList = new ArrayList(Singletons.getModel().getGame().getPlayers()); + final ArrayList playerList = new ArrayList(game.getPlayers()); for (final Player p : playerList) { if (p.isValid(players, source.getController(), source)) { p.addPreventNextDamage(numDam); diff --git a/src/main/java/forge/card/ability/effects/DebuffAllEffect.java b/src/main/java/forge/card/ability/effects/DebuffAllEffect.java index 00b22f3f461..d34c014d6a4 100644 --- a/src/main/java/forge/card/ability/effects/DebuffAllEffect.java +++ b/src/main/java/forge/card/ability/effects/DebuffAllEffect.java @@ -7,9 +7,9 @@ import java.util.List; import forge.Card; import forge.CardLists; import forge.Command; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.zone.ZoneType; public class DebuffAllEffect extends SpellAbilityEffect { @@ -40,6 +40,7 @@ public class DebuffAllEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card hostCard = sa.getSourceCard(); final List kws = sa.hasParam("Keywords") ? Arrays.asList(sa.getParam("Keywords").split(" & ")) : new ArrayList(); + final GameState game = sa.getActivatingPlayer().getGame(); String valid = ""; @@ -47,7 +48,7 @@ public class DebuffAllEffect extends SpellAbilityEffect { valid = sa.getParam("ValidCards"); } - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard); for (final Card tgtC : list) { @@ -62,7 +63,7 @@ public class DebuffAllEffect extends SpellAbilityEffect { } } if (!sa.hasParam("Permanent")) { - Singletons.getModel().getGame().getEndOfTurn().addUntil(new Command() { + game.getEndOfTurn().addUntil(new Command() { private static final long serialVersionUID = 7486231071095628674L; @Override diff --git a/src/main/java/forge/card/ability/effects/DebuffEffect.java b/src/main/java/forge/card/ability/effects/DebuffEffect.java index 4e1c0b0bae6..c0fbd3a2e59 100644 --- a/src/main/java/forge/card/ability/effects/DebuffEffect.java +++ b/src/main/java/forge/card/ability/effects/DebuffEffect.java @@ -7,9 +7,9 @@ import java.util.List; import forge.Card; import forge.Command; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; public class DebuffEffect extends SpellAbilityEffect { @@ -56,6 +56,7 @@ public class DebuffEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final List kws = sa.hasParam("Keywords") ? Arrays.asList(sa.getParam("Keywords").split(" & ")) : new ArrayList(); + final GameState game = sa.getActivatingPlayer().getGame(); for (final Card tgtC : getTargetCards(sa)) { final ArrayList hadIntrinsic = new ArrayList(); @@ -69,7 +70,7 @@ public class DebuffEffect extends SpellAbilityEffect { } } if (!sa.hasParam("Permanent")) { - Singletons.getModel().getGame().getEndOfTurn().addUntil(new Command() { + game.getEndOfTurn().addUntil(new Command() { private static final long serialVersionUID = 5387486776282932314L; @Override diff --git a/src/main/java/forge/card/ability/effects/DelayedTriggerEffect.java b/src/main/java/forge/card/ability/effects/DelayedTriggerEffect.java index dc797db9f6f..ed052a3bfe9 100644 --- a/src/main/java/forge/card/ability/effects/DelayedTriggerEffect.java +++ b/src/main/java/forge/card/ability/effects/DelayedTriggerEffect.java @@ -3,7 +3,6 @@ package forge.card.ability.effects; import java.util.HashMap; import java.util.Map; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.trigger.Trigger; @@ -40,6 +39,6 @@ public class DelayedTriggerEffect extends SpellAbilityEffect { final Trigger delTrig = TriggerHandler.parseTrigger(mapParams, sa.getSourceCard(), true); - Singletons.getModel().getGame().getTriggerHandler().registerDelayedTrigger(delTrig); + sa.getActivatingPlayer().getGame().getTriggerHandler().registerDelayedTrigger(delTrig); } } diff --git a/src/main/java/forge/card/ability/effects/DestroyAllEffect.java b/src/main/java/forge/card/ability/effects/DestroyAllEffect.java index 6311a8993d3..f36bee2b82a 100644 --- a/src/main/java/forge/card/ability/effects/DestroyAllEffect.java +++ b/src/main/java/forge/card/ability/effects/DestroyAllEffect.java @@ -5,11 +5,11 @@ import java.util.List; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -48,6 +48,7 @@ public class DestroyAllEffect extends SpellAbilityEffect { final boolean noRegen = sa.hasParam("NoRegen"); final Card card = sa.getSourceCard(); + final GameState game = sa.getActivatingPlayer().getGame(); final Target tgt = sa.getTarget(); Player targetPlayer = null; @@ -72,7 +73,7 @@ public class DestroyAllEffect extends SpellAbilityEffect { valid = valid.replace("X", Integer.toString(AbilityUtils.calculateAmount(card, "X", sa))); } - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = game.getCardsIn(ZoneType.Battlefield); if (targetPlayer != null) { list = CardLists.filterControlledBy(list, targetPlayer); @@ -87,13 +88,13 @@ public class DestroyAllEffect extends SpellAbilityEffect { if (noRegen) { for (int i = 0; i < list.size(); i++) { - if (Singletons.getModel().getGame().getAction().destroyNoRegeneration(list.get(i), sa) && remDestroyed) { + if (game.getAction().destroyNoRegeneration(list.get(i), sa) && remDestroyed) { card.addRemembered(list.get(i)); } } } else { for (int i = 0; i < list.size(); i++) { - if (Singletons.getModel().getGame().getAction().destroy(list.get(i), sa) && remDestroyed) { + if (game.getAction().destroy(list.get(i), sa) && remDestroyed) { card.addRemembered(list.get(i)); } } diff --git a/src/main/java/forge/card/ability/effects/DestroyEffect.java b/src/main/java/forge/card/ability/effects/DestroyEffect.java index 51367b4bf37..2444a73110c 100644 --- a/src/main/java/forge/card/ability/effects/DestroyEffect.java +++ b/src/main/java/forge/card/ability/effects/DestroyEffect.java @@ -6,10 +6,10 @@ import java.util.List; import forge.Card; import forge.CardUtil; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; public class DestroyEffect extends SpellAbilityEffect { /* (non-Javadoc) @@ -69,6 +69,7 @@ public class DestroyEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card card = sa.getSourceCard(); + final GameState game = card.getGame(); final boolean remDestroyed = sa.hasParam("RememberDestroyed"); if (remDestroyed) { @@ -94,11 +95,11 @@ public class DestroyEffect extends SpellAbilityEffect { if (tgtC.isInPlay() && ((tgt == null) || tgtC.canBeTargetedBy(sa))) { boolean destroyed = false; if (sac) { - destroyed = Singletons.getModel().getGame().getAction().sacrifice(tgtC, sa); + destroyed = game.getAction().sacrifice(tgtC, sa); } else if (noRegen) { - destroyed = Singletons.getModel().getGame().getAction().destroyNoRegeneration(tgtC, sa); + destroyed = game.getAction().destroyNoRegeneration(tgtC, sa); } else { - destroyed = Singletons.getModel().getGame().getAction().destroy(tgtC, sa); + destroyed = game.getAction().destroy(tgtC, sa); } if (destroyed && remDestroyed) { card.addRemembered(tgtC); } @@ -109,11 +110,11 @@ public class DestroyEffect extends SpellAbilityEffect { if (unTgtC.isInPlay()) { boolean destroyed = false; if (sac) { - destroyed = Singletons.getModel().getGame().getAction().sacrifice(unTgtC, sa); + destroyed = game.getAction().sacrifice(unTgtC, sa); } else if (noRegen) { - destroyed = Singletons.getModel().getGame().getAction().destroyNoRegeneration(unTgtC, sa); + destroyed = game.getAction().destroyNoRegeneration(unTgtC, sa); } else { - destroyed = Singletons.getModel().getGame().getAction().destroy(unTgtC, sa); + destroyed = game.getAction().destroy(unTgtC, sa); } if (destroyed && remDestroyed) { card.addRemembered(unTgtC); } diff --git a/src/main/java/forge/card/ability/effects/DigEffect.java b/src/main/java/forge/card/ability/effects/DigEffect.java index e681d344949..5d2da03a018 100644 --- a/src/main/java/forge/card/ability/effects/DigEffect.java +++ b/src/main/java/forge/card/ability/effects/DigEffect.java @@ -9,11 +9,11 @@ import java.util.Random; import forge.Card; import forge.CardCharacteristicName; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.player.Player; import forge.game.zone.PlayerZone; @@ -52,6 +52,7 @@ public class DigEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card host = sa.getSourceCard(); final Player player = sa.getActivatingPlayer(); + final GameState game = player.getGame(); Player choser = player; int numToDig = AbilityUtils.calculateAmount(host, sa.getParam("DigNum"), sa); final ZoneType destZone1 = sa.hasParam("DestinationZone") ? ZoneType.smartValueOf(sa.getParam("DestinationZone")) @@ -161,7 +162,7 @@ public class DigEffect extends SpellAbilityEffect { rest.add(c); } if (mitosis) { - valid = sharesNameWithCardOnBattlefield(top); + valid = sharesNameWithCardOnBattlefield(game, top); } else if (!changeValid.equals("")) { if (changeValid.contains("ChosenType")) { changeValid = changeValid.replace("ChosenType", host.getChosenType()); @@ -283,9 +284,9 @@ public class DigEffect extends SpellAbilityEffect { } final PlayerZone zone = c.getOwner().getZone(destZone1); if (zone.is(ZoneType.Library)) { - Singletons.getModel().getGame().getAction().moveToLibrary(c, libraryPosition); + game.getAction().moveToLibrary(c, libraryPosition); } else { - c = Singletons.getModel().getGame().getAction().moveTo(zone, c); + c = game.getAction().moveTo(zone, c); if (destZone1.equals(ZoneType.Battlefield)) { for (final String kw : keywords) { c.addExtrinsicKeyword(kw); @@ -328,12 +329,12 @@ public class DigEffect extends SpellAbilityEffect { } else { chosen = rest.get(0); } - Singletons.getModel().getGame().getAction().moveToLibrary(chosen, libraryPosition2); + game.getAction().moveToLibrary(chosen, libraryPosition2); rest.remove(chosen); } } else { // Computer for (int i = 0; i < rest.size(); i++) { - Singletons.getModel().getGame().getAction().moveToLibrary(rest.get(i), libraryPosition2); + game.getAction().moveToLibrary(rest.get(i), libraryPosition2); } } } else { @@ -341,7 +342,7 @@ public class DigEffect extends SpellAbilityEffect { for (int i = 0; i < rest.size(); i++) { Card c = rest.get(i); final PlayerZone toZone = c.getOwner().getZone(destZone2); - c = Singletons.getModel().getGame().getAction().moveTo(toZone, c); + c = game.getAction().moveTo(toZone, c); if (destZone2.equals(ZoneType.Battlefield) && !keywords.isEmpty()) { for (final String kw : keywords) { c.addExtrinsicKeyword(kw); @@ -366,9 +367,9 @@ public class DigEffect extends SpellAbilityEffect { * a {@link forge.CardList} object. * @return a {@link forge.CardList} object. */ - private List sharesNameWithCardOnBattlefield(final List list) { + private List sharesNameWithCardOnBattlefield(final GameState game, final List list) { final List toReturn = new ArrayList(); - final List play = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final List play = game.getCardsIn(ZoneType.Battlefield); for (final Card c : list) { for (final Card p : play) { if (p.getName().equals(c.getName()) && !toReturn.contains(c)) { diff --git a/src/main/java/forge/card/ability/effects/DigUntilEffect.java b/src/main/java/forge/card/ability/effects/DigUntilEffect.java index 1ea8d44fb43..cbd1f0e8e72 100644 --- a/src/main/java/forge/card/ability/effects/DigUntilEffect.java +++ b/src/main/java/forge/card/ability/effects/DigUntilEffect.java @@ -5,11 +5,11 @@ import java.util.Iterator; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; @@ -124,6 +124,7 @@ public class DigUntilEffect extends SpellAbilityEffect { if (revealed.size() > 0) { GuiChoose.one(p + " revealed: ", revealed); } + final GameState game = p.getGame(); // TODO Allow Human to choose the order if (foundDest != null) { @@ -131,12 +132,12 @@ public class DigUntilEffect extends SpellAbilityEffect { while (itr.hasNext()) { final Card c = itr.next(); if (sa.hasParam("GainControl") && foundDest.equals(ZoneType.Battlefield)) { - c.setController(sa.getActivatingPlayer(), Singletons.getModel().getGame().getNextTimestamp()); - Singletons.getModel().getGame().getAction().moveTo(c.getController().getZone(foundDest), c); + c.setController(sa.getActivatingPlayer(), game.getNextTimestamp()); + game.getAction().moveTo(c.getController().getZone(foundDest), c); } else if (sa.hasParam("NoMoveFound") && foundDest.equals(ZoneType.Library)) { //Don't do anything } else { - Singletons.getModel().getGame().getAction().moveTo(foundDest, c, foundLibPos); + game.getAction().moveTo(foundDest, c, foundLibPos); } revealed.remove(c); } @@ -152,7 +153,7 @@ public class DigUntilEffect extends SpellAbilityEffect { final Iterator itr = revealed.iterator(); while (itr.hasNext()) { final Card c = itr.next(); - Singletons.getModel().getGame().getAction().moveTo(revealedDest, c, revealedLibPos); + game.getAction().moveTo(revealedDest, c, revealedLibPos); } if (sa.hasParam("Shuffle")) { diff --git a/src/main/java/forge/card/ability/effects/ETBReplacementEffect.java b/src/main/java/forge/card/ability/effects/ETBReplacementEffect.java index 94cf67d4de5..af6974ee9b2 100644 --- a/src/main/java/forge/card/ability/effects/ETBReplacementEffect.java +++ b/src/main/java/forge/card/ability/effects/ETBReplacementEffect.java @@ -11,6 +11,6 @@ import forge.card.spellability.SpellAbility; public class ETBReplacementEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - forge.Singletons.getModel().getGame().getAction().moveToPlay(((Card) sa.getReplacingObject("Card"))); + sa.getActivatingPlayer().getGame().getAction().moveToPlay(((Card) sa.getReplacingObject("Card"))); } } \ No newline at end of file diff --git a/src/main/java/forge/card/ability/effects/EffectEffect.java b/src/main/java/forge/card/ability/effects/EffectEffect.java index 1b132528130..bdfd67aa67f 100644 --- a/src/main/java/forge/card/ability/effects/EffectEffect.java +++ b/src/main/java/forge/card/ability/effects/EffectEffect.java @@ -4,7 +4,6 @@ import java.util.List; import forge.Card; import forge.Command; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; @@ -14,6 +13,7 @@ import forge.card.spellability.SpellAbility; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerType; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -37,6 +37,7 @@ public class EffectEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card hostCard = sa.getSourceCard(); + final GameState game = hostCard.getGame(); String[] effectAbilities = null; String[] effectTriggers = null; @@ -87,7 +88,7 @@ public class EffectEffect extends SpellAbilityEffect { } // Unique Effects shouldn't be duplicated - if (sa.hasParam("Unique") && Singletons.getModel().getGame().isCardInCommand(name)) { + if (sa.hasParam("Unique") && game.isCardInCommand(name)) { return; } @@ -186,7 +187,7 @@ public class EffectEffect extends SpellAbilityEffect { // Remember created effect if (sa.hasParam("RememberEffect")) { - Singletons.getModel().getGame().getCardState(hostCard).addRemembered(eff); + game.getCardState(hostCard).addRemembered(eff); } // Duration @@ -197,29 +198,29 @@ public class EffectEffect extends SpellAbilityEffect { @Override public void run() { - Singletons.getModel().getGame().getAction().exile(e); + game.getAction().exile(e); } }; if ((duration == null) || duration.equals("EndOfTurn")) { - Singletons.getModel().getGame().getEndOfTurn().addUntil(endEffect); + game.getEndOfTurn().addUntil(endEffect); } else if (duration.equals("UntilHostLeavesPlay")) { hostCard.addLeavesPlayCommand(endEffect); } else if (duration.equals("HostLeavesOrEOT")) { - Singletons.getModel().getGame().getEndOfTurn().addUntil(endEffect); + game.getEndOfTurn().addUntil(endEffect); hostCard.addLeavesPlayCommand(endEffect); } else if (duration.equals("UntilYourNextTurn")) { - Singletons.getModel().getGame().getCleanup().addUntil(controller, endEffect); + game.getCleanup().addUntil(controller, endEffect); } } // TODO: Add targeting to the effect so it knows who it's dealing with - Singletons.getModel().getGame().getTriggerHandler().suppressMode(TriggerType.ChangesZone); - Singletons.getModel().getGame().getAction().moveTo(ZoneType.Command, eff); - Singletons.getModel().getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); + game.getAction().moveTo(ZoneType.Command, eff); + game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); } } diff --git a/src/main/java/forge/card/ability/effects/EncodeEffect.java b/src/main/java/forge/card/ability/effects/EncodeEffect.java index 39f72e203a4..5d45d0ff183 100644 --- a/src/main/java/forge/card/ability/effects/EncodeEffect.java +++ b/src/main/java/forge/card/ability/effects/EncodeEffect.java @@ -4,11 +4,11 @@ import java.util.List; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -29,9 +29,10 @@ public class EncodeEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card host = sa.getSourceCard(); final Player player = sa.getActivatingPlayer(); + final GameState game = player.getGame(); // make list of creatures that controller has on Battlefield - List choices = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List choices = game.getCardsIn(ZoneType.Battlefield); choices = CardLists.getValidCards(choices, "Creature.YouCtrl", host.getController(), host); // if no creatures on battlefield, cannot encoded @@ -48,7 +49,7 @@ public class EncodeEffect extends SpellAbilityEffect { } // move host card to exile - Card movedCard = Singletons.getModel().getGame().getAction().moveTo(ZoneType.Exile, host); + Card movedCard = game.getAction().moveTo(ZoneType.Exile, host); // choose a creature Card choice = player.getController().chooseSingleCardForEffect(choices, sa, "Choose a creature you control to encode ", true); diff --git a/src/main/java/forge/card/ability/effects/EndTurnEffect.java b/src/main/java/forge/card/ability/effects/EndTurnEffect.java index 2dd66f476f2..0bba39ab3d8 100644 --- a/src/main/java/forge/card/ability/effects/EndTurnEffect.java +++ b/src/main/java/forge/card/ability/effects/EndTurnEffect.java @@ -2,7 +2,6 @@ package forge.card.ability.effects; import forge.Card; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.game.GameState; @@ -21,7 +20,7 @@ public class EndTurnEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - GameState game = Singletons.getModel().getGame(); + GameState game = sa.getActivatingPlayer().getGame(); // Steps taken from gatherer's rulings on Time Stop. // 1) All spells and abilities on the stack are exiled. This includes // Time Stop, though it will continue to resolve. It also includes @@ -32,7 +31,7 @@ public class EndTurnEffect extends SpellAbilityEffect { game.getStack().getStack().clear(); // 2) All attacking and blocking creatures are removed from combat. - game.getCombat().reset(); + game.getCombat().reset(game.getPhaseHandler().getPlayerTurn()); // 3) State-based actions are checked. No player gets priority, and no // triggered abilities are put onto the stack. diff --git a/src/main/java/forge/card/ability/effects/FlipCoinEffect.java b/src/main/java/forge/card/ability/effects/FlipCoinEffect.java index 983db848f46..f03af637ae7 100644 --- a/src/main/java/forge/card/ability/effects/FlipCoinEffect.java +++ b/src/main/java/forge/card/ability/effects/FlipCoinEffect.java @@ -4,7 +4,6 @@ import java.util.HashMap; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; @@ -132,7 +131,7 @@ public class FlipCoinEffect extends SpellAbilityEffect { public static boolean flipCoinNoCall(final Card source, final Player flipper) { final boolean resultIsHeads = MyRandom.getRandom().nextBoolean(); - Singletons.getModel().getGame().getEvents().post(new FlipCoinEvent()); + flipper.getGame().getEvents().post(new FlipCoinEvent()); final StringBuilder result = new StringBuilder(); result.append(flipper.getName()); result.append("'s flip comes up"); diff --git a/src/main/java/forge/card/ability/effects/FogEffect.java b/src/main/java/forge/card/ability/effects/FogEffect.java index d20b40b1dba..0a963540d2d 100644 --- a/src/main/java/forge/card/ability/effects/FogEffect.java +++ b/src/main/java/forge/card/ability/effects/FogEffect.java @@ -1,6 +1,5 @@ package forge.card.ability.effects; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; @@ -15,6 +14,6 @@ public class FogEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { // Expand Fog keyword here depending on what we need out of it. - Singletons.getModel().getGame().getPhaseHandler().setPreventCombatDamageThisTurn(true); + sa.getActivatingPlayer().getGame().getPhaseHandler().setPreventCombatDamageThisTurn(true); } } diff --git a/src/main/java/forge/card/ability/effects/ManaEffect.java b/src/main/java/forge/card/ability/effects/ManaEffect.java index 669217c6e61..af61613d68f 100644 --- a/src/main/java/forge/card/ability/effects/ManaEffect.java +++ b/src/main/java/forge/card/ability/effects/ManaEffect.java @@ -6,7 +6,6 @@ import java.util.List; import forge.Card; import forge.Constant; import forge.CounterType; -import forge.Singletons; import forge.card.MagicColor; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; @@ -14,6 +13,7 @@ import forge.card.spellability.AbilityManaPart; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.game.GameActionUtil; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -39,6 +39,7 @@ public class ManaEffect extends SpellAbilityEffect { final List tgtPlayers = getTargetPlayers(sa); final Target tgt = sa.getTarget(); final boolean optional = sa.hasParam("Optional"); + final GameState game = sa.getActivatingPlayer().getGame(); if (optional) { if (!GuiDialog.confirm(sa.getSourceCard(), "Do you want to add mana to your mana pool?")) { @@ -186,7 +187,7 @@ public class ManaEffect extends SpellAbilityEffect { final int num = card.getCounters(CounterType.getType(deplete)); if (num == 0) { sa.setUndoable(false); - Singletons.getModel().getGame().getAction().sacrifice(card, null); + game.getAction().sacrifice(card, null); } } diff --git a/src/main/java/forge/card/ability/effects/PermanentCreatureEfect.java b/src/main/java/forge/card/ability/effects/PermanentCreatureEfect.java index c57e130bc0f..0ee468df1a5 100644 --- a/src/main/java/forge/card/ability/effects/PermanentCreatureEfect.java +++ b/src/main/java/forge/card/ability/effects/PermanentCreatureEfect.java @@ -1,9 +1,9 @@ package forge.card.ability.effects; import forge.Card; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.player.Player; import forge.game.zone.ZoneType; /** @@ -17,8 +17,9 @@ public class PermanentCreatureEfect extends SpellAbilityEffect { */ @Override public void resolve(SpellAbility sa) { - sa.getSourceCard().setController(sa.getActivatingPlayer(), 0); - final Card c = Singletons.getModel().getGame().getAction().moveTo(sa.getActivatingPlayer().getZone(ZoneType.Battlefield), sa.getSourceCard()); + Player p = sa.getActivatingPlayer(); + sa.getSourceCard().setController(p, 0); + final Card c = p.getGame().getAction().moveTo(p.getZone(ZoneType.Battlefield), sa.getSourceCard()); sa.setSourceCard(c); } diff --git a/src/main/java/forge/card/ability/effects/PermanentNoncreatureEffect.java b/src/main/java/forge/card/ability/effects/PermanentNoncreatureEffect.java index c9e07795090..b99b26055d4 100644 --- a/src/main/java/forge/card/ability/effects/PermanentNoncreatureEffect.java +++ b/src/main/java/forge/card/ability/effects/PermanentNoncreatureEffect.java @@ -1,9 +1,9 @@ package forge.card.ability.effects; import forge.Card; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.player.Player; import forge.game.zone.ZoneType; /** @@ -17,8 +17,9 @@ public class PermanentNoncreatureEffect extends SpellAbilityEffect { */ @Override public void resolve(SpellAbility sa) { - sa.getSourceCard().setController(sa.getActivatingPlayer(), 0); - final Card c = Singletons.getModel().getGame().getAction().moveTo(sa.getActivatingPlayer().getZone(ZoneType.Battlefield), sa.getSourceCard()); + final Player p = sa.getActivatingPlayer(); + sa.getSourceCard().setController(p, 0); + final Card c = p.getGame().getAction().moveTo(p.getZone(ZoneType.Battlefield), sa.getSourceCard()); sa.setSourceCard(c); } diff --git a/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java b/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java index bbf5c1046c4..1bd06c23260 100644 --- a/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java +++ b/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java @@ -1,6 +1,5 @@ package forge.card.ability.effects; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.game.GameState; @@ -17,7 +16,7 @@ public class PlaneswalkEffect extends SpellAbilityEffect { */ @Override public void resolve(SpellAbility sa) { - GameState game = Singletons.getModel().getGame(); + GameState game = sa.getActivatingPlayer().getGame(); System.out.println("AF Planeswalking!"); diff --git a/src/main/java/forge/card/ability/effects/PlayEffect.java b/src/main/java/forge/card/ability/effects/PlayEffect.java index 5c401427f06..3fa9420d89b 100644 --- a/src/main/java/forge/card/ability/effects/PlayEffect.java +++ b/src/main/java/forge/card/ability/effects/PlayEffect.java @@ -13,7 +13,6 @@ import com.google.common.collect.Lists; import forge.Card; import forge.CardCharacteristicName; import forge.CardLists; -import forge.Singletons; import forge.card.CardRulesPredicates; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; @@ -55,9 +54,9 @@ public class PlayEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - final GameState game = Singletons.getModel().getGame(); final Card source = sa.getSourceCard(); Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); boolean optional = sa.hasParam("Optional"); boolean remember = sa.hasParam("RememberPlayed"); boolean wasFaceDown = false; diff --git a/src/main/java/forge/card/ability/effects/ProtectAllEffect.java b/src/main/java/forge/card/ability/effects/ProtectAllEffect.java index 15ac22a5535..f093a5f3d0a 100644 --- a/src/main/java/forge/card/ability/effects/ProtectAllEffect.java +++ b/src/main/java/forge/card/ability/effects/ProtectAllEffect.java @@ -7,10 +7,10 @@ import forge.Card; import forge.CardLists; import forge.CardUtil; import forge.Command; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -38,6 +38,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card host = sa.getSourceCard(); + final GameState game = sa.getActivatingPlayer().getGame(); final boolean isChoice = sa.getParam("Gains").contains("Choice"); final ArrayList choices = AbilityUtils.getProtectionList(sa); @@ -77,7 +78,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { valid = sa.getParam("ValidCards"); } if (!valid.equals("")) { - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, valid, sa.getActivatingPlayer(), host); for (final Card tgtC : list) { @@ -101,9 +102,9 @@ public class ProtectAllEffect extends SpellAbilityEffect { } }; if (sa.hasParam("UntilEndOfCombat")) { - Singletons.getModel().getGame().getEndOfCombat().addUntil(untilEOT); + game.getEndOfCombat().addUntil(untilEOT); } else { - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } } @@ -135,9 +136,9 @@ public class ProtectAllEffect extends SpellAbilityEffect { } }; if (sa.hasParam("UntilEndOfCombat")) { - Singletons.getModel().getGame().getEndOfCombat().addUntil(untilEOT); + game.getEndOfCombat().addUntil(untilEOT); } else { - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } } diff --git a/src/main/java/forge/card/ability/effects/ProtectEffect.java b/src/main/java/forge/card/ability/effects/ProtectEffect.java index 7da18f3023e..17fe860dfb1 100644 --- a/src/main/java/forge/card/ability/effects/ProtectEffect.java +++ b/src/main/java/forge/card/ability/effects/ProtectEffect.java @@ -8,11 +8,11 @@ import forge.Card; import forge.CardLists; import forge.CardUtil; import forge.Command; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.player.Player; import forge.gui.GuiChoose; @@ -97,6 +97,7 @@ public class ProtectEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card host = sa.getSourceCard(); + final GameState game = sa.getActivatingPlayer().getGame(); final boolean isChoice = sa.getParam("Gains").contains("Choice"); final ArrayList choices = AbilityUtils.getProtectionList(sa); @@ -120,7 +121,7 @@ public class ProtectEffect extends SpellAbilityEffect { list.addAll(opp.getCreaturesInPlay()); } if (list.isEmpty()) { - list = CardLists.filterControlledBy(Singletons.getModel().getGame().getCardsInGame(), ai.getOpponents()); + list = CardLists.filterControlledBy(game.getCardsInGame(), ai.getOpponents()); } if (!list.isEmpty()) { choice = ComputerUtilCard.getMostProminentColor(list); @@ -182,9 +183,9 @@ public class ProtectEffect extends SpellAbilityEffect { } }; if (sa.hasParam("UntilEndOfCombat")) { - Singletons.getModel().getGame().getEndOfCombat().addUntil(untilEOT); + game.getEndOfCombat().addUntil(untilEOT); } else { - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } } @@ -214,9 +215,9 @@ public class ProtectEffect extends SpellAbilityEffect { } }; if (sa.hasParam("UntilEndOfCombat")) { - Singletons.getModel().getGame().getEndOfCombat().addUntil(untilEOT); + game.getEndOfCombat().addUntil(untilEOT); } else { - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } } diff --git a/src/main/java/forge/card/ability/effects/PumpAllEffect.java b/src/main/java/forge/card/ability/effects/PumpAllEffect.java index 20d127dc593..f72382093fb 100644 --- a/src/main/java/forge/card/ability/effects/PumpAllEffect.java +++ b/src/main/java/forge/card/ability/effects/PumpAllEffect.java @@ -6,11 +6,11 @@ import java.util.List; import forge.Card; import forge.Command; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -18,6 +18,7 @@ public class PumpAllEffect extends SpellAbilityEffect { private void applyPumpAll(final SpellAbility sa, final List list, final int a, final int d, final List keywords, final ArrayList affectedZones) { + final GameState game = sa.getActivatingPlayer().getGame(); for (final Card tgtC : list) { // only pump things in the affected zones. @@ -66,9 +67,9 @@ public class PumpAllEffect extends SpellAbilityEffect { if (sa.hasParam("UntilUntaps")) { sa.getSourceCard().addUntapCommand(untilEOT); } else if (sa.hasParam("UntilEndOfCombat")) { - Singletons.getModel().getGame().getEndOfCombat().addUntil(untilEOT); + game.getEndOfCombat().addUntil(untilEOT); } else { - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } } @@ -94,6 +95,7 @@ public class PumpAllEffect extends SpellAbilityEffect { List list; final List tgtPlayers = getTargetPlayersEmptyAsDefault(sa); final ArrayList affectedZones = new ArrayList(); + final GameState game = sa.getActivatingPlayer().getGame(); if (sa.hasParam("PumpZone")) { for (final String zone : sa.getParam("PumpZone").split(",")) { @@ -106,7 +108,7 @@ public class PumpAllEffect extends SpellAbilityEffect { list = new ArrayList(); if (tgtPlayers.isEmpty()) { for (final ZoneType zone : affectedZones) { - list.addAll(Singletons.getModel().getGame().getCardsIn(zone)); + list.addAll(game.getCardsIn(zone)); } } else { diff --git a/src/main/java/forge/card/ability/effects/PumpEffect.java b/src/main/java/forge/card/ability/effects/PumpEffect.java index 9d0430bb542..2cbc637578b 100644 --- a/src/main/java/forge/card/ability/effects/PumpEffect.java +++ b/src/main/java/forge/card/ability/effects/PumpEffect.java @@ -8,11 +8,11 @@ import forge.Card; import forge.CardUtil; import forge.Command; import forge.GameEntity; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiDialog; @@ -26,6 +26,7 @@ public class PumpEffect extends SpellAbilityEffect { && !sa.getSourceCard().isInPlay()) { return; } + final GameState game = sa.getActivatingPlayer().getGame(); applyTo.addTempAttackBoost(a); applyTo.addTempDefenseBoost(d); @@ -55,26 +56,26 @@ public class PumpEffect extends SpellAbilityEffect { } }; if (sa.hasParam("UntilEndOfCombat")) { - Singletons.getModel().getGame().getEndOfCombat().addUntil(untilEOT); + game.getEndOfCombat().addUntil(untilEOT); } else if (sa.hasParam("UntilYourNextUpkeep")) { - Singletons.getModel().getGame().getUpkeep().addUntil(sa.getActivatingPlayer(), untilEOT); + game.getUpkeep().addUntil(sa.getActivatingPlayer(), untilEOT); } else if (sa.hasParam("UntilHostLeavesPlay")) { sa.getSourceCard().addLeavesPlayCommand(untilEOT); } else if (sa.hasParam("UntilLoseControlOfHost")) { sa.getSourceCard().addLeavesPlayCommand(untilEOT); sa.getSourceCard().addChangeControllerCommand(untilEOT); } else if (sa.hasParam("UntilYourNextTurn")) { - Singletons.getModel().getGame().getCleanup().addUntil(sa.getActivatingPlayer(), untilEOT); + game.getCleanup().addUntil(sa.getActivatingPlayer(), untilEOT); } else if (sa.hasParam("UntilUntaps")) { sa.getSourceCard().addUntapCommand(untilEOT); } else { - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } } private void applyPump(final SpellAbility sa, final Player p, final List keywords) { - + final GameState game = p.getGame(); for (int i = 0; i < keywords.size(); i++) { p.addKeyword(keywords.get(i)); } @@ -95,11 +96,11 @@ public class PumpEffect extends SpellAbilityEffect { } }; if (sa.hasParam("UntilEndOfCombat")) { - Singletons.getModel().getGame().getEndOfCombat().addUntil(untilEOT); + game.getEndOfCombat().addUntil(untilEOT); } else if (sa.hasParam("UntilYourNextUpkeep")) { - Singletons.getModel().getGame().getUpkeep().addUntil(sa.getActivatingPlayer(), untilEOT); + game.getUpkeep().addUntil(sa.getActivatingPlayer(), untilEOT); } else { - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } } @@ -175,6 +176,7 @@ public class PumpEffect extends SpellAbilityEffect { List tgtCards = new ArrayList(); final ArrayList untargetedCards = new ArrayList(); final Target tgt = sa.getTarget(); + final GameState game = sa.getActivatingPlayer().getGame(); List tgtPlayers = new ArrayList(); String pumpRemembered = null; String pumpForget = null; @@ -301,7 +303,7 @@ public class PumpEffect extends SpellAbilityEffect { final Card tgtC = tgtCards.get(j); // only pump things in PumpZone - if (!Singletons.getModel().getGame().getCardsIn(pumpZone).contains(tgtC)) { + if (!game.getCardsIn(pumpZone).contains(tgtC)) { continue; } @@ -316,7 +318,7 @@ public class PumpEffect extends SpellAbilityEffect { for (int i = 0; i < untargetedCards.size(); i++) { final Card tgtC = untargetedCards.get(i); // only pump things in PumpZone - if (!Singletons.getModel().getGame().getCardsIn(pumpZone).contains(tgtC)) { + if (!game.getCardsIn(pumpZone).contains(tgtC)) { continue; } diff --git a/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java b/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java index 5268213254b..0897064959f 100644 --- a/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java +++ b/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; @@ -119,7 +118,7 @@ public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect { List orderedCards = GuiChoose.order("Select order to Rearrange", "Top of Library", 0, topCards, null, src); for (int i = maxCards - 1; i >= 0; i--) { Card next = orderedCards.get(i); - Singletons.getModel().getGame().getAction().moveToLibrary(next, 0); + player.getGame().getAction().moveToLibrary(next, 0); } if (mayshuffle) { if (GuiDialog.confirm(src, "Do you want to shuffle the library?")) { diff --git a/src/main/java/forge/card/ability/effects/RegenerateAllEffect.java b/src/main/java/forge/card/ability/effects/RegenerateAllEffect.java index d1af88f77df..4636a266061 100644 --- a/src/main/java/forge/card/ability/effects/RegenerateAllEffect.java +++ b/src/main/java/forge/card/ability/effects/RegenerateAllEffect.java @@ -5,9 +5,9 @@ import java.util.List; import forge.Card; import forge.CardLists; import forge.Command; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.zone.ZoneType; public class RegenerateAllEffect extends SpellAbilityEffect { @@ -20,13 +20,14 @@ public class RegenerateAllEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card hostCard = sa.getSourceCard(); + final GameState game = hostCard.getGame(); String valid = ""; if (sa.hasParam("ValidCards")) { valid = sa.getParam("ValidCards"); } - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard); for (final Card c : list) { @@ -41,7 +42,7 @@ public class RegenerateAllEffect extends SpellAbilityEffect { if (c.isInPlay()) { c.addShield(); - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } } // regenerateAllResolve diff --git a/src/main/java/forge/card/ability/effects/RegenerateEffect.java b/src/main/java/forge/card/ability/effects/RegenerateEffect.java index d9b66fb03e5..56ef7485994 100644 --- a/src/main/java/forge/card/ability/effects/RegenerateEffect.java +++ b/src/main/java/forge/card/ability/effects/RegenerateEffect.java @@ -5,10 +5,10 @@ import java.util.List; import forge.Card; import forge.Command; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; public class RegenerateEffect extends SpellAbilityEffect { @@ -45,6 +45,7 @@ public class RegenerateEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Target tgt = sa.getTarget(); + final GameState game = sa.getActivatingPlayer().getGame(); for (final Card tgtC : getTargetCards(sa)) { final Command untilEOT = new Command() { @@ -58,7 +59,7 @@ public class RegenerateEffect extends SpellAbilityEffect { if (tgtC.isInPlay() && ((tgt == null) || tgtC.canBeTargetedBy(sa))) { tgtC.addShield(); - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } } // regenerateResolve diff --git a/src/main/java/forge/card/ability/effects/RemoveFromCombatEffect.java b/src/main/java/forge/card/ability/effects/RemoveFromCombatEffect.java index 932367d305f..6cb00313018 100644 --- a/src/main/java/forge/card/ability/effects/RemoveFromCombatEffect.java +++ b/src/main/java/forge/card/ability/effects/RemoveFromCombatEffect.java @@ -5,10 +5,11 @@ import java.util.List; import org.apache.commons.lang3.StringUtils; import forge.Card; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.GameState; +import forge.game.player.Player; public class RemoveFromCombatEffect extends SpellAbilityEffect { @@ -27,11 +28,14 @@ public class RemoveFromCombatEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { + final Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); + final Target tgt = sa.getTarget(); for (final Card c : getTargetCards(sa)) { if ((tgt == null) || c.canBeTargetedBy(sa)) { - Singletons.getModel().getGame().getCombat().removeFromCombat(c); + game.getCombat().removeFromCombat(c); } } diff --git a/src/main/java/forge/card/ability/effects/RepeatEachEffect.java b/src/main/java/forge/card/ability/effects/RepeatEachEffect.java index 9dd4c4b151a..207fa67a06a 100644 --- a/src/main/java/forge/card/ability/effects/RepeatEachEffect.java +++ b/src/main/java/forge/card/ability/effects/RepeatEachEffect.java @@ -8,7 +8,6 @@ import java.util.Set; import forge.Card; import forge.CardLists; import forge.CounterType; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; @@ -33,7 +32,7 @@ public class RepeatEachEffect extends SpellAbilityEffect { repeat.setActivatingPlayer(sa.getActivatingPlayer()); ((AbilitySub) repeat).setParent(sa); - GameState game = Singletons.getModel().getGame(); + final GameState game = sa.getActivatingPlayer().getGame(); boolean useImprinted = sa.hasParam("UseImprinted"); boolean loopOverCards = false; diff --git a/src/main/java/forge/card/ability/effects/RepeatEffect.java b/src/main/java/forge/card/ability/effects/RepeatEffect.java index ff6c5de7ff9..8eb40e0868c 100644 --- a/src/main/java/forge/card/ability/effects/RepeatEffect.java +++ b/src/main/java/forge/card/ability/effects/RepeatEffect.java @@ -5,13 +5,14 @@ import java.util.List; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; +import forge.game.GameState; +import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiDialog; import forge.util.Expressions; @@ -69,6 +70,9 @@ public class RepeatEffect extends SpellAbilityEffect { */ private boolean checkRepeatConditions(final SpellAbility sa) { //boolean doAgain = false; + final Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); + if (sa.hasParam("RepeatPresent")) { final String repeatPresent = sa.getParam("RepeatPresent"); @@ -82,7 +86,7 @@ public class RepeatEffect extends SpellAbilityEffect { if (sa.hasParam("RepeatDefined")) { list.addAll(AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("RepeatDefined"), sa)); } else { - list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + list = game.getCardsIn(ZoneType.Battlefield); } list = CardLists.getValidCards(list, repeatPresent.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); diff --git a/src/main/java/forge/card/ability/effects/RestartGameEffect.java b/src/main/java/forge/card/ability/effects/RestartGameEffect.java index 91fa1d8ccaa..74c3de42b4d 100644 --- a/src/main/java/forge/card/ability/effects/RestartGameEffect.java +++ b/src/main/java/forge/card/ability/effects/RestartGameEffect.java @@ -24,7 +24,8 @@ public class RestartGameEffect extends SpellAbilityEffect { */ @Override public void resolve(SpellAbility sa) { - GameState game = Singletons.getModel().getGame(); + final Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); List players = game.getPlayers(); Map> playerLibraries = new HashMap>(); diff --git a/src/main/java/forge/card/ability/effects/RollPlanarDiceEffect.java b/src/main/java/forge/card/ability/effects/RollPlanarDiceEffect.java index b26b5157b9a..5d8da025aaa 100644 --- a/src/main/java/forge/card/ability/effects/RollPlanarDiceEffect.java +++ b/src/main/java/forge/card/ability/effects/RollPlanarDiceEffect.java @@ -1,8 +1,8 @@ package forge.card.ability.effects; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.PlanarDice; import forge.game.player.Player; import forge.gui.GuiDialog; @@ -19,16 +19,15 @@ public class RollPlanarDiceEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { boolean countedTowardsCost = !sa.hasParam("NotCountedTowardsCost"); - - Player roller = sa.getActivatingPlayer(); - if(countedTowardsCost) - { - - Singletons.getModel().getGame().getPhaseHandler().incPlanarDiceRolledthisTurn(); + final Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); + + if(countedTowardsCost) { + game.getPhaseHandler().incPlanarDiceRolledthisTurn(); } - PlanarDice result = PlanarDice.roll(roller,null); + PlanarDice result = PlanarDice.roll(activator, null); - GuiDialog.message(roller.getName() + " rolled " + result.toString()); + GuiDialog.message(activator.getName() + " rolled " + result.toString()); } } diff --git a/src/main/java/forge/card/ability/effects/SacrificeAllEffect.java b/src/main/java/forge/card/ability/effects/SacrificeAllEffect.java index 7daf66c248f..95a3695e235 100644 --- a/src/main/java/forge/card/ability/effects/SacrificeAllEffect.java +++ b/src/main/java/forge/card/ability/effects/SacrificeAllEffect.java @@ -4,10 +4,11 @@ import java.util.ArrayList; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; +import forge.game.player.Player; import forge.game.zone.ZoneType; public class SacrificeAllEffect extends SpellAbilityEffect { @@ -33,8 +34,10 @@ public class SacrificeAllEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - final Card card = sa.getSourceCard(); + final Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); + String valid = ""; @@ -46,7 +49,7 @@ public class SacrificeAllEffect extends SpellAbilityEffect { if (sa.hasParam("Defined")) { list = new ArrayList(AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa)); } else { - list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + list = game.getCardsIn(ZoneType.Battlefield); } final boolean remSacrificed = sa.hasParam("RememberSacrificed"); @@ -57,7 +60,7 @@ public class SacrificeAllEffect extends SpellAbilityEffect { list = AbilityUtils.filterListByType(list, valid, sa); for (int i = 0; i < list.size(); i++) { - if (Singletons.getModel().getGame().getAction().sacrifice(list.get(i), sa) && remSacrificed) { + if (game.getAction().sacrifice(list.get(i), sa) && remSacrificed) { card.addRemembered(list.get(i)); } } diff --git a/src/main/java/forge/card/ability/effects/SacrificeEffect.java b/src/main/java/forge/card/ability/effects/SacrificeEffect.java index 94e063c5e2d..a66ee50d13e 100644 --- a/src/main/java/forge/card/ability/effects/SacrificeEffect.java +++ b/src/main/java/forge/card/ability/effects/SacrificeEffect.java @@ -5,7 +5,6 @@ import java.util.List; import forge.Card; import forge.CardLists; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; @@ -19,7 +18,8 @@ public class SacrificeEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card card = sa.getSourceCard(); - final GameState game = Singletons.getModel().getGame(); + final Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); // Expand Sacrifice keyword here depending on what we need out of it. final String num = sa.hasParam("Amount") ? sa.getParam("Amount") : "1"; diff --git a/src/main/java/forge/card/ability/effects/TapAllEffect.java b/src/main/java/forge/card/ability/effects/TapAllEffect.java index c02eb823486..5a64c2ac6fb 100644 --- a/src/main/java/forge/card/ability/effects/TapAllEffect.java +++ b/src/main/java/forge/card/ability/effects/TapAllEffect.java @@ -4,11 +4,11 @@ import java.util.ArrayList; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -28,6 +28,8 @@ public class TapAllEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { + final Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); final Card card = sa.getSourceCard(); final boolean remTapped = sa.hasParam("RememberTapped"); if (remTapped) { @@ -39,7 +41,7 @@ public class TapAllEffect extends SpellAbilityEffect { final List tgtPlayers = getTargetPlayersEmptyAsDefault(sa); if ((tgtPlayers == null) || tgtPlayers.isEmpty()) { - cards = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + cards = game.getCardsIn(ZoneType.Battlefield); } else { cards = new ArrayList(); for (final Player p : tgtPlayers) { diff --git a/src/main/java/forge/card/ability/effects/TapOrUntapAllEffect.java b/src/main/java/forge/card/ability/effects/TapOrUntapAllEffect.java index 51734b160d8..69dfa66416b 100644 --- a/src/main/java/forge/card/ability/effects/TapOrUntapAllEffect.java +++ b/src/main/java/forge/card/ability/effects/TapOrUntapAllEffect.java @@ -6,10 +6,10 @@ import org.apache.commons.lang3.StringUtils; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -44,11 +44,14 @@ public class TapOrUntapAllEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { List validCards = getTargetCards(sa); + final Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); + List targetedPlayers = getTargetPlayersEmptyAsDefault(sa); if (sa.hasParam("ValidCards")) { - validCards = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + validCards = game.getCardsIn(ZoneType.Battlefield); validCards = AbilityUtils.filterListByType(validCards, sa.getParam("ValidCards"), sa); } diff --git a/src/main/java/forge/card/ability/effects/UnattachAllEffect.java b/src/main/java/forge/card/ability/effects/UnattachAllEffect.java index bb7ebbfba40..baf2b388549 100644 --- a/src/main/java/forge/card/ability/effects/UnattachAllEffect.java +++ b/src/main/java/forge/card/ability/effects/UnattachAllEffect.java @@ -7,9 +7,9 @@ import org.apache.commons.lang3.StringUtils; import forge.Card; import forge.CardLists; import forge.GameEntity; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -150,6 +150,7 @@ public class UnattachAllEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { Card source = sa.getSourceCard(); + final GameState game = sa.getActivatingPlayer().getGame(); final List targets = getTargetObjects(sa); // If Cast Targets will be checked on the Stack @@ -159,7 +160,7 @@ public class UnattachAllEffect extends SpellAbilityEffect { } String valid = sa.getParam("UnattachValid"); - List unattachList = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List unattachList = game.getCardsIn(ZoneType.Battlefield); unattachList = CardLists.getValidCards(unattachList, valid.split(","), source.getController(), source); for (final Card c : unattachList) { handleUnattachment((GameEntity) o, c); diff --git a/src/main/java/forge/card/ability/effects/UntapAllEffect.java b/src/main/java/forge/card/ability/effects/UntapAllEffect.java index 484bc0cd3bf..b0f2017cf93 100644 --- a/src/main/java/forge/card/ability/effects/UntapAllEffect.java +++ b/src/main/java/forge/card/ability/effects/UntapAllEffect.java @@ -5,7 +5,6 @@ import java.util.List; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; @@ -40,7 +39,7 @@ public class UntapAllEffect extends SpellAbilityEffect { } if (tgtPlayers.isEmpty()) { - list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + list = sa.getActivatingPlayer().getGame().getCardsIn(ZoneType.Battlefield); } else { list = new ArrayList(); for (final Player p : tgtPlayers) { diff --git a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java index 2eafd7f1684..cc655474576 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java @@ -44,6 +44,7 @@ import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; import forge.control.input.InputSelectCards; import forge.control.input.InputSelectCardsFromList; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCombat; import forge.game.player.Player; @@ -247,6 +248,7 @@ public class CardFactoryCreatures { @Override public void run() { + final GameState game = card.getGame(); int intermSumPower = 0; int intermSumToughness = 0; // intermSumPower = intermSumToughness = 0; @@ -264,7 +266,7 @@ public class CardFactoryCreatures { for (int m = 0; m < selection.size(); m++) { intermSumPower += selection.get(m).getBaseAttack(); intermSumToughness += selection.get(m).getBaseDefense(); - Singletons.getModel().getGame().getAction().exile(selection.get(m)); + game.getAction().exile(selection.get(m)); } } @@ -275,7 +277,7 @@ public class CardFactoryCreatures { if ((c.getNetAttack() <= 2) && (c.getNetDefense() <= 3)) { intermSumPower += c.getBaseAttack(); intermSumToughness += c.getBaseDefense(); - Singletons.getModel().getGame().getAction().exile(c); + game.getAction().exile(c); } // is this needed? card.getController().getZone(ZoneType.Battlefield).updateObservers(); @@ -305,10 +307,11 @@ public class CardFactoryCreatures { final Ability sacOrSac = new Ability(card, ManaCost.NO_COST) { @Override public void resolve() { + final GameState game = player.getGame(); if (player.isHuman()) { final InputSelectCards target = new InputSelectCards(0, Integer.MAX_VALUE) { private static final long serialVersionUID = 2698036349873486664L; - + @Override public String getMessage() { String toDisplay = cardName + " - Select any number of creatures to sacrifice. "; @@ -319,7 +322,7 @@ public class CardFactoryCreatures { @Override protected boolean isValidChoice(Card c) { - Zone zone = Singletons.getModel().getGame().getZoneOf(c); + Zone zone = game.getZoneOf(c); return c.isCreature() && zone.is(ZoneType.Battlefield, player); } // selectCard() @@ -341,10 +344,10 @@ public class CardFactoryCreatures { FThreads.setInputAndWait(target); if(!target.hasCancelled()) { for (final Card sac : target.getSelected()) { - Singletons.getModel().getGame().getAction().sacrifice(sac, null); + game.getAction().sacrifice(sac, null); } } else { - Singletons.getModel().getGame().getAction().sacrifice(card, null); + game.getAction().sacrifice(card, null); } Singletons.getModel().getMatch().getInput().setInput(target); diff --git a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java index 708008c432d..9657ea339fd 100644 --- a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java +++ b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java @@ -31,7 +31,6 @@ import forge.CardPredicates; import forge.FThreads; import forge.CardPredicates.Presets; import forge.Constant; -import forge.Singletons; import forge.card.CardType; import forge.card.cost.Cost; import forge.card.mana.ManaCost; @@ -56,10 +55,10 @@ import forge.gui.GuiChoose; */ public class CardFactorySorceries { - private static final void balanceLands(Spell card) { + private static final void balanceLands(GameState game, Spell card) { List> lands = new ArrayList>(); - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { lands.add(p.getLandsInPlay()); } @@ -70,7 +69,7 @@ public class CardFactorySorceries { min = Math.min(min, s); } Iterator> ll = lands.iterator(); - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { List l = ll.next(); int sac = l.size() - min; @@ -80,7 +79,7 @@ public class CardFactorySorceries { if (p.isComputer()) { CardLists.shuffle(l); for (int i = 0; i < sac; i++) { - Singletons.getModel().getGame().getAction().sacrifice(l.get(i), card); + game.getAction().sacrifice(l.get(i), card); } } else { final List list = CardLists.getType(p.getCardsIn(ZoneType.Battlefield), "Land"); @@ -94,13 +93,13 @@ public class CardFactorySorceries { } } - private static final void balanceHands(Spell spell) { + private static final void balanceHands(GameState game, Spell spell) { int min = Integer.MAX_VALUE; - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { min = Math.min(min, p.getZone(ZoneType.Hand).size()); } - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { List hand = p.getCardsIn(ZoneType.Hand); int sac = hand.size() - min; if (sac == 0) { @@ -121,9 +120,9 @@ public class CardFactorySorceries { } } - private static final void balanceCreatures(Spell card) { + private static final void balanceCreatures(GameState game, Spell card) { List> creats = new ArrayList>(); - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { creats.add(p.getCreaturesInPlay()); } @@ -133,7 +132,7 @@ public class CardFactorySorceries { min = Math.min(min, s); } Iterator> cc = creats.iterator(); - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { List c = cc.next(); int sac = c.size() - min; @@ -165,9 +164,10 @@ public class CardFactorySorceries { @Override public void resolve() { - balanceLands(this); - balanceHands(this); - balanceCreatures(this); + final GameState game = this.getActivatingPlayer().getGame(); + balanceLands(game, this); + balanceHands(game, this); + balanceCreatures(game, this); } @Override @@ -200,8 +200,9 @@ public class CardFactorySorceries { @Override public void resolve() { + final GameState game = getActivatingPlayer().getGame(); List types = new ArrayList(); - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { if (p.isHuman()) { types.add(GuiChoose.one("Which creature type?", Constant.CardTypes.CREATURE_TYPES)); } else { @@ -227,11 +228,11 @@ public class CardFactorySorceries { } } - List bidded = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES); + List bidded = CardLists.filter(game.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES); for (final Card c : bidded) { for (int i = 0; i < types.size(); i++) { if (c.isType(types.get(i))) { - Singletons.getModel().getGame().getAction().moveToPlay(c); + game.getAction().moveToPlay(c); i = types.size(); // break inner loop } } @@ -266,6 +267,7 @@ public class CardFactorySorceries { @Override public void resolve() { final Player p = card.getController(); + final GameState game = p.getGame(); int baseCMC = -1; final Card[] newArtifact = new Card[1]; @@ -275,7 +277,7 @@ public class CardFactorySorceries { if (toSac != null) { final Card c = (Card) toSac; baseCMC = c.getCMC(); - Singletons.getModel().getGame().getAction().sacrifice(c, this); + game.getAction().sacrifice(c, this); } else { return; } @@ -294,7 +296,6 @@ public class CardFactorySorceries { final int newCMC = newArtifact[0].getCMC(); // if <= baseCMC, put it onto the battlefield - final GameState game = Singletons.getModel().getGame(); if (newCMC <= baseCMC) { game.getAction().moveToPlay(newArtifact[0]); } else { diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 651d94dfe19..31dc7194f9c 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -41,7 +41,6 @@ import forge.Constant; import forge.CounterType; import forge.FThreads; import forge.GameEntity; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; @@ -66,6 +65,7 @@ import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerType; import forge.control.input.InputSelectCards; import forge.control.input.InputSelectCardsFromList; +import forge.game.GameState; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCost; import forge.game.phase.PhaseHandler; @@ -123,7 +123,7 @@ public class CardFactoryUtil { @Override public void resolve() { - final Card card = Singletons.getModel().getGame().getAction().moveToPlay(sourceCard); + final Card card = sourceCard.getGame().getAction().moveToPlay(sourceCard); card.addIntrinsicKeyword("At the beginning of the end step, exile CARDNAME."); card.addIntrinsicKeyword("Haste"); @@ -132,7 +132,7 @@ public class CardFactoryUtil { @Override public boolean canPlayAI() { - PhaseHandler phase = Singletons.getModel().getGame().getPhaseHandler(); + PhaseHandler phase = sourceCard.getGame().getPhaseHandler(); if (phase.getPhase().isAfter(PhaseType.MAIN1) || !phase.isPlayerTurn(getActivatingPlayer())) { return false; } @@ -168,7 +168,7 @@ public class CardFactoryUtil { @Override public void resolve() { - Card c = Singletons.getModel().getGame().getAction().moveToPlay(sourceCard); + Card c = sourceCard.getGame().getAction().moveToPlay(sourceCard); c.setPreFaceDownCharacteristic(CardCharacteristicName.Original); } @@ -176,7 +176,7 @@ public class CardFactoryUtil { public boolean canPlay() { //Lands do not have SpellPermanents. if (sourceCard.isLand()) { - return (Singletons.getModel().getGame().getZoneOf(sourceCard).is(ZoneType.Hand) || sourceCard.hasKeyword("May be played")) + return (sourceCard.getGame().getZoneOf(sourceCard).is(ZoneType.Hand) || sourceCard.hasKeyword("May be played")) && sourceCard.getController().canCastSorcery(); } else { @@ -212,7 +212,7 @@ public class CardFactoryUtil { StringBuilder sb = new StringBuilder(); sb.append(this.getActivatingPlayer()).append(" has unmorphed "); sb.append(sourceCard.getName()); - Singletons.getModel().getGame().getGameLog().add("ResolveStack", sb.toString(), 2); + sourceCard.getGame().getGameLog().add("ResolveStack", sb.toString(), 2); } } @@ -361,14 +361,12 @@ public class CardFactoryUtil { return; } - final Card o = GuiChoose.oneOrNone("Select a card", sameCost); - if (o != null) { + final Card c1 = GuiChoose.oneOrNone("Select a card", sameCost); + if (c1 != null) { // ability.setTargetCard((Card)o); sourceCard.getController().discard(sourceCard, this); - final Card c1 = o; - - Singletons.getModel().getGame().getAction().moveToHand(c1); + sourceCard.getGame().getAction().moveToHand(c1); } sourceCard.getController().shuffle(); @@ -430,7 +428,8 @@ public class CardFactoryUtil { @Override public void resolve() { - final Card c = Singletons.getModel().getGame().getAction().exile(sourceCard); + final GameState game = sourceCard.getGame(); + final Card c = game.getAction().exile(sourceCard); int counters = AbilityUtils.calculateAmount(c, timeCounters, this); c.addCounter(CounterType.TIME, counters, true); @@ -439,7 +438,7 @@ public class CardFactoryUtil { sb.append(this.getActivatingPlayer()).append(" has suspended "); sb.append(c.getName()).append("with "); sb.append(counters).append(" time counters on it."); - Singletons.getModel().getGame().getGameLog().add("ResolveStack", sb.toString(), 2); + game.getGameLog().add("ResolveStack", sb.toString(), 2); } }; final StringBuilder sbDesc = new StringBuilder(); @@ -657,7 +656,8 @@ public class CardFactoryUtil { */ public static boolean isTargetStillValid(final SpellAbility ability, final Card target) { - if (Singletons.getModel().getGame().getZoneOf(target) == null) { + Zone zone = target.getGame().getZoneOf(target); + if (zone == null) { return false; // for tokens that disappeared } @@ -673,7 +673,7 @@ public class CardFactoryUtil { // Check if the target is in the zone it needs to be in to be // targeted - if (!Singletons.getModel().getGame().getZoneOf(target).is(tgt.getZone())) { + if (!zone.is(tgt.getZone())) { return false; } } else { @@ -916,6 +916,7 @@ public class CardFactoryUtil { if (players.size() == 0) { return 0; } + final GameState game = source.getGame(); final String[] l = s.split("/"); final String m = extractOperators(s); @@ -954,7 +955,7 @@ public class CardFactoryUtil { final List vZone = ZoneType.listValueOf(lparts[0].split("Valid")[1]); String restrictions = l[0].replace(lparts[0] + " ", ""); final String[] rest = restrictions.split(","); - List cards = Singletons.getModel().getGame().getCardsIn(vZone); + List cards = game.getCardsIn(vZone); cards = CardLists.getValidCards(cards, rest, players.get(0), source); n = cards.size(); @@ -965,7 +966,7 @@ public class CardFactoryUtil { if (l[0].startsWith("Valid ")) { final String restrictions = l[0].substring(6); final String[] rest = restrictions.split(","); - List cardsonbattlefield = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List cardsonbattlefield = game.getCardsIn(ZoneType.Battlefield); cardsonbattlefield = CardLists.getValidCards(cardsonbattlefield, rest, players.get(0), source); n = cardsonbattlefield.size(); @@ -1131,7 +1132,9 @@ public class CardFactoryUtil { final Player cc = c.getController(); final Player ccOpp = cc.getOpponent(); - final Player activePlayer = cc.getGame().getPhaseHandler().getPlayerTurn(); + final GameState game = c.getGame(); + final Player activePlayer = game.getPhaseHandler().getPlayerTurn(); + final String[] l = expression.split("/"); final String m = extractOperators(expression); @@ -1209,7 +1212,7 @@ public class CardFactoryUtil { int highest = 0; for (final Object o : c.getRemembered()) { if (o instanceof Card) { - list.add(Singletons.getModel().getGame().getCardState((Card) o)); + list.add(game.getCardState((Card) o)); } } for (final Card crd : list) { @@ -1253,7 +1256,7 @@ public class CardFactoryUtil { final CounterType counterType = CounterType.valueOf(components[1]); String restrictions = components[2]; final String[] rest = restrictions.split(","); - List candidates = Singletons.getModel().getGame().getCardsInGame(); + List candidates = game.getCardsInGame(); candidates = CardLists.getValidCards(candidates, rest, cc, c); int added = 0; @@ -1264,7 +1267,7 @@ public class CardFactoryUtil { } if (l[0].startsWith("RolledThisTurn")) { - return Singletons.getModel().getGame().getPhaseHandler().getPlanarDiceRolledthisTurn(); + return game.getPhaseHandler().getPlanarDiceRolledthisTurn(); } final String[] sq; @@ -1277,7 +1280,7 @@ public class CardFactoryUtil { if (sq[0].equals("OppDrewThisTurn")) return doXMath(c.getController().getOpponent().getNumDrawnThisTurn(), m, c); - if (sq[0].equals("StormCount")) return doXMath(Singletons.getModel().getGame().getStack().getCardsCastThisTurn().size() - 1, m, c); + if (sq[0].equals("StormCount")) return doXMath(game.getStack().getCardsCastThisTurn().size() - 1, m, c); if (sq[0].equals("DamageDoneThisTurn")) return doXMath(c.getDamageDoneThisTurn(), m, c); if (sq[0].equals("BloodthirstAmount")) return doXMath(c.getController().getBloodthirstAmount(), m, c); if (sq[0].equals("RegeneratedThisTurn")) return doXMath(c.getRegeneratedThisTurn(), m, c); @@ -1419,7 +1422,7 @@ public class CardFactoryUtil { if (sq[0].contains("SumCMC")) { final String[] restrictions = l[0].split("_"); final String[] rest = restrictions[1].split(","); - List cardsonbattlefield = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List cardsonbattlefield = game.getCardsIn(ZoneType.Battlefield); List filteredCards = CardLists.getValidCards(cardsonbattlefield, rest, cc, c); return Aggregates.sum(filteredCards, CardPredicates.Accessors.fnGetCmc); } @@ -1446,7 +1449,7 @@ public class CardFactoryUtil { final String[] restrictions = l[0].split("_"); final CounterType cType = CounterType.getType(restrictions[1]); final String[] validFilter = restrictions[2].split(","); - List validCards = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List validCards = game.getCardsIn(ZoneType.Battlefield); validCards = CardLists.getValidCards(validCards, validFilter, cc, c); int cCount = 0; for (final Card card : validCards) { @@ -1529,7 +1532,7 @@ public class CardFactoryUtil { if (sq[0].equals("TotalTurns")) { // Sorry for the Singleton use, replace this once this function has game passed into it - return doXMath(Singletons.getModel().getGame().getPhaseHandler().getTurn(), m, c); + return doXMath(game.getPhaseHandler().getTurn(), m, c); } //Count$Random.. @@ -1587,6 +1590,7 @@ public class CardFactoryUtil { private static List getCardListForXCount(final Card c, final Player cc, final Player ccOpp, final String[] sq) { List someCards = new ArrayList(); + final GameState game = c.getGame(); // Generic Zone-based counting // Count$QualityAndZones.Subquality @@ -1681,7 +1685,7 @@ public class CardFactoryUtil { } if (sq[0].contains("SpellsOnStack")) { - someCards.addAll(Singletons.getModel().getGame().getCardsIn(ZoneType.Stack)); + someCards.addAll(game.getCardsIn(ZoneType.Stack)); } if (sq[0].contains("InAllHands")) { @@ -2016,7 +2020,6 @@ public class CardFactoryUtil { public static ArrayList getBushidoEffects(final Card c) { final ArrayList list = new ArrayList(); - final Card crd = c; for (final String kw : c.getKeyword()) { if (kw.contains("Bushido")) { @@ -2033,17 +2036,17 @@ public class CardFactoryUtil { @Override public void run() { - if (crd.isInPlay()) { - crd.addTempAttackBoost(-1 * magnitude); - crd.addTempDefenseBoost(-1 * magnitude); + if (c.isInPlay()) { + c.addTempAttackBoost(-1 * magnitude); + c.addTempDefenseBoost(-1 * magnitude); } } }; - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + c.getGame().getEndOfTurn().addUntil(untilEOT); - crd.addTempAttackBoost(magnitude); - crd.addTempDefenseBoost(magnitude); + c.addTempAttackBoost(magnitude); + c.addTempDefenseBoost(magnitude); } }; final StringBuilder sb = new StringBuilder(); @@ -2108,27 +2111,11 @@ public class CardFactoryUtil { } }; ability.setStackDescription("Fastbond - Deals 1 damage to you."); - - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability); - + c.getGame().getStack().addSimultaneousStackEntry(ability); } } } - /** - *

- * isNegativeCounter. - *

- * - * @param c - * a {@link forge.CounterType} object. - * @return a boolean. - */ - public static boolean isNegativeCounter(final CounterType c) { - return (c == CounterType.AGE) || (c == CounterType.BLAZE) || (c == CounterType.BRIBERY) || (c == CounterType.DOOM) - || (c == CounterType.ICE) || (c == CounterType.M1M1) || (c == CounterType.M0M2) || (c == CounterType.M0M1) - || (c == CounterType.TIME); - } public static void correctAbilityChainSourceCard(final SpellAbility sa, final Card card) { @@ -2720,7 +2707,7 @@ public class CardFactoryUtil { @Override public void resolve() { this.getTargetCard().addHauntedBy(card); - Singletons.getModel().getGame().getAction().exile(card); + card.getGame().getAction().exile(card); } }; haunterDiesWork.setDescription(hauntDescription); @@ -2728,8 +2715,9 @@ public class CardFactoryUtil { final Ability haunterDiesSetup = new Ability(card, ManaCost.ZERO) { @Override public void resolve() { + final GameState game = card.getGame(); this.setActivatingPlayer(card.getController()); - final List creats = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES); + final List creats = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); for (int i = 0; i < creats.size(); i++) { if (!creats.get(i).canBeTargetedBy(this)) { creats.remove(i); @@ -2748,7 +2736,7 @@ public class CardFactoryUtil { private static final long serialVersionUID = 1981791992623774490L; @Override protected boolean isValidChoice(Card c) { - Zone zone = Singletons.getModel().getGame().getZoneOf(c); + Zone zone = game.getZoneOf(c); if (!zone.is(ZoneType.Battlefield) || !c.isCreature()) { return false; } @@ -2760,7 +2748,7 @@ public class CardFactoryUtil { FThreads.setInputAndWait(target); if (!target.hasCancelled()) { haunterDiesWork.setTargetCard(target.getSelected().get(0)); - Singletons.getModel().getGame().getStack().add(haunterDiesWork); + game.getStack().add(haunterDiesWork); } } else { // AI choosing what to haunt @@ -2770,7 +2758,7 @@ public class CardFactoryUtil { } else { haunterDiesWork.setTargetCard(ComputerUtilCard.getWorstCreatureAI(creats)); } - Singletons.getModel().getGame().getStack().add(haunterDiesWork); + game.getStack().add(haunterDiesWork); } } }; @@ -2878,7 +2866,7 @@ public class CardFactoryUtil { @Override public void resolve() { card.setEvoked(true); - Singletons.getModel().getGame().getAction().moveToPlay(card); + card.getGame().getAction().moveToPlay(card); } @Override @@ -3054,10 +3042,11 @@ public class CardFactoryUtil { @Override public void run() { - final List cardsInPlay = CardLists.getType(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), "World"); + final GameState game = card.getGame(); + final List cardsInPlay = CardLists.getType(game.getCardsIn(ZoneType.Battlefield), "World"); cardsInPlay.remove(card); for (int i = 0; i < cardsInPlay.size(); i++) { - Singletons.getModel().getGame().getAction().sacrificeDestroy(cardsInPlay.get(i)); + game.getAction().sacrificeDestroy(cardsInPlay.get(i)); } } // execute() }; // Command @@ -3140,6 +3129,7 @@ public class CardFactoryUtil { @Override public void run() { final List creats = card.getController().getCreaturesInPlay(); + final GameState game = card.getGame(); creats.remove(card); // System.out.println("Creats size: " + creats.size()); @@ -3152,7 +3142,7 @@ public class CardFactoryUtil { for (Object o : selection) { Card dinner = (Card) o; card.addDevoured(dinner); - Singletons.getModel().getGame().getAction().sacrifice(dinner, null); + game.getAction().sacrifice(dinner, null); final HashMap runParams = new HashMap(); runParams.put("Devoured", dinner); card.getController().getGame().getTriggerHandler() @@ -3166,7 +3156,7 @@ public class CardFactoryUtil { final Card c = creats.get(i); if ((c.getNetAttack() <= 1) && ((c.getNetAttack() + c.getNetDefense()) <= 3)) { card.addDevoured(c); - Singletons.getModel().getGame().getAction().sacrifice(c, null); + game.getAction().sacrifice(c, null); final HashMap runParams = new HashMap(); runParams.put("Devoured", c); card.getController().getGame().getTriggerHandler() diff --git a/src/main/java/forge/card/cost/CostExile.java b/src/main/java/forge/card/cost/CostExile.java index 2543e88ac62..d45c2e4d690 100644 --- a/src/main/java/forge/card/cost/CostExile.java +++ b/src/main/java/forge/card/cost/CostExile.java @@ -24,7 +24,6 @@ import forge.Card; import forge.CardLists; import forge.CardPredicates; import forge.FThreads; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityStackInstance; @@ -164,8 +163,8 @@ public class CostExile extends CostPartWithList { return true; // this will always work } if (this.getFrom().equals(ZoneType.Stack)) { - for (int i = 0; i < Singletons.getModel().getGame().getStack().size(); i++) { - typeList.add(Singletons.getModel().getGame().getStack().peekAbility(i).getSourceCard()); + for (int i = 0; i < game.getStack().size(); i++) { + typeList.add(game.getStack().peekAbility(i).getSourceCard()); } } else { if (this.sameZone) { diff --git a/src/main/java/forge/card/cost/CostUntapType.java b/src/main/java/forge/card/cost/CostUntapType.java index dbaca47dd9f..91f431fd70a 100644 --- a/src/main/java/forge/card/cost/CostUntapType.java +++ b/src/main/java/forge/card/cost/CostUntapType.java @@ -22,7 +22,6 @@ import forge.Card; import forge.CardLists; import forge.CardPredicates.Presets; import forge.FThreads; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.spellability.SpellAbility; import forge.control.input.InputSelectCards; @@ -186,7 +185,7 @@ public class CostUntapType extends CostPartWithList { if (c == null) { final String sVar = ability.getSVar(amount); if (sVar.equals("XChoice")) { - List typeList = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List typeList = ai.getGame().getCardsIn(ZoneType.Battlefield); typeList = CardLists.getValidCards(typeList, this.getType().split(";"), ai, ability.getSourceCard()); if (!canUntapSource) { typeList.remove(source); diff --git a/src/main/java/forge/card/mana/ManaPool.java b/src/main/java/forge/card/mana/ManaPool.java index 846fc7afffc..ac66f403635 100644 --- a/src/main/java/forge/card/mana/ManaPool.java +++ b/src/main/java/forge/card/mana/ManaPool.java @@ -28,7 +28,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import forge.Constant; -import forge.Singletons; import forge.card.spellability.AbilityManaPart; import forge.card.spellability.SpellAbility; import forge.game.GlobalRuleChange; @@ -164,7 +163,7 @@ public class ManaPool { for (final Mana m : manaList) { this.addManaToPool(this.floatingMana, m); } - Singletons.getModel().getGame().getAction().checkStateEffects(); + owner.getGame().getAction().checkStateEffects(); owner.updateObservers(); } @@ -178,8 +177,7 @@ public class ManaPool { public final int clearPool(boolean isEndOfPhase) { int numRemoved = 0; - if (isEndOfPhase - && Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.manapoolsDontEmpty)) { + if (isEndOfPhase && owner.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.manapoolsDontEmpty)) { return numRemoved; } diff --git a/src/main/java/forge/card/replacement/ReplacementEffect.java b/src/main/java/forge/card/replacement/ReplacementEffect.java index 0ee9b0699d0..5dfbe2da0bd 100644 --- a/src/main/java/forge/card/replacement/ReplacementEffect.java +++ b/src/main/java/forge/card/replacement/ReplacementEffect.java @@ -22,11 +22,11 @@ import java.util.List; import java.util.Map; import forge.Card; -import forge.Singletons; import forge.card.TriggerReplacementBase; import forge.card.ability.AbilityUtils; import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; import forge.util.Expressions; @@ -168,21 +168,22 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { *

* requirementsCheck. *

+ * @param game * * @return a boolean. */ - public boolean requirementsCheck() { - return this.requirementsCheck(this.getMapParams()); + public boolean requirementsCheck(GameState game) { + return this.requirementsCheck(game, this.getMapParams()); } - public boolean requirementsCheck(Map params) { + public boolean requirementsCheck(GameState game, Map params) { if (this.isSuppressed()) { return false; // Effect removed by effect } if (params.containsKey("PlayerTurn")) { - if (params.get("PlayerTurn").equals("True") && !Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(this.getHostCard().getController())) { + if (params.get("PlayerTurn").equals("True") && !game.getPhaseHandler().isPlayerTurn(this.getHostCard().getController())) { return false; } } @@ -190,7 +191,7 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { if (params.containsKey("ActivePhases")) { boolean isPhase = false; List aPhases = PhaseType.parseRange(params.get("ActivePhases")); - final PhaseType currPhase = Singletons.getModel().getGame().getPhaseHandler().getPhase(); + final PhaseType currPhase = game.getPhaseHandler().getPhase(); for (final PhaseType s : aPhases) { if (s == currPhase) { isPhase = true; diff --git a/src/main/java/forge/card/replacement/ReplacementHandler.java b/src/main/java/forge/card/replacement/ReplacementHandler.java index 1bad49e95c3..5150c62c1a2 100644 --- a/src/main/java/forge/card/replacement/ReplacementHandler.java +++ b/src/main/java/forge/card/replacement/ReplacementHandler.java @@ -24,7 +24,6 @@ import java.util.List; import java.util.Map; import forge.Card; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.spellability.SpellAbility; @@ -48,9 +47,9 @@ public class ReplacementHandler { public ReplacementResult run(final HashMap runParams) { final Object affected = runParams.get("Affected"); - final GameState game = Singletons.getModel().getGame(); Player decider = null; + // Figure out who decides which of multiple replacements to apply // as well as whether or not to apply optional replacements. if (affected instanceof Player) { @@ -58,6 +57,7 @@ public class ReplacementHandler { } else { decider = ((Card) affected).getController(); } + final GameState game = decider.getGame(); if (runParams.get("Event").equals("Moved")) { ReplacementResult res = run(runParams, ReplacementLayer.Control, decider, game); @@ -113,7 +113,7 @@ public class ReplacementHandler { for (final ReplacementEffect replacementEffect : crd.getReplacementEffects()) { if (!replacementEffect.hasRun() && replacementEffect.getLayer() == layer - && replacementEffect.requirementsCheck() + && replacementEffect.requirementsCheck(game) && replacementEffect.canReplace(runParams) && !possibleReplacers.contains(replacementEffect) && replacementEffect.zonesCheck(game.getZoneOf(crd))) { @@ -151,7 +151,7 @@ public class ReplacementHandler { ReplacementResult res = this.executeReplacement(runParams, chosenRE, decider, game); if (res != ReplacementResult.NotReplaced) { chosenRE.setHasRun(false); - Singletons.getModel().getGame().getGameLog().add("ReplacementEffect", chosenRE.toString(), 2); + game.getGameLog().add("ReplacementEffect", chosenRE.toString(), 2); return res; } else { if (possibleReplacers.size() == 0) { diff --git a/src/main/java/forge/card/spellability/Ability.java b/src/main/java/forge/card/spellability/Ability.java index b0928b3b95a..b28db2993dc 100644 --- a/src/main/java/forge/card/spellability/Ability.java +++ b/src/main/java/forge/card/spellability/Ability.java @@ -20,9 +20,9 @@ package forge.card.spellability; import com.esotericsoftware.minlog.Log; import forge.Card; -import forge.Singletons; import forge.card.cost.Cost; import forge.card.mana.ManaCost; +import forge.game.GameState; /** *

@@ -71,7 +71,8 @@ public abstract class Ability extends SpellAbility { /** {@inheritDoc} */ @Override public boolean canPlay() { - if (Singletons.getModel().getGame().getStack().isSplitSecondOnStack() && !this.isManaAbility()) { + final GameState game = getActivatingPlayer().getGame(); + if (game.getStack().isSplitSecondOnStack() && !this.isManaAbility()) { return false; } diff --git a/src/main/java/forge/card/spellability/AbilityManaPart.java b/src/main/java/forge/card/spellability/AbilityManaPart.java index a5bd663586a..2f474cee2e1 100644 --- a/src/main/java/forge/card/spellability/AbilityManaPart.java +++ b/src/main/java/forge/card/spellability/AbilityManaPart.java @@ -22,7 +22,6 @@ import java.util.HashMap; import java.util.Map; import forge.Card; -import forge.Singletons; import forge.card.MagicColor; import forge.card.mana.Mana; import forge.card.mana.ManaPool; @@ -130,7 +129,7 @@ public class AbilityManaPart implements java.io.Serializable { runParams.put("Player", player); runParams.put("AbilityMana", sa); runParams.put("Produced", produced); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.TapsForMana, runParams, false); + player.getGame().getTriggerHandler().runTrigger(TriggerType.TapsForMana, runParams, false); } // end produceMana(String) diff --git a/src/main/java/forge/card/spellability/Spell.java b/src/main/java/forge/card/spellability/Spell.java index db953029357..fbe8ef07afe 100644 --- a/src/main/java/forge/card/spellability/Spell.java +++ b/src/main/java/forge/card/spellability/Spell.java @@ -22,7 +22,6 @@ import java.util.List; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.Cost; import forge.card.cost.CostPayment; @@ -69,7 +68,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable /** {@inheritDoc} */ @Override public boolean canPlay() { - final GameState game = Singletons.getModel().getGame(); + final GameState game = getActivatingPlayer().getGame(); if (game.getStack().isSplitSecondOnStack()) { return false; } @@ -121,9 +120,10 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable @Override public boolean canPlayAI() { final Card card = this.getSourceCard(); + final GameState game = getActivatingPlayer().getGame(); if (card.getSVar("NeedsToPlay").length() > 0) { final String needsToPlay = card.getSVar("NeedsToPlay"); - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, needsToPlay.split(","), card.getController(), card); if (list.isEmpty()) { diff --git a/src/main/java/forge/card/spellability/SpellAbility.java b/src/main/java/forge/card/spellability/SpellAbility.java index f9994a610b4..d2af02db152 100644 --- a/src/main/java/forge/card/spellability/SpellAbility.java +++ b/src/main/java/forge/card/spellability/SpellAbility.java @@ -28,13 +28,13 @@ import org.apache.commons.lang3.StringUtils; import forge.Card; import forge.GameEntity; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; import forge.card.cost.Cost; import forge.card.cost.CostPartMana; import forge.card.mana.Mana; import forge.card.mana.ManaCost; +import forge.game.GameState; import forge.game.player.AIPlayer; import forge.game.player.Player; import forge.util.TextUtil; @@ -1354,9 +1354,10 @@ public abstract class SpellAbility implements ISpellAbility { public List knownDetermineDefined(final String defined) { final List ret = new ArrayList(); final List list = AbilityUtils.getDefinedCards(getSourceCard(), defined, this); - + final GameState game = getActivatingPlayer().getGame(); + for (final Card c : list) { - final Card actualCard = Singletons.getModel().getGame().getCardState(c); + final Card actualCard = game.getCardState(c); ret.add(actualCard); } return ret; diff --git a/src/main/java/forge/card/spellability/SpellAbilityCondition.java b/src/main/java/forge/card/spellability/SpellAbilityCondition.java index c71e35f6f94..e2273af918e 100644 --- a/src/main/java/forge/card/spellability/SpellAbilityCondition.java +++ b/src/main/java/forge/card/spellability/SpellAbilityCondition.java @@ -23,9 +23,9 @@ import java.util.Map; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.cardfactory.CardFactoryUtil; +import forge.game.GameState; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -184,6 +184,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { System.out.println(sa.getSourceCard().getName() + " Did not have activator set in SpellAbility_Condition.checkConditions()"); } + final GameState game = activator.getGame(); if (this.isHellbent() && !activator.hasHellbent()) return false; if (this.isThreshold() && !activator.hasThreshold()) return false; @@ -220,7 +221,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { if (this.getPhases().size() > 0) { boolean isPhase = false; - final PhaseType currPhase = Singletons.getModel().getGame().getPhaseHandler().getPhase(); + final PhaseType currPhase = game.getPhaseHandler().getPhase(); for (final PhaseType s : this.getPhases()) { if (s == currPhase) { isPhase = true; @@ -270,7 +271,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { if (this.getPresentDefined() != null) { list.addAll(AbilityUtils.getDefinedCards(sa.getSourceCard(), this.getPresentDefined(), sa)); } else { - list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + list = game.getCardsIn(ZoneType.Battlefield); } list = CardLists.getValidCards(list, this.getIsPresent().split(","), sa.getActivatingPlayer(), sa.getSourceCard()); diff --git a/src/main/java/forge/card/spellability/SpellAbilityRestriction.java b/src/main/java/forge/card/spellability/SpellAbilityRestriction.java index 393df24856e..f6603459b73 100644 --- a/src/main/java/forge/card/spellability/SpellAbilityRestriction.java +++ b/src/main/java/forge/card/spellability/SpellAbilityRestriction.java @@ -23,9 +23,9 @@ import java.util.Map; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.cardfactory.CardFactoryUtil; +import forge.game.GameState; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.zone.Zone; @@ -192,8 +192,10 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { if (this.getZone() == null) { return true; } - Zone cardZone = Singletons.getModel().getGame().getZoneOf(c); + Player activator = sa.getActivatingPlayer(); + Zone cardZone = activator.getGame().getZoneOf(c); + if (cardZone == null || !cardZone.is(this.getZone())) { // If Card is not in the default activating zone, do some additional checks // Not a Spell, or on Battlefield, return false @@ -225,18 +227,19 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { */ public final boolean checkTimingRestrictions(final Card c, final SpellAbility sa) { Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); - if (this.isPlayerTurn() && !Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(activator)) { + if (this.isPlayerTurn() && !game.getPhaseHandler().isPlayerTurn(activator)) { return false; } - if (this.isOpponentTurn() && !Singletons.getModel().getGame().getPhaseHandler().getPlayerTurn().isOpponentOf(activator)) { + if (this.isOpponentTurn() && !game.getPhaseHandler().getPlayerTurn().isOpponentOf(activator)) { return false; } if (this.getPhases().size() > 0) { boolean isPhase = false; - final PhaseType currPhase = Singletons.getModel().getGame().getPhaseHandler().getPhase(); + final PhaseType currPhase = game.getPhaseHandler().getPhase(); for (final PhaseType s : this.getPhases()) { if (s == currPhase) { isPhase = true; @@ -300,6 +303,8 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { System.out.println(c.getName() + " Did not have activator set in SpellAbilityRestriction.canPlay()"); } + final GameState game = activator.getGame(); + if (this.isSorcerySpeed() && !activator.canCastSorcery()) { return false; } @@ -366,7 +371,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { } } if (this.getIsPresent() != null) { - List list = Singletons.getModel().getGame().getCardsIn(this.getPresentZone()); + List list = game.getCardsIn(this.getPresentZone()); list = CardLists.getValidCards(list, this.getIsPresent().split(","), activator, c); diff --git a/src/main/java/forge/card/spellability/SpellPermanent.java b/src/main/java/forge/card/spellability/SpellPermanent.java index e3262574993..58ce8de30b7 100644 --- a/src/main/java/forge/card/spellability/SpellPermanent.java +++ b/src/main/java/forge/card/spellability/SpellPermanent.java @@ -29,7 +29,6 @@ import com.google.common.collect.Iterables; import forge.Card; import forge.CardLists; import forge.CardPredicates; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.ability.ApiType; import forge.card.cost.Cost; @@ -38,6 +37,7 @@ import forge.card.replacement.ReplaceMoved; import forge.card.replacement.ReplacementEffect; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerType; +import forge.game.GameState; import forge.game.GlobalRuleChange; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCost; @@ -94,7 +94,8 @@ public class SpellPermanent extends Spell { final Card card = this.getSourceCard(); ManaCost mana = this.getPayCosts().getTotalMana(); - Player ai = getActivatingPlayer(); + final Player ai = getActivatingPlayer(); + final GameState game = ai.getGame(); if (mana.countX() > 0) { // Set PayX here to maximum value. final int xPay = ComputerUtilMana.determineLeftoverMana(this, ai); @@ -104,22 +105,22 @@ public class SpellPermanent extends Spell { card.setSVar("PayX", Integer.toString(xPay)); } // Wait for Main2 if possible - if (Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.MAIN1) + if (game.getPhaseHandler().is(PhaseType.MAIN1) && !ComputerUtil.castPermanentInMain1(ai, this) - && Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai)) { + && game.getPhaseHandler().isPlayerTurn(ai)) { return false; } // save cards with flash for surprise blocking if (card.hasKeyword("Flash") && !card.hasETBTrigger() - && (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai) - || Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))) { + && (game.getPhaseHandler().isPlayerTurn(ai) + || game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))) { return false; } // Prevent the computer from summoning Ball Lightning type creatures after attacking if (card.hasKeyword("At the beginning of the end step, sacrifice CARDNAME.") - && (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai.getOpponent()) - || Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS))) { + && (game.getPhaseHandler().isPlayerTurn(ai.getOpponent()) + || game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS))) { return false; } @@ -164,7 +165,7 @@ public class SpellPermanent extends Spell { // check on legendary if (card.isType("Legendary") - && !Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule)) { + && !ai.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule)) { final List list = ai.getCardsIn(ZoneType.Battlefield); if (Iterables.any(list, CardPredicates.nameEquals(card.getName()))) { return false; @@ -210,9 +211,10 @@ public class SpellPermanent extends Spell { public static boolean checkETBEffects(final Card card, final SpellAbility sa, final ApiType api, final AIPlayer ai) { boolean rightapi = false; + final GameState game = ai.getGame(); if (card.isCreature() - && Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCreatureETBTriggers)) { + && ai.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCreatureETBTriggers)) { return api == null; } @@ -248,7 +250,7 @@ public class SpellPermanent extends Spell { } } - if (!tr.requirementsCheck()) { + if (!tr.requirementsCheck(game)) { continue; } @@ -333,7 +335,7 @@ public class SpellPermanent extends Spell { } } - if (!re.requirementsCheck()) { + if (!re.requirementsCheck(game)) { continue; } final SpellAbility exSA = re.getOverridingAbility(); @@ -370,6 +372,6 @@ public class SpellPermanent extends Spell { public void resolve() { Card c = this.getSourceCard(); c.setController(this.getActivatingPlayer(), 0); - Singletons.getModel().getGame().getAction().moveTo(ZoneType.Battlefield, c); + this.getActivatingPlayer().getGame().getAction().moveTo(ZoneType.Battlefield, c); } } diff --git a/src/main/java/forge/card/spellability/Target.java b/src/main/java/forge/card/spellability/Target.java index bf42de7ead9..4c5eed5ba38 100644 --- a/src/main/java/forge/card/spellability/Target.java +++ b/src/main/java/forge/card/spellability/Target.java @@ -23,9 +23,9 @@ import java.util.HashMap; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.CardType; import forge.card.ability.AbilityUtils; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -660,7 +660,8 @@ public class Target { * @return a boolean. */ public final boolean hasCandidates(final SpellAbility sa, final boolean isTargeted) { - for (Player player : Singletons.getModel().getGame().getPlayers()) { + final GameState game = sa.getActivatingPlayer().getGame(); + for (Player player : game.getPlayers()) { if (sa.canTarget(player)) { return true; } @@ -670,7 +671,7 @@ public class Target { // Stack Zone targets are considered later return true; } else { - for (final Card c : Singletons.getModel().getGame().getCardsIn(this.tgtZone)) { + for (final Card c : game.getCardsIn(this.tgtZone)) { boolean isValidTarget = c.isValid(this.validTgts, this.srcCard.getController(), this.srcCard); boolean canTarget = (!isTargeted || c.canBeTargetedBy(sa)); boolean isAlreadyTargeted = this.getTargetCards().contains(c); @@ -711,15 +712,16 @@ public class Target { * @return a List. */ public final List getAllCandidates(final SpellAbility sa, final boolean isTargeted) { + final GameState game = sa.getActivatingPlayer().getGame(); List candidates = new ArrayList(); - for (Player player : Singletons.getModel().getGame().getPlayers()) { + for (Player player : game.getPlayers()) { if (sa.canTarget(player)) { candidates.add(player); } } if (this.tgtZone.contains(ZoneType.Stack)) { - for (final Card c : Singletons.getModel().getGame().getStackZone().getCards()) { + for (final Card c : game.getStackZone().getCards()) { boolean isValidTarget = c.isValid(this.validTgts, this.srcCard.getController(), this.srcCard); boolean canTarget = (!isTargeted || c.canBeTargetedBy(sa)); boolean isAlreadyTargeted = this.getTargetCards().contains(c); @@ -728,7 +730,7 @@ public class Target { } } } else { - for (final Card c : Singletons.getModel().getGame().getCardsIn(this.tgtZone)) { + for (final Card c : game.getCardsIn(this.tgtZone)) { boolean isValidTarget = c.isValid(this.validTgts, this.srcCard.getController(), this.srcCard); boolean canTarget = (!isTargeted || c.canBeTargetedBy(sa)); boolean isAlreadyTargeted = this.getTargetCards().contains(c); diff --git a/src/main/java/forge/card/staticability/StaticAbility.java b/src/main/java/forge/card/staticability/StaticAbility.java index 43e0275193c..dac6307b005 100644 --- a/src/main/java/forge/card/staticability/StaticAbility.java +++ b/src/main/java/forge/card/staticability/StaticAbility.java @@ -24,7 +24,6 @@ import java.util.Map; import forge.Card; import forge.Constant; import forge.GameEntity; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.cost.Cost; import forge.card.mana.ManaCostBeingPaid; @@ -469,7 +468,7 @@ public class StaticAbility { if (this.params.containsKey("EffectZone")) { if (!this.params.get("EffectZone").equals("All") && !ZoneType.listValueOf(this.params.get("EffectZone")) - .contains(Singletons.getModel().getGame().getZoneOf(this.hostCard).getZoneType())) { + .contains(controller.getGame().getZoneOf(this.hostCard).getZoneType())) { return false; } } else { @@ -514,7 +513,7 @@ public class StaticAbility { if (this.params.containsKey("Phases")) { List phases = PhaseType.parseRange(this.params.get("Phases")); - if (!phases.contains(Singletons.getModel().getGame().getPhaseHandler().getPhase())) { + if (!phases.contains(controller.getGame().getPhaseHandler().getPhase())) { return false; } } diff --git a/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java b/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java index f0bd547b1f5..45211491cc2 100644 --- a/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java +++ b/src/main/java/forge/card/staticability/StaticAbilityCantBeCast.java @@ -21,7 +21,6 @@ import java.util.HashMap; import java.util.List; import forge.Card; -import forge.Singletons; import forge.card.spellability.SpellAbility; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -62,7 +61,7 @@ public class StaticAbilityCantBeCast { if (params.containsKey("Origin")) { List src = ZoneType.listValueOf(params.get("Origin")); - if (!src.contains(Singletons.getModel().getGame().getZoneOf(card).getZoneType())) { + if (!src.contains(activator.getGame().getZoneOf(card).getZoneType())) { return false; } } diff --git a/src/main/java/forge/card/staticability/StaticAbilityContinuous.java b/src/main/java/forge/card/staticability/StaticAbilityContinuous.java index 45450694d1f..103e2bc4bdd 100644 --- a/src/main/java/forge/card/staticability/StaticAbilityContinuous.java +++ b/src/main/java/forge/card/staticability/StaticAbilityContinuous.java @@ -27,7 +27,6 @@ import org.apache.commons.lang3.StringUtils; import forge.Card; import forge.CardLists; import forge.CardUtil; -import forge.Singletons; import forge.StaticEffect; import forge.StaticEffects; import forge.card.CardType; @@ -40,6 +39,7 @@ import forge.card.spellability.AbilityActivated; import forge.card.spellability.SpellAbility; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; +import forge.game.GameState; import forge.game.GlobalRuleChange; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -64,13 +64,14 @@ public class StaticAbilityContinuous { final StaticEffect se = new StaticEffect(); final List affectedCards = StaticAbilityContinuous.getAffectedCards(stAb); final ArrayList affectedPlayers = StaticAbilityContinuous.getAffectedPlayers(stAb); + final GameState game = hostCard.getGame(); se.setAffectedCards(affectedCards); se.setAffectedPlayers(affectedPlayers); se.setParams(params); se.setTimestamp(hostCard.getTimestamp()); se.setSource(hostCard); - Singletons.getModel().getGame().getStaticEffects().addStaticEffect(se); + game.getStaticEffects().addStaticEffect(se); String addP = ""; int powerBonus = 0; @@ -100,7 +101,7 @@ public class StaticAbilityContinuous { //Global rules changes if (params.containsKey("GlobalRule")) { - final StaticEffects effects = Singletons.getModel().getGame().getStaticEffects(); + final StaticEffects effects = game.getStaticEffects(); effects.setGlobalRuleChange(GlobalRuleChange.fromString(params.get("GlobalRule"))); } @@ -273,7 +274,7 @@ public class StaticAbilityContinuous { } } - List cardsIGainedAbilitiesFrom = Singletons.getModel().getGame().getCardsIn(validZones); + List cardsIGainedAbilitiesFrom = game.getCardsIn(validZones); cardsIGainedAbilitiesFrom = CardLists.getValidCards(cardsIGainedAbilitiesFrom, valids, hostCard.getController(), hostCard); if (cardsIGainedAbilitiesFrom.size() > 0) { @@ -475,7 +476,7 @@ public class StaticAbilityContinuous { final String[] strngs = params.get("Affected").split(","); - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : controller.getGame().getPlayers()) { if (p.isValid(strngs, controller, hostCard)) { players.add(p); } @@ -487,6 +488,7 @@ public class StaticAbilityContinuous { private static List getAffectedCards(final StaticAbility stAb) { final HashMap params = stAb.getMapParams(); final Card hostCard = stAb.getHostCard(); + final GameState game = hostCard.getGame(); final Player controller = hostCard.getController(); if (params.containsKey("CharacteristicDefining")) { @@ -497,9 +499,9 @@ public class StaticAbilityContinuous { List affectedCards = new ArrayList(); if (params.containsKey("AffectedZone")) { - affectedCards.addAll(Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf(params.get("AffectedZone")))); + affectedCards.addAll(game.getCardsIn(ZoneType.listValueOf(params.get("AffectedZone")))); } else { - affectedCards = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + affectedCards = game.getCardsIn(ZoneType.Battlefield); } if (params.containsKey("Affected") && !params.get("Affected").contains(",")) { diff --git a/src/main/java/forge/card/trigger/Trigger.java b/src/main/java/forge/card/trigger/Trigger.java index c4f5b50d8aa..2f3ce456e1d 100644 --- a/src/main/java/forge/card/trigger/Trigger.java +++ b/src/main/java/forge/card/trigger/Trigger.java @@ -23,11 +23,11 @@ import java.util.List; import java.util.Map; import forge.Card; -import forge.Singletons; import forge.card.TriggerReplacementBase; import forge.card.spellability.Ability; import forge.card.spellability.OptionalCost; import forge.card.spellability.SpellAbility; +import forge.game.GameState; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; @@ -223,8 +223,8 @@ public abstract class Trigger extends TriggerReplacementBase { * * @return a boolean. */ - public final boolean phasesCheck() { - PhaseHandler phaseHandler = Singletons.getModel().getGame().getPhaseHandler(); + public final boolean phasesCheck(final GameState game) { + PhaseHandler phaseHandler = game.getPhaseHandler(); if (null != validPhases) { if (!validPhases.contains(phaseHandler.getPhase())) { return false; @@ -255,28 +255,30 @@ public abstract class Trigger extends TriggerReplacementBase { *

* requirementsCheck. *

+ * @param game * * @return a boolean. */ - public final boolean requirementsCheck() { - return this.requirementsCheck(this.getRunParams()); + public final boolean requirementsCheck(GameState game) { + return this.requirementsCheck(game, this.getRunParams()); } /** *

* requirementsCheck. *

+ * @param game * * @param runParams2 * a {@link java.util.HashMap} object. * @return a boolean. */ - public final boolean requirementsCheck(final Map runParams2) { + public final boolean requirementsCheck(GameState game, final Map runParams2) { if (this.getMapParams().containsKey("APlayerHasMoreLifeThanEachOther")) { int highestLife = -50; // Negative base just in case a few Lich's or Platinum Angels are running around final List healthiest = new ArrayList(); - for (final Player p : Singletons.getModel().getGame().getPlayers()) { + for (final Player p : game.getPlayers()) { if (p.getLife() > highestLife) { healthiest.clear(); highestLife = p.getLife(); @@ -296,7 +298,7 @@ public abstract class Trigger extends TriggerReplacementBase { if (this.getMapParams().containsKey("APlayerHasMostCardsInHand")) { int largestHand = 0; final List withLargestHand = new ArrayList(); - for (final Player p : Singletons.getModel().getGame().getPlayers()) { + for (final Player p : game.getPlayers()) { if (p.getCardsIn(ZoneType.Hand).size() > largestHand) { withLargestHand.clear(); largestHand = p.getCardsIn(ZoneType.Hand).size(); diff --git a/src/main/java/forge/card/trigger/TriggerHandler.java b/src/main/java/forge/card/trigger/TriggerHandler.java index bf37f7b5691..0486d9cdaf9 100644 --- a/src/main/java/forge/card/trigger/TriggerHandler.java +++ b/src/main/java/forge/card/trigger/TriggerHandler.java @@ -25,7 +25,6 @@ import java.util.Map; import forge.Card; import forge.CardLists; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; @@ -48,9 +47,18 @@ public class TriggerHandler { private final ArrayList delayedTriggers = new ArrayList(); private final List waitingTriggers = new ArrayList(); + private final GameState game; + + /** + * TODO: Write javadoc for Constructor. + * @param gameState + */ + public TriggerHandler(GameState gameState) { + game = gameState; + } public final void cleanUpTemporaryTriggers() { - final List absolutelyAllCards = Singletons.getModel().getGame().getCardsInGame(); + final List absolutelyAllCards = game.getCardsInGame(); for (final Card c : absolutelyAllCards) { for (int i = 0; i < c.getTriggers().size(); i++) { if (c.getTriggers().get(i).isTemporary()) { @@ -162,8 +170,6 @@ public class TriggerHandler { return; } - final GameState game = Singletons.getModel().getGame(); - //runWaitingTrigger(new TriggerWaiting(mode, runParams)); if (game.getStack().isFrozen() || holdTrigger) { @@ -181,7 +187,7 @@ public class TriggerHandler { return false; } - Singletons.getModel().getGame().getAction().checkStaticAbilities(); + game.getAction().checkStaticAbilities(); boolean haveWaiting = false; for (TriggerWaiting wt : waiting) { @@ -194,7 +200,6 @@ public class TriggerHandler { public final boolean runWaitingTrigger(TriggerWaiting wt) { final TriggerType mode = wt.getMode(); final Map runParams = wt.getParams(); - final GameState game = Singletons.getModel().getGame(); final Player playerAP = game.getPhaseHandler().getPlayerTurn(); if (playerAP == null) { @@ -295,17 +300,16 @@ public class TriggerHandler { // Return true if the trigger went off, false otherwise. private boolean runSingleTrigger(final Trigger regtrig, final TriggerType mode, final Map runParams) { final Map triggerParams = regtrig.getMapParams(); - final GameState game = Singletons.getModel().getGame(); if (regtrig.getMode() != mode) { return false; // Not the right mode. } - if (!regtrig.phasesCheck()) { + if (!regtrig.phasesCheck(game)) { return false; // It's not the right phase to go off. } - if (!regtrig.requirementsCheck(runParams)) { + if (!regtrig.requirementsCheck(game, runParams)) { return false; // Conditions aren't right. } if (regtrig.getHostCard().isFaceDown() && regtrig.isIntrinsic()) { @@ -343,7 +347,7 @@ public class TriggerHandler { } // Torpor Orb check // Any trigger should cause the phase not to skip - for (Player p : Singletons.getModel().getGame().getPlayers()) { + for (Player p : game.getPlayers()) { p.getController().autoPassCancel(); } diff --git a/src/main/java/forge/card/trigger/TriggerSpellAbilityCast.java b/src/main/java/forge/card/trigger/TriggerSpellAbilityCast.java index 71634308dd1..cf83266fa8d 100644 --- a/src/main/java/forge/card/trigger/TriggerSpellAbilityCast.java +++ b/src/main/java/forge/card/trigger/TriggerSpellAbilityCast.java @@ -18,11 +18,11 @@ package forge.card.trigger; import forge.Card; -import forge.Singletons; import forge.card.cost.Cost; import forge.card.spellability.OptionalCost; import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityStackInstance; +import forge.game.GameState; import forge.game.player.Player; /** @@ -56,7 +56,8 @@ public class TriggerSpellAbilityCast extends Trigger { public final boolean performTest(final java.util.Map runParams2) { final SpellAbility spellAbility = (SpellAbility) runParams2.get("CastSA"); final Card cast = spellAbility.getSourceCard(); - final SpellAbilityStackInstance si = Singletons.getModel().getGame().getStack().getInstanceFromSpellAbility(spellAbility); + final GameState game = cast.getGame(); + final SpellAbilityStackInstance si = game.getStack().getInstanceFromSpellAbility(spellAbility); if (this.getMode() == TriggerType.SpellCast) { if (!spellAbility.isSpell()) { diff --git a/src/main/java/forge/card/trigger/WrappedAbility.java b/src/main/java/forge/card/trigger/WrappedAbility.java index 85e5331bb75..60dc05c07b3 100644 --- a/src/main/java/forge/card/trigger/WrappedAbility.java +++ b/src/main/java/forge/card/trigger/WrappedAbility.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Map; import forge.Card; -import forge.Singletons; import forge.card.ability.ApiType; import forge.card.cost.Cost; import forge.card.mana.ManaCost; @@ -350,13 +349,16 @@ public class WrappedAbility extends Ability implements ISpellAbility { // ////////////////////////////////////// @Override public void resolve() { - final GameState game = Singletons.getModel().getGame(); + final GameState game = sa.getActivatingPlayer().getGame(); + if (!(regtrig instanceof TriggerAlways)) { // State triggers don't have "Intervening If" - if (!regtrig.requirementsCheck()) { + if (!regtrig.requirementsCheck(game)) { return; } } + + TriggerHandler th = game.getTriggerHandler(); Map triggerParams = regtrig.getMapParams(); diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index 958586e2c6a..80b114d3617 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -110,10 +110,9 @@ public enum FControl { this.waConcede = new WindowAdapter() { @Override public void windowClosing(final WindowEvent e) { - Singletons.getView().getFrame().setDefaultCloseOperation( - WindowConstants.DO_NOTHING_ON_CLOSE); + Singletons.getView().getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - if (!Singletons.getModel().getGame().isGameOver()) + if (!Singletons.getModel().getMatch().getCurrentGame().isGameOver()) CDock.SINGLETON_INSTANCE.concede(); else { Singletons.getControl().changeState(FControl.Screens.HOME_SCREEN); diff --git a/src/main/java/forge/control/input/InputBlock.java b/src/main/java/forge/control/input/InputBlock.java index 83934150f11..5f66cc2b516 100644 --- a/src/main/java/forge/control/input/InputBlock.java +++ b/src/main/java/forge/control/input/InputBlock.java @@ -121,7 +121,7 @@ public class InputBlock extends InputBase { this.currentAttacker = card; reminder = false; } else { - Zone zone = Singletons.getModel().getGame().getZoneOf(card); + Zone zone = game.getZoneOf(card); // Make sure this card is valid to even be a blocker if (this.currentAttacker != null && card.isCreature() && card.getController().equals(player) && zone.is(ZoneType.Battlefield, player)) { @@ -132,9 +132,9 @@ public class InputBlock extends InputBase { List attackersBlocked = this.allBlocking.get(card); if (!attackersBlocked.contains(this.currentAttacker) - && CombatUtil.canBlock(this.currentAttacker, card, Singletons.getModel().getGame().getCombat())) { + && CombatUtil.canBlock(this.currentAttacker, card, game.getCombat())) { attackersBlocked.add(this.currentAttacker); - Singletons.getModel().getGame().getCombat().addBlocker(this.currentAttacker, card); + game.getCombat().addBlocker(this.currentAttacker, card); reminder = false; } } diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 5df1d169402..2bacd75c510 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -24,6 +24,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; +import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; @@ -855,6 +856,7 @@ public class GameAction { public final void checkStaticAbilities() { // remove old effects game.getStaticEffects().clearStaticEffects(); + game.getTriggerHandler().cleanUpTemporaryTriggers(); // search for cards with static abilities final List allCards = game.getCardsInGame(); @@ -892,11 +894,11 @@ public class GameAction { // card state effects like Glorious Anthem for (final String effect : game.getStaticEffects().getStateBasedMap().keySet()) { - final Command com = GameActionUtil.getCommands().get(effect); - com.run(); + final Function com = GameActionUtil.getCommands().get(effect); + com.apply(game); } - GameActionUtil.grantBasicLandsManaAbilities(); + GameActionUtil.grantBasicLandsManaAbilities(game); } /** diff --git a/src/main/java/forge/game/GameActionUtil.java b/src/main/java/forge/game/GameActionUtil.java index 0dc90b799bf..aa42ddd3b27 100644 --- a/src/main/java/forge/game/GameActionUtil.java +++ b/src/main/java/forge/game/GameActionUtil.java @@ -24,6 +24,7 @@ import java.util.Map; import org.apache.commons.lang3.StringUtils; +import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -36,7 +37,6 @@ import forge.Command; import forge.Constant; import forge.CounterType; import forge.FThreads; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityFactory.AbilityRecordType; import forge.card.ability.AbilityUtils; @@ -106,7 +106,7 @@ public final class GameActionUtil { @Override public void resolve() { - final GameState game = Singletons.getModel().getGame(); + final GameState game = affected.getGame(); if ( canRegenerate ) game.getAction().destroy(affected, this); else @@ -133,7 +133,7 @@ public final class GameActionUtil { @Override public void resolve() { - final GameState game = Singletons.getModel().getGame(); + final GameState game =controller.getGame(); final List topOfLibrary = controller.getCardsIn(ZoneType.Library); final List revealed = new ArrayList(); @@ -192,7 +192,7 @@ public final class GameActionUtil { @Override public void run() { if (!c.isCopiedSpell()) { - final List maelstromNexii = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Maelstrom Nexus")); + final List maelstromNexii = CardLists.filter(controller.getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Maelstrom Nexus")); for (final Card nexus : maelstromNexii) { if (CardUtil.getThisTurnCast("Card.YouCtrl", nexus).size() == 1) { @@ -292,7 +292,7 @@ public final class GameActionUtil { } CardLists.shuffle(revealed); for (final Card bottom : revealed) { - Singletons.getModel().getGame().getAction().moveToBottomOfLibrary(bottom); + controller.getGame().getAction().moveToBottomOfLibrary(bottom); } } @@ -345,7 +345,7 @@ public final class GameActionUtil { ability.setDescription(sb.toString()); ability.setActivatingPlayer(controller); - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability); + controller.getGame().getStack().addSimultaneousStackEntry(ability); } } @@ -366,7 +366,7 @@ public final class GameActionUtil { public static void executePlayCardEffects(final SpellAbility sa) { // (called in MagicStack.java) - final GameState game = Singletons.getModel().getGame(); + final GameState game = sa.getActivatingPlayer().getGame(); final Command cascade = new CascadeExecutor(sa.getActivatingPlayer(), sa.getSourceCard(), game); cascade.run(); final Command ripple = new RippleExecutor(sa.getActivatingPlayer(), sa.getSourceCard()); @@ -636,6 +636,7 @@ public final class GameActionUtil { if (damage <= 0) { return; } + final GameState game = source.getGame(); if (affected.hasStartOfKeyword("When CARDNAME is dealt damage, destroy it.")) { final Ability ability = new AbilityDestroy(source, affected, true); @@ -648,17 +649,17 @@ public final class GameActionUtil { final int amount = affected.getAmountOfKeyword("When CARDNAME is dealt damage, destroy it. It can't be regenerated."); for (int i = 0; i < amount; i++) { - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability2); + game.getStack().addSimultaneousStackEntry(ability2); } final int amount2 = affected.getAmountOfKeyword("When CARDNAME is dealt damage, destroy it."); for (int i = 0; i < amount2; i++) { - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability); + game.getStack().addSimultaneousStackEntry(ability); } } // Play the Damage sound - Singletons.getModel().getGame().getEvents().post(new CardDamagedEvent()); + game.getEvents().post(new CardDamagedEvent()); } // this is for cards like Sengir Vampire @@ -701,7 +702,7 @@ public final class GameActionUtil { } ability2.setStackDescription(sb.toString()); - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability2); + c.getGame().getStack().addSimultaneousStackEntry(ability2); } } @@ -727,7 +728,7 @@ public final class GameActionUtil { c.getDamageHistory().registerDamage(player); // Play the Life Loss sound - Singletons.getModel().getGame().getEvents().post(new LifeLossEvent()); + player.getGame().getEvents().post(new LifeLossEvent()); } // restricted to combat damage, restricted to players @@ -781,7 +782,7 @@ public final class GameActionUtil { for (String kw : c.getKeyword()) { if (kw.startsWith("Poisonous")) { - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability); + player.getGame().getStack().addSimultaneousStackEntry(ability); } } } @@ -796,7 +797,7 @@ public final class GameActionUtil { c.getDamageHistory().registerCombatDamage(player); // Play the Life Loss sound - Singletons.getModel().getGame().getEvents().post(SoundEffectType.LifeLoss); + player.getGame().getEvents().post(SoundEffectType.LifeLoss); } // executeCombatDamageToPlayerEffects /** @@ -821,7 +822,7 @@ public final class GameActionUtil { doubleLife.setStackDescription(aura.getName() + " - " + enchanted.getController() + " doubles his or her life total."); - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(doubleLife); + enchanted.getGame().getStack().addSimultaneousStackEntry(doubleLife); } } @@ -838,6 +839,7 @@ public final class GameActionUtil { private static void playerCombatDamageScalpelexis(final Card c) { final Player player = c.getController(); final Player opponent = player.getOpponent(); + final GameState game = player.getGame(); if (c.getNetAttack() > 0) { final Ability ability = new Ability(c, ManaCost.ZERO) { @@ -891,7 +893,7 @@ public final class GameActionUtil { for (int j = 0; j < max; j++) { final Card c = libList.get(j); - Singletons.getModel().getGame().getAction().exile(c); + game.getAction().exile(c); } } }; // ability @@ -903,19 +905,17 @@ public final class GameActionUtil { ability.setStackDescription(sb.toString()); ability.setDescription(sb.toString()); - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability); + game.getStack().addSimultaneousStackEntry(ability); } } /** stores the Command. */ - private static Command umbraStalker = new Command() { - private static final long serialVersionUID = -3500747003228938898L; - + private static Function umbraStalker = new Function() { @Override - public void run() { + public Object apply(GameState game) { // get all creatures - final List cards = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Umbra Stalker")); + final List cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Umbra Stalker")); for (final Card c : cards) { final Player player = c.getController(); final List grave = player.getCardsIn(ZoneType.Graveyard); @@ -923,16 +923,16 @@ public final class GameActionUtil { c.setBaseAttack(pt); c.setBaseDefense(pt); } + return null; } // execute() }; /** Constant oldManOfTheSea. */ - private static Command oldManOfTheSea = new Command() { - private static final long serialVersionUID = 8076177362922156784L; + private static Function oldManOfTheSea = new Function() { @Override - public void run() { - final List list = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Old Man of the Sea")); + public Object apply(GameState game) { + final List list = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Old Man of the Sea")); for (final Card oldman : list) { if (!oldman.getGainControlTargets().isEmpty()) { if (oldman.getNetAttack() < oldman.getGainControlTargets().get(0).getNetAttack()) { @@ -943,17 +943,16 @@ public final class GameActionUtil { } } } + return null; } }; // Old Man of the Sea /** Constant liuBei. */ - private static Command liuBei = new Command() { - - private static final long serialVersionUID = 4235093010715735727L; + private static Function liuBei = new Function() { @Override - public void run() { - final List list = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Liu Bei, Lord of Shu")); + public Object apply(GameState game) { + final List list = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Liu Bei, Lord of Shu")); if (list.size() > 0) { for (int i = 0; i < list.size(); i++) { @@ -969,6 +968,7 @@ public final class GameActionUtil { } } + return null; } // execute() private boolean getsBonus(final Card c) { @@ -984,24 +984,22 @@ public final class GameActionUtil { }; // Liu_Bei /** Constant Tarmogoyf. */ - private static Command tarmogoyf = new Command() { - private static final long serialVersionUID = 5895665460018262987L; - + private static Function tarmogoyf = new Function() { @Override - public void run() { + public Object apply(GameState game) { // get all creatures - final List list = CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Tarmogoyf")); + final List list = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Tarmogoyf")); for (int i = 0; i < list.size(); i++) { final Card c = list.get(i); - c.setBaseAttack(this.countDiffTypes()); + c.setBaseAttack(this.countDiffTypes(game)); c.setBaseDefense(c.getBaseAttack() + 1); } - + return null; } // execute() - private int countDiffTypes() { - final List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Graveyard); + private int countDiffTypes(GameState game) { + final List list = game.getCardsIn(ZoneType.Graveyard); int count = 0; for (Card c : list) { @@ -1061,7 +1059,7 @@ public final class GameActionUtil { }; /** Constant commands. */ - private final static HashMap commands = new HashMap(); + private final static HashMap> commands = new HashMap>(); static { // Please add cards in alphabetical order so they are easier to find @@ -1079,16 +1077,17 @@ public final class GameActionUtil { * * @return the commands */ - public static HashMap getCommands() { + public static Map> getCommands() { return GameActionUtil.commands; } /** * Gets the st land mana abilities. + * @param game * * @return the stLandManaAbilities */ - public static void grantBasicLandsManaAbilities() { + public static void grantBasicLandsManaAbilities(GameState game) { final HashMap produces = new HashMap(); /* * for future use boolean naked = @@ -1108,7 +1107,7 @@ public final class GameActionUtil { produces.put("Plains", "W"); produces.put("Swamp", "B"); - List lands = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List lands = game.getCardsIn(ZoneType.Battlefield); lands = CardLists.filter(lands, Presets.LANDS); // remove all abilities granted by this Command diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index 42f4d91de6d..6a6f21d2867 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -72,7 +72,7 @@ public class GameState { private final PhaseHandler phaseHandler; public final MagicStack stack; private final StaticEffects staticEffects = new StaticEffects(); - private final TriggerHandler triggerHandler = new TriggerHandler(); + private final TriggerHandler triggerHandler = new TriggerHandler(this); private final ReplacementHandler replacementHandler = new ReplacementHandler(); private Combat combat = new Combat(); private final EventBus events = new EventBus(); diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java index bb18d805835..30f70781f03 100644 --- a/src/main/java/forge/game/MatchController.java +++ b/src/main/java/forge/game/MatchController.java @@ -135,7 +135,7 @@ public class MatchController { public void startRound() { input = new InputControl(this); - currentGame = Singletons.getModel().newGame(players.keySet(),gameType, this); + currentGame = new GameState(players.keySet(), gameType, this); Map startConditions = new HashMap(); for (Player p : currentGame.getPlayers()) { diff --git a/src/main/java/forge/game/PlanarDice.java b/src/main/java/forge/game/PlanarDice.java index 80d9bde54f3..2fe966e0b3e 100644 --- a/src/main/java/forge/game/PlanarDice.java +++ b/src/main/java/forge/game/PlanarDice.java @@ -2,7 +2,6 @@ package forge.game; import java.util.HashMap; -import forge.Singletons; import forge.card.trigger.TriggerType; import forge.game.player.Player; @@ -29,7 +28,7 @@ public enum PlanarDice { PlanarDice trigRes = res; - if(Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.blankIsChaos) + if(roller.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.blankIsChaos) && res == Blank) { trigRes = Chaos; @@ -38,7 +37,7 @@ public enum PlanarDice { HashMap runParams = new HashMap(); runParams.put("Player", roller); runParams.put("Result", trigRes); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.PlanarDice, runParams,false); + roller.getGame().getTriggerHandler().runTrigger(TriggerType.PlanarDice, runParams,false); return res; diff --git a/src/main/java/forge/game/ai/AiAttackController.java b/src/main/java/forge/game/ai/AiAttackController.java index 60f8028f349..f09bfc6d4cf 100644 --- a/src/main/java/forge/game/ai/AiAttackController.java +++ b/src/main/java/forge/game/ai/AiAttackController.java @@ -27,7 +27,6 @@ import forge.Card; import forge.CardLists; import forge.CounterType; import forge.GameEntity; -import forge.Singletons; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerType; import forge.game.GameState; @@ -230,7 +229,7 @@ public class AiAttackController { int fixedBlockers = 0; final List vigilantes = new ArrayList(); //check for time walks - if (Singletons.getModel().getGame().getPhaseHandler().getNextTurn().equals(ai)) { + if (ai.getGame().getPhaseHandler().getNextTurn().equals(ai)) { return attackers; } for (final Card c : this.myList) { @@ -479,7 +478,7 @@ public class AiAttackController { // randomInt is used so that the computer doesn't always // do the same thing on turn 3 if he had the same creatures in play // I know this is a little confusing - GameState game = Singletons.getModel().getGame(); + GameState game = ai.getGame(); this.random.setSeed(game.getPhaseHandler().getTurn() + this.randomInt); diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java index 748dda8072e..ab8c57c35ee 100644 --- a/src/main/java/forge/game/ai/AiController.java +++ b/src/main/java/forge/game/ai/AiController.java @@ -35,7 +35,6 @@ import forge.CardPredicates; import forge.CardPredicates.Presets; import forge.Constant; import forge.GameEntity; -import forge.Singletons; import forge.card.ability.ApiType; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.CostDiscard; @@ -281,7 +280,7 @@ public class AiController { public boolean apply(final Card c) { if (c.getSVar("NeedsToPlay").length() > 0) { final String needsToPlay = c.getSVar("NeedsToPlay"); - List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + List list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, needsToPlay.split(","), c.getController(), c); if (list.isEmpty()) { diff --git a/src/main/java/forge/game/ai/ComputerUtil.java b/src/main/java/forge/game/ai/ComputerUtil.java index 5099a282d64..4fa569963b6 100644 --- a/src/main/java/forge/game/ai/ComputerUtil.java +++ b/src/main/java/forge/game/ai/ComputerUtil.java @@ -33,7 +33,6 @@ import forge.CardPredicates; import forge.CardPredicates.Presets; import forge.CardUtil; import forge.Color; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; import forge.card.ability.effects.CharmEffect; @@ -462,10 +461,11 @@ public class ComputerUtil { */ public static List chooseExileFrom(final Player ai, final ZoneType zone, final String type, final Card activate, final Card target, final int amount) { + final GameState game = ai.getGame(); List typeList = new ArrayList(); if (zone.equals(ZoneType.Stack)) { - for (int i = 0; i < Singletons.getModel().getGame().getStack().size(); i++) { - typeList.add(Singletons.getModel().getGame().getStack().peekAbility(i).getSourceCard()); + for (int i = 0; i < game.getStack().size(); i++) { + typeList.add(game.getStack().peekAbility(i).getSourceCard()); typeList = CardLists.getValidCards(typeList, type.split(","), activate.getController(), activate); } } else { @@ -614,7 +614,7 @@ public class ComputerUtil { public static Combat getBlockers(final Player ai) { final List blockers = ai.getCardsIn(ZoneType.Battlefield); - return ComputerUtilBlock.getBlockers(ai, Singletons.getModel().getGame().getCombat(), blockers); + return ComputerUtilBlock.getBlockers(ai, ai.getGame().getCombat(), blockers); } @@ -714,6 +714,7 @@ public class ComputerUtil { } final Player controller = card.getController(); + final GameState game = controller.getGame(); final List l = controller.getCardsIn(ZoneType.Battlefield); for (final Card c : l) { for (final SpellAbility sa : c.getSpellAbilities()) { @@ -749,11 +750,10 @@ public class ComputerUtil { final Target tgt = sa.getTarget(); if (tgt != null) { - if (CardLists.getValidCards(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), controller, sa.getSourceCard()).contains(card)) { + if (CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), controller, sa.getSourceCard()).contains(card)) { return true; } - } else if (AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa) - .contains(card)) { + } else if (AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa).contains(card)) { return true; } @@ -780,6 +780,8 @@ public class ComputerUtil { int prevented = 0; final Player controller = card.getController(); + final GameState game = controller.getGame(); + final List l = controller.getCardsIn(ZoneType.Battlefield); for (final Card c : l) { for (final SpellAbility sa : c.getSpellAbilities()) { @@ -797,7 +799,7 @@ public class ComputerUtil { } final Target tgt = sa.getTarget(); if (tgt != null) { - if (CardLists.getValidCards(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), controller, sa.getSourceCard()).contains(card)) { + if (CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), controller, sa.getSourceCard()).contains(card)) { prevented += AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("Amount"), sa); } @@ -938,6 +940,8 @@ public class ComputerUtil { if (!discard.getSVar("DiscardMe").equals("")) { return true; } + + final GameState game = ai.getGame(); final List landsInPlay = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS); final List landsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.Presets.LANDS); final List nonLandsInHand = CardLists.getNotType(ai.getCardsIn(ZoneType.Hand), "Land"); @@ -954,8 +958,8 @@ public class ComputerUtil { if (discardCMC > landsInPlay.size() + landsInHand.size() + 2) { // not castable for some time. return true; - } else if (!Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai) - && Singletons.getModel().getGame().getPhaseHandler().getPhase().isAfter(PhaseType.MAIN2) + } else if (!game.getPhaseHandler().isPlayerTurn(ai) + && game.getPhaseHandler().getPhase().isAfter(PhaseType.MAIN2) && discardCMC > landsInPlay.size() + landsInHand.size() && discardCMC > landsInPlay.size() + 1 && nonLandsInHand.size() > 1) { @@ -981,7 +985,8 @@ public class ComputerUtil { * @return a boolean (returns true if it's better to wait until blockers are declared). */ public static boolean waitForBlocking(final SpellAbility sa) { - final PhaseHandler ph = Singletons.getModel().getGame().getPhaseHandler(); + final GameState game = sa.getActivatingPlayer().getGame(); + final PhaseHandler ph = game.getPhaseHandler(); return (sa.getSourceCard().isCreature() && sa.getPayCosts().hasTapCost() @@ -1043,13 +1048,14 @@ public class ComputerUtil { * @since 1.0.15 */ public static ArrayList predictThreatenedObjects(final Player aiPlayer, final SpellAbility sa) { + final GameState game = aiPlayer.getGame(); final ArrayList objects = new ArrayList(); - if (Singletons.getModel().getGame().getStack().isEmpty()) { + if (game.getStack().isEmpty()) { return objects; } // check stack for something that will kill this - final SpellAbility topStack = Singletons.getModel().getGame().getStack().peekAbility(); + final SpellAbility topStack = game.getStack().peekAbility(); objects.addAll(ComputerUtil.predictThreatenedObjects(aiPlayer, sa, topStack)); return objects; diff --git a/src/main/java/forge/game/ai/ComputerUtilCombat.java b/src/main/java/forge/game/ai/ComputerUtilCombat.java index b7b95a1e678..098386e394b 100644 --- a/src/main/java/forge/game/ai/ComputerUtilCombat.java +++ b/src/main/java/forge/game/ai/ComputerUtilCombat.java @@ -28,7 +28,6 @@ import forge.Card; import forge.CardLists; import forge.CounterType; import forge.GameEntity; -import forge.Singletons; import forge.card.TriggerReplacementBase; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; @@ -418,6 +417,7 @@ public class ComputerUtilCombat { */ public static int dealsDamageAsBlocker(final Card attacker, final Card defender) { + final GameState game = attacker.getGame(); if (attacker.getName().equals("Sylvan Basilisk") && !defender.hasKeyword("Indestructible")) { return 0; } @@ -441,7 +441,7 @@ public class ComputerUtilCombat { } int defenderDamage = defender.getNetAttack() + ComputerUtilCombat.predictPowerBonusOfBlocker(attacker, defender, true); - if (Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.toughnessAssignsDamage)) { + if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.toughnessAssignsDamage)) { defenderDamage = defender.getNetDefense() + ComputerUtilCombat.predictToughnessBonusOfBlocker(attacker, defender, true); } @@ -550,10 +550,11 @@ public class ComputerUtilCombat { * @return a boolean. */ public static boolean attackerWouldBeDestroyed(Player ai, final Card attacker) { - final List blockers = Singletons.getModel().getGame().getCombat().getBlockers(attacker); + final GameState game = ai.getGame(); + final List blockers = game.getCombat().getBlockers(attacker); for (final Card defender : blockers) { - if (ComputerUtilCombat.canDestroyAttacker(ai, attacker, defender, Singletons.getModel().getGame().getCombat(), true) + if (ComputerUtilCombat.canDestroyAttacker(ai, attacker, defender, game.getCombat(), true) && !(defender.hasKeyword("Wither") || defender.hasKeyword("Infect"))) { return true; } @@ -580,17 +581,18 @@ public class ComputerUtilCombat { */ public static boolean combatTriggerWillTrigger(final Card attacker, final Card defender, final Trigger trigger, Combat combat) { + final GameState game = attacker.getGame(); final HashMap trigParams = trigger.getMapParams(); boolean willTrigger = false; final Card source = trigger.getHostCard(); if (combat == null) { - combat = Singletons.getModel().getGame().getCombat(); + combat = game.getCombat(); } - if (!trigger.zonesCheck(Singletons.getModel().getGame().getZoneOf(trigger.getHostCard()))) { + if (!trigger.zonesCheck(game.getZoneOf(trigger.getHostCard()))) { return false; } - if (!trigger.requirementsCheck()) { + if (!trigger.requirementsCheck(game)) { return false; } @@ -701,9 +703,10 @@ public class ComputerUtilCombat { power += defender.getKeywordMagnitude("Bushido"); + final GameState game = attacker.getGame(); // look out for continuous static abilities that only care for blocking // creatures - final List cardList = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final List cardList = game.getCardsIn(ZoneType.Battlefield); for (final Card card : cardList) { for (final StaticAbility stAb : card.getStaticAbilities()) { final HashMap params = stAb.getMapParams(); @@ -730,7 +733,7 @@ public class ComputerUtilCombat { } final ArrayList theTriggers = new ArrayList(); - for (Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } theTriggers.addAll(attacker.getTriggers()); @@ -824,9 +827,9 @@ public class ComputerUtilCombat { } toughness += defender.getKeywordMagnitude("Bushido"); - + final GameState game = attacker.getGame(); final ArrayList theTriggers = new ArrayList(); - for (Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } theTriggers.addAll(attacker.getTriggers()); @@ -942,8 +945,9 @@ public class ComputerUtilCombat { } } + final GameState game = attacker.getGame(); final ArrayList theTriggers = new ArrayList(); - for (Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } // if the defender has first strike and wither the attacker will deal @@ -960,7 +964,7 @@ public class ComputerUtilCombat { // look out for continuous static abilities that only care for attacking // creatures - final List cardList = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final List cardList = game.getCardsIn(ZoneType.Battlefield); for (final Card card : cardList) { for (final StaticAbility stAb : card.getStaticAbilities()) { final HashMap params = stAb.getMapParams(); @@ -1097,8 +1101,9 @@ public class ComputerUtilCombat { } } + final GameState game = attacker.getGame(); final ArrayList theTriggers = new ArrayList(); - for (Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } if (defender != null) { @@ -1108,7 +1113,7 @@ public class ComputerUtilCombat { // look out for continuous static abilities that only care for attacking // creatures - final List cardList = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final List cardList = game.getCardsIn(ZoneType.Battlefield); for (final Card card : cardList) { for (final StaticAbility stAb : card.getStaticAbilities()) { final HashMap params = stAb.getMapParams(); @@ -1247,8 +1252,9 @@ public class ComputerUtilCombat { * @return a boolean. */ public static boolean checkDestroyBlockerTrigger(final Card attacker, final Card defender) { + final GameState game = attacker.getGame(); final ArrayList theTriggers = new ArrayList(); - for (Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } for (Trigger trigger : theTriggers) { @@ -1303,7 +1309,7 @@ public class ComputerUtilCombat { */ public static boolean checkDestroyAttackerTrigger(final Card attacker, final Card defender) { final ArrayList theTriggers = new ArrayList(); - for (Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (Card card : attacker.getGame().getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } for (Trigger trigger : theTriggers) { @@ -1398,7 +1404,7 @@ public class ComputerUtilCombat { + ComputerUtilCombat.predictPowerBonusOfBlocker(attacker, defender, withoutAbilities); int attackerDamage = attacker.getNetAttack() + ComputerUtilCombat.predictPowerBonusOfAttacker(attacker, defender, combat, withoutAbilities); - if (Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.toughnessAssignsDamage)) { + if (ai.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.toughnessAssignsDamage)) { defenderDamage = defender.getNetDefense() + ComputerUtilCombat.predictToughnessBonusOfBlocker(attacker, defender, withoutAbilities); attackerDamage = attacker.getNetDefense() @@ -1485,12 +1491,13 @@ public class ComputerUtilCombat { * @return a boolean. */ public static boolean blockerWouldBeDestroyed(Player ai, final Card blocker) { + final GameState game = ai.getGame(); // TODO THis function only checks if a single attacker at a time would destroy a blocker // This needs to expand to tally up damage - final List attackers = Singletons.getModel().getGame().getCombat().getAttackersBlockedBy(blocker); + final List attackers = game.getCombat().getAttackersBlockedBy(blocker); for (Card attacker : attackers) { - if (ComputerUtilCombat.canDestroyBlocker(ai, blocker, attacker, Singletons.getModel().getGame().getCombat(), true) + if (ComputerUtilCombat.canDestroyBlocker(ai, blocker, attacker, game.getCombat(), true) && !(attacker.hasKeyword("Wither") || attacker.hasKeyword("Infect"))) { return true; } @@ -1517,7 +1524,7 @@ public class ComputerUtilCombat { */ public static boolean canDestroyBlocker(Player ai, final Card defender, final Card attacker, final Combat combat, final boolean withoutAbilities) { - + final GameState game = ai.getGame(); int flankingMagnitude = 0; if (attacker.hasKeyword("Flanking") && !defender.hasKeyword("Flanking")) { @@ -1548,7 +1555,7 @@ public class ComputerUtilCombat { + ComputerUtilCombat.predictPowerBonusOfBlocker(attacker, defender, withoutAbilities); int attackerDamage = attacker.getNetAttack() + ComputerUtilCombat.predictPowerBonusOfAttacker(attacker, defender, combat, withoutAbilities); - if (Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.toughnessAssignsDamage)) { + if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.toughnessAssignsDamage)) { defenderDamage = defender.getNetDefense() + ComputerUtilCombat.predictToughnessBonusOfBlocker(attacker, defender, withoutAbilities); attackerDamage = attacker.getNetDefense() @@ -1825,7 +1832,7 @@ public class ComputerUtilCombat { public final static int predictDamageTo(final Player target, final int damage, final Card source, final boolean isCombat) { - final GameState game = Singletons.getModel().getGame(); + final GameState game = target.getGame(); int restDamage = damage; restDamage = target.staticReplaceDamage(restDamage, source, isCombat); diff --git a/src/main/java/forge/game/phase/Combat.java b/src/main/java/forge/game/phase/Combat.java index 547838b89a5..d6c5e9b2235 100644 --- a/src/main/java/forge/game/phase/Combat.java +++ b/src/main/java/forge/game/phase/Combat.java @@ -30,7 +30,6 @@ import forge.Card; import forge.CardLists; import forge.CardPredicates; import forge.GameEntity; -import forge.Singletons; import forge.card.trigger.TriggerType; import forge.game.event.BlockerAssignedEvent; import forge.game.player.Player; @@ -78,7 +77,7 @@ public class Combat { * reset. *

*/ - public final void reset() { + public final void reset(Player playerTurn) { this.resetAttackers(); this.blocked.clear(); @@ -87,7 +86,7 @@ public class Combat { this.attackingPlayer = null; - this.initiatePossibleDefenders(Singletons.getModel().getGame().getPhaseHandler().getPlayerTurn().getOpponents()); + this.initiatePossibleDefenders(playerTurn.getOpponents()); } /** @@ -188,11 +187,7 @@ public class Combat { * @return a {@link forge.game.player.Player} object. */ public final Player getAttackingPlayer() { - if (this.attackingPlayer != null) { - return this.attackingPlayer; - } else { - return Singletons.getModel().getGame().getPhaseHandler().getPlayerTurn(); - } + return this.attackingPlayer; } @@ -390,7 +385,7 @@ public class Combat { else { this.blockerMap.get(blocker).add(attacker); } - Singletons.getModel().getGame().getEvents().post(new BlockerAssignedEvent()); + attacker.getGame().getEvents().post(new BlockerAssignedEvent()); } public final void removeBlockAssignment(final Card attacker, final Card blocker) { @@ -565,7 +560,7 @@ public class Combat { } else if (this.blockerMap.containsKey(c)) { // card is a blocker List attackers = this.blockerMap.get(c); - boolean stillDeclaring = Singletons.getModel().getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS); + boolean stillDeclaring = c.getGame().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS); this.blockerMap.remove(c); for (Card a : attackers) { this.attackerMap.get(a).remove(c); @@ -612,7 +607,7 @@ public class Combat { final HashMap runParams = new HashMap(); runParams.put("Attacker", attacker); runParams.put("Defender",this.getDefenderByAttacker(attacker)); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.AttackerUnblocked, runParams, false); + attacker.getGame().getTriggerHandler().runTrigger(TriggerType.AttackerUnblocked, runParams, false); } } diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index d486586af8d..bf07f9b2d0b 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -95,8 +95,9 @@ public class CombatUtil { if (!CombatUtil.canBlockMoreCreatures(blocker, combat.getAttackersBlockedBy(blocker))) { return false; } + final GameState game = blocker.getGame(); - for (final Card c : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (final Card c : game.getCardsIn(ZoneType.Battlefield)) { for (final String keyword : c.getKeyword()) { if (keyword.equals("No more than two creatures can block each combat.") && (combat.getAllBlockers().size() > 1)) { @@ -106,7 +107,7 @@ public class CombatUtil { } if (combat.getAllBlockers().size() > 0 - && Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.onlyOneBlocker)) { + && game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.onlyOneBlocker)) { return false; } @@ -286,7 +287,7 @@ public class CombatUtil { String valid = StringUtils.join(walkTypes, ","); Player defendingPlayer = attacker.getController().getOpponent(); if (attacker.isAttacking()) { - defendingPlayer = Singletons.getModel().getGame().getCombat().getDefendingPlayerRelatedTo(attacker).get(0); + defendingPlayer = defendingPlayer.getGame().getCombat().getDefendingPlayerRelatedTo(attacker).get(0); } List defendingLands = defendingPlayer.getCardsIn(ZoneType.Battlefield); for (Card c : defendingLands) { @@ -767,8 +768,9 @@ public class CombatUtil { */ public static boolean canAttack(final Card c, final GameEntity def, final Combat combat) { int cntAttackers = combat.getAttackers().size(); + final GameState game = c.getGame(); - for (final Card card : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (final Card card : game.getCardsIn(ZoneType.Battlefield)) { for (final String keyword : card.getKeyword()) { if (keyword.equals("No more than two creatures can attack each combat.") && cntAttackers > 1) { return false; @@ -793,12 +795,12 @@ public class CombatUtil { } if (cntAttackers > 0 - && Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.onlyOneAttackerACombat)) { + && game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.onlyOneAttackerACombat)) { return false; } if ((cntAttackers > 0 || c.getController().getAttackedWithCreatureThisTurn()) - && Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.onlyOneAttackerATurn)) { + && game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.onlyOneAttackerATurn)) { return false; } @@ -820,9 +822,10 @@ public class CombatUtil { } public static boolean canAttack(final Card c) { + final GameState game = c.getGame(); if (c.isTapped() || c.isPhasedOut() || (c.hasSickness() && !c.hasKeyword("CARDNAME can attack as though it had haste.")) - || Singletons.getModel().getGame().getPhaseHandler().getPhase() + || game.getPhaseHandler().getPhase() .isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { return false; } @@ -948,9 +951,9 @@ public class CombatUtil { if (c.isTapped() && !Untap.canUntap(c)) { return false; } - + final GameState game = c.getGame(); // CantBeActivated static abilities - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { + for (final Card ca : game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { if (stAb.applyAbility("CantAttack", c, defender)) { @@ -968,12 +971,12 @@ public class CombatUtil { * * @return a String */ - public static String getCombatAttackForLog() { + public static String getCombatAttackForLog(GameState game) { final StringBuilder sb = new StringBuilder(); // Loop through Defenders // Append Defending Player/Planeswalker - final Combat combat = Singletons.getModel().getGame().getCombat(); + final Combat combat = game.getCombat(); final List defenders = combat.getDefenders(); final List> attackers = combat.sortAttackerByDefender(); @@ -997,17 +1000,18 @@ public class CombatUtil { /** * gets a string for the GameLog regarding assigned blockers. + * @param game * * @return a String */ - public static String getCombatBlockForLog() { + public static String getCombatBlockForLog(GameState game) { final StringBuilder sb = new StringBuilder(); List defend = null; // Loop through Defenders // Append Defending Player/Planeswalker - final Combat combat = Singletons.getModel().getGame().getCombat(); + final Combat combat = game.getCombat(); final List defenders = combat.getDefenders(); final List> attackers = combat.sortAttackerByDefender(); @@ -1018,7 +1022,7 @@ public class CombatUtil { for (final Card attacker : list) { - defend = Singletons.getModel().getGame().getCombat().getBlockers(attacker); + defend = game.getCombat().getBlockers(attacker); sb.append(combat.getDefenderByAttacker(attacker)).append(" assigned "); if (!defend.isEmpty()) { @@ -1090,7 +1094,7 @@ public class CombatUtil { text = getCombatDescription(game.getCombat()); SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc()); } - VCombat.SINGLETON_INSTANCE.updateCombat(text); + VCombat.SINGLETON_INSTANCE.updateCombat(game.getCombat().getAttackers().size(), text); } // showBlockers() /** @@ -1163,19 +1167,20 @@ public class CombatUtil { * This method checks triggered effects of attacking creatures, right before * defending player declares blockers. *

+ * @param game * * @param c * a {@link forge.Card} object. */ - public static void checkDeclareAttackers(final Card c) { + public static void checkDeclareAttackers(final GameState game, final Card c) { // Run triggers final HashMap runParams = new HashMap(); runParams.put("Attacker", c); - final List otherAttackers = Singletons.getModel().getGame().getCombat().getAttackers(); + final List otherAttackers = game.getCombat().getAttackers(); otherAttackers.remove(c); runParams.put("OtherAttackers", otherAttackers); - runParams.put("Attacked", Singletons.getModel().getGame().getCombat().getDefenderByAttacker(c)); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.Attacks, runParams, false); + runParams.put("Attacked", game.getCombat().getDefenderByAttacker(c)); + game.getTriggerHandler().runTrigger(TriggerType.Attacks, runParams, false); // Annihilator: if (!c.getDamageHistory().getCreatureAttackedThisCombat()) { @@ -1188,13 +1193,12 @@ public class CombatUtil { @Override public void resolve() { this.api = ApiType.Sacrifice; - final Player opponent = Singletons.getModel().getGame().getCombat().getDefendingPlayerRelatedTo(c).get(0); + final Player opponent = game.getCombat().getDefendingPlayerRelatedTo(c).get(0); //List list = AbilityUtils.filterListByType(opponent.getCardsIn(ZoneType.Battlefield), "Permanent", this); final List list = opponent.getCardsIn(ZoneType.Battlefield); List toSac = opponent.getController().choosePermanentsToSacrifice(list, "Card", a, this, false, false); for(Card sacd : toSac) { - final GameState game = Singletons.getModel().getGame(); game.getAction().sacrifice(sacd, this); } @@ -1206,7 +1210,7 @@ public class CombatUtil { ability.setActivatingPlayer(c.getController()); ability.setTrigger(true); - Singletons.getModel().getGame().getStack().add(ability); + game.getStack().add(ability); } // for } // creatureAttacked @@ -1215,7 +1219,7 @@ public class CombatUtil { // Mijae Djinn if (c.getName().equals("Mijae Djinn")) { if (!GuiDialog.flipCoin(c.getController(), c)) { - Singletons.getModel().getGame().getCombat().removeFromCombat(c); + game.getCombat().removeFromCombat(c); c.tap(); } } // Mijae Djinn @@ -1240,7 +1244,7 @@ public class CombatUtil { if (charger.isInPlay()) { charger.addIntrinsicKeyword("Trample"); - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } // resolve }; // ability @@ -1249,7 +1253,7 @@ public class CombatUtil { sb2.append(c.getName()).append(" - gains trample until end of turn if its power is 10 or greater."); ability2.setStackDescription(sb2.toString()); - Singletons.getModel().getGame().getStack().add(ability2); + game.getStack().add(ability2); } // Witch-Maw Nephilim @@ -1267,7 +1271,7 @@ public class CombatUtil { player.gainLife(top.getBaseDefense(), c); player.loseLife(top.getBaseAttack()); - Singletons.getModel().getGame().getAction().moveToHand(top); + game.getAction().moveToHand(top); } } } // Sapling of Colfenor @@ -1281,22 +1285,23 @@ public class CombatUtil { *

* checkDeclareBlockers. *

+ * @param game * * @param cl * a {@link forge.CardList} object. */ - public static void checkDeclareBlockers(final List cl) { + public static void checkDeclareBlockers(GameState game, final List cl) { for (final Card c : cl) { if (!c.getDamageHistory().getCreatureBlockedThisCombat()) { for (final Ability ab : CardFactoryUtil.getBushidoEffects(c)) { - Singletons.getModel().getGame().getStack().add(ab); + game.getStack().add(ab); } // Run triggers final HashMap runParams = new HashMap(); runParams.put("Blocker", c); - final Card attacker = Singletons.getModel().getGame().getCombat().getAttackersBlockedBy(c).get(0); + final Card attacker = game.getCombat().getAttackersBlockedBy(c).get(0); runParams.put("Attacker", attacker); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.Blocks, runParams, false); + game.getTriggerHandler().runTrigger(TriggerType.Blocks, runParams, false); } c.getDamageHistory().setCreatureBlockedThisCombat(true); @@ -1308,29 +1313,30 @@ public class CombatUtil { *

* checkBlockedAttackers. *

+ * @param game * * @param a * a {@link forge.Card} object. * @param b * a {@link forge.Card} object. */ - public static void checkBlockedAttackers(final Card a, final Card b) { + public static void checkBlockedAttackers(final GameState game, final Card a, final Card b) { // System.out.println(a.getName() + " got blocked by " + b.getName()); // Run triggers final HashMap runParams = new HashMap(); runParams.put("Attacker", a); runParams.put("Blocker", b); - //Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.Blocks, runParams, false); + //game.getTriggerHandler().runTrigger(TriggerType.Blocks, runParams, false); if (!a.getDamageHistory().getCreatureGotBlockedThisCombat()) { - final int blockers = Singletons.getModel().getGame().getCombat().getBlockers(a).size(); + final int blockers = game.getCombat().getBlockers(a).size(); runParams.put("NumBlockers", blockers); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.AttackerBlocked, runParams, false); + game.getTriggerHandler().runTrigger(TriggerType.AttackerBlocked, runParams, false); // Bushido for (final Ability ab : CardFactoryUtil.getBushidoEffects(a)) { - Singletons.getModel().getGame().getStack().add(ab); + game.getStack().add(ab); } // Rampage @@ -1342,9 +1348,9 @@ public class CombatUtil { if (m.find()) { final String[] k = keyword.split(" "); final int magnitude = Integer.valueOf(k[1]); - final int numBlockers = Singletons.getModel().getGame().getCombat().getBlockers(a).size(); + final int numBlockers = game.getCombat().getBlockers(a).size(); if (numBlockers > 1) { - CombatUtil.executeRampageAbility(a, magnitude, numBlockers); + CombatUtil.executeRampageAbility(game, a, magnitude, numBlockers); } } // find } // end Rampage @@ -1381,7 +1387,7 @@ public class CombatUtil { blocker.addTempAttackBoost(-mag); blocker.addTempDefenseBoost(-mag); - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); System.out.println("Flanking!"); } } // resolve @@ -1393,7 +1399,7 @@ public class CombatUtil { ability2.setStackDescription(sb2.toString()); ability2.setDescription(sb2.toString()); - Singletons.getModel().getGame().getStack().add(ability2); + game.getStack().add(ability2); Log.debug("Adding Flanking!"); } // flanking @@ -1407,13 +1413,14 @@ public class CombatUtil { *

* executeExaltedAbility. *

+ * @param game * * @param c * a {@link forge.Card} object. * @param magnitude * a int. */ - public static void executeExaltedAbility(final Card c, final int magnitude) { + public static void executeExaltedAbility(final GameState game, final Card c, final int magnitude) { final Card crd = c; Ability ability; @@ -1437,7 +1444,7 @@ public class CombatUtil { crd.addTempAttackBoost(1); crd.addTempDefenseBoost(1); - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } // resolve @@ -1449,7 +1456,7 @@ public class CombatUtil { ability.setDescription(sb.toString()); ability.setActivatingPlayer(c.getController()); - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability); + game.getStack().addSimultaneousStackEntry(ability); } final Player phasingPlayer = c.getController(); @@ -1489,7 +1496,7 @@ public class CombatUtil { enchantment = ComputerUtilCard.getBestEnchantmentAI(enchantments, this, false); } if ((enchantment != null) && attacker.isInPlay()) { - Singletons.getModel().getGame().getAction().changeZone(Singletons.getModel().getGame().getZoneOf(enchantment), + game.getAction().changeZone(game.getZoneOf(enchantment), enchantment.getOwner().getZone(ZoneType.Battlefield), enchantment, null); enchantment.enchantEntity(attacker); } @@ -1504,13 +1511,14 @@ public class CombatUtil { ability4.setDescription(sb4.toString()); ability4.setStackDescription(sb4.toString()); - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability4); + game.getStack().addSimultaneousStackEntry(ability4); } // For } } /** * executes Rampage abilities for a given card. + * @param game * * @param c * the card to add rampage bonus to @@ -1520,7 +1528,7 @@ public class CombatUtil { * @param numBlockers * - the number of creatures blocking this rampaging creature */ - private static void executeRampageAbility(final Card c, final int magnitude, final int numBlockers) { + private static void executeRampageAbility(final GameState game, final Card c, final int magnitude, final int numBlockers) { final Card crd = c; final int pump = magnitude; Ability ability; @@ -1546,7 +1554,7 @@ public class CombatUtil { crd.addTempAttackBoost(pump); crd.addTempDefenseBoost(pump); - Singletons.getModel().getGame().getEndOfTurn().addUntil(untilEOT); + game.getEndOfTurn().addUntil(untilEOT); } } // resolve @@ -1556,7 +1564,7 @@ public class CombatUtil { sb.append(c).append(" - (Rampage) gets +").append(pump).append("/+").append(pump).append(" until EOT."); ability.setStackDescription(sb.toString()); - Singletons.getModel().getGame().getStack().add(ability); + game.getStack().add(ability); } } diff --git a/src/main/java/forge/game/phase/EndOfTurn.java b/src/main/java/forge/game/phase/EndOfTurn.java index 80c96bdad2c..8cfa3d40ea8 100644 --- a/src/main/java/forge/game/phase/EndOfTurn.java +++ b/src/main/java/forge/game/phase/EndOfTurn.java @@ -18,7 +18,6 @@ package forge.game.phase; import forge.Card; -import forge.Singletons; import forge.card.mana.ManaCost; import forge.card.spellability.Ability; import forge.card.spellability.SpellAbility; @@ -51,7 +50,7 @@ public class EndOfTurn extends Phase { // reset mustAttackEntity for me game.getPhaseHandler().getPlayerTurn().setMustAttackEntity(null); - game.getStaticEffects().rePopulateStateBasedList(); + game.getStaticEffects().rePopulateStateBasedList(game); for (final Card c : game.getCardsIn(ZoneType.Battlefield)) { if (!c.isFaceDown() && c.hasKeyword("At the beginning of the end step, sacrifice CARDNAME.")) { @@ -60,7 +59,7 @@ public class EndOfTurn extends Phase { @Override public void resolve() { if (card.isInPlay()) { - Singletons.getModel().getGame().getAction().sacrifice(card, null); + card.getGame().getAction().sacrifice(card, null); } } }; @@ -78,7 +77,7 @@ public class EndOfTurn extends Phase { @Override public void resolve() { if (card.isInPlay()) { - Singletons.getModel().getGame().getAction().exile(card); + card.getGame().getAction().exile(card); } } }; diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 7927ec3f5f7..67be9fb68b3 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -440,7 +440,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { p.loseLife(burn); // Play the Mana Burn sound - Singletons.getModel().getGame().getEvents().post(new ManaBurnEvent()); + game.getEvents().post(new ManaBurnEvent()); } p.updateObservers(); } @@ -461,7 +461,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { case COMBAT_END: //SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); - game.getCombat().reset(); + game.getCombat().reset(playerTurn); this.getPlayerTurn().resetAttackedThisCombat(); this.bCombat.set(false); @@ -474,7 +474,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { } this.planarDiceRolledthisTurn = 0; // Play the End Turn sound - Singletons.getModel().getGame().getEvents().post(new EndOfTurnEvent()); + game.getEvents().post(new EndOfTurnEvent()); break; default: // no action } diff --git a/src/main/java/forge/game/phase/PhaseUtil.java b/src/main/java/forge/game/phase/PhaseUtil.java index 9c8cc04d8f8..16e557f6166 100644 --- a/src/main/java/forge/game/phase/PhaseUtil.java +++ b/src/main/java/forge/game/phase/PhaseUtil.java @@ -88,7 +88,7 @@ public class PhaseUtil { CMessage.SINGLETON_INSTANCE.updateGameInfo(Singletons.getModel().getMatch()); - game.getCombat().reset(); + game.getCombat().reset(turn); game.getCombat().setAttackingPlayer(turn); // Tokens starting game in play should suffer from Sum. Sickness @@ -156,44 +156,45 @@ public class PhaseUtil { final Card c = list.get(i); CombatUtil.checkPropagandaEffects(game, c); } - PhaseUtil.handleAttackingTriggers(); + PhaseUtil.handleAttackingTriggers(game); } /** *

* handleAttackingTriggers. *

+ * @param game */ - public static void handleAttackingTriggers() { - final List list = Singletons.getModel().getGame().getCombat().getAttackers(); - Singletons.getModel().getGame().getStack().freezeStack(); + public static void handleAttackingTriggers(GameState game) { + final List list = game.getCombat().getAttackers(); + game.getStack().freezeStack(); // Then run other Attacker bonuses // check for exalted: if (list.size() == 1) { - final Player attackingPlayer = Singletons.getModel().getGame().getCombat().getAttackingPlayer(); + final Player attackingPlayer = game.getCombat().getAttackingPlayer(); int exaltedMagnitude = 0; for (Card card : attackingPlayer.getCardsIn(ZoneType.Battlefield)) { exaltedMagnitude += card.getKeywordAmount("Exalted"); } if (exaltedMagnitude > 0) { - CombatUtil.executeExaltedAbility(list.get(0), exaltedMagnitude); + CombatUtil.executeExaltedAbility(game, list.get(0), exaltedMagnitude); // Make sure exalted effects get applied only once per combat } } - Singletons.getModel().getGame().getGameLog().add("Combat", CombatUtil.getCombatAttackForLog(), 1); + game.getGameLog().add("Combat", CombatUtil.getCombatAttackForLog(game), 1); final HashMap runParams = new HashMap(); runParams.put("Attackers", list); - runParams.put("AttackingPlayer", Singletons.getModel().getGame().getCombat().getAttackingPlayer()); - Singletons.getModel().getGame().getTriggerHandler().runTrigger(TriggerType.AttackersDeclared, runParams, false); + runParams.put("AttackingPlayer", game.getCombat().getAttackingPlayer()); + game.getTriggerHandler().runTrigger(TriggerType.AttackersDeclared, runParams, false); for (final Card c : list) { - CombatUtil.checkDeclareAttackers(c); + CombatUtil.checkDeclareAttackers(game, c); } - Singletons.getModel().getGame().getStack().unfreezeStack(); + game.getStack().unfreezeStack(); } /** @@ -268,35 +269,20 @@ public class PhaseUtil { final List attList = combat.getAttackers(); - CombatUtil.checkDeclareBlockers(list); + CombatUtil.checkDeclareBlockers(game, list); for (final Card a : attList) { final List blockList = combat.getBlockers(a); for (final Card b : blockList) { - CombatUtil.checkBlockedAttackers(a, b); + CombatUtil.checkBlockedAttackers(game, a, b); } } game.getStack().unfreezeStack(); - game.getGameLog().add("Combat", CombatUtil.getCombatBlockForLog(), 1); + game.getGameLog().add("Combat", CombatUtil.getCombatBlockForLog(game), 1); } - // ***** Combat Utility ********** - // TODO: the below functions should be removed and the code blocks that use - // them should instead use SpellAbilityRestriction - /** - *

- * isBeforeAttackersAreDeclared. - *

- * - * @return a boolean. - */ - public static boolean isBeforeAttackersAreDeclared() { - final PhaseType phase = Singletons.getModel().getGame().getPhaseHandler().getPhase(); - return phase == PhaseType.UNTAP || phase == PhaseType.UPKEEP || phase == PhaseType.DRAW - || phase == PhaseType.MAIN1 || phase == PhaseType.COMBAT_BEGIN; - } /** * Retrieves and visually activates phase label for appropriate phase and diff --git a/src/main/java/forge/game/phase/Untap.java b/src/main/java/forge/game/phase/Untap.java index 02243734df9..a02c96d9141 100644 --- a/src/main/java/forge/game/phase/Untap.java +++ b/src/main/java/forge/game/phase/Untap.java @@ -30,7 +30,6 @@ import forge.CardPredicates.Presets; import forge.CounterType; import forge.FThreads; import forge.GameEntity; -import forge.Singletons; import forge.control.input.InputSelectCards; import forge.control.input.InputSelectCardsFromList; import forge.game.GameState; @@ -88,7 +87,7 @@ public class Untap extends Phase { return false; } - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)) { + for (final Card ca : c.getGame().getCardsIn(ZoneType.Battlefield)) { if (ca.hasStartOfKeyword("Permanents don't untap during their controllers' untap steps")) { final int keywordPosition = ca .getKeywordPosition("Permanents don't untap during their controllers' untap steps"); diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 37862395f90..71476b7295f 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -506,7 +506,7 @@ public abstract class Player extends GameEntity implements Comparable { if (toLose > 0) { this.subtractLife(toLose); lifeLost = toLose; - Singletons.getModel().getGame().getEvents().post(new LifeLossEvent()); + game.getEvents().post(new LifeLossEvent()); this.updateObservers(); } else if (toLose == 0) { // Rule 118.4 @@ -691,7 +691,7 @@ public abstract class Player extends GameEntity implements Comparable { @Override public final int staticDamagePrevention(final int damage, final Card source, final boolean isCombat, final boolean isTest) { - if (Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) { + if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) { return damage; } @@ -882,7 +882,7 @@ public abstract class Player extends GameEntity implements Comparable { @Override public final int preventDamage(final int damage, final Card source, final boolean isCombat) { - if (Singletons.getModel().getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention) + if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention) || source.hasKeyword("Damage that would be dealt by CARDNAME can't be prevented.")) { return damage; } @@ -1769,7 +1769,7 @@ public abstract class Player extends GameEntity implements Comparable { game.getTriggerHandler().runTrigger(TriggerType.Shuffled, runParams, false); // Play the shuffle sound - Singletons.getModel().getGame().getEvents().post(new ShuffleEvent()); + game.getEvents().post(new ShuffleEvent()); } // shuffle // ////////////////////////////// @@ -2438,7 +2438,7 @@ public abstract class Player extends GameEntity implements Comparable { if (property.substring(8).equals("Life")) { int highestLife = -50; // Negative base just in case a few Lich's are running around Player healthiest = null; - for (final Player p : Singletons.getModel().getGame().getPlayers()) { + for (final Player p : game.getPlayers()) { if (p.getLife() > highestLife) { highestLife = p.getLife(); healthiest = p; @@ -2451,7 +2451,7 @@ public abstract class Player extends GameEntity implements Comparable { else if (property.substring(8).equals("CardsInHand")) { int largestHand = 0; Player withLargestHand = null; - for (final Player p : Singletons.getModel().getGame().getPlayers()) { + for (final Player p : game.getPlayers()) { if (p.getCardsIn(ZoneType.Hand).size() > largestHand) { largestHand = p.getCardsIn(ZoneType.Hand).size(); withLargestHand = p; @@ -2465,7 +2465,7 @@ public abstract class Player extends GameEntity implements Comparable { if (property.substring(10).equals("Life")) { int lowestLife = 1000; List lowestlifep = new ArrayList(); - for (final Player p : Singletons.getModel().getGame().getPlayers()) { + for (final Player p : game.getPlayers()) { if (p.getLife() == lowestLife) { lowestlifep.add(p); } else if (p.getLife() < lowestLife) { diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 7263022bcaa..b5a853063cf 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -28,7 +28,6 @@ import forge.Card; import forge.CardLists; import forge.FThreads; import forge.CardPredicates.Presets; -import forge.Singletons; import forge.card.ability.AbilityUtils; import forge.card.cardfactory.CardFactory; import forge.card.cardfactory.CardFactoryUtil; @@ -199,7 +198,7 @@ public class MagicStack extends MyObservable { this.add(sa); } // Add all waiting triggers onto the stack - checkState |= Singletons.getModel().getGame().getTriggerHandler().runWaitingTriggers(); + checkState |= game.getTriggerHandler().runWaitingTriggers(); if (checkState) { this.chooseOrderOfSimultaneousStackEntryAll(); game.getAction().checkStateEffects(); diff --git a/src/main/java/forge/game/zone/PlayerZone.java b/src/main/java/forge/game/zone/PlayerZone.java index 307cd991c63..fdec652afb4 100644 --- a/src/main/java/forge/game/zone/PlayerZone.java +++ b/src/main/java/forge/game/zone/PlayerZone.java @@ -18,7 +18,6 @@ package forge.game.zone; import forge.Card; -import forge.Singletons; import forge.game.player.Player; /** @@ -60,11 +59,10 @@ public class PlayerZone extends Zone { public void add(final Object o, boolean update) { final Card c = (Card) o; - // Immutable cards are usually emblems,effects and the mana pool and we - // don't want to log those. + // Immutable cards are usually emblems and effects - we don't want to log those. if (!c.isImmutable()) { this.cardsAddedThisTurn.add(c); - final Zone zone = Singletons.getModel().getGame().getZoneOf(c); + final Zone zone = c.getGame().getZoneOf(c); if (zone != null) { this.cardsAddedThisTurnSource.add(zone.getZoneType()); } else { @@ -89,7 +87,7 @@ public class PlayerZone extends Zone { } c.addObserver(this); - c.setTurnInZone(Singletons.getModel().getGame().getPhaseHandler().getTurn()); + c.setTurnInZone(c.getGame().getPhaseHandler().getTurn()); if (!this.is(ZoneType.Battlefield)) { c.setTapped(false); diff --git a/src/main/java/forge/game/zone/PlayerZoneBattlefield.java b/src/main/java/forge/game/zone/PlayerZoneBattlefield.java index 9de6d7e26c8..abbd504abd4 100644 --- a/src/main/java/forge/game/zone/PlayerZoneBattlefield.java +++ b/src/main/java/forge/game/zone/PlayerZoneBattlefield.java @@ -19,6 +19,7 @@ package forge.game.zone; import java.util.List; +import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -27,8 +28,6 @@ import forge.Card; import forge.CardLists; import forge.CardPredicates; import forge.CardPredicates.Presets; -import forge.Command; -import forge.Singletons; import forge.card.ability.AbilityFactory; import forge.card.mana.ManaCost; import forge.card.spellability.Ability; @@ -36,6 +35,7 @@ import forge.card.spellability.SpellAbility; import forge.card.staticability.StaticAbility; import forge.card.trigger.ZCTrigger; import forge.game.GameActionUtil; +import forge.game.GameState; import forge.game.player.Player; /** @@ -85,7 +85,7 @@ public class PlayerZoneBattlefield extends PlayerZone { c.setTapped(true); } else { // ETBTapped static abilities - for (final Card ca : Singletons.getModel().getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { + for (final Card ca : c.getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { for (final StaticAbility stAb : ca.getStaticAbilities()) { if (stAb.applyAbility("ETBTapped", c)) { // it enters the battlefield this way, and should @@ -106,7 +106,7 @@ public class PlayerZoneBattlefield extends PlayerZone { final String[] k = keyword.split(":"); addMax = Integer.valueOf(k[2]); if (k[1].equals("Each")) { - for( Player p : Singletons.getModel().getGame().getPlayers() ){ + for( Player p : game.getPlayers() ){ p.addMaxLandsToPlay(addMax); } } else { @@ -115,15 +115,15 @@ public class PlayerZoneBattlefield extends PlayerZone { } }*/ + final GameState game = c.getGame(); if (this.trigger) { c.setSickness(true); // summoning sickness c.executeTrigger(ZCTrigger.ENTERFIELD); - + if (c.isLand()) { - // Tectonic Instability final List tis = - CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Tectonic Instability")); + CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Tectonic Instability")); final Card tisLand = c; for (final Card ti : tis) { final Card source = ti; @@ -140,7 +140,7 @@ public class PlayerZoneBattlefield extends PlayerZone { sb.append(source).append(" - tap all lands "); sb.append(tisLand.getController()).append(" controls."); ability.setStackDescription(sb.toString()); - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability); + game.getStack().addSimultaneousStackEntry(ability); } @@ -152,16 +152,16 @@ public class PlayerZoneBattlefield extends PlayerZone { if (oLands.size() <= (pLands.size() - 1)) { SpellAbility abSac = AbilityFactory.getAbility(le.getSVar("SacLand"), le); - Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(abSac); + game.getStack().addSimultaneousStackEntry(abSac); } } } // isLand() } - if (Singletons.getModel().getGame().getStaticEffects().getCardToEffectsList().containsKey(c.getName())) { - final String[] effects = Singletons.getModel().getGame().getStaticEffects().getCardToEffectsList().get(c.getName()); + if (game.getStaticEffects().getCardToEffectsList().containsKey(c.getName())) { + final String[] effects = game.getStaticEffects().getCardToEffectsList().get(c.getName()); for (final String effect : effects) { - Singletons.getModel().getGame().getStaticEffects().addStateBasedEffect(effect); + game.getStaticEffects().addStateBasedEffect(effect); } } } // end add() @@ -206,7 +206,7 @@ public class PlayerZoneBattlefield extends PlayerZone { final String[] k = keyword.split(":"); addMax = -Integer.valueOf(k[2]); if (k[1].equals("Each")) { - for(Player p: Singletons.getModel().getGame().getPlayers()) + for(Player p: game.getPlayers()) p.addMaxLandsToPlay(addMax); } else { c.getController().addMaxLandsToPlay(addMax); @@ -214,19 +214,21 @@ public class PlayerZoneBattlefield extends PlayerZone { } }*/ + final GameState game = c.getGame(); + if (this.leavesTrigger) { c.executeTrigger(ZCTrigger.LEAVEFIELD); } - if (Singletons.getModel().getGame().getStaticEffects().getCardToEffectsList().containsKey(c.getName())) { - final String[] effects = Singletons.getModel().getGame().getStaticEffects().getCardToEffectsList().get(c.getName()); + if (game.getStaticEffects().getCardToEffectsList().containsKey(c.getName())) { + final String[] effects = game.getStaticEffects().getCardToEffectsList().get(c.getName()); String tempEffect = ""; for (final String effect : effects) { tempEffect = effect; - Singletons.getModel().getGame().getStaticEffects().removeStateBasedEffect(effect); + game.getStaticEffects().removeStateBasedEffect(effect); // this is to make sure cards reset correctly - final Command comm = GameActionUtil.getCommands().get(tempEffect); - comm.run(); + final Function comm = GameActionUtil.getCommands().get(tempEffect); + comm.apply(game); } } } diff --git a/src/main/java/forge/game/zone/Zone.java b/src/main/java/forge/game/zone/Zone.java index 1131f01b24d..21aaf49c67b 100644 --- a/src/main/java/forge/game/zone/Zone.java +++ b/src/main/java/forge/game/zone/Zone.java @@ -26,7 +26,6 @@ import java.util.Observer; import java.util.concurrent.CopyOnWriteArrayList; import forge.Card; -import forge.Singletons; import forge.game.player.Player; import forge.util.MyObservable; @@ -80,7 +79,7 @@ public class Zone extends MyObservable implements IZone, Observer, java.io.Seria // don't want to log those. if (!c.isImmutable()) { this.cardsAddedThisTurn.add(c); - final Zone zone = Singletons.getModel().getGame().getZoneOf(c); + final Zone zone = c.getGame().getZoneOf(c); if (zone != null) { this.cardsAddedThisTurnSource.add(zone.getZoneType()); } else { @@ -89,7 +88,7 @@ public class Zone extends MyObservable implements IZone, Observer, java.io.Seria } c.addObserver(this); - c.setTurnInZone(Singletons.getModel().getGame().getPhaseHandler().getTurn()); + c.setTurnInZone(c.getGame().getPhaseHandler().getTurn()); c.setTapped(false); this.cardList.add(c); @@ -138,7 +137,7 @@ public class Zone extends MyObservable implements IZone, Observer, java.io.Seria // don't want to log those. if (!c.isImmutable()) { this.cardsAddedThisTurn.add(c); - final Zone zone = Singletons.getModel().getGame().getZoneOf(c); + final Zone zone = c.getGame().getZoneOf(c); if (zone != null) { this.cardsAddedThisTurnSource.add(zone.getZoneType()); } else { @@ -151,7 +150,7 @@ public class Zone extends MyObservable implements IZone, Observer, java.io.Seria } this.cardList.add(index, c); - c.setTurnInZone(Singletons.getModel().getGame().getPhaseHandler().getTurn()); + c.setTurnInZone(c.getGame().getPhaseHandler().getTurn()); this.update(); } diff --git a/src/main/java/forge/gui/GuiDialog.java b/src/main/java/forge/gui/GuiDialog.java index 8eed9914b4a..8c6e38e14ce 100644 --- a/src/main/java/forge/gui/GuiDialog.java +++ b/src/main/java/forge/gui/GuiDialog.java @@ -10,7 +10,6 @@ import org.apache.commons.lang3.StringUtils; import forge.Card; import forge.FThreads; -import forge.Singletons; import forge.game.event.FlipCoinEvent; import forge.game.player.Player; import forge.gui.match.CMatchUI; @@ -101,7 +100,7 @@ public class GuiDialog { final String winMsg = winFlip ? " wins flip." : " loses flip."; // Play the Flip A Coin sound - Singletons.getModel().getGame().getEvents().post(new FlipCoinEvent()); + caller.getGame().getEvents().post(new FlipCoinEvent()); JOptionPane.showMessageDialog(null, source.getName() + " - " + caller + winMsg, source.getName(), JOptionPane.PLAIN_MESSAGE); diff --git a/src/main/java/forge/gui/GuiDisplayUtil.java b/src/main/java/forge/gui/GuiDisplayUtil.java index d29d0c27606..5385fb0e51a 100644 --- a/src/main/java/forge/gui/GuiDisplayUtil.java +++ b/src/main/java/forge/gui/GuiDisplayUtil.java @@ -172,7 +172,7 @@ public final class GuiDisplayUtil { } public static void updateGUI() { - for (Player p : Singletons.getModel().getGame().getRegisteredPlayers()) { + for (Player p : getGame().getRegisteredPlayers()) { // why was it written twice? p.getZone(ZoneType.Battlefield).updateObservers(); @@ -201,6 +201,7 @@ public final class GuiDisplayUtil { if (rc != JFileChooser.APPROVE_OPTION) { return; } + final GameState game = getGame(); try { final FileInputStream fstream = new FileInputStream(fc.getSelectedFile().getAbsolutePath()); @@ -291,17 +292,17 @@ public final class GuiDisplayUtil { if (!tChangePlayer.trim().toLowerCase().equals("none")) { if (tChangePlayer.trim().toLowerCase().equals("human")) { - Singletons.getModel().getGame().getPhaseHandler().setPlayerTurn(human); + game.getPhaseHandler().setPlayerTurn(human); } if (tChangePlayer.trim().toLowerCase().equals("ai")) { - Singletons.getModel().getGame().getPhaseHandler().setPlayerTurn(ai); + game.getPhaseHandler().setPlayerTurn(ai); } } if (!tChangePhase.trim().toLowerCase().equals("none")) { - Singletons.getModel().getGame().getPhaseHandler().setDevPhaseState(forge.game.phase.PhaseType.smartValueOf(tChangePhase)); + game.getPhaseHandler().setDevPhaseState(forge.game.phase.PhaseType.smartValueOf(tChangePhase)); } if (!tHumanSetupCardsInPlay.trim().toLowerCase().equals("none")) { @@ -344,17 +345,17 @@ public final class GuiDisplayUtil { computerDevExileSetup = GuiDisplayUtil.devProcessCardsForZone(computerSetupExile, ai); } - Singletons.getModel().getGame().getTriggerHandler().suppressMode(TriggerType.ChangesZone); - Singletons.getModel().getGame().getCombat().reset(); + game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); + game.getCombat().reset(game.getPhaseHandler().getPlayerTurn()); for (final Card c : humanDevSetup) { human.getZone(ZoneType.Hand).add(c); - Singletons.getModel().getGame().getAction().moveToPlay(c); + game.getAction().moveToPlay(c); c.setSickness(false); } for (final Card c : computerDevSetup) { ai.getZone(ZoneType.Hand).add(c); - Singletons.getModel().getGame().getAction().moveToPlay(c); + game.getAction().moveToPlay(c); c.setSickness(false); } @@ -386,7 +387,7 @@ public final class GuiDisplayUtil { ai.getZone(ZoneType.Exile).setCards(computerDevExileSetup); } - Singletons.getModel().getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); if (setComputerLife > 0) { ai.setLife(setComputerLife, null); @@ -395,8 +396,8 @@ public final class GuiDisplayUtil { human.setLife(setHumanLife, null); } - Singletons.getModel().getGame().getAction().checkStateEffects(); - Singletons.getModel().getGame().getPhaseHandler().updateObservers(); + game.getAction().checkStateEffects(); + game.getPhaseHandler().updateObservers(); updateGUI(); } @@ -460,7 +461,7 @@ public final class GuiDisplayUtil { return; } else { final Card c = (Card) o; - Singletons.getModel().getGame().getAction().moveToHand(c); + getGame().getAction().moveToHand(c); } } @@ -472,7 +473,7 @@ public final class GuiDisplayUtil { * @since 1.0.15 */ public static void devModeAddCounter() { - final Card o = GuiChoose.oneOrNone("Add counters to which card?", Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield)); + final Card o = GuiChoose.oneOrNone("Add counters to which card?", getGame().getCardsIn(ZoneType.Battlefield)); if (null == o) { return; } else { @@ -503,7 +504,7 @@ public final class GuiDisplayUtil { * @since 1.0.15 */ public static void devModeTapPerm() { - final List play = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final List play = getGame().getCardsIn(ZoneType.Battlefield); final Object o = GuiChoose.oneOrNone("Choose a permanent", CardLists.filter(play, Predicates.not(CardPredicates.Presets.TAPPED))); if (null == o) { return; @@ -521,7 +522,7 @@ public final class GuiDisplayUtil { * @since 1.0.15 */ public static void devModeUntapPerm() { - final List play = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + final List play = getGame().getCardsIn(ZoneType.Battlefield); final Object o = GuiChoose.oneOrNone("Choose a permanent", CardLists.filter(play, CardPredicates.Presets.TAPPED)); if (null == o) { return; @@ -550,7 +551,7 @@ public final class GuiDisplayUtil { * @since 1.1.3 */ public static void devModeSetLife() { - final List players = Singletons.getModel().getGame().getPlayers(); + final List players = getGame().getPlayers(); final Player o = GuiChoose.oneOrNone("Set life for which player?", players); if (null == o) { return; @@ -577,7 +578,7 @@ public final class GuiDisplayUtil { * @since 1.2.7 */ public static void devModeCardToHand() { - final List players = Singletons.getModel().getGame().getPlayers(); + final List players = getGame().getPlayers(); final Player p = GuiChoose.oneOrNone("Put card in hand for which player?", players); if (null == p) { return; @@ -593,12 +594,12 @@ public final class GuiDisplayUtil { } Card forgeCard = c.toForgeCard(p); - Singletons.getModel().getGame().getAction().moveToHand(forgeCard); + getGame().getAction().moveToHand(forgeCard); } public static void devModeCardToBattlefield() { - final List players = Singletons.getModel().getGame().getPlayers(); + final List players = getGame().getPlayers(); final Player p = GuiChoose.oneOrNone("Put card in play for which player?", players); if (null == p) { return; @@ -615,7 +616,7 @@ public final class GuiDisplayUtil { final Card forgeCard = c.toForgeCard(p); - final GameState game = Singletons.getModel().getGame(); + final GameState game = getGame(); if (forgeCard.getType().contains("Land")) { forgeCard.setOwner(p); game.getAction().moveToPlay(forgeCard); @@ -645,7 +646,7 @@ public final class GuiDisplayUtil { } public static void devModeBreakpoint() { - List Players = Singletons.getModel().getGame().getPlayers(); + List Players = getGame().getPlayers(); /* Combat CombatHandler = AllZone.getCombat(); TriggerHandler Triggers = AllZone.getTriggerHandler(); @@ -673,7 +674,7 @@ public final class GuiDisplayUtil { public static void devModeRiggedPlanarRoll() { - final List players = Singletons.getModel().getGame().getPlayers(); + final List players = getGame().getPlayers(); final Player p = GuiChoose.oneOrNone("Which player should roll?", players); if (null == p) { return; @@ -687,5 +688,9 @@ public final class GuiDisplayUtil { p.getGame().getStack().chooseOrderOfSimultaneousStackEntryAll(); } + + private static GameState getGame() { + return Singletons.getModel().getMatch().getCurrentGame(); + } } // end class GuiDisplayUtil diff --git a/src/main/java/forge/gui/match/CMatchUI.java b/src/main/java/forge/gui/match/CMatchUI.java index 0a81bce5d13..16280336157 100644 --- a/src/main/java/forge/gui/match/CMatchUI.java +++ b/src/main/java/forge/gui/match/CMatchUI.java @@ -40,6 +40,7 @@ import forge.gui.match.nonsingleton.CField; import forge.gui.match.nonsingleton.VCommand; import forge.gui.match.nonsingleton.VField; import forge.gui.match.nonsingleton.VHand; +import forge.gui.match.views.VPlayers; import forge.gui.toolbox.FSkin; import forge.item.InventoryItem; import forge.properties.ForgePreferences.FPref; @@ -130,6 +131,8 @@ public enum CMatchUI { VMatchUI.SINGLETON_INSTANCE.setCommandViews(commands); VMatchUI.SINGLETON_INSTANCE.setFieldViews(fields); VMatchUI.SINGLETON_INSTANCE.setHandViews(hands); + + VPlayers.SINGLETON_INSTANCE.init(players); } /** diff --git a/src/main/java/forge/gui/match/ControlWinLose.java b/src/main/java/forge/gui/match/ControlWinLose.java index 0cba45494ff..ae8ae24daf5 100644 --- a/src/main/java/forge/gui/match/ControlWinLose.java +++ b/src/main/java/forge/gui/match/ControlWinLose.java @@ -119,7 +119,7 @@ public class ControlWinLose { return; } - for (Player p : Singletons.getModel().getGame().getRegisteredPlayers()) { + for (Player p : match.getCurrentGame().getRegisteredPlayers()) { if (!p.getLobbyPlayer().equals(lastGame.getWinner())) { continue; } @@ -127,7 +127,7 @@ public class ControlWinLose { // remove all the lost cards from owners' decks List losses = new ArrayList(); - for (Player loser : Singletons.getModel().getGame().getRegisteredPlayers()) { + for (Player loser : match.getCurrentGame().getRegisteredPlayers()) { if (loser.equals(p)) { continue; // not a loser } diff --git a/src/main/java/forge/gui/match/QuestWinLose.java b/src/main/java/forge/gui/match/QuestWinLose.java index 17276a4510f..b3b4d2a268d 100644 --- a/src/main/java/forge/gui/match/QuestWinLose.java +++ b/src/main/java/forge/gui/match/QuestWinLose.java @@ -133,7 +133,7 @@ public class QuestWinLose extends ControlWinLose { if (!outcome.isDraw()) { boolean isHumanWinner = outcome.getWinner().equals(questPlayer); final List anteCards = new ArrayList(); - for (Player p : Singletons.getModel().getGame().getRegisteredPlayers()) { + for (Player p : match.getCurrentGame().getRegisteredPlayers()) { if (p.getLobbyPlayer().equals(questPlayer) == isHumanWinner) { continue; } diff --git a/src/main/java/forge/gui/match/TargetingOverlay.java b/src/main/java/forge/gui/match/TargetingOverlay.java index 5bafcb47471..73c33234dd7 100644 --- a/src/main/java/forge/gui/match/TargetingOverlay.java +++ b/src/main/java/forge/gui/match/TargetingOverlay.java @@ -36,6 +36,7 @@ import javax.swing.JPanel; import forge.Card; import forge.Singletons; import forge.control.FControl; +import forge.game.phase.Combat; import forge.gui.match.controllers.CDock; import forge.gui.match.nonsingleton.CField; import forge.gui.toolbox.FSkin; @@ -76,7 +77,7 @@ public enum TargetingOverlay { // TODO - this is called every repaint, regardless if card // positions have changed or not. Could perform better if // it checked for a state change. Doublestrike 28-09-12 - private void assembleArcs() { + private void assembleArcs(Combat combat) { arcs.clear(); cardPanels.clear(); @@ -156,8 +157,8 @@ public enum TargetingOverlay { }); } - for (Card attackingCard : Singletons.getModel().getGame().getCombat().getAttackers()) { - temp = Singletons.getModel().getGame().getCombat().getBlockers(attackingCard); + for (Card attackingCard : combat.getAttackers()) { + temp = combat.getBlockers(attackingCard); for (Card blockingCard : temp) { if (!attackingCard.equals(c) && !blockingCard.equals(c)) { continue; } arcs.add(new Point[] { @@ -190,8 +191,8 @@ public enum TargetingOverlay { } // Combat cards - for (Card attackingCard : Singletons.getModel().getGame().getCombat().getAttackers()) { - temp = Singletons.getModel().getGame().getCombat().getBlockers(attackingCard); + for (Card attackingCard : combat.getAttackers()) { + temp = combat.getBlockers(attackingCard); for (Card blockingCard : temp) { arcs.add(new Point[]{ endpoints.get(attackingCard.getUniqueNumber()), @@ -283,6 +284,7 @@ public enum TargetingOverlay { @Override public void paintComponent(final Graphics g) { + final Combat combat = Singletons.getModel().getMatch().getCurrentGame().getCombat(); // this will get deprecated too // No need for this except in match view if (FControl.SINGLETON_INSTANCE.getState() != FControl.Screens.MATCH_SCREEN) { return; } @@ -293,7 +295,7 @@ public enum TargetingOverlay { if (overlaystate == 0) { return; } // Arc drawing - assembleArcs(); + assembleArcs(combat); if (arcs.isEmpty()) { return; } Graphics2D g2d = (Graphics2D) g; diff --git a/src/main/java/forge/gui/match/ViewWinLose.java b/src/main/java/forge/gui/match/ViewWinLose.java index 17726fc43ce..0c54e95049c 100644 --- a/src/main/java/forge/gui/match/ViewWinLose.java +++ b/src/main/java/forge/gui/match/ViewWinLose.java @@ -103,7 +103,7 @@ public class ViewWinLose { // Assemble game log scroller. final FTextArea txtLog = new FTextArea(); - txtLog.setText(Singletons.getModel().getGame().getGameLog().getLogText()); + txtLog.setText(match.getCurrentGame().getGameLog().getLogText()); txtLog.setFont(FSkin.getFont(14)); txtLog.setFocusable(true); // allow highlighting and copying of log diff --git a/src/main/java/forge/gui/match/controllers/CCombat.java b/src/main/java/forge/gui/match/controllers/CCombat.java index 0acf8fe8d68..e46fd6cd59f 100644 --- a/src/main/java/forge/gui/match/controllers/CCombat.java +++ b/src/main/java/forge/gui/match/controllers/CCombat.java @@ -34,6 +34,6 @@ public enum CCombat implements ICDoc { */ @Override public void update() { - VCombat.SINGLETON_INSTANCE.updateCombat(""); + VCombat.SINGLETON_INSTANCE.updateCombat(0, ""); } } diff --git a/src/main/java/forge/gui/match/controllers/CLog.java b/src/main/java/forge/gui/match/controllers/CLog.java index cd4d46dd787..347bb426d91 100644 --- a/src/main/java/forge/gui/match/controllers/CLog.java +++ b/src/main/java/forge/gui/match/controllers/CLog.java @@ -5,6 +5,7 @@ import java.util.Observer; import forge.Command; import forge.FThreads; +import forge.GameLog; import forge.gui.framework.ICDoc; import forge.gui.match.views.VLog; @@ -34,25 +35,24 @@ public enum CLog implements ICDoc, Observer { } - private static Runnable updateConsole = new Runnable() { - - @Override - public void run() { - VLog.SINGLETON_INSTANCE.updateConsole(); - } - }; @Override - public void update() { - FThreads.invokeInEdtNowOrLater(updateConsole); - } + public void update() {} /* (non-Javadoc) * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ @Override - public void update(Observable arg0, Object arg1) { - update(); + public void update(final Observable model, Object arg1) { + if( model instanceof GameLog ) { + FThreads.invokeInEdtNowOrLater(new Runnable() { + + @Override + public void run() { + VLog.SINGLETON_INSTANCE.updateConsole((GameLog)model); + } + }); + } } } diff --git a/src/main/java/forge/gui/match/controllers/CPlayers.java b/src/main/java/forge/gui/match/controllers/CPlayers.java index 9496d000c87..836a8684491 100644 --- a/src/main/java/forge/gui/match/controllers/CPlayers.java +++ b/src/main/java/forge/gui/match/controllers/CPlayers.java @@ -1,8 +1,6 @@ package forge.gui.match.controllers; import forge.Command; -import forge.Singletons; -import forge.game.player.Player; import forge.gui.framework.ICDoc; import forge.gui.match.views.VPlayers; @@ -36,10 +34,7 @@ public enum CPlayers implements ICDoc { */ @Override public void update() { - for (Player p : Singletons.getModel().getGame().getRegisteredPlayers()) { - VPlayers.SINGLETON_INSTANCE.updatePlayerLabels(p); - } - VPlayers.SINGLETON_INSTANCE.updateStormLabel(); + VPlayers.SINGLETON_INSTANCE.update(); } } diff --git a/src/main/java/forge/gui/match/controllers/CStack.java b/src/main/java/forge/gui/match/controllers/CStack.java index 980c06bd708..0df0d9c9155 100644 --- a/src/main/java/forge/gui/match/controllers/CStack.java +++ b/src/main/java/forge/gui/match/controllers/CStack.java @@ -5,6 +5,7 @@ import java.util.Observer; import forge.Command; import forge.FThreads; +import forge.game.zone.MagicStack; import forge.gui.framework.EDocID; import forge.gui.framework.ICDoc; import forge.gui.framework.SDisplayUtil; @@ -38,19 +39,30 @@ public enum CStack implements ICDoc, Observer { /* (non-Javadoc) * @see forge.gui.framework.ICDoc#update() */ - @Override - public void update() { - VStack.SINGLETON_INSTANCE.updateStack(); + public void update(MagicStack model) { + VStack.SINGLETON_INSTANCE.updateStack(model); } /* (non-Javadoc) * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ @Override - public void update(Observable arg0, Object arg1) { - SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); - FThreads.invokeInEdtNowOrLater(doUpdate); + public void update(final Observable arg0, Object arg1) { + if ( arg0 instanceof MagicStack ) + { + FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { + SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); + update((MagicStack)arg0); + } }); + } } - - private final Runnable doUpdate = new Runnable() { @Override public void run() {update(); } }; + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#update() + */ + @Override + public void update() { + // won't update without a model! + } + } diff --git a/src/main/java/forge/gui/match/views/VCombat.java b/src/main/java/forge/gui/match/views/VCombat.java index 69bf970da4d..1a264831425 100644 --- a/src/main/java/forge/gui/match/views/VCombat.java +++ b/src/main/java/forge/gui/match/views/VCombat.java @@ -21,7 +21,6 @@ import javax.swing.JTextArea; import javax.swing.border.MatteBorder; import net.miginfocom.swing.MigLayout; -import forge.Singletons; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -107,11 +106,11 @@ public enum VCombat implements IVDoc { //========= Observer update methods /** @param s0   {@link java.lang.String} */ - public void updateCombat(final String s0) { + public void updateCombat(final int cntAttackers, final String desc) { // No need to update this unless it's showing if (!this.equals(parentCell.getSelected())) { return; } - tab.setText("Combat : " + Singletons.getModel().getGame().getCombat().getAttackers().size()); - tar.setText(s0); + tab.setText("Combat : " + cntAttackers); + tar.setText(desc); } } diff --git a/src/main/java/forge/gui/match/views/VLog.java b/src/main/java/forge/gui/match/views/VLog.java index 1c3da67e81d..83608182d08 100644 --- a/src/main/java/forge/gui/match/views/VLog.java +++ b/src/main/java/forge/gui/match/views/VLog.java @@ -25,8 +25,8 @@ import javax.swing.JTextArea; import javax.swing.border.EmptyBorder; import net.miginfocom.swing.MigLayout; +import forge.GameLog; import forge.GameLog.LogEntry; -import forge.Singletons; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -110,14 +110,15 @@ public enum VLog implements IVDoc { } //========== Observer update methods - /** */ - public void updateConsole() { + /** + * @param model */ + public void updateConsole(GameLog model) { // No need to update this unless it's showing if (!parentCell.getSelected().equals(this)) { return; } // TODO - some option to make this configurable is probably desirable // By default, grab everything log level 3 or less. - final List data = Singletons.getModel().getGame().getGameLog().getLogEntries(3); + final List data = model.getLogEntries(3); final int size = data.size(); pnl.removeAll(); diff --git a/src/main/java/forge/gui/match/views/VPlayers.java b/src/main/java/forge/gui/match/views/VPlayers.java index df19cac5677..f8fa077d248 100644 --- a/src/main/java/forge/gui/match/views/VPlayers.java +++ b/src/main/java/forge/gui/match/views/VPlayers.java @@ -20,6 +20,7 @@ package forge.gui.match.views; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import javax.swing.JLabel; import javax.swing.JPanel; @@ -28,6 +29,7 @@ import javax.swing.border.MatteBorder; import net.miginfocom.swing.MigLayout; import forge.Card; import forge.Singletons; +import forge.game.GameState; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.framework.DragCell; @@ -65,14 +67,22 @@ public enum VPlayers implements IVDoc { final JPanel pnl = parentCell.getBody(); pnl.setLayout(new MigLayout("insets 0, gap 0, wrap")); - final List players = Singletons.getModel().getGame().getRegisteredPlayers(); - this.infoLBLs = new HashMap(); - final String constraints = "w 97%!, gapleft 2%, gapbottom 1%"; + for (final Entry p : infoLBLs.entrySet()) { + for(JLabel label : p.getValue() ) + pnl.add(label, constraints); + } + + stormLabel = new InfoLabel(); + pnl.add(stormLabel, constraints); + } + + public void init(final Iterable players) { + + this.infoLBLs = new HashMap(); for (final Player p : players) { - // Create and store labels detailing various non-critical player - // info. + // Create and store labels detailing various non-critical player info. final InfoLabel name = new InfoLabel(); final InfoLabel life = new InfoLabel(); final InfoLabel hand = new InfoLabel(); @@ -85,19 +95,7 @@ public enum VPlayers implements IVDoc { // Set border on bottom label, and larger font on player name antes.setBorder(new MatteBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS))); name.setText(p.getName()); - - // Add to "players" tab panel - pnl.add(name, constraints); - pnl.add(life, constraints); - pnl.add(hand, constraints); - pnl.add(draw, constraints); - pnl.add(prevention, constraints); - pnl.add(keywords, constraints); - pnl.add(antes, constraints); } - - stormLabel = new InfoLabel(); - pnl.add(stormLabel, constraints); } /* (non-Javadoc) @@ -143,41 +141,45 @@ public enum VPlayers implements IVDoc { //========== Observer update methods /** @param p0 {@link forge.game.player.Player} */ - public void updatePlayerLabels(final Player p0) { + public void update() { // No need to update if this panel isn't showing if (!this.equals(parentCell.getSelected())) { return; } - final JLabel[] temp = this.infoLBLs.get(p0); - temp[1].setText("Life: " + String.valueOf(p0.getLife()) + " | Poison counters: " - + String.valueOf(p0.getPoisonCounters())); - temp[2].setText("Maximum hand size: " + String.valueOf(p0.getMaxHandSize())); - temp[3].setText("Cards drawn this turn: " + String.valueOf(p0.getNumDrawnThisTurn())); - temp[4].setText("Damage Prevention: " + String.valueOf(p0.getPreventNextDamage())); - if (!p0.getKeywords().isEmpty()) { - temp[5].setText(p0.getKeywords().toString()); - } else { - temp[5].setText(""); - } - if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE)) { - List list = p0.getCardsIn(ZoneType.Ante); - StringBuilder sb = new StringBuilder(); - sb.append("Ante'd: "); - for (int i = 0; i < list.size(); i++) { - sb.append(list.get(i)); - if (i < (list.size() - 1)) { - sb.append(", "); - } + for(Entry rr : infoLBLs.entrySet()) { + Player p0 = rr.getKey(); + final JLabel[] temp = rr.getValue(); + temp[1].setText("Life: " + String.valueOf(p0.getLife()) + " | Poison counters: " + + String.valueOf(p0.getPoisonCounters())); + temp[2].setText("Maximum hand size: " + String.valueOf(p0.getMaxHandSize())); + temp[3].setText("Cards drawn this turn: " + String.valueOf(p0.getNumDrawnThisTurn())); + temp[4].setText("Damage Prevention: " + String.valueOf(p0.getPreventNextDamage())); + if (!p0.getKeywords().isEmpty()) { + temp[5].setText(p0.getKeywords().toString()); + } else { + temp[5].setText(""); + } + if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE)) { + List list = p0.getCardsIn(ZoneType.Ante); + StringBuilder sb = new StringBuilder(); + sb.append("Ante'd: "); + for (int i = 0; i < list.size(); i++) { + sb.append(list.get(i)); + if (i < (list.size() - 1)) { + sb.append(", "); + } + } + temp[6].setText(sb.toString()); } - temp[6].setText(sb.toString()); } } - /** */ - public void updateStormLabel() { + /** + * @param game */ + public void updateStormLabel(GameState game) { // No need to update if this panel isn't showing if (!parentCell.getSelected().equals(this)) { return; } - stormLabel.setText("Storm count: " + Singletons.getModel().getGame().getStack().getCardsCastThisTurn().size()); + stormLabel.setText("Storm count: " + game.getStack().getCardsCastThisTurn().size()); } //========= Custom class handling diff --git a/src/main/java/forge/gui/match/views/VStack.java b/src/main/java/forge/gui/match/views/VStack.java index 25213307604..a3f2171bceb 100644 --- a/src/main/java/forge/gui/match/views/VStack.java +++ b/src/main/java/forge/gui/match/views/VStack.java @@ -18,25 +18,19 @@ package forge.gui.match.views; import java.awt.Color; -import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JPopupMenu; import javax.swing.JTextArea; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import net.miginfocom.swing.MigLayout; import forge.CardUtil; -import forge.Singletons; import forge.card.spellability.SpellAbilityStackInstance; import forge.game.zone.MagicStack; -import forge.gui.ForgeAction; -import forge.gui.ForgeAction.MatchConstants; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -60,7 +54,6 @@ public enum VStack implements IVDoc { // Other fields private List stackTARs = new ArrayList(); - private TriggerReactionMenu triggerMenu = new TriggerReactionMenu(); //========= Overridden methods @@ -114,13 +107,12 @@ public enum VStack implements IVDoc { //========== Observer update methods - /** */ - public void updateStack() { + /** + * @param stack */ + public void updateStack(final MagicStack stack) { // No need to update this unless it's showing if (!parentCell.getSelected().equals(this)) { return; } - final MagicStack stack = Singletons.getModel().getGame().getStack(); - int count = 1; JTextArea tar; String txt, isOptional; @@ -136,7 +128,6 @@ public enum VStack implements IVDoc { stackTARs.clear(); for (int i = stack.size() - 1; 0 <= i; i--) { final SpellAbilityStackInstance spell = stack.peekInstance(i); - final int index = i; scheme = getSpellColor(spell); @@ -185,21 +176,6 @@ public enum VStack implements IVDoc { parentCell.getBody().add(tar, "w 98%!"); stackTARs.add(tar); - - if (spell.isOptionalTrigger()) { - tar.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(final MouseEvent e) { - - if (e.getButton() != MouseEvent.BUTTON3) { - return; - } - - triggerMenu.setTrigger(stack.peekAbility(index).getSourceTrigger()); - triggerMenu.show(e.getComponent(), e.getX(), e.getY()); - } - }); - } } parentCell.getBody().repaint(); @@ -207,82 +183,23 @@ public enum VStack implements IVDoc { /** Returns array with [background, foreground] colors. */ private Color[] getSpellColor(SpellAbilityStackInstance s0) { - if (s0.getStackDescription().startsWith("Morph ")) { + if (s0.getStackDescription().startsWith("Morph ")) return new Color[] { new Color(0, 0, 0, 0), FSkin.getColor(FSkin.Colors.CLR_TEXT) }; - } else if (CardUtil.getColors(s0.getSourceCard()).size() > 1) { + if (CardUtil.getColors(s0.getSourceCard()).size() > 1) return new Color[] { new Color(253, 175, 63), Color.black }; - } else if (s0.getSourceCard().isBlack()) { - return new Color[] { Color.black, Color.white }; - } else if (s0.getSourceCard().isBlue()) { - return new Color[] { new Color(71, 108, 191), Color.white }; - } else if (s0.getSourceCard().isGreen()) { - return new Color[] { new Color(23, 95, 30), Color.white }; - } else if (s0.getSourceCard().isRed()) { - return new Color[] { new Color(214, 8, 8), Color.white }; - } else if (s0.getSourceCard().isWhite()) { - return new Color[] { Color.white, Color.black }; - } else if (s0.getSourceCard().isArtifact() || s0.getSourceCard().isLand()) { + + if (s0.getSourceCard().isBlack()) return new Color[] { Color.black, Color.white }; + if (s0.getSourceCard().isBlue()) return new Color[] { new Color(71, 108, 191), Color.white }; + if (s0.getSourceCard().isGreen()) return new Color[] { new Color(23, 95, 30), Color.white }; + if (s0.getSourceCard().isRed()) return new Color[] { new Color(214, 8, 8), Color.white }; + if (s0.getSourceCard().isWhite()) return new Color[] { Color.white, Color.black }; + + if (s0.getSourceCard().isArtifact() || s0.getSourceCard().isLand()) return new Color[] { new Color(111, 75, 43), Color.white }; - } return new Color[] { new Color(0, 0, 0, 0), FSkin.getColor(FSkin.Colors.CLR_TEXT) }; } //========= Custom class handling - @SuppressWarnings("serial") - private class TriggerReactionMenu extends JPopupMenu { - private int workTrigID; - - public TriggerReactionMenu() { - super(); - - final ForgeAction actAccept = new ForgeAction(MatchConstants.ALWAYSACCEPT) { - @Override - public final void actionPerformed(final ActionEvent e) { - Singletons.getModel().getGame().getTriggerHandler().setAlwaysAcceptTrigger(TriggerReactionMenu.this.workTrigID); - } - }; - - final ForgeAction actDecline = new ForgeAction(MatchConstants.ALWAYSDECLINE) { - @Override - public final void actionPerformed(final ActionEvent e) { - Singletons.getModel().getGame().getTriggerHandler().setAlwaysDeclineTrigger(TriggerReactionMenu.this.workTrigID); - } - }; - - final ForgeAction actAsk = new ForgeAction(MatchConstants.ALWAYSASK) { - @Override - public final void actionPerformed(final ActionEvent e) { - Singletons.getModel().getGame().getTriggerHandler().setAlwaysAskTrigger(TriggerReactionMenu.this.workTrigID); - } - }; - - final JCheckBoxMenuItem jcbmiAccept = new JCheckBoxMenuItem(actAccept); - final JCheckBoxMenuItem jcbmiDecline = new JCheckBoxMenuItem(actDecline); - final JCheckBoxMenuItem jcbmiAsk = new JCheckBoxMenuItem(actAsk); - - this.add(jcbmiAccept); - this.add(jcbmiDecline); - this.add(jcbmiAsk); - } - - public void setTrigger(final int trigID) { - this.workTrigID = trigID; - - if (Singletons.getModel().getGame().getTriggerHandler().isAlwaysAccepted(trigID)) { - ((JCheckBoxMenuItem) this.getComponent(0)).setState(true); - ((JCheckBoxMenuItem) this.getComponent(1)).setState(false); - ((JCheckBoxMenuItem) this.getComponent(2)).setState(false); - } else if (Singletons.getModel().getGame().getTriggerHandler().isAlwaysDeclined(trigID)) { - ((JCheckBoxMenuItem) this.getComponent(0)).setState(false); - ((JCheckBoxMenuItem) this.getComponent(1)).setState(true); - ((JCheckBoxMenuItem) this.getComponent(2)).setState(false); - } else { - ((JCheckBoxMenuItem) this.getComponent(0)).setState(false); - ((JCheckBoxMenuItem) this.getComponent(1)).setState(false); - ((JCheckBoxMenuItem) this.getComponent(2)).setState(true); - } - } - } } diff --git a/src/main/java/forge/model/FModel.java b/src/main/java/forge/model/FModel.java index 1c44eace1e8..3a29a237156 100644 --- a/src/main/java/forge/model/FModel.java +++ b/src/main/java/forge/model/FModel.java @@ -38,11 +38,8 @@ import forge.card.cardfactory.CardStorageReader; import forge.deck.CardCollections; import forge.error.BugReporter; import forge.error.ExceptionHandler; -import forge.game.GameState; -import forge.game.GameType; import forge.game.MatchController; import forge.game.limited.GauntletMini; -import forge.game.player.LobbyPlayer; import forge.gauntlet.GauntletData; import forge.item.CardDb; import forge.properties.ForgePreferences; @@ -83,7 +80,6 @@ public enum FModel { private final CardCollections decks; private final MatchController match; - private GameState gameState; private final EditionCollection editions; private final FormatCollection formats; @@ -314,15 +310,6 @@ public enum FModel { return this.decks; } - /** - * Gets the game state model - that is, the data stored for a single game. - * - * @return {@link forge.game.GameState} - */ - public final GameState getGame() { - return this.gameState; - } - /** * TODO: Write javadoc for this method. * @@ -398,16 +385,6 @@ public enum FModel { return match; } - /** - * TODO: Write javadoc for this method. - * @param players - * @param input - */ - public GameState newGame(Iterable players, GameType type, final MatchController match0) { - gameState = new GameState(players,type, match0); - return gameState; - } - public GauntletMini getGauntletMini() { if (gauntlet == null) { diff --git a/src/test/java/forge/model/FModelTest.java b/src/test/java/forge/model/FModelTest.java index b6ce037db4c..78d82f4c32a 100644 --- a/src/test/java/forge/model/FModelTest.java +++ b/src/test/java/forge/model/FModelTest.java @@ -8,7 +8,6 @@ import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import forge.Singletons; import forge.properties.ForgePreferences; /** @@ -94,21 +93,4 @@ public class FModelTest { Assert.assertNotNull(prefs, "prefs instance is not null"); } - /** - * Test resetGameState and getGameState. - */ - @Test(enabled = false) - public final void test_resetGameState_getGameState() { - Singletons.setModel(this.model); - Assert.assertNull(this.model.getGame(), "game state has not yet been initialized"); - - /*final GameState state1 = this.model.resetGameState(); - Assert.assertNotNull(state1, "first state is OK"); - - final GameState state2 = this.model.resetGameState(); - Assert.assertNotNull(state1, "first state is OK"); - Assert.assertNotEquals(state1, state2, "first and second states are different");*/ - - } - }