Вступление
Всем привет! Недавно я решил "вспомнить молодость" и поиграть в Gravity Defied на своем телефоне. Нетрудно было найти порт этой некогда культовой игры на более современные платформы. Изначально написанная на J2ME, она быстро завоевала популярность у школьников прошлого десятилетия. Простейший геймплей (мотоциклист, преодолевающий различные трассы с высокими горами и глубокими ямами), замечательная физика (возможность вращения в воздухе) и простота модифицирования — вот секрет успеха Gravity Defied. И я мало того, что просто просиживал часы за прохождением новых дополнений, так еще и зарабатывал на помощи менее мастеровитым игрокам! Это уже позже пришло время миссии с вертолетом в GTA Vice City, трудностей Far Cry и HOMM 3...
Немного предыстории
И вот она снова на моем аппарате! Конечно, не оригинал — лишь ремейк для Android, но великолепная атмосфера передана в полном объеме. Игра настолько увлекла меня, что я представлял гордого мотоциклиста каждый раз, когда видел какую-нибудь ломаную линию, похожую на трассу из GD. После очередного контеста на Codeforces я сидел, ожидая пересчета своего рейтинга, смотрел на график в своем профиле... Да, ну и как вы догадались, у меня родилась идея использовать этот график в качестве уровня. Захотелось пережить вновь все успехи и неудачи, накопленные за полтора года пребывания в среде спортивного программирования...
Разработка
Одним прекрасным уже летним вечером я сел писать код и осознал, что не смыслю абсолютно ничего ни в моддинге в целом, ни в особенностях структуры Gravity Defied. Полез, естественно, бороздить просторы интернета в поисках необходимой информации. Узнал для начала, что в разных версиях GD для Android (есть официальная от Codebrew и неофициальная от разработчиков ВКонтакте, которая лично мне больше нравится) используется разный формат для файлов уровней. И если .gdlevel для официальной дался легко (Используется крайне подходящий для такого формат JSON), то вот с .mrg из неофициальной (также он использовался в той самой J2ME-игре) пришлось помучиться. Дело в том, что форумов, с которых можно что-то вытащить, очень немного (я нашел всего один и еще одну полезную вики). И когда наконец перевел всю информацию, написанную там, с лунного на понятный мне язык, ушел реализовывать. Небольшой скрипт на Python 3, получая через Codeforces API список проведенных раундов для указанных пользователей, создает список точек трека по изменению рейтинга и времени между соседними раундами. Использует только встроенные библиотеки (os, sys, time, urllib, json). Работает из консоли, притом может считывать ники, как из файла, так и из командной строки. Советы по установке и сам скрипт можете найти здесь.
Немного скриншотов результатов работы скрипта:
О найденных багах в скрипте и неточностях в данном посте пишите, пожалуйста, в личные сообщения.
Удачи и приятной игры!