Gamedev Andrey Apanasik
1 982

Постмортем UnnyWorld

Ошибки и как их можно избежать.

В закладки

Ранее я публиковал статью «Три года разработки своей MMO», где речь шла больше про поиск инвестиций, команду и наш путь к «успеху». К сожалению (или к счастью?), проект пришлось закрыть. После закрытия нашей игры UnnyWorld многие знакомые разработчики просили написать постмортем по игре.

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

Арена с боссами

Про игру в двух словах

Условно Unnyworld можно разделить на две части: Сити-билдер и Арены. Часть про билдер — это некий Clash of Clans. У вас есть своя планета, которую необходимо обустраивать. И вы можете нападать на другие планеты, чтобы красть ресурсы.

Нападения на других игроков

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

Арены — типичная MOBA 3-на-3 с разными режимами (захват флага, захват точки и так далее).

Арена с захватом точек

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

Перед боем можно сменить заклинания.

Игровой цикл в целом выглядит так.

  1. Для прокачки спеллов нужны свитки, которые падают из сундуков. Сундуки можно получить различными бесплатными способами (за лигу, за победу в Баттл Рояле и тому подобное) или купить.
  2. Чтобы прокачать спелл, нужно построить и улучшить здание героя до определённого уровня.
  3. Для улучшения здания героя нужно улучшать другие здания (главное здание, алтарь и так далее).

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

Отсутствие чёткого плана и стратегии

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

Как следствие, пытались делать всё и сразу. Нужна ли система гильдий, когда в игре полтора пользователя? Хм, вряд ли.

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

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

Отсутствие опыта

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

Поговорим немного о технической части вопроса.

Выбор технологий

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

Какой облачный провайдер использовать? AWS? Azure? SoftLayer?

На тот момент принципиальной разницы не было. Плюс, у нас был кредит на SoftLayer как стартапу.

Oh, boi, если бы вы только знали, как там всё плохо.

Саппорт особо не разбирается в проблеме. Были случаи, когда я к ним обращался по поводу проблемы на определённой виртуалке (не мог приконнектиться и тому подобное). На что получал ответ.

Мы ребутнули машину, теперь всё норм.

Саппорт

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

Частые maintance.

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

В итоге перешли на Azure. Таких проблем не было. Саппорт быстро отвечает и всегда помогает, в случае чего.

Хорошо:

Плохо: не проанализировали как следует все возможные варианты. А ведь сервера — это важнейшая часть для онлайн игры.

Итак, вам нужно на сервере как-то запускать игровые инстансы, через какую-то систему API перекидывать, после авторизации игрока на нужный инстанс. Что же будем делать? А давайте возьмём готовое решение, которое будет само, в зависимости от нагрузки, менеджить это дело. Ого, тут вон есть штука, называемая Kubernetes. Правда она в бете… Но всё равно, давайте попробуем!

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

Ну ладно, а что ещё есть? Mesosphere и Apache Mesos! С ним всё то же самое, без опыта сложно. Если что-то отваливается, то без бубна не исправить проблему.

В итоге написали всё сами. Инстансы стартуются супервизором, как и небольшой менеджер над ними (написанный на Java). Java приложение ttl в сервис дискавери тулзу о статусе (количество свободных комнат на инстансах и тому подобное). При авторизации и запросе на создание комнаты к API по этой информации об инстансах запрос уходит на нужную ноду, которая на нужном инстансе поднимает комнату.

То есть, инстансы всегда предзапущены. При нехватке мы поднимаем новую VPS.

Хорошо: проанализировали альтернативы.

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

Для сервис дискавери использовали consul.io Это, вероятно, одно из тех решений, о котором не пожалели. Там, правда, бывают проблемы вроде таких, когда при ребуте ломается конфиг. Но это редко и при незапланированном ребуте машины. В целом, за всё время с консулом было работать одно удовольствие.

Хорошо: взяли готовое решение, а не стали пилить что-то сами.

Для развёртывания изначально использовались bash скрипты.

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

Хорошо: быстро написать bash-скрипт, особых знаний не требуется.

