Ejemplo n.º 1
0
 /// <summary>
 /// Looks up a node by its ID.
 /// </summary>
 public QuestNode GetNode(StringField questNodeID)
 {
     return(GetNode(StringField.GetStringValue(questNodeID)));
 }
Ejemplo n.º 2
0
 /// <summary>
 /// Records a static tag and its value in the dictionary.
 /// </summary>
 public void SetTag(string tag, StringField value)
 {
     SetTag(tag, StringField.GetStringValue(value));
 }
Ejemplo n.º 3
0
 public override string GetEditorName()
 {
     return(StringField.IsNullOrEmpty(message) ? "Message" : "Message: " + message.value + " " + StringField.GetStringValue(parameter) + " " + value.EditorNameValue());
 }
Ejemplo n.º 4
0
        public override void Execute()
        {
            if (prefab == null)
            {
                return;
            }
            var location = StringField.IsNullOrEmpty(locationTransform) ? null : GameObjectUtility.GameObjectHardFind(StringField.GetStringValue(locationTransform));

            if (location == null)
            {
                if (QuestMachine.debug)
                {
                    Debug.Log("Quest Machine: Instantiating prefab '" + prefab + "'.", prefab);
                }
                Instantiate(prefab);
            }
            else
            {
                if (QuestMachine.debug)
                {
                    Debug.Log("Quest Machine: Instantiating prefab '" + prefab + "' at " + locationTransform + ".", prefab);
                }
                Instantiate(prefab, location.transform.position, location.transform.rotation);
            }
        }
 /// <summary>
 /// Shows a quest alert.
 /// </summary>
 /// <param name="stringField">Alert to show.</param>
 public void ShowAlert(StringField stringField)
 {
     ShowAlert(StringField.GetStringValue(stringField));
 }
Ejemplo n.º 6
0
 private static string GetHeadingTextQuestContentProxyData(HeadingTextQuestContent headingTextQuestContent)
 {
     return(headingTextQuestContent.headingLevel + ";" + StringField.GetStringValue(headingTextQuestContent.originalText));
 }
Ejemplo n.º 7
0
 private static string GetIconQuestContentProxyData(IconQuestContent iconQuestContent)
 {
     return(iconQuestContent.count + ";" + ((iconQuestContent.image != null) ? iconQuestContent.image.name : string.Empty) + ";" +
            StringField.GetStringValue(iconQuestContent.originalText));
 }
Ejemplo n.º 8
0
 /// <summary>
 /// Looks up a QuestJournal.
 /// </summary>
 /// <param name="id">ID of the QuestJournal's owner, or empty for any QuestJournal.</param>
 public static QuestJournal GetQuestJournal(StringField id)
 {
     return(GetQuestJournal(StringField.GetStringValue(id)));
 }
Ejemplo n.º 9
0
 private static string GetQuestKey(Quest quest)
 {
     if (quest == null)
     {
         return(null);
     }
     return(StringField.IsNullOrEmpty(quest.id) ? quest.GetInstanceID().ToString() : StringField.GetStringValue(quest.id));
 }
Ejemplo n.º 10
0
 private static void ReadQuestNodeDataFromStream(BinaryReader binaryReader, QuestNode node)
 {
     node.SetState((QuestNodeState)binaryReader.ReadByte(), false);
     ReadConditionSetDataFromStream(binaryReader, node.conditionSet);
     ReadTagDictionaryFromStream(binaryReader, node.tagDictionary, StringField.GetStringValue(node.internalName));
 }
Ejemplo n.º 11
0
 /// <summary>
 /// Looks up a registered QuestListContainer.
 /// </summary>
 /// <param name="id">ID of the QuestListContainer.</param>
 public static IdentifiableQuestListContainer GetQuestListContainer(StringField id)
 {
     return(GetQuestListContainer(StringField.GetStringValue(id)));
 }
Ejemplo n.º 12
0
 /// <summary>
 /// Adds any tags in the StringField to the tags dictionary.
 /// </summary>
 /// <param name="stringField"></param>
 protected virtual void AddTagsToDictionary(StringField stringField)
 {
     AddTagsToDictionary(StringField.GetStringValue(stringField));
 }
Ejemplo n.º 13
0
 public QuestIndicatorState GetQuestIndicatorState(StringField entityID)
 {
     return(GetQuestIndicatorState(StringField.GetStringValue(entityID)));
 }
