diff --git a/.gitattributes b/.gitattributes index 1dc26b1641f..1380125f9f8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -20860,6 +20860,7 @@ forge-gui/src/main/java/forge/achievement/Overkill.java -text forge-gui/src/main/java/forge/achievement/PlaneswalkerAchievements.java -text forge-gui/src/main/java/forge/achievement/Poisoned.java -text forge-gui/src/main/java/forge/achievement/ProgressiveAchievement.java -text +forge-gui/src/main/java/forge/achievement/PuzzleAchievements.java -text forge-gui/src/main/java/forge/achievement/QuestAchievements.java -text forge-gui/src/main/java/forge/achievement/RagsToRiches.java -text forge-gui/src/main/java/forge/achievement/SealedAchievements.java -text @@ -20867,6 +20868,7 @@ forge-gui/src/main/java/forge/achievement/StormChaser.java -text forge-gui/src/main/java/forge/achievement/StreakAchievement.java -text forge-gui/src/main/java/forge/achievement/TotalGameWins.java -text forge-gui/src/main/java/forge/achievement/TotalMatchWins.java -text +forge-gui/src/main/java/forge/achievement/TotalPuzzlesSolved.java -text forge-gui/src/main/java/forge/achievement/VariantWins.java -text forge-gui/src/main/java/forge/assets/FSkinProp.java -text forge-gui/src/main/java/forge/assets/IHasSkinProp.java -text diff --git a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java index 21f9112ba39..9ae5ca7068c 100644 --- a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java +++ b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java @@ -39,7 +39,7 @@ public abstract class AchievementCollection implements Iterable { //don't update achievements if player cheated during game if (controller.hasCheated()) { return; - } + } final Game game = controller.getGame(); final Player player = controller.getPlayer(); @@ -70,6 +70,7 @@ public abstract class AchievementCollection implements Iterable { cb.addItem(FModel.getAchievements(GameType.Draft)); cb.addItem(FModel.getAchievements(GameType.Sealed)); cb.addItem(FModel.getAchievements(GameType.Quest)); + cb.addItem(FModel.getAchievements(GameType.Puzzle)); cb.addItem(AltWinAchievements.instance); cb.addItem(PlaneswalkerAchievements.instance); cb.addItem(ChallengeAchievements.instance); diff --git a/forge-gui/src/main/java/forge/achievement/PuzzleAchievements.java b/forge-gui/src/main/java/forge/achievement/PuzzleAchievements.java new file mode 100644 index 00000000000..ef5eac42ecb --- /dev/null +++ b/forge-gui/src/main/java/forge/achievement/PuzzleAchievements.java @@ -0,0 +1,22 @@ +package forge.achievement; + +import forge.properties.ForgeConstants; + +public class PuzzleAchievements extends AchievementCollection { + public PuzzleAchievements() { + super("Puzzle Mode", ForgeConstants.ACHIEVEMENTS_DIR + "puzzle.xml", false); + } + + @Override + protected void addSharedAchivements() { + //prevent including shared achievements + } + + @Override + protected void addAchievements() { + // TODO: ideally there should be dynamically generated achievements for solving each + // available puzzle. + + add(new TotalPuzzlesSolved(1, 10, 25, 50)); + } +} \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/achievement/TotalPuzzlesSolved.java b/forge-gui/src/main/java/forge/achievement/TotalPuzzlesSolved.java new file mode 100644 index 00000000000..56d5f202d8e --- /dev/null +++ b/forge-gui/src/main/java/forge/achievement/TotalPuzzlesSolved.java @@ -0,0 +1,25 @@ +package forge.achievement; + +import forge.game.Game; +import forge.game.player.Player; + +public class TotalPuzzlesSolved extends ProgressiveAchievement { + public TotalPuzzlesSolved(int bronze0, int silver0, int gold0, int mythic0) { + super("TotalPuzzlesSolved", "Total Puzzles Solved", null, + String.format(bronze0 == 1 ? "Solve a puzzle" : "Solve %d puzzles", bronze0), bronze0, + String.format("Solve %d puzzles", silver0), silver0, + String.format("Solve %d puzzles", gold0), gold0, + String.format("Solve %d puzzles", mythic0), mythic0); + } + + @Override + protected boolean eval(Player player, Game game) { + return game.getMatch().isMatchOver() && game.getMatch().isWonBy(player.getLobbyPlayer()); + } + + @Override + protected String getNoun() { + return "Puzzle"; + } +} + diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index c16828138c5..7037460065c 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -207,6 +207,7 @@ public final class FModel { achievements.put(GameType.Draft, new DraftAchievements()); achievements.put(GameType.Sealed, new SealedAchievements()); achievements.put(GameType.Quest, new QuestAchievements()); + achievements.put(GameType.Puzzle, new PuzzleAchievements()); //preload AI profiles AiProfileUtil.loadAllProfiles(ForgeConstants.AI_PROFILE_DIR); @@ -288,6 +289,7 @@ public final class FModel { case Draft: case Sealed: case Quest: + case Puzzle: break; case QuestDraft: gameType = GameType.Quest;