Посмотрел еще раз philAI_QuickCombat, philAI_ProbableOutcomeOfBattle, ваш документ "Теория слива".
Чего хотелось бы ? Адекватного итога - то есть должна быть исключена ненулевая вероятность победы стороны, которая намного слабее. Вот у вас в TE сторона, которая в 1,5 раза сильнее - никогда не проигрывает. Считаю, что это вполне правильно. Но вот то, что при этом эта сторона не несет никаких потерь - не очень реалистично. Можно предположить (интуитивно), что сторона, которая в 1,5 раза сильнее, понесет хотя бы 10-20 % потерь (и это довольно много).
Что еще не нравится в оригинальных
philAI_QuickCombat и
philAI_ProbableOutcomeOfBattle - виден ассиметричный подход к атакующему и защищающемуся. Если в случае битвы "герой ИИ - нейтралы" можно как-то обосновать такую ассиметричность, то в случае битвы двух ИИ героев - не очень. В чем ассиметричность ?
С одной стороны, в
philAI_ProbableOutcomeOfBattle есть строки:
- Код: Выделить всё
if(*probWinnerA >= 0.08 )
{
if(*probWinnerA >= 0.12 )
{
if(*probWinnerA >= 0.2 )
{
if(*probWinnerA >= 0.3 )
{
if(*probWinnerA < 0.4 )
*probWinnerA -= 0.02;
}
else
{
*probWinnerA -= 0.04;
}
}
else
{
*probWinnerA -= 0.05;
}
}
else
{
*probWinnerA -= 0.07000000000000001;
}
}
else
{
probWinnerA = 0;
}
И это почему-то применяется только к нижней границе probWinnerA, когда атакующий скорее всего проиграет (можно было бы сделать симметрично для верхней границы, но наоборот, с прибавкой, вплоть до probWinnerA = 1.0).
а в
philAI_QuickCombat есть строки
- Код: Выделить всё
if(isAttackerWin && probWinnerA > 0.6)
probDelta = (probWinnerA + 0.65) * probDelta;
if(probDelta > 1.0)
probDelta = 1.0;
И это применяется только к атакующей стороне.
Мои предложения:
1) Выпилить кусок в
philAI_ProbableOutcomeOfBattle начинающийся с
if(*probWinnerA >= 0.08 )
2) Изменить кусок в
philAI_QuickCombat (с оригинала выше вот на это):
- Код: Выделить всё
if(isAttackerWin && probWinnerA > 0.6)
probDelta = (probWinnerA + 0.65) * probDelta;
if(!isAttackerWin && probWinnerD > 0.6)
probDelta = (probWinnerD + 0.65) * probDelta;
if(probDelta > 1.0)
probDelta = 1.0;
3) самое интересное, изменить в
philAI_QuickCombatвот это
float probWinnerD = (float)Random(0, 100) / 100.0;
на это
float probWinnerD = (float)Random(20, 80) / 100.0;
Таким образом сторона, которая существенно сильнее - не проиграет, и понесет некоторые потери (более-менее реалистично).
Или я чего-то не учел ??
***
Ну или
float probWinnerD = (float)Random(25, 75) / 100.0;
Тогда будет как вы задумывали - если коэф. победы > 75, то эта сторона не может проиграть.