Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Уникальная игра, в которой гармонично сочетаются знакомая механика «три в ряд» и тактические пошаговые сражения!

Магический мир

Мидкорные, Ролевые, Три в ряд

Играть

Топ прошлой недели

  • solenakrivetka solenakrivetka 7 постов
  • Animalrescueed Animalrescueed 53 поста
  • ia.panorama ia.panorama 12 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

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

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
3
TehnoMagEG
TehnoMagEG
Лига Разработчиков Видеоигр
Серия Relict Engine

Relict Engine: DevLog 20251018⁠⁠

1 месяц назад

Краткий список изменений

  • Добавлен основной класс Отрисовки Renderer

  • Добавлен класс драйвера отрисовки Render::OpenGL

  • Добавлен механизм выбора драйвера отрисовки при запуске движка

    Драйвер выбирается на основе указания в UserSettings.ini секции Graphics переменной Driver.
    Например:
    [Graphics]
    Driver = OpenGL

  • Добавлен загрузчик функций openGL glad

  • Добавлена заготовка кода для отрисовки StaticMesh через OpenGL

  • Исправлена очередность создания класса ThreadManager

  • Адресована ошибка, связанная с созданием Tickable объектов в Tick функциях.

Комментарий

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

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

Показать полностью
[моё] Разработка Gamedev Инди Игровой движок Текст
3
3
FalloutPreacher
FalloutPreacher
BalabanGames

Очень много новостей⁠⁠

1 месяц назад

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

«Три секрета одной истории»

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

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

Будут ли новые игры?

Ну, понятно, можно игры от тебя не ждать больше... Выгорание, творческий кризи... А вот тут совсем наоборот, будут! И я думаю, в следующем посте (на днях) уже будет новый релиз. Но давайте по порядку. Дело в том, что когда мы начали делать с ребятами совместно движок для новелл (вот тут можно почитать в случае чего (У наших движков абсолютно разные подходы, но он не заточен под меня.)), я понял, что мне хочется сделать свой. Заточенный именно под меня и который останется со мной вне зависимости от чьих-то решений. И что же я сделал? Догадались? Именно! Начал я не с движка...

BalabanWorkspace

У меня всегда много проектов, которые ведутся параллельно, и всегда есть опасение, что сервис, в котором я его веду, закроется или у меня не будет бэкапа (привет, Кликап (бэкап был, но всё равно часть данных была утрачена)). Вот потому я решил для начала сделать себе то, с чем я всегда работаю независимо от проекта, компании и так далее: Документация и Задачи. Да, есть куча крутых сервисов, в которых всё супер доведено до ума, бла-бла-бла, и я с ними, естественно, работаю, где это необходимо. Однако для своих проектов я сделал себе свой инструмент — BalabanWorkspace. Всего с двумя активными разделами: Документация и Kanban. Они хранятся у меня, у меня всегда есть резервные актуальные копии — это моё.

Документация

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

Kanban

Канбан-доски со вложенной структурой, тегами, фильтрами, приоритетами и разной подсветкой в зависимости от приоритета. На общей доске собираются вообще все таски с подписями, с какой доски эта карточка, выбор ответственного, тоже разный уровень доступа (создаёт карточки и меняет, админ). Да, это не Jira, ClickUp, Kaiten и все подобные.

Окей, так а что по движку?

А MVP движка готово. Да, там еще очень многое потребуется доделывать, у меня масштабные планы на него, потому что я не собираюсь прекращать делать игры. Вне всяких сомнений, это будет со мной на протяжении всей моей жизни. Но мы ведь сюда пришли не за этим. Так почему не Ren'Py, особенно учитывая, что прошлые игры были сделаны на нём? Потому что я для себя сделал некое подобие WordPress, только в разрезе создания игр. Я, пожалуй, пока показывать все не буду, только первый экран основного раздела редактора.

В первую очередь — это графический редактор.

Нужен диалог — добавил блок, и вуаля. Захотел добавить новую фоновую музыку — да пожалуйста. А чтобы не мусорить, можно выбрать трек с понятным самому себе описанием. Вариант перехода от блока к блоку — так же графические элементы, выбирай, чего хочется: броски кубика, автопереход, с условием, сложным условием и так далее. С блоками текста можно выводить значения параметра через макрос, а хочется что-то по условию: например, параметр = 1 истина, то показать значение параметр_два, если ложно — параметр_три, и так же всё это в графическом редакторе. Подсказки на каждом этапе, разумеется, присутствуют: начал писать «пара...» — снизу уже показывается всё, что есть, начинающееся на «пара...». Картинки сразу заворачиваются в WebP формат. Персонажи, HUD и всё прочее — все графические элементы.

