作者laechan (小太保)
看板mud_sanc
標題[wizs] 副本 instance_check 搭配參數的做法
時間Mon Apr 14 13:51:04 2014
這是剛剛才產生的做法,我想理論上可能可以。
首先,假設某副本χ有m個房間,其中n個需要做 instance_check,
在χ物件裡會宣告一個 int instance_check 函數,比方說我們一進
入某個需要 instance_check 的房間,該房間需做的判斷是「怪物全
死光了沒」..
int instance_check(string files,object room)
{
switch(files)
{
case "084":
if(!present("INSTANCE_MOB",room))
tell_room(room,"\n[instance_check] 邪惡黑熊全部被你殺光了。\n");
那我的意思就是,怪物全死光了之後,在上面加一行
room->set("mob_all_die",1);
再讓心跳循環判斷有沒有 mob_all_die,它包含預設的以及自設的,
自設的就類似底下
int instance_check(string files,object room)
{
if(room->query("instance_ended")) return 1;
switch(files)
{
case "084":
// 怪物沒死光時,持續判斷怪物是否死光
if(!room->query("mob_all_die"))
{
if(!present("INSTANCE_MOB",room))
{
tell_room(room,"\n[instance_check] 邪惡黑熊全部被你殺光了。\n");
room->set("mob_all_die",1);
}
}
// 當怪物死光時就執行這裡
if(room->query("mob_all_die"))
{
.
.
room->set or delete(xxx)
}
// 其它判斷
.
.
}
return 1;
}
這樣做法就很彈性了。然後某些比較麻煩的設定就交給「預設」,
例如 enter_msg (buff_msg) 目前就是採預設做法。
一般常看到的做法則是用 flag 型式,例如上面可改寫為
flags=(int)query("instance_flag");
switch(flags)
{
// 最先判斷怪物死光了沒
case 0:
if(!present("INSTANCE_MOB",room))
room->set("instance_flag",1);
break;
// 當怪物死光後(flag=1), 對所有玩家做定身
case 1:
usr->set("block_command",10);
usr->set("block_command_msg","(你要等一下喔!)\n");
room->set("instance_flag",2);
room->set("next_times",10+time());
break;
// 當所有玩家的定身都結束後(10 秒後), 解除往北路障
case 2:
if(time()>room->query("next_times"))
{
room->delete("cant_go/north");
room->set("instance_flag",3);
// 然後如果所有判斷都結束也可以加上這一個
room->set("instance_ended",1);
}
break;
}
這樣一個旗標欄位+一個輔助判斷欄位(next_times)就可以完成
一個副本房間的數階段判斷,連「打死怪物後隔幾秒又生出新的
副本怪」理論上也可以用這方法做到,不過最好是呼叫專用函數
,這也是副本要做的。
這樣生怪段落就可以全部交給該函數負責,也就是底下
tmps=instance_mobs[files];
foreach(tmp in tmps)
{
mob=clone_object(instance_mob_datas[tmp]["files"]);
mob->add("id",({"INSTANCE_MOB"}));
.
.
這些全部都應該函數化。下午會把重點放在這裡。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.61.157.53
※ 文章網址: http://webptt.com/m.aspx?n=bbs/mud_sanc/M.1397454668.A.8F1.html
生怪段落已函數化,/std/new_ob/instance/instance_ob.c 新增
底下的函數
int birth_mobs(object room,mixed tmps,string names,int lv)
這東西的用法就是說,比方我們在某一副本房間,希望它能額外
生出怪物,它的做法就是
> call 001;birth_mobs;here;({"bear1","bear1"});"白瓦鎮黑熊討伐任務副本";120
你發覺邪 惡 黑 熊對你展開攻擊!
☆☆☆ 戰 鬥 開 始 ☆☆☆
你發覺邪 惡 黑 熊對你展開攻擊!
房間(/std/new_ob/instance/laechan/001)-> birth_mobs(
房間(/std/new_ob/instance_room), ({ "bear1", "bear1" }),
"白瓦鎮黑熊討伐任務副本", 120 ) = 1
而 001.c 平常也會被設定在每一個副本房間裡頭
instance_ob :"/std/new_ob/instance/laechan/001"
則每一隻以此方法叫出的怪物,就都能具有副本怪物的特性,而
不需單獨使用 clone_object 的方式再設定之,而且其等級與隻
數(目前還不支援隻數)亦可另訂,這部份可討論。
另外再補充一點,假設某副本所有房間是這麼宣告的...
instance_rooms=({"100","100","100",......});
(也就是所有房間都是同一基底房間)
那麼理論上只要 instance_data 設定得宜,一樣可做出判斷..
switch(files)
{
case "100":
switch(room->query("instance_data/real_room_number"))
{ ^^^^^^^^^^^^^^^^ 可自訂
case "001":
.
.
我一般不建議使用同一房間去產生出副本區域(雖然辦得到),但
如果真的這樣做,最好還是要給每一個房間一個額外的識別用欄
位,才能避免判斷上的不便。
Laechan
※ 編輯: laechan (210.61.157.53), 04/14/2014 14:37:45