форум группы Chief-Net » » Экстрим хакинг » Castlevania: Legends (GB)

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

31. TrickZter - 03 Февраля, 2016 - 06:15:40 - перейти к сообщению
TrickZter
Цитата:
Вот ещё что хотел спросить: для распаковщика входными данными является путь к рому, начало блока графика и конец блока графики. Правильно ли это?

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

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


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

Умножить количество тайлов на размер тайла в байтах. Если графика в формате 8BPP (на один пиксель приходится 8 бит или 1 байт), то размер одного тайла будет 8x8=64 байта, если 4BPP (на один пиксель приходится 4 бита или половина байта), то размер тайла будет 8x8/2=32 байта. 2BPP и 1BPP в ГБА играх встречаются крайне редко, но посчитать, думаю, будет несложно Улыбка
34. Ace Lightning - 03 Февраля, 2016 - 06:16:52 - перейти к сообщению
Ace Lightning
Ну да, я так и предполагал Улыбка
35. Ace Lightning - 03 Февраля, 2016 - 06:17:14 - перейти к сообщению
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!
36. TrickZter - 03 Февраля, 2016 - 06:17:34 - перейти к сообщению
TrickZter

There may be merit in having your power, in having your presence.
Думаю, больше всего тебя смутило слово merit. Улыбка В данном случае его можно перевести как "ценность". То есть Дракула буквально говорит следующее: "Возможно есть ценность иметь твою силу, иметь твоё присутствие".
Если говорить по-русски, то выходит что-то типа: "Возможно ты и твоя сила мне пригодятся". Можно, конечно, написать и как-то иначе, как-нибудь более пафосно. Улыбка
37. Ace Lightning - 03 Февраля, 2016 - 06:17:58 - перейти к сообщению
Ace Lightning
Ну смысл этого предложения сначала мне показался в том, что как бы ценность силы Сони именно в том, что она жива. Как бы умерев ни её сила, ни она сама будет уже не нужна.
38. TrickZter - 03 Февраля, 2016 - 06:18:13 - перейти к сообщению
TrickZter

Судя по тексту, он в любом случае не собирается её убивать:
Then it is your fate to kneel before my power!
Хотя, амеры могли так просто выпилить слово "умереть", типа чтобы "уменьшить" уровень насилия Улыбка
39. Ace Lightning - 03 Февраля, 2016 - 06:18:32 - перейти к сообщению
Ace Lightning
Да, они могут Улыбка
Ладно, буду думать над вариантами. Спасибо за помощь Улыбка
40. Mefistotel - 03 Февраля, 2016 - 06:18:50 - перейти к сообщению
Mefistotel
Как идут дела с переводом?
41. Ace Lightning - 03 Февраля, 2016 - 06:19:13 - перейти к сообщению
Ace Lightning
Потихоньку вставляю переведённый текст. Так же пытаюсь написать распаковщик графики. Вот сессия закончится и вплотную займусь переводом Улыбка
42. Ace Lightning - 03 Февраля, 2016 - 06:19:34 - перейти к сообщению
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 раз. Не могу понять почему так... (((

заранее прошу прощения, что я такой непонятливый...
43. TrickZter - 03 Февраля, 2016 - 06:19:59 - перейти к сообщению
TrickZter
Цитата:
Мне нужно скопировать не 33 байта, а 12 байт..((

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

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

Цитата:
Дальше 0005 указывает на байт 03
Не на 03, а на 00, это ведь уже другая пара сжатия.
44. Ace Lightning - 03 Февраля, 2016 - 06:21:12 - перейти к сообщению
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
45. TrickZter - 03 Февраля, 2016 - 06:22:22 - перейти к сообщению
TrickZter
Цитата:
Но вот мне не понятно почему нельзя было сжать эти нули одной парой байт, почему их две?
Потому что более длинной последовательности нулей не нашлось.

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

Вообще советую тебе сначала разобраться с назначением всех битов пары сжатия.
46. Ace Lightning - 03 Февраля, 2016 - 06:24:21 - перейти к сообщению
Ace Lightning
Цитата:
Потому что более длинной последовательности нулей не нашлось.

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

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

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

Ну вот мне до сих пор не понятно назначение вот этих байт (выделены жирным):
11011110 01101110
и что они значат я даже представить не могу((
47. TrickZter - 03 Февраля, 2016 - 06:27:15 - перейти к сообщению
TrickZter
Цитата:
Т.е. будет 0098DBDBB8B8 и т.д.?

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

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


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


Хорошо, попробую..
49. TrickZter - 03 Февраля, 2016 - 06:56:54 - перейти к сообщению
TrickZter
Ща гляну - посмотрю чё эти биты делают.
50. Ace Lightning - 03 Февраля, 2016 - 07:07:16 - перейти к сообщению
TrickZter
Ну как?
51. TrickZter - 03 Февраля, 2016 - 07:07:33 - перейти к сообщению
TrickZter
Судя по всему это старшие биты адреса байта, но нужно проверять.
52. Ace Lightning - 03 Февраля, 2016 - 07:07:52 - перейти к сообщению
Ace Lightning
Хмм... чтож, буду разбираться.. хотя это сложновато)
53. TrickZter - 03 Февраля, 2016 - 07:08:15 - перейти к сообщению
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 тоже есть, так что можно считать через него:
54. Ace Lightning - 03 Февраля, 2016 - 07:08:49 - перейти к сообщению
TrickZter
Похоже работает! Ту последовательность, которую я приводил в качестве примера несколькими постами выше он распаковал верноУлыбка Спасибо большое!
Завтра начну писать распаковщик Улыбка
-------
Весь текст в игре переведён, осталось разобраться с графикой и протестировать игру Улыбка
55. greengh0st - 03 Февраля, 2016 - 07:09:09 - перейти к сообщению
greengh0st
первый шрифт оставляй))) красота))
56. Ace Lightning - 03 Февраля, 2016 - 07:09:37 - перейти к сообщению
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
Там номер получается отрицательным..
57. TrickZter - 03 Февраля, 2016 - 07:10:26 - перейти к сообщению
TrickZter
Цитата:
Там номер получается отрицательным..

А, надо просто отсеить лишнюю часть, оставив только младшие 11 бит. Тогда формула вычисления номера приобретает следующий вид:
Nomer:=(X1+((X2 shr 5) shl 8)-$3DE) and $7FF;
при паре 02 00 у тебя получится следующее:
(2+0-$3DE) and $7FF
-$3DC and $7FF
Результат: $424 или 1060 (если в десятичном виде).
58. Ace Lightning - 03 Февраля, 2016 - 07:10:43 - перейти к сообщению
Ace Lightning
Вот мне бы не and $7FF, а and $FF, т.к. мне как раз из $424 нужно именно $24 (или 36 в десятичной), тогда эти два бита распаковываются правильно, но дальше получается каша..
59. TrickZter - 03 Февраля, 2016 - 07:11:03 - перейти к сообщению
TrickZter
Если так, значит старшие 3 бита второго байта работают как-то иначе. Надо проверять как они реально работают Улыбка
60. Ace Lightning - 03 Февраля, 2016 - 07:11:23 - перейти к сообщению
Ace Lightning
Ыыы) Ладно, сейчас буду их пытать Улыбка

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