Ejemplo n.º 14
0
 public void SetQuestIndicatorState(StringField entityID, QuestIndicatorState questIndicatorState)
 {
     SetQuestIndicatorState(StringField.GetStringValue(entityID), questIndicatorState);
 }
 public virtual Quest FindQuest(StringField questID)
 {
     return(FindQuest(StringField.GetStringValue(questID)));
 }
Ejemplo n.º 16
0
 /// <summary>
 /// Looks up a quest asset by ID.
 /// </summary>
 /// <param name="id">Quest ID.</param>
 /// <returns>Quest with the matching ID, or null if none is found.</returns>
 public static Quest GetQuestAsset(StringField id)
 {
     return(GetQuestAsset(StringField.GetStringValue(id)));
 }
        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;
            }
        }
Ejemplo n.º 18
0
 /// <summary>
 /// Looks up a quest instance by ID.
 /// </summary>
 /// <param name="questID">Quest ID.</param>
 /// <param name="questerID">ID of quester assigned to quest, or blank or null for any quester.</param>
 /// <returns>Quest instance with the specified quest and quester ID, or null if none is found.</returns>
 public static Quest GetQuestInstance(StringField id, StringField questerID)
 {
     return(GetQuestInstance(StringField.GetStringValue(id), StringField.GetStringValue(questerID)));
 }
Ejemplo n.º 19
0
 private static string GetBodyTextQuestContentProxyData(BodyTextQuestContent bodyTextQuestContent)
 {
     return(StringField.GetStringValue(bodyTextQuestContent.originalText));
 }
Ejemplo n.º 20
0
 /// <summary>
 /// Looks up a quest's counter.
 /// </summary>
 /// <param name="questID">The quest's ID.</param>
 /// <param name="counterName">The counter name.</param>
 /// <returns>A quest counter, or null if none matches the questID and counterName.</returns>
 public static QuestCounter GetQuestCounter(StringField questID, StringField counterName, StringField questerID = null)
 {
     return(GetQuestCounter(StringField.GetStringValue(questID), StringField.GetStringValue(counterName), (questerID != null) ? StringField.GetStringValue(questerID) : null));
 }
Ejemplo n.º 21
0
 private static string GetButtonQuestContentProxyData(ButtonQuestContent buttonQuestContent)
 {
     return(buttonQuestContent.count + ";" + ((buttonQuestContent.image != null) ? buttonQuestContent.image.name : string.Empty) + ";" +
            StringField.GetStringValue(buttonQuestContent.originalText) + ";" + JsonUtility.ToJson(buttonQuestContent.m_actionsProxy));
 }
Ejemplo n.º 22
0
 /// <summary>
 /// Looks up a quest's state.
 /// </summary>
 /// <param name="questID">The quest's ID.</param>
 /// <returns>The quest's state, or QuestState.Inactive if no quest with the specified ID has been registered.</returns>
 public static QuestState GetQuestState(StringField questID)
 {
     return(GetQuestState(StringField.GetStringValue(questID)));
 }
