From be41dd7fff11a2f2d09ba001ece4321cd58dadac Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Tue, 4 Jun 2013 13:51:21 +0000 Subject: [PATCH] Better UI updates - CCombat --- .../control/FControlGameEventHandler.java | 27 ++++++++++++++++--- src/main/java/forge/game/phase/Combat.java | 4 +++ .../java/forge/game/phase/CombatUtil.java | 21 --------------- .../java/forge/game/phase/PhaseHandler.java | 8 ------ .../java/forge/gui/input/InputAttack.java | 3 ++- src/main/java/forge/gui/input/InputBlock.java | 5 ++-- src/main/java/forge/gui/match/CMatchUI.java | 11 ++++++++ .../forge/gui/match/controllers/CCombat.java | 15 ++++++++--- 8 files changed, 55 insertions(+), 39 deletions(-) diff --git a/src/main/java/forge/control/FControlGameEventHandler.java b/src/main/java/forge/control/FControlGameEventHandler.java index cb980163df7..e559d15ffc8 100644 --- a/src/main/java/forge/control/FControlGameEventHandler.java +++ b/src/main/java/forge/control/FControlGameEventHandler.java @@ -10,15 +10,18 @@ import forge.Card; import forge.FThreads; import forge.game.event.GameEvent; import forge.game.event.GameEventAnteCardsSelected; +import forge.game.event.GameEventAttackersDeclared; import forge.game.event.GameEventGameFinished; import forge.game.event.GameEventGameOutcome; import forge.game.event.GameEventPlayerControl; +import forge.game.event.GameEventPlayerPriority; import forge.game.event.GameEventSpellAbilityCast; import forge.game.event.GameEventSpellRemovedFromStack; import forge.game.event.GameEventSpellResolved; import forge.game.event.GameEventTurnBegan; import forge.game.event.GameEventTurnPhase; import forge.game.event.IGameEventVisitor; +import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.gui.GuiDialog; @@ -46,8 +49,9 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { if ( phaseUpdPlanned.getAndSet(true) ) return null; FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { - Player p = fc.getObservedGame().getPhaseHandler().getPlayerTurn(); - PhaseType ph = fc.getObservedGame().getPhaseHandler().getPhase(); + PhaseHandler pH = fc.getObservedGame().getPhaseHandler(); + Player p = pH.getPlayerTurn(); + PhaseType ph = pH.getPhase(); phaseUpdPlanned.set(false); @@ -57,10 +61,25 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { matchUi.resetAllPhaseButtons(); if (lbl != null) lbl.setActive(true); } }); - - return null; } + + /* (non-Javadoc) + * @see forge.game.event.IGameEventVisitor.Base#visit(forge.game.event.GameEventPlayerPriority) + */ + + + private final AtomicBoolean combatUpdPlanned = new AtomicBoolean(false); + @Override + public Void visit(GameEventPlayerPriority event) { + if ( combatUpdPlanned.getAndSet(true) ) return null; + FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { + combatUpdPlanned.set(false); + CMatchUI.SINGLETON_INSTANCE.showCombat(); + } }); + return null; + } + private final AtomicBoolean turnUpdPlanned = new AtomicBoolean(false); @Override diff --git a/src/main/java/forge/game/phase/Combat.java b/src/main/java/forge/game/phase/Combat.java index af69ef7eb4e..0c69060ba9f 100644 --- a/src/main/java/forge/game/phase/Combat.java +++ b/src/main/java/forge/game/phase/Combat.java @@ -112,6 +112,10 @@ public class Combat { this.defenderMap.clear(); fillDefenderMaps(defender); } + + public final boolean isCombat() { + return !attackerMap.isEmpty(); + } private void fillDefenderMaps(final Player defender) { this.defenders.add(defender); diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index 20cbf5383b1..69bf6d48a23 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -34,7 +34,6 @@ 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; @@ -51,9 +50,6 @@ import forge.game.player.Player; import forge.game.player.PlayerController.ManaPaymentPurpose; import forge.game.zone.ZoneType; import forge.gui.GuiDialog; -import forge.gui.framework.EDocID; -import forge.gui.framework.SDisplayUtil; -import forge.gui.match.controllers.CCombat; /** @@ -423,10 +419,7 @@ public class CombatUtil { public static void orderMultipleCombatants(final Combat combat) { CombatUtil.orderMultipleBlockers(combat); - CombatUtil.showCombat(); - CombatUtil.orderBlockingMultipleAttackers(combat); - CombatUtil.showCombat(); } private static void orderMultipleBlockers(final Combat combat) { @@ -955,20 +948,6 @@ public class CombatUtil { return true; } // canAttack() - - /** - *

- * showCombat. - *

- */ - public static void showCombat() { - FThreads.invokeInEdtNowOrLater( new Runnable() { @Override public void run() { - SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc()); - CCombat.SINGLETON_INSTANCE.update(); - } }); - } // showBlockers() - - /** *

* checkPropagandaEffects. diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 1a4fafceb18..0c43b9e4e01 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -397,10 +397,6 @@ public class PhaseHandler implements java.io.Serializable { default: break; } - - if (inCombat()) { - CombatUtil.showCombat(); - } } // Handle effects that happen at the beginning of phases @@ -498,10 +494,6 @@ public class PhaseHandler implements java.io.Serializable { if (exaltedMagnitude > 0) { CombatUtil.executeExaltedAbility(game, attacker, exaltedMagnitude, card); } - - // if ("Sovereigns of Lost Alara".equals(card.getName())) { - // CombatUtil.souverignsOfAlara2ndAbility(game, attacker); - // } } } diff --git a/src/main/java/forge/gui/input/InputAttack.java b/src/main/java/forge/gui/input/InputAttack.java index 8bb39dabb5b..46d6c45ccf7 100644 --- a/src/main/java/forge/gui/input/InputAttack.java +++ b/src/main/java/forge/gui/input/InputAttack.java @@ -30,6 +30,7 @@ import forge.game.phase.Combat; import forge.game.phase.CombatUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.gui.match.CMatchUI; import forge.util.MyObservable; import forge.view.ButtonUtil; @@ -90,7 +91,7 @@ public class InputAttack extends InputSyncronizedBase { private void showCombat() { playerAttacks.getZone(ZoneType.Battlefield).updateObservers(); // redraw sword icons - CombatUtil.showCombat(); + CMatchUI.SINGLETON_INSTANCE.showCombat(); } /** {@inheritDoc} */ diff --git a/src/main/java/forge/gui/input/InputBlock.java b/src/main/java/forge/gui/input/InputBlock.java index abb5879382b..726bfafeb8c 100644 --- a/src/main/java/forge/gui/input/InputBlock.java +++ b/src/main/java/forge/gui/input/InputBlock.java @@ -26,6 +26,7 @@ import forge.game.phase.Combat; import forge.game.phase.CombatUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.gui.match.CMatchUI; import forge.view.ButtonUtil; /** @@ -83,7 +84,7 @@ public class InputBlock extends InputSyncronizedBase { showMessage(sb.toString()); } - CombatUtil.showCombat(); + CMatchUI.SINGLETON_INSTANCE.showCombat(); } /** {@inheritDoc} */ @@ -109,7 +110,7 @@ public class InputBlock extends InputSyncronizedBase { combat.removeFromCombat(card); } removeFromAllBlocking(card); - CombatUtil.showCombat(); + CMatchUI.SINGLETON_INSTANCE.showCombat(); return; } diff --git a/src/main/java/forge/gui/match/CMatchUI.java b/src/main/java/forge/gui/match/CMatchUI.java index 6133a41bf48..9fbe900ee31 100644 --- a/src/main/java/forge/gui/match/CMatchUI.java +++ b/src/main/java/forge/gui/match/CMatchUI.java @@ -37,6 +37,8 @@ import forge.game.player.Player; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.framework.EDocID; +import forge.gui.framework.SDisplayUtil; +import forge.gui.match.controllers.CCombat; import forge.gui.match.controllers.CDetail; import forge.gui.match.controllers.CMessage; import forge.gui.match.controllers.CPicture; @@ -256,4 +258,13 @@ public enum CMatchUI { private int getPlayerIndex(Player player) { return sortedPlayers.indexOf(player); } + + + public void showCombat() { + if ( CCombat.SINGLETON_INSTANCE.hasCombatToShow() ) { + SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc()); + } + CCombat.SINGLETON_INSTANCE.update(); + } // showBlockers() + } diff --git a/src/main/java/forge/gui/match/controllers/CCombat.java b/src/main/java/forge/gui/match/controllers/CCombat.java index 37d0e71fad9..5bc0879ee07 100644 --- a/src/main/java/forge/gui/match/controllers/CCombat.java +++ b/src/main/java/forge/gui/match/controllers/CCombat.java @@ -7,6 +7,8 @@ import forge.Command; import forge.GameEntity; import forge.game.Game; import forge.game.phase.Combat; +import forge.game.phase.PhaseHandler; +import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.gui.framework.ICDoc; import forge.gui.match.views.VCombat; @@ -39,15 +41,22 @@ public enum CCombat implements ICDoc { public void initialize() { } + public final boolean hasCombatToShow() { + PhaseHandler pH = game.getPhaseHandler(); + PhaseType ph = pH.getPhase(); + + return game.getCombat().isCombat() && ph.isAfter(PhaseType.COMBAT_BEGIN) && ph.isBefore(PhaseType.END_OF_TURN); + } + /* (non-Javadoc) * @see forge.gui.framework.ICDoc#update() */ @Override public void update() { - if (!game.getPhaseHandler().inCombat()) - VCombat.SINGLETON_INSTANCE.updateCombat(0, ""); - else + if (hasCombatToShow()) // display combat VCombat.SINGLETON_INSTANCE.updateCombat(game.getCombat().getAttackers().size(), getCombatDescription(game.getCombat())); + else + VCombat.SINGLETON_INSTANCE.updateCombat(0, ""); } public void setModel(Game game)