Fw: [閒聊] 主動怪警報器撰寫方式探討

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間13年前 (2012/06/21 11:33), 編輯推噓0(003)
留言3則, 1人參與, 最新討論串1/1
※ [本文轉錄自 mud 看板 #1FufMYsU ] 作者: laechan (小太保) 看板: mud 標題: [閒聊] 主動怪警報器撰寫方式探討 時間: Thu Jun 21 11:31:41 2012 這個是從神知裡頭的「驅魂警報器」的設計來的。 比方說玩家帶著警報器進入某房間,它會顯示.. * 警報器顯示 north 方向有主動怪! * 警報器顯示 east 方向有主動怪! 則以一般的想法來說,因為玩家進入一個物件時,會觸發 該物件的 init 函數,因此用寫在房間裡的 init 函數來 做是最簡單的,即房間用繼承物件這樣子訂.. void init() { bla bla... } 然後只要一般房間有自訂 void init 時就這樣做.. void init() { ::init(); bla bla... } 但問題就在於很多 wiz 寫房間時在 void init 裡面並沒 有做 ::init(); ... 假設是這種情況,為避免警報器因自訂 void init 失效, 而且基本上這種寫法也不是說很完美(只是很簡單),因此 應採取其它做法。 第二種一般常想到的方式就是透過 move_player() 的做法 ,當呼叫者為玩家時... int move_player(string files,string types) { . . // 當玩家身上有帶警報器時,就呼叫 ob 的 show_alarm // 函數來做警報訊息的顯示 if(ob=present("警報器 id",user)) ob->show_alarm(env); . . } 基本上它可以應付大部份的情況,缺點就是每 move_player 一次,就會做一次 if 的判斷,所以原則上若採取這種做法 ,應以減化判斷做為手段。 例如說,假設該警報器是頭飾,設計是 wear 時才會有作用 ,那麼在 wear_func 通常會加上底下這行.. user->set_temp("wearing_警報器",1); 然後在 remove_func 則加上移除的程式段,那麼判斷就可 簡化為.. if(user->query_temp("wearing_警報器")) user->show_alarm(env); 上面的意思就是說,警報器變成「純裝飾品」,實際上顯示 警告的 show_alarm 函數是寫在 user 物件裡頭的。 底下是 show_alarm 函數的實際程式碼 void show_alarm(object env) { string tmp="",ext; mixed exits; object ob,r; if(env->query("exits")) { exits=keys((mapping)env->query("exits")); foreach(ext in exits) if(!catch(r=find_object_or_load(env->query("exits/"+ext)))) foreach(ob in all_inventory(r)) if(ob->query("killer")>0) { tmp+=HIM"* 警報器顯示 "+ext+" 方向有主動怪!"NOR"\n"; break; } write(tmp); } } 這東西可以進一步寫成「BOSS就在你隔壁警報器」,或者是 「有玩家就在你隔壁警報器」。 Laechan@Sanc -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.61.157.53 ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: laechan (210.61.157.53), 時間: 06/21/2012 11:33:22

06/21 11:33, , 1F
wiz 可使用 call me;show_alarm;here 去觀看執行結果
06/21 11:33, 1F

06/21 11:33, , 2F
程式碼則寫在 /std/user/living.c 的最底下
06/21 11:33, 2F

06/21 11:36, , 3F
running 程式碼: ob->show_alarm(environment(ob));
06/21 11:36, 3F
========== 程式執行區 ========== * 警報器顯示 southeast 方向有主動怪! * 警報器顯示 north 方向有主動怪! ========== 程式執行區 ========== ※ 編輯: laechan 來自: 210.61.157.53 (06/21 11:36)
文章代碼(AID): #1FufO3nv (mud_sanc)
文章代碼(AID): #1FufO3nv (mud_sanc)