package org.mafagafogigante.dungeon.achievements;
import org.mafagafogigante.dungeon.game.Id;
import org.mafagafogigante.dungeon.stats.ExplorationStatistics;
import org.mafagafogigante.dungeon.util.CounterMap;
/**
* The exploration component of an achievement.
*/
final class ExplorationComponent {
/**
* Stores how many kills in Locations with a specified ID the Hero must have.
*/
private final CounterMap<Id> killsByLocationId;
/**
* Stores how many distinct Locations with a specified ID the Hero must visit.
*/
private final CounterMap<Id> visitedLocations;
/**
* Stores how many times the Hero must visit the same Location with a specified ID.
*/
private final CounterMap<Id> maximumNumberOfVisits;
ExplorationComponent(CounterMap<Id> killsByLocationId, CounterMap<Id> visitedLocations,
CounterMap<Id> maximumNumberOfVisits) {
this.killsByLocationId = killsByLocationId;
this.visitedLocations = visitedLocations;
this.maximumNumberOfVisits = maximumNumberOfVisits;
}
/**
* Checks if this component of the Achievement is fulfilled or not.
*/
public boolean isFulfilled(ExplorationStatistics explorationStatistics) {
if (killsByLocationId != null) {
for (Id locationId : killsByLocationId.keySet()) {
if (explorationStatistics.getKillCount(locationId) < killsByLocationId.getCounter(locationId)) {
return false;
}
}
}
if (visitedLocations != null) {
for (Id locationId : visitedLocations.keySet()) {
if (explorationStatistics.getVisitedLocations(locationId) < visitedLocations.getCounter(locationId)) {
return false;
}
}
}
if (maximumNumberOfVisits != null) {
for (Id locationId : maximumNumberOfVisits.keySet()) {
if (explorationStatistics.getMaximumNumberOfVisits(locationId) < maximumNumberOfVisits.getCounter(locationId)) {
return false;
}
}
}
return true;
}
}