Авторизация
Ip-адрес
Статистика
Реклама
Категории
Реклама

Как это работает. Шанс Попадания в цель.

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

В тексте вы найдете некий код, если вы еще и играли в JA2, то вам не составит труда в комментарии написать, что он означает. Победитель получит 3 моих плюса (+5) в своих постах (осмысленных). Я бы медаль давал, но не уверен, что получу ее сам за этот пост :)

Автор благодарит тех, кого уже благодарил:

компанию SirTech за предоставленные исходники, а также наших и забугорных камрадов за информацию и почву для размышлений.

Отдельная благодарность Little Alien'у, чьи труды вдохновили на создание данной статьи.

В упрощенном и приближенном виде мы можете ознакомиться с этими данными тут.

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

Для начала определимся с терминологией:

    Стрелок (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 тайлу.

Давайте посмотрим как Дальность участвует в расчетах и для этого перейдем к следующей секции, которая рассчитывает модификаторы Шанса Попадания, в зависимости от стойки персонажа.

Начнем с положения стрельбы "Стоя":

Код:

Если Стрелок стоит, то

Если используется Сильный_Прицел, и Дальность_До_Цели больше чем Минимальное Расстояние_Для_Бонуса_Прицелов для данного прицела, то

Штраф_Прицела = Бонус_Прицела * (Дальность - Минимальное_Расстояние_Для_Бонуса_Прицелов) / 1000

Если Штраф_Прицела > 20, то

Штраф_Прицела = 20

В общем, если вы стреляете стоя, то вы не получаете штрафа, если только вы не используете снайперскую винтовку с очень сильным прицелом (Помните? бонус +15 или больше дают только сильные прицелы).

Если такой прицел используется, Минимальное Расстояние_Для_Бонуса_Прицелов берется из 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.

Далее рассмотрим, что будет при стрельбе сидя:

Код:

Если Стрелок сидит, то

Бонус_Стойки = Дальность в ТАЙЛАХ

Если Бонус_Стойки > 10, то

Бонус_Стойки = 10

Проще говоря, бонус за стрельбу сидя равен дальности до цели в тайлах! Чем дальше от нас цель, тем проще попасть в нее сидя! Важно заметить, что это работает только на дальности до 10 тайлов (не может быть больше 10) и в сравнении с стрельбой стоя не является чем-то значительным. Небольшая деталь, которая может позволить нам сэкономить несколько ОД в ближнем бою, не так ли?

Стрельба сидя так же дает нам небольшой штраф за стрельбу с сильными прицелами, фактически - 1/2 от штрафа за стрельбу стоя.

Стрельба лежа - лучшая из 3 возможных:

Код:

Если Стрелок лежит, то

Бонус_Стойки = Дальность в ТАЙЛАХ

Если Бонус_Стойки > 20, то

Бонус_Стойки = 20

Так же как в предыдущем случае, но реально эффективная дальность и бонус увеличиваются вдвое - до 20.

Но главной особенностью стрельбы лежа является то, то она не дает штрафов на стрельбу с сильными прицелами! Снайперы должны стрелять лежа, когда это возможно. Конечно, штрафы невелики, но стрельба лежа позволяет пользоваться бонусом за сошки, о чем мы поговорим ниже.

Давайте используем рассчитанные параметры:

Код:

Реальный_Шанс = Реальный_Шанс + Бонус_Стойки - Штраф_Прицела

_________________________________________________________

Код:

Реальный_Шанс увеличивается на значение Точности оружия

Это должно быть очевидным - Точность для оружия берется из Weapons.XML.

_______________________________________________

Далее мы рассмотрим пистолеты и стрельбу с двух рук:

Код:

Если Оружие Одноручное, то

Если Вторая рука свободна, то

Если Оружие это пистолет, то

Реальный_Шанс увеличивается на 5

Иначе (Если в другой руке что-либо есть)

Если Оружие это SMG, то

Реальный_Шанс уменьшается на 5

Если персонаж не имеет умения Двоерукость, то

Если попытка стрельбы с двух рук, то

Реальный_Шанс уменьшается на 20!

Сначала идет проверка оружия на принадлежность к пистолетам или SMG. Если она не пройдена, расчеты прерываются.

Если другая рука свободна и мы не держим в ней ничего (НИЧЕГО ВООБЩЕ), и стреляем из пистолета, то мы можем стрелять держа его двумя руками и получить +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%.

________________________________________________

Теперь мы можем использовать эти формулы в расчетах.

Начнем с рассмотрения штрафов в режимах автоматической стрельбы:

Код:

Если пуля выпущена как часть залпа (стрельбы с отсечкой), то

Штраф_Отсечки = Штраф_Отсечки_Оружия * (количество уже выпущенных пуль - 1)

Если Стрелок имеет умение АВТОМАТИЧЕСКОЕ ОРУЖИЕ, то

Штраф_Отсечки уменьшается наполовину за каждый уровень умения

Реальный_Шанс уменьшается на Штраф_Отсечки

Все просто - штраф при стрельбе с отсечкой начинает начисляться для каждой пули, кроме первой и растет с каждой следующей пулей. Умение Автоматическое оружие уменьшает штраф вдвое, а умение Эксперт Автоматического оружия - еще вдвое (в результате от штрафа может остаться 25%).

Для расчета Штрафа_Отсечки_Оружия, программа делает это:

Код:

Штраф_Отсечки = Изначальный_Штраф_Отсечки_Оружия

Бонус_Отсечки = Бонус_Попадания_С_Отсечкой_Оружия (Умеренная проверка )

Бонус_Отсечки увеличивается на Бонус_Попадания_С_Отсечкой_Боеприпасов

Бонус_Отсечки увеличивается на Бонус_Попадания_С_Отсечкой (Жесткая проверка ) каждого аттача, которые его дает.

Если Стрелок лежит, то

Бонус_Отсечки увеличивается на Оружейный_Бонус_За_Сошки

Бонус_Отсечки увеличивается на Бонус_За_Сошки каждого аттача, который его дает

Штраф_Отсечки уменьшается на Бонус_Отсечки

В результате мы имеем 2 значения - Штраф_Отсечки, и Бонус_Отсечки. В конце они объединяются.

Изначальный штраф за стрельбу с отсечкой берется из Weapons.XML.

Бонусы попадания при стрельбе с отсечкой компенсируют штраф. Вы можете видеть, что бонусы оружия, боеприпасов или аттачей для стрельбы с отсечкой способны уменьшить штраф. В настоящий момент, только Рукоятка (или встроенная рукоятка) может делать это. Помните, что аттачи в плохом состоянии будут увеличивать штраф, а не давать бонус, поскольку они проверяются "Жесткой проверкой".

Наконец, если стрелок лежит, он сможет получить бонусы за сошки.

Штраф_Отсечки и Бонус_Отсечки в результате приводят к 0 или отрицательному значению. Невозможно получить положительное значение Штрафа Отсечки, нынешний алгоритм программы это не позволяет, и это логично.

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

Кроме того, для стрельбы очередями более важным является состояние оружия. Это происходит потому, что все бонусы при стрельбе очередями проверяются "Жесткой проверкой", и при состоянии менее 50% только увеличивают штраф. В результате получаем следующее:

Код:

Реальный_Шанс уменьшается на Штраф_Отсечки, или

Реальный_Шанс уменьшается на Штраф_Очереди...

в зависимости от режима стрельбы

____________________________________________

Теперь переходим к дальнейшим вычислениям, в которых будут участвовать другие параметры, в первую очередь это Дальность.

Мы уже рассматривали "чистое" расстояние до цели, которое отражает расстояние между стрелком и целью.

Теперь мы добавляем еще один параметр - "Эффективная_Дальность". Это значение рассчитывается иначе. Важно, что этот параметр будет использоваться гораздо чаще, чем фактическая дальность.

Если "Эффективная_Дальность" равна 0, то мы увидим "нельзя попасть". Конечно, теоретически, вы все еще имеете некоторые шансы попасть в цель, но это не предмет наших исследований.

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

___________________________________________________

Если мы видим цель, и имеем дополнительные ОД на прицеливание, программа рассчитывает наш бонус прицеливания. Эта часть расчетов может быть трудна для понимания, будьте внимательны.

В оригинальной JA2, каждое очко, потраченное на прицеливание давало прямой бонус +10. В 1.13, отличий не много, но факторов, участвующих в расчете бонуса больше, и в дополнение, мы получили ограничение максимального бонуса прицеливания, который зависит от множества факторов.

Итак перейдем к формуле, которая состоит из 2 частей.

Код:

Шаг 1: Расчет максимального бонуса от дополнительного прицеливания.

---------------------------------------------------------------

Максимальный_Бонус_Прицеливания = 20 + ( (Базовый_Шанс / 20) * Уровень_Стрелка ) + (Точность_Оружия * 2) + 10 за каждый уровень умения Снайпер

Здесь используется Базовый_Шанс, значение, которое мы получали ранее. Если вы помните, он в основном базируется на нашей Меткости, Усталости, Морали, и состоянии оружия. Уровень персонажа в данной формуле не подвергается никаким модификациям. Точность оружия берется из XML-файла.

Максимальный_Бонус_Прицеливания это максимально возможный бонус, который мы получим от дополнительного прицеливания. Даже с 10x кратным снайперским прицелом, если мы достигли максимума - остальные ОД будут потрачены напрасно.

Далее несколько безумных расчетов.

Код:

Шаг 2: Определяем бонус прицеливания для каждого дополнительно потраченного ОД.

--------------------------------------------------------

Бонус_Прицеливания = (Максимальный_Бонус_Прицеливания * Прогресс_Прицеливания / 1000), но не более 10.

Максимальный_Бонус_Прицеливания уменьшается на Бонус_Прицеливания

Увеличиваем Реальный_Шанс на (Бонус_Прицеливания + 0.5), с округлением вниз.

Давайте рассмотрим по строкам.

Строка 1: "Бонус_Прицеливания = ........."

Во-первых, мы рассчитываем бонус прицеливания для пули. Он базируется на максимальном бонусе прицеливания и параметре "Прогресс_Прицеливания" который мы еще не разбирали. Прогресс_Прицеливания это значение, которое растет с каждым дополнительным ОД, потраченным на прицеливание. Для первого и второго потраченного ОД, Прогресс_Прицеливания равен 500, для третьего и четвертого становится 600, 5-6-7 - 750,и для 8 ОД - 1000. Чем больше мы прицеливаемся, тем больше бонус прицеливания.

Строка 2: "Максимальный_Бонус_Прицеливания ................"

Далее мы уменьшаем Максимальный_Бонус_Прицеливания. Таким образом, каждый раз, когда мы тратим дополнительные ОД на прицеливание и начинаем расчеты, мы получаем все более уменьшающиеся результаты. Поскольку Максимальный_Бонус_Прицеливания постоянно уменьшается, персонажи с низкой меткостью почувствуют снижение эффективности прицеливания сильнее, в тоже время, персонажи с высокой Меткостью не заметят значительного увеличения. Несколько иначе дело обстоит, если используется снайперская винтовка с хорошим прицелом, которая позволяет использовать до 8 дополнительных ОД. В этом случае, с учетом того, что их снайперской винтовки обычно ведут огонь на дальние дистанции (и соответственно шанс попадания будет изначально ниже), каждое дополнительно очко прицеливания может оказать значительную помощь для повышения шансов.

Строка 3: "Увеличиваем Реальный_Шанс ....."

Тут мы добавляем полученный бонус к текущему Шансу Попадания, приплюсовывая 0.5, с округлением вниз. Эти 0.5 довольно странная штука. На первый взгляд кажется, что они нужны для компенсации округления вниз, но не проще было бы сделать округление вверх? Да, кстати отрицательные значения бонуса тоже округляются вниз, причем -1,2 станет -2.

После отработки формулы для всех дополнительных ОД, потраченных на прицеливание, мы получим результат в виде модифицированного текущего Шанса Попадания.

Для наглядности приведем пример:

Берем наемника со следующими параметрами:

Базовый_Шанс = 55 (Шанс Попадания с учетом Меткости, Усталости, и т.п., но до применения бонусов стойки и т.д.)

Уровень_Стрелка = 3 (средний наемник)

Точность_Оружия = 5 (весьма неплохая винтовка)

Кроме того, будем считать, что у наемника есть умение Снайпер.

Итак первая часть формулы:

Максимальный_Бонус_Прицеливания = 20 + ( ( 55 / 20 ) * 3 ) + (5 * 2) + 10 * 1 = 48.25

Теперь возьмем Реальный_Шанс (Шанс Попадания после применения модификаторов стоек и т.д.) равным 40. Мы будем прицеливаться используя 8 дополнительных ОД. Вторая часть формулы будет применена 8 раз. Итак, первое ОД:

Бонус_Прицеливания = (48.25 * 500) / 1000 = 24.125, поскольку больше 10, берем 10.

Максимальный_Бонус_Прицеливания = 48.25 - 10 = 38.25

Реальный_Шанс = 40 + ( 10 + 0.5 округляем вниз ) = 50

Отлично + 10. Второе ОД:

Бонус_Прицеливания = (38.25 * 500) / 1000 = 19.125, поскольку больше 10, берем 10.

Максимальный_Бонус_Прицеливания = 38.25 - 10 = 28.25

Реальный_Шанс = 50 + ( 10 + 0.5 округляем вниз ) = 60

Снова +10! Третье ОД:

Бонус_Прицеливания = (28.25 * 600) / 1000 = 16.95, поскольку больше 10, берем 10.

Максимальный_Бонус_Прицеливания = 28.25 - 10 = 18.25

Реальный_Шанс = 60 + ( 10 + 0.5 округляем вниз ) = 70

Опять 10. Но теперь Прогресс_Прицеливания увеличивается с 500 до 600, и это начинает снижать Максимальный_Бонус_Прицеливания. Пока нам помогает то, что начальный максимум был высок (48.25), что позволило сохранять высокие результаты. Четвертое ОД:

Бонус_Прицеливания = (18.25 * 600) / 1000 = 10.95, поскольку больше 10, берем 10.

Максимальный_Бонус_Прицеливания = 18.25 - 10 = 8.25

Реальный_Шанс = 70 + ( 10 + 0.5 округляем вниз ) = 80

Снова 10. Но теперь максимальный бонус серьезно снизился. Большинство винтовок не позволяют использовать больше ОД на прицеливание и мы получим результат в +40 к Шансу Попадания. В основном это произошло за счет умения Снайпер, и высокой Точности винтовки, благодаря чему Базовый_Шанс в начале был высок. Но у нас снайперская винтовка и мы продолжаем. Для пятого ОД:

Бонус_Прицеливания = (8.25 * 750) / 1000 = 6.18, меньше 10 - берем 6.18

Максимальный_Бонус_Прицеливания = 8.25 - 6.18 = 2.07

Реальный_Шанс = 80 + ( 6.18 + 0.5 округляется вниз ) = 86

Ну вот, мы получаем всего 6. Наш Уровень и умение Снайпера тут наиболее важны - будь они выше - мы все еще могли бы получать тут максимальный бонус (более10!). К несчастью, Прогресс_Прицеливания еще более увеличивается с 600 до 750 и теперь будет еще сложнее получить хороший результат. Шестое ОД:

Бонус_Прицеливания = (2.07 * 750) / 1000 = 1.552, результат всего лишь 1.552

Максимальный_Бонус_Прицеливания = 2.07 - 1.552 = 0.51

Реальный_Шанс = 86 + ( 1.552 + 0.5 округляем вниз ) = 88

Всего +2! Практически это ОД потрачено впустую! При седьмом ОД случится следующее:

Бонус_Прицеливания = (0.51 * 750) / 1000 = 0.38

Максимальный_Бонус_Прицеливания = 0.51 - 0.38 = 0.13

Реальный_Шанс = 88 + ( 0.51 + 0.5 округляем вниз ) = 89

Одно очко, и то, благодаря удачному результату в 0.51. Можем ли мы надеяться хотя бы на такой же результат с 8 ОД? Смотрим:

Бонус_Прицеливания = (0.13 * 1000) / 1000 = 0.13

Максимальный_Бонус_Прицеливания = 0.13-0.13 = 0

Реальный_Шанс = 89 + ( 0.13 + 0.5 округляем вниз ) = 89

Хрена там, шансов нет.

Итак, насколько мы повысили свои шансы? Реальный_Шанс был равен 40, и стал равен 89. 49 очков - практически точно соответствует начальному Максимальному_Бонусу_Прицеливания! Фактически мы использовали свои возможности на 100%. Единственное, что для меня странно - почему в формуле не задействована Ловкость персонажа.

___________________________________________________

Хорошо, мы поговорили о бонусах, теперь о грустном - о штрафах к Шансу Попадания.

Начнем с чего-нибудь простого:

Код:

Если Стрелок - NPC, то

Если Уровень сложности - Легкий, то

Реальный_Шанс уменьшается на 5.

На Легком уровне игры, все персонажи противника имеют штраф равный 5 при стрельбе по вам.

На других уровнях будет иначе:

Код:

Если Стрелок - NPC, то

Если уровень сложности Трудный, то

Реальный_Шанс увеличивается на 5.

Если уровень сложности невозможный, то

Реальный_Шанс увеличивается на 10.

Все понятно, только стоит упомянуть, что на Нормальном уровне сложности модификаторов нет.

Теперь рассмотрим основные штрафы:

Код:

Если Стрелок находится под действием Газа, то

Реальный_Шанс уменьшается на 50!

Солдаты считаются "загазованными", если они находятся в облаке газа без противогаза. Если в начале хода они получают повреждения от газа - то считаются "загазованными" до конца хода

Код:

Если Стрелок перевязан, то

Реальный_Шанс уменьшается на 20!

Получившие рану теряют значительные шансы на попадание в противника.

Код:

Если Стрелок оглушен, то

Реальный_Шанс уменьшается на 5 за каждый уровень оглушения.

Шок проявляется при ранении персонажа. Он растет на 1 за каждые 10 хп, потерянных персонажем, и незначительно увеличивается за счет уменьшения Энергии персонажа от атаки. То есть, если вы потеряли 50 хп, шок будет около 5. Каждый ход шок уменьшается вдвое.

__________________________________________________

Сейчас мы перейдем к расчетам максимальной дальнобойности оружия. Это достаточно простые вычисления, но делаются они отдельно и потому опишем их сейчас. Надеюсь вы читали все внимательно, потому что мы будем говорить о параметре Уменьшение_Бонуса.

Формула:

Код:

Максимальная_Дальнобойность_Оружия = Дальнобойность_Оружия, из XML-файла

Максимальная_Дальнобойность_Оружия увеличивается на собственный бонус дальности (если есть) (Умеренная проверка )

Максимальная_Дальнобойность_Оружия увеличивается на бонус дальности боеприпасов (если есть).

Для каждого аттача выполнить:

Если аттач не Утконос, или если Утконос, но мы стреляем Картечью, то

Максимальная_Дальнобойность_Оружия увеличивается на бонус дальности аттача (Умеренная проверка )

Дальнобойность оружия - это значение, которое прописано для него в Weapons.XML, она модифицируется собственными бонусами дальности (от встроенных аттачей), боеприпасами (Линейные боеприпасы увеличивают дальность, а Вышибные заряды дробовика - уменьшают), и аттачами. Утконос дает штраф дальности, только, если мы стреляем не Картечью/Дробью. Вы должны помнить, что все эти бонусы проверяются "Умеренно", и соответственно состояние оружия способно свести их к 0, но не превратить в штрафы.

Итак, у нас есть Максимальная_Дальнобойность_Оружия. Разберемся, что происходит, если цель находится дальше.

Важно: Максимальная Дальнобойность ни при каких условиях не может быть меньше 1 - это программное ограничение.

____________________________________________________

Мы переходим к использованию значения "Эффективной_Дальности" которое рассчитывали ранее. Помните, что это значение учитывает не только дальность до цели, но и камуфляж, препятствия и т.п.

Если Эффективная_Дальность равна 0 (например цель не видна), это означает, что мы не можем стрелять в цель. Но код продолжает считать исходя из значения 0, по некоторым не описанным тут причинам . Вместе с тем фактом, Что шанс Попадания не может быть меньше 1%, это означает, что любой выстрел чисто теоретически может попасть в цель.

_______________________________________________

В любом случае, теперь мы перейдем к работе с Реальным_Шансом - и рассмотрим, как к нему применяются модификаторы попадания от оружия, аттачей, и даже освещенности тайла, где находится цель.

Предупреждаю, это еще более запутанно, чем предыдущие примеры с прицеливанием!!!

Во-первых, мы применим к эффективной дальности модификатор прицеливания (чаще всего штраф!) от брони, надетых предметов, или любых аттачей на броне и наголовных предметах.

Формула:

Код:

Финальный_Бонус_Прицеливания = 0

Если Расстояние_До_Цели меньше, чем Минимальное_Расстояние_Для_Бонуса_Прицеливания_ Предмета, то

Возвращаем 0! нет бонусов или штрафов.

Иначе

Если Модификатор_Прицеливания_Брони это штраф (меньше 0), то

Дополнительные_ОД_На_Прицеливание = 1

Расстояние_До_Цели = Эффективная_Дальность

Для каждого Дополнительного_ОД_На_Прицеливание:

Модификатор_Дальности = (Бонус_Прицеливания_Предмета * Расстояние_До_Цели) / 100

Расстояние_До_Цели уменьшается на Модификатор_Дальности

Финальный_Бонус_Прицеливания увеличивается на Модификатор_Дальности

Если Расстояние_До_Цели меньше чем Минимальное_Расстояние_Для_Бонуса_Прицеливания, то

Модификатор_Дальности равен (Минимальное_Расстояние_Для_Бонуса_Прицеливания_Предмета - Расстояние_До_Цели)

Финальный_Бонус_Прицеливания уменьшается на Модификатор_Дальности

Берем в качестве результата Финальный_Бонус_Прицеливания.

Тут мы проверяем предметы на наличие штрафа прицеливания, и на основании этого уменьшаем наш Бонус Прицеливания

Для примера, давайте используем Шапку Гилли. Она дает штраф к прицеливанию, впрочем большинство одеваемых предметов в 1.13 дают такой штраф.

Давайте считать, что Эффективная_Дальность до цели 100 метров (10 тайлов). Минимальное_Расстояние_Для_Бонуса_Прицеливания равно 0.

Расчеты:

Если 100 меньше или равно 0, то

Вернуть 0!

Это не выполняется, идем далее.

Если Модификатор_Прицеливания_Брони это штраф, Дополнительные_ОД_На_Прицеливание = 1

Модификатор прицеливания от костюма Гилли -1, и это штраф. Далее.

Расстояние_До_Цели = 100

Для каждого Дополнительного_ОД_На_Прицеливание, выполнить:

Модификатор_Дальности = ( -1 * 100 ) / 100 = -1

Расстояние_До_Цели = 100 - (-1) = 101

Финальный_Бонус_Прицеливания увеличивается на (-1) (то есть теперь -1).

Итак мы получили штраф за костюм Гилли.

Если 101 меньше 0, то

Ну вообщем это не произойдет.

Итак, мы получили штраф в единицу.

Но давайте получим немного удовольствия от теоретизирования. Создадим прицел, который крепится на голове, вернее идет как аттач на шлеме. Пусть он дает бонус 20, как снайперский прицел, и его минимальная дальность для получения бонуса - 50. Используем 6 ОД для прицеливания. Дальность до цели остается прежней (100 метров - 10 тайлов).

Смотрим как бонус будет влиять на каждый ОД :

Финальный_Бонус_Прицеливания = 0

Если 100 меньше или равно 50, то

Возвращаем 0!.

Тут все нормально, продолжаем.

Иначе

Если 20 это штраф (меньше 0), то

Дополнительные_ОД_На_Прицеливание = 1

20 это не штраф значит у нас будет 6 циклов так как мы используем 6 ОД.

Расстояние_До_Цели = 100

Для каждого Дополнительного_ОД_На_Прицеливание, выполняем:

Модификатор_Дальности = (20 * 100) / 100 = 20

Расстояние_До_Цели = 100 - 20 = 80

Финальный_Бонус_Прицеливания = 0 + 20 = 20

Получаем бонус 20.

Если 80 меньше или равно 50, то

Ну пока продолжаем - далее #2:

Модификатор_Дальности = (20 * 80) / 100 = 16

Расстояние_До_Цели = 80 - 16 = 64

Финальный_Бонус_Прицеливания = 20 + 16 = 36

Теперь бонус стал 36. Мы получили за этот ОД меньший бонус. Дальность уменьшилась соответственно. Далее для третьего ОД #3:

Модификатор_Дальности = (20 * 64) / 100 = 12.8 (округляем до 12)

Расстояние_До_Цели = 64 - 12 = 52

Финальный_Бонус_Прицеливания = 36 + 12 = 48

Хорошо идем дальше #4:

Модификатор_Дальности = (20 * 52) / 100 = 10.4 (округляем до 10)

Расстояние_До_Цели = 52 - 10 = 42

Финальный_Бонус_Прицеливания = 48 + 10 = 58

Итак бонус за ОД все уменьшался и уменьшался. Да, и к томуже теперь Расстояние_До_Цели меньше 50 а значит:

Если Расстояние_До_Цели (42) меньше Минимального_Расстояния_Для_Бонуса_Прицеливания (50), то

Модификатор_Дальности = (50 - 42) = 8

Финальный_Бонус_Прицеливания = 58 - 8 = 50

В результате Финальный_Бонус_Прицеливания, равен 50.

Ну вот как-то так. В результате последние 2 из 6 ОД принесли нам всего 2 пункта бонуса прицеливания - не очень выгодное вложение.

__________________________________________________

Мы рассмотрели все бонусы/штрафы прицеливания от брони, аттачей и т.п.

Код:

Эффективная_Дальность уменьшается на Финальный_Бонус_Прицеливания расчитаный выше.

Естественно, если есть комбинация вещей, дающих штрафы, то эффективная дальность УВЕЛИЧИВАЕТСЯ, что не радует. Наша задача уменьшать Эффективную_Дальность насколько возможно, для точной стрельбы.

______________________________________________________

То что мы делали в предыдущей секции, теперь необходимо сделать для аттачей на оружии. И снова, Минимальная Дальность будет играть свою роль вместе с Модификаторами_Дальности и Финальным_Бонусом_Прицеливания. Если хотите - перечитайте формулу, если хватит терпения, мы же обратим внимание на следующее:

Код:

Эффективная_Дальность уменьшается на Финальные_Бонусы_Прицеливания которые мы получаем от оружия и аттачей. (Жесткая проверка)

Здесь снова проявляет себя более серьезная зависимость эффективности оружия и аттачей от состояния. Наши бонусы исчезнут довольно быстро. Уже после 50% повреждений мы будем получать штрафы, что гораздо серьезнее

__________________________________________________

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

Есть большая разница в применении бонусов Прицеливания и Попадания. Прицеливание зависит от количества ОД, потраченного нами. Бонусы попадания не зависят от ОД, но зависят от другого важного фактора - Дальности до цели, и "Эффективной Дальности ЛЦУ". Да, большинство предметов, дающих такие бонусы - это ЛЦУ и все они имеют эффективную дальность использования. Сейчас мы рассмотрим, как дальность влияет на попадание, а так же увидим влияние освещенности цели.

Надеваемые предметы (броня, предметы одеваемые на голову и их аттачи), расчитываются просто. "Эффективная Дальность ЛЦУ" не оказывает на них влияния и поэтому они дают неизменные бонусы или штрафы.

Для каждого одетого предмета выполняется:

Код:

Финальный_Бонус_Попадания = 0

Финальный_Бонус_Попадания увеличивается на значение Бонуса_Попадания предмета, взятое из XML

Для каждого аттача на предмете, выполнить:

Финальный_Бонус_Попадания увеличивается на значение Бонуса_Попадания аттача, взятое из XML

Здесь нам нет необходимости о чем-либо заботиться - о дальности, состоянии предмета и т.д. Все просто и понятно.

Прежде чем продолжить с оружием и его аттачами и рассмотреть Эффективную Дальность ЛЦУ, нам необходимо уточнить нашу Эффективную_Дальность.

Для начала вот это:

Код:

Если персонаж имеет умение Снайпер, то:

Эффективная_Дальность уменьшается на 5% от Реального_Расстояния_До_Цели

Если персонаж Эксперт Снайпер, то:

Уменьшаем Эффективная_Дальность еще на 5% от Реального_Расстояния_До_Цели

Умения Снайпера уменьшает Эффективное_Расстояние_До_Цели, еще до того, как мы начнем учитывать в расчетах эффективную дальность ЛЦУ. Это реально помогает при использовании ЛЦУ

Итак, с новым значением Эффективной_Дальности, мы готовы заняться бонусами Попадания оружия и оружейных аттачей.

______________________________________________

Для расчетов нам необходимы несколько значений:

    Бонус Попадания Предмета: Это то, что мы хотим добавить к нашему Шансу Попадания. Берется из XML.

    Эффективная Дальность ЛЦУ: так же берется из XML.

    Бонус за Сошки: если они есть конечно - тоже из XML.

Проверяем, ведется ли стрельба Лежа?: Проверям условие на Истинность для определения, может ли применяться бонус за сошки. Кроме этого мы должны быть далее чем в 5 тайлах от цели, чтоб получить этот бонус!! Если цель ближе 5 тайлов от Стрелка, программа считает, что он не стрелят лежа, в независимости от реального положения тела

Итак, приступим к расчетам:

Код:

Финальный_Бонус_Попадания = 0

Если Стрелок лежит, то

Финальный_Бонус_Попадания увеличивается на Бонус_За_Сошки оружия, если они в него встроены.

Финальный_Бонус_Попадания увеличивается на Бонус_ЛЦУ если он встроен (Жесткая проверка проверка)

Финальный_Бонус_Попадания увеличивается на Бонус_Попадания_Боеприпасов.

Для каждого аттача выполняется:

Если Стрелок лежит, то

Финальный_Бонус_Попадания увеличивается на Бонус_За_Сошки

Финальный_Бонус_Попадания увеличивается на Бонус_ЛЦУ аттача (Жесткая проверка)

Выглядит просто, но не забывайте, что Бонус_ЛЦУ - это расчитываемое значение, зависящее от множества факторов. Мы сделаем это следующим шагом. Еще раз обратите внимания, что Бонус_ЛЦУ проходит Жесткую проверку, а значит сильно зависит от состояния предмета.

Расчитаем Бонус_ЛЦУ.

Код:

Если у предмета нет параметра Эффективная_Дальность_ЛЦУ, то

Бонус_ЛЦУ = Бонус_Попадания предмета (без изменений). Но помните, что раньше мы модифицировали его в зависимости от состояния!

Здесь мы рассмотрели вещи, которые имеют бонус Попадания, но не являясь ЛЦУ не имею эффективной дальности. Продолжим:

Код:

Если Эффективная_Дальность меньше или равна Эффективной_Дальности_ЛЦУ, то

Бонус_ЛЦУ = Бонусу_Попадания предмета (без изменений!). Но помните, что раньше мы модифицировали его в зависимости от состояния!

То есть, если мы на нужном расстоянии - ЛЦУ работает отлично, если он в хорошем состоянии.

Далее все усложняется.

Код:

Если Эффективная_Дальность больше Эффективной_Дальности_ЛЦУ, то

Максимальная_Дальность_ЛЦУ = Эффективная_Дальность_ЛЦУ * ( (2 * Освещенность_Точки_Стрельбы) + 21 ) / 18

Это жуткое упрощения, потому что на самом деле формула выглядит вот так:

Код:

INT32 iMaxLaserRange = ( pItem->bestlaserrange*( 2*bLightLevel + 3*NORMAL_LIGHTLEVEL_NIGHT - 5*NORMAL_LIGHTLEVEL_DAY ) ) / ( 2 * ( NORMAL_LIGHTLEVEL_NIGHT - NORMAL_LIGHTLEVEL_DAY ) );

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

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

Итак, мы имеем максимальную Дальность на которой мы можем видеть точку лазера, основанную на освещенности тайла с целью. Если цель в диапазоне "максимальной" дальности ЛЦУ, мы все еще сможем получать бонусы от ЛЦУ

Помните, что уровень освещенности, это не то, что вы видите, когда нажимаете клавишу "F". Все с точностью наоборот! Днем уровень освещенности обычно равен 3, а ночью - 12. То есть чем выше в программе уровень освещенности, тем темнее, поэтому логичнее было бы назвать это Уровнем Темноты ("DARKNESSLEVEL").

В любом случае, явно видно, что чем темнее, тем дальше будет видно точку лазера (что логично) и тем больше будет его максимальная дальность по сравнению с Эффективной _Дальностью_ЛЦУ. Конечно, если цель находится за пределами эффективной дальности, мы начнем терять бонус, но пока она не оказалась за максимальной дальностью, мы все еще будем получать его часть.

Давайте рассмотрим зависимость Бонуса_ЛЦУ от максимальной и эффективной дальности.

Код:

Бонус_ЛЦУ = ( Бонус_Попадания предмета * ( Максимальная _Дальность_ЛЦУ - Эффективная_Дальность ) ) / ( Максимальная _Дальность_ЛЦУ - Эффективная _Дальность_ЛЦУ предмета)

Каждый тайл вне Эффективной_Дальности_ЛЦУ уменьшает наши бонусы. Темнота помогает нам увеличить Максимальную _Дальность_ЛЦУ. Если цель вне максимальной дальности, то в результате мы получим 0.

Наконец, программа убеждается, что мы не получим Штрафа:

Код:

Если Бонус_ЛЦУ < 0, то

Бонус_ЛЦУ = 0.

Это интересно - Бонус_ЛЦУ проверятся "Жесткой проверкой", а значит при состоянии ЛЦУ < 50%, он начнет давать нам Штраф. Однако, если Бонус_ЛЦУ который мы расчитали равен 0 (фактически мы не используем ЛЦУ, поскольку цель вне радиуса его действия.), мы не получаем штрафа.

Давайте рассмотрим пример для полного понимания:

Стрелок использует стандартный ЛЦУ, с Эффективной _Дальностью 90, и дающий Бонус Попадания 20 . Цель в 12 тайлах, освещенность - день (уровень 3).

Если предмет не имеет Эффективной _Дальности_ЛЦУ, то

Бонус_ЛЦУ = Бонус_Попадания_Предмета (без изменений). Помните, что он проверяется по состоянию предмета ранее!

Эта строка нас не касается, идем далее.

Если Эффективная_Дальность меньше или равна Эффективной _Дальности_ЛЦУ, то

Бонус_ЛЦУ = Бонус_Попадания_Предмета (без изменений). Помните, что он проверяется по состоянию предмета ранее!

Нет, Эффективная_Дальность равна 120 (12 тайлов) а Дальность_ЛЦУ равна 90, пропускаем это.

Если Эффективная_Дальность (120) больше чем Эффективная _Дальность_ЛЦУ (90), то

Максимальная _Дальность_ЛЦУ = 90 * ( (2 * 3) + 21 ) / 18 = 135

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

Бонус_ЛЦУ = ( 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

Все очевидно - стрелять с крыши проще, и наоборот.

_________________________________________________

Продолжаем, и сейчас мы рассмотрим зависимость пропадания от положения тела цели, в то время, как раньше мы говорили о стойке стрелка.

Формула:

Код:

Если Цель Стоит, то

Если Расстояние_До_Цели 5 тайлов и меньше, и Стрелок Лежит, то

Если мы не стреляем в конкретную часть тела, то

Целевая_Часть_Тела = 2 (TORSO)

Штраф_Стрельбы_В_Часть_Тела = (5 - Целевая_Часть_Тела - Расстояние_До_Цели в тайлах) * 10

Реальный_Шанс уменьшается на Штраф_Стрельбы_В_Часть_Тела

Конкретный штраф при стрельбе лежа в стоящего противника на расстоянии до 5 тайлов.

Целевая_Часть_Тела это числовое значение, где 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!

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

_______________________________________________________

Цель сидит, стреляет Танк:

Код:

Если Цель СИДИТ, то

Если Стрелок это Танк, и Расстояние_До_Цели меньше 120 метров (12 тайлов) то

Штраф_Танка= 13 * ( 120 - Расстояние_До_Цели ) / 10

Иначе

Если Расстояние_До_Цели > 172 (???), то

Реальный_Шанс уменьшается на 20

Если Расстояние_До_Цели между 160 и 172 (???), то

Штаф_Короткой_Дистанции = 3 * ( (Расстояние_До_Цели - 16) / 10 )

Реальный_Шанс уменьшается на Штаф_Короткой_Дистанции

Идея должна быть ясна.

Во-первых, Танк начинает получать штраф при стрельбе в сидящую цель на расстоянии меньше 12 тайлов.

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

В любом случае, суть в том, что после дальности до цели в 16 тайлов (160 метров) танк начинает терять по 3 пункта в Шансе Попадания за каждый тайл, а при достижении определенного значения теряет сразу 20.

Цель Лежит:

Код:

Если Цель ЛЕЖИТ, то

Если Стрелок это Танк, и Расстояние_До_Цели меньше 120 метров (12 тайлов) то

Штраф_Танка= 25 * ( 120 - Расстояние_До_Цели ) / 10

Иначе

Если Расстояние_До_Цели больше 160 метров (16 тайлов), то

Штаф_Короткой_Дистанции = 3 * ( (Расстояние_До_Цели - 160) / 10 )

Если Штаф_Короткой_Дистанции > 40, то

Штаф_Короткой_Дистанции = 40

Реальный_Шанс уменьшается на Штаф_Короткой_Дистанции

Тоже самое, что и для предыдущего случая с небольшой разницей.

Штрафы танка при стрельбе по лежащей цели увеличиваются вдвое, до максимума в 40!

_________________________________________________

Далее Шанс Попадания модифицируется за счет движения цели:

Код:

Штраф_За_Движение_Цели = количество пройденых тайлов * 1.5

Если Штраф_За_Движение_Цели > 30, то

Штраф_За_Движение_Цели = 30

Реальный_Шанс уменьшается на Штраф_За_Движение_Цели

Стрелок получает Штраф в 1,5 пункта за каждый пройденый целью тайл. Количество пройденых тайлов обнуляется в начале хода цели.

_______________________________________________________

Далее речь пойдет об уворачивании от пуль. Да, вы это умеете:). Уворот в основном зависит от Проворности цели, а компенсируетя его действие Ловкостью Стрелка.

Формула:

Код:

Если Цель видит Стрелка, и Цель не Танк, и Стрелок не Королева Жуков, то

Штраф_Уворота = (Эффективная_Проворность_Стрелка / 5) + (Эффективный_Уровень_Цели * 2)

Если Цель СИДИТ, то

Штраф_Уворота уменьшается на 1/3

Если Цель ЛЕЖИТ, то

Штраф_Уворота уменьшается на 2/3

Компенсация_Уворота = (Эффективная_Ловкость_Стрелка / 5) + (Эффективный_Уровень_Стрелка* 2)

Если Цель не Танк (?????), или Стрелок не Королева Жуков (?????), то

Компенсация_Уворота уменьшается вдвое!

Если Штраф_Уворота больше чем Компенсация_Уворота, то

Реальный_Шанс уменьшается на (Штраф_Уворота - Компенсация_Уворота)

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

Штраф_Уворота основывается на Проворности и Уровне Цели. Что может влиять на Эффективный уровень цели мы рассматривали выше.

Если цель сидит или лежит - ее способность у увороту падает.

Ловкость и эффективный уровень стрелка опредеяют значение Компенсации Уворота.

Проверка на Танк и Королеву Жуков в расчете компенсации довольно кривая. Возможно в будущем кто-то решится и перепишет ее!!!

В любом случае, в конце значения сравниваются и стрелок либо получает штраф, либо остается при своих, в зависимости от прокачки крутости цели и себя самого!

___________________________________________________

Далее идет проверка, определяющая штраф для танка при стрельбе по площади.

Код:

Если Целевой_Тайл пуст, и Расстояние_До_Целелого_Тайла меньше 120 метров (12 тайлов), то

Штраф_Танка= 25 * ( 120 - Расстояние_До_Целевого_Тайла ) / 10

Она не дублирует прошлую формулу, которая применяется только если танк целится в кого-то конкретно.

___________________________________________________

Мы уже использовали в расчетах факторы ранения и усталости, но сейчас мы снова вернемся к ним, чтобы снова получит штрафы к своему Шансу Попадания.

Формула:

Код:

Если Реальный_Шанс больше 0, и СТрелок Ранен или Перевязан, то

Перевязанные_Раны = Количеству перевязанных хп Стрелка (розовый цвет)

Штраф_Ранения = Реальный_Шанс * 2 * ( ХП_Меньше_Максимума + (Перевязанные_Раны / 2) ) / (Максимальные_ХП * 3)

Финальный_Штраф_Ранения = Штраф_Ранения * ( 100 - ( (Эффективный_Уровень_Стрелка- 1) * 10 ) ) / 100

Реальный_Шанс уменьшается на Финальный_Штраф_Ранения

Это весьма запутанно. По сути мы получаем штраф к Шансу попадания в зависимости от количества хп, потеряных от нашего максимума, причем перевязанные раны уменьшают влияние вдвое. В конце формулы учитывается опыт наемника, то есть прокачанные бойцы меньше подвержены воздействию полученных ран.

__________________________________________________

Сейчас мы рассмотрим основные штрафы, убивающие наши шансы на попадание.

Первый из них мы получаем его при стрельбе в цель, которая находится вне дальнобойности нашего оружия:

Код:

Если Расстояние_До_Цели больше чем Дальнобойность_Оружия, то

Реальный_Шанс уменьшается вдвое!

Все просто. Даже один лишний тайл до цели, по сравнению с дальнобойностью оружия сразу уменьшает наши шансы вдвое.

Следующий штраф:

Код:

Если цель вне радиуса видимости Стрелка, то

Реальный_Шанс уменьшается вдвое!

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

Хотите верьте, хотите нет, но мы подошли к финалу. Осталось рассмотреть всего несколько мелких замечаний:

Код:

Если Реальный_Шанс < 1, то

Реальный_Шанс = 1.

+End.

Черт побери, если вы дочитали до сюда - вы герой, потому что я взровал свой мозг.

Последние строки кода означают, что Шанс Попадания НИКОГДА не может быть меньше 1%. Раньше это приводило к тому, что желтопузый админ из самого слабого пистолета мог засадить в вас пулю через всю карту, что не могло не раздражать. Слава богу, что в 1.13, это было поправлено и теперь вы можете выставить в INI файле как 0 минимальный шанс, так и просто уменьшить вероятность таких попаданий с 1/100 до 1/1000 и более

------------------------------------------------

Значение параметра Реальный_Шанс и будет нашим Шансом Попадания для конкретного выстрела.

В качестве обобщения материала:

Список вещей и действий, улучшающих/ухудшающих Шанс Попадания:

Предложен Moroes.[/b]

Улучшение Шансов:

    * Меткость, Ловкость, Мудрость, Уровень наемника.

    Всегда помогают

    * Прицелы

    Помогает в большинстве случаев, особенно сильные прицелы, но помните о проблемах при стрельбе на коротких расстояниях.

    * Хорошее состояние оружия, аттачей и других предметов.

    Всегда помогает при состоянии > 85%. При 50% и инже вы рискуете получить штраф, а не бонус.

    * Мораль

    Всегда помогает если 50% и выше

    * Повторная стрельба в туже цель

    Это подразумевает, что цель не перемещалась после предыдущего выстрела.

    * Характер ПСИХ

    Всегда хорошо для Шанса Попадания (но не всегда хорошо для применения...)

    * Стрельба сидя и лежа

    Всегда хорошо, кроме ближних дистанций, когда вы мало зависите от положения тела.

    Кроме того, в ближнем бою лежащий стрелок хорошо попадает в ноги цели.

    Использование сильных снайперских прицелов при стрельбе лежа.

    Использование сошек при стрельбе лежа.

    * Точность оружия

    Этот параметр помогает и Шансу Попадания и максимальному бонусу прицеливания. Наиболее важно при использовании прицелов.

    * Дальность

    Всегда важно держать цель в радиусе эффективной дальнобойности оружия. При использовании прицелов, так же важно держать цель ДАЛЬШЕ минимальной дальности прицеливания.

    Кроме того, стреляя лежа, старайтесь держать цель в пределах 5 тайлов.

    Помимо это, стрельба в пределах 9 тайцлов более точная.

    * Обоерукость

    Для стрельбы с двух рук.

    * Свободная вторая рука

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

    * Умения Автоматическое Оружие

    Великолепно при стрельбе очередями и с отсечкой.

    * Ументе Тяжелое Оружие

    Отлично для ПТГ.

    * Умения Снайпер

    Позволяет получать максимальные бонусы прицеливания.

    Кроме того, увеличивает "эффективную" дальность.

    * Затрата дополнительных ОД на прицеливание.

    Неплохо, до определенного количества ОД. Для снайперов гораздо борлее применимо

    * Хороший ЛЦУ в темноте.

    Темнота увеличивает дальность действия ЛЦУ.

    * Легкий уровень сложности игры

    Враги имеют штрафы на легком уровне.

    * Дальнобойное оружие

    Помогает всегда

    * Бликое расстояние от Танка

    TЧем ближе вы к Танку (ближе 12 тайлов), тем меньше у него шансы по вам попасть.

    * Стрельба с крыши на землю.

    +25 - хороший бонус.

Вещи, уменьшающие Шанс Попадания:

    * Раны и перевязки

    Всегда ухудшают Шанс Попадания (перевязанные раны влияют меньше).

    * Состояние вещей < 85%, или, что еще хуже - < 50%.

    Состояние вещей ухудшает даваемые ими бонусы.

    Для большинства оружия и аттачей, состояние 50% является границей, ведущей к получению штрафов.

    * опьянение

    Всегда плохо.

    * Низкая Мораль

    если ниже 50% - это плохо.

    * Усталость

    При Энергии меньше 85% наш точность ухудшается.

    * Испльзование сильных прицелов Стоя и Сидя

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

    * При стрельбе из SMG, предмет во второй руке

    Дает штраф, сохраняйте вторую руку свободной.

    * Штрафы за ОЧередь/Отсечку

    При автоматическом огне, каждая следующая пуля стремительно теряет шнасы на попадание.

    * Уровень Сложности Эксперт или Невозможный

    Враги получают бонусы к Шансу Попадания.

    * Воздействие газа

    Всегда очень плохо.

    * Стрельба во время перевязки другим наемников

    Серьезно снижает Шанс Попадания.

    * Шок от попаданий

    Шок действует несколько ходов, прежде чем пройдет.

    * Стрельба в голову и ноги

    Намного сложнее стрельбы в торс цели.

    * Цель вне дальнобойности оружия

    Дает огромный штраф.

    * Препятствия, камуфляж или задымление.

    Увеличивают "Эффективное_Расстояние_До_Цели", делаю попадание сложнее.

    * Стрельба с земли на крышу

    Дает небольшой штраф.

    * Стрельба из положения лежа в Торс и Голову на дальности менее 5 тайлов.

    Дает штраф.

    * Сидящая или Лежащая цель.

    Уменьшает Шанс Попадания, особенно на дистанциях

    * Движущаяся цель.

    TПри движении дает накапливаемый штраф

    * Проворная/Опытная цель

    Ухудшит ваши шансы, если вы не прокачаны.

    * Невидимая цель

    Огромный штраф.

Что вы можете сделать, чтобы избежать попадания:

    * Прокачать проворность и уровень наемника

    Дает шанс уворота - ухудшения Шанса Попадания противника.

    * Сидеть/Лежать

    Помогает на дальних дистанциях.

    * Оставаться вне эффективной дальности противника

    Конечно, если ваше оружие более дальнобойное...

    * Камуфляж, укрытия и дым.

    Все это увеличивает Эффективную_Дальность до цели для противника

    * Ранить врагов

    Увеличивает их штрафы за ранения, шок и усталость.

    * Используйте газовые гранаты

    Если у противника нет противогазов.

    * если стреляет танк - старайтесь быть ближе и ниже.

    При борьбе с танком важно стараться подойти максимально близко, оставаясь в лежачем или сидячем положении

    * Забирайтесь на крыши

    Это уменьшает шанс попадания по вам.

    * Двигайтесь!

    Чем больше вы двигались - тем сложнее в вас попасть.

Назад к игре
Источник: http://gamer.ru
Share
Опубликовано: 27.01.2013 01:42:56
0
Комментариев (0)
Имя
Email
Осталось 65535 символов
2092
© 2006-2013, empire-of-games.ru