В моем ежедневном дайджесте медиум всегда предлагает мне прочитать такие статьи, как «Я просыпался каждый день в 4 утра в течение двух недель, и вот что случилось» или «Я ел папайю одну неделю, и вот что произошло» и так далее. Наконец, моя очередь написать свою версию «вот что случилось».

В данном случае я говорю обо всем своем свободном времени в течение нескольких дней, потраченном на усердную работу над одним из самых нелепых достижений в моей жизни: анализом, пониманием и переписыванием старого Super StarTrek 1978 года. видео игра.

Если вы не понимаете, о чем я, то это старая текстовая игра, ранний пример пошагового симулятора космической стратегии, написанная на BASIC. В этой игре вы — капитан космического корабля «Энтерпрайз», и ваша миссия — разведать пространство Федерации и уничтожить все вторгшиеся клингонские корабли. Вам придется тщательно управлять энергией корабля, использовать фазеры и торпеды для уничтожения клингонов и находить звездные базы, чтобы устранять повреждения и пополнять свою энергию. Все это визуализируется с помощью нескольких персонажей на экране и большого воображения. Вы управляете «Энтерпрайзом», вводя команды по подсказке, например, NAV для перемещения корабля, PHAдля стрельбы фазерами, LRSдля сканирования квадранты с датчиками дальнего действия и так далее.

Несмотря на свою простоту, это отличный пример программирования и игрового дизайна.

Если вам интересна история этой игры, как она выглядит или как в нее играть, я написал еще одну статью о Super Star Trek здесь. В противном случае знайте, что она была создана в 1974 году и стала чрезвычайно популярной, когда была опубликована в улучшенной версии, написанной Бобом Лидомом, в книге 1978 года ОСНОВНЫЕ КОМПЬЮТЕРНЫЕ ИГРЫ. Я не говорю об игре, которая распространялась на диске. В книге был код, и люди должны были набирать его на своих компьютерах. Поскольку BASIC в то время был универсальным языком, код игры мог работать на многих разных машинах.

Какое это имеет отношение ко мне?

В 1983 году я купил итальянское издание книги под названием Zap! Пау! Бум! : Аркадные игры для VIC-20 от Марка Рэмшоу. Он содержал 30 игр для Vic-20, написанных на BASIC. Восьмая игра называлась Star Trek. Я скопировал все это на свой VIC-20, как только пришел домой и начал играть. Он был прост, но я сразу в него влюбился. Возможно, это была лучшая игра, в которую я когда-либо играл на этом компьютере.

Мне потребовалось 37 лет, чтобы понять, что эта программа на самом деле была адаптацией Super Star Trek Лидома. Я обнаружил это несколько месяцев назад, когда купил копию книги Дэвида Ала «БАЗОВЫЕ КОМПЬЮТЕРНЫЕ ИГРЫ» на eBay — да, книгу, выпущенную в 1978 году… лучше поздно, чем никогда!

Конечно, я сразу же решил попробовать оригинальный Super Star Trek. Слава богу, на этот раз мне не пришлось вводить весь код. Я просто зашел на сайт Vintage Basic, скачал интерпретатор Бейсика, исходный код игры и запускаю.

Версия Leedom действительно фантастическая и, конечно же, намного лучше, чем уменьшенная версия, в которую мне приходилось играть на своем VIC-20.

Я знаю, что вы думаете; это просто ностальгия и так далее. Но правда в том, что мне было очень весело играть в нее. Представьте себе: в какой-то момент, после тяжелого боя с тремя клингонскими кораблями, мои датчики ближнего и дальнего действия были повреждены. Энергия была почти исчерпана. Время подходило к концу, поэтому я перенаправил мощность щитов на двигатели, как сделал бы Скотт. Затем я попытался добраться до ближайшей звездной базы, используя только навигационный компьютер. Но когда я вошел в квадрант, компьютер тоже отключился. Черт! Поэтому я попытался ориентироваться вслепую, надеясь состыковаться со звездной базой... и мне это удалось! Жаль, что в конце концов победили клингоны, но это было весело.

Переписывание кода

Поиграв некоторое время, я немного погуглил, чтобы узнать, не переписал ли кто-нибудь за все эти годы игру в более читабельном формате. Код 1978 года был немного загадочным и почти не содержал комментариев, поясняющих алгоритмы. Ты мне не веришь? Глянь сюда".

