PDA

Просмотр полной версии : Саботер 2 и его карта



vlad-kras
25.12.2022, 15:15
В игре примерно 800 экранов. В 48К спектруме без видеопамяти остается 41К свободно. Итого на описание экрана в среднем можно потратить около 51 байта, но это если вся память отдана под карты. Как это можно вместить экран со всеми лестницами, мебелью, окнами, охранниками в 51 байт?
А там ведь еще нужно место под спрайты и сам код игры. Получается еще меньше места осталось под карту. Если бы экраны повторялись, как в эксолоне, тогда понятно. Но повторы есть только для лифта и планера.

ZX_NOVOSIB
25.12.2022, 15:33
Как это можно вместить экран со всеми лестницами, мебелью, окнами, охранниками в 51 байт?
Это магия спектрума :v2_smoke:

reddie
25.12.2022, 15:37
Элита с ее миллионами звезд задумалась над ответом...

goodboy
25.12.2022, 15:41
Как это можно вместить экран со всеми лестницами, мебелью, окнами, охранниками в 51 байт?
указывается номер объекта и координаты его угла, тут и трёх байтов достаточно.
...........
судя по плану здания (на заставке) комнат с мебелью ~250, а в подвалах почти все комнаты однотипные
...........
я как-то делал наглядный пример построения комнаты из спрайтов (это не saboteur, но всё-же..)

https://i.postimg.cc/SQLF5TN6/dizzy2.gif

vlad-kras
25.12.2022, 16:08
указывается номер объекта и координаты его угла, тут и трёх байтов достаточно.

Да, хорошая идея. Правда в подвалах на потолок состоит из разнообразных сосулек, но может быть это всего один объект "потолок". В некоторых комнатах "офиса" много объектов, больше 10 за счет ящиков, да плюс полы, окна, лестницы и т.д. Тогда если очень грубо прикинуть 10 объектов в среднем на описание комнаты, выйдет 30 байт * 800 = 24000 и останется 17Кб на остальную игру. Вроде реально. Что скажут эксперты картостроители о способах кодирования экранов в играх вообще (элиту не трогаем, там все равно нет экранов)?

goodboy
25.12.2022, 17:03
иногда ещё встречается упаковка карты размещения объектов, перед входом в экран она разжимается

- - - Добавлено - - -


больше 10 за счет ящиков
если присмотреться то группа из определённых ящиков часто повторяется, это вполне может быть один объект

- - - Добавлено - - -

ну и ещё вспомнился такой приём: объект (стол,шкаф,ящик) вполне может состоять из одной половинки, вторая тупо зеркалится.

jerri
25.12.2022, 21:37
В игре примерно 800 экранов. В 48К спектруме без видеопамяти остается 41К свободно. Итого на описание экрана в среднем можно потратить около 51 байта, но это если вся память отдана под карты. Как это можно вместить экран со всеми лестницами, мебелью, окнами, охранниками в 51 байт?
А там ведь еще нужно место под спрайты и сам код игры. Получается еще меньше места осталось под карту. Если бы экраны повторялись, как в эксолоне, тогда понятно. Но повторы есть только для лифта и планера.

