From 5ecaeb1b8b7f4ab99ad1f69d1b496d6459c498d9 Mon Sep 17 00:00:00 2001
From: Malik Rafsanjani <pro.malikakbar2357@gmail.com>
Date: Sat, 15 Apr 2023 16:08:19 +0700
Subject: [PATCH] feat: add state save for talked with npcs

---
 Assets/Scripts/Managers/DialogueManager.cs  | 11 +++++++++
 Assets/Scripts/Quest/Temple/Temple.cs       | 13 +++++++++--
 Assets/Scripts/States/GlobalStateManager.cs | 26 ++++++++++++++++++++-
 Assets/Scripts/States/StateSave.cs          |  4 +++-
 4 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/Assets/Scripts/Managers/DialogueManager.cs b/Assets/Scripts/Managers/DialogueManager.cs
index 4b5bdfa..0e9b30a 100644
--- a/Assets/Scripts/Managers/DialogueManager.cs
+++ b/Assets/Scripts/Managers/DialogueManager.cs
@@ -23,6 +23,16 @@ public class DialogueManager : MonoBehaviour
     public Text npcDialogueBox;
     public Text playerResponse;
 
+    private bool[] hasTalked = new bool[4];
+    public bool[] HasTalked
+    {
+        get => hasTalked;
+        set
+        {
+            hasTalked = value;
+        }
+    }
+
     // Start is called before the first frame update
     void Start()
     {
@@ -102,6 +112,7 @@ public class DialogueManager : MonoBehaviour
 
     private void StartConvo()
     {
+        hasTalked[GlobalStateManager.Instance.IdxQuest] = true;
         isTalking = true;
         curResponseTracker = 0f;
         dialogueUI.SetActive(true);
diff --git a/Assets/Scripts/Quest/Temple/Temple.cs b/Assets/Scripts/Quest/Temple/Temple.cs
index f2e2d99..b43992e 100644
--- a/Assets/Scripts/Quest/Temple/Temple.cs
+++ b/Assets/Scripts/Quest/Temple/Temple.cs
@@ -64,7 +64,8 @@ public class Temple : MonoBehaviour
     // Update is called once per frame
     void Update()
     {
-        if (playerOnRange && Input.GetKeyDown(KeyCode.G))
+        var hasTalked = GlobalStateManager.Instance.HasTalked[idxCurrentQuest];
+        if (playerOnRange && Input.GetKeyDown(KeyCode.G) && hasTalked)
         {
             ToastManager.Instance.ShowToast("ENTERING QUEST",1);
             EnteringQuest();
@@ -121,6 +122,15 @@ public class Temple : MonoBehaviour
     {
         if (other.CompareTag("Player"))
         {
+            playerOnRange = true;
+
+            var hasTalkeds = GlobalStateManager.Instance.HasTalked;
+            if (!hasTalkeds[idxCurrentQuest])
+            {
+                ToastManager.Instance.ShowToast("Talk first with wizard", 1);
+                return;
+            }
+
             if (onQuest)
             {
                 ToastManager.Instance.ShowToast("- Good Luck with your Quest -",1);
@@ -130,7 +140,6 @@ public class Temple : MonoBehaviour
                 ToastManager.Instance.ShowToast("- Press G to Enter Quest " +
                     (idxCurrentQuest+1) + " - ",1);
             }
-            playerOnRange = true;
         }   
     }
 
diff --git a/Assets/Scripts/States/GlobalStateManager.cs b/Assets/Scripts/States/GlobalStateManager.cs
index dbe4210..3aad6a5 100644
--- a/Assets/Scripts/States/GlobalStateManager.cs
+++ b/Assets/Scripts/States/GlobalStateManager.cs
@@ -24,6 +24,19 @@ public class GlobalStateManager : MonoBehaviour
     }
     private PetHealth petHealth;
     private CheatManager cheatManager;
+    private DialogueManager dialogueManager;
+    public DialogueManager DialogueManager
+    {
+        get
+        {
+            if (dialogueManager == null)
+            {
+                dialogueManager = FindObjectOfType<DialogueManager>();
+            }
+
+            return dialogueManager;
+        }
+    }
 
     private void Awake()
     {
@@ -45,6 +58,7 @@ public class GlobalStateManager : MonoBehaviour
         _temple = FindObjectOfType<Temple>();
         petHealth = FindObjectOfType<PetHealth>();
         cheatManager = FindObjectOfType<CheatManager>();
+        dialogueManager = FindObjectOfType<DialogueManager>();
     }
 
     public int Money
@@ -89,6 +103,15 @@ public class GlobalStateManager : MonoBehaviour
         }
     }
 
+    public bool[] HasTalked
+    {
+        get => DialogueManager.HasTalked;
+        set
+        {
+            DialogueManager.HasTalked = value;
+        }
+    }
+
     private PetManager _petManager;
     public PetManager petManager
     {
@@ -190,7 +213,7 @@ public class GlobalStateManager : MonoBehaviour
         var metaStateSave = new MetaStateSave("name");
         var playerStateSave = new PlayerStateSave(PlayerName, Money, Health, IdxQuest, playerWeapons);
         var petStateSave = new PetStateSave(PetHealth, (int)GameControl.control.petIdx);
-        var globalStateSave = new GlobalStateSave(TimePlayed, Cheats);
+        var globalStateSave = new GlobalStateSave(TimePlayed, Cheats, HasTalked);
 
         var state = new StateSave(metaStateSave, playerStateSave, petStateSave, globalStateSave);
         return state;
@@ -237,5 +260,6 @@ public class GlobalStateManager : MonoBehaviour
         // TODO: global state save
         GlobalManager.Instance.TimePlayed = state.globalStateSave.timePlayed;
         cheatManager.loadCheat(state.globalStateSave.cheats);
+        HasTalked = state.globalStateSave.hasTalked;
     }
 }
diff --git a/Assets/Scripts/States/StateSave.cs b/Assets/Scripts/States/StateSave.cs
index f925f4c..61555a5 100644
--- a/Assets/Scripts/States/StateSave.cs
+++ b/Assets/Scripts/States/StateSave.cs
@@ -98,11 +98,13 @@ public class GlobalStateSave
 {
     public double timePlayed;
     public bool[] cheats;
+    public bool[] hasTalked;
 
-    public GlobalStateSave(double timePlayed, bool[] cheats)
+    public GlobalStateSave(double timePlayed, bool[] cheats, bool[] hasTalked)
     {
         this.timePlayed = timePlayed;
         this.cheats = cheats;
+        this.hasTalked = hasTalked;
     }
 
     public override string ToString()
-- 
GitLab