Схема

Перечерчивать схему в Miro с игры в Ren'Py — ну, очень не хочется, но тестировать потом её без схемы вообще ад. Потому я сделал себе решение, которое составляет схему самостоятельно. Там и названия блока подставляются автоматом, и даже для тех блоков, которые без явно прописанного названия, берется начало строки текста, чтобы было понятно, что это вообще за блок. В ней можно быстро перемещаться к нужному блоку: два клика — и ты уже на блоке в редакторе. Можно приглушать остальные блоки и ветки, чтобы было проще отслеживать его связи. Я даже мини-схему запилил в сам редактор, иногда полезно, хотя впоследствии я практически ей и не пользовался. Функционал там гораздо шире, но пока не буду углубляться.

Автотест

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

Быстрое добавление параметра в самое начало с боковой панели

Я не знаю, насколько это прям супер круто, но я помню, что в Ren'Py мне было неудобно разделять всегда редактор на две части, чтобы добавлять параметр вверху. А тут просто сбоку добавил — и всё, он уже вверху, можно с ним взаимодействовать.

Быстрое добавление блока и сохранение в бок панели.

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

Права и пользователи

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

Броски кубика

Я сделал пока только бросок кубика d20, и я кайфую от него. Будут ли другие — возможно, позже. Пока просто он есть, и в новой игре, которая появится в следующем посте, он будет. Автотест на ней насчитал 3 000 000 путей до завершения игры.

В заключении

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

P.S.

На будущее я думаю, могу выдать доступы паре человек, поглядеть движок и пощупать его вживую, так сказать, но количество мест будет явно ограничено)) Так что если вас заинтересовало, пишите заранее. @Enot11rus, для тебя всегда найдется местечко, если будет желание xD

Показать полностью 13
[моё] Инди игра Инди Gamedev Игровой движок Разработка Визуальная новелла Браузерные игры Аналог Автор Длиннопост
2
6
TehnoMagEG
TehnoMagEG
Лига Разработчиков Видеоигр
Серия Relict Engine

Relict Engine: DevLog 20251009⁠⁠

2 месяца назад

Краткий список изменений

  • Добавлен метод IsValid для сокращенной проверки объектов

    IsValid(Object) вместо (Object != nullptr && !Object->IsPendingKill())

  • Класс SceneEnity переименован в SceneUnit

  • Добавлен класс RenderUnit

  • Добавлен класс StaticMeshUnit

  • Добавлен класс RendererScene

  • Добавлена выборка SceneUnit'ов через GameWorld для передачи в нужную сцену

  • Добавлена первичная обработка RenderUnit'ов через RendererScene

  • Подготовлен код для фильтрации визуальных объектов по их границам

    Bounding sphere для первичного Frustrum culling (отсечка ненужных объектов по усеченному конусу видимого пространства) В дальнейшем добавится вторичный Frustrum culling уже по конвексу.
    Тут суть такая, что по сфере мы можем отбраковать меши еще в моменте построения сцены, до передачи данных в пайп, т.к. для этого геометрия меша нам не нужна.

  • Адресована ошибка в размере заголовка StaticMesh

Комментарий

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

Показать полностью
[моё] Разработка Gamedev Инди Игровой движок Текст
0
11
TehnoMagEG
TehnoMagEG
Лига Разработчиков Видеоигр
Серия Relict Engine

Relict Engine: Мир и DevLog 20250928⁠⁠

2 месяца назад

Краткий список изменений

  • Добавлен абстрактный класс GameEntity

  • Добавлен класс GameWorld

  • Атом SceneEntity больше не является атомом и переделан в полноценную Object сущность

  • Исправлено поведение флага Dirty у трансформы SceneEntity, в случае перезаписи трансформы из внешнего источника

  • Исправлено поведение наследных классов от класса с флагом FreeDefaultNoInst

    см ниже

Мир

Схематичное представление потока данных

Схематичное представление потока данных

По сути система будет очень похожа на аналогичную в Unreal Engine, но просто потому, что достаточно сложно, при выбранной модели памяти, данные организовать как-то иначе (плюс не забываем про lua скриптовые сущности, которые рано или поздно нужно будет туда прикрутить).
Изначально конечно планировалось использовать наборные сущности через классы Атомы (что в дальнейшем должно было упростить прикручивание ECS системы), но при экспериментах выяснилось, что данная система сильно переусложняет код, и не позволяет разграничить элементную базу по их типу (множественное наследование от одного базового класса с одним потомком).

