第 四 章

見 習 篇


  學習真是一件枯燥無味的事件,聽得不耐煩了,趕快讓我上機操作吧!
  好的,這一章,我們就來讓你去開始進行一段見習工作了。我們的Mud系統使用的是仿Unix的指令和文件結構。如果有人已經對Unix有所了解的話,那是最好。沒用過Unix也沒關系,就象LPC雖然是一種很簡單其實它與Dos十分地相似,我們只要記住它們最明顯的一個區別就是文件路徑是用"/",而不是"\"。下面的許許多多的命令還是讓我們會時不時地想起DOS下的種種命令。

pwd: 顯示你目前所在的當前目錄
cd: 進入某一目錄,..是上一目錄,/是到根目錄,什么都不加直接回車就是到你自己的的工作目錄﹔
ls: 列出指定目錄下的所有文件,就象是Dos的dir一樣﹔
rm: 刪除一個文件﹔
mv: 重新命名一個文件﹔
cp: 復制一個文件﹔
md: 創建一個目錄﹔
rd: 刪除一個目錄(空的目錄)。刪除這個目錄下的所有文件請加 -d參數﹔
more: 按頁顯示一個文件在你的當前屏幕﹔
cat: 顯示整個文件﹔
tail: 顯示一個文件的結尾几行,對于太大的文件,一般只能用它﹔

  對于寫程序來說,最好的當然是在專門的可以識別C的編輯器上寫,既方便、錯誤也會少得多,因為它們對于一些固定的函數、變量都會用特殊的顏色突出顯示,尤其對于初學編程的巫師來說,多一個字母、少一個符事情的事情可以大大減少了。但是巫師更多的是在線處理一些問題、故障,大多數時候是要通過在線編輯----也就是edit命令進行程序修改,甚至小程序的在線寫作。下面就著重講一講MUD所提供的編輯功能的使用。

1. 指令格式為:edit <檔名>,只加文件名,默認為當前目錄,加here,表示編輯你當前所處的房間, 回車后即進入線上編輯系統。
2. 如果這是一個已經有的檔案,你可以使用 z 或 Z 來看檔案。z表示一次顯示20行,Z表示一次顯示40行。為了編輯方便,最好在開始時用 n 表示每一行在開頭處顯示它的行數,再用一次 n 取消行數顯示﹔
3. 還有一種方法 ,就是直接打入行數,則會跳至那行的內容上﹔
4. 如果你開始沒打 n ,卻想知道現在是第几行請打 = , 想知道內容請打 p ﹔
5 如果想直接到檔案的結尾可輸入 $﹔
6. 五種編輯命令 a i c m d :
  a = 從此各行之下插入編輯;
  i = 從此行之上插入編輯;
  c = 修改此行并插入編輯﹔
m = 把本行移到特定的行號去
d = 刪除﹔
這些命令也可以和行數結合使用。如 :
  7a = 在第7行后插入編輯﹔
6i = 在第6行前插入編輯﹔
4c = 直接編輯第4行﹔
  5,8m1 = 將第 5∼8 行移至原第 1 行之下。
3d = 刪去第 3 行 ;
  2,10d = 刪去第 2∼10 行;
7. 如果這是一個新命名的檔案, 這里面當然是沒有行數了,一般你應該用 a 來開始編輯第一行﹔
8. 如果你對某一行或某几行編輯完畢后, 請在編輯結尾的次列開頭處打 . 即可退出行編輯狀態﹔
9. 如果想存檔請打 x 表示存檔退出。 否則請打 q 或 Q 表示放棄編輯退出。
10.其余功能可打 h 參考。由于有的MUDOS漢化不太好,下面列出 h 的中文注釋:

/ 前向查找你后面所跟著的字符,比如/酒袋
? 后向查找你后面所跟著的字符
= 顯示當前行是第几行
a 在當前行后新增加一行
A 類似'a'命令,但是將翻轉自動縮進模式
c 將當前行內容覆蓋掉輸入新編輯內容
d 刪除指定范圍的行
e 退出當前檔案, 開始編輯另一檔(檔案改變過未存盤無效)
E 類似'e'命令,但是文件被修改過也有效
f 顯示或改變文件名
g 查找匹配行并對其執行相應命令
h 幫助文件(就是顯示你現在看到的這些信息,可能是英文)
i 在當前行前面插入一行
I 排版整個代碼 (Qixx version 1.0)
j 合并行,系統默認是將后續行連接到當前行
k 標記當前行- later referenced as 'a
l 顯示指定行(可顯示控制字符)
m 移動指定行(或几行)到指定位置
n 行號顯示切換開關
O 同命令'i'
o 同命令'a'
p 輸出指定范圍行
q 退出編輯器
Q 退出編輯器,即使文件已經被修改且未存盤
r 在文件尾或指定行后讀進另一文件
s 查找并替換(只對當前行第一個查找的字符串進行替換)
set 查詢,改變和保存編輯器的設定值
t 復制指定行到指定位置
v 搜索并對不匹配行執行指定命令
x 保存文件并退出
w 將編輯的內容寫到當前文件或指定的文件里
W 類似'w'命令,但是是將編輯的內容附加到指定或當前文件后
z 顯示20行,可用參數 . + -
Z 顯示40行,可用參數 . + -

  前面一章講過,當你成功地編寫了一個程序后,只是意味著這個程序已經在硬盤了,只有在別的使用者調用到它的時候,才會被呼叫出來,進入內存。文件本身是否有錯誤,將首先會在這時被發現。對于巫師來說,消極地等待別人去調用它時再去發現有沒有錯是十分不明智的,這時最好的就是先update它。
