Одно из моих главных увлечений в жизни — видеоигры, преимущественно старые. Я большой энтузиаст ретро-компьютеров и игровых консолей, много лет занимаюсь самыми разнообразными делами в этой области. Кто-то знает меня как разработчика игр, кто-то — как демосценера, кто-то — как чиптюн-музыканта, разработчика музыкального ПО, железных самоделок, и так далее.
Но далеко не все проекты и моя роль в них известны широкой публике. Пожалуй, один из самых интересных — версия игры Jim Power от Piko Interactive, созданная для 8-битной игровой консоли NES (Famicom, Денди). Я занимался им в 2014-2020 годах в качестве приглашённого разработчика.
И хотя это дела давно минувших дней — начинался проект две исторических эпохи назад — проекты такого калибра в своей нише до сих пор случаются не так уж часто. Настало время хотя бы в общих чертах рассказать историю этого проекта, одной из первых любительских разработок, попытавшихся замахнуться на уровень лучших коммерческих игр прошлого.
Если вы когда-либо хотели узнать, как и кем делаются современные игры для несовременных платформ, каким образом люди вообще приходят к этому — сейчас всё будет.
▍ Что ты такое?
Серию игр Jim Power издавала французская компания Loriciel. Хотя она существовала довольно долго, в 1983-1995 годах, и выпустила несколько десятков игр, большинство из них не особо известны. Самые заметные проекты — это как раз Jim Power, а также игра Best of the Best: Championship Karate (в девичестве Panza Kick Boxing), версии которой существуют на множестве платформ.
Игровой процесс оригинальной версии игры на Amiga 500
Первая игра серии, Jim Power in «Mutant Planet», вышла в 1992 году на домашних компьютерах Commodore Amiga, Atari ST и Amstrad CPC. Через год она добралась до игровых консолей, в виде эксклюзивной японской версии для PC Engine CD, где слегка потеряла в графике, но приобрела перезаписанный в CD-качестве саундтрек.
Далее серия имела довольно странное развитие. В 1993 году вышла игра Jim Power: The Lost Dimension in 3D для Super Nintendo и MS-DOS. Это не совсем продолжение, а скорее перезапуск первой игры с различными изменениями, которые, помимо прочего, включили совершенно другой дизайн главного героя, хотя он и продолжал носить то же самое имя.
Обложки оригинальных изданий игры для разных платформ
Изменчивость внешности основного персонажа стала одной из заметных особенностей серии, так как помимо использования спрайтов радикально разного дизайна в игровом процессе, весьма вольное обращение с материалом допускали и оформители обложек физических изданий для разных платформ. В результате трудно найти двух похожих Джимов.
Логотип Digital Concept
Фактическим разработчиком являлась небольшая французская компания Digital Concept, также известная как VD-dev. Компания была основана в 1990 году Фернандо Велезом и Гиллиамом Дюбайлом (отсюда буквы VD, Velez-Dubail). Идея оригинальной игры была придумана ими же, они же выполняли и разработку — Дюбайл рисовал, Велез писал код. Музыку для всех версий написал приглашённый композитор, немецкий гений чиптюна — Крис Хюльсбек (Cybernoid, Turrican), что стало главнейшим, если не единственным достоинством игры.
Саундтрек в версии для PC Engine CD
Сама игра представляет из себя платформер с крайне странным набором уровней, дизайном врагов, и весьма непредсказуемым поведением всего, что только появляется на экране. Описать происходящее можно одним словом — суета. К тому же оригинальная версия игры содержала всего три уровня, зато исключительно большой продолжительности каждый, разбавленных парой полётов на джетпаке в режиме скролл-шутера.
Игровой процесс версии Lost Dimension для Super Nintendo и мозговыносящий эффект Пульфриха
Версия Lost Dimension вернула игре потерянное измерение — в ней был реализована визуальная иллюзия, известная как эффект Пульфриха. Часть слоёв параллакса заднего фона двигалась в «неправильном» направлении, обратном направлению движения. Если смотреть на экран через прилагающиеся к этой версии игры очки, у которых одно очко прозрачное, а другое немного затенённое, возникает иллюзия стереоскопической глубины. Без очков же это смотрится просто как очень странный параллакс. Что в очках, что без них, этот эффект очень сильно мешает играть и натурально вызывает головную боль.
Новые уровни в версии для Super Nintendo
Также Lost Dimension стала ещё более суетливой и сложной. Разнообразие было увеличено: к полётам на джетпаке добавились полёты на космическом корабле. Также появились уровни с видом сверху, в версии для SNES обладающие эффектом вращения камеры с применением Mode 7, в точности как в Contra III: The Alien Wars, вышедшей годом ранее. В версии для MS-DOS такие уровни тоже есть, но без вращения.
Суммируя вышесказанное, Jim Power — довольно посредственная игра с неплохой графикой и великолепной музыкой, более-менее играбельная в версиях для Amiga и Atari ST. Из-за общей посредственности и сложности игрового процесса она не достигла высот известности и не получила большого признания среди игроков, но как минимум из-за великолепной музыки смогла сохраниться в памяти поклонников на многие годы.
На этом история вроде бы и закончилась. Но потом продолжилась.
▍ Джим возвращается
В конце 1990-х годов на пиратских картриджах для Sega Genesis стала встречаться игра Jim Power: The Arcade Game от той же Loriciel, датированная 1993 годом. Фактически это была такая же игра, что и на SNES, только без уровней с видом сверху. Странным образом на протяжении всей игры звучал один и тот же музыкальный трек.
Бета-версия игры для Sega Genesis, выходившая на пиратских картриджах
Тогда это не вызывало особых подозрений — каких только глюков не встречалось в пиратских версиях. И только с приходом интернета выяснилось, что это была утекшая в сеть бета-версия, а сама игра хотя и была практически завершена, не издавалась официально.
В 2010-х годах компания Piko Interactive, занимающаяся поиском и переизданием игр категории Б, я бы даже сказал — категории Г, получила от Фернандо Велеза эксклюзивные права на серию, включая издание старых версий и, возможно, создание новых игр. В этих целях была запущена кампания на Кикстартере, собравшая 63 с небольшим тысячи долларов.
Страница на Кикстартере
План включал переиздание версий для SNES, PC Engine CD и Amiga CD32, а также полноценное издание финальной версии для Genesis, которая была получена от Loriciel. В версиях для SNES и Genesis эффект глубины был переделан на более традиционный простой параллакс, не так выносящий
Дополнительной опцией плана, вишенкой на торте Кикстартер-кампании, была разработка совершенно нового 8-битного порта игры, для популярной в мире и у нас игровой консоли NES (наша Денди). Тут в истории Джима появляюсь я.
▍ Джим и я
Я увлёкся видеоиграми в начале 1990-х, и так получилось, что это задало направление всей моей последующей жизни. До этого я занимался радиоэлектроникой, собирал мультивибраторы и приёмники, и не особо засматривался на компьютеры, потому что только читал о них в научно-технической прессе, а в реальности это были недоступные магические артефакты на витринах стоимостью в несколько месячных зарплат взрослых.
Первые игры, в которые я играл: Chase H.Q., Star Wars, Dark Star Interceptor, Ms.Pac-Man, Nebulus, Pro PowerBoat Racing
Краткая первая встреча с ZX Spectrum в 1990-м году и появление у всех друзей Денди в 1993-1994 годах вызвали мой интерес к играм, а предыдущий опыт с электроникой подсказывал: если чего-то нет, это можно сделать своими руками. Именно это привело меня к компьютерам — я хотел делать игры, а программирование и прочее были постольку поскольку это было нужно для осуществления желания.
Мои Google и Stack Overflow в 1994-1996 годах
Компьютер вскоре удалось одолжить у друзей друзей (конечно же, это оказался Синклер), но информации, как и что делать, практически не было. Всему пришлось учиться по тем немногим крупицам, которые были доступны — инструкции по Бейсику издательства VA-Print и книжке МРБ по Радио-86РК: тогда я ещё не понимал, что компьютеры бывают разными.
Дальше ещё много лет, до наступления эпохи интернета, были новые игровые приставки по мере их появления: Sega Genesis, Super Nintendo, 3DO, PlayStation. Всё это было в основном по друзьям, а параллельно дома — ZX Spectrum. Так как единомышленников по интересу к созданию игр почти не встречалось, пришлось осваивать всё самостоятельно: и код, и графику, и сочинение музыки. Вдохновлялся во всём этом я, конечно, теми играми, в которые удавалось поиграть на продвинутых приставках. И одновременно учился ценить то, как кем-то сделан тот или иной элемент — например, запускать игру и доходить до определённого уровня только чтобы послушать мелодию в нём.
Появление Jim Power в моей истории случилось в конце 1990-х годов. Тогда это уже был своего рода ретро-гейминг — на дворе была эпоха PlayStation и Dreamcast. В силу обстоятельств в то время ко мне в руки попадало очень много игр для Sega Genesis, и среди них оказался Jim Power.
С единомышленниками по игре в несвежие игры было попроще: и я сам, и друзья играли во всё, что у меня появлялось, в том числе и Jim Power. Мы сразу поняли, что игра не очень-то хороша. Но очень хороша была музыка — это был трек Mutant Forest, и так как он звучал непрерывно, можно было никуда не доходить, а просто включать картридж и слушать, что происходило довольно часто. Этим и запомнилась игра. В эпоху эмуляторов мы также возвращались к игре, чтобы послушать эту музыку, даже записывали её с эмулятора, чтобы поставить на телефон. Таким образом в моём сознании игра закрепилась в статусе особенной.
Увлечение разработкой игр со временем привело меня к работе в индустрии. Но это было не то пальто — игры для спутниковых ресиверов, мобильных телефонов, КПК, Flash-игры, и тому подобное. Это были совершенно не такие игры, которые вдохновляли меня на создание собственных, и не тот вид творчества, к которому я стремился.
Всё это время я не терял интереса и к 8-битному ZX Spectrum, а на протяжении 2000-х, интересуясь эмуляторами старых платформ, сам занялся созданием таковых эмуляторов и понемногу набрался понимания внутреннего устройства этих самых платформ.
Помогая советом разным товарищам в области модификации и перевода старых приставочных игр, в какой-то момент я вдруг понял, что обладаю всеми необходимыми знаниями, чтобы делать игры для реальных старых приставок и компьютеров. Ретро-разработка тогда ещё не вошла в моду, но наглядный пример был уже давно: сайт AtariAge, где продавались новые любительские игры для Atari 2600, Atari 7800 и ColecoVision.
Мои собственные первые игры для NES: Lan Master, Lawn Mower, Alter Ego, Zooming Secretary
Я начал пробовать писать для MSX, ColecoVision, Sega Master System, Sega Genesis, Commodore 64 и PC Engine, и к началу 2010-х довольно плотно втянулся в разработку игр для NES. Так я наконец занялся в точности тем, к чему и стремился: разработкой именно таких игр, какие вдохновляли меня самого, и именно для той же самой платформы. И если раньше это не имело смысла, к тому времени это нишевое движение начало испытывать бурный рост (чему я сам немало помог в то время) — появилась и аудитория, то есть люди, которым подобные вещи могут интересны.
Некоторое время я делал разные мелочи для Piko Interactive, и в 2014 году мне был предложен самый серьёзный и интересный на тот момент проект: сделать порт Jim Power. Так как это было возможностью прикоснуться к чему-то, казавшемуся мне великим, я, конечно же, с радостью согласился. Тем более, что дело казалось не особо сложным: ну допустим, за год можно справиться.
Этими затянувшимися мемуарами я хочу обозначить, что NES-версия Jim Power по сути создавалась поклонником этой конкретной игры и видеоигр в целом, выросшем на подобных играх, на их стереотипах и паттернах. Если какой-то элемент покажется похожим на известную вам 8-битную игру — скорее всего так и есть, скорее всего именно ей я и вдохновлялся. В каком-то смысле это часть тренда, наблюдаемого сейчас в поп-культуре: римейки и продолжения культовых фильмов, создаваемые теми, кто восхищался ими в юности. Хорошо это или плохо — судить, конечно, зрителю.
▍ Раскопки
Так как больше работать было всё равно некому, и проект представляло делать в одно лицо, я запросил полный карт-бланш, который и был выдан. Это позволило мне делать не близкий порт оригинала, который выделяется своим весьма спорным геймплеем, а практически новую игру на базе элементов старой — на этот раз по возможности хорошую и играбельную.
Начало оригинального исходника версии игры для Amiga
От Loriciel был получен набор рабочих материалов, содержавших графику версий для SNES и MS-DOS в формате Deluxe Paint (*.lbm), исходный код версии для Amiga — 12 тысяч строк в одном-единственном файле (без ресурсов), и ещё некоторые мелочи. Из всего этого пригодилась только графика. Некоторые элементы, в основном графику и всю музыку, пришлось дополнительно извлекать из существующих версий игр.
Заготовки графики для Game Boy. Файл с персонажем назывался BUCK8
Из знакомства с рабочими материалами удалось узнать, что были какие-то движения в сторону версии игры для Game Boy, представленные полутора десятками графических файлов с графикой оригинальной игры, адаптированной в 4-цветный формат для маленького экрана. Впрочем, эта графика мне в порте никак не пригодилась.
Альтернативные титульные экраны
Также в рабочих материалах был представлен загадочный кусочек: не один, а целых два альтернативных титульных экрана игры, явно имеющих отношение к Jim Power. На одном из них присутствовало название Devil Worlds, на другом — Buck Rogers: The Arcade Game. Я могу предположить, что авторы планировали сделать некоторый ребрендинг, или в связи с авторскими правами — примерно в то время их пути разошлись, или для улучшения продаж.
Возможно, в Loriciel пытались получить более выгодную tie-in лицензию — как Sunsoft с их The Terminator, превратившийся в Journey To Silius. Хотя сам Джим не похож на Бака ни в какой из своих инкарнаций, общая атмосфера игры и идея называть её версии с подзаголовком, как мне кажется, довольно-таки в духе приключений Роджерса — не удивлюсь, если авторы именно им и вдохновлялись.
▍ Разработка
Получив шанс поработать над таким проектом, я решил ни много, ни мало — сделать лучшее хоумбрю для NES: с лучшей графикой, музыкой и геймплеем.
На тот момент это, впрочем, не было таким уж амбициозным планом, так как почти все хоумбрю того времени в лучшем случае представляли собой одноэкранные логические игрушки или поэкранные бродилки в духе игр для ZX Spectrum, самой крутой из которых считался Battle Kid. Мало кто замахивался на прокрутку уровня и сложную разнообразную графику. Нужный же опыт для совершения технологического рывка уже был накоплен, и основные средства разработки — кодовый фреймворк neslib, базовый графический редактор-конвертор NES Screen Tool, звуковой движок FamiTone — были подготовлены в рамках предыдущих проектов.
Разработка началась примерно в августе 2014 года, и к сентябрю 2015 года было сделано уже очень многое из запланированного. Однако, в процессе неоднократно возникали паузы, порой очень длительные, и чем дальше, тем дольше. Причины были самые разные: и нехватка контента для игры, и поиски дополнительных художников, и творческий кризис, и вопросы с авторскими правами. Таким образом завершение проекта постоянно переносилось, и в итоге дело затянулось практически на шесть лет. За это время я успел поработать над полутора десятками игровых проектов поменьше. Свои финальные черты игра приобрела к 2020 году, а последние правки были сделаны в июле 2020 года.
К сожалению, разработка практически не документировалась. Так как ожидалось, что проект будет сделан довольно быстро, велись только общие, очень краткие логи без дат. Поэтому восстановить сейчас периоды активной работы, и даты, когда именно были сделаны те или иные элементы, затруднительно. В чистом же времени реализация проекта вероятно заняла примерно ожидаемое время, год-полтора, а непосредственно активная часть моей работы любого рода — примерно 640 рабочих часов.
Я делал в игре весь код, конверсию фоновой и спрайтовой графики, новые уровни из фрагментов старых, новый геймплей, кавер-версии оригинальной музыки и дополнительные музыкальные фрагменты, звуковые эффекты, и планирование прочих работ — в общем, большую часть работы, с минимальным влиянием Piko на процесс.
Также на разных этапах к проекту привлекались пиксельные художники: Alp попытался нарисовать начальную заставку по эскизам, но не смог. Joe Vondayl попытался сделать то же самое, и смог. Также он улучшил кое-что из игровой графики — например, лицо Вапрака, финального босса. Некоторую чистку спрайтов делал NiO. Codetapper помог с извлечением графики из версии для Amiga, которая пригодилась для заполнения пробелов в контенте.
По прошествии лет я вижу в игре многие мелкие недочёты, и понимаю, что несмотря на задержку релиза, стоило бы потратить ещё пару месяцев на полировку. Впрочем, в первую очередь здесь сказывается недостаток тестирования — его проводил я сам и ещё пара человек, и не все проблемы были своевременно осознаны. Как водится, можно было сделать ещё немного лучше.
▍ Графика
Графика уровней и спрайтов для игры не перерисовывалась, а непосредственно конвертировалась из 16-битных версий. Для фоновой графики разрешение совпадало, но крайне специфические цветовые ограничения NES не позволяли сохранить хоть сколько-то похожую на оригинал раскраску. Поэтому графика разделялась на блоки и конвертировалась в четыре градации серого — для разных блоков выбирались разные настройки, чтобы сохранить нужные детали. Не все элементы конвертировались хорошо, поэтому выбирались те, которые получались лучше всего.
Исходная многоцветная графика элементов декораций уровня
Так как детализация графики в 16-битных версиях существенно выше, используется существенно больше тайлов для локаций, требовалось очень сильно оптимизировать набор элементов, примерно с полутора тысяч до 256. Это делало оригинальную идею с очень длинными уровнями нежизнеспособной — они получились бы крайне однообразными визуально.
Макет переработанного уровня, получившего номер 3-2, в исходной многоцветной графике
Поэтому уровни я решил сильно укоротить и переработать. Сначала была написана утилита, позволяющая получить из оригинального набора блоков 16 на 16 пикселей и бинарного файла с картой уровня одну большую картинку. Далее я нарезал полученные оригинальные карты на три коротких фрагмента каждую, перемешал различные части, убрал скучные моменты, и сосредоточил в каждой примерно равное количество узнаваемых графических элементов — в оригинале все они были распределены по уровням равномерно.
Переработка макета в 4-цветную версию с оптимизированным набором элементов
Карты уровней редактировались в обычном графическом редакторе, а не в каком-то специальном, простым копированием и перемещением блоков по сетке. Сначала были созданы макеты из оригинальной графики в оригинальном цвете. Потом готовились нужные детали в четырёх градациях серого, и карты вручную пересобирались в графическом редакторе в монохромный вариант. Далее с помощью самописной утилиты подсчёта тайлов выполнялись оптимизации, убирались лишние элементы — нужно было уложиться и в 256 графических элементов 8x8, и в 256 мета-блоков 2x2 элемента, для оптимизации размера данных карт.
Финальная раскрашенная карта в редакторе уровня
Далее был создан редактор уровней, на основе моего графического редактора NES Screen Tool. В нём выполнялась раскраска уровней — выбор атрибутов и палитр, редактирование пикселей блоков, подготовка фоновой анимации, разметка платформ (проходимые, пропрыгиваемые, опасные), расстановка врагов на уровнях. Также выполнялась и оптимизация, чтобы утрамбовать как можно больше интересных визуальных деталей в уровни, заменив ими менее важные — для этого предусмотрены инструменты анализа и замены.
Эволюция визуальной части первых трёх уровней игры: 2015, 2017 и 2020 годы
Первоначальная раскраска была довольно грубой, практически элементарные яркостные градиенты. Смотрелось плохо — я всё же не художник, но ближе к концу проекта я набрался опыта, и подобрал более сложные цветопереходы, в результате которых, а также непрерывной ручной подчистке конвертированных тайлов, получился вполне достойный результат.
В результате всех этих манипуляций уровни получались очень короткими, зато очень насыщенными событиями. Piko беспокоило это обстоятельство: он не хотел, чтобы игру можно было пройти слишком быстро. Частично это было компенсировано высокой сложностью — дань оригиналу и такой легендарной игре, как Ghosts & Goblins.
Процесс преобразования спрайта: исходный многоцветный, ужатый 4-цветный, заново прорисованны в четырёх цветах
Графика спрайтов также конвертировалась в четыре градации серого. Но так как ограничения по спрайтам на NES весьма строгие — на одной строке экрана не может отображаться более восьми спрайтов шириной 8 пикселей каждый — менялся и их размер. И конечно, было реализовано мерцание при превышении лимита спрайтов: оно необходимо, чтобы важные игровые элементы в такой ситуации не пропадали целиком, а были видны хотя бы раз в два-три кадра.
Изображение игровой ситуации на экране и два набора по 256 элементов 8 на 8 пикселей, из которых оно строится
Игра использует в режиме спрайтов 8x16, не очень оптимальный по расходу графических блоков, и более подверженный пропаданию (спрайты чаще пересекаются). Но иначе никак, площади стандартных спрайтов 8x8 не хватало бы для отображения всех нужных элементов, в частности героя и врагов, имеющих довольно крупный размер.
Сначала был выбран размер самого Джима из нескольких возможных вариантов. Соотношение его размера и размера элементов фоновой графики при этом были проигнорированы — этим было решено пожертвовать, так как фоновую графику переделать под новый размер Джима было бы практически нереально.
В результате Джим стал помельче, а также он сильно похудел, чтобы занимать как можно меньше аппаратных спрайтов в ширину. Размеры противников также были изменены под стать Джиму. Много времени и сил ушло на восстановление нормального внешнего вида, детали конвертированных и сжатых спрайтов заново прорисовывались вручную. Раскрашивались в нормальные цвета спрайты уже в самом конце проекта, в том же редакторе уровней, а до этого все противники бегали в одинаковой вырвиглазной палитре.
Процесс выбора размера Джима включал сопоставление с размерами спрайтов героев различных игр для NES
Анимации фона и спрайтов активно задействуют возможности маппера MMC3. Он организует два переключаемых окна по 128 тайлов и четыре окна по 64 тайла. Два больших окна отдано под фоновую графику, одно из них фиксированное — в нём располагается первая половина набора элементов графики уровня, а в другом переключается три вариации второй половины. Таким образом реализована анимация фоновых элементов, типа травинок и шипов.
Анимация большинства спрайтов также выполнена переключением наборов по 64 тайла. Один отдан под графику главного героя, другой — под основных крупных противников на уровне, третий — под слегка анимированные элементы типа бонусов и платформ. Это позволило получить очень плавную анимацию героя и противников, с одним очень существенным ограничением: все крупные противники меняют кадры анимации синхронно и не могут остановиться. Поэтому их движение порой выглядит странновато.
Ещё один фиксированный набор в 64 тайла задействован для более мелких противников, анимированных традиционным способом, переключением нескольких графических элементов внутри набора. Также в этот набор входят особые кадры крупных анимированных противников — например, кадр прыжка собаки или выстрела лучника.
▍ Оформление
Титульный экран игры делал я сам. Это, конечно, конверсия оригинального экрана версии для Super Nintendo, но её пришлось сильно переработать для попадания в атрибутную и тайловую сетки.
Титульный экран 16-битной версии для Super Nintendo и мой вариант для 8-битной NES
К сожалению, оказалось, что эффект параллакса на этом экране подпрыгивает на некоторых эмуляторах и на Денди. Так, конечно, быть не должно. На оригинальной NES и в точных эмуляторах сцена стабильна. Подпрыгивание связано с перезагрузкой палитры во время отображения экрана. Игра использует этот трюк повсеместно для увеличения количества отображаемых на экране цветов, а он крайне требователен к таймингам.
Отдельным пунктом хочется отметить анимированную начальную заставку. Думаю, все игроки оценили её визуальное богатство, а также сходство некоторых сцен с различными хитовыми играми. Также в игре есть и конечная заставка, даже не одна, но там дело ограничивается одной красивой картинкой.
Изначально вступительная заставка не входила в план. Но, помня свой игровой опыт, и как в своё время меня впечатляли подобные сцены в играх для Денди — Batman, все части Teenage Mutant Ninja Turtles, Battletoads & Double Dragon, Journey To Silius, Solbrain, Blaster Master, Choujin Sentai Jetman и многие другие — я настоял, что игре нужна крутая заставка. И хотя в итоге это обошлось Piko в копеечку, мне удалось убедить его вложиться в этот элемент.
Кадры заставок разных 16-битных версиях. Переменчива внешность не только самого Джима
Сначала я попытался нарисовать заставку своими силами, используя в качестве основы фрагменты графики из игры, а также заставки версий для Amiga и PCE CD, но моих навыков откровенно не хватало. В то время в комьюнити ярко проявлял себя человек с ником Alp, раз за разом анонсирующий разнообразные проекты для NES с очень хорошей графикой, ни один из которых, однако, не продвигался дальше статичных скриншотов. Видя опытного художника, мы попробовали привлечь его к решению нашей проблемы с заставкой. Но дело почему-то не пошло, и предварительные результаты, которые он выдал, оказались не на ожидаемом уровне.
Одна из версий моего сториборда, близкая к реализованной в итоге
Как я помню, сценарий заставки был придуман, ориентируясь на единственную версию оригинальной игры, содержащую заставку — для PC Engine CD. Свой сториборд я собирал скриншотов заставок любимых игр для Денди, и эта версия отличается от итогового варианта. Мне казалось, что его придумывал только я, но, разбирая архивы, я нашёл наше ТЗ для художников, и в нём — набросок в виде скана скетча на листе бумаги. Почерк на нём явно не мой, и таких тетрадок я никогда не использовал. К тому же текст выполнен в вопросительном ключе. Сейчас мне не удаётся вспомнить, кто именно сделал этот набросок. Возможно, это был сам Alp в процессе начального обсуждения.
ТЗ для заставки работы забытого мной автора
Примерно в мае 2015 года мы начали искать другого художника — точнее, по поручению Piko этим занимался я. Был дан клич на популярном тогда зарубежном форуме пиксельных художников, и я обработал порядка 10-15 отзывов. Но все отозвавшиеся не обладали необходимым опытом работы в имеющихся технических ограничениях, и хотя они предлагали очень выгодные цены и обещали быстро разобраться с (нетривиальными) требованиями, было ясно, что мы вряд ли получим то, что нам нужно — вопрос будет закрыт чисто формально, а не качественно, что было бы бессмысленной тратой сил и средств.
Также в конце мая мы попытались привлечь CastPixel, весьма высокооплачиваемую зарубежную пиксельную художницу. Сначала она согласилась на лояльных условиях, но потом отказалась, ссылаясь на занятость в других проектах. Мы было приуныли, но оказалось, что зря.
Более пристойные картинки работы Joe Vondayl для ZX Spectrum
В июне в июне 2017 года я обратился к Joe Vondayl, отечественному художнику, в то время ярко проявившему себя на платформе ZX Spectrum в работах фривольного жанра. Мы договорились, и хотя он не имел опыта работы с графикой NES, он смог выполнить задачу на высочайшем уровне. Он же придумал и разные крутые детали в заставке: сцену с радаром, крутой параллакс в ангаре, и очень хорошо всё это нарисовал.
Кадры начальной заставки версии для NES
Joe также нарисовал финальные заставки, помог с чисткой графики и с улучшением визуальной составляющей на уровнях. С его участием были улучшены и цветовые палитры.
Игровая карта в версии для Super Nintendo
Другой элемент оформления, небольшой, но добавивший игре ощущения солидности — игровая карта между уровнями. Она была и в оригинальных 16-битных версиях, но делать мы её поначалу не планировали, так как в исходном виде сконвертировать её было бы затруднительно. Добавление хоть какой-то карты тоже было моей инициативой, но на этот раз наказуемой — рисовал её я сам, используя элементы карты из версии для Super Nintendo.
Игровая карта в версии для NES целиком и в цвете. Спойлеры!
Рисовать карту нужно было в очень строгих ограничениях, чтобы разместить графику в свободном месте в ПЗУ, размер которого был весьма ограничен. Эти ограничения было трудно объяснить, поэтому привлечь художников на эту задачу не получалось. Показ карты небольшими фрагментами также вызван техническими ограничениями. Вдохновлялся я, конечно же, игрой Ghost & Goblins. Уровень исполнения этого элемента, конечно, получился не на высоте, но в общем контексте смотрится неплохо.
▍ Звук и музыка
Так как главной культурной ценностью оригинальной игры является её музыка за авторством Криса Хюльсбека, очень важной задачей было максимально качественно адаптировать её для NES.
Демонстрация техники Sunsoft Bass в действии и объяснение принципов
Принципиальным личным желанием, хотя и вызвавшим некоторые технические сложности, было применение в музыке так называемого Sunsoft Bass — басовой партии, играемой сэмплами через DPCM канал. При этом перкуссия и ударные переезжают на шумовой и треугольный канал и приобретают синтетическое звучание. Подобное решение применялось в ряде игр от Sunsoft — Journey To Silius, Super Spy Hunter, Batman Return of the Joker, Gremlins 2, Gimmick!, Fester’s Quest — и их звучание очень выделялось на фоне прочих саундтреков. Я хотел сделать не хуже.
В игре используется мой собственный музыкальный драйвер FamiTone. Я обновил его до второй версии, внедрив поддержку большого количества сэмплов с выбором скорости проигрывания, необходимую для реализации басовой партии.
Маппинг сэмплов баса и один из сэмплов в редакторе FamiTracker
Вопреки догадкам игроков, сэмплы баса не были из какой-нибудь игры. Я попробовал несколько вариантов, и оказалось, что довольно неплохо звучат сэмплы стандартного пресета бас-гитары чипа VRC7, использующего FM-синтез. Они и оказались задействованы в игре. Всего используется пять сэмплов для разных нот: A#, B, C, C#, D, а остальные ноты получаются изменением скорости проигрывания сэмплов. Это позволило покрыть весь диапазон бас-партии без сильного нестроя.
Сэмплы были очень сильно оптимизированы по размеру, и в результате они занимают три килобайта, по 600 с небольшим байт каждый. Оптимизация кода позволила высвободить ещё немного места в верхней памяти, и я задействовал её для голосовых фрагментов — это ещё три килобайта.
Фрагмент композиции Mutants Forest в редакторе FamiTracker
Сам процесс адаптации музыки заключался в написании всех треков вручную заново, нота за нотой, в редакторе FamiTracker. Оригинальные партии разбирались по всем доступным материалам — на слух, анализом имеющихся VGM и SPC файлов, просмотром MIDI-аранжировок других авторов. Аранжировка, конечно, делалась полностью новая, такая, какую позволяла реализовать более ограниченная полифония звукового чипа NES — оригинальный саундтрек на Amiga использовал нестандартный способ проигрывания и 8-канальный драйвер, на NES же всего пять каналов с разнообразными ограничениями.
За основу музыки для адаптации были взяты все существующие версии сразу. В некоторых из них есть фрагменты, которых нет в других версиях, и все они пригодились. Более того, так как структура игры усложнилась, музыки стало не хватать, и часть её дописал я сам, используя фрагменты существующих треков в качестве основы, чтобы получилось похоже на Криса. Насколько я помню, я сочинил треки для третьего полётного уровня (на основе фрагмента темы босса для Amiga), для финального босса и заключительных титров, а также джингл в начале уровня.
Сам Крис Хюльсбек слышал мои версии и оценил их положительно. В процессе работы над начальной заставкой Piko договорился о том, что Крис сам напишет трек для неё, но, к сожалению, по неизвестным мне причинам этот план не реализовался.
Адаптация основных треков была сделана в 2014 году, а дополнительные треки я написал ближе к завершению проекта, в 2020.
Полный список звуковых эффектов и их внутренние названия в редакторе FamiTracker
И конечно, к музыке нужно было добавить достойные звуковые эффекты. Я считаю звуки очень важной частью дизайна игр, так как они дают игроку обратную связь, а также формируют узнаваемый звуковой образ игры. В количестве я не постеснялся, в итоге игра содержит без малого сотню разных звуковых эффектов. Делались они в том же FamiTracker, технически точно так же, как и музыка, но полностью из головы.
Я знаю, что некоторые эффекты звучат похоже на что-то из других игр — это совпадение, но вероятно не случайное, потому что я сам вдохновлялся теми играми. И хотя не пытался повторить никакие конкретные эффекты, всё же получалось близко к эталону, к лучшим звуковым эффектам на платформе, на которые я ориентировался.
Композиция A Searing Struggle из игры Ys III: Wanderers from Ys
К слову о совпадениях, примечательным моментом оригинального саундтрека является сходство трека первого уровня с темой A Searing Struggle (весьма замечательной, надо сказать) из игры Ys III: Wanderers from Ys для PC Engine. Когда игроки задали Хюльсбеку вопрос, как так получилось, он сказал, что действительно играл в эту игру до работы над музыкой Jim Power, но успел её забыть, и неосознанно воспроизвёл мелодию в своём треке. Вполне возможно, что и я поддержал эту традицию.
▍ Код
При написании кода я применял технику, обкатанную на серии моих предыдущих проектов для NES: код пишется на языке C и собирается компилятором CC65. Фрагменты кода, работающие непосредственно с железом консоли, а также ресурсоёмкие операции, пишутся на ассемблере.
Начало исходного кода версии игры для NES
Компилятор имеет линкер, стадию промежуточного исходного кода на ассемблере (C>ASM>BIN), и позволяет смешивать код на ассемблере и на C. Это обеспечивает простую интеграцию между низкоуровневыми и высокоуровневыми частями, а главное — возможность в любой момент заменять любую часть кода на ту или иную реализацию.
Таким образом, игра сначала целиком разрабатывается на C, но не в виде отдельной цели под какой-нибудь SDL-фреймворк (это тоже хороший, рабочий способ), а непосредственно для консоли. По мере развития проекта части, производительность или размер кода которых в реализации на C не соответствует требованиям, переписываются на ассемблере 6502. В части игрового кода это обработчики большинства типов рядовых объектов на уровне — бонусов и врагов.
Данный метод позволяет тратить меньше времени на прототипирование элементов игры и на отладку. Если же для каких-то частей мощности процессора и объёма памяти хватает, они так и остаются в реализации на C.
Процесс написания кода для NES-версии игры Jim Power
В 2015 году я снимал часовой скринкаст, в котором показан процесс прототипирования одного из игровых объектов, колонны с шипами. Сначала была написана и отлажена реализация на C, а потом вручную переписана на ассемблер. Примерно таким же образом, как показано в видео, разработана и остальная игра.
Новая проблема, с которой сталкивался и раньше, но в значительно меньших масштабах, вставшая в данном проекте в полный рост — объём кода и данных, существенно превышающий максимальные 32 килобайта. Требовалось применить маппер для управления расширенной до 256 килобайт памятью кода. Для этого требовалось придумать систему распределения кода и данных, схему доступа, способ размещения функций в банках, а также параллельной работы прерываний, которым тоже могут быть нужны данные из банков — музыка и звуковые эффекты.
Я придумал схему, которой и придерживался с тех пор в последующих проектах, в частности, в HEOHDEMO, о котором когда-то писал на Хабре.
Используется раскладка с одним переключаемым банком размером 16 килобайт, находящимся в нижней половине адресного пространства ПЗУ кода ($8000..$BFFF). Код для размещения в страницах ограничивается объёмом переключаемого банка на один отдельно взятый функционально завершённый участок — функцию или подпрограмму вместе со всеми нужными ей данными.
Код в банках вызывается методом оверлеев: подключается нужная страница, выполняется код в ней, исполнение возвращается к основной странице. Обращения к памяти между страницами при этом невозможны. Функции и данные распределяются по банкам вручную, через pragma-директивы компилятора.
Фиксированный банк, также размером 16 килобайт, находится в верхней части ($C000..$FFFF). В нём размещается код, требующийся во всех частях программы, такой, как проигрыватель музыки, вывод спрайтов и обработчики прерываний, а также код, позволяющий обращаться функциям в банках в данным в других банках. Там же находятся и звуковые сэмплы, которые из-за устройства аппаратуры не могут размещаться в банках, а значит, места на код остаётся не так уж много. Место в фиксированном банке — самый ценный ресурс программы.
Функции, размещённые в фиксированном банке, такие как обработчики прерываний и проигрыватель музыки, могут сами переключать нижний банк, а потом восстанавливать тот, который был в момент вызова. Для кода программы эти переключения прозрачны, выполняются автоматически — нужно только помнить ограничения на расположение кода и его данных.
Проект содержит примерно равные части кода на C и ассемблере: около 21200 строк кода на C, включая комментарии, большая часть которых содержит C-реализации игровых объектов (около 7200 строк), а также около 24000 строк на ассемблере, из которых 13500 строк — реализации игровых объектов. Эти цифры не включают автоматически генерируемые данные типа карт тайлов.
Карта использования памяти картриджа
Весь объём памяти картриджа, 512 килобайт, используется почти полностью, примерно на 95%. Задействованы все банки. Расположение кода, данных и графики в них следующее:
- PRG00 Звуковые эффекты
- PRG01 Музыка, треки 1-4
- PRG02 Музыка, треки 5-8, карта последнего босса, объекты для всех уровней
- PRG03 Карты 1-1, 1-2
- PRG04 Карты 2-1, 2-2
- PRG05 Карты 3-1, 3-2
- PRG06 Карты 1-4, 2-4
- PRG07 Карта 3-3, музыка, трек 0
- PRG08 Карты 1-3, 2-3
- PRG09 Первые четыре сцены интро
- PRG0A Пятая сцена интро, экраны оформления, титры
- PRG0B Обработчики объектов
- PRG0C Обработчики объектов
- PRG0D Карта 3-4, обработчики больших боссов, разное
- PRG0E Основной код
- PRG0F Фиксированный код
- CHR00 Шрифты и фон титульного экрана
- CHR01 Спрайты (4K), далее 4K пусто
- CHR02 Графика фона 1-1
- CHR03 Графика фона 1-2
- CHR04 Графика фона 1-3
- CHR05 Графика фона 2-1
- CHR06 Графика фона 2-2
- CHR07 Графика фона 2-3
- CHR08 Графика фона 3-1
- CHR09 Графика фона 3-2
- CHR0A Графика фона 3-3
- CHR0B Графика фона 1-4, 2-4
- CHR0C Графика фона 3-4 (две половины)
- CHR0D Большой босс 1 и 2
- CHR0E Большой босс 3, две нижние половины
- CHR0F Большой босс 3, тело кадры 3,4
- CHR10 Большой босс 3, тело кадры 5,6
- CHR11 Большой босс 3, тело кадр 7, графика концовки Normal
- CHR12 Графика концовок, противники для скролл-шутерной секции
- CHR13 Финальный босс, две половины, логотип PIKO
- CHR14 Мини-босс 1 (2K), мини-босс 2, мини-босс (2K), огни и спрайты для больших боссов, медуза из скролл-шутерной секции
- CHR15 Спрайты Джима 0..23
- CHR16 Спрайты Джима 24..47
- CHR17 Спрайты Джима 48..51 (2K), спрайты уровней 1, 2-1, 2-2, 3-1, 3-2. скролл-шутера
- CHR18 Спрайты противников warrior, dog, bird
- CHR19 Спрайты противников archer, zombie, bird, bee
- CHR1A Спрайты противников monster, zombie, bird, bee
- CHR1B Спрайты противников druid, bat, spider, demon
- CHR1C Графика интро, терминал и анимация вращения фигуры
- CHR1D Графика интро, скролл от джима до стенда с оружием
- CHR1E Графика интро, скролл ангара
- CHR1F Графика интро, спрайты корабля и огней ангара, радар
Несколько слов об отладке. Наиболее сложной проблемой стало периодическое переполнение стека C вследствие неявных ошибок в реализациях функций на ассемблере. Как вы понимаете, на консоли нет отладчика, интеграция компилятора C с эмуляторами тоже не очень-то развита, а в C-рантайме не предусматривается никаких сообщений об ошибках — если упало, то упало. Чтобы держать этот момент на контроле, я написал Lua-скрипт для эмулятора FCEUX. Он показывал конец области памяти C-стека прямо на экране, в виде серии квадратиков, и если что-то шло не так, это сразу становилось видно.
Контрольные квадратики отладочного скрипта в эмуляторе FCEUX
Также при отладке очень помогли функции FCEUX для покадровой промотки игры — с их помощью можно отлавливать очень кратковременные проблемы, не наблюдаемые при обычной скорости (что-нибудь промигивает или подёргивается), а также наоборот, многократного ускорения — так можно проверять стабильность кода, включив бессмертие и бегая-прыгая по уровню туда-сюда как ошалелый, повышая шанс срабатывания редкостных багов.
Собственная утилита TileReplace, применявшаяся на начальном этапе оптимизации количества графических элементов на уровнях
И конечно, помимо кода самой игры, были разработаны необходимые инструменты. Помимо редактора карт, код которого содержит около 3.5 тысяч строк, это конвертер спрайтов в формат 8x16, отдельный оптимизатор карт, наброски кода для заставки, генераторы различных таблиц, и тому подобные маленькие, но необходимые в каждом проекте специализированные утилиты. Также под нужды проекта многократно дорабатывался мой редактор NES Screen Tool.
▍ Геймплей
Для меня в роли геймдизайнера-самоучки это был первый проект такого масштаба, и конечно, я принял несколько довольно спорных решений по игровому процессу. Были и удачные решения, и теперь, спустя годы, мне очень удобно рационализировать эти разрозненные случайные находки, выдавая их за точно выверенный план.
Главной проблемой, которая особенно беспокоила Piko, была нехватка контента — за вложенные средства нужно было получить игру достаточной продолжительности, которая не пробегается с первого раза за 15 минут. Поэтому в ход пошли все грязные трюки игр прошлых лет.
Я принял решение делать сложную игру, насыщенную действием, практически без пустых пробежек. У игрока нет попыток, только небольшая шкала здоровья, на 1-5 ударов, а из-за малой продолжительности уровней нет и чекпоинтов — если проиграл, особенно на мини-боссе, то начинай уровень сначала.
Уровни построены на непрерывной череде неожиданных опасностей — не успеваешь справиться с одной, как влетаешь в другую. Прохождение требует заучивания уровней, а также адаптации к различным особенностям управления. Физика игры, впрочем, вышла достаточно динамичной и контролируемой, поэтому формула с заучиванием оказалась вполне работоспособной и вроде бы не сильно раздражающей.
Важным элементом игры является работа игровой камеры. Для 8-16-битных игр есть несколько типичных решений: герой зафиксирован в центре экрана; герой перемещается в небольшом окне внутри экрана, а при достижении границы начинает двигаться камера; камера плавно догоняет персонажа, и он может убежать за край экрана.
Различные версии игры Turrican. Можно заметить схожую работу камеры в каждой из них
Самая плохая камера, на мой взгляд, реализована в играх серии Turrican: игроку надо дойти почти до края экрана, чтобы камера начала двигаться, из-за чего позади героя остаётся огромное видимое пространство, а опасности впереди просто не видны. Я сделал строго наоборот: камера стремится показать больше пространства впереди и меньше позади, но при этом не делает резкой смены направления, если игрок передумывает в прыжке — избегает дезориентации. На мой взгляд, получилось идеально, в рамках моих способностей.
Из-за отсутствия исходных материалов для боссов платформенных уровней я придумал не самую обычную структуру: в уровнях трижды повторяется один и тот же мини-босс, меняющий сложность и цвет. В первый раз его легко победить, во второй посложнее, а в третий раз он даёт прикурить. До сих пор не могу определиться, хорошая это идея, или не очень. По крайней мере, рациональная.
Также уровни были разбавлены полётами на джетпаке, которые из-за малой продолжительности получались слишком простыми. Я всегда знал, что инерция в скролл-шутерах — зло, но не стал с ним бороться, а примкнул к нему. Подчеркнул европейские корни игры, так сказать, и заодно добавил сложности. Ещё больше сложности добавили кривоватые хит-боксы в этих уровнях, которые так и не были доведены до идеала.
Проблема хит-боксов в этих уровнях, как мне кажется, носит принципиальный характер: герой на джетпаке вытянут в высоту, а не в ширину, как в традиционных скролл-шутерах, а графика нарисована так, что чёткой визуальной границы, где фон должен наносить урон, не ощущается. Вероятно, в этих условиях нужно было сделать, чтобы фон не вредил игроку, а только отталкивал его — но так было бы слишком просто играть.
Огоньки на титульном экране игры Quest Forge
Главные боссы также выполнены в полётном режиме, на джетпаке, что позволило сделать их в лучших традициях игр на NES, огромными, почти во весь экран, и хорошо анимированными. Разумеется, для этого их графика выводится на слое фона, а в качестве фона используется спрайтовая анимация. Сначала это были традиционные звёзды с параллаксом, но потом я подсмотрел классный эффект спрайтовых огоньков в хоумбрю-игре для NES Quest Forge, в тестировании которой принимал участие в то время (она также была издана Piko Interactive на картриджах), и сделал похожие.
Высокая сложность компенсируется наличием бесконечных «континуев», то есть один уровень можно переигрывать сколько угодно раз. Это было навеяно версией игры Ninja Gaiden для Xbox 360, исключительная сложность которой также компенсировалась бесконечными продолжениями, и при должном упорстве игра оставалась проходимой. Возможно оттуда же, а может и не только, пришла и идея ведения игровой статистики, которая показывается после экрана Game Over.
Евгений Пряхин быстро проходит довольно сложную игру
Хотя после завершения проекта мне продолжало казаться, что уровни получились слишком короткими, посмотрев недавнее прохождение, которое выполнил ретро-видео-игровой блогер Евгений «JustEvgen» Пряхин (с которым, между прочим, мы прямо сейчас делаем новую невероятно крутую ретро-игру), мне так уже не кажется — вполне приличная продолжительность для игры без паролей.
▍ Релиз
Так как я только разработчик, и занимался только технической частью, я не знаю подробностей процесса релиза. Поэтому изложенное ниже — лишь моё видение происходившего.
Вновь выпущенные версии игры на физических носителях для NES, Super Nintendo и Sega Genesis
Прежде всего, как я понимаю, были сделаны физические копии игры на реальных картриджах для тех, кто поддержал проект на Кикстартере. Возможно, они были и в свободной продаже.
Для продвижения Piko Interactive заказал целый анимированный ролик, где классно обыграли изменчивую внешность Джима — их, оказывается, двое! Шли разговоры о возможном анимационном мини-сериале, выпуске пластиковых фигурок главных героев, новой версии игры для современных платформ в стиле Duck Tales Remastered. Однако, судьба распорядилась будущим игры и всеми этими планами иначе.
Анимированный трейлер для переиздания игры Jim Power от Piko Interactive
Один из создателей серии, Фернандо Велез, ушёл из жизни в 2016 году в возрасте 46 лет. Возникла спорная ситуация с правами, изначально переданными Велезом Piko Interactive. Как я понимаю, она была урегулирована таким образом: Piko сохраняет право выпустить находящиеся в разработке проекты, но теряет право на любые новые начинания. Так были отменены идеи с мультсериалом и игрушками, и, вероятно, по той же причине все версии игры, созданные в рамках Кикстартер-кампании Piko Interactive, более не продаются на физических носителях. Планировалось добавление NES-версии в Steam-переиздание в качестве DLC, но и там её до сих пор нет. Таким образом, мой порт как бы перешёл в категорию, родственную vapourware.
Так или иначе, после релиза игру довольно быстро считали с картриджа в ROM-файл для запуска на эмуляторах и флеш-картриджах — никаких особых мапперов или защиты она не имеет, это стандартный MMC3 в конфигурации 256K CHR + 256K PRG. Этот дамп благодарные зрители прислали обратно мне, и я из любопытства сверил его со своим билдом — не сделали ли в игре какие-нибудь изменения уже без моего участия. Тут-то и выяснилась забавная вещь: на все картриджи по ошибке была прошита пред-финальная версия игры, на которой проводился заключительный раунд бета-тестирования.
Пиратский картридж для Famicom/Денди с Алиэкспресса
В финальной версии были исправлены незначительные проблемы. Я могу ошибаться, так как не помню точно, но судя по старым заметкам. это были мелкие визуальные артефакты, карты уровней, подсчёт статистики, звуковые эффекты для PAL, тайминги финального босса, титров и концовок, секретное меню выбора уровней. Насколько я понимаю, эта версия так и не попала на физические картриджи, так как других тиражей не было. Версия на картриджах играбельна и проходима, просто чуть менее отполирована.
На Алиэкспрессе сейчас встречаются нелицензионные реплики игры как в формате NES, так и Famicom. Они содержат ту же самую пред-финальную версию, что и официальный релиз. К сожалению, хотя игру можно запустить на Денди, встроенное в неё автоматическое определение NTSC/PAL региона, включающее компенсацию скорости и тональности звука, а также настройки некоторых визуальных элементов, на клонах не проверялось — такой задачи на момент релиза не ставилось, и, как оказалось, оно работает некорректно. Играть с некоторыми визуальными артефактами можно, но басовая партия перестаёт строить с остальными инструментами, и музыка превращается в какофонию. Простите.
Коллекционное переиздание Jim Power для Nintendo Switch
В 2022 году компания QUByte выпустила цифровое издание-сборник, содержащее все версии игры, включая мою 8-битную, для современных консолей — PlayStation 4 и 5, а также Nintendo Switch. Компания Strictly Limited Games также выпустила лимитированное физическое издание для тех же платформ, с общим тиражом 3000 копий. Это издание включало разнообразные бонусы, включая два CD-диска с саундтреком, постер и очки. Затрудняюсь вспомнить наверняка, но кажется, что вопрос с не той версией на картриджах всплыл до этого издания, и в нём версия была заменена на правильную. Но это не точно.
▍ Послесловие
Из-за крайне затянувшейся разработки игра перешла в статус проекта, который нужно просто доделать и забыть. К сожалению, у меня это происходит чаще, чем хотелось бы, и я пока не научился справляться с этой проблемой более эффективно. В итоге так оно и вышло: доделал и забыл.
После завершения игры я практически не вспоминал о ней, не запускал и не играл. Сейчас же мне удалось взглянуть на проект другими глазами, со стороны, а не изнутри, и думаю, что получилось неплохо. По крайней мере, пока это моя лучшая игра, и можно сказать, что детская мечта вполне реализована.
В завершение минутка наглой саморекламы: я веду классический текстовый блог на Бусти с краткими заметками по различным старым проектам и рабочим моментам новых подобных разработок, которые происходят вот прямо сейчас. Блог можно просто читать без регистрации и SMS, поэтому, если вам интересно — добро пожаловать!
Автор: Александр Семенов