mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 02:38:02 +00:00
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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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} */
|
||||||
|
|||||||
@@ -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.");
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user