Multi-Platform Arcade Game Designer: движок для ZX Spectrum (и других, менее интересных, платформ)

В комментариях к посту про Organic Matter был проявлен какой-то микроинтерес к разработке игр для ZX Spectrum, поэтому расскажу немного о Multi-Platform Arcade Game Designer (MPAGD).

x1bf0fD

Как ясно из названия, это инструментарий для разработки аркадных игр под разные платформы. Под «разными платформами» в данном случае подразумеваются восьмибитные компьютеры, включая ZX Spectrum, но не включая Commodore 64. Я пробовал делать игру только под «Спектрум», так что рассказанное ниже, возможно, будет частично неактуально для других платформ. Кроме того, дальнейшая разработка проекта ведется, хотя и довольно вяло, так что некоторые упомянутые недостатки могут быть исправлены. Не исключено, что могут пропасть и некоторые достоинства: например, в своей игре я использовал эффект «покраски», когда спрайт оставляет за собой цветной след, если ему не включить цвет по умолчанию. Это работало в версии 0.7.9, но было убрано в 0.7.10.

Итак, MPAGD — это среда разработки для Windows, поэтому некие базовые действия, такие как размещение объектов, можно делать мышкой. Однако в каждом экране есть также множество действий, которые делаются только с клавиатуры — дублирующих кнопок в интерфейсе нет, и за справкой надо лезть в мануал в DOC-формате. К тому же в разных экранах одни и те же кнопки могут нести разные функции, например, в режиме создания уровней из блоков стрелки двигают содержимое всего экрана, а в режиме расстановки спрайтов — переключают экраны.
Отдельной строкой — отмены действия, даже одиночной, здесь нет. Кликнул не туда — перекликивай.

Чтобы создать игру, надо задать формат экрана (на какой его части будет происходить интерактивное действо, где будут расположены счетчики жизней и очков, и т.п.), нарисовать блоки, из которых составляется игровая графика, сделать из них уровни, нарисовать спрайты и расставить их на уровнях, задав модели поведения, которые можно выбрать из небольшого списка. Игра также поддерживает действия с уникальными предметами в квестовом духе. Для каждого из описанных режимов есть свой экран — и увидеть сразу блоки, предметы и спрайты нельзя ни на каком из этих экранов. Это тоже немного неудобно.

OmMubr7
Размер спрайтов фиксированный: 16x16.

По нажатию специальной кнопки MPAGD генерирует скрипты, отвечающие за поведение спрайтов и прочее, однако эти скрипты можно дорабатывать. К сожалению, скриптовый язык довольно примитивен:
1) В нем нет математических выражений — вместо B = 3*A+1 нужно написать
LET B = A
MULTIPLY B BY 3
ADD 1 TO B

Вычисления целочисленные, у каждого спрайта, помимо координат, есть 3 параметра - DIRECTION, SETTINGA и SETTINGB. Второй и третий можно использовать произвольно. Первый обычно используется для указания направления, куда смотрит персонаж, но в принципе тоже может быть переназначен для чего-то другого, если нужно. Есть также 24 глобальные байтовые переменные с именами от A до Z (кроме X и Y).

Вот для примера ещё кусочек кода, проверяющий 4-й бит в переменной A (написан Кесом ван Оссом, который мне вообще сильно помог с программистской частью, даже написал несколько подпрограмм на ассемблере):
LET I = A
DIVIDE I BY 8
LET J = I
DIVIDE I BY 2
MULTIPLY I BY 2
SUBTRACT I FROM J
IF J = 1 ; 4-й бит равен 1
 <что-то>
ENDIF

Просто и наглядно, не правда ли?

2) Нет также и логических выражений, например, вместо IF (A AND B) <сделать что-то> нужно написать
IF A
 IF B
  <что-то>
 ENDIF
ENDIF

3) Нет функций. Если вы хотите повторить какой-то кусок кода, нужно либо писать суперхитрую систему условий, при которых он должен использоваться, либо просто писать его дважды. А повторы кода — вещь особо неприятная, когда у тебя в распоряжении всего пара десятков килобайт памяти. К счастью, здесь все-таки есть отдельные команды для вывода произвольных меню и списка предметов, которые есть у героя, но меню инвентаря выглядит, например, так:

INV “THING1, THING2, THING 3…”

И если вам нужно, чтобы оно выводилось в двух разных местах кода, вам придется повторить эту команду — строковых переменных в MPAGD нет. Точнее, есть две команды вывода строк: PRINT "строка" или MESSAGE <номер строки из файла строк>, но они взаимоисключающие, и если использовать обе вместе, будет выводиться белиберда.

Вместо функций на скриптовом языке движок позволяет вызывать подпрограммы в машинном коде (но если вы решили писать на ассемблере, зачем вам MPAGD?)

Движок больше заточен под платформеры или игры типа пакмана с одноэкранными уровнями, проходимыми один за другим. В компиляторе есть режим adventure с запоминанием изменений в блочной структуре экранов (например, если в стене прострелена дыра), но они отъедают дополнительную память и могут быть (как я подозреваю) причиной глюков. 

Наконец, для большей скорости работы код игры располагается в так называемой uncontested верхней памяти, поэтому под игру у вас остается ещё меньше места, чем в принципе есть на «Спектруме».

Но зато, да, движок быстрый, со встроенным обсчетом столкновений — и работать с ним таки проще, чем писать игру в машинном коде. Я бы сказал, что для «Спектрума» аналогов MPAGD с точки зрения баланса удобства и функциональности просто не существует.