package games.strategy.triplea.formatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import games.strategy.engine.data.DefaultNamed; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.Unit; import games.strategy.engine.data.UnitType; import games.strategy.triplea.Constants; import games.strategy.triplea.delegate.DiceRoll; import games.strategy.triplea.delegate.Die; import games.strategy.util.IntegerMap; /** * Provides useful methods for converting things to text. */ public class MyFormatter { /** * Some exceptions to the rules. */ private static Map<String, String> s_plural; static { s_plural = new HashMap<>(); s_plural.put("armour", "armour"); s_plural.put("infantry", "infantry"); s_plural.put("artillery", "artilleries"); s_plural.put("factory", "factories"); } public static String unitsToTextNoOwner(final Collection<Unit> units) { return unitsToTextNoOwner(units, null); } public static String unitsToTextNoOwner(final Collection<Unit> units, final PlayerID owner) { final Iterator<Unit> iter = units.iterator(); final IntegerMap<UnitType> map = new IntegerMap<>(); while (iter.hasNext()) { final Unit unit = iter.next(); if (owner == null || owner.equals(unit.getOwner())) { map.add(unit.getUnitType(), 1); } } final StringBuilder buf = new StringBuilder(); // sort on unit name final List<UnitType> sortedList = new ArrayList<>(map.keySet()); final Comparator<UnitType> comp = (u1, u2) -> u1.getName().compareTo(u2.getName()); Collections.sort(sortedList, comp); final Iterator<UnitType> typeIter = sortedList.iterator(); int count = map.keySet().size(); while (typeIter.hasNext()) { final UnitType type = typeIter.next(); final int quantity = map.getInt(type); buf.append(quantity); buf.append(" "); buf.append(quantity > 1 ? pluralize(type.getName()) : type.getName()); count--; if (count > 1) { buf.append(", "); } if (count == 1) { buf.append(" and "); } } return buf.toString(); } public static String unitsToText(final Collection<Unit> units) { final Iterator<Unit> iter = units.iterator(); final IntegerMap<UnitOwner> map = new IntegerMap<>(); while (iter.hasNext()) { final Unit unit = iter.next(); final UnitOwner owner = new UnitOwner(unit.getType(), unit.getOwner()); map.add(owner, 1); } final StringBuilder buf = new StringBuilder(); final Iterator<UnitOwner> iter2 = map.keySet().iterator(); int count = map.keySet().size(); while (iter2.hasNext()) { final UnitOwner owner = iter2.next(); final int quantity = map.getInt(owner); buf.append(quantity); buf.append(" "); buf.append(quantity > 1 ? pluralize(owner.type.getName()) : owner.type.getName()); buf.append(" owned by the "); buf.append(owner.owner.getName()); count--; if (count > 1) { buf.append(", "); } if (count == 1) { buf.append(" and "); } } return buf.toString(); } public static String pluralize(final String in, final int quantity) { if (quantity == -1 || quantity == 1) { return in; } return pluralize(in); } public static String pluralize(final String in) { if (s_plural.containsKey(in)) { return s_plural.get(in); } if (in.endsWith("man")) { return in.substring(0, in.lastIndexOf("man")) + "men"; } return in + "s"; } public static String attachmentNameToText(final String attachmentGetName) { String toText = attachmentGetName; if (attachmentGetName.startsWith(Constants.RELATIONSHIPTYPE_ATTACHMENT_NAME)) { toText = attachmentGetName.replaceFirst(Constants.RELATIONSHIPTYPE_ATTACHMENT_NAME, "Relationship Type "); } else if (attachmentGetName.startsWith(Constants.TECH_ATTACHMENT_NAME)) { toText = attachmentGetName.replaceFirst(Constants.TECH_ATTACHMENT_NAME, "Player Techs "); } else if (attachmentGetName.startsWith(Constants.UNIT_ATTACHMENT_NAME)) { toText = attachmentGetName.replaceFirst(Constants.UNIT_ATTACHMENT_NAME, "Unit Type Properties "); } else if (attachmentGetName.startsWith(Constants.TERRITORY_ATTACHMENT_NAME)) { toText = attachmentGetName.replaceFirst(Constants.TERRITORY_ATTACHMENT_NAME, "Territory Properties "); } else if (attachmentGetName.startsWith(Constants.CANAL_ATTACHMENT_PREFIX)) { toText = attachmentGetName.replaceFirst(Constants.CANAL_ATTACHMENT_PREFIX, "Canal "); } else if (attachmentGetName.startsWith(Constants.TERRITORYEFFECT_ATTACHMENT_NAME)) { toText = attachmentGetName.replaceFirst(Constants.TERRITORYEFFECT_ATTACHMENT_NAME, "Territory Effect "); } else if (attachmentGetName.startsWith(Constants.SUPPORT_ATTACHMENT_PREFIX)) { toText = attachmentGetName.replaceFirst(Constants.SUPPORT_ATTACHMENT_PREFIX, "Support "); } else if (attachmentGetName.startsWith(Constants.RULES_OBJECTIVE_PREFIX)) { toText = attachmentGetName.replaceFirst(Constants.RULES_OBJECTIVE_PREFIX, "Objective "); } else if (attachmentGetName.startsWith(Constants.RULES_CONDITION_PREFIX)) { toText = attachmentGetName.replaceFirst(Constants.RULES_CONDITION_PREFIX, "Condition "); } else if (attachmentGetName.startsWith(Constants.TRIGGER_ATTACHMENT_PREFIX)) { toText = attachmentGetName.replaceFirst(Constants.TRIGGER_ATTACHMENT_PREFIX, "Trigger "); } else if (attachmentGetName.startsWith(Constants.RULES_ATTACHMENT_NAME)) { toText = attachmentGetName.replaceFirst(Constants.RULES_ATTACHMENT_NAME, "Rules "); } else if (attachmentGetName.startsWith(Constants.PLAYER_ATTACHMENT_NAME)) { toText = attachmentGetName.replaceFirst(Constants.PLAYER_ATTACHMENT_NAME, "Player Properties "); } else if (attachmentGetName.startsWith(Constants.POLITICALACTION_ATTACHMENT_PREFIX)) { toText = attachmentGetName.replaceFirst(Constants.POLITICALACTION_ATTACHMENT_PREFIX, "Political Action "); } else if (attachmentGetName.startsWith(Constants.POLITICALACTION_ATTACHMENT_PREFIX)) { toText = attachmentGetName.replaceFirst(Constants.USERACTION_ATTACHMENT_PREFIX, "Action "); } else if (attachmentGetName.startsWith(Constants.TECH_ABILITY_ATTACHMENT_NAME)) { toText = attachmentGetName.replaceFirst(Constants.TECH_ABILITY_ATTACHMENT_NAME, "Tech Properties "); } toText = toText.replaceAll("_", " "); toText = toText.replaceAll(" ", " "); toText = toText.trim(); return toText; } public static String listOfArraysToString(final ArrayList<String[]> listOfArrays) { if (listOfArrays == null) { return "null"; } String toText = "["; for (final String[] s : listOfArrays) { toText += Arrays.toString(s); toText += ","; } toText += "]"; return toText; } public static String asDice(final DiceRoll roll) { if (roll == null || roll.size() == 0) { return "none"; } final StringBuilder buf = new StringBuilder(); for (int i = 0; i < roll.size(); i++) { buf.append(roll.getDie(i).getValue() + 1); if (i + 1 < roll.size()) { buf.append(","); } } return buf.toString(); } public static String asDice(final int[] rolls) { if (rolls == null || rolls.length == 0) { return "none"; } final StringBuilder buf = new StringBuilder(rolls.length * 2); for (int i = 0; i < rolls.length; i++) { buf.append(rolls[i] + 1); if (i + 1 < rolls.length) { buf.append(","); } } return buf.toString(); } public static String asDice(final List<Die> rolls) { if (rolls == null || rolls.size() == 0) { return "none"; } final StringBuilder buf = new StringBuilder(rolls.size() * 2); for (int i = 0; i < rolls.size(); i++) { buf.append(rolls.get(i).getValue() + 1); if (i + 1 < rolls.size()) { buf.append(","); } } return buf.toString(); } public static String defaultNamedToTextList(final Collection<? extends DefaultNamed> list) { return defaultNamedToTextList(list, ", ", false); } public static String defaultNamedToTextList(final Collection<? extends DefaultNamed> list, final boolean showQuantity) { return defaultNamedToTextList(list, ", ", showQuantity); } public static String defaultNamedToTextList(final Collection<? extends DefaultNamed> list, final String seperator, final boolean showQuantity) { final Iterator<? extends DefaultNamed> iter = list.iterator(); final IntegerMap<DefaultNamed> map = new IntegerMap<>(); while (iter.hasNext()) { final DefaultNamed unit = iter.next(); if (unit == null || unit.getName() == null) { throw new IllegalStateException("Unit or Resource no longer exists?!?"); } map.add(unit, 1); } final StringBuilder buf = new StringBuilder(); // sort on unit name final List<DefaultNamed> sortedList = new ArrayList<>(map.keySet()); final Comparator<DefaultNamed> comp = (u1, u2) -> u1.getName().compareTo(u2.getName()); Collections.sort(sortedList, comp); final Iterator<? extends DefaultNamed> typeIter = sortedList.iterator(); int count = map.keySet().size(); while (typeIter.hasNext()) { final DefaultNamed type = typeIter.next(); if (showQuantity) { final int quantity = map.getInt(type); buf.append(quantity); buf.append(" "); buf.append(quantity > 1 ? pluralize(type.getName()) : type.getName()); } else { buf.append(type.getName()); } count--; if (count > 1) { buf.append(seperator); } if (count == 1) { buf.append(" and "); } } return buf.toString(); } public static String integerDefaultNamedMapToString(final IntegerMap<? extends DefaultNamed> map, final String separator, final String assignment, final boolean valueBeforeKey) { final StringBuilder buf = new StringBuilder(""); for (final Entry<? extends DefaultNamed, Integer> entry : map.entrySet()) { buf.append(separator); final DefaultNamed current = entry.getKey(); final int val = entry.getValue(); if (valueBeforeKey) { buf.append(val).append(assignment).append(current.getName()); } else { buf.append(current.getName()).append(assignment).append(val); } } return buf.toString().replaceFirst(separator, ""); } public static String integerUnitMapToString(final IntegerMap<? extends Unit> map, final String separator, final String assignment, final boolean valueBeforeKey) { final StringBuilder buf = new StringBuilder(""); for (final Entry<? extends Unit, Integer> entry : map.entrySet()) { buf.append(separator); final Unit current = entry.getKey(); final int val = entry.getValue(); if (valueBeforeKey) { buf.append(val).append(assignment).append(current.getType().getName()); } else { buf.append(current.getType().getName()).append(assignment).append(val); } } return buf.toString().replaceFirst(separator, ""); } /** Creates a new instance of MyFormatter. */ private MyFormatter() {} }