Друзья, привет!

В канун нового, 2020, года, мы спешим поделиться с вами новостями из кузницы разработчиков Reign of Guilds.

Самое главное, что было проделано за последний месяц - полностью завершено AI 2.0, это задача, которая является одной из EPIC карточек, отделяющих нас от Альфы.

Раздел AI достаточно велик, поэтому мы разделим его на несколько отчетов, а 35-ый будет иметь следующую структуру:

  1. Мобы и их анимации;
  2. AI 2.0: начало;
  3. Оптимизация;
  4. Погода;
  5. Mocap анимации.

I Мобы

Общий перечень (зеленым выделены изменения за период с Отчета №34):

  1. Животного происхождения:
    1. Грызуны (белки, зайцы, крысы) - готово;
    2. Птицы - в работе;
    3. Олень - покрыть мехом;
    4. Волк 2.0 - покрыть мехом;
    5. Вепрь - готово;
    6. Медведь - готово;
    7. Леопард - готово;
    8. Мамонт - готово;
  2. Дети леса и утрированные виды животных:
    1. Броненосец;
    2. Саламандра;
    3. Палочник - готов;
    4. Менада - готов;
    5. Скорпион - готов;
    6. Карлик - готов, но на “3+”;
  3. Нежить:
    1. Скелеты (ближний бой, дальний, маг) - готовы;
    2. Лич-нифон - готов;
    3. Зомби;
    4. Цербер;
    5. Призрак (а-ля, смерть с косой);
    6. Дьявол;
  4. Смесь Цитадели и Темницы :)
    1. Голем - готово;
    2. Оборотень - готов;
    3. Тролль;
    4. Огр;
    5. Минотавр - готов;
  5. Летающие существа больших габаритов:
    1. Дракон - готов;
    2. Вивьерн.

1.1 Грызуны


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

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

Выглядят они так:

Они сознательно достаточно сильно оптимизированы, чтобы не слишком влиять на FPS.

Перемещаются они так:




В действительности, несмотря на достаточно большой объем анимаций-активностей, они умеют только перемещаться, отдыхать и убегать.

Их можно убивать, награда - мясо, которое обязательно будет востребовано трактирщиками.

Трактирщик - специальный вендор, который является переходным этапом между традиционными квестами (НПС - Игроки) и квестами (Игроки_высокого_уровня - Игроки_начальных_уровней). Суть трактирщика заключается в том, что у него абсолютно связаны сумма-продажи и сумма-покупки (подробнее в “Динамический баланс вендоров”), т.е.:

  • чем выше спрос на еду, тем выше ее цена;
  • тем выше закупочные цены на продукты, и предела ценам, по сути, нет;
  • если никто не приносит продукты, то готовой еды либо нет, либо ее цена стремится к бесконечности;
  • цикл приготовления растянут во времени и имеет случайные интервалы, т.е. принести кусок сырого мяса и тут же купить отбивную не получится;
  • еда нужна абсолютно всем, а в значительно большей степени - игрокам ТОП уровней, нацеленных на PvP.

Ну и конечно же - куда же без черного юмора: трактирщику приносят крысятину, а продает он уже блюдо из курицы.

? Вопрос к читателям ?

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

1.2 Мамонт

Всеми любимый и многим знакомый мамонт и его “снежный” вариант.

Все его анимации будут сопровождаться легким сотрясением камеры игроков в N метров радиусе:


1.3 Вепрь

С мехом он выглядит так:


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


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


1.4 Леопард

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


Леопард будет, пожалуй, самым быстрым мобом в Дворране, от большинства спеллов точно успеет убежать ;)


1.5 Голем

Новый голем на смену старому сразу с несколькими скинами:

И несколько анимаций к нему:



II AI 2.0

Т.к. система получилась достаточно масштабной и универсальной, начнем о ней рассказывать в этом отчете, а основной части поведений и ролей мы посвятим отдельный отчет.

Мы оставили нетронутой уже ранее созданные системы:

  1. статов (характеристик) мобов;
  2. лута, роняемого при смерти.

Все остальное было сделано с нуля и максимально унифицировано.

Весь AI получил полноценный нон-таргет, привязанный к их анимациям.

