using UnityEditor; using System.Collections; using UnityEngine; using System.Collections.Generic; using System; using UnityEngine.Events; /* * In basic want to have 3 steps * - first to say hello and accept/reject mission * - secont - to check condition with plain dialogue * - third - to get reward */ [Serializable] public class MissionStepModel { protected Mission MissionOrigin { get; private set; } // Must be filled manually ! ! ! [SerializeField] public string SpeakerName; [SerializeField] // this flag tell whatewer dialoge ware already display to user public MissionStepStatusEnum Status = MissionStepStatusEnum.None; /* [SerializeField] public MissionDialogue DialogueStepTemplate;*/ [SerializeField] public MissionDialogue DialogueStep; // Conditions must be assigned to specify dialogue step [SerializeField] public IndexValuePair> MissionConditions; public MissionStepModel() { } public void SetSpeakerName(string speakerName) { SpeakerName = speakerName; } public Mission GetOriginMission() { return MissionOrigin; } public virtual void Build(Mission parent) { if(Status == MissionStepStatusEnum.None) Status = MissionStepStatusEnum.Pending; MissionOrigin = parent; //DialogueStep = MonoBehaviour.Instantiate(DialogueStepTemplate); // create copy to prevent overwritting oryginal object! ! DialogueStep.BindParent(this); DialogueStep.SetSpeakerName(SpeakerName); DialogueStep.BuildDialogue(); //DialogueStep.SetActionAfterDialogueStep(MissionConditions.Key, HanldeMissionStepCondition); } /// /// Important: Mission Step must be previously builded by Build function!!! /// public void ActivateStep() { // Dialogue MUST be builded ALWAYS - Build dialogue without displayed panel //DialogueStep.BuildDialogue(DialogueStep.DialogueSteps); if (Status != MissionStepStatusEnum.Pending) return; Status = MissionStepStatusEnum.Active; RegisterCondition(); } #region Condition Mangment section public void RegisterCondition() { Debug.Log(MissionConditions); Debug.Log(MissionConditions.Value[0].Type); ConditionManager.Instance.RegisterCondition(MissionOrigin.MissionName, BuildConditionsList()); Debug.Log("Condition registered"); } /// /// Function to change Base Conditions objects put in list defaultly to specific /// /// Note: This allow to cover base methods by this overwrittens in specific sub-class (like: CheckCondition method) /// /// public List BuildConditionsList() { var buildedList = new List(); foreach (var baseCondition in MissionConditions.Value) { buildedList.Add(baseCondition.Build()); } return buildedList; } // If mission's stem condition is fulified then mrak mission step as finished // else do nothing - player MUST this loop step // Its not required to condition be in last dialogue step // Checking condition and handling after action is assigned by button in dialogue step // If no then there is no possibility to go foward in proggress public bool HanldeMissionStepCondition() { if(CheckCondition()) { Status = MissionStepStatusEnum.AfterCondition; // 2. Remove Misison Steps Conditon from global list ConditionManager.Instance.RemoveCondition(MissionOrigin.MissionName); // 3. Remove founded elements return true; } else { Debug.Log("Dialogue - FinalAction - CheckCondition - HanldeMissionStepCondition - Condition not meeted"); } return false; } public bool CheckCondition() { return ConditionManager.Instance.CheckCondition(MissionOrigin.MissionName); } #endregion } // TODO // zapobieganie zniuknieciu itemow po otrzymaniu nagrody z poanelu gracza - WYKONANIE SAVE PO ZAKOŃCZENIU STEPU: // -- zapisanie postępu misji w pliku z misjami // -- zapisanie statusu panelu gracza (lista misji / content ekwipunku / magazynu)