LOGO
 
 

Очень часто спрашивают, как считается точность торпед, повреждения при выстреле и т.п.

Постараюсь кое-что описать здесь.
Если Вы считаете, что необходимо добавить еще пару формул, прошу предложения направлять мылом.

Формулы:

 


Точность торпед.

Самый частый вопрос у новичков (и не только).

Каждая торпеда имеет базовую точность - шанс попасть в цель, если нет ни компьютеров, ни отклонителей. Тут обычно ясно всем - если 40%, то 4 из 10 обычно попадают в цель (бывает и ни одной, и 9, но обычно - 4 из 10 :).

Теперь рассмотрим действие компьютеров. Это звучит непривычно, но компьютеры не добавляют точности торпедам, а снижают неточность. Непонятно? Давайте рассмотрим на примере.

Пусть точность торпед 40%. Боевой компьютер имеет точность 30%. Значит, неточность торпеды = 100-40 = 60%, и именно эту неточность комп уменьшает на 30% (от 60), получаем 60% * (1-0.30) = 42% неточности в итоге, и торпеда имеет точность 58% (а не 70, как иногда думают).

Пусть будет три таких компьютера с такой же торпедой.

Каждый из них убирает 30% неточности, оставшей от предыдущего. Получаем (100%-40%) * (1-0.30) * (1-0.30) * (1-0.30) = 20.58% неточности, то есть три компа по 30% поднимают точность торпед с 40% до 79.42%.

Обратим внимание на джаммеры (отклонители торпед). Они снижают точность торпед - это ясно. Но каким образом? пусть у нас опять торпеда с точностью 40%. У противника стоит отклонитель 20%. Тогда точность процентов уменьшается и равна 40% * (1-0.20) = 32%. Два отклонителя по 20% дают в итоге 40% * (1-0.20) * (1-0.20) = 25.6% точность торпеды (а не 0, как иногда кажется).

Но что делать, когда есть и компьютеры, и джаммеры?

1. Считаем суммарную мощность компьютеров:

итог_комп = 1.00 - (1.00-мощность_компа)число_компов

2. Считаем сумманую мощность джаммеров (отклонителей):

итог_джамм = 1.00 - (1.00-мощность_джаммера)число_джаммеров

Учитываем, что ни первое, ни второе число не может превыщать 0.98 - такова суровая реальность. Если оба равны, то забываем и о компах и о джаммерах - точность торпед не меняется.

Из большего вычитаем меньшее. Если больший перевес был у компьютеров, то считаем, что действует один компьютер с мощностью, равной остатку; если перевес у джаммеров, то считается, что действует один джаммер с мощностью, равной остатку.

Тогда при перевесе компьютеров:

итоговая точность торпеды = 1.00 - (1.00 - базовая_точность) * (1.00 - итоговый_остаток)

При перевесе джаммеров:

итоговая точность торпеды = базовая_точность * (1.00 - итоговый остаток).

Повреждения при выстреле

Во-первых, лазеры сначала должны уничтожить все поле группы кораблей, и только потом начинают повреждать броню, а у торпед половина мощности бьет по полю, а половина - сразу по броне. Причем поле у группы кораблей - общее.

Во-вторых, все одинаковые пушки/ракеты одной группы бьют одновременно, общим залпом. Если этого залпа хватает, чтобы уничтожить один или несколько кораблей в группе противника, эти корабли уничтожаются, остаток выстрела размазывается по всей группе противника, повреждая все корабли на какой-то процент(обычно небольшой). Какой отсюда следует вывод? Если Ваш корабль одним выстрелом не может убить даже один вражеский в пачке, не дробитесь - выстрел каждого корабля будет размазываться по всей пачке противника, не убивая ни одного корабля.

К примеру, пусть у противника 100 кораблей без поля с броней 5000.

У вас 200 кораблей, каждый из них наносит удар в 1000. Если вы оставите все свои корабли в пачке, первым залпом вы нанесете удар в 200*1000 = 200,000 и уничтожите 40 кораблей противника.

Но если Вы разделите их в бою по 1, то вы 200 раз нанесете удар по 1000 - не уничтожив ни одного корабля, и после вашего залпа противник будет иметь 100 кораблей, поврежденных на 40%. Даже после второго вашего залпа он не потеряет ни одного корабля - просто пачка будет иметь повреждения 80%. И только третьим залпом противник будет уничтожен. в начало


Расчет невидимости

Рассмотрим формулу невидимости для смешанного флота.

Самое главное - мощность устройств измеряется не в процентах, а в CU (Cloack Units) на килотонну дизайна. Давайте рассмотрим подробнее.

Вот табличка:
Устройство Мощность
Shadow of Peace 300
Gray Shadow 70
Dark Shadow 140
Deep Black Shadow 220
Shadow of Wraith 540

Теперь для каждого корабля с невидимостью умножаем число устройств на их мощность и на массу корабля, затем умножаем на число таких кораблей во флоте. Записываем общую мощность в CU:

