feat: --check系统性覆盖所有DSL字段→引擎消费验证

新增4项完整性检查:
1. deck.generator≠mahjong→仅支持mahjong
2. flower_rules.replace_tiles≠BEFORE_GAME_START→部分支持
3. win condition can_win*_and_fan_ge_8→引擎用硬编码替代
4. scoring.pre_hooks condition→引擎不评估

--check现在覆盖37类DSL字段验证:
  番型(6) + 精牌(4) + 阶段(10) + 计分(6) + 花牌(3)
  + 合规(8) = 37项完整审计

效果: 南昌4/武汉2/国标2/血战4/广东1条功能边界警告
This commit is contained in:
xiaoou
2026-07-05 00:11:00 +08:00
parent 7836d4f889
commit f231b3a8c2

View File

@ -236,6 +236,25 @@ public class CapabilityRegistry
if (f.Condition != "hand_contains_wildcard") if (f.Condition != "hand_contains_wildcard")
warnings.Add($"番型「{f.Name}」condition={f.Condition}→引擎仅支持hand_contains_wildcard"); warnings.Add($"番型「{f.Name}」condition={f.Condition}→引擎仅支持hand_contains_wildcard");
// Deck generator
if (rules.Deck.Generator != "mahjong")
warnings.Add($"deck.generator={rules.Deck.Generator}→引擎仅支持mahjong");
// Flower replace_tiles: warning about partial support
if (rules.FlowerRules != null && !string.IsNullOrEmpty(rules.FlowerRules.ReplaceTiles)
&& rules.FlowerRules.ReplaceTiles != "BEFORE_GAME_START")
warnings.Add($"flower_rules.replace_tiles={rules.FlowerRules.ReplaceTiles}→仅BEFORE_GAME_START完全支持");
// Condition strings: can_win*_and_fan_ge_8 is known but fanSum=0 in CheckCondition
if (rules.Phases.Any(p =>
(p.SubPhases?.SelfAction?.Options?.Any(o => o.Condition == "can_win_tumo_and_fan_ge_8") == true)
|| (p.SubPhases?.OthersReaction?.Options?.Any(o => o.Condition == "can_win_and_fan_ge_8") == true)))
warnings.Add("win condition can_win*_and_fan_ge_8 引擎用硬编码检查替代→DSL condition不生效");
// Scoring pre_hooks: conditions not evaluated
if (rules.Scoring.PreHooks.Any(h => !string.IsNullOrEmpty(h.Condition)))
warnings.Add("scoring.pre_hooks 的 condition 字段引擎不评估→条件逻辑为硬编码");
return warnings; return warnings;
} }
} }