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

Тогда я расскажу вам, как создать игру "3 в 1" на рабочем листе Excel. Бесплатно, без регистрации и СМС.

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

Предыдущая статья, в которой я рассказал, как сделать простейшие пятнашки с использованием VBA.

Технически получилось у меня не совсем "3 в 1", и дворецкий не станет вымогать у вас звёздочки, чтобы поменять сломанный комод. Игра больше похожа на Toon Blast (есть на обеих мобильных платформах).

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

Создание игрового поля

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

Путем нехитрых проб и ошибок я придумал такое разделение.

1. Лёгкий уровень: 3 вида блоков, средний - 4, сложный - 5.

2. Малое поле: 10х10 клеток, среднее - 14х14 клеток, большое - 18х18.

Переключатели и слайдер необходимо соединить с какими-либо ячейками рабочего стола. В моем случае это "А2" и "А6" соответственно.

Далее в режиме редактирования кода создаем модуль "createModule", инициализируем публичные переменные:

Public rngPlayField As Range, intSize As Byte, intNumSigns As Byte, _ arrSigns() As Variant, arrField() As Variant

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

Я понимаю, что публичные переменные - зло, но в этот раз мы идем простым путем.

Создаем метод:

Sub initializeField() Dim levelNum As Range, sizeNum As Range, i As Byte Set levelNum = Sheets("FIELD").Range("A2") Set sizeNum = Sheets("FIELD").Range("A6") 'определяем уровень сложности (количество типов символов) For i = 1 To 3 If levelNum.Value = i Then intNumSigns = i + 2 End If Next 'определяем размер поля Select Case sizeNum.Value Case 0 intSize = 10 Case 1 intSize = 14 Case 2 intSize = 18 End Select 'заносим в переменную данные о поле Set rngPlayField = _ Sheets("FIELD").Range("D2").Resize(intSize, intSize) 'очищаем предыдущее поле With Sheets("FIELD").Range("D2").Resize(18, 18) .ClearContents .ClearFormats End With Call createField End Sub

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

Я решил, что игровые блоки будут декорированы разными символами. Для этого я использовал функцию ChrW(), которая позволяет показать символ Unicode по его индексу. Через цикл я вывел все символы на рабочую страницу Excel и приступил к поиску.

Когда я нашел самые удачные символы, то поместил их на отдельный лист. Ячейки покрасил в цвета, которые подошли больше всего, и написал в новом модуле (stuffModule) небольшую функцию. Она находит цвет ячейки и возвращает его индекс. Эту функцию я использовал на рабочем листе.

Код функции:

Function getIndex(icell As Range) As String getIndex = icell.Interior.Color End Function
​Вид страницы с символами

ОТСТУПЛЕНИЕ

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

Советую использовать параметр Option Base 1, который приводит нижнюю границу массивов к единице. Это немного расходится с общепринятой практикой, но в Excel часто приходится совмещать массивы и диапазоны. Ссылки на диапазоны начинаются с единицы.

Следующая процедура использует массив для формирования игрового поля:

Sub createField() Dim intRndSign As Byte, countFD As Integer, countSD As Integer ReDim arrField(intSize, intSize) arrSigns() = Sheets("DATA").Range("A1:B5").Value 'наполнение массива случайными символами For countFD = 1 To intSize For countSD = 1 To intSize intRndSign = _ Application.WorksheetFunction.RandBetween(1, intNumSigns) arrField(countFD, countSD) = arrSigns(intRndSign, 1) Next Next 'вывод данных массива на экран rngPlayField.Cells = arrField() Call decorateField End Sub

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

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

И, наконец, пишем процедуру, которая декорирует игровое поле, используя индекс цвета определенного символа:

Sub decorateField() Dim fndColor As Range, countSigns As Byte, fndBlank As Range 'настройка границ и шрифта With rngPlayField With .Font .size = 22 .Color = vbWhite .Bold = True End With .VerticalAlignment = xlCenter .HorizontalAlignment = xlCenter With .Borders .LineStyle = xlContinuous .Weight = xlMedium .Item(xlInsideHorizontal).Color = vbWhite .Item(xlInsideVertical).Color = vbWhite End With End With 'настройка цвета For Each fndColor In rngPlayField.Cells For countSigns = 1 To intNumSigns If fndColor.Value = arrSigns(countSigns, 1) Then fndColor.Interior.Color = arrSigns(countSigns, 2) End If Next Next For Each fndBlank In rngPlayField.Cells If fndBlank.Value = "" Then fndBlank.Interior.Color = vbWhite End If Next End Sub

Примеры того, что получается:

Игровой процесс

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

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.count > 1 Then Exit Sub ElseIf Not Application.Intersect(rngPlayField, Target) _ Is Nothing And Target.Value <> "" Then cellValue = Target.Value Call clearCells(Target) Call countScore Call checkEmpty Call checkColumns Call checkLoose End If End Sub

Создаем модуль "playModule", инициализируем публичную переменную cellValue (int) (для прошлого блока). Создаем новый метод и описываем в нем процедуру нажатия на ячейку:

Sub clearCells(ByVal rngCell As Range) Dim checkCells As Integer, countSigns As Variant For checkCells = -1 To 1 Step 2 'проверка ячеек сверху и снизу If rngCell.Offset(checkCells, 0).Value = cellValue Then With rngCell.Offset(checkCells, 0) .Interior.Color = vbWhite .Value = "" End With Call clearCells(rngCell.Offset(checkCells, 0)) End If 'проверка ячеек слева и справа If rngCell.Offset(0, checkCells).Value = cellValue Then With rngCell.Offset(0, checkCells) .Interior.Color = vbWhite .Value = "" End With Call clearCells(rngCell.Offset(0, checkCells)) End If Next 'Сохранение данных в массив arrField() = rngPlayField End Sub

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

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

Sub checkEmpty() Dim countFD As Integer, countSD As Integer, countBlank As Integer 'FD - firstDimention, sd - secondDimention For countFD = 2 To intSize For countSD = 1 To intSize 'Если элемент массива пуст и если верхний элемент содержит значение, то они меняются местами If arrField(countFD, countSD) = "" And arrField(countFD - 1, countSD) <> "" Then arrField(countFD, countSD) = arrField(countFD - 1, countSD) arrField(countFD - 1, countSD) = "" countBlank = countBlank + 1 End If Next Next If countBlank > 0 Then Call checkEmpty Else rngPlayField.Cells = arrField() Call decorateField End If End Sub

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

Следующий шаг - смещение блоков влево при наличии пустых колонок:

Sub checkColumns() 'сдвиг колонок влево Dim checkColumn As Byte, countElem As Integer, checkNext As Byte For checkColumn = 1 To intSize 'проверяем, есть ли пустые колонки If Application.WorksheetFunction. _ CountA(rngPlayField.Columns(checkColumn)) = 0 _ And Application.WorksheetFunction. _ CountA(rngPlayField.Columns(checkColumn).Offset(0, 1)) <> 0 Then 'если пустые колонки найдены, то они сдвигаются в массиве For countElem = 1 To intSize arrField(countElem, checkColumn) = _ arrField(countElem, checkColumn + 1) arrField(countElem, checkColumn + 1) = "" checkNext = checkNext + 1 Next End If Next rngPlayField.Cells = arrField() Call decorateField 'запускаем рекурсию для повторной проверки If checkNext > 0 Then Call checkColumns End If End Sub

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

Конец игры

Сперва надо определиться с методом подсчета очков. Я придумал следующее:

Количество очков = (Количество убранных блоков ^ 2) / 2

Создаем две публичные переменные: sumBlank(int) и globScore(long)

В процедуре clearCells() прописываем следующее условие, которое выполняется при удалении одного блока:

sumBlank = sumBlank+1

Создаем метод подсчета очков countScore():

Sub сountScore() Dim currScore As Long currScore = sumBlank * sumBlank / 2 globScore = globScore + currScore Sheets("FIELD").nowScore.Caption = currScore Sheets("FIELD").globalScore.Caption = globScore sumBlank = 0 End Sub

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

Важный момент! Не забывайте в процедуре создания игрового поля initializeField() обнулять переменные и значения лейблов:

Sheets("FIELD").nowScore.Caption = 0 Sheets("FIELD").globalScore.Caption = 0 globScore = 0 sumBlank = 0

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

Sub checkLoose() 'проверка окончания игры Dim rngFndCells As Range, checkOffset As Integer, countSame As Integer For Each rngFndCells In rngPlayField.Cells For checkOffset = -1 To 1 Step 2 If rngFndCells.Offset(0, checkOffset).Value = _ rngFndCells.Value And rngFndCells <> "" Then countSame = countSame + 1 End If If rngFndCells.Offset(checkOffset, 0).Value = _ rngFndCells.Value And rngFndCells <> "" Then countSame = countSame + 1 End If Next Next If countSame = 0 Then MsgBox "Игра окончена! Очки: " & globScore End If End Sub

