#================================================================#
[ ___ __ _ ______ ______ ]
[ | || || | ______ | __ | ________ | | ]
[ | || || || _ || | ||| || | ]
[ | || || || | ||| |__|||__ __|| | ]
[ | || || || | ||| | | | | | ]
[ | || |_||| | | | |_ _| ]
[ | || || | | | |__| ]
[ | ||______|| | |__| __ ]
[ |__________| |______| |__| ]
[ ]
[ === P R O B A B L Y P R E S E N T S === ]
[ ]
[ ILLUMINATI: 2021 WOOT! EDITION - by Jim Waterman ]
[ Original 16K ZX81 version for CSSCGC 2020: 24-26 November 2020 ]
[ This 16K Spectrum update: 1 October & 13-14 November 2021 ]
#================================================================#
Контекст
Пока я заведовал CSSCGC 2021, за кулисами велась работа: я переносил некоторые из своих старых работ с компьютеров, отличных от Спектрума, на сам Spectrum. Часть из них обрушится на ничего не подозревающего ведущего конкурса 2022 года. Однако одну я решил приберечь для кассетного журнала WOOT!, и подумал, что Illuminati — вариант не хуже прочих. Далеко не каждый в спектрумовском сообществе был в своё время фанатом ZX81, так почему же они должны пропускать «до смешного вылизанную игру» (во всяком случае, по меркам ZX81 на CSSCGC) «с не менее смехотворной концепцией в самый нелепый год» (коим 2020-й безусловно и являлся, пусть и вовсе не по тем причинам, о которых твердили кликуши тридцатилетней давности).
Раз уж это была игра для ZX81, я решил, что будет вполне разумно попытаться заставить её работать на 16K Spectrum. Оригинал занимал 9022 байта в шатающейся внешней памяти ZX81 RAM. И тут я вспомнил, что у ZX81 экранная память занимает 768 байт, а у Spectrum — 6912 байт, оставляя под BASIC всего 8828 байт. Пришлось заниматься лютой утрамбовкой: куски оригинального листинга ZX81 BASIC были переписаны на машинном коде — ради экономии памяти, а не скорости (хотя и она подросла), другие подпрограммы переписаны начисто, а превращение всего листинга в мешанину из NOT/SGN/INT PI и VAL (совсем как в старые добрые времена на 1K ZX81) сэкономило памяти объёмом с целый 1K ZX81 и даже больше. Сжав листинг до 6203 байт, я наконец-то смог заняться добавлением спектрумовских фишек...
...короче говоря, появились цвета — шесть различных схем, из которых лишь одна представляет собой вариацию монохрома, — и звуковые эффекты, по большей части позаимствованные из стародавних спектрумовских игр. Если вас зовут Martyn C. Davis или Michael J. Levers, вы наверняка их узнаете. Я просто пока ещё не так силён в процедурах с CALL 949.
В этот урезанный Spectrum больше уже почти ничего не впихнуть; пришлось провести ещё более глубокую вивисекцию имён переменных, чтобы всё уместилось, когда без пяти минут в полночь выяснилось: нужно перенести все UDG на 32K выше по памяти, если я хочу, чтобы название и пирамида отображались корректно на любой другой модели! К счастью, в области UDG нашлось 12 свободных байт под быструю команду LDIR...
The ludicrous backstory (mostly copied from the ZX81 original)
Это было фишкой моих игр для CSSCGC 2020 года — но, учитывая, что здесь замешаны Illuminati, в этом нет острой необходимости. Вы можете верить в эту клику невероятно могущественных элит, манипулирующих мировыми лидерами как марионетками на ниточках, а можете и не верить — выбор за вами. Говорят, что за каждой теорией заговора кроется зерно истины, только и ждущее, когда его обнаружат (или прямой Spoiler Alert), но очень сложно не отвлекаться от поиска этой истины, когда, к примеру, David Icke начинает упоминать ящериц-гуманоидов, меняющих форму, а Alex Jones начинает орать с такой яростью, будто его голова вот-вот взорвётся.
Но в любом случае сюжет таков: Illuminati вот-вот захватят мир, и вы должны их остановить. (Тут встревает Paul Joseph Watson со своим коронным «Ну, представьте себе мой шок!». И на данном этапе он был бы абсолютно прав, потому что — а кто этого не ожидал?) На Top Secret Pyramid иллюминатов установлен кодовый замок, требующий ввода трех байтов кода в шестнадцатеричном формате — что в сумме дает 16 777 215 возможных комбинаций. К несчастью (по крайней мере, для них), они поручили написание кода для защиты замка полному тупице, который только что прочитал об этом в книге почти 40-летней давности. Сами Illuminati, само собой, не сильны в технологиях, поэтому понятия об этом не имеют, да и вообще они слишком заняты планированием того, что они будут делать, когда заполучат еще более секретные китайские лаборатории по исследованию вирусов (как будто того, через что нас ВСЕХ заставляют проходить СПУСТЯ ДВА ГОДА, им мало).
Введите три hex-кода в пирамиду, и они начнут распространяться вверх согласно секретному коду, известному лишь Программисту... и любому другому, кто знает, как дизассемблировать 85 байт машинного кода Z80. Как только коды достигнут вершины пирамиды, если финальный hex-байт совпадет с тем, что отображается над Evil Eye, замок откроется, и Illuminati будут уничтожены — каким-то образом: скажем, в их штаб-квартире взорвется бомба, или вирус, который они собираются выпустить, окажется нацелен конкретно на них самих. (Или придумайте свою собственную историю, всё равно никто в нее не поверит.) Так или иначе, человечество спасено, люди по всему миру танцуют и прыгают на улицах от восторга, пируя steamed hams, фруктовыми летучими мышами, сухими завтраками, Pan-Galactic Gargle Blasters и... так далее, и тому подобное, вы уже поняли идею. Слушайте, я же не говорил, что здесь должен быть какой-то смысл, верно?
Система безопасности Illuminati настолько слаба, что только 64 из возможных 256 байтов вообще могут получиться из любых 16 777 215 hex-комбинаций. Я предполагаю, что они распределены равномерно — я написал программу для Spectrum, чтобы вывести их все, причем машинного кода в ней было даже больше, чем здесь, но даже работая в Fuse на скорости, в 40 раз превышающей правильную скорость процессора, ей потребовалось бы две недели на завершение. У вас есть всего 16 попыток подобрать код, и он меняется каждый раз, когда вы пробуете... но это хотя бы означает, что в целом у вас есть шанс 1 к 4 на взлом кода.
Если все это звучит как совершеннейшее безумие, то только потому, что так оно и есть. Ноябрь 2020 года, когда писалась оригинальная версия для ZX81, пришелся на конец второго целого месяца взаперти у меня дома (то есть я ни разу не выходил дальше пяти метров от входной двери, разве что вынести мусор — первым таким месяцем был апрель 2020 года); за ним последовал третий (январь 2021 года), и у меня складывается отчетливое ощущение, что я не доживу до конца этого кошмарного бардака. И это не оказало абсолютно никакого пагубного влияния на мою психику. Был ли это сарказм? Решайте сами.
Extra bonus endorsement
Тем, кто хочет игру про иллюминатов и странные теории заговора, КОТОРАЯ НА САМОМ ДЕЛЕ ХОРОША, стоит вооружиться копией Doom II, подходящим современным сорс-портом (я использую GZDoom) и отличным мегавадом «Ancient Aliens». Стоит отметить следующие моменты:
(1) Она очень сложная — на Ultra-Violence вас будут регулярно стирать в порошок;
(2) Она очень красочная — здесь совершенно другая палитра по сравнению с обычными wad-файлами для Doom: яркий неон повсюду и куча синего, намертво спаянного с маджентой;
(3) Звучит она потрясающе, ведь все фоновые треки написал Stuart Rynn — ответ мира Doom композитору Henri Sorvali;
(4) Я не утверждаю, что ее сделали пришельцы... но это были пришельцы.
Второй wad, Final Doomer, добавит выбор оружия, адаптированного под разные фанатские мегавады, включая и Ancient Aliens. Поставьте его сверху для удвоения впечатлений!
Ancient Aliens совершенно заслуженно получил награду Cacoward в 2016 году. Забирайте прямо СЕЙЧАС!
https://doomwiki.org/wiki/Ancient_Aliens
https://www.doomworld.com/idgames/levels/doom2/Ports/megawads/aaliens
Development log
Здесь особо не о чем рассказывать, учитывая, что на все ушло в общей сложности два вечера и один полный день. Это все равно гораздо больше, чем обычно перепадает большинству релизов для CSSCGC, но я не привык делать работу наполовину.
24 ноября 2020:
- Нарисовал экран и набросал на Spectrum грубый алгоритм генерации пирамиды на BASIC (чтобы сверять результаты с машинным кодом), используя связку из BASin, Fuse, Spectaculator, Spin и Notepad++, чтобы все выверить, поскольку набивать строки в ZX81 через EightyOne заметно более трудоемко.
25 ноября 2020: - Разработал процедуру в машинном коде для генерации пирамиды на ZX81. Там это немного проще, так как символы A-F в наборе символов идут сразу за 0-9. Также выяснил, какие финальные комбинации в пирамиде вообще возможны: первой цифрой всегда будет 8-F, а второй — всегда нечетное число (включая B, D, F). Это дает в общей сложности 64 возможные комбинации из 256 двухзначных шестнадцатеричных байтов.
26 ноября 2020: - Все остальное. Протестировал процедуру в машинном коде, и как только она заработала, остальная часть игры практически собралась сама собой. Написал процедуры для ввода трех hex-кодов, проверки их корректности, заполнения пирамиды (большая часть этого уже была сделана на Spectrum во время первоначального тестирования машинного кода), а затем проверки, выиграли мы или нет. Инструкции и нелепую предысторию прикрутил в самый последний момент, когда все остальное уже было готово.
А затем началась дальнейшая разработка этой версии, с которой проблем оказалось больше, чем с оригиналом, стоило мне только решить втиснуть ее в память примерно на 6K меньше, чем у расширенного ZX81...
1 октября 2021:
- Сделал версии для Spectrum вплоть до V0.3 (все еще в 48K), где это по сути порт оригинала с ZX81 на Spectrum, с дизеринговой графикой ZX81, заданной как UDG (даже те символы, которые нам не нужны), CHR$ и CODE изменены с учетом отличающихся на Spectrum значений для 0-9, A-F и a-f, а машинный код пересобран для упрощения процесса от первоначального POKE ввода до PEEK результата (с теми же результатами, что были на ZX81).
- V0.4: оптимизированы некоторые строки с множественными операторами — это незначительный процесс.
- V0.5: процесс построения пирамиды оптимизирован способом, который был недоступен на ZX81, с использованием серии операторов DATA для хранения позиций PRINT AT блоков на пирамиде и того, какие из них должны заполняться следующими. (Думая об этом сейчас, я мог бы поместить это в начальный REM после машинного кода, но что сделано, то сделано...)
- V0.6 предназначалась для переноса на «основную машину» (т.е. не BASin) путем ампутации всего бейсика, генерировавшего машинный код и UDG, чтобы их можно было загружать извне, и проверки, возможно ли уместить эту игру в 16K Spectrum. Оказалось... еле-еле, оставалось менее 1K на реализацию всех запланированных дополнительных украшений.
13 ноября 2021:
- V0.7: Вернулся к этому проекту, чтобы довести его до конца. Переписал процедуру ROT13 в машинном коде, и она работает — это сэкономило несколько байтов! (42 байта машинного кода по адресу 32404.)
- V0.7a: Ужал всю программу примерно на 1.5K по сравнению с тем, что было, используя старую технику 1K ZX81 с NOT/SGN/INT PI и кучей VAL. Выжили только номера GOTO и GOSUB!
- V0.7b: Сохранил все данные для построения пирамиды (были строками 2300-2390 в V0.5) в виде одиночных байтов кода. (50 байтов не-машинного кода по адресу 32354.)
14 ноября 2021:
- V0.8: Начал делать улучшения для Spectrum. Добавил шесть различных цветовых вариантов — хотя только в одном из них на экране будет одновременно более двух цветов! Использовал от USR "o" до USR "r"+7 для хранения цветовых кодов каждого из них.
- V0.9: Добавил звуки — адаптировал несколько процедур в машинном коде из Defender от M.J. Levers (Sinclair Programs, июль 1983) и из Starfire от Martyn C. Davies (Virgin Games, 1983), чтобы одна и та же процедура воспроизводила длинные повышающиеся или понижающиеся тона (как в Starfire) или короткие (как в Defender или по команде ZOOM на SAM Coupé). Добавил столько звуков, сколько было возможно до появления ужасной ошибки «4 Out of memory»!
- V0.9f — последняя рабочая версия перед созданием кассетной версии. Потребовалась дополнительная процедура для LDIR графики ZX81 по адресу 65368 на любой модели, кроме 16K Spectrum. В конце успешной игры (т.е. со всеми определенными переменными и самой длинной финальной версией w$) остается 530 свободных байтов. Это менее чем в 100 байтах от зависания компьютера при повторном запуске и попытке загрузить код с microdrive (что, надо признать, не вошло в финальную версию).
Поделитесь вашим мнением о статье