[摳頂] 消影術

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間13年前 (2012/07/09 10:30), 編輯推噓2(208)
留言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
希望到明天可以寫完,整個指令檔蠻長的(if很多)
07/09 16:03, 6F

07/09 19:11, , 7F
這..這不就是巫師在用的goto 的全體版嗎?..avert
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
或者不要加入鄧不利多講過的那句話XD
07/09 21:04, 9F
※ 編輯: laechan 來自: 210.61.157.53 (07/10 10:05)

07/10 10:05, , 10F
寫完了, 來玩看看.(得先 debug 一堆)
07/10 10:05, 10F
文章代碼(AID): #1F-a9VPm (mud_sanc)
討論串 (同標題文章)
文章代碼(AID): #1F-a9VPm (mud_sanc)