diff --git a/achievements.ser b/achievements.ser new file mode 100644 index 00000000..399c567e Binary files /dev/null and b/achievements.ser differ diff --git a/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java b/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java index f798d4e3..a8525563 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/Achievement.java @@ -1,14 +1,27 @@ package com.dinosaur.dinosaurexploder.achievements; -public abstract class Achievement { +import com.almasb.fxgl.dsl.FXGL; - protected boolean completed = false; +import java.io.Serializable; - public boolean isCompleted() { - return completed; - } +public abstract class Achievement implements Serializable { - public abstract void update(double tpf); + protected boolean completed = false; + protected int rewardCoins; - public abstract void onDinosaurKilled(); + public boolean isCompleted() { + return completed; + } + + public void onComplete(String description) { + FXGL.getNotificationService().pushNotification("Achievement unlocked: " + description); + } + + public int getRewardCoins() { + return rewardCoins; + } + + public abstract void update(double tpf); + + 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 459f1b00..f896c40b 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/AchievementManager.java @@ -1,50 +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(10, 50)); - allAchievements.add(new KillCountAchievement(20, 100)); - } - - // Called once when the game starts - public void init() { - if (allAchievements.isEmpty()) return; - - activeAchievements.addAll(allAchievements); - } - - // 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) { - achievement.onDinosaurKilled(); - } - } - - public List getActiveAchievements() { - return activeAchievements; - } - - public Achievement getActiveAchievement() { - if (activeAchievements.isEmpty()) { - return null; - } - return activeAchievements.get(0); - } + 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)); + } + + // Called once when the game starts + public void init() { + if (allAchievements.isEmpty()) return; + + activeAchievements.addAll(loadAchievement()); + if (activeAchievements.isEmpty()) { + saveAchievement(allAchievements); + activeAchievements.addAll(allAchievements); + } + } + + // 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 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; + } + + /// 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 ebfe2a71..5f5f803b 100644 --- a/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java +++ b/src/main/java/com/dinosaur/dinosaurexploder/achievements/KillCountAchievement.java @@ -1,49 +1,37 @@ package com.dinosaur.dinosaurexploder.achievements; -import com.almasb.fxgl.dsl.FXGL; public class KillCountAchievement extends Achievement { - private final int targetKills; - private final int rewardCoins; + private final int targetKills; + private int currentKills = 0; - private int currentKills = 0; - private boolean completed = false; + 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); - public boolean isCompleted() { - return completed; - } + currentKills++; - public void onDinosaurKilled() { - if (completed) return; + if (currentKills >= targetKills) { + completed = true; + onComplete(getDescription()); + return (true); + } + return (false); + } - currentKills++; + @Override + public void update(double tpf) { + // Not needed for count-based achievement + } - if (currentKills >= targetKills) { - completed = true; - onComplete(); - } - } - @Override - 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/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/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java b/src/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java new file mode 100644 index 00000000..da7fcc5c --- /dev/null +++ b/src/test/java/com/dinosaur/dinosaurexploder/achievements/AchievementTest.java @@ -0,0 +1,44 @@ +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); + } +}