package cryodex.modules.imperialassault; import java.util.ArrayList; import java.util.Collections; import java.util.List; import cryodex.CryodexController.Modules; import cryodex.Player; import cryodex.modules.ModulePlayer; import cryodex.xml.XMLObject; import cryodex.xml.XMLUtils; import cryodex.xml.XMLUtils.Element; public class IAPlayer implements Comparable<ModulePlayer>, XMLObject, ModulePlayer { private Player player; private String seedValue; private boolean firstRoundBye = false; private String squadId; public IAPlayer(Player p) { player = p; seedValue = String.valueOf(Math.random()); } public IAPlayer(Player p, Element e) { this.player = p; this.seedValue = e.getStringFromChild("SEEDVALUE"); this.firstRoundBye = e.getBooleanFromChild("FIRSTROUNDBYE"); this.squadId = e.getStringFromChild("SQUADID"); } @Override public Player getPlayer() { return player; } @Override public void setPlayer(Player player) { this.player = player; } public String getSeedValue() { return seedValue; } public void setSeedValue(String seedValue) { this.seedValue = seedValue; } public boolean isFirstRoundBye() { return firstRoundBye; } public void setFirstRoundBye(boolean firstRoundBye) { this.firstRoundBye = firstRoundBye; } public String getSquadId() { return squadId; } public void setSquadId(String squadId) { this.squadId = squadId; } public List<IAMatch> getMatches(IATournament t) { List<IAMatch> matches = new ArrayList<IAMatch>(); if (t != null) { rounds: for (IARound r : t.getAllRounds()) { if (r.isSingleElimination()) { continue; } for (IAMatch m : r.getMatches()) { if (m.getPlayer1() == this || (m.getPlayer2() != null && m.getPlayer2() == this)) { matches.add(m); continue rounds; } } } } return matches; } @Override public String toString() { return getPlayer().getName(); } public int getScore(IATournament t) { int score = 0; for (IAMatch match : getMatches(t)) { if (match.getWinner() == this) { score += IAMatch.WIN_POINTS; } else if (match.isBye()) { score += IAMatch.BYE_POINTS; } else { score += IAMatch.LOSS_POINTS; } } return score; } public double getAverageScore(IATournament t) { return getScore(t) * 1.0 / getMatches(t).size(); } public double getAverageSoS(IATournament t) { double sos = 0.0; List<IAMatch> matches = getMatches(t); for (IAMatch m : matches) { if (m.isBye() == false && (m.getWinner() != null)) { if (m.getPlayer1() == this) { sos += m.getPlayer2().getAverageScore(t); } else { sos += m.getPlayer1().getAverageScore(t); } } } return sos / matches.size(); } public int getWins(IATournament t) { int score = 0; for (IAMatch match : getMatches(t)) { if (match.getWinner() == this || match.isBye()) { score++; } } return score; } public int getLosses(IATournament t) { int score = 0; for (IAMatch match : getMatches(t)) { if (match.getWinner() != null && match.getWinner() != this) { score++; } } return score; } public int getByes(IATournament t) { int byes = 0; for (IAMatch match : getMatches(t)) { if (match.isBye()) { byes++; } } return byes; } public double getExtendedStrengthOfSchedule(IATournament t) { double sos = 0; List<IAMatch> matches = getMatches(t); for (IAMatch m : matches) { if (m.isBye() == false & m.getWinner() != null) { if (m.getPlayer1() == this) { sos += m.getPlayer2().getAverageSoS(t); } else { sos += m.getPlayer1().getAverageSoS(t); } } } return sos / matches.size(); } public int getRank(IATournament t) { List<IAPlayer> players = new ArrayList<IAPlayer>(); players.addAll(t.getIAPlayers()); Collections.sort(players, new IAComparator(t, IAComparator.rankingCompare)); for (int i = 0; i < players.size(); i++) { if (players.get(i) == this) { return i + 1; } } return 0; } public int getEliminationRank(IATournament t) { int rank = 0; for (IARound r : t.getAllRounds()) { if (r.isSingleElimination()) { for (IAMatch m : r.getMatches()) { if ((m.getPlayer1() == this || m.getPlayer2() == this) && (m.getWinner() != null && m.getWinner() != this)) { return r.getMatches().size() * 2; } if (r.getMatches().size() == 1 && m.getWinner() != null && m.getWinner() == this) { return 1; } } } } return rank; } public boolean isHeadToHeadWinner(IATournament t) { if (t != null) { int score = getScore(t); List<IAPlayer> players = new ArrayList<IAPlayer>(); for (IAPlayer p : t.getIAPlayers()) { if (p != this && p.getScore(t) == score) { players.add(p); } } if (players.isEmpty()) { return false; } playerLoop: for (IAPlayer p : players) { for (IAMatch m : p.getMatches(t)) { if (m.getPlayer1() == p && m.getPlayer2() == this && m.getWinner() == this) { continue playerLoop; } else if (m.getPlayer2() == p && m.getPlayer1() == this && m.getWinner() == p) { continue playerLoop; } } return false; } } return true; } public int getRoundDropped(IATournament t) { for (int i = t.getAllRounds().size(); i > 0; i--) { boolean found = false; IARound r = t.getAllRounds().get(i - 1); for (IAMatch m : r.getMatches()) { if (m.getPlayer1() == this) { found = true; break; } else if (m.isBye() == false && m.getPlayer2() == this) { found = true; break; } } if (found) { return i + 1; } } return 0; } public String getName() { return getPlayer().getName(); } // public static class RankingComparator extends // TournamentComparator<IAPlayer> { // // private final IATournament t; // // public RankingComparator(IATournament t) { // this.t = t; // } // // @Override // public int compare(IAPlayer o1, IAPlayer o2) { // // int result = compareInt(o1.getScore(t), o2.getScore(t)); // // if (result == 0) { // result = compareDouble(o1.getAverageSoS(t), o2.getAverageSoS(t)); // } // // if (result == 0) { // result = compareDouble(o1.getExtendedStrengthOfSchedule(t), // o2.getExtendedStrengthOfSchedule(t)); // } // // if (result == 0) { // String seedValue1 = o1.getSeedValue(); // String seedValue2 = o2.getSeedValue(); // // try { // Double d1 = Double.valueOf(seedValue1); // Double d2 = Double.valueOf(seedValue2); // // result = d1.compareTo(d2); // } catch (NumberFormatException e) { // result = seedValue1.compareTo(seedValue2); // } // } // // return result; // } // } // public static class PairingComparator extends // TournamentComparator<IAPlayer> { // // private final IATournament t; // // public PairingComparator(IATournament t) { // this.t = t; // } // // @Override // public int compare(IAPlayer o1, IAPlayer o2) { // // int result = compareInt(o1.getScore(t), o2.getScore(t)); // // if (result == 0) { // result = compareDouble(o1.getAverageSoS(t), o2.getAverageSoS(t)); // } // // if (result == 0) { // result = compareDouble(o1.getExtendedStrengthOfSchedule(t), // o2.getExtendedStrengthOfSchedule(t)); // } // // if (result == 0) { // String seedValue1 = o1.getSeedValue(); // String seedValue2 = o2.getSeedValue(); // // try { // Double d1 = Double.valueOf(seedValue1); // Double d2 = Double.valueOf(seedValue2); // // result = d1.compareTo(d2); // } catch (NumberFormatException e) { // result = seedValue1.compareTo(seedValue2); // } // } // // return result; // } // } @Override public String getModuleName() { return Modules.IA.getName(); } public String toXML() { StringBuilder sb = new StringBuilder(); appendXML(sb); return sb.toString(); } @Override public StringBuilder appendXML(StringBuilder sb) { XMLUtils.appendObject(sb, "MODULE", Modules.IA.getName()); XMLUtils.appendObject(sb, "SEEDVALUE", getSeedValue()); XMLUtils.appendObject(sb, "FIRSTROUNDBYE", isFirstRoundBye()); XMLUtils.appendObject(sb, "SQUADID", getSquadId()); return sb; } @Override public int compareTo(ModulePlayer arg0) { return this.getPlayer().getName().toUpperCase() .compareTo(arg0.getPlayer().getName().toUpperCase()); } }