Создаем уровни для Gravity Defied из графика рейтинга Codeforces

Revision ru5, by awoo, 2015-06-25 22:51:01

Вступление

Всем привет! Недавно я решил "вспомнить молодость" и поиграть в 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). Работает из консоли, притом может считывать ники, как из файла, так и из командной строки. Советы по установке и сам скрипт можете найти здесь.

Немного скриншотов результатов работы скрипта:

О найденных багах в скрипте и неточностях в данном посте пишите, пожалуйста, в личные сообщения.

Удачи и приятной игры!

Tags gravity defied, codeforces, python

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en5 English awoo 2015-06-26 08:52:35 41
ru5 Russian awoo 2015-06-25 22:51:01 0 (опубликовано)
en4 English awoo 2015-06-25 22:47:19 68
ru4 Russian awoo 2015-06-25 22:46:50 10
en3 English awoo 2015-06-25 22:42:40 197 Tiny change: 'ain...\n\nDevelo' -
en2 English awoo 2015-06-25 21:35:34 2608 Tiny change: '24422694/36ac0/8jKq7pMzPOc70dd/wU1hi' -
ru3 Russian awoo 2015-06-24 22:41:34 2804 Мелкая правка: 'e=
ru2 Russian awoo 2015-06-22 21:41:55 511 Мелкая правка: 'github).\n![ ](htt' -
en1 English awoo 2015-06-22 19:41:19 1976 Initial revision for English translation
ru1 Russian awoo 2015-06-22 19:35:53 2100 Первая редакция (сохранено в черновиках)