/// <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); }
/// <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>>"); }