Плохо: при переходе на нормальную систему деплоя пришлось выбросить практически всё ранее написанное.

Для общения между своими сервисами пробовали Rabbitmq. Но он просто так не в тему через несколько дней мог просто развалиться. В итоге, сделали по-простому – все сервисы взаимодействуют либо посредством чистых tcp-сокетов, или http-запросами с keep-alive, если нужно запросы слать только в одну сторону.

Хорошо: проанализировали альтернативы. Выбрали неплохое решение.

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

Игра онлайн, значит нужен чатик. Самим писать? Вряд ли оно будет масштабируемым. Давайте возьмём что-то готовое. XMPP? Ejabberd? Seems good. Вообще, пробовали и «ежа», и MongooseIM, но остановились в итоге на «еже». Были некоторые проблемы с поднятием оного на своих серверах (косяки с таймингами в сообщениях, краши и тому подобное). Решили использовать их облачное решение. Да, оно платное. Но работало без проблем.

Хорошо: проанализировали альтернативы. Выбрали подходящий вариант.

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

На первых порах у нас вообще не было никакой системы по сбору метрик на серваках. Почему запрос тормозит? Что не так с сервисом? Сколько сейчас комнат свободных? Да, мы даже не могли посмотреть, сколько на данный момент свободных комнат!

Позже пришло осознание, что что-то нужно делать. Пробовали использовать Graphite + Grafana. Даже образ до докера делал со всем этим.

Но не сложилось. Не хотелось тратить на это время, решили воспользоваться готовым чем-то. Выбор пал на Datadog.

Всё отлично. Метрки, алерты, графики. Клиентский драйвер почти тот же самый, что и для графита. Красота. Но…Больше 10 долларов за каждый хост в месяц. Это выходит в более чем 200 долларов в месяц.

Осознание того, что мы просрали на это кучу денег, прошло слишком поздно. Решили, всё же, на своих серверах это делать. Настроили Influx. В итоге одна машина за пару десятков баксов спокойно обрабатывает метрики с десятков и сотен машин.

Хорошо: пробовали сами по-быстрому. Нашли альтернативу готовую. Осознали (хоть и поздно), что решение было ошибочным. Настроили удобную систему локально.

Плохо: как следует не разобрались в вопросе. Потратили много денег.

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

Немного про концептуальные и геймдизайнерские решения

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

Разделение игры по регионам

Игроки просили азиатский сервер и сервер в Южной Америке (до этого сервера были в Европе и США). Почему бы не сделать, да? Сделали. В итоге полтора юзера размазались по четырём регионам. Раз несколько регионов, то нужно сделать систему трансфера. Логично? Логично.

Хорошо: у пары человек стал лучше пинг.

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

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

Замена квадратной сетки на гексы и переделка нападений на планеты

Раньше планеты выглядели вот так.

И нападения.

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

Переделана система заклинаний

Раньше выглядело так.

Сам апгрейд осуществлялся за камни, которые падали из сундуков. Всё было неочевидно, запутанно.

В итоге заменили систему камней на свитки как в Clash Royale.

Для улучшения заклинания нужно определённое количество свитков. Всё просто и понятно.

Хорошо: заметили проблемное место и переделали.

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

Покупки на Twitch

Мы даже договорились с Twitch, чтобы на странице игры можно было совершать внутриигровые покупки.

Но так как нашу игру никто не стримил, то смысла в таком решении вообще было ноль.

Хорошо: потенциальное место для честного отъёма денег у игроков.

Плохо: если вашу игру не стримят, то смысла в этом нет никакого. Просто впустую потрачено время.

Режим Battle Royale

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

Про баги

В таком проекте сложно не наделать багов. Было много относительно безобидных GUI-багов.

Были баги посерьёзнее, например, когда игроки моментально умирали в центре арены. Повторить этот баг мы так и не смогли локально. Он периодически происходил у игроков, но мы так и не смогли его починить.

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

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

К примеру, иногда всё GUI могло просто пропасть. Но если зайти в иерархию объектов и просто кликнуть по объекту, то оно снова появлялось.

