在撰寫 NPC 腳本時,讓對話文字變得豐富生動是非常重要的。本篇將為大家整理最常用的字體顏色、變數代碼替換(例如顯示道具圖示、玩家名字)以及各種經典的對話彈窗函數。
一、字體與字型顏色變化
- #b 字體改為藍色
- #d 字體改為紫色
- #g 字體改為綠色
- #k 字體改為黑色 (預設)
- #r 字體改為紅色
- #e 字體改為粗體
- #n 字體改為正常 (移除粗體)
範例說明
function start() {
cm.sendOk("#r這行字會顯示紅色!#e這行字會變粗體!");
cm.dispose();
}
二、NPC 特定變數代碼顯示用法
利用這些代號可以直接在語句中帶入遊戲內的名稱或是圖示:
#c[道具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 檔案中的圖片範例說明
function start() {
cm.sendOk("渾沌卷軸圖片: #i2049100# 道具名稱: #t2049100#");
cm.dispose();
}
三、NPC 選項選單寫法
當我們需要提供多個選項讓玩家選時,就需要使用 #L選項數字# 選項名稱 #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("你看到我如何操作了嗎?\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 變數值喔!
四、基礎排版與符號用法
- \r\n : 換行 (最常用)
- \r : 確認(回車)
- \n : 新的一行
- \t : Tab (排版縮排用)
- // 註解 : 單行程式碼備註,給人看的腳本不執行。
- /* 註解 */ : 多行程式碼備註包夾區塊。
⚠️ 特別注意: 任何 NPC 腳本結束運作時,都強烈建議加上 cm.dispose(); 語句來關閉對話狀態,否則將導致玩家卡對話無法動彈!
五、NPC 常用對話開窗函數
cm.sendOk() / cm.sendNext()
單純顯示「確認」或是「下一步」。
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.sendSimple()
用來顯示選項清單列表。
Type = 4
點結束: mode = 0
點選項: mode = 1
cm.sendGetText()
彈出輸入框讓玩家輸入字串文字。
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();
}
}