посмотри игру Firelord (https://viva-games.ru/game/firelord)

карта весит 3844 байта и вмещает 500 экранов
https://viva-games.ru/wp-content/uploads/zx-spectrum/games-maps/f/Firelord.gif

Black Cat / Era CG
25.12.2022, 21:46
Какая жесть!

goodboy
25.12.2022, 21:50
из похожего сразу вспоминаются: dynatron,tantalus,terminus и starquake

Bedazzle
26.12.2022, 01:12
карта весит 3844 байта и вмещает 500 экранов


Недурно!

P.S.
Раскладка по памяти в HOTM на 255 экранов такая:
https://i.imgur.com/HIE0HkP.png

Описание комнат (двери, цвет, название района замка) - 1031 байт
таблички (номер спрайта, координаты) - 304 байта
предметы (тип объекта, комната, координаты) - 752 байта

т.е. чуть более 2кб. Но конечно, сюда ещё нужно добавить словарь, фразы, которые отвечают монстры, описание предметов.

ultra
26.12.2022, 07:49
Ощущение, что топик 1984 года. Большая карта, серьезно? Непонятно в целом, что такого особенного в Саботёре, если таких сотни с массой экранов.
https://maps.speccy.cz/

nzeemin
26.12.2022, 10:47
Топик кажется про то, как это сделано.
Как пример, Scuba Dive - https://zx-pk.ru/threads/34512-revers-scuba-dive.html

Лабиринт игры определяется в виде "свёртки": таблица AC5D ("мини-карта") содержит 32x32 = 256 индексов блоков, блоки по адресу A4DD состоят из 8x8 тайлов, тайлы по адресу 9134 это 8x8 ч/б пикселов. Итого, весь лабиринт это 256x256 тайлов = 2048x2048 пикселов. На экране мы всегда видим только 24x24 тайлов из этой карты (3x3 блока).
Карта, строится процедурно, изменением байтов в таблице AC5D. Глубина карты зависит от уровня игры (1..4).

Тут получается, что 32x32 = 256 байт описывают огромную карту в ~100 экранов.

nzeemin
26.12.2022, 13:01
Hydro Fool
https://nzeemin.github.io/skoolkit-game-revs/hydrofool-zx/hydrofool/asm.html#27862
200+ комнат
Используются описатели комнат переменной длины.
Один байт на длину описателя.
Один байт на тип комнаты (16 типов) и цвет.
Тип комнаты - это тоже описатель переменной длины.
Основная часть описателя - предметы и их расположение в комнате.

- - - Updated - - -

Commando - вертикальный скроллер, прокрутка вниз
https://nzeemin.github.io/skoolkit-game-revs/commando-zx/commando/asm.html#37430
Уровень это последовательность объектов, которые появляются по мере движения вперёд.
Задаётся только положение объектов рельефа, но не врагов, враги спавнятся сами. Например, если стоит камень определённого вида, то за ним появится враг.

- - - Updated - - -

Bruce Lee под Atari 8-bit и Commodore 64
https://forums.atariage.com/topic/288392-two-bruce-lee-sequels/?do=findComment&comment=4236353
Тайлы размером 4x8 (растянуты до 8x16 на экране), набор тайлов уровня закодирован через RLE для компактности.

Shadow Maker
26.12.2022, 16:53
Насколько я помню на форуме уже дизассмили этого самого Саботёра - можно спросить того, кто это делал как оно там сделано.

nzeemin
26.12.2022, 18:28
Насколько я помню на форуме уже дизассмили этого самого Саботёра - можно спросить того, кто это делал как оно там сделано.

Alex Rider может расскажет, вот тут его тема была - https://zx-pk.ru/threads/24604-saboteur-2-remake.html

ultra
26.12.2022, 20:39
Топик кажется про то, как это сделано.
Cтранно, а мне показалось, что люди кроме Элиты и Эксолона других лабиринтов и карт как будто и не видели. Да и уже давно разжевано как в той же Элите все сделано.

nzeemin
26.12.2022, 20:46
Cтранно, а мне показалось, что люди кроме Элиты и Эксолона других лабиринтов и карт как будто и не видели. Да и уже давно разжевано как в той же Элите все сделано.

Так дали бы ссылки на другие темы форума, а лучше сообщения - где всё это разбирается.
Или лучше душнить в стиле "да всё это уже было".

ultra
26.12.2022, 21:04
Или лучше душнить в стиле "да всё это уже было".
Душнить - это говорить так, как будто кроме Саботёра один Эксолон имеет сотни экранов и на дворе 1984 год какой-то, а не 2022й )
Из последних -
интревью на https://russiangames.me/
статьи https://viva-games.ru/stati/sozdaj-svoyu-sobstvennuyu-igru-na-zx-spectrum-chast-1

