Сообщество - IT минувших дней
Добавить пост

IT минувших дней

1 023 поста 7 122 подписчика

Популярные теги в сообществе:

Как мы делали мобильные java игры. Привет 2007 год

Всем привет. Ни для кого не секрет, что лет 15 назад появление кнопочных (тогда ещё) сотовых телефонов с цветными дисплеями, а также новыми мультимедийными возможностями изменило нашу жизнь. Игры на тех телефонах, по сравнению с современными, выглядели очень примитивно. Вот, например, игра Bounce на телефоне, которую многие помнят:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Фото взято из английской Википедии. Но всё же эти простые, с виду, игры должны были как-то создаваться. Для этого в начале 2000 года компанией Sun Microsystems (ныне Oracle) была начата разработка мобильной платформы J2ME, профилей MIDP и CLDC. Задачи ставились простые: развернуть возможность начинающим разработчикам быстро приступать к созданию новых игр и получению за это коммерческой выгоды.
Вспоминается чья-то недавняя фраза из комментариев на Пикабу:
- Что вы знаете о бесполезных профессиях? Расскажите об этом J2ME программисту!
Собственно, вопрос: а как эти самые игры разрабатывались, из чего они состоят?

Каждая игра состоит из системной информации, кода и ресурсов. Первая вещь чисто формальная, а вот вторая и третья нам интересна. Рассмотрим на примере всё той же игры Bounce от Nokia.

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

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

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

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Да, выглядит не особо интересно. Но, если вглядеться, то видно, что разнообразие у значений небольшое - 00, 01, 1D, иногда 6E и прочее. К каждому из этих значений в коде игры ассоциирован свой объект (картинка, фигурка или сущность), которые потом игра расставляет в указанном порядке и формирует тем самым игровое поле или уровень.
Теперь, непосредственно, код. В файле игры содержатся т.н. классы, в них-то и описана сама структура игры и осуществляемые ей действия. Вот, например, таковые в архиве с игрой:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

В данном случае игра не была подвергнута т.н. обфускации. Зачастую в 99% всех игр эти классы выглядят уже так:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Т.е. в процессе обфускации названия классов и всех переменных теряются и заменяются на набор букв по алфавиту. Это выполняет две функции: во-первых, уменьшается размер итоговой игры или программы (самая большая по количеству классов j2me программа, на моей памяти, это J2ME SDK - содержит 447 классов), во-вторых, обеспечивает защиту от вмешательства шаловливых ручек навроде моих - разобраться в этом наборе однотипных наименований уже очень сложно - и не всегда поймешь, что имел ввиду автор в том или ином классе. Знает это только лишь он сам. Но вернёмся к нашей игре. Если открыть любой класс, увидим мы немногим отличное от того, что увидели в файле уровня.

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

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

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

Итак, декомпиляторы. Знакомьтесь, их был с десяток: JD, JAD, Mocha, DJ, JD-Core и выпущенный последним и на текущий момент самый совершенный: Fernflower. Файл fernflower.jar можно найти в сети. Чтобы получить исходный код из байт-кода, необходимо сам файл скормить декомпилятору. В данном случае делается это просто: создаётся папка и пишется в командной строке, что делать программе.

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

И мы получим примерно следующее:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Т.е. вполне читаемый код. В нём уже можно разобрать, что имеется ввиду под каждым действием и для чего нужна каждая переменная.
- Кстати, этот код всё же частично обфусцирован - например, видно переменные с именами var2, var3 и т.п. в оригинальном коде они часто называются типа CurrentBallX, CurrentHeight и др. для того, чтобы можно было понять суть этой переменной.

Но: иметь читаемый код, это не значит иметь рабочий код. В данном случае, с вероятностью в 99% (если программа сложнее HelloWorld) будут также содержаться ошибки декомпиляции. Вызваны они тем, что декомпилятор не всегда понимает, что имеется ввиду автором или самим компилятором. Хотя файл из fernflower на выходе имеет минимальное количество этих ошибок.
У нас теперь есть исходный код игры. На самом деле с этого этапа всё и начинается. Программист в оригинале пишет весь этот код "из головы", т.е. создает и забивает все переменные, классы и методы с нуля.

