Discourse Frotz 🧙

哇,一个新插件!:tada: 不过这个稍微没那么严肃。:video_game:

Discourse Frotz


不再需要在每一步都@提及机器人。一旦开始游戏,只需回复它即可。

Git 仓库:GitHub - merefield/discourse-frotz: A plugin that uses Frotz to give you an interactive fiction experience on your Discourse forum · GitHub

它是什么

这是一个“机器人”,用于在您的 Discourse 论坛上玩互动小说(即经典文字冒险游戏),本质上是一个适配器,连接到标准且出色的 Z-machine 解释器“frotz”,其地址为 David Griffith / frotz · GitLab

如何使用

设置会添加两个游戏,您可以在设置中添加更多游戏。

每个条目包含一个标题和故事文件的名称。

要启动交互,您需要在设置中@提及机器人。之后,只需回复他们的帖子即可。

要列出可用的游戏,您首先需要提及机器人并询问:

@mybot list games

这将为您提供一系列选项。

要开始游戏,请输入:

start game x,将 x 替换为选项编号。

如果您想切换到另一个游戏,可以这样做;插件会在每一步保存您的进度,因此您可以随时返回到第一个故事。插件为每个尝试过的用户为每个故事保存一个存档。

要继续现有游戏,请输入:

continue game x,将 x 替换为选项编号。

注意:完全重建将销毁所有存档文件。这是一个必要的妥协。

如何玩互动小说(IF)游戏?

许多“元用户”(Meta’s)可能已经习惯了这些游戏。对于不太熟悉的人,请查看此速查表:Play Some Interactive Fiction

设置

创建机器人用户

(抱歉,自动化此操作已在我的计划中!)

在 ssh 会话中,进入您的容器并打开 rails 控制台:

./launcher enter app
rails c

然后执行以下操作:

u = User.create!(username: "Frotz", name: "FrotzBot", id:-5, email: "not@really.valid")
u.activate

您的新机器人随后将在 UI 中可用,可以进行设置。通过管理按钮进入用户的设置,并关闭_所有_邮件发送。根据需要更新头像。

安装 Discourse Frotz

更新您的 app.yml

这比通常的插件更具侵入性。

将以下内容添加到 app.yml 中:

hooks:
  after_code:
    - exec:
        cd: $home
        cmd:
          - git clone https://gitlab.com/DavidGriffith/frotz
    - exec:
        cd: $home/frotz
        cmd:
          - make dfrotz
    - exec:
        cd: $home/frotz
        cmd:
          - mkdir savegames
    - exec:
        cd: $home/frotz
        cmd:
          - mkdir stories
    - exec:
        cd: $home/frotz/stories
        cmd:
          - wget -O zork1.z3 https://eblong.com/infocom/gamefiles/zork1-r119-s880429.z3
    - exec:
        cd: $home/frotz/stories
        cmd:
          - wget --no-check-certificate http://www.douglasadams.com/creations/hhgg.z3
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/merefield/discourse-frotz

放在您的其他插件条目之前。

您现在还需要添加 Discourse BBCode 插件!!

使用常规的 ./launcher rebuild app 进行重建。

现在进入插件设置,选择您之前添加的机器人用户:

image

故事

您会注意到我包含了几则故事。您可以在 https://ifdb.tads.org/ 找到更多。
但是,请注意这里的速率限制! 从同一位置获取过多故事可能会导致错误。

另外请注意,这些故事并未托管在受 https 保护的服务器上(唉)。

如果您坚持要加载更多内容,请将它们添加到 app.yml 中。您也可以从命令行提示符手动添加,但请注意这些内容将在下一次完全重建时被清除。

为私人消息启用 FrotzBot(建议谨慎)

允许用户私下进行游戏,但使用过程将不够透明。如果您的服务器足够大,这可能不是问题。无论如何,请注意其对容量的影响。作为替代方案,鼓励用户在指定的分类中进行游戏。

image
默认:关闭

如果未在此处启用,用户将收到一条礼貌的消息:

