Перейти к содержимому


Внимание!

Это форум по извлечению ресурсов из игр: музыки, звуков, текстур, 3D-моделей...
Перед поиском ответов на форуме, рекомендуется ознакомиться с основным сайтом EXTRACTOR.ru!
[ Прочтите внимательно - правила создания тем и ответа в них ]
Все вопросы по запуску игр задавайте в другом месте: Установка и запуск игр.


Фотография

Структура архива Img.


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2

#1 Artur

Artur

    Рядовой

  • Пользователи
  • 2 сообщений

Отправлено 11 August 2005 - 23:13

Пишу свою программу на Delphi для работы с IMG архивом, это в игрушке GTA San Andreas такой архив. Создаю вот такой packed record ->
Name: array[0..23] of Char;
Index: SmallInt;
Index2: SmallInt;
Index3: SmallInt;
Index4: SmallInt;
Index5: SmallInt;
Index6: SmallInt;
Index7: SmallInt;
потом читаю, block read.
Есть несколько вопросов.
1. Посколько байт надо читать ?.
2. Вообще правильная ли структура описанная мной ?.
Может кто поможет ?.

#2 -=CHE@TER=-

-=CHE@TER=-

    Полковник

  • Администраторы
  • 971 сообщений
  • Пол:Мужчина

Отправлено 12 August 2005 - 11:30

Artur!
Я не знаю формата описания IMG файлов, но строки в Delphi, лучше читать вот так:
Код

Var S: String;
Begin
.....
 SetLength(S, 24);
 BlockRead(Fl, S[1], 24);
{ теперь в S - нужная строка; если в конце неё нули, то нужно сделать так:
 While ((Length(S)>0) And (S[Length(S)]=#0)) Do Delete(S, Length(S), 1);
 чтобы их отрезать
}
.....
End.

тогда с ними проще будет дальше работать (если это имя файла и т.д.)
Если же тебя не волнует строка и ты хочешь читать именно структуру, то можно читать вот так:
Код


Type
    TRectStruct = Record
                    Name: array[0..23] of Char;
                    Indexs: Array[0..6] Of SmallInt;
                  End;
Var RectStruct: Array of TRectStruct;
.....
 SetLength(RectStruct, N);
 For I:=1 To N Do { N - сколько структур в файле }
   BlockRead(Fl, RecStruct[I-1], SizeOf(RecStruct));
....

{ ежели тебе всего один раз прочитать нужно, то можно сделать так: }
Var RectStruct: TRectStruct;
......
 BlockRead(Fl, RecStruct, SizeOf(RecStruct));



#3 Artur

Artur

    Рядовой

  • Пользователи
  • 2 сообщений

Отправлено 16 August 2005 - 21:24

Все ! разобрал структуру. 2 дня мучился с Hex-Editor'ом.
Структура такая.
Первые 4 байта - это строчка указывающая что img-архив 2 версии. Она всегда равна = VER2, по ней можно определить что архив именно версии 2. Далее 3 байта , общее кол-во файлов в архиве.

type
TIMGv2Header = packed record
Ver : array[0..4] of Char; //Версия
FileCount : LongWord; // Кол-во файлов
end;

Далее идет перечисление файлов в архиве.
Вот структура на Delphi.
type
TIMGv2 = packed record
StartBlock: Longword; // Положение файла
BlockCount: Longword; // Размер блока
Name: array[0..23] of Char; //Имя файла
end;
Читать надо по 32 байта. Реальное положение файла и размер блока вычисляется , умножением на 2048.
StartBlock * 2048
BlockCount * 2048
Ну и размер файла вычисляется так BlockCount * 2.