mudos-banner.gif

在以前 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),先確保玩家物件能登入這個空無一物的事件,然後讓玩家能下指令,一步一步製造陸地、光啊什麼的。

 



 

 

 

 

創作者介紹
創作者 電玩老宅 的頭像
topaz2012

電玩老宅

topaz2012 發表在 痞客邦 留言(0) 人氣( 496 )