Gamedev Андрей Ланнистер
2 705

Практический геймдизайн: создание ИИ для своей игры

В закладки
Аудио

О чем это

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

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

  • Придумать ИИ с интересным поведением
  • Очеловечить ИИ
  • Разработать алгоритм поведения
  • Детализировать алгоритм

Сегодня мы поговорим о первом из них.

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

Что вообще такое интеллект ?

Подумайте, кого вы обычно называете умными людьми. Мое мнение такое:

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

Умному ИИ не составит труда найти какого-то Джона Коннора. 

Но просто получить информацию недостаточно, нужно отреагировать. Принять правильное решение. Чем решение эффективнее, тем оно умнее.

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

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

Тут перед нами возникает первая проблема и вопрос в создании ИИ.

Что такое адекватное поведение ?

Для большинства качество ИИ определяется его способностью противостоять лучшим из людей. Поэтому всех так взбудоражила победа AlphaGO над чемпионами по игре в Го. "Вот это интеллект!" - сказала общественность. Но в этой статье вы не найдете советов о том, как создать что-то подобное.

Кореец Ли Седоль в матче против AlphaGo

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

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

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

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

Как же сделать интересный ИИ?

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

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

Поскольку мы говорим о шутерах, предлагаю выделить следующие навыки:

  • Мелкая моторика
  • Внимательность
  • Управление
  • Реакция
  • Принятие решений
В мультиплеерных шутерах так же нужно уметь остроумно оскорблять чужих родителей.

С первыми четырьмя все ясно. Мелкая моторика - способность проводить тонкие манипуляции с геймпадом и мышью. Управление - умение "чувствовать" своего персонажа и грамотно им оперировать: быстро и аккуратно двигаться, переключаться между оружием, делать "распрыжку". Что такое реакция, и внимательность, известно всем.

Про принятие решений давайте скажем чуть больше.

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

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

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

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

В Civilization с самого начала нужно решить, в каком направлении развиваться всю игру: наука, война, религия, или культура.

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

Или вот сложнее: вы бежали к двери в Black Ops 4, а из нее, у вас перед носом, выскочил другой игрок. Нужно определить, что выгоднее: открывать огонь, или шагнуть ему на встречу, и вломить прикладом. Это зависит от кучи факторов: расстояние между вами, его здоровье, направление движения. Сама по себе задача простая, но необходимость решить ее за доли секунды, усложняет ее кардинально.

Тактические шутеры, вроде Division - шажок по графику от FPS к TBS. Темп - медленнее, решения - сложнее.

После того, как мы определились с навыками, пора внедрить в ИИ поведение, которое заставит игрока их использовать.

Давайте рассмотрим как это сделать на примитивном примере.

Смотрим на практике

По этой ссылке можно скачать прототип top-down шутера.

Вот такой

Правила просты

  • Синяя штука - игрок
  • Оранжевые штуки- враги
  • Бегать на WASD
  • Целиться и стрелять мышью
  • Перезапустить фазу - SPACE

Кнопки 1-8 включают разные настройки поведения, которые иллюстрируют определенный уровень проработанности ИИ.

Запускайте прототип, и

Поехали!

Фаза 1

Нажмите кнопку "1", чтобы включить первую фазу. Для следующих фаз - соответствующие кнопки. Для фазы 2 - кнопку "2", и так далее.

На этой фазе бот имеет самое простое поведение. У него нет различных "состояний". Он всегда в состоянии атаки, всегда знает, где игрок. Он обучен преследовать игрока, если тот убегает, наводиться на него, и непрерывно стрелять.

На этой фазе у игрока и противника отключен урон, поэтому игры как таковой нет. Здесь нельзя ни выиграть, ни проиграть.

Фаза 2

Поторопитесь открыть огонь! Теперь вы можете наносить урон своими выстрелами, как и ИИ-оппонент. Но игры все еще нет.

Почему? Потому, что за несколько секунд обоюдной стрельбы, враг гарантированно погибает. Если хотите убить его еще раз, нажмите SPACE.

Чтобы погибнуть, нужно постараться. Специально подождать, пока противник нанесет вам урон, а потом вступить в бой. Иначе он погибает первым, благодаря пониженным характеристикам.

