如果要自由度高一點, 原則上就是讓所有的影響都由撰寫的
wiz 自定, 系統僅支援呼叫物件的部份。
例如你自訂一個 control room 在你的區域..
~plain/area/xxx/room/poison_room.c
======================================================
inherit ROOM;
void special_effect(object ppl)
{
// 這裡可做一些限定, 底下是範例
if(!environment(ppl)) return ;
if(ppl->query_temp("plain_check")) return ;
tell_object(ppl,HIM"你中毒了!!!(10000)"NOR"\n");
ppl->add("hp",-10000);
if(ppl->query("hp")<1)
ppl->die();
}
然後在系統檔中設定一個定期呼叫的函數...
void check_special_effect(object ppl)
{
mapping effobs;
string keys_ob;
object ob;
// 原則上, 玩家若選擇 quit, 應清除一切的影響
if(!effobs=(mapping)ppl->query_temp("special_effect")) return ;
foreach(keys_ob in keys(effobs))
{
if(!ob=effobs(keys_ob)) continue;
ob->special_effect(ppl);
}
return ;
}
然後在玩家檔中設定一些函數...
void remove_special_effect(object ppl,string keys_ob)
{
if(!ppl) return ;
if(!ppl->query_temp("special_effect/"+keys_ob)) return ;
ppl->delete_temp("special_effect/"+keys_ob);
return ;
}
void add_special_effect(object ppl,string keys_ob,object ob)
{
if(!ppl) return ;
if(ppl->query_temp("special_effect/"+keys_ob)) return ;
ppl->set_temp("special_effect/"+keys_ob,ob);
return ;
}
它的概念跟護盾很像, 當玩家有護盾而怪物攻擊玩家時,攻擊函數
會去判斷護盾存不存在,若存在,就由護盾物件去做實際的攻擊抵
擋判斷。
所以理論上我們同樣可以設計一個物件,它專門用來判斷玩家在一
定時間內會受的影響。
但理論上較佳的寫法是,讓同一個物件就能支援該區域所有的特殊
影響,這是比較佳的寫法,我已經有底了。
總之,你們可以先試著寫寫看那個 control_room, 並且為每一種
影響設定函數,底下是例子..
~plain/area/xxx/room/control.c
===========================================================
inherit ROOM;
int plain_poison_effect(object ppl)
{
...
}
int plain_stat_effect(object ppl)
{
...
}
.
.
.
也就是每一種影響,它們的函數名各不相同,但是開頭必須有 wiz
識別名。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.114.48.43