MudOS里面以物件(objects)來(lái)稱呼一個(gè).c
文件蠢沿。其實(shí)跟其他語(yǔ)言中class
的概念很像,不過(guò)與之相比會(huì)有一些特殊的地方匾效。
MudOS中的物件舷蟀,統(tǒng)一繼承一個(gè)"object"物件,代表了這是一個(gè)具體的實(shí)體面哼。這個(gè)具體的實(shí)體可以是:房子(room)雪侥、怪物(monster)、用戶(user)等東西精绎。
下面先來(lái)看看物件的通用函數(shù)(每個(gè)物件都可以定義的函數(shù))速缨。
通用函數(shù)
create
void create( void );
用法:
每一個(gè)物件中, 都應(yīng)定義一個(gè) create() 函數(shù). 在 create() 函數(shù)中, 要完成一個(gè)物件的初始條件設(shè)定. 所有的物件都會(huì)調(diào)用 create() 函數(shù).
clean_up
int clean_up( int inherited );
用法:
驅(qū)動(dòng)程序 (driver) 為在一段時(shí)間之內(nèi)沒(méi)有活動(dòng) (inactive) 的物件調(diào)用 clean_up() 函數(shù). 此段時(shí)間的長(zhǎng)短, 定義在執(zhí)行時(shí)段組態(tài)檔 (rumtime configuration file) 中。clean_up() 會(huì)收到一個(gè)標(biāo)志 (flag) , 指出此物件是否有別的物件繼承 (inherit) 它. 如果clean_up() 返回 0, 則此物件將永遠(yuǎn)不再調(diào)用 clean_up(). 如果返回 1, 則在指定的 clean_up() 延遲時(shí)間之后物件仍沒(méi)有活動(dòng)的話, 再調(diào)用一次 clean_up().
通常一個(gè)物件在 clean_up() 中所作的事, 是摧毀自己以節(jié)省內(nèi)存.
reset
void reset( void );
用法:
在每次重新設(shè)定 (reset) 之后 (實(shí)際的重新設(shè)定周期取決于該 mud 的設(shè)定, 平均大約是每?jī)蓚€(gè)小時(shí)一次) , 所有游戲中現(xiàn)存的物件都會(huì)調(diào)用 reset() 函數(shù). 如果編譯驅(qū)動(dòng)程序時(shí), 于 options.h 中定義了 LAZY_RESET, 只有玩家接觸到的物件才會(huì)調(diào)用 reset(). 如此一來(lái), 沒(méi)用到的物件就不會(huì)從交換檔 (swap file) 中載入并進(jìn)行重新設(shè)定. reset() 常用于檢查寶物或怪物是否還在某個(gè)房間, 以判斷要不要重新產(chǎn)生一份.
上面講的比較模糊代乃。reset其實(shí)用于房間重新生成怪物旬牲,也是是游戲里面的刷怪仿粹。
move_or_destruct
int move_or_destruct( object dest );
用法:
如果一個(gè)物件的環(huán)境 (environment) 物件被摧毀了, 就調(diào)用此函數(shù), 并用于它的內(nèi)容物件. dest 是正要被摧毀的物件. 如果 dest 不存在, 則 dest 為 0. 如果 dest 中的物件沒(méi)有把自己移出被摧毀的物件, 則也會(huì)被一起摧毀.
每個(gè)object都有屬于自己的environment。最直觀的概念原茅,就是玩家打副本地圖吭历。如果玩家通關(guān)一個(gè)臨時(shí)副本,副本地圖的銷(xiāo)毀會(huì)導(dǎo)致所有處于這個(gè)環(huán)境下的object調(diào)用自身的move_or_destruct擂橘。副本內(nèi)的怪物destruct晌区,玩家move到其他地圖。
init
void init( void );
用法:
當(dāng) mudlib 把物件 A放入(move)物件 B時(shí), 驅(qū)動(dòng)程序 (即 move_object() 函數(shù)) 會(huì)做以下的動(dòng)作:
1. 如果 A 是活的 (living), 讓 A 在 B里面調(diào)用 A 的 init() 函數(shù).
2. 不管 A是否為活的物件, 讓 B的內(nèi)容物 (inventory) 里面, 所有活的物件調(diào)用 A 的 init().
3. 如果 A是活的, 讓 A調(diào)用位于 B 的內(nèi)容物里面所有物件的 init().
請(qǐng)注意: 一個(gè)物件必須曾調(diào)用過(guò) enable_command(3) 才視為活的物件.
一般來(lái)說(shuō), 一個(gè)物件的 init(4) 函數(shù)用來(lái)調(diào)用 add_command(3), 添加此物件提供的動(dòng)詞命令 (command).
舉個(gè)例子通贞,當(dāng)來(lái)到一個(gè)新的地圖時(shí)朗若,玩家和地圖各自的init被調(diào)用,玩家可能會(huì)得到某種buf或message昌罩,地圖要做一些初始化的工作哭懈,比如通知其他玩家有人來(lái)了。這體現(xiàn)了一種互相影響的關(guān)系茎用。(太哲學(xué)了)
id
int id( string an_id );
用法:
present(3)外部函數(shù)調(diào)用 id() 以判斷一個(gè)指定的物件是否以字符串 an_id為識(shí)別名稱 (id) . 如果 an_id 是此物件的識(shí)別名稱之一, 就返回 1, 不是則返回 0.
其實(shí)就是詢問(wèn)一個(gè)object:你是那誰(shuí)誰(shuí)誰(shuí)嗎遣总?
互動(dòng)物件(interactive)
互動(dòng)物件一般是指玩家物件。
logon
object logon( void );
主控物件 (master) 中的 connect() 函數(shù)返回的物件會(huì)調(diào)用 logon(). 此函數(shù)將新的使用者設(shè)定好.
也就是初始化使用者轨功。一般來(lái)說(shuō)會(huì)在這里彈個(gè)消息歡迎用戶旭斥。
net_dead
void net_dead( void );
如果一個(gè)可互動(dòng)的物件 (即玩家物件) 突然斷線 (即成了「網(wǎng)路死亡」(net dead) 狀態(tài)) , 則驅(qū)動(dòng)程序?qū)Υ宋锛{(diào)用 net_dead() , 讓此物件稍后有機(jī)會(huì)被清理掉 (clean up)、將斷線狀態(tài)告知環(huán)境物件等等. 請(qǐng)小心, 在物件處于可互動(dòng)狀態(tài)時(shí)才有作用的函數(shù), 將不會(huì)如您預(yù)料般地工作.
一般要在這里停止心跳古涧,并告知environment垂券,這個(gè)player掉線了。
process_input
string process_input( string );
用法:
如果玩家物件中有 process_input(), 則 MudOS 驅(qū)動(dòng)程序則會(huì)將玩家所輸入的每行數(shù)據(jù)傳遞給 process_input(). process_input() 使得像命令回溯 (command history) 和防止 wizcuffs. process_input() 可以在分析 (parse) 命令前, 修改玩家輸入的數(shù)據(jù). 如果 process_input() 返回一個(gè)非零字符串, 則此字符串就代替玩家輸入的內(nèi)容.
很容易理解蒿褂,用戶所有的命令都要經(jīng)過(guò)這個(gè)函數(shù)的處理圆米,處理過(guò)后的返回值就會(huì)代替用戶輸入的命令進(jìn)入下一個(gè)流程卒暂。
receive_message
void receive_message( string class, string message );
用法:
message() 這一類(lèi)的外部函數(shù)調(diào)用在玩家物件中的 receive_message(). 參數(shù) parameter通常用于指示消息的種類(lèi) (說(shuō)話 say, 傾訴 tell, 表情 emote, 戰(zhàn)斗 combat, 房間語(yǔ)句 room description). receive_message() 和 message() 的外部函數(shù)結(jié)合在一起, 可以提供一個(gè)「聰明的」消息處理程序介面.
就是反饋信息用的啄栓。
還有一個(gè)receive_snoop函數(shù):
void receive_snoop( string message) ;
用法:
如果驅(qū)動(dòng)程序編譯時(shí), 在 options.h 中定義 RECEIVE_SNOOP, 則一個(gè)使用者窺視另一個(gè)使用者時(shí), 所有窺視的文字會(huì)傳遞給玩家物件中的 receive_snoop() 函數(shù). 在此函數(shù)中, 您可以處理這些文字. receive_snoop() 程序的內(nèi)容, 通常把這些文字再傳遞給 receive() 函數(shù).
主控物件(master)
主控物件只有一個(gè),負(fù)責(zé)整個(gè)程序的調(diào)度也祠。舉個(gè)例子昙楚,每當(dāng)新用戶連接到服務(wù)器的時(shí)候,driver會(huì)調(diào)用master的connect方法诈嘿。一般來(lái)說(shuō)堪旧,connect方法負(fù)責(zé)生成一個(gè)login對(duì)象并返回,login負(fù)責(zé)處理與新用戶的所有交互奖亚。