Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - SeregaZ

Страницы: [1] 2 3 4 5 ... 93 Далее
1
Программирование / Ребенок изучает asm [SMD]
« : 10 Декабрь 2025, 15:56:24 »
потерялся Sharpnull... последний раз видели заходил за водкой в магазин Березка  :lol:

эх... в общем смотреть баг в ексодусе, бластем, фьюжн... ну и видимо на железе полезет. на Gens все прекрасно.

ну и заменить в бат файле путь до эмуля на свой. там сейчас мой стоит... после сборки по замыслу сразу стартует в эмуляторе свежесобранный ром.

2
Программирование / Ребенок изучает asm [SMD]
« : 08 Декабрь 2025, 16:07:14 »
Sharpnuuuuuuuuuuuuuuuuuuuuuuuuuuull????? вопрос есть :) тут на неделе пыхтел в попытке сотворить драйвер по мотивам GEMS, но вышло так себе - вроде играет. по началу даже по науке - всякие ожидания вбланков всяких, таймер ym2612 для точной организации проигрывания 16khz, проверка конца доигрывания буфера - все оказалось фигня - не работает. все выкинул - стало намного лучше, но все равно не то... плюнул-бросил, пока решил обратно к работе с тайловыми сетами и картами вернутся. изначально там вроде тоже было все по науке - отключение экрана, заливка сета-карты-палитры, включение экрана... потом посносил это отключение выключение и в эмуляторе Gens стало все прекрасно без мерцаний. во Fusion прекрасно если тайловый сет не сжат, а если пожато - бывает тайлы сыплятся. потом решил сделать загрузку тайлового сета в два разных места - буфера и грузить попеременно оттуда. стало лучше. но теперь во Fusion, BlastEm и Exodus простреливают полоски или точнее точки в линейку. в общем меня смущает момент с двумя местами с паузами, или даже точнее тремя.

схема:
главный луп

загрузка тайлового сета, карты, палитры

move.w #frame_delay-1,d0    ; пишем в d0 глобальную паузу между кадрами

wait_image:
bsr wait_next_frame      ; ждем следующего кадра (вертикальной синхронизации)
dbf d0,wait_image        ; уменьшаем счетчик кадров и повторяем, пока d0 не станет -1
        ; то есть эту паузу я еще понимаю. поскольку видео распаковывалось для 5 фпс, то соответственно надо ждать некую паузу между кадрами. по моему 11 для NTSC

; следом сразу идет следующая пауза, которую я осуждаю!
move.w #PNWAIT,d0
;move.w #$1200,d0            ; для NTSC:
palntscwait:
nop                              ; пустая операция (1 такт) для создания задержки
dbf d0,palntscwait               ; уменьшаем счетчик задержки d0 и повторяем цикл
         ; по сути мы тут сидим и ждем пока тикнет таймер

; по моему от этого значения 1200 или там $2400 если внизу экрана мое "видео" и зависит от того, где будут эти самые прострелы точек при просмотре во Fusion и прочих более точных эмулях. я сделал в редакторе возможность выставить мышкой где именно на большом экране будет выводится маленькое окошко с видео. и соответственно этот PNWAIT у меня плавающий. типа:
  ; #$2400 13:18 (внизу экрана)
  ; #$2000 13:12
  ; #$1A00 13:9
  ; #$1800 13:7
  ; #$1600 13:4
  ; #$1200 13:0

конец лупа

;{ подпрограмма ожидания следующего кадра
wait_next_frame:
Vdp_wait_NoVBL:
btst #3,1(a2)                 ; проверяем бит 3 в статусе VDP (VBlank флаг)
bne.s Vdp_wait_NoVBL           ; если VBlank активен (бит=1), ждем его окончания
Vdp_wait_VBL:             
btst #3,1(a2)                 ; снова проверяем VBlank флаг
beq.s Vdp_wait_VBL             ; если VBlank не активен (бит=0), ждем его начала
rts                              ; возврат из подпрограммы
;}

в общем как эти сраные точки победить? отправлю сборщик для рома посмотришь? я не понимаю половины что тут происходит :) понадергал отовсюду и это как-то да заработало... однако хотелось бы чтоб по науке. все строчки прокомментировал, чтоб хоть отдаленно понимать что происходит. я бы конечно еще хотел бы добавить чтоб размеры "видео" тоже можно было изменять, но боюсь уже не потянет. так-же еще хотел 1 байтовое сжатие, вместо 2 байтового нынешнего. и даже это одно-байтовое набросал в черновике... но тут на 2 байтовом сжатии уже Fusion икает, а на 1 байтовом наверное вовсе будет с катушек слетать - длительность распаковки там куда длиньше... но вот эффективность 1 байтового в плане экономии места в роме - прям нрааааица нраааица.

