ATTR_MAZE 3D: об игре и правила

Woot! #06

ATTR_MAZE 3D

By Andy 'Uglifruit' Jenkinson
For the 48K ZX Spectrum
Written for Woot 2022

ВКРАТЦЕ:
Q, A, O, P — перемещение по лабиринту, поиск чёрных панелей.
SPACE/M — сыграть в мини-игру на чёрной панели.
Наберите в общей сложности 10 000 очков, а затем найдите выход.
Удерживайте 1 для просмотра карты.
Итоговый счёт зависит от количества сыгранных мини-игр и того, сколько раз вы открывали карту.

ПРЕДЫСТОРИЯ:

Вы сидите в своей крошечной камере 8x8, слушая объявление по громкой связи. Система оповещения сообщает, что владыки, удерживающие вас здесь — вероломные Attrs, — запускают очередной «Лабиринт» на потеху массам, и они уже выбрали «Крысу» этого года. Когда звучит идентификационный номер гражданина, которому предстоит участвовать, вы с нарастающим ужасом понимаете, что это вы...

Лабиринт — даже само его название вселяет страх в разумных существ: кошмарные аляповатые коридоры, по которым нужно блуждать в поисках «Игр». Сами Игры — это извращённое подобие древних испытаний, служащее лишь для того, чтобы глумиться и унижать «Крыс», пока жестокие Attrs наблюдают и «оценивают» их успехи.

Перед тем как бросить вас в Лабиринт, голос из динамика велит сделать этот «крысиный забег» зрелищным для зрителей — никаких заминок! — и выкладываться на полную: публика терпеть не может скуку. Вы знаете, что если бродить по Лабиринту слишком долго, итоговый счёт может обнулиться, даже если вы дойдёте до конца. Допускать этого нельзя: такое уже случалось, и о тех «Крысах» с тех пор никто ничего не слышал.

«Удачи», — неискренне бросает стражник Attr, вытаскивая вас из камеры и выталкивая через дверь в ярко освещённый лабиринт...

...Пока глаза привыкают к ядовитым цветам вокруг, вы усмехаетесь про себя. У вас есть тайна. В крошечной камере 8x8 один из кирпичей шатался, а за ним был спрятан свёрток с предметом, похожим на компас, и куском пергамента.

На одной стороне пергамента была начертана карта Лабиринта, а на другой нацарапаны подсказки и инструкции по использованию компаса:

«Привет, Крыса. Тебе наверняка страшно, но мы сможем через это пройти...
Твоя цель — пройти Лабиринт, а значит, набрать 10 000 очков и затем найти выход.
Зарабатывать очки просто: находи ЧЁРНЫЕ ПАНЕЛИ в лабиринте и играй в скрытые за ними Игры.
Игр всего четыре, под кодовыми именами DGE, BMB, SNK, FLP. В каждую можно сыграть только один раз, после чего панель становится белой и бесполезной (хотя может пригодиться для ориентирования). Когда ты найдёшь и пройдёшь все четыре игры, откроются ещё четыре панели. Первые четыре игры всегда расположены неподалёку от места старта, так что найти их будет не слишком сложно. Если же понадобится помощь, тут-то и пригодится компас: он откалиброван так, чтобы указывать направления стен Лабиринта, и когда ты находишься НА ОДНОЙ ЛИНИИ С АКТИВНОЙ ПАНЕЛЬЮ, на бордюре появится цветная полоса соответствующего направления. Ты не будешь знать, как далеко находится панель, но на более поздних этапах игры это поможет. Если совсем зайдёшь в тупик, МОЖНО ИСПОЛЬЗОВАТЬ КАРТУ — она покажет расположение ПАНЕЛЕЙ (как активных, так и использованных) и ТВОЁ МЕСТОПОЛОЖЕНИЕ, но каждое её открытие будет стоить 100 очков в конце игры.

Да, и ещё... КАЖДАЯ СЫГРАННАЯ ИГРА тоже обойдётся в 100 очков при финальном подсчёте. Так что постарайся сыграть как можно меньше раз, чтобы набрать заветные 10 000 очков.

Когда наберёшь 10 000 очков, откроется особая Панель, а все остальные перестанут действовать — направляйся к ней, чтобы выбраться».

Итоговый счёт будет зависеть от того, сколько времени у вас ушло на набор 10 000 очков. Максимальные 10 000 были бы возможны, если бы вам как-то удалось набрать 10 000 очков, не играя ни в одну игру, потратив ноль секунд и ни разу не заглянув в карту. Понятно, что это невозможно, но постарайтесь выбить больше 6000. Всё, что меньше — просто стыдно. А не набрать очков вообще — полнейший позор (но вполне реальный, если вы не очень сильны в играх). Поэтому, если вы слегка трусите, можете ПОТРЕНИРОВАТЬСЯ В ИГРАХ ПЕРЕД ТЕМ, КАК ВОЙТИ В ЛАБИРИНТ».

