[wizs] 戰鬥中的前衛後衛

作者: laechan (揮淚斬馬雲)   2018-11-26 22:57:43
我打算把這個固定化。
首先,假設怪物攻擊玩家時,是讀取以下函數:
tar=mob->query_current_attacker();
而該函數長底下這樣:
varargs object query_current_attacker(int n)
{
mixed ats=query_temp("ats");
.
.
然後假設 ats 的堆疊是正確的,也就是目前有多少生物在攻擊
這隻 mob,都被堆疊在 ats 裡頭。
這時,問題可簡化成需對 ats 做幾次必要的排序處理。
ats=sort_array(ats,(: sort_pri_guild :));
int sort_pri_guild(object a,object b)
{
string pa=(string)a->query("pri_guild");
if(pa=="fighter" || pa=="blader" || pa=="slasher")
return -1;
else if(pa=="mage" || pa=="clerical" || pa=="thief")
return 1;
else
return 0;
}
以下是線上隨便抓 20 個玩家的驗證結果:
ralfa fighter
hulk fighter
blademonk blader
juliannohl slasher
salvis slasher
garnettil slasher
wan blader
fencer blader
keer slasher
ailano slasher
fredman blader
ido fighter
freija fighter
newking slasher <= 到這裡為止都是所謂的前衛
parasite mage <= 從這裡開始都是廣義的後衛
asellus clerical
songb clerical
stephanie clerical
kindle clerical
terryw knight
也就是說,我先看主職業,只要是攻擊該怪物的對象,主職是
戰、刀、劍三種的,就歸類到前鋒,剩下的就歸類到後衛。
接下來:我怎麼隨機從前衛裡頭產生攻擊對象?
i=0;
foreach(ob in ats)
{
pri_guild=ob->query("pri_guild");
if(pri_guild=="fighter" || pri_guild=="blader" ||
pri_guild=="slasher")
{
i++;
continue;
}
// 全體隊員都不是戰、刀、劍主職時
if(i==0) i=sizeof(ats);
return ats[random(i)];
}
以下是驗證:
選中的對象 salvis slasher
選中的對象 keer slasher
選中的對象 garnettil slasher
選中的對象 hulk fighter
選中的對象 ailano slasher
選中的對象 fredman blader
選中的對象 fencer blader
選中的對象 hulk fighter
選中的對象 wan blader
選中的對象 wan blader
.
.
上面的設定有以下的好處:
一、兩人以上組隊,只要有隊員主職是戰、刀、劍時,怪物就會
優先打這些隊員。
二、兩人以上組隊,全體隊員都不是戰、刀、劍主職,或全體隊
  員都是戰、刀、劍主職時,每個隊員都可能被怪物打到。
三、若要更合理一點,應該要把[騎士]也加進前鋒。
四、該設定實裝後,就能接著實裝「斷法」的設計,只要玩家被
呼叫到 receive_damage,就會移除堆疊的 special_attack
資料串,就相當於被斷法(而且CD時間還在)。
五、因此理論上,應該先把法術攻擊全面 special_attack 化。
六、全面 special_attack 化可帶來另一個好處,就是施法時間
可以延長,我打算至少延長 1 秒。
七、該設定實裝後,可拉高怪物的攻擊頻率、以及增加全體攻擊
的類別。
八、後期全面實裝後,就能將特攻、fist 等也 special_attack
化,玩家基本上只要不被怪物打到就不會斷法,而 sanc 會
提供多種不被打到的方法。(比方法師上盾)
九、我會跟著實裝的設定是群式怪物會 n 連擊,n 與怪物隻數
有關。
其中第五項應該要是最優先事項。
總之以上全部實裝後,玩家組隊時至少會想一下要組什麼樣的成
員,而不是無腦組,但也不會花你太多時間去想。
Laechan

Links booklink

Contact Us: admin [ a t ] ucptt.com