예제 #1
0
 public void CopyTo(QuestCounterMessageEvent messageEvent)
 {
     if (messageEvent == null)
     {
         Debug.LogWarning("Quest Machine: QuestCounterMessageEventProxy.CopyTo destination is null.");
         return;
     }
     messageEvent.senderSpecifier = sndSpec;
     messageEvent.senderID        = new StringField(snd);
     messageEvent.targetSpecifier = tgtSpec;
     messageEvent.targetID        = new StringField(tgt);
     messageEvent.message         = new StringField(msg);
     messageEvent.parameter       = new StringField(parm);
     messageEvent.operation       = op;
     messageEvent.literalValue    = val;
 }
예제 #2
0
 public void CopyFrom(QuestCounterMessageEvent messageEvent)
 {
     if (messageEvent == null)
     {
         Debug.LogWarning("Quest Machine: QuestCounterMessageEventProxy.CopyFrom source is null.");
         return;
     }
     sndSpec = messageEvent.senderSpecifier;
     snd     = StringField.GetStringValue(messageEvent.senderID);
     tgtSpec = messageEvent.targetSpecifier;
     tgt     = StringField.GetStringValue(messageEvent.targetID);
     msg     = StringField.GetStringValue(messageEvent.message);
     parm    = StringField.GetStringValue(messageEvent.parameter);
     op      = messageEvent.operation;
     val     = messageEvent.literalValue;
 }
예제 #3
0
        public static List <QuestCounterMessageEvent> CreateList(QuestCounterMessageEventProxy[] messageEventsProxy)
        {
            var list = new List <QuestCounterMessageEvent>();

            if (messageEventsProxy == null)
            {
                Debug.LogWarning("Quest Machine: QuestCounterMessageEventProxy.CreateList source is null.");
                return(list);
            }
            for (int i = 0; i < messageEventsProxy.Length; i++)
            {
                var messageEvent = new QuestCounterMessageEvent();
                messageEventsProxy[i].CopyTo(messageEvent);
                list.Add(messageEvent);
            }
            return(list);
        }
예제 #4
0
 public QuestCounterMessageEventProxy(QuestCounterMessageEvent messageEvent)
 {
     CopyFrom(messageEvent);
 }
예제 #5
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);
        }