using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; namespace Milimoe.FunGame.Core.Api.Utility { /// /// 视觉小说文本配置器 /// 文件会保存为:程序目录/(通常是 novels)//.json /// /// /// 新建一个配置文件,文件会保存为:程序目录/(通常是 novels)//.json /// /// /// public class NovelConfig(string novel_name, string file_name) : Dictionary { /// /// 配置文件存放的根目录 /// public static string RootPath { get; set; } = "novels"; /// /// 模组的名称 /// public string NovelName { get; set; } = novel_name; /// /// 配置文件的名称(后缀将是.json) /// public string FileName { get; set; } = file_name; /// /// 使用索引器给指定key赋值,不存在key会新增 /// /// /// public new NovelNode this[string key] { get => base[key]; set { if (value != null) Add(key, value); } } /// /// 获取指定key的value /// /// /// public NovelNode? Get(string key) { if (TryGetValue(key, out NovelNode? value) && value != null) { return value; } return null; } /// /// 添加一个配置,如果已存在key会覆盖 /// /// /// public new void Add(string key, NovelNode value) { if (value != null) { if (TryGetValue(key, out _)) base[key] = value; else base.Add(key, value); } } /// /// 从配置文件中读取配置。 /// /// 传入定义好的条件字典 public void LoadConfig(Dictionary>? Predicates = null) { string dpath = $@"{AppDomain.CurrentDomain.BaseDirectory}{RootPath}/{NovelName}"; string fpath = $@"{dpath}/{FileName}.json"; if (Directory.Exists(dpath) && File.Exists(fpath)) { string json = File.ReadAllText(fpath, General.DefaultEncoding); Dictionary dict = NetworkUtility.JsonDeserialize>(json) ?? []; Clear(); foreach (string key in dict.Keys) { NovelNode obj = dict[key]; base.Add(key, obj); if (obj.Values.TryGetValue(nameof(NovelNode.NextNodes), out object? value) && value is List nextKeys) { foreach (string nextKey in nextKeys) { if (dict.TryGetValue(nextKey, out NovelNode? node) && node != null) { obj.NextNodes.Add(node); } } } if (Predicates != null) { if (obj.Values.TryGetValue(nameof(NovelNode.AndPredicates), out object? value2) && value2 is List aps) { foreach (string ap in aps) { if (Predicates.TryGetValue(ap, out Func? value3) && value3 != null) { obj.AndPredicates[ap] = value3; } } } if (obj.Values.TryGetValue(nameof(NovelNode.OrPredicates), out value2) && value2 is List ops) { foreach (string op in ops) { if (Predicates.TryGetValue(op, out Func? value3) && value3 != null) { obj.OrPredicates[op] = value3; } } } } foreach (NovelOption option in obj.Options) { if (option.Values.TryGetValue(nameof(NovelOption.Targets), out object? value2) && value2 is List targets) { foreach (string targetKey in targets) { if (dict.TryGetValue(targetKey, out NovelNode? node) && node != null) { option.Targets.Add(node); } } } if (Predicates != null) { if (option.Values.TryGetValue(nameof(NovelNode.AndPredicates), out object? value3) && value3 is List aps) { foreach (string ap in aps) { if (Predicates.TryGetValue(ap, out Func? value4) && value4 != null) { option.AndPredicates[ap] = value4; } } } if (option.Values.TryGetValue(nameof(NovelNode.OrPredicates), out value3) && value3 is List ops) { foreach (string op in ops) { if (Predicates.TryGetValue(op, out Func? value4) && value4 != null) { option.OrPredicates[op] = value4; } } } } } } } } /// /// 将配置保存到配置文件。调用此方法会覆盖原有的.json,请注意备份 /// public void SaveConfig() { string json = NetworkUtility.JsonSerialize((Dictionary)this); string dpath = $@"{AppDomain.CurrentDomain.BaseDirectory}{RootPath}/{NovelName}"; string fpath = $@"{dpath}/{FileName}.json"; if (!Directory.Exists(dpath)) { Directory.CreateDirectory(dpath); } using StreamWriter writer = new(fpath, false, General.DefaultEncoding); writer.WriteLine(json); writer.Flush(); } } }