按分类限制 FrotzBot

您可以将机器人限制在一个(或多个)分类中,以避免填满其他区域:

键盘快捷键!

这对于提升“游戏”体验非常重要。您实际上只需要记住两个:

  • Shift-R 回复机器人

  • Ctrl-Enter 提交您的下一步操作

限制与注意事项

并非所有故事格式和游戏都得到支持,也不太可能得到支持。由于调用和响应协议的性质,许多游戏无法运行。由于我们是以帖子为单位进行交互,因此我们必须在每一步之后要求 Frotz 保存状态。如果游戏的某一步骤没有导致系统可以保存的提示(忽略“按任意键”或“更多”提示,这些应已处理),则该故事无法运行。例如,在《谋杀行动》(一款很棒的游戏!)中,门口的女士问您是否是警察。不幸的是,这是游戏中无法保存的状态,因此无法满足此要求,我看不出有什么方法可以让它运行。

注意:邮件列表模式与此插件完全不兼容,因此在尝试使用此插件之前,请确保_不要_启用此模式!

可以说,它有点浪费论坛资源,因为每一步至少需要两篇帖子。显然,使用聊天界面而不是论坛来玩这类游戏通常更合适,但您可能会争辩说,这可以用来创建攻略?:wink:

对于侵入性较小的解决方案,请考虑:Turning a topic into interactive fiction ;)

反馈

欢迎所有反馈!

致谢

本插件利用了 David Griffith / frotz · GitLab 的 Frotz Z-解释器,该解释器由设置脚本克隆并“编译”。

感谢 @P16 允许我使用我们共同开发的一个闭源聊天机器人的代码片段。

45 个赞

哇,又见面了!

新功能特辑

启用 FrotzBot 用于私信(后果自负!;))

允许用户在私密环境中游戏,但使用过程将不够透明。如果您的服务器规模足够大,这可能不会成为问题。

image
默认:关闭

如果未启用该功能,用户将收到一条礼貌的提示:

限制为特定分类列表,或允许所有分类:


默认:对所有分类启用

10 个赞

你好,Robert!非常感谢,我真的很喜欢这个插件!
我尝试在开发环境(不使用 Docker)中安装它,系统在编译 dfrotz 时提示需要 ncursesw 库,安装后便正常工作了。在生产环境的 Docker 中是否也会出现同样的情况?

1 个赞

我在生产环境上进行了测试,令人惊讶的是,在 Docker 中构建竟然开箱即用。欢迎将其部署到生产实例,并告知我运行情况。

很高兴你喜欢它!!

2 个赞

对于像我这样可能会为此掉最后几根头发的人来说:

hhgg.z3,9,7,3
即:

  story_header_lines = 9
  story_load_lines = 7
  story_save_lines = 3

现在,如何调整它……:sweat_smile:,这简直是一场冒险中的冒险……!

1 个赞

我目前正在与 Frotz 的维护者合作,看看我们能否取消这些做法。这是我从 restful-Frotz 移植过来的方法,但还远非完美:slight_smile:

1 个赞

是的!找到了!
kheper.z8,20,15,4 几乎可以正常工作
针对这个链接:

:smiley:

这没什么,但有些奇怪的地方

) 行类型显示已关闭
压缩模式为 MAX,隐藏顶部 0 行

Pause() 显示一次,代码如下:

[Pause notNeeded;
@read_char 1 notNeeded;
rtrue;
];

1 个赞

哈哈,是的,这些故事确实有很多独特之处,而且风格多样。我无法承诺支持所有情况。

目前我的重点是:

  1. 简化代码
  2. 增强代码安全性
  3. 在实用时添加格式化

第3点出乎意料地困难。

1 个赞

我已将一些改进推送到一个功能分支:

此分支摒弃了那些无意义的抑制设置,引入了对 BBCode 的翻译以支持格式化和颜色,更好地利用了 Dumb Frotz 命令行选项,消除了写入文本流的需求,并修复了一个安全漏洞。

