Re: [閒聊] 副本系統

作者: laechan (揮淚斬馬雲)   2014-04-27 19:51:10
底下模擬幻想○域的其中一個聲望副本「地獄裂痕」,為方便測試
因此簡化了部份訊息及流程,實際上要完整模擬其流程也是辦得到
的,只是物件程式碼會比較長,而我只是要做個測試。
測試結果證明,mud 所建立的副本系統,絕對可以模擬線上遊戲的
副本,mud 本身又已經有相當多的素材可利用,因為我們早已寫了
許多的區域及怪物檔,因此,不僅創建副本的速度可以比線上遊戲
快非常多,其流程控制腳本也更好寫。
Laechan@sanc
副本物件設定部份
// 005.c
// Laechan@Sanc add in 2014/04/26
#include "../instance.h"
inherit INSTANCE_OB;
void create()
{
string tmp;
int i;
::create();
seteuid(getuid(this_object()));
set("pre_clean",1);
// 設定區開始
// 該副本的地圖,如下所示共八格
// 有個 instance_map2data 函數可將底下的圖
// 轉成實際的房間路線配置 written by justinj@sanc
instance_map2data=@LONG
003-004-005
| |
002 006
| |
001 007
|
008
LONG
;
instance_paths="/std/ob/";
instance_virtual="/std/ob/room";
instance_ob=base_name(this_object()); // 固定
instance_names="地獄裂痕副本";
// 該副本所有房間採用共同的 short 及 long (方便測試起見)
instance_comm=(["short":"廢棄的礦坑",
"long":"一座荒廢已久的礦坑,裡頭透著不尋常的氣息!\n\n",]);
instance_data=([
"002":(["instance_check":1,
"cant_go":(["north":1]),
]),
"003":(["instance_check":1,
"long2":HIR"\n* 這個地方現在出現了一個小型的空間裂縫。"NOR"\n\n",
"cant_go":(["east":1]),
]),
"005":(["instance_check":1,
"long2":HIR"\n* 這個地方現在出現了一個中型的空間裂縫。"NOR"\n\n",
"cant_go":(["south":1]),
]),
"008":(["instance_check":1,
"long2":HIR"\n* 這個地方現在出現了一個大型的空間裂縫。"NOR"\n\n",
]),
]);
// 副本區域房間範圍
instance_files=({
"001","002","003","004","005","006","007","008"
});
// 怪物資料, files 必備, 其它就是 short, long, ... 等可自訂
// 其中 files 的部份就相當於「借殼」,即借用現存的怪物檔
// 但是變更其 chi_name 等資訊 = 一隻新的怪物
instance_mob_datas=([
"bat":(["files":"/u/p/ppl/hiei/felid/forest1/mob/mob1",
"level":150,
"chi_name":"異界吸血蝙蝠",
"id":({"ej bat","bat"}),
]),
"giant":(["files":"/d/dfire/caresa/mob/mgiant",
"level":175,
"killer":1,
"chi_name":"異界噬血巨人",
"id":({"ej giant","giant"}),
]),
"master":(["files":"/d/dfire/caresa/mob/mgiant",
"level":220,
"killer":1,
"short":"異界噬血巨人─阿克罕(Akerhan)",
"chi_name":"阿克罕",
"id":({"giant","akerhan"}),
]),
]);
// 副本各房間生怪資料, 所生的怪在 instance_mob_datas 都要有定義
// 例如 003 就是生出三隻 bat
instance_mobs=([
"003":({"bat","bat","bat"}),
"005":({"bat","bat","bat","giant","giant","giant"}),
"008":({"giant","giant","giant","giant","giant","giant","master"}),
]);
// 設定區結束
}
// 預計讓一些房間跑的流程,通通設定在這裡
int instance_check(string files,object room)
{
int flags,t;
object ob;
flags=(int)room->query("instance_flags");
t=time();
switch(files)
{
// 西爾克交待任務
case "002":
switch(flags)
{
case 0:
// 生出 npc
birth_npcs(room,INSTANCE_NPC,
({"short","不幸的魔法師─西爾克(Sealker)",
"chi_name","不幸的魔法師─西爾克"}));
// 設定間隔 tell_room 訊息
// 該訊息每 5 秒跑出一段
room->set("instance_data/enter_msgs",
({HIW"西爾克:你就是...來幫助我的人吧!"NOR"\n",
HIW"西爾克:請幫助我打倒礦坑內的魔物吧!"NOR"\n",
}));
room->set("instance_next_times",12+t);
room->set("instance_flags",1);
break;
case 1:
if(t>room->query("instance_next_times"))
{
// 移除往北的 cant_go, 即玩家此時就可往北移動
room->delete("cant_go/north",1);
room->set("instance_flags",2);
}
break;
}
break; // end of 002
case "003":
switch(flags)
{
case 0:
if(!present("INSTANCE_MOB",room))
{
// 去讀 003 南邊的 002 的西爾克,若它還在就把它叫過來
if(ob=room->query("exits/south"))
{
if(ob=present("INSTANCE_NPC",ob))
ob->move(room);
}
// 若它不在了就生出新的西爾克
if(!present("INSTANCE_NPC",room))
birth_npcs(room,INSTANCE_NPC,
({"short","不幸的魔法師─西爾克(Sealker)",
"chi_name","不幸的魔法師─西爾克"}));
room->set("instance_flags",1);
room->set("instance_data/enter_msgs",
({HIW"西爾克:現在就讓我施法,將這個裂縫關閉吧!"NOR"\n",
HIW"只見西爾克對著裂縫唸出了一長串的咒語......"NOR"\n",
HIW"裂縫緩緩地關閉了!"NOR"\n",
HIW"西爾克:請繼續掃蕩礦坑裡的魔物,拜託了!"NOR"\n",
}));
room->set("instance_next_times",21+t);
room->set("instance_flags",1);
}
break;
case 1:
if(t>(int)room->query("instance_next_times"))
{
room->delete("cant_go/east",1);
room->delete("long2");
room->set("instance_flags",2);
}
break;
}
break; // end of 003
case "005":
switch(flags)
{
case 0:
if(!present("INSTANCE_MOB",room))
{
if(ob=room->query("exits/west"))
{
if(ob=ob->query("exits/west"))
{
if(ob=present("INSTANCE_NPC",ob))
ob->move(room);
}
}
if(!present("INSTANCE_NPC",room))
birth_npcs(room,INSTANCE_NPC,
({"short","不幸的魔法師─西爾克(Sealker)",
"chi_name","不幸的魔法師─西爾克"}));
room->set("instance_flags",1);
room->set("instance_data/enter_msgs",
({HIW"西爾克:現在就讓我施法,將這個裂縫關閉吧!"NOR"\n",
HIW"只見西爾克對著裂縫唸出了一長串的咒語......"NOR"\n",
HIW"裂縫緩緩地關閉了!"NOR"\n",
HIW"西爾克:請繼續掃蕩礦坑裡的魔物,拜託了!"NOR"\n",
}));
room->set("instance_next_times",21+t);
room->set("instance_flags",1);
}
break;
case 1:
if(t>room->query("instance_next_times"))
{
room->delete("cant_go/south",1);
room->delete("long2");
room->set("instance_flags",2);
}
break;
}
break; // end of 005
case "008":
switch(flags)
{
case 0:
if(!present("INSTANCE_MOB",room))
{
if(ob=room->query("exits/north"))
{
if(ob=ob->query("exits/north"))
{
if(ob=ob->query("exits/north"))
{
if(ob=present("INSTANCE_NPC",ob))
ob->move(room);
}
}
}
if(!present("INSTANCE_NPC",room))
birth_npcs(room,INSTANCE_NPC,
({"short","不幸的魔法師─西爾克(Sealker)",
"chi_name","不幸的魔法師─西爾克"}));
room->set("instance_flags",1);
room->set("instance_data/enter_msgs",
({HIW"西爾克:這就是最後的裂縫了!現在就讓我施法吧.."NOR"\n",
HIW"只見西爾克對著裂縫唸出了一長串的咒語......"NOR"\n",
HIW"裂縫緩緩地關閉了!"NOR"\n",
HIW"西爾克:終於將所有的裂縫關閉了,感謝你的協助!"NOR"\n",
}));
room->set("instance_next_times",21+t);
room->set("instance_flags",1);
}
break;
case 1:
if(t>room->query("instance_next_times"))
{
// 這時才讓副本產生出口
room->set("exits/out","/d/wiz/room/disc");
room->delete("long2");
room->set("instance_flags",2);
// 發放獎勵。instance_members 就是最初進入副本的玩家集合
foreach(ob in (mixed)room->query("instance_members"))
{
// 若玩家還在線上,而且房間也來到了這格,才發獎勵
if(ob && environment(ob)==room)
{
tell_object(ob,
CSI"1;37;44m[ 你協助了西爾克,得到 200 點戰功\聲望! ]"NOR"\n");
ob->add_warexp(200);
}
}
}
break;
}
break; // end of 008
}
return 1;
}
副本實測部份
* 你進入了地獄裂痕副本。
> look
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: north.
> map
目前所在位置: 廢棄的礦坑
口─口─口
| |
口 口
| |
⊕ 口


