7 февраля в 09:24

История из российского А(АА)-инди геймдева на одном примере



Под катом вас ждет большая и наполненная графикой история, как группа заинтересованных людей за 2 года создали инди-проект уровня ААА (по их мнению)

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

И. Ефремов, Лезвие бритвы


Вместо вступления


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

Регулярно играл в игры только один из нас, он же и рассказал остальным про популярную карту для Warcraft 3, которая называется Legion TD. Конечно сработала мощная аналогия с DotA — игра тоже начиналась как карта для Варкрафта, но потом была переделана в самостоятельный продукт, очень успешный. С Легионом похожая ситуация — это очень популярная карта, по ней существует фан-сайты и проходят турниры, но люди по-прежнему играют в карту игры, сделанной в 2003 году. Кажется, самостоятельная игра просто обречена на успех.

Youtube-видео с геймплеем оригинальной игры.

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

Так мы в январе 2015 года приступили к разработке нашей игры.

Немного об игровой механике


У игры довольно необычный жанр — мультиплеерный tower defense.

Игровое поле состоит из двух частей — западной и восточной. Команда западной стороны (минимум 1 игрок) играет против восточной. Между ними находится арена (об этом позже):

image
Игровое поле

Одна сторона состоит из четырех слотов (то есть максимум возможна игра 4х4). Каждый игрок строит юнитов-защитников в своем слоте, а со стороны ворот нападают юниты волны (отмечено красным):

image
Карта игровой стороны

Игра состоит из фаз и начинается с фазы строительства:

image
Фаза строительства

После окончания фазы строительства, появляется волна и юниты автоматически сражаются (тут игрок не участвует):

image
Фаза волны

Прорвавшиеся юниты волны идут кратчайшим маршрутом к королю (King slot). Если игрок 1 не смог отбиться (“протек”), а игрок 2 отбился, то его юниты телепортируются к королю и защищают его:

image
Слот короля, в который зашли юниты волны

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

Первый период


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

image
Первый игровой клиент. Сверху в виде словаря выведено состояние игрового мира, ниже — построенные юниты (буквы Q)


Первые возможности нашего сервера мы тестировали именно на этом консольном клиенте, но довольно быстро пришли к выводу, что надо сразу сфокусироваться на нормальном графическом клиенте. Мы собрали его на Unity, а для моделей использовали бесплатные ассеты из Unity Asset Store:

image
Первая версия графического игрового клиента на Unity

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

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

Так прошли первые месяцы разработки.

Второй период


Дизайнер лихо взялся за дело и довольно быстро отрисовал нам новый интерфейс (“торпедо”, как мы его потом прозвали):

image
Вторая версия игрового интерфейса

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

imageimageimage
Первые наброски персонажей: гоблин в броне, орк и гоблин-механик.

Мы набрали скетчей на первую гильдию, которую назвали Warfactory и начали думать над тем, каким образом получить модели существ. К тому времени мы уже были широко известны в узких кругах и с нами связался Олег, 3D-моделлер с Украины, который заинтересовался участием в проекте. Он же и приступил к созданию первых моделей, а в нашей команде стало 6 человек:

image22image11image04
Один из первых собственных 3D-юнитов — “тарелка”. До сих пор один из моих любимых юнитов в игре.

image15image25image21
Процесс работы над орком (Orc Bruiser)

Мы начали активнее заниматься проработкой собственной графики, юнитов и карты. Так как в Unity Asset Store бесплатные модели были не очень высокого качества, мы решили, что за пару месяцев сможем сделать свою собственную графику.

image
Скриншот игры той поры. В игре уже добавлен наш собственный интерфейс, а слева можно увидеть ту самую “тарелку”.

По скриншоту заметно, что самое неказистое (помимо всего остального) — плоская зеленая карта с прямоугольными серыми стенками. Мы решили посвятить некоторое время левел-дизайну и сделать красивую карту.

image00image27image23image05image02image08
Некоторые элементы работы над объектами карты

Работа над картой затянулась и мы пришли к выводу, что проблема в недостатке человеческих ресурсов. Мы бросили клич по тематическим группам и довольно быстро нашли ребят, которым было интересно участие в команде — текстурщики, моделлеры и аниматоры. Таким образом, команда разрослась с 6 человек до 12, но мы стали работать сразу над несколькими направлениями. Одновременно скетчилось несколько юнитов, дизайнилась карта и новая гильдия (Order of Dragon).

Третий период


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

Мы также сошлись во мнении, что первый интерфейс ни на что не годен и сделали вторую версию интерфейса:

image
Внешний вид игры, когда мы активно работали над развитием карты и игровых моделей

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

image
Внешний вид карты, который мы некоторое время считали финальным состоянием

image
Внешний вид игровой стороны (вид из редактора)

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


Ролик, подготовленный нами к первому закрытому бета-тесту.

Четвертый период


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

Для Гринлайта мы еще больше улучшили визуальную составляющую карты, полностью закончили 2 гильдии (Warfactory и Order of Dragon), а также подготовили специальный ролик (его также можно посмотреть на нашей странице в Гринлайте):