Теперь перенесёмся в 2007 год. Допустим, вы написали исходный код игры и решили собрать её, чтобы потом отправить на продажу на свой сайт, предложить компании-издателю и т.п. А для этого что вам нужно? Вам нужен компилятор кода и сборщик. В совокупности всё это называется SDK, как и на десктопных вариантах программирования. В качестве IDE с подключаемым java-компилятором можно было использовать Eclipse, NetBeans с дополнительными библиотеками под мобильную версию. А собирать потом или вручную, или внеся свои правки в сборочный скрипт. Но мы рассмотрим один из самых простых вариантов: Для J2ME тоже была своя SDK - которая называется WTK. Последняя версия 2.5.2 была выпущена в сентябре 2007 (том самом, который по мнению многих сгорел). Потом к ней было ещё небольшое дополнение. Вот главное окно программы приветствует нас:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Программа не имеет своего внутреннего редактора кода и на борту лишь простенький эмулятор (который нашу игру не потянет - т.к. написана она была под Nokia). Поэтому для корректной работы нам понадобится следующий софт:
- Сама WTK 2.5.2_01 (небольшой патч 2008 года)
- Java JDK и JRE версии 5.0 (под неё была рассчитана последняя версия WTK)
- Редактор кода (я использую Notepad++, можно блокнот или что удобнее)
- Эмулятор (лучше всего подходит KEmulator Lite v 0.9.8,  разработка которого также была заброшена в 2008 году, но на текущий момент он самый проработанный из всех и тянет большинство моделей телефона).
Создаем проект: нажимаем New Project, указываем параметры приложения и путь к главному классу (с которого всё начинается):

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Больше ничего не требуется. Окно конфигурации можно просто закрыть, теперь у нас в папке пользователя создана папочка для репозитория приложения:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Общий путь: %папка пользователя%\j2mewtk\2.5.2\apps\
Теперь, чтобы собрать игру, надо наши ресурсы (картинки и уровни, описание меню на разных языках - в крупных компаниях за разработку каждых из них отвечал свой человек) закинуть в папку res. В папку res идёт все кроме META-INF (её программа создаст сама) и, собственно, классов приложения. Классы закидываются в src с сохранением пути.

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Содержимое папок src и res. Теперь пробуем собрать игру. Нажимаем кнопку "Build". И видим:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

А вот и пошли наши первые ошибки. Сразу аж 12 штук. Теперь уже надо включать голову и разбирать, что же там не так. Начнём по порядку. Откроем строку с первой ошибкой (623) и видим следующее:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

