using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; //[Serializable] //[CreateAssetMenu(fileName = "New Mission", menuName = "Mission/New Mission")] public class NpcMissionManager : DialogueManager // ScriptableObject { [SerializeField] public Mission MissionTemplate; /* We user object CLONED TO PREVENT overwritting changes in main object inassets */ [SerializeField] public Mission Mission; [SerializeField] public DialogueStepModel FreeDialogue; // List, Value : UnityEvent> //public List, MissionCondition>> EndactionEventList; public override void Start() { base.Start(); CanBeOpened = false; OpenInDefaultWay = false; CreateInstanceBasedOnLanguage(); // UPDATE DIALOGUE // search in scene manager list if (Mission != null) { var machedDialogueData = ((MissionDataManager)MissionDataManager.Instance).GetMission(Mission); if (machedDialogueData != null) { UpdateMissionState(machedDialogueData); } else { Debug.Log("Start - UpdateProggres"); UpdateProggres(); } } Mission.BuildMission(); if (FreeDialogue != null) FreeDialogue.Build(); } public void Update() { } public override void OnTriggerEnter2D(Collider2D collision) { // don't listen when component is disabled if (ComponentEnabledCondition()) return; if (collision.gameObject.tag == "Player" && !GetCurrentDialoguePanelStatus()) { CanBeOpened = true; CreateInstanceBasedOnLanguage(); // UPDATE DIALOGUE // search in scene manager list if (Mission != null) { var machedDialogueData = ((MissionDataManager)MissionDataManager.Instance).GetMission(Mission); if (machedDialogueData != null) { UpdateMissionState(machedDialogueData); } else { Debug.Log("Start - UpdateProggres"); UpdateProggres(); } } Mission.BuildMission(); Mission.StartDialogue(); } } public override void OnTriggerExit2D(Collider2D collision) { // don't listen when component is disabled if (ComponentEnabledCondition()) return; if (collision.gameObject.tag == "Player") { CanBeOpened = false; if (Mission != null && GetCurrentDialoguePanelStatus()) { /* Debug.Log("BreakDialogueStep"); */ Mission.BreakDialogueStep(); } } } public override void CreateInstanceBasedOnLanguage() { // DONT CLONE TO HAVE CONSTANT DATA - init - deep copy - to prevent overwritting chil;dern :D Mission = MissionTemplate; Mission.ResetMission(); /* var cloneDialogues = new List>(Dialogue.Dialogues); Dialogue.Dialogues.Clear(); foreach (var dial in cloneDialogues) { Dialogue.Dialogues.Add(new IndexValuePair(dial.Key, Instantiate(dial.Value))); }*/ Mission.SetSpeakerName(gameObject.GetComponent().Name); // update dial state - sync in order to prepare to save Mission.MissionStepsList.ForEach(dial => dial.DialogueStep.SetActionAfterEachDialogueStep(UpdateProggres)); // Add one more action - to reset proggress //Dialogue.Dialogues.ForEach(dial => dial.Value.SetActionAfterEachDialogueStep(dial.Value.ResetDialogue)); // reset dial } public void UpdateMissionState(MissionData missionState) { // 1 Rule - speaker name shouldnt change !!! its our 'key' Mission.UpdateMissionState(missionState); } /// /// Function to sync local dialogue state with remote one /// Handled in Scene Manager /// public void UpdateProggres() { ((MissionDataManager)MissionDataManager.Instance).RegisterMission(Mission); } protected override bool ComponentEnabledCondition() { return !gameObject.GetComponent().enabled; } public override bool GetCurrentDialoguePanelStatus() { return Mission .GetCurrentStep() .DialogueStep .GetCurrentStep() ?.DialogueController .CurrentPanel != null; } }