diff --git a/README.md b/README.md
index f74180e..69164eb 100644
--- a/README.md
+++ b/README.md
@@ -188,11 +188,15 @@ array与list类型都能表示列表,它们区别在于array生成的代码为
```
或者在 \_\_enums\_\_.xlsx 中 定义
-|##|full_name|item|alias|value|comment|tags|
-|- | - | - | - | - | - | - |
-||ItemQuality|WHITE|白|1|||
-||ItemQuality|GREEN|绿|2|||
-||ItemQuality|RED|红|3|||
+
+
+| ## | full_name | flags | unique | comment | tags | *items |
+| ##+ | | | | | | name | alias | value | comment | tags |
+ | ItemQuality | false | true | | | WHITE | 白 | 0 | | |
+ | | | | | | GREEN | 绿 | 1 | | |
+ | | | | | | RED | 红 | 2 | | |
+
+
数据表如下
@@ -360,8 +364,8 @@ xml中定义如下
| 1 | task1 | 1 | 10 | desc1 | 2 | 12 | desc2 | 3 | 13 | desc3 |
- | 2 | task1 | 3 | 30 | desc3 | 4 | 40 | desc4 |
- | 3 | task1 | 5 | 50 | desc5 |
+ | 2 | task1 | 3 | 30 | desc3 | 4 | 40 | desc4 | | | |
+ | 3 | task1 | 5 | 50 | desc5 | | | | | | |
### 多行结构列表
diff --git a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs
index eae5484..49e592b 100644
--- a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs
+++ b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs
@@ -52,16 +52,15 @@ namespace Luban.Job.Cfg.Defs
public Defines BuildDefines()
{
- return new Defines()
+ var defines = new Defines()
{
- TopModule = TopModule,
Patches = _patches,
- Enums = _enums,
- Beans = _beans,
Tables = _cfgTables,
Services = _cfgServices,
Groups = _cfgGroups,
};
+ BuildCommonDefines(defines);
+ return defines;
}
private static readonly List _excelImportRequireAttrs = new List { "name", "type" };
@@ -480,6 +479,36 @@ namespace Luban.Job.Cfg.Defs
}
var inputFileInfos = await DataLoaderUtil.CollectInputFilesAsync(this.Agent, this._importExcelEnumFiles, dataDir);
+
+ var ass = new DefAssembly("", null, new List(), Agent);
+
+ var enumItemType = new DefBean(new CfgBean()
+ {
+ Namespace = "__intern__",
+ Name = "__EnumItem__",
+ Parent = "",
+ Alias = "",
+ IsValueType = false,
+ Sep = "",
+ TypeId = 0,
+ IsSerializeCompatible = false,
+ Fields = new List
+ {
+ new CfgField() { Name = "name", Type = "string" },
+ new CfgField() { Name = "alias", Type = "string" },
+ new CfgField() { Name = "value", Type = "string" },
+ new CfgField() { Name = "comment", Type = "string" },
+ new CfgField() { Name = "tags", Type = "string" },
+ }
+ })
+ {
+ AssemblyBase = ass,
+ };
+ ass.AddType(enumItemType);
+ enumItemType.PreCompile();
+ enumItemType.Compile();
+ enumItemType.PostCompile();
+
var defTableRecordType = new DefBean(new CfgBean()
{
Namespace = "__intern__",
@@ -493,16 +522,17 @@ namespace Luban.Job.Cfg.Defs
Fields = new List
{
new CfgField() { Name = "full_name", Type = "string" },
- new CfgField() { Name = "item", Type = "string" },
- new CfgField() { Name = "alias", Type = "string" },
- new CfgField() { Name = "value", Type = "int" },
new CfgField() { Name = "comment", Type = "string" },
+ new CfgField() { Name = "flags", Type = "bool" },
new CfgField() { Name = "tags", Type = "string" },
+ new CfgField() { Name = "unique", Type = "bool" },
+ new CfgField() { Name = "items", Type = "list,__EnumItem__" },
}
})
{
- AssemblyBase = new DefAssembly("", null, new List(), Agent),
+ AssemblyBase = ass,
};
+ ass.AddType(defTableRecordType);
defTableRecordType.PreCompile();
defTableRecordType.Compile();
defTableRecordType.PostCompile();
@@ -514,7 +544,6 @@ namespace Luban.Job.Cfg.Defs
var bytes = await this.Agent.GetFromCacheOrReadAllBytesAsync(file.ActualFile, file.MD5);
var records = DataLoaderUtil.LoadCfgRecords(tableRecordType, file.OriginFile, null, bytes, true);
- PEnum curEnum = null;
foreach (var r in records)
{
DBean data = r.Data;
@@ -527,22 +556,26 @@ namespace Luban.Job.Cfg.Defs
}
string module = TypeUtil.GetNamespace(fullName);
- if (curEnum == null || curEnum.Name != name || curEnum.Namespace != module)
- {
- curEnum = new PEnum() { Name = name, Namespace = module, IsFlags = false, Comment = "", IsUniqueItemId = true };
- this._enums.Add(curEnum);
- }
+ DList items = (data.GetField("items") as DList);
- string item = (data.GetField("item") as DString).Value.Trim();
- if (string.IsNullOrWhiteSpace(item))
+ var curEnum = new PEnum()
{
- throw new Exception($"file:{file.ActualFile} module:'{module}' name:'{name}' 定义了一个空枚举项");
- }
- string alias = (data.GetField("alias") as DString).Value.Trim();
- string value = (data.GetField("value") as DInt).Value.ToString();
- string comment = (data.GetField("comment") as DString).Value.Trim();
- string tags = (data.GetField("tags") as DString).Value.Trim();
- curEnum.Items.Add(new EnumItem() { Name = item, Alias = alias, Value = value, Comment = comment, Tags = tags });
+ Name = name,
+ Namespace = module,
+ IsFlags = (data.GetField("flags") as DBool).Value,
+ Tags = (data.GetField("tags") as DString).Value,
+ Comment = (data.GetField("comment") as DString).Value,
+ IsUniqueItemId = (data.GetField("unique") as DBool).Value,
+ Items = items.Datas.Cast().Select(d => new EnumItem()
+ {
+ Name = (d.GetField("name") as DString).Value,
+ Alias = (d.GetField("alias") as DString).Value,
+ Value = (d.GetField("value") as DString).Value,
+ Comment = (d.GetField("comment") as DString).Value,
+ Tags = (d.GetField("tags") as DString).Value,
+ }).ToList(),
+ };
+ this._enums.Add(curEnum);
};
}
}
diff --git a/src/Luban.Job.Cfg/Source/RawDefs/Defines.cs b/src/Luban.Job.Cfg/Source/RawDefs/Defines.cs
index 0b9d2d2..9c6d04a 100644
--- a/src/Luban.Job.Cfg/Source/RawDefs/Defines.cs
+++ b/src/Luban.Job.Cfg/Source/RawDefs/Defines.cs
@@ -3,16 +3,10 @@ using System.Collections.Generic;
namespace Luban.Job.Cfg.RawDefs
{
- public class Defines
+ public class Defines : DefinesCommon
{
- public string TopModule { get; set; } = "";
-
public List Patches { get; set; } = new List();
- public List Beans { get; set; } = new List();
-
- public List Enums { get; set; } = new List();
-
public List Tables { get; set; } = new List();
public List Groups { get; set; } = new List();
diff --git a/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs b/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs
index 0b9bc92..1ab4e40 100644
--- a/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs
+++ b/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs
@@ -49,12 +49,14 @@ namespace Luban.Job.Common.Defs
protected readonly List _enums = new List();
protected readonly List _beans = new List();
+ protected readonly HashSet _externalSelectors = new();
protected CommonDefLoader(IAgent agent)
{
Agent = agent;
_rootDefineHandlers.Add("topmodule", SetTopModule);
+ _rootDefineHandlers.Add("externalselector", AddExternalSelector);
_moduleDefineHandlers.Add("module", AddModule);
_moduleDefineHandlers.Add("enum", AddEnum);
@@ -103,6 +105,14 @@ namespace Luban.Job.Common.Defs
protected string CurNamespace => _namespaceStack.Count > 0 ? _namespaceStack.Peek() : "";
+ protected void BuildCommonDefines(DefinesCommon defines)
+ {
+ defines.TopModule = TopModule;
+ defines.Enums = _enums;
+ defines.Beans = _beans;
+ defines.ExternalSelectors = _externalSelectors;
+ }
+
#region root handler
private void SetTopModule(XElement e)
@@ -327,6 +337,18 @@ namespace Luban.Job.Common.Defs
s_logger.Trace("add enum:{@enum}", en);
_enums.Add(en);
}
+
+ private static readonly List _selectorRequiredAttrs = new List { "name" };
+ private void AddExternalSelector(XElement e)
+ {
+ ValidAttrKeys(_rootXml, e, null, _selectorRequiredAttrs);
+ string name = XmlUtil.GetRequiredAttribute(e, "name");
+ if (!_externalSelectors.Add(name))
+ {
+ throw new LoadDefException($"定义文件:{_rootXml} externalselector name:{name} 重复");
+ }
+ s_logger.Info("add selector:{}", name);
+ }
#endregion
}
}
diff --git a/src/Luban.Job.Common/Source/GenArgsBase.cs b/src/Luban.Job.Common/Source/GenArgsBase.cs
index a5ec457..aa9cb2a 100644
--- a/src/Luban.Job.Common/Source/GenArgsBase.cs
+++ b/src/Luban.Job.Common/Source/GenArgsBase.cs
@@ -53,6 +53,9 @@ namespace Luban.Job.Common
[Option("cs:use_unity_vector", Required = false, HelpText = "use UnityEngine.Vector{2,3,4}")]
public bool CsUseUnityVectors { get; set; }
+ [Option("external:selectors", Required = false, HelpText = "external selectors")]
+ public string ExternalSelectors { get; set; }
+
public AccessConvention AccessConventionBeanMember { get; set; }
public bool ValidateOutouptCodeDir(ref string errMsg)
diff --git a/src/Luban.Job.Common/Source/RawDefs/DefinesCommon.cs b/src/Luban.Job.Common/Source/RawDefs/DefinesCommon.cs
new file mode 100644
index 0000000..289c868
--- /dev/null
+++ b/src/Luban.Job.Common/Source/RawDefs/DefinesCommon.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Luban.Job.Common.RawDefs
+{
+ public class DefinesCommon
+ {
+ public string TopModule { get; set; } = "";
+
+ public HashSet ExternalSelectors { get; set; } = new HashSet();
+
+ public List Beans { get; set; } = new List();
+
+ public List Enums { get; set; } = new List();
+ }
+}
diff --git a/src/Luban.Job.Db/Source/Defs/DbDefLoader.cs b/src/Luban.Job.Db/Source/Defs/DbDefLoader.cs
index 3e199d8..fc196e9 100644
--- a/src/Luban.Job.Db/Source/Defs/DbDefLoader.cs
+++ b/src/Luban.Job.Db/Source/Defs/DbDefLoader.cs
@@ -20,13 +20,12 @@ namespace Luban.Job.Db.Defs
public Defines BuildDefines()
{
- return new Defines()
+ var defines = new Defines()
{
- TopModule = TopModule,
- Enums = _enums,
- Beans = _beans,
DbTables = _tables,
};
+ BuildCommonDefines(defines);
+ return defines;
}
private readonly List _tableOptionalAttrs = new List { "memory", "comment" };
diff --git a/src/Luban.Job.Db/Source/RawDefs/Defines.cs b/src/Luban.Job.Db/Source/RawDefs/Defines.cs
index 9f9eaf2..2ab49be 100644
--- a/src/Luban.Job.Db/Source/RawDefs/Defines.cs
+++ b/src/Luban.Job.Db/Source/RawDefs/Defines.cs
@@ -3,14 +3,8 @@ using System.Collections.Generic;
namespace Luban.Job.Db.RawDefs
{
- public class Defines
+ public class Defines : DefinesCommon
{
- public string TopModule { get; set; } = "";
-
- public List Beans { get; set; } = new List();
-
- public List Enums { get; set; } = new List();
-
public List DbTables { get; set; } = new List();
}
}
diff --git a/src/Luban.Job.Proto/Source/Defs/ProtoDefLoader.cs b/src/Luban.Job.Proto/Source/Defs/ProtoDefLoader.cs
index c97d27d..2b2282b 100644
--- a/src/Luban.Job.Proto/Source/Defs/ProtoDefLoader.cs
+++ b/src/Luban.Job.Proto/Source/Defs/ProtoDefLoader.cs
@@ -24,14 +24,13 @@ namespace Luban.Job.Proto.Defs
public Defines BuildDefines()
{
- return new Defines()
+ var defines = new Defines()
{
- TopModule = TopModule,
- Enums = _enums,
- Beans = _beans,
Protos = _protos,
Rpcs = _rpcs,
};
+ BuildCommonDefines(defines);
+ return defines;
}
private readonly List rpcAttrs = new List { "id" };
diff --git a/src/Luban.Job.Proto/Source/RawDefs/Defines.cs b/src/Luban.Job.Proto/Source/RawDefs/Defines.cs
index 3a0d5e1..49aa4a7 100644
--- a/src/Luban.Job.Proto/Source/RawDefs/Defines.cs
+++ b/src/Luban.Job.Proto/Source/RawDefs/Defines.cs
@@ -3,16 +3,10 @@ using System.Collections.Generic;
namespace Luban.Job.Proto.RawDefs
{
- public class Defines
+ public class Defines : DefinesCommon
{
- public string TopModule { get; set; } = "";
-
public List ProtoServices { get; set; } = new List();
- public List Beans { get; set; } = new List();
-
- public List Enums { get; set; } = new List();
-
public List Protos { get; set; } = new List();
public List Rpcs { get; set; } = new List();