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