форум группы Chief-Net форум группы Chief-Net
Перевод приставочных игр и не только!
drako site Перейти на сайт группы     Наш чат      Помощь      Поиск      Пользователи


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

> Описание: Разбор алгоритма LZSS
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 06:15:40
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter
Цитата:
Вот ещё что хотел спросить: для распаковщика входными данными является путь к рому, начало блока графика и конец блока графики. Правильно ли это?

А как ты конец нашёл? Проще всего реализовать программу, если в качестве входных данных дать: 1) имя файла, 2) координату начала запакованных данных, 3) размер данных, которые хотим получить на выходе.
Если не задать размер, то алгоритм позволяет "распаковывать" всё подряд - хоть до конца рома, и на выходе ты получишь распакованную картинку плюс СОТНИ хлама, следующие за ней.
Цитата:
или можно как-то программно определять алгоритм сжатия и не задавать начального и конечного значений блоков графики?

С точки зрения реализации гораздо проще указать программе все данные самому. Хотя используя различные методы программу можно научить находить что-то похожее на пожатые ресурсы, но гарантий никаких нет, ведь практически любую последовательность байтов можно попытаться так или иначе "распаковать" и получить на выходе бесполезный мусор.
Если ошибиться с началом картинки, то даже запакованная картинка может превратиться во что-то мусоро-подобное. Представь, например, что за флаговый байт мы взяли не первый байт пожатой картинки, а байт перед ней или второй байт пожатой картинки. Даже из-за такой небольшой ошибки программа будет воспринимать данные совсем иначе: то, что должно быть не пожатым байтом, может восприниматься программой как часть пары сжатия, а то, что было частью пары сжатия, будет восприниматься как не пожатый байт. В итоге "распакованная" картинка превратится в месево, в котором, если повезёт, где-нибудь под конец и появится что-то похожее на конец картинки (если на каком-то этапе программа верно попадёт во флаговый байт).
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 06:16:01
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Цитата:
А как ты конец нашёл?


Конец я нашёл просто посмотрев в эмуляторе код тайла, который нужно распаковать последним и нашёл его в роме. Улыбка
А размер данных мне как узнать? Просто умножить кол-во тайлов на кол-во байт, которыми записаны тайлы?
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 06:16:35
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter
Цитата:
А размер данных мне как узнать?

Умножить количество тайлов на размер тайла в байтах. Если графика в формате 8BPP (на один пиксель приходится 8 бит или 1 байт), то размер одного тайла будет 8x8=64 байта, если 4BPP (на один пиксель приходится 4 бита или половина байта), то размер тайла будет 8x8/2=32 байта. 2BPP и 1BPP в ГБА играх встречаются крайне редко, но посчитать, думаю, будет несложно Улыбка
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 06:16:52
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Ну да, я так и предполагал Улыбка
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 06:17:14
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Если есть у кого время, помогите перевести предложение, выделенное жирным. А то что-то никак не могу правильно понять весь его смысл:
Dracula:
You have done well, my girl. In fact, you are the first human who has come this far. You have my praise.
Sonia:
You are the Prince of Darkness. Because of you many people have died, many people have suffered.
Dracula:
Oh no, my dear. have merely done what you humans wished for, fulfilling your insatiable desires.
Sonia:
People must fulfill their dreams with their own power. You who have been consumed by the power of evil no longer have the strength to determine your own fate!
Dracula:
Silence! On the contrary, I am just the one to use this power, and I will be the king who rules over the entire world. Give yourself to me, young lady. There may be merit in having your power, in having your presence.
Sonia:
My strength will only be used to protect the world! Lord of Darkness, prepare to suffer for trifling with so many lives!
Dracula:
As you wish, girl. Then it is your fate to kneel before my power!
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 06:17:34
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter

There may be merit in having your power, in having your presence.
Думаю, больше всего тебя смутило слово merit. Улыбка В данном случае его можно перевести как "ценность". То есть Дракула буквально говорит следующее: "Возможно есть ценность иметь твою силу, иметь твоё присутствие".
Если говорить по-русски, то выходит что-то типа: "Возможно ты и твоя сила мне пригодятся". Можно, конечно, написать и как-то иначе, как-нибудь более пафосно. Улыбка
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 06:17:58
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Ну смысл этого предложения сначала мне показался в том, что как бы ценность силы Сони именно в том, что она жива. Как бы умерев ни её сила, ни она сама будет уже не нужна.
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 06:18:13
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter

