※ 引述《laechan (小太保)》之銘言:
: 推 bahatest :仇恨值?挑釁?OT? 06/13 14:26
: 推 hermis :太複雜了我看不懂@@||| 06/13 15:49
以怪物的 query_current_attacker 為例..
/std/mob/living.c
object query_current_attacker()
{
int i,r;
object current_tar;
// temp_data["ats"] = 與怪物處於戰鬥狀態的所有物件(一般是玩家群)
// 下面的意思就是若與怪物處於戰鬥狀態的物件數>0, 代表戰鬥中
if(i=sizeof(temp_data["ats"]))
{
// 先扣掉集合中為 0 的, 會有 0 的原因, 例如瞬間的 recall, quit, 斷線, ..
temp_data["ats"]-=({0});
// 再重覆一次判斷
if(i=sizeof(temp_data["ats"]))
{
// 跑出隨機數
r=random(i);
// 如果怪物要攻擊的目標-玩家A, 它身上有 temp_data["current_attacker"]
// 時, 就指定實際要攻擊的目標為這個 current_attacker
// (一般情況下 current_attacker = 自己, 這是 default 值)
if(current_tar=(object)temp_data["ats"][r]->query_temp("current_attacker"))
{
// 而且這個 current_attacker 不是自己時才打(避免自己打自己)
// 不過這裡判斷有點問題就是了, 等微調方向確定時一併修改
if(current_tar!=me)
current_tar->kill_ob(me);
return current_tar;
}
else
return temp_data["ats"][r];
}
// 上面基本上就是回傳隨機一個對象回去給怪物, 讓怪物去攻擊這個對象
}
}
所以 10 個玩家衝進去房間殺一隻怪物時, 這隻怪物每一回合的攻擊, 每一
個玩家都有 1/10 的機率被攻擊到.
因為怪物在做攻擊時「幾乎」都是以 query_current_attacker 做為讀取出
攻擊對象的主要函數, 所以目前的「隨機讀取」就是所謂的 default 設定.
未來想調整的方向..
一、可以設定讓怪物可以略過對某些玩家的攻擊
=> 但是相對的其它玩家被攻擊到的機率就會增加
二、攻擊對象 a 時, a 或 b 有辦法讓該攻擊轉向 b.
=> 等於 b 實際上在保護 a 的意思
(這個很久以前就有實裝, 但是有 bug, 所以其實是沒啟用的狀態)
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.170.108.37