jerri
26.12.2022, 21:12
Топик кажется про то, как это сделано.
Как пример, Scuba Dive - https://zx-pk.ru/threads/34512-revers-scuba-dive.html

Лабиринт игры определяется в виде "свёртки": таблица AC5D ("мини-карта") содержит 32x32 = 256 индексов блоков, блоки по адресу A4DD состоят из 8x8 тайлов, тайлы по адресу 9134 это 8x8 ч/б пикселов. Итого, весь лабиринт это 256x256 тайлов = 2048x2048 пикселов. На экране мы всегда видим только 24x24 тайлов из этой карты (3x3 блока).
Карта, строится процедурно, изменением байтов в таблице AC5D. Глубина карты зависит от уровня игры (1..4).

Тут получается, что 32x32 = 256 байт описывают огромную карту в ~100 экранов.

32*32=1024 не?

Shadow Maker
27.12.2022, 12:34
Alex Rider, рассказывайте про формат карты в Саботере 2 :)

Alex Rider
27.12.2022, 13:03
Рассказываю, пока по памяти, без подробностей, которые надо доставать из кода. Если надо будет, гляну позже. Краткий ответ на вопрос: скрипты.
Все игровое пространство разбито на комнаты (экраны), каждый имеет свой однобайтовый номер (тип, идетификатор). Итого, имеем матрицу номеров комнат.
Тип комнаты задает ее отрисовку (почти всю, что-то иногда дорисовывается логикой). Некоторые комнаты повтоярются, особенно в подземелье.
Есть 256 спрайтов фона и 256 спрайтов переднего плана, они состоят из тайлов.
Комнаты бывают 2 типов: надземные и поздемные.
Надземная комната - это скрипт из команд в духе "положи спрайт фона N в X,Y", "нарисуй горизонтальную линию из тайлов N переднего плана из X,Y длины L", "заполни тайлом фона N прямоугольник от X,Y размером W,H".
Типов комнат подземелья мало того, что не густо, так там еще, насколько я помню, "двойная" спрайтовая система: комнаты разбиваются на 6 блоков (3x2 блока), комната кодируется 6 байтами - номерами блоков, а сами блоки задаются теми же скриптами. Иногда в комнатах скриптами дорисовываются какие-нить лампы, например.
Всякие интерактивные и меняющиеся объекты задаются логикой, разбросанной в игре примерно везде - пихаются в тайломапы напрямую и отрисовываюстся в следующем цикле отрисовки. В моей версии чуть более собранно в кучу для оптимизации.
Если интересны подробности - задавайте вопросы, но ответить могу сильно не сразу.

vlad-kras
27.12.2022, 16:11
Cтранно, а мне показалось, что люди кроме Элиты и Эксолона других лабиринтов и карт как будто и не видели. Да и уже давно разжевано как в той же Элите все сделано.

Не только саботер, но в каких еще играх под 48К еще хотя бы 3 сотни экранов без дозагрузок? Рассматриваю именно карты в виде комнат, а не просто "гигантский мир", причем комнаты которые отображаются сбоку и строятся из разных спрайтов. Поэтому элита тут сразу мимо. Xecutor или Eagles Nest мимо, потому что вроде карта состоит из явных спрайтов, но это скроллер, а не комнаты. Просто размер при скроле не очень просто рассчитать, а с комнатами считать легко. И Хоббит тоже мимо - у него эраны не из спрайтов, а из картинок, а вот Диззик с комнатами из спрайтов. Формально под комнаты заточена Lords of Midnight и комнат в ней очень много, но как и в Хоббите тоже картинки, а не спрайты.

Почему саботер 2 и эксолон ? Ну просто что пришло в голову, многие их знают. Эксолон тоже не ахти какие насыщенные комнаты - несколько видов грунта, десяток-другой видов объектов, взаимодействующих с игроком и десяток видов врагов. Но вместилось только 100 комнат. Для первого саботера около сотни комнат, а для второго казалось что почти тысяча с картой 32х32 комнаты, но потом пригляделся и комнат оказалось меньше. Вот и неясно почему такой большой разрыв по числу комнат для 2го саботера стал возможен.