Пергамент гласит дальше:
Q — ВПЕРЁД
A — НАЗАД
O — ПОВОРОТ ВЛЕВО
P — ПОВОРОТ ВПРАВО
SPACE/M — ОТКРЫТЬ ПАНЕЛЬ (стоя лицом к ней)
1 — (УДЕРЖИВАТЬ ДЛЯ) КАРТЫ

А в играх:
DDG:
O — ВЛЕВО
P — ВПРАВО

BMB:
SPACE/M — СБРОС

SNK:
Q — ВВЕРХ
A — ВНИЗ
O — ВЛЕВО
P — ВПРАВО

FLP:
SPACE/M — ВЗМАХ

И в МЕНЮ:
SPACE/M — ВОЙТИ В ЛАБИРИНТ
I — ИНФОРМАЦИЯ
1,2,3,4 — ТРЕНИРОВКА В ИГРАХ (ДЛЯ СЛАБАКОВ) и 5 для СУПЕРСЛАБАКОВ».

DEVELOPMENT

Путь к этой игре был долгим — изначально она создавалась как проверка концепции на BASIC, а затем на ассемблере, за который я взялся в октябре 2021 года. Меня вдохновила Knot In 3D от Malcom Evans и использование цветов для передачи 3D-пространства. Мне стало интересно, смогу ли я сделать что-то вроде его же ZX81 Monster Maze, но используя исключительно атрибуты.

Это по-настоящему заставило меня выжать максимум из своих навыков ассемблера, и я уверен, что местами написал крайне неэффективный код. Но я всё равно очень горжусь тем, что не использовал библиотечные подпрограммы, а написал абсолютно всё с нуля — вплоть до звукового движка для проигрывания мелодий (который использует изменяемую скважность импульса для создания своеобразного «фазированного» звучания).

Сама игра очень проста (и не то чтобы приносит массу удовольствия). Бродите по лабиринту, находите чёрные панели, играйте в мини-игры, а затем — как только наберёте в сумме 10 000 очков — ищите панель выхода. Я знаю, что мини-игры сложные, поэтому вы можете потренироваться в них из главного меню (клавиши 1, 2, 3, 4). Клавиша «5» в меню замедляет игры и снижает требуемую планку, если вам совсем тяжело.

Несколько подсказок и любопытных моментов:

  1. Dodge Walls. Управление: O/P — влево и вправо. Она ОЧЕНЬ, ОЧЕНЬ дерганая, привыкайте к движениям как можно скорее. Результат в 1000 очков — уже отлично.
    Игра во многом основана на моей 1K-игре «Slither Highway», которую я написал для конкурса 1K-программирования — хотя код здесь написан заново с нуля, без копирования исходников. Любопытная деталь: стены генерируются не совсем случайно. Сначала берётся случайное число (0–256), но затем игра считывает младшие 2 бита из данных ROM, чтобы решить, сдвинется ли стена на одну позицию влево, вправо или останется на месте.

  2. Plane Bomba. Управление: M или SPACE. Вы получаете больше очков за уничтожение блоков тёмных цветов. Не бомбите только белые блоки — старайтесь бить в одно и то же место раз за разом. В какой-то момент появится возможность сбросить бомбы в двух разных местах за один пролёт и заработать ещё больше очков. Стремитесь набрать более 1000 за заход.
    Писать её было интересно — моменты, когда нельзя сбросить бомбу (пока предыдущая ещё в воздухе), и подавление дребезга клавиш (чтобы нельзя было зажать огонь), были сделаны намеренно, ради большего азарта.

  3. Snake. Клавиши: q, a, o, p. Она ОЧЕНЬ быстрая. Чтобы в это играть, пейте побольше кофеина. Набрать 1000 очков — это уже солидное достижение.
    Изначально эта игра была на 50% быстрее, что было просто нелепо. Не знаю, почему я вообще решил, что это нормально, ведь она и так достаточно сложная. Примечание: я сделал так, что нажатие клавиши в направлении, противоположном движению, ничего не делает — это помогает быстро разворачиваться и не рисковать «укусить себя за плечо», если нажатие клавиши не зарегистрировалось. Мне очень нравится, как здесь выглядит змейка, хотя она розовая — получается, это червяк, да? Игра крайне неэффективно хранит каждый адрес сегмента змейки и сдвигает их вниз по таблице на каждом шагу. Я знаю, что индекс начальной точки был бы куда разумнее. Но я сделал всё через одно место.

  4. Flapi Block. Клавиши: m или Space. Это очень сложно. Иногда я могу набрать 1000 очков. Иногда.
    Да, я знаю. Точность позиционирования намного выше разрешения экрана, поэтому движение (со стороны) выглядит немного похожим на гравитацию — но на микроуровне может быть тяжело. Короткие нажатия — ваши лучшие друзья. Длинное нажатие заставит вас отскочить от потолка. Вы также можете отскакивать от пола — когда у меня получилось заставить это нормально работать, это был очень приятный момент в разработке. По мере игры проёмы в стенах становятся меньше, а затем и сами стены сближаются. Тестировать это было тяжело, так как играю я отстойно. Но именно поэтому она нравится мне больше всего.

