Это для тех, кому действительно интересно разобраться. Осилить это сможет не каждый, и требует вознаграждения, потому, как это сейчас модно эвент:
В тексте вы найдете некий код, если вы еще и играли в JA2, то вам не составит труда в комментарии написать, что он означает. Победитель получит 3 моих плюса (+5) в своих постах (осмысленных). Я бы медаль давал, но не уверен, что получу ее сам за этот пост :)
Автор благодарит тех, кого уже благодарил:
Данная статья содержит огромное количество формул, поэтому самые одиозные я я скрыл спойлерами. Если вы их поймете - вы круты, я сам иногда путаюсь :)
Для начала определимся с терминологией:
Стрелок (Shooter): Тот кто стреляет, к чьему действию применяется формула
Местонахождение цели (TargetLocation): Точка, в которую происходит прицеливание. Это не обязательно может быть враг, как это работает мы расмотрим ниже.
Часть тела цели (Целевая_Часть_Тела): Часть тела противника, которую пытаются поразить. Однако при стрельбе в лежащего противника или танк это значение будет равно "none".
Уровень прицеливания (AimTime): Количество дополнительных АР, использованных для прицеливания.
Вооружившись этими параметрами начнем рассматривать вычисления.
____________________________________________
Для начала, программа проверяет, есть ли у стрелка Меткость(Marksmanship):
Код:
Если Меткость_Стрелка = 0, то
Шанс Попадания = 0, вычисления прекращаются.
Далее программа проверяет, не используется ли на оружии мощных прицелов:
Код:
Для каждого Аттача на оружии, выполнить
Если Аттач дает более +14 бонуса прицеливания, то
используется мощный прицел.
Иначе
не используется мощный прицел.
Таким образом, мы узнали, что если прицел дает +15 и более бонус прицеливания - он считается иначе, чем все остальные. Эффекты от таких прицелов мы рассмотрим ниже.
____________________________________________
Теперь программа проверяет состояние оружия и вводит модификатор, в зависимости от его значения.
Код:
Если Состояние Оружия больше или равно 85, то
Модификатор Состояния = 100
Иначе
Модификатор Состояния = Состояние Оружия * 100 / 85
Таким образом оружие с состоянием не менее 85% не получает штрафов, если же состояние будет ниже, Шанс Попадания начнет снижаться.
Запомним значение этого параметра, оно понадобиться нам позже.
_______________________________________________
Теперь начинается наиболее важная часть формулы - определение базового Шанса Попадания. Основой для расчетов является Меткость стрелка. Для ПТГ расчеты ведутся немного иначе, и мы рассмотрим их позже, а пока формула для стрелкового оружия:
Код:
Эффективная_Меткость = Текущая_Меткость_Стрелка
Если стрелок пьян, то
Эффективная_Меткость = Текущая_Меткость_Стрелка * Уровень_Трезвости / 100
Если Стрелок - Робот, то
Эффективная_Меткость = наивысшему значению - либо Меткости_Робота, либо Меткости_Управляющего_Стрелка
Уровень_Трезвости оказывает свое влияние, в зависимости от того, сколько стрелок выпил.
Если он трезв, то значение равно 100.
При стадии опьянения 1 , 75.
При стадии опьянения 2 , 65.
При стадии опьянения 3 , 50.
Интересно, что есть еще 4 уровень опьянения (в гавно?), но он вовсе не оказывает влияния на стрельбу!! Значение Трезвости равно 100!! Это делалось для Ивана Долвича???.
Таким образом мы можем потерять от 25% до 50% эффективной меткости находясь в легком или не очень подпитии.
Теперь рассмотрим, что происходит при выстреле из ПТГ.
Код:
Если оружие - ПТГ, то
Эффективная_Меткость = среднему значению от:
1) Текущая_Меткость_Стрелка
2) Текущая_Ловкость_Стрелка
3) Текущая_Мудрость_Стрелка
4) Текущий_Уровень_Стрелка * 10
Каждый из этих параметров модифицируется опьянением. Исключение - первая степень опьянения не влияет на уровень. При следующей стадии, мы теряем 1 уровень, на 2 и 3 - 2 уровня, эти модификации действительны только для данных вычислений. И снова, 4 уровень не дает никаких штрафов :).
Кроме того, уровень в расчетах может быть быть уменьшен если наемник подвержен Клаустрофобии. В таком случае, при стрельбе в замкнутых пространствах его уровень для расчетов снижается на 1.
Далее учитывается эффект умения Тяжелое Вооружение:
Код:
Если оружие - ПТГ, то
Эффективная_Меткость увеличивается на 15 за каждый уровень умения Тяжелое Вооружение.
Итак, теперь мы имеем базовое значение для расчетов "Эффективная_Меткость". Теперь мы рассчитаем "Базовый_Шанс". Позже мы также рассчитаем "Реальный_Шанс", но это позже.
___________________________________________
Первое, что влияет на Базовый_Шанс, это Мораль.
Мораль работает по разному для персонажей и для NPC. Наш персонаж имеет мораль от 0 до 100. 50, это "нормальное" состояние для нашего наемника (в игре зовется "Стабильная"). При 100, наша мораль превосходна, при очень низких значениях ведет к дезертирству. NPC же имеют "стадии", от "Безнадежный" к "Обеспокоенный" потом к "Уверенный", и, наконец, "Бесстрашный".
Для наших персонажей формула следующая:
Код:
Если Мораль_Стрелка > 50, то
Модификатор_Морали = (Мораль_Стрелка - 45) / 100
Иначе
Модификатор_Морали = (Мораль_Стрелка - 50) * 2 / 5
Это означает, что при морали 55, мы получаем +1 Модификатор_Морали, и еще +1 за каждые 10 пунктов выше 55. При морали 95-100, мы получаем максимальный бонус в +5.
Когда наша мораль опускается примерно до 47, мы получаем штраф -1, и еще -1 за каждые 2-3 пункта ниже 47, вплоть до -20.
Для NPCs, каждая "стадия" морали дает постоянный модификатор:
"Безнадежная" мораль дает -15
"Обеспокоенная" мораль дает -7
"Уверенная" мораль дает +2
"Бесстрашная" мораль дает +5
Теперь с помощью полученных модификаторов, мы изменяем Базовый_Шанс:
Код:
Базовый_Шанс = Базовый_Шанс + Модификатор_Морали
Теперь переходим к расчету влияния Энергии на прицеливание:
Код:
Модификатор_Усталости = Базовый_Шанс * Штраф_Дыхания / 100 / 2
Штраф_Дыхания зависит от текущей Энергии персонажа:
Для 85 и выше, Штраф_Дыхания = 0
Для 70-84, Штраф_Дыхания = 10
Для 50-69, Штраф_Дыхания = 25
Для 30-49, Штраф_Дыхания = 50
Для 15-29, Штраф_Дыхания = 75
ДЛя 14 и ниже, Штраф_Дыхания = 90
Как мы видим, максимальный Модификатор_Усталости не может быть более 45% от Базового_Шанса.
Поскольку это штраф, то мы отнимаем его значение от Базового_Шанса:
Код:
Базовый_Шанс = Базовый_Шанс - Модификатор_Усталости
____________________________________________
После этих расчетов, значение Базового_Шанса сохраняется программой для использования в дальнейших вычислениях. Копия этого значения записывается в параметр "Реальный_Шанс", и формула переходит к дальнейшим вычислениям. Далее эти параметры будут сравниваться, но перед этим Реальный_Шанс испытает массу модификаций.
Код:
Реальный_Шанс = Базовый_Шанс
Сначала программа проверяет, насколько состояние оружия оказывает влияние на Шанс Попадания стрелка. Для этого используется рассчитанный нами выше Модификатор_Состояния
Код:
Если Модификатор_Состояния < Базовый_Шанс, то
Реальный_Шанс = среднее от:
1) Базовый_Шанс
2) Модификатор_Состояния
Это может стать очень сильным ударом по нашему Шансу Попадания. Модификатор_Состояния может значительно уменьшить наши шансы на хорошее попадание, еще до того, как будут проведены все остальные расчеты! Это довольно странно, поскольку выше мы уже учитывали состояние оружия в расчетах, тем не менее это так.
_______________________________________________
Итак, мы полностью переходим к работе с "Реальным_Шансом", оставив "Базовый_Шанс" для более позднего сравнения.
Начинаются расчеты с применения некоторых возможных бонусов:
Код:
Если Местонахождение_Цели тоже что и Местонахождение_Цели предыдущего выстрела, то
Реальный_Шанс увеличивается на 10
Это статичный бонус +10 к Шансу Попадания. Помните, что программа не проверяет, есть ли враг (в том числе враг, в которого вы стреляли) в точке, куда вы стреляли, и бонус будет получен в любом случае!
После этого проверяется бонус ПСИХОВ. Да, именно так, все ПСИХИ имеют бонус, с любым оружием, и в ЛЮБОМ режиме стрельбы:
Код:
Если Стрелок- ПСИХ, то
Реальный_Шанс увеличивается на 15
_____________________________________________
Теперь в формулу добавляется новый тип данных - "Дальность". Программа рассчитывает его сама и записывает значение в МЕТРАХ, не в тайлах. В игровой системе, 10 метров = 1 тайлу.
Давайте посмотрим как Дальность участвует в расчетах и для этого перейдем к следующей секции, которая рассчитывает модификаторы Шанса Попадания, в зависимости от стойки персонажа.
Начнем с положения стрельбы "Стоя":
Если такой прицел используется, Минимальное Расстояние_Для_Бонуса_Прицелов берется из XML-файла для данного прицела. Если дальность до цели меньше минимальной, то прицел не используется вовсе. Если же дальше - то прицел дает свои бонусы, но стрелок при этом испытывает некоторые сложности при стрельбе стоя. Важно отметить, что в данном случае Дальности рассчитываются в ТАЙЛАХ
Мы можем записать это более понятно:
Код:
Штраф_Прицела = Бонус_Прицела * разницу между Минимальным_Расстоянием_Для_Бонуса_Прицела и реальной Дальностью_До_Цели, в тайлах / 100.
Таким образом за каждый тайл дальности, после которого начинает работать прицел, мы получаем штраф примерно в 1/100 бонуса, который дает сам прицел. Вот пример того, как это работает:
Прицел кратностью 10x (обычный снайперский прицел) имеет минимальную Дальность 70 (это 7 тайлов), и дает бонус в 20. На дальности 8 тайлов произойдет следующее:
Штраф_Прицела = 20 * (8-7) / 100 = 0.2
Конечно это маленький штраф. 0.2 тут же округляется до 0. Но что будет, если дальность до цели 30 тайлов?
Штраф_Прицела = 20 * (30-7) / 100 = 4.6
Вот это уже более значительный штраф. Конечно он все еще мал, но нам же важно понять, как все это работает, к тому же мы еще вернемся к этому позже.
Кроме того, запомните, что штраф, рассчитываемый выше не может быть больше 20.
Далее рассмотрим, что будет при стрельбе сидя:
Стрельба сидя так же дает нам небольшой штраф за стрельбу с сильными прицелами, фактически - 1/2 от штрафа за стрельбу стоя.
Стрельба лежа - лучшая из 3 возможных:
Но главной особенностью стрельбы лежа является то, то она не дает штрафов на стрельбу с сильными прицелами! Снайперы должны стрелять лежа, когда это возможно. Конечно, штрафы невелики, но стрельба лежа позволяет пользоваться бонусом за сошки, о чем мы поговорим ниже.
Давайте используем рассчитанные параметры:
Код:
Реальный_Шанс = Реальный_Шанс + Бонус_Стойки - Штраф_Прицела
_________________________________________________________
Код:
Реальный_Шанс увеличивается на значение Точности оружия
Это должно быть очевидным - Точность для оружия берется из Weapons.XML.
_______________________________________________
Далее мы рассмотрим пистолеты и стрельбу с двух рук:
Если другая рука свободна и мы не держим в ней ничего (НИЧЕГО ВООБЩЕ), и стреляем из пистолета, то мы можем стрелять держа его двумя руками и получить +5 к Шансу Попадания.
Если вторая рука занята и мы пытаемся стрелять из SMG, то мы теряем 5 пунктов Шанса Попадания, так как не можем держать его двумя руками.
Наконец, если мы при этом держим во второй руке оружие, и соответственно стреляем с 2 рук, то при отсутствии умения Обоерукость мы теряем 20 пунктов Шанса Попадания. именно поэтому обоерукие наемники хороши для стрельбы по-македонски!
Слова "попытка стрельбы с двух рук" отражают комплексную проверку. Она включает следующие критерии:
1) Оба оружия должны быть стрелковым. (не ПТГ, гранаты, etc.)
2) Оба оружия должны быть одноручными.
3) Оба оружия не должны стоять в режиме очереди.
4) Оба оружия должны быть заряженными.
5) Оба оружия должны быть исправными.
______________________________________________
Здесь стоит рассмотреть еще пару подформул. Эти расчеты называются "Уменьшение_Бонусов" и "Еще_Одно_Уменьшение_Бонусов". Они призваны определить реальные бонусы предмета или атача, в зависимости от их состояния.
Когда используется Уменьшение_Бонусов, то при состоянии 85 и выше мы получим полные боунсы. При снижении меньше 85, бонусы будут стремиться к 0 по следующей формуле:
Код:
Если Состояние_Предмета между 1 и 85, то
Финальный_Бонус = ( ( (Состояние_Предмета * 100) / 85 ) * Изначальный_Бонус ) / 100
Иначе
Финальный_Бонус = Изначальный_Бонус
В результате, если статус предмета 42%, то бонусы, которые может дать предмет снижаются примерно на 50% от возможных.
Вторая формула, "Еще_Одно_Уменьшение_Бонусов", несколько иная. Бонус падает в зависимости от состояния предмета, но при этом при состоянии более 50% предметы НЕ ДАЮТ бонусов, а ниже 50% они дают ШТРАФЫ:
Код:
Если Состояние_Предмета между 1 и 99, то
Финальный_Бонус = ( ( ( (Состояние_Предмета * 100) / 100 ) - 50 ) * Изначальный_Бонус ) / 50
Иначе
Финальный_Бонус = Изначальный_Бонус
Если обобщить и упростить, то можно сказать, что при состоянии предмета около 50%, он дает маленькие бонусы. Но если его состояние упало меньше 50%, он начнет давать штрафы.
Большинство предметов использует или одну или другую формулу, но нельзя утверждать, что какие-то из предметов не используют их обе в разные моменты игры.
Для простоты введем два новых термина:
"Умеренная проверка" проверка бонуса уменьшает его со 100% to 0%, в зависимости от состояния предметов.
"Жесткая проверка" проверка бонуса уменьшает его пока состояние более 50%, и превращает его в штраф, если состояние падает ниже 50%.
________________________________________________
Теперь мы можем использовать эти формулы в расчетах.
Начнем с рассмотрения штрафов в режимах автоматической стрельбы:
Для расчета Штрафа_Отсечки_Оружия, программа делает это:
Изначальный штраф за стрельбу с отсечкой берется из Weapons.XML.
Бонусы попадания при стрельбе с отсечкой компенсируют штраф. Вы можете видеть, что бонусы оружия, боеприпасов или аттачей для стрельбы с отсечкой способны уменьшить штраф. В настоящий момент, только Рукоятка (или встроенная рукоятка) может делать это. Помните, что аттачи в плохом состоянии будут увеличивать штраф, а не давать бонус, поскольку они проверяются "Жесткой проверкой".
Наконец, если стрелок лежит, он сможет получить бонусы за сошки.
Штраф_Отсечки и Бонус_Отсечки в результате приводят к 0 или отрицательному значению. Невозможно получить положительное значение Штрафа Отсечки, нынешний алгоритм программы это не позволяет, и это логично.
Стрельба очередями рассчитывается так же, как и стрельба с отсечкой, с той разницей, что параметры берутся для автоматического огня.
Кроме того, для стрельбы очередями более важным является состояние оружия. Это происходит потому, что все бонусы при стрельбе очередями проверяются "Жесткой проверкой", и при состоянии менее 50% только увеличивают штраф. В результате получаем следующее:
Код:
Реальный_Шанс уменьшается на Штраф_Отсечки, или
Реальный_Шанс уменьшается на Штраф_Очереди...
в зависимости от режима стрельбы
____________________________________________
Теперь переходим к дальнейшим вычислениям, в которых будут участвовать другие параметры, в первую очередь это Дальность.
Мы уже рассматривали "чистое" расстояние до цели, которое отражает расстояние между стрелком и целью.
Теперь мы добавляем еще один параметр - "Эффективная_Дальность". Это значение рассчитывается иначе. Важно, что этот параметр будет использоваться гораздо чаще, чем фактическая дальность.
Если "Эффективная_Дальность" равна 0, то мы увидим "нельзя попасть". Конечно, теоретически, вы все еще имеете некоторые шансы попасть в цель, но это не предмет наших исследований.
Здесь же программа будет учитывать, если в целевой точке вражеский солдат, и если нет - расчеты будут несколько иные.
___________________________________________________
Если мы видим цель, и имеем дополнительные ОД на прицеливание, программа рассчитывает наш бонус прицеливания. Эта часть расчетов может быть трудна для понимания, будьте внимательны.
В оригинальной JA2, каждое очко, потраченное на прицеливание давало прямой бонус +10. В 1.13, отличий не много, но факторов, участвующих в расчете бонуса больше, и в дополнение, мы получили ограничение максимального бонуса прицеливания, который зависит от множества факторов.
Итак перейдем к формуле, которая состоит из 2 частей.
Код:
Шаг 1: Расчет максимального бонуса от дополнительного прицеливания.
---------------------------------------------------------------
Максимальный_Бонус_Прицеливания = 20 + ( (Базовый_Шанс / 20) * Уровень_Стрелка ) + (Точность_Оружия * 2) + 10 за каждый уровень умения Снайпер
Здесь используется Базовый_Шанс, значение, которое мы получали ранее. Если вы помните, он в основном базируется на нашей Меткости, Усталости, Морали, и состоянии оружия. Уровень персонажа в данной формуле не подвергается никаким модификациям. Точность оружия берется из XML-файла.
Максимальный_Бонус_Прицеливания это максимально возможный бонус, который мы получим от дополнительного прицеливания. Даже с 10x кратным снайперским прицелом, если мы достигли максимума - остальные ОД будут потрачены напрасно.
Далее несколько безумных расчетов.
Строка 1: "Бонус_Прицеливания = ........."
Во-первых, мы рассчитываем бонус прицеливания для пули. Он базируется на максимальном бонусе прицеливания и параметре "Прогресс_Прицеливания" который мы еще не разбирали. Прогресс_Прицеливания это значение, которое растет с каждым дополнительным ОД, потраченным на прицеливание. Для первого и второго потраченного ОД, Прогресс_Прицеливания равен 500, для третьего и четвертого становится 600, 5-6-7 - 750,и для 8 ОД - 1000. Чем больше мы прицеливаемся, тем больше бонус прицеливания.
Строка 2: "Максимальный_Бонус_Прицеливания ................"
Далее мы уменьшаем Максимальный_Бонус_Прицеливания. Таким образом, каждый раз, когда мы тратим дополнительные ОД на прицеливание и начинаем расчеты, мы получаем все более уменьшающиеся результаты. Поскольку Максимальный_Бонус_Прицеливания постоянно уменьшается, персонажи с низкой меткостью почувствуют снижение эффективности прицеливания сильнее, в тоже время, персонажи с высокой Меткостью не заметят значительного увеличения. Несколько иначе дело обстоит, если используется снайперская винтовка с хорошим прицелом, которая позволяет использовать до 8 дополнительных ОД. В этом случае, с учетом того, что их снайперской винтовки обычно ведут огонь на дальние дистанции (и соответственно шанс попадания будет изначально ниже), каждое дополнительно очко прицеливания может оказать значительную помощь для повышения шансов.
Строка 3: "Увеличиваем Реальный_Шанс ....."
Тут мы добавляем полученный бонус к текущему Шансу Попадания, приплюсовывая 0.5, с округлением вниз. Эти 0.5 довольно странная штука. На первый взгляд кажется, что они нужны для компенсации округления вниз, но не проще было бы сделать округление вверх? Да, кстати отрицательные значения бонуса тоже округляются вниз, причем -1,2 станет -2.
После отработки формулы для всех дополнительных ОД, потраченных на прицеливание, мы получим результат в виде модифицированного текущего Шанса Попадания.
Для наглядности приведем пример:
___________________________________________________
Хорошо, мы поговорили о бонусах, теперь о грустном - о штрафах к Шансу Попадания.
Начнем с чего-нибудь простого:
Код:
Если Стрелок - NPC, то
Если Уровень сложности - Легкий, то
Реальный_Шанс уменьшается на 5.
На Легком уровне игры, все персонажи противника имеют штраф равный 5 при стрельбе по вам.
На других уровнях будет иначе:
Код:
Если Стрелок - NPC, то
Если уровень сложности Трудный, то
Реальный_Шанс увеличивается на 5.
Если уровень сложности невозможный, то
Реальный_Шанс увеличивается на 10.
Все понятно, только стоит упомянуть, что на Нормальном уровне сложности модификаторов нет.
Теперь рассмотрим основные штрафы:
Код:
Если Стрелок находится под действием Газа, то
Реальный_Шанс уменьшается на 50!
Солдаты считаются "загазованными", если они находятся в облаке газа без противогаза. Если в начале хода они получают повреждения от газа - то считаются "загазованными" до конца хода
Код:
Если Стрелок перевязан, то
Реальный_Шанс уменьшается на 20!
Получившие рану теряют значительные шансы на попадание в противника.
Код:
Если Стрелок оглушен, то
Реальный_Шанс уменьшается на 5 за каждый уровень оглушения.
Шок проявляется при ранении персонажа. Он растет на 1 за каждые 10 хп, потерянных персонажем, и незначительно увеличивается за счет уменьшения Энергии персонажа от атаки. То есть, если вы потеряли 50 хп, шок будет около 5. Каждый ход шок уменьшается вдвое.
__________________________________________________
Сейчас мы перейдем к расчетам максимальной дальнобойности оружия. Это достаточно простые вычисления, но делаются они отдельно и потому опишем их сейчас. Надеюсь вы читали все внимательно, потому что мы будем говорить о параметре Уменьшение_Бонуса.
Формула:
Итак, у нас есть Максимальная_Дальнобойность_Оружия. Разберемся, что происходит, если цель находится дальше.
Важно: Максимальная Дальнобойность ни при каких условиях не может быть меньше 1 - это программное ограничение.
____________________________________________________
Мы переходим к использованию значения "Эффективной_Дальности" которое рассчитывали ранее. Помните, что это значение учитывает не только дальность до цели, но и камуфляж, препятствия и т.п.
Если Эффективная_Дальность равна 0 (например цель не видна), это означает, что мы не можем стрелять в цель. Но код продолжает считать исходя из значения 0, по некоторым не описанным тут причинам . Вместе с тем фактом, Что шанс Попадания не может быть меньше 1%, это означает, что любой выстрел чисто теоретически может попасть в цель.
_______________________________________________
В любом случае, теперь мы перейдем к работе с Реальным_Шансом - и рассмотрим, как к нему применяются модификаторы попадания от оружия, аттачей, и даже освещенности тайла, где находится цель.
Предупреждаю, это еще более запутанно, чем предыдущие примеры с прицеливанием!!!
Во-первых, мы применим к эффективной дальности модификатор прицеливания (чаще всего штраф!) от брони, надетых предметов, или любых аттачей на броне и наголовных предметах.
Формула:
Для примера, давайте используем Шапку Гилли. Она дает штраф к прицеливанию, впрочем большинство одеваемых предметов в 1.13 дают такой штраф.
Давайте считать, что Эффективная_Дальность до цели 100 метров (10 тайлов). Минимальное_Расстояние_Для_Бонуса_Прицеливания равно 0.
Расчеты:
Но давайте получим немного удовольствия от теоретизирования. Создадим прицел, который крепится на голове, вернее идет как аттач на шлеме. Пусть он дает бонус 20, как снайперский прицел, и его минимальная дальность для получения бонуса - 50. Используем 6 ОД для прицеливания. Дальность до цели остается прежней (100 метров - 10 тайлов).
Смотрим как бонус будет влиять на каждый ОД :
Ну вот как-то так. В результате последние 2 из 6 ОД принесли нам всего 2 пункта бонуса прицеливания - не очень выгодное вложение.
__________________________________________________
Мы рассмотрели все бонусы/штрафы прицеливания от брони, аттачей и т.п.
Код:
Эффективная_Дальность уменьшается на Финальный_Бонус_Прицеливания расчитаный выше.
Естественно, если есть комбинация вещей, дающих штрафы, то эффективная дальность УВЕЛИЧИВАЕТСЯ, что не радует. Наша задача уменьшать Эффективную_Дальность насколько возможно, для точной стрельбы.
______________________________________________________
То что мы делали в предыдущей секции, теперь необходимо сделать для аттачей на оружии. И снова, Минимальная Дальность будет играть свою роль вместе с Модификаторами_Дальности и Финальным_Бонусом_Прицеливания. Если хотите - перечитайте формулу, если хватит терпения, мы же обратим внимание на следующее:
Код:
Эффективная_Дальность уменьшается на Финальные_Бонусы_Прицеливания которые мы получаем от оружия и аттачей. (Жесткая проверка)
Здесь снова проявляет себя более серьезная зависимость эффективности оружия и аттачей от состояния. Наши бонусы исчезнут довольно быстро. Уже после 50% повреждений мы будем получать штрафы, что гораздо серьезнее
__________________________________________________
Следующий шаг - разобраться, как применяются прямые бонусы к Шансу Попадания от оружия или аттачей. Подобно тому, как мы делали с бонусом Прицеливания, нам необходимо все тоже самое проделать с бонусами к Шансу Попадания для все предметов.
Есть большая разница в применении бонусов Прицеливания и Попадания. Прицеливание зависит от количества ОД, потраченного нами. Бонусы попадания не зависят от ОД, но зависят от другого важного фактора - Дальности до цели, и "Эффективной Дальности ЛЦУ". Да, большинство предметов, дающих такие бонусы - это ЛЦУ и все они имеют эффективную дальность использования. Сейчас мы рассмотрим, как дальность влияет на попадание, а так же увидим влияние освещенности цели.
Надеваемые предметы (броня, предметы одеваемые на голову и их аттачи), расчитываются просто. "Эффективная Дальность ЛЦУ" не оказывает на них влияния и поэтому они дают неизменные бонусы или штрафы.
Для каждого одетого предмета выполняется:
Код:
Финальный_Бонус_Попадания = 0
Финальный_Бонус_Попадания увеличивается на значение Бонуса_Попадания предмета, взятое из XML
Для каждого аттача на предмете, выполнить:
Финальный_Бонус_Попадания увеличивается на значение Бонуса_Попадания аттача, взятое из XML
Здесь нам нет необходимости о чем-либо заботиться - о дальности, состоянии предмета и т.д. Все просто и понятно.
Прежде чем продолжить с оружием и его аттачами и рассмотреть Эффективную Дальность ЛЦУ, нам необходимо уточнить нашу Эффективную_Дальность.
Для начала вот это:
Код:
Если персонаж имеет умение Снайпер, то:
Эффективная_Дальность уменьшается на 5% от Реального_Расстояния_До_Цели
Если персонаж Эксперт Снайпер, то:
Уменьшаем Эффективная_Дальность еще на 5% от Реального_Расстояния_До_Цели
Умения Снайпера уменьшает Эффективное_Расстояние_До_Цели, еще до того, как мы начнем учитывать в расчетах эффективную дальность ЛЦУ. Это реально помогает при использовании ЛЦУ
Итак, с новым значением Эффективной_Дальности, мы готовы заняться бонусами Попадания оружия и оружейных аттачей.
______________________________________________
Для расчетов нам необходимы несколько значений:
Бонус Попадания Предмета: Это то, что мы хотим добавить к нашему Шансу Попадания. Берется из XML.
Эффективная Дальность ЛЦУ: так же берется из XML.
Бонус за Сошки: если они есть конечно - тоже из XML.
Проверяем, ведется ли стрельба Лежа?: Проверям условие на Истинность для определения, может ли применяться бонус за сошки. Кроме этого мы должны быть далее чем в 5 тайлах от цели, чтоб получить этот бонус!! Если цель ближе 5 тайлов от Стрелка, программа считает, что он не стрелят лежа, в независимости от реального положения тела
Итак, приступим к расчетам:
Код:
Финальный_Бонус_Попадания = 0
Если Стрелок лежит, то
Финальный_Бонус_Попадания увеличивается на Бонус_За_Сошки оружия, если они в него встроены.
Финальный_Бонус_Попадания увеличивается на Бонус_ЛЦУ если он встроен (Жесткая проверка проверка)
Финальный_Бонус_Попадания увеличивается на Бонус_Попадания_Боеприпасов.
Для каждого аттача выполняется:
Если Стрелок лежит, то
Финальный_Бонус_Попадания увеличивается на Бонус_За_Сошки
Финальный_Бонус_Попадания увеличивается на Бонус_ЛЦУ аттача (Жесткая проверка)
Выглядит просто, но не забывайте, что Бонус_ЛЦУ - это расчитываемое значение, зависящее от множества факторов. Мы сделаем это следующим шагом. Еще раз обратите внимания, что Бонус_ЛЦУ проходит Жесткую проверку, а значит сильно зависит от состояния предмета.
Расчитаем Бонус_ЛЦУ.
Код:
Если у предмета нет параметра Эффективная_Дальность_ЛЦУ, то
Бонус_ЛЦУ = Бонус_Попадания предмета (без изменений). Но помните, что раньше мы модифицировали его в зависимости от состояния!
Здесь мы рассмотрели вещи, которые имеют бонус Попадания, но не являясь ЛЦУ не имею эффективной дальности. Продолжим:
Код:
Если Эффективная_Дальность меньше или равна Эффективной_Дальности_ЛЦУ, то
Бонус_ЛЦУ = Бонусу_Попадания предмета (без изменений!). Но помните, что раньше мы модифицировали его в зависимости от состояния!
То есть, если мы на нужном расстоянии - ЛЦУ работает отлично, если он в хорошем состоянии.
Далее все усложняется.
Код:
Если Эффективная_Дальность больше Эффективной_Дальности_ЛЦУ, то
Максимальная_Дальность_ЛЦУ = Эффективная_Дальность_ЛЦУ * ( (2 * Освещенность_Точки_Стрельбы) + 21 ) / 18
Это жуткое упрощения, потому что на самом деле формула выглядит вот так:
Теперь давайте представим, что я вам не рассказал об этом.
Итак, мы имеем максимальную Дальность на которой мы можем видеть точку лазера, основанную на освещенности тайла с целью. Если цель в диапазоне "максимальной" дальности ЛЦУ, мы все еще сможем получать бонусы от ЛЦУ
Помните, что уровень освещенности, это не то, что вы видите, когда нажимаете клавишу "F". Все с точностью наоборот! Днем уровень освещенности обычно равен 3, а ночью - 12. То есть чем выше в программе уровень освещенности, тем темнее, поэтому логичнее было бы назвать это Уровнем Темноты ("DARKNESSLEVEL").
В любом случае, явно видно, что чем темнее, тем дальше будет видно точку лазера (что логично) и тем больше будет его максимальная дальность по сравнению с Эффективной _Дальностью_ЛЦУ. Конечно, если цель находится за пределами эффективной дальности, мы начнем терять бонус, но пока она не оказалась за максимальной дальностью, мы все еще будем получать его часть.
Давайте рассмотрим зависимость Бонуса_ЛЦУ от максимальной и эффективной дальности.
Код:
Бонус_ЛЦУ = ( Бонус_Попадания предмета * ( Максимальная _Дальность_ЛЦУ - Эффективная_Дальность ) ) / ( Максимальная _Дальность_ЛЦУ - Эффективная _Дальность_ЛЦУ предмета)
Каждый тайл вне Эффективной_Дальности_ЛЦУ уменьшает наши бонусы. Темнота помогает нам увеличить Максимальную _Дальность_ЛЦУ. Если цель вне максимальной дальности, то в результате мы получим 0.
Наконец, программа убеждается, что мы не получим Штрафа:
Код:
Если Бонус_ЛЦУ < 0, то
Бонус_ЛЦУ = 0.
Это интересно - Бонус_ЛЦУ проверятся "Жесткой проверкой", а значит при состоянии ЛЦУ < 50%, он начнет давать нам Штраф. Однако, если Бонус_ЛЦУ который мы расчитали равен 0 (фактически мы не используем ЛЦУ, поскольку цель вне радиуса его действия.), мы не получаем штрафа.
Давайте рассмотрим пример для полного понимания:
Бонус_ЛЦУ = ( 20 * ( 135 - 120 ) ) / ( 135 - 90 ) = 6.666 (округляем вниз до 6).
Итак, окончательный Бонус_ЛЦУ равен 6. Намного ниже оригинального бонуса ЛЦУ, но неплохо, с учетом, что цель была се эффективной дальности использования.
_______________________________________________
Все бонусы от ЛЦУ расчитываются и добавляются к нашему Реальному_Шансу. Но все же помните, что состояние ЛЦУ < 50% принесет вам Штраф и разочарование.
________________________________________________
Следующий модификатор основан на части тела, в которую производится выстрел.
Код:
Если мы стреляем в голову, то
Штраф_Стрельбы_В_Часть_Тела = 3 * Эффективная_Дальность / 10
Реальный_Шанс уменьшается на Штраф_Стрельбы_В_Часть_Тела
При стрельбе в голову мы теряем 3 очка за каждый тайл до цели.
Код:
Если мы стреляем в ноги, то
Штраф_Стрельбы_В_Часть_Тела = Эффективная_Дальность / 10
Реальный_Шанс уменьшается на Штраф_Стрельбы_В_Часть_Тела
При стрельбе в ноги, мы теряем по 1 пункеу за каждтайл до цели.
_____________________________________________________
Теперь, Дальность до цели вступает в расчеты. Мы сравниваем реальную дальность с эффективной дальнобойностью оружия, взятой из XML.
Код:
Штраф_Дальности = ( (Дальнобойность_Оружия - Расстояние_До_Цели) * 30 ) / 170
Если Штраф_Дальности имеет отрицательное значение, то
Реальный_Шанс уменьшается на Штраф_Дальности
Из формулы легко увидеть, что чем больше расстояние до цели превышает эффективную дальность оружия, тем больше будет расти штраф.
Пожалуйста учтите, что это еще не все штрафы за дальность до цели, Далее мы будет продолжать терять Шанс Попадания из-за нее.
Но пока давайте рассмотрим пару примеров:
Используем снайперскую винтовку. Ее дальнобойность равна 75 тайлов (750 метров), а Дальность до цели - 60 тайлов (600 метров)
Штраф_Дальности = ( (750 - 600) * 30 ) / 170 = 26.4
Штраф_Дальности Имеет положительное значение - штрафа нет.[/b]
Во втором примере мы стреляем из пистолета с дальнобойностью в 11 тайлов (110 метров) в цель в 13 тайлах (130 метров)
Штраф_Дальности = ( (110 - 130) * 30 ) / 170 = -3.5[/b]
Мы потеряли из-за дальности 3,5 пункта Шанса Попадания, и будет терять еще больше далее.
___________________________________________
Далее в программе идет проверка стрельбы танка. У танка есть обратная проблема - ему сложно стрелять на ближние дистанции:
Код:
Если Стрелок это Танк, и Расстояние_До_Цели в тайлах меньше чем (2 * стандартного радиуса обзора в тайлах), то
Штаф_Короткой_Дистанции_Танка = 2 * ( (2 * Обычный_Радиус_Обзора в тайлах) - Расстояние_До_Цели в тайлах )
Реальный_Шанс уменьшается на Штаф_Короткой_Дистанции_Танка
Нормальный радиус обзора величина не фиксированная и устанавливается в JA2_Options.INI. По умолчанию равна 13. Таким образом Танк будет получать штрафы, если цель ближе 26 тайлов
_____________________________________________________
Код:
Если Эффективная_Дальность = 0, то
Реальный_Шанс уменьшается на 80!!!
Это понятно. Эффективная дальность равна 0 только, если мы не видим цель, или если мы используем очень поврежденный прицел. Это означает, что мы пытаемся стрелять в слепую, что катастрофически уменьшает наши шансы на попадание.
_____________________________________________________
Далее рассмотрим кое-что интересное.
Код:
Универсальный_Модификатор_Дальности = 3 * (Нормальная_Дальность - Эффективная_Дальность) / 10
Реальный_Шанс увеличивается/уменьшается на Универсальный_Модификатор_Дальности
Это универсальный модификатор. Он дает 3 пункта бонуса или штрафа, в зависимости от Нормальной_Дальности. Но что такое "Нормальная Дальность"? Этьо фиксированное значение, установленное программистами равным 90 метрам (9 тайлов). Это означает, что мы получаем 3 очка бонуса за каждый тайл ближе нормальной дальности и 3 очка штрафа - за каждый тайл дальше этой дальности. Изменяя параметр Нормальной Дальности, можно серьезно изменить геймплей - упрощая попадание при его увеличении, и значительно усложняя стрельбу - при уменьшении.
__________________________________________________
Далее программа проверяет, не находятся ли стрелок и цель на разных уровнях карты (крыша).
Код:
Если Стрелок на крыше, а Цель на земле, то
Реальный_Шанс увеличивается на 15
Если Стрелок на земле, а Цель на крыше, то
Реальный_Шанс уменьшается на 25
Все очевидно - стрелять с крыши проще, и наоборот.
_________________________________________________
Продолжаем, и сейчас мы рассмотрим зависимость пропадания от положения тела цели, в то время, как раньше мы говорили о стойке стрелка.
Формула:
Целевая_Часть_Тела это числовое значение, где 1 = Голова, 2 = Торс, и 3 = Ноги. Расстояние_До_Цели всегда до 5 тайлов.
Пример:
Для Дальность 2, при стрельбе в Голову (1):
Штраф_Стрельбы_В_Часть_Тела = (5 - 1 - 2) * 10 = 20[/b]
Для Дальность 3, при стрельбе в Торс (2):
Штраф_Стрельбы_В_Часть_Тела = (5 - 2 - 3) * 10 = 0[/b]
И мы даже получим бонус, если будем стрелять в ноги.
Для Дальность 4, при стрельбе в Ноги (3):
Штраф_Стрельбы_В_Часть_Тела = (5 - 3 - 4) * 10 = -20[/b]
То есть мы получим бонус в 20!
Помните, что если вы не выбираете какую-то часть тела, для данной формулы попадание считается в Торс.
_______________________________________________________
Цель сидит, стреляет Танк:
Во-первых, Танк начинает получать штраф при стрельбе в сидящую цель на расстоянии меньше 12 тайлов.
Если стрелок не танк - эта часть формулы пропускается.Вторая часть формулы привела меня в ступор, возможно я так и нес мог понять правильных значений.
В любом случае, суть в том, что после дальности до цели в 16 тайлов (160 метров) танк начинает терять по 3 пункта в Шансе Попадания за каждый тайл, а при достижении определенного значения теряет сразу 20.
Цель Лежит:
Штрафы танка при стрельбе по лежащей цели увеличиваются вдвое, до максимума в 40!
_________________________________________________
Далее Шанс Попадания модифицируется за счет движения цели:
Код:
Штраф_За_Движение_Цели = количество пройденых тайлов * 1.5
Если Штраф_За_Движение_Цели > 30, то
Штраф_За_Движение_Цели = 30
Реальный_Шанс уменьшается на Штраф_За_Движение_Цели
Стрелок получает Штраф в 1,5 пункта за каждый пройденый целью тайл. Количество пройденых тайлов обнуляется в начале хода цели.
_______________________________________________________
Далее речь пойдет об уворачивании от пуль. Да, вы это умеете:). Уворот в основном зависит от Проворности цели, а компенсируетя его действие Ловкостью Стрелка.
Формула:
Штраф_Уворота основывается на Проворности и Уровне Цели. Что может влиять на Эффективный уровень цели мы рассматривали выше.
Если цель сидит или лежит - ее способность у увороту падает.
Ловкость и эффективный уровень стрелка опредеяют значение Компенсации Уворота.
Проверка на Танк и Королеву Жуков в расчете компенсации довольно кривая. Возможно в будущем кто-то решится и перепишет ее!!!
В любом случае, в конце значения сравниваются и стрелок либо получает штраф, либо остается при своих, в зависимости от прокачки крутости цели и себя самого!
___________________________________________________
Далее идет проверка, определяющая штраф для танка при стрельбе по площади.
Код:
Если Целевой_Тайл пуст, и Расстояние_До_Целелого_Тайла меньше 120 метров (12 тайлов), то
Штраф_Танка= 25 * ( 120 - Расстояние_До_Целевого_Тайла ) / 10
Она не дублирует прошлую формулу, которая применяется только если танк целится в кого-то конкретно.
___________________________________________________
Мы уже использовали в расчетах факторы ранения и усталости, но сейчас мы снова вернемся к ним, чтобы снова получит штрафы к своему Шансу Попадания.
Формула:
__________________________________________________
Сейчас мы рассмотрим основные штрафы, убивающие наши шансы на попадание.
Первый из них мы получаем его при стрельбе в цель, которая находится вне дальнобойности нашего оружия:
Код:
Если Расстояние_До_Цели больше чем Дальнобойность_Оружия, то
Реальный_Шанс уменьшается вдвое!
Все просто. Даже один лишний тайл до цели, по сравнению с дальнобойностью оружия сразу уменьшает наши шансы вдвое.
Следующий штраф:
Код:
Если цель вне радиуса видимости Стрелка, то
Реальный_Шанс уменьшается вдвое!
Таким образом, при стрельбе по наводке, мы сразу теряем половину своих шансов на попадание в цель. Именно поэтому снайперу так важно использовать сильные прицелы, позволяющие увеличивать дальность его обзора.
Хотите верьте, хотите нет, но мы подошли к финалу. Осталось рассмотреть всего несколько мелких замечаний:
Код:
Если Реальный_Шанс < 1, то
Реальный_Шанс = 1.
+End.
Черт побери, если вы дочитали до сюда - вы герой, потому что я взровал свой мозг.
Последние строки кода означают, что Шанс Попадания НИКОГДА не может быть меньше 1%. Раньше это приводило к тому, что желтопузый админ из самого слабого пистолета мог засадить в вас пулю через всю карту, что не могло не раздражать. Слава богу, что в 1.13, это было поправлено и теперь вы можете выставить в INI файле как 0 минимальный шанс, так и просто уменьшить вероятность таких попаданий с 1/100 до 1/1000 и более
------------------------------------------------
Значение параметра Реальный_Шанс и будет нашим Шансом Попадания для конкретного выстрела.
В качестве обобщения материала:
Список вещей и действий, улучшающих/ухудшающих Шанс Попадания: