예제 #1
0
        /// <summary>
        /// Maps a single choice
        /// </summary>
        /// <param name="data">Dialog Step Data</param>
        /// <param name="choice">Choice to map</param>
        /// <param name="npc">Npc object to which the dialog belongs</param>
        /// <param name="parentChoiceData">Choice data to which the choices belong</param>
        /// <returns>Mapped choice</returns>
        private async ValueTask <ScribanChoiceOption> MapSingleChoice(ExportDialogData data, TaleChoice choice, KortistoNpc npc, ScribanChoice parentChoiceData)
        {
            ExportDialogDataChild     choiceData      = data.Children.FirstOrDefault(c => c.NodeChildId == choice.Id);
            ScribanDialogStepBaseData childRenderData = null;

            if (choiceData != null && choiceData.Child != null)
            {
                childRenderData = new ScribanDialogStepBaseData();
                SetRenderObjectBaseDataFromFlexFieldObject(childRenderData, choiceData.Child, npc);
            }

            ScribanChoiceOption choiceOption = new ScribanChoiceOption();

            choiceOption.ChildNode     = childRenderData;
            choiceOption.Id            = choice.Id;
            choiceOption.Text          = ExportUtil.EscapeCharacters(choice.Text, _exportSettings.EscapeCharacter, _exportSettings.CharactersNeedingEscaping, _exportSettings.NewlineCharacter);
            choiceOption.UnescapedText = choice.Text;
            choiceOption.TextPreview   = ExportUtil.BuildTextPreview(choice.Text);
            choiceOption.IsRepeatable  = choice.IsRepeatable;
            choiceOption.Condition     = null;
            if (choice.Condition != null && !string.IsNullOrEmpty(choice.Condition.ConditionElements))
            {
                choiceOption.Condition = await _conditionRenderer.RenderCondition(_project, choice.Condition, _errorCollection, npc, _exportSettings);
            }
            choiceOption.ParentChoice = parentChoiceData;

            return(choiceOption);
        }