Работает это следующим образом:

  1. У каждого существа (будь то моб, NPC, гвард и т.д.) есть сфера (область) повреждений для ближнего боя, выглядит она так:
  2. Она свободно перемещается и закрепляется в определенном положении по отношению к мешу (модели, утрированно говоря) данного существа. Также ее положение может динамически меняться, в зависимости от той или иной активности (по триггеру).
  3. Далее, каждая анимация модернизируется в, так называемый, “Анимационный монтаж”:


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

  • тут и триггер (ключ) для нанесения урона в описанной выше области, именно в момент, привязанный к анимации;
  • тут и видео- аудио- эффекты (звуки ударов, следы от перемещения, сотрясания камеры игроков);

  • тут и система спеллов, которая была сделана для игровых персонажей;

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

  1. увеличение ДПС у всех существ;
  2. увеличение ФЗ и МЗ существ от дистанционных атак;
  3. расположение ключей на анимациях, чтобы активный игрок в ближнем бою мог кайтить (уворачиваться) от атак мобов, но это не было слишком простым занятием.


Не обошлось и без заранее предусмотренной оптимизации:

  1. ранее мобы существовали каждый отдельно, каждый сам руководил своим спауном, таймерами и респауном, дальностью прогулок и преследования;
  2. что вызывало ненужную дополнительную нагрузку как в момент “создания” сервера, так и во время его существования;
  3. теперь 99% мобов самостоятельно не будут существовать в мире;
  4. их спавнит/деспавнит/следит за таймерами/руководит рядом их показателей “Спавнер” - это, их, своего рода менеджер, что значительно уменьшает количество отдельно существующих процессов;
  5. Если в области N метров вокруг спавнера нет игроков, то он не будет спавнить мобов внутри себя - т.е. изначально, когда создается сервер, мобов в нем нет;
  6. Если последний игрок отойдет дальше на (N+n) от спавнера, то последний уничтожит мобов внутри себя, но продолжит вести их таймеры (чтобы повторный заход на вызвал респаун раньше времени);

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

В условиях концепции большого открытого мира, подобная система экономит примерно до 80% ЦПУ серверов, даже в условиях введенного полного нон-таргета для AI.

И на текущий момент мы не планируем отказываться от нее ради “жизни AI без игроков”, т.к. самостоятельно существующей экосистемы, как таковой, текущими планами не предусмотрено. Да и все мы прекрасно помним грабли Ultima Online, и наступать на них пока не планируем.

Немного закулисной экономики

SpatialOS, внедрение которого было приостановлено ради AI 2.0, изначально преподносит себя именно как инструмент, позволяющий:

  • перестать экономить ЦПУ время серверов на AI;
  • создавать миры, живущие полноценной жизнью без игроков;
  • и запоминать навсегда, условно, место, куда упал кленовый лист с осеннего дерева;

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

На такие сервера, в условиях вселенной ROG, уходило бы около 5.7$/месяц на каждого активного игрока. И это космически дорого.

Эти 5,7$/мес. не учитывают планирую нами систему триала. Именно поэтому, внедрение SpatialOS было приостановлено до оптимизации AI, и замеров реальной стоимости данной технологии.

? Вопрос к читателям ?

Мы планируем следующую систему триального (бесплатного) времени при переходе на P2P систему монетизации:

  1. от 2 недель до месяца для новых игроков;
  2. накопление игрового времени во время бездействия неоплачиваемой учетной записи;

П. 1 направлен на снижение порога вхождения, п. 2 - на снижение порога возврат игроков.

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

В завершении вступлении об AI 2.0 - забавка гифка, рассказывающая о “хищниках”, “жертвах” и “патруле” а также - системе добавленной физики тел после смерти мобов, описание которых ждет вас в следующем отчете:


III Оптимизация

Данная оптимизация была произведена уже достаточно давно, но никак не доходили руки до рассказа о ней.

Сначала расскажем об ее последствиях:

  • Увеличена дальность прорисовки мира с 0,7 до 3 км на плоской поверхности (например, на воде), при просмотре с гор вниз - дальность еще выше;
  • Полностью убран технический туман, что позволило пересмотреть глобально настройки освещения;
  • Новый свет и атмосфера - более насыщенный, яркий, четкий;

Немного скринов из ROG Club, чтобы было понятно, какие негативные моменты нес в себе технический туман.

Было:

