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