Просмотр полной версии : Дизасм игры Saboteur
С середины марта по начало мая занимался дизасмом игры Saboteur, который первый.
Дизасм делался с целью портировать игрушку на БК/УКНЦ и возможно Вектор-06Ц.
Дизасм через SkoolKit.
Исходники дизасма: https://github.com/nzeemin/skoolkit-game-revs/tree/master/saboteur1-zx
HTML: https://nzeemin.github.io/skoolkit-game-revs/saboteur1-zx/saboteur/
В игре 119 экранов (комнат).
Карта всех комнат: https://nzeemin.github.io/skoolkit-game-revs/saboteur1-zx/saboteur/images/roomaddrmap.png
Что разобрано:
- главное меню, построение картинки двух ниндзя
- построение рамки игрового поля
- построение комнат (и расписаны все room sequences), переходы между комнатами
- все спрайты (спрайты охранников делаются из спрайтов Ниндзя на лету, заменой тайлов)
Что недоделано (после полутора месяцев у меня уже просто не хватило терпения):
- логика работы объектов
- логика игры в части поведения персонажей, столкновений между ними
Построение экрана: шесть тайл-планов 30x17 тайлов:
- Tile screen 0 — background, 9-byte tiles — биты + атрибут
- Tile screen 1 — флаги обновления; 0 — не обновлять
- Tile Screen 2 — Ninja — тайлы 16 байт $E700 based — биты и маска + mirroring
- Tile screen 3 — Dog— тайлы 16 байт с базой $F0F0 — биты и маска + mirroring
- Tile Screen 4 — Guard — тайлы 16 байт с базой $E700 — биты и маска + mirroring
- Tile screen 5 — front — тайлы 17 байт с базой $D600, — биты и маска + атрибут, no mirroring
nzeemin, я сам не разбирался (равнодушен к saboteur), но интересно, чем не устроил проект для корвета (https://zx-pk.ru/threads/15302-korvet-igry.html?p=1175152&viewfull=1#post1175152)?
nzeemin, я сам не разбирался (равнодушен к saboteur), но интересно, чем не устроил проект для корвета (https://zx-pk.ru/threads/15302-korvet-igry.html?p=1175152&viewfull=1#post1175152)?
Да, я конечно видел тот проект и говорил с ув. Willy, но его порт делался повторением поведения оригинала, т.е. весь код написан с нуля.
В своих портах я предпочитаю полностью повторять поведение за счёт восстановления кода и его покомандного переписывания.
Ну и в целом, после работы над Saboteur 2, мне было интересно, а как же устроена первая версия. Там действительно есть общие вещи, такие как устройство экрана например.
а перед этим была игра DeathPit
https://spectrumcomputing.co.uk/entry/9662/ZX-Spectrum/Death_Pit
"Clive Townsend, however, did use some of the routines from this game in the programming of Saboteur."
........
интересно на что влияет выбор сложности игры (0-9) ?
интересно на что влияет выбор сложности игры (0-9) ?
См. таблицу E38C: задержки для охранников/собак/турелей, начальное время и время для бомбы, состояние пяти стенок (переключаются с консолей), комната где лежит бомба, положение бомбы в этой комнате.
а изначально для игры планировалось название Ninja Darkness
https://tzxvault.org/Spectrum/Screens/NinjaDarknessPIC4.png
состояние пяти стенок (переключаются с консолей)
ага, понятно.
ещё нашёл упоминание про это на другой карте к игре
https://maps.speccy.cz/map.php?id=Saboteur1
ага, понятно.
ещё нашёл упоминание про это на другой карте к игре
https://maps.speccy.cz/map.php?id=Saboteur1
На многих картах (в том числе на этой) нарисованы комнаты, которых в коде реально нет.
Часть комнат повторяется в разных местах. Например, вагончик метро существует в единственном экземпляре.
что-бы сделать карту совсем не обязательно изучать потроха игры и знать машкод.
графика снимается спец.утилитой из окна эмулятора.
........
оказывается в `новой` версии расширили финал.
есть анимация улетающего вертолёта и диалоги.
https://pic.maxiol.com/thumbs2/1747755668.3645248167.final.png (https://pic.maxiol.com/?v=1747755668.3645248167.final.png&dp=2)
что-бы сделать карту совсем не обязательно изучать потроха игры и знать машкод.
графика снимается спец.утилитой из окна эмулятора.
Само собой, как бы я иначе скриншоты комнат делал.
Но я про то что эти люди зачем-то рисовали на планах комнаты, которых в принципе нет и быть не может.
Кстати, могу дать рецепт как попасть в любую комнату, с помощью отладчика:
1. Находясь в любой комнате, ставим точку останова на B66A ("Current Room changed, entering the new Room") и продолжаем игру
2. Управляя Ниндзей, переходим в другую комнату -- срабатывает точка останова на B66A.
3. В память по адресу 7184 заносим адрес любой комнаты, продолжаем работу игры -- Ниндзя оказывается в нужной комнате.
Но при этом конечно можно "застрять в текстурах" либо оказаться в воздухе и упасть.
Дизасм Saboteur оформлен в виде компилируемого файла, собирается с помощью pasmo в такой же точно бинарный файл как снятый после загрузки игры образ памяти.
Объём кода -- 10K строк.
https://github.com/nzeemin/spectrum-saboteur1-rev
vlad-kras
09.08.2025, 10:07
а изначально для игры планировалось название Ninja Darkness
https://tzxvault.org/Spectrum/Screens/NinjaDarknessPIC4.png
А с какого сайта эта картинка? Не найду ни на WOS, ни на Spectrum Computing.
А с какого сайта эта картинка?
из исходников Клайва (на микродрайве)
Не найду ни на WOS, ни на Spectrum Computing.
https://www.mobygames.com/game/15114/saboteur/promo/
Некоторые детали, найденные по ходу дизасма.
Ошибку нашёл пока только одну:
B751 LD B,$23 35 objects - BUG: actually, 29 objects
Здесь перебираются объекты по таблице D34D, всего их там 29, но в цикле стоит счётчик на 35. В оригинале ошибка не проявляется, потому что сразу после таблицы идут спрайты (блоки тайлов). При переборе строк таблицы сначала идёт сравнение первых двух байт на номер текущей комнаты. В данных спрайта конечно такого совпадения нет. При конвертации на кода игры УКНЦ я поставил сразу за этой таблицей другую, DE84, в которой тоже перечисляются комнаты, получил артефакт на первой же комнате с собакой.
Неиспользуемые блоки данных:
7361 -- "room token", процедура которая вызывается из обработки последовательности токенов, для подготовки комнаты в виде набора тайловых мапов. Процедура 7361 не входит в список токенов, но по виду это явно "room token". По действию, она рисует рамку вокруг игрового поля. Рисование рамки было переделано в RLE последовательность, этот токен стал не нужен, но процедура осталась. (Дополнение: Косвенно, это говорит о том, что видимо, изначально рамка была частью игрового поля, но потом автор понял, что незачем держать эти статичные данные, и игровое поле стало меньше на 1 тайл с каждой стороны.)
A13D -- неиспользуемая процедура инициализации комнаты, в этой комнате есть охранник.
A17E -- неиспользуемая процедура инициализации комнаты, в этой комнате есть "turret gun".
B437 -- неиспользуемая процедура инициализации комнаты, в этой комнате есть собака и охранник.
Возможно, планировалось сделать на несколько комнат больше, но мы не знаем на сколько именно больше (процедуры инициализации нужны только для комнат с чем-то подвижным внутри).
Кран (спрайт F98F) в комнате 84A8 статичен, но не входит в последовательность комнаты (так сделаны другие подобные блоки), а вписывается отдельно в процедуре инициализации. Возможно, автор хотел сделать его подвижным, или, например, крюк мог быть в разном положении в зависимости от триггера.
На основе реверса кода игры для ZX Spectrum, сделана конверсия (порт) игры на УКНЦ -- см. тему https://zx-pk.ru/threads/36396-saboteur-1-dlya-uknts.html
Кран (спрайт F98F) в комнате 84A8 статичен, но не входит в последовательность комнаты (так сделаны другие подобные блоки), а вписывается отдельно в процедуре инициализации. Возможно, автор хотел сделать его подвижным, или, например, крюк мог быть в разном положении в зависимости от триггера.
"How do they carry those big crates up the tiny ladders ?
Clive's answer: "They don't! The central part of the warehouse has a lift"
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot