zx7 etc...

Когда писал код движка, рассчитывал на то что игра будет только в snap-версиях, все же 2018 год, 21й век, эмуляторы спектрума сейчас где угодно есть… Поэтому если в игре настала смерть главного героя или он попал в безвыходное положение ( о чем игра любезно умолчит ), подразумевалось что игрок заново тыкает в файл “cell3326.sna” и эмулятор за секунду загружает новую игру.

Никогда бы не подумал что игру захотят запустить на реале, но внезапно поступил запрос на tap-версию.

Ок. Первая версия tap формируемая исключительно sjasmplus почему-то не захотела корректно загружаться в эмуляторах без включенной опции ускоренной загрузки, пришлось задействовать утилиту bin2tap.

Тут всплыло 2 нюанса:

  • грузить игру через tap без сжатия несколько медленно и не круто
  • после смерти главного героя для повторного прохождения игры приходится снова загружать tap

Пришлось разделить игру на 3 части:

  • собственно скриптовый движок
  • статические данные ( скрипты, описание предметов)
  • изменяемые данные (карта уровня, начальные параметры предметов и героев)

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

На данный момент игра не предусматривает загрузки уровней с различными предметами, поэтому движок и статические данные объединил в одну секцию…

Посмотрел как сжимает 7zx - сжимает отлично, повезло что в память 48к умещалась вся игра как в запакованном так и в распакованном виде ( карта 32x32 в демо-версии заполнена в основном нулями, массив описания предметов тоже ), это значит не нужно переходить на 128к или перемещать данные с места на место после распаковки.

В итоге код в памяти выглядит так:

[ движок+статические данные ]
[ динамические данные ]
[ сжатые динамические данные ]
[ сжатые статические данные ]
[ распаковщик ]

Две последние секции понадобятся только один раз - при первоначальном запуске распаковщика, который распакует статические данные и передаст управление на движок…

Перешел с Atom на VisualStudio Code. VSC позволяет организовать сборку через запуск зависимых тасков в файле tasks.json - клевый тулчейн для сборки, все почти по-взрослому :)

  • “parts.asm”: sjasmplus компилит игру и сохраняет в виде файлов статическую (static.bin) и динамическую (dynamic.bin) части
  • “zx7”: архиватор zx7 сжимает бинарные файлы в static.bin.zx7, dynamic.bin.zx7
  • “one.asm”: sjasmplus сохраняет на диск сжатые данные + распаковщик в виде файла game.bin, выводя в консоль сборки данные об адресе начала файла в памяти(BINARY BEGIN), его длине (BINARY SIZE) и адресе запуска распаковщика (BINARY START)
  • к сожалению ручная правка параметров из предыдущей задачи в строке запуска задачи make_tape (пока не научился автоматически передавать параметры из одной задачи в другую, на bash-скрипты завязываться не хочу)
  • “make_tape:” запуск утилиты bin2tap для сборки tap-файла.

Добавил в начало движка инициализацию игры ( обнуление переменных, распаковка динамических данных ) и сделал в скрипте game_over переход на начало после нажатия any key. Как-то так…

Written on July 3, 2018