[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