feat: --check全面报告引擎不支持的游戏规则

新增8类规则缺口检查(引擎功能边界):
1. on_eliminate未消费→淘汰逻辑基本实现
2. on_win未消费→胡牌终止默认行为
3. fu_flag硬编码过水→DSL值不生效
4. 花牌+deal action不一致→初始花牌不补
5. flower_rules.on_draw≠replace_and_draw→不支持
6. 玩家数≠4→引擎仅支持4人
7. draw.on_draw_flower/on_empty_deck≠引擎默认→硬编码
8. fan_type condition≠hand_contains_wildcard→不支持

效果: 南昌4/武汉2/国标1/血战3/广东1条警告
全部指向真实的引擎功能边界,用户可据此判断DSL规则是否能完整执行
This commit is contained in:
xiaoou
2026-07-05 00:07:23 +08:00
parent 39cb799287
commit 7836d4f889

View File

@ -198,6 +198,44 @@ public class CapabilityRegistry
if (rules.WildcardRules?.Type == "random")
warnings.Add("骰子翻牌定精: 冲关(精数×2^N)/德国(无精胡)计分规则引擎未实现");
// === 引擎功能边界警告: DSL可配置但引擎不支持或部分支持 ===
// 未消费字段
if (rules.Phases.Any(p => !string.IsNullOrEmpty(p.OnEliminate)))
warnings.Add("phase.on_eliminate 已配置但引擎未消费→淘汰逻辑为基本实现");
if (rules.Phases.Any(p => !string.IsNullOrEmpty(p.SubPhases?.OthersReaction?.OnWin)))
warnings.Add("phase.on_win 已配置但引擎未消费→胡牌终止为默认行为");
if (rules.Phases.Any(p => p.FuFlag != null))
warnings.Add("phase.fu_flag 已配置但引擎用硬编码过水→DSL值不生效");
// 花牌一致性
var dealPhase = rules.Phases.FirstOrDefault(p => p.Name == "deal");
if (rules.FlowerRules != null && dealPhase?.Action != "deal_cards_with_flowers")
warnings.Add("有flower_rules但deal action非deal_cards_with_flowers→初始花牌不补");
if (rules.FlowerRules != null && !string.IsNullOrEmpty(rules.FlowerRules.OnDraw)
&& rules.FlowerRules.OnDraw != "replace_and_draw")
warnings.Add($"flower_rules.on_draw={rules.FlowerRules.OnDraw}→引擎仅支持replace_and_draw");
// 玩家数
if ((rules.Game.Players?.Min ?? 4) != 4 || (rules.Game.Players?.Max ?? 4) != 4)
warnings.Add("玩家数≠4→引擎仅支持4人");
// Draw sub-phase 引擎硬编码
foreach (var p in rules.Phases)
{
var odf = p.SubPhases?.Draw?.OnDrawFlower;
if (!string.IsNullOrEmpty(odf) && odf != "replace")
warnings.Add($"phase「{p.Name}」draw.on_draw_flower={odf}→引擎仅支持replace");
var oe = p.SubPhases?.Draw?.OnEmptyDeck;
if (!string.IsNullOrEmpty(oe) && oe != "exhausted" && !rules.Phases.Any(ph => ph.ParallelElimination))
warnings.Add($"phase「{p.Name}」draw.on_empty_deck={oe}→引擎硬编码处理(血战除外)");
}
// Fan condition: 仅 hand_contains_wildcard 被引擎求值
foreach (var f in rules.FanTypes.Where(f => !string.IsNullOrEmpty(f.Condition)))
if (f.Condition != "hand_contains_wildcard")
warnings.Add($"番型「{f.Name}」condition={f.Condition}→引擎仅支持hand_contains_wildcard");
return warnings;
}
}