为玩家显示变量状态栏#

MVU有一个巧妙的设计: 它会在 AI 回复结束后, 自动在回复末尾附加一串特殊字符: <StatusPlaceHolderImpl/>.
这串字符本身只是一个占位符, 没有任何作用. 但你可以用酒馆正则捕获它, 将它

  • 仅格式提示词 为空, 从而不对 AI 发送这段文本, 防止 AI 模仿这串特殊字符而在后续自己输出它

  • 仅格式显示 为我们想要展示的任何内容

仅格式提示词: 不发送状态栏占位符#

我们新增一个局部正则, 命名为 [不发送]状态栏 (按照青空莉的正则命名习惯, [不发送] 表示不发送给 AI, [隐藏] 表示不显示给玩家, 另有其他 [按作用命名]):

脚本名称: [不发送]状态栏
查找正则表达式: <StatusPlaceHolderImpl/>
替换为:
作用范围:
  - [ ] 用户输入
  - [x] AI输出
短暂:
  - [ ] 仅格式显示
  - [x] 仅格式提示词

仅格式显示: 显示状态栏#

同样地, 我们新建一个局部正则, 命名为 [界面]状态栏. 这次我们将勾选 仅格式显示, 将占位符替换为我们要显示的状态栏:

脚本名称: [界面]状态栏
查找正则表达式: <StatusPlaceHolderImpl/>
替换为: 见下文
作用范围:
  - [ ] 用户输入
  - [x] AI输出
短暂:
  - [x] 仅格式显示
  - [ ] 仅格式提示词

文本状态栏#

与酒馆宏相同, {{get_message_variable::变量}} 除了作为提示词在发送给 ai 时被替换, 也会在显示时被替换.
因此我们可以将 <StatusPlaceHolderImpl/> 替换为一串带有 {{get_message_variable::变量}} 的文本, 来显示变量值:

💖 络络当前好感度: {{get_message_variable::stat_data.角色.络络.好感度}}

这样, 每次 AI 回复的下方都会自动显示这行文字, 并显示正确的数值.

当然, 你也可以使用 HTML 和 CSS 进行美化:

<style>
/* 在这里写你的CSS样式 */
.status-bar {
  font-size: 14px;
  color: #ff69b4;
  border: 1px solid #ff69b4;
  padding: 5px;
  border-radius: 8px;
}
</style>
<div class="status-bar">
💖 络络当前好感度: {{get_message_variable::stat_data.角色.络络.好感度}}
</div>

前端状态栏#

至于包含复杂脚本的 HTML 状态栏, 这已超出本教程范围.
你可以尝试请 AI 辅助编写 (我在类脑的直播教程/青空莉的文档), 或直接使用 Nova Creator 等成熟预设.

回顾#

至此, 我们制作了这样一个状态栏:

  • 显示不消耗任何 token

  • AI 对它只需要更新需要更新的变量, 而不需要像传统状态栏一样每次都输出所有信息

但不要让这里的状态栏教程限制了你的想象力. 你可能会想: 既然如此, 那我是不是该把原来传统状态栏会展示的一些细节信息 (如衣着、周围地点等) 也弄成变量, 每次都在变量列表里发给 AI 哪怕它们没 角色.络络.好感度 那么重要, 而仅仅为了在状态栏里能以变量的形式替换、展示它?

  • 你可以不在变量列表中列出某些变量, 只要求 AI 更新它. 也就是说, 你不在提示词里写 {{get_message_variable::stat_data.细节信息.周围地点}} 来告诉 AI 它现在的值是多少, 而只在 format 中要求 AI _.set('细节信息.周围地点', ${用一句话列出几个地点,旨在引导<user>下一步行动}) 来更新它.

  • 你没必要非要用 <StatusPlaceHolderImpl/> 来显示状态栏, 你可以用其他任何方式来显示它. 你可以自己定义一个输出格式, 在里面要求 AI 输出周围地点等细节信息, 而用酒馆正则捕获这个格式, 替换为带变量的状态栏. 如妹妹请求你保护她露出中的状态栏, 好感度等来自变量, 衣着等来自 ai 本次输出.

总之, 通过设置变量, 我们已经可以动态展示剧情状态, 实现稳定更新的状态栏. 这是一个很棒的起点, 但也仅仅是一个起点.