From 424178719b581d76d1413afa87e42f1bfe1c2e99 Mon Sep 17 00:00:00 2001 From: Oliver Wong Date: Fri, 27 Mar 2026 21:02:29 +0800 Subject: [PATCH] =?UTF-8?q?[partial]=20=E6=94=AF=E6=8C=81=E4=BD=BF?= =?UTF-8?q?=E7=94=A8AudioClipName=20=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ExcelTool/Parser/GenEnums.cs | 14 ++++- ExcelTool/Parser/GenModels.cs | 96 ++++++++++++++++++++++++++++++- ExcelTool/Parser/TableExcelRow.cs | 6 +- ExcelTool/TypeRegistry.cs | 4 +- 4 files changed, 109 insertions(+), 11 deletions(-) diff --git a/ExcelTool/Parser/GenEnums.cs b/ExcelTool/Parser/GenEnums.cs index be403c9..54c8859 100644 --- a/ExcelTool/Parser/GenEnums.cs +++ b/ExcelTool/Parser/GenEnums.cs @@ -50,7 +50,7 @@ namespace ExcelTool.Parser /// /// 将所有枚举的 Id 汇总,生成 EnumIds.cs 静态常量类 /// - public static bool GenEnumIds(List enumSheets, string outputDir, string nameSpace = "") + public static bool GenEnumIds(List enumSheet, string outputDir, string nameSpace = "") { try { @@ -62,11 +62,19 @@ namespace ExcelTool.Parser sb.Append("\tpublic static class EnumIds\n\t{\n"); - foreach (ParsedEnum enumSheet in enumSheets) - sb.Append($"\t\tpublic const uint {enumSheet.EnumName} = {enumSheet.Id};\n"); + foreach (ParsedEnum parsedEnum in enumSheet) + sb.AppendLine($"\t\tpublic const uint {parsedEnum.EnumName} = {parsedEnum.Id};\n"); + + sb.AppendLine("\t\tpublic static void RegisterAllGameState()\n\t\t{"); + foreach (ParsedEnum parsedEnum in enumSheet) + { + sb.AppendLine($"\t\t\tStateGroupRegistry.Register<{parsedEnum.EnumName}>({parsedEnum.Id});"); + } + sb.AppendLine("\t\t}"); sb.Append("\t}\n"); + if (!string.IsNullOrEmpty(nameSpace)) sb.Append("}\n"); diff --git a/ExcelTool/Parser/GenModels.cs b/ExcelTool/Parser/GenModels.cs index 9d22997..dbc909f 100644 --- a/ExcelTool/Parser/GenModels.cs +++ b/ExcelTool/Parser/GenModels.cs @@ -43,6 +43,12 @@ namespace ExcelTool.Parser sb.Append("}\n"); FileManager.WriteToFile(Path.Combine(outputDir, $"{sheet.SheetName}.cs"), sb.ToString()); + + // ── AudioObjectDefinitions 生成(仅针对 AudioObject 表) ───────────────────── + if (sheet.SheetName == "AudioObject") + { + GenerateAudioObjectDefinitions(parsedSheets, outputDir, nameSpace); + } } return true; @@ -161,7 +167,7 @@ namespace ExcelTool.Parser sb.Append($"\tList<{name}> m_{camel}InfoList;\n\n"); sb.Append($"\tpublic List<{name}> {name}List()\n\t{{\n"); - sb.Append($"\t\tthis.m_{camel}InfoList ??= new List<{name}>(m_{camel}Infos.Values);\n"); + sb.Append($"\t\tthis.m_{camel}InfoList ??= new List<{name}>(this.m_{camel}Infos.Values);\n"); sb.Append($"\t\treturn this.m_{camel}InfoList;\n\t}}\n\n"); sb.Append($"\tpublic void DeSerialize(BinaryReader reader)\n\t{{\n"); @@ -183,6 +189,94 @@ namespace ExcelTool.Parser sb.Append("\t}\n}\n"); } + private static void GenerateAudioObjectDefinitions(List parsedSheets, string outputDir, string nameSpace) + { + ParsedSheet audioSheet = parsedSheets.Find(s => s.SheetName == "AudioObject"); + if (audioSheet == null) return; + + // 假设字段名:Id(uint), Names(list) + Dictionary> idToNames = new(); + Dictionary> nameToIds = new(); + + int idIndex = audioSheet.Headers.FindIndex(h => h.FieldName == "Id"); + int namesIndex = audioSheet.Headers.FindIndex(h => h.FieldName == "Name"); + + foreach (TableExcelRow row in audioSheet.Data.Rows) + { + // 根据 Headers 找到列索引 + if (idIndex < 0 || namesIndex < 0) continue; + + if (string.IsNullOrEmpty(row.StrList[idIndex])) continue; + + uint id = Convert.ToUInt32(row.StrList[idIndex]); + + // Names 是用分隔符(例如 ',')拼接的字符串 + string rawNames = row.StrList[namesIndex]; + List names = new(rawNames.Split([','], StringSplitOptions.RemoveEmptyEntries)); + + idToNames[id] = names; + + foreach (var name in names) + { + if (!nameToIds.TryGetValue(name, out var list)) + { + list = new List(); + nameToIds[name] = list; + } + list.Add(id); + } + } + + StringBuilder sb = new(); + sb.Append("/* auto generated, do not modify */\n"); + sb.Append("using System.Collections.Generic;\n\n"); + + if (!string.IsNullOrEmpty(nameSpace)) + sb.Append($"namespace {nameSpace}\n{{\n"); + + sb.Append("public static class AudioObjectDefinitions\n{\n"); + + // NameToId + sb.Append("\tpublic static readonly Dictionary NameToId = new()\n\t{\n"); + foreach (var kv in nameToIds) + { + uint minId = uint.MaxValue; + foreach (uint id in kv.Value) + if (id < minId) minId = id; + + sb.Append($"\t\t{{ \"{kv.Key}\", {minId} }},\n"); + } + sb.Append("\t};\n\n"); + + // AmbiguousNames + sb.Append("\tpublic static readonly HashSet AmbiguousNames = new()\n\t{\n"); + foreach (var kv in nameToIds) + { + if (kv.Value.Count > 1) + sb.Append($"\t\t\"{kv.Key}\",\n"); + } + sb.Append("\t};\n\n"); + + // SharedIdNames + sb.Append("\tpublic static readonly HashSet SharedIdNames = new()\n\t{\n"); + foreach (var kv in idToNames) + { + var names = kv.Value; + for (int i = 1; i < names.Count; i++) + { + sb.Append($"\t\t\"{names[i]}\",\n"); + } + } + sb.Append("\t};\n"); + + sb.Append("}\n"); + + if (!string.IsNullOrEmpty(nameSpace)) + sb.Append("}\n"); + + FileManager.WriteToFile(Path.Combine(outputDir, "AudioObjectDefinitions.cs"), sb.ToString()); + } + // ────────────────────────────────────────────────────────────────────────── // 工具方法 // ────────────────────────────────────────────────────────────────────────── diff --git a/ExcelTool/Parser/TableExcelRow.cs b/ExcelTool/Parser/TableExcelRow.cs index e46d7b1..4221161 100644 --- a/ExcelTool/Parser/TableExcelRow.cs +++ b/ExcelTool/Parser/TableExcelRow.cs @@ -4,11 +4,7 @@ namespace ExcelTool.Parser { public class TableExcelRow { - public List StrList { get; set; } - public TableExcelRow() - { - StrList = new List(); - } + public List StrList { get; set; } = []; public void Add(string str) { diff --git a/ExcelTool/TypeRegistry.cs b/ExcelTool/TypeRegistry.cs index 0119b61..4dc8cdd 100644 --- a/ExcelTool/TypeRegistry.cs +++ b/ExcelTool/TypeRegistry.cs @@ -226,9 +226,9 @@ namespace ExcelTool "\t\telse\n" + "\t\t{\n" + $"\t\t\twriter.Write({name}.Count);\n" + - $"\t\t\tfor (int i = 0; i < {name}.Count; i++)\n" + + $"\t\t\tforeach (var t in {name})\n" + "\t\t\t{\n" + - $"\t\t\t\twriter.Write({name}[i]);\n" + + $"\t\t\t\twriter.Write(t);\n" + "\t\t\t}\n" + "\t\t}\n"; }