Repository navigation
Releases: Max-Null/dsh-jubensha
Release list
v0.1.0 · 首发
首发:一个人也能开局的剧本杀
AI 当 DM,AI 填满整张桌子。 剧本杀的真实门槛不是钱是人——四到六个玩家加一个 DM,凑齐一次比票价难得多。这个插件把那个门槛拆掉:你一个人就能开局。
它长什么样
- 一个叫「团队」的会话标签:左边是这一局的人(座位、人物关系、时间线),中间是桌上说了什么,右边是剧本与阶段页。名字是刻意的——对话形态唯一给不了的东西,就是「看起来在干别的」。
- 打不开的真相保险箱:真凶、手法、整段线索封存到复盘,角色本走引用(全文留在插件里,上桌时由程序解开)。DM 的上下文里过不到答案。
- 演员与角色是两层:角色来自本子(自带七本),「人」来自一个跨会话活着的演员池(自带六位)。同一个人下一局换座位、换本子,但他记得前面几局被谁骗过。
- 玩家「只能说话」由机制保证,不靠提示词纪律:
tools.restrict管看不看得见,tools/pre-execute管准不准执行。
这一版里几件值得说的事
桌上说话不再是主持人转达的。 真人与 AI 玩家说的每一句话,由宿主逐句原样广播给桌上其余人(署名准确、原文一字不改)。在这之前它靠 DM 手打 relay,而那种转述实测出过四种错:署名不准、地址被摘(真人说「回阿May:你说你进门的时候我才走」,广播版成了「你说你进门的时候我才走」,而另一个也进过门的人会以为在说她)、「你可以接」、以及最要命的忘了转。四条判据都验过:338 对逐字一致。代价也量了——玩家会话涨到约两倍,而主会话每请求的成本降到一半(DM 不再逐句转达了)。
几条闸,都长在「它必然经过的地方」。 人齐了才开场;自述完了每个座位都得有行踪(房间页左栏读的就是它);搜证那一页不能空着过去;桌上连着说了八条而真人一句没说,主持人的下一个动作会被拦下来,并被告知「光停下不算,他在对话页看不见你停了」。最后那条的来由是用户的原话:「演员们玩的挺嗨啊,又把我无视了,DM不干预吗?」——那一局真人说了 2 次、玩家说了 647 次。
一个会话只能开一局。 Team 名册的条目不可移除(上限 8,来自 profile patch),所以重开一局要换会话。那条闸是一次实测逼出来的:同一个会话里 start 被调了三次(07 → 01 → 07),每次重置局面、把已经上桌的人丢在原地。
装
dsh plugin add @max-null/dsh-jubensha开第一局:新会话里在标题上连点三下(它会往输入框里填一句「来一局剧本杀」),回车——那排标签这时才出现,「团队」在最右边。入口刻意不显眼,而它只填一句话,发送与否、开哪一本都由你决定。
本子
自带七本:01 拾光照相馆 / 02 深夜电台 / 03 没拆的那封信 / 04 三支药 / 05 金库的铜带 / 06 年会那晚(四座)+ 07 夜场(六座)。格式见 schema/case.schema.yml,写新本子读 skill jubensha-write-case。
已知边界
- 玩家经 Team 上桌,所以看得见的工具比能用的多(模型请求里 10 个,实际能用的只有
send_message)——「进 roster」与「工具面绝对干净」在机制上不可兼得。 - teammate 名字跨进程持久:一个名字在一个 DM 会话里用过一次,重启后也不能再用。
- 共享工作目录:所有玩家与 DM 看同一个 cwd,所以本子的真相手册不得落在工作区内。
- 封存挡的是顺手泄漏,不是「DM 看不到」——它真要
read那个文件谁也拦不住。
完整说明见仓库的 README。