Veliri. Дневник разработки 1

https://www.instagram.com/pol_mousquetaire/
https://www.instagram.com/pol_mousquetaire/

Приветствую DTF. Я продолжаю делать ММО игру и расскажу что произошло за полгода разработки с момента написания этой статьи.

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

Под прошлой статьей спрашивали можно ли исходники посмотреть, бекенд пока не дам :3, но фронтенд выложил в опенсорс (там есть и говнокод и нарушения основных принципов vue и сомнительные архитектурные решения и… в общем это плохой материал для обучения)

Veliri. Дневник разработки 1

Открытый мир

После написания статьи я еще какое-то время занимался открытым миром, самые интересные изменения:

  • Система правосудия - в игре свободное пвп и пк, однако нужны участки безопасности и статус игрока который бы его определял как злодея. На безопасной территории патрулируют дроны защитники которые нельзя сбить, но они обладают весомым вооружением состоящих из 3-4х орудий на бору.

Дроны атакуют всех врагов фракции или игроков в статусе “ПК” в “безопасной зоне”. Безопасная зона это область вокруг базы где есть такие защитники.

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

Статус “ПВП” можно получить просто начав атаковать союзный транспорт или его имущество. Если атаковать игрока в этом статусе, то ты и сам входишь в этот режим. На безопасной территории все транспорты в этом режиме будут заморожены пока он не спадет.

  • Улучшил ИИ - боты стали более разборчивы в том кого атаковать. У каждого нпс есть “HatePoints” он знает кто и насколько его обидел >_>. Если бот видит вокруг себя несколько врагов, то он атакует того кто сильнее его обидел. Несколько поинтов накидывает тот факт, что бот может атаковать цель с текущий позиции, чтобы они не ломились через всю карту игнорируя реальную угрозу, хотя этот эффект возможен если ты слишком сильно разозлил бота и убежал). Ремонтным модулем можно задобрить бота если его хилить.
Veliri. Дневник разработки 1
  • Корпуса теперь имеют разные модели. Это означает что мелкая машинка может проехать там где не может большая, и в мелкую машинку труднее попасть.
Veliri. Дневник разработки 1
  • Добавил 4ю фракцию “АОП” (автоматизированная оборона планеты) которая выполняет роль “мобов”. Неразумные жильцы планеты задача которых защищать ее от инопришеленцев. Эти мобы слабо вооружены, но зато они редко ходят по одному. Их задача с рандомным интервалом устраивать набеги на сектора, у них довольно простые правила поведения:

    -- появится на краю карты

    -- идти до точки которую надо оборонять

    -- ждать пока кто то попадет в поле зрения

    -- преследовать цель пока она не пропадет из поле зрения

    -- вернутся к точке

  • Добавил в игру навыки - модель прокачки “что делал то и прокачал”, когда принимает урон прокачивается навык защиты для этого корпуса, стреляешь из оружия прокачивается навык владения оружием, наносишь урон боеприпасом прокачиваешь навык боеприпаса и тд. Так же с этим сделал бонусы корпуса которые дают например + к скорости или вместимости трюма когда прокачаны нужные навыки.
Veliri. Дневник разработки 1
  • Дополнил механику строительства - теперь можно сносить строения получая обратно ресурсы и даже чертеж. Правда если вы попытаетесь сносить чужие строения это будет воспринято как нападение.

У строений есть статус завершенности. Когда строение только строится оно начинает работать при 100% завершенности, если строение уже работает то оно будет работать при 50% завершенности. Демонтаж позволил ввести механику сбора ресурсов с обломком транспорта, аналог salvage из евы.

  • Социальность - ну тут все просто группы, объединяют обзоры и радары участников и отображение статистики членов группы и “Кластеры” корпорации которые пока имеют только общий чат.

Veliri. Дневник разработки 1
  • Ну и последнее нововведение, хотя это больше игровой костыль - это “манипулятор” на панели снаряжения. В игре была проблема, когда с выбранным оружием игрок пытается взаимодействовать со строением то оружие стреляло, а игрока карали). Так же была проблема, когда игрок стреляет во врага и ему мешают всплывающие подсказки. Манипулятор решает эти проблему т.к. взаимодействовать с миром теперь можно только через него (открытие ящиков/структур/обломков) и подсказки видны только с манипулятором.
Veliri. Дневник разработки 1

Но что то пошло не так и я сделал сессионный игры.

Во время разработки я примерно прикидывал сколько предстоит сделать по контенту, тестированию, локализации и прочему. В какой-то момент мне начало казаться что работы слишком много и я просто не вывезу это из зачаточного состояния хоть когда-нибудь. И я решил что лучше я сделаю сессионную игру наподобие crossout’a, накидаю типовые пвп миссии/пве миссии используя все наработки из открытого мира и выпущу это в какой нибудь соц сети для тестирования и сбора фидбека. А открытый мир будет доступен в режиме “раннего доступа”.