Ролик, который мы подготовили специально к запуску Greenlight

Я предлагаю вам посмотреть несколько свежих скриншотов из игры, чтобы сформировать впечатление, как она выглядит сейчас (особенно в сравнении с тем, как она выглядела изначально):

image10image19image29image18
Свежие скриншоты игры

Немного об инструментах


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

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

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

Третий инструмент, к которому мы подошли — таблица в Google Docs

image
Скриншот нашей таблицы за период с июня по ноябрь

Такая таблица позволяет отслеживать готовые задачи и проваленные (отмечены черным). Желтым мы отмечали задачи, сделанные с опозданием. Цветовая разметка столбцов таблицы — разные направления разработки (сервер, клиент, UI, графика). Быстрого взгляда на таблицу достаточно, чтобы увидеть, какие направления буксуют, кто из команды частенько проваливает сроки, а кто наоборот подходит ответственно. Такой формат оказался самым удачным. В качестве вишенки на торте — история изменений файла, чтобы отслеживать ошибки и находить, кто себе “накручивает баллы” (доступ к редактированию таблицы имеют несколько членов команды).

Заключение


В моем рассказе опущены многие интересные моменты: как мы воевали с сетевым взаимодействием и как в итоге его реализовали. Как мы боролись за производительность сервера и целиком его переписали c Python на Go, как мы оптимизировали клиент и добавлали туда графические эффекты. Все это мы можем рассказать в будущих наших статьях. А пока — записывайтесь на бету, оставляйте отзывы и голосуйте за нас на нашей странице в Greenlight!
a11aud @a11aud
карма
36,2
рейтинг 0,0
Самое читаемое Разработка

