※ 引述《hmml (hmml)》之銘言:
: 反擊如果是最後一擊,系統會這樣判斷死因:
: (發狂)賢者天尊經過了一番苦戰,終於殺死賢者天尊
: 在這區域而言,這樣的結果最無言,徒勞無功。而
: 這個任務,解謎者必須自行解決六位NPC,才能迎
: 戰最終頭目,上面這位天尊是第六位...
: 除非純正法牧,我想沒反擊技能的角色應該沒有,
: 所以解謎的時候,有很大的機率會因反擊而失敗。
: 事實上,這個謎還蠻容易解失敗的,因為反擊。
: 過去因為法牧盾的阻擋順位在反擊前面,所以有辦
: 法避免。現在就無計可施了。結果要解這個謎,運
: 氣成份變很大,而最終頭目的掉裝也是隨機的,也
: 就是拿裝難度爆增。如果玩家像我天生就帶衰,常
: 常不能像關二爺般過五關斬六將(事實上有,但NPC
: 一直堅持是自殺...),解謎興致難免大減,那就只
: 好練個人成就,相對地,就會很安靜...
: 所以對於反擊,能不能做個指令來開關反擊,或者
: 和attack stop/rescue做在一起,好讓解謎的不安
: 因素能少一點,至少在反擊判斷解決前,有一個應
: 對措施...
反擊不可能特地寫成「反擊如果是最後一擊,會變成怪
物殺死自己」。因為這樣變成戰鬥中需要兩個判斷..
if(是最後一擊)
怪物攻擊自己;
else
玩家攻擊怪物;
================================================
反擊的相關程式段如下,如果玩家此時被怪物攻擊,tar
就是指玩家(被攻擊對象才會判斷到下面)。
case "counter": 當某一輪攻擊 tar 判斷自己應施展反擊
if(tar && userp(tar))
tar->set_special_attack(({"\n$N抓到了機會,將$O對$N的攻勢反擊了回去",
dam2,me}));
return ({0,",但是被$O抓到了反擊的機會!"});
重點是上面標粉紅的部份,如果被攻擊目標是玩家時,
該玩家才會把反擊資訊寫進自己的資料裡頭.
而 special_attack 則是這樣判斷的..
void dump_special_attack()
{
mixed sa,tmps;
if(!temp_data["special_attacks"]) return ;
sa=(mixed)temp_data["special_attacks"];
foreach(tmps in sa)
if(tmps[2])
me->shut2((string)tmps[0],(int)tmps[1],1000,"dam",tmps[2]);
// 採用底下的 delete 方式可以給予極短時間的保險性處理延遲
me->delete_temp("special_attacks");
}
tmps[2] 就是「攻擊玩家的人」,tmps[0]是反擊敘述,
tmps[1] 是傷害值,me = 玩家自己,所以變成..
玩家->shut2(敘述,傷害,命中,"dam",攻擊玩家的人);
然後 shut2 是這樣寫的..
varargs int shut2(string msg,int damage,int chance,string kind,object tar)
{
USER_D-> shut2(me, msg, damage, chance, kind, tar);
}
user_d 裡頭則是這樣寫的..
varargs int shut2(object me,string msg,int damage,int chance,
string kind,object tar)
{
if(!tar)
if(! tar=me->query_current_attacker())
return 1;
"/adm/daemons/shut2_d"->shut_tar(me,tar,msg,damage,chance,kind);
return 1;
}
如果攻擊對象不存在、且也找不到攻擊自己的其它攻擊對象,
就不做 shut2。
shut_tar 的順序則是 (玩家, 攻擊玩家的怪物, ...)
嘛,這裡我可以加一個判斷,怪物自己殺死自己時是這樣
shut_tar(怪物,怪物)
正常則是這樣
shut_tar(玩家,怪物)
而因為只有玩家可以用 shut2,所以這樣判斷就好
if(userp(me)) // 只有玩家反擊怪物才會呼叫
"/adm/daemons/shut2_d"->shut_tar(me,tar,msg,damage,chance,kind);
該設定已實裝,可以再觀察看看。若是再不行,我就一一修
改會出現這類問題的怪物的 die 函數。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 223.142.187.191