package org.mafagafogigante.dungeon.stats;
import org.mafagafogigante.dungeon.game.Id;
import org.mafagafogigante.dungeon.game.Point;
import java.io.Serializable;
import java.util.HashMap;
/**
* ExplorationStatistics class that tracks the Hero's exploration progress.
*/
public class ExplorationStatistics implements Serializable {
private final HashMap<Point, ExplorationStatisticsEntry> entries;
public ExplorationStatistics() {
this.entries = new HashMap<>();
}
/**
* Creates an ExplorationStatisticsEntry for a Point if one does not exist yet. Should be called whenever the Hero
* sees a Point, as the current criteria for "seen" locations on the in-game map is having an Entry in the
* ExplorationStatistics.
*
* @param point the Point object
* @param locationId the ID of the Location at the specified Point
*/
public void createEntryIfNotExists(Point point, Id locationId) {
if (!hasBeenSeen(point)) {
entries.put(point, new ExplorationStatisticsEntry(locationId));
}
}
/**
* Records a visit to a specified Point.
*
* @param point the visited Point
*/
public void addVisit(Point point, Id locationId) {
createEntryIfNotExists(point, locationId);
entries.get(point).addVisit();
}
/**
* Records a kill in a specified Point.
*
* @param point the Point where the Hero just killed something
*/
public void addKill(Point point) {
// Don't call createEntryIfNotExists as the player needs to visit a Point before killing anything in it.
entries.get(point).addKill();
}
/**
* Returns whether or not a specific Point has already been seen by the Hero.
*
* @param point a Point object
* @return true if the Hero visited this Point at least once
*/
public boolean hasBeenSeen(Point point) {
return entries.containsKey(point);
}
/**
* Returns how many Locations with the specified Id the Hero visited.
*
* @param locationId the Id of the Locations
* @return a nonnegative integer
*/
public int getVisitedLocations(Id locationId) {
int count = 0;
for (ExplorationStatisticsEntry entry : entries.values()) {
if (entry.getLocationId().equals(locationId) && entry.getVisitCount() > 0) {
count++;
}
}
return count;
}
/**
* Returns how many Creatures the Hero killed in Locations with a specified ID.
*
* @param locationId the ID of the Locations
* @return a nonnegative integer
*/
public int getKillCount(Id locationId) {
int count = 0;
for (ExplorationStatisticsEntry entry : entries.values()) {
if (entry.getLocationId().equals(locationId)) {
count += entry.getKillCount();
}
}
return count;
}
/**
* Returns the maximum number of visits for any Location with a specified ID so far.
*
* @param locationId the ID of the Locations
* @return a nonnegative integer
*/
public int getMaximumNumberOfVisits(Id locationId) {
int maximumVisitsToLocationWithThisId = 0;
for (ExplorationStatisticsEntry entry : entries.values()) {
if (entry.getLocationId().equals(locationId)) {
if (entry.getVisitCount() > maximumVisitsToLocationWithThisId) {
maximumVisitsToLocationWithThisId = entry.getVisitCount();
}
}
}
return maximumVisitsToLocationWithThisId;
}
}