Как я создавал базу данных оружия Warface

Десяток потраченных часов, изучение документации CryEngine, чтобы потом… Всё начать с самого начала. Опять.

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

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

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

Не могу сказать, когда именно это всё началось касательно Варфейса. Могу только предположить, что где-то 5-6 лет назад всё активизировалось. Хотя уверен, читоделы и раньше начали копаться в ресурсах игры. Но обычному пользователю это всё было глубоко плевать, ведь есть логика попроще: покупаешь коробки удачи за кредиты (лутбоксы за деньги), получаешь местную имбопушку и идёшь на «паблик», нагибать недонатеров. Всё просто и понятно, ведь об имбовости доната говорят все, даже те, кто в сам Warface не играет.

Если бы не два больших НО… В 2015 году в Warface появилось два оружия, которые попали в категорию коробки удачи за кредиты: пистолет-пулемёт SCAR-L PDW и пистолет SIG SAUER P226 C. Первый появился в конце августа, а второй — в самом начале апреля.

И первым пострадал именно SCAR-L PDW. У оружия в Warface есть такая характеристика как «множитель урона» — текущий урон от оружия умножается именно на данный показатель при попадании в определённую часть тела, коих всего 4: голова, туловище, руки и ноги.

У практически всего оружия инженера на то время были стандартные множители для данного класса, у которых урон при попадании в голову умножался на 4. Но у SCAR-L PDW этот показатель был ощутимо выше. Не знаю, насколько именно, возможно там была целая пятёрка, что превращало оружие по силе в скорострельную штурмовую винтовку.

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

Конечно, это возмутило многих игроков, ведь нёрф произошёл спустя 5 месяцев после появления данного оружия на боевых серверах, когда многие уже успели потратить свои деньги ради шанса заполучения.

В случае с SIG SAUER P226 C прошло почти полтора года и практически аналогичная ситуация — снизили множитель в голову из стандартных 5 (у категории пистолетов) до 2,65. Такой показатель сводит на нет шансы убить врага с одного попадания в голову даже впритык, что не отнимает других очень сильных качеств данного пистолета:

  • глушитель, что не снижает урон
  • глушитель также уменьшает падение урона в 2 раза
  • очень маленький разброс от бедра
  • возможность спамить, не теряя в точности

И тут многие игроки поняли, что даже донатные пушки не спасены от беспощадного нёрфа. Причём такого нёрфа, о котором эти же игроки могут узнать уже постфактум. И тут нужен был свой «герой»…

И для многих игроков этим самым «героем» стал паблик Base Secrets Warface (B.S.W.), который предлагал узнать те самые «скрытые характеристики оружия». И не только это, но и другие, собственно, секреты данной игры. В какой-то момент руководить этой группой начал мой старый друг под именем Арей Арийский (настоящие имя — Андрей Филин).

Группа работала в таком формате довольно долго — до октября 2018 года, пока не случился ребрендинг в FIRUIN. У сообщества был даже собственный сайт, где каждый пользователь мог сравнивать все самые важные характеристики оружия и не волноваться, что его любимый ствол вдруг нерфанули или изменили.

И тут на сцене появляюсь я.

Я присоединился к сообществу FIRUIN в январе 2019 года. И довольно скоро ощутил всю жесть происходящего. Мой друг рассказал мне всю последовательность действий в случае обновы на ПТС Warface за 2-3 дня, а далее — я всем должен был заниматься всем самостоятельно. И ладно там обозревать обновления ПТС Warface, это не сложно, если знать что и где искать.

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

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

Когда дело пошло до перехода сайта на новый домен, я ещё более ужаснулся, как всё работало. Сайт и его наполнение выглядело следующим образом:

Для пользователя ничего особого тут не было — просто выбираешь раздел и соответствующий предмет из списка, будь-то оружие, какое-то снаряжение или даже модули. Вот только для меня, как администратора сайта, сам сайт воспринимался как туша быка, в которую я постоянно всаживаю колья. Где колья — это какой-либо предмет в списке со всеми вытекающими. Причём на самой тушке места для втыкания уже и не осталось.

К примеру, все текстовые данные, которые видит пользователь — всё вводится исключительно вручную. Причём для системы я должен был вводить всё в стиле:

a: 350;
b: 75;
c: 130;
d: 295;
e: 48;
f: 104 / 40;
g: 130;
h: 150;
i: 500 / 400;
j: 4500;
k: 12;
l: 48;
m: 280;
n: 5 / 1,08 / 1,05 / 1,05;
o: *3,5;
p: 3500;

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

