Несколько увяз в GameFramework. Пост будет, когда продумаю все нюансы.
Cводка изменений:
- Переделал GC (классы OS, GC, EngineGC) на модель с Метаданными - Добавил новый статичный аксессор Memory::Meta для тыканья в мета класс - Добавил две новых сущности ObjectMeta и ClassMeta - Добавил счетчик кол-ва объектов по классам - Добавил генерацию уникальных текстовых имен для объектов
Теперь подробнее: Сначала с плохого. Пока не нашел как нормально запретить (на уровне компиляции) или переиспользовать оператор delete (он один фиг деструктор дергает, даже когда не надо и если он пустой). Поэтому откладываю в сторону и вернусь к нему потом. Тоже самое с нормальными конструкторами. Использовать их так, чтобы не вредить логике работы всего остального не получится. Поэтому void __constructor, для кастомной логики, с нами надолго.
Переписанный Object Storage (он же OS) теперь работает быстрее (за счет сущностей метаклассов), а так-же дает ряд дополнительных возможностей (пока-что через них можно узнать название класса, и объекта в текстовом формате; кол-во живых объектов каждого класса. Потом буду добавлять дополнительные поля, по необходимости). Заодно исправил поведение хождения по стеку объектов. Теперь, в случае, если удаляется Owner объекта, сначала удалятся объекты принадлежащие овнеру, и только потом, в самом конце, сам owner. И вообще OS стал неким комбайном, совмещающим в себе и cобственно Object Storage и Сборщик мусора (разделение идет по методам через статичные аксессоры с говорящими названиями). SharedPtr теперь не используется даже в нем, т.к. абстракция над сырыми указателями в нем не имеет никакого смысла
Из класса Object, соответственно ушли GC флаги (они улетели в мету), и их место занял указатель собственно на мета класс. И да, теперь OS управляет объектом через мету, а не напрямую (сделал удобства ради, чтобы по коду не искать переключения флагов). Теперь они все в одном месте).
И пока, работу над базовым представлением игровых объектов считаем завершенной. Единственное, что я еще дополнительно сделаю с Object это введу дополнительный флажек, который будет ставится при вызове Destroy (чтобы Движок знал, что этот конкретный объект был удален разработчиком, а не собран GC). Теперь необходимо создать классы для основных сущностей GameFramework. Миры, сцены, актеры, и прочее. Это займет у меня больше 1-2х дней, поэтому ожидайте весточку от меня где-то на выходных.
В прошлом посте у нас завязался интересный диалог с товарищем @TwoCow. После которого много думал.
В итоге этих дум: написал простенький Сборщик мусора и переписал базовый класс Object под ноль. - Удалось избавится от NewObject (теперь православный operator new правит балом). - Выкинул SharedPtr из наследников Object - они теперь создаются в отдельном дереве и бдят, в самих классах объектов живут сырые указатели. - Удалением объекта, не смотря на то, что оператор delete работает (потом оберну логом, чтобы Error кидал), теперь занимается GC. Если объект является владельцем какого-либо другого объекта - они тоже грохаются, за исключением, если объект объявлен Рутом. В этом случае GC его игнорирует (но знает о его существовании) и удалит в случае, если началось завершение работы движка, либо был вызван Destroy после вызова RemoveFromRoot() - Для удобства дебага добавил текстовое поле с именем класса.
Сам GC выполнен в виде двусвязного непрерывного списка. Срабатывает на следующий тик движка, после вызова операции. Т.е. при вызове Destroy() объект будет помечен на удаление, но удалится только в начале след. кадра. То-же самое с регистрацией. Сначала пометили, потом зарегистрировали.
Внутри страшно, поэтому показывать не буду. Надо итератор сделать, и еще разик эту пояту переписать.
Так-же чуть переделал инициализацию движка, на более логичную, а так-же добавил авто очистку объектов при завершении работы движка.
тест кейс
и результат работы
В дальнейшем надо будет еще добавить счетчики по кол-ву объектов каждого класса, причесать GC, и еще раз взглянуть на варианты использования классического конструктора. И потихонечку переключаться уже на другие задачи.
PS: пока писал пост заметил багу с удалением Рут Объектов ). Придется исправлять. Исправил.
Основной цикл движка на данный момент выглядит так:
Пользователь создает класс от класса Relict::Application в котором необходимо разместить базовую (не игровую) логику работы приложения. Для этого ему доступны евенты PreInit, Init, PostInit, Tick, PreShutdown и Shutdown.
Простое приложение, которое самоуничтожается после 3х секунд после запуска (читайте как Hello World)
В main функции приложения (в последствие это все уедет в темплейт и/или макрос) необходимо создать Шаред экземпляр нашего класса Application, Вызвать функцию создания экземпляра движка (т.к. при создании объекта Application сделать это нельзя из-за того, что std::enable_shared_from_this еще не инициализирована, а она нужна для Engine) запустить его инициализацию и основной цикл. И не забыть вернуть из функции main код выхода приложения, который вернет метод Shutdown.
Пока так, потом main будет заменено на нормальный вариант в зависимости от платформы (main и WinMain), а вся вот эта писанина улетит в макрос инициализации
Как можно заметить, здесь используются SharedPtr. Пока-что это просто залипуха над shared_ptr std библиотеки (и unique_ptr соответственно). Сделано для того, чтобы не пришлось переписывать половину кода, в случае, если мне придется делать свои указатели (или использовать из какой-нибудь более другой нежели std библиотеки)
Это что касалось основного базового цикла. Теперь о том, что я имел ввиду под анриляшной наркоманией.
Во первых. Все классы движка должны быть отнаследованы от некоей базовой сущности. В случае Анрила это UBaseObject, в моем - Object. Сделано это для того, чтобы все объекты в дереве вызовов знали друг о друге (сборщика мусора не предусмотрено). И чтобы всегда можно было обратится к объекту, породившему текущий объект через метод GetOwner. Правда это накладывает дополнительные ограничения на констурктор, которые в Unreal это решается все generated заголовочниками. Ну а я пока-что пошел наркоманским путем.
Сразу попытался решить проблему, в случае, если объекту нужны дополнительные параметры в конструктор.
Пока не знаю, угадал ли я с решением, или это придется переписать на что-то более вменяемое. Как минимум точно нужно будет подумать над сценарием, когда нужен дополнительный конструктор объекта без параметров (дефолтный конструктор). Может сложится ситуация, когда такой объект будет создан не через макрос NewObject, а через обычный new или make_shared - тогда будут проблемы, ибо Owner не будет инициализирован.
Также сделал дополнительный Реликт World, в котором описывается Мир, сцены и отдельные ноды сцены. Но об этом расскажу позже, когда придумаю нормально, как с ними работать через GameFramework сущности.
Начнем с основного. Каким образом организовать движок так, чтобы это было и функционально и удобно. Понятно, что при программировании приложения (игра это конечно тоже приложение, но пока-что мы под приложением будет понимать нечто более простое и базовое) разработчику не желательно напрямую давать доступ к движку. Т.к. это ему не нужно, т.к. больше шансов выстрелить себе в ногу и т.к. это добавляет некому не нужное (как разработчику приложения так и разработчику движка) переусложнение проекта, увеличивает энтропию Вселенной и увеличивает вероятность Unknown Behavior (или неопределенного поведения). Иными словами разработчик движка должен убедится, что разработчик приложения всегда будет вызывать сначала А, а потом Б и никак не наоборот. Так-же, нам нужно убедится, что под все доступные движку платформы код приложения будет одинаковым. Поэтому необходимость сделать некий абстрактный уровень, или, в нашем случае GameFramework. Этот фреймворк будет запрашивать все необходимые функции и потоки движка в нужной нам последовательности. А разработчику приложения будет достаточно вызвать лишь пару методов. В GameFramework разработчик сможет управлять сценами, загрузкой и созданием объектов и управлять игровой логикой (собственно по этому и GameFramework). При необходимости, к ряду классов ядра движка (модуль Core) можно получить доступ через вызовы GameFramework, однако, разработка приложения должна в 99.9% случаев обходится без них. Зафиксировали.
Вторым по значимости является отдельный модуль, который по совместимости является точкой входа в приложение. И это модуль, Engine. Он состоит из одного единственного класса Engine (+ управляющие структуры, конечно). Именно его запуск в функции main приложения запускает все нужные подсистемы, инициализирует мир, а так-же запускает основной цикл приложения.
Третьим модулем, который так-же, как и GameFramework является уровнем абстракции, является модуль Core. В нем мы должны создать все базовые и служебные классы нашего движка. Там хранятся классы обработчики текстур, моделей, систем частиц, итд. Эти классы будут использоваться движком для работы с функциональными внешними библиотеками (например SDL) и будет обеспечивать универсальность данных, в не зависимости от выбранной разработчиком приложения платформы.
Все эти три модуля, а так-же подсистемы, которые будут использоваться классами этих модулей, называются Реликты (Relicts). Все они, в свою очередь, являются частями единой библиотеки, которая и будет представлять собой движок RelictEngine
Все реликты являются отдельными проектами типа Object Library
Система сборки
Так-же, как и в случае с GameFramework нам нужна некая абстракция от платформы. Сценарий сборки должен быть одинаковым на любой из доступных платформ. В данном конкретном случае CMake показывает себя лучше всего. Он обладает хорошим, и даже в каких-то случаях избыточным функционалом. Умеет генерировать конфигурационные файлы и заголовки по шаблонам, итд, а самое главное, он поддерживается всеми основными операционными системами и архитектурами. Конечно, будет необходимо написать для него некий функциональный модуль, чтобы разработчику приложения не пришлось думать о том, как подключать те или иные библиотеки, в каких директориях искать библиотеки и исходные коды, но в остальном CMake справится сам.
Оглашение реликта с помощью самописных функций CMake
И на этом пока закончим. Впереди нас ждет большая, без приукрашиваний, работа, о которой, можно конечно много порассказать, но я не уверен, что контент подобного рода подойдет для Пикабу. В прочем, посмотрим на реакцию на этот пост. Я стараюсь использовать простой язык, но перечитывая этот пост, как мне кажется, это только усложняет его понимание. В общем напишите - пойдет ли такой формат, или стоит изменить подход к постам.
Как и обещал, т.к. NauEngine мне, мягко говоря, не понравился (пока!), то начинаю новую серию постов о разработке собственного движка Relict Engine для проекта Cold Fusion, о котором можно немножко почитать в соседней серии "Вся наша жизнь спираль".
Пост вводный, поэтому технической информации практически не будет.
Итак, откуда же взялся Relict Engine? Его история начинается в конце двухтысячных годов, когда еще во всю кипела работа над ремейком игры Elite3: Frontier First Encounters и переносом ее на DirectX9. Тот проект носил название FFED3D, и хотя проект добрался только до версии бета 12 (сначала наша группа по ряду причин забросила проект, а год назад, увы, умер разработчик, который его поддерживал до последнего времени), идеи, которые мы хотели в него внедрить до сих пор живы. Сам проект изначально строился на оригинальной кодовой базе (ассемблер, разобранный ребятами из JongWare + наш код, который собственно заменял оригинальные вызовы на современные), но в какой-то момент пришло понимание, что оригинальный игровой код дальше использовать нельзя, и нужно писать что-то свое. Так, Relict Engine (тогда под другим названием) и появился.
Сейчас, конечно, его реализация и подходы, которые я тогда использовал смотрятся, мягко говоря, убого. Однако, идейную его составляющую я планирую перенести в его современную версию.
Итак, "у нас было два пакетика травы"...
Конечно, писать полностью движок с нуля это очень круто, но в тоже время крайне не благодарное, да и по большей части, не нужное занятие. Поэтому, мы поступим немножко иначе.
План примерно такой:
1) Написать основной framework для нашего движка. Это полностью наша разработка, которая не требует никаких внешних библиотек, но то, что было написано в те далекие времена требует глобальной переработки (читай все удалить и написать заново)
2) Не тратить время на полноценный редактор - он не нужен. Гораздо лучше и проще написать ряд утилит (преимущественно консольных), которые будут выполнять одну задачу.
3) По максимуму задействовать библиотеки с открытым кодом для тех или иных задач. На данный момент список такой:
- SDL - для работы с окнами - Botan (если найду что-нить получше, переключусь туда) - криптография, цифровые подписи, итд - asio - сокеты и все что связано с сетью - Fmod - звуки, и все что связано со звуковыми эффектами - Bullet - физика - возможно будет заменен на другой. - Lua - скрипты и простая логика отдельных элементов - glm - как библиотека для быстроматематики - assimp - как библиотека для перегонки мешей в наш собственный формат (RAT - Rellict AsseT) - ??? - тоже самое для работы с текстурами (пока не определился) + тонна служебных библиотек, которые и так были бы включены в проект (всякие zlib итд)
4) В качестве графики использовать OpenGl последней версии (чтобы можно было быстро написать хоть какой-то рендер), но в дальнейшем переключится на Vulkan
Работы очень много. Основная проблема легаси версии движка в том, что он не поддерживает 64битные системы (это исправим), мультипоточность (а вот с этим намучаемся) и сеть (тоже намучаемся). Все уже готовые элементы движка по сути придется выкинуть и написать заново. Сколько это все займет времени (с учетом моей основной работы, и как шла работа над проектом уже на готовом движке), я даже не представляю. Но, похоже, деваться особо некуда. Готовые движки не дают достаточного места для маневра, а писать костыли мне надоело.
И да, сразу отвечу на вопрос: Скорее всего Relict Engine не будет доступен публично для собственных проектов. Все-таки я собираюсь точить его под одну единственную конкретную задачу. Но посмотрим, что из этого получится, если получится вообще. А может быть и Nau Engine быстро отполируют (сомневаюсь, но надежда умирает последней) и можно будет использовать его (при условии, что они не решат идти путем Unreal с прибитыми гвоздями и со ависимыми друг от друга фичами кода ядра).
Недавно корпорация Valve анонсировала новую многопользовательскую сетевую игру Deadlock в жанре MOBA и "FPS" шутера, но от 3-го лица, что делает её действительно уникальным экземпляром среди всех разработок многомиллиардной компании, но есть ли реальные шансы у Deadlock на новую соревновательную игру претендующую на киберспорт мирового уровня?
Заставка Deadlock
Сюжет и целевая аудитория
Лор этого произведения также закопан, как и лор Counter Strike или Soulslike игр, поэтому о ней отдельно лучше почитать здесь. В целом он достаточно нейтральный с точки зрения особых трендов, что очень радует.
Как неудивительно, преобладающей сегмент - это фанаты игр Valve, гибридных игр по типу Valorant, Overwatch и концепции Dota 2, League of Legengs.
Несмотря на то, как тонут остальные игры Valve (Dota 2 и CS2), может показаться, что они занимаются только игрой Deadlock, хотя на самом деле над этим проектом работает абсолютно другая студия.
Дисклеймер:
Во время прочтения статьи, прошу учитывать тот факт, что игра находится в режиме постоянных обновлений, патчей, фиксов и ребаланса. Весь доступный материал находится по этой ссылке.
Тенденция гибридных игр
Чтобы понимать происходящее в Deadlock, желательно немного разобраться в тенденциях игр, которые включают в себя множество различных механик и концепций других игр. По сути, такое направление интересно лишь тем игрокам, которые хотели бы увидеть сочетание двух или трех игр в одном экземпляре.
Примерами гибридных игр являются: Overwatch, который просто разорвал весь игровой рынок и взял лучшую игру года в 2016 году, скрестив в себе уникальность Dota 2 и Team Fortress 2, сделав из неё шутер от 1-го лица со способностями. Valorant же взял идею Overwatch и CS:GO, но с большим уклоном в шутер, где способности лишь дополнение игрового процесса.
Однако между гибридными произведениями есть существенная разница, например Overwatch это явный подарок игровой индустрии, где задаешься вопросом "вау, а так можно было?", когда Valorant отвечает ровно на запрос "хотелось бы...", сам же Deadlock скорее относится к последнему, так как примерная концепция такой игры была очень давно, вопрос лишь в продуманной реализации.
Формирование игр на основе чужих компонентов
Если вам кажется, что разработать Гибридную игру может любая компания, то спешу вас огорчить. Просто разработать игру - одно дело, но разработать игру, которая будет удовлетворять и заинтересовывать игроков - это идеальный баланс между инвесторами, разработчиками и трендами. Множество финансовых мастодонтов в игровой индустрии пытались создавать нечто смешанное, и оно проваливалось с треском: Conсord от Sony (Overwatch, Valorant + Apex Legends) или Crucible от Amazon (Overwatch + Team Fortress 2). Огромнейшие бюджеты, но отвратительная и бездарная работа менеджмента над разработкой и изучение реальных трендов, сразу привели к закрытию проектов.
Оба проекта на букву "C", может поэтому компания Valve переименовала свою игру из Citadel в Deadlock?
Почему именно сейчас и именно от Valve?
Чтобы сделать такую игру, как Deadlock, желательно взять аналог движка Source 2, концепцию Dota 2 и попытаться выйти на цифровую платформу по типу Steam, а единственный достойный аналог это Epic Games Launcher. Но почему этого никто не сделал? Есть несколько возможных причин:
№1 Патент: Valve чувствительна к возможным рискам, которые могут понизить рейтинг её игр, а значит упустить прибыль. Они могли легко запатентовать такой продукт во всех вариациях и это огромный риск, потому что Valve пользуется юридическими силами в самый неожиданный момент. Например история с русскоязычным игровым обозревателем Gabe Follower, переносивший CS:GO в Source 2 ради интереса, к которому неожиданно постучались. Также есть обратный пример, где Valve не особо воспринимает StandOff 2 за конкурента, причина тому, что последний существует лишь на мобильной платформе и не нарушает права. Разрабатывать Deadlock - это юридическое самоубийство для компании любого калибра;
№2 Конкурентоспособность и платформы: За всю историю игровой индустрии только компания Riot Games смогла создать конкуренцию благодаря League of Legends и Valorant, которые сравнялись с Valve по количеству активных пользователей, не присутствуя на платформе Steam. Да и какая выгода Steam запускать на свою платформу такого "игрока"? Это равносильно выстрелу самому себе в ногу, поэтому Steam и не подпускает аналогичные игры на свою платформу;
№3 Игровой движок:Valve единственная компания, которая делает разные игры в одном единственном движке Source 1|2, поэтому они знают свой движок вдоль и поперек, включая проверку теорий. Deadlock идеально подходит для разработки под Source;
№4 Бюрократия:Valve по мере своей капитализации рынка прямо пропорциональна своей бюрократичности, что влияет на внутренние процессы по решению всех изменений. Проще говоря изменение какого-то одного незначительного элемента хотя бы из пользовательского интерфейса, должна пройти ряд согласований для принятия решений, и такая система очень сильно влияла на сроки разработки;
№5 Реализация разработки: компания Valve постоянно создавала ответные игры для конкурентоспособности на всем игровом поле:
Dota 2 | League of Legends;
Counters Strike 2 | Valorant;
DeadLock |... Overwatch?
Вы нарушили патент? Иски, суды, штрафы и вынужденное фундаментальное изменение концепций и механик. Вы сделали игру в нашем игровом движке? Коммерческий суицид. Вы сделали игру не на движке Source 2? Да здравствует уничтоженный баланс, оптимизации и десятилетнее проектирование игры из-за необходимости проверок теорий.
Deadlock - эталон гармонии долгой и скрупулёзной разработки.
Разработка Deadlock началась аж с 2018 года, под первоначальным названием Citadel. В процессе она потерпела не малое количество фундаментальных переработок и изменений, скорее всего компания Valve отталкивалась от успеха и неудач своих остальных игр и игр конкурентов, пытаясь найти тот самый баланс для разработки гибридной игры.
Если вы являетесь опытным игроком (игроманом) и не ограничиваетесь жанрами, соревновательностью, механиками и сюжетом, то вы могли заметить, что Deadlock явно сочетает в себе:
Игровую концепцию Dota 2 (MOBA);
Казуальную стрельбу и способности Overwatch (шутер и механики);
Пользовательский интерфейс Dota 2 (расположение, цвета и стиль);
HUD Team Fortress 2, но более современный (цвета и стиль).
Сам же игровой процесс полностью завязан на необходимости добычи и кражи душ, которые выпадают абсолютно с каждого юнита: солдат, нейтральный крип, страж, часовой, святыня, покровитель и герой. Также необходимо покупать соответствующие предметы своему герою для повышения его эффективности на поле боя ради уничтожения стратегических пунктов включая трон соперника. Единственное отличие от Dota 2, это отсутствие системы "опыта", здесь он полностью заменен на души, что решает проблему ролей по типу Керри и Саппортов.
Поиск матча: перед началом поиска матча игра предлагает вам выбрать возможного персонажа из всех предложенных, который вам может выпасть после нахождения матча, однако можно выставить приоритет на героев если у вас есть конкретное предпочтение.
Нахождение матча: вы появляетесь со своим одним из героев, которых вы выбрали, напротив своих соперников в маленькой локации, ожидая загрузки остальных участников.
Начало матча: система распределяет вашу команду из 6 игроков по 4 сторонам, само же перемещение по линиям происходит на зиплайне, являющемся аналогом свитка телепорта в Dota 2.
Стадии матча: в играх с жанром MOBA всегда выделяют 3 фазы матча:
Ранняя фаза [Early-game]: первые 8-10 минут идет борьба за каждую душу, где всегда есть вероятность умереть и потеряв свое преимущество;
Ганк фаза [Mid-game]: примерно с 10-ой минуты начинаются локальные стычки между соседними линиями для продвижения на Т1 и Т2 башни;
Фаза 6vs6 [Late-game]: примерно с 17-ой минуты начинаются масштабные битвы, где участвуют практически все игроки в борьбе за полную ликвидацию соперника для беспрепятственного уничтожения вражеских стратегических пунктов.
Каждая фаза обязана быть подконтрольна игроками из-за необходимости перехода на следующий этап для более эффективной доминации над соперником, однако существует четвертая...
Солдатские волны [Unit-game]
Верно, речь будет о Солдатах (Крипы). Если так задуматься, то в каком-то смысле они самостоятельные, необязательно заниматься уничтожением стратегических пунктов, ведь за вас это сделают маленькие друзья. От начала и до конца всего матча они имеют огромное влияние на всю карту, может дело в умном искусственном интеллекте Солдат? Дело в их количестве, а конкретнее в Зиплайне.
Вспомните ситуацию №1: появляется волна Солдатов с обоих сторон, вы уничтожаете вражескую пачку без потери своих и уходите, после ваши маленькие друзья идут встречать следующую вражескую волну и уже сзади неё поспевает ваша вторая волна Солдат на помощь к первой на Зиплайне;
Вспомните ситуацию №2: все тоже самое, только ваша команда занимается уничтожением вражеских Солдат на всех линиях с дальнейшим продвижением, а из-за системы Зиплайна начинается большое скопление;
Вспомните ситуацию №3: вы уничтожаете стратегические сооружения (стражи, часовые и т.п.), а на вашей базе вражеские Солдаты сносят вам Покровителя, защитить никто не может, потому что ваши союзники в таверне, а сказать "Мои Солдаты отобьют" не получится, ведь к вашему покровителю уже летит следующая волна вражеских Солдат на Зиплайне, а единственный способ быстрого перемещения это Зиплайн, ведь как в Dota 2 телепортироваться не получится.
Зачем такая механика? Она дает шанс отыграться и служит предохранителем в случае курьезной ошибки при доминации над противником. Благодаря ей существует феномен 50% побед.
Феномен 50% побед в Deadlock
Особенность феномена заключается в том, что практически каждый игрок имеет соотношение побед и поражений 1 к 1 вне зависимости от уровня скилла игроков и их пика. С одной стороны это говорит о том, что любой человек может выиграть или проиграть, а с другой... "новичок = про игрок", поэтому такая система может раздражать, особенно когда ты вкладываешься всего себя в матч. Откуда такая система возникла? Есть несколько факторов.
Фактор №1 - Unit-game, который имеет контроль всей карты благодаря своей выразительности;
Фактор №2 - Выбор персонажа делается за игрока путем подбора. Если посчитать процентное соотношение по персонажам и по игрокам, то вероятность победы всегда будет 50%;
Фактор №3 - Отсутствие четкого разделения ролей;
Фактор №4 - Система Зиплайнов устроена таким образом, чтобы стягивать концентрацию на линиях для постоянных сопротивлений;
Фактор №5 - Система луз бонусов для команды, которая теряет стратегические пункты по линиям (lose-bonus | CS:GO/CS2).
Для чего была создана такая система? Дело в уникальности, оригинальности и сложности игры, из-за которой появляется высокий порог входа, поэтому пришлось усилить эти факторы, чтобы новички не грустили как в Dota 2.
Deadlock vs Dota 2 - главное отличие
Разработчики Deadlock решили избавиться от страшной картины, как в Dota 2, изменив огромное количество механик MOBA жанра, следующим образом:
Вариативность взаимодействия типа урона
: из-за чего новички даже спустя 300 часов не всегда понимали, почему они не могут нанести существенный урон, а дело в количестве типа урона и блокирующего этот же самый урон. [более подробно|18+]
В Deadlock же решили отказаться от таких сложностей, включая изменение системы атрибутов (Dota 2: сила, ловкость и интеллект), поэтому в новой игре от Valve атрибут приравнен к типу урона следующим образом:
Оружие | физический тип урона (обычная атака на ЛКМ);
Спиритизм | магический урон (любые способности на кнопки);
Живучесть (влияет на HP, ловкость и защита от типов урона).
Сравнение фундаментальных аспектов Deadlock и Dota 2
upd: таблица теоретическая, на деле в Deadlock я не покупаю больше 1-го активируемого предмета. В Dota 2 же приходится покупать под 3-4 активных слотов, не говоря уже о шарде и скипетре.
На основе данной таблицы можно увидеть, что в Deadlock за каждым атрибутом идет соответствующий тип урона и тип блокирующий этот же сам урон.
Любая способность - спиритический урон;
Оружие - выстрел на ЛКМ;
Живучесть - передвижение, скорость, HP и т.п.
Немного про предметы Deadlock и Dota 2
Компания Valve явно видели проблему в количестве крафтинга, в рецептах, типов развеивания и баффов в Dota 2, где была следующая картина:
Количество предметов в Deadlock и Dota 2
От чего отказались в пользу Deadlock?
Отказались от системы майнкрафта | теперь некоторые предметы требуют только один компонент;
Отказались от системы рецептов | теперь компонент сам по себе рабочий предмет;
Отказались от огромной и сложной классификации | теперь существует разделение по атрибутам (Оружие, Живучесть и Спиритизм);
Отказались от системы типов развеивания;
Отказались от нейтральных предметов, телепорта, Aegis, сыра и Лотуса | теперь только Урна (Монетка) и Кристалл Босса (Бафф);
Отказались от сложности магазина, теперь он простой и очень похож на систему Valorant.
Касаемо предметов ситуация тоже стала проще, количество слотов для предметов осталось прежним, просто в Deadlock решили уйти в пассивные навыки, причина тому шутер от 3-го лица.
Почему Deadlock от 3-го лица?
Deadlock отказались от 1-го лица по множеству причин:
Провальная работоспособность sub-tick`а в Counter-Strike 2;
Было бы сложно наводиться от 1-го лица в такой динамичной игре;
Применять много способностей от 1-го лица сложно;
Расположение полоски HP некуда поместить при игре от 1-го лица;
Был бы неудобный паркур и остальные перемещения от 1-го лица;
От 1-го лица не видно скин своего героя и что с ним происходит во время файтов.
перечислять можно долго, просто вывел основные пункты.
Судя по всему, Deadlock планировали сделать от 1-го лица, но оно перекрывало огромное количество фич, особенно на фоне провального Counter Strike 2, поэтому они рискнули сделать шутер от 3-го лица, что придает новое дыхание соревновательному жанру игр.
Роли и способности персонажей
Вдохновляться героями, аспектами, концепцией и стилистикой других игр это вполне нормальное явление, особенно для Гибридных. Но в Deadlock каждый из них это проработанный по своим способностям герой, и самое важное в этой игре нет ролей так таковых, они лишь условные.
Герои в Deadlock
Роли и способности
Несмотря на "разделение" по ролям эта система отличается в корне от Dota 2 тем, что выпадающие души начисляются дублировано игрокам в радиусе 50 метров работает для двух героев до 8-ой минуты игры - таким образом решили самую больную тему фарма Керри и Саппорта.
Подробная таблица о ролях, способностях и схожестях персонажей
В Deadlock существует система "предмет и его контр-предмет", тем самым соблюдая баланс между: Роль | Сборка | Способности.
При создании персонажей разработчики Deadlock для удобства игроков сделали следующее:
первая способность [1]: должна быть направленная или рассеянная;
вторая способность [2]: перемещение или стан;
третья способность [3]: хил, пассивка или бафф;
четвертая способность [4]: ультимейт.
Схожесть персонажей по способностям
Они уникальные и запоминающиеся, хоть и есть множество сходств по героям с Overwatch и Dota 2. Поэтому я решил создать собственную таблицу на основе своего личного игрового опыта.
Заимствование способностей персонажей
Баланс [система выбора]
Разработка Deadlock строилась таким образом, чтобы было проще двигать "рычажки" для удобства ребалансировки всех персонажей. На данный момент все еще есть некоторые спорные моменты, которые хотелось бы увидеть в более приятном виде, а именно:
Система выбора персонажа;
Система выбора линии | решение: выбор линии на стадии отсчета.
Разработчики отлично знают об этих проблемах и им пришлось пойти на эти необходимые жертвы, чтобы сдержать баланс феномена 50% побед. Но они и не догадывались о своем единственном просчете...
Пользовательский интерфейс и HUD
Когда я увидел "слив" демки игры Deadlock, первое чего я испугался это HUD, думаю как раз таки этот параметр больше всего негативно сказался на стартовой заинтересованности большинства пользователей.
Скриншот слитого геймплея
upd: картинку лучше не смог найти...
Обратите внимание на весь HUD и визуальный шум, занимающий чуть ли не 50% экрана.
Полупрозрачная мини-карта, которая отнимает фокус | исправлено;
Killfeed расположен крайне нестандартно | лучше бы был справа;
Killicon занимает не маленькую часть по середине экрана | исправлено;
Информация о персонажах заставляет напрягать глаза поднимая глаз вплоть до границ монитора | исправлено;
Зона, где находится информация о баффах, дебаффах, количестве душ и занятых слотов очень близки друг другу, учитывая HP bar | немного исправили.
Проблема Демо-версии Deadlock была в огромном количестве визуального информационного шума и очень плотном HUD. Сейчас же данную проблему исправили и игра выглядит в разы лучше и гармоничнее.
HUD Deadlock на текущий момент
Deadlock решил уйти в свой индивидуальный дизайн HUD`а, оставив пользовательский интерфейс Dota 2, на данный момент:
Привыкнуть к мини-карте снизу сложно;
Killbar слева, как в Dota 2;
Иконки героев в мини-карте стоит немного переделать (хотя бы на ALT);
Можно было бы добавить функцию увеличения по нажатию.
Что действительно стоит сделать разработчикам Deadlock это добавить функцию изменение расположение HUD или хотя бы выбор из предложенных, как в MMORPG.
Идея, киберспорт и соревновательность | ИТОГ
Идея Deadlock заключается в киберспорте мирового уровня. Она будет обречена на успех, если разработчики и дальше будут так плотно работать над своей игрой.
Феномен 50% побед разработанный для невозможности партнёрских игр;
Минимизация сложности как шутера так и MOBA;
Интеграция знакомых соревновательных концепций и механик;
Добавление 6-го игрока в команду для работы над коммуникацией;
Недавняя интеграция соревновательного режима;
Античит?
Античит
Самая большая опухоль всех игр Valve... честно говоря, вообще не понятно, как они будут работать с данной проблемой. Вроде они добавили жабу, сделав из этого отсылку на свою студию IceFrog (разрабатывают Deadlock). Пока что сказать нечего ...
Аудио сопровождение
Великолепная работа над саунд дизайном:
у каждого персонажа свой индивидуальный звук, начиная от выстрелов заканчивая шагами;
ориентированные звуки по ситуации, понимаешь что где и когда происходит;
по звукам понимаешь, что плохо, а что хорошо (например кража души или смерть героя).
Авторское послесловие:
Благодарю за прочтение, надеюсь вы сегодня узнали что-то новое :)
Бывший ведущий дизайнер Skyrim и старший системный дизайнер Starfield БрюсНесмит объяснил, почему Bethesda продолжает использовать свой движок, несмотря на его возраст.
Брюс Несмит заявил, что Bethesda Game Studios не собирается переходить на новый игровой движок. По его словам, текущий движок идеально подходит для создания RPG, которые создаёт студия.
В интервью Несмит объяснил, что суть не в самом движке, а в том, как он служит игре. Он привел пример, что многие игры, созданные на движке Unreal, могут быть некачественными, но это не вина самого движка.
Ещё больше новостей из мира игр в нашем Telegram-канале Игровой террариум
Созданный Bethesda движок, который начинался как корпоративная версия Gamebryo и превратился в Creation Engine, постоянно эволюционирует. По словам Несмита, он идеально настроен для создания таких игр, как The Elder Scrolls, Fallout и Starfield, и замена его на другой движок может занять много времени и замедлить текущие проекты.
Что ещё можно было бы ожидать от Bethesda? Многие проблемы их игр связаны с игровым движком, но и благодаря ему в этих играх есть много хорошего.. Интересно, когда-нибудь мы увидим новый движок для крупных проектов или нам придётся продолжать играть на модифицированной версии старого?
Хорошая новость в том, что на нём гарантированно можно довести игру до завершения и стабильного состояния. И это важно, т.к. в процессе разработки у меня не было уверенности в удачном финале. У движка есть увесистые плюсы и минусы.
Cocos Creator 3 [1] - это китайский опенсорсный игровой движок, заточенный на разработку браузерных игр и интерактивных/игровых рекламных блоков. Он весьма популярен в Китае, и очень слабо известен в остальном мире.
Статистика использования игровых движков в играх на Стиме [2]
В статистике Стима их набралось 740 штук, что равно примерно 0,9%. В принципе это весьма солидно. Вероятно тут в статистике очень хорошо помогли китайские коллеги. Сюда входят и игры на прошлых версиях Кокоса, который довольно сильно отличается от текущей третьей. Есть немного даже и популярных игр.
Сначала я перечислю всё то хорошее, что я смог выделить лично для себя. Так-то список хорошего возможно всё-таки больше, но я указал только важное для себя, разработчика-одиночки.
1. Это полноценный рабочий инструмент, на котором уже другие люди смогли добиться хорошего результата.
2. Это китайский движок, он бесплатный, опенсорсный, и есть основания полагать, что он не станет вдруг банить/блокировать российских разработчиков. С Construct, Unity, Unreal Engine, Phaser и т.д. у меня сомнений по этому поводу несколько больше.
3. Он заточен на браузерные 2D игры/рекламу и в итоговом билде вес от самого движка минимален. У меня при поверхностной оптимизации получилось меньше 2 МБ.
4. Язык разработки - typescript/javascript, и нет блюпринтов.
5. Интерфейс слизан с Unity, и он довольно удобный.
А теперь о сложностях, с которыми столкнулся я, и с которыми скорее всего столкнётся любой другой разработчик, впервые работающий с Кокосом.
1. Маленькое англоязычное и русскоязычное сообщество. В китайских соцсетях всё очень хорошо. А в остальных не очень. Есть туториал Флеппи Бёрда от самой команды Кокоса [4], что полезно, но разработка простого игрового процесса ооочень далека от разработки реальной игры. На их канале есть ещё туториал, но я не нашёл в нём чего-то дополнительно ценного. Есть англоязычные уроки[5], которые хоть и для 2-ой версии, но зато сжатые и краткие без воды. Есть русский туторила от Grozamir[6] - уроков у него немного, но зато он ещё ведёт группу в Телеграме, где я смог найти несколько решений для своих проблем. Есть конечно ещё, но в процессе поиска Вы будете натыкаться на китайские туториалы, очень старые туториалы и онлайн-разработку. Если примеры для Вас важны - лучше выбирайте Unity или другие популярные.
Официальный гайд сохранения игровых данных [7] - лажа
2. Официальная документация неполная и иногда с ошибками. Простой пример. Вы захотите сохранять игровой процесс и попробуете воспользоваться официальным гайдом [7]. В реальности же, вы должны воспользоваться вот таким кодом: `window.localStorage.setItem('configData', JSON.stringify(configData))`. А всё дело в том, что гайд написан для версии Кокоса 2.x, а в третьем всё по другому. И неважно, что на этой странице гордо висит плашка - актуализировано пару недель назад.
Лишний пиксель - и пусть весь мир подождёт, пока ты будешь искать баг
3. Во время модерации на Яндекс-площадку была выявлена ошибка, что при некоторых разрешениях экрана появляется горизонтальная и вертикальная прокрутки. В любом браузере. Это было не очень весело, но удалось выявить причину. В игровом блоке id=GameDiv движок сам вычисляет ширину width=770px. Так вот, иногда ширина экрана оказывается равна 769.6px, а движок её округляет до 770. При этом родительский блок самой игровой площадки выделяет 769px на игру.
Мы получаем лишний пиксель, который создаёт горизонтальную прокрутку. Но т.к. горизонтальная прокрутка тоже занимает место, то из-за неё возникает и вертикальная прокрутка. Я это исправил костылём, добавив в шаблон билда Кокоса для тега body css свойство `overflow: hidden;`. Мне как-то казалось, что подобные проблемы не должны возникать в таких местах в игровых движках. Какая наивность.
4. Рынок труда. Он очень не очень для специалистов в Cocos Creator. Если Вы хотите работать в Геймдеве программистом, то найти хорошо оплачиваемую работу будет сложнее, чем с навыками в более популярных движках. Я работать в Геймдеве программистом не хочу, поэтому для меня этот пункт недостатком не является. Но для многих может.
О чём я не могу судить
1. Готовых ассетов немного, но я ими не пользуюсь, поэтому не принципиально.
2. 3D есть и игру в нём сделать можно. Не пробовал, но беглый взгляд со стороны указывает, что тут всё слабовато с 3D. Мне в 3D сейчас не хочется, поэтому тоже не принципиально.
3. Меня несколько пугает процесс сборки билда под Стим, т.к. по косвенным признакам лёгким этот процесс назвать нельзя. Официального шаблона или гайда я не нашёл, а это уже тревожный признак.
"Sort the court" оригинал Flash/Unity [8] и "Король гоблинов" мой на Cocos [3]
Как результат, я доделал и опубликовал игру на Яндекс-площадке. Это слямзенная версия старой флеш игры "Sort the court", но только про злых и циничных гоблинов. Улучшил игровой процесс в меру своих возможностей, сделав 7 концовок и сильно уменьшив повторяемость диалогов оригинала. Прошу попробовать. Надеюсь, что фатальных багов не обнаружится. (перевёрнутый дварф после казни и воскрешения не считается)
Выводы
Я пока и сам не уверен, стоит ли соло-разработчику работать с Кокосом. Есть плюсы, но и много минусов. Если минусы Unity Вас не волнуют, то вероятнее всего он будет оптимальным выбором. А может даже Godot или Unreal, если Вас зовёт дорога приключений.