此分支需要安装官方的 BBCode 插件。

我仍在对其进行实验。欢迎你也尝试一下。

在经历一些重要测试后,我可能会将其合并。

1 个赞

插件需要克隆整个 frotz 仓库,还是只需要 $home/frotz/dfrotz 存在即可?因为我只想编译一次,并在重新构建之间保存该二进制文件。

不确定您为何在意?我们讨论的资源相比之下非常小(整个仓库构建后仅 6MB,而论坛需要数 GB?)。它会克隆整个仓库,然后仅构建 dfrotz。这或许略显浪费,但我认为简洁性和可重复性更为重要。我本可以详细说明并执行稀疏克隆,但这会使构建脚本更复杂且不够稳健。这样做值得吗?欢迎提出优化建议。这一切都在容器内构建,因此会在容器清理时被清除。

我只是想针对我的小型服务器进行优化,并不是要求你更改通用安装。

1 个赞

这个插件真的很棒!这让我想起了一款多年前推出的“经典”电脑游戏(我忘了名字)。

3 个赞

如果我能保持简单和稳健,这确实是一个很好的未来优化建议。谢谢!

1 个赞

是的,有很多经典游戏可以玩。更多内容请查看原帖中的链接。

2 个赞

重大更新::tada: :kiwi_fruit:

(这花费了数月的时间,期间我们进行了零星的后台工作,并与 Frotz 团队进行了协调)。

正式支持故事全文的彩色显示与等宽字体格式

此次重大更新带来了一系列改进:

  • 新增:彩色格式与等宽文本支持
  • 改进:简化设置——不再需要校准页眉和页脚,只需指定所需的标题和故事文件即可,太棒了!
  • 改进:使用 Open3 gem 执行系统命令,降低了滥用或遭受攻击的风险。
  • 改进:优化与命令行的内部交互,不再需要流文件,现在能更好地处理“更多/按任意键继续”等提示。

现在必须安装 Discourse BBCode 插件!!

本次更新离不开 Frotz 维护者 David Griffiths 以及该社区非常活跃的成员 Borg323 的通力合作,后者根据 Discourse 的 BBCode 标准编写了 BBCode 扩展。向他们致以万分感谢!为了能让等宽文本功能正常运行,我们不得不发挥一些创意,但最终方案非常棒!

以下是新格式的一些示例(我尚未对这些故事进行完整测试,此处仅展示格式效果):

注意这里彩色的罗盘:

已知问题:由于许多游戏的调用与响应协议特性,大量游戏无法运行。如果游戏的某一步骤无法引导至可保存的提示点(忽略“按任意键”或“更多”等提示,这些应已处理),则故事将无法运行。例如,在《谋杀行动》(一款很棒的游戏!)中,门口的女士会询问你是否是警察。不幸的是,这是游戏中无法保存的状态,因此不满足上述要求,我目前看不出有什么办法能让它正常运行。

可能有一些游戏此前无法在 Discourse Frotz 上运行,但现在可以了……欢迎大家尝试,但请注意上述限制!

如果您在运行过程中遇到任何问题,请随时告知,我会根据需要进一步完善说明。

8 个赞

温馨提示:您可以使用键盘快捷键来提升使用此插件的体验:

  • Shift-R 回复机器人

  • Ctrl-Enter 提交您的下一步操作

(标准开箱即用键盘快捷键)。

5 个赞

嗨,Robert!
终于有时间继续前进了,目前一切顺利,在生产环境中开箱即用 :+1:

奇怪的是,除非我在任意类别中也进行设置,否则 frotz 无法在私信中回复 :thinking:
下一步:开始玩耍 :grinning_face_with_smiling_eyes:

1 个赞

感谢你的报告!

我已经直接修复了这个问题:FIX: behaviour of private messages playing permission setting · merefield/discourse-frotz@34b022e · GitHub

备注:必须补充一些单元测试!

2 个赞

我尝试在源代码中添加了 :grin:

这会很有趣!

1 个赞