Мы про эту проблему репортили Unity. Они ответили, что могут нам выделить сотрудника для помощи за 10 тысяч долларов в месяц.

На платформе Facebook Gameroom была проблема со скейлом, когда игра реагировала на тачи не в том месте, где они были совершены.

Это, уже не говоря про баги в различных библиотеках. К примеру, на некоторых машинах Steamworks.NET мог падать.

Итоги

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

Особо никто не занимался контент-менеджментом и общением с игроками, не было никаких рассылок.

Во время разработки было потеряно много времени при выборе и апробации различных технологий.

Не было чёткого плана по реализации фич и контента.

В общем-то, большая часть всех этих проблем из-за неопытности.

Что дальше?

Unnyworld был закрыт. Мы решили сделать проект поменьше в рамках текущих возможностей. Сейчас работаем над айдлером Hero Masters. Будем рады новым бета-тестерам и любому фидбеку.

В данный момент в поиске издателя или инвестора.

В рамках одной статьи всё не охватить. А то, о чём написал, для постороннего читателя может показаться каким-то бессвязным набором фактов. К сожалению, я не мастак подобные тексты писать.

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

#опыт

Материал дополнен редакцией

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

Написать
{ "author_name": "Andrey Apanasik", "author_type": "self", "tags": ["\u043e\u043f\u044b\u0442"], "comments": 34, "likes": 28, "favorites": 12, "is_advertisement": false, "subsite_label": "gamedev", "id": 23189, "is_wide": false }
{ "id": 23189, "author_id": 1922, "diff_limit": 1000, "urls": {"diff":"\/comments\/23189\/get","add":"\/comments\/23189\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/23189"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954 }

34 комментария 34 комм.

Популярные

По порядку

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

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

Слушать советы/предложения игроков необходимо, но не следует сразу бежать и всё это реализовывать.

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

Ответить
3

Опыт ценный, но стоили ли это 3-х лет?
"Более того, зачастую следовать пожеланиям игроков бывает не только вредно, но и самоубийственно"
Игроки сами не знают, чего хотят)

Ответить
2

стоили ли это 3-х лет?

Не стоило, безусловно, получился очень дорогой опыт. Но в вашем случае всё видится как типичная ошибка не заморачивающегося над MVP новичка.

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

Ответить
0

Было MVP и есть. Вы про технические проблемы?

Ответить
0

Да, большинство студий уже прошли через это

Ответить
0

Большинство студий не делятся этим.

Ответить
0

На конференциях - охотно. В том числе мы.

Ответить
0

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

Ответить
1

Опыт ценный, но стоили ли это 3-х лет?

Смотря с чем сравнивать.
С одной стороны, вы потратили 3 года на провал, а Гайдар в 14 лет полком командовал.
С другой стороны, вы не просто делали, а завершили и запустили красивый и сложный проект, нашли деньги, поездили по миру, наработали гору полезных контактов и, самое важно, сделали правильные выводы (хотя не уверен, что все), на которых можно расти.

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

Ответить
5

мне всегда так нравятся истории разработчиков которые вообще не парятся с маркетингом и рассчитывают на органику...

Ответить
1

С нашим бюджетом в маркетинг особо не повкладываешься.

Ответить
4

Проблема програмиста - у нас нет маркетинга, но есть игра!
Проблема маркетологов - у нас нет игры, но мы собрали 2 ляма на концепте...

Ответить
1

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

Ответить
0

Как идея, пойти на хакатон с целью подумать и поискать маркетолога за идею.

П.с. Спасибо за статью, может про Aso дополните?по вашему проекту. Я вижу тема оптимизации набирает обороты.

Ответить
0

У нас проект на одном из хакатонов и родился :D
Про Aso чуть позже может буду писать в контексте нового проекта.

Ответить
3

Андрей, спасибо!

Ответить
0

Всегда пожалуйста ^_^

Ответить
0

Всё-таки почему упустили маркетинг?

Ответить
1

