форум группы Chief-Net » » Переводы » Доработка Jewel Master (GEN)

Страниц (3): « 1 2 [3]
 

61. Марат - 23 Января, 2018 - 12:28:56 - перейти к сообщению
С хаффманом сжимает на 22 байта лучше. Хотя это возможно потому, что я максимально использовал все коды. В оригинале, если мне не изменяет память. Несколько последних кодов не использовалось. Я же это учёл. Т.е. в таблице у меня всё место занято за исключением кодов FC, FD, FE, FF.
62. Марат - 23 Января, 2018 - 23:06:28 - перейти к сообщению
Ещё немного подшаманил. Теперь ещё лучше сжимает. До 4347 байт с учётом заголовка.
Плюс написал распаковщик.
63. Mefistotel - 30 Января, 2018 - 02:14:43 - перейти к сообщению
Посмотрю на досуге, чтобы залить на сайт.
Возможно понадобится немного "прилохматить".
64. Марат - 30 Января, 2018 - 08:22:34 - перейти к сообщению
А это не кодекс, это сжатый файл для сравнения.
65. Mefistotel - 30 Января, 2018 - 11:08:25 - перейти к сообщению
Давай уж кодеК)
66. Марат - 30 Января, 2018 - 15:08:35 - перейти к сообщению
Решил я сегодня до ума довести codec и приключилась со мной одна неприятная ситуация.
Я уже заканчивал доработку и решил проверить напоследок, что кодек работает правильно.
Начал делать распаковку и тут ошибка вылезла. Нарущение доступа и т.п.



Ну, думаю, что за фигня? Я же не менял код, а только обратил внимание на warning'и и устранил их. Более получаса, наверно, потратил, чтоб найти ошибку.
Оказалось ошибка здесь. Вот он мне писал:



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



И после этого началась вся эта свистопляска. Вот уж не подумал бы, что из-за могло что-то нарушиться.
67. Марат - 30 Января, 2018 - 16:23:51 - перейти к сообщению
Mefistotel пишет:
Давай уж кодеК)

Вот.
68. Griever - 30 Января, 2018 - 21:44:12 - перейти к сообщению
Марат пишет:
Решил я сегодня до ума довести codec и приключилась со мной одна неприятная ситуация.
Я уже заканчивал доработку и решил проверить напоследок, что кодек работает правильно.
Начал делать распаковку и тут ошибка вылезла. Нарущение доступа и т.п.

Императивопроблемы.
Ни разу не дебажил программу на Хаскелле. При этом из самого сложного могу вспомнить МТЕ/LZ под Megal Gear на GBC и упаковщик по Kirby, который жмет даже эффективнее exhal'а .
До твоего хаффмана в Jewel Master у меня тоже руки дойдут Радость
69. Марат - 30 Января, 2018 - 22:53:15 - перейти к сообщению
Griever пишет:
Ни разу не дебажил программу на Хаскелле.

Что с первого раза у тебя упаковщик начинает работать?
Я сколько бы ни писал компрессоров, всегда что-нибудь упущу. Соответственно приходиться трассировать код, как без этого.
70. Griever - 31 Января, 2018 - 08:07:41 - перейти к сообщению
Марат пишет:
Griever пишет:
Ни разу не дебажил программу на Хаскелле.

Что с первого раза у тебя упаковщик начинает работать?
Я сколько бы ни писал компрессоров, всегда что-нибудь упущу. Соответственно приходиться трассировать код, как без этого.

Программа на функциональном языке - не последовательность команд. А ленивость делает трассирование вообще бессмысленным.
Сам процесс написания отличается - в Хаскелле ты открываешь REPL и пишешь однострочные функции, которые возвращают тебе то, что надо, а потом компонуешь уже заведомо работающие.
Из-за строгой типизации Хаскелля ты не сможешь скомпилировать код, в котором что-то забыл. Если код успешно скомпилировался, и при этом делает не то, что ты задумал, значит ты сказал ему конкретно делать так. Это устраняется прочтением своих функций (благо, код высокоуровневый и его получается немного), а в крайнем случае, просто вызываешь функции из REPL'а и находишь, какая из них возвращает не то, что надо.
71. Марат - 31 Января, 2018 - 09:15:13 - перейти к сообщению
Интересно. Я когда-то скачивал книги о Хаскелл, но руки не дошли. Так что перефразирую тебя: до твоего хаскелла у меня тоже руки дойдут. Радость