3
Ромхакинг / [SMD] Хак Zero Tolerance
« : 17 Ноябрь 2025, 11:22:29 »
в общем пока думаю пересмотреть концепцию. в начале считать все из файла юнита - графику, кадры анимации, количество паков, расположение, Дану Скалли, размеры... построить согласно инструкциям изображение кадров целиком. после в массив, согласно количеству паков и анимаций в них и кадров - вносить эти самые готовые картинки кадров. после юзверь там типа с ними работает то да сё... а вот в момент сохранения и будет происходить магия - будет сохранятся метатайловый сет с нуля и расчитыватся номера метатайлов, после они будут записываться в те места, где это надо. так-же будет происходить поиск на зеркала. то есть юзверю не нужно будет парится вручную там ставить номера метатайлов и зеркала к ним. он будет видеть сразу кадр целиком. и работать с ним как с целым изображением.

но, повторюсь, все это фигня и не правильно. надо редактор юнитов делать с привязкой к модели поведения юнитов, чтобы было больше котроля и понимания что тут к чему.

4
Ромхакинг / Re: [SMD] Хак Zero Tolerance
« : 16 Ноябрь 2025, 17:47:09 »
там система похожа на систему с юнитом. текстура состоит из 8 метатайлов - прямоугольник два ряда по 4 метатайла в ряд. сами метатайлы 32х32 пикселя. рисуются по подобной схеме:
1 2 33 34
3 4 35 36
5 6 37 38
7 8 39...
9 10
11 12
13 14
15 16
17 18
19...
... 30
31 32

вот в текстуре у тебя идут номера метатайлов. типа 8 номеров друг за другом. только я забыл по 1 байту или по 2... вот очень похоже на то, что происходит в файле юнита. поэтому Енематор в принципе может подойти для редактирования текстуры - схема то такая-же.

5
Ромхакинг / [SMD] Хак Zero Tolerance
« : 16 Ноябрь 2025, 09:25:43 »
эм... текстуры на старом компе  :( я так и не перенес на новый. я все жду, что когда подойду переносить, жмакну кнопку включения на старом компе, а он не запустится и выяснится что все сгорело  :lol:

юниты сам посмотри. кнопку копирования сделал ток что по твоему заказу. понятно что редактировать ничо нельзя... это даже не альфа. и ZT2 не работают. но ZT1 вполне можешь посидеть покопировать.

Добавлено позже:
да и я уже как-то охладел к этому редактору юнитов... просто если делать правильно, что это производственный ад :) там целую мозаику в голове надо построить, чтобы понять как правильно это сделать. то есть я хочу чтоб налету метатайлы можно было редачить. и чтоб сразу это налету отображалось в анимации. НО всё это фигня, так как это всё равно всё не правильно :) я ж говорю - нужен редактор самого монстра, где было бы расписано какие кадры к чему относятся. вот сейчас меня волнует что 0 и 1 кадр часто одинаковые. жмакни на анимацию и сам посмотри - там наблюдается маленький подтуп. это вот как раз из-за того что 0 и 1 это один и тот-же кадр. я не знаю как в игре это используется. типа анимация ходьбы - как игра это использует? монстр идет - графика с 0 до 6 кадров мотает каждый раз, или все-таки с 1 до 6? вот если бы у меня были эти данные, то было бы понятно. конечно, еще будет попаболь адская придумать как это все редактировать... так что когда осознал этот объем звездеца - как-то охладел маленько :)))))

6
Ромхакинг / Re: [SMD] Хак Zero Tolerance
« : 16 Ноябрь 2025, 02:42:36 »
Размеры юнитов походу меняются.
полагаю это параметр Scale в настройках юнита. физически он так и остается 128х128пикселей в максимальном варианте, но вот это Scale - дает увеличение. в теории. на практике можно попробывать в ZT1 пехотинцу поправить Scale и посмотреть что получится. по моей теории он станет гигантом :)

Добавлено позже:
Чет не очень похоже на ZT
а я тащюсь :) включаю на рипите, когда редактор сижу ковыряю.


Добавлено позже:
и да, вручную посидел потыкал этот параметр для пехотинца - было 6, поставил 8. причем на всего юнита терпения не хватило - поставил на половину и как раз заметно стало разницу :) смотришь на него - он бегает и какие-то кадры он на голову выше размером. какие-то обычные. так что да, апрувлено :) Scale влияет на умножение размера графики юнита. хотя физически он так и остался... эээ... 32х64 пикселя по моему.

7
Ромхакинг / [SMD] Хак Zero Tolerance
« : 15 Ноябрь 2025, 15:12:14 »
с точки зрения структуры графики юнита не должно отличаться. а он выбивается с ошибкой при попытке загрузится. в общем решилось путем выковыривания "эталонного" краба - из игры, а в архиве с Енематором был видимо глючный. другой момент - ZT2 формат. а вот он отличается и видимо как раз эти вертикальные зеркала прикрутили. или может размер юнита может быть увеличен. не понятно.

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

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

