[wizs] return spell 原始碼
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間13年前 (2012/10/03 10:56)推噓0(0推 0噓 0→)留言0則, 0人參與討論串1/2 (看更多)
不只 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
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章