作者laechan (小太保)
看板mud_sanc
标题[抠顶] _absorb.c
时间Sat Aug 24 09:04:56 2013
// _absorb.c
// Laechan@Sanc add in 2013/08/24
// 魂力吸取 or 魂力吸收 for 链金术士
// 名称,所需点数
// 坚毅水晶, 棱光水晶, 镜像水晶, 强护水晶, 彩虹水晶, 充能水晶
// 减少 CD 时间的水晶, 灌入技能的水晶, 无敌水晶, 钢铁水晶
// 水晶制造除了需要魂力点数外还需要别的东西(一般怪掉落物)
#define CRYSTAL_POINT ({\
"生命水晶",500,\
"续战水晶",\
"牺牲水晶",\
"记忆水晶",\
"自爆水晶",\
"转移水晶",\
"重置水晶",\
"传送水晶",\
})
#define ABSORB_CRYSTAL_TIMES 10
#define ABSORB_NEED_SP 1
inherit DAEMON;
static object vobjs_d;
void help()
{
write(@LONG
absorb(魂力)指令使用说明:
===================================================
absorb crystal list 可制造的水晶列表
absorb crysbal 水晶名 使用魂力点数制造该水晶
absort 对象id 对战斗中的目标使用魂力吸收
这个指令限定职业为链金术士且学会魂力吸收(absorb)技
能值达到 1000 的进阶法师才能使用。
===================================================
LONG
);
int cmd_absorb(string str,object me)
{
int sp,t,i,sk;
string cnames;
mixed tmps;
object tar;
if(!str || str=="")
{
help();
return notify_fail("");
}
if(!vobjs_d)
if(catch(vobjs_d=find_object_or_load("/open/cmds/vobjs_d")))
return notify_fail("absorb: 目前虚拟物品系统出了一点问题,不能使用喔。\n");
if((string)me->query("adv_guild")!="alchemist")
return notify_fail("absorb: 只有链金术士才可以使用这项能力。\n");
sk=me->query("skill/absorb");
if(sk<1000)
return notify_fail("absorb: 你的魂力吸取技能必须达到 1000 才能使用喔。\n");
if(sscanf(str,"crystal %s",cnames)==1)
{
if(cnames=="list")
{
str="可制作水晶 所需点数\n"+
"====================\n";
t=sizeof(CRYSTAL_POINT);
for(i=0;i<t;i=i+2)
str+=sprintf("%-10s%6d\n",CRYSTAL_POINT[i],CRYSTAL_POINT[i+1]);
str+="====================\n你目前的魂力点数: "+
me->query("record_data/absorb_point")+".\n";
return notify_fail(str);
}
if(me->query_attackers())
return notify_fail("absorb: 战斗中,你没空喔...\n");
t=time();
if(me->query_temp("time_record/absorb_crystal_times")>t)
return notify_fail("absorb: 你要再等一下才能再使用这项能力喔。\n");
i=member_array(cname,CRYSTAL_POINT);
if(i==-1)
return notify_fail("absorb: "+cnames+"不能使用这项能力制造喔。\n");
if(me->query("record_data/absorb_point")<CRYSTAL_POINT[i+1])
return notify_fail("absorb: 要制造"+CRYSTAL_POINT[i]+"需要魂力点数 "+
CRYSTAL_POINT[i+1]+" 点喔!\n");
tmps=vobjs_d->vobjs_data("query_array",cnames);
if(sizeof(tmps)<6)
return notify_fail("absorb: 现在还不能制造"+cnames+"喔。\n");
if((int)me->query_vobjs(tmps[0])>=(int)tmps[5])
return notify_fail("obsorb: 你身上的"+tmps[1]+"已经达到携带上限了喔。\n");
me->set_temp("time_record/absorb_crystal_times",ABSORB_CRYSTAL_TIMES+t);
me->vobjs("add",tmps[0],1);
me->add("record_data/absorb_point",-CRYSTAL_POINT[i+1]);
// 加上一些叙述
return notify_fail("absorb: 你消耗 "+CRYSTAL_POINT[i+1]+" 点的魂力点数,"+
"制作出了一颗"+cnames+"。\n");
}
sp=me->query("record_data/absorb_point");
if(sp>=sk)
return notify_fail("absort: 依你现在的魂力吸取技能值,你最多只能储存 "+
sk+" 点魂力点数喔。\n");
if(me->query_temp("casting")>0)
return notify_fail("absorb: 你正在忙喔。\n");
if(!tar=present(str,environment(me)))
return notify_fail("absorb: 这里没有 "+str+" 这个目标喔。\n");
if(wizardp(tar))
return notify_fail("absorb: 这里没有 "+str+" 这个目标喔。\n");
if(userp(tar) || !living(tar))
return notify_fail("absorb: 你不能对 "+str+" 使用魂力吸取喔。\n");
if(!me->query_attackers())
return notify_fail("absorb: 战斗中你才可以使用魂力吸收喔。\n");
if(member_array(tar,(mixed)me->query_temp("ats"))==-1)
return notify_fail("absorb: "+str+" 必须是你战斗的对象你才能使用喔。\n");
sp=((int)me->query("sp_src")/100)*ABSORB_NEED_SP;
if(me->query("sp")<sp)
return notify_fail("absorb: 你的剩余 sp 不足 "+ABSORB_NEED_SP+"% 了喔。\n");
me->add_temp("casting",1);
me->add("sp",-sp);
// 计算成功率
// 1.有基本成功率值
// 2.技能值越高,成功率越高
// 3.越多只,成功率越低
// 4.等级越高,成功率越低
// 5.道德值设定越低的怪物,成功率越高
// 5.BOSS、no_absorb 怪物无法被吸收
// 吸收成功得到魂力点数, 只数, 等级, 额外魂力点设定, ..
// 跟只数只会有一点点关系,主要是等级差,采除法分配
sp=tar->query("member");
sp=1+random(sp);
sp=
me->add("record_data/absorb_point",sp);
// 被吸收魂力值的怪物会阵亡
cnames=tar->query("chi_name");
tar->die();
return notify_fail("absorb: 你成功\吸取了"+cnames+"的 "+sp+" 点魂力点数!\n"+
" 你现在的魂力点数为 "+
me->query("absorb_point")+" 点。\n");
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
1F:→ laechan :嘛..大致是这种感觉.. 08/24 10:01
※ 编辑: laechan 来自: 1.165.174.133 (08/24 20:25)