[wizs] edit 相關函數的用法
這個未來會很常用,我自己也不熟,所以就邊學、邊寫幾個
例子,然後順便跟大家分享,克難型的 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
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
35
58
120
255