Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 C7 E0 F2 E5 F0 FF ED ED FB E9 20 E3 EE F0 EE E4 Затерянный город
00000010 20 D2 E8 ED ED EE F1 00 8C 83 43 00 F3 00 00 00 Тиннос.ЊѓC.у...
Вот только я тебя самую малость поправлю. Ты нолик не тот выделил. :)
00000000 C7 E0 F2 E5 F0 FF ED ED FB E9 20 E3 EE F0 EE E4 Затерянный город
00000010 20 D2 E8 ED ED EE F1 00 8C 83 43 00 F3 00 00 00 Тиннос.ЊѓC.у...
Значит так, я пробежался по сейву. Подробно не разбирался, но осмелюсь предположить. ИМХО этот байт "FA" не выполняет каких-то ключевых функций. Судя по всему, это всего лишь рудемент, полученный при записи названия уровня из DAT-файла в сейв (типа служебный символ). Идея такая, что писаться-то он пишется в сейв (вместе с названием уровня), а чтение названия уровня из сейва происходит только до первого встреченного "00" (чего требует символьный массив PChar, с коим мы и имеем дело). Вывод: самое главное, что нолик там есть в конце, а остальное совсем неважно.
Предположительно этот рудемент имеет следующее происхождение.
1) Игра создает пустой сейв-файл.
2) Затем игра пишет буфер с названием уровня в сейв-файл по нулевому смещению. Как это ни странно, но последним байтом записываемого в файл буфера (между прочем строго определенного размера) оказывается "FA". Как он там оказался? А мало ли?
3) Далее происходит запись всей остальной информации в файл, притом начиная с конкретного смещения (для TR2 и TR3 это 0x0018). Если по этому смещению или далее уже есть какие-то данные, то запись происходит поверх этих данных, с их соответственным затиранием. Самое интересное то, что первые две структуры записываемой информации, состоящие из некоторых целочисленных значений, всегда строго определены для всех сейвов TR2 и TR3 соответственно, и между собой (внутри TR2 или же TR3) эти структуры похожи. Я говорю вот об этом.
Сейв нашей TR3
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 C7 E0 F2 E5 F0 FF ED ED FB E9 20 E3 EE F0 EE E4 Затерянный город
00000010 20 D2 E8 ED ED EE F1 00 8C 83 43 00 F3 00 00 00 Тиннос.ЊѓC.у...
00000020 00 00 00 00 8C 85 43 00 E3 00 00 00 72 40 5D 05 ....Њ…C.г...r@].
А вот сейв пиратки TR2
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 62 4F 4D 20 2C 20 50 4F 62 48 4F 66 20 62 4F 4D bOM , PObHOf bOM
00000010 20 20 00 FA 00 00 00 00 1C 4C 42 00 96 00 00 00 .ъ.....LB.–...
00000020 00 00 00 00 1C 4C 42 00 C4 00 00 00 EE 12 3B 03 .....LB.Д...о.;.
В общем первые значащие структуры (при том строго определенные) дублируются в начале сейва, при том исследуемый нами "FA" не включен в дубликат, а следовательно не включен в эти самые структуры. Вывод, пусть и не совсем логичный, но тем не менее: "FA" не воспринимается игрой никак абсолютно, и незачем заморачиваться по поводу него. "Нолик" есть - значит все хорошо. Еще раз обращаю ваше внимание, что чтение названия уровня происходит по смещению "0", а так как это PChar, и заранее кол-во байт для него не заказано, чтение текста прекращается с первым встречным нулем. За свою жизнь я досконально изучил где-то с полсотни различных интересных форматов, и вот мое мнение - если бы я придумывал сейв, то точно не стал бы лепить только один-одинешенек байт, всегда равный конкретному значению, да еще и в нечетное смещение прямо после PChar'а, и к тому же перед дублируемой структурой по смещению 0x0018. Если я где-то что-то не уточнил, прошу не судить строго. :)
Сообщение изменено: Arsunt (18 December 2007 - 08:29)