package games.strategy.triplea.util;
import java.util.Comparator;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.GameSequence;
import games.strategy.engine.data.GameStep;
import games.strategy.engine.data.PlayerID;
import games.strategy.engine.delegate.IDelegate;
public class PlayerOrderComparator implements Comparator<PlayerID> {
private final GameData m_data;
public PlayerOrderComparator(final GameData data) {
m_data = data;
}
/**
* sort based on first step that isn't a bid related step.
*/
@Override
public int compare(final PlayerID p1, final PlayerID p2) {
if (p1.equals(p2)) {
return 0;
}
final GameSequence sequence;
m_data.acquireReadLock();
try {
sequence = m_data.getSequence();
} finally {
m_data.releaseReadLock();
}
for (final GameStep s : sequence) {
if (s.getPlayerID() == null) {
continue;
}
final IDelegate delegate;
m_data.acquireReadLock();
try {
delegate = s.getDelegate();
} finally {
m_data.releaseReadLock();
}
if (delegate != null && delegate.getClass() != null) {
final String delegateClassName = delegate.getClass().getName();
if (delegateClassName.equals("games.strategy.triplea.delegate.InitializationDelegate")
|| delegateClassName.equals("games.strategy.triplea.delegate.BidPurchaseDelegate")
|| delegateClassName.equals("games.strategy.triplea.delegate.BidPlaceDelegate")
|| delegateClassName.equals("games.strategy.triplea.delegate.EndRoundDelegate")) {
continue;
}
} else if (s.getName() != null && (s.getName().endsWith("Bid") || s.getName().endsWith("BidPlace"))) {
continue;
}
if (s.getPlayerID().equals(p1)) {
return -1;
} else if (s.getPlayerID().equals(p2)) {
return 1;
}
}
return 0;
}
}