using System; using System.Collections.Generic; using System.Linq; using AibisDream.Framework; using AibisDream.Kit; using AibisDream.Utility; using UnityEngine; using Yarn.Unity; namespace AibisDream { public struct DialogOption { private Action _onOptionSelected; private DialogueOption _option; public bool IsAvailable => _option.IsAvailable; public bool IsTrackable { get; private set; } public bool IsExplored { get; private set; } public string LineId => _option.TextID; public string Line => _option.Line.TextWithoutCharacterName.Text; public CharacterVo Character => _option.Line.GetCharacterVo(); /// /// 选择该选项 /// public void Select() { if (!_option.IsAvailable) { Debug.Log($"{_option.Line} 不可用"); return; } EnumEventSystem.Global.Send(DialogEventEnum.OptionSelected, TransToLine()); _onOptionSelected.Invoke(_option.DialogueOptionID); } private LineInfo TransToLine() { return new LineInfo { isOption = true, lineId = _option.TextID, lineText = _option.Line.TextWithoutCharacterName.Text, character = _option.Line.GetCharacterVo(), isAutoSkip = false }; } public static DialogOption[] GeneOptions( DialogueOption[] dialogueOptions, OptionExploreTracker tracker, string nodeName, IReadOnlyList nodeTags, Action onOptionSelected) { var tags = nodeTags ?? Array.Empty(); return dialogueOptions.Select(item => { var lineId = item.TextID; var metadata = item.Line.Metadata ?? Array.Empty(); var (isTrackable, isExplored) = tracker != null ? tracker.Evaluate(lineId, metadata, nodeName, tags) : (false, false); return new DialogOption { _option = item, _onOptionSelected = onOptionSelected, IsTrackable = isTrackable, IsExplored = isExplored }; }).ToArray(); } } [Serializable] public struct TextParam { public float charSpace; public float lineSpace; public int maxCharNum; } }