Если есть желание померяться размерами карт, то можно в отдельной теме. А в этой теме хочется прояснить как хранятся и строятся комнаты в играх с поэкранным отображением. Не только для саботера, но почему бы не на его примере? Ведь если для каждой комнаты описание хранить в виде элементарных блоков по 8х8 точек, то прикидывая в среднем заполненность экрана на 2/3, тогда без сжатия это занимает 512 байт или 2 комнаты на килобайт.

Bedazzle
27.12.2022, 16:56
Ведь если для каждой комнаты описание хранить в виде элементарных блоков по 8х8 точек, то прикидывая в среднем заполненность экрана на 2/3, тогда без сжатия это занимает 512 байт или 2 комнаты на килобайт.

Уже выше упомянули, что не на каждые 8х8 точек описание идёт, а объектами, которые могут собираться в ещё более крупные объекты.

Без привязки к какой-либо игре: скажем, есть табличка-описатель спрайтов 16х16 точек, где зашита сама картинка.
И есть табличка объектов, где описаны параметры объекта (враг, элемент дизайна, предмет), где из блоков 16х16 составляется картинка. Например, стол рисуется из 3х2 таких блоков, а стул из 1х2.
Тогда чтобы поместить объект на карту, нужно указать координаты (номер комнаты, Х, У) и номер объекта. Для стола и двух стульев хватит 12 байт (3 байта на координаты и 1 на объект). Но если объединить стол и два стула в более крупный объект, который будет использоваться несколько раз, то внутри карты будет потрачено всего 4 байта.

Destr
27.12.2022, 19:01
Когда-то был разговор про Саботёра 2 и ракету - я даже делал снапку где подправил экран с ракетой так, чтоб к ней можно было пройти.
Действительно, там это всё строится типа скриптов и надпись NINA на ракете например пришлось выкладывать по букве, а вот пробить проход к ней - всего-лишь "пустой" прямоугольник шлёпнуть в стену (нужный размер указав). Где-то на форуме вроде выкладывал файл...

vlad-kras
27.12.2022, 19:02
есть табличка-описатель спрайтов 16х16 точек, где зашита сама картинка.
И есть табличка объектов, где описаны параметры объекта (враг, элемент дизайна, предмет), где из блоков 16х16 составляется картинка.

Здесь термины спрайт 16х16 и блок 16х16 - одно и то же или между ними есть разница?



Уже выше упомянули, что не на каждые 8х8 точек описание идёт, а объектами, которые могут собираться в ещё более крупные объекты.
Да, Гудбой уже объяснил.


Тогда чтобы поместить объект на карту, нужно указать координаты (номер комнаты, Х, У) и номер объекта. Для стола и двух стульев хватит 12 байт (3 байта на координаты и 1 на объект).

Вроде система Гудбоя подразумевает, что есть комната с известным номером и в ней заполняются объекты. Тогда как раз для каждого объекта в комнате тратится 2 байта для координат и 1 для номера объекта. Т.е. номер комнаты лишний?



Но если объединить стол и два стула в более крупный объект...
А получится ли объединить, если стул будет как выше, размером 1х2, а вот стол 3х3 - т.е. стол выше стула и при их составлении вместе получится вырезанный уголок, ведь объект перестанет быть прямоугольным?

Xela
27.12.2022, 20:26
Lords of Midnight и комнат в ней очень много, но как и в Хоббите тоже картинки, а не спрайты.
эти "картинки" состоят из спрайтов:

https://maps.speccy.cz/map.php?id=LordsofMidnight&sort=0&part=0&ath=0

хранить такое количество готовых экранов в 48к невозможно никаким сжатием

yashcher
27.12.2022, 22:43
Дело было вечером, делать было нечего...
https://disk.yandex.ru/d/gEbTnSopXnLggw

