From b3482d901db37f68d2dfd918340be65e574bce41 Mon Sep 17 00:00:00 2001
From: Maxmtg
Date: Wed, 29 May 2013 10:33:58 +0000
Subject: [PATCH] CombatUtil.showCombat no longer needs parameter, its body is
invoked only from EDT. InputBlock.java accepts now Combat as 2nd paramter
Main phases were given better UI names
---
src/main/java/forge/GameLogFormatter.java | 2 +-
.../java/forge/control/input/InputAttack.java | 2 +-
.../java/forge/control/input/InputBase.java | 2 +-
.../java/forge/control/input/InputBlock.java | 29 ++++++-------
src/main/java/forge/game/ai/AiController.java | 41 +++++++++----------
.../java/forge/game/phase/CombatUtil.java | 29 +++++--------
.../java/forge/game/phase/PhaseHandler.java | 6 +--
src/main/java/forge/game/phase/PhaseType.java | 14 +++----
src/main/java/forge/game/phase/PhaseUtil.java | 7 +++-
.../game/player/PlayerControllerHuman.java | 2 +-
10 files changed, 63 insertions(+), 71 deletions(-)
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;