Этому миру лично вы - такой смелый, такой ловкий стрелок ! - не нужны. С этим врагом справится и ваша бабушка.

Если принять утверждение, что игра - это некая система, которая заставляет игрока бороться за победу, то кликеры играми в общем-то не являются.

Фаза 3

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

Это - момент истины. В предыдущей фазе для победы нужно было лишь зажать одну кнопку, и пуская слюни смотреть, как полоска здоровья ИИ непрерывно убывает. А теперь вы поменялись местами.

Это и есть тот момент, когда интерактивное, но бессмысленное действо превращается в игру. Игрок спрашивает: что мне сделать, чтобы победить? Мы должны дать ему ответ.

Наш ответ: беги.

Фаза 4

Обратите внимание на появившиеся красные полоски, отражающие сектор стрельбы противника.

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

Начинайте двигаться по кругу вокруг противника. Вы увидите, что его прицел немного не успевает за вами. К чему это приводит?

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

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

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

Фаза 5

Включаем пятую фазу - и противник теперь тоже двигается.

Управление усложняется. Теперь центр круга, по которому нужно двигаться, все время меняется.

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

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

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

Фаза 6

Давайте снова выключим нанесение урона, чтобы спокойно посмотреть на ситуацию.

На этой фазе вместо одного противника, появляются сразу пять. Но на геймплей это кардинально не влияет. Поскольку противники держатся поблизости, и перемещаются в примерно одинаковой области, игроку не нужно менять свое поведение.

Если он будет двигаться неправильно - цена его ошибки увеличится, поскольку он поймает не одну пулю, а все пять. Но в целом ему нужно делать то же, что и раньше: нарезать круги, вокруг противников.

А что если научить их работать в группе?

Фаза 7

На этой фазе каждому противнику назначается своя позиция, вокруг игрока. Боты медленно, но неумолимо окружают протагониста, и игрок попадает под перекрестный огонь.

Что это дает нам? Цели игрока больше не формируют единое облако. Они рассеиваются, и ему приходится фокусироваться на каждой отдельно. Если им удается окружить его - их расположение приходится держать в голове, ведь поле обзора ограничено.

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

Так добавляя одну механику за другой, мы создаем геймплей. Создаем среду, в которой игроку нужно бороться за победу, применяя свои способности. И это примитивный TDS - какого геймплейного разнообразия можно было бы добиться в полноценном шутере?

Кстати, напишите пожалуйста в комментариях, если кто-то знает игру с таким же хорошим ИИ, как в F.E.A.R.  Странно, что многие годы спустя до сих пор никто не показал ничего убедительнее местных спецназовцев.

Фаза 8 - отладка

Ранее в фазе 4 мы допустили ошибку. Мы позволили игроку "ломать" наш ИИ.

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

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

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

В фазе 8 скорость прицеливания подвешена на "резинку". Теперь она тем больше, чем больше разница между текущим направлением прицела, и направлением на игрока.

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

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

Вывод

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

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

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

#gamedev #gamedesign

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Андрей Ланнистер", "author_type": "self", "tags": ["gamedev","gamedesign"], "comments": 21, "likes": 70, "favorites": 191, "is_advertisement": false, "subsite_label": "gamedev", "id": 41108, "is_wide": false, "is_ugc": true, "date": "Mon, 04 Mar 2019 14:03:27 +0300" }
{ "id": 41108, "author_id": 1410, "diff_limit": 1000, "urls": {"diff":"\/comments\/41108\/get","add":"\/comments\/41108\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/41108"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954 }

21 комментарий 21 комм.

Популярные

По порядку

Написать комментарий...
15

Почему мы играем в ладушки? Мы конкурируем за право называть себя самым ловким.

Всю жизнь считал ладушки кооперативной игрой про синхронизацию.

зачем ИИ человекоподобность,

"Правдоподобный" ИИ работает на иммерсивность - NPC ведут себя как свои прототипы в реальном мире.
Но в виртуальном мире человекоподобность - это бежать к цели по кратчайшей траектории, подпрыгивая. Такие NPC нам не нужны.

Ответить
3

Но в виртуальном мире человекоподобность - это бежать к цели по кратчайшей траектории

Именно они доставляли больше всего проблем )

