阿瓦隆游戏插件

阿瓦隆游戏插件:在群里玩一局紧张刺激的嘴炮推理

用机器人实现多人阿瓦隆游戏,支持角色分配、任务投票、刺杀等完整游戏流程。
作者: 蜥蜴


背景

阿瓦隆(Avalon)是一款经典的桌游,与狼人杀类似,是推理与欺骗的博弈。然而,线下玩阿瓦隆有个痛点:需要一位「主持人」来分配角色、通知玩家信息、记录投票结果。如果主持人是玩家之一,他可能因为知道所有人的身份而影响游戏公平性。

于是我就想:能不能让机器人来当这个「主持人」?

这样所有玩家都能全身心投入游戏,不用担心主持人作弊或记错信息。于是就有了这款基于 Koishi 框架的阿瓦隆游戏插件。


工具定位

koishi-plugin-avalon-lizard 是一款完全由机器人驱动的阿瓦隆游戏插件,核心功能是:

  • 自动化角色分配:根据玩家人数自动分配角色
  • 私密身份通知:通过私聊向每位玩家发送角色信息
  • 任务投票管理:记录并公布投票结果
  • 特殊规则支持:刺杀、湖中仙女等完整规则

游戏基础

阵营与目标

阵营 角色 胜利条件
正义阵营 🛡️ 梅林、派西维尔、忠臣、好兰斯洛特 成功完成 3 次任务
邪恶阵营 ⚔️ 莫甘娜、刺客、爪牙、莫德雷德、奥伯伦、坏兰斯洛特 使 3 次任务失败,或刺杀梅林成功

角色一览

角色 阵营 能力
梅林 正义 能看到邪恶阵营(除莫德雷德外)
派西维尔 正义 能看到梅林和莫甘娜,但不分彼此
忠臣 正义 普通好人,完成使命
莫甘娜 邪恶 伪装成梅林迷惑派西维尔
刺客 邪恶 任务失败或刺杀梅林
爪牙 邪恶 普通坏人
莫德雷德 邪恶 梅林看不到他
奥伯伦 邪恶 身份孤立,看不到其他坏人
好兰斯洛特 正义 能看到坏兰斯洛特
坏兰斯洛特 邪恶 能看到好兰斯洛特

使用流程

1. 查看规则与角色

先了解游戏规则:

1
阿瓦隆 规则

查看特定角色的信息:

1
2
阿瓦隆 角色 梅林
阿瓦隆 角色 刺客

2. 开始游戏

在群聊中输入:

1
阿瓦隆 开始

机器人会创建一个新游戏,并等待玩家加入。

3. 加入游戏

每位玩家在群聊中输入:

1
阿瓦隆 加入

目前支持 5 到 11 人 游戏。

4. 分配角色

人数达到要求后,主持人(或任意玩家)输入:

1
阿瓦隆 分配

机器人会自动分配角色,并通过私聊向每位玩家发送其角色信息、阵营和能力说明。

注意:角色分配后,每位玩家都会收到机器人的私聊消息,请确保机器人能向你发送私聊消息。

5. 任务阶段

选择任务成员

系统会随机指定一名「发车人」(Leader),发车人需要在群聊中选择参与本轮任务的玩家:

1
阿瓦隆 发车 玩家1,玩家2

用逗号分隔玩家名,注意玩家名大小写。

投票

被选中的玩家通过私聊投票:

1
2
阿瓦隆 投票 成功
阿瓦隆 投票 失败

注意:正义阵营玩家只能投「成功」,邪恶阵营可投「成功」或「失败」。

6. 特殊机制

刺杀

当正义阵营完成 3 次任务后,刺客可以发动刺杀:

1
阿瓦隆 刺杀 玩家名   // 在群聊中执行
  • 刺杀成功(选对梅林)→ 邪恶阵营胜利
  • 刺杀失败 → 正义阵营胜利

湖中仙女(8-11人局)

在 2、3、4 轮任务发车前,车长可以查验一名玩家的阵营:

1
阿瓦隆 查验 玩家名   // 车长私聊执行

系统会秘密告知车长目标玩家的阵营(正义/邪恶),车长可以选择公开或不公开。

7. 结束游戏

任何时候都可以提前结束游戏:

1
阿瓦隆 结束

完整对局示例

以下是一个完整游戏流程的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[群聊] 玩家A: 阿瓦隆 开始
[机器人] 阿瓦隆游戏开始,建议更换一个简单的昵称。输入"阿瓦隆 加入"加入游戏。