Стало:

  • Среднее FPS, на максимальных настройках выросло на 10-20% в зав. от мощности ПК;
  • Среднее время загрузки карты при заходе в игру снижено в 2 раза (поэтому теперь меньше игроков проваливается под воду, и на HDD 7200RPM, даже самом медленном, не более минуты загрузка);
  • Более чем в 3 раз снижена нагрузка на файловую систему, при приближении к локациям, густо засыпанным объектами окружения (города/деревни/карьеры и т.д.);

Изначально, каждый материк располагается в (20х20) км2 пространстве и имеет площадь суши около 200-250 км2, поделен на 64 клетки, каждая по 6.25 км2.

Такое достаточно крупное деление на клетки казалось достаточно удобным с т.з. расположения на них объектов, но уже после сбора первых двух графств, стало понятно, что за удобство приходится платить неподъемным количеством объектов от 4 до 17 тыс. на каждой клетке.

Данное количество объектов почти не влияет на FPS (т.к. они не рендерятся, если их не видно), но оно создает избыточную нагрузку на (CPU + RAM + носитель информации).

Клетка загружалась асинхронно (т.е. постепенно) на удалении на 600м-500м от ее границ, и статистика показала, что в среднем, в памяти игроков сидело 3,2 клетки. И если загрузка происходит асинхронно, то вот выгрузка синхронна, что неминуемо вызывало фриз даже на ТОП ПК с PCI-e носителями информации.

Решение было принято следующее:

  • Каждая клетка делится на одинаковые по иерархии подуровни (Подуровни-1 и Подуровни-2);
  • Ландшафт и деревья/крупные камни остаются на самой клетке, ЛОДы этих клеток загружаются на дальности в 5 км, из ЛОДов в полноценную клетку она превращается также на дистанции в 600-500м;
  • Локации с высокими объектами (выше 4м) располагаются на П-1, и начинают загружаться на дальности всего в 350м;
  • Локации с невысокими объектами, а также мелочь в локациях с высокими, переносятся на П-2, и загружаются всего в 200м от персонажа;

В итоге, мы получаем от 6 до 20 подуровней, вместо одной клетки:

Как вы уже догадались, дробление на меньшие кусочки и уменьшение дальности подгрузки этих подуровней ведет к значительному снижению объектов, загружаемых и выгружаемых из RAM-ов при перемещении по миру (ведь раньше даже если бежать мимо деревушки в 500м от нее, и даже ее не видеть, клетка с деревней полностью загружалась).

В итоге, игрок как и прежде, будет иметь в памяти, в среднем 3,2 клетки, только они уже пустые и состоят только из LOD’ов ландшафта+деревья (именно LOD’ов, т.к. полноценным ландшафт станет прямо по курсу движения), а в рамах у него будет всего несколько Подуровней поблизости.

Нам осталось создать LOD’ы для Подуровней (П-1, П-2), что позволит загружать их на 300-500м, а переводить в реальные Подурновни (т.е. загружать объекты, и вовсе в 100-150м). К слову, персонаж почти не различим на дистанции уже в 80м, и меньше прицела.

IV Погода

С погодой все достаточно просто - нам пришлось ради нее обновлять TrueSky, что привело к поломке облаков (превращения их в невнятный зефир), а также падению FPS. С другой стороны, выглядели они достаточно мило:

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

В общем и целом, погодные явления в форме осадков (дождь или снег) добавлены, и учитывая облака TrueSky выглядят они достаточно эффектно.

Их появление происходит не просто по какому-то рандому, а неразрывно связано с положением дел у облаков, т.е. облака первичны.

Подробнее о погодных циклах - вместе с очередным рассказом об циклах года TrueSky, т.к. они снова шагнули вперед, и снова нас удивили.

Одно и то же время суток, ясно/пасмурно (пускай и на зефирных облаках):

Немного дождя вблизи:

V Mocap анимации

Так мы грабим (работаем граблями):


А вот так - мы пытались с колуном воссоздать более увесистый молот/кирку:


VI Заключение

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

Нельзя не признаться: дела бывали и лучше, темп разработки ровнее, задачи проще и яснее. Особенно утомляют переговоры / подготовки к ним / заявки / формы / демонстрации / комментарии к проекту, к git’у / переводы-переводы-снова переводы и т.д. Вся эта рутина порядочно отрывает от самой разработки.

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

Мы искренне благодарны всем тем, кто следит за проектом и поддерживает нас.

С Наступающим - вздROGнем, друзья!

Ваша команда Reign of Guilds