Devlog без QA | Розробка ігор – Telegram
Devlog без QA | Розробка ігор
641 subscribers
204 photos
61 videos
402 links
Unity/Новини/Ідеї/Натхнення й інший якісний (а можливо і не дуже) контент тут!

Зв’язок: @DevAndrew

Анти-скам бот: @IndieSafeBot
Download Telegram
🔄 Retention у відеоіграх: що це, які норми і як його підвищити

Якщо для вас це незнайоме слово тоді варто запам'ятати: Retention — це одна з ключових метрик виживання гри.

Вона показує, наскільки добре твій проєкт утримує гравців після першого запуску. Високі значення втримання свідчать про привабливий ігровий досвід і лояльність аудиторії, тоді як низькі сигналізують про проблеми.

Зазвичай дивляться такі показники:

• Day 1 Retention (R1): скільки гравців повертаються наступного дня після встановлення.

Day 7 Retention (R7): скільки залишаються через тиждень.

• Day 30 Retention (R30): скільки залишаються через місяць.

Формула проста:
Retention = (Кількість гравців, що повернулись / Кількість установок у день 0) × 100%


📊 А як що до середніх показників? [Джерело]

На диво, якщо говорити про основні платформи, то різниця відрізняється кардинально.

🔹 Мобільні ігри:

D1: ~35–40%

D7: ~10–15%

D30: ~5–10%

🔸ПК / Консолі:

D1: ~50-60%

D7: ~20-30%

D30: ~10-20%

«Хороший профіль» утримання часто позначають як 40 / 20 / 10 — це ціль, до якої прагнуть більшість студій. Проте ці бенчмарки залежать від жанру, платформи як вже сказано та від регіону.

Для прикладу гіперказуальні ігри (hyper-casual) мають швидке «скасування» тоді як з іншими жанрами ситуація в перспективі набагато краща. Також регіон, Північна Америка показує одні з найкращих показників. Серед країн виділяється і Японія, цілих D30: ~6.4% проти ~3.7% у США. [Інфа]

🤑 Вплив Retention на LTV та монетизацію.

Тут і говорити багато не потрібно, бо відповідно чим більша залученість та % утримання аудиторії - тим більший дохід. Як зазначають фахівці:

«...високий рівень утримання збільшує LTV гравця, адже він довше взаємодіє з продуктом»


Як покращити Retention?

Найняти хорошого гейм-дизайнера. А якщо трішки роз'яснити, то зробити так, щоб перший вхід гравця в гру шокував його. У хорошому сенсі 😉

Далі можна було би довго і довго говорити про систему винагород, щоденні бонуси, квести, Push-повідомлення та нагадування (що до речі є хорошою ідеєю), але якщо ідея хороша не менш важливим за ці всі пункти є контент: регулярні оновлення, святкові івенти і т.п.

Більше і більше цікавого, щоб захопити увагу гравця (не занадто багато, це теж важливо).

