Files

87 lines
2.6 KiB
C#

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<int> _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();
/// <summary>
/// 选择该选项
/// </summary>
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<string> nodeTags,
Action<int> onOptionSelected)
{
var tags = nodeTags ?? Array.Empty<string>();
return dialogueOptions.Select(item =>
{
var lineId = item.TextID;
var metadata = item.Line.Metadata ?? Array.Empty<string>();
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;
}
}