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 ) {
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;
}

View File

@@ -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} */

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("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.");

View File

@@ -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<Card, List<Card>> allBlocking = new HashMap<Card, List<Card>>();
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<Card>());
@@ -127,9 +124,9 @@ public class InputBlock extends InputSyncronizedBase {
List<Card> 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;
}
}

View File

@@ -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<Card> 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<Card> 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;
}
}

View File

@@ -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.
* </p>
*/
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;
}
/**

View File

@@ -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<String, Object> runParams = new HashMap<String, Object>();
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());
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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;