И каждый такой предмет надо было вводить вручную. Как и загружать иконку предмета. А если случайно вставил не ту иконку — приходилось всю условную ячейку делать невидимой в списке и создавать новую, с новым id.

Ах да, ещё в выпадающем списке не было сортировки самих предметов. То есть, если сперва предметы были отсортированы (изначально) от А до Я, то всё остальное в самом низу списка — по мере появления в игре. Что было добавлено последним — автоматически уходило в самое дно списка и этого никак не было возможности исправить.

Помимо того, что надо было тратить много своего времени на добавление новых предметов, изменение старых и прочее, сайт ещё требовал расход на оплату хостинга и домена. При всём этом — в нём не было рекламы. Совсем. Так что вскоре я решил этот весь проект закрыть.

И вместо него предложить другое решение — более гибкое, надёжное и бесплатное. И речь про базу данных оружия в формате Excel-таблицы.

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

Конфиг оружия хранится в xml-формате и в зависимости от приложения для открытия такого формата, оно предстаёт в двух вариациях:

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

Поэтому я пошёл другим путём: зарегистрировался на бирже фрилансеров и создал запрос на создание XML-парсера с подробным описанием ТЗ. Предложений было несколько больше, чем я предполагал, как и разброс по ценам — от 10 и до 100 долларов. В итоге выбрал один из самых дешёвых вариантов и как итог — не прогадал.

Задача у меня была довольно простой и понятной — спарсить все данные из всех XML-файлов в папке в готовую Excel-таблицу. Свой парсер я получил примерно через день, после нескольких корректировок с моей стороны (когда появлялись какие-то ошибки). Результатом я был доволен на все 146% и даже доплатил программисту на радостях.

Далее дело было за мной.

Парсер настолько жадно впитывал информацию, что стоило ему найти какой-то один уникальный параметр в каком-то файлике — он его обязательно выставит в отдельном столбике, даже если этот самый столбец будет пуст на 99,99%. Порой это раздаражает, но иногда подобные функции приводят к неожиданным открытиям.

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

Сперва надо было «отделить зёрна от плевел», где вторых было очень много. И именно здесь раскрывается та самая вторая проблема — построение конфига. Чем более новый предмет (в данном случае оружие), тем зачастую более сложный конфиг он получал, в котором есть порой отдельные параметры, влияющие на силу покачивания в прицеле в разных положениях. И это очень диссонирует в сравнении с конфигами очень старого оружия, у коего нет всех этих функций.

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

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

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

Вот пример:

– это сам показатель минимального разброса
– множитель, на который будет перемножаться минимальный разброс
– подмножитель мин. разброса в положении “стоя (не двигаясь)”
– подмножитель мин. разброса в положении “в присяди (не двигаясь)”
– подмножитель мин. разброса в положении “лёжа (не двигаясь)”
– подмножитель мин. разброса в положении “в подкате”
– подмножитель мин. разброса в положении “при ходьбе”
– подмножитель мин. разброса в положении “при беге”
– подмножитель мин. разброса в положении “в прыжке”
– подмножитель мин. разброса в положении “стоя в прицеле (не двигаясь)”
– подмножитель мин. разброса в положении “в присяди в прицеле (не двигаясь)”
– подмножитель мин. разброса в положении “лёжа в прицеле (не двигаясь)”
– подмножитель мин. разброса в положении “в подкате в прицеле”
– подмножитель мин. разброса в положении “при перемещении в прицеле”
– подмножитель мин. разброс в положении “в прыжке в прицеле” – это сам показатель максимального разброса
– множитель, на который будет перемножаться максимальный разброс
– подмножитель макс. разброса в положении “стоя (не двигаясь)”
– подмножитель макс. разброса в положении “в присяди (не двигаясь)”
– подмножитель макс. разброса в положении “лёжа (не двигаясь)”
– подмножитель макс. разброса в положении “в подкате”
– подмножитель макс. разброса в положении “при ходьбе”
– подмножитель макс. разброса в положении “при беге”
– подмножитель макс. разброса в положении “в прыжке”
– подмножитель макс. разброса в положении “стоя в прицеле (не двигаясь)”
– подмножитель макс. разброса в положении “в присяди в прицеле (не двигаясь)”
– подмножитель макс. разброса в положении “лёжа в прицеле (не двигаясь)”
– подмножитель макс. разброса в положении “в подкате в прицеле”
– подмножитель макс. разброса в положении “при перемещении в прицеле”
– подмножитель макс. разброса в положении “в прыжке в прицеле”

И всё это порой чёрт-подери-как-важно на практике. И что очень интересно — тот самый множитель «spread_max_mul» или «spread_min_mul» не всегда бывает равен единице. И именно этот показатель не влияет на другую формулу, которая показывает среднестатистическому игроку в игре характеристики «точности оружия», позволяя создавать иллюзию «равенства» между одним оружием и другим с таким же показателем «точности».

