脚本生成对话

可以通过脚本动态的生成对话、选项,而不是手动添加。

简单使用

玩家进入对话后,会执行整个脚本,从而得到生成对话所需要的对象。
这里的“进入对话”,包括点击了对话中的选项后,重新进入对话。因此,玩家点击选项时,会先执行选项中的『执行代码』,再从头执行对话脚本。
下面,我们将用脚本,来生成显示武器列表的对话。这个对话可以翻页,每页显示 3 种武器。
// 玩家刚进入对话和点击选项后,会执行整个脚本
var 武器列表 = [
  { 名称: '木棒', 战斗力: 1 },
  { 名称: '铁棍', 战斗力: 2 },
  { 名称: '手枪', 战斗力: 10 },
  { 名称: '大炮', 战斗力: 90 },
  { 名称: '激光', 战斗力: 500 },
  { 名称: '光粒', 战斗力: 23333 },
  { 名称: '二向箔', 战斗力: 99999 },
];

var 选项 = [];

// 如果页数大于0,则添加『上一页』按钮
if (属性.页数 > 0) {
  选项.push({
    文本: '上一页',
    执行代码: `属性.页数--`,
  });
}

//Math.ceil 可以向上取整,例如 Math.ceil(1.3) 会返回 2
//如果页数小于最大页数,则添加『下一页』按钮
//为什么最大页数用 Math.ceil(武器列表.length / 3) - 1 呢?试出来的 = =
if (属性.页数 < Math.ceil(武器列表.length / 3) - 1) {
  选项.push({
    文本: '下一页',
    执行代码: `属性.页数++`,
  });
}

var 对话文本 = '武器列表 - 第' + 属性.页数 + '页\n';
// 数组.slice(a, b) 可以从位置a到位置b截断数组,例如 [0, 1, 2, 3].slice(1,3) 会返回 [1, 2]
var 分页后的武器列表 = 武器列表.slice(属性.页数 * 3, 属性.页数 * 3 + 3);
for (var 武器对象 of 分页后的武器列表) {
  对话文本 += 武器对象.名称 + ' 战斗力:' + 武器对象.战斗力 + '\n';
}

选项.push({
  文本: '返回',
  执行代码: `属性.页数 = 0`,
  结束对话: true,
});

对话({
  文本: 对话文本,
  语速: 0,
  选项, // { 选项: 选项 } 可以简写成 { 选项 }
});
return;

在脚本中使用富文本

富文本的底层是 Markdown 文本。但是,如果想在脚本中动态展示富文本,却不能像普通文本那样插入变量。因为,[属性:临时文本]会把属性“临时文本”的值当成普通文本,而不是 Markdown。
// 这个方法无法工作,因为语句会认为 [属性:临时文本] 是一个普通文本而不是 Markdown
属性.临时文本 = '![](https://static.realm.host/uploads/images/2023/643d6a3c54346ef9a202595f.jpeg)';
可以通过脚本生成对话的方式,动态的改变富文本。
var markdown = '![](https://static.realm.host/uploads/images/2023/643d6a3c54346ef9a202595f.jpeg)';

对话({
  文本: '这是一张图片:\n' + markdown,
  富文本: true,
});