diff --git a/src/main/java/forge/GameLogFormatter.java b/src/main/java/forge/GameLogFormatter.java index a41f4b79056..9fee38f88ae 100644 --- a/src/main/java/forge/GameLogFormatter.java +++ b/src/main/java/forge/GameLogFormatter.java @@ -37,7 +37,7 @@ public class GameLogFormatter { } else if ( ev instanceof PhaseEvent ) { Player p = ((PhaseEvent) ev).playerTurn; PhaseType ph = ((PhaseEvent) ev).phase; - return new GameLogEntry(GameEventType.PHASE, ((PhaseEvent) ev).phaseDesc + Lang.getPossesive(p.getName()) + " " + ph.NameForUi); + return new GameLogEntry(GameEventType.PHASE, ((PhaseEvent) ev).phaseDesc + Lang.getPossesive(p.getName()) + " " + ph.nameForUi); } return null; } diff --git a/src/main/java/forge/control/input/InputAttack.java b/src/main/java/forge/control/input/InputAttack.java index 2fe832b4790..be48ae016b4 100644 --- a/src/main/java/forge/control/input/InputAttack.java +++ b/src/main/java/forge/control/input/InputAttack.java @@ -88,7 +88,7 @@ public class InputAttack extends InputSyncronizedBase { private void showCombat() { player.getZone(ZoneType.Battlefield).updateObservers(); // redraw sword icons - CombatUtil.showCombat(game); + CombatUtil.showCombat(); } /** {@inheritDoc} */ diff --git a/src/main/java/forge/control/input/InputBase.java b/src/main/java/forge/control/input/InputBase.java index 37b706a8708..95be2f67020 100644 --- a/src/main/java/forge/control/input/InputBase.java +++ b/src/main/java/forge/control/input/InputBase.java @@ -90,7 +90,7 @@ public abstract class InputBase implements java.io.Serializable, Input { sb.append("Priority: ").append(player).append("\n").append("\n"); sb.append("Turn : ").append(ph.getPlayerTurn()).append("\n"); - sb.append("Phase: ").append(ph.getPhase().NameForUi).append("\n"); + sb.append("Phase: ").append(ph.getPhase().nameForUi).append("\n"); sb.append("Stack: "); if (!player.getGame().getStack().isEmpty()) { sb.append(player.getGame().getStack().size()).append(" to Resolve."); diff --git a/src/main/java/forge/control/input/InputBlock.java b/src/main/java/forge/control/input/InputBlock.java index acbf11f099e..5e513f4bc84 100644 --- a/src/main/java/forge/control/input/InputBlock.java +++ b/src/main/java/forge/control/input/InputBlock.java @@ -22,10 +22,9 @@ import java.util.HashMap; import java.util.List; import forge.Card; -import forge.game.GameState; +import forge.game.phase.Combat; import forge.game.phase.CombatUtil; import forge.game.player.Player; -import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.view.ButtonUtil; @@ -43,16 +42,16 @@ public class InputBlock extends InputSyncronizedBase { private Card currentAttacker = null; private final HashMap> allBlocking = new HashMap>(); - private final GameState game; + private final Combat combat; private final Player player; /** * TODO: Write javadoc for Constructor. * @param priority */ - public InputBlock(Player human, GameState game) { + public InputBlock(Player human, Combat combat) { player = human; - this.game = game; + this.combat = combat; } private final void removeFromAllBlocking(final Card c) { @@ -79,16 +78,16 @@ public class InputBlock extends InputSyncronizedBase { showMessage(sb.toString()); } - CombatUtil.showCombat(game); + CombatUtil.showCombat(); } /** {@inheritDoc} */ @Override public final void onOk() { - if (CombatUtil.finishedMandatoryBlocks(game.getCombat(), player)) { + if (CombatUtil.finishedMandatoryBlocks(combat, player)) { // Done blocking ButtonUtil.reset(); - CombatUtil.orderMultipleCombatants(game); + CombatUtil.orderMultipleCombatants(combat); currentAttacker = null; allBlocking.clear(); @@ -102,24 +101,22 @@ public class InputBlock extends InputSyncronizedBase { if (isMetaDown) { if (card.getController() == player ) { - game.getCombat().removeFromCombat(card); + combat.removeFromCombat(card); } removeFromAllBlocking(card); - CombatUtil.showCombat(game); + CombatUtil.showCombat(); return; } // is attacking? boolean reminder = true; - if (game.getCombat().getAttackers().contains(card)) { + if (combat.getAttackers().contains(card)) { this.currentAttacker = card; reminder = false; } else { - 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)) { + if (this.currentAttacker != null && card.isCreature() && player.getZone(ZoneType.Battlefield).contains(card)) { // Create a new blockedBy list if it doesn't exist if (!this.allBlocking.containsKey(card)) { this.allBlocking.put(card, new ArrayList()); @@ -127,9 +124,9 @@ public class InputBlock extends InputSyncronizedBase { List attackersBlocked = this.allBlocking.get(card); if (!attackersBlocked.contains(this.currentAttacker) - && CombatUtil.canBlock(this.currentAttacker, card, game.getCombat())) { + && CombatUtil.canBlock(this.currentAttacker, card, combat)) { attackersBlocked.add(this.currentAttacker); - game.getCombat().addBlocker(this.currentAttacker, card); + combat.addBlocker(this.currentAttacker, card); reminder = false; } } diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java index 82e8bbfa7a7..d6aa9dad0c9 100644 --- a/src/main/java/forge/game/ai/AiController.java +++ b/src/main/java/forge/game/ai/AiController.java @@ -796,30 +796,27 @@ public class AiController { public void onPriorityRecieved() { final PhaseType phase = game.getPhaseHandler().getPhase(); - - if (!game.getStack().isEmpty()) { - playSpellAbilities(game); - } else { - switch(phase) { - case COMBAT_DECLARE_ATTACKERS: - declareAttackers(); - break; - - case COMBAT_DECLARE_BLOCKERS: - final List blockers = player.getCreaturesInPlay(); - game.setCombat(ComputerUtilBlock.getBlockers(player, game.getCombat(), blockers)); - CombatUtil.orderMultipleCombatants(game); - break; + switch(phase) { + case COMBAT_DECLARE_ATTACKERS: + declareAttackers(); + break; + + case COMBAT_DECLARE_BLOCKERS: + final List blockers = player.getCreaturesInPlay(); + game.setCombat(ComputerUtilBlock.getBlockers(player, game.getCombat(), blockers)); + CombatUtil.orderMultipleCombatants(game.getCombat()); + break; - case MAIN1: - case MAIN2: - Log.debug("Computer " + phase.toString()); + case MAIN1: + case MAIN2: + Log.debug("Computer " + phase.nameForUi); + + if (game.getStack().isEmpty()) playLands(); - // fall through is intended - default: - playSpellAbilities(game); - break; - } + // fall through is intended + default: + playSpellAbilities(game); + break; } } diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index d0f550c18bd..12e908d02c7 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -34,6 +34,7 @@ import forge.CardLists; import forge.CardPredicates; import forge.Command; import forge.Constant; +import forge.FThreads; import forge.GameEntity; import forge.card.CardType; import forge.card.MagicColor; @@ -426,14 +427,12 @@ public class CombatUtil { return true; } - public static void orderMultipleCombatants(final GameState game) { - final Combat combat = game.getCombat(); - + public static void orderMultipleCombatants(final Combat combat) { CombatUtil.orderMultipleBlockers(combat); - CombatUtil.showCombat(game); + CombatUtil.showCombat(); CombatUtil.orderBlockingMultipleAttackers(combat); - CombatUtil.showCombat(game); + CombatUtil.showCombat(); } private static void orderMultipleBlockers(final Combat combat) { @@ -825,8 +824,7 @@ public class CombatUtil { final GameState game = c.getGame(); if (c.isTapped() || c.isPhasedOut() || (c.hasSickness() && !c.hasKeyword("CARDNAME can attack as though it had haste.")) - || game.getPhaseHandler().getPhase() - .isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { + || game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { return false; } return true; @@ -969,11 +967,11 @@ public class CombatUtil { * showCombat. *

*/ - public static void showCombat(GameState game) { - if (game.getPhaseHandler().inCombat()) { + public static void showCombat() { + FThreads.invokeInEdtNowOrLater( new Runnable() { @Override public void run() { SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc()); - } - CCombat.SINGLETON_INSTANCE.update(); + CCombat.SINGLETON_INSTANCE.update(); + } }); } // showBlockers() @@ -987,7 +985,7 @@ public class CombatUtil { * @param bLast * a boolean. */ - public static void checkPropagandaEffects(final GameState game, final Card c) { + public static boolean checkPropagandaEffects(final GameState game, final Card c) { Cost attackCost = new Cost(ManaCost.ZERO, true); // Sort abilities to apply them in proper order for (Card card : game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { @@ -1013,12 +1011,7 @@ public class CombatUtil { } } } - - if ( hasPaid ) { - if (!c.hasKeyword("Vigilance")) { c.tap(); } - } else { - game.getCombat().removeFromCombat(c); - } + return hasPaid; } /** diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 1cd3299b2de..534b403e468 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -355,7 +355,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { } if (inCombat()) { - CombatUtil.showCombat(game); + CombatUtil.showCombat(); } } @@ -365,7 +365,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { if (this.givePriorityToPlayer) { // Run triggers if phase isn't being skipped final HashMap runParams = new HashMap(); - runParams.put("Phase", this.getPhase().NameForScripts); + runParams.put("Phase", this.getPhase().nameForScripts); runParams.put("Player", this.getPlayerTurn()); game.getTriggerHandler().runTrigger(TriggerType.Phase, runParams, false); } @@ -795,7 +795,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { } public String debugPrintState(boolean hasPriority) { - return String.format("%s's %s [%sP] %s", getPlayerTurn(), getPhase().NameForUi, hasPriority ? "+" : "-", getPriorityPlayer()); + return String.format("%s's %s [%sP] %s", getPlayerTurn(), getPhase().nameForUi, hasPriority ? "+" : "-", getPriorityPlayer()); } diff --git a/src/main/java/forge/game/phase/PhaseType.java b/src/main/java/forge/game/phase/PhaseType.java index cbbe22c57fa..81849eed29c 100644 --- a/src/main/java/forge/game/phase/PhaseType.java +++ b/src/main/java/forge/game/phase/PhaseType.java @@ -12,7 +12,7 @@ public enum PhaseType { UNTAP("Untap"), UPKEEP("Upkeep"), DRAW("Draw"), - MAIN1("Main1"), + MAIN1("Main, precombat", "Main1"), COMBAT_BEGIN("Begin Combat", "BeginCombat"), COMBAT_DECLARE_ATTACKERS("Declare Attackers"), COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY("Declare Attackers - Play Instants and Abilities"), @@ -21,7 +21,7 @@ public enum PhaseType { COMBAT_FIRST_STRIKE_DAMAGE("First Strike Damage"), COMBAT_DAMAGE("Combat Damage"), COMBAT_END("End Combat", "EndCombat"), - MAIN2("Main2"), + MAIN2("Main, postcombat", "Main2"), END_OF_TURN("End of Turn"), CLEANUP("Cleanup"); @@ -35,15 +35,15 @@ public enum PhaseType { ) ); - public final String NameForUi; - public final String NameForScripts; + public final String nameForUi; + public final String nameForScripts; private PhaseType(String name) { this(name, name); } private PhaseType(String name, String name_for_scripts) { - NameForUi = name; - NameForScripts = name_for_scripts; + nameForUi = name; + nameForScripts = name_for_scripts; } @@ -68,7 +68,7 @@ public enum PhaseType { } final String valToCompate = value.trim(); for (final PhaseType v : PhaseType.values()) { - if (v.NameForScripts.compareToIgnoreCase(valToCompate) == 0) { + if (v.nameForScripts.compareToIgnoreCase(valToCompate) == 0) { return v; } } diff --git a/src/main/java/forge/game/phase/PhaseUtil.java b/src/main/java/forge/game/phase/PhaseUtil.java index 98cc457ac5d..9798c6a2098 100644 --- a/src/main/java/forge/game/phase/PhaseUtil.java +++ b/src/main/java/forge/game/phase/PhaseUtil.java @@ -103,7 +103,12 @@ public class PhaseUtil { for (final Card c : list) { - CombatUtil.checkPropagandaEffects(game, c); + boolean canAttack = CombatUtil.checkPropagandaEffects(game, c); + if ( canAttack ) { + if (!c.hasKeyword("Vigilance")) { c.tap(); } + } else { + game.getCombat().removeFromCombat(c); + } } PhaseUtil.handleAttackingTriggers(game); } diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 05c54e32ee9..28043044383 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -498,7 +498,7 @@ public class PlayerControllerHuman extends PlayerController { return; case COMBAT_DECLARE_BLOCKERS: - InputSynchronized inpBlock = new InputBlock(player, game); + InputSynchronized inpBlock = new InputBlock(player, game.getCombat()); Singletons.getControl().getInputQueue().setInputAndWait(inpBlock); return;