К примеру, игрок видит показатель «точность от бедра = 23» у одного и другого оружия и с помощью простой логики предполагает, что эти два оружия в плане разброса работают аналогично. Но чаще всего, это было совсем не так.

И ладно бы только это, но есть же ещё не менее важные функции, которые я именую «разогрев» и «охлаждение» (на манер того, как настоящее оружие нагревается и охлаждается при стрельбе). И опять чёртовы множители, которые заставляют проводить лишние расчёты:

– увеличение разброса на такое-то кол. после выстрела – множитель увеличения разброса – уменьшение разброса на такое-то кол. в секунду – множитель уменьшения разброса – задержка в мс, прежде чем разброс начнёт уменьшаться

К примеру, у FN P90 Custom этот параметр настолько необычный:
spread_att = 0,35
spread_att zoomed_crouch = 0,19
spread_all_mul = 0,65

И что же это всё даёт на практике? То, что при стрельбе вприсяди максимальный разброс в прицеле будет на 28 пуле. Если бы остальные пункты, кроме первого, были бы единицами — то разброс в прицеле увеличился до максимума уже после четвёртого выстрела.

Стоит ли оно того?

Даже такого максимального разброса при стрельбе в прицеле хватает для эффективной стрельбы на средней дистанции. Но всё это уже из разряда анекдота про мужика и спички.

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

И в итоге, всё получилось.

Теперь для того, чтобы перевести изначальную мешанину в итоговое сведение мне достаточно 5 минут. 4 из которых — в ожидании прогрузки и просчётов, потому что гугл таблицы (и формулы) не особо поспевают за расчётом 650400 ячеек, которых нужно пересчитать дважды. Остальная минута отводится на случай, если надо заменить какую-то букву в формуле из-за того, что какой-то параметр решил поменяться местами.

Но остались ещё две «маленькие» проблемы — свести всю эту таблицу с локализацией и множителями урона, теми самыми, что упоминалось ранее.

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

Вторая проблема — множители оружия находятся в отдельной папке и парсер их не замечает.

К счастью, эти файлики настолько маленькие, что нет проблемы составить мини-список вручную. Делов на час.

Вопрос с локализацией — это задачка со звёздочкой. Можно, конечно, попытаться взять исходный файл, настроить фильтры, удалить ненужное вручную, но я перед собой поставил задачу, что буду работать с исходным материалом. То есть, не делать никаких правок, сортировок в самой таблице, дабы все нужные действия в дальнейшем проходили автоматически.

Сперва я начал делать проверку наличия словосочетания «shop_name» в технических наименования предметов. Всё шло хорошо до того момента, пока не начали в списке появляться камуфляжи на оружие, у которых техническое наименование тоже имело «shop_name». Тогда во втором столбце я исключал ячейки, в которых было слово «камуфляж».

И уже исходя из полученного результата я выбирал, собственно, название оружия на русском, английском языках и как оно технически именуется. Чтобы функция «SORT» сделала всё остальное за меня.

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

Осталась ещё одна незначительная проблема — собственно, файлы «shop», которые дают игре понять, что это за оружие, какой класс может его использовать и какова стоимость ремонта данного предмета.

Вот только на практике это всё полная ерунда, ведь:

  • наименование оружия можно вытащить и из локализации
  • какой класс может его использовать — можно узнать уже из первых букв самого предмета
    (ar, mg — штурмовик, hmg — СЭД, shg — медик, smg — инженер, sr — снайпер, pt — пистолеты для всех классов, кроме железного человека)
  • стоимость ремонта предмета уже давно никому не интересна + настоящие данные по стоимости ремонта хранятся на сервере, доступ к которым куда более защищён

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

Главное — не забыть вставить именно значения из буфера, а не формулы.

И казалось бы — я задачу, которую сам поставил себе (для себя), выполнил. Можно было на этом и закончить, но нет… Я решил добавить и те самые функции из сайта, а именно: дать пользователю возможность сравнивать части снаряжения (шлем, жилет, перчатки и ботинки). И если первое худо-бедно удалось реализовать, то с модулями был полный провал — всё потому, что большинство модулей имели одни и те же игровые наименования. А вот на практике они порой могли отличаться по характеристикам, причём многие об этом даже и не задумываются.

И компромис здесь никак не удаётся найти — пользователь не будет искать условный «sr45_rds», потому что он скорее всего не знает значения ни «sr45», ни «rds».

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

«sr45_rds» — это коллиматор Vector Optics Maverick для снайперской винтовки H&K G28.

