From 7270a02e76a0bc111b02f734be042c24810d3aaf Mon Sep 17 00:00:00 2001 From: Nathan Bouchard Date: Thu, 5 Feb 2026 14:51:29 -0500 Subject: [PATCH 1/6] Write the achievement in file when they are done --- achievements.properties | 4 ++ .../achievements/Achievement.java | 19 +++++- .../achievements/AchievementManager.java | 17 +++-- .../achievements/KillCountAchievement.java | 25 +++---- .../utils/AchievementProvider.java | 67 +++++++++++++++++++ 5 files changed, 109 insertions(+), 23 deletions(-) create mode 100644 achievements.properties create mode 100644 src/main/java/com/dinosaur/dinosaurexploder/utils/AchievementProvider.java diff --git a/achievements.properties b/achievements.properties new file mode 100644 index 00000000..31434772 --- /dev/null +++ b/achievements.properties @@ -0,0 +1,4 @@ +#store properties +#Thu Feb 05 14:45:23 EST 2026 +achievement10Kill=true +achievement20Kill=true diff --git a/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java b/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java index f798d4e3..efaa98c1 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java @@ -1,14 +1,31 @@ package com.dinosaur.dinosaurexploder.achievements; +import com.almasb.fxgl.dsl.FXGL; + public abstract class Achievement { protected boolean completed = false; + protected String fileName; + protected int rewardCoins; + public boolean isCompleted() { return completed; } + public String getFileName() { + return fileName; + } + + public void onComplete(String description) { + FXGL.getNotificationService().pushNotification("Achievement unlocked: " + description); + } + + public int getRewardCoins() { + return rewardCoins; + } + public abstract void update(double tpf); - public abstract void onDinosaurKilled(); + public abstract Boolean onDinosaurKilled(); } diff --git a/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java b/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java index 4fa41379..4f46c714 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java @@ -1,26 +1,30 @@ package com.dinosaur.dinosaurexploder.achievements; +import com.dinosaur.dinosaurexploder.utils.AchievementProvider; + import java.util.ArrayList; import java.util.Collections; import java.util.List; public class AchievementManager { + //private final Achievement achievement = AchievementProvider.loadSettings(); private final List allAchievements = new ArrayList<>(); private final List activeAchievements = new ArrayList<>(); public AchievementManager() { // Register all available achievements here - allAchievements.add(new KillCountAchievement(10, 50)); - allAchievements.add(new KillCountAchievement(20, 100)); + allAchievements.add(new KillCountAchievement(1, 50,"achievement10Kill")); + allAchievements.add(new KillCountAchievement(2, 100,"achievement20Kill")); } // Called once when the game starts public void init() { if (allAchievements.isEmpty()) return; + AchievementProvider.loadAchievements(allAchievements); + + activeAchievements.addAll(allAchievements); - Collections.shuffle(allAchievements); - activeAchievements.add(allAchievements.get(0)); } // Called every frame @@ -35,7 +39,10 @@ public void update(double tpf) { // Called when a dinosaur is killed public void notifyDinosaurKilled() { for (Achievement achievement : activeAchievements) { - achievement.onDinosaurKilled(); + Boolean complete = achievement.onDinosaurKilled(); + if (complete) { + AchievementProvider.saveAchivement(achievement); + } } } diff --git a/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java b/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java index ebfe2a71..28fb4138 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java @@ -1,37 +1,34 @@ package com.dinosaur.dinosaurexploder.achievements; import com.almasb.fxgl.dsl.FXGL; +import com.dinosaur.dinosaurexploder.utils.AchievementProvider; public class KillCountAchievement extends Achievement { private final int targetKills; - private final int rewardCoins; - private int currentKills = 0; - private boolean completed = false; - public KillCountAchievement(int targetKills, int rewardCoins) { + public KillCountAchievement(int targetKills, int rewardCoins,String fileName) { this.targetKills = targetKills; this.rewardCoins = rewardCoins; + this.fileName = fileName; } public String getDescription() { return "Kill " + targetKills + " dinosaurs"; } - public boolean isCompleted() { - return completed; - } - - public void onDinosaurKilled() { - if (completed) return; + public Boolean onDinosaurKilled() { + if (completed) return(true); currentKills++; if (currentKills >= targetKills) { completed = true; - onComplete(); + onComplete(getDescription()); + return(true); } + return(false); } @Override @@ -39,11 +36,5 @@ public void update(double tpf) { // Not needed for count-based achievement } - public void onComplete() { - FXGL.getNotificationService().pushNotification("Achievement unlocked: " + getDescription()); - } - public int getRewardCoins() { - return rewardCoins; - } } diff --git a/src/main/java/com/dinosaur/dinosaurexploder/utils/AchievementProvider.java b/src/main/java/com/dinosaur/dinosaurexploder/utils/AchievementProvider.java new file mode 100644 index 00000000..f3b46bd1 --- /dev/null +++ b/src/main/java/com/dinosaur/dinosaurexploder/utils/AchievementProvider.java @@ -0,0 +1,67 @@ +package com.dinosaur.dinosaurexploder.utils; + +import com.dinosaur.dinosaurexploder.achievements.Achievement; +import org.jetbrains.annotations.NotNull; + +import java.io.FileInputStream; +import java.io.FileWriter; +import java.util.*; + +/// This class is responsible for getting and saving the achievement in the achievements +/// .properties file + +public class AchievementProvider { + + public static final String ACHIVEMENT_FILE = "achievements.properties"; + + + public static Properties loadProperties() { + Properties properties = new Properties(); + + try { + FileInputStream in = new FileInputStream(ACHIVEMENT_FILE); + properties.load(in); + in.close(); + } catch (Exception ex) { + return null; + + } + return properties; + } + + + public static void loadAchievements(List allAchievements) { + List achievementsNotDone = new ArrayList(); + Properties properties = loadProperties(); + assert properties != null; + properties.forEach((AchivementFilename, IsComplete)->{ + for (Achievement achievement : allAchievements) { + if (achievement.getFileName() == AchivementFilename){ + achievementsNotDone.add(achievement); + } + } + }); + for (Achievement achivement : achievementsNotDone) { + System.out.println("achievement :" + achivement.getFileName()); + } + } + + + + + public static void saveAchivement(Achievement achievement) { + Properties properties = loadProperties(); + if (properties.contains(achievement.getFileName())) + { + properties.setProperty(achievement.getFileName(), String.valueOf(achievement.isCompleted())); + }else { + properties.put(achievement.getFileName(),String.valueOf(achievement.isCompleted())); + } + + try (FileWriter writer = new FileWriter(ACHIVEMENT_FILE)) { + properties.store(writer, "store properties"); + } catch (Exception ex) { + System.err.println("Error saving settings " + ex.getMessage()); + } + } +} From b031ed95d166711d3ccdbc8002296e4144fc4466 Mon Sep 17 00:00:00 2001 From: Nathan Bouchard Date: Thu, 12 Feb 2026 08:58:30 -0500 Subject: [PATCH 2/6] Make achievement complete between game but not progression --- achievements.properties | 4 -- achievements.ser | Bin 0 -> 332 bytes .../achievements/Achievement.java | 8 +-- .../achievements/AchievementManager.java | 53 +++++++++++--- .../achievements/KillCountAchievement.java | 5 +- .../constants/GameConstants.java | 1 + .../utils/AchievementProvider.java | 67 ------------------ 7 files changed, 48 insertions(+), 90 deletions(-) delete mode 100644 achievements.properties create mode 100644 achievements.ser delete mode 100644 src/main/java/com/dinosaur/dinosaurexploder/utils/AchievementProvider.java diff --git a/achievements.properties b/achievements.properties deleted file mode 100644 index 31434772..00000000 --- a/achievements.properties +++ /dev/null @@ -1,4 +0,0 @@ -#store properties -#Thu Feb 05 14:45:23 EST 2026 -achievement10Kill=true -achievement20Kill=true diff --git a/achievements.ser b/achievements.ser new file mode 100644 index 0000000000000000000000000000000000000000..f1033c4a06b2f7351db3c8bf17bd63bdf18a56c7 GIT binary patch literal 332 zcmZ4UmVvdnh(S0ju`E%qv?Mb}&#|Z|vC=2AxTK=-lI+amiF2757(E$SiZiQHD+(AG z7+A_#KqOF;eR6)TUP@+OesN-H5u5>3m6M;6TBMhloROJYmYSQIS5mC!otcy4oL`z( z;)oEPTXMj86Ki@p69bbc15a{kQ4vrnNMW%j19wScQF allAchievements = new ArrayList<>(); private final List activeAchievements = new ArrayList<>(); + public AchievementManager() { // Register all available achievements here - allAchievements.add(new KillCountAchievement(1, 50,"achievement10Kill")); - allAchievements.add(new KillCountAchievement(2, 100,"achievement20Kill")); + allAchievements.add(new KillCountAchievement(1, 50)); + allAchievements.add(new KillCountAchievement(2, 50)); + allAchievements.add(new KillCountAchievement(10, 50)); + allAchievements.add(new KillCountAchievement(20, 100)); } // Called once when the game starts public void init() { if (allAchievements.isEmpty()) return; - AchievementProvider.loadAchievements(allAchievements); - - activeAchievements.addAll(allAchievements); + activeAchievements.addAll(loadAchievement()); + if (activeAchievements.isEmpty()) + { + saveAchievement(allAchievements); + activeAchievements.addAll(allAchievements); + }else{ + if (activeAchievements.size() achievementStore = loadAchievement(); + achievementStore.add(achievement); + saveAchievement(activeAchievements); } } } @@ -56,4 +67,26 @@ public Achievement getActiveAchievement() { } return activeAchievements.get(0); } + + + private List loadAchievement() { + List achievementFromFile = new ArrayList<>(); + try (ObjectInputStream in = + new ObjectInputStream(new FileInputStream(GameConstants.ACHIEVEMENTS_FILE))) { + achievementFromFile= (List) in.readObject(); + } catch (IOException | ClassNotFoundException e) { + System.out.println("Failed to load achievements from file"); + } + return achievementFromFile; + } + + private void saveAchievement(List listToSave) { + try (ObjectOutputStream out = + new ObjectOutputStream(new FileOutputStream(GameConstants.ACHIEVEMENTS_FILE))) { + out.writeObject(listToSave); + } catch (IOException e) { + System.err.println("Error saving achievement : " + e.getMessage()); + } + } + } diff --git a/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java b/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java index 28fb4138..ac979dad 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java @@ -1,17 +1,14 @@ package com.dinosaur.dinosaurexploder.achievements; -import com.almasb.fxgl.dsl.FXGL; -import com.dinosaur.dinosaurexploder.utils.AchievementProvider; public class KillCountAchievement extends Achievement { private final int targetKills; private int currentKills = 0; - public KillCountAchievement(int targetKills, int rewardCoins,String fileName) { + public KillCountAchievement(int targetKills, int rewardCoins) { this.targetKills = targetKills; this.rewardCoins = rewardCoins; - this.fileName = fileName; } public String getDescription() { diff --git a/src/main/java/com/dinosaur/dinosaurexploder/constants/GameConstants.java b/src/main/java/com/dinosaur/dinosaurexploder/constants/GameConstants.java index e23fc73c..eb8c2bf5 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/constants/GameConstants.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/constants/GameConstants.java @@ -60,6 +60,7 @@ private GameConstants() {} */ public static final String HIGH_SCORE_FILE = "highScore.ser"; public static final String TOTAL_COINS_FILE = "totalCoins.ser"; + public static final String ACHIEVEMENTS_FILE = "achievements.ser"; /* * CONSTANTS FOR TEXT diff --git a/src/main/java/com/dinosaur/dinosaurexploder/utils/AchievementProvider.java b/src/main/java/com/dinosaur/dinosaurexploder/utils/AchievementProvider.java deleted file mode 100644 index f3b46bd1..00000000 --- a/src/main/java/com/dinosaur/dinosaurexploder/utils/AchievementProvider.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.dinosaur.dinosaurexploder.utils; - -import com.dinosaur.dinosaurexploder.achievements.Achievement; -import org.jetbrains.annotations.NotNull; - -import java.io.FileInputStream; -import java.io.FileWriter; -import java.util.*; - -/// This class is responsible for getting and saving the achievement in the achievements -/// .properties file - -public class AchievementProvider { - - public static final String ACHIVEMENT_FILE = "achievements.properties"; - - - public static Properties loadProperties() { - Properties properties = new Properties(); - - try { - FileInputStream in = new FileInputStream(ACHIVEMENT_FILE); - properties.load(in); - in.close(); - } catch (Exception ex) { - return null; - - } - return properties; - } - - - public static void loadAchievements(List allAchievements) { - List achievementsNotDone = new ArrayList(); - Properties properties = loadProperties(); - assert properties != null; - properties.forEach((AchivementFilename, IsComplete)->{ - for (Achievement achievement : allAchievements) { - if (achievement.getFileName() == AchivementFilename){ - achievementsNotDone.add(achievement); - } - } - }); - for (Achievement achivement : achievementsNotDone) { - System.out.println("achievement :" + achivement.getFileName()); - } - } - - - - - public static void saveAchivement(Achievement achievement) { - Properties properties = loadProperties(); - if (properties.contains(achievement.getFileName())) - { - properties.setProperty(achievement.getFileName(), String.valueOf(achievement.isCompleted())); - }else { - properties.put(achievement.getFileName(),String.valueOf(achievement.isCompleted())); - } - - try (FileWriter writer = new FileWriter(ACHIVEMENT_FILE)) { - properties.store(writer, "store properties"); - } catch (Exception ex) { - System.err.println("Error saving settings " + ex.getMessage()); - } - } -} From 52a432f90f6e84ab2de24ce783a2d828d813019c Mon Sep 17 00:00:00 2001 From: Nathan Bouchard Date: Thu, 12 Feb 2026 10:48:58 -0500 Subject: [PATCH 3/6] Register achievement progression at each dino kill --- achievements.ser | Bin 332 -> 389 bytes .../achievements/AchievementManager.java | 16 ++++------------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/achievements.ser b/achievements.ser index f1033c4a06b2f7351db3c8bf17bd63bdf18a56c7..8f8439fb4747bd440b1a78e8697c526e32f93f54 100644 GIT binary patch delta 98 zcmX@Z)XF@;h@HKhg@J*AeWIl^$IJieT~B?cwM}f9BgX|4 achievementStore = loadAchievement(); - achievementStore.add(achievement); - saveAchievement(activeAchievements); - } } + saveAchievement(activeAchievements); + } public List getActiveAchievements() { @@ -68,7 +60,7 @@ public Achievement getActiveAchievement() { return activeAchievements.get(0); } - +///Get the list of achievement save in the achievement.ser file private List loadAchievement() { List achievementFromFile = new ArrayList<>(); try (ObjectInputStream in = @@ -80,6 +72,7 @@ private List loadAchievement() { return achievementFromFile; } + /// Save activeAchievement in the achievement.ser file private void saveAchievement(List listToSave) { try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(GameConstants.ACHIEVEMENTS_FILE))) { @@ -88,5 +81,4 @@ private void saveAchievement(List listToSave) { System.err.println("Error saving achievement : " + e.getMessage()); } } - } From 8f8d9403b56c284fe9053f1a2c0f86fc5ce38e26 Mon Sep 17 00:00:00 2001 From: Nathan Bouchard Date: Thu, 12 Feb 2026 13:43:26 -0500 Subject: [PATCH 4/6] Making a test to save achievement in file --- achievements.ser | Bin 389 -> 332 bytes .../achievements/AchievementManager.java | 7 ++- .../achievements/AchievementTest.java | 43 ++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java diff --git a/achievements.ser b/achievements.ser index 8f8439fb4747bd440b1a78e8697c526e32f93f54..399c567e3d0fe8287f5d4569809fff364bd63b52 100644 GIT binary patch delta 48 zcmZo=KEpJ@h@GXJg@J*AWum1s$J~+w&YM`%(;=Ca73IH7E5BC57 diff --git a/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java b/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java index dbb5c536..f68145e9 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java @@ -22,7 +22,6 @@ public AchievementManager() { // Called once when the game starts public void init() { if (allAchievements.isEmpty()) return; - activeAchievements.addAll(loadAchievement()); if (activeAchievements.isEmpty()) { @@ -57,11 +56,11 @@ public Achievement getActiveAchievement() { if (activeAchievements.isEmpty()) { return null; } - return activeAchievements.get(0); + return activeAchievements.getFirst(); } ///Get the list of achievement save in the achievement.ser file - private List loadAchievement() { + public List loadAchievement() { List achievementFromFile = new ArrayList<>(); try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(GameConstants.ACHIEVEMENTS_FILE))) { @@ -73,7 +72,7 @@ private List loadAchievement() { } /// Save activeAchievement in the achievement.ser file - private void saveAchievement(List listToSave) { + public void saveAchievement(List listToSave) { try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(GameConstants.ACHIEVEMENTS_FILE))) { out.writeObject(listToSave); diff --git a/src/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java b/src/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java new file mode 100644 index 00000000..f1eb395c --- /dev/null +++ b/src/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java @@ -0,0 +1,43 @@ +package com.dinosaur.dinosaurexploder.achievements; + +import com.dinosaur.dinosaurexploder.utils.LevelManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + + +public class AchievementTest { + + private LevelManager levelManager; + private List currentAchievement = new ArrayList<>(); + AchievementManager achievementManager = new AchievementManager(); + + @BeforeEach + void setUp() { + + List emptyList = new ArrayList<>(); + currentAchievement = achievementManager.loadAchievement(); + achievementManager.saveAchievement(emptyList); + achievementManager.init(); + + } + + @Test + void achievementSaveInFile() { + List listToCheck; + + achievementManager.getActiveAchievement().completed = true; + achievementManager.saveAchievement(achievementManager.getActiveAchievements()); + listToCheck = achievementManager.loadAchievement(); + assert listToCheck.getFirst().isCompleted(); + } + + @AfterEach + void setAchievementBack() { + + achievementManager.saveAchievement(currentAchievement); + } +} From ee873075887be6f6881297d6acc226189b7e5d69 Mon Sep 17 00:00:00 2001 From: Nathan84625 <159084022+Nathan84625@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:03:55 -0500 Subject: [PATCH 5/6] Update src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../com/dinosaur/dinosaurexploder/achievements/Achievement.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java b/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java index 81b1871e..d51ddcb5 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java @@ -1,7 +1,6 @@ package com.dinosaur.dinosaurexploder.achievements; import com.almasb.fxgl.dsl.FXGL; - import java.io.Serializable; public abstract class Achievement implements Serializable { From 68a73a4abc9dab4999f6dd4ef26dbc362914f5be Mon Sep 17 00:00:00 2001 From: Nathan Bouchard Date: Thu, 12 Feb 2026 14:11:44 -0500 Subject: [PATCH 6/6] Doing some refactoring --- .../achievements/Achievement.java | 28 ++-- .../achievements/AchievementManager.java | 128 +++++++++--------- .../achievements/KillCountAchievement.java | 50 +++---- .../achievements/AchievementTest.java | 1 + 4 files changed, 102 insertions(+), 105 deletions(-) diff --git a/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java b/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java index 81b1871e..a8525563 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java @@ -6,24 +6,22 @@ public abstract class Achievement implements Serializable { - protected boolean completed = false; - protected int rewardCoins; + protected boolean completed = false; + protected int rewardCoins; + public boolean isCompleted() { + return completed; + } - public boolean isCompleted() { - return completed; - } + public void onComplete(String description) { + FXGL.getNotificationService().pushNotification("Achievement unlocked: " + description); + } + public int getRewardCoins() { + return rewardCoins; + } - public void onComplete(String description) { - FXGL.getNotificationService().pushNotification("Achievement unlocked: " + description); - } + public abstract void update(double tpf); - public int getRewardCoins() { - return rewardCoins; - } - - public abstract void update(double tpf); - - public abstract Boolean onDinosaurKilled(); + public abstract Boolean onDinosaurKilled(); } diff --git a/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java b/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java index 56d13eaa..f896c40b 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java @@ -1,84 +1,82 @@ package com.dinosaur.dinosaurexploder.achievements; import com.dinosaur.dinosaurexploder.constants.GameConstants; + import java.io.*; import java.util.ArrayList; import java.util.List; public class AchievementManager { - private final List allAchievements = new ArrayList<>(); - private final List activeAchievements = new ArrayList<>(); - - - public AchievementManager() { - // Register all available achievements here - allAchievements.add(new KillCountAchievement(1, 50)); - allAchievements.add(new KillCountAchievement(2, 50)); - allAchievements.add(new KillCountAchievement(10, 50)); - allAchievements.add(new KillCountAchievement(20, 100)); - } + private final List allAchievements = new ArrayList<>(); + private final List activeAchievements = new ArrayList<>(); - // Called once when the game starts - public void init() { - if (allAchievements.isEmpty()) return; + public AchievementManager() { + // Register all available achievements here + allAchievements.add(new KillCountAchievement(1, 50)); + allAchievements.add(new KillCountAchievement(2, 50)); + allAchievements.add(new KillCountAchievement(10, 50)); + allAchievements.add(new KillCountAchievement(20, 100)); + } - activeAchievements.addAll(loadAchievement()); - if (activeAchievements.isEmpty()) - { - saveAchievement(allAchievements); - activeAchievements.addAll(allAchievements); - } - } + // Called once when the game starts + public void init() { + if (allAchievements.isEmpty()) return; - // Called every frame - public void update(double tpf) { - for (Achievement achievement : activeAchievements) { - if (!achievement.isCompleted()) { - achievement.update(tpf); - } - } - } + activeAchievements.addAll(loadAchievement()); + if (activeAchievements.isEmpty()) { + saveAchievement(allAchievements); + activeAchievements.addAll(allAchievements); + } + } - // Called when a dinosaur is killed - public void notifyDinosaurKilled() { - for (Achievement achievement : activeAchievements) { - Boolean complete = achievement.onDinosaurKilled(); - } - saveAchievement(activeAchievements); + // Called every frame + public void update(double tpf) { + for (Achievement achievement : activeAchievements) { + if (!achievement.isCompleted()) { + achievement.update(tpf); + } + } + } - } + // Called when a dinosaur is killed + public void notifyDinosaurKilled() { + for (Achievement achievement : activeAchievements) { + Boolean complete = achievement.onDinosaurKilled(); + } + saveAchievement(activeAchievements); + } - public List getActiveAchievements() { - return activeAchievements; - } + public List getActiveAchievements() { + return activeAchievements; + } - public Achievement getActiveAchievement() { - if (activeAchievements.isEmpty()) { - return null; - } - return activeAchievements.getFirst(); - } + public Achievement getActiveAchievement() { + if (activeAchievements.isEmpty()) { + return null; + } + return activeAchievements.getFirst(); + } -///Get the list of achievement save in the achievement.ser file - public List loadAchievement() { - List achievementFromFile = new ArrayList<>(); - try (ObjectInputStream in = - new ObjectInputStream(new FileInputStream(GameConstants.ACHIEVEMENTS_FILE))) { - achievementFromFile= (List) in.readObject(); - } catch (IOException | ClassNotFoundException e) { - System.out.println("Failed to load achievements from file"); - } - return achievementFromFile; - } + /// Get the list of achievement save in the achievement.ser file + public List loadAchievement() { + List achievementFromFile = new ArrayList<>(); + try (ObjectInputStream in = + new ObjectInputStream(new FileInputStream(GameConstants.ACHIEVEMENTS_FILE))) { + achievementFromFile = (List) in.readObject(); + } catch (IOException | ClassNotFoundException e) { + System.out.println("Failed to load achievements from file"); + } + return achievementFromFile; + } - /// Save activeAchievement in the achievement.ser file - public void saveAchievement(List listToSave) { - try (ObjectOutputStream out = - new ObjectOutputStream(new FileOutputStream(GameConstants.ACHIEVEMENTS_FILE))) { - out.writeObject(listToSave); - } catch (IOException e) { - System.err.println("Error saving achievement : " + e.getMessage()); - } - } + /// Save activeAchievement in the achievement.ser file + public void saveAchievement(List listToSave) { + try (ObjectOutputStream out = + new ObjectOutputStream(new FileOutputStream(GameConstants.ACHIEVEMENTS_FILE))) { + out.writeObject(listToSave); + } catch (IOException e) { + System.err.println("Error saving achievement : " + e.getMessage()); + } + } } diff --git a/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java b/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java index ac979dad..5f5f803b 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java @@ -3,35 +3,35 @@ public class KillCountAchievement extends Achievement { - private final int targetKills; - private int currentKills = 0; + private final int targetKills; + private int currentKills = 0; - public KillCountAchievement(int targetKills, int rewardCoins) { - this.targetKills = targetKills; - this.rewardCoins = rewardCoins; - } + public KillCountAchievement(int targetKills, int rewardCoins) { + this.targetKills = targetKills; + this.rewardCoins = rewardCoins; + } - public String getDescription() { - return "Kill " + targetKills + " dinosaurs"; - } + public String getDescription() { + return "Kill " + targetKills + " dinosaurs"; + } public Boolean onDinosaurKilled() { - if (completed) return(true); - - currentKills++; - - if (currentKills >= targetKills) { - completed = true; - onComplete(getDescription()); - return(true); - } - return(false); - } - - @Override - public void update(double tpf) { - // Not needed for count-based achievement - } + if (completed) return (true); + + currentKills++; + + if (currentKills >= targetKills) { + completed = true; + onComplete(getDescription()); + return (true); + } + return (false); + } + + @Override + public void update(double tpf) { + // Not needed for count-based achievement + } } diff --git a/src/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java b/src/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java index f1eb395c..da7fcc5c 100644 --- a/src/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java +++ b/src/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; + import java.awt.*; import java.util.ArrayList; import java.util.List;