package tc.oc.pgm.goals; import java.util.Collection; import java.util.Map; import com.google.common.collect.Multimap; import tc.oc.pgm.match.Competitor; import tc.oc.pgm.match.Match; import tc.oc.pgm.victory.AbstractVictoryCondition; // TODO: Break this down into multiple chainable conditions i.e. completions, touches, proximity, etc. public class GoalsVictoryCondition extends AbstractVictoryCondition { private final Multimap<Competitor, Goal> goalsByCompetitor; public GoalsVictoryCondition(Multimap<Competitor, Goal> goalsByCompetitor) { super(Priority.GOALS, new GoalsMatchResult()); this.goalsByCompetitor = goalsByCompetitor; } @Override public boolean isCompleted() { competitors: for(Map.Entry<Competitor, Collection<Goal>> entry : goalsByCompetitor.asMap().entrySet()) { boolean someRequired = false; for(Goal<?> goal : entry.getValue()) { if(goal.isRequired()) { // If any required goals are incomplete, skip to the next competitor if(!goal.isCompleted(entry.getKey())) continue competitors; someRequired = true; } } // If some goals are required, and they are all complete, competitor wins the match if(someRequired) return true; } // If no competitors won, match is not over return false; } }