在楓之谷私服中,NPC 的對話、給予道具、判斷條件等功能,都是透過 JavaScript (JS) 腳本來實現的。這篇文章將透過一段簡單的「領取獎勵」範例代碼,帶您了解基礎的 NPC 撰寫結構。
💡 完整範例代碼
這是一個基礎的領取獎勵腳本,限制次數並發送獎勵道具給玩家:
var 道具代碼 = 4000000;
var 道具數量 = 1;
var 可領取次數 = 1;
var log = "4/10獎勵領取";
function start() {
status = -1;
action(1, 0, 0);
}
function action(mode, type, selection) {
if (mode == 0 || (mode == -1 && status == 0)) {
cm.dispose();
return;
}
mode == 1 ? status++ : status--;
if (status == 0) {
var msg = "";
msg += "是否確認領取 #i" + 道具代碼 + ":# x " + 道具數量 + " 個";
cm.sendYesNo(msg);
}
if (status == 1) {
if (cm.getPlayer().getPrizeLog(log) >= 可領取次數) {
cm.sendOk("此帳號已領取 " + 可領取次數 + " 次 已達領取上限");
cm.dispose();
return;
} else {
cm.gainItem(道具代碼, 道具數量);
cm.getPlayer().setPrizeLog(log);
cm.sendOk("獎勵已經發給你囉 剩餘可領取次數 " + (可領取次數 - cm.getPlayer().getPrizeLog(log)) + " 次");
cm.dispose();
return;
}
}
}
📖 程式碼解析
1. 變數設定 (自訂義參數)
一開始我們先宣告腳本會用到的變數。將可能會頻繁修改的數字或字串宣告在最上方的好處是:日後如果要改獎勵,只需要改上面這幾行就好,不用去底下找程式碼修改。
道具代碼:想發送的獎勵代碼(例如 4000000 是蝸牛殼)。log:這是紀錄的名稱(Key),用來辨識玩家是否領過該活動的獎勵。
2. start() 函數 (程式進入點)
當玩家點擊 NPC 時,系統會第一時間呼叫 start() 函數。在這裡我們通常會把對話頁數(status)設為 -1,然後呼叫 action(1, 0, 0) 讓程式直接進入到 status == 0 的第一個對話階段。
3. action() 函數與點擊判斷
action(mode, type, selection) 控制了與玩家的所有互動判斷:
- mode 判斷:玩家如果按下「結束對話」或「否」,
mode會回傳 0,此時腳本會執行cm.dispose()關閉對話。反之按下「是」或「下一步」,mode == 1,這時我們的對話狀態status就會 +1。 - status 分頁:利用
if (status == 0)、if (status == 1)來控制每個階段 NPC 該說什麼話。
4. 條件判斷與給予獎勵
腳本中最核心的發放判斷邏輯撰寫於 status == 1 之中:
getPrizeLog(log):用來查詢該帳號對於這項log的領取次數。if ( ... >= 可領取次數):大於等於上限次數時,會發送「已達上限」的訊息並結束對話。cm.gainItem()和setPrizeLog(log):發送道具給玩家,並且增加該帳號領取的紀錄。
學會這套基礎框架後,你就能夠輕鬆做出簽到、禮包兌換或是各種每日任務的 NPC 囉!快去試試看吧!