«sr45_gold01_rds» — это тот же колиматор Vector Optics Maverick для золотой версии H&K G28.

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

Итого получается неприятная дилема — сделать список по названию модулей нельзя, ведь иначе пользователь запутается в десятке вариаций одного и того же условного коллиматора. И список по техническому наименованию модулей неэффективен, так как пользователь всё равно не поймёт сути.

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

Хотелось реализовать не только классические «сравнения пушек или снаряжения», но и более сложную штуку, а именно: сравнение оружия против конкретного типа снаряжения. Так сказать, сравнить боевую эффективность самого оружия.

И это опять было «задачей со звёздочкой» (даже с двумя), ведь надо было учитывать большое количество переменных, а именно:

  • дистанцию попадания
  • не снижается ли урон до минимального значения на указанной дистанции
  • используется ли какой-то глушитель или пламегаситель
  • множители урона оружия
  • защита персонажа
  • округления и прочее

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

К примеру, класс медик в игре не может использовать шлем штурмовика «Атлас». А также у некоторого снаряжения в игре при использовании двух, трёх или четырёх предметов одновременно — активировался особый бонус. Обычно это было ускорение перезарядки, уменьшение разброса, отдачи и прочего, а при использовании полного комплекта — сет давал особые свойства.

К примеру, у Армагеддона и Blackwood — входящий в игрока урон уменьшался на 15 единиц и это очень значительное снижение на практике. Итоговая конструкция получилась настолько сложной, что в один момент я решил снести всю базу данных снаряжения и начать с самого начала. По крайней мере теперь я точно знал, чего я хочу добиться и как именно всё надо оформить.

Собственно, поэтому таблица наименована версией 2.х.х, потому что значительная её часть переписывалась уже с нуля, а также было добавлено несколько очень важных функций. И даже удалось существенно оптимизировать весь процесс — размер Excel-файла изменился из 9-10 Мб до 1 Мб. Теперь можно было скидывать файл через Discord.

Как итог — сравнение снаряжения перешло на отдельный лист, как расчёт эффективности оружия. Да и сам принцип расчёта был существенно изменён — теперь вместо выбора самого снаряжения, пользователь выбирает именно значения защиты.

Несколько позже удалось добавить функцию эффективности оружия по чистому ТТК (Time To Kill — время на убийство). Ещё позже была добавлена возможность изменения расчёта при условной стрельбе по SED’у. Особенность данного класса в том, что у него очень много брони, очень мало здоровья и при этом иное распределение урона — 99% в броню и 1% в здоровье, в отличие от стандартных 80 на 20.

И вот совсем недавно удалось даже добавить формат изменения эффективности оружия в зависимости от используемого модуля:

  • глушители, что снижают урон на 2, 5, 10, 15, 18, 20, 30 и 50 процентов
  • пламегасители, что снижают падение урона на 15, 20, 30, 50 и 60%
  • глушители, что увеличивают падение урона на 10 и 20%

Но дьявол кроется в мелочах…

Кстати, несмотря на кажущуюся простоту вычислений и распределений, итоговую формулу расчёта урона удалось выяснить блогеру Ёже, а именно — так называемые «двойные срутёкоские округления» (аллюзия на Crytek Kiev, который разрабатывает Warface).

И всё это — спустя 7 лет существования данной игры.

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

Самый интересный момент заключается в том, что когда у персонажа уже нет брони — урон, который должен быть поглощён бронёй, полностью поглощается здоровьем. Ранее предполагалось, что переходной урон просто суммируется с уроном по здоровью и уже затем округляется.

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

Вот так примерно это выглядит:

IF броня = есть THEN
УПБ [урон по броне] = ВУ [входящий урон] * 0,8 AND
УПЗ [урон по здоровью] = округлвверх (ВУ * 0,2)
ELSE
УПЗ = округлвверх (УПБ) + округлвверх (ВУ * 0,2)

А уж если рассматривать всю формулу расчёта урона, включая все возможные случаи по типу дистанции нанесения, проверки на минимальный урон и прочее, то получается следующее:

