问题1: 圈风/门风/单钓将/四归一在南昌武汉等非Guobiao玩法中误生成
修复: 4个新识别器加 _fanConfig.ContainsKey() 守卫,只有配了才生成
Guobiao DSL 补充4个番型定义(圈风2/门风2/四归一2/单钓将1)
问题2: 翻牌定精信息未在demo显示
修复: RenderDeal() 显示精牌(翻牌+正精+副精)
问题3: TileName?{tile}→ToStringCore(tile)
修复: 带🀫前缀的数字牌显示 '🀫3万' 而非 '🀫?21'
131 lines
3.9 KiB
YAML
131 lines
3.9 KiB
YAML
game:
|
|
name: 国标麻将
|
|
type: mahjong
|
|
engine_type: mahjong
|
|
players: { min: 4, max: 4 }
|
|
|
|
requires:
|
|
- deck.generator_mahjong
|
|
- deck.flower_cards
|
|
- meldsolver.standard_win
|
|
- meldsolver.seven_pairs
|
|
- meldsolver.thirteen_orphans
|
|
- meldsolver.all_orphans
|
|
- meldsolver.double_dragon
|
|
- 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
|
|
scoring:
|
|
normal: 1
|
|
matching:
|
|
value: 1
|
|
mapping:
|
|
1: [春, 梅]
|
|
2: [夏, 兰]
|
|
3: [秋, 竹]
|
|
4: [冬, 菊]
|
|
|
|
win_min_fan: 8
|
|
fan_stacking: add_max
|
|
|
|
fan_types:
|
|
# 88番
|
|
- { name: 大四喜, base_fan: 88, level: 12, excludes: [圈风, 门风, 三风] }
|
|
- { name: 大三元, base_fan: 88, level: 12, excludes: [双箭刻] }
|
|
- { name: 十三幺, base_fan: 88, level: 12, excludes: [五门齐, 门前清, 单钓将, 混幺九] }
|
|
- { name: 连七对, base_fan: 88, level: 12, excludes: [七对, 门前清, 单钓将, 清一色, 无字] }
|
|
# 64番
|
|
- { name: 小四喜, base_fan: 64, level: 11, excludes: [三风] }
|
|
- { name: 小三元, base_fan: 64, level: 11, excludes: [双箭刻] }
|
|
- { name: 字一色, base_fan: 64, level: 11, excludes: [碰碰和, 全带幺, 混幺九, 缺一门] }
|
|
# 48番
|
|
- { name: 一色四同顺, base_fan: 48, level: 10, excludes: [一色三同顺, 四归一, 一般高] }
|
|
# 24番
|
|
- { name: 清一色, base_fan: 24, level: 8, excludes: [无字, 缺一门] }
|
|
- { name: 七对, base_fan: 24, level: 8, excludes: [门前清, 单钓将] }
|
|
- { name: 全双, base_fan: 24, level: 8 }
|
|
# 12番
|
|
- { name: 全大, base_fan: 12, level: 6 }
|
|
- { name: 全中, base_fan: 12, level: 6 }
|
|
- { name: 全小, base_fan: 12, level: 6 }
|
|
# 8番
|
|
- { name: 大于五, base_fan: 8, level: 5 }
|
|
- { name: 小于五, base_fan: 8, level: 5 }
|
|
# 6番
|
|
- { name: 碰碰和, base_fan: 6, level: 4, conflicts: [七对] }
|
|
- { name: 混一色, base_fan: 6, level: 4, excludes: [缺一门] }
|
|
- { name: 五门齐, base_fan: 6, level: 4 }
|
|
- { name: 全求人, base_fan: 6, level: 4 }
|
|
# 4番
|
|
- { name: 全带幺, base_fan: 4, level: 3, excludes: [缺一门] }
|
|
# 2番
|
|
- { name: 断幺九, base_fan: 2, level: 2 }
|
|
- { name: 平和, base_fan: 2, level: 2 }
|
|
- { name: 门前清, base_fan: 2, level: 2 }
|
|
# 2番
|
|
- { name: 圈风, base_fan: 2, level: 2 }
|
|
- { name: 门风, base_fan: 2, level: 2 }
|
|
- { name: 四归一, base_fan: 2, level: 2 }
|
|
# 1番
|
|
- { name: 缺一门, base_fan: 1, level: 1 }
|
|
- { name: 无字, base_fan: 1, level: 1 }
|
|
- { name: 单钓将, base_fan: 1, level: 1 }
|
|
# 兜底
|
|
- { name: 鸡胡, base_fan: 1, level: 0 }
|
|
|
|
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_and_fan_ge_8 }
|
|
others_reaction:
|
|
options:
|
|
- { action: chi, priority: 1, condition: can_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_and_fan_ge_8 }
|
|
- { 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
|