Пройдемся кратко:
GameEntity - аналог UE (AActorBase) - минимальная единица, которую понимает и принимает GameWorld. Является контейнером для игровой логики, графических ассетов и прочего. так-же является единицей взаимодействия программиста с движком.

GameWorld - аналог UE (UWorld) - представляет из себя игровой мир. Рулит тиками GameEntity, спавнит эти самые GameEntity, дергает их евенты, и прочее.

* Scene - Набор контейнеров - сцен для разных задач. Логика достаточно проста: если компонент GameEntity графический, то летит в Renderer Scene; если звуковой, то в Sound Scene, а если коллайдер, то в Physic Scene. Возможно, в дальнейшем появится еще и Network Scene, но это не точно.

FreeDefaultNoInst

Начиная с этого участка кода в роль вступает флаг памяти FreeDefaultNoInst, который я кратенько описывал в первых постах серии. Он служит для того, чтобы Сборщик мусора, при удалении последнего экземпляра класса так-же удалял и его архетип (или DefaultClassObject, или просто DO). Если классы уровня ядра не использовали данный флаг, т.к. в нем не было большого смысла, ибо экземпляры этих классов по большей части живут от старта и до выключения движка, то на классах уровня, скажем, мира, этот флаг применяется. Т.е. память не будет захламляться мусором, и будет очищаться от ненужных сущностей по мере необходимости.

Например:

Небольшой тестовый проект работы флага FreeDefaultNoInst (Actor наследный класс от GameEntity)

Небольшой тестовый проект работы флага FreeDefaultNoInst (Actor наследный класс от GameEntity)

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

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

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

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

А если установлен, то:

Флаг установлен, после удаления единственного экземпляра Actor, так-же удаляется и его DO

Флаг установлен, после удаления единственного экземпляра Actor, так-же удаляется и его DO

И для понимания: в дальнейшем, использование NewObject для наследных классов GameEntity не будет корректным решением. Оно будет заменено на другой вызов, который будет является оберткой над GameWorld

Показать полностью 4
[моё] Разработка Gamedev Инди Игровой движок Длиннопост
0
5
TehnoMagEG
TehnoMagEG
Лига Разработчиков Видеоигр
Серия Relict Engine

Relict Engine: Сцены и DevLog 20250925⁠⁠

2 месяца назад

Краткий список изменений

  • Успешно внедрен GLFW

    Теперь можно не заниматься такой ерундой, как разбираться, как работают протоколы Wayland

  • Добавлен универсальный класс окна

  • Добавлены настройки создания окна и вынесены в UserSettings.ini

  • Добавлен атом сущности сцены (SceneEntity)

  • Добавлен экспериментальный класс Actor

    Наследие Unreal Engine GameFramework. В дальнейшем откажусь от него окончательно, возможно. Но пока-что с ним проще.

  • Удалены платформа зависимые реликты Engine_Platform{%PlatformName%}


Рендер на основе OpenGL

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

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

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


Сцены

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

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

И все это будет управляться неким классом, который будет уже игровые объекты распихивать по этим сущностям (по этому как раз и взят Actor за референс, т.к. в Unreal он именно этим и занимается, хоть и не совсем сам).

Показать полностью
[моё] Разработка Gamedev Инди Игровой движок Текст
0
6
TehnoMagEG
TehnoMagEG
Лига Разработчиков Видеоигр
Серия Relict Engine

Relict Engine: Формат Статичного меша⁠⁠

2 месяца назад

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

Статичный меш умеет:

Стандартные вершины, индексы, нормали, тангенсы и битангенсы, а так-же 8 каналов текстурных координат (как 2д так и 3д).

Кроме того: умеет в лоды и мульти материал (неограниченное кол-во). И одну конвекс коллизию (опциональный блок).

Сам формат представляет из себя:
Заголовок формата (идет после RAT заголовка)


Блок больших данных. В котором хранится вся информация о вершинах и их атрибутах.
А так-же блок офсетов, для формирования лодов и формирования буферов для рендера.

В дальнейшем туда добавится еще блок Сокетов, однако на данный момент решил пока их не делать (ибо пока нет обработки трансформов на уровне сцен, как и самих сцен, собственно).

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

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


