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

В наши дни, запустив 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.