Alex Rider
28.12.2022, 00:00
Дело было вечером, делать было нечего...
Интересная работа. А цель какая?
PS С бесконечной перфолентой все чуть сложнее, я чуть поломал себе мозг пытаясь понять почему оно так работает. Там еще важно, что в ящике 5 предметов, и что взятие перфоленты обрабатывается отдельно от оружия.

Bedazzle
28.12.2022, 00:26
Вроде система Гудбоя подразумевает, что есть комната с известным номером и в ней заполняются объекты. Тогда как раз для каждого объекта в комнате тратится 2 байта для координат и 1 для номера объекта. Т.е. номер комнаты лишний?

В каждой игре по-своему может быть. Например так, что координаты не две, а всего одна в диапазоне 1-192. А может быть так, что и комнат как таковых нет, и всё координатами.



А получится ли объединить, если стул будет как выше, размером 1х2, а вот стол 3х3

Да хоть десять мелких объектов с разным размером можно объединить в крупный объект. Движок определяет, что нужно отрисовать составной объект в координатах Х,У. И отрисовывает составные части, каждую по отдельности.

ultra
28.12.2022, 01:18
Подборочка карт (https://mega.nz/file/BIcGzRrC#YKwoYpAi0VvYGaAkddn-xF8ZUMQcydjJt4SYQUpD1Yg) 928 мб кстати.


Рассматриваю именно карты в виде комнат
Есть же Rough Justice, Switchblade, Rainbow Islands, Viiaje, Rick Dangerous, Espada Sagrada, не говоря уж про новые Ioana итп. Прочиталось как "Саботёр такая уникальная, как они этого добились, немного похожа только (линейная, почему-то) Эксолон?" Учитывая, что темные участки "подземелий" по сути пустые и одинаковые и вовсе выбор малопонятен.


А в этой теме хочется прояснить как хранятся и строятся комнаты
От многих знаний многия печали.. )

yashcher
28.12.2022, 22:19
Интересная работа. А цель какая?

Целей было несколько:
* понять не осталось ли каких-то скрытых возможностей в версии 128К.[хотя это вряд ли]
* изучать ассемблер не только по доступным мне книгам, но и на практике на основе знакомой игры с несложной графикой, анимацией и кодом.
* затем, разобравшись в структуре кода, перегнать всё в SkoolKit т.к. удобно видеть графику и разделенный на логические блоки код.
* создать множество учебных примеров, постепенно подключая всё новые и новые блоки в EmuzWin(где-то временно убирая/меняя код) по такой схеме, чтобы в конце выйти на всю игру:


просто текст в Главном меню стандартным шрифтом;
всё предыдущее + игровой шрифт;
... + картинка Ниндзя в Главном меню;
... + таблица High Scores;
... + выбор управления;
... + выбор миссий;
... + AY;
... + нижняя рамка;
... + объекты фона и листать их клавишами;
... + построить комнаты с объектами фона и листать их;
... + карту игрового пространства и перемещаться переключая их;
... + добавить тайлы Ниндзя, его движение по комнатам;
... + работа лифтов, консолей, мотоцикла;
... + добавить ящики с оружием и возможность использовать предметы;
... + добавить врагов Ниндзя;
... + включить нанесение урона и подсчёт очков, таймер;
... + проверка условия выполнения миссий;
... + убрать некоторые ошибки.


И если бы всё получилось, то можно было бы оформить гайд "Как смогли написать игру Saboteur2 на ассемблере".
N.B. как смогли, так и написали :)


Этот проект старый и долгий, с большими перерывами и окончательно заброшенный ещё где-то в 2018 году. Что-то получилось, что-то нет. А может вы делали комментарии, когда в свою очередь разбирали код. Было бы интересно сравнить и посмотреть свои пробелы и ошибки, т.к. не все части кода до конца смог понять зачем были нужны и как работают.

