我打算把这个固定化。
首先,假设怪物攻击玩家时,是读取以下函数:
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