快速开始

在这里,会从一个具体的示例出发,来教会你如何使用变量系统。

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 中看到解析后的变量。

变量填入变量面板

查看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 效果

sdk效果

3.3 在世界书中使用

在世界书中读取变量,从而动态修改世界书条目内容

{% if mjv_value.张三.体力 > 50 %}
天空有陨石坠落
{% endif %}

3.3.1 示例

陨石

3.3.2 效果

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

3.4 在自定义作品中使用(暂未支持)

4. [可选]为不同的开场白设置不同的默认值

在设计完变量之后,你可以为不同的开场白设计不同的默认值

比如有如下两个开场白:

1.森林里的夜晚,张三和李四正在瑟瑟发抖
2.在冰原上,刺眼的阳光晃得张三和李四有点雪盲

在变量弹窗的 默认值 TAB页中,修改对应的默认值,并点击刷新

开场白图示
开场白1开场白1
开场白2开场白2

配置之后当玩家切换开场白时,对应的变量初始值也会变化。