На этой самой строчке компилятор в операцию побитного И почему-то засунул японский иероглиф 'ソ'. Понятное дело, что такого быть не может: цифру нельзя объединить с иероглифом. Но с чем же можно? Получим числовой код иероглифа:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

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

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Пробуем собирать:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Теперь ошибок стало.. внимание.. 39! Но ничего страшного в этом нет. Это нормальная практика компилятора - сначала отсеиваются более важные ошибки, затем менее важные. Если разобраться в причине, выясняется, что ругается на то, что не удалось найти некоторые методы, находящиеся в классах, в пакетах, таких как как com.nokia.mid.sound, com.nokia.mid.ui и других. Собственно, а этих классов то тут быть и не должно - они уже содержатся в исполняемой среде (телефон Nokia).

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Либо они добавлялись (в те самые золотые года) разработчиками платформ в IDE под конкретные модели телефонов. Кстати, отсюда пляшет несовместимость игр для j2me - именно по этой причине игры от Нокии могли не идти на Сименсе или Эриксоне (вторая причина - разные коды клавиш). Всё зависело от разработчиков и этих самых классов. Но и нам их надо где-то взять для успешной компиляции, т.к. выполнять замену на аналоги из JSR-135 слишком долго. Воспользуемся библиотеками от KEmulator: идём в папку программы, затем папка libs и там есть файл third-party.jar. Копируем его в папку libs нашей программы (в wtk), и удаляем лишнее от других моделей телефонов:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Получили маленький файлик весом в 4 Кб. Можно компилировать:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Теперь осталась одна единственная ошибочка. Снова лезем в исходник:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Компилятор ругается на эту самую строчку. Причем ошибка то и не совсем в ней самой. Тут делается следующее: буфер должен изъять из массива типа Vector какие-то значения и передать их в родительский метод drawImage. Ошибка возникает из-за несовместимости типов: метод drawImage принимает Image, int, int, int, а наш неправильный код, получается, пытается всунуть во 2 и 3 поле объект Integer. Исправляется это тем, что нам нужно забрать значение var2 и var3 из объекта Integer непосредственно. Делается это просто - добавить преобразование типов. Для этого есть метод intValue(). И теперь всё скомпилировалось без единой ошибки:

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Поздравляю, мы получили то, что у нас и так было. Вернее, того, чего не было - работающий исходник. Чтобы теперь превратить это игру, к классам нужно добавить ресурсы и это дело собрать. Собирается всё в два клика: Project -> Package -> Create Package. Теперь появились файлы jar и jad в папке bin проекта. Но перед запуском надо сделать ещё кое-что: т.к. мы добавили библиотеки для компиляции, эти самые библиотеки из готового пакета нужно выпилить (в случае подписи приложения сертификатом это надо сделать до подписи). Удаляем библиотеки от nokia, иначе они будут переопределять методы исполняемой среды, а у нас в данном случае это просто интерфейсы, они нам для работы программы не нужны.

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

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

Как мы делали мобильные java игры. Привет 2007 год Программирование, Java, Java игры, Мобильные телефоны, Верните мой 2007, Длиннопост

Артефакты в данном случае вызваны эмулятором (неполной поддержкой тех самых нокиевских методов), а не искажением исходника. На телефоне графика работает отлично. Вот таким вот нехитрым образом производился процесс создания игр в те годы. Я немного застал те времена, хотя и не удалось применить полученные знания на практике ибо всё было вскоре замещено Android и iOS, сама суть при разработке осталось той же, но отдельные элементы реализуются иначе. Надеюсь, теперь вы представляете весь тот труд, что был потрачен на создание java-игр в ту эпоху. Но, всему своё время.
Исходники программы после написания поста были удалены и я не рекомендую получать их образом, описанным в посте.
Всем спасибо, с вами был Kekovsky.

Показать полностью 24

На заре IT...

На заре IT... Криминал, СССР, Длиннопост

Газета "Труд", 1 ноября 1987 года

Показать полностью 1

Windows 3.1 - установка, игры, сеть, софт и многое другое (Old-Hard №90)

Рассматриваем Windows 3.1 со всех возможных сторон: установку с 3.5-дюймовых дискет, настройку драйверов, игры, софт, выход в интернет и многое другое.

Запуск winnt 5- через winload.exe

В одной статье (ссылка снизу) говорится что можно загрузить winxp через winload.exe, от win vista beta1, так-как тот не проверяет цифровую подпись. Думаю с тем же успехом можно загрузить winnt3.51 через winload.exe, с помощью bootmgr, в место ntldr.

Для нормальной работы с hdd хочу добавить Universal ATA driver for Windows

От сюда: https://alter.org.ua/ru/soft/win/uni_ata/

Туда-же я добавлю видеодрайвер supervga

От сюда: https://bearwindows.zcm.com.au/winnt351.htm

И получим nt+

Весь этот цирк хочу засунуть в исталлятор winvista с помощью программы nlite, а сам инсталятор с помощью restorator'а подогнать под стиль winnt3.51.

Нужен лиж winload.exe из beta1 версии windows vista, может кто знает где найти, с winload.exe из win7 ничего не вышло, ошибка цыфровой подписи.

Статья: https://www.betaarchive.com/forum/viewtopic.php?t=9602

I T Ёлка

Айтишники нашей мельницы - очень креативные человеки...
у нас есть соревнования, кто круче оформит свое рабочее место...