В него нужно вбухивать много и постоянно. Если бы мы это делали, то у нас бы не было денег на з/п сотрудникам. Я в прошлой статье писал про инвестиции, но это копейки, на самом деле.
Тем более, для онлайн игры, где важно большое CCU, чтоб матч мейкер нормально работал.

Ответить
0

То есть вы рассчитывали исключительно на органику? Вообще маркетинг не планировали?

Ответить
2

Пробовали на ранних этапах из FB трафик покупать. Дорого, не эффективно.
Самое лучшее для таких игр - заинтересовать стриммеров.

Ответить
1

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

Я не разбираюсь в этом рынке и могу ошибаться, но вот мысли навскидку: у вас моба/беттл арена явно ориентированная на мобильные (хоть и релизилась на стиме), а значит основные рефы: vainglory, mobile legends, arena of vailor; берем и ранжируем по подпискам на твиче:
V: 800k
AoV: 400k
ML: 120k

Теперь по gross games usa (ios):
ML: 120
AoV: 240
V: 400

Видим обратную зависимость.

Безусловно, это можно объяснить разной монетизацией. И это не исключает гипотезы, что стиммеры – ключевой (или даже единственный) фактор роста.
Но стиммерам интересны просмотры, а для этого проект уже должен иметь какую-то "видимость", для которой и нужна реклама, партнерства и все вот это вот.
А если верить sensortower, на мобильной версии у вас и АСО толком не было настроено. И нет никакой истории фичеринга, т.е. с платформами, похоже, не общались (а зря, судя по роликам – было на что рассчитывать).

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

Ответить
1

Выводов много по тех. части потому что я ей занимаюсь, т.к. CTO ^_^

Фичеринг был, к примеру, в список инди новинок нас на неделю добавляли в GP.

Ответить
0

А что, собственно говоря в проекте было сделано хорошо тогда? Ошибки и грабли это, конечно прекрасно, но должны же быть хоть какие-то достоинства?

Ответить
0

О том, что сделано хорошо, сложно сказать. Про ошибки писать проще, т.к. они обнаруживаются со временем. Про хорошие решения в статье примеры есть, к примеру, когда мы систему спеллов поменяли на что-то похожее с Роялем, когда апгрейд за свитки. Стало лучше? Да. Но хорошее ли это решение для такой игры? Сложно сказать.

Ответить
0

А почему при наличии инвестиций вы не нанимали специалистов, или хотя бы консультантов по областям, где у вас пробелы? Ну, к примеру попав в ситуацию

<q>Так как раньше мы работали преимущественно лишь с однопользовательсикми играми, то наступили на большое количество грабель при выборе той или иной технологии.</q>

Не наняли в команду специалиста или консультанта для сетевого стека?

Ответить
0

Найти вот так быстро специалиста хорошего, когда нужно побыстрее делать прототип, не так-то просто.

Ответить
0

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

Ответить
0

Мы инвесторов искали много-много месяцев.

Ответить
0

Так а вы бы написали подробнее, что за новый проект, на который деньги ищете. А то ничего из ролика не понятно, кроме того, что ассеты используете из предыдущей игры. Какая там мета? Кто в команде? Откуда сейчас идет финансирование? Наняли вы нормального гейм-дизайнера? Без понимания этих вопросов вам никто не даст денег на проект.

Ответить
0

Для инвесторов/издателей у нас есть документ с подробным описанием. Нету сейчас финансирования.

Ответить
0

>Самим писать? Вряд ли оно будет масштабируемым.

..какое-то странное предположение..

Не совсем понятно откуда такой замах - аж на два жанра сразу без опыта в каждом. Отсюда гипотеза - игра просто получилась неинтересная. По теку - страшно представить как поддерживать такой букет сторонних решений. От рэббита и 3rd party чата аж сразу плохо, лично мне.
PS: Удачи в следующих проектах!

Ответить
0

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

Рэббит так-то хорош, если бы не падал :D
Я думал Кафку попробовать ещё, но решил, что для прототипа проще на обычных сокетах сделать. И работало, в принципе, нормально.

Ответить
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-уведомления