public QuestReward(GS.Data.ObjectData _data = null, QuestRewardType _type = QuestRewardType.Primary, int _rewardSize = 1) { data = _data; type = _type; rewardSize = _rewardSize; }
private void Awake() { questGiver = GetComponent <GS.Data.ObjectStatus>().Object; }
// QuestGiver doesn't need to know quests. // They are given to them either in the scene or using QuestFinder. //public void GetQuestGiverQuests(QuestGiver _giver) { } public QuestLink[] GetQuestGiverQuests(GS.Data.ObjectData _object) { // Search QuestGiver through all QuestLinks. List <QuestLink> links = new List <QuestLink>(); links.AddRange(Resources.FindObjectsOfTypeAll <QuestLink>()); links = links.FindAll((obj) => (obj.questStart == _object || obj.questEnd == _object)); List <QuestProgress> list = new List <QuestProgress>(); list.AddRange(quests); list.AddRange(progress.Quests); list.TrimExcess(); List <QuestProgress> knownQuests = new List <QuestProgress>(); // Search links through known quests. // Take all quests as done or locked quests are parsed away later. foreach (QuestLink _link in links) { knownQuests.AddRange(list.FindAll((obj) => obj.line == _link.line)); } // If some quests aren't known, Add them to list if they are available. if (links.Count != knownQuests.Count) { // Look through required quests and check if requirements are met using QuestData. list = new List <QuestProgress>(); foreach (QuestLink _link in links) { if (knownQuests.FindAll((obj) => (obj.line == _link.line)).Count.Equals(0)) { QuestProgress _quest; _quest.line = _link.line; _quest.currentQuest = 0; _quest.state = QuestState.Searching; _quest.tasks = null; list.Add(_quest); } } // If quest meets the requirements. List <QuestProgress> removes = new List <QuestProgress>(); List <QuestProgress> _list = new List <QuestProgress>(); _list.AddRange(progress.Quests); foreach (QuestProgress _linkQuest in list) { QuestProgress quest; foreach (QuestData _data in _linkQuest.line.quests[_linkQuest.currentQuest].requiredQuests) { // Get the QuestLine QuestProgress. quest = _list.Find((obj) => (obj.line.quests[obj.currentQuest] == _data)); // Are these required quests completed? if (quest.line != null) { // QuestLine has been seen before. if (quest.line.ContainsQuest(_data, out int position)) { // If required quest is still not done. if (quest.currentQuest <= position && !quest.state.Equals(QuestState.Done)) { removes.Add(_linkQuest); break; } } } // Never seen this QuestLine before. else { removes.Add(_linkQuest); break; } } } // Remove quests from list as it's unavailable. foreach (QuestProgress _quest in removes) { list.Remove(_quest); } } else { list = new List <QuestProgress>(); } // Combine known and unknown quests to single list. list.AddRange( // Remove completed or locked quests from the list. knownQuests.FindAll((obj) => !(obj.state == QuestState.Done || obj.state == QuestState.Locked)) ); // Remove links which doesn't meet the requirements. List <QuestLink> removeLink = new List <QuestLink>(); foreach (QuestLink _link in links) { // If QuestLine isn't found, add it to remove list. if (list.FindAll((obj) => obj.line == _link.line).Count.Equals(0)) { removeLink.Add(_link); } } // Remove QuestLinks which QuestLine couldn't be started yet. foreach (QuestLink _link in removeLink) { links.Remove(_link); } // Finally get to return list of quest links... return(links.ToArray()); }