package org.mafagafogigante.dungeon.achievements;
import org.mafagafogigante.dungeon.achievements.comparators.UnlockedAchievementComparators;
import org.mafagafogigante.dungeon.date.Date;
import org.mafagafogigante.dungeon.date.Duration;
import org.mafagafogigante.dungeon.game.DungeonString;
import org.mafagafogigante.dungeon.game.Game;
import org.mafagafogigante.dungeon.io.Writer;
import java.awt.Color;
import java.util.Comparator;
import java.util.List;
/**
* A class that parses IssuedCommands for writing unlocked achievements to the screen.
*/
public class AchievementTrackerWriter {
/**
* Parses an issued command that makes the game write to the screen all achievements the Hero has unlocked so far.
*/
public static void parseCommand(String[] arguments) {
Comparator<UnlockedAchievement> comparator = getComparator(arguments);
if (comparator != null) {
AchievementTracker achievementTracker = Game.getGameState().getHero().getAchievementTracker();
writeAchievementTracker(achievementTracker, comparator);
} else {
writeValidOrderings();
}
}
/**
* Parses an IssuedCommand trying to identify the specified ordering for the achievements. If nothing is specified,
* the default comparator is returned. If an ordering specification is invalid ("by" followed by an unrecognized
* ordering), this method returns null.
*
* @return a Comparator of UnlockedAchievements, or null
*/
private static Comparator<UnlockedAchievement> getComparator(String[] arguments) {
if (arguments.length > 0 && arguments[0].equalsIgnoreCase("by")) {
for (String comparatorName : UnlockedAchievementComparators.getComparatorMap().keySet()) {
if (arguments[1].equalsIgnoreCase(comparatorName)) {
return UnlockedAchievementComparators.getComparatorMap().get(comparatorName);
}
}
return null;
} else {
return UnlockedAchievementComparators.getDefaultComparator();
}
}
/**
* Writes an AchievementTracker UnlockedAchievements to the screen after sorting it with the specified Comparator.
*
* @param tracker the AchievementTracker, not null
* @param comparator the Comparator, not null
*/
private static void writeAchievementTracker(AchievementTracker tracker, Comparator<UnlockedAchievement> comparator) {
List<UnlockedAchievement> unlockedAchievements = tracker.getUnlockedAchievements(comparator);
Date now = Game.getGameState().getWorld().getWorldDate();
DungeonString string = new DungeonString();
for (UnlockedAchievement unlockedAchievement : unlockedAchievements) {
Duration sinceUnlock = new Duration(unlockedAchievement.getDate(), now);
string.setColor(Color.ORANGE);
string.append(String.format("%s (%s ago)%n", unlockedAchievement.getName(), sinceUnlock));
string.setColor(Color.YELLOW);
string.append(String.format(" %s%n", unlockedAchievement.getInfo()));
}
int total = AchievementStoreFactory.getDefaultStore().getAchievements().size();
string.setColor(Color.CYAN);
string.append(String.format("Progress: %d/%d", tracker.getUnlockedCount(), total));
Writer.write(string);
}
/**
* Writes a listing of valid UnlockedAchievement orderings to the screen.
*/
private static void writeValidOrderings() {
Writer.write("Valid orderings:");
for (String comparatorName : UnlockedAchievementComparators.getComparatorMap().keySet()) {
Writer.write(" " + comparatorName);
}
}
}