四度空間 Area 工具v0.4← void7777 首頁
這個房間的碼(即時預覽)
這隻怪的碼(即時預覽)
這個物品的碼(即時預覽)
area\ 並加入 area.lst。適用於 Area Builder Kit。本文分兩部分:傳統 .are 格式與 Lua 格式。
新手建議從 .are 入門;想寫互動劇情(考試、任務、對話)再用 Lua。
不想手寫的話,可以用 視覺化編輯器 勾選產生。
0. 開始之前:共通觀念
vnum:一切的鑰匙
每個房間、怪物、物品都有一個唯一編號 vnum。三種東西的編號空間是分開的 (房間 3001 和怪物 3001 可以同時存在)。開始製作前,先向站方申請一段專屬的 vnum 區間(例如 25000–25099),你的所有東西都只能用這段編號,也只能引用 「自己的編號」和站方明確開放的系統編號。
Get_room_index: bad vnum N 之類的訊息告訴你是哪個編號。檔案編碼:Big5
所有區域檔(.are 與 .lua)都必須以 Big5 編碼儲存。編輯器請設定用 Big5(CP950)開檔與存檔——若不小心用 UTF-8 重存,遊戲裡整片亂碼。 Windows 可用 Notepad++(編碼選單 → Big5)或 VS Code(右下角編碼 → Reopen/Save with Encoding → Big5)。
讓伺服器載入你的檔案
把檔案放進 area\,然後編輯 area\area.lst,
在 greeting.pic 那行之前加上你的檔名,重新啟動伺服器即可。
副檔名決定格式:.are 走傳統格式、.lua 走 Lua 格式。
1. 傳統 .are 格式
1.1 檔案骨架
一個 .are 檔由數個區段組成,每段以 #區段名 開頭。
不需要的區段可以整段省略,但順序建議照慣例:
#AREA {25 35} YourName 你的區域名稱~
#MOBILES
(怪物定義……)
#0
#OBJECTS
(物品定義……)
#0
#ROOMS
(房間定義……)
#0
#RESETS
(重生規則……)
S
#SHOPS
(商店……)
0
#SPECIALS
(特殊行為……)
S
#$
#AREA行:{建議等級} 作者 區域名~,結尾一定要~。 注意對齊:遊戲顯示區域名時是從這串字的第 16 個位元組開始取, 所以「{等級}+ 空格 + 作者」要用空格補滿剛好 16 個位元組, 區域名才不會被切掉開頭(切在中文字中間還會變亂碼)。
對照現有檔案:{ ALL }(8) +Qing(8) = 16, 接著才是區域名。編輯器會自動幫你補齊。#MOBILES/#OBJECTS/#ROOMS各以一行#0結束- 整個檔案以
#$結束 - 文字欄位一律以
~結尾。~之前的內容可以跨很多行
1.2 房間 #ROOMS
#25001
溫暖的小屋~
這是一間木造的小屋, 壁爐裡的火燒得正旺, 讓整個房間充滿暖意.
角落有一張看起來十分舒適的床.
~
0 8 0
D0
你看到一條通往森林的小徑.
~
~
0 -1 25002
E
bed 床~
一張鋪著厚棉被的木床, 看起來就很好睡.
~
S
| 行 | 說明 |
|---|---|
#25001 | 房間 vnum |
溫暖的小屋~ | 房間名稱(look 時的標題) |
敘述 + ~ | 房間描述,可多行,單獨一行 ~ 結束 |
0 8 0 | 三個數字:保留欄(填0)、房間旗標、地形。旗標可用 | 組合,
例:8|1024 = 室內+安全區。旗標與地形數值見速查表 |
D0 區塊 | 出口。D0=北 D1=東 D2=南 D3=西 D4=上 D5=下。
內容依序是:出口敘述~、門的關鍵字~(沒門就留空一行~)、
然後一行三個數字 門 鑰匙 目的地:門 0=無門 1=普通門 2=撬不開的門;
鑰匙=鑰匙物品 vnum(無鑰匙填 -1);目的地=對面房間 vnum |
E 區塊 | 額外敘述(可省略):關鍵字列~ + 敘述~,
玩家 look bed 就會看到 |
S | 房間結束 |
Fix_exits 警告就是兩邊沒對好。1.3 怪物 #MOBILES
#25001
innkeeper 老闆~
旅店老闆~
和藹的旅店老闆站在櫃臺後面./innkeeper
~
他看起來五十多歲, 臉上總是掛著親切的笑容.
~
2 0 300 S
30 20 -50 5d10+300 3d6+10
5000 0
8 8 1
| 行 | 說明 |
|---|---|
#25001 | 怪物 vnum |
innkeeper 老闆~ | 關鍵字(玩家指令用來指定目標,建議中英都放) |
旅店老闆~ | 短稱(戰鬥訊息等使用) |
長敘述 + ~ | 站在房間裡時顯示的句子。慣例會在結尾加 /英文關鍵字 方便玩家知道怎麼指定 |
詳細敘述 + ~ | look innkeeper 時顯示 |
2 0 300 S | 行為旗標、狀態旗標、陣營、S。行為旗標例:2=定點不走動、
32=主動攻擊、可用 | 組合(如 2|64=定點+只待本區域)。陣營 -1000(極惡)~ 1000(極善)。
結尾 S 固定要有 |
30 20 -50 5d10+300 3d6+10 | 等級、命中加成、防禦(AC,越低越硬)、 HP骰(NdS+P)、傷害骰(NdS+P) |
5000 0 | 金錢、經驗值(經驗填 0 讓系統自動算) |
8 8 1 | 位置、位置、性別(0=中性 1=男 2=女;位置 8=站立) |
怪物類別(C 行,可省略)
數值行之後可以加一行 C Class <n> $ 指定特殊類別,實際區域檔用了一千多次:
| 值 | 類別 | 效果 |
|---|---|---|
| 1 | CONJURATION 召喚獸 | 召喚系怪物 |
| 2 | STATUE 雕像 | 不可被攻擊(最常用,佈景用 NPC 都該設) |
| 3 | TRANSPORT 交通工具 | 載具,同樣不可攻擊 |
| 4 | MERIT 戰功怪 | 擊殺可獲戰功 |
| 5 | UNDEAD 不死系 | 不死屬性 |
8 8 1
C Class 2 $
Lua 格式寫成 class = 2,。不需要特殊類別就整行省略。
怪物可以在數值行之後加行為程式(mob prog),讓它會回應玩家:
>talk_prog topic~
mpechoat $n 歡迎光臨! 要住宿嗎?
~
>greet_prog 100~
smile
say 歡迎光臨!
~
|
每段以 >觸發_prog 參數~ 開頭、單獨一行 ~ 結束;
最後一段之後加一行 | 表示這隻怪的程式結束。
常用觸發:greet_prog 機率(玩家進房)、talk_prog 關鍵字(玩家 talk)、
give_prog 物品(玩家給東西)、fight_prog 機率(戰鬥中)、
death_prog 機率(死亡時)、rand_prog 機率(隨機)。
number_percent() <= 參數,而 number_percent() 回傳 1–100,
所以參數填 0、留空或填成文字(atoi 得 0)時,這段程式永遠不會觸發,而且不會有任何錯誤訊息。
| 參數型別 | 屬於哪些觸發 | 說明 |
|---|---|---|
| 機率 % | greet/all_greet/leave/all_leave/rand/fight/death/dying/entry/tick/birth/timetodie/killer/reset | 1–100,100 = 必定觸發 |
| 血量門檻 % | hitprcnt | 血量低於此百分比時觸發 |
| 關鍵字 | talk/speech/act/give/learn/skill/action | speech 與 act 可用 p 開頭改成比對整句;give 可用 all。
speech/act 一格只放一個關鍵字——填多個時,玩家一句話同時命中兩個,
內文會執行兩次(獎勵發兩份)。p 開頭可避免這點 |
| 金額 | bribe | 給錢達到此數才觸發 |
| 兩個數字 | affect | 「法術編號 機率」,例如 12 100 |
| 忽略 | drop | 每次都觸發 |
sayto、echoat、self 等是
lua/void.lua 定義的輔助函式,在 .are prog 裡完全無效——
而且會靜默失敗:怪沒有連線descriptor,錯誤訊息無處可送,log 也不會記錄,
你只會看到「怪什麼都沒做」。.are prog 常用指令
| 指令 | 說明 |
|---|---|
mpechoat $n 訊息 | 只有觸發者看得到的訊息(最接近 Lua 的 sayto) |
mpecho 訊息 | 房間內所有人都看到(怪自己看不到) |
mpechoaround $n 訊息 | 房間內除了觸發者以外的人看到 |
say 內容 / tell $n 內容 | 怪開口說話(房間 / 私聊) |
smile、nod 等 | 一般社交指令,直接寫 |
mpjunk self all | 銷毀自己身上的所有物品(self 在此是指令參數,合法) |
mpmload 怪vnum | 在房間生出怪物(沒有 mpload 這個指令;此指令不吃等級參數,多寫會被忽略) |
mpoload 物vnum [等級] | 生出物品到怪自己的背包。永遠放不到地上——想放地上請用下一行的 rpoload |
mpoload 物vnum 等級 $z | 生出物品直接給該玩家(怪看不見對方時會退回自己背包) |
rpoload 物vnum 等級 | 把物品放到地上。怪程式與房間程式都能用;等級可省略但會寫進 bug log,請一律填 |
mpgoto vnum、mptransfer $n vnum | 怪自己移動 / 把玩家傳送走 |
mpforce $n 指令 | 強迫玩家執行指令 |
$ 變數與條件判斷
| 變數 | 意義 |
|---|---|
$n | 觸發者名字。怪看不到對方時會變成「某位不知名人士」 |
$z | 觸發者名字,不受隱形/躲藏影響(站內區域檔最常用這個) |
$i | 怪自己的名字(關鍵字) |
$I | 怪自己的短稱 |
$t / $o | 目標對象 / 相關物品 |
>greet_prog 100~
if ispc($n)
if rand(30)
mpechoat $z 你覺得有人在看著你...
endif
endif
~
|
條件判斷用 if 判斷式 … endif(可搭配 else)。
常用判斷:rand(機率)、ispc($n)、isnpc($n)、
level($n) > 20、inroom($i) == 房間vnum、clan($n) == 幫派編號、
hours($i) < 4、goldamt($n)、is_qmark($n)(任務旗標)。
房間也可以有程式,但觸發種類完全不同
房間 prog 寫在房間的 S 之前(額外敘述 E 區塊之後),格式與怪物相同。
但房間只支援 7 種觸發,把怪物專屬的 talk_prog、fight_prog 等寫在房間上,
檔案會正常載入、然後永遠不會執行:
| 房間可用的觸發 | 參數意義 | 說明 |
|---|---|---|
greet_prog / all_greet_prog | 機率 1-100 | 玩家走進房間。兩者只會生效一個(有 greet 就不會跑 all_greet)。
房間版沒有視線判定(房間沒有「看得到/看不到」可言),所以兩者完全等價,
擇一即可——但不要同時寫,同時寫的話 all_greet 那條永遠不會執行。
(怪物版才有「看得到才觸發」的差別。)
注意:被 mptransfer 傳送進來不會觸發,只有正常走路才會 |
leave_prog / all_leave_prog | 機率 1-100 | 玩家離開房間,同樣兩者擇一、同樣沒有視線判定。 擋不住人:在這裡把玩家傳走,他仍會抵達原本的目的地 |
action_prog | 指令字串 | 玩家在此房間輸入某個指令時觸發,可自創指令(如 touch)。
比對的是玩家輸入的整行文字:>action_prog north~ 攔不到 n,
反之亦然,多一個空白也不中(大小寫不拘)。命中時會攔截真正的指令——
取名 look 會讓房內所有人不能單獨打 look(但 look 招牌 仍正常) |
reset_prog | 機率 1-100 | 區域重置時。需要該房間有 V reset 行才會被呼叫 |
drop_prog | (忽略) | 物品被放進此房間時。觸發面很廣(屍體、重置放物、法術造物都算) |
- 用
mpecho(整房)或mpechoat $n(只給觸發者)輸出訊息 - 不要用
say——會顯示成沒有名字在說話,還會觸發同房怪物的 speech_prog - 不要用
$i/$I——會印出內部字串roommob或一片空白 $v是本房間的 vnum,這是房間程式專屬的好用變數reset_prog與drop_prog觸發時沒有觸發者,$n/$z會是空的
#25101
古老的石室~
房間中央立著一塊斑駁的石碑.
~
0 8 0
D1
~
~
0 -1 25102
>all_greet_prog 100~
mpechoat $n 你踏進石室,一股寒意爬上背脊。
~
>action_prog touch~
if ispc($n)
mpechoat $z 你伸手觸摸石碑,碑面浮現一行古老的文字。
mpechoaround $z $z 伸手觸摸了石碑。
endif
~
|
S
房間程式另有幾個專用指令:
rpdamage <hp|mana|move|power> <對象> <下限> <上限>(陷阱扣血)、
rpoload <物品vnum> <等級>、rpcast、rpaffect。
rpdamage 有兩個常見寫錯的地方:第一個參數是傷害類型,不能省略
(省略會讓後面全部位移,找不到目標而整行靜默失效);傷害範圍小的要寫前面——
寫反時不會隨機,會固定取到前面那個值。
1.4 物品 #OBJECTS
#25001
bread 麵包~
香噴噴的麵包~
一塊香噴噴的麵包被遺忘在這裡.~
~
19 0 1
10 0 0 0
1 20 0
| 行 | 說明 |
|---|---|
#25001 / 三行文字 | vnum、關鍵字~、短稱~、
掉在地上時的敘述~、第四行通常留空 ~ |
19 0 1 | 物品類型、特殊旗標、穿戴位置。類型例:5=武器 9=防具 19=食物 15=容器;
穿戴位置 1=可撿取,武器用 1|8192(可撿+可持)、防具依部位組合,見速查表 |
10 0 0 0 | v0–v3 四個數值,意義依類型而異:武器 v1=最小傷害、v2=最大傷害
(不是骰子!本站是 number_range(v1,v2))、v3=攻擊型態;防具 v0=護甲值;
食物 v0=飽食度、v3≠0 表示有毒;容器 v0=容量 |
1 20 0 | 重量、價格、保留(0) |
屬性加成 A 與額外敘述 E(裝備必看)
數值行之後可以接任意多組 A(加成)與 E(額外敘述)區塊。
沒有 A 區塊的裝備就只是件普通衣服——防具的護甲值來自 v0,其他所有加成都靠 A:
#25002
sword 神劍~
一把神劍~
一把神劍插在地上.~
~
5 1 8193
0 10 30 3
10 5000 0
A
18 5 * 命中 +5(18 = APPLY.HITROLL)
A
13 100 * 生命力 +100(13 = APPLY.HIT)
E
blade 劍身~
劍身上刻著古老的符文.
~
A 之後一行兩個數字:效果代碼、加減值(可為負數)。
常用代碼:命中 18、傷害 19、生命力 13、精神力 12、移動力 14、防禦 17、
力量 1、速度 2、智力 3、睿智 4、體格 5、內力 27,完整清單見速查表的 APPLY。
E 之後是關鍵字列 ~ 加敘述 ~,玩家 look blade 就會看到。
Lua 格式分別寫成
affects = { { location = APPLY.HITROLL, modifier = 5 }, … } 與
extras = { ["blade 劍身"] = [[ … ]] }。
1.5 重生 #RESETS
Reset 決定「開機與定期重置時,什麼東西出現在哪」。每行一條規則,區段以單獨一行 S 結束:
#RESETS
M 1 25001 1 25001 * 把怪 25001 放進房間 25001(最多 1 隻)
G 1 25001 0 * 給「上一隻 M 的怪」物品 25001(拿在身上)
E 1 25002 0 16 * 讓上一隻怪穿上物品 25002(16=穿戴位置代碼)
O 1 25003 0 25002 * 把物品 25003 放在房間 25002 地上
P 1 25004 0 25003 * 把物品 25004 放進容器物品 25003 裡
D 1 25001 0 1 * 房間 25001 的 0 號門(北)重置為關閉
M 3 25005 1 25004 * 每 3 次重置才生出一次(稀有怪)
V 1 25001 0 0 * 標記房間 25001,它的 reset_prog 才會被呼叫
S
time:
填 N 表示「每 N 次區域重置才執行一次」,填 0 或 1 都是每次都執行。
現有區域檔裡約四分之一的 reset 行用了非 0 的值(M 3 就出現四百多次),
拿來做稀有怪或稀有寶物的生成控制。G/E 一定緊跟在某條 M 後面,
它們作用在「最近一條 M 生出來的那隻怪」身上。V 這一行只是「標記」:房間若寫了 reset_prog,
必須再加一條 V reset 指向它,否則那段程式永遠不會被呼叫。1.6 商店與特殊行為
#SHOPS
25001 19 0 0 0 0 120 80 0 23 * 老闆vnum 收購類型×5 買價% 賣價% 營業時間
0
#SPECIALS
M 25002 spec_guard * 讓怪 25002 有警衛行為
S
商店行:老闆的怪物 vnum、五個「收購的物品類型」(不收購就填 0)、
賣出價 %(120=賣玩家 1.2 倍價)、收購價 %(80=用 0.8 倍價收)、開店與關店時間(0–23)。
特殊行為常用的有 spec_guard(警衛)、spec_janitor(撿垃圾)、
spec_fido(吃屍體)、spec_thief(偷錢)、spec_cast_adept(幫新手補血),
完整清單向站方索取。
2. Lua 格式
Lua 格式能做到 .are 做不到的事:真正的程式邏輯(變數、條件、計分、多步驟任務)。 代價是要會一點 Lua。結構上它就是「用 Lua 表格描述同一批資料」,再加上可以掛函式。
2.1 檔案骨架
-- myarea.lua(記得存成 Big5 編碼)
area = {
name = "{25 35} YourName 你的區域名稱",
testing = 0,
}
register_area(area)
rooms = {}
mobs = {}
objs = {}
-- (下面各節的定義寫在這裡)
register_rooms(rooms)
register_mobs(mobs)
register_objs(objs)
resets = {
{ rtype = RESET.MOB, mob = 25001, room = 25001 },
}
register_resets(resets)
2.2 房間
rooms[25001] = {
vnum = 25001,
name = "溫暖的小屋",
description = [[
這是一間木造的小屋, 壁爐裡的火燒得正旺, 讓整個房間充滿暖意.
角落有一張看起來十分舒適的床.
]],
room_flags = ROOM.INDOORS,
sector_type = SECTOR.INSIDE,
doors = { -- 沒有出口時也要寫 doors = {}
[DIR.NORTH] = { vnum = 25002 }, -- 普通出口
[DIR.EAST] = { vnum = 25003, locks = 1, -- 有門(見下方說明)
key = 25010, -- 鑰匙物品(無鑰匙填 -1)
keyword = "door 木門" },
},
extras = {
["bed 床"] = [[
一張鋪著厚棉被的木床, 看起來就很好睡.
]],
},
}
[[ ]]是 Lua 的多行字串,行首的縮排會自動去除,可以放心排版room_flags/sector_type用內建常數(ROOM.*、SECTOR.*), 多個旗標用+相加:ROOM.INDOORS + ROOM.SAFEdoors的 key 用DIR.NORTH等六個方向locks在 Lua 和 .are 的意義不一樣:.are 那欄是「代碼」(1=門、2=撬不開的門), Lua 這裡卻是直接寫進 exit_info 的位元遮罩。所以要撬不開的門,Lua 要寫locks = 33(EX_ISDOOR(1) + EX_PICKPROOF(32)),寫 2 會變成「關著但撬得開」。 可用的位元:門 1、關著 2、鎖住 4、穿門無效 16、撬不開 32- 沒有任何出口的房間也一定要寫
doors = {}——載入器不會檢查這個欄位存不存在, 省略掉會讓整個區域載入失敗 - 無鑰匙的門,
key要寫-1(省略會被當成「鑰匙是編號 0 的物品」)
2.3 怪物與程式(progs)
mobs[25001] = {
vnum = 25001,
name = "innkeeper 老闆",
short_descr = "旅店老闆",
long_descr = "和藹的旅店老闆站在櫃臺後面./innkeeper\n",
description = [[
他看起來五十多歲, 臉上總是掛著親切的笑容.
]],
act = ACT.SENTINEL + ACT.STAY_AREA,
affected_by = 0,
alignment = 300,
level = 30,
hitroll = 20,
dc = -50, -- 防禦,越低越硬
hp_dicenum = 5, hp_dicesize = 10, hp_plus = 300, -- HP = 5d10+300
damage_dicenum = 3, damage_dicesize = 6, damage_plus = 10,
gold = 5000,
sex = SEX.MALE,
progs = {
{
ptype = PROGTYPE.TALK, -- 玩家對他 talk topic 時觸發
argument = "topic",
prog = function()
sayto(ch, "歡迎光臨! 住一晚 100 元, 錢直接給我就行.")
end
},
{
ptype = PROGTYPE.BRIBE, -- 玩家給錢時觸發
argument = "100", -- 給滿 100 才觸發這段
prog = function()
mdo("smile")
sayto(ch, "好的, 房間在北邊, 請慢用!")
end
},
},
}
name、short_descr、long_descr、hp、max_hp、
mana、max_mana、sex、vnum、room、
arg、is_npc、next_in_room、level、life。
讀取清單外的欄位(例如 ch.gold)不會回傳 nil,而是直接丟出錯誤中斷這段 prog。
要判斷金錢請改用 PROGTYPE.BRIBE(如上例)。prog 裡可用的東西(常用):
| 名稱 | 說明 |
|---|---|
self | 這隻怪自己 |
ch | 觸發程式的玩家 |
sayto(ch, "...") | 對某人說話 |
mdo("指令") | 讓怪執行任何遊戲指令(可多個參數連續執行) |
echoat(ch, "...") | 對某人顯示訊息 |
rand(30) | 30% 機率回傳 true;rand() 不給參數則回傳 1–100 |
time() | 取得遊戲時間 {hour=, week=} |
say("...") / yell("...") | 怪說話 / 大喊 |
social("笑", ch) | 對某人做社交動作 |
get_room(vnum) | 取得房間物件 |
以上大多是引擎內建函式;sayto 則定義在你收到的
lua/void.lua 裡(它是 echoat 的包裝,會輸出「某某 說 '……'」的格式),
可以直接打開來看有哪些輔助函式。
觸發類型用 PROGTYPE.*:TALK(talk 關鍵字)、GREET/ALL_GREET(玩家進房)、
GIVE(收到物品,argument 填物品關鍵字或 "all")、
FIGHT、DEATH、RAND(argument 填機率)等,完整列表見速查表。
更進階的玩家操作(任務旗標 ch:has_qmark() 等)請參考站方提供的 Lua 區域範例。
2.4 物品
objs[25001] = {
vnum = 25001,
name = "bread 麵包",
short_descr = "香噴噴的麵包",
description = "一塊香噴噴的麵包被遺忘在這裡.",
item_type = ITEMTYPE.FOOD,
extra_flags = 0, -- ITEM.GLOW + ITEM.MAGIC ...
wear_flags = WEAR.TAKE, -- 武器: WEAR.TAKE + WEAR.WIELD
values = { 10, 0, 0, 0 }, -- 意義依類型,同 .are 的 v0-v3
weight = 1,
cost = 20,
affects = { -- 同 .are 的 A 區塊,裝備才需要
{ location = APPLY.HITROLL, modifier = 5 },
{ location = APPLY.HIT, modifier = 100 },
},
extras = { -- 同 .are 的 E 區塊
["blade 劍身"] = [[
劍身上刻著古老的符文.
]],
},
}
2.5 重生
resets = {
{ rtype = RESET.MOB, mob = 25001, room = 25001 }, -- 怪放進房間
{ rtype = RESET.GIVE, obj = 25001 }, -- 給上一隻怪(拿著)
{ rtype = RESET.EQ, obj = 25002 }, -- 上一隻怪穿上
{ rtype = RESET.OBJ, obj = 25003, room = 25002 }, -- 物品放地上
{ rtype = RESET.PUT, obj = 25004, tobj = 25003 }, -- 物品放進容器
{ rtype = RESET.DOOR, room = 25001, dir = DIR.EAST },-- 門重置為關閉
{ rtype = RESET.MOB, mob = 25002, room = 25003, time = 3 }, -- 每 3 次重置才重生一次
}
register_resets(resets)
time 欄位(可省略,預設 1)是這套系統的擴充:
填 3 表示每 3 個重置週期才執行一次,適合稀有怪或稀有寶物。3. 測試你的區域
- 把檔案放進
area\、加入area.lst(見第 0 節),執行startup.bat - 看主控台訊息:格式錯誤或壞 vnum 會在這裡直接告訴你
- 建立測試角色並升為巫師(做法見 Builder Kit 的 README.md),然後:
指令 用途 goto 25001直接跳到你的房間 load mob 25001/load obj 25001當場生出怪/物品 purge清空房間裡的怪與物品 mstat 怪/ostat 物品/rstat檢視怪/物品/房間的內部數值 - 逐一走過每個房間、每個出口,確認雙向都通、門和鑰匙行為正確
- 用一般玩家角色再走一次(很多問題巫師看不到,例如 no_mob 旗標擋怪)
4. 常見陷阱
以下都是「檔案載得進去、開機不報錯、但行為不對」的狀況。 編輯器產出的碼已經避開這些,手寫或手改時才會踩到。
4.1 行為程式
| 陷阱 | 正確做法 |
|---|---|
| 同一隻怪/同一個房間寫第二個 prog 區塊,第一個會被靜默覆寫 | 所有 prog 寫在同一個區塊裡,中間不要插入其他欄位 |
怪物上寫 action_prog/reset_prog/drop_prog——
會正常載入、mpstat 也看得到,但永遠不會執行(這三種只有房間版有觸發點) |
這三種只寫在房間上 |
mpkill 不能縮寫成 mpk——會被另一個同名的低階指令吃掉,然後什麼也不做 |
拼完整。mpset 系列同理,一律拼完整 |
give_prog/bribe_prog 裡的 $p 恆為空字串,
if number($p) 會被判為 false 且不報錯 |
改用 $o(物品名)/$O(物品短稱)。
建議寫 >give_prog all~ 再用 if number($o) == <vnum> 判定,比字串比對安全 |
被 charm(魅惑)的怪完全不跑任何 prog,也失去 mp 指令權限 |
關鍵機關怪要防 charm |
| prog 型別名稱打錯一個字母 → 開機直接中止 | 這個至少會當場發現;照速查表拼 |
> 與 + 是語言選擇:> 是傳統文字、+ 是 Lua。
兩者都能寫在一般 .are 裡,但同一個怪物 prog 區塊內不可混用(混用會中止開機) |
一個區塊只用一種。用錯符號不會報錯,只會把內文當成另一種語言解讀 |
| 怪物版 greet/leave 掃描同房角色時最多只看 31 個,人太多時後面的會被跳過 | 人潮密集處不要依賴它做關鍵判定 |
4.2 程式內文的指令
| 陷阱 | 正確做法 |
|---|---|
mpcast 的等級參數會被直接丟棄,一律以施法者等級施放 |
只用 mpcast <法術名> [目標] |
| 技能名是前綴比對,寫短了會靜默授予另一個技能 | 技能名一律寫完整 |
mpteach 在玩家記憶點數不足時對程式而言是靜默失敗
(玩家看得到訊息,但程式無法分支、也不會留 log) |
先用 if can_learn $n <技能> 判定,發不出去時給替代獎勵 |
4.3 任務標記(qmark)
| 陷阱 | 正確做法 |
|---|---|
房間 qmark(mpadd_qmark <房號> <標記>)不會存檔,重開機就歸零,
而且是全服共用,不是個人進度 |
個人進度一律用玩家 qmark:mpadd_qmark $z <標記> |
玩家 qmark 只要既不是已註冊的任務完成標記、也沒有 _noclear 後綴,
玩家打一個 quests clear 就會被清光 |
命名一律 <區域前綴>_<用途>_noclear。
qmark 是全服共用的字串命名空間,前綴不可省,否則會撞到別人的區域 |
_nosave 後綴的 qmark 不會存檔 |
要跨登入保留的進度不要加這個後綴;只有暫態標記才用 |
5. 指令速查表
行為程式的內文寫的就是遊戲指令。這裡列出區域檔實際會用到的,依用量排序。
5.1 行為程式專用指令
只有掛了 prog 的怪或房間能執行,玩家打不出來。「用量」是這個指令在現有區域檔中出現的次數,可以當成「這是不是常用寫法」的參考。
| 用法 | 作用 | 注意 | 用量 |
|---|---|---|---|
mpecho <訊息> | 房間裡所有人都看到(怪自己看不到) | 訊息會再去觸發同房間其他怪的 act_prog,兩隻怪互相 echo 會沒完沒了 | 8090 |
mpechoat <對象> <訊息> | 只有指定對象看得到 | 對象找不到時完全靜默,沒有任何 log,名字打錯最難查。填 self 送不到任何人 | 4880 |
mpcast <法術名> [對象] | 施放法術 | 不吃等級參數——寫成 mpcast 2 fireball 時那個 2 會被忽略,一律以施法者等級施放 | 4534 |
mpat <地點> <指令> | 讓怪「在別的地方」執行一個指令,執行完回到原處 | 地點可以是 vnum、角色名或落在地上的物品名,依此順序解析 | 3865 |
mpdel_qmark <對象|房間vnum> <標記> | 移除任務標記 | 第一參數可以是房間 vnum,但房間標記重開機就沒了、而且全服共用 | 3603 |
mpadd_qmark <對象|房間vnum> <標記> | 加上任務標記 | 第一參數可以是房間 vnum,但房間標記重開機就沒了、而且全服共用。個人進度請用 $z | 3390 |
mpforce <對象|all> <指令> | 強迫對方執行一個指令 | 被強迫的人若執行 say,那句話會再觸發別的 speech_prog | 2706 |
mptransfer <對象|all> [地點] | 把玩家傳送走 | 地點可省略,省略時傳到怪自己所在的房間 | 2005 |
mpfist <基準> <誤差> <招式名> | 對交戰對象造成傷害 | 是基準值 ± 誤差,不是最小值最大值。第三個參數是招式名稱,會顯示給玩家 | 1269 |
rpdamage <hp|mana|move|power> <對象> <下限> <上限> | 房間陷阱扣血 | 第一個參數是傷害類型,不能省略;範圍小的要寫前面,寫反會固定取到前面那個值 | 1261 |
mpoload <物vnum> [等級] [對象] | 生出物品 | 永遠放不到地上——沒給對象就進怪自己的背包。要放地上用 rpoload | 1236 |
mpmload <怪vnum> [range <起始房> <結束房> [數量]] | 生出怪物 | 不吃等級參數,多寫會被忽略。range 形式最多生 15 隻 | 1173 |
mppurge [<對象>] | 銷毀對象;不給參數則清掉自己 | 清掉一隻怪時,牠背包裡的東西會跟著消失 | 1170 |
mpjunk <對象> <物品|all|all.關鍵字> | 銷毀某人身上的物品 | 對象在前、物品在後,順序很容易寫反 | 1154 |
mpgoto <地點> | 怪自己移動過去 | 681 | |
mpallfist <基準> <誤差> <招式名> | 對房間內所有敵人造成傷害 | 是基準值 ± 誤差,不是最小值最大值 | 637 |
rpoload <物vnum> [等級] | 把物品放到地上 | 怪程式與房間程式都能用。等級可省略但會寫進 bug log,請一律填 | 445 |
rpremaffect <對象> <sn|all|allother|allskill|allspell> | 移除狀態 | 第二參數是 sn,不是 slot | 410 |
mpteach <對象> <技能名> | 教授技能 | 技能名要拼完整(前綴比對,寫短了會教到別的技能)。對方記憶點數不足時,程式端無法察覺失敗 | 383 |
mpkill <對象> | 攻擊對方 | 不可縮寫成 mpk——那是另一個指令,對怪執行等於什麼都沒做 | 370 |
rpcast <法術名> <對象> | 房間版施法 | 對象必填,與 mpcast 不同 | 237 |
mpsetcycle <對象> <數值> | 設定週天 | 缺任一參數會寫 bug log(其他 mpset* 不會) | 121 |
mpechoaround <對象> <訊息> | 房間裡除了該對象以外的人看到 | 只檢查對象非空,訊息留空不會報錯 | 120 |
mpmobclean <名字關鍵字> | 清掉符合關鍵字的怪 | 掃的是全世界,不是本房間也不是本區域。呼叫者自己會被跳過 | 98 |
mpsethp <對象> <數值> | 設定生命值 | 帶 + 或 - 是相對增減,不帶前綴是絕對設定;上限夾在最大生命。扣血是真的會死的——壓到死亡門檻會照一般戰鬥規則死亡(有瀕死狀態與急救窗口),boss 吸血招請照這個前提設計數值 | 61 |
mpasound <訊息> | 相鄰房間聽得到的聲響 | 不會觸發別人的 act_prog(與 mpecho 相反) | 59 |
rpaffect <對象> <slot> [持續] [位置] [修正] [bit] | 附加狀態 | 第二參數是法術 slot,不是 sn——與 rpremaffect 收的東西不通用 | 41 |
mpechoarea <訊息> | 整個區域都看得到 | 22 | |
mpforceflee <對象> | 強迫對方逃跑 | 8 | |
mpsetmana <對象> <數值> | 設定法力 | 帶 + 或 - 是相對增減,不帶前綴是絕對設定;上限夾在最大法力 | 2 |
rpremaffectbit <對象> <bit值> | 依 bit 移除狀態 | 2 | |
mpsetpower <對象> <數值> | 設定內力 | 目標是 NPC 時直接靜默 return;上限夾在最大內力 | 1 |
mpsetmove <對象> <數值> | 設定移動力 | 帶 + 或 - 是相對增減,不帶前綴是絕對設定;負值夾成 0、上限夾在最大移動力 | 1 |
mpslay <對象> | 直接殺死對方 | 1 |
其餘較少用的:mprevolt、mpareaclean。
5.2 巫師指令(怪也能用)
mp 開頭的那些——
現有區域檔大量使用 at、echo、restore 等巫師指令就是這樣來的。
但被 charm(魅惑)的怪會失去這項待遇,連 prog 本身都不會執行。關鍵機關怪要防 charm。
| 用法 | 作用 | 注意 | 用量 |
|---|---|---|---|
at <地點> <指令> | 同 mpat,是 imm 指令版本 | 兩個參數都必填,缺任一只回一句提示、沒有 log | 1711 |
echo <訊息> | 全服廣播(imm 指令) | 整行原文送出,不切 token | 700 |
peace | 停止房間內所有戰鬥 | 完全忽略參數,一律清掉整個房間的戰鬥狀態 | 347 |
restore <all|self|對象> | 補滿血魔(imm 指令) | 324 | |
mset <對象> <欄位> <值> | 修改角色數值(imm 指令) | 第三段吃的是整行剩下的字,不是單一 token | 300 |
oload <物vnum> [等級] | 生出物品到自己身上(imm 指令) | 175 | |
delexit <方向> | 當場關掉一個出口 | 91 | |
addexit <方向> <目標vnum> | 當場開一個出口 | 84 | |
force <對象|all> <指令> | 強迫對方執行指令,同 mpforce | 45 | |
recho <訊息> | 對本房間廣播(imm 指令) | 45 | |
goto <vnum|self|角色名|物品名> | 移動過去(imm 指令) | 12 | |
purge [<對象>] | 銷毀對象,同 mppurge | 不給參數會清掉房間內所有 NPC 與地上所有物品,包括玩家掉落的裝備 | 8 |
advance <對象> <等級> | 調整等級(imm 指令) | 7 | |
transfer <對象|all> [地點] | 把玩家傳送走,同 mptransfer | 2 |
其餘較少用的:oset、slay、delqmark、immtalk、addqmark、sset、mload、prison、holylight。
5.3 一般指令
玩家自己也能用的指令,怪照樣能用。直接寫指令名即可。
| 用法 | 作用 | 注意 | 用量 |
|---|---|---|---|
say <內容> | 怪開口說話 | 房間程式用會顯示成無名字,且會觸發同房怪物的 speech_prog | 8236 |
tell <對象> <內容> | 私下對某人說 | 2695 |
區域檔常用的其他一般指令:drop、yell、give、flee、wear、fist、look、remove、kill、shoot、quaff、emote、open、follow、slash、wake、disarm、shout、windslice、west、cast、wield、attack、close、hunt、east、north、talk、south、eat、chat、stun、get、buttock、order、unlock、hide、dispose、rest、sneak、abscond、reflexion
——用法與玩家自己打的時候相同。社交動作(smile、nod、ponder 等 121 個)也可以直接寫。
6. 常數速查表
Lua 直接用常數名;.are 檔要填數值(多個旗標把數值相加或用 | 串接)。
要用 Ctrl+F 搜尋整份速查表時,請先按「全部展開」(部分瀏覽器搜尋不到收合中的內容)。
怪物行為 ACT
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| ACT.IS_NPC | 1 | 系統自動設定,勿手動使用 — Auto set for mobs |
| ACT.SENTINEL | 2 | 定點不走動 — Stays in one room |
| ACT.SCAVENGER | 4 | 會撿地上物品 — Picks up objects |
| ACT.AGGRESSIVE | 32 | 主動攻擊玩家 — Attacks PC's |
| ACT.STAY_AREA | 64 | 不離開所屬區域 — Won't leave area |
| ACT.WIMPY | 128 | 血少會逃跑 — Flees when hurt |
| ACT.PET | 256 | 寵物(系統用) — Auto set for pets |
| ACT.TRAIN | 512 | 可訓練屬性 — Can train PC's |
| ACT.PRACTICE | 1024 | 可練習技能 — Can practice PC's |
| ACT.JOIN | 2048 | 入會功能 |
| ACT.BANK | 4096 | 銀行員 |
| ACT.NO_CHARM | 8192 | 不能被魅惑 |
| ACT.NO_SUMMON | 16384 | 不能被召喚 — Use by Urge |
| ACT.GROUNDED | 32768 | 不能飛行/被吹走 |
| ACT.NO_SLEEP | 65536 | 免疫睡眠(法術與點穴都無效)。Lua 端沒有這個常數,請直接寫數值 |
怪物狀態 AFF
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| AFF.BLIND | 1 | 目盲 |
| AFF.INVISIBLE | 2 | 隱形 |
| AFF.DETECT_EVIL | 4 | 偵測邪惡 |
| AFF.DETECT_INVIS | 8 | 偵測隱形 |
| AFF.DETECT_MAGIC | 16 | 偵測魔法 |
| AFF.DETECT_HIDDEN | 32 | 偵測隱藏 |
| AFF.HOLD | 64 | (未使用) — Unused |
| AFF.SANCTUARY | 128 | 聖光(傷害減半) |
| AFF.FAERIE_FIRE | 256 | 妖火 |
| AFF.INFRARED | 512 | 紅外視覺 |
| AFF.CURSE | 1024 | 詛咒 |
| AFF.FLAMING | 2048 | (未使用) — Unused |
| AFF.POISON | 4096 | 中毒 |
| AFF.PROTECT | 8192 | 防護邪惡 |
| AFF.PARALYSIS | 16384 | 麻痺 — Use by Qing |
| AFF.SNEAK | 32768 | 潛行 |
| AFF.HIDE | 65536 | 隱藏 |
| AFF.SLEEP | 131072 | 昏睡 |
| AFF.CHARM | 262144 | 被魅惑 |
| AFF.FLYING | 524288 | 飛行 |
| AFF.PASS_DOOR | 1048576 | 穿門 |
| AFF.BARRIER | 2097152 | 屏障 |
| AFF.DARK_SPACE | 4194304 | 黑暗空間 |
| AFF.REFLEXION | 8388608 | 反射 |
| AFF.MAGIC_CLOCK | 16777216 | 魔法時鐘 |
| AFF.TUOCHANGSTARMOVE | 33554432 | 脫韁星移 — add by Gooder |
| AFF.ELEMENT | 67108864 | 元素 — 五行 |
| AFF.AIR | 134217728 | 罡氣罩 — 狂風陣 |
| AFF.GOD_BLESS | 268435456 | 神祝 — god bless add by bala |
| AFF.INTERNAL_INJURY | 536870912 | 內傷 |
性別 SEX
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| SEX.MALE | 1 | 男 |
| SEX.FEMALE | 2 | 女 |
| SEX.NEUTRAL | 0 | 中性 |
程式觸發類型 PROGTYPE
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| PROGTYPE.IN_FILE | 0 | 外部檔案(勿用) |
| PROGTYPE.ACT | 1 | 看到動作訊息時 |
| PROGTYPE.SPEECH | 2 | 聽到說話時 |
| PROGTYPE.RAND | 4 | 隨機(argument=機率) |
| PROGTYPE.FIGHT | 8 | 戰鬥中每回合(argument=機率) |
| PROGTYPE.DEATH | 16 | 死亡時 |
| PROGTYPE.HITPRCNT | 32 | 血量低於百分比時 |
| PROGTYPE.ENTRY | 64 | 自己走進房間時 |
| PROGTYPE.GREET | 128 | 玩家進房(怪看得到才觸發) |
| PROGTYPE.ALL_GREET | 256 | 玩家進房(必觸發) |
| PROGTYPE.GIVE | 512 | 收到物品(argument=物品關鍵字或 all) |
| PROGTYPE.BRIBE | 1024 | 收到錢(argument=金額) |
| PROGTYPE.DYING | 2048 | 瀕死時 |
| PROGTYPE.TALK | 4096 | 被 talk(argument=關鍵字) |
| PROGTYPE.LEARN | 8192 | 被 learn 時 |
| PROGTYPE.LEAVE | 16384 | 玩家離房(看得到才觸發) |
| PROGTYPE.ALL_LEAVE | 32768 | 玩家離房(必觸發) |
| PROGTYPE.AFFECT | 65536 | 狀態變化時 |
| PROGTYPE.ACTION | 131072 | 特定指令時 |
| PROGTYPE.RESET | 262144 | 區域重置時 |
| PROGTYPE.SKILL | 524288 | 技能施展時 |
| PROGTYPE.KILLER | 1048576 | 擊殺者 |
| PROGTYPE.TIMETODIE | 2097152 | 時限死亡 |
| PROGTYPE.BIRTH | 4194304 | 重生時 |
| PROGTYPE.TICK | 8388608 | 每個遊戲 tick |
地形 SECTOR
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| SECTOR.INSIDE | 0 | 室內 |
| SECTOR.CITY | 1 | 城市 |
| SECTOR.FIELD | 2 | 平原 |
| SECTOR.FOREST | 3 | 森林 |
| SECTOR.HILLS | 4 | 丘陵 |
| SECTOR.MOUNTAIN | 5 | 山地 |
| SECTOR.WATER_SWIM | 6 | 可游泳水域 |
| SECTOR.WATER_NOSWIM | 7 | 需要船的水域 |
| SECTOR.UNUSED | 8 | (未使用) |
| SECTOR.AIR | 9 | 空中(需飛行) |
| SECTOR.DESERT | 10 | 沙漠 |
| SECTOR.PARADISE | 11 | 天堂 |
| SECTOR.HELL | 12 | 地獄 |
| SECTOR.VOID | 13 | 虛空 |
| SECTOR.MAX | 14 | (邊界值,勿使用) |
房間旗標 ROOM
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| ROOM.DARK | 1 | 永遠黑暗 |
| ROOM.NO_MOB | 4 | 怪物不會走進來 |
| ROOM.INDOORS | 8 | 室內(不受天氣影響) |
| ROOM.GAME | 16 | 遊戲房(賭場等) |
| ROOM.PRIVATE | 512 | 私人房(限兩人) |
| ROOM.SAFE | 1024 | 安全區(禁止戰鬥) |
| ROOM.SOLITARY | 2048 | 單人房 |
| ROOM.PET_SHOP | 4096 | 寵物店 |
| ROOM.NO_RECALL | 8192 | 禁止 recall |
| ROOM.CORPSE_SHOP | 16384 | 屍體商店 |
| ROOM.NO_SUMMON_IN | 32768 | 禁止被召喚進來 |
| ROOM.NO_TELEPORT_IN | 65536 | 禁止被傳送進來 |
| ROOM.CAN_TRANSFER | 131072 | 允許 transfer |
| ROOM.NO_QUIT | 262144 | 禁止在此離線 |
| ROOM.NO_SUMMON_OUT | 524288 | 禁止從此被召喚走 |
| ROOM.NO_SPELL | 1048576 | 玩家在此無法施法(含自我 buff;物品觸發的法術不受限)。Lua 端沒有這個常數,請直接寫數值 |
| ROOM.NO_ATTACK | 2097152 | 玩家在此無法發動攻擊(已開打的戰鬥不受影響;巫師豁免)。Lua 端沒有這個常數,請直接寫數值 |
方向 DIR
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| DIR.NORTH | 0 | 北 |
| DIR.EAST | 1 | 東 |
| DIR.SOUTH | 2 | 南 |
| DIR.WEST | 3 | 西 |
| DIR.UP | 4 | 上 |
| DIR.DOWN | 5 | 下 |
怪物特殊類別 CLASS
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| CLASS.CONJURATION | 1 | 召喚獸 — 召喚者 |
| CLASS.STATUE | 2 | 雕像 — 雕像 |
| CLASS.TRANSPORT | 3 | 交通工具 — 交通工具 |
| CLASS.MERIT | 4 | 戰功怪 — 有加戰功的 mob |
| CLASS.UNDEAD | 5 | 不死系 — 不死族 |
重生類型 RESET
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| RESET.MOB | M | 怪物 → 房間 |
| RESET.OBJ | O | 物品 → 房間 |
| RESET.PUT | P | 物品 → 容器 |
| RESET.GIVE | G | 物品 → 上一隻怪(拿著) |
| RESET.EQ | E | 物品 → 上一隻怪(穿上) |
| RESET.DOOR | D | 門重置 |
| RESET.RAND | R | 出口隨機化 |
物品類型 ITEMTYPE
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| ITEMTYPE.LIGHT | 1 | 光源(v2=持續時間) |
| ITEMTYPE.SCROLL | 2 | 卷軸(v0=等級 v1-3=法術) |
| ITEMTYPE.WAND | 3 | 魔杖 |
| ITEMTYPE.STAFF | 4 | 法杖 |
| ITEMTYPE.WEAPON | 5 | 武器(v1=最小傷害 v2=最大傷害 v3=攻擊型態) |
| ITEMTYPE.TREASURE | 8 | 寶物 |
| ITEMTYPE.ARMOR | 9 | 防具(v0=護甲值) |
| ITEMTYPE.POTION | 10 | 藥水 |
| ITEMTYPE.FURNITURE | 12 | 家具 |
| ITEMTYPE.TRASH | 13 | 垃圾 |
| ITEMTYPE.CONTAINER | 15 | 容器(v0=容量) |
| ITEMTYPE.DRINK_CON | 17 | 飲料容器 |
| ITEMTYPE.KEY | 18 | 鑰匙 |
| ITEMTYPE.FOOD | 19 | 食物(v0=飽食度 v3≠0 表有毒) |
| ITEMTYPE.MONEY | 20 | 錢 |
| ITEMTYPE.BOAT | 22 | 船 |
| ITEMTYPE.CORPSE_NPC | 23 | 怪物屍體(系統用) |
| ITEMTYPE.CORPSE_PC | 24 | 玩家屍體(系統用) |
| ITEMTYPE.FOUNTAIN | 25 | 噴泉 |
| ITEMTYPE.PILL | 26 | 藥丸 |
| ITEMTYPE.GUN | 27 | 槍械 — add by Qing |
| ITEMTYPE.MISSILE | 28 | 彈藥 — add by Qing |
| ITEMTYPE.MEDICINE | 29 | 醫藥 — add by QING |
| ITEMTYPE.METAL | 30 | 金屬材料 — add by Gen, 礦物 |
| ITEMTYPE.MEDAL | 31 | 勳章 — 勳章 |
| ITEMTYPE.SUPERCONTAINER | 33 | 超級容器 — 燒不壞的容器 add by Timon |
物品特殊旗標 ITEM
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| ITEM.GLOW | 1 | 發光 |
| ITEM.HUM | 2 | 嗡嗡作響 |
| ITEM.DARK | 4 | 黑暗 |
| ITEM.LOCK | 8 | 鎖 |
| ITEM.EVIL | 16 | 邪惡 |
| ITEM.INVIS | 32 | 隱形 |
| ITEM.MAGIC | 64 | 魔法 |
| ITEM.NODROP | 128 | 詛咒:不能丟棄 |
| ITEM.BLESS | 256 | 祝福 |
| ITEM.ANTI_GOOD | 512 | 善良陣營不能用 |
| ITEM.ANTI_EVIL | 1024 | 邪惡陣營不能用 |
| ITEM.ANTI_NEUTRAL | 2048 | 中立陣營不能用 |
| ITEM.NOREMOVE | 4096 | 詛咒:不能脫下 |
| ITEM.ANYLEVEL | 8192 | 無等級限制 |
| ITEM.NOSAVE | 16384 | 離線不保存 |
| ITEM.ANTI_MALE | 32768 | 男性不能用 |
| ITEM.ANTI_IT | 65536 | 中性不能用 |
| ITEM.ANTI_FEMALE | 131072 | 女性不能用 |
| ITEM.CLANSYMBOL | 262144 | 幫派信物——站方專用,builder 請勿使用:
設了它之後重量行的第三個數字會被當成幫派編號,Lua 格式還必須多一個 clan 欄位,
漏掉會讓整個區域載入失敗 |
| ITEM.NOLOCATE | 524288 | 不能被 locate |
| ITEM.INVENTORY | 1048576 | 商店無限供貨 — 24 bit |
| ITEM.NOSTEAL | 2097152 | 不能被偷 — OBJ CAN'T BE STEAL |
物品穿戴旗標 WEAR
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| WEAR.TAKE | 1 | 可撿取(幾乎都要加) |
| WEAR.FINGER | 2 | 戒指 |
| WEAR.NECK | 4 | 頸部 |
| WEAR.BODY | 8 | 身體 |
| WEAR.HEAD | 16 | 頭 |
| WEAR.LEGS | 32 | 腿 |
| WEAR.FEET | 64 | 腳 |
| WEAR.HANDS | 128 | 手 |
| WEAR.ARMS | 256 | 手臂 |
| WEAR.SHIELD | 512 | 盾牌 |
| WEAR.ABOUT | 1024 | 披風 |
| WEAR.WAIST | 2048 | 腰 |
| WEAR.WRIST | 4096 | 手腕 |
| WEAR.WIELD | 8192 | 武器(持用) |
| WEAR.HOLD | 16384 | 手持 |
| WEAR.BREAST | 32768 | 胸口 |
| WEAR.TRANSPORT | 65536 | 坐騎 |
武器攻擊型態 DMGTYPE(武器 v3)
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| DMGTYPE.HIT | 0 | 毆擊 — add by Qing |
| DMGTYPE.SLICE | 1 | 削 — add by Qing |
| DMGTYPE.STAB | 2 | 刺 — add by Qing |
| DMGTYPE.SLASH | 3 | 砍 — add by Qing |
| DMGTYPE.WHIP | 4 | 鞭 — add by Qing |
| DMGTYPE.CLAW | 5 | 抓 — add by Qing |
| DMGTYPE.BLAST | 6 | 轟 — add by Qing |
| DMGTYPE.POUND | 7 | 搥 — add by Qing |
| DMGTYPE.CRUSH | 8 | 壓碎 — add by Qing |
| DMGTYPE.GREP | 9 | 擒抱 — add by Qing |
| DMGTYPE.BITE | 10 | 咬 — add by Qing |
| DMGTYPE.PIERCE | 11 | 穿刺 — add by Qing |
| DMGTYPE.HIDDEN | 12 | 暗器 — add by Gen, 暗器 |
出口/門旗標 EXFLAG
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| EXFLAG.ISDOOR | 1 | 有門 |
| EXFLAG.CLOSED | 2 | 關著 |
| EXFLAG.LOCKED | 4 | 鎖著 |
| EXFLAG.PICKPROOF | 32 | 撬不開 |
| EXFLAG.NO_PASSDOOR | 16 | 穿門法術無效 |
裝備加成效果 APPLY
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| APPLY.NONE | 0 | 無 |
| APPLY.STR | 1 | 力量 |
| APPLY.DEX | 2 | 速度 |
| APPLY.INT | 3 | 智力 |
| APPLY.WIS | 4 | 睿智 |
| APPLY.CON | 5 | 體格 |
| APPLY.SEX | 6 | 性別 |
| APPLY.CLASS | 7 | 職業 |
| APPLY.LEVEL | 8 | 等級 |
| APPLY.AGE | 9 | 年齡 |
| APPLY.HEIGHT | 10 | 身高 |
| APPLY.WEIGHT | 11 | 體重 |
| APPLY.MANA | 12 | 精神力 |
| APPLY.HIT | 13 | 生命力 |
| APPLY.MOVE | 14 | 移動力 |
| APPLY.GOLD | 15 | 金錢 |
| APPLY.EXP | 16 | 經驗 |
| APPLY.DC | 17 | 防禦(AC) |
| APPLY.HITROLL | 18 | 命中 |
| APPLY.DAMROLL | 19 | 傷害 |
| APPLY.SAVING_PARA | 20 | 對麻痺豁免 |
| APPLY.SAVING_ROD | 21 | 對法杖豁免 |
| APPLY.SAVING_PETRI | 22 | 對石化豁免 |
| APPLY.SAVING_BREATH | 23 | 對吐息豁免 |
| APPLY.SAVING_SPELL | 24 | 對法術豁免 |
| APPLY.AC | 25 | 防禦 |
| APPLY.POWER | 26 | 內力 |
| APPLY.SKILL | 27 | 技能加成 |
| APPLY.SPELL_POWER | 28 | 法術威力 |
| APPLY.CARRY | 29 | 負重 |
物品特殊功能 OSPEC(進階)
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| OSPEC.TALK | 0 | |
| OSPEC.SPELL | 1 | |
| OSPEC.GOBACK_CHAR | 2 | |
| OSPEC.GOBACK_ROOM | 3 | |
| OSPEC.GOBACK_OBJ | 4 | |
| OSPEC.LOAD_OBJ | 5 | |
| OSPEC.BECOME_OBJ | 6 | |
| OSPEC.LOAD_MOB | 7 | |
| OSPEC.BECOME_MOB | 8 | |
| OSPEC.AFFECT | 9 | |
| OSPEC.REMOVE_AFFECT | 10 | |
| OSPEC.TRANSFER | 11 | |
| OSPEC.MOVE_CHAR | 12 | |
| OSPEC.CHANGE_DATA | 13 | |
| OSPEC.CHARGE | 14 | |
| OSPEC.QSET | 15 |
物品觸發時機 CALLED(進階)
| Lua 常數 | 數值(.are 用) | 說明 |
|---|---|---|
| CALLED.ATTACK | 1 | |
| CALLED.WEAR | 2 | |
| CALLED.REMOVE | 3 | |
| CALLED.UPDATE | 4 | |
| CALLED.GET | 5 | |
| CALLED.DROP | 6 | |
| CALLED.EAT | 7 | |
| CALLED.DEFENSE | 8 |
位置 POS(.are 怪物位置欄)
| 名稱 | 數值 | 說明 |
|---|---|---|
| POS_DEAD | 0 | 死亡 |
| POS_MORTAL | 1 | 瀕死 |
| POS_INCAP | 2 | 失能 |
| POS_STUNNED | 3 | 昏迷 |
| POS_SLEEPING | 4 | 睡眠 |
| POS_RESTING | 5 | 休息 |
| POS_FIGHTING | 6 | 戰鬥中 |
| POS_STANDING | 7 | 站立 |
注意:.are 檔中的怪物位置欄慣例填 8 8(沿用 Diku 檔案格式的站立值), 遊戲載入時會自行對應;照現有區域檔的寫法即可。
裝備位置代碼(.are 的 E reset 第 4 欄)
| 名稱 | 數值 | 部位 |
|---|---|---|
| WEAR_LIGHT | 0 | 光源 |
| WEAR_FINGER_L / WEAR_FINGER_R | 1 / 2 | 左/右戒指 |
| WEAR_NECK_1 / WEAR_NECK_2 | 3 / 4 | 頸部 ×2 |
| WEAR_BODY | 5 | 身體 |
| WEAR_HEAD | 6 | 頭 |
| WEAR_LEGS | 7 | 腿 |
| WEAR_FEET | 8 | 腳 |
| WEAR_HANDS | 9 | 手 |
| WEAR_ARMS | 10 | 手臂 |
| WEAR_SHIELD | 11 | 盾牌 |
| WEAR_ABOUT | 12 | 披風 |
| WEAR_WAIST | 13 | 腰 |
| WEAR_WRIST_L / WEAR_WRIST_R | 14 / 15 | 左/右手腕 |
| WEAR_WIELD | 16 | 武器 |
| WEAR_HOLD | 17 | 手持 |
| WEAR_BREAST | 18 | 胸口 |
| WEAR_TRANSPORT | 19 | 坐騎 |
特殊行為 spec 函式(#SPECIALS 用,完整清單)
| 名稱 | 行為 |
|---|---|
| spec_breath_any | 隨機吐息攻擊 |
| spec_breath_acid / fire / frost / gas / lightning | 酸/火/冰/毒氣/閃電吐息 |
| spec_cast_adept | 幫低等玩家施放輔助法術(新手區用) |
| spec_cast_cleric | 戰鬥中施放牧師系法術 |
| spec_cast_judge | 戰鬥中施放法官系法術 |
| spec_cast_mage | 戰鬥中施放法師系法術 |
| spec_cast_undead | 戰鬥中施放不死系法術 |
| spec_executioner | 處刑者:攻擊有殺人犯/竊賊旗標的玩家 |
| spec_fido | 吃地上的屍體 |
| spec_guard | 警衛:攻擊罪犯並呼叫支援 |
| spec_janitor | 清潔工:撿走地上垃圾 |
| spec_mayor | 市長:定時巡城開關城門 |
| spec_poison | 攻擊時有機率下毒 |
| spec_thief | 小偷:偷玩家的錢 |
| spec_clan_guard / spec_clan_statue | 幫派警衛/雕像(幫派區系統用) |
四度空間 Area Builder Kit 附件 · 內容依 driver 實際載入邏輯整理
更新記錄
回報問題時請附上版號(標題旁的灰色標籤)。教學與編輯器一起發布,版號相同。
v0.4
- 介面改成與官方網站一致的終端機風格;從網站開啟時右上角有「回首頁」
- 配合主程式更新(測試伺服器已套用一批引擎修正),文件跟著改:
mpsethp扣血現在是真的——舊版低血目標會整筆免疫,現在會照一般 戰鬥規則死亡。之前依這個 bug 調過數值的 boss 招式請重新評估mpcast帶數字的寫法(如mpcast 2 fireball)不再整條失效, 數字會被忽略、法術照放mpset*系列全面加上上下限夾制(不會再超過最大值或負到怪地方)- 常數速查表新增三個旗標:
ACT.NO_SLEEP(65536,怪免疫睡眠)、ROOM.NO_SPELL(1048576,房內禁施法)、ROOM.NO_ATTACK(2097152,房內禁止發動攻擊)——都是新功能,蓋 boss 房、安全區用得上
v0.3
- 教學與編輯器合併成一個檔案(
area-builder.html),用上方頁籤切換。 只要開一個檔、只有一個版號,不會再出現「教學是新的、編輯器是舊的」 - 編輯器的警告後面多了「→ 看說明」連結,點下去直接跳到教學裡解釋那件事的段落
- 更新記錄獨立成一個頁籤
v0.2
- 編輯器:「陷阱扣血」範本產出的碼是無效的——少寫了
rpdamage的第一個 參數(傷害類型),實際執行時找不到目標而整行靜默失效。用 v0.1 套過這個範本的話請重做。 - 新增「常見陷阱」與「指令速查表」兩節。速查表列出 50 個指令的完整參數, 並說明為什麼怪能用巫師指令
- 編輯器會檢查程式內文的指令是否存在,縮寫會提示實際執行到哪一個
- 修正多處與 driver 實際行為不符的說明:
mpoload放不到地上、action_prog是整行比對不接受縮寫、房間版 greet/leave 沒有視線判定、mpfist的兩個數字是「基準 ± 誤差」而非最小值最大值
v0.1
- 第一版