Veliri: Сессионные игры
Привет дтф, в этом году я решил немного отпустить ММОРПГ и доделать сессионные бои дабы релизнуть хоть что-нибудь >_<.
Пройти так сказать весь путь от начала до конца на более простом проекте. На разработку ушло примерно +-3 месяца после основной работы с использованием всех наработок из ММО.
Поиграть можно вот тут:
О проекте
Игра представляет из себя классическую сессионную игру с несколькими режимами боя.
Игра полностью самостоятельная (то есть ММОРПГ и это 2 разных приложения, в разных репозиториях и разной структурой бд), но выросли из одной кодовой базы и все нововведения включая всю боевку с высокой долей вероятности перетечет в мморпг.
Вообще я даже думал сделать рескин на какие-нить танки второй мировой и выкатить как отдельный проект, но потом вспомнил что я нищий и ленивый :(
На текущий момент я запустил ее в вк маркете, протестировать на реальных пользователях и потом на другие соцсети покидать.
Если в игре появится какая никакая аудитория то можно будет развивать дальше, дальнейшее развитие будет наверно двигаться в кооп-пве режимы (может даже сюжет) и рейтинговые бои. Ну а если игра умрет то будет неплохой проект что бы выпендриваться на собеседованиях и куча наработок :)
Основной геймплей
Ну тут в целом как и во всех сессионных играх:
- человек конфигурирует свой транспорт
нажимает кнопку "в бой"
- его кидает в очередь "Матчмекера"
- "Матчмекер" формирует команды
"Матчмекер" генерирует карту и создает "сессию" боя.
- игроки там успешно воюют (или нет)
- получают очки опыта и ресурсы на которые он может сделать новое снаряжение или продать на рынке.
колесо дает новый оборот
Также в игре присутствует стандартный набор механик и доната.
покупка кредитов (хотя их можно и на рынке наторговать) для рынка и скины/аватарки
- ежедневные задания
- прем. акк. который кстати тоже можно купить/продать на рынке.
Ассортимент скинов и аватарок на текущий момент довольно скромный)
Контент
На текущий момент в игре не очень много игрового контента, если в цифрах то: 12 видов оружия, 12 корпусов, 8 карт, 19 типов снаряжения, 2 режима.
Снаряжение
В игре есть боевое снаряжение разной степени полезности, вот самые интересные из них:
гранаты
боевые дроны
разведывательные дроны
турели
щиты
невидимость/невидимость на радаре
мины, ловушки
Вооружение
Переработал вооружение сейчас в игре 12 типов оружия с разными механиками.
Я не стал пока делать разные уровни одного и того же оружия, возможно время еще придет)
Баллистика:
- пулемёт
- дробовик
- мортира (что то типо арты ¯\_(ツ)_/¯)
- "просто пушка"
Лазерное оружие:
- лазерное ружьё
- лазерный дробовик
- лучевой лазер
- лазер с зарядом
Ракетное вооружение:
- Прямолетящие ракеты
- Управляемые мышкой ракеты
- Ракеты с захватом цели
- Ракеты которые сами находят цель если она недалеко.
Как можно заметить на гифках некоторые типы оружие теперь отталкивает корпуса при попадании или от взрывной волны.
Корпуса
В игре 3 разных типа корпуса которые различаются шасси и общим направлением характеристик.
Рынок
Как и в ммо в игре есть свободный рынок, то есть заполнять его будут сами игроки. Обмен на рынке ведется за “кредиты”, их можно получить продавая на рынке другим игрокам предметы, ежедневными заданиями и донат.
За каждую продажу рынок взимает комиссию 10%
Баланс
Баланс корпусов я рандомно накидал в гугл таблице, оружие/снаряжение вообще на глаз и через плейтесты балансировал :), но спустя N количество итераций там все +- прилично, хотя есть перекосы (перекосы баланса это вообще фишка сессионных игр, а не проблема)
С экономикой все примерно так же только таблица немного побольше)
Оптимизация клиента
Тут всё не так радужно хотя я добился чтобы игра была играбельной на слабых ноутбуках со встроенной видеокартой. Тестировал на “asus t101h” и на “lenovo ideapad s145-15ast на amd a6”.
Основная просадка производительности происходила из за использовании в клиенте callback’ов (включая setInterval(), setTimeout()) из за чего внутренний планировщик js не пойми куда сливал cpu time (я не являюсь специалистом js так что не до конца понимаю как тут все работает :)).
Почти всё callback’и я перетащил на планировщик самого phaser, остались ток callback’и вебсокета и парсера бинарный данных. И стало получше:
Правда игроки с разрешением экрана больше чем 1920x1080 сообщили о проблемах в фулскрине.
Оптимизация бекенда
На синтетических тестах (а реальных тестов нет) пк на основе ЦПУ ryzen 2700x, вытянет 300-400 игроков/ботов одновременного онлайна. Сейчас все крутиться в облаках на vds серверах, там число думаю будет побольше.
Однако теперь это не монолит сервер, а состоит из 2 логических частей.
1) роутер, к нему подключаются игроки, он отвечает за очередь, создание боев и отправку сообщений из боевых нод. На нём ещё крутиться все сервисы лобби (инвентарь, магазин, крафт и тд) и работа с бд. Является узким местом как по трафику так и по цпу, но я верю что все будет хорошо)
2) нода для боев, тут и происходят бои (то есть коллизии, баллистика, движение, ии и все такое), на одной ноде может быть одновременно запущено несколько боёв. И этих нод может быть много.
Связь между роутером и нодами осуществляется по rpc.
В общем идея не нова, но я это не заложил изначально и мне было больно разделять. В упрощенном варианте это выглядит как то так:
Таким образом если в мою игру внезапно кто то будет играть и я присяду смогу горизонтально масштабировать сервера, до тех пока будет хватать интернет канала и денях (но это совсем другая история).
Что в итоге
Ну сейчас в игре зарегистрировано 38 человек и сыграно 205 боев (150 боев наиграл 1 игрок), мне уже накидали кучу багов которые я исправил, нашел несколько багов о которых никто не знает, сервера не разу не упали по причине ошибок.
Буду благодарен если кто то поиграет и отпишет понравилось/не понравилось.