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
This commit is contained in:
Maxmtg
2013-05-29 10:33:58 +00:00
parent c9450c16f7
commit b3482d901d
10 changed files with 63 additions and 71 deletions

View File

@@ -37,7 +37,7 @@ public class GameLogFormatter {
} else if ( ev instanceof PhaseEvent ) { } else if ( ev instanceof PhaseEvent ) {
Player p = ((PhaseEvent) ev).playerTurn; Player p = ((PhaseEvent) ev).playerTurn;
PhaseType ph = ((PhaseEvent) ev).phase; 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; return null;
} }

View File

@@ -88,7 +88,7 @@ public class InputAttack extends InputSyncronizedBase {
private void showCombat() { private void showCombat() {
player.getZone(ZoneType.Battlefield).updateObservers(); // redraw sword icons player.getZone(ZoneType.Battlefield).updateObservers(); // redraw sword icons
CombatUtil.showCombat(game); CombatUtil.showCombat();
} }
/** {@inheritDoc} */ /** {@inheritDoc} */

View File

@@ -90,7 +90,7 @@ public abstract class InputBase implements java.io.Serializable, Input {
sb.append("Priority: ").append(player).append("\n").append("\n"); sb.append("Priority: ").append(player).append("\n").append("\n");
sb.append("Turn : ").append(ph.getPlayerTurn()).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: "); sb.append("Stack: ");
if (!player.getGame().getStack().isEmpty()) { if (!player.getGame().getStack().isEmpty()) {
sb.append(player.getGame().getStack().size()).append(" to Resolve."); sb.append(player.getGame().getStack().size()).append(" to Resolve.");

View File

@@ -22,10 +22,9 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import forge.Card; import forge.Card;
import forge.game.GameState; 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.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.view.ButtonUtil; import forge.view.ButtonUtil;
@@ -43,16 +42,16 @@ public class InputBlock extends InputSyncronizedBase {
private Card currentAttacker = null; private Card currentAttacker = null;
private final HashMap<Card, List<Card>> allBlocking = new HashMap<Card, List<Card>>(); private final HashMap<Card, List<Card>> allBlocking = new HashMap<Card, List<Card>>();
private final GameState game; private final Combat combat;
private final Player player; private final Player player;
/** /**
* TODO: Write javadoc for Constructor. * TODO: Write javadoc for Constructor.
* @param priority * @param priority
*/ */
public InputBlock(Player human, GameState game) { public InputBlock(Player human, Combat combat) {
player = human; player = human;
this.game = game; this.combat = combat;
} }
private final void removeFromAllBlocking(final Card c) { private final void removeFromAllBlocking(final Card c) {
@@ -79,16 +78,16 @@ public class InputBlock extends InputSyncronizedBase {
showMessage(sb.toString()); showMessage(sb.toString());
} }
CombatUtil.showCombat(game); CombatUtil.showCombat();
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void onOk() { public final void onOk() {
if (CombatUtil.finishedMandatoryBlocks(game.getCombat(), player)) { if (CombatUtil.finishedMandatoryBlocks(combat, player)) {
// Done blocking // Done blocking
ButtonUtil.reset(); ButtonUtil.reset();
CombatUtil.orderMultipleCombatants(game); CombatUtil.orderMultipleCombatants(combat);
currentAttacker = null; currentAttacker = null;
allBlocking.clear(); allBlocking.clear();
@@ -102,24 +101,22 @@ public class InputBlock extends InputSyncronizedBase {
if (isMetaDown) { if (isMetaDown) {
if (card.getController() == player ) { if (card.getController() == player ) {
game.getCombat().removeFromCombat(card); combat.removeFromCombat(card);
} }
removeFromAllBlocking(card); removeFromAllBlocking(card);
CombatUtil.showCombat(game); CombatUtil.showCombat();
return; return;
} }
// is attacking? // is attacking?
boolean reminder = true; boolean reminder = true;
if (game.getCombat().getAttackers().contains(card)) { if (combat.getAttackers().contains(card)) {
this.currentAttacker = card; this.currentAttacker = card;
reminder = false; reminder = false;
} else { } else {
Zone zone = game.getZoneOf(card);
// Make sure this card is valid to even be a blocker // Make sure this card is valid to even be a blocker
if (this.currentAttacker != null && card.isCreature() && card.getController().equals(player) if (this.currentAttacker != null && card.isCreature() && player.getZone(ZoneType.Battlefield).contains(card)) {
&& zone.is(ZoneType.Battlefield, player)) {
// Create a new blockedBy list if it doesn't exist // Create a new blockedBy list if it doesn't exist
if (!this.allBlocking.containsKey(card)) { if (!this.allBlocking.containsKey(card)) {
this.allBlocking.put(card, new ArrayList<Card>()); this.allBlocking.put(card, new ArrayList<Card>());
@@ -127,9 +124,9 @@ public class InputBlock extends InputSyncronizedBase {
List<Card> attackersBlocked = this.allBlocking.get(card); List<Card> attackersBlocked = this.allBlocking.get(card);
if (!attackersBlocked.contains(this.currentAttacker) if (!attackersBlocked.contains(this.currentAttacker)
&& CombatUtil.canBlock(this.currentAttacker, card, game.getCombat())) { && CombatUtil.canBlock(this.currentAttacker, card, combat)) {
attackersBlocked.add(this.currentAttacker); attackersBlocked.add(this.currentAttacker);
game.getCombat().addBlocker(this.currentAttacker, card); combat.addBlocker(this.currentAttacker, card);
reminder = false; reminder = false;
} }
} }

View File

@@ -796,30 +796,27 @@ public class AiController {
public void onPriorityRecieved() { public void onPriorityRecieved() {
final PhaseType phase = game.getPhaseHandler().getPhase(); final PhaseType phase = game.getPhaseHandler().getPhase();
switch(phase) {
if (!game.getStack().isEmpty()) { case COMBAT_DECLARE_ATTACKERS:
playSpellAbilities(game); declareAttackers();
} else { break;
switch(phase) {
case COMBAT_DECLARE_ATTACKERS: case COMBAT_DECLARE_BLOCKERS:
declareAttackers(); final List<Card> blockers = player.getCreaturesInPlay();
break; game.setCombat(ComputerUtilBlock.getBlockers(player, game.getCombat(), blockers));
CombatUtil.orderMultipleCombatants(game.getCombat());
case COMBAT_DECLARE_BLOCKERS: break;
final List<Card> blockers = player.getCreaturesInPlay();
game.setCombat(ComputerUtilBlock.getBlockers(player, game.getCombat(), blockers));
CombatUtil.orderMultipleCombatants(game);
break;
case MAIN1: case MAIN1:
case MAIN2: case MAIN2:
Log.debug("Computer " + phase.toString()); Log.debug("Computer " + phase.nameForUi);
if (game.getStack().isEmpty())
playLands(); playLands();
// fall through is intended // fall through is intended
default: default:
playSpellAbilities(game); playSpellAbilities(game);
break; break;
}
} }
} }

View File

@@ -34,6 +34,7 @@ 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;
@@ -426,14 +427,12 @@ public class CombatUtil {
return true; return true;
} }
public static void orderMultipleCombatants(final GameState game) { public static void orderMultipleCombatants(final Combat combat) {
final Combat combat = game.getCombat();
CombatUtil.orderMultipleBlockers(combat); CombatUtil.orderMultipleBlockers(combat);
CombatUtil.showCombat(game); CombatUtil.showCombat();
CombatUtil.orderBlockingMultipleAttackers(combat); CombatUtil.orderBlockingMultipleAttackers(combat);
CombatUtil.showCombat(game); CombatUtil.showCombat();
} }
private static void orderMultipleBlockers(final Combat combat) { private static void orderMultipleBlockers(final Combat combat) {
@@ -825,8 +824,7 @@ public class CombatUtil {
final GameState game = c.getGame(); final GameState game = c.getGame();
if (c.isTapped() || c.isPhasedOut() if (c.isTapped() || c.isPhasedOut()
|| (c.hasSickness() && !c.hasKeyword("CARDNAME can attack as though it had haste.")) || (c.hasSickness() && !c.hasKeyword("CARDNAME can attack as though it had haste."))
|| game.getPhaseHandler().getPhase() || game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
.isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
return false; return false;
} }
return true; return true;
@@ -969,11 +967,11 @@ public class CombatUtil {
* showCombat. * showCombat.
* </p> * </p>
*/ */
public static void showCombat(GameState game) { public static void showCombat() {
if (game.getPhaseHandler().inCombat()) { FThreads.invokeInEdtNowOrLater( new Runnable() { @Override public void run() {
SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc()); SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc());
} CCombat.SINGLETON_INSTANCE.update();
CCombat.SINGLETON_INSTANCE.update(); } });
} // showBlockers() } // showBlockers()
@@ -987,7 +985,7 @@ public class CombatUtil {
* @param bLast * @param bLast
* a boolean. * 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); Cost attackCost = new Cost(ManaCost.ZERO, true);
// Sort abilities to apply them in proper order // Sort abilities to apply them in proper order
for (Card card : game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { for (Card card : game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) {
@@ -1013,12 +1011,7 @@ public class CombatUtil {
} }
} }
} }
return hasPaid;
if ( hasPaid ) {
if (!c.hasKeyword("Vigilance")) { c.tap(); }
} else {
game.getCombat().removeFromCombat(c);
}
} }
/** /**

View File

@@ -355,7 +355,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
} }
if (inCombat()) { if (inCombat()) {
CombatUtil.showCombat(game); CombatUtil.showCombat();
} }
} }
@@ -365,7 +365,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
if (this.givePriorityToPlayer) { if (this.givePriorityToPlayer) {
// Run triggers if phase isn't being skipped // Run triggers if phase isn't being skipped
final HashMap<String, Object> runParams = new HashMap<String, Object>(); final HashMap<String, Object> runParams = new HashMap<String, Object>();
runParams.put("Phase", this.getPhase().NameForScripts); runParams.put("Phase", this.getPhase().nameForScripts);
runParams.put("Player", this.getPlayerTurn()); runParams.put("Player", this.getPlayerTurn());
game.getTriggerHandler().runTrigger(TriggerType.Phase, runParams, false); 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) { 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());
} }

View File

@@ -12,7 +12,7 @@ public enum PhaseType {
UNTAP("Untap"), UNTAP("Untap"),
UPKEEP("Upkeep"), UPKEEP("Upkeep"),
DRAW("Draw"), DRAW("Draw"),
MAIN1("Main1"), MAIN1("Main, precombat", "Main1"),
COMBAT_BEGIN("Begin Combat", "BeginCombat"), COMBAT_BEGIN("Begin Combat", "BeginCombat"),
COMBAT_DECLARE_ATTACKERS("Declare Attackers"), COMBAT_DECLARE_ATTACKERS("Declare Attackers"),
COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY("Declare Attackers - Play Instants and Abilities"), 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_FIRST_STRIKE_DAMAGE("First Strike Damage"),
COMBAT_DAMAGE("Combat Damage"), COMBAT_DAMAGE("Combat Damage"),
COMBAT_END("End Combat", "EndCombat"), COMBAT_END("End Combat", "EndCombat"),
MAIN2("Main2"), MAIN2("Main, postcombat", "Main2"),
END_OF_TURN("End of Turn"), END_OF_TURN("End of Turn"),
CLEANUP("Cleanup"); CLEANUP("Cleanup");
@@ -35,15 +35,15 @@ public enum PhaseType {
) )
); );
public final String NameForUi; public final String nameForUi;
public final String NameForScripts; public final String nameForScripts;
private PhaseType(String name) { private PhaseType(String name) {
this(name, name); this(name, name);
} }
private PhaseType(String name, String name_for_scripts) { private PhaseType(String name, String name_for_scripts) {
NameForUi = name; nameForUi = name;
NameForScripts = name_for_scripts; nameForScripts = name_for_scripts;
} }
@@ -68,7 +68,7 @@ public enum PhaseType {
} }
final String valToCompate = value.trim(); final String valToCompate = value.trim();
for (final PhaseType v : PhaseType.values()) { for (final PhaseType v : PhaseType.values()) {
if (v.NameForScripts.compareToIgnoreCase(valToCompate) == 0) { if (v.nameForScripts.compareToIgnoreCase(valToCompate) == 0) {
return v; return v;
} }
} }

View File

@@ -103,7 +103,12 @@ public class PhaseUtil {
for (final Card c : list) { 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); PhaseUtil.handleAttackingTriggers(game);
} }

View File

@@ -498,7 +498,7 @@ public class PlayerControllerHuman extends PlayerController {
return; return;
case COMBAT_DECLARE_BLOCKERS: case COMBAT_DECLARE_BLOCKERS:
InputSynchronized inpBlock = new InputBlock(player, game); InputSynchronized inpBlock = new InputBlock(player, game.getCombat());
Singletons.getControl().getInputQueue().setInputAndWait(inpBlock); Singletons.getControl().getInputQueue().setInputAndWait(inpBlock);
return; return;