feat: add Shanghai Mahjong DSL (上海敲麻)
144 tiles, no chi, flower scoring, 11 fan types. Knocking (declare ting) noted as unsupported engine gap.
This commit is contained in:
118
dsl-examples/shanghai.yaml
Normal file
118
dsl-examples/shanghai.yaml
Normal file
@ -0,0 +1,118 @@
|
||||
# 上海麻将 (上海敲麻) DSL 配置
|
||||
#
|
||||
# 规则概要:
|
||||
# - 144张牌 (万条筒108 + 东南西北中发白28 + 春夏秋冬梅兰竹菊8)
|
||||
# - 不可吃牌 (敲麻模式核心特征)
|
||||
# - 花牌计分: 每张花牌+1番, 对应花配对(春梅/夏兰/秋竹/冬菊)+1番
|
||||
# - 番型叠加 (all fans add up)
|
||||
# - 一人胡牌即结束 (非血战)
|
||||
#
|
||||
# 引擎已知限制 (合规检查会警告):
|
||||
# - "敲" 机制 (declare ting) 不支持: 上海敲麻核心规则是必须声明听牌才能胡牌,
|
||||
# 引擎无此概念, 配置中未表达。模拟运行时所有玩家均可随时胡牌。
|
||||
# - 包三家 (discarder pays all): 引擎计分模块不支持此结算模式。
|
||||
# - 全花计分 (春夏秋冬齐/梅兰竹菊齐): 引擎 flower_rules 仅支持单张+配对,
|
||||
# 不支持"集齐四花"额外加分。
|
||||
# - 番型: 圈风刻/门风刻/箭刻 不在引擎识别列表中。
|
||||
# - 缺一门/无字 为结构性 marker fan (base_fan=0), 仅用于 excludes 互斥。
|
||||
|
||||
game:
|
||||
name: 上海麻将
|
||||
type: mahjong
|
||||
engine_type: mahjong
|
||||
players: { min: 4, max: 4 }
|
||||
|
||||
requires:
|
||||
- deck.generator_mahjong
|
||||
- meldsolver.standard_win
|
||||
- meldsolver.seven_pairs
|
||||
- deck.flower_cards
|
||||
- phase.mahjong_turn
|
||||
- phase.priority_arbitration
|
||||
- scoring.fan_exclusion
|
||||
|
||||
deck:
|
||||
generator: mahjong
|
||||
include_honors: true
|
||||
include_flowers: true
|
||||
total: 144
|
||||
|
||||
deal:
|
||||
cards_per_player: 13
|
||||
dealer_extra: 1
|
||||
|
||||
flower_rules:
|
||||
on_draw: replace_and_draw
|
||||
replace_tiles: BEFORE_GAME_START
|
||||
scoring:
|
||||
normal: 1
|
||||
matching:
|
||||
value: 1
|
||||
mapping:
|
||||
1: [春, 梅]
|
||||
2: [夏, 兰]
|
||||
3: [秋, 竹]
|
||||
4: [冬, 菊]
|
||||
|
||||
fan_types:
|
||||
# ── 基础番型 ──
|
||||
- { name: 碰碰胡, base_fan: 2 }
|
||||
- { name: 混一色, base_fan: 4, excludes: [缺一门] }
|
||||
- { name: 清一色, base_fan: 8, excludes: [缺一门, 无字] }
|
||||
- { name: 七对, base_fan: 4, excludes: [门前清, 单钓将] }
|
||||
- { name: 全求人, base_fan: 4 }
|
||||
- { name: 字一色, base_fan: 16, excludes: [缺一门, 混一色, 碰碰胡] }
|
||||
# ── 事件番型 ──
|
||||
- { name: 杠上开花, base_fan: 1, excludes: [海底捞月] }
|
||||
- { name: 海底捞月, base_fan: 1 }
|
||||
- { name: 抢杠胡, base_fan: 1 }
|
||||
- { name: 天胡, base_fan: 32 }
|
||||
- { name: 地胡, base_fan: 16 }
|
||||
# ── 兜底 ──
|
||||
- { name: 鸡胡, base_fan: 1 }
|
||||
|
||||
fan_stacking: add
|
||||
max_fan: 999
|
||||
|
||||
phases:
|
||||
- name: deal
|
||||
type: auto
|
||||
action: deal_cards_with_flowers
|
||||
next: play
|
||||
|
||||
- name: play
|
||||
type: mahjong_turn
|
||||
turn_order: counter_clockwise
|
||||
sub_phases:
|
||||
draw:
|
||||
type: auto
|
||||
action: draw_card
|
||||
on_draw_flower: replace
|
||||
on_empty_deck: exhausted
|
||||
self_action:
|
||||
options:
|
||||
- { action: discard }
|
||||
- { action: an_kong }
|
||||
- { action: bu_kong, condition: has_punged_pair }
|
||||
- { action: win, condition: can_win_tumo }
|
||||
others_reaction:
|
||||
options:
|
||||
# 上海敲麻不可吃 — chi 不在此列表中
|
||||
- { action: pung, priority: 2, condition: has_two_same }
|
||||
- { action: ming_kong, priority: 3, condition: has_three_same }
|
||||
- { action: win, priority: 4, condition: can_win }
|
||||
- { action: pass, priority: 0 }
|
||||
priority_policy: highest_wins
|
||||
on_win: game_over
|
||||
end_conditions:
|
||||
- { type: player_wins, action: settle }
|
||||
- { type: deck_exhausted, action: draw_game }
|
||||
|
||||
- name: settle
|
||||
type: auto
|
||||
action: calculate_scores
|
||||
next: null
|
||||
|
||||
scoring:
|
||||
mode: fan_table
|
||||
max_cap: 999
|
||||
Reference in New Issue
Block a user