package org.mafagafogigante.dungeon.stats;
import org.mafagafogigante.dungeon.achievements.BattleStatisticsRequirement;
import org.mafagafogigante.dungeon.entity.creatures.Creature;
import org.mafagafogigante.dungeon.game.PartOfDay;
import org.mafagafogigante.dungeon.util.CounterMap;
import org.jetbrains.annotations.NotNull;
import java.io.Serializable;
/**
* BattleStatistics class that stores battle statistics to enable achievements.
*/
public class BattleStatistics implements Serializable {
private final CounterMap<BattleRecord> records = new CounterMap<>();
/**
* Adds the outcome of a battle to the statistics.
*
* @param foe the defeated Creature, not null
* @param causeOfDeath the CauseOfDeath, not null
* @param partOfDay the PartOfDay in which the last hit took place, not null
*/
public void addBattle(@NotNull Creature foe, @NotNull CauseOfDeath causeOfDeath, @NotNull PartOfDay partOfDay) {
BattleRecord record = new BattleRecord(foe.getId(), foe.getType(), causeOfDeath, partOfDay);
records.incrementCounter(record);
}
/**
* Returns a CounterMap of CauseOfDeath representing how many times each CauseOfDeath already registered occurred.
*/
public CounterMap<CauseOfDeath> getKillsByCauseOfDeath() {
CounterMap<CauseOfDeath> causeOfDeathCounterMap = new CounterMap<>();
for (BattleRecord record : records.keySet()) {
causeOfDeathCounterMap.incrementCounter(record.getCauseOfDeath(), records.getCounter(record));
}
return causeOfDeathCounterMap;
}
/**
* Evaluates if this BattleStatistics satisfies a BattleStatisticsRequirement.
*/
public boolean satisfies(BattleStatisticsRequirement requirement) {
int count = 0;
for (BattleRecord record : records.keySet()) {
if (requirement.getQuery().matches(record)) {
count += records.getCounter(record);
if (count >= requirement.getCount()) {
return true;
}
}
}
return false;
}
@Override
public String toString() {
return String.format("BattleStatistics{records=%s}", records);
}
}