Improve texts for combat in both log and window

This commit is contained in:
Maxmtg
2013-04-23 15:47:24 +00:00
parent 7a9e33bc6e
commit 3e76abbaf5
6 changed files with 74 additions and 77 deletions

View File

@@ -99,6 +99,8 @@ public class InputAttack extends InputBase {
public final void selectButtonOK() {
// Propaganda costs could have been paid here.
setCurrentDefender(null); // remove highlights
game.getPhaseHandler().setCombat(!game.getCombat().getAttackers().isEmpty());
game.getPhaseHandler().setPlayersPriorityPermission(false);
Singletons.getModel().getMatch().getInput().updateObservers();
}

View File

@@ -265,17 +265,19 @@ public class ComputerUtilBlock {
return blockers;
}
/**
* <p>
* sortPotentialAttackers.
* </p>
*
* @param combat
* a {@link forge.game.phase.Combat} object.
* @return a {@link forge.CardList} object.
*/
public final static List<List<Card>> sortAttackerByDefender(Combat combat) {
List<GameEntity> defenders = combat.getDefenders();
final ArrayList<List<Card>> attackers = new ArrayList<List<Card>>(defenders.size());
for (GameEntity defender : defenders) {
attackers.add(combat.getAttackersOf(defender));
}
return attackers;
}
public static List<Card> sortPotentialAttackers(final Player ai, final Combat combat) {
final List<List<Card>> attackerLists = combat.sortAttackerByDefender();
final List<List<Card>> attackerLists = sortAttackerByDefender(combat);
final List<Card> sortedAttackers = new ArrayList<Card>();
final List<Card> firstAttacker = attackerLists.get(0);

View File

@@ -229,26 +229,14 @@ public class Combat {
}
}
/**
* <p>
* sortAttackerByDefender.
* </p>
*
* @return an array of {@link forge.CardList} objects.
*/
public final List<List<Card>> sortAttackerByDefender() {
int size = this.defenders.size();
final ArrayList<List<Card>> attackers = new ArrayList<List<Card>>(size);
for (int i = 0; i < size; i++) {
attackers.add(getAttackersByDefenderSlot(i));
}
return attackers;
}
public final List<Card> getAttackersByDefenderSlot(int slot) {
GameEntity entity = this.defenders.get(slot);
return this.defenderMap.get(entity);
}
public final List<Card> getAttackersOf(GameEntity defender) {
return defenderMap.get(defender);
}
/**
* <p>

View File

@@ -59,6 +59,7 @@ import forge.gui.GuiDialog;
import forge.gui.framework.EDocID;
import forge.gui.framework.SDisplayUtil;
import forge.gui.match.controllers.CCombat;
import forge.util.Lang;
/**
@@ -977,22 +978,18 @@ public class CombatUtil {
// Loop through Defenders
// Append Defending Player/Planeswalker
final Combat combat = game.getCombat();
final List<GameEntity> defenders = combat.getDefenders();
final List<List<Card>> attackers = combat.sortAttackerByDefender();
// Not a big fan of the triple nested loop here
for (int def = 0; def < defenders.size(); def++) {
List<Card> attacker = attackers.get(def);
if ((attacker == null) || (attacker.size() == 0)) {
for (GameEntity defender : combat.getDefenders()) {
List<Card> attackers = combat.getAttackersOf(defender);
if (attackers == null || attackers.isEmpty()) {
continue;
}
if ( sb.length() > 0 ) sb.append("\n");
sb.append(combat.getAttackingPlayer()).append(" declared ");
for (final Card atk : attacker) {
sb.append(atk).append(" ");
}
sb.append("attacking ").append(defenders.get(def).toString()).append(".");
sb.append(combat.getAttackingPlayer()).append(" declared ").append(Lang.joinHomogenous(attackers));
sb.append(" to attack ").append(defender.toString()).append(".");
}
return sb.toString();
@@ -1007,35 +1004,34 @@ public class CombatUtil {
public static String getCombatBlockForLog(GameState game) {
final StringBuilder sb = new StringBuilder();
List<Card> defend = null;
// Loop through Defenders
// Append Defending Player/Planeswalker
final Combat combat = game.getCombat();
final List<GameEntity> defenders = combat.getDefenders();
final List<List<Card>> attackers = combat.sortAttackerByDefender();
List<Card> blockers = null;
// Not a big fan of the triple nested loop here
for (int def = 0; def < defenders.size(); def++) {
final List<Card> list = attackers.get(def);
for (GameEntity defender : combat.getDefenders()) {
List<Card> attackers = combat.getAttackersOf(defender);
if (attackers == null || attackers.isEmpty()) {
continue;
}
if ( sb.length() > 0 ) sb.append("\n");
for (final Card attacker : list) {
defend = game.getCombat().getBlockers(attacker);
sb.append(combat.getDefenderByAttacker(attacker)).append(" assigned ");
if (!defend.isEmpty()) {
// loop through blockers
for (final Card blocker : defend) {
sb.append(blocker).append(" ");
}
String controllerName = defender instanceof Card ? ((Card)defender).getController().getName() : defender.getName();
boolean firstAttacker = true;
for (final Card attacker : attackers) {
if ( !firstAttacker ) sb.append("\n");
blockers = game.getCombat().getBlockers(attacker);
if ( blockers.isEmpty() ) {
sb.append(controllerName).append(" didn't block ");
} else {
sb.append("<nothing> ");
sb.append(controllerName).append(" assigned ").append(Lang.joinHomogenous(blockers)).append(" to block ");
}
sb.append("to block ").append(attacker).append(". ");
} // loop through attackers
sb.append(attacker).append(".");
firstAttacker = false;
}
}
return sb.toString();

View File

@@ -7,8 +7,10 @@ import forge.Command;
import forge.GameEntity;
import forge.game.GameState;
import forge.game.phase.Combat;
import forge.game.player.Player;
import forge.gui.framework.ICDoc;
import forge.gui.match.views.VCombat;
import forge.util.Lang;
/**
* Controls the combat panel in the match UI.
@@ -57,37 +59,34 @@ public enum CCombat implements ICDoc {
private static String getCombatDescription(Combat combat) {
final StringBuilder display = new StringBuilder();
// Loop through Defenders
// Append Defending Player/Planeswalker
final List<GameEntity> defenders = combat.getDefenders();
final List<List<Card>> attackers = combat.sortAttackerByDefender();
// Not a big fan of the triple nested loop here
for (int def = 0; def < defenders.size(); def++) {
List<Card> atk = attackers.get(def);
if ((atk == null) || (atk.size() == 0)) {
for (GameEntity defender : combat.getDefenders()) {
List<Card> atk = combat.getAttackersOf(defender);
if (atk == null || atk.isEmpty()) {
continue;
}
if (def > 0) {
if (display.length() > 0) {
display.append("\n");
}
display.append("Defender - ");
display.append(defenders.get(def).toString());
display.append("\n");
if (defender instanceof Card) {
Player controller = ((Card) defender).getController();
display.append(Lang.getPossesive(controller.getName())).append(" ");
}
display.append(defender.getName()).append(" is attacked by:\n");
for (final Card c : atk) {
// loop through attackers
display.append("-> ");
display.append(" > ");
display.append(combatantToString(c)).append("\n");
List<Card> blockers = combat.getBlockers(c);
// loop through blockers
for (final Card element : blockers) {
display.append(" [ ");
display.append(combatantToString(element)).append("\n");
display.append(" < ").append(combatantToString(element)).append("\n");
}
} // loop through attackers
}
@@ -107,10 +106,11 @@ public enum CCombat implements ICDoc {
final StringBuilder sb = new StringBuilder();
final String name = (c.isFaceDown()) ? "Morph" : c.getName();
sb.append("( ").append(c.getNetAttack()).append(" / ").append(c.getNetDefense()).append(" ) ... ");
sb.append(name);
sb.append(" (").append(c.getUniqueNumber()).append(") ");
sb.append(c.getNetAttack()).append("/").append(c.getNetDefense());
sb.append(" [").append(c.getUniqueNumber()).append("] ");
return sb.toString();
}

View File

@@ -42,4 +42,13 @@ public class Lang {
}
return sb.toString();
}
/**
* TODO: Write javadoc for this method.
* @param name
* @return
*/
public static String getPossesive(String name) {
return name.endsWith("s") ? name + "'" : name + "'s";
}
}