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

看板mud (網路地下城/文字遊戲)作者 (小太保)時間13年前 (2012/06/21 11:31), 編輯推噓1(105)
留言6則, 4人參與, 最新討論串1/1
這個是從神知裡頭的「驅魂警報器」的設計來的。 比方說玩家帶著警報器進入某房間,它會顯示.. * 警報器顯示 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 laechan:轉錄至看板 mud_sanc 06/21 11:33

06/23 05:13, , 1F
「正妹就在你隔壁警報器」
06/23 05:13, 1F

06/24 18:57, , 2F
down方向有個臭喜憨沒gg
06/24 18:57, 2F

06/25 18:42, , 3F
..
06/25 18:42, 3F

07/02 15:34, , 4F
我記得是可以用trigger做出類似的效果
07/02 15:34, 4F

07/02 15:34, , 5F
以kk來說有 look 方向,可以看到該方向的mob or player
07/02 15:34, 5F

07/02 15:35, , 6F
以前打war的trigger檔有這類似功能XD
07/02 15:35, 6F
文章代碼(AID): #1FufMYsU (mud)
文章代碼(AID): #1FufMYsU (mud)