Re: [建议] 副本相关

楼主: laechan (挥泪斩马云)   2014-04-15 10:03:01
底下进行昨天的 check_instance 测试,流程是
1.进入房间后先锁出口
2.跑第一阶段的 buff_msg
3.生怪
4.跑下一阶段的 buff_msg2
5.移除路障
001.c 先备份为 001.bak,084 只设定 instance_check,原本
设定一进去就生怪也先移除。
instance_data=([
"084":([
"instance_check":1,
]),
]);
==========================测试开始===============================
> call 001;create_instance;"laechan";({laechan})
档案不存在: /std/new_ob/instance/laechan/({laechan})
房间(/std/new_ob/instance/laechan/001)-> create_instance(
"laechan", ({ 玩家(laechan /std/user) }) ) = 0
> n
[副本]山林小径
天色开始渐渐变黑, 即使是当地人也不太敢独自一人来到山的这
一侧, 所以你一路上几乎没有看到什么人烟. 往西望过去, 道路
越来越看不见了.
明显出口有: south 和 west.
>
黑熊神:大胆狂徒,竟敢闯入我的领地... <= 5 秒后
> w
你现在无法往 west 这个方向离开喔! <= 锁出口
黑熊神:受死吧! <= 10 秒后
你发觉邪 恶 黑 熊对你展开攻击! <= 生怪
☆☆☆ 战 斗 开 始 ☆☆☆
你发觉邪 恶 黑 熊对你展开攻击!
你眼露凶光,杀气重重!
你用砂锅大的拳头击向邪 恶 黑 熊,形成普普的伤害。
“邪 恶 黑 熊容光焕发,精神抖擞。”
.
.
> cc 001.c <= 中途就算 update 001.c 也不会有影响
/std/ob/room.c: 更新及加载了.
/std/new_ob/instance/instance_ob.c: 更新及加载了.
/std/new_ob/instance/laechan/001: 更新及加载了.
邪 恶 黑 熊发出一声惨叫!! <= 怪死了
邪 恶 黑 熊慢慢的倒在地上死了...你得到 12600点的经验值。
你拿起[副本怪] 邪 恶 黑 熊(Bear)身上所有的东西。
黑熊神:还蛮有两下子的嘛! <= 5 秒后
> w <= 解除出口
你发觉邪 恶 黑 熊对你展开攻击!
☆☆☆ 战 斗 开 始 ☆☆☆
你发觉邪 恶 黑 熊对你展开攻击!
[副本]山林小径
眼前的景色有点朦胧, 四处散发著诡异的感觉, 你小心翼翼地注
意著身边的情况.
========================测试结束========================
上面最后的部份我的做法是,只要玩家看到第一句
黑熊神:还蛮有两下子的嘛!
我就把锁出口移除,玩家这时就可以往下一格移动,当然要锁到
讯息全跑完也可(锁 10 秒),但我个人不喜欢玩家等待这么长的
时间。
底下是 switch 的判断部份,wizs 可参考。
flags=(int)room->query("instance_flags");
t=time();
switch(flags)
{
// 锁出口
case 0:
room->set("cant_go/west",1);
room->set("instance_flags",1);
break;
// 跑讯息,每 5 秒一次
case 1:
room->set("instance_data/enter_msgs",
({HIB"黑熊神:"HIR"大胆狂徒,竟敢闯入我的领地..."NOR"\n",
HIB"黑熊神:"HIR"受死吧!"NOR"\n",
}));
room->set("instance_flags",2);
room->set("instance_next_times",t+10);
break;
// 生怪
case 2:
birth_mobs(room,({"bear1","bear1"}));
room->set("instance_flags",3);
break;
// 判断怪全死了没,全死就跑下一阶段的 buff_msg
case 3:
if(!present("INSTANCE_MOB",room))
{
room->delete("instance_data/buff_enter_msgs");
room->set("instance_data/enter_msgs",
({HIB"黑熊神:"HIR"还蛮有两下子的嘛!"NOR"\n",
HIB"黑熊神:"HIR"如果你能来到我的面前,我再亲自考验你的能耐吧!"NOR"\n",
}));
room->set("instance_flags",4);
room->set("instance_next_times",t+5);
}
break;
// 5 秒后解除出口路障
case 4:
if(t>(int)room->query("instance_next_times"))
{
room->delete("cant_go/west");
room->set("instance_flags",5);
room->set("instance_next_times",t+5);
}
break;
// 再五秒后(讯息全跑光)设定 already_ended
case 5:
if(t>(int)room->query("instance_next_times"))
room->set("already_ended",1);
break;
}
这一部份有些可函数化(例如把 already_ended 的设定函数化),
有些则不用勉强函数化(例如怪全部死光后的段落)。
LAechan

Links booklink

Contact Us: admin [ a t ] ucptt.com