本帖最后由 andrewx 于 2016-1-9 22:56 编辑
据我所知并没有这样的通用增强AI,因为这个东西跟每个游戏设计密切挂钩,插件作者根本不知道你的游戏里设计的技能的公式、效果都是什么样的,以及这些技能在游戏里的比重有多少,自然没有办法写出相应的求最优行动的算法。其次这样的AI真的不好做,一个buff究竟能带来多少效用,这个buff在战斗开始和战斗结束哪个时间点上效用最高,甚至敌人与玩家可能的行为也应该是影响AI的因素。也就是说你首先要提供能够覆盖你游戏里战斗行动的reward function, transition function等,这才有可能做出一个合适的AI。如果一个插件作者连这些都没有就能做出一个好的AI...那这个AI已经是机器学习的程度了。即便是Yanfly的敌人AI插件,这些判定也是要你自己手工写的。
正因为不现实,系统默认的战斗AI也仅仅是计算HP伤害/回复比率来判定一个行动的效用(所以默认自动行动不会碰那些不影响HP的技能)。如果你想修改,去看下面两个方法:
Game_Action.prototype.evaluate = function() { var value = 0; this.itemTargetCandidates().forEach(function(target) { var targetValue = this.evaluateWithTarget(target); if (this.isForAll()) { value += targetValue; } else if (targetValue > value) { value = targetValue; this._targetIndex = target.index; } }, this); value *= this.numRepeats(); if (value > 0) { value += Math.random(); } return value; }; Game_Action.prototype.evaluateWithTarget = function(target) { if (this.isHpEffect()) { var value = this.makeDamageValue(target, false); if (this.isForOpponent()) { return value / Math.max(target.hp, 1); } else { var recovery = Math.min(-value, target.mhp - target.hp); return recovery / target.mhp; } } };
Game_Action.prototype.evaluate = function() {
var value = 0;
this.itemTargetCandidates().forEach(function(target) {
var targetValue = this.evaluateWithTarget(target);
if (this.isForAll()) {
value += targetValue;
} else if (targetValue > value) {
value = targetValue;
this._targetIndex = target.index;
}
}, this);
value *= this.numRepeats();
if (value > 0) {
value += Math.random();
}
return value;
};
Game_Action.prototype.evaluateWithTarget = function(target) {
if (this.isHpEffect()) {
var value = this.makeDamageValue(target, false);
if (this.isForOpponent()) {
return value / Math.max(target.hp, 1);
} else {
var recovery = Math.min(-value, target.mhp - target.hp);
return recovery / target.mhp;
}
}
};
这就是自动战斗的utility function了,你可以在evaluateWithTarget里面添加一些判定,赋予一些行动权重来调节自动战斗AI,比如当target濒死时,会返回双倍的value,比如如果回合数很小的时候,buff类技能也能返回一定的value等等
正如楼上上上说的,自动战斗并不是好的战斗解决方法,所以我也懒得实践,以上仅是理论思考。
话说回来FF13的队友AI实在做得很棒,执行的行动一般都是很合理的。所以说FF13的战斗系统真的没得黑...啊咧,好像扯远了... |