游戏厅接口文档

游戏厅 · 骗子酒馆规格(game = "liars_bar")

通用部分(接口、签名、公共字段、顺序、出错、兼容)见 游戏厅通用协议。OpenAPI 里对应的 schema 都以 LiarsBar 开头,见 tavern.openapi.json。

1. 规则摘要

和 Steam《Liar's Bar》的 Liar's Deck 模式基本一致:

牌面只有四种写法:"Q"、"K"、"A"、"JOKER"。手牌用位置号(1 到 5)标识,一小局内不变,出掉的就不再出现。

2. 新一轮:PUT /v1/games/liars_bar/matches/{match_id}/rounds/{round}

每小局开始时调用。

{
  "protocol": 1, "seq": 12, "game": "liars_bar", "match_id": "lb10212009abcd", "chat_id": "oc_xxx", "turn_id": 30,
  "you": {"seat": 2, "name": "初雪"},
  "round": 3,
  "target": "K",
  "hand": [{"slot": 1, "card": "Q"}, {"slot": 2, "card": "K"}, {"slot": 3, "card": "JOKER"},
           {"slot": 4, "card": "A"}, {"slot": 5, "card": "K"}],
  "order": [{"seat": 0, "name": "鹿饮"}, {"seat": 1, "name": "奶豆"}, {"seat": 2, "name": "初雪"}],
  "first": 0
}

hand 是你的私有信息;first 是这一小局先出牌的座位。

3. 轮到你:POST /v1/games/liars_bar/matches/{match_id}/turns/{turn_id}/decision

{
  "protocol": 1, "seq": 20, "game": "liars_bar", "match_id": "lb10212009abcd", "chat_id": "oc_xxx", "turn_id": 37,
  "you": {"seat": 2, "name": "初雪"},
  "round": 3,
  "target": "K",
  "hand": [{"slot": 2, "card": "K"}, {"slot": 3, "card": "JOKER"}, {"slot": 4, "card": "A"}],
  "can_challenge": true,
  "must_challenge": false,
  "last_play": {"seat": 1, "name": "奶豆", "count": 2},
  "pile": 3,
  "players": [
    {"seat": 0, "name": "鹿饮", "alive": true, "cards_left": 4, "shots_fired": 1, "is_bot": false},
    {"seat": 1, "name": "奶豆", "alive": true, "cards_left": 2, "shots_fired": 0, "is_bot": true},
    {"seat": 2, "name": "初雪", "alive": true, "cards_left": 3, "shots_fired": 2, "is_bot": true}
  ],
  "log": ["第 3 小局开始,目标牌 K", "鹿饮出了 1 张(声称都是 K),还剩 4 张。", "奶豆出了 2 张(声称都是 K),还剩 2 张。"],
  "chat": [{"name": "鹿饮", "text": "初雪你手里肯定没 K"}],
  "deadline_ms": 58000
}
字段 说明
hand 你现在的手牌(私有)
can_challenge 本小局第一手为 false
must_challenge 只剩你手里有牌时为 true,这时只能质疑
last_play 上一手:谁、出了几张(第一手为 null)
pile 本小局大家一共声称出了几张目标牌
players[].shots_fired 这个人的枪已经空响了几次;下一枪中弹概率是 1/(6 - shots_fired)
log 最近的公开播报
chat 牌局期间群里最近 10 条不是指令的发言
deadline_ms 这一手你还有多少毫秒回复:每手和真人一样 60 秒,荷官留 2 秒余量,一般是 58000

动作(响应体)

action 其他字段 合法条件
play slots:要出的牌的位置号,1 到 3 个、不重复、必须在手里 must_challenge 为 false
challenge 无 can_challenge 为 true
{"turn_id": 37, "action": "play", "slots": [3, 4]}
{"turn_id": 37, "action": "challenge"}

声称的牌自动算作本轮目标牌,不用填。

4. 事件:POST /v1/games/liars_bar/matches/{match_id}/events

{"event": "play", "seat": 2, "name": "初雪", "count": 2, "cards_left": 1}
{"event": "challenge", "challenger": {"seat": 0, "name": "鹿饮"}, "accused": {"seat": 2, "name": "初雪"},
 "revealed": ["JOKER", "A"], "lied": true, "shooter": {"seat": 2, "name": "初雪"}}
{"event": "shot", "seat": 2, "name": "初雪", "result": "click", "shots_fired": 3, "nth": 3}
{"event": "game_over", "winner": {"seat": 1, "name": "奶豆"}}

每条也都带着公共字段(protocol、seq、game、match_id、chat_id、turn_id、you),这里省略了。

event 字段说明
play 谁出了几张、还剩几张
challenge 谁质疑谁、翻出的牌、上一家有没有撒谎、谁要开枪
shot result:click 空枪,bang 中弹出局,misfire 哑火。nth:这把枪自上次装弹以来的第几枪,说“第几枪就响了”以它为准
game_over 通用事件。winner 为 null 表示中途散场

5. 时限

和通用协议一致:邀请 30 秒;decision 和真人一样每手 60 秒,以 deadline_ms 为准(2026-10-24 起,原来是 15 秒)。

6. 恶魔、混沌模式(2026-10-26 起)

开桌人可以选模式(报名卡上的按钮,或者 !骗子酒馆 恶魔、!骗子酒馆 混沌),规则见文末附:恶魔、混沌模式规则(局里的 rules 字段也会带上白话说明)。 接口和经典一样,只多了下面几处字段;没加这些字段的机器人照样能玩经典模式。

附:恶魔、混沌模式规则

恶魔牌(照搬原版)

项目 规则
牌堆 和经典一样(Q、K、A 各 6 张,Joker 2 张),但 Q、K、A 各有 1 张带恶魔标记
恶魔牌 每小局只有和目标牌同名的那张带标记的牌是恶魔牌(目标是 K,就只有恶魔 K 算)。别的带标记的牌就是普通牌
只能单出 恶魔牌只能一次出 1 张
被质疑翻出 出恶魔牌的人不开枪;质疑的人,加上其他手里还有牌的人,全部各开一枪。然后进下一小局
没被质疑 什么都不发生,算出掉了一张牌
人数条件 场上剩 3 人以上才生效;剩 2 人时恶魔牌当普通的目标牌

混沌(照搬原版第一版)

项目 规则
人数 2–4 人(原版也是最多 4 人,牌不够发 5 人)
牌堆 12 张:K、Q 各 5 张,混沌牌 1 张,主宰牌 1 张。目标牌只在 K、Q 里抽
手牌 每人 3 张,每次只能出 1 张
质疑翻出目标牌 质疑的人对自己开枪(和经典一样)
质疑翻出不是目标牌(撒谎) 质疑的人拿枪打别人:可以打被质疑的那个人,或者任何手里还有牌的人
质疑翻出主宰牌 被质疑的人拿枪打别人
质疑翻出混沌牌 所有活着的人同时各选一个人开枪
枪 打别人用的是开枪人自己的枪(6 格 1 发、开过的不重置)。实弹打中目标,目标出局
平局 混沌牌一轮大家同时开枪,全员阵亡就算平局