fix: excludes引用检查用enginePatterns替代fanTypes(修正误报)

根因分析:
- excludes用字符串匹配(ApplyFanExclusions操作输出名单),不依赖_fanConfig
  例: 清一色excludes缺一门→引擎生成'缺一门'时排除生效,即使缺一门不在fan_types
  之前按fan_types检查导致误报(武汉4个/国标2个)
- conflicts需要双方都在_fanConfig才能比较BaseFan数值

修复:
- excludes: 改查enginePatterns(39个引擎可生成名)替代fanNames
- conflicts: 保持查fanNames(必须双方在_fan_config)
- guobiao.yaml: conflicts[暗七对]→[七对](引擎通过FanName解析返回七对)

效果: 武汉5→1 国标15→12 (消除误报,剩余为真缺失:圈风/门风等引擎不支持)
This commit is contained in:
xiaoou
2026-07-04 23:17:48 +08:00
parent 1576253caa
commit 488e96114f
2 changed files with 7 additions and 5 deletions

View File

@ -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}」→冲突规则失效");
}

View File

@ -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 }