Возобновляем старые темы. В настоящее время формат упакованных данных известен досконально. Я бы мог привести код 6502 или объяснить словами, но, думаю, намного нагляднее будет привести код распаковщика на всеми любимом Delphi (кстати, общее описание можно найти на сайте ChiefNet):
Распаковщик отличный =) Да и формат, как вы видите довольно прост (предназначен, в основном, для повторяющихся байт). НО, как всегда, есть загвоздка... Рассмотрим этот кусок кода распаковщика:
Теперь ZeroByte может быть любым: алгоритм становится эффективным для байт, XOR между которыми равен любому байту (0-255). Таким образом, одинаковые байты - лишь частный случай (в этом случае ZeroByte=0). Этот частный случай работает бОльшую часть времени: например на первом титульнике ZeroByte вообще всегда равен 0, но есть такие тайловые карты, в которых имеются примерно такие последовательности:
...5C 5D 5C... (это тайловая карта экрана битвы с рыбой) и тогда эффективным становится ситуация, когда ZeroByte=1.
Итак, распаковщик должен это уметь делать... В связи с этим две предпосылки:
-В любом случае, ZeroByte может изменяется всего один раз в $40 распакованных байт тайловой карты;
-По всей видимости, ZeroByte меняется только в случае, если в этом буфере из $40 распакованных байт не оказывается одинаковых (видимо, распаковщик должен совершить ещё один проход по буферу с поиском байт, XOR между которыми равен 1, в случае неудачи - 2 и т.д.)
Мой распаковщик довольно кривой, но хорошо упаковывал карты с одинаковыми байтами. К сожалению, он не может справиться с байтами, XOR между которыми равен разным числам - упакованные файлы больше оригинальных упакованных блоков.
Вот и всё. Как видите, проблема, скорее, в моих скромных умениях в кодинге. Возможно, кто-нибудь более опытный справится с этой задачей. Спасибо за внимание
PS: Упаковка вручную довольно трудоёмка: если вы успели заметить, здесь применён простейший крипт: элементарный XOR с предыдущим байтом приводит к тому, что изменение одного байта приводит к запарыванию всей части карты, лежащей ниже этого байта.