From f231b3a8c2865caa312a15b06bbeaeb4761c06db Mon Sep 17 00:00:00 2001 From: xiaoou Date: Sun, 5 Jul 2026 00:11:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20--check=E7=B3=BB=E7=BB=9F=E6=80=A7?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E6=89=80=E6=9C=89DSL=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E2=86=92=E5=BC=95=E6=93=8E=E6=B6=88=E8=B4=B9=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增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条功能边界警告 --- RuleEngine/Dsl/DslLoader.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/RuleEngine/Dsl/DslLoader.cs b/RuleEngine/Dsl/DslLoader.cs index 2ea7783..baeefd5 100644 --- a/RuleEngine/Dsl/DslLoader.cs +++ b/RuleEngine/Dsl/DslLoader.cs @@ -236,6 +236,25 @@ public class CapabilityRegistry if (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; } }