Я нашел много игровых портов в Интернете, например этот отличный, но ни один из них не был оригинальным Super StarTrek 1978 года. В этих новых изданиях были представлены маскировочные устройства, сверхновые звезды, лучи смерти, ромуланцы и многое другое. Но я хотел оригинальную, поэтому решил в итоге сделать портирование сам. Это лучший способ понять программу, верно?

Первоначально я решил написать его на Perl, потому что это язык сценариев, который можно запускать с любого Mac или Linux, а также потому, что в Perl есть оператор goto. Я не думал, что возможно, по крайней мере вначале, перенести весь исходный код BASIC без использования какого-либо goto.

Но даже простой перевод оказался сложнее, чем я ожидал. Представьте себе портирование 500 строк кода BASIC, максимально упакованных для экономии памяти — это означает, что каждая строка содержит несколько инструкций, разделенных точкой с запятой и без пробелов. Посмотрите, например, на эти строки:

3170 FORI=1TON:S1=S1+X1:S2=S2+X2:IFS1<1ORS1>=9ORS2<1ORS2>=9THEN3500
3240 S8=INT(S1)*24+INT(S2)*3-26:IFMID$(Q$,S8,2)="  "THEN3360
3320 S1=INT(S1-X1):S2=INT(S2-X2):PRINT"WARP ENGINES SHUT DOWN AT ";
3350 PRINT"SECTOR";S1;",";S2;"DUE TO BAD NAVAGATION":GOTO3370
3360 NEXTI:S1=INT(S1):S2=INT(S2)

Я терпеливо переписывал каждую строчку, тщательно стараясь не ошибиться. Если вы пропустите персонажа, все может измениться. Я начал с перевода 1-к-1, но вскоре понял, что не могу оставить все эти goto там; иначе я бы не смог его прочитать. Поэтому я начал преобразовывать некоторые if-then-goto в блоки if-then-else.

Очевидно, что gosub стали функциями, а также некоторые блоки goto стали функциями. Но затем я понял, что больше goto было размещено позже в коде, переходя в неожиданные места, например, в середину функции или в середину затем блок. Это было похоже на лабиринт. Арх.

Терпеливое определение и разделение всех блоков кода было самой сложной частью работы, но это было очень полезно для понимания игровой механики.

Когда основные функции были написаны, я также начал преобразовывать некоторые глобальные переменные в локальные параметры. Я также переименовал глобальные переменные во что-то осмысленное, например «EnergyLevel» вместо «E» или «TotalKlingonShips» вместо «K3».

Вы можете спросить, зачем кому-то делать это с игрой, написанной в 1978 году? Я знаю, это безумие. Но я хотел его доделать, хотел сделать код «своим». И я хотел убрать беспорядок. Было сложно заснуть с незаконченным кодом, оставив беспорядок позади.

В конце концов, я сделал это, и я действительно горжусь этим.

После Perl-версии я решил портировать игру на LUA. Для этого я принципиально перепроверил весь код с нуля. В Perl я часто использовал «следующий» и «последний» (продолжить и перерыв в C). чтобы избежать gotos. Но в LUA нет инструкции continue, поэтому мне пришлось переписать большую часть циклов. Но, в конце концов, это было полезно. Я должен признать, что код стал намного лучше.

Я оставил много комментариев, для меня и всех, кто хочет понять код. Вы найдете такие вещи:

Ясно, что работа никогда не будет закончена; код можно улучшить намного больше. Но на данный момент он полностью работает; игра выглядит и ведет себя точно так же, как и оригинальная — миссия выполнена.

Теперь, если вы хотите играть, вы можете скачать код игры с моего личного сайта. Perl легко запустить. Я очень надеюсь, что вам понравится!

Если вы разработчик, вы, вероятно, предпочтете мою учетную запись GitHub, чтобы найти версии LUA и Perl. Я уверен, вы найдете много вещей, которые можно улучшить.

Итак, возвращаясь к названию статьи, что произошло?

Ну, мои мышцы живота не стали плоскими, если вам это интересно. Я потерял несколько часов сна, повеселился, и теперь у меня есть новая игрушка, с которой можно играть. Не уверен, что с этим делать, потому что я не хочу слишком сильно его менять, а хочу лишь кое-что улучшить.

Как насчет конкретных миссий, которые вы получаете от адмирала Кирка? Или случайные встречи с инопланетными видами, проблемы, которые можно решить дипломатией, а не только торпедами? Возможности безграничны.

Однако, даже если это закончится здесь, это определенно стоило затраченных усилий! Но эй, если вы предпочитаете есть папайю каждый день в течение 1 месяца, я не буду вас осуждать. Вперед, продолжать!