Spiiin's blog

Устройство уровней NES-игр с блоками 16 тайлов + 1 байт палитры.

После праздников взял в руки NesBlockFinder, и прошёлся им по играм, добавленным в CadEditor с помощью Autocorrupter‘а. Схема простая – меняем в редакторе в тестовом РОМе один из блоков на первом экране на 0-й (по нему проще находить начало списка блоков), и запускаем поиск блоков в BlockFinder’е. С помощью применения такого подхода обнаружилась целая группа игр, в основе описания уровней которых содержится одна и та же структура: Она состоит из 16 байт, которые построчно кодируют номера 16-тайлов видеопамяти, по ним строится блок размером 4x4 тайла (именно блок, а не макроблок, как в играх капком). В дополнение к индексам тайлов с таким блоком связан 1 байт, в котором закодированы индексы палитры для каждой группы 2x2 блока (выделены на скриншоте разными цветами), по 2 бита на каждую группу из 4х блоков слева-направо сверху-вниз. Биты палитры применяются сразу к группе тайлов из-за аппаратных особенностей NES, именно так на ней хранится описание бекграунда. NesBlockFinder не ищет такие биты палитры, но во всех проверенных случаях это описание оказывалось либо сразу за массивом описания блока тайлами, либо сразу перед ним, так что обнаружить поинтер на эти биты очень просто. Кроме того, каждому тайлу видеопамяти присвоена физическая характеристика (проходимость, стена, передний фон, шипы и т.п.), чаще всего она закодирована в самом номере блока. Эта структура оказалась настолько универсальной, что она обнаружилась в следующих играх: Power Blade 1-2 (разработчик Natsume) Adventure Island 2-3 (Hudson soft) Yo-Noid (Now production) Jackie Chan Action Kung Fu (Now production) Contra Force (Konami) Batman Returns (Konami) Super C (Konami) Monster in My Pocket (Konami) Bucky O’Hare (Konami) Jackal (Konami) Teenage Mutant Ninja Turtles 1-3 (Konami) Alien 3 (Probe entertaiment) Battletoads (Rare) Battletoads & Double Dragon (Rare) Darkman (Ocean software) И, возможно, обнаружится ещё в паре десятков других игр для этой платформы. Такая универсальность объясняется тем, что её легко закодировать (легче, чем иерархическую систему из блоков и макроблоков).