use of games.strategy.engine.data.UnitType in project triplea by triplea-game.
the class MyFormatter method unitsToTextNoOwner.
public static String unitsToTextNoOwner(final Collection<Unit> units, final PlayerID owner) {
final IntegerMap<UnitType> map = new IntegerMap<>();
for (final Unit unit : units) {
if (owner == null || owner.equals(unit.getOwner())) {
map.add(unit.getType(), 1);
}
}
final StringBuilder buf = new StringBuilder();
// sort on unit name
final List<UnitType> sortedList = new ArrayList<>(map.keySet());
sortedList.sort(Comparator.comparing(UnitType::getName));
int count = map.keySet().size();
for (final UnitType type : sortedList) {
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();
}
use of games.strategy.engine.data.UnitType in project triplea by triplea-game.
the class UnitInformation method saveToFile.
void saveToFile(final PrintGenerationData printData, final Map<UnitType, UnitAttachment> unitInfoMap) {
data = printData.getData();
printData.getOutDir().mkdir();
final File outFile = new File(printData.getOutDir(), "General Information.csv");
try (Writer unitInformation = Files.newBufferedWriter(outFile.toPath(), StandardCharsets.UTF_8)) {
for (int i = 0; i < 8; i++) {
unitInformation.write(",");
}
unitInformation.write("Unit Information");
for (int i = 10; i < 20; i++) {
unitInformation.write(",");
}
unitInformation.write("\r\n");
unitInformation.write("Unit,Cost,Movement,Attack,Defense,CanBlitz,Artillery?,ArtillerySupportable?" + ",Can Produce Units?,Marine?,Transport Cost,AA Gun?,Air Unit?,Strategic Bomber?,Carrier Cost," + "Sea Unit?,Hit Points?,Transport Capacity,Carrier Capacity,Submarine?,Destroyer?");
unitInformation.write("\r\n");
for (final Entry<UnitType, UnitAttachment> entry : unitInfoMap.entrySet()) {
final UnitType currentType = entry.getKey();
final UnitAttachment currentAttachment = entry.getValue();
if (currentType.getName().equals(Constants.UNIT_TYPE_AAGUN)) {
unitInformation.write(currentType.getName() + ",");
} else {
unitInformation.write(capitalizeFirst(currentType.getName()) + ",");
}
unitInformation.write(getCostInformation(currentType) + ",");
unitInformation.write(currentAttachment.getMovement(PlayerID.NULL_PLAYERID) + "," + currentAttachment.getAttack(PlayerID.NULL_PLAYERID) + "," + currentAttachment.getDefense(PlayerID.NULL_PLAYERID) + "," + (!currentAttachment.getCanBlitz(PlayerID.NULL_PLAYERID) ? "-" : "true") + "," + (!currentAttachment.getArtillery() ? "-" : "true") + "," + (!currentAttachment.getArtillerySupportable() ? "-" : "true") + "," + (!currentAttachment.getCanProduceUnits() ? "-" : "true") + "," + (currentAttachment.getIsMarine() == 0 ? "-" : currentAttachment.getIsMarine()) + "," + (currentAttachment.getTransportCost() == -1 ? "-" : currentAttachment.getTransportCost()) + "," + (!Matches.unitTypeIsAaForAnything().test(currentType) ? "-" : "true") + "," + (!currentAttachment.getIsAir() ? "-" : "true") + "," + (!currentAttachment.getIsStrategicBomber() ? "-" : "true") + "," + (currentAttachment.getCarrierCost() == -1 ? "-" : currentAttachment.getCarrierCost()) + "," + (!currentAttachment.getIsSea() ? "-" : "true") + "," + (currentAttachment.getHitPoints()) + "," + (currentAttachment.getTransportCapacity() == -1 ? "-" : currentAttachment.getTransportCapacity()) + "," + (currentAttachment.getCarrierCapacity() == -1 ? "-" : currentAttachment.getCarrierCapacity()) + "," + (!currentAttachment.getIsSub() ? "-" : "true") + "," + (!currentAttachment.getIsDestroyer() ? "-" : "true"));
unitInformation.write("\r\n");
}
unitInformation.write("\r\n");
} catch (final IOException e) {
ClientLogger.logError("There was an error while trying to save File " + outFile.toString(), e);
}
}
use of games.strategy.engine.data.UnitType in project triplea by triplea-game.
the class HelpMenu method getUnitStatsTable.
static String getUnitStatsTable(final GameData gameData, final UiContext uiContext) {
// html formatted string
final StringBuilder hints = new StringBuilder();
hints.append("<html>");
hints.append("<head><style>th, tr{color:black}</style></head>");
try {
gameData.acquireReadLock();
final Map<PlayerID, Map<UnitType, ResourceCollection>> costs = TuvUtils.getResourceCostsForTuv(gameData, true);
final Map<PlayerID, List<UnitType>> playerUnitTypes = UnitType.getAllPlayerUnitsWithImages(gameData, uiContext, true);
final String color3 = "FEECE2";
final String color2 = "BDBDBD";
final String color1 = "ABABAB";
int i = 0;
for (final Map.Entry<PlayerID, List<UnitType>> entry : playerUnitTypes.entrySet()) {
final PlayerID player = entry.getKey();
hints.append("<p><table border=\"1\" bgcolor=\"" + color1 + "\">");
hints.append("<tr><th style=\"font-size:120%;000000\" bgcolor=\"" + color3 + "\" colspan=\"4\">").append(player == null ? "NULL" : player.getName()).append(" Units</th></tr>");
hints.append("<tr").append(((i & 1) == 0) ? " bgcolor=\"" + color1 + "\"" : " bgcolor=\"" + color2 + "\"").append("><td>Unit</td><td>Name</td><td>Cost</td><td>Tool Tip</td></tr>");
for (final UnitType ut : entry.getValue()) {
i++;
hints.append("<tr").append(((i & 1) == 0) ? " bgcolor=\"" + color1 + "\"" : " bgcolor=\"" + color2 + "\"").append(">").append("<td>").append(getUnitImageUrl(ut, player, uiContext)).append("</td>").append("<td>").append(ut.getName()).append("</td>").append("<td>").append(costs.get(player).get(ut).toStringForHtml()).append("</td>").append("<td>").append(ut.getTooltip(player)).append("</td></tr>");
}
i++;
hints.append("<tr").append(((i & 1) == 0) ? " bgcolor=\"" + color1 + "\"" : " bgcolor=\"" + color2 + "\"").append(">").append("<td>Unit</td><td>Name</td><td>Cost</td><td>Tool Tip</td></tr></table></p><br />");
}
} finally {
gameData.releaseReadLock();
}
hints.append("</html>");
return hints.toString();
}
use of games.strategy.engine.data.UnitType in project triplea by triplea-game.
the class ExportMenu method createAndSaveStats.
private void createAndSaveStats(final boolean showPhaseStats) {
final ExtendedStats statPanel = new ExtendedStats(gameData, uiContext);
final JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
final File rootDir = new File(SystemProperties.getUserDir());
final int currentRound = gameData.getCurrentRound();
String defaultFileName = "stats_" + dateTimeFormatter.format(LocalDateTime.now()) + "_" + gameData.getGameName() + "_round_" + currentRound + (showPhaseStats ? "_full" : "_short");
defaultFileName = FileNameUtils.removeIllegalCharacters(defaultFileName);
defaultFileName = defaultFileName + ".csv";
chooser.setSelectedFile(new File(rootDir, defaultFileName));
if (chooser.showSaveDialog(frame) != JOptionPane.OK_OPTION) {
return;
}
final StringBuilder text = new StringBuilder(1000);
try {
gameData.acquireReadLock();
final GameData clone = GameDataUtils.cloneGameData(gameData);
final IStat[] stats = statPanel.getStats();
// extended stats covers stuff that doesn't show up in the game stats menu bar, like custom resources or tech
// tokens or # techs, etc.
final IStat[] statsExtended = statPanel.getStatsExtended(gameData);
final String[] alliances = statPanel.getAlliances().toArray(new String[0]);
final PlayerID[] players = statPanel.getPlayers().toArray(new PlayerID[0]);
// its important here to translate the player objects into our game data
// the players for the stat panel are only relevant with respect to
// the game data they belong to
Arrays.setAll(players, i -> clone.getPlayerList().getPlayerId(players[i].getName()));
text.append(defaultFileName).append(",");
text.append("\n");
text.append("TripleA Engine Version: ,");
text.append(ClientContext.engineVersion()).append(",");
text.append("\n");
text.append("Game Name: ,");
text.append(gameData.getGameName()).append(",");
text.append("\n");
text.append("Game Version: ,");
text.append(gameData.getGameVersion()).append(",");
text.append("\n");
text.append("\n");
text.append("Current Round: ,");
text.append(currentRound).append(",");
text.append("\n");
text.append("Number of Players: ,");
text.append(statPanel.getPlayers().size()).append(",");
text.append("\n");
text.append("Number of Alliances: ,");
text.append(statPanel.getAlliances().size()).append(",");
text.append("\n");
text.append("\n");
text.append("Turn Order: ,");
text.append("\n");
final List<PlayerID> playerOrderList = new ArrayList<>(gameData.getPlayerList().getPlayers());
playerOrderList.sort(new PlayerOrderComparator(gameData));
final Set<PlayerID> playerOrderSetNoDuplicates = new LinkedHashSet<>(playerOrderList);
for (final PlayerID currentPlayerId : playerOrderSetNoDuplicates) {
text.append(currentPlayerId.getName()).append(",");
final Collection<String> allianceNames = gameData.getAllianceTracker().getAlliancesPlayerIsIn(currentPlayerId);
for (final String allianceName : allianceNames) {
text.append(allianceName).append(",");
}
text.append("\n");
}
text.append("\n");
text.append("Winners: ,");
final EndRoundDelegate delegateEndRound = (EndRoundDelegate) gameData.getDelegateList().getDelegate("endRound");
if (delegateEndRound != null && delegateEndRound.getWinners() != null) {
for (final PlayerID p : delegateEndRound.getWinners()) {
text.append(p.getName()).append(",");
}
} else {
text.append("none yet; game not over,");
}
text.append("\n");
text.append("\n");
text.append("Resource Chart: ,");
text.append("\n");
for (final Resource resource : gameData.getResourceList().getResources()) {
text.append(resource.getName()).append(",");
text.append("\n");
}
// if short, we won't both showing production and unit info
if (showPhaseStats) {
text.append("\n");
text.append("Production Rules: ,");
text.append("\n");
text.append("Name,Result,Quantity,Cost,Resource,\n");
final Collection<ProductionRule> purchaseOptions = gameData.getProductionRuleList().getProductionRules();
for (final ProductionRule pr : purchaseOptions) {
String costString = pr.toStringCosts().replaceAll("; ", ",");
costString = costString.replaceAll(" ", ",");
text.append(pr.getName()).append(",").append(pr.getResults().keySet().iterator().next().getName()).append(",").append(pr.getResults().getInt(pr.getResults().keySet().iterator().next())).append(",").append(costString).append(",");
text.append("\n");
}
text.append("\n");
text.append("Unit Types: ,");
text.append("\n");
text.append("Name,Listed Abilities\n");
for (final UnitType unitType : gameData.getUnitTypeList()) {
final UnitAttachment ua = UnitAttachment.get(unitType);
if (ua == null) {
continue;
}
String toModify = ua.allUnitStatsForExporter();
toModify = toModify.replaceFirst("UnitType called ", "").replaceFirst(" with:", "").replaceAll("games.strategy.engine.data.", "").replaceAll("\n", ";").replaceAll(",", ";");
toModify = toModify.replaceAll(" ", ",");
toModify = toModify.replaceAll(", ", ",").replaceAll(" ,", ",");
text.append(toModify);
text.append("\n");
}
}
text.append("\n");
text.append((showPhaseStats ? "Full Stats (includes each phase that had activity)," : "Short Stats (only shows first phase with activity per player per round),"));
text.append("\n");
text.append("Turn Stats: ,");
text.append("\n");
text.append("Round,Player Turn,Phase Name,");
for (final IStat stat : stats) {
for (final PlayerID player : players) {
text.append(stat.getName()).append(" ");
text.append(player.getName());
text.append(",");
}
for (final String alliance : alliances) {
text.append(stat.getName()).append(" ");
text.append(alliance);
text.append(",");
}
}
for (final IStat element : statsExtended) {
for (final PlayerID player : players) {
text.append(element.getName()).append(" ");
text.append(player.getName());
text.append(",");
}
for (final String alliance : alliances) {
text.append(element.getName()).append(" ");
text.append(alliance);
text.append(",");
}
}
text.append("\n");
clone.getHistory().gotoNode(clone.getHistory().getLastNode());
@SuppressWarnings("unchecked") final Enumeration<TreeNode> nodes = ((DefaultMutableTreeNode) clone.getHistory().getRoot()).preorderEnumeration();
PlayerID currentPlayer = null;
int round = 0;
while (nodes.hasMoreElements()) {
// we want to export on change of turn
final HistoryNode element = (HistoryNode) nodes.nextElement();
if (element instanceof Round) {
round++;
}
if (!(element instanceof Step)) {
continue;
}
final Step step = (Step) element;
if (step.getPlayerId() == null || step.getPlayerId().isNull()) {
continue;
}
// this is to stop from having multiple entries for each players turn.
if (!showPhaseStats) {
if (step.getPlayerId() == currentPlayer) {
continue;
}
}
currentPlayer = step.getPlayerId();
clone.getHistory().gotoNode(element);
final String playerName = step.getPlayerId() == null ? "" : step.getPlayerId().getName() + ": ";
String stepName = step.getStepName();
// copied directly from TripleAPlayer, will probably have to be updated in the future if more delegates are made
if (stepName.endsWith("Bid")) {
stepName = "Bid";
} else if (stepName.endsWith("Tech")) {
stepName = "Tech";
} else if (stepName.endsWith("TechActivation")) {
stepName = "TechActivation";
} else if (stepName.endsWith("Purchase")) {
stepName = "Purchase";
} else if (stepName.endsWith("NonCombatMove")) {
stepName = "NonCombatMove";
} else if (stepName.endsWith("Move")) {
stepName = "Move";
} else if (stepName.endsWith("Battle")) {
stepName = "Battle";
} else if (stepName.endsWith("BidPlace")) {
stepName = "BidPlace";
} else if (stepName.endsWith("Place")) {
stepName = "Place";
} else if (stepName.endsWith("Politics")) {
stepName = "Politics";
} else if (stepName.endsWith("EndTurn")) {
stepName = "EndTurn";
} else {
stepName = "";
}
text.append(round).append(",").append(playerName).append(",").append(stepName).append(",");
for (final IStat stat : stats) {
for (final PlayerID player : players) {
text.append(stat.getFormatter().format(stat.getValue(player, clone)));
text.append(",");
}
for (final String alliance : alliances) {
text.append(stat.getFormatter().format(stat.getValue(alliance, clone)));
text.append(",");
}
}
for (final IStat element2 : statsExtended) {
for (final PlayerID player : players) {
text.append(element2.getFormatter().format(element2.getValue(player, clone)));
text.append(",");
}
for (final String alliance : alliances) {
text.append(element2.getFormatter().format(element2.getValue(alliance, clone)));
text.append(",");
}
}
text.append("\n");
}
} finally {
gameData.releaseReadLock();
}
try (Writer writer = Files.newBufferedWriter(chooser.getSelectedFile().toPath(), StandardCharsets.UTF_8)) {
writer.write(text.toString());
} catch (final IOException e1) {
ClientLogger.logQuietly("Failed to write stats: " + chooser.getSelectedFile().getAbsolutePath(), e1);
}
}
use of games.strategy.engine.data.UnitType in project triplea by triplea-game.
the class TuvUtils method getResourceCostsForTuvForAllPlayersMergedAndAveraged.
/**
* Return a map where key are unit types and values are the AVERAGED for all players.
* Any production rule that produces multiple units
* (like artillery in NWO, costs 7 but makes 2 artillery, meaning effective price is 3.5 each)
* will have their costs rounded up on a per unit basis.
* Therefore, this map should NOT be used for Purchasing information!
*/
private static Map<UnitType, ResourceCollection> getResourceCostsForTuvForAllPlayersMergedAndAveraged(final GameData data) {
final Map<UnitType, ResourceCollection> average = new HashMap<>();
final Resource pus;
data.acquireReadLock();
try {
pus = data.getResourceList().getResource(Constants.PUS);
} finally {
data.releaseReadLock();
}
final IntegerMap<Resource> defaultMap = new IntegerMap<>();
defaultMap.put(pus, 1);
final ResourceCollection defaultResources = new ResourceCollection(data, defaultMap);
final Map<UnitType, List<ResourceCollection>> backups = new HashMap<>();
final Map<UnitType, ResourceCollection> backupAveraged = new HashMap<>();
for (final ProductionRule rule : data.getProductionRuleList().getProductionRules()) {
if (rule == null || rule.getResults() == null || rule.getResults().isEmpty() || rule.getCosts() == null || rule.getCosts().isEmpty()) {
continue;
}
final IntegerMap<NamedAttachable> unitMap = rule.getResults();
final ResourceCollection costPerGroup = new ResourceCollection(data, rule.getCosts());
final Set<UnitType> units = new HashSet<>();
for (final NamedAttachable resourceOrUnit : unitMap.keySet()) {
if (!(resourceOrUnit instanceof UnitType)) {
continue;
}
units.add((UnitType) resourceOrUnit);
}
if (units.isEmpty()) {
continue;
}
final int totalProduced = unitMap.totalValues();
if (totalProduced == 1) {
final UnitType ut = units.iterator().next();
final List<ResourceCollection> current = backups.computeIfAbsent(ut, k -> new ArrayList<>());
current.add(costPerGroup);
} else if (totalProduced > 1) {
costPerGroup.discount((double) 1 / (double) totalProduced);
for (final UnitType ut : units) {
final List<ResourceCollection> current = backups.computeIfAbsent(ut, k -> new ArrayList<>());
current.add(costPerGroup);
}
}
}
for (final Entry<UnitType, List<ResourceCollection>> entry : backups.entrySet()) {
final ResourceCollection avgCost = new ResourceCollection(entry.getValue().toArray(new ResourceCollection[0]), data);
if (entry.getValue().size() > 1) {
avgCost.discount((double) 1 / (double) entry.getValue().size());
}
backupAveraged.put(entry.getKey(), avgCost);
}
final Map<PlayerID, Map<UnitType, ResourceCollection>> allPlayersCurrent = getResourceCostsForTuv(data, false);
allPlayersCurrent.remove(null);
for (final UnitType ut : data.getUnitTypeList().getAllUnitTypes()) {
final List<ResourceCollection> costs = new ArrayList<>();
for (final Map<UnitType, ResourceCollection> entry : allPlayersCurrent.values()) {
if (entry.get(ut) != null) {
costs.add(entry.get(ut));
}
}
if (costs.isEmpty()) {
final ResourceCollection backup = backupAveraged.get(ut);
if (backup != null) {
costs.add(backup);
} else {
costs.add(defaultResources);
}
}
final ResourceCollection avgCost = new ResourceCollection(costs.toArray(new ResourceCollection[0]), data);
if (costs.size() > 1) {
avgCost.discount((double) 1 / (double) costs.size());
}
average.put(ut, avgCost);
}
return average;
}
Aggregations