【调整】【重大】将配置中的多态类型字段由统一的__type__改成 excel优先$type,json优先$type,xml优先type,lua优先_type_,如果找不到再找默认__type__。

main
walon 2022-02-12 13:23:26 +08:00
parent e76b20b24f
commit 657bd19c77
18 changed files with 63 additions and 33 deletions

View File

@ -324,7 +324,7 @@ Reward为包含 "int item_id; int count; string desc; " 这三个字段的子结
<tr align="center"><td>##var</td><td>id</td><td colspan="4">shape</td><td colspan="4">shape2</td></tr> <tr align="center"><td>##var</td><td>id</td><td colspan="4">shape</td><td colspan="4">shape2</td></tr>
<tr align="center"><td>##type</td><td>int</td><td colspan="4">Shape</td><td colspan="4">Shape</td></tr> <tr align="center"><td>##type</td><td>int</td><td colspan="4">Shape</td><td colspan="4">Shape</td></tr>
<tr align="center"><td>##var</td><td></td><td>__type__</td><td>radius</td><td>width</td><td>height</td><td></td><td></td><td></td><td></td></tr> <tr align="center"><td>##var</td><td></td><td>$type</td><td>radius</td><td>width</td><td>height</td><td></td><td></td><td></td><td></td></tr>
<tr align="center"><td/><td>1</td><td>Circle</td><td>10</td><td/><td/><td>Circle</td><td>100</td><td></td><td></td></tr> <tr align="center"><td/><td>1</td><td>Circle</td><td>10</td><td/><td/><td>Circle</td><td>100</td><td></td><td></td></tr>
<tr align="center"><td/><td>2</td><td>Rectangle</td><td></td><td>10</td><td>20</td><td>矩形</td><td>10</td><td>20</td><td></td></tr> <tr align="center"><td/><td>2</td><td>Rectangle</td><td></td><td>10</td><td>20</td><td>矩形</td><td>10</td><td>20</td><td></td></tr>
<tr align="center"><td/><td>3</td><td></td><td>10</td><td/><td/><td>Triangle</td><td>15</td><td>15</td><td>15</td></tr> <tr align="center"><td/><td>3</td><td></td><td>10</td><td/><td/><td>Triangle</td><td>15</td><td>15</td><td>15</td></tr>
@ -404,14 +404,14 @@ Reward为包含 "int item_id; int count; string desc; " 这三个字段的子结
"executor": "SERVER", "executor": "SERVER",
"blackboard_id": "demo", "blackboard_id": "demo",
"root": { "root": {
"__type__": "Sequence", "$type": "Sequence",
"id": 1, "id": 1,
"node_name": "test", "node_name": "test",
"desc": "root", "desc": "root",
"services": [], "services": [],
"decorators": [ "decorators": [
{ {
"__type__": "UeLoop", "$type": "UeLoop",
"id": 3, "id": 3,
"node_name": "", "node_name": "",
"flow_abort_mode": "SELF", "flow_abort_mode": "SELF",
@ -422,7 +422,7 @@ Reward为包含 "int item_id; int count; string desc; " 这三个字段的子结
], ],
"children": [ "children": [
{ {
"__type__": "UeWait", "$type": "UeWait",
"id": 30, "id": 30,
"node_name": "", "node_name": "",
"ignore_restart_self": false, "ignore_restart_self": false,
@ -432,7 +432,7 @@ Reward为包含 "int item_id; int count; string desc; " 这三个字段的子结
"decorators": [] "decorators": []
}, },
{ {
"__type__": "MoveToRandomLocation", "$type": "MoveToRandomLocation",
"id": 75, "id": 75,
"node_name": "", "node_name": "",
"ignore_restart_self": false, "ignore_restart_self": false,

View File

@ -130,9 +130,9 @@ namespace Luban.Job.Cfg.DataConverts
{ {
if (data.Type.IsAbstractType) if (data.Type.IsAbstractType)
{ {
if (!x.SubTitles.TryGetValue(DefBean.TYPE_NAME_KEY, out var typeTitle)) if (!x.SubTitles.TryGetValue(DefBean.FALLBACK_TYPE_NAME_KEY, out var typeTitle) && !x.SubTitles.TryGetValue(DefBean.EXCEL_TYPE_NAME_KEY, out typeTitle))
{ {
throw new Exception($"多态bean:{data.Type.FullName} 缺失 {DefBean.TYPE_NAME_KEY} 标题列"); throw new Exception($"多态bean:{data.Type.FullName} 缺失 {DefBean.EXCEL_TYPE_NAME_KEY} 标题列");
} }
if (data.ImplType != null) if (data.ImplType != null)
{ {

View File

@ -35,7 +35,7 @@ namespace Luban.Job.Cfg.DataConverts
if (type.Type.IsAbstractType) if (type.Type.IsAbstractType)
{ {
x.WritePropertyName(DefBean.TYPE_NAME_KEY); x.WritePropertyName(DefBean.JSON_TYPE_NAME_KEY);
x.WriteStringValue(type.ImplType.Name); x.WriteStringValue(type.ImplType.Name);
} }

View File

@ -12,7 +12,7 @@ namespace Luban.Job.Cfg.DataConverts
{ {
class LuaConvertor : DataVisitors.ToLuaLiteralVisitor class LuaConvertor : DataVisitors.ToLuaLiteralVisitor
{ {
public static new LuaConvertor Ins { get; } = new(); //public static new LuaConvertor Ins { get; } = new();
private string _indentStr = ""; private string _indentStr = "";
@ -43,7 +43,7 @@ namespace Luban.Job.Cfg.DataConverts
x.AppendLine("{"); x.AppendLine("{");
if (type.Type.IsAbstractType) if (type.Type.IsAbstractType)
{ {
x.Append(subIndent).AppendLine($"_name = '{type.ImplType.Name}',"); x.Append(subIndent).AppendLine($"{DefBean.LUA_TYPE_NAME_KEY} = '{type.ImplType.Name}',");
} }
int index = 0; int index = 0;

View File

@ -36,7 +36,7 @@ namespace Luban.Job.Cfg.DataConverts
{ {
title.AddSubTitle(new Title() title.AddSubTitle(new Title()
{ {
Name = DefBean.TYPE_NAME_KEY, Name = DefBean.EXCEL_TYPE_NAME_KEY,
FromIndex = lastColumn + 1, FromIndex = lastColumn + 1,
ToIndex = lastColumn + 1, ToIndex = lastColumn + 1,
Tags = new Dictionary<string, string>(), Tags = new Dictionary<string, string>(),

View File

@ -112,9 +112,9 @@ namespace Luban.Job.Cfg.DataCreators
DefBean implBean; DefBean implBean;
if (bean.IsAbstractType) if (bean.IsAbstractType)
{ {
if (!x.TryGetProperty(DefBean.TYPE_NAME_KEY, out var typeNameProp)) if (!x.TryGetProperty(DefBean.FALLBACK_TYPE_NAME_KEY, out var typeNameProp) && !x.TryGetProperty(DefBean.JSON_TYPE_NAME_KEY, out typeNameProp))
{ {
throw new Exception($"结构:'{bean.FullName}' 是多态类型,必须用 '{DefBean.TYPE_NAME_KEY}' 字段指定 子类名"); throw new Exception($"结构:'{bean.FullName}' 是多态类型,必须用 '{DefBean.JSON_TYPE_NAME_KEY}' 字段指定 子类名");
} }
string subType = typeNameProp.GetString(); string subType = typeNameProp.GetString();
implBean = DataUtil.GetImplTypeByNameOrAlias(bean, subType); implBean = DataUtil.GetImplTypeByNameOrAlias(bean, subType);

View File

@ -153,11 +153,19 @@ namespace Luban.Job.Cfg.DataCreators
DefBean implBean; DefBean implBean;
if (bean.IsAbstractType) if (bean.IsAbstractType)
{ {
if (!table.ContainsKey(DefBean.TYPE_NAME_KEY)) string subType;
if (table.ContainsKey(DefBean.FALLBACK_TYPE_NAME_KEY))
{ {
throw new Exception($"结构:{bean.FullName} 是多态类型,必须用 {DefBean.TYPE_NAME_KEY} 字段指定 子类名"); subType = (string)table[DefBean.FALLBACK_TYPE_NAME_KEY];
}
else if(table.ContainsKey(DefBean.LUA_TYPE_NAME_KEY))
{
subType = (string)(table[DefBean.LUA_TYPE_NAME_KEY]);
}
else
{
throw new Exception($"结构:{bean.FullName} 是多态类型,必须用 {DefBean.LUA_TYPE_NAME_KEY} 字段指定 子类名");
} }
var subType = (string)table[DefBean.TYPE_NAME_KEY];
implBean = DataUtil.GetImplTypeByNameOrAlias(bean, subType); implBean = DataUtil.GetImplTypeByNameOrAlias(bean, subType);
} }
else else

View File

@ -399,10 +399,10 @@ namespace Luban.Job.Cfg.DataCreators
var originBean = (DefBean)type.Bean; var originBean = (DefBean)type.Bean;
if (originBean.IsAbstractType) if (originBean.IsAbstractType)
{ {
TitleRow typeTitle = row.GetSubTitleNamedRow(DefBean.TYPE_NAME_KEY); TitleRow typeTitle = row.GetSubTitleNamedRow(DefBean.FALLBACK_TYPE_NAME_KEY) ?? row.GetSubTitleNamedRow(DefBean.EXCEL_TYPE_NAME_KEY);
if (typeTitle == null) if (typeTitle == null)
{ {
throw new Exception($"type:'{originBean.FullName}' 是多态类型,需要定义'{DefBean.TYPE_NAME_KEY}'列来指定具体子类型"); throw new Exception($"type:'{originBean.FullName}' 是多态类型,需要定义'{DefBean.EXCEL_TYPE_NAME_KEY}'列来指定具体子类型");
} }
string subType = typeTitle.Current?.ToString()?.Trim(); string subType = typeTitle.Current?.ToString()?.Trim();
@ -421,10 +421,10 @@ namespace Luban.Job.Cfg.DataCreators
{ {
if (type.IsNullable) if (type.IsNullable)
{ {
TitleRow typeTitle = row.GetSubTitleNamedRow(DefBean.TYPE_NAME_KEY); TitleRow typeTitle = row.GetSubTitleNamedRow(DefBean.FALLBACK_TYPE_NAME_KEY) ?? row.GetSubTitleNamedRow(DefBean.EXCEL_TYPE_NAME_KEY);
if (typeTitle == null) if (typeTitle == null)
{ {
throw new Exception($"type:'{originBean.FullName}' 是可空类型,需要定义'{DefBean.TYPE_NAME_KEY}'列来指明是否可空"); throw new Exception($"type:'{originBean.FullName}' 是可空类型,需要定义'{DefBean.EXCEL_TYPE_NAME_KEY}'列来指明是否可空");
} }
string subType = typeTitle.Current?.ToString()?.Trim(); string subType = typeTitle.Current?.ToString()?.Trim();
if (subType == null || subType == DefBean.BEAN_NULL_STR) if (subType == null || subType == DefBean.BEAN_NULL_STR)

View File

@ -96,10 +96,14 @@ namespace Luban.Job.Cfg.DataCreators
DefBean implBean; DefBean implBean;
if (bean.IsAbstractType) if (bean.IsAbstractType)
{ {
string subType = x.Attribute(DefBean.TYPE_NAME_KEY)?.Value; string subType = x.Attribute(DefBean.FALLBACK_TYPE_NAME_KEY)?.Value;
if (string.IsNullOrEmpty(subType))
{
subType = x.Attribute(DefBean.XML_TYPE_NAME_KEY)?.Value;
}
if (string.IsNullOrWhiteSpace(subType)) if (string.IsNullOrWhiteSpace(subType))
{ {
throw new Exception($"bean:'{bean.FullName}'是多态,需要指定{DefBean.TYPE_NAME_KEY}属性.\n xml:{x}"); throw new Exception($"bean:'{bean.FullName}'是多态,需要指定{DefBean.XML_TYPE_NAME_KEY}属性.\n xml:{x}");
} }
implBean = DataUtil.GetImplTypeByNameOrAlias(bean, subType); implBean = DataUtil.GetImplTypeByNameOrAlias(bean, subType);
} }

View File

@ -102,7 +102,8 @@ namespace Luban.Job.Cfg.DataCreators
return new DText(key, text); return new DText(key, text);
} }
private static readonly YamlScalarNode s_typeNodeName = new(DefBean.TYPE_NAME_KEY); private static readonly YamlScalarNode s_typeNodeName = new(DefBean.FALLBACK_TYPE_NAME_KEY);
private static readonly YamlScalarNode s_typeNodeName2 = new(DefBean.JSON_TYPE_NAME_KEY);
public DType Accept(TBean type, YamlNode x, DefAssembly y) public DType Accept(TBean type, YamlNode x, DefAssembly y)
{ {
@ -112,10 +113,14 @@ namespace Luban.Job.Cfg.DataCreators
DefBean implBean; DefBean implBean;
if (bean.IsAbstractType) if (bean.IsAbstractType)
{ {
string subType = m.Children.TryGetValue(s_typeNodeName, out var typeNode) ? (string)typeNode : null; if (!m.Children.TryGetValue(s_typeNodeName, out var typeNode) && !m.Children.TryGetValue(s_typeNodeName2, out typeNode))
{
throw new Exception($"bean:'{bean.FullName}'是多态,需要指定{DefBean.JSON_TYPE_NAME_KEY}属性.\n xml:{x}");
}
string subType = (string)typeNode;
if (string.IsNullOrWhiteSpace(subType)) if (string.IsNullOrWhiteSpace(subType))
{ {
throw new Exception($"bean:'{bean.FullName}'是多态,需要指定{DefBean.TYPE_NAME_KEY}属性.\n xml:{x}"); throw new Exception($"bean:'{bean.FullName}'是多态,需要指定{DefBean.JSON_TYPE_NAME_KEY}属性.\n xml:{x}");
} }
implBean = DataUtil.GetImplTypeByNameOrAlias(bean, subType); implBean = DataUtil.GetImplTypeByNameOrAlias(bean, subType);
} }

View File

@ -104,7 +104,7 @@ namespace Luban.Job.Cfg.DataExporters
if (type.Type.IsAbstractType) if (type.Type.IsAbstractType)
{ {
x.WritePropertyName(DefBean.TYPE_NAME_KEY); x.WritePropertyName(DefBean.JSON_TYPE_NAME_KEY);
x.WriteStringValue(DataUtil.GetImplTypeName(type)); x.WriteStringValue(DataUtil.GetImplTypeName(type));
} }

View File

@ -183,7 +183,7 @@ namespace Luban.Job.Cfg.DataExporters
writer.WriteMapHeader(exportCount); writer.WriteMapHeader(exportCount);
if (type.Type.IsAbstractType) if (type.Type.IsAbstractType)
{ {
writer.Write(DefBean.TYPE_NAME_KEY); writer.Write(DefBean.JSON_TYPE_NAME_KEY);
writer.Write(DataUtil.GetImplTypeName(type)); writer.Write(DataUtil.GetImplTypeName(type));
} }

View File

@ -104,7 +104,7 @@ namespace Luban.Job.Cfg.DataExporters
if (type.Type.IsAbstractType) if (type.Type.IsAbstractType)
{ {
x.WritePropertyName(DefBean.TYPE_NAME_KEY); x.WritePropertyName(DefBean.JSON_TYPE_NAME_KEY);
x.WriteStringValue(DataUtil.GetImplTypeName(type)); x.WriteStringValue(DataUtil.GetImplTypeName(type));
} }

View File

@ -20,7 +20,7 @@ namespace Luban.Job.Cfg.DataVisitors
var x = new StringBuilder(); var x = new StringBuilder();
if (type.Type.IsAbstractType) if (type.Type.IsAbstractType)
{ {
x.Append($"{{ _name='{DataUtil.GetImplTypeName(type)}',"); x.Append($"{{ {DefBean.LUA_TYPE_NAME_KEY}='{DataUtil.GetImplTypeName(type)}',");
} }
else else
{ {

View File

@ -10,13 +10,21 @@ namespace Luban.Job.Cfg.Defs
{ {
public class DefBean : DefBeanBase public class DefBean : DefBeanBase
{ {
public const string TYPE_NAME_KEY = "__type__"; public const string FALLBACK_TYPE_NAME_KEY = "__type__";
public const string BEAN_NULL_STR = "null"; public const string BEAN_NULL_STR = "null";
public const string BEAN_NOT_NULL_STR = "{}"; public const string BEAN_NOT_NULL_STR = "{}";
public string JsonTypeNameKey => TYPE_NAME_KEY; public const string JSON_TYPE_NAME_KEY = "$type";
public const string XML_TYPE_NAME_KEY = "type";
public const string LUA_TYPE_NAME_KEY = "_type_";
public const string EXCEL_TYPE_NAME_KEY = "$type";
public string JsonTypeNameKey => JSON_TYPE_NAME_KEY;

View File

@ -37,7 +37,7 @@ namespace Luban.Job.Cfg.Utils
} }
case "convert_lua": case "convert_lua":
{ {
return LuaConvertor.Ins.ExportRecord(table, record); return (new LuaConvertor()).ExportRecord(table, record);
} }
default: default:
{ {

View File

@ -114,7 +114,7 @@ namespace Luban.Job.Common.Defs
this.ExternalSelectors = defines.ExternalSelectors; this.ExternalSelectors = defines.ExternalSelectors;
this.ExternalTypes = defines.ExternalTypes; this.ExternalTypes = defines.ExternalTypes;
this.Options = defines.Options; this.Options = defines.Options;
this.EditorTopModule = defines.Options.TryGetValue("editor.topmodule", out var editorTopModule) ? editorTopModule : TypeUtil.MakeFullName("editor", defines.TopModule); this.EditorTopModule = GetOptionOr("editor.topmodule", TypeUtil.MakeFullName("editor", defines.TopModule));
this.Args = args; this.Args = args;

View File

@ -303,5 +303,10 @@ namespace Luban.Job.Common.Defs
{ {
return DefAssemblyBase.LocalAssebmly.GetOption(optionName); return DefAssemblyBase.LocalAssebmly.GetOption(optionName);
} }
public static string GetOptionOr(string optionName, string defaultValue)
{
return DefAssemblyBase.LocalAssebmly.GetOptionOr(optionName, defaultValue);
}
} }
} }