diff --git a/src/main/java/games/strategy/engine/data/GameParser.java b/src/main/java/games/strategy/engine/data/GameParser.java index 5fffa2eb4f9..98ae3c05010 100644 --- a/src/main/java/games/strategy/engine/data/GameParser.java +++ b/src/main/java/games/strategy/engine/data/GameParser.java @@ -61,6 +61,8 @@ */ public final class GameParser { private static final Class[] SETTER_ARGS = {String.class}; + private static final String RESOURCE_IS_DISPLAY_FOR_NONE = "NONE"; + private final GameData data = new GameData(); private final Collection errorsSax = new ArrayList<>(); public static final String DTD_FILE_NAME = "game.dtd"; @@ -732,11 +734,26 @@ private void parseConnections(final List connections) throws GameParseE } } - private void parseResources(final Element root) { - getChildren("resource", root).stream() - .map(e -> e.getAttribute("name")) - .map(name -> new Resource(name, data)) - .forEach(data.getResourceList()::addResource); + private void parseResources(final Element root) throws GameParseException { + for (final Element element : getChildren("resource", root)) { + final String name = element.getAttribute("name"); + final String isDisplayedFor = element.getAttribute("isDisplayedFor"); + if (isDisplayedFor.isEmpty()) { + data.getResourceList().addResource(new Resource(name, data, data.getPlayerList().getPlayers())); + } else if (isDisplayedFor.equalsIgnoreCase(RESOURCE_IS_DISPLAY_FOR_NONE)) { + data.getResourceList().addResource(new Resource(name, data)); + } else { + final List players = new ArrayList<>(); + for (final String s : isDisplayedFor.split(":")) { + final PlayerID player = data.getPlayerList().getPlayerId(s); + if (player == null) { + throw new GameParseException("Parse resources could not find player: " + s); + } + players.add(player); + } + data.getResourceList().addResource(new Resource(name, data, players)); + } + } } private void parseRelationshipTypes(final Element root) { diff --git a/src/main/java/games/strategy/engine/data/Resource.java b/src/main/java/games/strategy/engine/data/Resource.java index d9db6e94ea7..51e529eb1dc 100644 --- a/src/main/java/games/strategy/engine/data/Resource.java +++ b/src/main/java/games/strategy/engine/data/Resource.java @@ -1,8 +1,13 @@ package games.strategy.engine.data; +import java.util.ArrayList; +import java.util.List; + public class Resource extends NamedAttachable { private static final long serialVersionUID = 7471431759007499935L; + private final List players; + /** * Creates new Resource. * @@ -12,6 +17,17 @@ public class Resource extends NamedAttachable { * game data */ public Resource(final String name, final GameData data) { + this(name, data, new ArrayList<>()); + } + + public Resource(final String name, final GameData data, final List players) { super(name, data); + this.players = players; } + + public boolean isDisplayedFor(final PlayerID player) { + // TODO: remove null check on incompatible release + return players == null || players.contains(player); + } + } diff --git a/src/main/java/games/strategy/triplea/ui/ResourceBar.java b/src/main/java/games/strategy/triplea/ui/ResourceBar.java index 5d835df1371..eb266f55278 100644 --- a/src/main/java/games/strategy/triplea/ui/ResourceBar.java +++ b/src/main/java/games/strategy/triplea/ui/ResourceBar.java @@ -12,7 +12,6 @@ import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.Resource; import games.strategy.engine.data.events.GameDataChangeListener; -import games.strategy.engine.stats.IStat; import games.strategy.triplea.Constants; /** @@ -22,7 +21,7 @@ public class ResourceBar extends AbstractStatPanel implements GameDataChangeList private static final long serialVersionUID = -7713792841831042952L; private final UiContext uiContext; - private final List resources = new ArrayList<>(); + private final List resourceStats = new ArrayList<>(); private final List labels = new ArrayList<>(); public ResourceBar(final GameData data, final UiContext uiContext) { @@ -51,7 +50,7 @@ private void setResources() { if (resource.getName().equals(Constants.VPS)) { continue; } - resources.add(new ResourceStat(resource)); + resourceStats.add(new ResourceStat(resource)); final JLabel label = new JLabel(); label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); labels.add(label); @@ -64,15 +63,18 @@ public void gameDataChanged(final Change change) { try { final PlayerID player = gameData.getSequence().getStep().getPlayerId(); if (player != null) { - for (int i = 0; i < resources.size(); i++) { - final String quantity = resources.get(i).getFormatter().format(resources.get(i).getValue(player, gameData)); + for (int i = 0; i < resourceStats.size(); i++) { + final ResourceStat resourceStat = resourceStats.get(i); + final Resource resource = resourceStat.resource; + final JLabel label = labels.get(i); + final String quantity = resourceStat.getFormatter().format(resourceStat.getValue(player, gameData)); + label.setVisible(resource.isDisplayedFor(player)); try { - labels.get(i).setIcon(uiContext.getResourceImageFactory() - .getIcon(gameData.getResourceList().getResource(resources.get(i).getName()), true)); - labels.get(i).setText(quantity); - labels.get(i).setToolTipText(resources.get(i).getName()); + label.setIcon(uiContext.getResourceImageFactory().getIcon(resource, true)); + label.setText(quantity); + label.setToolTipText(resourceStat.getName()); } catch (final IllegalStateException e) { - labels.get(i).setText(resources.get(i).getName() + " " + quantity); + label.setText(resourceStat.getName() + " " + quantity); } } } diff --git a/src/main/resources/games/strategy/engine/xml/game.dtd b/src/main/resources/games/strategy/engine/xml/game.dtd index 3e8ad25b82b..c8b7f58a8f6 100644 --- a/src/main/resources/games/strategy/engine/xml/game.dtd +++ b/src/main/resources/games/strategy/engine/xml/game.dtd @@ -61,6 +61,7 @@