Alex Rider
29.12.2022, 20:34
Этот проект старый и долгий, с большими перерывами и окончательно заброшенный ещё где-то в 2018 году. Что-то получилось, что-то нет.
Эх... Мой проект на тот момент был на большой такой паузе, если бы Вы нашли тогда мою тему (https://zx-pk.ru/threads/24604-saboteur-2-remake.html)...



А может вы делали комментарии, когда в свою очередь разбирали код. Было бы интересно сравнить и посмотреть свои пробелы и ошибки, т.к. не все части кода до конца смог понять зачем были нужны и как работают.
Обязательно комментировал, особенно мозголомные моменты. Но на кривом английском. Могу прислать исходники с комментарием под обещание не публиковать в открытом виде. Почта в профиле актуальная?

yashcher
29.12.2022, 23:53
Спасибо за ответ. Да, почтовый ящик верный. Ваш труд, значит и условия ваши.
"Иногда человек идет на компромиссы, чтобы получить хотя бы часть желаемого."

Alex Rider
30.12.2022, 20:40
Ваш труд, значит и условия ваши.
Ну, скорее, труд Клайва, и условия его ) Мы с ним переписывались по поводу моей затеи ускорения Саботера 2, он одобряет отправку исходников лично для обучения, изучения, доработок, но без коммерческой публикации результатов. Идею публиковать исходники открыто на форуме тоже не одобрил, ибо всякие копирайтиы и прочее. Мой труд мне не жалко, мои версии можно публиковать где и как угодно (в виде образов). С моими исходниками такая же петрушка: я не против их изучения и использования, но там 99% кода Клайва, поэтому открто тоже не положу. А так - обращайтесь. Но там не сказать, чтобы какие-то супер-пупер приемы для изучения.

vlad-kras
31.12.2022, 04:26
Сначала подумал, что понял идею Bedazzle. Комбинируем бочку и шкаф, получаем размещенные на экране шкаф и бочку возле него. Потом этот составной объект так и должен рисоваться - сначала весь шкаф, потом вся бочка. Примерно таким же образом, как формируется картинка с диззи наверху (допустим, взяли группу камней и начинаем их прорисовывать по одному причем с дырками между камнями - и это все один объект, составной, который можно использовать на нескольких экранах).

Потом почитал документ от Ящера про пустые тайлы, подумал, что 2 предмета в составном объекте всего лишь 2 изображения предметов, а объект (спрайт) будет 1 - бочка со шкафом (недостающее в отображаемом прямоугольнике место заполняется пустыми тайлами). И рисоваться он будет не поочередно шкаф-бочка, а вперемешку, отображая по порядку тайлы в прямоугольнике то от шкафа, то от бочки. И никогда эти предметы не существуют по отдельности. В игре шкафы по отдельности есть, но например, группа ящиков постоянно отображается одинаково. Спасибо Гудбою за подсказку. То есть отображается несколько ящиков, но затрачивается на это 1 спрайт / объект и этот объект невозможно разделить на более мелкие части.

Потом еще раз перечитал сообщение Bedazzle, понял что речь идет про первый вариант, когда объект состоит из нескольких спрайтов и такой объект можно разделить на составные части. По-разному компонуя составные объекты из спрайтов, можно получить, например, различные сочерания мебели - пара шкафов, шкаф и стол, шкаф и окно. Получается экономия - затрачивая 1 составной объект будет отображаться целая группа объектов.


Да хоть десять мелких объектов с разным размером можно объединить в крупный объект. Движок определяет, что нужно отрисовать составной объект в координатах Х,У. И отрисовывает составные части, каждую по отдельности.

Bedazzle
31.12.2022, 10:38
Потом еще раз перечитал сообщение Bedazzle, понял что речь идет про первый вариант

Ещё раз уточню, что это не про Саботёр, а один из подходов, как можно экономить память.

Black Cat / Era CG
31.12.2022, 10:41
Ну если про все, то в Кастле например Санчез повторно использует комнаты с модификаторами. То есть есть некая готовая комната, которая используется несколько раз, а хранится один раз, отдельно от нее хранятся отличия от базового шаблона.