public void UpdateObjetiveProgress(
     QuestSO quest,
     QuestObjectiveSO objetive,
     object parameters
     )
 {
     QuestList.UpdateObjetiveProgress(quest, objetive, parameters);
 }
        public void Add(QuestSO quest)
        {
            QuestStatuses.AddIfNot(
                qs => qs.Quest == quest,
                new QuestStatus(quest)
                );

            OnUpdate?.Invoke();
        }
        public QuestStatus(QuestSO questSO)
        {
            Quest = questSO;

            objectives = new List <ObjectiveStatus>();
            foreach (var objectiveSO in questSO.Objectives)
            {
                objectives.Add(objectiveSO.Initiate());
            }
        }
        public Optional <QuestStatus> GetStatusBy(QuestSO quest)
        {
            var questStatus = QuestStatuses.Find(qs => qs.Quest == quest);

            if (questStatus == null)
            {
                return(Optional <QuestStatus> .None());
            }

            return(Optional <QuestStatus> .Some(questStatus));
        }
        public bool TryFinish(QuestSO quest)
        {
            if (!GetStatusBy(quest).IsPresentAndGet(out QuestStatus status))
            {
                return(false);
            }

            if (!status.IsComplete)
            {
                return(false);
            }

            questStatuses.Remove(status);
            OnUpdate?.Invoke();
            OnQuestFinished?.Invoke(status);
            return(true);
        }
        public void UpdateObjetiveProgress(
            QuestSO quest,
            QuestObjectiveSO objetive,
            object parameters
            )
        {
            GetStatusBy(quest)
            .Some(status => {
                status.UpdateObjetivProgress(objetive, parameters);

                if (status.Quest.AutoFinish && status.IsComplete)
                {
                    questStatuses.Remove(status);
                    OnQuestFinished?.Invoke(status);
                }

                OnUpdate?.Invoke();
            });
        }
 public bool TryFinishQuest(QuestSO quest)
 {
     return(QuestList.TryFinish(quest));
 }
 public void AddQuest(QuestSO quest)
 {
     QuestList.Add(quest);
 }