8
Ромхакинг / [SMD] Хак Zero Tolerance
« : 15 Ноябрь 2025, 11:30:26 »
по итогу пока-что зависло два вопроса... а нет, три! сраный Краб. видимо он был маленько "поврежден" еще с лохматых годов. и второй - зеркала - с зеркалом по Х то понятно. а вот с Y - не очень :) я думал там один байт за оба зеркала отвечает. типа $11 - первая 1 для Y, вторая для Х. но чаще всего встречается просто $01 - то есть зеркало по Х. однако этот байт может иметь и другие значения. визуально однако это не очень чтобы проверить... и третий нулевой фрейм в анимациях. я подозреваю все-таки он ни к селу ни к городу.


9
Ромхакинг / [SMD] Хак Zero Tolerance
« : 15 Ноябрь 2025, 01:18:14 »
захотелось забацать трек
я в Suno решил заказать трек для ZT... он мне со словами родил песню, точнее даже две :) я не понял откуда он слова брал... боюсь что может быть перевод текста песен группы Zero Tolerance. возможно он просто не понял о какой ZT я ему говорил :)



Добавлено позже:
хм... то-ли я чо-то не понимаю, то-ли лыжи не едут  :lol:

в процессе продолжения археологических раскопок заметил такую весчщь: при загрузке в Enemator.exe 3 босса, то есть мухи-переростка - количество паков 11 - как и в файле. количество анимаций для паков 4 - как и в файле... а вот количество фреймов меня несколько настораживает. в файле 6 - но в редакторе показывает 7. причем 0 фрейм и 1 фрейм - одинаковые. что-то тут где-то явно собака порылася...

Добавлено позже:
и краб, скатина, чем-то отличается от всех. вылетает у меня всё при попытке его прочитать :) надо искать в чем там разница...

Добавлено позже:
пронесло. косяк видимо не уменя. сам Enemator тоже икает от краба. в 5 паке анимация 0 имеет миллион кадров, отсюда и вылет у меня. точнее оказывается не вылет, а просто оооооооооооооооооооооооооооооооочень долгая загрузка :)

10
Ромхакинг / Re: [SMD] Хак Zero Tolerance
« : 14 Ноябрь 2025, 15:33:01 »
ну значит все. так и решим. пусть Smoke все доделывает. придем, проверим.  :lol:

11
Ромхакинг / [SMD] Хак Zero Tolerance
« : 14 Ноябрь 2025, 14:42:17 »
то есть взять готовую прогу, сохранить там что-то, посмотреть что изменилось в выходном файле, тем самым понять структуру - не наш метод? я тоже структуру графики юнитов не нашел. открыл в енематоре юнита и его файл в хекс редакторе и сижу пальцем в небо тыкаю... тут наверное количество паков, а тут наверное ссылка на описание кадра, тут наверное зеркало, тут наверное координаты... археологом работаю кароче.

12
Ромхакинг / [SMD] Хак Zero Tolerance
« : 14 Ноябрь 2025, 14:32:35 »
так сделайте сами :) редакторы все в сети. типа делаем что-то типа реверс инженеринга. сохраняем что-то в редакторах и смотрим, что изменяется в файлах игры.

карты не думаю что прям кординально что-то изменилось в структуре. единственное это размер. поэтому возможно перед этим твоим ZMAP указывается как раз длина и ширина карты. в отличии от ZT1 - где все карты единого размера и указывать его не надо. но это не точно :)

13
Ромхакинг / [SMD] Хак Zero Tolerance
« : 14 Ноябрь 2025, 07:43:15 »
там слишком много всего испортили.
кстати из-за бОльшего размера карты - там сломали сетевую часть :) так что там пока предварительно принято решение поделить большие ZTB карты на стандартные, как в ZT. типа было, к примеру, 5 уровней на эпизоде, но из-за этого распиливания некоторых карт - станет, скажем 8. зато сетевая часть становится рабочей.

14
Ромхакинг / [SMD] Хак Zero Tolerance
« : 14 Ноябрь 2025, 06:07:11 »
не понимаю насчет заливки части карты каким-то блоком. на самом деле карта не такая уж и большая, чтобы прям страдать вручную заполнять нужными ячейками. можно сделать зажатие кнопки мышки и закрашивать мышкой, как в пейнте. до самой карты я не сильно то и дошел... не помню уже детали, но по моему у меня было сделано так:
выбираешь один из типов блоков - вылазит список всех блоков, относящихся к данному типу. выбираешь один из них и можно шлепать его на карте.