📌 Тому, якщо хочете заробити потрібно працювати :(

✈️ Gamedev | #запитання #retention #LTV #аналітика #геймдизайн
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥12🔥2💯1
Media is too big
VIEW IN TELEGRAM
😵‍💫 Surface-Stable Fractal Dithering

Метод діджерингу від Rune Skovbo Johansen, який дозволяє точкам "липнути" до 3D-поверхонь, зберігаючи стабільний розмір і відстань на екрані навіть при зміні відстані.

✈️ Gamedev | [Джерело] | #корисне #Shader #Surface #шейдер #натхнення
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤‍🔥3👍1
Трішки сумної статистики 😞

У 2025 році в Steam вийшло майже 13 тисяч нових ігор, але майже 40% з них не заробили навіть 100$, що є сумою, яка дорівнює вартості публікації гри в магазині.

Згідно аналітики Gamalytic майже дві третини заробили <1000$ і лише 8% зібрали > $100 тис. Ситуація на ринку інді-ігор наступна: 30% найменш прибуткових проєктів заробили в середньому лише $37.

У відкритій частині бази йдеться, що 47,4% продали менше ніж 100 копій, а ще 28% від 100 до 1000.

⚠️ Gamalytic зазначає, що їхні дані неповні, тож цифри можуть коливатись. Багато ігор з малою аудиторією не змогли заробити навіть мінімальні суми.

Серед них є безплатні експерименти та фан-проєкти, але загалом статистика показує масштаб “гри в нікуди”: більшість релізів виходять не заради прибутку.

Навіть зі ШІ, що здешевлює розробку, час, гроші та зусилля часто не окупаються.

А ви б ризикнули випустити гру в такому насиченому ринку?

✈️ Gamedev | #новини #steam #publish #ІндіРинок
Please open Telegram to view this post
VIEW IN TELEGRAM
😢9🔥4👀2👍1
This media is not supported in your browser
VIEW IN TELEGRAM
😶‍🌫️ Фейковий туман за хвилину!

✈️ Gamedev | #туторіал #туман
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥23🔥42😍1
This media is not supported in your browser
VIEW IN TELEGRAM
🎯 Drag & Launch у Unity 2D: Повний гайд з кодом та механікою

Хочеш реалізувати у грі механіку “потягни й кинь”, як у Angry Birds? Давай розберемо готовий приклад.

TrajectoryAimer2D: Симулює траєкторію об’єкта з урахуванням гравітації, відскоків і тертя. Відображає її точками, щоб гравець бачив, куди полетить об’єкт перед запуском.

DragController: Керує об’єктом, відстежує натискання, драг і відпускання, і розраховує силу запуску. Викликає TrajectoryAimer для показу траєкторії та застосовує імпульс при відпусканні.

🧑‍💻 Код (C#):

1. DragController відповідає за те, щоб гравець міг тягнути об’єкт і запускати його.

1️⃣ Відстеження натискання миші
if (Input.GetMouseButtonDown(0) && !isDragging)
{
DragStart();
}


Input.GetMouseButtonDown(0) перевіряє, чи натиснута ліва кнопка миші. !isDragging гарантує, що драг не почнеться, якщо об’єкт вже тягнуть.

Якщо обидві умови істинні, викликається метод DragStart(). У якому ми скидаємо швидкість та обертання об'єкта.

2️⃣ Drag() – процес драгування

Метод Drag() викликається кожного кадру в Update(), поки гравець тримає об’єкт мишею:

Беремо поточну позицію миші у світі та обчислюємо відстань від початку драгування. Це визначає напрямок і силу. Далі обмежуємо максимальну відстань запуску, щоб гравець не тягнув об’єкт занадто далеко.

Vector2 currentPos = MousePosition;
Vector2 distance = dragStartPos - currentPos;

if (distance.magnitude > dragLimit)
distance = distance.normalized * dragLimit;


Розраховуємо сила запуску, яка буде застосована при відпусканні. Чим далі тягнемо – тим сильніше буде кидок. Та виходячи з даних об'єкта визначаємо очікувану траєкторію.

Vector2 initialVelocity = (Vector2)(finalForce / rb.mass);

trajectoryAimer.ShowTrajectory(rb.position, initialVelocity);


3️⃣ DragEnd() – завершення тягнення

Метод DragEnd() викликається, коли гравець відпускає мишу після драгування.

isDragging = false;


Також повторно розраховуємо силу та відстань, щоб застосувати точну силу з обмеженнями. Після розрахунку використовуємо імпульсну силу яка відправить об'єкт у політ:

rb.AddForce(finalForce, ForceMode2D.Impulse);


2. TrajectoryAimer2D відповідає за показ траєкторії польоту враховуючи масу, швидкість і інші вхідні дані.

На початку скрипта ми задаємо всі параметри для симуляції та візуалізації: кількість кроків (maxSteps), тривалість одного кроку (timeStep), шари для перевірки колізій (collisionMask), фізичні властивості (friction, bounciness, gravityScale).

1️⃣ ShowTrajectory() – розрахунок і відображення траєкторії

Метод викликається з DragController кожного кадру під час драгування і обчислює майбутні позиції об’єкта, враховуючи гравітацію, швидкість, відскоки та тертя.

Vector2 position = origin;           // Початкова позиція об’єкта
Vector2 velocity = initialVelocity; // Початкова швидкість
float gravity = Physics2D.gravity.y * gravityScale; // Врахування гравітації

List<Vector2> points = new List<Vector2>(); // Список точок для візуалізації


Далі проганяємося циклом, щоб прогнозувати нову позицію на кожному кроці і перевіряємо, чи буде зіткнення з колайдером.
for (int i = 0; i < maxSteps; i++)
{
velocity += new Vector2(0, gravity) * timeStep; // Додаємо гравітацію
Vector2 nextPosition = position + velocity * timeStep; // Наступна позиція


2️⃣ Візуалізація траєкторії – SpawnDot()

Після того як ми розрахували всі точки траєкторії, метод SpawnDot() створює маленькі об’єкти (крапки) у кожній позиції зі списку, щоб гравець бачив, куди полетить об’єкт.

Тут ми також налаштовуємо прозорість крапок, щоб вони плавно зменшувалися до кінця траєкторії, роблячи її більш наочною та зрозумілою.

📌 Повна версія коду з коментарями тут [Клац] 👈

✈️ Gamedev | #уроки #DragAndLaunch #туторіал
Please open Telegram to view this post
VIEW IN TELEGRAM
7❤‍🔥4👍3🔥3
📱 Game Jam на честь двадцятиріччя!

Unity виповнюється два десятиліття . На честь цього компанія запускає 48-годинний Unity Game Jam, який стартує 7 листопада о 19:00 за київським часом.

Учасники від соло-розробників до великих команд змагатимуться, створюючи ігри, натхненні історією рушія.

🏆 Категорії оцінювання:
• Fun Factor
• Art
• Sound Design
• Uniqueness/Creativity
• Narrative Design


А ще буде спеціальна номінація “Most Creative Use of Anniversary Assets”, переможців якої покажуть у прямому ефірі Unity Livestream.

Ну що? Хто прийме участь? 😉

✈️ Gamedev | [Джерело] | #новини #річниця #Unity #GameJam
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥14🔥3🎉21👍1
⚙️ Оптимізація інтерфейсу

Так, нажаль це теж потрібно оптимізовувати. Але не переживайте, буквально декілька простих порад 😅

Розділіть Canvas — не оновлюйте весь інтерфейс через одну дрібну зміну.

Використовуйте Tween замість Animator — менше навантаження, плавніші анімації і так далі...

✈️ Gamedev | [Джерело] | #оптимізація #Unity #Canvas #UI #Interface #інтерфейс
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥114🔥1
Всім привіт 👋

📌 Ось і ваша любима рубрика: щосуботи ділимося своїми іграми, артами, скріншотами чи результатами роботи. Це може бути як концепт, так і вже готовий проєкт.

Ну що, хто покаже перший скрін?🔥

✈️ Gamedev | #ScreenshotSaturday
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥8🔥3🎉1
📌 Підсумок публікацій за тиждень:

Ще один тиждень пролетів. І ось підсумок!😁

🎓 Навчальні матеріали:
😶‍🌫️ Фейковий туман за хвилину!
🎯 Drag & Launch у Unity 2D: Повний гайд з кодом та механікою

📰 Новини та цікаві теми:
🔄 Retention у відеоіграх: що це, які норми і як його підвищити
Трішки сумної статистики 😞
📱 Game Jam на честь двадцятиріччя!

🔨Корисне:
😵‍💫 Surface-Stable Fractal Dithering
⚙️ Оптимізація інтерфейсу

Не забуваємо, що у першому закріпленому повідомленні є вся потрібна інформація. Що # тут не просто так!

Та також, переглядайте та діліться своїми результатами у SCREENSHOT SATURDAY!

✈️ Gamedev | [Підтримати канал тут]
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥12😁3🔥2👍1
🧠 Unity Dev Tip: що таке OnValidate() і навіщо воно взагалі потрібне?

Нещодавно стикнувся з ситуацією: у мене був список елементів і кожен новий елемент потрібно було називати автоматично у форматі mob_1, mob_2, mob_3

Робити це вручну — довго і лінь, особливо, якщо таких елементів багато. Робити це в Start() або Awake() запізно, бо значення потрібні ще до запуску гри.

І тут згадую про одну класну річ — OnValidate()

🔍 То що таке OnValidate()?

OnValidate() — це editor-only метод у MonoBehaviour, який автоматично викликається в редакторі, коли скрипт завантажується або значення змінюється в Inspector. БЕЗ ЗАПУСКУ ГРИ!!!

Для прикладу:
public class EnemyList : MonoBehaviour
{
// 📝 Список імен ворогів, які ми будемо автозаповнювати
[SerializeField] private List<string> enemyNames = new List<string>();

#if UNITY_EDITOR // Гарантуємо, що код не потрапить у билд гри
private void OnValidate()
{
// 🔄 Проходимось по всьому списку щоразу, коли змінюється щось у інспекторі
for (int i = 0; i < enemyNames.Count; i++)
{
// ❗️ Якщо елемент порожній або null — автоматично генеруємо ім'я
if (string.IsNullOrEmpty(enemyNames[i]))
enemyNames[i] = $"mob_{i + 1}"; // 👉 mob_1, mob_2, mob_3 ...
}
}
#endif
}

Тепер:
➜ Додаються нові елементи у списку
➜ Самоприсвоєння mob_4, mob_5, mob_6
➜ без натискання Play, без ручної роботи

⚠️ Важливе зауваження

OnValidate() НЕ має працювати з runtime-логікою, збереженнями, фізикою тощо.
Його задача підготувати дані ДО старту гри.

Це рішення не єдине можливе, але мені воно допомогло доволі швидко 😅

✈️ Gamedev | #уроки #OnValidate #UnityTips #UnityEditor #ініціалізація #редактор
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4❤‍🔥32
⚙️ 40 безкоштовних асетів, які зроблять редактор у рази зручнішим!

Інструменти для ієрархії, інспектора, дебагу, камер, організації проєкту, UI кастомізації, оптимізації та в основному для прискорення роботи!

✈️ Gamedev | [Джерело] |#інструменти #assets #UnityEditor
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥7👍2🔥2
📱 Ігри без коду і рушія?

Трохи перебільшення, але майже правда 😅

Unity запустила Unity Studio. Без Unity Hub, без інсталяцій, без public void Start(). Відкрив сайт і вже будуєш сцену.

Що це таке?

Unity Studio — це легкий онлайн-редактор, де все працює через drag-and-drop (scratch?) і візуальні блоки логіки.

Ідея проста: можна зібрати демо, walkthrough, тренувальну сцену, конфігуратор чи прототип без програмування і складного пайплайну.

Unity позиціонує його як інструмент для дизайнерів, маркетингових команд, освітніх проєктів і тих, кому "потрібен інтерактив, але не повний рушій".

Зараз це бета, і компанія відкрила реєстрацію для всіх, хто хоче залетіти першим і вплинути на розробку.

Це реально майбутнє no-code розробки чи просто "Figma для 3D"? 👀

✈️ Gamedev | [Реєстрація] | #новини #Unity #UnityBeta #NoCode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9🤔4👍2🤯21
This media is not supported in your browser
VIEW IN TELEGRAM
🎢 Створюйте плавні криві та шляхи легко!

Пакет Splines дозволяє малювати, анімувати та розташовувати об’єкти вздовж шляхів для руху, оточення та іншого.

✈️ Gamedev | [Джерело] | #туторіал #spline #криві #Curves
Please open Telegram to view this post
VIEW IN TELEGRAM
14❤‍🔥41🔥1
Media is too big
VIEW IN TELEGRAM
🔥 Paper Burn Effect

Дуже крутий та стильний ефект згоряння паперу. Може стати ідеальним доповненням для меню, переходів, кат-сцен чи будь-якої VFX фішки в грі.

Десь я таке бачив в Dead By Daylight 🧐

✈️ Gamedev | [Джерело] | [Стаття] | #корисне #Shader #Burn #BurnEffect #шейдер
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤‍🔥41👍1
Доброго вечора, шановне панство 👋

Пропоную зіграти у ностальгію: розкажіть, яка ваша перша гра, яку ви спробували зробити, тільки починаючи свій шлях?

Для прикладу: моя перша гра була 2D top-down раннером. І так, десь у глибинах архівів досі живе дуже древній скріншот цього "шедевру" 😅

А яка була ваша? На якому рушії? І чи дожила вона до хоч якогось прототипу?

Цікаво буде почути ваші історії 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥92😍2
🎯 Цілі, які тримають гравця в грі

Нещодавно у нас був пост про Retention в іграх, про те, як утримати гравця і зробити так, щоб він повертався знову і знову.

Ми говорили про важливість першого враження, лупів, контенту та відчуття прогресу.

І мені дуже сподобалось одне, здавалось би елементарне, але насправді глибоке доповнення від підписника 👇

“Якщо ви задумали попрацювати над утриманням гравця в грі, вам як ГД простіше всього зробити це через знайому систему ‘цілей’.

Дайте гравцю дуже прозорі короткострокові, середньострокові та довгострокові цілі.

Гравець має думати: «Я зараз встану з ліжечка, зроблю каву і зайду саме в ЦЮ гру, бо мені треба…»


Все геніальне — просто 💡


🔥 Тож давайте поговоримо, якими можуть бути ці цілі:

Короткострокові цілі (момент-о-момент): завдання на декілька хвилин і базові дії геймплею. Вони дають негайний зворотний зв’язок і відчуття «за мить», що є частиною ядра гри.

Середньострокові цілі (метагра): завдання на кілька ігрових сесій або тижнів. Це можуть бути квести на збирання ресурсів, прокачування персонажа, відкриття нових локацій чи режимів. Саме вони складають «хребет» утримання – більшість часу гравця йде саме на їхнє виконання

Довгострокові цілі (амбіційні/aspirational goals): масштабні досягнення, до яких гравець прагне тривалий час. Наприклад, пройти весь сезон чи зібрати рідкісні скіни. Це цілі високої ваги, часто необов’язкові та довгоцінні.

Гарна ігрова система утримання поєднує різні механіки для всіх категорій цілей:

🔹 Щоденні та повторювані квести: реанімують звичку грати регулярно.

🔹 Бойові пропуски і сезонні івенти: мотивують на середньо- і довгострокову гру.

🔹 Серії входів і накопичувальна прогресія: винагороджують безперервну активність.

🔹 Короткострокові виклики: підзавдання у межах сесії чи тижня. Це можуть бути «завершити 3 рівні», «виграти 5 боїв», «перемогти боса», що додають відчуття миттєвого прогресу.

🔹 Досягнення й соціальні цілі: виконання «досягнень», місце в таблиці лідерів або командні цілі.

🤑 Ну і як забути за винагороду!

Кожна ціль має мотивувати гравця зовні та зсередини. По типу монети, досвіду, косметики і т.д. Ну і головне - задоволення від самого процесу.

Пам'ятаю в одній грі було доволі багато вищеперерахованих цілей, але вони були НУ НАСТІЛЬКИ НУДНІ, що багато хто (як на мене 90% гравців) зупинялися на цьому моменті гри.

▶️ Приклад з життя

Пам’ятаю, коли я був меншим, я грав у таку класну гру, як Drive Ahead!, і моїм головним “тригером” були місячні івенти.

За них можна було отримати ексклюзивні нагороди: нові машинки, арени. І це було справді цікаво, бо там були унікальні завдання, рівні та боси, які з’являлися тільки під час цього івенту.

Кожен день хотілось повернутись, щоб пройти ще трохи й не пропустити нічого з цього тимчасового контенту.

💭 Підсумовуючи: так, система цілей і мотивацій залежить від жанру гри. Для прикладу у шутері, фермі чи гонках це виглядатиме по-різному.

Але незмінним залишається одне: будь-яка гра потребує зрозумілих і привабливих цілей, які тримають гравця в процесі.

✈️ Gamedev | #запитання #retention #геймдизайн #цілі #досягнення #розробкаігор #GameDesign
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥8🔥31👍1
Всі ж чули, що GTA 6 відклали через те, що Rockstar Games вирішили взяти ще трохи часу, аби довести гру до ідеалу? Так ось головна новина не лише в тому, що реліз зсунули, а й у тому, що акції Take-Two Interactive трішки впали 📉

Після оголошення про перенесення дати виходу з травня на 19 листопада 2026 року, акції видавця впали на 7% з $252 до $236.

Розробники пояснили, що їм потрібно більше часу, щоб зробити Grand Theft Auto VI на рівні очікувань:
«Просимо вибачення за ще кілька місяців очікування, але це дозволить нам завершити гру з тим рівнем якості, якого ви очікуєте й заслуговуєте».


Хоча, як на мене, це цілком правильно. Краще трохи зачекати, але отримати дійсно якісний результат, ніж поспішити й потім жалітись на баги. Тому чому у декого бурна реакція? 😐

А що ви думаєте про це? Пишіть у коментарях 👇

✈️ Gamedev | #новини #GTA6 #RockstarGames #ГТА6
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥31❤‍🔥1
Всім привіт 👋

📌 Ось і ваша любима рубрика: щосуботи ділимося своїми іграми, артами, скріншотами чи результатами роботи. Це може бути як концепт, так і вже готовий проєкт.

Ну що, хто покаже перший скрін? 🔥

✈️ Gamedev | #ScreenshotSaturday
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥71❤‍🔥1
📌 Підсумок публікацій за тиждень:

Ще один тиждень пролетів. І ось підсумок!😁

🎓 Навчальні матеріали:
🧠 Unity Dev Tip: що таке OnValidate() і навіщо воно взагалі потрібне?
🎢 Створюйте плавні криві та шляхи легко!

📰 Новини та цікаві теми:
📱 Ігри без коду і рушія?
🎯 Цілі, які тримають гравця в грі
🎮 Перенесення GTA VI та падіння акцій

🔨Корисне:
⚙️ 40 безкоштовних асетів, які зроблять редактор у рази зручнішим!
🔥 Paper Burn Effect

Не забуваємо, що у першому закріпленому повідомленні є вся потрібна інформація. Що # тут не просто так!

Можливо вам буде цікаво переглянути, або розказати про ваш перший досвід у створені ігор - [Тут]

Та також, переглядайте та діліться своїми результатами у SCREENSHOT SATURDAY!

✈️ Gamedev | [Підтримати канал тут]
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥124👍2
This media is not supported in your browser
VIEW IN TELEGRAM
👀 Як зробити ретро-ефект пікселізації?

Думаю, що вже багато хто, по деяким постам, міг зрозуміти, що тематику ретро я люблю 😉

✈️ Gamedev | #туторіал #RetroStyle #RetroEffect #Pixelization
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥9👍5🔥3
🇯🇵 Прикол з перекладом

Нещодавно вперше мені довелося локалізувати гру на японську та китайські мови. І ось тут стався справжній прикол.

Усе виглядало чудово, але половина тексту перетворилася на квадратики. 😅

Спочатку я подумав, що проблема в самих перекладених текстах або в ієрогліфах, можливо ChatGPT підкинув якісь рідкісні символи, або у шрифті від Google просто немає всіх потрібних знаків.

‼️ Перепробував кілька шрифтів, перевіряв кодування, навіть грішив на діалекти — нічого не допомагало.

І чисто випадково, мені прийшла в голову ідея просто збільшити атлас (дефолт при імпорті 1024х1024) на 2048х2048. І о чудо!

Виявилося, що при маленькому атласі Unity просто не може “втиснути” всі гліфи у текстуру, і частину просто відкидає.

Тому якщо ви працюєте з японськими, китайськими чи корейськими символами:

🔸 Збільшіть розмір атласа хоча б до 2048 або 4096

🔸 Або зменште padding і font size в Font Asset Creator (з цим акуратно)

Інколи навіть такі дрібниці можуть “полагодити” цілу локалізацію 😄

✈️ Gamedev | #уроки #lifehack #unity #localization #unitytips #TMP #fonts #локалізація
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥18👍5🔥32