package games.strategy.engine.data; import java.util.LinkedHashMap; import games.strategy.triplea.Constants; import games.strategy.triplea.attachments.PlayerAttachment; import games.strategy.triplea.attachments.RulesAttachment; import games.strategy.triplea.attachments.TechAttachment; import games.strategy.triplea.delegate.Matches; import games.strategy.util.CompositeMatchAnd; public class PlayerID extends NamedAttachable implements NamedUnitHolder { private static final long serialVersionUID = -2284878450555315947L; private final boolean m_optional; private final boolean m_canBeDisabled; private boolean m_isDisabled = false; private final UnitCollection m_unitsHeld; private final ResourceCollection m_resources; private ProductionFrontier m_productionFrontier; private RepairFrontier m_repairFrontier; private final TechnologyFrontierList m_technologyFrontiers; private String m_whoAmI = "null:no_one"; public PlayerID(final String name, final GameData data) { this(name, false, false, data); } /** Creates new PlayerID. */ public PlayerID(final String name, final boolean optional, final boolean canBeDisabled, final GameData data) { super(name, data); m_optional = optional; m_canBeDisabled = canBeDisabled; m_unitsHeld = new UnitCollection(this, data); m_resources = new ResourceCollection(data); m_technologyFrontiers = new TechnologyFrontierList(data); } public boolean getOptional() { return m_optional; } public boolean getCanBeDisabled() { return m_canBeDisabled; } @Override public UnitCollection getUnits() { return m_unitsHeld; } public ResourceCollection getResources() { return m_resources; } public TechnologyFrontierList getTechnologyFrontierList() { return m_technologyFrontiers; } public void setProductionFrontier(final ProductionFrontier frontier) { m_productionFrontier = frontier; } public ProductionFrontier getProductionFrontier() { return m_productionFrontier; } public void setRepairFrontier(final RepairFrontier frontier) { m_repairFrontier = frontier; } public RepairFrontier getRepairFrontier() { return m_repairFrontier; } @Override public void notifyChanged() {} public boolean isNull() { return false; } public static final PlayerID NULL_PLAYERID = new PlayerID(Constants.PLAYER_NAME_NEUTRAL, true, false, null) { // compatible with 0.9.0.2 saved games private static final long serialVersionUID = -6596127754502509049L; @Override public boolean isNull() { return true; } }; @Override public String toString() { return "PlayerID named:" + getName(); } @Override public String getType() { return UnitHolder.PLAYER; } /** * First string is "Human" or "AI", while second string is the name of the player. Separated with a colon. */ public void setWhoAmI(final String humanOrAI_colon_playerName) { // so for example, it should be "AI:Hard (AI)" final String[] s = humanOrAI_colon_playerName.split(":"); if (s.length != 2) { throw new IllegalStateException("whoAmI must have two strings, separated by a colon"); } if (!(s[0].equalsIgnoreCase("AI") || s[0].equalsIgnoreCase("Human") || s[0].equalsIgnoreCase("null"))) { throw new IllegalStateException("whoAmI first part must be, ai or human or client"); } m_whoAmI = humanOrAI_colon_playerName; } public String getWhoAmI() { return m_whoAmI; } public boolean isAI() { return m_whoAmI.split(":")[0].equalsIgnoreCase("AI"); } public void setIsDisabled(final boolean isDisabled) { m_isDisabled = isDisabled; } public boolean getIsDisabled() { return m_isDisabled; } /** * If I have no units with movement, * And I own zero factories or have have no owned land, * then I am basically dead, and therefore should not participate in things like politics. */ public boolean amNotDeadYet(final GameData data) { boolean hasFactory = false; boolean ownsLand = false; for (final Territory t : data.getMap().getTerritories()) { if (t.getUnits().someMatch(new CompositeMatchAnd<>(Matches.unitIsOwnedBy(this), Matches.unitHasAttackValueOfAtLeast(1), Matches.UnitCanMove, Matches.UnitIsLand))) { return true; } if (t.getOwner().equals(this)) { ownsLand = true; } if (t.getUnits().someMatch(new CompositeMatchAnd<>(Matches.unitIsOwnedBy(this), Matches.UnitCanProduceUnits))) { hasFactory = true; } if (ownsLand && hasFactory) { return true; } } return false; } public static LinkedHashMap<String, String> currentPlayers(final GameData data) { final LinkedHashMap<String, String> rVal = new LinkedHashMap<>(); if (data == null) { return rVal; } for (final PlayerID player : data.getPlayerList().getPlayers()) { rVal.put(player.getName(), player.getWhoAmI().split(":")[1]); } return rVal; } public RulesAttachment getRulesAttachment() { return (RulesAttachment) getAttachment(Constants.RULES_ATTACHMENT_NAME); } public PlayerAttachment getPlayerAttachment() { return (PlayerAttachment) getAttachment(Constants.PLAYER_ATTACHMENT_NAME); } public TechAttachment getTechAttachment() { return (TechAttachment) getAttachment(Constants.TECH_ATTACHMENT_NAME); } }