Очень часто спрашивают, как считается точность торпед, повреждения при выстреле и т.п.
Постараюсь кое-что описать здесь. Если Вы считаете, что необходимо добавить еще пару формул, прошу предложения направлять мылом.
Формулы:
Точность торпед.
Самый частый вопрос у новичков (и не только).
Каждая торпеда имеет базовую точность - шанс попасть в цель, если нет ни компьютеров, ни отклонителей. Тут обычно ясно всем - если 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/kT | 50% cloaked |
300 units/kT | 75% cloaked |
600 units/kT | 87.5% cloaked |
1000 units/kT | 93.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 раундов, все группы выходят из боя.
Раунд битвы:
- Каждая группа выбирает себе цель (по вкусу :))
- Каждая группа перемещается, пытаясь обеспечить дистанцию, заданную боевым планом, с чужой группой, выбранной в качестве цели.
- Открывается огонь.
Выбор цели:
Для безоружных кораблей - стратегия по умолчанию - бегство. проверяется только вариант "враг сильнее меня".
Если указано "стоять на месте" - стоит. Если указано оптимальное/максимальное расстояние - то выбирается враг с наибольшим приоритетом (то есть тот, кто ближе к началу в списке целей боевого плана). Если таких врагов несколько, берется ближайший.
При стратегии "оптимальное расстояние" группа старается держаться на максимальной дальности оружия противника, при стратегии "максимальное расстояние" - на одну клетку дальше, чем достает оружие противника.
Учитывается только расстояние до выбранного противника!
Если в списке целей подходящего врага не нашлось, то выбирается ближайший противник и делается попытка убежать от него подальше.
С вооруженными кораблями сложнее.
Каждая вооруженная группа вычисляет привлекательность каждой группы противника, выбирая наиболее "вкусную" (если в боевом плане определенный тип целей выключен, такие группы противника пропускаются).
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%)
Если нам выпал кусочек хаоса, то меняется перемещение ИЛИ по вертикали, ИЛИ по горизонтали - если мы не хотели двигаться, то куда-нибудь сдвинемся, если хотели - остановимся.
Выстрел.
Тут все не так уж сложно. Проще всего многостволкам - они бьют сразу по всем врагам в пределах досягаемости (если класс цели не выключен в боевом плане) и не мудрят с прицелом.
Если выбранная цель в пределах дальности оружия - тоже просто: бьем по цели.
А вот если до цели не дотягивается хотя бы один вид вооружения, то такое оружие атакует СЛУЧАЙНУЮ группу противника в пределах досягаемости (если нет запрета в боевом плане).
Инициатива выстрела = Инициативе корпуса + инициативе оружия. Сначала ведет огонь вооружение с максимальной инициативой выстрела, при равной инициативе выстрела группы стреляют одновременно. Когда все виды оружия с такой инициативой отработали, наносятся накопленные повреждения каждой группе.
Уничтоженные корабли убираются, уцелевшие повреждаются. Полностью уничтоженные группы убираются с поля боя и процесс повторяется для меньшей инициативы выстрела.
Когда стрелять больше некому, начинается новый раунд (пока есть хоть один враг).
Ну, вот пока и все.
в начало
|