MudOS的物件(objects)

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é)處理與新用戶的所有交互奖亚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淳梦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昔字,更是在濱河造成了極大的恐慌爆袍,老刑警劉巖首繁,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異陨囊,居然都是意外死亡弦疮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)蜘醋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胁塞,“玉大人,你說(shuō)我怎么就攤上這事压语⌒グ眨” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵无蜂,是天一觀的道長(zhǎng)伺糠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)斥季,這世上最難降的妖魔是什么训桶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮酣倾,結(jié)果婚禮上舵揭,老公的妹妹穿的比我還像新娘。我一直安慰自己躁锡,他們只是感情好午绳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著映之,像睡著了一般拦焚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杠输,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天赎败,我揣著相機(jī)與錄音,去河邊找鬼蠢甲。 笑死僵刮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹦牛。 我是一名探鬼主播搞糕,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼曼追!你這毒婦竟也來(lái)了窍仰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤礼殊,失蹤者是張志新(化名)和其女友劉穎驹吮,沒(méi)想到半個(gè)月后鲫忍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钥屈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年悟民,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篷就。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡射亏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竭业,到底是詐尸還是另有隱情智润,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布未辆,位于F島的核電站窟绷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咐柜。R本人自食惡果不足惜兼蜈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拙友。 院中可真熱鬧为狸,春花似錦、人聲如沸遗契。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牍蜂。三九已至漾根,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲫竞,已是汗流浹背辐怕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贡茅,地道東北人秘蛇。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓其做,卻偏偏與公主長(zhǎng)得像顶考,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妖泄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容