Небольшие новости по Linux сборке:

Между делом придумал, как учитывать "внешние" потоки в ThreadManager. Следовательно теперь мы можем спокойно подключить GLFW и не заниматься ерундой. И наверное именно GLFW я и займусь в ближайшее время. А следовательно, в относительно скором времени, можно уже будет показать работу движка в графике (хоть и с простейшими шейдерами и без текстур). Но это в любом случае желательно сделать сейчас, чтобы убедится, что я не "наепался" в данных формата. Ну и заодно посчитать время на обработку вершин из RAT для передачи уже непосредственно в рендер.

Показать полностью 2
[моё] Разработка Gamedev Инди Игровой движок
0
8
TehnoMagEG
TehnoMagEG
Лига Разработчиков Видеоигр
Серия Relict Engine

Relict Engine: DevLog 20250825⁠⁠

3 месяца назад

Список изменений на сегодня:

  • Перенесена и обновлена дорожная карта с Trello на yougile

    Ссылка для ознакомления: https://yougile.com/board/8o3quozyj1in

  • Добавлен механизм синхронизации асинхронной задачи с родительским потоком.

    Метод Await() у класса AsyncTask

  • Добавлен механизм LoadOnDemand для StaticMesh ассета

При обращении к BulkData ассета, если задача на загрузку не запускалась или была сброшена, то ставит задачу на исполнение, и возвращает nullptr указатель, если задача не исполнена.

  • Добавлен механизм "Сброса" асинхронной задачи

Сбрасывает состояние задачи на Created, возвращает возможность вызова метода Run(), и, по необходимости, очищает связанные с задачей данные.

  • Исправлено удаление объекта из глобального тикера, в случае, если объект удален.


Небольшие новости по Linux сборке:

Посмотрел я на выходных еще раз в сторону SDL и GLFW, и, все-таки пришел к выводу, что придется писать все самостоятельно. Что SDL, что GLFW создает около 5-6 внутренних потоков на стадии инициализации (для обмена данными; чтения ввода, итд). Это автоматически ломает суть ThreadManager с его max_concurrent_tasks. В итоге буду писать сам. С Windows то все просто - там не так много кода, а вот с Linux придется посидеть. Посмотрел я, как работает Wayland, и мне, откровенно не понравилось. Нет, оно конечно очень гибко, но там даже для самого простого окна получается достаточно много кода. Есть, правда, libwaylandpp, который это дело упрощает... Посмотрю, может через него удастся.

Показать полностью
[моё] Разработка Gamedev Инди Игровой движок Текст
10
6
TehnoMagEG
TehnoMagEG
Лига Разработчиков Видеоигр
Серия Relict Engine

Relict Engine: ThreadManager и DevLog 20250822⁠⁠

3 месяца назад

Список изменений:

  • Добавлены классы ThreadManager и AsyncTask (о них чуть ниже)

  • В RAT контейнер добавлена основная и дополнительная информация о геометрии (за исключением текстурных координат)

  • Добавлена асинхронная загрузка геометрических данных

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

  • Добавлена зависимость от glm

  • Добавлены правила сборки под оптимизацию glm под разные наборы инструкций (SSE, AVX, AVX2)

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

  • Исправлена ошибка в парсе конфигов в случае, если конфиг, созданный в Windows парсится в Linux.


ThreadManager и AsyncTask

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

Как это работает. ThreadManager при старте запрашивает систему о том, сколько параллельных задач может выполнить система (это можно переопределить через параметр max_concurrent_tasks в Engine.ini с возможностью перевыставить этот параметр в "пользовательском" конфиге), с ограничением, что если этот параметр больше полученного от системы значения, то движок уйдет в исключение (думаю понятно, зачем это сделано). Так-же в этом классе хранится очередь задач AsyncTask и производных от них.

Каждый AsyncTask является отдельным потоком. Его нельзя запустить произвольно - только поставить в очередь на исполнение. ThreadManager в каждом тике основного потока опрашивает очередь и смотрит в каком состоянии находится задача. Если состояние Pending и если текущее кол-во запущенных задач меньше, чем max_concurrent_tasks, то запускает ее. Если задача закончила выполнение, то убирает ее из очереди и запускает следующую. Если очередь пуста, то Тик для ThreadManager отключается, тем самым дополнительно экономя ресурсы основного потока.

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

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

Показать полностью
[моё] Разработка Gamedev Инди Игровой движок
0
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии