diff --git a/src/main/java/forge/control/input/InputAttack.java b/src/main/java/forge/control/input/InputAttack.java index 6739943aef9..4d23e46dcb2 100644 --- a/src/main/java/forge/control/input/InputAttack.java +++ b/src/main/java/forge/control/input/InputAttack.java @@ -88,13 +88,16 @@ public class InputAttack extends InputBase { } } + private void showCombat() { + player.getZone(ZoneType.Battlefield).updateObservers(); // redraw sword icons + game.getPhaseHandler().setCombat(!game.getCombat().getAttackers().isEmpty()); + CombatUtil.showCombat(game); + } + /** {@inheritDoc} */ @Override public final void selectButtonOK() { - if (!game.getCombat().getAttackers().isEmpty()) { - game.getPhaseHandler().setCombat(); - } - + // Propaganda costs could have been paid here. setCurrentDefender(null); // remove highlights game.getPhaseHandler().setPlayersPriorityPermission(false); Singletons.getModel().getMatch().getInput().updateObservers(); @@ -114,8 +117,7 @@ public class InputAttack extends InputBase { final List att = game.getCombat().getAttackers(); if (isMetaDown && att.contains(card) && !card.hasKeyword("CARDNAME attacks each turn if able.")) { game.getCombat().removeFromCombat(card); - player.getZone(ZoneType.Battlefield).updateObservers(); - CombatUtil.showCombat(game); + showCombat(); return; } @@ -132,21 +134,11 @@ public class InputAttack extends InputBase { Zone zone = game.getZoneOf(card); if (zone.is(ZoneType.Battlefield, player) && CombatUtil.canAttack(card, currentDefender, game.getCombat())) { - - // TODO add the propaganda code here and remove it in - // Phase.nextPhase() - // if (!CombatUtil.checkPropagandaEffects(card)) - // return; - if( game.getCombat().isAttacking(card)) { game.getCombat().removeFromCombat(card); } game.getCombat().addAttacker(card, currentDefender); - - // just to make sure the attack symbol is marked - player.getZone(ZoneType.Battlefield).updateObservers(); - CombatUtil.showCombat(game); - ButtonUtil.enableOnlyOk(); + showCombat(); } else { SDisplayUtil.remind(VMessage.SINGLETON_INSTANCE); diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java index 30f70781f03..6d79506c730 100644 --- a/src/main/java/forge/game/MatchController.java +++ b/src/main/java/forge/game/MatchController.java @@ -30,6 +30,7 @@ import forge.gui.framework.SDisplayUtil; import forge.gui.match.CMatchUI; import forge.gui.match.VMatchUI; import forge.gui.match.ViewWinLose; +import forge.gui.match.controllers.CCombat; import forge.gui.match.controllers.CDock; import forge.gui.match.controllers.CLog; import forge.gui.match.controllers.CMessage; @@ -166,6 +167,12 @@ public class MatchController { FControl.SINGLETON_INSTANCE.setPlayer(localHuman); CMatchUI.SINGLETON_INSTANCE.initMatch(currentGame.getRegisteredPlayers(), localHuman); CDock.SINGLETON_INSTANCE.onGameStarts(currentGame, localHuman); + + CLog.SINGLETON_INSTANCE.init(currentGame.getGameLog()); + currentGame.getGameLog().addObserver(CLog.SINGLETON_INSTANCE); + + CCombat.SINGLETON_INSTANCE.setModel(currentGame); + Singletons.getModel().getPreferences().actuateMatchPreferences(); Singletons.getControl().changeState(FControl.Screens.MATCH_SCREEN); SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc()); @@ -174,10 +181,11 @@ public class MatchController { inputControl.setMatch(this); input.addObserver(inputControl); currentGame.getStack().addObserver(inputControl); + currentGame.getStack().addObserver(CStack.SINGLETON_INSTANCE); currentGame.getPhaseHandler().addObserver(inputControl); - currentGame.getGameLog().addObserver(CLog.SINGLETON_INSTANCE); - currentGame.getStack().addObserver(CStack.SINGLETON_INSTANCE); + + // some observers are set in CMatchUI.initMatch final boolean canRandomFoil = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL) && gameType == GameType.Constructed; diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java index ab8c57c35ee..152024674af 100644 --- a/src/main/java/forge/game/ai/AiController.java +++ b/src/main/java/forge/game/ai/AiController.java @@ -834,9 +834,8 @@ public class AiController { game.setCombat(new AiAttackController(player, player.getOpponent()).getAttackers()); final List att = game.getCombat().getAttackers(); - if (!att.isEmpty()) { - game.getPhaseHandler().setCombat(); - } + game.getPhaseHandler().setCombat(!att.isEmpty()); + for (final Card element : att) { // tapping of attackers happens after Propaganda is paid for diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index bf07f9b2d0b..e061432856b 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -58,7 +58,7 @@ import forge.gui.GuiChoose; import forge.gui.GuiDialog; import forge.gui.framework.EDocID; import forge.gui.framework.SDisplayUtil; -import forge.gui.match.views.VCombat; +import forge.gui.match.controllers.CCombat; /** @@ -1041,46 +1041,6 @@ public class CombatUtil { return sb.toString(); } - private static String getCombatDescription(Combat combat) { - final StringBuilder display = new StringBuilder(); - - // Loop through Defenders - // Append Defending Player/Planeswalker - final List defenders = combat.getDefenders(); - final List> attackers = combat.sortAttackerByDefender(); - - // Not a big fan of the triple nested loop here - for (int def = 0; def < defenders.size(); def++) { - List atk = attackers.get(def); - if ((atk == null) || (atk.size() == 0)) { - continue; - } - - if (def > 0) { - display.append("\n"); - } - - display.append("Defender - "); - display.append(defenders.get(def).toString()); - display.append("\n"); - - for (final Card c : atk) { - // loop through attackers - display.append("-> "); - display.append(CombatUtil.combatantToString(c)).append("\n"); - - List blockers = combat.getBlockers(c); - - // loop through blockers - for (final Card element : blockers) { - display.append(" [ "); - display.append(CombatUtil.combatantToString(element)).append("\n"); - } - } // loop through attackers - } - return display.toString().trim(); - } - /** *

@@ -1088,35 +1048,12 @@ public class CombatUtil { *

*/ public static void showCombat(GameState game) { - // TODO(sol) ShowCombat seems to be resetting itself when switching away and switching back? - String text = ""; if (game.getPhaseHandler().inCombat()) { - text = getCombatDescription(game.getCombat()); SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc()); } - VCombat.SINGLETON_INSTANCE.updateCombat(game.getCombat().getAttackers().size(), text); + CCombat.SINGLETON_INSTANCE.update(); } // showBlockers() - /** - *

- * combatantToString. - *

- * - * @param c - * a {@link forge.Card} object. - * @return a {@link java.lang.String} object. - */ - private static String combatantToString(final Card c) { - final StringBuilder sb = new StringBuilder(); - - final String name = (c.isFaceDown()) ? "Morph" : c.getName(); - - sb.append(name); - sb.append(" (").append(c.getUniqueNumber()).append(") "); - sb.append(c.getNetAttack()).append("/").append(c.getNetDefense()); - - return sb.toString(); - } /** *

diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 67be9fb68b3..6a4320bd52e 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -215,8 +215,8 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { * @param b * a boolean. */ - public final void setCombat() { - this.bCombat.set(true); + public final void setCombat(boolean value) { + this.bCombat.set(value); } /** diff --git a/src/main/java/forge/gui/match/controllers/CCombat.java b/src/main/java/forge/gui/match/controllers/CCombat.java index e46fd6cd59f..21b3e4c24f3 100644 --- a/src/main/java/forge/gui/match/controllers/CCombat.java +++ b/src/main/java/forge/gui/match/controllers/CCombat.java @@ -1,6 +1,12 @@ package forge.gui.match.controllers; +import java.util.List; + +import forge.Card; import forge.Command; +import forge.GameEntity; +import forge.game.GameState; +import forge.game.phase.Combat; import forge.gui.framework.ICDoc; import forge.gui.match.views.VCombat; @@ -13,6 +19,8 @@ import forge.gui.match.views.VCombat; public enum CCombat implements ICDoc { /** */ SINGLETON_INSTANCE; + + private GameState game; /* (non-Javadoc) * @see forge.gui.framework.ICDoc#getCommandOnSelect() @@ -34,6 +42,76 @@ public enum CCombat implements ICDoc { */ @Override public void update() { - VCombat.SINGLETON_INSTANCE.updateCombat(0, ""); + if (!game.getPhaseHandler().inCombat()) + VCombat.SINGLETON_INSTANCE.updateCombat(0, ""); + else + VCombat.SINGLETON_INSTANCE.updateCombat(game.getCombat().getAttackers().size(), getCombatDescription(game.getCombat())); + } + + public void setModel(GameState game) + { + this.game = game; + + } + + private static String getCombatDescription(Combat combat) { + final StringBuilder display = new StringBuilder(); + + // Loop through Defenders + // Append Defending Player/Planeswalker + final List defenders = combat.getDefenders(); + final List> attackers = combat.sortAttackerByDefender(); + + // Not a big fan of the triple nested loop here + for (int def = 0; def < defenders.size(); def++) { + List atk = attackers.get(def); + if ((atk == null) || (atk.size() == 0)) { + continue; + } + + if (def > 0) { + display.append("\n"); + } + + display.append("Defender - "); + display.append(defenders.get(def).toString()); + display.append("\n"); + + for (final Card c : atk) { + // loop through attackers + display.append("-> "); + display.append(combatantToString(c)).append("\n"); + + List blockers = combat.getBlockers(c); + + // loop through blockers + for (final Card element : blockers) { + display.append(" [ "); + display.append(combatantToString(element)).append("\n"); + } + } // loop through attackers + } + return display.toString().trim(); + } + + /** + *

+ * combatantToString. + *

+ * + * @param c + * a {@link forge.Card} object. + * @return a {@link java.lang.String} object. + */ + private static String combatantToString(final Card c) { + final StringBuilder sb = new StringBuilder(); + + final String name = (c.isFaceDown()) ? "Morph" : c.getName(); + + sb.append(name); + sb.append(" (").append(c.getUniqueNumber()).append(") "); + sb.append(c.getNetAttack()).append("/").append(c.getNetDefense()); + + return sb.toString(); } } diff --git a/src/main/java/forge/gui/match/controllers/CLog.java b/src/main/java/forge/gui/match/controllers/CLog.java index 347bb426d91..153ccae5137 100644 --- a/src/main/java/forge/gui/match/controllers/CLog.java +++ b/src/main/java/forge/gui/match/controllers/CLog.java @@ -19,6 +19,7 @@ public enum CLog implements ICDoc, Observer { /** */ SINGLETON_INSTANCE; + private GameLog model; /* (non-Javadoc) * @see forge.gui.framework.ICDoc#getCommandOnSelect() */ @@ -35,24 +36,35 @@ public enum CLog implements ICDoc, Observer { } + private final Runnable r = new Runnable() { + @Override + public void run() { + VLog.SINGLETON_INSTANCE.updateConsole(model); + } + }; - @Override - public void update() {} + /** + * TODO: Write javadoc for this method. + * @param gameLog + */ + public void init(GameLog gameLog) { + model = gameLog; + } /* (non-Javadoc) * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ @Override - 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); - } - }); - } + public void update(Observable o, Object arg) { + update(); + } + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#update() + */ + @Override + public void update() { + FThreads.invokeInEdtNowOrLater(r); } } diff --git a/src/main/java/forge/gui/match/views/VCombat.java b/src/main/java/forge/gui/match/views/VCombat.java index 1a264831425..f54116e8e96 100644 --- a/src/main/java/forge/gui/match/views/VCombat.java +++ b/src/main/java/forge/gui/match/views/VCombat.java @@ -110,7 +110,7 @@ public enum VCombat implements IVDoc { // No need to update this unless it's showing if (!this.equals(parentCell.getSelected())) { return; } - tab.setText("Combat : " + cntAttackers); + tab.setText(cntAttackers > 0 ? ("Combat : " + cntAttackers) : "Combat"); tar.setText(desc); } }