Судя по тексту, он в любом случае не собирается её убивать:
Then it is your fate to kneel before my power!
Хотя, амеры могли так просто выпилить слово "умереть", типа чтобы "уменьшить" уровень насилия Улыбка
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 06:18:32
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Да, они могут Улыбка
Ладно, буду думать над вариантами. Спасибо за помощь Улыбка
 
 Top
Mefistotel Администратор
Отправлено: 03 Февраля, 2016 - 06:18:50
Post Id



Chief-Net


Покинул форум
Сообщений всего: 7056
Дата рег-ции: Окт. 2014  
Откуда: МАГАДАН





Mefistotel
Как идут дела с переводом?

-----
"Перевод старых игр - отличная возможность понять, как устроены программы, подучить иностранный язык и поднять уровень владения родным. Ну и конечно, это просто возможность "общения" со своей любимой игрой детства." © Dimouse
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 06:19:13
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Потихоньку вставляю переведённый текст. Так же пытаюсь написать распаковщик графики. Вот сессия закончится и вплотную займусь переводом Улыбка
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 06:19:34
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
У меня снова проблемы с алгоритмом сжатия...
Хотелось бы вернуться на несколько страниц назад в теме..
CODE:
AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA
AA 55 55 AA 94 7E

94 указывает на AA, и начиная с него копируем 33 байта. Так вот он мне распакует данные вот так:
CODE:
AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA

А для того, чтобы была последовательность вида:
CODE:
AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA

Мне нужно скопировать не 33 байта, а 12 байт..((

Так же у меня есть последовательность:
CODE:
4A 4A 03 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF C1 7F 40


а вот запакованная (жирным выделены флаговые байты)
4A E7 4A 03 03 E4 63 00 05 FF C1 7F FF 40

Байт E7 показывает нам, что выделенные курсивом 4 байта отвечают за сжатие последовательности нулей. Но вот почему 4 байта??
E463 указывает на байт 00, который был до этой последовательности, и он копируется 6 раз. Дальше 0005 указывает на байт 03, который так же был до этой последовательности и он копируется 8 раз. Не могу понять почему так... (((

заранее прошу прощения, что я такой непонятливый...
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 06:19:59
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter
Цитата:
Мне нужно скопировать не 33 байта, а 12 байт..((

Ты пару байт сжатия то покажи.

Цитата:
Но вот почему 4 байта??
Дык ты на флаговый байт то посмотри:
E7 = 11100111
Нули указывают на две пары байт сжатия: E4 63 и 00 05, обе эти пары указывают на нули, первая копирует 6 нулей, вторая - 8 нулей.

Цитата:
Дальше 0005 указывает на байт 03
Не на 03, а на 00, это ведь уже другая пара сжатия.
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 06:21:12
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Цитата:
Ты пару байт сжатия то покажи.

Последовательность в роме:
AA 55 55 AA 94 7E

Незапакованная последовательность:
AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA

Цитата:
Не на 03, а на 00, это ведь уже другая пара сжатия.

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

Давайте я напишу как я понимаю принцип распаковки, а Вы если что поправите меня. Например:
F5 00 DE 6E 98 F0 60 D8 D8 B8 B8 FE F0 61 98 98 00 00 7D 7D 61

1.0)F5 - флаговый байт. (11110101)
1.1)Первый байт копируем без изменений.
00
1.2)Следующие два байта для распаковки.
hDE -> h01
h6E означает, что нужно скопировать 16 раз бат по смещению h01 от начала блока.
(подчёркнутый - что копируем, жирный - куда копируем)
01. 0000
02. 000000
03. 00000000
04. 0000000000
05. 000000000000
06. 00000000000000
07. 0000000000000000
08. 000000000000000000
09. 00000000000000000000
10. 0000000000000000000000
11. 000000000000000000000000
12. 00000000000000000000000000
13. 0000000000000000000000000000
14. 000000000000000000000000000000
16. 00000000000000000000000000000000
1.3)Копируем байт без изменений.
000000000000000000000000000000000098
1.4)Следующие два байта для распаковки.
hF0 -> h12 -> 17
Копируем 3 раза байт по смещению h12 от начала.
1. 00000000000000000000000000000000009898
2. 0000000000000000000000000000000000989898
3. 000000000000000000000000000000000098989898
1.5)Копируем байт без изменений.
000000000000000000000000000000000098989898D8
1.6)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8
1.7)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8
1.8)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B8