Veliri. Дневник разработки 1

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

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

  • старт - инициализируется сектор, создаются команды, респауны, боты, строения и все что должно быть готово к старту игры. Срабатывает 1 раз.
  • монитор - тут сервер проверяет триггеры, респаун игроков/ботов, захват баз и условия победы.
  • конец - когда игра завершена то игроков надо выкинуть в лобби, дропнуть сектор и записать результаты боя в бд (вот это я еще и не сделал :С).

В каждой сессионки своя “архитектура”, я старался изолировать код сессионок от открытого мира, но в некоторых местах пришлось наговнокодить в таком виде if (user.mode === “open_world”) ¯\_(ツ)_/¯, да и на фронтенде так же.

На текущий момент доступно 6 режимов игры:

  • Встречный бой - бой игроков 8vs8. Условие победы убить всех или захватить базу/базы врага.
  • Командный бой - классический team deathmatch 5vs5, до 15 фрагов.
  • Уничтожение базы - moba режим 10vs10, где главная задача прорвать оборону и вынести главную базу врага. На карте расположены вспомогательные точки, завод - который строит бойцов на вашу сторону, радар - открывает большую область в тумане войны и генерирует помехи для врага, арта которая стреляет через все карту и помогает при осаде. В режиме участвует 3я стороны которая играет против всех это АОП.
  • Прорыв - пве задание для 4х игроков, задача прорвать оборону нпсей и захватить ценные данные. По мне так самый простой и интересный режим)
  • Оборона - отражаете волны нпсей, можно строить турели/радары/щиты, но для этого надо добывать ресурсы или защищать ботов которые добывают ресурсы. Самый непродуманный режим, но все же он есть, а еще мне нравится вступление)
  • Конвой - миссия на сопровождение/защиту грузовиков, исследования сектора и зачистка лута в нем. Самая сложная с технической точки зрения миска и самая глючная из за “сопровождения”.

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

Оптимизация и архитектура сервера

Раньше у меня был полностью многопоточный сервер и это звучит круто, но на самом деле вызывало много проблем с согласованностью происходящего. Например когда сервер лагает то поток отвечающий за полет снарядов мог работать в 2 раза быстрее чем поток отвечающей за движение и это приводило к тому что пули летали в 2 раза быстрее. Поэтому я перешел на более классическую для движков архитектуру с центральный loop методом который дергает другие методы каждый сервер тик. Если что то лагает то лагает сразу весь сектор :). Это выглядит как то так (знающим людям этот код покажется ошибочным, но я удалил часть чтобы картинка небольшая была):

Veliri. Дневник разработки 1

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

Однако проблему еще вызывал “data race”, в моем случае он вызывал ошибки в памяти которые приводили к падению сервера в непредсказуемых местах и непредсказуемыми ошибками. Самые страшные ошибки я локализовал и исправил, переписал все обращения к полям структур через геттеры и сеттеры и через мьютексы или atomic, однако мьютексы оооооочень сильно ударили по производительности и в некоторым местах, где идет работа с примитивами пришлось смириться с “data race”, они не вызывают ошибки памяти уже неплохо).

Очень много работал с профайлером что позволило ускорить бекенд в очень много раз (я хз сколько :D), синтетические тесты говорят что если распределить по 8-16 ботов в разных секторах то сервер может выдержать до 400 ботов, если в 1 сектор затолкать больше 96 ботов то серверу сразу становится плохо, боты потребляют для поиска пути и приоритетности целей до !50%! всех ресурсов сервера. Для людей другая история и им все это не надо, но им надо слать трафик и проверять на доступность широковещательные сообщения от сервера, и это не тестировалось никак и сказать сколько людей может играть сложно.

Чтобы хоть как то мониторить происходящие сделал такой небольшой сервис.

Veliri. Дневник разработки 1

Итог

Где-то в конце ноября я решил пописать в разные студии которые занимаются браузерными играми, ответ я получил только от 2х и в целом игра никого не интересует из-за ее сомнительных перспектив (кто бы сомневался :С ). Но я не отчаиваюсь и продолжаю делать всякое, если кому интересно я веду небольшой блог по разработке в вк https://vk.com/veliri.

На ближайшие пару месяцев мне придется подзабить на проект т.к. устраиваюсь на новую работу и нужно время для адаптации. Зато возможно появятся деньги на покупку контента и менторства какого нить хорошего геймдизайнера)

Если кто-то захочет поиграть, то это можно сделать прям с сайта игры http://veliri.ru/, лучше играть в открытый мир т.к. сессионки ну очень сырые, и сервер не стабильный, может упасть в любой момент, а так же ничего не тестировалось баги, ошибки в базовой комплектации для всех :).

2222 показа
624624 открытия
11 комментариев

Огонь, и концепт и статья!! Еще и Phaser)) успеха, бро!

Ответить

Спасибо)

Ответить

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

Ответить

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

Ответить

Спасибо за статью. Успехов в 2021

Ответить

Сообщение удалено

Ответить