
Многие из нас с восторгом вспоминают те или иные игры детства, и в данном случае речь пойдет о ностальгических воспоминаниях об игре Night Light 1995 года, которые натолкнули автора на воссоздание одного из основных элементов ее геймплея — фонарика.
Предыстория
В свои юные годы я играл в компьютерную игру Night Light, выпущенную GTE Entertainment. Ее геймплей строится вокруг кошки Pandora и собаки Pixel, которые в темноте исследуют дом после того, как все люди отправились по своим ночным делам.
Эта игра засела в моей памяти так, как это может произойти только с играми детства. Меня очень привлекла механика использования мыши в качестве фонарика, хотя я не знаю, стало ли это причиной или же следствием интереса к игре.
В течение последних лет я время от времени вспоминал о ней и пытался найти ее в сети, но успехом эти поиски не увенчались. Наконец, в 2018 году YouTube-блогер Vulnerose Plays записал ее прохождение и выложил в архив интернета образ ISO. Кстати, большинство комментаторов под видео тоже оказались людьми, пытавшимися отыскать эту игру.
На момент написания я еще не успел в нее поиграть, так как для этого необходимо эмулировать старую версию Windows, чем я пока не озадачивался. Однако недавно у меня возникло вдохновение воссоздать ее базовую механику на JavaScript с помощью Canvas, и вот мы здесь.
Извлечение ресурсов
Думаю, некоторым читателям будет интересно узнать, как я заполучил картинки из игры без ее запуска.
Для открытия и просмотра содержимого файла .iso я использовал 7-zip. Иногда выяснялось, что ресурсы вложены в сам .exe, что привносило дополнительные трудности. Тем не менее большая часть ресурсов любезно хранится в каталогах в виде отдельных файлов. Было нетрудно отыскать LIGHT.BMP и DARK.BMP для каждого уровня.

Размер этих картинок 512х344, и в каждой из них жестко закодирована тень под HUD. Но что это за файлы .mov размером с мегабайт?
Эти видео-файлы содержат по 80 фреймов, каждый из которых является фрагментом одного общего изображения. С помощью ffmpeg я разобрал эти видео-фреймы, использовав команду ffmpeg -i DARK.MOV %03d.png
.


Первые 16 фреймов можно объединить в сетку 4х4, получив изображение 1024х768. А последние 64 кадра собираются в сетку 8х8, формируя картинку 2048х1376. Весьма впечатляет видеть эти уровни в столь высоком разрешении, спустя так много лет.
Из каждого каталога я удалил фреймы с 01 по 16, затем обновил свой stitch.py на получение аргумента --grid
и объединил все оставшиеся 64 картинки для каждого уровня.


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

Я даже специально написал для этой задачи ffdecodetest.py. Уровни заднего двора и гостиной оказались самыми поврежденными, и в них тест прошли только три и одна дорожки соответственно. Если у вас по какому-то особому везению есть копия CD этой игры, то вы могли бы сделать с нее новый рип.

Затем мне оставалось лишь скопировать код для canvas, который я написал в прошлый раз, и «пролить на все немного света».
Включаем свет в ночи
Прим. пер.: описанные ниже инструкции по взаимодействию с воссозданной «игрой» работают только в оригинале статьи.
Дважды кликните по каждой картинке для перехода в полноэкранный режим. Уточню, что я не воссоздавал какие-либо реальные загадки из геймплея, только саму механику фонарика.
Ваш браузер может не воспроизводить аудио-подсказки, пока вы не кликните на что-либо в документе. Так что сейчас самое время, как насчет этого:

Реальные интерактивные изображения доступны в оригинале статьи
Остальные картинки
Отсутствующие файлы меню
Я рад, что картинки уровней было легко извлечь, так как они являлись самой важной частью. Но мне бы, конечно, хотелось также добыть изображения из главного меню и фото разработчиков из титров.
Я просмотрел все файлы через 7z в надежде отыскать .bmp или «плиточный» .mov с изображением меню, но нигде их не вижу. Удивительно. Самое близкое, что мне удалось найти – это MMCHOICE.MOV, где Pixel и Pandora обсуждают выбор уровня.
В игре есть несколько подобных оверлеев также для каждого уровня, значит данный файл в этом смысле не уникален. Здесь возникает соблазнительная мысль, что mmchoice.mov мог бы содержать всю графику меню, если бы только можно было как-то уменьшить масштаб и обнаружить остальные пиксели, скрывающиеся за фреймом. Но все же я не думаю, что это так. Фоновый арт должен, как и уровни, находиться в отдельном файле.
Возможно, я просто что-то упустил, или эти изображения вложены в другое место. Файл NIGHTMPC.EXE весит целых 7.7МБ, то есть в нем вполне могли поместиться кое-какие секреты. Я просмотрел этот бинарник в поиске любых заголовков BMP или MOV… безуспешно.
Мне кажется, что игра должна работать как в Windows, так и на Mac: многие ее ресурсы представлены в дублированном виде (BMP/PIC, WAV/AIF), но среди исполняемых файлов я нахожу только .exe. Может быть есть еще какие-то, которые я не вижу? Или же некоторых файлов просто не хватает, а с ними и графики меню?
Если вам удастся в этом разобраться, прошу отписать в комментариях.
В процессе я также нашел эти маски изображений, которые помогают понять, как в игре было реализовано обнаружение кликов. Я нахожу это решение довольно грамотным.


Заключение
Здесь будет кстати упомянуть блогера Тома Скотта и его ролик о Need for Speed, в котором он отправился с ностальгическим визитом в реальное место, на основе которого был разработан один из уровней этой игры.
В конце ролика он говорит следующее:
Все, что мы создаем, будь то для широкой аудитории или же чисто для близких друзей, без сомнений может быть забыто. Но создаваемые нами вещи также могут глубоко залечь в закрома памяти отдельных людей и оказать на них влияние в дальнейшей жизни. Так что создавайте приятные вещи. Старайтесь дать людям то, о чем они будут ностальгигровать. Никогда не знаешь, какие впечатления ты можешь заложить в будущее.
Своеобразная благодарность всем разработчикам:
Автор: Дмитрий Брайт