но это всё не то :) нужно делать более глобальный редактор, где можно было бы редачить поведение блока. типа есть блок двери. логика если подходишь - дверь открывается. есть блок, при выстреле меняющийся на другой блок. и так далее и тому подобное. вот нужен редактор не использующий эти пресеты, а именно чтоб можно было редактировать эти пресеты. по сути создавать новые типы блоков. типа скажем блок телепорта к примеру - заходишь на этот блок, а тебя бац и телепортануло через пол карты. надо чтоб читалось из этого пресета схема рисования графики. сейчас мы знаем что такой-то блок прямоугольный, такой-то блок треугольный. что если я круглый блок хочу сделать? или прямоугольный, а не квадратный. вот эти все нюансы хотелось бы редактировать. вот такой редактор нужен.

15
Ромхакинг / [SMD] Хак Zero Tolerance
« : 14 Ноябрь 2025, 04:48:36 »
ты случайно вместо ответа в этой теме - создал новую, с тем-же заголовком :) твои ответы чуть ниже в списках тем :)))

16
напрямую писать в эмуль было бы лучше. ничего с собой дополнительно носить не надо. типа мой редактор мог бы не создавая файл на жестком диске сразу в эмуль отправлять. с рам-эмулятор-дисками это надо устанавливать софт дополнительно. в 2025 это такое себе. хотелось бы чтоб в одном флаконе все-же было. пока поставил какой-то ImDisk Virtual Disk Driver. пока полет нормальный. но это костыльное решение все-же. большие буквы этож надо шифт жмакать. но в своей теме по программированию я жмакаю :) это в других темах без.

17
я так понимаю читать твой пост надо в голове голосом Лукашенко?  :lol:

Добавлено позже:
итак... в порядке бреда думаю сделать через жопу: какой-то программой заэмулировать жесткий диск. но чтобы он фактически обращался к оперативной памяти, а не к hdd. то есть винда будет видеть в Моем Компьютере F диск. соответственно ром будет собираться и скидываться в него, и после запускаться в эмуляторе. костыль... но зато временных файлов на hdd не создается. и типа если результат хороший - только тогда сохранять уже собранный ром на обычном hdd. хотелось бы конечно чтоб Gens заранее читал какую-то ром-болванку-заглушку в 8 или даже 12, чтоб с запасом, мегабайт и после уже писать в эту память эмулятора образ своего свежесобранного рома - писать в чужой процесс я могу, это мы обкатали на ZT и Дюне... но раз оно там оказывается всё в разобранном виде, то печаль. GPT предлагает пересобрать эмуль из сурсов и просто предусмотреть этот момент. типа не только через FILE сделать загрузку рома, но и из памяти... однако хотелось бы не стоковый Gens - его сурсы то вроде есть всети, а r57shell'овский мод, с блек джеком и легкодоступными женщинами в виде доп инструментов типа vdp и память просмоторщика, и прочие дебаги всякие, а вот его вроде как нет. пойду думать насчет эмуляции hdd...

18
тут это... а как вы реализовали вписывание в память эмулятора - образ в памяти рома? запустил в Gens ром, делаю поиск в памяти процесса Gens по слову SEGA - кусман в 4 килобайта начала рома находит. я надеялся что он там прям цельным куском весь ром сидит. а оно видимо раскидывает как ему удобно этими самыми "чанками" по 4 кб. в порядке бреда думаю сделать ром-болванку, где каждые 4 килобайта будет какое-то опорное значение, как та-же SEGA - типа SEG1, SEG2, SEG3... после делать поиск и надеятся, что найденные адреса будут лежать где-то в памяти таблицей. и иметь постоянный адрес. тогда я бы смог налету резать ром на 4 килобайтовые куски, а после потом вписывать по найденной таблице в память эмулятора.

и да, видимо тему надо будет переносить в ту ветку :))))

19
Марафон кодинга уперся в стену :) По всей видимости, когда размер тайлового сета очень большой - больше, чем 32767, то есть видимо этот самый .w вместо .u - то есть +32767 -32767 вместо +65535, то распаковка не работает. Если тайловый сет меньше, то проблемы вроде нет. Еще не понимаю почему не вижу тайловую карту. Ведь карта загружается до тайлового сета, то есть до ошибки в коде. По идее я должен в VDP увидеть карту. Палитру вижу, что загрузилась. Загрузка палитры еще выше по коду. Сранно все это :)

***

Так... GPT обрисовал картину, и предположил что дело в DecompressCheckEOF. Он сразу-же он выдал рекомендации изменить код и теперь там лонги вместо вордов и все завелось. Так-же правда остался затык с первыми двумя байтами в пожатом тайловом сете - они то скорей всего читаются как ворд в asm коде, а PB туда пишет как unicode. Выкинуть наверное надо... Все равно проверки на итоговый распакованный результат не прикрутил.

Как бы то нибыло - результатом доволен.

Чтобы загрузить 4 палитровое изображение из палеткванта надо сделать следующее:

https://rilden.github.io/tiledpalettequant/

