Better UI updates - CCombat

This commit is contained in:
Maxmtg
2013-06-04 13:51:21 +00:00
parent ab55af70bd
commit be41dd7fff
8 changed files with 55 additions and 39 deletions

View File

@@ -10,15 +10,18 @@ import forge.Card;
import forge.FThreads; import forge.FThreads;
import forge.game.event.GameEvent; import forge.game.event.GameEvent;
import forge.game.event.GameEventAnteCardsSelected; import forge.game.event.GameEventAnteCardsSelected;
import forge.game.event.GameEventAttackersDeclared;
import forge.game.event.GameEventGameFinished; import forge.game.event.GameEventGameFinished;
import forge.game.event.GameEventGameOutcome; import forge.game.event.GameEventGameOutcome;
import forge.game.event.GameEventPlayerControl; import forge.game.event.GameEventPlayerControl;
import forge.game.event.GameEventPlayerPriority;
import forge.game.event.GameEventSpellAbilityCast; import forge.game.event.GameEventSpellAbilityCast;
import forge.game.event.GameEventSpellRemovedFromStack; import forge.game.event.GameEventSpellRemovedFromStack;
import forge.game.event.GameEventSpellResolved; import forge.game.event.GameEventSpellResolved;
import forge.game.event.GameEventTurnBegan; import forge.game.event.GameEventTurnBegan;
import forge.game.event.GameEventTurnPhase; import forge.game.event.GameEventTurnPhase;
import forge.game.event.IGameEventVisitor; import forge.game.event.IGameEventVisitor;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
@@ -46,8 +49,9 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
if ( phaseUpdPlanned.getAndSet(true) ) return null; if ( phaseUpdPlanned.getAndSet(true) ) return null;
FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() {
Player p = fc.getObservedGame().getPhaseHandler().getPlayerTurn(); PhaseHandler pH = fc.getObservedGame().getPhaseHandler();
PhaseType ph = fc.getObservedGame().getPhaseHandler().getPhase(); Player p = pH.getPlayerTurn();
PhaseType ph = pH.getPhase();
phaseUpdPlanned.set(false); phaseUpdPlanned.set(false);
@@ -57,10 +61,25 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
matchUi.resetAllPhaseButtons(); matchUi.resetAllPhaseButtons();
if (lbl != null) lbl.setActive(true); if (lbl != null) lbl.setActive(true);
} }); } });
return null; 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); private final AtomicBoolean turnUpdPlanned = new AtomicBoolean(false);
@Override @Override

View File

