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

看板mud (網路地下城/文字遊戲)作者 (小太保)時間11年前 (2014/06/14 20:05), 11年前編輯推噓2(201)
留言3則, 2人參與, 最新討論串5/6 (看更多)
我寫了一個說明文的範例,寫這個花了我至少一個小時以上,嘛.. 因為實際上需要寫的東西其實也不可能太多,所以如果使用者可接 受這樣的說明文件格式,我是可以花時間一一建立的,甚至將其網 頁化(線上觀看)或是 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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.253.166.191 ※ 文章網址: http://www.ptt.cc/bbs/mud/M.1402747550.A.E98.html ※ 編輯: laechan (111.253.166.191), 06/14/2014 20:15:31 ※ 編輯: laechan (111.253.166.191), 06/14/2014 20:17:15

06/14 21:06, , 1F
好強大 推
06/14 21:06, 1F

06/14 21:23, , 2F
優先對於比較特別的系統吧,不然太多
06/14 21:23, 2F

06/14 21:44, , 3F
ok應該下次釋出的版本會包含這些說明
06/14 21:44, 3F
其實重點是你看了這些說明後對 vobjd.c 是不是就瞭解了。 如果你能藉說明瞭解了 vobjd.c,那理論上我後續寫的說明 你也能藉著閱讀它們去瞭解其它的系統,重要的系統及修改 我會優先撰寫。 然後我是希望能透過 tmi2 頻道的互通,有些問題就可直接 問、心得也可直接交流。 ※ 編輯: laechan (111.253.166.191), 06/14/2014 21:46:51
文章代碼(AID): #1Jd3gUwO (mud)
文章代碼(AID): #1Jd3gUwO (mud)