I T Ёлка IT, Новый Год, Креатив, Материнская плата, Длиннопост
I T Ёлка IT, Новый Год, Креатив, Материнская плата, Длиннопост
I T Ёлка IT, Новый Год, Креатив, Материнская плата, Длиннопост

Пойду думать как конкурировать с этим маленьким камином...
айтишники наши, тег мое

Показать полностью 3

Ответ на пост «Воспоминания о первом телефоне»

Выложил в порядке использования.
Самый первый конечно запомнился очень хорошо...
2003 год, трубка стандарта DAMPS, которая работала в любых ебенях (GSM далеко не сразу работал в лесу, на речке): Ericcson a1228d. Как он только не летал, падал с высоты! С него пыль вытрешь и всё. Только плата за входящие напрягала. Зато был городской телефон, у оператора, можно было с таксофона позвонить и попросить на определенный номер отправить СМС. Имхо именно эта услуга у нас помогла быстрее загнуться пейджерам. Таксофоны были бесплатные и их в городе еще хватало.

Далее Siemens, не помню откуда он у меня, но помню как потерял батарейку :)
С тех пор так и лежит :) Лет 15 уже, как память :)

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

А вот осенью 2005, или весной 2006 мне в руки попался Qtek S110.
Это была бомба просто! Коммуникатор с телефоном :)
Это ж почти компьютер! На работе комп под WinXP, а в руках трубка с WinMobile. У меня было просто сотни софта: мессенджеры, карты, файловые менеджеры, музыкальные проигрыватели, редакторы html, браузеры и прочее-прочее. Карта емнип была на 2 или 4Гб и была забита под завязку. Была куплена батарея расширенной емкости, bluetooth-гарнитура. Не хватало только wifi. Телефон этот у меня был очень долго. Сколько раз я его носил в ремонт - не счесть, в какой-то момент ремонтник отказался уже ремонтировать, ибо убил я трубу похоже окончательно.

Далее был безымянный "Windows PDA Mobile" с ebay, у него так же стояла мобильная винда, софт практически тот же, но он был мощнее s110, у него было больше оперативной памяти, но и качество было такое, что однажды перезагрузился и всё, ушел в страну вечной охоты.

А потом уже пошли первые iPhone, которые мы мучали софтом из cydia, и после уже телефоны поменяли свою индивидуальность, все стали одинаковые...

Помню как купил HTC HD2 и мне все говорили "нахрена такая лопата???".
Как оказалось, далеко не лопата )

Ответ на пост «Воспоминания о первом телефоне» Ericsson, Моторола, Мобильные телефоны, 2000-е, Воспоминания, Мат, Ответ на пост
Показать полностью 1

Воспоминания о первом телефоне

Всем привет! Как водится, на связи Уханов.

Сегодня продолжим ностальгическую тему.


На дворе примерно 2002 год, я учусь в 9 классе. Точно не помню, но не суть. Мой дядя отдаёт мне на растерзание свой мобильный телефон. Это был Ericsson A1018s — от собратьев того времени отличался лишь отсутствием поддержки русской раскладки. Я нашёл фото телефона именно той расцветки, что была у меня. Выла ещё вариация в синем цвете.

Воспоминания о первом телефоне Ericsson, Моторола, Мобильные телефоны, 2000-е, Воспоминания, Мат, Длиннопост

Фото с Авито


Характеристики

- Монохромный ЖК дисплей на 3 строки

- Зелёная подсветка

- Съёмные цветные панели

- Аккумулятор 650 мАч

- Будильник

- 12 мелодий


Будильник работал независимо от того, включён телефон или нет. Телефон не имеет вибровызова, но имеет клипсу для крепления к джинсам. Лютое было время. Поговаривали, что если носить его на поясе, то можно искривление позвоночника заработать. Справедливости ради скажу, что поговаривали о том, что Motorolla своим вибровызовом может ногу сломать, если в кармане носить. В верхней части был светодиодный индикатор — пока телефон ловил. Телефон имел функцию автодозвона.


