[wizs] edit 相關函數的用法

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間14年前 (2011/11/20 11:04), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
這個未來會很常用,我自己也不熟,所以就邊學、邊寫幾個 例子,然後順便跟大家分享,克難型的 edit 用 input_to 就可以辦到,可是以我寫 /cmds/wiz/_databs.c 的經驗,如 果要用 input_to 模擬"貼上好幾行資料"的編輯模式,它會 在中途停止。 (比方貼上的資料超過 n 行時) 所以最終還是用 edit 相關函數較好。 ==================================================== 以 /cmds/std/_describe.c 指令為例 . . write("開始編輯個人敘述檔.\n"); file = temp_file( "desc" ); if ((string)this_player()->query("long")) { str=this_player()->query("long"); str=COLOR_D->get_color(str); write_file(file,str); } this_player()->edit(file, "postit", this_object()); return 1; } 首先,亮藍色就是關鍵行,白話型式就是這樣.. 玩家->edit("暫存檔名", "編輯結束後呼叫哪個函數", 該函數位於哪個物件); 這個語法跟 sort_array 類似 array = sort_array(array, "交給哪個函數做排序", 該函數位於哪個物件); 所以接著看 postit 函數 void postit(string header) { string filename, body,err; mixed check; filename = (string)this_player()->query_edit_filename(); body = read_file(filename); rm(filename); this_player()->set_edit_filename(""); if(err=catch(check=explode(body,"\n"))) { this_player()->delete("long"); } else if(sizeof(check)>6) { write("你最多只能編輯 6 行的敘述喔! 請重新編輯.\n"); this_player()->delete("long"); } else this_player()->set("long", body); } 我們的目標就是得到亮藍色的部份。header 的部份經我的 實測結果.. header=UNDEFINED 所以 header 是沒必要的。取得 body 跟清除暫存檔總共四 個步驟... // 取得剛剛呼叫 edit 函數時所編輯的檔名 filename = (string)this_player()->query_edit_filename(); 它不會去讀別的檔名(例如使用 edit 指令編的)。 // 有了檔名自然可以 read_file 出來 body = read_file(filename); 接著就必須把暫存檔資料清掉.. rm(filename); this_player()->set_edit_filename(""); ==================================================== 但是這樣的做法其實是一種浪費,編輯分兩種 一、編完就結束 二、編到一半用 ~q 暫時離開的情況 例如使用 to 指令做多行 say... Input rest of command: ... 編輯結束並存檔(.). 中途放棄編輯(~q).訊息暫時中斷。 __________________________________________________________________ 1 2 ~q 放棄編輯。 這時後再 to say > to say Input rest of command: say ... 編輯結束並存檔(.). 中途放棄編輯(~q).訊息暫時中斷。 __________________________________________________________________ 1 2 它就會把你剛剛編過的東西再 read 進來. 一般是要這樣子 做較好,但是因為玩家無法「退到上一行去改上一行的東西 」,所以還是讓玩家每次呼叫就每次編輯新東西較好。 (因為玩家可以在記事本自己改一改再重新貼上) 所以上面的四個步驟其實可以合成為一個步驟.. body=(string)this_player()->query_edit_xxx(); check=this_player()->query_edit_xxx(1); varargs mixed query_edit_xxx(int s) { string files,body; files=query_edit_filename(); body = read_file(files); rm(filename); set_edit_filename(""); // 用 s 來判斷是要回傳整個字串還是 explode 後的東西 return s>0 ? explode(body,"\n") : body; } 這個函數最近就會在 /std/user/edit.c 這個檔裡頭,嘛, 函數名應該是 query_edit_text 或 query_edit_data 吧。 LAechan -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.26.181.222
文章代碼(AID): #1Eo6v7h0 (mud_sanc)
文章代碼(AID): #1Eo6v7h0 (mud_sanc)