各位好,NPC算是要學習楓之谷必備要會的條件之一,這篇文章要來向各位講解關於NPC的基本運作,NPC的腳本也就是所謂很多人常常在講的的JS,通常會放在服務端主目錄的scripts資料夾內。
(一) JS編輯器選用
大眾都是使用NotePad++來編輯JS檔案
優點:可運用的功能多,例如可批量替代字符。
另外我個人是喜歡使用Visual Studio Code
優點:看起來很舒服,可以自動格式化腳本,不用自己編排格式。
(二)NPC的架構
NPC 主要有兩種:需要status的,以及不需要status的。如果NPC 會需要兩個以上的對話就會需要用到status;若不用,那status可能用不太到。請見以下範例:
不須status的NPC 一:
function start() {
cm.sendOk("我是一個沒有 status 的 NPC。");
cm.dispose();
}
不須status的NPC 二:
function start() {
cm.sendOk("這是另一個沒有 status 的 NPC。");
}
function action(mode, type, selection) {
cm.warp(100000000, 0); //飛往地圖 100000000
cm.gainItem(4001126, 1); //發送物品 4001126 * 1
cm.sendOk("看到了嗎?我不用 status 就能把你傳送走並給你道具。");
cm.dispose();
}
須要status的NPC
var status = -1;
function start() {
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == 1) {
status++;
} else {
status--;
}
if (status == 0) {
cm.sendNext("請按下一步,我才能繼續下一個 status。");
} else if (status == 1) {
cm.sendSimple("你看到我如何操作 status 了嗎?\r\n #L0# 是 #l \r\n #L1# 否 #l");
} else if (status == 2) {
if (selection == 0) {
cm.sendOk("我在這!這是另一個 status。如你在腳本中看到的,這個對話窗是在 status 2。");
cm.dispose();
} else if (selection == 1) {
cm.sendOk("好吧,這個對話窗也是在 status 2 :)");
cm.dispose();
}
}
}
(三)NPC內字體與字型的用法
#b = 字體改為藍色
#d = 字體改為紫色
#g = 字體改為綠色
#k = 字體改為黑色
#r = 字體改為紅色
#e = 字體改為粗體
#n = 字體改為正常 (移除粗體)
舉例一個NPC顯示紅色的文字 + 粗體字:
function start() {
cm.sendOk("#r這行字會顯示紅色哦!#e這行字會變粗哦!");
cm.dispose();
}
(四)NPC其他必備顯示用法
#c[道具ID]# 顯示玩家背包中有多少 [道具ID]
#h # - 顯示玩家名稱
#m[地圖ID]# - 顯示地圖名稱
#o[怪物ID]# - 顯示怪物名稱
#p[NPCID]# - 顯示 NPC 名稱
#q[技能ID]# - 顯示技能名稱
#s[技能ID]# - 顯示技能圖片
#t[道具ID]# - 顯示道具名稱
#i[道具ID]# - 顯示道具圖片
#i[道具ID]:# - 顯示道具圖片+滑鼠移動圖片顯示
#z[道具ID]# - 顯示道具名稱
#v[道具ID]# - 顯示道具圖片
#B[%]# - 顯示進度條
#f[圖片位址]# - 顯示 WZ 檔案中的圖片
#F[圖片位址]# - 顯示 WZ 檔案中的圖片
舉例一個NPC顯示混沌卷軸資料:
(五)NPC選項用法:
如果你的NPC需要給玩家選擇選項,就必須要使用這個用法。
#L[數子]# 選項開始
#l - 選項結束
範例:
var status = -1;
function start() {
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == 1) {
status++;
} else {
status--;
}
if (status == 0) {
cm.sendSimple("你看到我如何操作 status 了嗎?\r\n #L1# 選項1 #l \r\n #L2# 選項2 #l");
} else if (status == 1) {
if (selection == 1) {
cm.sendOk("你選了選項1!");
} else if (selection == 2) {
cm.sendOk("你選了選項2!");
}
cm.dispose();
}
}
這邊解釋一下底下的範例 #L# 中間的數字決定下一個status運行所賦予的selection值
例如此NPC點了選項1 那麼再status == 1時 會運行到if (selection == 1) 所判斷的地方 也就是
cm.sendOk("你選了選項1!");
(五)NPC其餘用法:
\r\n - 換行
\r = 確認(回車)
\n = 新行
\t = Tab (4 個空格)
\b = Backwards
// 這是一種註解
/** 這裡是多行註解, 任何被 * 包起來的東西都不會被腳本解釋器解讀。 **/
這些也是寫NPC必備要會的東西之一,就不再舉例 初學者可以按照上面的方式嘗試修改。
另外補充說明cm.dispose(); 這個語句通常會出現在腳本要結束的時候必須添加(OD端)否則遊戲內會跳解卡。
(六)NPC對話用法
-----------------------------------------------
顯示確定對話框 OK 跟 下一個
cm.sendNext();
cm.sendOk();
Type = 0 如果點了停止 - mode = -1 如果點了下一個/確認 - mode = 1
-----------------------------------------------
顯示上一個&下一個
cm.sendNextPrev();
Type = 0 如果點了停止 - mode = -1 如果點了下一個 - mode = 1 如果點了上一個 - mode = 0
-----------------------------------------------
顯示是與否
cm.sendYesNo();
Type = 1 如果點了停止 - mode = -1 如果點了是 - mode = 1 如果點了否 - mode = 0
-----------------------------------------------
顯示要不要接受
cm.sendAcceptDecline();
Type = 12 如果點了停止 - mode = -1 如果點了接受 - mode = 1 如果點了拒絕 - mode = 0
-----------------------------------------------
獲取文字
cm.sendGetText();
沒事兒
-----------------------------------------------
獲取數字
cm.sendGetNumber();
Type = 3 如果點了停止 - mode = 0 如果點了確認 - mode = 1
-----------------------------------------------
cm.sendSimple();
Type = 4 如果點了停止 - mode = 0 如果點了選擇 - mode = 1
-----------------------------------------------
這邊舉例一個cm.sendGetNumber(); 用法
sendGetNumber需要帶入4個參數
cm.sendGetNumber( 文字, 初始定義, 最小值, 最大值);
var status = -1;
function start() {
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == 1) {
status++;
} else {
status--;
}
if (status == 0) {
cm.sendGetNumber("你要輸入數字多少呢?",1,1,100);
} else if (status == 1) {
cm.sendOk("你輸入了數字" + selection + "!");
cm.dispose();
}
}
Comments