update <文檔名>
注意了:如果系統顯示:“重新編譯 ***.c:成功!”的信息,并不就表示你的這個程序就完全正確了,它只是表示你的程序的基本語法沒有錯誤,如果程序里還有一些由其它的條件或文件才能觸發呼叫的函數的話,還有有可能存在一些隱患,保險的做法就是按照設計時的條件把它們一一觸發,進行嘗試,直到完全通過。比如象一些NPC里有是否接受拜師的函數,你則想法不同的條件的人去拜它試試,把每一種可能都試過,看看是否執行正常。有的房間里加了add_action(),你則一一試試這些add_action(),看一下后果。
  如果文檔中有錯誤,一般系統會唰地一下子出來一大串的錯誤信息,對于新巫師來說,只要去看看第一行的出錯內容就行了,后面的很多錯誤都是由前面的帶來的。還有許多信息還顯示其它的與一些重要的系統文件也出錯,也大抵是如此,首先還是找出關于這個文檔里的第一個出錯的行數,再到這個文檔里去查找,仔細查看該行數,以及前后几行,有沒有少寫多寫括號、漏記多添逗號、定義變量類型錯誤等等,如果顯示出錯的行數在最后一行,甚至更后的話,那就要看看是不是函數聲明出錯,或者定義了無效的函數。每改一次,再update一次,直至編譯成功。有關于各種出錯信息的意思和處理辦法,還是要在實踐中多多嘗試,但是,在此要忠告各位新巫師,如果你所工作實習的MUD是一個正在開放中的MUD,希望對于沒有任何把握的文件的編譯工作最好先在自己的單機版進行,有些惡性的錯誤嚴重時會導致整個游戲宕機。

  接下來就是任何一個新巫師一上任就十分感興趣的命令----call!call就是直接呼叫(執行)函數的意思。在某種程度上,它就象征著巫師手中的神杖。這個對于玩家來說威力無比的功能,既是一種巫師利器,更是一種危險器械。因此,在大多數的MUDLIB中都對于call的命令的使用進行了記錄,以備天神的查看和監督。call的命令格式如下:
  call <物件>-><函數>(<參數>, ...... )
  從其理論上來說,它可以呼叫任何沒有被protect的函數。具體我們可以看這個程序: /adm/daemons/emoted.c d 在這個程序里面有一個這樣的函數:
string *query_all_emote()
{
  return keys(emote);
}
  那么。我們就可使用call命令直接呼叫它:
call /adm/daemons/emoted.c->query_all_emote()
   ~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
      (物件)        (物件的函數)
  由于這個函數本身沒有要傳參數,就不用再加參數了。那么執行后,程序本身就會返回一個字符串的數組回來。而顯示在我們屏幕上面的內容就是所有的emote的英文名字。
  在實際工作中,上面的這種用得還是很少的,大部分的修改和查看我們都可以用more或edit去完成,但是對于尤其象玩家檔案這些以.o形式儲存的文件用edit編輯則有些費勁了,所以這時使用call的命令來得更為方便些。
  巫師們常常會call me(或者id)->set("combat_exp",10000)
  在這里,me就是自己,其實它對應著一個物件程序:/obj/user.c,后面的set()也是系統放在一個文件里最基本的函數。后面的括號里面便是這個set函數的參數。它的意思就是在me這個物件里執行set()函數,通過set()函數將combat_exp這個參數設為10000。如果。要改變別的人,就可以在call后面加上這個人的id。set()這個函數可以執行什么呢?其實很簡單,打開一個復雜一點的NPC,它里面所具有的參數,我們一般都能用call命令進行。
  call命令可以調用的函數非常多,一般由你call的物件有關。但在一般使用中,我們大多使用三種函數,一是set,也就相當于我們做程序中的set一樣,你可以set這個物件任何可以set的參數﹔第二個就是query,用它可以查看你所call的物件有沒有這個參數,這個參數內容是什么?第三個就是delete,顧名思義,它正與set相反,用以刪除物件上的這個參數。其它一些固定的函數,例如武功的set_skill,設定姓名的set_name等等就不一一敘述了。