快速开始
在这里,会从一个具体的示例出发,来教会你如何使用变量系统。
1. 设计变量
MJV 系统通过 ZOD 语法来定义变量。设计变量的过程就是编写 ZOD 脚本的过程。
注意:需要在脚本中定义变量的 默认值(prefault) 和 描述(describe)
1.1 自己编写ZOD 脚本
ZOD 语法参考
完整的 ZOD 脚本举例:
z.object({
张三: z.object({
体力: z.coerce.number().describe("").prefault(100),
精神压力: z.coerce.number().describe("").prefault(0),
物品栏: z.record(z.string().describe('物品名'), z.object({
数量: z.coerce.number().describe("").prefault(1),
描述: z.string().describe("").prefault("普通物品")
})).describe('张三的物品栏').default({
苹果: {
数量: 1,
描述: "能吃"
}
})
}).prefault({}),
李四: z.object({
体力: z.coerce.number().prefault(80),
精神压力: z.coerce.number().prefault(0),
物品栏: z.record(z.string().describe('物品名'), z.object({
数量: z.coerce.number().prefault(1),
描述: z.string().prefault("普通物品")
})).default({})
}).prefault({}),
世界: z.object({
当前位置: z.string().prefault("森林"),
当前时间: z.string().prefault("深夜"),
}).prefault({}),
})
1.2 通过 AI 生成ZOD 脚本
如果你不理解上面的代码或者不想亲手设计,也可以把你对游戏的构思告诉 AI,并且附加如下提示词让它帮助你生成代码。
// 这里放你想生成什么样的变量
请根据以上设想,分析我的构思并帮我写一份符合zod语法的数据结构设计。
要求:
- key尽量使用中文
- 每个字段都要带上.describe(),里面填入该字段的含义、作用机制以及和其他字段的联动效果(如有)。
- 每个字段都要有.prefault(),设置该字段的默认值 **一定要用prefault()而不是default()函数!**。
- 最外层用z.object包裹,它不用设置prefault,含义字段从root的子级开始。
- 只返回z.object及里面的内容,不需要完整的js代码。
示例:
```js
z.object({
张三: z.object({
体力: z.coerce.number().describe("").prefault(100),
精神压力: z.coerce.number().describe("").prefault(0),
物品栏: z.record(z.string().describe('物品名'), z.object({
数量: z.coerce.number().describe("").prefault(1),
描述: z.string().describe("").prefault("普通物品")
})).describe("").default({
苹果: {
数量: 1,
描述: "能吃"
}
})
}).prefault({}),
世界: z.object({
当前位置: z.string().describe("").prefault("森林"),
当前时间: z.string().describe("").prefault("深夜"),
}).describe("").prefault({}),
})
```
2. 填入变量
将代码填入图中输入框内,点击保存。
系统会自动解析变量。此时你可以在 查看 TAB 中看到解析后的变量。


同时系统自动生成三条世界书和三条正则


除此之外,你还可以在对话里查看每条消息对应的变量


3. 使用变量
在各处读取变量值的方法是统一的,使用LiquidJS 语法
通过双花括号括起来的代码来读取变量,mjv_value 代表了根节点,比如 {{ mjv_value.张三.体力 }} 就是张三的体力值。
3.1 在聊天消息气泡中使用
可以在正则中获取变量。或者基于变量编写表达式。
3.1.1 示例
比如再 [MJV] 默认状态栏界面 这个正则中可以写以下代码:
<div style="display: flex; gap: 12px; padding: 12px; background: #1a1a2e; color: #fff;">
<div style="flex: 1; padding: 8px;">
<div style="font-weight: bold; color: #4fc3f7;">👤 张三</div>
<div>体力: {{ mjv_value.张三.体力 }}</div>
<div>压力: {{ mjv_value.张三.精神压力 }}</div>
</div>
<div style="flex: 1; padding: 8px;">
<div style="font-weight: bold; color: #ba68c8;">👤 李四</div>
<div>体力: {{ mjv_value.李四.体力 }}</div>
<div>压力: {{ mjv_value.李四.精神压力 }}</div>
</div>
<div style="flex: 1; padding: 8px;">
<div style="font-weight: bold; color: #64b5f6;">🌍 世界</div>
<div>位置: {{ mjv_value.世界.当前位置 }}</div>
<div>时间: {{ mjv_value.世界.当前时间 }}</div>
</div>
</div>

3.1.2 效果

3.2 在 iframe 渲染中使用
同样在正则中做替换,但是方法略有不同,按照iframe渲染模式中的格式来替换
在iframe中可以通过SDK读取和使用变量,创作端目前只能在预览里调试这个效果
目前支持两个方法
window.$mujian.ai.chat.mjv.getAll()
window.$mujian.ai.chat.mjv.get() // 参数: (path: string)
3.2.1 例子
```html
<body style="color: white; font-size: 12px; border:1px solid green">
<div>所有变量:</div>
<div id="mjv-all">-</div>
<div>张三变量:</div>
<div id="mjv">-</div>
<script>
const allValues = window.$mujian.ai.chat.mjv.getAll();
$("#mjv-all").text(JSON.stringify(allValues));
$("#mjv").text(JSON.stringify(allValues.张三));
</script>
</body>
```
3.2.2 效果

3.3 在世界书中使用
在世界书中读取变量,从而动态修改世界书条目内容
{% if mjv_value.张三.体力 > 50 %}
天空有陨石坠落
{% endif %}
3.3.1 示例

3.3.2 效果
开场白1中的默认值张三的体力值是80,所以触发了陨石坠落

3.4 在自定义作品中使用(暂未支持)
4. [可选]为不同的开场白设置不同的默认值
在设计完变量之后,你可以为不同的开场白设计不同的默认值
比如有如下两个开场白:
1.森林里的夜晚,张三和李四正在瑟瑟发抖
2.在冰原上,刺眼的阳光晃得张三和李四有点雪盲
在变量弹窗的 默认值 TAB页中,修改对应的默认值,并点击刷新
| 开场白 | 图示 |
|---|
| 开场白1 |  |
| 开场白2 |  |
配置之后当玩家切换开场白时,对应的变量初始值也会变化。