> n
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: north 和 south.
Lv255.不幸的魔法師─西爾克(Sealker)
> n
你現在無法往 north 這個方向離開喔!
西爾克:你就是...來幫助我的人吧!
西爾克:請幫助我打倒礦坑內的魔物吧!
> n
☆☆☆ 戰 鬥 開 始 ☆☆☆
你發覺異界吸血蝙蝠對你展開攻擊!
你發覺異界吸血蝙蝠對你展開攻擊!
你發覺異界吸血蝙蝠對你展開攻擊!
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: south 和 east.
* 這個地方現在出現了一個小型的空間裂縫。
[副本怪] [飄浮中]異界吸血蝙蝠(Instance ej bat) [17群異界吸血蝙蝠]氣血充足,絲毫
沒有任何外傷. 正在攻擊 摳頂機器(Laechan:進階法師)。
[副本怪] [飄浮中]異界吸血蝙蝠(Instance ej bat) [17群異界吸血蝙蝠]氣血充足,絲毫
沒有任何外傷. 正在攻擊 摳頂機器(Laechan:進階法師)。
[副本怪] [飄浮中]異界吸血蝙蝠(Instance ej bat) [17群異界吸血蝙蝠]氣血充足,絲毫
沒有任何外傷. 正在攻擊 摳頂機器(Laechan:進階法師)。
.
.
異界吸血蝙蝠發出一聲慘叫!!
異界吸血蝙蝠慢慢的倒在地上死了...你得到 7590點的經驗值。
你得到了(2)點學習點數。
你取得了一個牙齒。
你拿起[副本怪] [飄浮中]異界吸血蝙蝠(Instance ej bat) [17群異界吸血蝙蝠]身上所有
的東西。
○○○ 這場戰鬥結束了! ○○○
> l
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: south 和 east.
* 這個地方現在出現了一個小型的空間裂縫。
Lv255.不幸的魔法師─西爾克(Sealker)
西爾克:現在就讓我施法,將這個裂縫關閉吧!
只見西爾克對著裂縫唸出了一長串的咒語......
裂縫緩緩地關閉了!
西爾克:請繼續掃蕩礦坑裡的魔物,拜託了!
> e
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: east 和 west.
> e
☆☆☆ 戰 鬥 開 始 ☆☆☆
你發覺異界吸血蝙蝠對你展開攻擊!
你發覺異界吸血蝙蝠對你展開攻擊!
你發覺異界吸血蝙蝠對你展開攻擊!
你發覺異界噬血巨人對你展開攻擊!
你發覺異界噬血巨人對你展開攻擊!
你發覺異界噬血巨人對你展開攻擊!
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: south 和 west.
* 這個地方現在出現了一個中型的空間裂縫。
[副本怪] [飄浮中]異界吸血蝙蝠(Instance ej bat) [17群異界吸血蝙蝠]氣血充足,絲毫
沒有任何外傷. 正在攻擊 摳頂機器(Laechan:進階法師)。
[副本怪] [飄浮中]異界吸血蝙蝠(Instance ej bat) [17群異界吸血蝙蝠]氣血充足,絲毫
沒有任何外傷. 正在攻擊 摳頂機器(Laechan:進階法師)。
[副本怪] [飄浮中]異界吸血蝙蝠(Instance ej bat) [17群異界吸血蝙蝠]氣血充足,絲毫
沒有任何外傷. 正在攻擊 摳頂機器(Laechan:進階法師)。
[副本怪] 異界吸血巨人(Giant)氣血充足,絲毫沒有任何外傷. 正在攻擊 摳
頂機器(Laechan:進階法師)。
[副本怪] 異界吸血巨人(Giant)氣血充足,絲毫沒有任何外傷. 正在攻擊 摳
頂機器(Laechan:進階法師)。
[副本怪] 異界吸血巨人(Giant)氣血充足,絲毫沒有任何外傷. 正在攻擊 摳
頂機器(Laechan:進階法師)。
.
.
異界噬血巨人發出一聲慘叫!!
異界噬血巨人慢慢的倒在地上死了...你得到 7590點的經驗值。
你拿起[副本怪] 異界噬血巨人(Giant)身上所有的東西。
> l
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: south 和 west.
* 這個地方現在出現了一個中型的空間裂縫。
Lv255.不幸的魔法師─西爾克(Sealker)
西爾克:現在就讓我施法,將這個裂縫關閉吧!
只見西爾克對著裂縫唸出了一長串的咒語......
裂縫緩緩地關閉了!
西爾克:請繼續掃蕩礦坑裡的魔物,拜託了!
> s
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: north 和 south.
> s
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: north 和 south.
> s
☆☆☆ 戰 鬥 開 始 ☆☆☆
你發覺異界噬血巨人對你展開攻擊!
你發覺異界噬血巨人對你展開攻擊!
你發覺異界噬血巨人對你展開攻擊!
你發覺異界噬血巨人對你展開攻擊!
你發覺異界噬血巨人對你展開攻擊!
你發覺異界噬血巨人對你展開攻擊!
你發覺阿克罕對你展開攻擊!
> look
[副本怪] 異界噬血巨人─阿克罕(Akerhan)氣血充足,絲毫沒有任何外傷. 正在攻擊
摳頂機器(Laechan:進階法師)。
[副本怪] 異界噬血巨人(Giant)氣血充足,絲毫沒有任何外傷. 正在攻擊 摳頂機器
(Laechan:進階法師)。
[副本怪] 異界噬血巨人(Giant)氣血充足,絲毫沒有任何外傷. 正在攻擊 摳頂機器
(Laechan:進階法師)。
[副本怪] 異界噬血巨人(Giant)氣血充足,絲毫沒有任何外傷. 正在攻擊 摳頂機器
(Laechan:進階法師)。
[副本怪] 異界噬血巨人(Giant)氣血充足,絲毫沒有任何外傷. 正在攻擊 摳頂機器
(Laechan:進階法師)。
[副本怪] 異界噬血巨人(Giant)氣血充足,絲毫沒有任何外傷. 正在攻擊 摳頂機器
(Laechan:進階法師)。
[副本怪] 異界噬血巨人(Giant)氣血充足,絲毫沒有任何外傷. 正在攻擊 摳頂機器
(Laechan:進階法師)。
.
.
阿克罕發出一聲慘叫!!
阿克罕慢慢的倒在地上死了...你得到 7590點的經驗值。
你得到了(2)點學習點數。
你拿起[副本怪] 異界噬血巨人─阿克罕(Akerhan)身上所有的東西。
> look
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: north.
* 這個地方現在出現了一個大型的空間裂縫。
Lv255.不幸的魔法師─西爾克(Sealker)
西爾克:這就是最後的裂縫了!現在就讓我施法吧..
只見西爾克對著裂縫唸出了一長串的咒語......
裂縫緩緩地關閉了!
西爾克:終於將所有的裂縫關閉了,感謝你的協助!
[ 你協助了西爾克,得到 200 點戰功聲望! ]
> l
廢棄的礦坑
一座荒廢已久的礦坑,裡頭透著不尋常的氣息!
明顯出口有: north 和 out.
Lv255.不幸的魔法師─西爾克(Sealker)
> out
巨型高塔
這裡是羅德斯鎮的巨型高塔,是人們與神最為接近的地方,每天
都會有人來這裡遊蕩,他們時常從高塔上俯瞰美麗的風景。
west : 次元傳送鏡
east : 藥水店
north : 防具店
south : 武器店
up : 雲端的夢幻國度
down : 羅德斯廣場
明顯出口有: south, north, east, down, west, 和 up.
Lv250.『你可以跟我 adv 屬性』小滷蛋(Lodao)

Links booklink

Contact Us: admin [ a t ] ucptt.com