using UnityEngine; using System.Collections; using System; namespace MoreMountains.Tools { /// /// This achievement system supports 2 types of achievements : simple (do something > get achievement), and progress based (jump X times, kill X enemies, etc). /// public enum AchievementTypes { Simple, Progress } [Serializable] public class MMAchievement { [Header("Identification")] /// the unique identifier for this achievement public string AchievementID; /// is this achievement progress based or public AchievementTypes AchievementType; /// if this is true, the achievement won't be displayed in a list public bool HiddenAchievement; /// if this is true, the achievement has been unlocked. Otherwise, it's still up for grabs public bool UnlockedStatus; [Header("Description")] /// the achievement's name/title public string Title; /// the achievement's description public string Description; /// the amount of points unlocking this achievement gets you public int Points; [Header("Image and Sounds")] /// the image to display while this achievement is locked public Sprite LockedImage; /// the image to display when the achievement is unlocked public Sprite UnlockedImage; /// a sound to play when the achievement is unlocked public AudioClip UnlockedSound; [Header("Progress")] /// the amount of progress needed to unlock this achievement. public int ProgressTarget; /// the current amount of progress made on this achievement public int ProgressCurrent; protected MMAchievementDisplayItem _achievementDisplayItem; /// /// Unlocks the achievement, asks for a save of the current achievements, and triggers an MMAchievementUnlockedEvent for this achievement. /// This will usually then be caught by the MMAchievementDisplay class. /// public virtual void UnlockAchievement() { // if the achievement has already been unlocked, we do nothing and exit if (UnlockedStatus) { return; } UnlockedStatus = true; MMGameEvent.Trigger("Save"); MMAchievementUnlockedEvent.Trigger(this); } /// /// Locks the achievement. /// public virtual void LockAchievement() { UnlockedStatus = false; } /// /// Adds the specified value to the current progress. /// /// New progress. public virtual void AddProgress(int newProgress) { ProgressCurrent += newProgress; EvaluateProgress(); } /// /// Sets the progress to the value passed in parameter. /// /// New progress. public virtual void SetProgress(int newProgress) { ProgressCurrent = newProgress; EvaluateProgress(); } /// /// Evaluates the current progress of the achievement, and unlocks it if needed. /// protected virtual void EvaluateProgress() { MMAchievementChangedEvent.Trigger(this); if (ProgressCurrent >= ProgressTarget) { ProgressCurrent = ProgressTarget; UnlockAchievement(); } } /// /// Copies this achievement (useful when loading from a scriptable object list) /// public virtual MMAchievement Copy() { MMAchievement clone = new MMAchievement (); // we use Json utility to store a copy of our achievement, not a reference clone = JsonUtility.FromJson(JsonUtility.ToJson(this)); return clone; } } }