From 7e7969988a1d3ca65319a5c232e2c74cb825c331 Mon Sep 17 00:00:00 2001 From: drdev Date: Sat, 18 Jan 2014 17:06:18 +0000 Subject: [PATCH] Rework player zone message building for ability effects --- .../src/main/java/forge/util/TextUtil.java | 38 +++++++++++++++++++ .../java/forge/game/ability/AbilityUtils.java | 38 ++++++++++++++++++- .../forge/game/ability/effects/DigEffect.java | 17 +++++---- .../gui/player/PlayerControllerHuman.java | 20 ++++------ 4 files changed, 91 insertions(+), 22 deletions(-) diff --git a/forge-core/src/main/java/forge/util/TextUtil.java b/forge-core/src/main/java/forge/util/TextUtil.java index 34f86365604..8d3ecb6ab3d 100644 --- a/forge-core/src/main/java/forge/util/TextUtil.java +++ b/forge-core/src/main/java/forge/util/TextUtil.java @@ -139,4 +139,42 @@ public class TextUtil { block != null && block != Character.UnicodeBlock.SPECIALS; } + + public enum PhraseCase { + Title, + Sentence, + Lower + } + + public static String splitCompoundWord(String word, PhraseCase phraseCase) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < word.length(); i++) { + char ch = word.charAt(i); + if (Character.isUpperCase(ch)) { + if (i > 0) { + builder.append(" "); + } + switch (phraseCase) { + case Title: + builder.append(ch); + break; + case Sentence: + if (i > 0) { + builder.append(ch); + } + else { + builder.append(Character.toLowerCase(ch)); + } + break; + case Lower: + builder.append(Character.toLowerCase(ch)); + continue; + } + } + else { + builder.append(ch); + } + } + return builder.toString(); + } } diff --git a/forge-gui/src/main/java/forge/game/ability/AbilityUtils.java b/forge-gui/src/main/java/forge/game/ability/AbilityUtils.java index 8a87f667f12..39270e74013 100644 --- a/forge-gui/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-gui/src/main/java/forge/game/ability/AbilityUtils.java @@ -25,14 +25,16 @@ import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.zone.ZoneType; +import forge.net.FServer; import forge.util.Expressions; +import forge.util.Lang; +import forge.util.TextUtil; /** * TODO: Write javadoc for this type. * */ public class AbilityUtils { - public static CounterType getCounterType(String name, SpellAbility sa) throws Exception { CounterType counterType; if ("ReplacedCounterType".equals(name)) { @@ -1361,4 +1363,38 @@ public class AbilityUtils { } return CardFactoryUtil.xCount(c, s); } + + public static String createPlayerZoneMessage(Player player, ZoneType zoneType, String prefix) { + return createPlayerZoneMessage(player, zoneType, prefix, null); + } + public static String createPlayerZoneMessage(Player player, ZoneType zoneType, String prefix, String suffix) { + StringBuilder message = new StringBuilder(); + + String owner; + if (player.getLobbyPlayer() == FServer.instance.getLobby().getGuiPlayer()) { + owner = "your"; + } + else { + owner = Lang.getPossesive(player.getName()); + } + + if (prefix != null && !prefix.isEmpty()) { + message.append(prefix); + if (!prefix.endsWith(" ")) { + message.append(" "); + } + message.append(owner); + } + else { + message.append(owner.substring(0, 1).toUpperCase() + owner.substring(1)); + } + + message.append(" " + TextUtil.splitCompoundWord(zoneType.toString(), TextUtil.PhraseCase.Lower)); + + if (suffix != null && !suffix.isEmpty()) { + message.append(" " + suffix); + } + + return message.toString(); + } } diff --git a/forge-gui/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-gui/src/main/java/forge/game/ability/effects/DigEffect.java index 115f5d71519..f93b07d7779 100644 --- a/forge-gui/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-gui/src/main/java/forge/game/ability/effects/DigEffect.java @@ -21,7 +21,6 @@ import forge.util.Lang; import forge.util.MyRandom; public class DigEffect extends SpellAbilityEffect { - @Override protected String getStackDescription(SpellAbility sa) { final Card host = sa.getSourceCard(); @@ -184,13 +183,14 @@ public class DigEffect extends SpellAbilityEffect { } else if (allButOne) { movedCards.addAll(valid); - String prompt; + String prefix; if (destZone2.equals(ZoneType.Library) && (libraryPosition2 == 0)) { - prompt = "Choose a card to leave on top of {player's} library"; + prefix = "Choose a card to leave on top of "; } else { - prompt = "Choose a card to leave in {player's} " + destZone2.name(); + prefix = "Choose a card to leave in "; } + String prompt = AbilityUtils.createPlayerZoneMessage(p, destZone2, prefix); Card chosen = chooser.getController().chooseSingleEntityForEffect(valid, sa, prompt, false, p); movedCards.remove(chosen); @@ -201,15 +201,16 @@ public class DigEffect extends SpellAbilityEffect { } else { int j = 0; - String prompt = "Choose a card to put into "; + String prefix = "Choose a card to put into "; if (destZone1.equals(ZoneType.Library)) { if (libraryPosition == -1) { - prompt = "Choose a card to put on the bottom of {player's} library"; + prefix = "Choose a card to put on the bottom of "; } else if (libraryPosition == 0) { - prompt = "Choose a card to put on top of {player's} library"; + prefix = "Choose a card to put on top of "; } } + String prompt = AbilityUtils.createPlayerZoneMessage(p, destZone1, prefix); while ((j < destZone1ChangeNum) || (anyNumber && (j < numToDig))) { // let user get choice @@ -218,7 +219,7 @@ public class DigEffect extends SpellAbilityEffect { chosen = chooser.getController().chooseSingleEntityForEffect(valid, sa, prompt, anyNumber || optional, p); } else { - chooser.getController().notifyOfValue(sa, null, "No valid cards"); + chooser.getController().notifyOfValue(sa, null, AbilityUtils.createPlayerZoneMessage(p, destZone1, "No valid cards in ")); } if (chosen == null) { diff --git a/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java index 55f0e31769f..4ec519957d8 100644 --- a/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java @@ -36,6 +36,7 @@ import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObject; import forge.game.GameType; +import forge.game.ability.AbilityUtils; import forge.game.ability.effects.CharmEffect; import forge.game.card.Card; import forge.game.card.CardShields; @@ -357,14 +358,14 @@ public class PlayerControllerHuman extends PlayerController { if (canUseSelectCardsInput) { InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(isOptional ? 0 : 1, 1, options); input.setCancelAllowed(isOptional); - input.setMessage(formatMessage(title, targetedPlayer)); + input.setMessage(title); input.showAndWait(); return Iterables.getFirst(input.getSelected(), null); } return isOptional ? GuiChoose.oneOrNone(title, options) : GuiChoose.one(title, options); } - + @Override public int chooseNumber(SpellAbility sa, String title, int min, int max) { final Integer[] choices = new Integer[max + 1 - min]; @@ -457,11 +458,11 @@ public class PlayerControllerHuman extends PlayerController { * @see forge.game.player.PlayerController#reveal(java.lang.String, java.util.List, forge.game.zone.ZoneType, forge.game.player.Player) */ @Override - public void reveal(Collection cards, ZoneType zone, Player owner, String message) { - if (StringUtils.isBlank(message)) { - message = "Looking at cards in {player's} " + zone.name(); + public void reveal(Collection cards, ZoneType zoneType, Player owner, String messagePrefix) { + if (StringUtils.isBlank(messagePrefix)) { + messagePrefix = "Looking at cards in "; } - GuiChoose.reveal(formatMessage(message, owner), cards); + GuiChoose.reveal(AbilityUtils.createPlayerZoneMessage(owner, zoneType, messagePrefix), cards); } @Override @@ -832,13 +833,6 @@ public class PlayerControllerHuman extends PlayerController { GuiDialog.message(message, sa.getSourceCard() == null ? "" : sa.getSourceCard().getName()); } - private String formatMessage(String message, Object related) { - if(related instanceof Player && message.indexOf("{player") >= 0) - message = message.replace("{player}", mayBeYou(related)).replace("{player's}", Lang.getPossesive(mayBeYou(related))); - - return message; - } - // These are not much related to PlayerController private String formatNotificationMessage(SpellAbility sa, GameObject target, String value) { if (sa.getApi() == null || sa.getSourceCard() == null) {