alex_231
Встречался ли кто-нибудь со сжатием в NES-овских играх?
Приведите, пожалуйста, примеры.
P.S.: вопрос вызывает профессиональный интерес.
1. alex_231 - 10 Февраля, 2016 - 07:44:43 - перейти к сообщению
2. Guyver - 10 Февраля, 2016 - 07:45:12 - перейти к сообщению
Guyver
А ещё лучше скажите - кто-нибудь видет как текст сжимают в графике (?) - мне это очень интересно... Запакованная графика, а на самом деле текст - такое может быть?
А ещё лучше скажите - кто-нибудь видет как текст сжимают в графике (?) - мне это очень интересно... Запакованная графика, а на самом деле текст - такое может быть?
3. alex_231 - 10 Февраля, 2016 - 07:45:30 - перейти к сообщению
alex_231
Ты не очень правильно понял что такое сжатие.
Оно может быть как графическое, так и текстовое - всё одним алгоритмом пожато (например, в Chrono Trigger'е используется 1 алгоритм сжатия, а жмётся всё подряд: текст, графика, карты и т.д.)
Ты не очень правильно понял что такое сжатие.
Оно может быть как графическое, так и текстовое - всё одним алгоритмом пожато (например, в Chrono Trigger'е используется 1 алгоритм сжатия, а жмётся всё подряд: текст, графика, карты и т.д.)
4. chiefexb - 10 Февраля, 2016 - 07:45:51 - перейти к сообщению
chiefexb
Сжатие в НЕС, видел по тексту.
The Adventure in magic kingdom.nes мте кодировка.
есть словарь наиболее употребимых слов, и в игре они вызываются двумя байтами f6(f7)<номер слова в словаре>
Final fantazy.nes (первая часть финалки на нес) DTE слоговое сжатие. со словарем слогов.
по графике:
Duck tales 2.nes если там он и не сжат просмотреть его очень проблематично. Надо пробовать джиновкий tilemapper.
Пока все.
Сжатие в НЕС, видел по тексту.
The Adventure in magic kingdom.nes мте кодировка.
есть словарь наиболее употребимых слов, и в игре они вызываются двумя байтами f6(f7)<номер слова в словаре>
Final fantazy.nes (первая часть финалки на нес) DTE слоговое сжатие. со словарем слогов.
по графике:
Duck tales 2.nes если там он и не сжат просмотреть его очень проблематично. Надо пробовать джиновкий tilemapper.
Пока все.
5. chiefexb - 10 Февраля, 2016 - 07:46:24 - перейти к сообщению
chiefexb
Таких вещей я не видел может речь об алгоритме сжатия, что графика, что текст это последовательность байтов. И ее можно сжать разными алгоритмами.
Пример: Пример картинку можно сжать Winrar, а можно и Jpeg. А текст можно сжать архиватором ha.exe будет лучше даже чем рар. Проведи аналогии к хакингу.
Что касается текста в графике, это прям из james bond'a есть вариант в картинке написать послание в хексредакторе. это и будет скрытый текст, но к хакингу это не имеет отношения.
Цитата:
А ещё лучше скажите - кто-нибудь видет как текст сжимают в графике (?) - мне это очень интересно... Запакованная графика, а на самом деле текст - такое может быть?
Таких вещей я не видел может речь об алгоритме сжатия, что графика, что текст это последовательность байтов. И ее можно сжать разными алгоритмами.
Пример: Пример картинку можно сжать Winrar, а можно и Jpeg. А текст можно сжать архиватором ha.exe будет лучше даже чем рар. Проведи аналогии к хакингу.
Что касается текста в графике, это прям из james bond'a есть вариант в картинке написать послание в хексредакторе. это и будет скрытый текст, но к хакингу это не имеет отношения.
6. Guyver - 10 Февраля, 2016 - 07:46:54 - перейти к сообщению
Guyver
Ну ладно, а как вы например приходите к выводу - что и как в игре пожато... Как находите алгоритм сжатия или в словарной системе как разбираетесь - какой там алгоритм - я вот беру игру - и не могу определить, что да как в ней пожато или как слова из словаря вызываются в игре (?)... Что делать - какой план работ должет быть, этапы так сказать поиска решений...
У меня вот что в игре есть, пусть там например такой текст:
Вышел Ваня погулять
Чтоб врагам накостылять
Этот Ваня очень крут
Носит он с собою кнут
Так вот - я нахожу и перевожу без проблем следующее
--------- Ваня погулять
--------- накостылять
--------- очень крут
--------- собою кнут
Причем весь текст в роме идет по-порядку:
Ваня погулять накостылять очень крут собою кнут
А для слов -------- Вообще получается нет места в роме, и как они попадают тогда в игру??? Получается экран делится наполовину - в правой части все слова текста идут друг за другом по-порядку в роме - они не пожаты и их легко найти, а левую часть я как не искал - не нашёл... Уж очень сильно её зашифровали разработчики ;о)
Ну ладно, а как вы например приходите к выводу - что и как в игре пожато... Как находите алгоритм сжатия или в словарной системе как разбираетесь - какой там алгоритм - я вот беру игру - и не могу определить, что да как в ней пожато или как слова из словаря вызываются в игре (?)... Что делать - какой план работ должет быть, этапы так сказать поиска решений...
У меня вот что в игре есть, пусть там например такой текст:
Вышел Ваня погулять
Чтоб врагам накостылять
Этот Ваня очень крут
Носит он с собою кнут
Так вот - я нахожу и перевожу без проблем следующее
--------- Ваня погулять
--------- накостылять
--------- очень крут
--------- собою кнут
Причем весь текст в роме идет по-порядку:
Ваня погулять накостылять очень крут собою кнут
А для слов -------- Вообще получается нет места в роме, и как они попадают тогда в игру??? Получается экран делится наполовину - в правой части все слова текста идут друг за другом по-порядку в роме - они не пожаты и их легко найти, а левую часть я как не искал - не нашёл... Уж очень сильно её зашифровали разработчики ;о)
7. Guyver - 10 Февраля, 2016 - 07:47:19 - перейти к сообщению
Guyver
В общем я игру перевёл на 90%, а потом бросил - так и не одолел пока...
У меня игр переведённых процентов на 80-90 уже много, но я их бросаю - потому что сталкиваюсь с неразрешимыми МНОЮ проблемами, а недопереводы плодить не хочется - вот уже пол-года у меня ни одного перевода нового нет <:о) Эх - учиться надо преодолевать трудности, а временя мало!!!
В общем я игру перевёл на 90%, а потом бросил - так и не одолел пока...
У меня игр переведённых процентов на 80-90 уже много, но я их бросаю - потому что сталкиваюсь с неразрешимыми МНОЮ проблемами, а недопереводы плодить не хочется - вот уже пол-года у меня ни одного перевода нового нет <:о) Эх - учиться надо преодолевать трудности, а временя мало!!!
8. alex_231 - 10 Февраля, 2016 - 07:47:47 - перейти к сообщению
alex_231
Нет, MTE и DTE я сжатием не считаю (сугубо личное мнение, так как они ломаются на ура), я в вопросе имел ввиду конкретное сжатие в пакеты.
Цитата:
Сжатие в НЕС, видел по тексту.
The Adventure in magic kingdom.nes мте кодировка.
есть словарь наиболее употребимых слов, и в игре они вызываются двумя байтами f6(f7)<номер слова в словаре>
Final fantazy.nes (первая часть финалки на нес) DTE слоговое сжатие. со словарем слогов.
по графике:
Duck tales 2.nes если там он и не сжат просмотреть его очень проблематично. Надо пробовать джиновкий tilemapper.
Пока все.
The Adventure in magic kingdom.nes мте кодировка.
есть словарь наиболее употребимых слов, и в игре они вызываются двумя байтами f6(f7)<номер слова в словаре>
Final fantazy.nes (первая часть финалки на нес) DTE слоговое сжатие. со словарем слогов.
по графике:
Duck tales 2.nes если там он и не сжат просмотреть его очень проблематично. Надо пробовать джиновкий tilemapper.
Пока все.
Нет, MTE и DTE я сжатием не считаю (сугубо личное мнение, так как они ломаются на ура), я в вопросе имел ввиду конкретное сжатие в пакеты.
9. alex_231 - 10 Февраля, 2016 - 07:48:08 - перейти к сообщению
alex_231
Для каждой игры по своему, но нужно знание ассемблера, или наличие программиста (со знанием ассемблера)
А для поиска словаря и работы с ним где-то я видел доку, по-моему на мэджиктиме.
Как игра называется, которую ты переводишь?
Может чем помогу, всё равно пока перевожу тексты, дома делать практически нечего.
Цитата:
...а как вы например приходите к выводу - что и как в игре пожато... Как находите алгоритм сжатия или в словарной системе как разбираетесь - какой там алгоритм - я вот беру игру - и не могу определить, что да как в ней пожато или как слова из словаря вызываются в игре (?)... Что делать - какой план работ должет быть, этапы так сказать поиска решений...
Для каждой игры по своему, но нужно знание ассемблера, или наличие программиста (со знанием ассемблера)
А для поиска словаря и работы с ним где-то я видел доку, по-моему на мэджиктиме.
Как игра называется, которую ты переводишь?
Может чем помогу, всё равно пока перевожу тексты, дома делать практически нечего.
10. chiefexb - 10 Февраля, 2016 - 07:48:56 - перейти к сообщению
chiefexb
надо смотреть РОМ в hex-редакторе как правило там будет подобное:
И ГДЕ ТО В РОМЕ ЕСТЬ ПОДОБНОЕ:
Это словарная система система как искать словарь: как правило словарь и текст закодированны одной кодировкой поискать слова "вышел", "чтоб", и т. д.
Я так нашел в Adventure in Magic kingdom
словарь.
Далее я начал переводить фразы заменяя слова словаря на нужные мне по тексту слова, но тут нужно знание поинтеров. Иначе толку от словарного сжатия. Я вбил в этот словарь много длинных слов и получил выгрыш в месте.
как вбивал текст:
в моем случае коду слова предшествовали байты f6(f7)проанализировав словарь и текст я пришел к выводу, что коды слова так и идут попарядку, т.е. не указатель на место в роме а просто первое, второе слово. А байт f6 -вывод слова с пробелом, f7-без пробела. и начал вбивать перевод в Gold finger.
Цитата:
У меня вот что в игре есть, пусть там например такой текст:
Вышел Ваня погулять
Чтоб врагам накостылять
Этот Ваня очень крут
Носит он с собою кнут
Так вот - я нахожу и перевожу без проблем следующее
--------- Ваня погулять
--------- накостылять
--------- очень крут
--------- собою кнут
У меня вот что в игре есть, пусть там например такой текст:
Вышел Ваня погулять
Чтоб врагам накостылять
Этот Ваня очень крут
Носит он с собою кнут
Так вот - я нахожу и перевожу без проблем следующее
--------- Ваня погулять
--------- накостылять
--------- очень крут
--------- собою кнут
надо смотреть РОМ в hex-редакторе как правило там будет подобное:
CODE:
F601 Ваня погулять
F602 F603накостылять
F604 F605 очень крут
F606 F607 собою кнут
F602 F603накостылять
F604 F605 очень крут
F606 F607 собою кнут
И ГДЕ ТО В РОМЕ ЕСТЬ ПОДОБНОЕ:
CODE:
вышелFFчтобFFврагамFFэтотFFваняFFноситFFон
Это словарная система система как искать словарь: как правило словарь и текст закодированны одной кодировкой поискать слова "вышел", "чтоб", и т. д.
Я так нашел в Adventure in Magic kingdom
словарь.
Далее я начал переводить фразы заменяя слова словаря на нужные мне по тексту слова, но тут нужно знание поинтеров. Иначе толку от словарного сжатия. Я вбил в этот словарь много длинных слов и получил выгрыш в месте.
как вбивал текст:
в моем случае коду слова предшествовали байты f6(f7)проанализировав словарь и текст я пришел к выводу, что коды слова так и идут попарядку, т.е. не указатель на место в роме а просто первое, второе слово. А байт f6 -вывод слова с пробелом, f7-без пробела. и начал вбивать перевод в Gold finger.
11. chiefexb - 10 Февраля, 2016 - 08:12:04 - перейти к сообщению
chiefexb
Я могу тебе помочь с доделкой этих игр. Примешь мою помощь.
Цитата:
В общем я игру перевёл на 90%, а потом бросил - так и не одолел пока...
У меня игр переведённых процентов на 80-90 уже много, но я их бросаю - потому что сталкиваюсь с неразрешимыми МНОЮ проблемами, а недопереводы плодить не хочется - вот уже пол-года у меня ни одного перевода нового нет <:о) Эх - учиться надо преодолевать трудности, а временя мало!!!
У меня игр переведённых процентов на 80-90 уже много, но я их бросаю - потому что сталкиваюсь с неразрешимыми МНОЮ проблемами, а недопереводы плодить не хочется - вот уже пол-года у меня ни одного перевода нового нет <:о) Эх - учиться надо преодолевать трудности, а временя мало!!!
Я могу тебе помочь с доделкой этих игр. Примешь мою помощь.
12. alex_231 - 10 Февраля, 2016 - 08:15:02 - перейти к сообщению
alex_231
Сейчас все как кинутся помогать, так получится, как в той поговорке.
Сейчас все как кинутся помогать, так получится, как в той поговорке.
13. Guyver - 10 Февраля, 2016 - 08:15:30 - перейти к сообщению
Guyver
Да ладно - я сам доделать их надеюсь, вот только будет свободное время с ними разобраться - как правило у меня одна проблема - просто не могу найти часть текста, в основном на заставках или в меню...
Вот у меня есть почти переведённая игра про рыбалку (моя самая любимая на нес) - я там не могу найти несколько слов буквально... Если нужно - могу кинуть на мыло... Я просто не знаю - как их найти, хотя подозреваю, что это легко - просто я такой тормоз <:о)
Да ладно - я сам доделать их надеюсь, вот только будет свободное время с ними разобраться - как правило у меня одна проблема - просто не могу найти часть текста, в основном на заставках или в меню...
Вот у меня есть почти переведённая игра про рыбалку (моя самая любимая на нес) - я там не могу найти несколько слов буквально... Если нужно - могу кинуть на мыло... Я просто не знаю - как их найти, хотя подозреваю, что это легко - просто я такой тормоз <:о)
14. Guyver - 10 Февраля, 2016 - 08:15:49 - перейти к сообщению
Guyver
Я, кстати, к своему огромному стыду подвожу одного человека - он мне прислал свои наработки из игры КРИСТАЛИС на гейм бой колор - взломал её как мог - есть всё - и поинтеры все известны - вставляй текст как хочешь, лишь бы не превышал 15 символов в строке... Одна беда - текста там ОЧЕНЬ много... Я перевёл процентов 53 - и всё, склеил ласты... Уже пол-года к ней не подхожу - а он ждёт результатов... Надеется на мою совесть... Эх... А вот тоже так взялся помогать... Плохо быть неответственным...
Я, кстати, к своему огромному стыду подвожу одного человека - он мне прислал свои наработки из игры КРИСТАЛИС на гейм бой колор - взломал её как мог - есть всё - и поинтеры все известны - вставляй текст как хочешь, лишь бы не превышал 15 символов в строке... Одна беда - текста там ОЧЕНЬ много... Я перевёл процентов 53 - и всё, склеил ласты... Уже пол-года к ней не подхожу - а он ждёт результатов... Надеется на мою совесть... Эх... А вот тоже так взялся помогать... Плохо быть неответственным...
15. chiefexb - 10 Февраля, 2016 - 08:16:21 - перейти к сообщению
chiefexb
Сбрасывай на мыло я прям сейчас гляну и скажу смогу тебе помочь или нет.
здесь и мыло и аська
Сбрасывай на мыло я прям сейчас гляну и скажу смогу тебе помочь или нет.
здесь и мыло и аська
16. alex_231 - 10 Февраля, 2016 - 08:16:57 - перейти к сообщению
alex_231
Можешь и мне кинуть, я тут всё равно по вечерам без дела маюсь.
Можешь и мне кинуть, я тут всё равно по вечерам без дела маюсь.
17. alex_231 - 10 Февраля, 2016 - 08:19:20 - перейти к сообщению
alex_231
Да, товарищи, решил вынести на всеобщее обозрение вопрос темы:
на восьмибитных консолях, я лично, кроме пресловутого RLE-сжатия никакого другого алгоритма не видел, только на Sega Master System оно немного посложнее, а на NES вообще - проще пареной репы.
P.S.: по желанию, могу описать оба алгоритма, спрашивайте, если кому надо.
Да, товарищи, решил вынести на всеобщее обозрение вопрос темы:
на восьмибитных консолях, я лично, кроме пресловутого RLE-сжатия никакого другого алгоритма не видел, только на Sega Master System оно немного посложнее, а на NES вообще - проще пареной репы.
P.S.: по желанию, могу описать оба алгоритма, спрашивайте, если кому надо.
18. CaHbl4 - 10 Февраля, 2016 - 08:19:50 - перейти к сообщению
CaHbl4
Bee 52(U).nes - давно ещё хотел её перевести(графика очень красивая, да игруха классная), да по ходу дела там графика вся пожата (правильнее сказать закодирована) ХЗ каким способом...
Bee 52(U).nes - давно ещё хотел её перевести(графика очень красивая, да игруха классная), да по ходу дела там графика вся пожата (правильнее сказать закодирована) ХЗ каким способом...
19. Griever - 10 Февраля, 2016 - 08:20:15 - перейти к сообщению
Griever
Ты видел на текст в Dragon Warrior 2? :huh:
Кстати, CaHbl4, задавал вопрос на шедевре. Я тоже бы хотел увидеть сырцы какого-нибудь packer/unpacker'a. Пусть даже для DTE
Ты как Alex?
Цитата:
на восьмибитных консолях, я лично, кроме пресловутого RLE-сжатия никакого другого алгоритма не видел
Ты видел на текст в Dragon Warrior 2? :huh:
Кстати, CaHbl4, задавал вопрос на шедевре. Я тоже бы хотел увидеть сырцы какого-нибудь packer/unpacker'a. Пусть даже для DTE
Ты как Alex?
20. alex_231 - 10 Февраля, 2016 - 08:20:41 - перейти к сообщению
alex_231
Да, я видел текст в Dragon Warrior 2, даже нашел, где находятся запакованные тексты (но не записал и пока не полностью разобрался в коде).
Bee 52(U).nes - говорите, погляжу.
DTE алгоритм довольно прост, у меня в скриптере для Chrono Trigger используется алгоритм MTE (что по сути одно и то же, то есть закодировав MTE, можно не кодировать DTE).
С собой нет, но показать могу (попозже).
Да, я видел текст в Dragon Warrior 2, даже нашел, где находятся запакованные тексты (но не записал и пока не полностью разобрался в коде).
Bee 52(U).nes - говорите, погляжу.
DTE алгоритм довольно прост, у меня в скриптере для Chrono Trigger используется алгоритм MTE (что по сути одно и то же, то есть закодировав MTE, можно не кодировать DTE).
С собой нет, но показать могу (попозже).
21. Griever - 10 Февраля, 2016 - 09:39:14 - перейти к сообщению
Griever
Это ты про байты в районе $B4B9?
Вот это было бы здорово!
Цитата:
даже нашел, где находятся запакованные тексты
Это ты про байты в районе $B4B9?
Цитата:
С собой нет, но показать могу (попозже).
Вот это было бы здорово!
22. alex_231 - 10 Февраля, 2016 - 09:39:55 - перейти к сообщению
alex_231
Нет, там хранится таблица MTE, а текст в районе $14C00
Извлечение:
Возвращение:
Я тут кое-что лишнее повырезал, а то много слишком получается, а кое-где не успел описание написать, завтра дополню, если что не понятно.
Нет, там хранится таблица MTE, а текст в районе $14C00
Извлечение:
CODE:
//Названия домов
memo2.Lines.add('{Названия домов}');
label6.caption:='Извлечение Названия домов';
refresh;
dialogpoint:=456194; //адрес первого поинтера (не используется,так на всякий случай)
dicbuf:=1; //номер буфера (чисто для ориентации)
dicrow:=7; //номер таблицы в буфере
diccol:=62978; //адрес поинтера в таблице (в буфере)
decpoint:=(ord(buf1[dicrow,diccol+2])+2)*256+ord(buf1[dicrow,diccol+1])+1; //адрес начала текста в таблице (в буфере)
s:=''; //обнуление строки
for i:=1 to 111 do begin // всего 111 сообщений в блоке
progressbar1.position:=progressbar1.position+1;
s:=buf1[dicrow,decpoint]; //ну это так для страховки
st:=''; //обнуление подстроки
while ord(s[1])<>0 do begin
s:=buf1[dicrow,decpoint];
if ord(s[1])<160 then st:=st+dictionary[ord(s[1])] else //dictionary - таблица MTE (от 0 до 159, в соответствии с кодами)
st:=st+coder(s); //coder - функция применения таблицы кодировки (перевод в английский)
inc(decpoint,1);
end;
decpoint:=(ord(buf1[dicrow,diccol+2+(2*i)])+2)*256+ord(buf1[dicrow,diccol+1+(2*i)])+1; //вычисляется адрес для следующего сообщения
memo2.Lines.add(st);
end;
memo2.Lines.add('{Названия домов}');
label6.caption:='Извлечение Названия домов';
refresh;
dialogpoint:=456194; //адрес первого поинтера (не используется,так на всякий случай)
dicbuf:=1; //номер буфера (чисто для ориентации)
dicrow:=7; //номер таблицы в буфере
diccol:=62978; //адрес поинтера в таблице (в буфере)
decpoint:=(ord(buf1[dicrow,diccol+2])+2)*256+ord(buf1[dicrow,diccol+1])+1; //адрес начала текста в таблице (в буфере)
s:=''; //обнуление строки
for i:=1 to 111 do begin // всего 111 сообщений в блоке
progressbar1.position:=progressbar1.position+1;
s:=buf1[dicrow,decpoint]; //ну это так для страховки
st:=''; //обнуление подстроки
while ord(s[1])<>0 do begin
s:=buf1[dicrow,decpoint];
if ord(s[1])<160 then st:=st+dictionary[ord(s[1])] else //dictionary - таблица MTE (от 0 до 159, в соответствии с кодами)
st:=st+coder(s); //coder - функция применения таблицы кодировки (перевод в английский)
inc(decpoint,1);
end;
decpoint:=(ord(buf1[dicrow,diccol+2+(2*i)])+2)*256+ord(buf1[dicrow,diccol+1+(2*i)])+1; //вычисляется адрес для следующего сообщения
memo2.Lines.add(st);
end;
Возвращение:
CODE:
full:
msgscount:=1; //счетчик сообщений
setlength(msgs,msgscount); //msgs - массив встречавшихся ранее сообщений
case dicbuf of //dicbuf - номер буфера
1: decpoint:=(ord(buf1[dicrow,diccol+2])+2)*256+ord(buf1[dicrow,diccol+1])+1; //адрес (глобальный) первого сообщения для первого буфера (он остается тот же, что и раньше)
...
8: decpoint:=(ord(buf8[dicrow,diccol+2])+2)*256+ord(buf8[dicrow,diccol+1])+1; //адрес (глобальный) первого сообщения для восьмого буфера (он остается тот же, что и раньше)
end;
n:=0; //локальный индикатор использования таблицы MTE, используется ниже (должен быть Boolean, но как-то я об этом тогда не подумал)
fullbeg:
case dicbuf of
1:buf1[dicrow,diccol+1]:=chr((decpoint-1)mod 256); //записывается старший байт поинтера
.
.
8:buf8[dicrow,diccol+1]:=chr((decpoint-1)mod 256);
end;
case dicbuf of
1:buf1[dicrow,diccol+2]:=chr(trunc(((decpoint-1)/256)-2)); //записывается младший байт поинтера
.
.
8:buf8[dicrow,diccol+2]:=chr(trunc(((decpoint-1)/256)-2));
end;
if memo3.lines.strings[rowcount]<>'' then begin //если строка в memo не пустая, то начинается обработка
msgsind:=0; //локальный индикатор повторяющегося сообщения
for i:=1 to msgscount do begin
if (msgsind=0)and(memo3.lines.strings[rowcount]=msgs[i-1]) then begin
msint:=i; //номер уже использованного сообщения, которое вводится повторно
case dicbuf of
1:buf1[dicrow,diccol+1]:=buf1[dicrow,diccol-((msgscount-i)*2)+1]; //записывается старший байт поинтера из уже записанного ранее
.
.
8:buf8[dicrow,diccol+1]:=buf8[dicrow,diccol-((msgscount-i)*2)+1];
end;
case dicbuf of
1:buf1[dicrow,diccol+2]:=buf1[dicrow,diccol-((msgscount-i)*2)+2]; //записывается младший байт поинтера из уже записанного ранее
.
.
8:buf8[dicrow,diccol+2]:=buf8[dicrow,diccol-((msgscount-i)*2)+2];
end;
msgsind:=1; //есть повторение
end;
end;
if msgsind=1 then begin
msgs[msgscount-1]:=msgs[msint];
inc(msgscount);
setlength(msgs,msgscount);
end;
if msgsind=0 then begin
s:=memo3.lines.strings[rowcount]; //rowcount - номер строки в memo
msgs[msgscount-1]:=s;
inc(msgscount);
setlength(msgs,msgscount);
i:=1;
while i<=length(s) do begin
if s[i]='<' then begin //обработка управляющих кодов, выделенных <ХХ>
case dicbuf of
1:buf1[dicrow,decpoint]:=chr(strtoint(copy(s,i+1,2)));
.
.
8:buf8[dicrow,decpoint]:=chr(strtoint(copy(s,i+1,2)));
end;
inc(decpoint);
if decpoint>65536 then begin //размер таблицы в буфере 65536
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
inc(i,4);
end else begin
for j:=1 to 159 do begin //обработка словаря MTE
if (n=0)and(pos(dictionary[j],s)=i)then
begin
n:=1;
p:=j;
l:=length(dictionary[j]);
delete(s,i,l);
insert(chr(p),s,i);
{end else
if (n=0)and(pos('...',s)=i)then
begin
n:=1;
p:=241;
l:=3;
delete(s,i,l);
insert(chr(p),s,i);}
end;
end;
if n=1 then begin
n:=0;
inc(i);
case dicbuf of
1:buf1[dicrow,decpoint]:=chr(p);
.
.
8:buf8[dicrow,decpoint]:=chr(p);
end;
inc(decpoint);
if decpoint>65536 then begin
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
end else begin
case dicbuf of
1:buf1[dicrow,decpoint]:=decoder(s[i])[1];
.
.
8:buf8[dicrow,decpoint]:=decoder(s[i])[1];
end;
inc(decpoint);
if decpoint>65536 then begin
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
inc(i);
end;
end;
end;
case dicbuf of
1:buf1[dicrow,decpoint]:=chr(0);
.
.
8:buf8[dicrow,decpoint]:=chr(0);
end;
inc(decpoint);
if decpoint>65536 then begin
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
end;
end else begin
case dicbuf of
1:buf1[dicrow,diccol+1]:=chr((decpoint-2)mod 256);
.
.
8:buf8[dicrow,diccol+1]:=chr((decpoint-2)mod 256);
end;
case dicbuf of
1:buf1[dicrow,diccol+2]:=chr(trunc(((decpoint-2)/256)-2));
.
.
8:buf8[dicrow,diccol+2]:=chr(trunc(((decpoint-2)/256)-2));
end;
end;
inc(rowcount);
inc(diccol,2);
progressbar1.position:=rowcount;
if memo3.lines.strings[rowcount]='' then goto fullbeg;
if memo3.lines.strings[rowcount][1]='{' then
goto beg else goto fullbeg;
en:
end;
msgscount:=1; //счетчик сообщений
setlength(msgs,msgscount); //msgs - массив встречавшихся ранее сообщений
case dicbuf of //dicbuf - номер буфера
1: decpoint:=(ord(buf1[dicrow,diccol+2])+2)*256+ord(buf1[dicrow,diccol+1])+1; //адрес (глобальный) первого сообщения для первого буфера (он остается тот же, что и раньше)
...
8: decpoint:=(ord(buf8[dicrow,diccol+2])+2)*256+ord(buf8[dicrow,diccol+1])+1; //адрес (глобальный) первого сообщения для восьмого буфера (он остается тот же, что и раньше)
end;
n:=0; //локальный индикатор использования таблицы MTE, используется ниже (должен быть Boolean, но как-то я об этом тогда не подумал)
fullbeg:
case dicbuf of
1:buf1[dicrow,diccol+1]:=chr((decpoint-1)mod 256); //записывается старший байт поинтера
.
.
8:buf8[dicrow,diccol+1]:=chr((decpoint-1)mod 256);
end;
case dicbuf of
1:buf1[dicrow,diccol+2]:=chr(trunc(((decpoint-1)/256)-2)); //записывается младший байт поинтера
.
.
8:buf8[dicrow,diccol+2]:=chr(trunc(((decpoint-1)/256)-2));
end;
if memo3.lines.strings[rowcount]<>'' then begin //если строка в memo не пустая, то начинается обработка
msgsind:=0; //локальный индикатор повторяющегося сообщения
for i:=1 to msgscount do begin
if (msgsind=0)and(memo3.lines.strings[rowcount]=msgs[i-1]) then begin
msint:=i; //номер уже использованного сообщения, которое вводится повторно
case dicbuf of
1:buf1[dicrow,diccol+1]:=buf1[dicrow,diccol-((msgscount-i)*2)+1]; //записывается старший байт поинтера из уже записанного ранее
.
.
8:buf8[dicrow,diccol+1]:=buf8[dicrow,diccol-((msgscount-i)*2)+1];
end;
case dicbuf of
1:buf1[dicrow,diccol+2]:=buf1[dicrow,diccol-((msgscount-i)*2)+2]; //записывается младший байт поинтера из уже записанного ранее
.
.
8:buf8[dicrow,diccol+2]:=buf8[dicrow,diccol-((msgscount-i)*2)+2];
end;
msgsind:=1; //есть повторение
end;
end;
if msgsind=1 then begin
msgs[msgscount-1]:=msgs[msint];
inc(msgscount);
setlength(msgs,msgscount);
end;
if msgsind=0 then begin
s:=memo3.lines.strings[rowcount]; //rowcount - номер строки в memo
msgs[msgscount-1]:=s;
inc(msgscount);
setlength(msgs,msgscount);
i:=1;
while i<=length(s) do begin
if s[i]='<' then begin //обработка управляющих кодов, выделенных <ХХ>
case dicbuf of
1:buf1[dicrow,decpoint]:=chr(strtoint(copy(s,i+1,2)));
.
.
8:buf8[dicrow,decpoint]:=chr(strtoint(copy(s,i+1,2)));
end;
inc(decpoint);
if decpoint>65536 then begin //размер таблицы в буфере 65536
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
inc(i,4);
end else begin
for j:=1 to 159 do begin //обработка словаря MTE
if (n=0)and(pos(dictionary[j],s)=i)then
begin
n:=1;
p:=j;
l:=length(dictionary[j]);
delete(s,i,l);
insert(chr(p),s,i);
{end else
if (n=0)and(pos('...',s)=i)then
begin
n:=1;
p:=241;
l:=3;
delete(s,i,l);
insert(chr(p),s,i);}
end;
end;
if n=1 then begin
n:=0;
inc(i);
case dicbuf of
1:buf1[dicrow,decpoint]:=chr(p);
.
.
8:buf8[dicrow,decpoint]:=chr(p);
end;
inc(decpoint);
if decpoint>65536 then begin
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
end else begin
case dicbuf of
1:buf1[dicrow,decpoint]:=decoder(s[i])[1];
.
.
8:buf8[dicrow,decpoint]:=decoder(s[i])[1];
end;
inc(decpoint);
if decpoint>65536 then begin
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
inc(i);
end;
end;
end;
case dicbuf of
1:buf1[dicrow,decpoint]:=chr(0);
.
.
8:buf8[dicrow,decpoint]:=chr(0);
end;
inc(decpoint);
if decpoint>65536 then begin
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
end;
end else begin
case dicbuf of
1:buf1[dicrow,diccol+1]:=chr((decpoint-2)mod 256);
.
.
8:buf8[dicrow,diccol+1]:=chr((decpoint-2)mod 256);
end;
case dicbuf of
1:buf1[dicrow,diccol+2]:=chr(trunc(((decpoint-2)/256)-2));
.
.
8:buf8[dicrow,diccol+2]:=chr(trunc(((decpoint-2)/256)-2));
end;
end;
inc(rowcount);
inc(diccol,2);
progressbar1.position:=rowcount;
if memo3.lines.strings[rowcount]='' then goto fullbeg;
if memo3.lines.strings[rowcount][1]='{' then
goto beg else goto fullbeg;
en:
end;
Я тут кое-что лишнее повырезал, а то много слишком получается, а кое-где не успел описание написать, завтра дополню, если что не понятно.
23. Griever - 10 Февраля, 2016 - 09:40:20 - перейти к сообщению
Griever
Вот это ни хрена себе! Честно говоря, думал будет несколько проще...
Мне в этом месяца три разбираться...
Большое спасибо!
Вот это ни хрена себе! Честно говоря, думал будет несколько проще...
Мне в этом месяца три разбираться...
Большое спасибо!
24. alex_231 - 10 Февраля, 2016 - 09:40:38 - перейти к сообщению
alex_231
Да тут, вроде, ничего сложного нет, просто много различных условий и все.
Да тут, вроде, ничего сложного нет, просто много различных условий и все.
25. Griever - 10 Февраля, 2016 - 09:40:58 - перейти к сообщению
Griever
Нда, я просто раньше имел дело с чистым паскалем и с соответствующей спецификой программ - в области прикладной математики...
Нда, я просто раньше имел дело с чистым паскалем и с соответствующей спецификой программ - в области прикладной математики...
26. chiefexb - 10 Февраля, 2016 - 09:41:18 - перейти к сообщению
chiefexb
А это чистый паскаль просто построенный а объектах Win
А это чистый паскаль просто построенный а объектах Win
27. alex_231 - 10 Февраля, 2016 - 09:41:41 - перейти к сообщению
alex_231
А теперь я полностью разобрался в алгоритме сжатия текста, пишу программу (точнее дописываю, так как она уже частично вынимать умеет, осталось поинтеры обработать).
Цитата:
Ты видел на текст в Dragon Warrior 2? :huh:
А теперь я полностью разобрался в алгоритме сжатия текста, пишу программу (точнее дописываю, так как она уже частично вынимать умеет, осталось поинтеры обработать).