作者:
laechan (揮淚斬馬雲)
2019-07-15 18:48:26提供一些建議。(雖然我還是要說,我真的沒時間)
依照經驗,很多東西都可以資料庫化,舉一個最常見的怪物掉落
物,比方在 RO 打死一隻波波利,會掉以下的東西
掉落物品 (Renewal)
粘稠液體 55%
加勒結晶 15%
綠色藥草 5%
葡萄 2%
蘋果 0.05%
笨拙短劍 0.05%
波波利卡片 0.01%
簡單的掉落做法,是在怪物生成時就把這些[物件] move 到怪物
身上,則玩家打死怪物時自然就掉落這些物品。
加上機率的設定時,則常見的做法是
int die()
{
int r=random(10000);
switch(r)
{
case 0: 掉落波波利卡片; break;
case 1..5: 掉落笨拙短劍; break;
case 6..10: 掉落蘋果; break;
case 11..210: 掉落葡萄; break;
.
.
而後則進化為直接在怪物的 create 裡面做設定
set("mob_drop",([
波波利卡片: 1, 代表 0.01%
笨拙短劍 : 5, 代表 0.05%
蘋果 : 5, 代表 0.05%
葡萄 : 200, 代表 2.00%
.
.
不管怎麼進化,當 mud 發展到一個程度、怪物量也多到一個程度
時,就會發現一個問題: 我怎麼管理這些怪物的掉落物設定?
(我希望一個 mud 從開發階段到成熟階段,不要再重蹈這些歷程)
這時最合理也最便於管理的做法就是集中式資料庫。
例如我有一個資料庫物件 /data/mob_drop.c,而波波利這個怪物
的檔名是 /x/xxx/mob/bobori.c,則這隻怪物在 mob_drop.c 裡頭
的掉落物設定資料設計如下:
mapping mob_drop([
"/x/xxx/mob/bobiri:([
波波利卡片: 1,
笨拙短劍 : 5,
蘋果 : 5,
葡萄 : 200,
.
.
]),
]);
mapping mob_drop(string files)
{
return mob_drop[files];
}
然後只要統一在 monster.c 裡頭的 die 函數裡面加這個程式段即可
mapping mob_drop_data;
object mob_drop=find_object("/data/mob_drop");
string files=base_name(this_object());
// 如果這隻怪物有設定怪物掉落物資料
if(!undefinedp(mob_drop_data=mob_drop->mob_drop(files)))
{
執行怪物掉落的相關判斷;
}
這樣 mob_drop.c 就能寫各種增刪改及各種資料撈取的函數,就能達
到集中化管理的目的。
這個集中化管理的概念,還可延伸到任何各式各樣原本傳統上都寫在
物件內的東西,例如最常見的 add_action、各商店小販販售的物品、
房間出現的 NPC、自編的任務等。
集中化管理的好處,就是隨時可以綜觀整個資料群,你看到的都會是
整體,而不是每一個個體,這樣你的調整才會是在考量到整體的情況
下去做的。
再來談框架,框架並不是指下面的東西
inherit ROOM;
void create()
{
::create();
set("short","一間房間");
set("long",@LONG
這是一間簡單的房間。
LONG
);
set("exits",([
"east":__DIR__"002",
"west":__DIR__"003",
]));
reset();
}
而是指一種每個人在為這個 mud 寫各種物件或程式段時,必須遵循的
東西。例如,假設這個 mud 設定 short 時是這樣做的
set_short("一間房間");
那所有 wiz 在寫房間時就最好別使用 set("short","一間房間"); 或
是其它的寫法