Всего CU данного дизайна = (мощность устройства * число устройств в дизайне * массу дизайна * число кораблей этого дизайна во флоте.

Всего CU во флоте = сумма CU по каждому дизайну.

Теперь делим результат на массу всего флота. Получаем итоговую мощность на килотонну и сравниваем ее с табличкой:
100 units/kT50% cloaked
300 units/kT75% cloaked
600 units/kT87.5% cloaked
1000 units/kT93.75% cloaked

Если вас интересует более точный результат, вот алгоритм вычисления процента от очков невидимости на килотонну (взято из хелпа Stars!):

if points <= 100
    percent = point/2
else 
    points = points-100
    if points <= 200
        percent = 50+_points/8
    else
        points = points-200
        if points <= 312
            percent = 75+_points/24
        else
            points = points-312
            if points <= 512
                percent = 88+_points/64
            else if points < 768
                percent = 96
            else if points < 1000
                percent = 97
            else 
                percent = 98
            end if
        end if
    end if
end if
в начало

Повреждения при бомбардировке.

Находим число бомб, НЕ перехваченных планетарной обороной (с учетом типа бомб) каждого типа

действБомб = (1.0 - мощность обороны) * ЧислоБомб

Сначала вычисляется статистика по бомберам:

Теперь считаем урон (приведен алгоритм, использумый в последней версии сервера):

МинНас = минНас * действБомб

Постр = постр * действБомб

ПроцНас = 1.0 - (1.0 - процНас)действБомб

где процНас - процент убиваемого населения, постр - число уничтожаемых построек, минНас - минимальные жертвы среди населения (характеристики бомб).

Убиваем население:

убито1 = ПроцНас * Население; убито2 = МинНас
Берем наибольшее.

ВсегоПостроек = число_фабрик + число_шахт + число_обороны

По каждому виду построек гибнет доля, равная

процент_уничтоженных = Постр / ВсегоПостроек,
то есть общее число уничтоженных построек равномерно распределяется по всем типам.

Если уцелела планетарная оборона, она наносит ответный удар по флоту на орбите. в начало

Повреждения при прыжке сквозь врата

При прыжке флота сквозь ЗВ повреждения каждому дизайну в составе флота вычисляются независимо.

Повреждение по расстоянию (зависит только от передающего устройства):

если дистанция > дальность_врат

rangeDamage = (дистанция-дальность_врат)/(4*дальность_врат);

Масса проверяется дважды - на старте и на финише:

если МассаСГрузом > предел_врат_старт

dmgS = 1.0 - (предел_врат_старт*5 - МассаСГрузом)/(предел_врат_старт*4)

если МассаСГрузом > предел_врат_финиш

dmgF = 1.0 - (предел_врат_финиш*5 - МассаСГрузом)/(предел_врат_финиш*4)

итого totalDamage = (dmgS+dmgF) + rangeDamage * (1.0 - (dmgS+dmgF)) в начало


Подробности алгоритмов битвы.

Последствия дипломатии рассматривать не будем (это к вопросу "почему не помогал союзник" или "у нас нейтрал, а его корабли моих замочили").

Будем считать, что список врагов в этой битве у каждой расы уже составлен.

Начало битвы

Каждый участвующий в битве флот делится по дизайнам, а каждый дизайн - на группы в соответствии с боевым планом.

Если на поле боя нет кораблей противника, группа выходит из боя (совершив N перемещений, покидает поле битвы)

Если битва длится более 100 раундов, все группы выходят из боя.

Раунд битвы:

  1. Каждая группа выбирает себе цель (по вкусу :))
  2. Каждая группа перемещается, пытаясь обеспечить дистанцию, заданную боевым планом, с чужой группой, выбранной в качестве цели.
  3. Открывается огонь.

Выбор цели:

Для безоружных кораблей - стратегия по умолчанию - бегство. проверяется только вариант "враг сильнее меня".
Если указано "стоять на месте" - стоит. Если указано оптимальное/максимальное расстояние - то выбирается враг с наибольшим приоритетом (то есть тот, кто ближе к началу в списке целей боевого плана). Если таких врагов несколько, берется ближайший.
При стратегии "оптимальное расстояние" группа старается держаться на максимальной дальности оружия противника, при стратегии "максимальное расстояние" - на одну клетку дальше, чем достает оружие противника.
Учитывается только расстояние до выбранного противника!

Если в списке целей подходящего врага не нашлось, то выбирается ближайший противник и делается попытка убежать от него подальше.

С вооруженными кораблями сложнее.

Каждая вооруженная группа вычисляет привлекательность каждой группы противника, выбирая наиболее "вкусную" (если в боевом плане определенный тип целей выключен, такие группы противника пропускаются).

factor1 = приоритет класса цели в боевом плане (верхний - макс), точные значения неизвестны, но подозреваю, что нижний == 1, а вышестоящие увеличиваются на 1.

теперь начинаются сложности

Боевые рейтинги групп:
SStrength = БР дизайна * число кораблей
EStrength = БР дизайна чужой группы * число кораблей в чужой группе.
Боевые скорости:
SSpeed - нашей группы
TSpeed - чужой группы
CRange - расстояние между ними.

Соотношение рейтингов (DStrength):

   if     (EStrength==0) DStrength = 1.0+SStrength;
   else if(SStrength==0) DStrength = 0.1/EStrength;
   else                  DStrength = SStrength/EStrength;

