Scriptum/Assets/Scripts/REFACTORING/Application/Mission/Model/MissionStepModel.cs
2022-12-27 15:24:26 +01:00

146 lines
4.3 KiB
C#

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<int, List<MissionCondition>> 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);
}
/// <summary>
/// Important: Mission Step must be previously builded by Build function!!!
/// </summary>
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");
}
/// <summary>
/// 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)
/// </summary>
/// <returns></returns>
public List<MissionCondition> BuildConditionsList()
{
var buildedList = new List<MissionCondition>();
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)