
在以前 mud 繁榮的時代,留下了許多著名的 mudlib,對於初學者而言,這些 mudlib 雖然已經被簡化過,但感覺仍然太過繁雜,新手經常會有不知如何下手的感覺。我考慮過這個問題,發現應該從頭開始簡單的描述 mud 的基本流程,所以開始作記錄,如果以後有人打算製作 mud,可以從這些角度開始閱讀 mudlib,並作一些適合自己的修改。
註 : mudlib 是指一個可以在 MudOS 上跑的 mud script 組合,這整個組合被稱為一個 library,簡稱為 mudlib,基本上,每個 mudlib 都是一個具體而微的 mud 遊戲,上網拜請 google 大神,用 mudlib 這個 keyword 就可以找到一些下載點。
mud 建立的第一件重要的事,就是考慮如何接受玩家的連線。而要達成這個目標,首先要知道的,就是 MudOS 如何跟 mudlib 溝通,這些溝通的管道,就是 apply 函數。
在 MudOS 的檔案中,有個 doc 目錄,這個目錄底下有些值得看的文件 :
applies concepts driver efuns lpc
想要開發 mud 的人如果有空最好瀏覽一下,而本文要記錄的 apply 函數就在 applies 目錄下。
這個目錄下又有 :
__INIT clean_up create heart_beat id init interactive master move_or_destruct parsing reset
其中 interactive master 和 parsing 是目錄,parsing 是專門解析指令的,我們不用作得這麼複雜,可以跳過不看,master 是定義 master.c 專用的 apply 函數,
author_file domain_file get_root_uid object_name retrieve_ed_setup valid_hide valid_save_binary compile_object epilog get_save_file_name parse_command_all_word save_ed_setup valid_link valid_seteuid connect error_handler parse_command_prepos_list slow_shutdown valid_object valid_shadow crash flag log_error preload valid_bind valid_override valid_socket creator_file get_bb_uid make_path_absolute privs_file valid_compile_to_c valid_read valid_write
這些函數雖然多,但非寫不可的也只有兩個,分別是 : connect 和 crash。
閱讀 connect 這個說明,會看到
connect - get an object for a new user
object connect(int port);
connect 這個 apply 函數是當有人連上 MudOS 時,用來傳回一個物件作為連線的擁有者的,當連線和這個物件結合完成,MudOS 會對這個物件呼叫 logon(這個動作會在 interactive/logon說明),到時就可以進行連線的處理,包含登入、帳號密碼檢查等等動作就可以自己定義。
而 crash 是用來在 MudOS 不正常結束時作最後的處理用的,除了記錄可能的當掉原因之外,多半會加入幫線上所有人物緊急存檔的動作。
crash - function in master that is called in the event the driver crashes
void crash( string crash_message, object command_giver, object current_object );
而 interactive 目錄則是列出所有連線物件(其實就是玩家)的 apply 函數,他們有 :
catch_tell logon process_input receive_snoop terminal_type write_prompt
net_dead receive_message telnet_suboption window_size
其中非寫不可的有 :
logon process_input write_prompt net_dead receive_message
logon 處理玩家登入的流程,大部分都會直接導入 adm/daemons/logind.c 處理
process_input 則是對玩家下的指令作一個先期處理,主要是 alias 和 history
write_prompt 則是顯示一個輸入提示,大部分的 mud 都是一個簡單的 ">",當然也可以作得複雜些
net_dead 是處理斷線的狀況,所以要特別注意
receive_message是處理玩家收到訊息的流程,如果不作任何處理可以直接丟給 receive 函數即可
從以上的說明,我們可以知道,建立 mudlib 時,先看 master.c,並定義其中的 apply 函數,這個檔案放的位置訂在 MudOS 的 config 檔中,一般放在 /secure/ (Lima Lib)或 /adm/obj/ (ES2 Lib)目錄下,然後建立玩家物件(因為 connect 要給出去),接著處理玩家物件的登入流程(logon),先確保玩家物件能登入這個空無一物的事件,然後讓玩家能下指令,一步一步製造陸地、光啊什麼的。
請先 登入 以發表留言。