Как оно было

Воспоминания о первом телефоне Ericsson, Моторола, Мобильные телефоны, 2000-е, Воспоминания, Мат, Длиннопост

Как это было? Охуенно это было! Даже не знаю как передать. СМС пишешь транслитом, я думал им и мгновенно его понимал. Да что там писать транслитом — мы на нём сокращали. Ведь смс были платными, да ещё и в долларах: 0,05$, если мне не изменяет память. Про интернет через WAP я тогда не знал, да и не было его ещё скорее всего.


Мелодии звонка

Собственно телефон обладал некоторым набором мелодий звонка в количестве 12 штук. Одну мелодию можно ввести вручную с помощью кодов. Помните эту тему? Мелодия вводилась при помощи нот в коде RTTTL (Ringing Tones Text Transfer Language). Каждый производитель кодировал ноты по-разному.


Например, код мелодии «Чижик-Пыжик» для Erisson выглядит так: +e+c+e+c+f+e+D gggab+c+c+Cp. В то время, как на большинстве телефонов Motorola будет так: 3 E2 C2 E2 C2 F2 E2 D4 G-2 G-2 G-2 A1 B1 C2 C2 C4 R2. Популярный в то время «Бумер» выглядел у меня так: g#AP #aGP+c#a+c#a+c#a+c#a+c+D.

Оставлю несколько ссылок на замечательные сайты:

http://pushkinnn.narod.ru

http://jabx.narod.ru

http://sk8er-nk.narod.ru/enciklopedy.htm

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


БиЛайн

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

Воспоминания о первом телефоне Ericsson, Моторола, Мобильные телефоны, 2000-е, Воспоминания, Мат, Длиннопост

Стоимость услуг связи на тот момент измерялась в условных единицах (долларах). У меня был БиЛайн с тарифом Би+GSM.

Воспоминания о первом телефоне Ericsson, Моторола, Мобильные телефоны, 2000-е, Воспоминания, Мат, Длиннопост

Фото сделано в Москве. 2019 год


Особенности тарифов были следующие:

- Звонки в вечернее/ночное время дешевле.

- Входящие платные.

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

- Звонить внутри сети и внутри своего региона было дешевле.

- Посекундной тарификации не было, но первые 5 секунд не тарифицировались.


Мысли о большем

Как-то мама принесла мне работы инструкцию от телефона Motorola. Я читал инструкцию и удивлялся написанному. Там говорилось о переключении раскладки клавиатуры, настройке словаря Т9, чёрно-белые логотипы.

Воспоминания о первом телефоне Ericsson, Моторола, Мобильные телефоны, 2000-е, Воспоминания, Мат, Длиннопост

Если мне не изменяет память, то речь там шла об одном из Motorola на картинке.

Воспоминания о первом телефоне Ericsson, Моторола, Мобильные телефоны, 2000-е, Воспоминания, Мат, Длиннопост

Если мне не изменяет память, то речь там шла об одном из Motorola на картинке.


Пост является копией заметки из моего блога.

Показать полностью 6

Поиграем в бизнесменов?

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

СДЕЛАТЬ ВЫБОР

Рэйчел и Чендлер рассказывают как пользоваться Windows 95

Рэйчел и Чендлер рассказывают как пользоваться Windows 95 Сериал Друзья, Чендлер Бинг, Мэттью Перри, Windows 95, Креативная реклама, Дженнифер Энистон, Рейчел Грин, Видео

По сюжету Рэйчел и Чендлер (в ролике они представляются их собственными именами, но ведут они себя как персонажи сериала "Друзья") приходят в офис Майкрософт, чтобы сняться в видео-руководстве к Windows 95. Пока Билл Гейтс задерживается их знакомят с основными фишками новой винды: меню "пуск", plug and play, корзиной, правым кликом и игрой 3D Pinball.

Скопипастил отсюда https://dtf.ru/avi/284848-dzhennifer-eniston-i-mettyu-perri-...

Показать полностью 1 1
Отличная работа, все прочитано!