ProjectAres/Tourney/src/net/anxuiz/tourney/KDMSession.java

73 lines
2.2 KiB
Java

package net.anxuiz.tourney;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
import javax.inject.Inject;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import tc.oc.api.docs.Entrant;
import tc.oc.pgm.map.PGMMap;
import tc.oc.pgm.match.Match;
/** Represents a best-two-out-of-three KotH or TDM session. */
public class KDMSession {
private final Tourney tourney;
private final PGMMap map;
private final HashMap<String, Entrant> winnerStore = new HashMap<>(3);
private final Set<Entrant> entrants;
@Inject KDMSession(TeamManager teamManager, Tourney tourney, PGMMap map) {
this.tourney = tourney;
this.map = map;
this.entrants = teamManager.getEntrants();
}
public Set<Entrant> getEntrants() {
return entrants;
}
public PGMMap getMap() {
return this.map;
}
/**
* Attempts to calculate the winner, returning either the winning {@link Entrant},
* or <code>null</code>, if the winner can not yet be determined. Optionally records the winning match.
*
* @return The winning {@link Entrant}, or <code>null</code>, if the winner
* can not yet be determined.
*/
public @Nullable Entrant calculateWinner() {
HashMap<Entrant, Integer> wins = new HashMap<>();
for (Map.Entry<String, Entrant> match : this.winnerStore.entrySet()) {
Entrant winner = match.getValue();
if (winner != null) {
int winCount = Optional.fromNullable(wins.get(winner)).or(0) + 1;
wins.put(winner, winCount);
if (winCount > 1) {
tourney.recordMatch(match.getKey());
return winner;
}
}
}
if (this.getMatchesPlayed() > 2) tourney.recordMatch(this.winnerStore.keySet().iterator().next());
return null;
}
public int getMatchesPlayed() {
return this.winnerStore.size();
}
public void appendMatch(Match match, Entrant winner) {
if (!this.winnerStore.containsKey(Preconditions.checkNotNull(match.getId(), "Match"))) {
this.winnerStore.put(match.getId(), winner);
}
}
}