КАРТА: Нажатие (и удерживание) клавиши 1 показывает карту. Использованные панели отображаются темно-синим цветом, активные — белым, а вы — цветом cyan. (Я знаю, что цвета панелей не соответствуют самой игре, но чёрный цвет для тех, что вы ищете на карте, выглядел ужасно). Занятный факт: в памяти в самом низу есть неиспользуемая и недоступная секция карты (на самом деле она размером 32x32), но в ней нет мини-игр, и на экране карты она не отображается.

Бордюр: На бордюре есть индикатор направления к активным панелям относительно вас — изначально предполагалось, что это будет единственный способ навигации по лабиринту. Мне эта идея нравилась, но она была сложноватой (пожалуй), особенно если вы не знаете лабиринт. Поскольку процедура отрисовки лабиринта работает только с атрибутами (Attributes), остаётся уйма свободного времени (три HALT'а), чтобы втиснуть процедуру бордюра. Если убрать эти halt'ы, лабиринт станет слишком, слишком быстрым.

Кое-что, чего вы, вероятно, не заметите, пока я вам не укажу:

Игрок и первые игры всегда появляются в верхней трети карты, так что вы почти наверняка наткнётесь на какую-нибудь игру без долгих поисков. Это было сделано, чтобы новички быстрее вникли в суть и не бродили бесцельно.

При случайном выборе начальной позиции игрок никогда не появляется лицом к стене.

Процедура случайного размещения новых панелей оказалась сущим кошмаром при проверке условий. Подходящие места на карте для панели должны были иметь два блока «стен» по обе стороны либо по горизонтали, либо по вертикали (но не в обоих направлениях сразу) и как минимум одну «пустую» клетку пола рядом. Трехмерный движок (3d Engine) не дружит с панелями на внешних углах, поэтому это тоже нужно было проверять и исключать.

Если две черные панели находятся рядом на внутреннем углу, существует вероятность, что в игре Snake появится черный «бордюр», через который змейка сможет сбежать! Этот крайне ситуативный баг был обнаружен уже на самых поздних стадиях разработки.

У каждой мини-игры есть своя музыкальная тема. Мелодия звучит во вступительной части, при старте игры, при наборе 10 000 очков и, наконец, при выходе из лабиринта. Музыкальных данных там довольно много — особенно с учётом того, что хранятся они не самым экономным образом.

Экран с информацией, набранный крупным шрифтом ('Big Font'), делать было весело, а вот писать инструкции к игре (почти исключительно) пятибуквенными словами оказалось сущим мучением.

Моя подпрограмма перевода числа в десятичный вид (для вывода счёта) использует ужасно топорный метод «в лоб». (Вычитаем 1000 и считаем, сколько раз это удастся сделать до возникновения переноса. Затем повторяем то же самое для сотен и десятков.) Есть способы и получше — ума не приложу, почему мне не пришло в голову взять готовую процедуру... Вряд ли я первый человек, которому понадобилось выводить счёт в игре!

Кроме того, здесь есть пара клавиш для отладки/читов/дополнительных функций. В меню клавиша 5 переключает «лёгкий» режим. Она добавляет дополнительную команду HALT во все мини-игры (замедляя каждую примерно до 3/4 от исходной скорости) и устанавливает целевой счёт в 5000 вместо 10 000. В меню можно нажимать 1 (Dodge Walls), 2 (Plane Bomba), 3 (Snake Bites) и 4 (FlapiBlock), чтобы потренироваться в мини-играх — причём они будут работать с выбранной скоростью (обычной или лёгкой), так что при необходимости можно попрактиковаться «на приставных колёсиках».

ЧИТ: одновременное нажатие 2 И 3 во время игры установит ваш счёт на значение чуть меньше целевого, так что вы сможете увидеть концовку, если вам лень проходить игры. Нажатие 4 и 5 на экране карты завершает игру, если вам стало скучно.

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

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

Andy.
4 декабря 2022 г.

P.S. ХАК: есть ещё одна скрытая «фича», но я позволю вам найти её самостоятельно — вам придётся внимательно изучить загрузочный экран...

P.P.S. Я только что набрал 7940 очков. Ни разу не заглянул в карту.

Поделитесь вашим мнением о статье