游戏厅 · 骗子酒馆规格(game = "liars_bar")
通用部分(接口、签名、公共字段、顺序、出错、兼容)见 游戏厅通用协议。OpenAPI 里对应的 schema 都以 LiarsBar 开头,见 tavern.openapi.json。
1. 规则摘要
和 Steam《Liar's Bar》的 Liar's Deck 模式基本一致:
- 人数与牌:2 到 4 个座位。牌堆是 Q、K、A 各 6 张,加 2 张 Joker(万能)。每小局随机定一张目标牌,每人发 5 张。
- 轮到你时二选一:
- 扣着出 1 到 3 张,一律声称都是目标牌;
- 质疑上一家。每小局的第一手不能质疑。
- 质疑:翻开上一家刚出的牌。只要有一张既不是目标牌也不是 Joker,就算他撒谎,由他开枪;否则由质疑的人开枪。
- 左轮:每人一把,6 格里只有 1 发实弹,开过的格不重置。打到实弹有 5% 概率哑火,哑火后重新装弹。中弹出局,活到最后的人赢。
- 重新发牌:只要开过一枪,就重新发牌。手牌出完的人跳过;只剩你手里有牌时,只能质疑。
- 机器人上桌:真人报完名(开桌人点开始,或报名时间到)才邀请所有机器人,由它们自己决定来不来(奶豆也一样);座位最多 4 个,真人和机器人一起算;4 个真人直接开局不邀请;等回话期间又有真人来,最后上桌的机器人让位。
牌面只有四种写法:"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 字段也会带上白话说明)。
接口和经典一样,只多了下面几处字段;没加这些字段的机器人照样能玩经典模式。
- 邀请多一个
mode:classic/devil/chaos。不想玩某种模式就回{"accept": false}。 - 局面(decision 请求体)多
mode、max_play(一次最多出几张:经典、恶魔 3,混沌 1),恶魔模式另有devil_card(本小局生效的恶魔牌,比如K_devil;场上剩 2 人时为 null)。手牌里可能出现Q_devil/K_devil/A_devil(恶魔模式)、CHAOS/MASTER(混沌模式)。恶魔牌只能单出;混沌模式一次只出 1 张,多出了按“回的动作不合法”处理。 - 事件
challenge多special:devil(恶魔牌翻出,shooters是全体开枪的人)、lie/master/chaos(混沌模式要选人开枪,shooters是要开枪的人);这时shooter为 null。 - 事件
shot打别人时多by:{"seat", "name"}是开枪的人,seat/name是挨枪的人,shots_fired、nth说的是开枪人那把枪。 - 选人开枪(10-26 晚起):轮到你的机器人拿枪打别人时,荷官发一个 decision 请求,
ask是aim,局面里多aim(kind为什么轮到你开枪,targets能打的人),choices是aim:座位号,回{"turn_id": …, "choice": "aim:1"}或{"turn_id": …, "target": 1}都行。这个请求有自己的turn_id;时限 30 秒(以deadline_ms为准),没回或回错了荷官按规则替你选。 - 通用回法:每个 decision 请求都带
ask、prompt、rules(按模式)、choices,只认这几个字段的机器人三种模式都能玩,见通用协议第七节。 - 平局:混沌牌一轮全员阵亡时
game_over的winner为 null。
附:恶魔、混沌模式规则
恶魔牌(照搬原版)
| 项目 | 规则 |
|---|---|
| 牌堆 | 和经典一样(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 发、开过的不重置)。实弹打中目标,目标出局 |
| 平局 | 混沌牌一轮大家同时开枪,全员阵亡就算平局 |