Как идут дела с переводом?
Помогите новичку с переводом
Сообщений 121 страница 140 из 152
Поделиться1222011-06-08 15:43:42
Потихоньку вставляю переведённый текст. Так же пытаюсь написать распаковщик графики. Вот сессия закончится и вплотную займусь переводом
Поделиться1232011-06-14 21:52:12
У меня снова проблемы с алгоритмом сжатия...
Хотелось бы вернуться на несколько страниц назад в теме..
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 байта. Так вот он мне распакует данные вот так:
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
А для того, чтобы была последовательность вида:
AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA
Мне нужно скопировать не 33 байта, а 12 байт..((
Так же у меня есть последовательность:
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 раз. Не могу понять почему так... (((
заранее прошу прощения, что я такой непонятливый...
Поделиться1242011-06-15 07:20:51
Мне нужно скопировать не 33 байта, а 12 байт..((
Ты пару байт сжатия то покажи.
Но вот почему 4 байта??
Дык ты на флаговый байт то посмотри:
E7 = 11100111
Нули указывают на две пары байт сжатия: E4 63 и 00 05, обе эти пары указывают на нули, первая копирует 6 нулей, вторая - 8 нулей.
Дальше 0005 указывает на байт 03
Не на 03, а на 00, это ведь уже другая пара сжатия.
Поделиться1252011-06-15 15:31:01
Ты пару байт сжатия то покажи.
Последовательность в роме:
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
Поделиться1262011-06-15 15:41:47
Но вот мне не понятно почему нельзя было сжать эти нули одной парой байт, почему их две?
Потому что более длинной последовательности нулей не нашлось.
h6E означает, что нужно скопировать 16 раз бат по смещению h01 от начала блока.
Неверно. Это означает скопировать 16 байт начиная с байта по смещению h01 от начала блока. То есть будет 98 и дальше ещё 15 байтов, которые идут после него.
Вообще советую тебе сначала разобраться с назначением всех битов пары сжатия.
Отредактировано TrickZter (2011-06-15 15:49:39)
Поделиться1272011-06-15 16:15:47
Потому что более длинной последовательности нулей не нашлось.
Спасибо, с этим всё понятно.
Неверно. Это означает скопировать 16 байт начиная с байта по смещению h01 от начала блока. То есть будет 98 и дальше ещё 15 байтов, которые идут после него.
Т.е. будет 0098DBDBB8B8 и т.д.?
Но получается как-то не так. Должна получиться вот такая последовательность:
Вообще советую тебе сначала разобраться с назначением всех битов пары сжатия.
Ну вот мне до сих пор не понятно назначение вот этих байт (выделены жирным):
11011110 01101110
и что они значат я даже представить не могу((
Поделиться1282011-06-15 16:29:08
Т.е. будет 0098DBDBB8B8 и т.д.?
С чего ты решил? Копирование происходит не из запакованных, а уже из распакованных байтов.
Ну вот мне до сих пор не понятно назначение вот этих байт (выделены жирным):
11011110 01101110
и что они значат я даже представить не могу((
Без понимания всех битов ты не сможешь написать распаковщик. Пробуй менять эти биты и смотри, что происходит с картинкой в игре.
Отредактировано TrickZter (2011-06-15 16:32:34)
Поделиться1292011-06-15 16:31:39
С чего ты решил? Копирование происходит не из запакованных, а уже из распакованных байтов.
Я это понимаю. На первом шаге у меня копируется без изменения 00. И больше пока у меня нету распакованных данных.
Без понимания всех битов ты не сможешь написать распаковщик. Пробуй менять эти биты и смотри, что происходит с картинкой в игре.
Хорошо, попробую..
Отредактировано Ace Lightning (2011-06-15 16:50:30)
Поделиться1302011-06-15 16:45:44
Ща гляну - посмотрю чё эти биты делают.
Отредактировано TrickZter (2011-06-15 16:50:45)
Поделиться1312011-06-15 21:14:53
TrickZter
Ну как?
Поделиться1322011-06-16 11:09:32
Судя по всему это старшие биты адреса байта, но нужно проверять.
Поделиться1332011-06-17 12:24:24
Хмм... чтож, буду разбираться.. хотя это сложновато)
Поделиться1342011-06-17 13:50:55
Ну вот смотри, если ты байт 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 тоже есть, так что можно считать через него:
[реклама вместо картинки]
Отредактировано TrickZter (2011-06-17 14:04:05)
Поделиться1352011-06-17 15:22:52
TrickZter
Похоже работает! Ту последовательность, которую я приводил в качестве примера несколькими постами выше он распаковал верно:) Спасибо большое!
Завтра начну писать распаковщик
-------
Весь текст в игре переведён, осталось разобраться с графикой и протестировать игру
Вот парочка спойлеров:
Так же, если шрифт не подходит, то можно вернуться к шрифту, как в оригинале.
Отредактировано Ace Lightning (2011-06-17 21:05:08)
Поделиться1362011-06-17 23:05:36
первый шрифт оставляй))) красота))
Поделиться1372011-06-18 21:42:18
первый шрифт оставляй))) красота))
Ок
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
Там номер получается отрицательным..
Отредактировано Ace Lightning (2011-06-18 22:45:32)
Поделиться1382011-06-19 07:36:33
Там номер получается отрицательным..
А, надо просто отсеить лишнюю часть, оставив только младшие 11 бит. Тогда формула вычисления номера приобретает следующий вид:
Nomer:=(X1+((X2 shr 5) shl 8)-$3DE) and $7FF;
при паре 02 00 у тебя получится следующее:
(2+0-$3DE) and $7FF
-$3DC and $7FF
Результат: $424 или 1060 (если в десятичном виде).
Отредактировано TrickZter (2011-06-19 07:43:54)
Поделиться1392011-06-19 16:11:08
Вот мне бы не and $7FF, а and $FF, т.к. мне как раз из $424 нужно именно $24 (или 36 в десятичной), тогда эти два бита распаковываются правильно, но дальше получается каша..
Поделиться1402011-06-19 16:33:32
Если так, значит старшие 3 бита второго байта работают как-то иначе. Надо проверять как они реально работают
Отредактировано TrickZter (2011-06-19 16:34:56)