2.0)FE - флаговый байт. (11111110)
2.1)Следующие два байта для распаковки.
hF0(уже было) -> h12 -> 17
Копируем 4 раза байт по смещению h12 от начала.
1. 000000000000000000000000000000000098989898D8D8B8B898
2. 000000000000000000000000000000000098989898D8D8B8B89898
3. 000000000000000000000000000000000098989898D8D8B8B8989898
4. 000000000000000000000000000000000098989898D8D8B8B898989898
2.2)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B89898989898
2.3)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B8989898989898
2.4)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B898989898989800
2.5)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B89898989898980000
2.6)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B898989898989800007D
2.7)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B898989898989800007D7D
2.8)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B898989898989800007D7D61
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 06:22:22
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter
Цитата:
Но вот мне не понятно почему нельзя было сжать эти нули одной парой байт, почему их две?
Потому что более длинной последовательности нулей не нашлось.

Цитата:
h6E означает, что нужно скопировать 16 раз бат по смещению h01 от начала блока.
Неверно. Это означает скопировать 16 байт начиная с байта по смещению h01 от начала блока. То есть будет 98 и дальше ещё 15 байтов, которые идут после него.

Вообще советую тебе сначала разобраться с назначением всех битов пары сжатия.
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 06:24:21
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Цитата:
Потому что более длинной последовательности нулей не нашлось.

Спасибо, с этим всё понятно.
Цитата:
Неверно. Это означает скопировать 16 байт начиная с байта по смещению h01 от начала блока. То есть будет 98 и дальше ещё 15 байтов, которые идут после него.

Т.е. будет 0098DBDBB8B8 и т.д.?
Но получается как-то не так. Должна получиться вот такая последовательность:

Цитата:
Вообще советую тебе сначала разобраться с назначением всех битов пары сжатия.

Ну вот мне до сих пор не понятно назначение вот этих байт (выделены жирным):
11011110 01101110
и что они значат я даже представить не могу((
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 06:27:15
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter
Цитата:
Т.е. будет 0098DBDBB8B8 и т.д.?

С чего ты решил? Копирование происходит не из запакованных, а уже из распакованных байтов.
Цитата:
Ну вот мне до сих пор не понятно назначение вот этих байт (выделены жирным):
11011110 01101110
и что они значат я даже представить не могу((

Без понимания всех битов ты не сможешь написать распаковщик. Пробуй менять эти биты и смотри, что происходит с картинкой в игре.
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 06:55:05
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Цитата:
С чего ты решил? Копирование происходит не из запакованных, а уже из распакованных байтов.


Я это понимаю. На первом шаге у меня копируется без изменения 00. И больше пока у меня нету распакованных данных.
Цитата:
Без понимания всех битов ты не сможешь написать распаковщик. Пробуй менять эти биты и смотри, что происходит с картинкой в игре.


Хорошо, попробую..
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 06:56:54
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter
Ща гляну - посмотрю чё эти биты делают.
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 07:07:16
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





TrickZter
Ну как?
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 07:07:33
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter
Судя по всему это старшие биты адреса байта, но нужно проверять.
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 07:07:52
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Хмм... чтож, буду разбираться.. хотя это сложновато)
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 07:08:15
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter
Ну вот смотри, если ты байт 28C4E изменишь на DE, то копирование будет начинаться с первого байта картинки.
Теперь из пары DE 62 определим номер самого первого байта картинки:
DE 62 = 11011110 01100010
Младшие 5 бит второго байта - это размер копируемого отрезка, первый байт - это младшая часть номера байта, с которого начинается копирование. Если моя догадка верна и 3 старших бита второго байта - есть три старших бита номера байта, то адрес самого первого байта выходит таковым: 011 11011110, то есть 3DE.
Пусть X1 и X2 - это первый и второй байты сжатия, тогда для получения длины отрезка и номера байта нужно делать следующее (записываю как для Delphi):
Dlina:=(X2 and $1F)+3;
Nomer:=X1+((X2 shr 5) shl 8)-$3DE;
3DE мы вычитаем, так как удобнее считать всё-таки с нуля. До этого ты добавлял значение $22, что равносильно вычитанию $DE.
Если моя догадка верна, то эти формулы должны работать для всей пожатой картинки. Надо только проверить.
З.Ы.: Кстати, в виндовом калькуляторе shr, shl и and тоже есть, так что можно считать через него:
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 07:08:49
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





TrickZter
Похоже работает! Ту последовательность, которую я приводил в качестве примера несколькими постами выше он распаковал верноУлыбка Спасибо большое!
Завтра начну писать распаковщик Улыбка
-------
Весь текст в игре переведён, осталось разобраться с графикой и протестировать игру Улыбка
 
 Top
greengh0st Пользователь
Отправлено: 03 Февраля, 2016 - 07:09:09
Post Id






Покинул форум
Сообщений всего: 216
Дата рег-ции: Июнь 2015  





greengh0st
первый шрифт оставляй))) красота))
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 07:09:37
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Цитата:
первый шрифт оставляй))) красота))