@@ -112,6 +112,10 @@ public class Combat {
this.defenderMap.clear(); this.defenderMap.clear();
fillDefenderMaps(defender); fillDefenderMaps(defender);
} }
public final boolean isCombat() {
return !attackerMap.isEmpty();
}
private void fillDefenderMaps(final Player defender) { private void fillDefenderMaps(final Player defender) {
this.defenders.add(defender); this.defenders.add(defender);

View File

@@ -34,7 +34,6 @@ import forge.CardLists;
import forge.CardPredicates; import forge.CardPredicates;
import forge.Command; import forge.Command;
import forge.Constant; import forge.Constant;
import forge.FThreads;
import forge.GameEntity; import forge.GameEntity;
import forge.card.CardType; import forge.card.CardType;
import forge.card.MagicColor; import forge.card.MagicColor;
@@ -51,9 +50,6 @@ import forge.game.player.Player;
import forge.game.player.PlayerController.ManaPaymentPurpose; import forge.game.player.PlayerController.ManaPaymentPurpose;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiDialog; 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) { public static void orderMultipleCombatants(final Combat combat) {
CombatUtil.orderMultipleBlockers(combat); CombatUtil.orderMultipleBlockers(combat);
CombatUtil.showCombat();
CombatUtil.orderBlockingMultipleAttackers(combat); CombatUtil.orderBlockingMultipleAttackers(combat);
CombatUtil.showCombat();
} }
private static void orderMultipleBlockers(final Combat combat) { private static void orderMultipleBlockers(final Combat combat) {
@@ -955,20 +948,6 @@ public class CombatUtil {
return true; return true;
} // canAttack() } // canAttack()
/**
* <p>
* showCombat.
* </p>
*/
public static void showCombat() {
FThreads.invokeInEdtNowOrLater( new Runnable() { @Override public void run() {
SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc());
CCombat.SINGLETON_INSTANCE.update();
} });
} // showBlockers()
/** /**
* <p> * <p>
* checkPropagandaEffects. * checkPropagandaEffects.

View File

@@ -397,10 +397,6 @@ public class PhaseHandler implements java.io.Serializable {
default: default:
break; break;
} }
if (inCombat()) {
CombatUtil.showCombat();
}
} }
// Handle effects that happen at the beginning of phases // Handle effects that happen at the beginning of phases
@@ -498,10 +494,6 @@ public class PhaseHandler implements java.io.Serializable {
if (exaltedMagnitude > 0) { if (exaltedMagnitude > 0) {
CombatUtil.executeExaltedAbility(game, attacker, exaltedMagnitude, card); CombatUtil.executeExaltedAbility(game, attacker, exaltedMagnitude, card);
} }
// if ("Sovereigns of Lost Alara".equals(card.getName())) {
// CombatUtil.souverignsOfAlara2ndAbility(game, attacker);
// }
} }
} }

View File

@@ -30,6 +30,7 @@ import forge.game.phase.Combat;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.match.CMatchUI;
import forge.util.MyObservable; import forge.util.MyObservable;
import forge.view.ButtonUtil; import forge.view.ButtonUtil;
@@ -90,7 +91,7 @@ public class InputAttack extends InputSyncronizedBase {
private void showCombat() { private void showCombat() {
playerAttacks.getZone(ZoneType.Battlefield).updateObservers(); // redraw sword icons playerAttacks.getZone(ZoneType.Battlefield).updateObservers(); // redraw sword icons
CombatUtil.showCombat(); CMatchUI.SINGLETON_INSTANCE.showCombat();
} }
/** {@inheritDoc} */ /** {@inheritDoc} */

View File

@@ -26,6 +26,7 @@ import forge.game.phase.Combat;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.match.CMatchUI;
import forge.view.ButtonUtil; import forge.view.ButtonUtil;
/** /**
@@ -83,7 +84,7 @@ public class InputBlock extends InputSyncronizedBase {
showMessage(sb.toString()); showMessage(sb.toString());
} }
CombatUtil.showCombat(); CMatchUI.SINGLETON_INSTANCE.showCombat();
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@@ -109,7 +110,7 @@ public class InputBlock extends InputSyncronizedBase {
combat.removeFromCombat(card); combat.removeFromCombat(card);
} }
removeFromAllBlocking(card); removeFromAllBlocking(card);
CombatUtil.showCombat(); CMatchUI.SINGLETON_INSTANCE.showCombat();
return; return;
} }

View File

@@ -37,6 +37,8 @@ import forge.game.player.Player;
import forge.game.zone.PlayerZone; import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.framework.EDocID; 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.CDetail;
import forge.gui.match.controllers.CMessage; import forge.gui.match.controllers.CMessage;
import forge.gui.match.controllers.CPicture; import forge.gui.match.controllers.CPicture;
@@ -256,4 +258,13 @@ public enum CMatchUI {
private int getPlayerIndex(Player player) { private int getPlayerIndex(Player player) {
return sortedPlayers.indexOf(player); return sortedPlayers.indexOf(player);
} }
public void showCombat() {
if ( CCombat.SINGLETON_INSTANCE.hasCombatToShow() ) {
SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc());
}
CCombat.SINGLETON_INSTANCE.update();
} // showBlockers()
} }

View File

@@ -7,6 +7,8 @@ import forge.Command;
import forge.GameEntity; import forge.GameEntity;
import forge.game.Game; import forge.game.Game;
import forge.game.phase.Combat; import forge.game.phase.Combat;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.gui.match.views.VCombat; import forge.gui.match.views.VCombat;
@@ -39,15 +41,22 @@ public enum CCombat implements ICDoc {
public void initialize() { 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) /* (non-Javadoc)
* @see forge.gui.framework.ICDoc#update() * @see forge.gui.framework.ICDoc#update()
*/ */
@Override @Override
public void update() { public void update() {
if (!game.getPhaseHandler().inCombat()) if (hasCombatToShow()) // display combat
VCombat.SINGLETON_INSTANCE.updateCombat(0, "");
else
VCombat.SINGLETON_INSTANCE.updateCombat(game.getCombat().getAttackers().size(), getCombatDescription(game.getCombat())); VCombat.SINGLETON_INSTANCE.updateCombat(game.getCombat().getAttackers().size(), getCombatDescription(game.getCombat()));
else
VCombat.SINGLETON_INSTANCE.updateCombat(0, "");
} }
public void setModel(Game game) public void setModel(Game game)