Ejemplo n.º 23
0
        protected virtual void RefreshNow() //[TODO] Optimize.
        {
            isDrawingSelectionPanel = true;
            selectionPanelContentManager.Clear();

            // Set heading:
            if (entityImage != null)
            {
                entityImage.sprite = questJournal.image;
            }
            if (showDisplayNameInHeading && entityName != null && !StringField.IsNullOrEmpty(questJournal.displayName))
            {
                entityName.text = questJournal.displayName.value;
            }

            // Get group names:
            var groupNames   = new List <string>();
            int numGroupless = 0;

            foreach (var quest in questJournal.questList)
            {
                if (quest.GetState() == QuestState.WaitingToStart)
                {
                    continue;
                }
                var groupName = StringField.GetStringValue(quest.group);
                if (string.IsNullOrEmpty(groupName))
                {
                    numGroupless++;
                }
                if (string.IsNullOrEmpty(groupName) || groupNames.Contains(groupName))
                {
                    continue;
                }
                groupNames.Add(groupName);
            }

            // Add quests by group:
            foreach (var groupName in groupNames)
            {
                var groupFoldout = Instantiate <UnityUIFoldoutTemplate>(questGroupTemplate);
                selectionPanelContentManager.Add(groupFoldout, questSelectionContentContainer);
                groupFoldout.Assign(groupName, IsGroupExpanded(groupName));
                if (alwaysExpandAllGroups)
                {
                    groupFoldout.foldoutButton.interactable = false;
                }
                else
                {
                    groupFoldout.foldoutButton.interactable = true;
                    groupFoldout.foldoutButton.onClick.AddListener(() => { OnClickGroup(groupName, groupFoldout); });
                }
                foreach (var quest in questJournal.questList)
                {
                    if (quest.GetState() == QuestState.WaitingToStart)
                    {
                        continue;
                    }
                    if (string.Equals(quest.group.value, groupName))
                    {
                        var questName = Instantiate <UnityUIQuestNameButtonTemplate>(GetQuestNameTemplateForState(quest.GetState()));
                        questName.Assign(quest, OnToggleTracking);
                        selectionPanelContentManager.Add(questName, groupFoldout.interiorPanel);
                        var target = quest;
                        SetupQuestNameUIEvents(questName.buttonTemplate.button, target);
                    }
                }
            }

            // Add groupless quests:
            foreach (var quest in questJournal.questList)
            {
                if (quest.GetState() == QuestState.WaitingToStart)
                {
                    continue;
                }
                var groupName = StringField.GetStringValue(quest.group);
                if (!string.IsNullOrEmpty(groupName))
                {
                    continue;
                }
                var questName = Instantiate <UnityUIQuestNameButtonTemplate>(GetQuestNameTemplateForState(quest.GetState()));
                questName.Assign(quest, OnToggleTracking);
                selectionPanelContentManager.Add(questName, questSelectionContentContainer);
                var target = quest;
                SetupQuestNameUIEvents(questName.buttonTemplate.button, target);
            }

            RepaintSelectedQuest();

            RefreshNavigableSelectables();
        }
Ejemplo n.º 24
0
 /// <summary>
 /// Looks up a quest node's state.
 /// </summary>
 /// <param name="questID">The quest's ID.</param>
 /// <param name="questNodeID">The quest node's ID.</param>
 /// <returns>The quest node's state, or QuestNodeState.Inactive if no quest or quest node with the specified IDs has been registered.</returns>
 public static QuestNodeState GetQuestNodeState(StringField questID, StringField questNodeID, string questerID = null)
 {
     return(GetQuestNodeState(StringField.GetStringValue(questID), StringField.GetStringValue(questNodeID), questerID));
 }
 protected float GetDisplayDuration(StringField stringField)
 {
     return(GetDisplayDuration(StringField.GetStringValue(stringField)));
 }
Ejemplo n.º 26
0
 public static void SetQuestNodeState(StringField questID, StringField questNodeID, QuestNodeState state, string questerID = null)
 {
     SetQuestNodeState(StringField.GetStringValue(questID), StringField.GetStringValue(questNodeID), state, questerID);
 }
Ejemplo n.º 27
0
 public MessageValue(StringField sf)
 {
     m_valueType   = MessageValueType.String;
     m_stringValue = StringField.GetStringValue(sf);
 }
