Вход

Просмотр полной версии : Дизасм игры Saboteur



nzeemin
19.05.2025, 14:15
С середины марта по начало мая занимался дизасмом игры 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

ivagor
19.05.2025, 15:11
nzeemin, я сам не разбирался (равнодушен к saboteur), но интересно, чем не устроил проект для корвета (https://zx-pk.ru/threads/15302-korvet-igry.html?p=1175152&viewfull=1#post1175152)?

nzeemin
19.05.2025, 15:38
nzeemin, я сам не разбирался (равнодушен к saboteur), но интересно, чем не устроил проект для корвета (https://zx-pk.ru/threads/15302-korvet-igry.html?p=1175152&viewfull=1#post1175152)?

Да, я конечно видел тот проект и говорил с ув. Willy, но его порт делался повторением поведения оригинала, т.е. весь код написан с нуля.
В своих портах я предпочитаю полностью повторять поведение за счёт восстановления кода и его покомандного переписывания.
Ну и в целом, после работы над Saboteur 2, мне было интересно, а как же устроена первая версия. Там действительно есть общие вещи, такие как устройство экрана например.

goodboy
19.05.2025, 16:39
а перед этим была игра 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) ?

nzeemin
19.05.2025, 16:58
интересно на что влияет выбор сложности игры (0-9) ?

См. таблицу E38C: задержки для охранников/собак/турелей, начальное время и время для бомбы, состояние пяти стенок (переключаются с консолей), комната где лежит бомба, положение бомбы в этой комнате.

goodboy
19.05.2025, 17:13
а изначально для игры планировалось название Ninja Darkness

https://tzxvault.org/Spectrum/Screens/NinjaDarknessPIC4.png

goodboy
20.05.2025, 10:13
состояние пяти стенок (переключаются с консолей)
ага, понятно.
ещё нашёл упоминание про это на другой карте к игре
https://maps.speccy.cz/map.php?id=Saboteur1

nzeemin
20.05.2025, 17:12
ага, понятно.
ещё нашёл упоминание про это на другой карте к игре
https://maps.speccy.cz/map.php?id=Saboteur1

На многих картах (в том числе на этой) нарисованы комнаты, которых в коде реально нет.
Часть комнат повторяется в разных местах. Например, вагончик метро существует в единственном экземпляре.

goodboy
20.05.2025, 18:22
что-бы сделать карту совсем не обязательно изучать потроха игры и знать машкод.
графика снимается спец.утилитой из окна эмулятора.
........

оказывается в `новой` версии расширили финал.
есть анимация улетающего вертолёта и диалоги.

https://pic.maxiol.com/thumbs2/1747755668.3645248167.final.png (https://pic.maxiol.com/?v=1747755668.3645248167.final.png&dp=2)

nzeemin
21.05.2025, 18:21
что-бы сделать карту совсем не обязательно изучать потроха игры и знать машкод.
графика снимается спец.утилитой из окна эмулятора.

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

Кстати, могу дать рецепт как попасть в любую комнату, с помощью отладчика:
1. Находясь в любой комнате, ставим точку останова на B66A ("Current Room changed, entering the new Room") и продолжаем игру
2. Управляя Ниндзей, переходим в другую комнату -- срабатывает точка останова на B66A.
3. В память по адресу 7184 заносим адрес любой комнаты, продолжаем работу игры -- Ниндзя оказывается в нужной комнате.
Но при этом конечно можно "застрять в текстурах" либо оказаться в воздухе и упасть.

nzeemin
09.08.2025, 00:45
Дизасм 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.

goodboy
09.08.2025, 23:40
А с какого сайта эта картинка?
из исходников Клайва (на микродрайве)

Xela
10.08.2025, 11:09
Не найду ни на WOS, ни на Spectrum Computing.
https://www.mobygames.com/game/15114/saboteur/promo/

nzeemin
14.09.2025, 13:01
Некоторые детали, найденные по ходу дизасма.

Ошибку нашёл пока только одну:
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 статичен, но не входит в последовательность комнаты (так сделаны другие подобные блоки), а вписывается отдельно в процедуре инициализации. Возможно, автор хотел сделать его подвижным, или, например, крюк мог быть в разном положении в зависимости от триггера.

nzeemin
29.10.2025, 16:22
На основе реверса кода игры для ZX Spectrum, сделана конверсия (порт) игры на УКНЦ -- см. тему https://zx-pk.ru/threads/36396-saboteur-1-dlya-uknts.html

goodboy
29.10.2025, 18:20
Кран (спрайт 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"