[摳頂] 消影術
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間13年前 (2012/07/09 10:30)推噓2(2推 0噓 8→)留言10則, 3人參與討論串1/5 (看更多)
// _disapparate.c
// 消影術 (我是覺得英文有點長, 可能會用內設 alias disap)
// Laechan@sanc add in 2012/07/09
#define DISAP_TIMES 300
#define DISAP_NUM1 3
#define DISAP_NUM2 2
#define DISAP_SP 10
inherit DAEMON;
int cmd_disapparate(string str,object me)
{
mixed disaps=({}),whos=({}),ppls=({});
int num,i,j,t,w,wiz,no_disap,no_agree;
object env,ppl;
string tmp,names,adv_guild;
if(!str || str=="")
return notify_fail(@LONG
消影術(disapparate)使用說明:
=======================================================
disapparate [數字] 前往你所記憶的地點
disapparate [數字] -with [誰] 帶人前往你所記憶的地點
disapparate -agree 同意施展者帶你一同前往
disapparate -recall 使用消影術回到recall點
disapparate -guild 使用消影術回到法師公會
disapparate -home 使用消影術回到自己的家
disapparate -memo 記憶你目前所在的地點
disapparate -list 觀看目前已經記憶的地點
1.消影術只限大魔導士及秘印賢者使用。
2.消影術可一次攜帶多人,以 , 號分隔,最多帶兩名隊友。
3.消影術目前只開放紀錄部份房間,可指定儲存數字。
5.消影術目前可紀錄三個地點。
6.消影術使用 -recall 模式「不受任何不可recall限制」,
使用 -guild 模式亦同,處於定身等不良狀態除外。
=======================================================
LONG
);
names=me->query("name");
adv_guild=(string)me->query("adv_guild");
if(sscanf(str,"-memo %d",num)==1)
{
if(!wizardp(me) && (adv_guild!="magemaster" && adv_guild!="sage"))
return notify_fail("disapparate: 這個指令只有大魔導士跟秘印賢者"+
"可以使用喔.\n");
if(num<1 || num>DISAP_NUM1)
return notify_fail("disapparate: 數字範圍是 1~"+DISAP_NUM1+" 喔。\n");
env=environment(me);
tmp=file_name(env);
if(sscanf(tmp,"/%s/%d#%d",i,t)==2 && i>0 && i<101)
{
disaps=(mixed)me->query("record_data/disapparate");
j=sizeof(disaps);
if(num<j)
disaps[num-1] = base_name(env);
else
disaps+=({base_name(env)});
me->set("record_data/disapparate",disaps);
return notify_fail("disapparate: 記憶完畢。\n");
}
else
return notify_fail("disapparate: 這個地方不能記憶喔。\n");
}
if(str=="-recall" || str=="-guild")
{
if(!wizardp(me) && (adv_guild!="magemaster" && adv_guild!="sage"))
return notify_fail("disapparate: 這個指令只有大魔導士跟秘印賢者"+
"可以使用喔.\n");
if(me->query_attackers() || me->query_temp("casting")>0)
return notify_fail("disapparate: 你現在在忙,不能消影喔。\n");
env=environment(me);
if(base_name(env)=="/d/wiw/room/disc" ||
base_name(env)=="/d/nmap/klon/room/mage-guild" ||
strsrch(base_name(env),"/skycastle/room/")>0)
return notify_fail("disapparate: 這個地方不能用消影術喔。\n");
if(str=="-home" &&
!file_exists("/u/l/laechan/skycastle/room/"+names[0..0]+"/"+names+"-main.c"))
return notify_fail("disapparate: 你在天空城還沒有家喔。\n");
write("你施展了消影術,瞬間消失於此地。\n");
tell_room(env,me->query("short")+"施展了消影術,瞬間消失於此地。\n",({me}));
// 允許大魔導士及秘印賢者可自任何地方消影回到 recall 處or公會
if(str=="-recall")
me->move_player("/d/wiz/room/disc");
else if(str=="-guild")
me->move_player("/d/nmap/klon/room/mage-guild","SNEAK");
else
me->move_player("/u/l/laechan/skycastle/room/"+names[0..0]+"/"+names+"-main",
"SNEAK");
write("你藉著消影術的力量來到了此地。\n");
tell_room(environment(me),"眼前突然魔光一閃,"+me->query("short")+
"以消影術的力量來到了這裡。\n",({me}));
return 1;
}
if(str=="-list")
{
if(!wizardp(me) && (adv_guild!="magemaster" && adv_guild!="sage"))
return notify_fail("disapparate: 這個指令只有大魔導士跟秘印賢者"+
"可以使用喔.\n");
str="你所記憶的地點有:\n"+
"===================================\n";
whos=(mixed)me->query("record_data/disapparate");
j=sizeof(whos);
for(i=0;i<j;i++)
{
if(catch(env=find_object_or_load(whos)))
continue;
disaps+=({whos[i]});
}
j=sizeof(disaps);
for(i=0;i<j;i++)
{
env=find_object_or_load(disaps[i]);
tmp=env->query("short");
tmp=replace(tmp,"\t","");
tmp=replace_string(tmp,"\n","");
tmp=replace_string(tmp," ","");
tmp=replace_string(tmp," ","");
str+=sprintf("%d.%-s.\n",i+1,env->query("short")+NOR);
}
str+="===================================\n";
return notify_fail(str);
}
if(sscanf(str,"-agree %s",tmp)==1)
{
env=environment(me);
if(!ppl=present(tmp,env))
return notify_fail("disapparate: "+tmp+" 沒有在這個地方喔.\n");
j=(int)me->query_temp("disapparate_"+tmp);
if(j<t)
return notify_fail("disapparate: "+tmp+" 要先 disapparate 你喔.\n");
if(j>30+t)
return notify_fail("disapparate: 你已經同意了 "+tmp+" 的消影邀請了喔.\n");
if(me->query_temp("casting")>0)
return notify_fail("disapparate: 你現在沒空喔.\n");
if(me->query_attackers())
return notify_fail("disapparate: 你現在在戰鬥中,沒空喔.\n");
me->set_temp("disapparate_"+tmp,1000000+t);
write("你伸出手,握住了"+ppl->query("short")+"的手。\n");
tell_object(ppl,HIC"* "+names+" 同意了你的消影邀請。"NOR"\n");
return 1;
}
if(sscanf(str,"%d -with %s",num,tmp)==2)
{
if(num<1 || num>DISAP_NUM1)
return notify_fail("disapparate: 數字範圍在 1~"+DISAP_NUM1+" 之間喔.\n");
whos=(mixed)me->query("record_data/disapparate");
j=sizeof(whos);
for(i=0;i<j;i++)
{
if(catch(env=find_object_or_load(whos)))
continue;
disaps+=({whos[i]});
}
j=sizeof(disaps);
if(num>j)
return notify_fail("disapparate: 數字範圍在 1~"+j+" 之間喔.\n");
if(!wizardp(me))
{
t=time();
if(me->query_temp("disapparate_times")>t)
return notify_fail("disapparate: 你要再等 "+
((int)me->query_temp("disapparate_times")-t)+
" 秒才能再使用消影術喔.\n");
if((int)me->query("sp")<(int)me->query("sp_src")/DISAP_SP)
return notify_fail("disapparate: 你的 sp 至少要剩餘 1/"+DISAP_SP+
" 的量才能使用消影術喔.\n");
}
else
wiz=1;
if(strlen(tmp)>35 && wiz<1)
return notify_fail("disapparate: 你帶太多人了喔.\n");
whos=explode(tmp,",");
w=sizeof(whos);
if(w<1 || (w>DISAP_NUM2 && wiz<1))
return notify_fail("disapparate: 你只能攜帶 1~"+DISAP_NUM2+" 人喔.\n");
env=environment(me);
if(env->query("no_recall") || env->query("no_return"))
{
if(wiz<1)
return notify_fail("disapparate: 這個地方有著特殊力場,無法消影喔。\n");
else
disap=1;
}
foreach(tmp in whos)
{
if(!ppl=present(tmp,env))
return notify_fail("disapparate: 這裡沒有 "+tmp+" 這個人喔.\n");
if(ppl==me)
return notify_fail("disapparate: 你想帶自己消影喔?\n");
if(wiz<1)
{
if(!userp(ppl))
return notify_fail("disapparate: 你只能帶玩家消影喔.\n");
if(!interactive(ppl))
return notify_fail("disapparate: 你不能帶著斷線中的玩家一起消影喔.\n");
if(ppl->query("block_command")>0 or ppl->query_temp("casting")>0)
return notify_fail("disapparate: "+tmp+" 現在的狀態不能消影喔.\n");
if(!ppl->query_temp("leader") ||
(object)ppl->query_temp("leader")!=(object)me->query_temp("leader"))
return notify_fail("disapparate: 你只能帶同隊的隊友消影喔.\n");
if(ppl->query_temp("disapparate_times")>t)
return notify_fail("disapparate: "+tmp+" 才剛剛消影過喔,要等 "+
((int)ppl->query_temp("disapparate_times")-t)+
" 秒才能再消影喔.\n");
}
if((int)ppl->query_temp("disapparate_"+names)<t)
{
tell_object(ppl,HIC"* "+names+" 對你送出了想帶著你一起消影的邀請。\n"+
" 你若同意的話就下 disapparate -with "+names+"。"NOR"\n"+
" (請在 30 秒內完成這個動作)\n");
ppl->set_temp("disapparate_"+names,30+t);
no_agree=1;
}
}
if(no_agree>0)
return notify_fail("");
me->add("sp",-(int)me->query("sp_src")/DISAP_SP);
show(me,me,"$N準備帶著 "+implode(ppls,",")+" 一起消影。\n");
if(disap>0)
{
write("他們問道:這個地方不是不能消影嗎?\n");
foreach(ppl in ppls)
tell_object(ppl,"你問道:這個地方不是不能消影嗎?\n");
ppls+=({me});
tell_room(env,"你心裡覺得奇怪,這個地方不是不能消影嗎?\n",ppls);
}
ppls-=({me});
show(me,me,"只見$N微笑著道:巫師總還是有些特權的 ^_^");
write("你施展了消影術,與 "+implode(whos,",")+" 瞬間消失於此地。\n");
foreach(ppl in ppls)
tell_object(ppl,me->query("short")+"帶著你施展了消影術,你與他"+
"瞬間消失於此地。\n");
ppls+=({me});
tell_room(env,HIC"\n"+me->query("short")+HIC"施展了消影術,與 "+
implode(whos,",")+" 瞬間消失於一道魔法光芒之中!"NOR"\n",ppls);
ppls->move_player(disaps[num-1],"SNEAK");
tell_room(environment(me),"眼前突然魔光一閃,"+me->query("short")+
"以消影術的力量來到了這裡。\n",({me}));
foreach(ppl in ppls)
{
tell_object(ppl,"你藉著消影術的力量,來到了這裡。\n");
ppl->delete_temp("disapparate_"+names);
ppl->set_temp("disapparate_times",t+DISAP_TIMES);
ppl->set("block_command",3);
ppl->set_temp("casting",3);
}
return 1;
}
return notify_fail("disapparate: 沒有 "+str+" 這個語法喔。\n");
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.61.157.53
※ 編輯: laechan 來自: 210.61.157.53 (07/09 14:01)
推
07/09 14:50, , 1F
07/09 14:50, 1F
→
07/09 16:01, , 2F
07/09 16:01, 2F
→
07/09 16:01, , 3F
07/09 16:01, 3F
→
07/09 16:02, , 4F
07/09 16:02, 4F
→
07/09 16:02, , 5F
07/09 16:02, 5F
→
07/09 16:03, , 6F
07/09 16:03, 6F
推
07/09 19:11, , 7F
07/09 19:11, 7F
※ 編輯: laechan 來自: 122.117.7.33 (07/09 21:03)
→
07/09 21:03, , 8F
07/09 21:03, 8F
→
07/09 21:04, , 9F
07/09 21:04, 9F
※ 編輯: laechan 來自: 210.61.157.53 (07/10 10:05)
→
07/10 10:05, , 10F
07/10 10:05, 10F
討論串 (同標題文章)
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章