IF ДИСТ.ПОПАД < ДАЛЬНОСТЬ + 0,99 Then ВХОД.УРОН = МАКС.УРОН ELSE ВХОД.УРОН = МАКС.УРОН - (округлвниз (ДИСТ.ПОПАД. - ДАЛЬНОСТЬ) * ПАДЕНИЕ.УРОНА * СНИЖЕН.ПАДЕНИЯ) //если урон был нанесён в пределах указанной дальности оружия + 99 см, //то оружие наносит максимальный урон, если же вне этой дистанции - //то сниженный на показатель падения урона, повторённый определённое количество раз. //Пламегасители помогают уменьшенить данное снижение. ЗАТЕМ IF ВХОД.УРОН < МИН.УРОН THEN ВХОД.УРОН = МИН.УРОН ELSE ВХОД.УРОН = МАКС.УРОН - (округлвниз (ДИСТ.ПОПАД. - ДАЛЬНОСТЬ) * ПАДЕНИЕ.УРОНА * СНИЖЕН.ПАДЕНИЯ) //Если итоговый расчёт показывает, что входящий урон ниже минимального значения, //указанного в оружии, то применяется последнее. ЗАТЕМ IF глушитель = true //предполагается глушитель, снижающий урон на определённое количество % THEN ИТОГ.ВХОД.УРОН = ВХОД.УРОН * СНИЖЕНИЕ.УРОНА.ГЛУШ. ELSE ИТОГ.ВХОД.УРОН = ВХОД.УРОН //глушитель работает в самом конце первой части, //позволяя снижать даже значение минимального урона ЗАТЕМ IF бегл.защита = true //речь про снижение урона на 6, 10, 12 и 15 единиц за попадание THEN IF попадание = тело THEN ИТОГ.УРОН = ИТОГ.ВХОД.УРОН * МНОЖ.УРОНА.ТЕЛО - бегл.защита //у бронежилетов нет свойства снижения множителя урона по телу ELSE ИТОГ.УРОН = ИТОГ.ВХОД.УРОН * (МНОЖ.УРОНА - ЗАЩИТА.ЧАСТИ.ТЕЛА) - бегл.защита //у других предметов - шлема, перчаток и ботинок, есть свойство снижения соответствующего множителя ELSE ИТОГ.УРОН = ИТОГ.ВХОД.УРОН * (МНОЖ.УРОНА - ЗАЩИТА.ЧАСТИ.ТЕЛА) AND ИТОГ.УРОН = ИТОГ.ВХОД.УРОН * МНОЖ.УРОНА.ТЕЛО //если отсутствует свойство снижение урона на N единиц за попадание {#A} ЗАТЕМ IF игрок = SED THEN УРОН.ПО.ОБ = ИТОГ.УРОН * 0,99 AND УРОН.ПО.ОЗ = округлвверх (ИТОГ.УРОН * 0,01) //распределение урона 99 и 1% соответственно ELSE УРОН.ПО.ОБ = ИТОГ.УРОН * 0,8 AND УРОН.ПО.ОЗ = округлвверх (ИТОГ.УРОН * 0,2) //распределение урона 80 на 20% соответственно AND IF ТЕКУЩ.ОБ - УРОН.ПО.ОБ < 0 THEN ДВОЙН.ОКРУГЛ. = округлвверх ((ТЕКУЩ.ОБ - УРОН.ПО.ОБ) *-1) ELSE ПОВТОР {#A}

(да простят меня программисты за подобное оформление)

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

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

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

Максимум, который выдаёт таблица в случае требуемого количества пуль для убийства — 50. Не потому, что существуют какие-то ограничения, а потому что реализовать 50 попаданий и при этом не убить врага — такое даже в теории провернуть очень сложно. Ну а если по расчётам игрок не будет наносить урона вовсе — то ячейка перекрасится в чёрный цвет, скрывая текст.

Ну а ещё по совету одного пользователя добавил кнопки для «укажите дистанцию попадания» — так действительно удобнее.

Итог

Зачем мне всё это?

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

Стоило ли оно того?

С одной стороны — вся эта работа отняла у меня очень много времени. Может даже часов 15-20, не уверен.

С другой стороны — за это время я узнал, насколько глубока кроличья нора этих игромеханик. И насколько большой болт кладут разработчики на здравый смысл — начиная с того, как небрежно добавляют новые предметы (часть из которых так и остались тестовыми) и заканчивая непрекращающейся гонкой вооружений, которая мотивирует игрока донатить постоянно на новое оружие. Которое пусть на условные 2-3% эффективнее предыдущего, зато однозначно эффективнее.

Чего нельзя сказать про новый их пистолет «Жнец», который издатель уже пытается продать за 499 рублей в наборе с брелоком и достижениями. Ибо пистолет — это чистая Crossfire’овщина с невпечатляющими особенностями.

Для тех, кому вдруг интересно — вот так выглядит данный пистолет в игре.

Дно реализма пробито давным давно, ведь за последние годы появилось множество золотого оружия, несколько спецопераций с зомби, особыми киборгами, сюжет про перенос сознания, антиматерию, полёт на Марс за 30 секунд и прочее-прочее-прочее.

 

Источник

Читайте также