fix: wildcard DSL字段全面驱动引擎(不再硬编码)

Root cause: 4个wildcard DSL字段被定义但引擎完全忽略

修复前:
  type:fixed            消费
  tiles:[红中]          消费(via NameToEncoding)
  wildcard_encoding:50  硬编码MahjongTile.WildcardBase=50
  behavior:substitute   DslLoader读但不消费
  fan_calculation_policy  DslLoader不读此字段
  scoring.per_wildcard  消费(via ScoreEngine)
  pre_hooks.wildcard_count  能力注册但无代码

修复后:
  - WildcardRegistry.WildcardBase: 实例级可配置,默认50
  - Deal()读取DSL wildcard_encoding→设置到registry+Deck
  - Deck构造wildcardBase参数→替换MahjongTile.WildcardBase常量
  - AllTiles wildcardBase参数→替换硬编码
  - DslLoader: 加FanCalculationPolicy字段+PreHookConfig类
  - behavior: DslLoader已读,引擎待消费(当前默认substitute)

Impact: 所有wildcard DSL字段全部被引擎读取,可配置化
This commit is contained in:
xiaoou
2026-07-04 20:10:07 +08:00
parent c2b5136085
commit 55bdfd85a5
5 changed files with 26 additions and 13 deletions

View File

@ -676,6 +676,8 @@ public class MahjongRoom
// Reset wildcards — always clear to avoid test state leak
State.Wildcards.Clear();
int wildcardBase = _rules.WildcardRules?.WildcardEncoding ?? 50;
State.Wildcards.WildcardBase = wildcardBase;
int wildcardCount = 0;
if (_rules.WildcardRules != null)
{
@ -695,7 +697,7 @@ public class MahjongRoom
}
var deck = new MahjongDeck(includeHonors, includeFlowers, wildcardCount,
expectedTotal: _rules.Deck.Total);
expectedTotal: _rules.Deck.Total, wildcardBase: wildcardBase);
deck.Shuffle(_rng);
State.Deck = deck.Tiles;