예제 #2
0
        /// <summary>
        /// Builds the export choices
        /// </summary>
        /// <param name="data">Dialog Step Data</param>
        /// <param name="choiceNode">Choice node</param>
        /// <param name="npc">Npc object to which the dialog belongs</param>
        /// <param name="parentChoiceData">Choice data to which the choices belong</param>
        /// <returns>List of choice options</returns>
        private async Task <List <ScribanChoiceOption> > BuildChoiceOptions(ExportDialogData data, TaleChoiceNode choiceNode, KortistoNpc npc, ScribanChoice parentChoiceData)
        {
            if (choiceNode.Choices == null)
            {
                return(new List <ScribanChoiceOption>());
            }

            List <ScribanChoiceOption> choiceOptions = new List <ScribanChoiceOption>();

            foreach (TaleChoice curChoice in choiceNode.Choices)
            {
                ScribanChoiceOption curChoiceOption = await MapSingleChoice(data, curChoice, npc, parentChoiceData);

                choiceOptions.Add(curChoiceOption);
            }

            return(choiceOptions);
        }
        /// <summary>
        /// Generates a language key from a call hierarchy
        /// </summary>
        /// <param name="templateContext">Template context</param>
        /// <param name="callerContext">Call context</param>
        /// <param name="callHierarchy">Call hierarchy</param>
        /// <returns>Language key</returns>
        private async ValueTask <object> GenerateLanguageKeyFromCallHierarchy(TemplateContext templateContext, ScriptNode callerContext, List <string> callHierarchy)
        {
            if (callHierarchy.Count < 2)
            {
                _errorCollection.AddCanNotGenerateLanguageKey(ScribanErrorUtil.FormatScribanSpan(callerContext.Span));
                return("<<INVALID ARGUMENTS FOR LANGKEY>>");
            }

            string objectNameValue     = StandardMemberRenamer.Rename(nameof(ScribanFlexFieldObject.Name));
            string fieldValue          = StandardMemberRenamer.Rename(nameof(ScribanFlexFieldField.Value));
            string unescapedFieldValue = StandardMemberRenamer.Rename(nameof(ScribanFlexFieldField.UnescapedValue));
            string textLineValue       = StandardMemberRenamer.Rename(nameof(ScribanTextLine.TextLine));
            string choiceText          = StandardMemberRenamer.Rename(nameof(ScribanChoiceOption.Text));
            string addQuestText        = StandardMemberRenamer.Rename(nameof(ScribanAddQuestTextActionData.Text));
            string floatingTextData    = StandardMemberRenamer.Rename(nameof(ScribanShowFloatingTextActionData.Text));

            if (callHierarchy[callHierarchy.Count - 1] == objectNameValue || callHierarchy[callHierarchy.Count - 1] == fieldValue || callHierarchy[callHierarchy.Count - 1] == unescapedFieldValue)
            {
                ScriptNode parentObjectExpression = BuildParentObjectValueScriptExpression(callHierarchy);
                object     parentObject           = templateContext.Evaluate(parentObjectExpression);
                if (parentObject == null)
                {
                    _errorCollection.AddCanNotGenerateLanguageKey(ScribanErrorUtil.FormatScribanSpan(callerContext.Span));
                    return("<<INVALID ARGUMENTS FOR LANGKEY>>");
                }

                if (parentObject is ScribanFlexFieldObject)
                {
                    ScribanFlexFieldObject langObject = (ScribanFlexFieldObject)parentObject;
                    return(await _languageKeyGenerator.GetFlexFieldNameKey(langObject.Id, langObject.Name, langObject.ExportObjectType));
                }
                else if (parentObject is ScribanFlexFieldField)
                {
                    return(await GenerateFlexFieldLanguageKey(callerContext, (ScribanFlexFieldField)parentObject));
                }
            }
            else if (callHierarchy[callHierarchy.Count - 1] == textLineValue)
            {
                ScriptNode parentObjectExpression = BuildParentObjectValueScriptExpression(callHierarchy);
                object     parentObject           = templateContext.Evaluate(parentObjectExpression);

                if (parentObject is ScribanTextLine)
                {
                    ScribanTextLine textLine = (ScribanTextLine)parentObject;
                    return(await _languageKeyGenerator.GetDialogTextLineKey(textLine.NodeObject.Id, textLine.NodeObject.Name, textLine.IsPlayerLine?ExportConstants.LanguageKeyTypePlayer : ExportConstants.LanguageKeyTypeNpc,
                                                                            textLine.NodeId, textLine.UnescapedTextLine));
                }
            }
            else if (callHierarchy[callHierarchy.Count - 1] == choiceText || callHierarchy[callHierarchy.Count - 1] == addQuestText || callHierarchy[callHierarchy.Count - 1] == floatingTextData)
            {
                ScriptNode parentObjectExpression = BuildParentObjectValueScriptExpression(callHierarchy);
                object     parentObject           = templateContext.Evaluate(parentObjectExpression);

                if (parentObject is ScribanChoiceOption)
                {
                    ScribanChoiceOption choiceOption = (ScribanChoiceOption)parentObject;
                    return(await _languageKeyGenerator.GetDialogTextLineKey(choiceOption.ParentChoice.NodeObject.Id, choiceOption.ParentChoice.NodeObject.Name, ExportConstants.LanguageKeyTypeChoice,
                                                                            string.Format("{0}_{1}", choiceOption.ParentChoice.NodeId, choiceOption.Id), choiceOption.UnescapedText));
                }
                else if (parentObject is ScribanAddQuestTextActionData)
                {
                    ScribanAddQuestTextActionData addQuestTextData = (ScribanAddQuestTextActionData)parentObject;
                    return(await _languageKeyGenerator.GetDialogTextLineKey(addQuestTextData.FlexFieldObject.Id, addQuestTextData.Quest.Name, ExportConstants.LanguageKeyTypeQuest, addQuestTextData.NodeStep.Id,
                                                                            addQuestTextData.UnescapedText));
                }
                else if (parentObject is ScribanShowFloatingTextActionData)
                {
                    ScribanShowFloatingTextActionData showFloatingTextData = (ScribanShowFloatingTextActionData)parentObject;
                    string languageKeyType = ExportConstants.LanguageKeyTypeNpc;
                    if (showFloatingTextData.TargetNpc != null && showFloatingTextData.TargetNpc.IsPlayer)
                    {
                        languageKeyType = ExportConstants.LanguageKeyTypePlayer;
                    }
                    return(await _languageKeyGenerator.GetDialogTextLineKey(showFloatingTextData.FlexFieldObject.Id, showFloatingTextData.FlexFieldObject.Name, languageKeyType, showFloatingTextData.NodeStep.Id,
                                                                            showFloatingTextData.UnescapedText));
                }
            }

            _errorCollection.AddCanNotGenerateLanguageKey(ScribanErrorUtil.FormatScribanSpan(callerContext.Span));
            return("<<UNSUPPORTED PROPERTY FOR LANGKEY>>");
        }