Ок Улыбка
TrickZter
Что-то не работает.. например для пары байт (выделены жирным) вот в этой последовательности:
F5 00 DE 6E 98 F0 60 D8 D8 B8 B8 FE F0 61 98 98 00 00 7D 7D 61 F6 02 00 79 79 02 01 7D 7D 00 00
Там номер получается отрицательным..
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 07:10:26
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter
Цитата:
Там номер получается отрицательным..

А, надо просто отсеить лишнюю часть, оставив только младшие 11 бит. Тогда формула вычисления номера приобретает следующий вид:
Nomer:=(X1+((X2 shr 5) shl 8)-$3DE) and $7FF;
при паре 02 00 у тебя получится следующее:
(2+0-$3DE) and $7FF
-$3DC and $7FF
Результат: $424 или 1060 (если в десятичном виде).
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 07:10:43
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Вот мне бы не and $7FF, а and $FF, т.к. мне как раз из $424 нужно именно $24 (или 36 в десятичной), тогда эти два бита распаковываются правильно, но дальше получается каша..
 
 Top
TrickZter Пользователь
Отправлено: 03 Февраля, 2016 - 07:11:03
Post Id





Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015  





TrickZter
Если так, значит старшие 3 бита второго байта работают как-то иначе. Надо проверять как они реально работают Улыбка
 
 Top
Ace Lightning Пользователь
Отправлено: 03 Февраля, 2016 - 07:11:23
Post Id



VIP


Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015  





Ace Lightning
Ыыы) Ладно, сейчас буду их пытать Улыбка
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Экстрим хакинг »


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



> Похожие темы: Castlevania: Legends (GB)
Темы Форум Информация о теме Обновление
Battle City [NES]
АРХИВНАЯ ТЕМА 2011 ГОДА
Переводы Ответов: 10
Автор темы: Ace Lightning
04 Октября, 2016 - 06:38:39
Автор: Mefistotel
Double Dribble [NES]
АРХИВНАЯ ТЕМА 2011 ГОДА
Переводы Ответов: 4
Автор темы: Ace Lightning
04 Октября, 2016 - 06:46:40
Автор: Mefistotel
Приколы
Флудильня Ответов: 9
Автор темы: Ace Lightning
15 Июня, 2018 - 02:11:59
Автор: bybyc9lc9l
Castlevania: Ledends [GB]
АРХИВНАЯ ТЕМА 2012 года
Переводы Ответов: 16
Автор темы: Ace Lightning
07 Сентября, 2016 - 09:49:14
Автор: Mefistotel
Оптимальное сжатие в запаковщике
Программирование Ответов: 35
Автор темы: Ace Lightning
28 Января, 2019 - 09:59:35
Автор: Марат
 

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