作者laechan (小太保)
看板mud_sanc
标题[wizs] 怪物掉落物系统
时间Sat Jan 17 15:23:20 2009
主档: /adm/daemons/mob_drop.c
(实际档案已经移到 /u/h/highelf/mob_drop.c)
#define MOB_DROP_PATH "/d/obj/mob_drop/"
#include "mob_drop.h"
/d/obj/adm 下有 d_master.c 档,所有 wiz 都会有自己的目录权限
,例如 quest 的就是 /d/obj/mob_drop/quest。
目前 highelf 拥有该目录的主设定权。
mapping setting_data_ob=([]);
在 mob_drop.c 里头有一个 setting_data_ob 资料,这东西跟上面
的 mob_drop.h 里头定义的 setting_data 是相关的。
:::::::::::::: /u/h/highelf/mob_drop.h ::::::::::::::
#define setting_data ([\
"
/d/crazy/1/mob":"
laechan/crazy1",\
])
上面的意思就是,只要怪物的档名是「
/d/crazy/1/mob」开头的话,
该怪物在阵亡时会掉落什麽物品,就由「/d/obj/mob_drop/
laechan/crazy1.c」
来控制。
它的好处就是,因为很多 wiz 都会自订掉落物控制档,依照目录名
来分的话就不会去设到别人的,而且同一目录的怪物也几乎等於同一
区域的怪物(所以这里就可勾勒出,若未来移怪物到 /area 下,其分
类方式也应该按照 /area/mob/大陆/区域名/ 来分)
而 /d/obj/mob_drop/laechan/crazy1.c 只要被载入,就会自动存到
setting_data_ob 里头去,储存方式就是...
setting_data_ob["/d/obj/mob_drop/laechan/crazy1.c"] = crazy1物件
比方玩家开始杀这区域的第一只怪,这时 setting_data_ob 就储存了
crazy1.c 物件,等玩家杀第二只怪时,系统就可以本地读这个物件,
不用另外再去 find_object_or_load。
在 mob_drop.c 里头只有一个函数 mob_drop...
varargs void mob_drop(object ppl,object mob,string check)
ppl : 杀死怪物的玩家
mob : 被杀的怪物
check : 节庆判断(varargs 针对的就是这个参数的可给可不给)
节庆的部份稍後再说。
mob_drop 函数会做几件事...
一、先读出 mob 这个怪物所在的目录名
(我觉得这个有必要写成 simul_efun...)
二、判断该目录有没有被定义在 setting_data 中,例如上面的例
子,七域第一层的怪物若阵亡时,mob_drop 就会判断到七域
第一层这个目录有被定义。
三、如果有定义在 setting_data 中,就去读相对的 setting_data_ob
,然後让该 ob->mob_drop_check(ppl,files,check)
若没有定义,就不做任何事
四、最後判断节庆的部份
节庆的判断有两种,一种是「全域式」的,不管打死什麽怪物
都会做节庆判断,另一种是「限定区域式」的,在特定节庆只
有打死特定目录的怪才会做节庆判断。
所以三的部份才会把节庆参数也一并传过去。
例如说,我们设定在新年的时候打怪,会有 20% 的机率拿到红
包袋,若没拿到就执行原先的掉落设定,这时..
switch(check)
{
case "newyear":
if(random(100)<20)
{
add_user_vobjs(ppl,"laechan_newyear_redbag",1);
add_vobjs_msg(ppl,"laechan_newyear_redbag",1); // 这两个可并在一起
break;
}
ob->mob_drop_check(ppl,files,check); // 改执行原先的判断
break;
.
.
}
这样的话,「打死任何怪」,就有 20% 的机率先判断能不能拿到
红包袋,不行的话就做原先的掉落设定,这时候原先的掉落物的
掉落机率就通通都要再打八折。
而上面的好处就是也可以针对「特定几个目录的怪物」来做节庆
相关判断,所以实际上 ob->mob_drop_check 时是不需要传节庆
相关参数过去的。(但有也无妨,以方便 wiz 为主)
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: laechan 来自: 220.131.225.67 (01/17 15:57)