Ejemplo n.º 28
0
        /// <summary>
        /// Adds the plan's steps.
        /// </summary>
        /// <param name="questBuilder">QuestBuilder.</param>
        /// <param name="domainName">Main target's domain.</param>
        /// <param name="goal">Goal step.</param>
        /// <param name="plan">List of steps that end with goal step.</param>
        /// <returns>The last node added.</returns>
        protected virtual QuestNode AddSteps(QuestBuilder questBuilder, string domainName, PlanStep goal, Plan plan)
        {
            var previousNode = questBuilder.GetStartNode();
            var counterNames = new HashSet <string>();

            for (int i = 0; i < plan.steps.Count; i++)
            {
                var step = plan.steps[i];

                // Create next condition node:
                var targetEntity     = step.fact.entityType.name;
                var targetDescriptor = step.fact.entityType.GetDescriptor(step.requiredCounterValue);
                var id            = (i + 1).ToString();
                var internalName  = step.action.displayName + " " + targetDescriptor;
                var conditionNode = questBuilder.AddConditionNode(previousNode, id, internalName, ConditionCountMode.All);
                previousNode = conditionNode;

                // Variables for node text tag replacement:
                var counterName          = string.Empty;
                int requiredCounterValue = 0;

                var completion = step.action.completion;
                if (completion.mode == ActionCompletion.Mode.Counter)
                {
                    // Setup counter condition:
                    counterName = goal.fact.entityType.pluralDisplayName.value + completion.baseCounterName.value;
                    if (!counterNames.Contains(counterName))
                    {
                        var counter = questBuilder.AddCounter(counterName, completion.initialValue, completion.minValue, completion.maxValue, false, completion.updateMode);
                        foreach (var messageEvent in completion.messageEventList)
                        {
                            var counterMessageEvent = new QuestCounterMessageEvent(messageEvent.targetID, messageEvent.message,
                                                                                   new StringField(StringField.GetStringValue(messageEvent.parameter).Replace("{TARGETENTITY}", targetEntity)),
                                                                                   messageEvent.operation, messageEvent.literalValue);
                            counter.messageEventList.Add(counterMessageEvent);
                        }
                    }
                    counterName          = goal.fact.entityType.pluralDisplayName.value + completion.baseCounterName.value;
                    requiredCounterValue = Mathf.Min(step.requiredCounterValue, step.fact.count);
                    questBuilder.AddCounterCondition(conditionNode, counterName, CounterValueConditionMode.AtLeast, requiredCounterValue);
                    // Consider: Add action to reset counter to zero in case future nodes repeat the same counter?
                }
                else
                {
                    // Setup message condition:
                    questBuilder.AddMessageCondition(conditionNode, QuestMessageParticipant.Any, completion.senderID, QuestMessageParticipant.Any, completion.targetID,
                                                     completion.message, new StringField(StringField.GetStringValue(completion.parameter).Replace("{TARGETENTITY}", targetEntity)));
                }

                var activeState = conditionNode.stateInfoList[(int)QuestNodeState.Active];

                AddStepNodeText(questBuilder, conditionNode, activeState, targetEntity, targetDescriptor, domainName, counterName, requiredCounterValue, step);

                // Actions when active:
                if (!StringField.IsNullOrEmpty(step.action.actionText.activeText.alertText))
                {
                    // Alert action:
                    var alertAction = questBuilder.CreateAlertAction(ReplaceStepTags(step.action.actionText.activeText.alertText.value, targetEntity, targetDescriptor, domainName, counterName, requiredCounterValue));
                    activeState.actionList.Add(alertAction);
                }

                // Send message action:
                if (!StringField.IsNullOrEmpty(step.action.sendMessageOnActive))
                {
                    var messageAction = questBuilder.CreateMessageAction(ReplaceStepTags(step.action.sendMessageOnActive.value, targetEntity, targetDescriptor, domainName, counterName, requiredCounterValue));
                    activeState.actionList.Add(messageAction);
                }

                // Actions when completed:
                if (!StringField.IsNullOrEmpty(step.action.sendMessageOnCompletion))
                {
                    var trueState     = conditionNode.stateInfoList[(int)QuestNodeState.True];
                    var messageAction = questBuilder.CreateMessageAction(ReplaceStepTags(step.action.sendMessageOnCompletion.value, targetEntity, targetDescriptor, domainName, counterName, requiredCounterValue));
                    trueState.actionList.Add(messageAction);
                }
            }
            return(previousNode);
        }
        protected virtual bool IsCounterConditionTrue(QuestCounter counter)
        {
            if (counter == null)
            {
                return(false);
            }
            if (requiredCounterValue == null)
            {
                if (Debug.isDebugBuild)
                {
                    Debug.LogWarning("QuestMachine: QuestCounterCondition.OnCounterChanged(" + StringField.GetStringValue(counter.name) + " = " + counter.currentValue + "): requiredCounterValue field is null. Please contact the developer.", quest);
                }
                return(false);
            }
            if (QuestMachine.debug)
            {
                Debug.Log("QuestMachine: QuestCounterCondition.OnCounterChanged(" + StringField.GetStringValue(counter.name) + " = " + counter.currentValue + ")", quest);
            }
            switch (counterValueMode)
            {
            case CounterValueConditionMode.AtLeast:
                if (counter.currentValue >= requiredCounterValue.GetValue(quest))
                {
                    return(true);
                }
                break;

            case CounterValueConditionMode.AtMost:
                if (counter.currentValue <= requiredCounterValue.GetValue(quest))
                {
                    return(true);
                }
                break;
            }
            return(false);
        }
Ejemplo n.º 30
0
 public int GetCounterIndex(StringField counterName)
 {
     return(GetCounterIndex(StringField.GetStringValue(counterName)));
 }