Обновление игровых файлов
Я разрабатываю игру на C++ с использованием DirectX 9. Это 3D шутер от первого лица (так планируется). В корневой папке с проектом есть ресурсы игры, такие как: configs, models, sounds и locations. К этим файлам очень легко получить доступ. Любой пользователь может заменить модели, звуки или вообще украсть их... Я разработал контейнер, где я упаковываю игровые ресурсы в архив, типа: configs.pck, models.pck и т.д. Игра работает через лаунчер, где этот инструмент проверяет HASH суммы файлов. Данные он берет с сервера. И тут я встретил проблему, которую я не как не могу решить. Как-то эти все файлы нужно обновлять!
Я написал совершенно другую программу, где в корневых файлах ищет версии всех клиентов игры. И создает их патчи. То есть ищет один файл в старой сборке и в новой. Через бинарный анализ ищет байты, которые не хватает в старой сборке или тех, которых воообще нет. Честно? Анализатор вышел очень плохой. Патчи были размером больше, чем оригинал файла. Так как сохранялось и стартовая позиция offset байта и длина и сами данные. Учитывались флаги состояния буфера. Или заменить, или удалить и т.д. Следовательно из-за корявого анализатора не получилось и грамотно сделать и патчинг этих самых файлов. Игровой движок вылетал с ошибкой, что файлы были повреждены. А лаунчер бесконечно старается решить проблему с HASH суммами файлов. Так как после патчинга они всегда разные.
В анализаторе нужно учитывать не просто замена байтов. Эта замена может быть не просто с 3 байтами 0x1, 0x2, 0x3 на 0x15, 0x2, 0x1. А в оригинале может быть и больше байтов, чем в старом блоке. Нужно учитывать множество факторов, чтобы анализатор понял, что с этим куском данных делать.
Небольшая дополнительная информация о этапах загрузки
При парсинге карты и ее сборки, в ней же лежат ссылки на long offsets блоках данных. Эти блоки нужны для того, чтобы как бы вытягивать модели из контейнера. Я ставлю нужный offset из карты в поток чтения models.pck и начинаю читать первые 4 байта - это длина одной модели. Как только данные считались, идет расшифровка простым XOR с ключем (Который загружается с сервера).
Подскажите куда мне копать? Где посмотреть формулы? Есть может у кого готовое решение?