[wizs] 魔法陣樣本

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間14年前 (2011/06/07 11:46), 編輯推噓0(007)
留言7則, 1人參與, 最新討論串1/1
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

06/07 11:47, , 1F
原則上假設玩家 spell fire, 那在 fire.c 裡頭有一行
06/07 11:47, 1F

06/07 11:48, , 2F
if(ppl->query_temp("mc_effect")>time())
06/07 11:48, 2F

06/07 11:48, , 3F
if(mc=present("魔法陣特殊id",environemnt(ppl)))
06/07 11:48, 3F

06/07 11:48, , 4F
if(該魔法陣為法術增幅魔法陣)
06/07 11:48, 4F

06/07 11:48, , 5F
執行法術增幅;
06/07 11:48, 5F

06/07 11:49, , 6F
也就是說用 mc_effect 先當做前置判斷,好處在於後面
06/07 11:49, 6F

06/07 11:49, , 7F
負荷較重的 mc=present( .. 就可以晚一點才做
06/07 11:49, 7F
※ 編輯: laechan 來自: 117.19.205.81 (06/08 16:41) ※ 編輯: laechan 來自: 115.82.222.131 (06/13 11:14)
文章代碼(AID): #1DxPydJG (mud_sanc)
文章代碼(AID): #1DxPydJG (mud_sanc)