1. загрузить нужное изображение из интырнетов, размером 320х224
2. изменить в настройках количество палитр с 8 на 4
3. количество цветов для палитры - поставить 16
4. bit per channel - 3 вместо 5
5. отметить shared color и оставить его черным - тогда первый цвет во всех 4 палитрах будет черным
6. дизеринг я ставлю fast, но можно поиграться, если знать что там выбирать диагональ не диагональ и фракции какие-то там...
7. жмакнуть квантизировать

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

После этого уже можно запускать нашу программу, и импортировать в неё это изображение. Оно разобьется на тайлы с разными палитрами и все сохранит в "сеговском" формате.

Кода очень много. Старался, комментировал все что возможно, чтоб было понятно. Но кода прям очень много и можно поплыть :) Старые то примеры делал коротенькие файлы, чтобы акцентироваться на каких-то маленьких кирпичиках, из которых потом можно рожать пирамиды как у Хеопса... но тут прям завал.

20
Добавил галку дизеринга, так-же раздуплил как нулевым номером в палитре заливать черный, независимо от того есть ли он на изображении или нет. Хотя еще надо потестить. Пока-что результаты с Железным Человеком такие:

302091-0

Мой код из коробки, рожает по весу пикселей - жрет красный цвет накорню. С галкой дизеринга результат чуть лучше (понятно что одинаковых тайлов будет меньше, а изображение займет больше места в роме). Но палент квант, от которого я писаю кипятком, убил :) а контрольным в голову стал 4 палитровый вариант. Правда код импорта с 4 палитрами в сеговские цвета я недопилил, посему последнее изображение "сырое", но результат будет очень близкий. Наверное сделаю галки для импорта - в 1 палитру писать или в 4. Но если в 4, то тогда из палеткванта нужно будет сохранять два изображения - саму подготовленную картинку и палитру к ней.

Просьба не размещать с помощью тэга img изображение со стороной более 700 пикселей. Предупреждение №2. ghostdog3

21
Ромхакинг / [SMD] Хак Zero Tolerance
« : 13 Ноябрь 2025, 01:59:21 »
кто-то делал очередной ремейк
так с Дюной так-же :)

22
Сжатие, что описывал выше, будет примерно выглядеть так:
Enumeration
  #File
EndEnumeration

; RLE word compressor (16bit). PureBasic.
; вход: *src указывает на необработанные данные (tile set), size - размер в байтах
; выход: *dst - сжатые данные
; PureBasic RLE-word encoder with big endian output for Sega MD

Procedure WriteBEWord(*dst, pos, value)
  ; write 16bit big endian
  PokeA(*dst + pos, value >> 8)
  PokeA(*dst + pos + 1, value & $FF)
EndProcedure

Procedure ReadBEWord(*src, pos)
  ; Read 16-bit big-endian word from buffer (*src + pos)
  high = PeekA(*src + pos)
  low  = PeekA(*src + pos + 1)
  ProcedureReturn (high * 256) + low
EndProcedure

Procedure RLEWord_Encode(*src, size, *dst)
  i = 0
  o = 0

  ; first 2 bytes = decompressed size in bytes
  WriteBEWord(*dst, o, size) : o + 2

  While i < size
    ; Check for RLE run
    w = ReadBEWord(*src, i)
    count = 1
    j = i + 2
   
    ; Count consecutive identical words
    While j < size And ReadBEWord(*src, j) = w And count < $7FFF
      count + 1
      j + 2
    Wend
   
    If count >= 3  ; RLE encode if 3+ identical words
      WriteBEWord(*dst, o, $8000 | count) : o + 2
      WriteBEWord(*dst, o, w) : o + 2
      i = j
    Else
      ; RAW block - collect until we find 3+ identical words
      count = 1
      j = i + 2
     
      While j < size And count < $7FFF
        ; Check if we have 3 identical words ahead for RLE
        If j + 4 < size
          w1 = ReadBEWord(*src, j)
          w2 = ReadBEWord(*src, j + 2) 
          w3 = ReadBEWord(*src, j + 4)
          If w1 = w2 And w1 = w3
            Break  ; Stop RAW block before RLE run
          EndIf
        EndIf
        count + 1
        j + 2
      Wend
     
      WriteBEWord(*dst, o, count) : o + 2
     
      ; Copy raw words
      For k = 0 To count - 1
        WriteBEWord(*dst, o, ReadBEWord(*src, i + k * 2)) : o + 2
      Next
     
      i + count * 2
    EndIf
  Wend
 
  ; End marker
  ;WriteBEWord(*dst, o, 0) : o + 2
 
  ProcedureReturn o
 
EndProcedure

; Main program
error = 0

