设置和初始化变量#
教程所使用的示例卡可以在角色卡示例找到哦!
思考需要什么变量#
我们写 MVU 卡必须要先想想这张卡需要什么变量:
你似乎打算写一个和角色谈恋爱的卡. 如果我们记录下角色对玩家的好感度, 就可以针对角色当前所在的好感度阶段, 为角色设定不同的行为模式了!
你做了一张奇幻冒险卡, 那你肯定希望记录角色在冒险中的各种状态, 比如背包里有什么物品、学到了什么技能等等.
什么! 玩家不是要扮演角色, 而是要扮演角色绑定的金手指系统? 那你可得好好记录一下现在给角色发布了什么任务、角色商城里有什么商品了……你还可以做一个可互动的前端界面, 让玩家通过这个界面给角色发布任务!
……
总之, 请你一定一定要想清楚自己的卡需要什么变量, 因为这会影响之后所有内容!
设计变量结构#
确定下了需要什么变量后, 我们就可以开始设计变量结构啦!
为了让你写起来简单, 在正文部分我会尽量用已经做好的工具来写卡! 比如, 我会直接用门之主写卡助手或咩咩的 Gemini CLI 全自动写卡工作流里的变量结构设计 (脚本) 功能来设计变量结构——
让我们打开门之主写卡助手, 通过酒馆输入框上方的按钮切换成变量结构设计 (脚本)功能, 然后输入我们的变量需求:
请制作变量!
- 在世界路径下记录当前时间、当前日期和近期事务
- 记录主角妹妹白娅当前对主角的依存度、着装和称号
- 依存度必须在0~100之间
- 着装包括上装、下装、内衣、袜子、鞋子和饰品
- 称号应该记录称号的效果和白娅对称号的自我评价,如果没填写自我评价则默认设置为"待评价"
- 称号有数量上限,依存度越高可以拥有的称号越多(依存度为0时不能拥有称号,1~10时只能拥有1个称号,依次类推),如果称号超过可以拥有的数量,应该移除最旧的称号
- 记录主角物品栏当前有的物品:它的描述、数量,如果没有填写数量则默认数量为1,如果数量不为正数应该直接删除物品
我输入了很多要求呢x 如果你熟悉 MVU 或者 MVU beta 的话, 会发现里面很多要求是以前要用 extensible、$template 或者单独制作脚本来实现的, 但现在 MVU zod 可以轻松做到!
AI 也很会写这一套~所以我在这里选择了直接用门之主写卡助手来生成它, 如果你需要学习怎么手写变量结构的话, 请学习完正文后去阅读附录部分.
AI 很快给你生成出变量结构啦! 我得到的是这样的:
变量结构
import { registerMvuSchema } from 'https://testingcf.jsdelivr.net/gh/StageDog/tavern_resource/dist/util/mvu_zod.js';
export const Schema = z.object({
世界: z.object({
当前时间: z.string(),
当前地点: z.string(),
近期事务: z.record(z.string().describe('事务名'), z.string().describe('事务描述')),
}),
白娅: z
.object({
依存度: z.coerce.number().transform(v => _.clamp(v, 0, 100)),
着装: z.record(z.enum(['上装', '下装', '内衣', '袜子', '鞋子', '饰品']), z.string().describe('服装描述')),
称号: z.record(
z.string().describe('称号名'),
z.object({
效果: z.string(),
自我评价: z.string().prefault('待评价'),
}),
),
})
.transform(data => {
data.称号 = _(data.称号)
.entries()
.takeRight(Math.ceil(data.依存度 / 10))
.fromPairs()
.value();
return data;
}),
主角: z.object({
物品栏: z
.record(
z.string().describe('物品名'),
z.object({
描述: z.string(),
数量: z.coerce.number().prefault(1),
}),
)
.transform(data => _.pickBy(data, ({ 数量 }) => 数量 > 0)),
}),
});
$(() => {
registerMvuSchema(Schema);
});
这个变量结构是一个酒馆助手脚本, 规定了我们的变量应该是怎么样的. 门之主写卡助手会在生成后稍微解释一下它做到了什么功能, 但其实你不用太在意该怎么自己读懂它, 之后在附.手写变量结构中我会详细解释的qwq.
既然是一个酒馆助手脚本, 让我们点开脚本库来添加它! 和之前添加 MVU 本体脚本一样, 我们点开, 点击来新建一个名叫变量结构的角色脚本, 内容就填写刚刚那个脚本的内容.
初始化变量#
在变量结构规定了我们的变量应该是什么样的后, 我们可以开始为角色卡开局设定变量初始情况了!
让我们把门之主写卡助手切换到变量初始设置 (initvar) 功能, 输入一些变量初始化需求, 比如请根据这段剧情初始化变量、白娅对主角的好感度应该在20左右,据此初始化变量并生成开局之类的, 这就完全取决于你啦~
总之, 门之主写卡助手给了我下面一段内容, 它列出了变量应该有的初始值. 如果你仔细观察, 就会发现它的文字、缩进都和之前的变量结构脚本是一一对应的:
变量初始化
世界:
当前时间: 2024-04-08 10:45
当前地点: 私立风祭学院 高中部 2年A班教室
近期事务:
转学生安置: 白娅刚刚转入,需要领取教材、熟悉校园环境
座位调整: 班长正在确认最终的座位表,可能会有微调
午休临近: 还有一节课就是午休,是接触白娅的机会
白娅:
依存度: 35
着装:
上装: 整洁的深蓝色校服外套,一丝不苟地扣好每一颗纽扣
下装: 规整的深蓝色百褶裙,长度恰好及膝
内衣: 素白色内衣套装
袜子: 黑色过膝袜,没有一丝皱褶
鞋子: 黑色皮质学生鞋,擦得锃亮
饰品: 无
称号:
行尸:
效果: 日常行动带有明显的倦怠感与机械感
自我评价: 活着本身就是惩罚
逃避者:
效果: 对来自<user>的任何接触都会本能回避
自我评价: 我不配出现在他的生活里
主角:
物品栏:
陈旧的创可贴:
描述: 钱包夹层里放了两年的卡通创可贴,粘性大概已经失效了
数量: 1
薄荷糖:
描述: 提神用的强力薄荷糖,以前她很讨厌这个味道
数量: 1
得到了变量初始值后, 我们需要以 MVU 规定的方式把变量初始值告诉它.
让我们在角色卡世界书中新建一个条目, 条目名字里要包含 [initvar] 并且必须处于禁用状态——我们不如就将这个条目叫作 [initvar]变量初始化勿开 吧! 然后, 我们将变量初始值粘贴到这个条目的内容中.
验证变量结构和初始化是否成功#
在设置好变量结构和变量初始值后, 我们确保以下两点:
API 配置 (左上角插头) 里选的是
角色卡有设置开局消息 (在角色卡侧边栏最下面填写)
然后就能新开聊天来让变量设置生效了!
新开聊天后, 让我们打开变量管理器来实际查看变量: .
如果新开聊天后变量管理器里依旧没有变量, 请你先确认之前的步骤都正确执行了喔!
另外, 也许你是新开聊天后遇到了黄框提示 "变量初始化失败":
如果警告标题是
[MVU], 请考虑重新生成变量结构.如果警告标题是
[MVU zod], 请考虑重新生成变量初始值.
为不同开局设置不同变量初始值 (全量方案)#
角色卡每个开局往往是不同的故事情景, 显然我们会需要为不同开局设置不同的变量初始值.
MVU 现在要设置不同的变量初始值很简单, 我们在开局消息中用 <initvar>...</initvar> 包裹这个开局对应的变量初始值即可:
开局 2 的故事...
<UpdateVariable> <-- 为了方便之后设定变量提示词, 我们在外面再包裹一层 <UpdateVariable>
<initvar>
开局 2 的变量初始值...
</initvar>
</UpdateVariable>
开局 2 的故事...
<UpdateVariable>
<initvar>
世界:
当前时间: 2025年4月7日 星期一 08:42
当前地点: 私立星见学园·2年A班教室
近期事务:
白娅转学: 白娅刚刚转入私立星见学园2年A班,进行了简短的自我介绍
青空黎在校: 青空黎在同一所学校担任田径部教练助手,白娅意外发现了这个事实
课间休息: 数学课结束,学生们开始自由活动和交谈
白娅:
依存度: 15
着装:
上装: 整洁的私立星见学园女生制服
下装: 整洁的私立星见学园女生制服
内衣: 白色棉质内衣套装
袜子: 白色过膝长袜
鞋子: 黑色皮质学生鞋
饰品: 无
称号:
转学生:
效果: 初来乍到,对环境陌生,容易引起他人注意但本人倾向于保持低调
自我评价: 又是一个新的开始,但我注定会再次搞砸一切
逃避者:
效果: 习惯性逃避可能带来痛苦的人际关系,但内心极度渴望温暖
自我评价: 我这样的人不配拥有任何关系,远离才是对大家最好的选择
自毁倾向者:
效果: 会通过自我否定和自我伤害来惩罚自己,认为痛苦是应得的
自我评价: 活着本身就是我最大的惩罚,这种痛苦是我应得的
主角:
物品栏:
旧手帕:
描述: 角落绣着歪歪扭扭小兔子的手帕,有些年头了,但洗得很干净
数量: 1
秒表:
描述: 田径部用的计时器,挂在脖子上
数量: 1
</initvar>
</UpdateVariable>
开局 2 的故事...
<UpdateVariable>
<initvar>
```yaml
世界:
当前时间: 2025年4月7日 星期一 08:42
当前地点: 私立星见学园·2年A班教室
近期事务:
白娅转学: 白娅刚刚转入私立星见学园2年A班,进行了简短的自我介绍
青空黎在校: 青空黎在同一所学校担任田径部教练助手,白娅意外发现了这个事实
课间休息: 数学课结束,学生们开始自由活动和交谈
白娅:
依存度: 15
着装:
上装: 整洁的私立星见学园女生制服
下装: 整洁的私立星见学园女生制服
内衣: 白色棉质内衣套装
袜子: 白色过膝长袜
鞋子: 黑色皮质学生鞋
饰品: 无
称号:
转学生:
效果: 初来乍到,对环境陌生,容易引起他人注意但本人倾向于保持低调
自我评价: 又是一个新的开始,但我注定会再次搞砸一切
逃避者:
效果: 习惯性逃避可能带来痛苦的人际关系,但内心极度渴望温暖
自我评价: 我这样的人不配拥有任何关系,远离才是对大家最好的选择
自毁倾向者:
效果: 会通过自我否定和自我伤害来惩罚自己,认为痛苦是应得的
自我评价: 活着本身就是我最大的惩罚,这种痛苦是我应得的
主角:
物品栏:
旧手帕:
描述: 角落绣着歪歪扭扭小兔子的手帕,有些年头了,但洗得很干净
数量: 1
秒表:
描述: 田径部用的计时器,挂在脖子上
数量: 1
```
</initvar>
</UpdateVariable>
如果不同开局的变量初始值区别很大, 你可以让门之主写卡助手变量初始设置 (initvar)帮你生成.
如果区别很小, 你可以在中直接修改变量初始值, 然后将修改后结果复制到 <initvar> 块中: