protected virtual void Awake()
 {
     myID = StringField.GetStringValue(QuestMachineMessages.GetID(gameObject));
     InitializeQuestIndicatorUI();
     InitializeStates();
     RegisterWithMessageSystem();
 }
Пример #2
0
        /// <summary>
        /// Starts dialogue with the player. The content of the dialogue will depend on the quest giver's
        /// offerable quests and the player's quests.
        /// </summary>
        /// <param name="player">Player conversing with this QuestGiver. If null, searches the scene for a GameObject tagged Player.</param>
        public virtual void StartDialogue(GameObject player)
        {
            if (questDialogueUI == null && Debug.isDebugBuild)
            {
                Debug.LogWarning("Quest Machine: Can't start dialogue with " + name + ". Quest Giver doesn't have access to a quest dialogue UI.", this);
                return;
            }

            // If player isn't specified, find it in the scene and find relevant quest journal:
            if (player == null)
            {
                player = FindPlayerGameObject();
            }
            if (player == null && Debug.isDebugBuild)
            {
                Debug.LogWarning("Quest Machine: Can't start dialogue with " + name + ". No quester specified.", this);
                return;
            }
            playerQuestListContainer = player.GetComponent <QuestListContainer>();
            if (playerQuestListContainer == null)
            {
                var playerID = player.GetComponent <QuestMachineID>();
                if (playerID != null && playerID.questListContainer != null)
                {
                    playerQuestListContainer = playerID.questListContainer;
                }
                else
                {
                    var playerJournalObject = FindPlayerJournalGameObject();
                    playerQuestListContainer = (playerJournalObject != null) ? playerJournalObject.GetComponent <QuestListContainer>() : null;
                }
            }
            if (playerQuestListContainer == null && Debug.isDebugBuild)
            {
                Debug.LogWarning("Quest Machine: Can't start dialogue with " + name + ". Quester " + player.name + " doesn't have a Quest Journal and can't find one in scene.", this);
                return;
            }

            QuestMachineTags.fallbackTextTable = textTable;

            // Setup player info:
            this.player    = player;
            playerTextInfo = new QuestParticipantTextInfo(QuestMachineMessages.GetID(player), QuestMachineMessages.GetDisplayName(player), null, null);

            // Greet before recording quests in case Greet message changes a quest state:
            QuestMachineMessages.Greet(player, this, id);

            // Record quests related to this player and me:
            RecordQuestsByState();

            StartMostRelevantDialogue();

            // Note: Sends Greeted immediately after opening dialogue UI, not when closing it:
            QuestMachineMessages.Greeted(player, this, id);
        }
Пример #3
0
        /// <summary>
        /// Adds an instance of a quest to a quester's list. If the quest's maxTimes are reached,
        /// deletes the quest from the giver. Otherwise starts cooldown timer until it can be
        /// given again.
        /// </summary>
        /// <param name="quest">Quest to give to quester.</param>
        /// <param name="questerQuestListContainer">Quester's quest list container.</param>
        public virtual void GiveQuestToQuester(Quest quest, QuestListContainer questerQuestListContainer)
        {
            if (quest == null)
            {
                return;
            }
            if (questerQuestListContainer == null)
            {
                Debug.LogWarning("Quest Machine: " + name + ".GiveQuestToQuester - quester (QuestListContainer) is null.", this);
                return;
            }
            var questerTextInfo = new QuestParticipantTextInfo(QuestMachineMessages.GetID(questerQuestListContainer.gameObject), QuestMachineMessages.GetDisplayName(questerQuestListContainer.gameObject), null, null);

            GiveQuestToQuester(quest, questerTextInfo, questerQuestListContainer);
        }
        public virtual void OnMessage(MessageArgs messageArgs)
        {
            var target = messageArgs.targetString;

            if (!(string.IsNullOrEmpty(target) || string.Equals(target, myID) || StringField.Equals(QuestMachineMessages.GetID(target), myID)))
            {
                return;
            }
            switch (messageArgs.message)
            {
            case QuestMachineMessages.SetIndicatorStateMessage:
                SetIndicatorState(messageArgs.parameter, (QuestIndicatorState)messageArgs.firstValue);
                break;

            case QuestMachineMessages.RefreshIndicatorMessage:
            case QuestMachineMessages.RefreshUIsMessage:
                Repaint();
                break;
            }
        }
        public override void ApplyData(string data)
        {
            if (!includeInSavedGameData)
            {
                return;
            }
            if (string.IsNullOrEmpty(data))
            {
                return;
            }

            try
            {
                QuestMachine.isLoadingGame = true;

                var saveData = SaveSystem.Deserialize <SaveData>(data);
                if (saveData == null)
                {
                    return;
                }

                // Clear current quest list:
                DestroyQuestInstances(); // Adds them to deletedStaticQuests, but that's OK since we're going to restore deletedStaticQuests.

                // Restore dynamic quests:
                for (int i = 0; i < saveData.proceduralQuests.Count; i++)
                {
                    try
                    {
                        var questProxy = JsonUtility.FromJson <QuestProxy>(saveData.proceduralQuests[i]);
                        if (questProxy == null)
                        {
                            continue;
                        }
                        var quest = ScriptableObject.CreateInstance <Quest>();
                        quest.name = questProxy.displayName;
                        questProxy.CopyTo(quest);
                        AddQuest(quest);
                    }
                    catch (Exception e)
                    {
                        if (Debug.isDebugBuild)
                        {
                            Debug.LogWarning("Quest Machine: Unable to restore quest from serialized quest proxy. Message: " + e.Message + "\nData: " + saveData.proceduralQuests[i], this);
                        }
                    }
                }

                // Restore list of deleted static quests:
                deletedStaticQuests.Clear();
                deletedStaticQuests.AddRange(saveData.deletedStaticQuests);

                // Restore static quests:
                for (int i = 0; i < Mathf.Min(saveData.staticQuestIds.Count, saveData.staticQuestData.Count); i++)
                {
                    var questID   = saveData.staticQuestIds[i];
                    var questData = saveData.staticQuestData[i];
                    if (string.IsNullOrEmpty(questID) || questData == null || questData.bytes == null)
                    {
                        continue;
                    }
                    if (deletedStaticQuests.Contains(questID))
                    {
                        continue;
                    }
                    var quest = QuestMachine.GetQuestAsset(questID);
                    if (quest == null)
                    {
                        quest = originalQuestList.Find(x => string.Equals(StringField.GetStringValue(x.id), questID));
                    }
                    if (quest == null && Debug.isDebugBuild)
                    {
                        Debug.LogError("Quest Machine: " + name + " Can't find quest " + saveData.staticQuestIds[i] + ". Is it registered with Quest Machine?", this);
                    }
                    if (quest == null)
                    {
                        continue;
                    }
                    quest = quest.Clone();
                    try
                    {
                        QuestStateSerializer.DeserializeInto(quest, questData.bytes, true);
                    }
                    catch (Exception e)
                    {
                        try
                        {
                            if (Debug.isDebugBuild)
                            {
                                Debug.LogWarning("Quest Machine: Unable to restore quest: " + quest.name + ". Message: " + e.Message, this);
                            }
                            Destroy(quest);
                        }
                        catch (Exception) { }
                        quest = quest.Clone();
                    }
                    AddQuest(quest);
                }
                QuestMachineMessages.RefreshIndicator(this, QuestMachineMessages.GetID(this));
            }
            finally
            {
                QuestMachine.isLoadingGame = false;
            }
        }