冒险岛脚本编写基础教程六
第二级: 中坚份子第一课: Learning to code an NPC
编写 NPC 时最好对自己在干嘛有个概念,简单的方法是打开记事本,把你想
要 NPC 做的事情写下来。例如:
道具交换
对话框 1 - 显示几个选项
对话框 2 - 对话框 1 选择后显示几个选项
对话框 1 选项 - 矿石换黄金枫叶标志、矿石换枫叶
对话框 2 选项 - 如果选择黄金枫叶标志,10 个矿石交换 1 个黄金枫叶标志,20 个矿
石交换 3 个黄金枫叶标志
如果选择枫叶,5 个矿石交换 1 个枫叶,10 个矿石交换 3 个枫叶
以上只是个范例,但这样子做纪录,你就能事先想好最佳的布局,甚至能提醒
你当初的想法,假如你没法一次写好脚本的话。
现在,在你开始之前,你要先思考你需要什么类型的 NPC。如果你需要参考,
请回到第一级第二课。在这个范例中,我会使用需要 status 的 NPC,请阅读
批注(第一级第三课)来了解我在做什么。
var status;
function start() { // NPC 开始
status = -1; // 设定 status 为 -1
action(1, 0, 0); // 设定 mode 为 1, type 为 0, selection 为 0
} // 关闭 start 函数
function action(mode, type, selection) { // calls what you set above in
function start, almost all actions are done here
if (mode == 1) { // mode 被设为 1,因为函数 start,如上
status++; // 让 NPC 进到下一个 status,此时 status 变为 0
} else { // 如果 mode 不是 1
status--; // 不让 NPC 进到下一个 status
}
if (status == 0) { // 如果 mode 是 1,status 会从 -1 变为 0。如果
status 为 0,以下会发生
cm.sendSimple("哈啰,我来示范如何使用 #belse#k 和 #bif#k,准备好了
吗?\r\n #L0# 是的,船长。 #l \r\n #L1# 不,我还没好。 #l"); // 显示一个有两
个选项的对话窗
} else if (status == 1) { // 如果作出了选择,NPC 会进到下一个 status
if (selection == 0) { // 选项 0 是 #L0#, "是的,船长。"
if (cm.haveItem(4001129, 10)) { // 检查道具
cm.sendOk("如果 (if) 你选择选项 0,简单来说就是第一个选项,我
就会说这句话。"); // 如果 (if) 你有道具,会显示这个对话窗
cm.dispose();
} else {
cm.sendOk("抱歉,你没有该道具。"); // 否则 (else),你没有该
道具
cm.dispose();
}
} else if (selection == 1) { // "不,我还没好。"
cm.sendOk("否则如果(else if)你选择选项 1,我会说这句话。");
cm.dispose();
}
}
}
这里是一些能帮你弄懂 NPC 的东西:
sendNext(); & sendOk();
Type = 0
如果点了停止 - mode = -1
如果点了下一个/确认 - mode = 1
sendNextPrev();
Type = 0
如果点了停止 - mode = -1
如果点了下一个 - mode = 1
如果点了上一个 - mode = 0
sendYesNo();
Type = 1
如果点了停止 - mode = -1
如果点了是 - mode = 1
如果点了否 - mode = 0
sendAcceptDecline();
Type = 12
如果点了停止 - mode = -1
如果点了接受 - mode = 1
如果点了拒绝 - mode = 0
sendGetText();
没事儿
sendGetNumber();
Type = 3
如果点了停止 - mode = 0
如果点了确认 - mode = 1
sendSimple();
Type = 4
如果点了停止 - mode = 0
如果点了选择 - mode = 1
Credits: BENG
括号会是决定 NPC 能不能运作的关键。让我们看看上面 NPC 脚本的一个小片段:
if (cm.haveItem(4001129, 10)) { // 检查道具
cm.sendOk("如果 (if) 你选择选项 0,简单来说就是第一个选项,我就会
说这句话。"); // 如果 (if) 你有道具,会显示这个对话窗
cm.dispose();
}
看看第一行...
if (cm.haveItem(4001129, 10)) {
在第一行的尾端有一个左括号,这代表当条件为真时,其后所接的事情将会发 生。以该行来说,如果你有 10 个 4001129,下一行就会执行。 看看此片段的最后一行,注意到右括号了吗?
}
右括号结束条件,所以任何介于左括号与右括号之间的事情都将会在指定的条 件成立后发生。 右括号又经常伴随着 else,也就是当你没有足够的道具时,else 之后的片段 便会执行。
谢谢分享 真不戳真不戳
页:
[1]