Немного скриншотов того, что вышло:

Вот и все. Конечно, создание такой игры заняло больше времени, чем создание пятнашек, но результат вышел неплохим (ХАХАХАХАХА).

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

Право запостить картинку с буханкой-троллейбусом оставляю за вами:)

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

Написать
{ "author_name": "Александр Милашев", "author_type": "self", "tags": [], "comments": 94, "likes": 153, "favorites": 195, "is_advertisement": false, "subsite_label": "gamedev", "id": 73630, "is_wide": false, "is_ugc": true, "date": "Fri, 18 Oct 2019 14:49:46 +0300", "is_special": false }
0
{ "id": 73630, "author_id": 34713, "diff_limit": 1000, "urls": {"diff":"\/comments\/73630\/get","add":"\/comments\/73630\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/73630"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "last_count_and_date": null }
94 комментария
Популярные
По порядку
Написать комментарий...
55

В следующем посте ждём урок, как в «1С-Бухгалтерии» написать игру «Весёлая Ферма» ))) это будет 100% бестселлер!

Ответить
1

С подрядчиками и сотрудниками вместо NPC

Ответить
43

Сделал все по туториалу, начал играть и вот такая картинка вылезла. Походу жанр проклятый. 

Ответить
2

Номинация на коммент дня)

Ответить
2

Нуу... скучненько. Была б там реклама увеличения члена - вот это да, вот это смешно было бы.

Ответить
1

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

Ответить
0

Я не увеличил :С

Ответить
3

Как?! Ты еще не увеличил член? Нужно всего лишь...

Ответить
0

Вы ещё не увеличили член? Тогда мы идём к Вам!

Ответить
18

Ничего непонятно, но очень интересно

Ответить
10

А вот это заявочка на обрушение рынка мобильных игр! Автор бьёт в самое сердце ЦА.

Ответить
0

Такие приложения писали когда смартфоны еще не стали мейнстримом

Ответить
0

Такие приложения писали, когда ещё компьютеры не были мейнстримом

Ответить
5

Star Citizen как в Excel сделать? «3 в ряд» не мое 🤗

Ответить
7

Уже сделали.  Eve online называется.

Ответить
3

You are welcome!
http://garycki.com/pandora.html
Игру настоятельно рекомендую.

Ответить
0

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

Ответить
7

Автор этой замечательной игры Джон Баттерфилд, так называемый "король соло-игр". Игра выходила в январском номере варгейм журнала Арес в 1981. Помимо собственно исследования космоса вы высаживаетесь на разные планеты с разной атмосферой, климатом, гравитацией. Суть в сборе данных. Некоторые "образцы" будут разумны, другие нет, кто то встретит исследователей с радушием, кто-то с агрессией. В игре есть небольшой РПГ элемент, т.к. у членов команды разные статы по интеллекту, силе и профнавыкам. Помимо этого придётся заниматься менеджментом экспедиций, сколько брать припасов, нужен ли сканер, подводное или скалолазное оборудование. Ехать на джипе или на своих двоих. Короче, несмотря на "журнальный формат" игра очень глубокая и увлекательная, что не удивительно, т.к. и автор и команда гейм-дизайнеров под чьим руководством молодой ещё Баттерфилд её делал сейчас "Пантеон варгейм сообщества". Я пишу по ней статью, но то одно, то другое и никак:(

Ответить
3

Здесь вы найдёте сам журнал и маркеры к нему:
https://archive.org/details/AresMagazine06_VoyageoftheBSMPandora
В эксель версии есть небольшие ошибки, но механика сохранена. Кстати, рисунок на обложке в стиле ретро-футуризма самого Баттерфилда.

Ответить
3

Я буду ждать от вас статьи, надюсь у вас всё таки будет время! =)

Ответить
0

Поддерживаю

Ответить
1

Прямо заинтересовали, спасибо:3

Ответить
0

Не терпится почитать.

Ответить
1

Там в аннотации есть ссылка на xls.

https://www.youtube.com/watch?v=QnjmJKMtB7g

Ответить
1

О, видел это, а файл не догадался в аннотации глянуть. Благодарю:)

Ответить
4

Можно теперь какие-нибудь нормальные мобильные игры? Ассасин там или Принц Персии.

Ответить
2

Принца не обещаю, но рогалик какой-нибудь запилить можно)

Ответить
–4

Рогалики не нужны!

Ответить
0

Не нужны!

Ответить
4

 Нужны!

Ответить
0

