[閒聊] 主動怪警報器撰寫方式探討
這個是從神知裡頭的「驅魂警報器」的設計來的。
比方說玩家帶著警報器進入某房間,它會顯示..
* 警報器顯示 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
06/24 18:57, 2F
→
06/25 18:42, , 3F
06/25 18:42, 3F
→
07/02 15:34, , 4F
07/02 15:34, 4F
→
07/02 15:34, , 5F
07/02 15:34, 5F
→
07/02 15:35, , 6F
07/02 15:35, 6F
mud 近期熱門文章
PTT遊戲區 即時熱門文章
65
172
19
43
19
36