Pull to refresh

King's Bounty III: расширенный римейк оригинальной игры под DOS на Javascript/HTML5

Reading time 5 min
Views 59K

Предпосылки и философские размышления


Как и у многих моих коллег по программистскому цеху, особенно у тех, кто рано начал пробовать свои силы в области компьютерных технологий, у меня где-то на задворках сознания хранится набор самых тёплых и романтических воспоминаний о первых опытах. Когда-то, в далёком 1987 году, отец впервые взял меня в выходной к себе на работу, где торжественно усадил на стул перед гудящей «Искрой-1030-11». Примерно тогда я твёрдо понял, чем хочу заниматься в своей дальнейшей жизни.

image

В наши дни, запустив DOSBox, можно без особого труда окунуться в аромат беззаботного детства, вспомнить то прекрасное ощущение детского всемогущества, головокружительного интереса, волнующих новых знаний и умений. Сейчас мне 34, под моим началом работает больше сотни человек, я по-прежнему пишу достаточно много кода — особенно там, где требуется применение сложных алгоритмов для интеллектуальной обработки данных. Позади — в арсенале студенческих достижений — финал ACM'овской олимпиады, победы моего шахматного движка в ex-USSR-чемпионатах, один из алгоритмов на поисковых деревьях, названный моим именем, сотни тысяч строк моего кода в проде, но ничто не приносит такой радости и не вдохновляет так, как возврат в беззаботный мир детства.

Лет 10 назад мне в руки попал эмулятор БК-0010-01 — моего первого домашнего компьютера. Тогда стоило огромного труда не начать программировать под него. Однако в этот раз очередная волна ностальгии всё-таки сподвигла меня на весьма бессмысленный шаг, оправданием которому может стать разве что то чувство эмоционального подъёма, которое я испытал, завершив своё безумное предприятие — изготовление римейка/сиквела King's Bounty — древнего прародителя всех игр линейки Heroes of Might & Magic.

В общем-то, это секрет Полишинеля, что время программистов-одиночек прошло. Герои-одиночки остались в 90-х, когда в условиях отсутствия Интернета и большого объёма специализированной литературы, а также в атмосфере нехватки вычислительных ресурсов, очередной левша ловко выкраивал в короткие сроки 7 шапок из шкуры неубитого медведя. Сегодня труд программистов в большинстве случаев коллективный, и успех разработчика в куда большей мере зависит не от алгоритмических знаний и технологических умений, а от способности быстро найти необходимую информацию и коммуникационных скиллов (в т.ч. способности писать хорошо читаемый код соответствующий заданным требованиям).

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

Конечно, в моём случае проект чисто развлекательный — нет никаких идей по поводу монетизации, да и в случае подобного «подпольного» римейка она вообще вряд ли возможна. Задача сильно упрощалась тем, что львиная доля игровой графики и логики была позаимствована из оригинальной игры. В этом плане очень помог брошенный в настоящее время проект OpenKB (http://sourceforge.net/projects/openkb/), автор которого проделал большую работу по реконструкции оригинальной игровой логики и анализу форматов данных оригинальной игры. Мануалы, написанные автором этого проекта, а также несколько других любительских мануалов, найденных в сети, позволили серьёзно сэкономить силы.

Технологии


С самого начала была сделана ставка на кроссплатформенность, а поскольку в отношении Javascript и HTML5 таковая титаническими усилиями разработчиков к настоящему моменту более-менее достигнута, особой альтернативы при выборе языка разработки, в общем-то, не было.

Конечно, есть ряд языков транслируемых в JS и обладающих некоторыми преимуществами, но желания создавать лишний слой в небольшом проекте не возникло. Кроме того, в силу распространённости JS всегда можно рассчитывать на то, что любую задачу, которую потребуется решить в ходе работы над проектом, кто-то уже решил до тебя, великодушно предоставив фрагменты кода на всеобщее обозрение.

В силу сравнительной простоты игрового интерфейса оригинальной игры было принято решение отказаться от использования каких-либо тяжеловесных игровых фреймворков. Из библиотек использовалась только jQuery (в принципе, можно было бы обойтись и без неё — фактически понадобились только $.inArray, $.trim и работа с триггерами событий браузера; честно говоря, пугали возможные проблемы кроссбраузерности как раз в отношении событий, поэтому jQuery была всё-таки оставлена в проекте).

Графика и музыка реализовывались при помощи стандартных механизмов HTML5 (Canvas, Audio). Стандартных методов Canvas более чем достаточно для реализации спрайтовой графики с минимальными трудозатратами. Audio же предоставляет всё необходимое для снабжения игры звуковыми эффектами. Все требуемые сниппеты легко обнаруживаются на stackoverflow при помощи простых запросов, так что некоторого опыта практического программирования в современной экосистеме разработки вполне хватит для того, чтобы разобраться во всех технологических нюансах за один-два вечера.

Ход работы


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

Отдельного внимания заслуживает работа над логикой сохранения в игре. Здесь я поддался ещё одной своей слабости — любви к алгоритмам сжатия данных, поэтому сэйвы пакуются при помощи встроенного алгоритма сжатия (словарный + LZW с динамическим битовым выравниванием). Прибегая к ретроспективной рационализации, оправдаю это желанием экономить место на мобильных устройствах (распакованный сэйв всё-таки тянет больше чем на сотню килобайт), а также стремлением хотя бы немного разнообразить жизнь читеров.

Графику из оригинальной игры я уже однажды добывал в конце 90-х, когда написал на C версию KB, включающую только бои (с расширенным набором магии и другими развлечениями). Правда старый код погиб вместе с умершим винтом ещё в 1999-м, но я примерно помнил что и где брать. Дополнения были дорисованы при помощи Pixlr и найденных в сети картинок, взятых за основу. Одну из картинок помогла обтравить моя невеста, так что строго говоря над игрой работал не только я.

Музыка — подборка подходящей по смыслу бесплатной классики из сети, звуковые эффекты — записи из оригинальной игры DOSBox -> Audacity, либо немного обработанные бесплатные сэмплы из http://freesound.org.

От половины до 3/4 времени занял кодинг — в полученном проекте немногим менее 12 000 строк (не считая jQuery) (380 килобайт скрипта). Остальное — написание игровых текстов (их, в отличие от оригинальной игры, заметно больше, кроме того игра двуязычная), а также тестирование.

Результат


Механика игры в основных чертах повторяет механику оригинальной игры — формулы атаки, магии и т.д. полностью соответствуют оригиналу. Также из оригинальной игры взяты графика (дополнена небольшим количеством новых объектов) и карта первого материка (с минимальными изменениями). Сюжет заметно расширен, материков не 4, а 5, при этом вторая карта имеет больший, чем в оригинальной игре, размер. Добавлены разного рода шуточки, секреты, новые повороты сюжета. Тестировалась всё хозяйство на Chrome, FF, Edge, IE, мобильной версии IE.

Буду благодарен за нахождение багов, советы по развитию проекта и вообще любые отзывы.

Адрес страницы с игрой: http://genes1s.net/kb/game.html.
Tags:
Hubs:
+58
Comments 116
Comments Comments 116

Articles