Нет, не нужны!

Ответить
3

  Нужны!

Ответить
0

НЕ НУ Ж НЫ!

Ответить
3

   Нужны!

Ответить
0

НенужнЫ!

Ответить
2

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

Ответить
1

Нет, я

Ответить
5

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

Ответить
1

Евгений Макаревич прострелил Dozaemon левое бедро (-22 HP). Евгений Макаревич забирает $10, полученные за победу.

Ответить
0

wwdtf мой статус

Ответить
0

wwdtf мой статус

Ответить
0

Имя: Dozaemon
Здоровье: 78 HP
Деньги: $14
Оружие: ржавый револьвер (заряжено: 1/3)

Ответить
0

wwdtf обыскать салун

Ответить
0

Под одним из пустых стаканов посетителей Вы нашли $3. Будем надеяться, что Вы не оставили кого-то без чаевых.

Ответить
0

wwdtf купить патронов

Ответить
0

wwdtf отдохнуть

Ответить
0

Вы прилегли на кровать и восстановили 22 HP.

Ответить
1

В этот раз ты выиграл, но в следующий раз пуля останется в твоей тупой башке!

Ответить
0

Дуэль зарегистрирована, Евгений Макаревич. Осталось дождаться соперника!

Ответить
1

@Александр Милашев я его уделал, пиши рогалик)

Ответить
0

@Александр Милашев не пиши, рогалики не нужны!

Ответить
2

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

Я ждал дуэли, и я ее дождался!!

Ответить
2

Буду ждать пост с рогаликом) Обожаю этот жанр

Ответить
1

When it's done. И наверное я разобью его на несколько, потому что подозреваю, что текста будет очень много:)

Ответить
1

Можно в таком случае сделать Принца персии с рандомной генерацией подземелий и перманентной смертью. 
Погодите-ка...

Ответить
3

как создать игру «3-в-1»

Я так полагаю, вы имели в виду «три-в-ряд».

Ответить
0

Именно) немного попутал

Ответить
2

Когда-то, когда телевизоры были тяжёлыми, такие игры в них были :)

Ответить
1

Приколы приколами, но я тыкаю эту кликоманию уже минут 20, и кажется я знаю как проведу последние пол часа в офисе)

Ответить
0

Не слишком лагает?

Ответить
1

Нет, может только когда сдвигаются столбцы, немного, но я никуда не спешу :D

Ответить
1

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

Ответить
1

Блин, легче уж рекламку посмотреть 😂

Ответить
1

на обеих мобильных платформах

There is only two gender 😏

Ответить
0

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

Ответить
0

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

Ответить
0

вы заблуждаетесь

Ответить
0

Просветите меня в чём же там такая сложность.

Ответить
1

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

Ответить
–1

Не сильно сложнее

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

Ответить
–3

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

Ответить
0

По сравнению с написанием современного игрового 3D движка, это всё детские игрушки. Вот тут сложно и вложены десятилетия труда десятков тысяч людей.

Ответить
–1

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

Ответить
0

Ну вот ты и слился, перейдя на личности. Клинического дурачка в зеркале увидишь. Да и минусы - твоя идея, а я решил не оставаться в долгу.

Ответить
–1

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

Ответить
–2

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

Ответить
0

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

Ответить
–1

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

Ответить
–1

а по твоей логике получается что любая программа сложная, если в ней есть хоть какой-то алгоритм

Ты не способен анализировать, не пытайся делать выводов. Они неверные.

Ответить
0

настоящие большие игры

три-в-ряд

Ахахахахахаха)
Продолжай :3

Ответить
0

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

Ответить
0

Парниш, сорян, но пафос и раздувание щек о тайных сложностях разработки казуалок выглядит и правда смешно)

Ответить
0

ты что-то перепутал, парниш. Там не тайных сложностей. Есть беспробудная неосведомленность населения, порожденная его же маломудростью и проще говоря тупостью. Что и продемонстрировал типок выше. Ты пока идёшь по той же дорожке.

Ответить
0

Есть беспробудная неосведомленность населения, порожденная его же маломудростью и проще говоря тупостью

О, элита геймдизайна 3-в-ряд в эфире :3

Ответить
0

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

Ответить
0

Что за фильм был? Очень знакомо

Ответить
0

Джей и молчаливый боб. Ну ты и лошпед!

Ответить
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": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovz", "p2": "glug" } } }, { "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, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "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": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "chvjx", "p2": "ftwx" } } }, { "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" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "chfbl", "p2": "gnwc" } } } ]