Комментарии (35)

  • +1
    Я предлагаю вам посмотреть несколько свежих скриншотов из игры, чтобы сформировать впечатление, как она выглядит сейчас

    Как Дота она выглядит =)

    • 0
      Как первая Дота, если быть точным.
      • 0
        Совершенно не согласен. В Варкрафте сильно устаревшая графика, чтобы сравнивать ее даже с инди-играми текущего поколения.
        • 0
          Так тут графика тоже сильно устаревшая. текстуры дорог, песка, да и вообще все текстуры, деревья и остальные модели. Анимация вырви глаз, особенно страшно смотрится когда много юнитов сражается.
    • 0
      Тоже самое. Как только глянул на КДПВ, сразу Доту вспомнил.
  • +2
    Кому, как и мне, станет интересно найти ребят в гринлайте — вот ссылка
  • +1
    Я помню отличную карту для wc3 — enfo's team survival, вроде бы так. Давно это было…
  • 0
    На порядок проще было бы сделать это как мод карту для доты.
    • 0
      Мы старались уйти от тяжелого наследия движка (оригинальная карта тоже является модом и многие вещи на ней сделаны «костылями»). К тому же, такой проект уже существует, называется Legion Reborn, но там много жалоб на баги и косяки, что опять же подтверждает мои слова о тяжелом наследии.
      • 0
        Какое еще наследие движка если они начиная с реборна перешли на новый (Source 2)? Как раз в 2015 (вики подсказывает что сентябрь)
        • 0
          Извините, я неправильно выразился. Имелись ввиду ограничения, которые накладывает любой редактор карт (Варкрафт3, Дота2). С их помощью вы делаете кастомную карту, для конкретной игры, и не можете реализовать все, что вы хотите, так как ограничены возможностями данного редактора
        • 0
          Наследие движка, насколько понял я — это ограничения, связанные с основной механикой игры, для которой делается мод, а не какое-то графическое устаревание.
          Т.е. в данном случае сделать с нуля будет куда рациональнее в плане оптимизации и реализации игровой механики, игровых фич и баланса.
          Для той же Доты Реборн движок — сурс второй, и он несет наследие этого движка. А вот для модов ДОТЫ движком уже является сама ДОТА. Сделать с нуля игру на сурсе втором — это то же самое, что сделать ее снуля на юнити, а никак не то же самое что собрать мод на доту. К тому же мод давно уже есть, да и не только на Доту, но и на Старкрафт второй, смысла в повторной реализации нет. А вот стендалон версия уже выглядит куда интереснее)
    • +2
      А такая уже есть =)
      «За короля: Пламя войны» =)
    • 0

      И таких модов уже две штуки сделано :)

  • +1
    жгите!
  • +1
    Огромное спасибо за историю личной победы! Можете немного рассказать про разработку системы способностей и трудности в балансировке.
    • 0
      Спасибо за отзыв. Часть системы сделана аналогично оригиналу, часть мы придумали сами, но опять же с оглядкой на оригинал. Нельзя сказать, что проведена большая работа по балансировке, но т.к. инстанс игрового сервера запускается под каждую игру, то между запусками игр мы иногда меняем игровые параметры. Если вам интересно, могу пригласить на закрытый бета-тест.
  • +4

    AAA это успех по технологиями, у общественности/критиков и по прибыли. При создании B-игр риски минимальны или их вообще нет. Если не считать рисками просто необходимость утром вставать и идти делать игру.
    Тут мы видим обычное B. Дота и Лига легенд это B-игры. ААА это ТОП-ММО и Батлфилды.
    Я не удивлюсь, если авторы решили, что шадоумапы, стейт-машины и поиск путей в графе типа ААА-теком.

    • +2
      Все немного проще, но суть вы передали верно: стоимость ААА игр исчисляется миллионами долларов. Тут такого и близко нет. И вообще понятия «инди» и «ААА» плохо совместимы.
      Да, можно сделать крутую и успешную инди-игру, но ААА она от этого не станет.
    • 0
      «AAA это успех по технологиями, у общественности/критиков и по прибыли.» и «ТОП-ММО»
      Скажите, а по каким параметрам из перечисленных League of Legends у вас не проходит в ААА?
      • 0

        Не скажу за остальное, не слежу за проектом… но а где там технологии? Вроде же ничего сверхъестественного они на момент запуска и до точки в пару лет назад (когда я играл в последний раз, текущего состояния не знаю) не показывали?..

  • +1
    Как мы боролись за производительность сервера и целиком его переписали c Python на Go, как мы оптимизировали клиент и добавлали туда графические эффекты. Все это мы можем рассказать в будущих наших статьях.


    Действительно всё самое интересное пропустили.
    А на go нет проблем со сборщиком мусора? Он вроде не особо приспособлен под настоящий реалтайм.
    • 0
      GC в go очень крут и постоянно совершенствуется. В версии 1.8 удалось достичь задержки менее 1ms на серьезном объеме.

      Пролистайте наверх, там на графиках наглядно показано как улучшалась производительность сборки мусорка от версии 1.5 к версии 1.8 beta
  • +2
    Спасибо за статью. Хотелось бы больше технических деталей. Например, одна игра — это отдельный поток? Или отдельный процесс? Сколько игр может выдержать 1 сервер с 8-мю ядрами. Какой протокол используется, ну и так дальше.
    • +2
      Думаю, вам будет интересно посмотреть наше выступление на одной из питерских конференций, там многие технические подробности освещаются:

      • –1
        Спасибо. Интересный доклад. Несколько комментариев:

        1. Почему выбрали го? Все перечисленные проблемы — рефлект, словари, вебсокеты уже решены в джаве, например, просто бери и используй. Больше того — джава «по дефолту» быстрее го. Не холивара ради, бенчмарки есть в сети. Из доклада просто «офигел», узнав сколько времени ушло не на проект.
        2. Джейсон можно заменить на бинарный формат. Меньше данных, быстрее паковать, по времени работы на день-два.
        3. Оптимизировали ли математику? Есть много вариантов оптимизации через более легковесные функции.
        4. В видео нету ответа на мои первые 3 вопроса.
        • 0
          Дослушал, 4-й пункт можно вычеркнуть :).
        • +1
          1. Много причин:
          — Сделали бенчмарк и увидели увеличение скорости на нашей математике примерно в 1000 раз
          — Го это очень простой язык (по моему сугубо личному мнению это очень важная характеристика для языка)
          — Ест очень мало памяти (у нас лобби-сервер работает 200+ дней онлайн, сейчас занимает 7мб памяти)
          — Примитивно простой и быстрый деплой (пара строк Makefile, по времени 1-2 секунды)
          Последние две причины отличают его в лучшую сторону от Java.

          2. Заменим, скорее всего на этот. Сейчас это больше из соображений отладки, когда бывает необходимость смотреть глазами в отладчике, какие данные летают

          3. Двое из нас математики по образованию, оптимизировали и там уже некуда оптимизировать, математика у нас очень быстрая :)
          • –3
            Последние две причины отличают его в лучшую сторону от Java.

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

            смотреть глазами в отладчике

            log.trace(packet.toUserFriendlyView());

            математика у нас очень быстрая

            Тем не менее в докладе говорится, что в питоне математика занимала 80% времени. Что-то тут не сходится.
            • 0
              В докладе говорится, что математика занимала 80% времени на питон-сервере. На го-сервере эта проблема ушла.

              Сколько Java потребляет памяти на минимальном приложении http-сервере?
              • 0
                Сколько Java потребляет памяти на минимальном приложении http-сервере?

                ~3 Мб.

                В докладе говорится, что математика занимала 80% времени на питон-сервере. На го-сервере эта проблема ушла.

                Да, но математика от языка не зависит. Разве что ВЫ использовали какие-то специфиические функции из пакетов самого языка.
  • +1
    Спасибо. Очень хотелось бы почитать о серверной реализации.
  • 0
    Не нашёл нужных скриншотов четвёртого периода, и, мне интересно, вы избавились от пиктограмм Kayle, Olaf и Karma на панели покупки юнитов и, если нет, то что об этом думает Riot Games?

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