Scriptum/Assets/Scripts/REFACTORING/Application/Mission/Model/MissionStepModel.cs
2023-01-07 17:50:25 +01:00

183 lines
5.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;
// new mission header (optional - deleted (string, string) ) & task content
[SerializeField]
public string MissionIssue;
/*
[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();
((MissionDataManager)MissionDataManager.Instance).RegisterMission(MissionOrigin); // save mission status aftre each activating partial mission
}
#region Condition Mangment section
public void RegisterCondition()
{
ConditionManager.Instance.RegisterCondition(MissionOrigin.MissionName, BuildConditionsList());
}
/// <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);
}
/*
public void FinishStep()
{
}*/
#endregion
#region Mission Status API
public void ResetMissionStep()
{
Status = MissionStepStatusEnum.None;
DialogueStep.ResetDialogue();
}
public void UpdateMissionStepState(MissionStepData dialogueData)
{
// 1 Rule - speaker name shouldnt change !!! its our 'key'
Status = dialogueData.Status;
DialogueStep.UpdateDialogueState(dialogueData.MissionDialogueData);
}
#endregion
/// <summary>
/// Function to update Pkayer Quest description (and header optionaly) during mission progress
/// </summary>
public void PlayerQuestContentManage(string newContent)
{
MissionOrigin.PlayerQuestContentManage(newContent);
}
public void PlayerQuestContentManage()
{
MissionOrigin.PlayerQuestContentManage(MissionIssue);
}
}
// 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)