Ты ещё, кстати, не начал писать пакет к Star trek'у? Там довольно интересный алгоритм, как раз как ты любишь.
Я когда-то разбирал, но все мои потуги остались на не рабочем диске.
72. Griever - 31 Января, 2018 - 10:22:02 - перейти к сообщению
Марат пишет:

Ты ещё, кстати, не начал писать пакет к Star trek'у? Там довольно интересный алгоритм, как раз как ты любишь.
Я когда-то разбирал, но все мои потуги остались на не рабочем диске.

Уже написал Подмигивание Схема сжатия интересная, но алгоритм оптимальной упаковки довольно тривиален. Конечно, не Кирби.
73. Марат - 31 Января, 2018 - 10:24:36 - перейти к сообщению
Там, если не ошибаюсь, нужно много вариантов выбирать, каким способом лучше сжать.
74. Griever - 31 Января, 2018 - 10:59:49 - перейти к сообщению
Да, но каждый кандидат либо исключает других кандидатов, либо заведомо имеет меньшую стоимость, поэтому на каждом шаге ты сразу точно можешь сказать, какой из кандидатов оптимален и выбрать его.
Нет головной боли с оптимальным LZ парсингом.
75. Griever - 11 Марта, 2018 - 13:43:51 - перейти к сообщению
Спасибо, Marat. По всей видимости, ты прав. Это алгоритм с префиксными кодами, который может быть улучшен Хаффманом.
Обновил readme для своего инструмента со ссылкой на эту ветку форума.
76. Марат - 18 Февраля, 2023 - 07:47:00 - перейти к сообщению
Оказывается это сжатие используется также в игре Phantasy Star 2: Anne's adventure, ну и скорее всего в остальных частях.
Предыстория:
Где-то примерно год назад ко мне обратился товарищ Lin1985, и попросил помочь с переводом данной игры. Ему требовалась помощь в перерисовки шрифта. Я написал ему утилитку, и он ушёл переводить.)

И вот спустя год ему снова потребовалась помощь в нахождении шрифта и перерисовки надписи Phantasy Star в меню.
Я начал изучать код и мне показалось, что где-то это я уже видел, что-то знакомое. Но никак не мог вспомнить где. Тогда я решил прошерстить все свои исходники декомпрессоров, но искал я только в исходниках, с RLE кодом. А так как я помнил, что в Jewel Master используется Хаффман, то не заглядывал в его исходник. Просмотрев несколько раз свои исходники, я пришёл к выводу, что, скорее всего, это было давно и код распаковщика, если когда-то я что-то писал похожее, утерян. С это мыслью я взялся за подробное изучение кода распаковки. Всё это осложнялось тем, что часть кода разработчики запихали в область RAM( причём там тупо идут прыжки на код в роме. Я так и понял суть таких манипуляции. Что интересно 8 кб данных и кода копируются в память RAM перед началом игры и читаются и исполняются из RAM). А ни IDA, ни дебаггер Шеллоский не показывают выполнение команд в RAM. Из-за этого IDA не может построить дерево кода распаковки. Так или иначе я разобрался с процедурой распаковки и пришло время писать компрессор. Начал прикидывать, как я буду это делать. Сразу подумал о том, что надо перед началом сжатия, произвести подсчёт кол-ва появлений RLE-nibble'a. Как я буду распределять длину кода для каждого ниббла и как оно будет распределяться в таблице вероятности. И ровно в этот момент, у меня всплыла в голове это тема на форуме, и ток, как Гривер описывал сжатие, и про его LookUpTable в 256 байт, и то как я доказывал Гриверу, что это здесь используется дерево Хаффмана. Сразу полез в код распаковщика Jewel Master'a и убедился, что это и есть тот самый код распаковки из игры. Так что теперь мне даже не надо писать код компрессора). Жаль только, что я его сразу не нашёл. Вот такая вот история. Улыбка
77. Griever - 18 Февраля, 2023 - 12:19:50 - перейти к сообщению
Ну там и разработчик один и годы релизов рядом, небось, и код распаковщиков совпадает, если не учитывать оффсеты Улыбка
78. Марат - 18 Февраля, 2023 - 12:30:47 - перейти к сообщению
Возможно, но я не помню чтобы мне попадалось, чтобы код программы выполнялся в ОЗУ, кроме пересылки DMA.

Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®