DStrength < 0.95
Используем стратегию "враг сильнее меня"
Считаем, что враг будет наступать, поэтому CRange = CRange - TSpeed/2 (0, если получается < 0)

DStrength > 1.05
Используем стратегию "враг слабее меня"
Считаем, что враг будет отступать, поэтому CRange = CRange + TSpeed/2 (Если больше размера поля, то CRange = BOARD_SIZE)

0.95 <= DStrength <= 1.05
Используем стратегию "враг равен мне"

Если в боевом плане стоит "бежать с поля боя", а в качестве цели выбрана орбиталка, то приказ меняется на "максимальное расстояние"

Предполагаемое расстояние после перемещения: CRange = CRange - SSpeed (0, если получается < 0)

Предполагаемые повреждения:
E2S - урон, нанесенным нам противником
S2E - урон, нанесенный нами противнику

при стратегии "бегство":
S2E = SStrength*0.2;
E2S = EStrength;

при стратегии "стоять на месте":
S2E = SStrength*0.4;
E2S = EStrength;

для остальных стратегий выполняется упрощенный расчет повреждений при выбранном расстоянии до противника. При этом учитываются усилители/отражатели лазеров, компы и джаммеры, НО базовая точность любых торпед считается равной 40%.
Если на уничтожение цели тратится меньше 70% мощности оружия (назовем это КПД выстрела), то результат умножаем на этот КПД.

factor2 (соотношение повржедений) зависит от флага "Камикадзе".
Для "камикадзе" factor2 = S2E / SStrength (или 0 для SStrength == 0), для остальных factor2 = S2E2 / (S2E2 + E2S2);

factor3 = 1 если предполагаемое расстояние до цели меньше или равно желаемому, иначе factor3 = желаемое_расстояние / предполагаемое_расстояние

factor4 - экономия усилий. Если включено распределение целей, то factor4 = 0.95(число_групп_атакующих_эту_группу_противника).
Если выключено, то factor4 = 1.0

Наконец, привлекательность цели:
newRate = factor1*0.3+factor2*0.2+factor3*0.4+factor4*0.1;

Выбирается цель с наибольшей привлекательностью. Если есть цели с одинаковой привлекательностью, выбор случаен.

Перемещение.

Тут тоже не так все просто.

для каждого ЖЕЛАЕМОГО направления к цели есть таблица вероятности перемещения (квдаратная таблица 3 на 3, центральная клетка - наше текущее положение).

Для варианта "стоять здесь":
76%, что так и стоим, остальные направления равновероятны (3%)

Для перемещения по горизонтали/вертикали:
55%, что пойдем прямо к цели, 12%, что по диагонали в одну сторону, 12% - диагональ в другую сторону. Сдвигаемся в сторону (не меняя дистанции) или стоим на месте с вероятностью 5%, на остальные направления - (отступление) - 2%.

Для перемещения по диагонали:
Нужная диагональ - 58%, сдвиг по горизонтали/вертикали в сторону цели - 15%, стоим на месте - 5%, остальное - 2%.

Если какая-то часть квадрата выходит за пределы боевого поля, вычеркиваем эту клетку из рассмотрения.
Если на какой-либо клетке уже есть какая-либо группа, уменьшаем вероятность перехода на нее вдвое.

Теперь кидаем кубик и получаем, на какой квадрат мы должны сдвинуться.

Но это еще не все :)

На свет божий является хаотичность движения. Если у группы на клетке нет соседей, то вероятность хаотичного перемещения вместо выверенного маневра = 10%. Если есть соседи - то целых 40% (видимо, больше времени уворачиваются друг от друга:) ).
Для групп со стратегией "нулевое расстояние" хаотичность уменьшается до ..... % (у меня старый вариант исходника, поэтому точное значение дать не могу. Вроде бы до 5%)
Если нам выпал кусочек хаоса, то меняется перемещение ИЛИ по вертикали, ИЛИ по горизонтали - если мы не хотели двигаться, то куда-нибудь сдвинемся, если хотели - остановимся.


Выстрел.

Тут все не так уж сложно. Проще всего многостволкам - они бьют сразу по всем врагам в пределах досягаемости (если класс цели не выключен в боевом плане) и не мудрят с прицелом.
Если выбранная цель в пределах дальности оружия - тоже просто: бьем по цели.
А вот если до цели не дотягивается хотя бы один вид вооружения, то такое оружие атакует СЛУЧАЙНУЮ группу противника в пределах досягаемости (если нет запрета в боевом плане).

Инициатива выстрела = Инициативе корпуса + инициативе оружия. Сначала ведет огонь вооружение с максимальной инициативой выстрела, при равной инициативе выстрела группы стреляют одновременно.
Когда все виды оружия с такой инициативой отработали, наносятся накопленные повреждения каждой группе.
Уничтоженные корабли убираются, уцелевшие повреждаются. Полностью уничтоженные группы убираются с поля боя и процесс повторяется для меньшей инициативы выстрела.

Когда стрелять больше некому, начинается новый раунд (пока есть хоть один враг).

Ну, вот пока и все.

в начало