Ответить
0

Но в виртуальном мире человекоподобность - это бежать к цели по кратчайшей траектории, подпрыгивая. Такие NPC нам не нужны

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

Ответить
0

Судя по описанию геймплея, имелись в виду не совсем ладушки.

Ответить
0

Не по теме абсолютно, но вот интересовало: а что, если сделать игру, где объекты-конкуренты строят свое поведение на простой нейронной сети с двумя слоями (входной и сразу выходной, чтоб не мучаться) с целью максимизации результата? Допустим, простенький экономический симулятор. Весы связям ставят сами сети. Какие тут могут быть подводные камни - не с точки геймплея, что это будет долго доходить до конца, а с точки технической?

Ответить
1

И будет игра, в которой невозможно победить, какой смысл?
Если фан в том, чтобы научить нейросеть противостоять одной стратегии, а потом применить другую - нужна НЕ простенькая модель. Написав которую, можно выпустить достойную игру и без нейросети.

Ответить
1

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

Ответить
0

ИМХО, нейронка + какой-нибудь алгоритм подсчёта Парето-оптимальности дадут вам нужный результат. Но как уже сказали выше, система будет либо непобедима (при достаточном времени на обучение), либо будет выноситься игроком вообще без сопротивления. Оба варианта не очень.

Ответить
0

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

Ответить
0

Интересно) Вопрос, годная ли идея, что игра наказывает игрока за слишком имбовое поведение, путем замены местами игрока и бота? Например, игроку дается вводная информация, на основе нее игрок выбирает тактику и снаряжение, вплоть до самого имбового, и на скорости проносится по карте. Но в одном из следующих боев против игрока выпустят бота, который будет использовать такое же мощное вооружение и тактику, при этот игрок поставлен в условия, где он вынужден играть на неэффективном билде против данного конкретного бота (например данный билд будет оптимален для прохождения задания, и в конце игроку резко становится НЕУДОБНО, вплоть до откатывания на первую миссию, чтобы сделать бота слабее)

Ответить
2

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

А в данном случае, победи этого врага, но только с пистолетом против минигана.

Ответить
0

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

Ответить
0

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

Ответить
0

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

апд. не увидел комментария выше, сори

Ответить
0

Насчёт F.E.A.R. - на ютуб-канале GDC где-то есть видео с анализом как ИИ имплементирован в этой игре и почему он кажется таким хорошим. В этом же видео говорят в каких еще играх такая же имплементация (Shadow of Mordor и еще какая-то), причем в этих играх ИИ еще сложнее.
Мне кажется, просто дизайн ИИ с тех пор сильно поменялся - разработчики хотят сделать весёлый тир, а не Дарк Соулс от мира шутеров

Ответить
0

Да он не то, чтобы настолько хороший. Он просто убедительный, не вызывает ощущения болванчика.

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

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

Ответить
2

на деле особо других примеров и нет. Есть первый Condemned, где была применена схожая система разделения логики бота на приоритетные функции, но она по-другому ощущается в мили-комбате. Есть Halo и первый Far Cry - эти игры про открытое пространство, а не коридоры, но и там есть свои интересные решения в плане интеллекта. Еще были статьи про интеллект в играх серии Killzone, где боты пытались обойти игрока, не перекрывая поле видимости своих коллег и не попадая под их огонь - но как по мне, из-за низкой динамики игры и крайне линейной структуры карт этой логике особо негде было развернуться

Ответить
1

В Metro exodus противники говорят где последний раз был или где сейчас находится гг. И вообще они постоянно о чём-то беседуют, даже жаль убивать. Правда слепые капец, но это уже условность стелс механики. Хотя если уж доёбываться, то наверное можно было бы её реализовать по-другому

Ответить
1

В FarCry и Halo тоже был очень крутой ИИ. Его точно так же можно было обходить с тылу.

Ответить
0

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

Ответить
0

Первым пунктом должно было быть:
- прочитать: "Искусственный интеллект в компьютерных играх. Как обучить виртуальные персонажи реагировать на внешние воздействия" Алекс Дж. Шампандар

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Узнавайте новости о мостах
Санкт-Петербурга первыми
Подписаться на push-уведомления