Я как-то обычно не практикую вопросы на канале, но вдруг вам будет интересно. В общем я сейчас еще подумал, что могу Романа попросить написать/рассказать свои мысли, как он подходит к проектированию нашего игрового мира. Интересно было бы?
3👍15🔥9❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12 7👍2
На днях вышла Unity 6.3 LTS
Вроде как обещают, что будет больше стабильности. Вроде как это основная фишка. Верим? Я больше верю, что теперь в окошке Unity crash меня будет радовать новая обновленная иконка.
Из того, что меня зацепило:
- Platform Toolkit — единое API для всех игровых платформ. Портирование проектов может стать проще (конечно, если оно работает)
- Поддержка HTTP 2. Слабо верится. Сколько было часов нечеловеческих сношений с тем чтобы заставить работать проекты на этой версии протокола с помощью разных плагинов. Все еще с трудом верится в стабильность.
- Возможность изменять внешний вид панели Toolbar (это там где кнопка play\stop), добавлять кнопки итп. Правда мы и так раньше добавляли — сами писали скрипты. Мелочь, но теперь из коробки.
- Куча всякого по 2D: Возможность использовать 3D ассеты в 2D (работает 2D освещение и физика). Улучшение 2D физики и анимации.
- Можно отключить в проекте физику. В том плане что отключить весь физический SDK и уменьшить вес сборки. Это нравится.
- UI Toolkit — развивают, но все еще сыро. Подходит только для простых и тестовых интерфейсов.
#техничка@cat_and_code
Поддержите автора лайком или отправьте пост другу
Предложить тему для поста
Вроде как обещают, что будет больше стабильности. Вроде как это основная фишка. Верим? Я больше верю, что теперь в окошке Unity crash меня будет радовать новая обновленная иконка.
Из того, что меня зацепило:
- Platform Toolkit — единое API для всех игровых платформ. Портирование проектов может стать проще (конечно, если оно работает)
- Поддержка HTTP 2. Слабо верится. Сколько было часов нечеловеческих сношений с тем чтобы заставить работать проекты на этой версии протокола с помощью разных плагинов. Все еще с трудом верится в стабильность.
- Возможность изменять внешний вид панели Toolbar (это там где кнопка play\stop), добавлять кнопки итп. Правда мы и так раньше добавляли — сами писали скрипты. Мелочь, но теперь из коробки.
- Куча всякого по 2D: Возможность использовать 3D ассеты в 2D (работает 2D освещение и физика). Улучшение 2D физики и анимации.
- Можно отключить в проекте физику. В том плане что отключить весь физический SDK и уменьшить вес сборки. Это нравится.
- UI Toolkit — развивают, но все еще сыро. Подходит только для простых и тестовых интерфейсов.
#техничка@cat_and_code
Поддержите автора лайком или отправьте пост другу
Предложить тему для поста
1🔥14 5❤2
Нашел идеальную фразу, для проверки шрифта. Тут все 33 буквы.
"Эй, жлоб! Где Туз? Прячь юных съёмщиц в шкаф"
Не благодарите.
"Эй, жлоб! Где Туз? Прячь юных съёмщиц в шкаф"
Не благодарите.
1🤯15 10😁7🔥2
Про плохую практику возвращать null из методов. Разберем на примере.
Если метод, например, имеет такую сигнатуру:
Вы, когда его вызываете совершенно не рассчитываете получить
Плохая реализация выглядит так:
Если у вас один такой метод или малый проект, то это особо может и не страшно (но точно неудобно). Те кто не обращают на такие мелочи внимание, далее как правило накручивают еще больше подобных методов и неустойчивость кода растет очень быстро.
Это плохо в первую очередь потому, что ошибка происходит, но делает это втихую — не сообщая ничего. Во-вторых заставляет вызывающий код делать проверки вида
Реализация чуть лучше:
Тут мы уже узнаем, что у нас ошибка в данных. Внешние проверки результата уже не нужны — это хорошо. Но это все еще плохо потому, что в реальности ошибка скорее всего должна быть известна, но не ломать игру.
Хорошая реализация:
Почему хорошо:
- Понятность, вам не придется ловить null непонятно где. Внешний код уже по сигнатуре метода знает, что данных может не быть, значит обработает это корректно (например, отправит ошибку в аналитику, выведет лог и не будет ломаться на попытке запустить этот квест в игре).
- Вы не тратите время и мысленно не "спотыкаетесь" когда пишите код, при работе с подобными методами. Это дает скорость в работе. Вам не надо заходить в методы и проверять их реализацию. Такая фобия может развиться, стоит вам найти 3-4 метода в проекте, которые почему-то неявно возвращают
- Например, у вас из 1000 есть целых 10 не валидных
- Делает код чище и проще. Меньше лишних проверок, меньше строк и снова буст к простоте проекта и скорости разработки.
#техничка@cat_and_code
Поддержите автора лайком или отправьте пост другу
Предложить тему для поста
Если метод, например, имеет такую сигнатуру:
QuestData GetQuestData(string questId)
Вы, когда его вызываете совершенно не рассчитываете получить
null. Но бывает, что метод при этом может вам его вернуть не показав ошибки или не упав. Не зная этого вы растиражируете это значение по коду и упадете неизвестно где. И от этой рандомной точки нужно будет вернуться к этому методу в обратном направлении затратив время на поиск ошибки. Это потеря времени просто, чтобы узнать, что например, ошибка в данных и такого questId не существует.Плохая реализация выглядит так:
QuestData GetQuestData(string questId)
{
if (_quests.TryGetValue(questId, out QuestData data))
return data;
return null;
}
Если у вас один такой метод или малый проект, то это особо может и не страшно (но точно неудобно). Те кто не обращают на такие мелочи внимание, далее как правило накручивают еще больше подобных методов и неустойчивость кода растет очень быстро.
Это плохо в первую очередь потому, что ошибка происходит, но делает это втихую — не сообщая ничего. Во-вторых заставляет вызывающий код делать проверки вида
if (questData != null) везде где этот метод вызывается, а это повсеместный мусор. И, конечно, замедляет разработку.Реализация чуть лучше:
QuestData GetQuestData(string questId)
{
if (_quests.TryGetValue(questId, out QuestData data))
return data;
throw new Exception("Quest id '{questId}' not found.")
}
Тут мы уже узнаем, что у нас ошибка в данных. Внешние проверки результата уже не нужны — это хорошо. Но это все еще плохо потому, что в реальности ошибка скорее всего должна быть известна, но не ломать игру.
Хорошая реализация:
bool TryGetQuestData(string questId, out QuestData data)
{
return _quests.TryGetValue(questId, out data);
}
Почему хорошо:
- Понятность, вам не придется ловить null непонятно где. Внешний код уже по сигнатуре метода знает, что данных может не быть, значит обработает это корректно (например, отправит ошибку в аналитику, выведет лог и не будет ломаться на попытке запустить этот квест в игре).
- Вы не тратите время и мысленно не "спотыкаетесь" когда пишите код, при работе с подобными методами. Это дает скорость в работе. Вам не надо заходить в методы и проверять их реализацию. Такая фобия может развиться, стоит вам найти 3-4 метода в проекте, которые почему-то неявно возвращают
null.- Например, у вас из 1000 есть целых 10 не валидных
questId, которые вы передаете в метод. В варианте с возвращением null или throw new Exception — вам надо будет 10 раз запустить игру, чтобы их найти. В варианте, где вы очевидно обрабатываете отсутствие данных и, например, выводите лог, то вы узнаете все 10 неверных questId за один запуск. Это снова экономия времени.- Делает код чище и проще. Меньше лишних проверок, меньше строк и снова буст к простоте проекта и скорости разработки.
#техничка@cat_and_code
Поддержите автора лайком или отправьте пост другу
Предложить тему для поста
👍11 4🗿3❤2🤣1 1
Достаточно активный срач содержательная дискуссия была под постом про TryGet. Мне понравилось. Я в ней поделился советом, у которого образовались и противники и согласные.
И я тут подумал, может у тебя лично, дорогой подписчик, тоже есть какой-то свой совет, который ты считаешь важным? Или какой-то приём/подход, который ты хотел бы проверить на прочность? Может быть тебе интересно узнать, на сколько он спорный и что об этом думают другие?
Предлагаю такую штуку — желающие поделиться могут написать мне в ЛС, изложить свой совет/рекомендацию удобным способом, я оформлю вашу мысль, подготовлю пост и опубликую на канале. Вам возможность понаблюдать со стороны, не вступая в дискуссию лично (или наоборот с указанием авторства вопроса). Желающим критиковать, шутить и троллить — широкое поле для деятельности, велком. Остальным польза в виде разных мнений на вопрос.
И я тут подумал, может у тебя лично, дорогой подписчик, тоже есть какой-то свой совет, который ты считаешь важным? Или какой-то приём/подход, который ты хотел бы проверить на прочность? Может быть тебе интересно узнать, на сколько он спорный и что об этом думают другие?
Предлагаю такую штуку — желающие поделиться могут написать мне в ЛС, изложить свой совет/рекомендацию удобным способом, я оформлю вашу мысль, подготовлю пост и опубликую на канале. Вам возможность понаблюдать со стороны, не вступая в дискуссию лично (или наоборот с указанием авторства вопроса). Желающим критиковать, шутить и троллить — широкое поле для деятельности, велком. Остальным польза в виде разных мнений на вопрос.
2 3 3🔥2
Media is too big
VIEW IN TELEGRAM
Новости из страны инди разработки. Singletone понемногу преображается.
Сейчас этап создания основных механик, но совсем без контента очень сложно принимать решения по развитию визуала. Добавился URP, чтобы художник мог играться с эффектами и начать формировать наш стиль. Тестовая модель нпс тоже показала, что высоко полигональные персонажи нам не пойдут. Мы не собираемся все выводить под стиль PS1, но тем не менее от реализма мы будем далеко, а к конструктивизму и авангарду 20 века — близко.
Пока, то что на видео это еще даже не попытка в визуал, а первые черновые этапы. Модель — это Петр с Mixamo и диалог написанный по инициативе Copilot (все-таки нейронки что-то знают).
В общем у кого тоже проекты на ранних этапах, как у вас идет? Не пасуйте перед количеством работы? Я видел на других каналах иногда делаются посты, типа "скриншот прогресса". Чтобы в комменты все желающие могли накидать прогресс по своему проекту за последнее время и подбодриться (или погрустить вместе, тут как повезет). Есть у нас тут что-то делающие и желающие делиться прогрессом? Думаю может тоже сделаем такую рубрику.
#девлог@cat_and_code
Сейчас этап создания основных механик, но совсем без контента очень сложно принимать решения по развитию визуала. Добавился URP, чтобы художник мог играться с эффектами и начать формировать наш стиль. Тестовая модель нпс тоже показала, что высоко полигональные персонажи нам не пойдут. Мы не собираемся все выводить под стиль PS1, но тем не менее от реализма мы будем далеко, а к конструктивизму и авангарду 20 века — близко.
Пока, то что на видео это еще даже не попытка в визуал, а первые черновые этапы. Модель — это Петр с Mixamo и диалог написанный по инициативе Copilot (все-таки нейронки что-то знают).
В общем у кого тоже проекты на ранних этапах, как у вас идет? Не пасуйте перед количеством работы? Я видел на других каналах иногда делаются посты, типа "скриншот прогресса". Чтобы в комменты все желающие могли накидать прогресс по своему проекту за последнее время и подбодриться (или погрустить вместе, тут как повезет). Есть у нас тут что-то делающие и желающие делиться прогрессом? Думаю может тоже сделаем такую рубрику.
#девлог@cat_and_code
🔥7 3 1
Please open Telegram to view this post
VIEW IN TELEGRAM
Пора завершать историю с приставкой. В общем мы ее собрали и она даже стабильно работает.
Очень интересный эффект получился. Увлекаясь ее проектированием и сборкой, в итоге я представлял себе изделие гораздо более симпатичным. А выглядит она как ретро-футуристичный советский осциллограф без экрана. Особенно если смотреть сзади. Я когда учился в университете и они везде стояли в лабораториях в больших количествах, я задумывался, а почему они все такие страшные коробки? Видимо впитал эстетику🔫
Но если о плюсах:
- Фантомная подсветка сквозь двойную тесселяцию Вороного. Естественно — зеленая.
- Приставка придумана так, чтобы стоять в узкой полке под телевизором (боковые панели не видно). Здесь получилось — скучность ровных поверхностей будет скрыта.
- Хорошее охлаждение, нормальный олдскульный вентилятор и шум на уровне CD-привода при разгоне диска.
- Смена карты ОС без разбора корпуса. Это важно, так как внутри универсальная Raspberry Pi.
- Наличие AV выхода, я даже проверил 1 раз на ЭЛТ-телевизоре, что все работает. Не знаю зачем, но возможность есть.
- Куча эмуляторов разных платформ и необходимость потратить времени для установки и настройки игры в среднем в 3 раза больше, чем будешь в нее играть.
- Центральную кнопку так и не доделали. не хватает декоративной пластины.
В общем я доволен приключением, но дизайнером в Apple нас Джуниором вероятно не возьмут😐
Очень интересный эффект получился. Увлекаясь ее проектированием и сборкой, в итоге я представлял себе изделие гораздо более симпатичным. А выглядит она как ретро-футуристичный советский осциллограф без экрана. Особенно если смотреть сзади. Я когда учился в университете и они везде стояли в лабораториях в больших количествах, я задумывался, а почему они все такие страшные коробки? Видимо впитал эстетику
Но если о плюсах:
- Фантомная подсветка сквозь двойную тесселяцию Вороного. Естественно — зеленая.
- Приставка придумана так, чтобы стоять в узкой полке под телевизором (боковые панели не видно). Здесь получилось — скучность ровных поверхностей будет скрыта.
- Хорошее охлаждение, нормальный олдскульный вентилятор и шум на уровне CD-привода при разгоне диска.
- Смена карты ОС без разбора корпуса. Это важно, так как внутри универсальная Raspberry Pi.
- Наличие AV выхода, я даже проверил 1 раз на ЭЛТ-телевизоре, что все работает. Не знаю зачем, но возможность есть.
- Куча эмуляторов разных платформ и необходимость потратить времени для установки и настройки игры в среднем в 3 раза больше, чем будешь в нее играть.
- Центральную кнопку так и не доделали. не хватает декоративной пластины.
В общем я доволен приключением, но дизайнером в Apple нас Джуниором вероятно не возьмут
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20 4😁3
Видео разбор технических трудностей при создании Принца Персии 1989 года для Apple II.
Мне очень нравится иногда погрузиться в историю и нюансы, с которыми сталкивались программисты тех лет. Например, банальный объем памяти, максимальная бедная "IDE" для написания кода, обработка изображения платформой как байтов, а не пикселей и обходы аппаратных ограничений для достижения плавной красивой графики. Отдельные слезы — это плата видеозахвата.После просмотра сразу как-то легче на душе и технические проблемы уже не кажутся проблемами 😼
Youtube - Принц Персии: разбираем код гениальной игры, вытирая слезы счастья
Мне очень нравится иногда погрузиться в историю и нюансы, с которыми сталкивались программисты тех лет. Например, банальный объем памяти, максимальная бедная "IDE" для написания кода, обработка изображения платформой как байтов, а не пикселей и обходы аппаратных ограничений для достижения плавной красивой графики. Отдельные слезы — это плата видеозахвата.
Youtube - Принц Персии: разбираем код гениальной игры, вытирая слезы счастья
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Принц Персии: разбираем код гениальной игры, вытирая слезы счастья
Бусти — https://clickmy.ru/link/rvhYwf
Это видео — про игру Prince of Persia, всеми любимую и обожаемую классику.
Это мой взгляд программиста на то, как Джордан Мехнер — человек, без сомнения больной, но гениальный — в одиночку создал одну из самых кинематографичных…
Это видео — про игру Prince of Persia, всеми любимую и обожаемую классику.
Это мой взгляд программиста на то, как Джордан Мехнер — человек, без сомнения больной, но гениальный — в одиночку создал одну из самых кинематографичных…
Media is too big
VIEW IN TELEGRAM
Больше всего мне нравится писать сюда девлоги, особенно когда проекты не захиревают. Но заранее это неизвестно 🖼
У Singletone сейчас идет этап создания базовых механик, избавления от лишних идей и составления ГДД. Игра будет из категории нарративных, будет формировать особый многослойный опыт исследования и очень тонкие эмоции.
Невероятно сложно придумать исследовательский геймплей, который при этом максимально старается уйти от банального лутинга, поиска "ключей" и чтения записок. Но успехи есть. Мое почтение, но на данный момент наши режиссёр и сценарист описали основной стержень игры в 116 страниц. Я постепенно читаю и сегодняшней цитатой из документа объявляю фразу, которая звучит как угроза:
«На данном этапе никакой поэзии высокой плотности»
А из конкретного:
1. За этот период мы успели перейти с BuiltIn на URP и затем вскоре на HDRP. Если более человеческим языком — красиво будет, а на мобилках игры не будет.
2. Сделал шейдер для диалога по радио с завязкой эффекта помех на гистограмму звука. Как вам?
#девлог@cat_and_code
У Singletone сейчас идет этап создания базовых механик, избавления от лишних идей и составления ГДД. Игра будет из категории нарративных, будет формировать особый многослойный опыт исследования и очень тонкие эмоции.
Невероятно сложно придумать исследовательский геймплей, который при этом максимально старается уйти от банального лутинга, поиска "ключей" и чтения записок. Но успехи есть. Мое почтение, но на данный момент наши режиссёр и сценарист описали основной стержень игры в 116 страниц. Я постепенно читаю и сегодняшней цитатой из документа объявляю фразу, которая звучит как угроза:
«На данном этапе никакой поэзии высокой плотности»
А из конкретного:
1. За этот период мы успели перейти с BuiltIn на URP и затем вскоре на HDRP. Если более человеческим языком — красиво будет, а на мобилках игры не будет.
2. Сделал шейдер для диалога по радио с завязкой эффекта помех на гистограмму звука. Как вам?
#девлог@cat_and_code
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13 5❤2 2👍1 1
Есть ли на канале те старожилы, которые припомнят, что я пробовал сделать подкаст?
Тогда был первый опыт в этой теме. Тогда я уперся. И потом отложил тему, долго думал. Спустя время мысли привели меня к выводу, что я не хочу ничему учить в подкасте, бежать за трендами и инсайдами или транслировать какие-то заковыристые специализированные темы.
Второе — не хочу делать это один. В какой-то момент мне посчастливилось найти самых душевных соведущих — Женю и Руслана. Вместе мы решили, что как минимум троим людям в этом мире нужен душевный и ламповый подкаст про игры, ностальгию и возможность замедлиться. Неспешно вспомнить и порассуждать про то, что приятно, близко и интересно в поп-культуре нам. И возможно вам.
Поэтому, если у вас есть желание нас поддержать, а, в последствии, послушать, можете поддержать нас рублём - CloudTips. Даже минимальная поддержка в виде 50 вечно деревянных пойдёт в дело. Все оказывается дорогое😳 обложки, микрофоны, мастеринг, подписки.
Сейчас у нас несколько выпусков в обработке, поэтому, думаю, скоро напишу, где при желании нас можно послушать.
Всех, кто нас поддержал, мы обязательно упомянем в подкасте и скажем о них пару ласковых слов. Еще там по ссылке можно передать привет или сообщение, мы тоже озвучим 🤝
Тогда был первый опыт в этой теме. Тогда я уперся. И потом отложил тему, долго думал. Спустя время мысли привели меня к выводу, что я не хочу ничему учить в подкасте, бежать за трендами и инсайдами или транслировать какие-то заковыристые специализированные темы.
Второе — не хочу делать это один. В какой-то момент мне посчастливилось найти самых душевных соведущих — Женю и Руслана. Вместе мы решили, что как минимум троим людям в этом мире нужен душевный и ламповый подкаст про игры, ностальгию и возможность замедлиться. Неспешно вспомнить и порассуждать про то, что приятно, близко и интересно в поп-культуре нам. И возможно вам.
Поэтому, если у вас есть желание нас поддержать, а, в последствии, послушать, можете поддержать нас рублём - CloudTips. Даже минимальная поддержка в виде 50 вечно деревянных пойдёт в дело. Все оказывается дорогое
Сейчас у нас несколько выпусков в обработке, поэтому, думаю, скоро напишу, где при желании нас можно послушать.
Всех, кто нас поддержал, мы обязательно упомянем в подкасте и скажем о них пару ласковых слов. Еще там по ссылке можно передать привет или сообщение, мы тоже озвучим 🤝
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8 5🫡2 1
Давно не было чего-то из рубрики #техничка@cat_and_code
Недавно я вспомнил об очень простой штуке, которая иногда бывает просто незаменима в отладке. Все же пользуются
Строчка ставит Unity на паузу в момент вызова. Категорический полезна, когда вы пытаетесь найти капризный кейс в нужный кадр. При брейкпоинте в IDE можно посмотреть значения переменных в коде, а тут значения в компонентах и обстановку на сцене.
Пример использования:
Тестирую систему динамического респауна персонажа. Нельзя заранее назначить безопасную точку респауна, она все время обновляется и вычисляется. Обстановка в уровне может меняться, в данном случае корабль качается на волнах. Поверхность может быть ниже или выше изначальной желательной точки. Есть алгоритм, который все это рассчитывает и вычисляет новую позицию. Вызов
#девлог@cat_and_code
Недавно я вспомнил об очень простой штуке, которая иногда бывает просто незаменима в отладке. Все же пользуются
Debug.Log(...) + красный и желтый вариант. А вот про Debug.Break() часто почему-то не в курсе.Строчка ставит Unity на паузу в момент вызова. Категорический полезна, когда вы пытаетесь найти капризный кейс в нужный кадр. При брейкпоинте в IDE можно посмотреть значения переменных в коде, а тут значения в компонентах и обстановку на сцене.
Пример использования:
Тестирую систему динамического респауна персонажа. Нельзя заранее назначить безопасную точку респауна, она все время обновляется и вычисляется. Обстановка в уровне может меняться, в данном случае корабль качается на волнах. Поверхность может быть ниже или выше изначальной желательной точки. Есть алгоритм, который все это рассчитывает и вычисляет новую позицию. Вызов
Debug.Break() в момент спауна позволяет визуально оценить работу алгоритма и эту самую позицию. Посмотреть куда по факту он переместил персонажа и на сколько ошибся.#девлог@cat_and_code
🔥10❤3 1
This media is not supported in your browser
VIEW IN TELEGRAM
В преддверии выходных хочу всех порадовать ярким постом.
Релизнулся наш первый выпуск подкаста. Говорим конечно же про игры. Мы есть на всех основных платформах:
🍎 Apple Podcast
🟢 Spotify
🍑 Яндекс Музыка
🛫 Плеер в Telegram
🎶 Mp3 файл в комментариях
От всей души поддержать нас можно:
Сердечками на платформах
Поделиться впечатлениям тут или в группе подкаста
Cloudtips — отправить чаевые в пару кликов
Boosty — поддерживать ежемесячно
Релизнулся наш первый выпуск подкаста. Говорим конечно же про игры. Мы есть на всех основных платформах:
🍎 Apple Podcast
От всей души поддержать нас можно:
Сердечками на платформах
Поделиться впечатлениям тут или в группе подкаста
Cloudtips — отправить чаевые в пару кликов
Boosty — поддерживать ежемесячно
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡6 3 2 2
Очень круто, получилось. Я в прошлом посте поделился одним советом про дебаг, а ребята в комментариях написали еще 2 классные фишки по теме, которые я лично не использовал до этого и захотел вынести в отдельный пост. Михаил @MifanyaR и Роман @whiteHorseAstra спасибо за комментарии ❤️
Обе для Rider:
1. Ставим брейкпоинт, убираем глаку
2. Ставим брейкпоинт и в окошке тыкаем на не привлекающую внимания надпись,
#техничка@cat_and_code
Обе для Rider:
1. Ставим брейкпоинт, убираем глаку
Suspend execution и ставим Evaluate and log, пишем переменную или текст лога. Теперь в юньке будет выводиться лог. Огонь, никакого перекомпила.2. Ставим брейкпоинт и в окошке тыкаем на не привлекающую внимания надпись,
Convert to Unity pausepoint. Теперь Unity будет вставать на паузу в этом месте.#техничка@cat_and_code
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤7👍2
Когда заблокируют все мессенджеры — будем переписываться в экселе, как Келли Роуланд в клипе “Nelly - Dilemma”. Ой наверное таких стариков тут нет которые вспомнят клип 👴
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12🤣6⚡3