Мой опыт создания ММО с открытым миром

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

Приветствую DTF. Я расскажу немного о своей игре.

Я разрабатываю ММО в жанре privateer на HTML5, на разработку уже ушло 2+ года, как таковой команды у меня не было работал с фрилансерами, бюджет у игры моя месячная зарплата, а разработкой занимался в свободное от работы время и вот что из этого вышло.

Попробовать в нее поиграть можно вот тут http://veliri.ru:8080/, (если на сервер зайдет много людей то он не вытянет и скорее всего будет дико тормозить, возможны ошибки, так что если что простите :С). Регистрация обязательна в поле мейл и пароль можно вбить 123.

На текущий момент игра выглядит вот так

Об игре

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

По геймплею игра классический privateer (я только недавно узнал что такой жанр существует и что я его делаю).

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

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

Если игрок погибает то он, теряет все что было с ним и его телепортирует на ближайшую союзную базу. Где выдает стандартный набор снаряги если на базе у игрока ничего нет (но в демке я убрал возможность все потерять).

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

Игровая карта поделена на сектора, внутри секторов всегда есть главная база сектора и опционально строения которые предоставляют функционал по производству (переработка сырья/предметов, создание деталей для крафта).

О том, как родилась идея.

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

Идея сделать игру возникла немного не из-за любви к играм и желание их разрабатывать ¯\_(ツ)_/¯. Пару лет назад я работал сис.админом в небольшой компании и сидел рядом с серьезными дядьками которые писали компьютерные программы. В какой-то момент я подумал что тоже умею писать код, но опыта не было. Я подумал что нужен какой-то пет проект для прокачки скилов. Игра мне показалось довольно комплексной задачей которая отлично для этого подойдет.

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

Мой опыт создания ММО с открытым миром

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

Мой опыт создания ММО с открытым миром

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

Спустя +-пол года я родил вот это. И это мне казалось прекрасным, тут даже туман войны есть! Примерно тут я впервые познакомился с JS/CSS/HTML)

Мой опыт создания ММО с открытым миром

Механика игры примерно такая, 2 игрока, у каждого есть N денег, на которые он мог купить 1го из 3х юнитов, после покупки он выставлял его на поле около респауна, каждый юнит обладал скорость, уроном, хп, и дальность обзора. Игра делилась на 3 фазы движение, прицеливание, атака. На каждой фазе игроки ходят одновременно.

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

Мой опыт создания ММО с открытым миром

Меня немного затянула разработка и ещё много времени я ковырял этот прототип, но в целом на все это ушло +- год.

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

Идея проекта примерна такая: сделать реалтайм ртс, открытый мир и все такое. Отказался от изометрии т.к. мне она показалось крайне сложной, начал использовать игровой движок Phaser2 CE.

План вырисовывался такой:

  • Открытый мир поделенный на сектора, перемещение между секторами по системе телепортов как в EVE

  • На планете идет война 3х фракций

  • Игрок является независимым отрядом из “Мазертрака” и 6ти юнитов которые тусят в трюме. Так же у него есть трюм для сбора всякого хлама и перевозок.
  • На карте есть базы которые являются островками безопасности, торговли, производства.
  • Юниты делятся на боевых, добывающих, саппорты.

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

Мой опыт создания ММО с открытым миром

И я принялся за работу, опять без плана, но с великими идеями и безграничным энтузиазмом X). Но у меня была серьезная проблема в том что я не умею рисовать и мне нужен был художник.

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

Мой опыт создания ММО с открытым миром

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

Спустя 2 месяца ничегонеделания мой мозг перезагрузился и продолжил делать игру ¯\_(ツ)_/¯. На этот раз начал разработку не с написания кода, а наметил план, выделил важные пункты и двигался по нему почти не отклоняясь от курса. И это не диздок. Диздок я писал с самого начала, а на этом моменте на него как раз забил и руководствовался только kabana из github’a.

До какого то времени я писал код в опенсорс, и покоится он там по сей день. Код который там лежит... на самом деле за него стыдно и он ужасный).

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

В итоге нафиг выпилил из игры отряд, переделал управление главной машиной отряда на WASD, а управление оружием и снаряжение в мышку. Удалил или адаптировал чисто под ии почти весь код который являлся составляющей ртс. И вот ртс игра уже совсем не ртс).

Последующие пару месяцев я вылизывал весь код на ошибки, баги и тд. Переписал весь фронтенд на более нормальные технологии vue/webpack. И теперь пишу этот текст.

