[wizs] 副本 instance_check 搭配參數的做法

作者: laechan (揮淚斬馬雲)   2014-04-14 13:51:04
這是剛剛才產生的做法,我想理論上可能可以。
首先,假設某副本χ有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

Links booklink

Contact Us: admin [ a t ] ucptt.com