[群聊] 玩家A: 阿瓦隆 加入
[机器人] 玩家A 已加入游戏!目前玩家数: 1

[群聊] 玩家B: 阿瓦隆 加入
[机器人] 玩家B 已加入游戏!目前玩家数: 2

... 其他玩家加入 ...

[群聊] 玩家A: 阿瓦隆 分配
[机器人] 角色已分配!游戏即将开始。
第 1 轮任务需要 2 名成员参与。
当前发车人是:玩家A

[私聊] 玩家A ← 机器人: 你的角色是:梅林,你是正义阵营。
除了莫德雷德,其他邪恶阵营有:玩家C, 玩家E

[私聊] 玩家C ← 机器人: 你的角色是:刺客,你是邪恶阵营。
其他邪恶阵营有:玩家E

... 如此反复 ...

[群聊] 玩家A: 阿瓦隆 发车 玩家A,玩家B
[机器人] 任务成员选择完毕: 玩家A, 玩家B。请投票决定任务成功与否。

[私聊] 玩家A ← 机器人: 玩家A 请投票
[私聊] 玩家A → 机器人: 阿瓦隆 投票 成功

[机器人] 投票结果:成功票: 1,失败票: 1
任务失败!

... 后续轮次 ...

[机器人] 正义阵营即将胜利!
刺客 玩家C,请您选择您认为的梅林进行刺杀。

[群聊] 玩家C: 阿瓦隆 刺杀 玩家A
[机器人] 刺杀成功!玩家A 是梅林,邪恶阵营胜利!

安装与配置

安装

1
npm install koishi-plugin-avalon-lizard

或者在 Koishi 控制台的插件市场搜索 “avalon-lizard”。

配置

目前插件无需特殊配置,安装即可使用。

1
2
plugins:
avalon-lizard: {}

资源文件

插件包含角色头像图片(位于 assets/ 目录),安装时会自动包含。


技术实现

技术栈

技术 用途
Koishi 机器人框架
TypeScript 开发语言
私聊 API 秘密发送角色信息

核心设计

角色分配算法

根据玩家人数从预设的角色池中抽取相应数量的正义/邪恶角色,再随机分配给每位玩家。

私密通知

使用 session.bot.sendPrivateMessage 向每位玩家发送角色信息,确保其他人无法看到。

投票管理

通过 selectedPlayers 跟踪当前任务的参与者,使用 voted 标记确保每人只能投一次票。


注意事项

1. 昵称设置

建议玩家在游戏开始前设置一个简单的昵称(如 “玩家A”、”小明”),避免使用复杂字符或表情符号。这在「发车」时需要输入玩家名时尤为重要。

2. 私聊权限

机器人需要能向玩家发送私聊消息。请确保:

  • 机器人没有被玩家屏蔽
  • 机器人有私聊权限
  • 玩家没有关闭「允许陌生人私聊」

3. 单频道限制

插件目前同时只支持一个频道进行游戏。如果您在多个群同时使用,可能会导致数据混乱。

4. 游戏状态

游戏状态保存在内存中,如果机器人重启,游戏数据会丢失。这在开发环境下不是问题,生产环境建议考虑持久化。

5. 网络延迟

投票是同步操作,所有参与者投票后才公布结果。如果有玩家长时间不投票,游戏会卡住。建议在游戏开始前确认所有参与者都能及时响应。


常见问题

Q: 为什么我收到的角色信息没有头像图片?

A: 确保插件正确安装了 assets/ 目录下的图片文件。如果图片缺失,角色信息仍然会以文字形式正常显示。

Q: 发车时提示”未找到玩家”?

A: 检查玩家名是否完全匹配(包括大小写)。建议在游戏开始前确认所有玩家的显示名称。

Q: 私聊没有收到角色信息?

A: 可能是机器人被你屏蔽了。请确认机器人可以向您发送私聊消息,然后重新开始游戏。

Q: 游戏进行中突然卡住了?

A: 可能是某个玩家没有投票。可以尝试在群聊中提醒该玩家投票。如果实在无法继续,使用「阿瓦隆 结束」强制结束游戏。


未来计划

  • 支持多频道同时游戏
  • 增加游戏状态持久化
  • 支持自定义角色配置
  • 添加游戏日志记录
  • 优化湖中仙女交互方式

获取工具


🎉 后续会更新搭建 Koishi 机器人的教程,敬请期待!