Логика такая:
- Код: Выделить всё
// Заводим вектор:
vector <pair<double, int>> target;
int bestTarget;
// Как и в случае с площадными берем минимум в кол-ве возможно убитых существ и текущем кол-ве и умножаем на его fight_value одного существа. В некоторых случаях кол-во самых сильных существ может быть гораздо меньше чем тот урон который может нанести закл. А в таком случае после сортировки этот отряд вряд ли будет самым сильным.
// Ибо в армии героя могут быть чуть менее слабые существа, но в большем кол-ве, которые смогут принять весь урон закла. Следовательно кол-во убитых таких существ может быть сильнее чем гораздо меньшее кол-во более сильных, где большая часть урона ушла в пустую.
target[i].first = ( min( (double)spellDemage / stack->full_hp ), stack->count_current ) * o_pCreatureInfo[stack->creature_id].fight_value;
target[i].second = i;
// Сортим по убыванию target[i].first с сохранением индексов.
// То есть после сортировки в target[0].second у нас будет хранится индекс самого сильного существа на поле боя (от 0 до 9), target[1].second второго по силе и тд.
for (int i = 0; i < target.size(); ++i)
{
_BattleStack_* stack = &o_BattleMgr->stack[o_BattleMgr->current_side][ target[i].second ];
// если урон от нашего дамажащего закла разделенный на остаток здоровья проверяемого существа более или равен единице, то выбираем стек с индексом target[i].second - наша цель.
if ( (double)spellDemage / (stack->full_hp - stack->lost_hp) >= 1.0 )
{
bestTarget = target[i].second
break;
}
}
На мой взгяд такой алгоритм найболее оптимален.
Пример:
У нас есть 3 отряда: 2 Архангела, 4 Чемпиона и 100 Королевских Грифонов. Самый сильный из перечисленных с учетом кол-ва - это Грифоны.
Тот алгоритм, который у нас есть сейчас будет отдавать приоритет именно Грифонам. А тот, который у площадных, при уроне не более 500 ед, будет отдавать приоритет Архангелам. И с точки зрения снижения общей боевой мощи всей армии атака именно Архов наиболее предпочтительно, опять же если общий урон от закла существенно не превышает общее кол-во здоровья всего отряда Архангелов.
Но в случае если урон от закла всего 100 ед, то в таком случае мы вообще не снижает мощь вражеской армии. Не факт что Арха получится сразу добить, плюс враг может использовать Лечение или Палаткой подличится. А в случае со слабыми и средними героями с небольшой СМ, это проблема.
А потому лучше действовать так, что если мы не можем забрать даже 1 монстра из отряда самых сильных, то берем следующий по силе отряд и тд, пока мы не сможем убить хотя бы 1 существо.
При этом считаем не от полного здоровья, а от остатка. То есть если у Архов осталось 100 ед здоровья и закл наносит столько же, то значит Арх и будет нашей целью.
При уроне от закла в 100 ед. и если у всех отрядов верхнее текущее существо имеет полное здоровье, то мы получаем следующее:
1) Архангелы: 0,4 * fight_value_Архов
2) Чемпионы: 1.0 * fight_value_Чемпионов
3) Королевские грифоны: 4.0 * fight_value_Королевских_Грифонов
Вышеописанный алгоритм в данном случае выберет именно Чемпионов, несмотря даже на то, что 0,4 * fight_value_Архов > 1.0 * fight_value_Чемпионов.
При этом если у верхнего существа в отряде Архов осталось 100 ед здоровья, то при том же уроне от закла (100 ед) будет выбран уже отряд Архов в качестве цели.
А вот если урон от закла будет >=250 (но не больше суммарного здоровья стека), то, как и с площадными, будут выбираться Архи, не зависимо от остатка его здоровья.
AlexSpl, сделайте выбор цели для обычных одиночных дамажащих заклов по тому алгоритму, который я описал выше. Посколько коды моих функций вы уже переписали и объединили, то вам будет быстрее сделать это в вашем переписанном коде и переписывать ничего не прийдется.
***
UPD: По ходу мы забыли учесть один важный момент - отряды под Слепотой. Для ударных одиночных заклов, а также для дамажащих площадных и, возможно, для Берсерка нужно игнорить отряды на которые уже наложенна Слепота, как мы игнорим имунных.
Кстати, для Берсерка выбор цели сейчас не так как для остальных площадных, а так как для массовых заклов. Вот именно с Берсерком так и нужно, так как это не дамажащий спелл. Здесь как раз этот вариант будет оптимальным (по общей силе всего отряда, так как урона нет). Только вот для отрядов под Слепотой подумать надо. Для дамажащих спеллов по любому нужно игнорить, а вот с Берсерком хз.