If ReadFile(#File, "tset.bin")
  ; получаем размер открытого файла
  tsetsize = Lof(#File)
  If tsetsize
    ; если размер больше 0 байт
   
    ; резервируем память нужного размера
    tsetmemory = AllocateMemory(tsetsize)
    tsetpakmem = AllocateMemory(tsetsize * 2) ; Может быть больше оригинала
    If tsetmemory And tsetpakmem
      ; если память зарезервировалась
     
      ; читаем из открытого файла в память
      ReadData(#File, tsetmemory, tsetsize)
    Else
      error = 1
    EndIf
  Else
    ; добавляем текст ошибки, на случай если файл тайл сета 0 байт - пустой
    MessageRequester("ошибка", "файл тайл сета по всей видимости пуст - 0 байт")
    error = 1
  EndIf
  CloseFile(#File)
Else
  ; добавляем текст ошибки, на случай если файла тайл сета нет
  MessageRequester("ошибка", "нет файла тайл сета")
  error = 1
EndIf

If error = 0
  Debug "Original size: " + Str(tsetsize)
  paksize = RLEWord_Encode(tsetmemory, tsetsize, tsetpakmem)
  Debug "Compressed size: " + Str(paksize)
 
  If CreateFile(#File, "tsetP.bin")
    WriteData(#File, tsetpakmem, paksize)
    CloseFile(#File)
    ;MessageRequester("Успех", "Сжатие завершено!")
  Else
    MessageRequester("Ошибка", "Не могу создать файл tsetP.bin")
  EndIf
 
  FreeMemory(tsetmemory)
  FreeMemory(tsetpakmem)
EndIf

Но смысла в этом не много... ибо если делать какие-то экраны для ромхаков, то ведь в разных играх по разному сжатие работает. Мне то для мув мейкера пойдет. А вот для ромхаков не очень... Так-же наверное надо сделать галку - нужно сжатие или не нужно. Так-же в самом асм коде надо будет добавить вилку - со сжатием тайловый сет или без и соответственно чтоб собиралось в ром или со сжатием или без, в зависимости от выбора. Еще правда с первыми двумя байтами - указанием размера разжатых данных - тоже надо покумекать... может оно и не нужно вовсе. С другой стороны - дополнительная проверка, а то ли мы разжали? Своеобразная контрольная сумма.

23
Итак, та часть где происходит переворачивание инфы. Сделал через "жесткий" массив, это там где Array[x]То есть он как бы всегда одинаковый размер имеет.
Такой-же массив, но с круглыми скобками Array(х) может изменять свой размер с помощью ReDim.
По итогу при запуске кода в окошке дебага будет высвечен текстом "тайл" без зеркал, и ниже с зеркалами для понимания, что должно происходить при зеркалировании.
; сложная структура массива для тайлов, чтобы организовать выкидывание повторяющихся тайлов
Structure usedtilesstruct
  original.a[32] ; .a[32] - жесткий массив на 32 байта
  xmirr.a[32]
  ymirr.a[32]
  bothmirr.a[32]
EndStructure
Global Dim UsedTiles.usedtilesstruct(1120) ; .usedtilesstruct(0) - изменяемый массив со структурой


Procedure CreateMirrors(arrayitemnum.u)
 
  ; у нас есть оригинальный тайл - UsedTiles(arrayitemnum)\original
  ; нужно просто перевернуть его данные для зеркал
 
  ; самое простое - по вертикали.
  ; просто перенос 1 строчки в 8, 2 в 7, 3 в 6, и так далее
  For y = 0 To 31 Step 4    ; мотаем 8 строк
    For px = 0 To 3         ; по 4 байта в строчке
      UsedTiles(arrayitemnum)\ymirr[px + 28 - y] = UsedTiles(arrayitemnum)\original[px + y]
    Next
  Next
 
  ; по горизонтали.
  ; каждый байт надо переносить и докучи еще переворачивать внутри
  ; $12, $34, $56, $78 в $87, $65, $43, $21
  ; используются сдвиги >> и маска & $F
  For y = 0 To 31 Step 4    ; мотаем 8 строк
    For px = 0 To 3         ; мотаем 4 байта, то есть 8 пикселей или 8 столбиков
      UsedTiles(arrayitemnum)\xmirr[y + px] = UsedTiles(arrayitemnum)\original[y + 3 - px] >> 4
      UsedTiles(arrayitemnum)\xmirr[y + px] + (UsedTiles(arrayitemnum)\original[y + 3 - px] & $F) << 4
    Next
  Next
 
  ; оба зеркала
  ; надо повторить зеркалирование по вертикали,
  ; просто вместо original указать xmirr - уже отзеркаленное по Х в качестве входных данных
  For y = 0 To 31 Step 4    ; мотаем 8 строк
    For px = 0 To 3         ; по 4 байта в строчке
      UsedTiles(arrayitemnum)\bothmirr[px + 28 - y] = UsedTiles(arrayitemnum)\xmirr[px + y]
    Next
  Next 
 
EndProcedure

UsedTiles(0)\original[0] = $1 ;{ заполняем наш "тайл" ерундой от 1 до 32
UsedTiles(0)\original[1] = $2
UsedTiles(0)\original[2] = $3
UsedTiles(0)\original[3] = $4
UsedTiles(0)\original[4] = $5
UsedTiles(0)\original[5] = $6
UsedTiles(0)\original[6] = $7
UsedTiles(0)\original[7] = $8
UsedTiles(0)\original[8] = $9
UsedTiles(0)\original[9] = $10
UsedTiles(0)\original[10] = $11
UsedTiles(0)\original[11] = $12
UsedTiles(0)\original[12] = $13
UsedTiles(0)\original[13] = $14
UsedTiles(0)\original[14] = $15
UsedTiles(0)\original[15] = $16
UsedTiles(0)\original[16] = $17
UsedTiles(0)\original[17] = $18
UsedTiles(0)\original[18] = $19
UsedTiles(0)\original[19] = $20
UsedTiles(0)\original[20] = $21
UsedTiles(0)\original[21] = $22
UsedTiles(0)\original[22] = $23
UsedTiles(0)\original[23] = $24
UsedTiles(0)\original[24] = $25
UsedTiles(0)\original[25] = $26
UsedTiles(0)\original[26] = $27
UsedTiles(0)\original[27] = $28
UsedTiles(0)\original[28] = $29
UsedTiles(0)\original[29] = $30
UsedTiles(0)\original[30] = $31
UsedTiles(0)\original[31] = $32
;}

Debug "original:"
For i = 0 To 31 Step 4
  Debug RSet(Hex(UsedTiles(0)\original[i]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\original[i + 1]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\original[i + 2]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\original[i + 3]), 2, "0")
Next

CreateMirrors(arrayitemnum.u)

Debug ""
Debug "ymirr:"
For i = 0 To 31 Step 4
  Debug RSet(Hex(UsedTiles(0)\ymirr[i]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\ymirr[i + 1]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\ymirr[i + 2]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\ymirr[i + 3]), 2, "0")
Next

Debug ""
Debug "xmirr:"
For i = 0 To 31 Step 4
  Debug RSet(Hex(UsedTiles(0)\xmirr[i]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\xmirr[i + 1]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\xmirr[i + 2]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\xmirr[i + 3]), 2, "0")
Next

Debug ""
Debug "both:"
For i = 0 To 31 Step 4
  Debug RSet(Hex(UsedTiles(0)\bothmirr[i]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\bothmirr[i + 1]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\bothmirr[i + 2]), 2, "0") + " " + RSet(Hex(UsedTiles(0)\bothmirr[i + 3]), 2, "0")
Next


Основной же код будет чуть позжее... надо допиливать  :blush: пока-что работает не так как надо...

Так-же наверное сразу докручу сжатие. Хотя над сжатием еще бы покумекать. Основную идею то я понял... типа читает по 2 байта. И если вдруг 3 раза подряд это будет одно и то-же значение, то это дело можно поджать.
Было: "12 34 12 34 12 34"
Стало: "80 03 12 34"
Типа первый бит в 80 - означает сжатие, дальше 003 - что три раза повторяются следующие 2 байта.


***

В очередной раз, пока спал - думал. Надо переосмыслить подход. Плясать не от тайлового сета, а от тайловой карты. Читать номер тайла, переворачивать его в нужные зеркала, согласно инфе из карты, искать совпадения в уже внесенных тайлах в том моем сложном массиве и вносить в массив, если не было. А если было - просто менять старый номер на новый и править зеркала, если там были зеркала. Как бы с одной стороны куча ненужной работы в виде временного переворачивания тайла из тайлового сета... с другой стороны это делается средствами винды и современным компьютером, то как бы и ср@ть все равно ведь будет быстро. Внутренний перфекционист конечно сейчас бунтует... В выкидывателе тайлов я делал по другому. Можно конечно взять все оттуда, но хочу переосмыслить.

24
родил  :cool: . 2 дня убил, но вроде раздуплил. есть и код на PB с сжатием тайлового сета и на ASM разжатия и записи в VDP. ляпота! теперь можно подумать как втуливать образ памяти в эмулятор, чтобы не создавать временный файл рома на жестком диске. бегло глянул - пока не ясно. нашло пяток адресов, где вроде как ром сидит в памяти эмуля. надо будет тестить, вникать.

***

Итак. Теория выкидывания повторяющихся тайлов. Сейчас пишет тайлы прям друг за другом, как оно идет на изображении. Алгоритм будет такой:
1. создаем сложный массив, как ранее мы делали для палитры. там одна ячейка будет состоять из 4 ячеек-образов в памяти по 32 байта.
2. при создании тайлового сета следует изменить немного логику:
2а. самый первый тайл в любом случае пишем в наш сложный массив, в первую из четырех ячеек, как есть.
2б. запускаем процедуру переворота тайлов и пишем готовые результаты в 2-3-4 ячейки этого-же элемента массива. то есть с зеркалами по Х, У, и оба зеркала.
2в. начиная со второго тайла прогонять через сравнение памяти весь этот массив, добавляя если совпадений не было. недобавляя, но отмечая галку зеркал в тайловой карте - если какой-то из тайлов в массиве совпался с текущим.
Получается образ в памяти тайловой карты и тайловый сет надо будет делать одновременно.

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


25
в общем тяжело что-то там родил... алгоритм вставки такой:
1. 24 битное изображение 320х224 пикселя сначала перекрашиваем в 512 сеговских цветов.
2. измеряем вес пикселей, количество пикселей одинакового цвета на изображении и отбираем 16 с самым большим весом в палитру.
3. перерисовываем 512 цветное изображение в 16 подготовленную палитру.

Чтобы вставить картинку, надо в пейнте вырезать область размером 320х224 и нажать вставку на экране программы. Если результат нормальный - можно нажать сохранить, а потом кнопку тест и увидеть результат уже в эмуляторе.

Итоговый результат конечно такой себе :) В архиве как пример железный человек лежит. При его вставке - весь красный цвет идет по бороде и изображение преимущественно упарывается в синий оттенок. Палетквант из интырнетов сделает в тыщу раз лучше :)

Поскольку я совсем растерял навыки, а код брал из другого места, который до этого мои кривые руки на что-то там правили - вполне мог напортачить :) Надо было оригинальный буржуинский код найти и его копировать, а не мою недо-переделку. Я забыл уже все нюансы... так что местами в коде ашипки. Надо опять по новой вникать. И надо еще подумать над палитрой, чтобы в ней в любом случае присутствовал черный цвет как первый в палитре. Как раз в моей доделке оно и было... но я забыл как это включать :) Сейчас черный цвет может уплыть или не быть вовсе в палитре и поэтому правая часть окна может быть не черной, как изначально с Дюной.

Пока-что в изображении не выкидываются повторяющиеся тайлы, то есть изображение сохраняется целиком. Это я потом добавлю. А вот другие две вещи - было бы неплохо подумать, как сделать.
1. сжатие графики, по типу МК3. декомпрессор-компрессор как ехешку с форума - не предлагать. надо прям по детски объяснение как это работает, чтобы я мог сделать что-то похожее "по мотивам".
2. прямая запись в эмулятор образа рома. именно не как файл, а прям кусман памяти вписать в эмулятор с ромом, дабы не создавать всякие мусорные временные файлы на жестком диске (у меня просто пунктик на эту тему).

В код добавлен не мой модуль по подбору цветов и пожатии палитры из 24бит в заданное количество. Это очень много кода. Он там во многом без комментариев, ибо я сам хрен знает что там происходит. Но во всех остальных местах комментариев написал как можно больше с объяснениями.

И да! Надо опять таки в коде исправить путь до своего эмулятора. Там сейчас мой путь и кнопка ТЕСТ работать не будет если не исправить. Можно конечно через ини файл сделать. Типа при первом запуске потребует путь, а после уже будет всегда знать где эмулятор лежит. Так-же путь до рома тоже надо будет подумать как доделать.

26
Ромхакинг / [SMD] Хак Zero Tolerance
« : 07 Ноябрь 2025, 21:25:38 »
текстур неба, полотока и пола у меня так и нет, как и инструкций как они рисуются :) посему в моей 3д интерпритации карты этого нет. одноцветная заливка фона по идее не поможет, так как эти самые текстуры - полноценные, то есть там нет выкидывания повторяющихся тайлов - разве что блоки в текстуре могут повторятся. это раз. а дваз - все равно там должно будет просчитываться освещение - типа далеко, то пиксели темнее, ближе - ярче. то есть даже если это будет залито одним тоном - все равно просчет никуда не денется.

27
Ромхакинг / Re: [SMD] Хак Zero Tolerance
« : 06 Ноябрь 2025, 10:00:59 »
да женщина там не столько как враг-женщина, сколько было бы здорово снайпершу японку в кооперативе рисовать. сейчас хоть какой персонаж выбери - второй игрок будет видеть первого как обычного пехотинца. и оружие там по моему не меняется, ибо это не халфлайф, чтоб модели в легкую пушку подрисовать. там сразу целиком модель рисовать надо, и тогда получается один и тот-же скин надо было бы копипастить ко всем видам оружия. приставка икать начнет :)

28
Ромхакинг / [SMD] Хак Zero Tolerance
« : 06 Ноябрь 2025, 05:00:37 »
попробуй на fastpic.ru, а сюда прикладывать как изображение, а не вложение. через [img][/img]

29
Ромхакинг / [SMD] Хак Zero Tolerance
« : 05 Ноябрь 2025, 00:03:59 »
а зачем вы делаете спрайт этой женщины
нам просто женщин не хватает :(

30
Ромхакинг / [SMD] Хак Zero Tolerance
« : 04 Ноябрь 2025, 23:58:47 »
А почему ZT  нужно делать только на движке ZT?
преемственность, стиль, ощущения.

Страницы: [1] 2 3 4 5 ... 93 Далее