8 Commits

Author SHA1 Message Date
196786f1a7 fix(DSL): 南昌删除非南昌规则番型(清一色/混一色/带幺九/缺一门/无字)
南昌麻将无清一色/混一色/带幺九概念,只保留:
对对胡(碰碰胡)/暗七对(七对)/杠上开花/海底捞月/抢杠胡/天胡/地胡/癞子胡/鸡胡

--check: 6→5条警告(去掉base_fan=0误报)
2026-07-05 01:45:32 +08:00
d5329e5b0c feat: 精分独立计分模式(independent_bonus)
引擎原算法: (底分+精分)×倍数 → 精分被庄家/自摸放大
南昌实际: 底分×倍数 + 精分 → 精分不参与倍数

新增DSL字段 wildcard_rules.scoring.independent_bonus:
- false(默认): 精分混入底分(现有行为,向后兼容)
- true(南昌): 精分独立加在倍数之后

代码: ScoreEngine.Settle → multiplierPart(底分×倍数) + addPart(精分)
自摸: 精分只加给赢家一次(不计入倍数)
点炮: 精分计入pay总额(放炮者全额支付)
2026-07-05 01:37:57 +08:00
a40b64cc1f fix(DSL): 南昌per_wildcard_in_win 1→2(精=2子)
南昌麻将: 每张精+2子,非+1番。鸡胡=1子,2张精=4子,
庄家点炮×2 → (1+4)×2=10。修复前per_wildcard=1→(1+2)×2=6过低
2026-07-05 01:26:03 +08:00
4bc64eda04 fix(DSL): 南昌麻将加all_orphans + --check提醒十三烂
南昌麻将需要全不靠/十三烂牌型支持:
- dsl: requires加 meldsolver.all_orphans
- --check: type=random时未配all_orphans→建议添加

能力注册: 7/7→8/8(100%), 十三烂牌型现在可识别
2026-07-05 00:50:21 +08:00
e3ff0f057e feat: DSL字段 wildcard_rules.meld_mode (standard/any)
之前: 特殊风牌组合是'隐式规则',硬编码在type=random检查中
现在: YAML声明 meld_mode: any (南昌麻将),引擎检查并报告不支持

WildcardConfig新增MeldMode字段(默认standard):
- standard: 仅顺子/刻子/对子(引擎支持)
- any: 任意3张可配面子(南昌麻将,引擎不支持)

--check: meld_mode=any → '引擎未实现→仅支持standard'
规则从'隐式'变为DSL可表达的显式规则
2026-07-05 00:40:03 +08:00
96068ed007 fix(DSL): 南昌麻将加吃牌(chi)
南昌麻将应有吃牌, DSL遗漏此操作。加后胡牌率60%→85%.
2026-07-04 23:56:17 +08:00
248af7642d feat: 计分倍数可配置化 (自摸/点炮/庄家)
ScoringDslConfig + ScoringConfig 新增:
- self_draw_multiplier (默认1): 自摸每家付 baseFan × N
- discard_win_multiplier (默认3): 放炮者付 baseFan × N
- dealer_multiplier (默认1): 庄家输赢 × N

ScoreEngine.Settle:
- 硬编码 *3 → 读 DiscardWinMultiplier
- 庄家倍数: dealerWon→所有人付倍数; 闲家赢→仅庄家付倍数

南昌麻将 DSL: self_draw=1, discard_win=1, dealer=2

58 tests pass, 5 variants all 0 errors
2026-07-04 21:12:45 +08:00
ae9c4c4142 feat: EndConditions映射 + 骰子翻牌定精(random wildcard)
EndConditions:
- BuildPhases 现在映射 PhaseConfig.Endconditions (之前 DslLoader 解析但 BuildPhases 忽略)
- 4处 _rules.Phases.Any(p => p.ParallelElimination) → _playPhase.ParallelElimination
- 新增 _playPhase 字段, 游戏不再依赖原始 DSL 做运行时判断

Random wildcard (骰子翻牌定精):
- WildcardRegistry.ComputeNextTiles(): 翻到 X → 正精=X+1, 副精=X+2 (9→1 循环, 字牌序循环)
- WildcardRegistry.RevealedTile 记录翻到的牌
- Deal() 发牌后翻一张牌确定精, 支持 random_count 控制精数量
- WildcardConfig 新增 RandomCount 字段 (默认2=正精+副精)
- ValidateRuleCompliance 接受 random 类型

南昌麻将 DSL:
- 新增 dsl-examples/nanchang.yaml (136张, random精, 无吃)
- 引擎加载 7/7, 1000局 0错误, 胡牌率 61%

58 tests pass, 5 种玩法全部 0 错误验证通过
2026-07-04 21:06:16 +08:00