Привет, меня зовут Дейв Пламмер, я бывший разработчик операционных систем Microsoft. Я работал в компании ещё с эпохи MS-DOS и Windows 95. Так получилось, что мне довелось портировать игру Space Cadet, поставлявшуюся в комплекте с Windows. Сегодня я поговорил с разработчиком из Microsoft, который полностью удалил её из операционной системы, чтобы понять, почему это было сделано, а также чтобы оценить перспективы возврата игры. Также я покажу как запустить этот пинбол в Windows 10 и протестирую его работу в новой Windows 11, чтобы проверить, работает ли он спустя почти 25 лет. Сразу должен сказать, что я не занимался графикой, звуком, дизайном стола и разработкой геймплея, даже оригинальный код писал не я. Изначально это была отдельная игра Full Tilt! Pinball, выпущенная Maxis в 1995 году. Я могу лишь похвастаться тем, что взял относительно малоизвестную игру и портировал её на платформу, получившую больше миллиарда пользователей. Изначально я добровольно вызвался портировать игру на Windows NT 4.0.
В оригинальной игре Full Tilt! Pinball было три пинбольных стола: Space Cadet, Skullduggery и Dragon's Keep
Итак, это был 1995 год, я занимался портированием оболочки Win 95 в Windows NT. Оболочка включала в себя меню «Пуск», значки Рабочего стола, папки, общие элементы управления, общие диалоговые окна, в общем, основную часть UI, которую вы видите. Наш вице-президент Джим Олчин хотел включить в комплект Windows NT нечто, способное продемонстрировать новые графические и звуковые API, которые были впервые добавлены в ОС. Естественно, лучшим решением стала бы зрелищная игра с красивым звуком и интересным геймплеем. Это бы позволило избавить Windows NT от имиджа «скучной» системы. Как и пасьянс, эта игра стала почти неотъемлемым символом операционных систем, в комплекте которых она поставлялась. Однажды, когда я работал над портированием оболочки, ко мне подошёл мой руководитель и спросил, было бы мне интересно портировать игру в пинбол из Windows 95 в Windows NT. Задача кажется довольно простой, но я уже знал, что иногда перенос кода с 95 в NT может быть затруднительным. Это зависит от того, как он был написан и какие API использовал. Но я всё равно согласился, потому что любил игры и ухватился за возможность поработать над одной из них, да ещё и получать за это зарплату.
Моей основной специальностью в команде разработки оболочки было устранение проблем, связанных с RISC-процессором MIPS. Все мы совместно работали над тем, чтобы оболочка Win 95 заработала в NT, а я в частности занимался вопросами, возникавшими с MIPS. В те времена Windows работала на нескольких архитектурах, в том числе Intel, MIPS RISC, PowerPC и Alpha AXP. Пользователь мог приобрести версию Windows, скомпилированную для одной из этих архитектур. В нашей команде каждым процессором занимался свой специалист, решавший уникальные для платформы проблемы, и лично я работал с MIPS. На моём рабочем столе даже не было x86 и я запускал NT 3.51 на машине с MIPS, которую использовал как основной инструмент разработки. Я перешёл с 486 сразу на MIPS, полностью миновав этап работы с Intel Pentium. Чаще всего, если нам удавалось заставить работать код на одном из чипов RISC, он с большой вероятностью мог работать на любом из них, однако добиться этого было сложно, потому что эти чипы требовали, чтобы данные находились в 32-битных границах. В архитектуре x86 ценился каждый бит, поэтому большая часть кода для x86 плотно упаковывала переменные в границы байта, что не подходит для RISC.
Как бы то ни было, если бы я заставил игру работать на моей машине с MIPS, то она бы работала и на любой другой. Однако возникло несколько проблем — во-первых, код временами был весьма запутан. Код игры писали не наши разработчики, Microsoft просто купила его, и он был написан не в том стиле, к которому я привык. Отличие игры от операционной системы в том, что игра часто имеет одну версию, а для операционки выпускаются версия за версией, одна поверх другой. Многие игры пишутся по принципу «выпустил и забыл», а удобство поддержки кода и его читаемость не всегда так важны, как скорость работы и сроки выпуска проекта. Сильно поразил меня код звукового движка. Разумеется, я уверен, что с ним всё было в порядке, но написан он был на ассемблере x86. Однако код x86 очень мало бы помог мне при работе с MIPS, PowerPC и Alpha. Операционные системы наподобие Windows на 99,99% состоят из кода на C и C++, а ассемблер используется практически только в слое абстракции оборудования и, возможно, в загрузочном коде. В конце концов, если у вас есть полудюжина целевых процессорных архитектур, вы не будете вручную писать код на ассемблере для каждого из них, а захотите написать его один раз на C. Чтобы игра заработала, мне нужно было вырезать весь код на языке ассемблера и заменить собственным кодом на C, который затем будет скомпилирован в нативный код для каждой платформы.
По счастливому совпадению, за пару месяцев до этого я встречался с командой разработчиков сборников игр Microsoft Arcade, чтобы протестировать их реализацию старой игры Atari для аркадных автоматов под названием Tempest, по которой я был чемпионом мира. Я созвонился с этими ребятами и попросил прислать мне код демо, занимающийся звуком, чтобы заменить им код на ассемблере. Разобравшись с примером на C, я смог создать новый звуковой движок на C++, работавший на всех нужных процессорах. Вскоре после этого мне удалось заставить игру работать достаточно хорошо для того, чтобы можно было её тестировать. Честно говоря, было здорово получать зарплату за игру в пинбол, однако вскоре моя работа над ним закончилась и я приступил к другим проектам.
Tempest из сборника Microsoft Arcade
О пинболе я не вспоминал лет десять, пока не стал волонтёром в школе своего сына, где помогал маленьким детям с их компьютерной лабораторией. Я увидел ребёнка, который вместо того, чтобы выполнять задание, играл в пинбол. Он спросил меня, играл ли я когда-нибудь в него. Я ответил, что не только играл, но и работал над ним в Microsoft. До того момента ни одного ребёнка не впечатляло ничего из того, над чем работал я, потому что, будем откровенны, когда ты в детском саду, то диспетчер задач — это та штука, которую использует твой папа, чтобы починить компьютер, пока ты плачешь как младенец из-за того, что диск с игрой застрял в приводе. До семи-восьми лет дети обычно не пользуются диспетчером задач, поэтому обычно им было незнакомо почти всё то, над чем работал я. Но с пинболом совсем другая история — для многих детей пинбол стал игрой, в которую они играли, потому что это была единственная игра на компьютере. Конечно, это не значит, что игра хороша, просто она действительно была повсеместной, потому что поставлялась с Windows и её можно было найти на любом PC. Сегодня её уже нет, но если у вас есть копия игры, то она вполне запустится на современных системах.
Однако прежде давайте поговорим о причинах того, почему её удалили из Windows. Чтобы выяснить это, я обратился напрямую к Реймонду Чену — разработчику Microsoft, работавшему над всеми версиями Windows с середины 90-х. Оказалось, что точно так же, как мне поручили портировать игру с Windows 95 x86 на 32-битную Windows NT, кому-то нужно было дать задание портировать её с 32-битной Windows на 64-битную, и этим человеком был Реймонд. В своё время у меня было несколько недель для работы исключительно над пинболом, но для Реймонда это была лишь крошечная часть его работы по обновлению всей оболочки до 64 бит. Пинбол с трудом поддавался портированию — при сборке для 64-битной системы система распознавания коллизий работала некорректно — шарик проходил через препятствия, а не отталкивался от них. Очевидно, что в коде оригинала присутствовали какие-то трюки или зависимость от 32-битной компиляции. Реймонд позвал на помощь своего коллегу, но даже потратив достаточно времени, они не приблизились к решению. Когда стало ясно, что из-за пинбола они не уложатся в график работы, то они осознали, что единственный возможный вариант — избавиться от него. Так они и поступили: пинбол не совершил перехода с 32 на 64 бита. Но если никогда не существовало 64-битной версии пинбола, то как же его можно запустить в 64-битной Windows? Это возможно благодаря WoW64. Нативно Windows работает в 64 битах, а 32-битные приложения работают в специальном слое Windows on Windows, обеспечивающем совместимость с 32 битами. Это похоже на то, как мы запускали 16-битные приложения Windows 3.1 в 32-битной Windows, только на следующем логическом этапе. Насколько я знаю, при установке новой копии 64-битной Windows все двоичные файлы в ней являются 64-битными и в ней нет ничего 32-битного, поэтому подсистеме WoW64 запускаться не нужно. То есть она не занимает время при запуске и не потребляет ресурсов, пока не запущены 32-битные приложения. Однако подсистеме WoW64 требуется загрузка, для чего нужны время и ресурсы. Кто-то может возразить, что пинбол не загружается при запуске, поэтому это не важно. Но всё равно странно и непрофессионально было бы выпускать с Windows единственный 32-битный двоичный файл. К тому же, если бы 32-битный файл выпустили с 64-битной Windows, а пользователь отключил бы слой WoW64, то он бы не запустился. Поэтому единственным реальным решением стало бы вложение времени в полное решение проблемы, что, вероятно, не стоило усилий. Во-первых, это древняя игра, и хотя у многих людей она вызывает ностальгию, мне не кажется, что более молодые пользователи ею очарованы. К тому же по сравнению с Windows 11 она графически устарела — нельзя выпускать игру в том же виде, нужно потратиться не только на отладку и кодинг, но и на визуальную смену стиля и графики. К тому же необходимо добавить изменение размеров и масштаба, которые отсутствовали в оригинале.
Автор статьи и Реймонд Чен
Ещё один аргумент против портирования — старую игру по-прежнему можно запускать, хотя есть и юридические тонкости. Я не юрист, но мне кажется, что если у вас есть лицензионные копии Windows XP и Windows 10, то вы можете запустить компонент XP в Win 10, но, может быть, в лицензии чётко говорится, что они ни в коем случае не разделимы. Если у вас есть соответствующая лицензия, то двоичный файл можно найти и онлайн, поэтому откапывать старый CD с Windows XP необязательно. Но имейте в виду, что все найденные мной файлы не подписаны, поэтому могут кишеть троянами. Не стоит им доверять, если вы не можете выполнить двоичное сравнение или сравнить хэш md5. Я бы экспериментировал с ними на изолированной виртуальной машине. При запуске игры заставка открывается на весь экран, но сама игра занимает крошечную часть большого экрана монитора. Кто-то может сказать, что возможность беспроблемной работы старого приложения спустя 25 лет после его выпуска является свидетельством качества портирования. Другие могут сказать, что причиной этого является потрясающая обратная совместимость самой Windows. Как бы то ни было, Space Cadet по-прежнему запускается и в него можно играть в Windows 10.
Глубоко внутри ядра логики пинбола есть кусок кода, который, как мне кажется, никто не понимает полностью. Ну, может быть, его понимает Реймонд, но я точно в нём не разобрался. Он называется стейт-машиной и он почти полностью незадокументирован. Каждый раз, когда код проходит через него, состояние машины изменяется, и это состояние отслеживается в состоянии разбросанных по программе переменных, поэтому очень сложно разобраться, что происходит, но всё работает.
Дополнение: в игре есть режим суперпользователя: обычно в мире систем мы такого не делаем, поэтому пинбол — практически единственный пример такой программы в Windows. Он не делает игрока настоящим суперпользователем, а просто даёт ему новые возможности в игре. Для активации режима начните новую игру, дождитесь падения шарика и наберите на клавиатуре
hidden test
. После этого вы сможете управлять физикой шарика при помощи мыши и перетаскивать его по полю. Так же есть команды, дающие игроку дополнительные шарики, повышающие его в звании и добавляющие в таблицу рекордов.