作者laechan (小太保)
看板mud_sanc
标题[wizs] return spell 原始码
时间Wed Oct 3 10:56:23 2012
不只 wiz,玩家也可以参考。
// Norr 新增防止用归还带新手出村 in 2012/04/05
// Laechan@Sanc re-write 技能档 in 2010/05/09
// 归还魔法(return spell)
// Laechan add in 2000.05.17 for 最终版牧师
// Norr 新增限制 in 2010.04.26
#define PARTY_D "/adm/daemons/party_d.c"
#define RETURN_TIMES 10
#define NEXT_RETURN_TIMES 30 // 减半施展成功後的再使用时间
#define FAIL_RETURN_TIMES 5
#define CLERICAL_GUILD "/d/map/isalon/clerical-guild"
inherit "/d/spell/spell_d.c";
int start_skill(object tar,int lv)
{
object ppl;
string str,skname;
int dt,tt;
skname=skill_name("return spell");
ppl=this_player();
tt=time();
if(ppl->query_temp("time_record/returning")>tt)
{
write("你现在还不能再次使用归还术、你必须等一下喔。\n");
return 0;
}
/*
if((string)ppl->query("pri_guild")!="clerical")
{
write("只有正职的牧师,才有使用"+skname+"唷!\n");
return 0;
}
*/
if(!ppl->query_temp("clerical heart"))
{
write("施展"+skname+"之前必须先 heart clerical 喔。\n");
return 0;
}
if(!ppl->query_temp("heal_time/pray"))
{
write("施展"+skname+"之前必须先 cast pray 喔。\n");
return 0;
}
// 状况 1 : 单人无组队及跟随队伍的情况,「单人归还牧师公会」
// 成功率与房间设定几级以上才可归还有关
// 如房间 set("no_return",10), 则只有 11 以上(含)才能成功
// Lv max 归还术完全可成功
if(!ppl->query_temp("leader"))
{
str=ppl->query("adv_guild");
switch(str)
{
case "maily":
show(ppl,tar,"$N缓缓念着:"HIW"藉助麦理之力,让我的身体、我的心,"+
"幻化成风吧!"NOR);
break;
case "marfa":
show(ppl,tar,HIW"$N"HIW"缓缓地祈祷着:大地之母玛法呀,以您伟大的神力,"+
"将我带至远方吧!"NOR);
break;
case "faris":
show(ppl,tar,"$N缓缓念着:"HIW"至高神圣之神法理斯呀,回应我的祈祷,"+
"将我带离此地吧!"NOR);
break;
default:
show(ppl,tar,"$N缓缓念着:"HIW"藉助伟大的神力,让我的身体、我的心,"+
"幻化成风吧!"NOR);
break;
}
show(ppl,tar,HIW"\n$N的身体泛起一阵白色的柔和光芒..."NOR"\n");
dt=RETURN_TIMES-((int)ppl->query("skill/clerical heart")/990);
ppl->set_temp("cast_return_location",environment(ppl));
if(dt<1)
call_out("start_return",1,ppl,lv,1);
else
{
ppl->set_temp("time_record/returning",tt+dt);
call_out("start_return",dt,ppl,lv,1);
}
return 1;
}
// 状况 2 : 牧师自组队、或跟随组队的情况
show(ppl,tar,"$N缓缓念着:"HIW"神圣的光芒啊..回应我的祈祷,"+
"带领吾人离开此地吧!\n\n"+
"一道柔和的白色光柱洒落此地,准备带走$N们..."NOR"\n");
dt=RETURN_TIMES*2-((int)ppl->query("skill/clerical heart")/990)-
((int)ppl->query("skill/bless")/990);
ppl->set_temp("cast_return_location",environment(ppl));
if(dt<5) dt=5;
ppl->set_temp("time_record/returning",tt+dt);
call_out("start_return",dt,ppl,lv,2);
return 1;
}
int start_effect(object target,object ppl,int lv,int skill,int times)
{
return 1;
}
int start_return(object ppl,int lv,int check)
{
object env,leader,env2,ob;
string msg;
int cost,t,p,num;
mixed party;
if(!ppl) return 1;
if(!interactive(ppl)) return 1;
ppl->delete_temp("time_record/returning");
env=environment(ppl);
if(!env || (env && (object)ppl->query_temp("cast_return_location")!=env))
{
write(HIR"本次归还失败,因为天神在你当初施展归还术的地方找不到你唷。\n"NOR);
return 1;
}
if(living(env))
{
write(HIR"在生物的体内是不能施展归还术的喔.\n");
return 1;
}
if(lv<30 && lv<=(int)env->query("no_return"))
{
t=(int)env->query("no_return");
msg=HIB"这个地方有着"+chinese_number(t)+"重的魔法力场,";
switch(ppl->query("adv_guild"))
{
case "maily":
show(ppl,ppl,msg+"麦理无法听到$N的归还祈求。"NOR"\n");
break;
case "marfa":
show(ppl,ppl,msg+"玛法无法听到$N的归还祈求。"NOR"\n");
break;
case "faris":
show(ppl,ppl,msg+"法理斯无法听到$N的归还祈求。"NOR"\n");
break;
default:
show(ppl,ppl,msg+"神无法听到$N的归还祈求。"NOR"\n");
break;
}
return 1;
}
cost = 5000-(int)ppl->query("skill/return spell")+lv*1000; // 耗魔量
if(cost<3000) cost = 3000;
// 单人归还的情况
if(check==1)
{
tell_room(env,HIW+ppl->query("chi_name")+
HIW"的身体逐渐消失在光芒之中。"NOR"\n",({ppl}));
ppl->move_player("/d/wiz/room/disc","SNEAK");
tell_object(ppl,HIW"你藉着归还术的力量,来到了这个地方。\n"NOR);
ppl->add_3p("sp",-cost,-cost);
ppl->set_temp("time_record/returning",time()+NEXT_RETURN_TIMES);
return 1;
}
// 多人归还的情况
if(!leader=ppl->query_temp("leader"))
{
write("你的队伍所属的队长不见踪影,你无法在身处於队伍的情况中使用归还术。\n"+
"若你要单独使用归还术的话,请先退出队伍(party leave).\n");
return 1;
}
// party 包含队长自己
party=(mixed)find_object_or_load(PARTY_D)->query_members(leader);
num=PARTY_D->party_number(ppl);
if( num < 0 || !party)
return notify_fail(HIR"你的队伍里面没有半个人唷!\n"NOR);
// 先检查与该牧师同队的玩家
foreach(ob in party)
if(ob && environment(ob) && environment(ob)==env)
p++;
if(p==1) // 代表虽然牧师跟队或自组队, 但跟牧师同房间的队员只有牧师自己
check=100;
else
{
// 读取 leader 的 leadership 影响
if(leader)
p=(int)leader->query("skill/leadership")/50;
if((string)ppl->query("adv_guild")=="marfa")
check=60+(lv*(int)ppl->query("skill/bless"))/7500;
else if((string)ppl->query("adv_guild")!="")
check=40+(lv*(int)ppl->query("skill/bless"))/7500;
else
{
// 没有进阶的情况 bless max 5000, 5000/300 < 18
// 这时最高成功率 9900/200 + 17.x < 70%, 再藉 leader 之力
// 最高 6x + 30 < 100%, 但一般主职牧师通常 clerical heart
// 都不会满, 所以成功率更低, 没有 heart clerical 更低
if(ppl->query_temp("clerical heart"))
check=lv+(int)ppl->query("skill/clerical heart")/200+
(int)ppl->query("skill/bless")/250;
else
check=lv+(int)ppl->query("skill/bless")/250;
}
check=check+p;
}
if(check<1+random(100))
{
write("你本次的归还失败了!可能你没有用力对神祈祷的缘故。\n"+
"你可以再试一次看看唷!\n");
ppl->add_3p("sp",-cost,-cost);
ppl->set_temp("time_record/returning",time()+FAIL_RETURN_TIMES);
return 1;
}
// 状况 1. leader 在此地, 与 leader 一起归还到 recall 处
if(leader && environment(leader)==env)
{
foreach(leader in party)
{
if(leader && environment(leader) && environment(leader)==env)
if(!leader->query("record_data/newbie_check")) // 去除新手
{
tell_object(leader,HIW"自地面出现了光之魔法阵,将你传送至远方。\n"NOR);
leader->move_player("/d/wiz/room/disc","SNEAK");
tell_object(leader,"你藉着归还术的力量,来到了这个地方。\n");
}
}
ppl->set_temp("time_record/returning",time()+NEXT_RETURN_TIMES);
return 1;
}
// 状况 2. leader 不在此地, 将房间所有的队员归还到队长所在之处
if(!leader || (leader && !env2=environment(leader)))
{
write("神找不到你的队伍所属的队长或是该队长的所在地喔。\n");
return 1;
}
if(env2 && living(env2))
{
write("你的队长所在的地方是在生物的体内,无法用归还术进到那里喔!\n");
return 1;
}
if(lv<30 && lv<=(int)env2->query("no_return"))
{
check=(int)env2->query("no_return");
msg=leader->query("name");
msg=HIB+msg+" 所在的地方有着"+chinese_number(check)+"重的魔法力场,";
switch(ppl->query("adv_guild"))
{
case "maily":
show(ppl,ppl,msg+"麦理无法听到$N的归还祈求。"NOR"\n");
break;
case "marfa":
show(ppl,ppl,msg+"玛法无法听到$N的归还祈求。"NOR"\n");
break;
case "faris":
show(ppl,ppl,msg+"法理斯无法听到$N的归还祈求。"NOR"\n");
break;
default:
show(ppl,ppl,msg+"神无法听到$N的归还祈求。"NOR"\n");
break;
}
return 1;
}
msg=base_name(env2);
foreach(leader in party)
{
if(leader && environment(leader) && environment(leader)==env)
if(!leader->query("record_data/newbie_check")) // 去除新手
{
tell_object(leader,HIW"自地面出现了光之魔法阵,将你传送至远方。\n"NOR);
leader->move_player(msg,"SNEAK");
tell_object(leader,"你藉着归还术的力量,来到了这个地方。\n");
}
}
ppl->set_temp("time_record/returning",time()+NEXT_RETURN_TIMES);
return 1;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.61.157.53