Из всей этой истории можно выделить некоторые ошибки которые я делал:

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

  • Я не использовал готовые решения и по-сути частично написал свой движок когда [пункт 1]

  • Я часто менял вектор разработки что привело к частому переписывания кода. (За все время я сменил 3 жанра игры)

  • Я не планировал заранее (часто я придумывал что то тупо на ходу и сразу это делал)

  • Я не коммуницировал с gamedev сообществом

Но в целом цель была научится программировать и эта цель достигнута)

Техническая реализация

Я постараюсь кратко описать как это работает у меня без кода, а словами и картинками.

Стек технологий который используется в игре:

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

  • фронтенд: Vue/webpack/Phaser3: это все что видит игрок


Архитектура приложение вкратце выглядит так:

  • 5 модулей для api фронтенда связанные общим объектом “игрок”: магазин, инвентарь, база, игровая карта, “остальное”(чат, нотификации, диалоги и другие оч маленькие модули).

  • Независимый модуль выделен под работы ИИ игры, он в свою очередь делится на подмодули (строения, боты, транспорты, игра жизнь, облачка, базы, “слушатели” (некие точки на карте которые что то делают когда на них попадает игрок, например телепортирует на базу)).

  • Модуль заданий, проверяет выполнения условий задач в заданиях взятыми игроками.

Все это работает параллельно благодаря многопоточности go. Весь этот многопоточный ад синхронизируется за счет того что объект игрока создается 1 раз (как и все игровые объекты), кешируется в хранилище и пуляет его везде по ссылке + мьютексы, каналы и другие нюансы. Это работает довольно быстро, но в противовес этому мои реализации алгоритмов работают очень медленно. ¯\_(ツ)_/¯

Управление

Управление персонажем в игре работает вот так, каждый кадр клиент отсылает на сервер сообщение с информацией какие кнопки пользователь нажимает прямо сейчас (WASD), положение курсора и нажата ли левая кнопка мыши.

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

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

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

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

Радар и обзор:

Обзор в игре поделен на 4 уровня.

  • Прямая видимость: ну тут все понятно это то что видит игрок вокруг себя в мельчайших подробностях

  • Радар: радар показывает метки на тумане войны объектов которые испускают сигналы и типы этих сигналов (воздушное, неземное, строение, метеориты, ресурсы), радар можно глушить в определенной области с помощью некоторых строений или эквипа, тот кто играл в supcom тому должно быть знакомо :)

  • Память: если игрок видит какое то строение/куст то он его запомнил и будет видеть всегда, но он не будет видеть изменений если он повредился или умер например. Информация об объекте обновляется когда зона где он находится будет открыта снова.

  • Статичная карта: ну это объекты являются статичными на карте, горы или базы, видны всегда и не изменяются.

Мой опыт создания ММО с открытым миром

У своих сооружений тоже есть своя зона видимости а еще можно построить отдельно радар.

Этот модуль работает независимо от остального кода и сам отслеживает все игровые объекты которые попадают в поле зрения, но тут есть нюансы:

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

кому интересно старую реализацию можно посмотреть тут, она ужасно просаживает производительность но может показать принцип работы.

Задания:

Я закончил разрабатывать модуль заданий и хочу о нем тоже поведать т.к. он работает :D. Еще оч.давно я сделал схему структур и примерную архитектуру того как это должно работать. Вот она:

Мой опыт создания ММО с открытым миром

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

Что сейчас

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

  • баланс боя

  • награды (копание руды, поиск аномалий, убийства нпс, задания и тд)
  • баланс производства

  • удержание интереса игрока и сопутствующее


Если кому то удастся поиграть отпишите как вышло)

8888
17 комментариев

За караваны плюс не глядя 👍 а так здорова, хоть ммо не моё

7

Очень заценил. Кто-то скажет что делать слиент на HTML - наркомания. Но не у всех девелоперов есть время и ресурсы выходить из своего стека слишком далеко, не умирая от голода.

Может как-то поделюсь своей историей о том как недотащил до релиза - https://twitter.com/vovchisko/status/1168658034140123136
Хоть игру выпистить и не вышло с первого раза - скиллы выросли.

2

Хороший пример того, что "желание" сильный двигатель прогресса. Из "неуча" в сферу программирования. А началось с того, что "тупо" решил попробовать для себя) 

2

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

1

Наверно уже поздно, я не уверен)

Переферия? Это же... rim battale planets? Оно же "в кольце войны" 
Древняя игрушка, хардкорная очень, вообще удивлен что в ее еще кто то помнит.

1

Что то пошло не так) Окна раздвигают экран.

1