Might & Magic изнутри или Как сделать Rejuvenation Potion
Might & Magic изнутри или Как сделать Rejuvenation PotionЛюбопытство, как известно, не порок. Именно так я успокаиваю свою совесть каждый раз, когда начинаю копаться в очередной игре. Да и вы, наверняка не раз задумывались, глядя на игру: "Как же оно там внутри устроено?" Конечно, в лицензионном соглашении написано, что "не допускается", "преследуется", и т.д. Но, между нами, кто же его читает, это соглашение?
Итак, на этот раз жертвой моего любопытства стала игра M&M VIII (надо отметить, что большая часть того, что тут будет сказано, так же вполне применима к MM7 и даже MM6 - движок-то не сильно изменился).
Гранд-мастер в алхимии, а рецептов Black Potion'ов не знаю - ну что за безобразие! Денег на покупку рецептов было жалко, да и бегать за ними по всему миру было как-то не досуг. Тем более что все равно все бы выяснилось, но времени-то жаль. Ну что же - хакеры мы или нет? Решил посмотреть в файлах игры, наверняка это там как-то хранится...
Чем смотреть спросите вы? Для этой цели подойдет любой hex-editor (я предпочитаю использовать qview и hiew - любой из них можно легко найти в Сети).
Итак, чем смотреть мы запаслись - теперь дело за малым - найти нужный файл.
В директории, в которую установлена ваша игра, есть еще несколько поддиректорий - и одна из них имеет заманчивое название Data - скорее всего, большая часть данных игры лежит именно там.
Зайдем в эту директорию. Да, не слишком радостно - какие-то странные расширения - .lod и .hwl. Что же это за файлы? Попробуем посмотреть на них в hiew - да, явно не текст. Хотя вот - время от времени видны имена файлов, еще какие-то строки. Ну что же, поищем там наше слово "potion". Нашлось в двух файлах - EnglishT и EnglishD (как станет ясно из дальнейшего, в этих файлах лежит текст и озвучка диалогов соответственно). Уже хоть что-то - смотрим, где же именно в EnglishT нам попалась слово "potion". Открываем файл в hiew и нажимаем сначала F4, переходя в hex-режим, а затем начинаем поиск по F7 . Первое совпадение - по смещению 3560 - POTION.TXT - ага, тут есть какой-текст про potion'ы, но где же он? Продолжаем поиск, нажимая Shift+F7 - еще раз попадается POTION.TXT и все - грустно как-то. Да и в глубине файла явно не текст.
Как же они это хранят? Может чем-то сжимают? Попробуем выяснить - самый простой (хотя и не очень надежный тест - это попробовать сжать этот файл самим каким-нибудь стандартным архиватором - pkzip-ом, скажем. Пробуем - не жмется! Вернее жмется, но только на 10% - а ведь там должен быть текст...
Ладно, попробуем зайти с другого конца - как же устроен это EnglishT.lod? Посмотрим повнимательнее - есть! Начиная со смещения 120, идут блоки примерно одинаковой структуры, длиной 4c байт - особенно четко это видно, если включить просмотр в виде текста - это, кстати, очень помогает, когда надо увидеть в файле какую-то структуру.
Так, а что же там в этих блоках? Сначала идет имя - это-то ясно, но что там есть еще? Чтобы проще было с этим разбираться, я предпочитаю делать следующее - берем в руки qview, открываем наш файл и, выделяя несколько блоков (один раз нажать ins начнется выделение, второй раз - прекратится), сохраняем их в отдельные файлы. Теперь пару окон с hiew и начинаем сличать - и что же - вот имена, а дальше - а дальше какой-то мусор, причем одинаковый во всех блоках, и только в конце два четырехбайтовых слова (будем, кстати, называть такие слова long'ами) различны, а за ними опять везде одинаковые четыре нолика.
Этой информации достаточно, чтобы сделать вывод - перед нами что-то похожее на каталог тех файлов, что собраны в этот EnglishT.lod, причем два long'а - это скорее всего информация о длине и размещении отдельных файлов внутри большого. Проверим нашу догадку - возьмем первый блок, который соответствует файлу 2DEvents.txt - так, 4F54A (кстати, вы не забыли, что байты длинных чисел надо брать, начиная с крайне правого) Нажимаем F5, вводим число, переходим в нужное место файла - нет, что-то не так - какие-то совершенно нечитаемые данные... хотя, что это? Там, немного внизу - по смешению 4F66A? Так, это то же самое имя 2Devents.txt. Похоже, мы на верном пути - причем расстояние между ним и числом из заголовка - 120 - то же, что и размер блока в начале файла, который мы пропустили - можно сделать вывод о том, что первый long - это действительно смещение, но не от начала всего файла, а от начала каталога. Ну, хорошо, а второй long?
Опять возьмем qview - мне очень нравятся его удобные блоки (хотя в hiew блоки тоже есть - они выделяются по клавише * на numpad-е). Выделяем блок от первой буквы этого имени до следующего (просто пролистываем страницы вниз, внимательно глядя на экран, желающие могут просто искать слово txt, но так можно пропустить что-нибудь интересное). Смотрим на размер - ровно 22A3, как и второй long из каталога.
Да, следует добавить, что по смещению 11c от начала файла находится long с числом файлов в каталоге.
Так, с каталогом разобрались. Можно написать программку, которая "порежет" большой .lod файл на много маленьких. Сделаем это - я предпочитаю писать на ANSI-C (такой исходный текст потом можно будет компилировать любым компилятором с C/C++ в любой операционной системе).
Да, никуда от этого не уйти - если вам интересно копаться в ресурсах игр, придется осваивать какой-нибудь язык программирования.
Вот здесь находится исходный текст (MM8SRC1.TXT) - он, конечно, не является примером для подражания с точки зрения изящества программирования, а должен только проиллюстрировать все вышесказанное.
Компилируем и запускаем с параметром EnglishT.lod - получаем отдельные файлы. Но они еще не пригодны для просмотра. Опять открываем несколько файлов и сравниваем их - видно, что там есть заголовок длиной 60, а за ним идут данные, которые, кстати, всегда начинаются с одних и тех же байтов - 78 9C. Число по смещению 58 от начала файла - это длина распакованных данных.
78 9С - довольно известная сигнатура - так обычно начинаются файлы, запакованные библиотекой zlib. В том числе и файлы известной утилиты gzip. Конечно, если мы хотим серьезно работать с ресурсами MM, следует скачать и установить эту библиотеку zlib, но для наших целей вполне достаточно просто распаковать отдельные файлы. Попробуем сделать это с помощью gzip-а.
Формат заголовков gzip'а известен, и я не буду углубляться в его описание.
Скажу только, что для наших целей достаточно приписать к началу данных последовательность 1F, 8B, 08, 00 - это сигнатура gzip-а и 00, 00, 00, 00, 00, 0B - это информация о том, как следует формировать имя файла и значение контрольной суммы - ее можно оставить нулевой (будет, конечно, получено сообщение об ошибке, но распаковка продолжится). Также в конец файла следует приписать длину распакованного файла (да, надо не забыть отбросить сигнатуру 78 9C от zlib-а).
Все это можно сделать с помощью hex-edit-ора, но мы лучше напишем программу, исходник которой в том же файле, который Вы уже могли скачать, идет следом (MM8SRC2.TXT). Кстати, там же есть и откомпилированный вариант (MM8_U.EXE) и итоговый результат (POTION.TXT).
Программа создаст нам файлы, к которым останется прибавить расширение .gz и распаковать любой утилитой, которая понимает этот формат (например, winzip-ом).
Итак, распакуем файл potion.txt. Получим текстовый файл, который можно просматривать любым текстовым редактором. Но это не слишком удобно. Осталось заметить, что этот файл представляет собой таблицу, отдельные столбцы которой разделены символами табуляции (это опять-таки можно заметить, просматривая файл в hiew в hex-режиме).
С такими файлами удобно работать в MS Excel. Надо выбрать там файл/открыть, установить там тип файлов как текстовый, выбрать имя. Появится Wizard, в первом окне которого надо просто нажать дальше, а вот во втором следует указать "ограничитель строк" как "(нет)".
Ура! Теперь осталось внимательно изучить полученную таблицу.
Справа идут столбцы, которые содержат код (он для каждого potion'а указан слева) получаемого при смешивании этого potion'а с potion'ом, код которого написан вверху столбца.
Вот и все - читаем рецепт Rejuvenation Potion'a - даже есть несколько вариантов его приготовления - код 271 - на пересечении, скажем, строки 230 - это Bless и столбца 252 - Divine Restoration.
Итак, вот рецепт (Red+(Blue+Yellow))+((Blue+(Blue+Yellow))+(Red+(Red+Yellow)))
Конечно, таким же образом можно распаковать и изучить файл monlist.txt - список монстров или objlist.txt - предметов.
Удачи вам в занятии алхимией.
P.S. Утилитку GZip можно скачать здесь, а исходники и результат - здесь.
621 Прочтений • [Might & Magic изнутри или Как сделать Rejuvenation Potion] [28.05.2012] [Комментариев: 0]