这个插件需要 Koishi v3 版本,同时需要 koishi-plugin-mysql 数据库支持。
ink 是什么?
ink 是一个由 inkle 开发的视觉小说类脚本语言,初衷在于将更多的精力放在视觉小说故事流上,而不是程序实现上。
inky 是 ink 的专用编辑器。当然,这不是说你不能用记事本写 ink,只是 inky 提供了很多方便的功能,比如即写即渲染。
inklecate 是将 ink 脚本转化为可供程序使用的 JSON 文档的编译器。它内置于 inky 中。
inkjs 则是 ink 的一个 JavaScript 运行时(Runtime)实现,它读取由 inky 或 inklecate 编译好的 JSON 文件,然后对其进行控制。
这个插件是 inkjs 在 Koishi 中的简易应用,实现了以下的基本功能:
- 故事的进行
- 跳转至下一个选项
- 在调用指令时自动读档,在选项处自动存档
- 硬重置
- 进程锁,在同一个频道中最多1人进行1个故事
npm i koishi-plugin-ink
然后参照 安装插件 继续安装。
在注册插件后,插件将自动在数据库中创建名为 ink_save 的表,存档将储存到此表中。
ink <choice>
choice:在有选项的时候,选择此选项。
可选选项 | 说明 |
---|---|
-R, --hard-reset |
重置所有进度 |
-U, --hard-unlock |
强制解除进程所(需要2级权限) |
-s, --skip |
跳转至下一个选项 |
这个插件在无配置项的情况下将使用 The intercept 作为示例小说。
配置项的形式为:
{
command:
filePath:
messageSpeed:
files: [
{
command:
filePath:
messageSpeed:
},
{
command:
filePath:
messageSpeed:
}
// if you have other ink files...
]
}
配置项 | 默认值 | 说明 |
---|---|---|
command *1 |
ink |
插件指令 *2 |
filePath |
The intercept | 编译好的 (.ink).json 文件的相对路径 |
messageSpeed |
app.options.delay.message *3 |
文字的显示速度(ms) |
*1 所有的 command
请确保各不相同。
*2 修改此配置项将将使上文中所有的 ink
替换为所配置的字符串。例如,配置 command: 'sample'
会导致指令变为 sample
,创建的表变为 sample_save
,注册的模板(后述)变为 sample.description
、 sample.example
等。
此配置项也支持设置为 Koishi 的链式子指令,但是请注意,由于使用了数据库,子指令的最后一项只能为层级式,且不能包含数据库表名不支持的字符。
例如,配置 command: 'lorem/ipsum'
会创建表 ipsum_save
,这是没有问题的;但是配置 command: 'lorem.ipsum'
则会出现在 lorem
库内创建 ipsum_save
表的情况,这在大多数情况下是不被期望的。
*3 这个值当在 App
中没有配置时的默认值为 100,即 0.1秒。
这个插件在最初的几行定义了一些 模板:
const templateNode = {
'description': 'ink功能',
'example': '查看当前剧情 / 选项',
'example-choice': '选择第一个选项',
'skip': '跳至下一个选项',
'hard-reset': '重置(请谨慎使用)',
'hard-unlock': '强制解除进程锁(需要 2 级权限,请谨慎使用)',
'is-locking': ' 正处于剧情中,请等待其剧情结束。',
'is-locking-self': '当前处于剧情中,请等待剧情结束。',
'hard-reset-confirm': '这将重置你的所有进度与数据,且不可挽回。请于5秒内回复 是 或 y(es) 以确认。',
'hard-reset-completed': '已重置。',
'hard-reset-failed': '已取消重置。',
'hard-unlock-unavail': '未处于剧情中,不需要解除进程锁。',
'hard-unlock-completed': '已强制解除进程锁。',
'choices': '选项:',
'skip-to-choices': '已跳转至选项:',
'the-end': '=== 故事结束 ===',
'error': '出现了一点错误,请尝试重新开始剧情。'
}
你可以根据自己的喜好来覆盖它们,例如:
t.set('ink.error', '出了亿点点错误。')
Writing With Ink - ink 脚本的语法参考文档。
Running Your Ink - ink 运行时的参考文档。虽然里面使用的是 C# 实现,但是 inkjs 的大部分 API 都与之相同。
- 有时候进程锁会由于未知原因锁死
暂不清楚导致的原因,现阶段暂时以强制解除进程锁的选项替代。
- 为什么在使用的时候会报“版本不对”?
当前(指在写这个 Readme 的时候)inkjs 的版本还处在 1.11.0,而对应的 ink 版本则是 0.9.0;但是最新的 ink 及 inky 版本已经到 1.0.0 了。请检查你有没有使用正确的版本进行 ink 的编译。
- 为什么不支持 koishi-plugin-mongo?
因为我不会 MongoDB。
- 这个插件和 koishi-plugin-adventure 有什么区别?
总地来说,koishi-plugin-adventure 会更加开箱即用且更加好用,因为你会想要的功能 adventure 基本都提供了。但是,如果你想尝试写长故事,或者你本来手头就有一个 ink 脚本,那么你可以试试这个。
- 为什么不支持【某个功能】(比如节点跳转)
我一开始想做这些功能,但是首先靠 ink 的合理编写是能够实现这些功能的,其次 ink 这个脚本语言的可拓展性很强。在 Runtime 应用层中,它提供标签暴露、变量暴露与存取、节点跳转以及节点访问计数。换句话来说,这些功能十万个人有十万甚至九万个实现的需求和方法,而仅仅一种实现很难满足个性化的需求。
如果想要贴合自己需求的 ink 实现,那么推荐 Ctrl + C
这个仓库的代码(甚至用不着 git clone
,因为代码量很小)然后自己修改(参见推荐阅读)。
- 发现了个bug
这很正常。