Re: [wizs] 問題請教(二十三)

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間14年前 (2011/06/12 07:29), 編輯推噓2(202)
留言4則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《amosdeus (幽素)》之銘言: : int i,r,j,l,time; : object ppl,ob=this_object(),room; : mixed usr; : ppl = this_player(); : room = environment(ob); // 加底下這個判斷 if(userp(room)) return 1; : usr = all_inventory(room); : //usr = ppl->query_temp("ats"); : r = random(3); : time = query("S_R/time"); //移除計時 : if(!ob) time = time / 2; //使用者不在時間減少 : if( time < 1) : { : write(CYN"運轉四時劍陣的已經能源消耗完畢,劍陣一並崩然潰散。\n"NOR); : remove(); : } : else : set("S_R/time",time-1); 這個判斷可以往前挪. 另外 remove() 下方要 return 1; 因為 ob=this_object(), 若 ob->remove() 程式就應停止 : foreach(ob in usr) : { : if(userp(ob)) : { : if(!ob) continue; : if(ob->query("no_attack")) continue; : if(!ob->query("ats")) continue; 要知道玩家有無攻擊對象, 有兩種判斷方式 if(ob->query_attackers()) 代表若 ob 有攻擊對象 if(ob->query_current_attacker()) 代表若 ob「有正要攻擊的那個對象」 一般用第一個就行了。直接讀玩家的 ats 跟使用函數讀法的差異, 在於 ats 有可能為 ({ 0 }) 這樣的東西 = 實際上攻擊的對象已經 消失, 使用函數讀取時它判斷到 ({ 0 }) 會先移除. : switch(r) : { : case 0: : ppl->shut(HIM"\n\n$N【春之迷濛】->$O"NOR,11111,11111,({"dam","physics",2}),ob); : break; : case 1: : ppl->shut(HIM"\n\n$N【夏之驕蹇】->$O"NOR,11111,11111,({"dam","physics",2}),ob); : break; : case 2: : ppl->shut(HIM"\n\n$N【秋之纍綬】->$O"NOR,11111,11111,({"dam","physics",2}),ob); : break; : case 3: : ppl->shut(HIM"\n\n$N【冬之離葬】->$O"NOR,11111,11111,({"dam","physics",2}),ob); : break; : } : } : else : i++; : } : if(i==sizeof(usr)) : { : delete("callouting"); : remove_call_out("room_check_poison"); : return 1; : } : call_out("room_check_poison",2); //兩回合攻擊一次 : return 1; : } : int disband(string str) : { : object ppl = this_player(); : if(!str || str == "" ) return notify_fail("什麼?\n"NOR); : if(str!="range") return notify_fail("你是要解除劍陣嗎?(disband range)\n"NOR); : if((string)ppl->query("name")!=query("name")) : return notify_fail("你並不能控制這座劍陣。\n"NOR); : command("drop all"); //drop沒反應 要改別的方式 : write("你解除四時劍陣了.\n"); : remove(); : return 1; : } : 問題一: : 請問要怎樣讓 劍陣 在每一次 call_out("room_check_poison",2); : 都能讀取到 使用者 正在攻擊的敵人 ppl->query_temp("ats"); : 讓 ppl->shut(HIM"\n\n$N【春之迷濛】->$O"................ : 能夠使用; : 或者是 讓 劍陣 讀取到 使用者 的攻擊敵人參數 : 然後再用直接扣血的方式(但是要做抗性判斷,跟屬性閃避的判斷) : 還要考慮玩家先布下劍陣時在進行戰鬥。 : 問題二: : //增加劍法類的攻擊威力。 : //從slash的指令或是劍法的技能檔增加讀取到劍陣便增加攻擊力 : slash的檔案可以在哪裡看到,另一個構思中的技能:飛劍 也用得到 /cmds/std/_slash.c 以及 /d/slash/*.c slash指令已經cp 一份到你的目錄 ~plain/_slash.c, /d/slash 則應該有對你開放可讀權限. 因為你的劍陣是實體物品,只要設定特殊 id 跟參數, 就可以用 present 的方式去 check. : 飛劍的攻擊與數量: : 一: : 只招換出一隻 飛劍 增加攻擊次數一 : 比如 "四時劍法" 攻擊次數為四,在讀取到飛劍參數後攻擊加一,變 : 成攻擊次數為五。 這個就依劍法的不同,自行決定做法即可。個人比較建議先讓 所有劍法都先 inherit 同一個 /d/slash 下的樣本繼承檔 (該樣本繼承檔則 inherit DAEMON;) 這樣你做相關修改才會比較方便. 不然根據經驗, 要一個一個 改技能檔, 容易有出錯的風險. : 二: : 可由 "劍士之心" 或是 "氣勁(air)" 除於三千最多能,同時有三把飛 : 劍(這部分由撰寫者決定)。 : 這裡的原則是一的情況下可以達到原攻擊的八九成,二的情況下飛劍隻 : 數多攻擊力就要下降。 : 直接從指令作修改比較快,修改劍類技能就比較麻煩也占記憶體。 : 以上 謝謝 : Plain@Sanc 重點在於你構想中的「多一劍」的實際執行形式為何,例如「 若大劍技+飛劍」時又是怎樣的呈現方式? 如果是我的話在不改技能檔的情況下只改指令檔也是可以的. // _slash.c 已經先 call 劍法去施展出攻擊了 if(ob=present(特殊id,所處環境)) if(ob->query(特殊參數)) 或 if(ob->check_劍陣_是可運作中的()) ob->ppl_is_slashing(ppl,玩家施展的劍法,幾級,攻擊對象是誰); return 1; // ob檔 int ppl_is_slashing(object ppl,string skillname,int lv,object tar) { switch(skillname) { case "4-season slash": ppl->shut(四時相關敘述,傷害,命中,({xx}),tar); break; case "crack slash": ... . . . } } 這應該是不必動到技能檔本身的比較簡易的修改方式。 Belldandy. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.253.168.79

06/12 08:46, , 1F
看到這個....原來ghost的招式還是會有問題...amem
06/12 08:46, 1F

06/12 09:20, , 2F
改以上寫法在側看看吧..avert
06/12 09:20, 2F

06/13 20:26, , 3F
norr你少改一隻....封魔的devil.c
06/13 20:26, 3F

06/15 00:09, , 4F
有改道吧?
06/15 00:09, 4F
文章代碼(AID): #1Dy_e-2p (mud_sanc)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Dy_e-2p (mud_sanc)