diff --git a/RuleEngine/Dsl/DslLoader.cs b/RuleEngine/Dsl/DslLoader.cs index e287ea1..fa0e101 100644 --- a/RuleEngine/Dsl/DslLoader.cs +++ b/RuleEngine/Dsl/DslLoader.cs @@ -132,17 +132,19 @@ public class CapabilityRegistry if (recognized < rules.FanTypes.Count) warnings.Add($"番型识别率: {recognized}/{rules.FanTypes.Count}→{rules.FanTypes.Count - recognized} 个番型得分为0"); - // Excludes/Conflicts 引用完整性: 引用的番型名必须存在于 fan_types + // Excludes/Conflicts 引用完整性 + // excludes: 用字符串匹配(不依赖_fanConfig), 只检查引擎是否可能生成该番型名 + // conflicts: 需要双方都在_fanConfig中才能比较BaseFan var fanNames = rules.FanTypes.Select(f => f.Name).ToHashSet(); foreach (var f in rules.FanTypes) { if (f.Excludes != null) foreach (var excluded in f.Excludes) - if (!fanNames.Contains(excluded)) - warnings.Add($"番型「{f.Name}」excludes 引用了不存在的番型「{excluded}」→排除规则失效"); + if (!enginePatterns.Contains(excluded)) // excludes work on string names, check engine can generate + warnings.Add($"番型「{f.Name}」excludes 引用了引擎不识别的番型「{excluded}」→排除规则无效(引擎不生成此名)"); if (f.Conflicts != null) foreach (var conflict in f.Conflicts) - if (!fanNames.Contains(conflict)) + if (!fanNames.Contains(conflict)) // conflicts need _fanConfig for comparison warnings.Add($"番型「{f.Name}」conflicts 引用了不存在的番型「{conflict}」→冲突规则失效"); } diff --git a/dsl-examples/guobiao.yaml b/dsl-examples/guobiao.yaml index f0b3387..7a58d5e 100644 --- a/dsl-examples/guobiao.yaml +++ b/dsl-examples/guobiao.yaml @@ -65,7 +65,7 @@ fan_types: - { name: 大于五, base_fan: 8, level: 5 } - { name: 小于五, base_fan: 8, level: 5 } # 6番 - - { name: 碰碰和, base_fan: 6, level: 4, conflicts: [暗七对] } + - { name: 碰碰和, base_fan: 6, level: 4, conflicts: [七对] } - { name: 混一色, base_fan: 6, level: 4, excludes: [缺一门] } - { name: 五门齐, base_fan: 6, level: 4 } - { name: 全求人, base_fan: 6, level: 4 }