Re: [閒聊] tmi2_v3_改 目前還缺什麼?

作者: laechan (揮淚斬馬雲)   2014-06-14 20:05:47
我寫了一個說明文的範例,寫這個花了我至少一個小時以上,嘛..
因為實際上需要寫的東西其實也不可能太多,所以如果使用者可接
受這樣的說明文件格式,我是可以花時間一一建立的,甚至將其網
頁化(線上觀看)或是 word 化(開放下載、列印)亦無不可。
(不過...13 頁呢,我對寫這個真的不太行,更不用說去啃了)
然後我發現一個問題就是,如果對 LPC 完全無基礎,那基本上要
自由使用 tmi2_v3_改 是不可能的,以後我會增加一個建議就是要
使用 tmi2_v3_改 的人最好有 LPC 程式語言基礎。
==========================================================
系統名稱: 虛擬物品系統
此系統與怪物掉落物系統共存
主要檔案: /include/vobj.h
/adm/daemons/vobjd.c
相關檔案: /data/vobj.o
/cmds/wiz/_vobj.c
/cmds/std/_ob.c
/std/vobj.c
/include/vobj.h
虛擬物品的相關定義檔,所有的定義都是以 VOBJ 開頭
VOBJ_DEFAULT_??? 定義一些虛擬物品的預設項目,例如
#define VOBJ_DEFAULT_UNIT "個"
代表在設定一個虛擬物品時如果沒有給單位(unit),其單位預設就是「個」
,其它以此類推。
#define VOBJ_DEFAULT_NO_TRADE 0
#define VOBJ_DEFAULT_NO_SELL 0
NO_TRADE 預設為 0 的意思就是「可以 trade」。
NO_SELL 預設為 0 的意思就是「可以 sell」。
VOBJ_???_INDEX 定義虛擬物品資料串陣列各元素的位置
所謂虛擬物品的資料串陣列,類似底下
> call /adm/daemons/vobjd;vobj_data;"query_array";"兔牙"
OBJ(/adm/daemons/vobjd)-> vobj_data( "query_array", "兔牙" ) =
({ "m002","兔牙", "個", "怪掉落", 501, 99, " 可 ", " 可 ",
"一個兔牙,可向收集品商人購買。" })
上面的 ({ }) 內的內容就是虛擬物品的資料串陣列。
#define VOBJ_MARK_INDEX 0
#define VOBJ_NAME_INDEX 1
MARK 的 INDEX 定義為 0,就代表陣列的第 0 個資料 "m002" 就是所謂的
MARK (編號)。
NAME 的 INDEX 定義為 1,就代表陣列的第 1 個資料 "兔牙" 就是所謂的
NAME (名稱)。
其它以此類推。比方我們令 arrays = 該陣列,arrays[VOBJ_NAME_INDEX]
就是 arrays[1],也就是 "兔牙" 那個欄位,而這個欄位就是 NAME。
其它定義詳見「怪物掉落物系統」。
/adm/daemons/vobjd.c
此系統檔案是以 /adm/系統物件範例.txt 為原型所撰寫,瞭解系統物件範
例檔的內容,就能初步瞭解 vobjd.c 的架構。
mapping vobj_data=([]);
儲存所有虛擬物品的資料變數,當這個變數有資料時,其資料分三層
vobj_data = ([
"標頭" : ([
"編號" : ([
"name" : "物品名稱",
"unit" : "物品單位",
"kind" : "物品種類",
"long" : "物品描述",
"value" : 物品價格,
"carry" : 物品可攜帶量,
"no_trade" : 能否交易,
"no_sell" : 能否販售,
]),
]),
]);
「標頭」使用的是「編號」的第一個字母,假設 "兔牙" 這項虛擬物品的
編號是 "m002",標頭就是 "m"。假設其價格為 501,其資料如下
vobj_data["m"]["m002"]["name"] = "兔牙"
vobj_data["m"]["m002"]["value"] = 501
其它沒有設定的資料就會套用「預設資料」,例如單位就是「個」,種類
就是「怪掉落」,可攜帶量就是「99」,其它以此類推,詳見 vobj.h。
static mixed vobj_names;
在 vobjd.c 被系統載入時,create 函數首先會被呼叫,vobj_data 變數
資料會被載入,再之後就會對 vobj_names 變數資料做處理。
假設目前有兩筆虛擬資料
vobj_data = ([
"m" : ([
"m001" : ([ "name" : "兔毛",
"value" : 362 ]),
"m002" : ([ "name" : "兔牙",
"value" : 501 ]),
]),
]);
則 vobj_names 經過 create 函數處理後其資料內容就如下:
編號 名稱 編號 名稱
vobj_names = ({ "m001", "兔毛", "m002", "兔牙" })
這個變數之所以存在、是因為大部份情況我們只需要讀取一個虛擬物品編
號所對映的「名稱」,因此對名稱做特別的處理。
當呼叫 vobj_data 函數進行虛擬物品的增減或更名時,也會連帶變更到這
個變數資料。
void create()
這個函數就是 vobjd.c 被載入時會呼叫的函數,它會做幾件事
if(file_exists("/data/vobj.o"))
restore_object("/data/vobj");
當 /data/vobj.o 資料檔存在時,就載入 /data/vobj.o 的內容。
if(!vobj_names)
{
mixed tmps=keys(vobj_data),tmps2=({});
string tmp,tmp2;
vobj_names=({});
foreach(tmp in tmps)
{
tmps2=keys(vobj_data[tmp]);
foreach(tmp2 in tmps2)
vobj_names+=({tmp2,vobj_data[tmp][tmp2]["name"]});
編號 名稱
}
}
它會去讀每一筆虛擬物品的資料,然後把名字取出來,跟編號放在一起後
放進 vobj_names 裡面,所以 vobj_names 的資料才會是編號, 名稱, 編
號, 名稱, ...
int save_room()
當我們要儲存 vobjd.c 的變數資料時,呼叫這個函數即可進行儲存。
mixed query_vobj_names()
回傳 vobj_names 的內容。
void set_ob_data(string keyname,string tmp)
這主要是 wiz 指令 vobj -set 時會呼叫的函數
> vobj -set 兔毛;m001;個;怪掉落;一個兔毛。;362;99;0;0
當 wiz 下這個指令時
keyname = "兔毛"
tmp = "兔毛;m001;個;怪掉落;一個兔毛。;362;99;0;0"
然後 set_ob_data 就會對 tmp 做底下動作
tmps = explode(tmp, ";"); // 對 ";" 號進行拆解
接著就將拆解的資料一一設進 vobj_data["m"]["m001"] 裡頭,比方
vobj_data["m"]["m001"]["name"] = "兔毛"
vobj_data["m"]["m001"]["value"] = 362
.
.
varargs mixed vobj_data(string key1,string key2,mixed vars)
函數名 vobj_data 與變數名 vobj_data 是可以並存的。
只要是參考 /adm/系統物件範例.txt 檔寫成的系統物件,其參數格式都
類似上面,有 key1、key2,以及 vars。
key1 一般指「功能項」,比方
vobj_data("query", ..) 一般就是用來讀取 vobj_data 的資料
vobj_data("set", ..) 一般就是用來設定 vobj_data 的資料
vobj_data("del", ..) 一般就是用來刪除 vobj_data 的資料
所以一開始一定會看到針對 key1 所做的 switch:
switch(key1)
{
case "query":
.
.
key2 一般就是指當你使用 query/set/del 等功能時要存取的目標。
vars 則用來放「其它你想帶過來給 vobj_data 函數的參數」。
void vobj_list()
當 wiz 下指令 vobj -list 時會呼叫這個函數,其內容就是做虛擬物品
資料的相關列表。
void vobj_export()
當 wiz 下指令 vobj -export 時會呼叫這個函數,其內容就是匯出所有
虛擬物品的設定資料。
其它可參考怪物掉落物系統說明。
/data/vobj.o
/adm/daemons/vobjd.c 的資料儲存檔。
/cmds/wiz/_vobj.c
請參考「指令」目錄的關於 vobj 指令的說明。下指令 vobj 亦可看到
基本的指令說明。
操作這個指令可對 /adm/daemons/vobjd.c 檔案進行資料的存取。
/cmds/std/_ob.c
請參考「指令」目錄的關於 ob 指令的說明。下指令 ob ? 亦可看到基
本的指令說明。
/std/vobj.c
這個物件用於 ob view 時,ob view 會將欲觀看的虛擬物品之資料,暫
時 set 到一個 clone 出來的 /std/vobj.c 物件裡頭,再送至 _view.c
指令的 view_object 函數,藉由該函數處理虛擬物品資料的觀看。
詳見「指令」目錄的關於 view 指令的說明。
laechan@sanc 2014/06/14

Links booklink

Contact Us: admin [ a t ] ucptt.com