作者laechan (小太保)
看板mud_sanc
标题[wizs] 魔法阵样本
时间Tue Jun 7 11:46:43 2011
inherit MONSTER;
void create()
{
set("level",对应级数);
set("race","无生物");
::create();
seteuid(getuid(this_object()));
/* 基本设定区 */
set("id",({"magic_cycle",其它}));
set("no_attack",1);
set("no_attack_msg","你不能攻击它喔.\n");
set("user",1);
/* 其它设定区 */
set("id",({魔法阵id}));
set("short","魔法阵short");
set("long","魔法阵long");
set_living_name("magic_cycle");
set_name("魔法阵的name");
set_verbs(({"打向","搥向"}));
}
// 由 set_heart_beat 触动
int heart_beat(int i)
{
int t=time();
mixed obs;
object env,cloner;
env=environment(this_object());
if(t>(int)query("clone_times"))
{
tell_room(env,query("short")+"消失了。\n");
remove();
}
obs=all_inventory(env);
foreach(env in obs)
if(env && userp(env))
env->set_temp("mc_effect",2+t);
// 有上述参数的人才会启动魔法阵相关判断
// 而理论上,魔法阵消失後 1~2 秒,效果还可能会存在
return 1;
}
void init()
{
// 依照不同的功能设定不同的 add_action()
int lv=query("level");
switch(lv)
{
case 1: add_action("spells_xxx","spells");
}
}
int spells(string str)
{
object ppl,spell;
string sname;
int num,sp,k,t;
if(!str || str=="")
return notify_fail(@LONG
spells(攻击法术练习)指令说明:
===================================================
spells 连击数 法术名称 (如 spells 50 fire)
1.目前可用来练习的法术为 fire spell、ice spell、
thunder spell、wind spell、earth spell、
light spell。
2.可施放的连击数最大为 你目前的mag属性值/100。
3.连击数越高,消耗的sp值越高,但是成功施放出来的话
得到的熟练度越高。
===================================================
LONG
);
ppl=this_player();
if(ppl->query_temp("casting")>0)
return notify_fail("spells: 你要等一会儿喔.\n");
t=time();
if(ppl->query_temp("time_record/magic_cycle_lv1_times")>t)
return notify_fail("spells: 你要等一会儿喔.\n");
if(ppl->query_attackers())
return notify_fail("spells: 你不能在战斗中喔.\n");
if(sscanf(str,"%d %s",num,sname)==2);
else
return notify_fail("语法: spells 连击数 法术名称.\n");
if(sname!="fire" && sname!="ice" && sname!="thunder" &&
sname!="wind" && sname!="earth" && sname!="light")
return notify_fail("请下 spells 指令观看使用说明喔.\n");
str=sname;
sname=sname+" spell";
if(ppl->query("skill/"+sname)<100)
return notify_fail("spells: 你的 "+sname+" 技能值至少要有 100 喔.\n");
if(num<1 || num>99)
return notify_fail("spells: 你一次只能击出 1~99 发的法术喔.\n");
if(num>(int)ppl->query("stat/mag")/10)
return notify_fail("spells: 你最多一次只能击出 "+
(int)ppl->query("stat/mag")/10+" 发的法术喔.\n");
if(!ppl->query_temp("magic heart"))
return notify_fail("spells: 你在练习法术的时候必须先 heart magic 喔.\n");
// 计算 sp 消耗量以及再施展时间
// 连击数过高时虽然有可能击出, 但再施展时间会拖长
sp=ppl->query("sp");
k=ppl->query("skill/magic heart");
if(k>5000) k=5000;
k=k/50;
k=1+k*num*num*(200-k)/200;
// 过度消耗法力
if(k>(sp*11)/10)
{
k=40;
ppl->set("sp",1);
}
else if(k>sp)
{
k=15;
ppl->set("sp",1);
}
else
k=1+num/10;
ppl->set_temp("casting",k);
ppl->set_temp("time_record/magic_cycle_lv1_times",k+time());
spell=find_object_or_load("/d/spell/"+str);
spell->start_skill(this_object(),(int)ppl->query("skill/"+sname)/100);
show(ppl,this_object(),"$N对着$O大喊:"+skill_name(sname)+" "+num+"连发!");
call_out("magic_cycle_lv1",2,ppl,sname,num);
return 1;
}
int magic_cycle_lv1(objetc ppl,string sname,int num)
{
if(!ppl) return 1;
if(environment(ppl) != environment(this_object())) return 1;
num=1+(num*num)/10+random(num);
num=1+num/10; // <= 暂时加进去
ppl->improve_skill(sname,num);
show(ppl,this_object(),"$N对着由魔法阵设下的障壁击出了 "+num+" 发的"+
skill_name(sname)+"!\n"+
"只见自障壁反射出的魔法光芒,如同烟火一般照亮了半个天空。"NOR);
return 1;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 115.83.14.146
1F:→ laechan :原则上假设玩家 spell fire, 那在 fire.c 里头有一行 06/07 11:47
2F:→ laechan :if(ppl->query_temp("mc_effect")>time()) 06/07 11:48
3F:→ laechan : if(mc=present("魔法阵特殊id",environemnt(ppl))) 06/07 11:48
4F:→ laechan : if(该魔法阵为法术增幅魔法阵) 06/07 11:48
5F:→ laechan : 执行法术增幅; 06/07 11:48
6F:→ laechan :也就是说用 mc_effect 先当做前置判断,好处在於後面 06/07 11:49
7F:→ laechan :负荷较重的 mc=present( .. 就可以晚一点才做 06/07 11:49
※ 编辑: laechan 来自: 117.19.205.81 (06/08 16:41)
※ 编辑: laechan 来自: 115.82.222.131 (06/13 11:14)