package games.strategy.engine.data;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import games.strategy.net.INode;
/**
* Tracks what Node in the networks is playing which roles in the game.
*/
public class PlayerManager {
private final Map<String, INode> m_playerMapping;
public PlayerManager(final Map<String, INode> map) {
m_playerMapping = new HashMap<>(map);
}
public Map<String, INode> getPlayerMapping() {
return new HashMap<>(m_playerMapping);
}
public boolean isEmpty() {
return m_playerMapping == null || m_playerMapping.isEmpty();
}
@Override
public String toString() {
if (m_playerMapping == null || m_playerMapping.isEmpty()) {
return "empty";
}
final StringBuilder sb = new StringBuilder();
final Iterator<String> iter = m_playerMapping.keySet().iterator();
while (iter.hasNext()) {
final String key = iter.next();
final INode value = m_playerMapping.get(key);
sb.append(key).append("=").append(value.getName());
if (iter.hasNext()) {
sb.append(", ");
}
}
return sb.toString();
}
public Set<INode> getNodes() {
return new HashSet<>(m_playerMapping.values());
}
public INode getNode(final String playerName) {
return m_playerMapping.get(playerName);
}
/**
* @param node
* referring node
* @return whether the given node playing as anyone.
*/
public boolean isPlaying(final INode node) {
return m_playerMapping.containsValue(node);
}
public Set<String> getPlayers() {
return new HashSet<>(m_playerMapping.keySet());
}
public Set<String> getPlayedBy(final INode playerNode) {
final Set<String> rVal = new HashSet<>();
for (final String player : m_playerMapping.keySet()) {
if (m_playerMapping.get(player).equals(playerNode)) {
rVal.add(player);
}
}
return rVal;
}
/**
* Get a player from an opposing side, if possible, else
* get a player playing at a remote computer, if possible.
*
* @param localNode
* local node
* @param data
* game data
* @return player found
*/
public PlayerID getRemoteOpponent(final INode localNode, final GameData data) {
// find a local player
PlayerID local = null;
for (final String player : m_playerMapping.keySet()) {
if (m_playerMapping.get(player).equals(localNode)) {
local = data.getPlayerList().getPlayerID(player);
break;
}
}
// we arent playing anyone, return any
if (local == null) {
final String remote = m_playerMapping.keySet().iterator().next();
return data.getPlayerList().getPlayerID(remote);
}
String any = null;
for (final String player : m_playerMapping.keySet()) {
if (!m_playerMapping.get(player).equals(localNode)) {
any = player;
final PlayerID remotePlayerID = data.getPlayerList().getPlayerID(player);
if (!data.getRelationshipTracker().isAllied(local, remotePlayerID)) {
return remotePlayerID;
}
}
}
// no un allied players were found, any will do
return data.getPlayerList().getPlayerID(any);
}
}