Don't prompt to declare blockers if no creatures can block

This commit is contained in:
drdev
2013-11-30 22:01:04 +00:00
parent 2ffc18cc89
commit 9ca9dc797e
6 changed files with 87 additions and 72 deletions

View File

@@ -35,16 +35,13 @@ import forge.gui.input.InputSynchronized;
* @version $Id$
*/
public class InputQueue extends Observable {
private final BlockingDeque<InputSynchronized> inputStack = new LinkedBlockingDeque<InputSynchronized>();
private final InputLockUI inputLock;
public InputQueue() {
inputLock = new InputLockUI(this);
}
public final void updateObservers() {
this.setChanged();
this.notifyObservers();
@@ -96,7 +93,6 @@ public class InputQueue extends Observable {
this.updateObservers();
}
public void syncPoint() {
synchronized (inputLock) {
// acquire and release lock, so that actions from Game thread happen before EDT reads their results
@@ -113,5 +109,4 @@ public class InputQueue extends Observable {
break;
}
}
} // InputControl

View File

@@ -76,7 +76,6 @@ public class CombatUtil {
* @return a boolean.
*/
public static boolean canBlock(final Card blocker, final Combat combat) {
if (blocker == null) {
return false;
}
@@ -131,7 +130,6 @@ public class CombatUtil {
* @return a boolean.
*/
public static boolean canBlock(final Card blocker, final boolean nextTurn) {
if (blocker == null) {
return false;
}
@@ -176,7 +174,6 @@ public class CombatUtil {
* @return a boolean.
*/
public static boolean canBeBlocked(final Card attacker, final Combat combat, Player defendingPlayer) {
if (attacker == null) {
return true;
}
@@ -206,7 +203,6 @@ public class CombatUtil {
* @return a boolean.
*/
public static boolean canBeBlocked(final Card attacker, Player defender) {
if (attacker == null) {
return true;
}
@@ -366,7 +362,6 @@ public class CombatUtil {
* @return a boolean.
*/
public static String validateBlocks(final Combat combat, final Player defending) {
final List<Card> defendersArmy = defending.getCreaturesInPlay();
final List<Card> attackers = combat.getAttackers();
final List<Card> blockers = CardLists.filterControlledBy(combat.getAllBlockers(), defending);
@@ -494,6 +489,35 @@ public class CombatUtil {
return false;
}
// can a player block with one or more creatures at the moment?
/**
* <p>
* canAttack.
* </p>
*
* @param p
* a {@link forge.game.player} object.
* @param combat
* a {@link forge.game.combat.Combat} object.
* @return a boolean.
*/
public static boolean canBlock(Player p, Combat combat) {
List<Card> creatures = p.getCreaturesInPlay();
if (creatures.isEmpty()) { return false; }
List<Card> attackers = combat.getAttackers();
if (attackers.isEmpty()) { return false; }
for (Card c : creatures) {
for (Card a : attackers) {
if (CombatUtil.canBlock(a, c, combat)) {
return true;
}
}
}
return false;
}
// can the blocker block the attacker given the combat state?
/**
* <p>
@@ -509,7 +533,6 @@ public class CombatUtil {
* @return a boolean.
*/
public static boolean canBlock(final Card attacker, final Card blocker, final Combat combat) {
if (attacker == null || blocker == null) {
return false;
}
@@ -614,7 +637,6 @@ public class CombatUtil {
return false;
}
if (attacker.hasStartOfKeyword("CantBeBlockedBy ")) {
final int keywordPosition = attacker.getKeywordPosition("CantBeBlockedBy ");
final String parse = attacker.getKeyword().get(keywordPosition).toString();

View File

@@ -555,13 +555,16 @@ public class PhaseHandler implements java.io.Serializable {
if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.attackerChoosesBlockers)) {
whoDeclaresBlockers = combat.getAttackingPlayer();
}
if ( combat.isPlayerAttacked(p) ) {
if (combat.isPlayerAttacked(p)) {
if (CombatUtil.canBlock(p, combat)) {
whoDeclaresBlockers.getController().declareBlockers(p, combat);
} else
continue;
}
}
else { continue; }
if ( game.isGameOver() ) // they just like to close window at any moment
if (game.isGameOver()) { // they just like to close window at any moment
return;
}
// Handles removing cards like Mogg Flunkies from combat if group block
// didn't occur

View File

@@ -271,7 +271,6 @@ public class PlayerControllerHuman extends PlayerController {
options.add(Integer.valueOf(i));
options.add("Other amount");
Object chosen = GuiChoose.oneOrNone("Choose " + announce + " for " + ability.getSourceCard().getName(), options);
if (chosen instanceof Integer || chosen == null)
return (Integer)chosen;
@@ -290,7 +289,6 @@ public class PlayerControllerHuman extends PlayerController {
}
}
@Override
public List<Card> choosePermanentsToSacrifice(SpellAbility sa, int min, int max, List<Card> valid, String message) {
String outerMessage = "Select %d " + message + "(s) to sacrifice";

View File

@@ -58,7 +58,6 @@ public abstract class InputBase implements java.io.Serializable, Input {
@Override
public void selectAbility(SpellAbility ab) { }
@Override
public final void selectButtonCancel() {
if( isFinished() ) return;
@@ -86,7 +85,6 @@ public abstract class InputBase implements java.io.Serializable, Input {
CMatchUI.SINGLETON_INSTANCE.showMessage(message);
}
protected final void flashIncorrectAction() {
SDisplayUtil.remind(VPrompt.SINGLETON_INSTANCE);
}

View File

@@ -71,15 +71,15 @@ public class InputBlock extends InputSyncronizedBase {
if (this.currentAttacker == null) {
sb.append("To Block, click on your opponent's attacker first, then your blocker(s).\n");
sb.append("To cancel a block right-click on your blocker");
showMessage(sb.toString());
} else {
}
else {
final String attackerName = this.currentAttacker.isFaceDown() ? "Morph" : this.currentAttacker.getName();
sb.append("Select a creature to block ").append(attackerName).append(" (");
sb.append(this.currentAttacker.getUniqueNumber()).append("). ");
sb.append("To cancel a block right-click on your blocker");
showMessage(sb.toString());
}
showMessage(sb.toString());
CMatchUI.SINGLETON_INSTANCE.showCombat(combat);
}
@@ -100,7 +100,6 @@ public class InputBlock extends InputSyncronizedBase {
/** {@inheritDoc} */
@Override
public final void onCardSelected(final Card card, final MouseEvent triggerEvent) {
if (triggerEvent.getButton() == 3 && card.getController() == defender) {
combat.removeFromCombat(card);
CMatchUI.SINGLETON_INSTANCE.fireEvent(new UiEventBlockerAssigned(card, (Card)null));