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


Фотография
- - - - -

IMG архив


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

#1 Axel218

Axel218

    Активный участник

  • Пользователи
  • PipPipPip
  • 36 сообщений
  • Пол:Мужчина
  • Город:Астана

Отправлено 07 January 2009 - 13:48

Это тема для обсуждения статьи: IMG архив

#2 Axel218

Axel218

    Активный участник

  • Пользователи
  • PipPipPip
  • 36 сообщений
  • Пол:Мужчина
  • Город:Астана

Отправлено 07 January 2009 - 13:51

Обсуждаем статью. Я вот всё хотел спросить - где можно откопать строение IMG архивов 3-ей версии (GTA IV)?

Сообщение отредактировал Axel218: 07 January 2009 - 13:51


#3 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 07 January 2009 - 15:26

Молодец, хорошая статья получилась. По поводу GTAIV - посмотри тему ресурсов, там есть ссылки на документацию.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#4 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 30 January 2009 - 18:20

Добавил полную версию алгоритмов по считыванию данных из VER1/VER2 архивов, Seemann уже кое-что подправил даже :) . Хочется полностью завершить начатое и теперь разбираюсь с тем как корректно переименовывать/удалять/добавлять файлы в архив. Появился такой вопрос, у меня объявлено FileName (имя конкретного файла в архиве) как array [1..24] of AnsiChar. Соответственно, присвоить величине типа String этот самый FileName не составит никакого труда, а вот как наоборот типу AnsiChar присвоить String?
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#5 Seemann

Seemann

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 266 сообщений
  • Пол:Мужчина
  • Город:Россия, Иркутск/СПб

Отправлено 30 January 2009 - 18:55

Не [1..24] а [0..23]. Массивы начинаются с нуля.

как наоборот типу AnsiChar присвоить String?

а это должно автоматически делаться, если выполнено правило выше.

var d: array[0..23] of AnsiChar;
begin
 d := 'test'; // OK
end;


#6 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 01 February 2009 - 06:25

Ну вот так-то это работает, если просто d:='test';

Но у меня:
Var S:String;
d: array[0..23] of AnsiChar;

затем "S" присваивается какой-то текст
При "D:=S;" выдает ошибку.

Incompatible types: 'Array' and 'string'

Сообщение отредактировал Dageron: 01 February 2009 - 06:49

в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#7 Seemann

Seemann

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 266 сообщений
  • Пол:Мужчина
  • Город:Россия, Иркутск/СПб

Отправлено 01 February 2009 - 08:29

Ну на ум приходит процедура Move

Move(s[1], d[0], Length(s));
возможно есть и более элегантные варианты.

А вообще с такими вопросами лучше сюда.

Сообщение отредактировал Seemann: 01 February 2009 - 08:36


#8 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 01 February 2009 - 12:33

Ладно, на будущее если что то туда... Тем более я сам ту тему создал).

Добавил в статью мой алгоритм переименования файлов. Вышел из проблемы с разными типами так:
for I := 1 to length(Value)-1 do
begin
(Dir)Stream.Write(Value[I], 1);
end;
(Dir)Stream.Write(Value[length(Value)], 24-(I+1));

Value - новое название соответствующего файла. Stream или DIRStream - файл. Перед действием цикла надо сместиться к нужному названю (как это сдлать описал в статье).

Теперь надо думать на тем как генерировать DIR файл для версии 2"А" IMG архивов. В архивах Stories содержатся только текстуры, модели и col2 файлы. Текстуры имеют префикс "xet", модели "ldm", а col2 - "2loc". Больше никаких файлов в оригинальных форма архивах не наблюдалось. Таблица имен может создаваться в цикле с тремя параметрами (имена файлов совсем не имеют значение т.к. игра всеравно обращается к ним по оффсетам - хватит и model01, model02; texture01, texture02...), для текстур, моделей и коллизий соответственно. Оффсеты так же могут записываться по порядку. Гораздо сложнее будет действовать с размером файлов. Можно просто чтобы высчитать длину конкретного вычесть из оффсета следующего оффсет текущего, но в таком случае не понятно как поступать с пустым пространством в конце файлов...
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#9 Seemann

Seemann

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 266 сообщений
  • Пол:Мужчина
  • Город:Россия, Иркутск/СПб

Отправлено 01 February 2009 - 16:27

Нужен ли в этой статье такой большой листинг кода на дельфи? Он очень специфичен, за счет использования разных форм и кнопок, в простых условиях его сложно использовать. Если у тебя есть интерес к написанию программы для работы с IMG, это лучше делать вне рамок этой статьи, а потом выложить в разделе Инструменты. Кстати, для подобных вещей лучше писать DLL, которую легко использовать в любой программе, чем гуевое приложение, которое сложно собрать без исходников (нужно воспроизводить весь интерфейс).

#10 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 01 February 2009 - 16:55

Да, так я скорее всего и сделаю. И почему сразу это "гуевое приложение"?!
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#11 Seemann

Seemann

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 266 сообщений
  • Пол:Мужчина
  • Город:Россия, Иркутск/СПб

Отправлено 01 February 2009 - 17:32

От слова GUI - Graphical User Interface (противоположность Console application). А не то что ты подумал ... )

#12 Aptyp

Aptyp

    Новичок

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

Отправлено 12 June 2009 - 21:00

Решил тут написать программу, которая будет автоматически устанавливать моды. И следовательно надо же что бы она работала с img архивами, а точнее извлечение из него файлов и замена другими. Не надо даже просматривать. Пишу на Delphi 7. Прошу помощи у Вас, кто чем сможет. Только должен признаться что никогда ещё не работал в направлении структуры файлов.
Из программиста и компьютера - дурак не компьютер.

#13 Kryder

Kryder

    Активный участник

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

Отправлено 13 June 2009 - 03:05

Aptyp, я бы посоветовал лучше занятся плагином для работы с игровыми ахривами для установочной системы NSIS, я бы попробовал помоч, хоть я и начинающий програмер! Примеры простого плагина есть.

#14 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 13 June 2009 - 04:43

Aptyp, я бы посоветовал лучше занятся плагином для работы с игровыми ахривами для установочной системы NSIS, я бы попробовал помоч, хоть я и начинающий програмер! Примеры простого плагина есть.

Это что-то вроде консольного установщика, который можно в NSIS использовать? Так ведь есть SparkCS от aru.

Решил тут написать программу, которая будет автоматически устанавливать моды. И следовательно надо же что бы она работала с img архивами, а точнее извлечение из него файлов и замена другими. Не надо даже просматривать. Пишу на Delphi 7.
Прошу помощи у Вас, кто чем сможет. Только должен признаться что никогда ещё не работал в направлении структуры файлов.

Могу подсказать, но как ты хочешь чтобы выглядела твоя программа? (с какими играми должна быть совместима?)
p.s. Я публиковал еще в январе-феврале основные алгоритмы работы с IMG в Delphi.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#15 Aptyp

Aptyp

    Новичок

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

Отправлено 13 June 2009 - 12:03

Dageron, программу пишу именно для GTA 4. А работать с ней надо будет следующим образом: создал человек какой-то мод для игры. С помощью моей программы он файлы мода запаковывает в специальный архив. Далее люди которые хотят установить данный мод просто запускают этот архив, опять же, с помощью моей программы и она сама всё устанавливает. Я делал подобную программу для GTA 4. Но там она всего лишь устанавливала 6 уже заранее занесённых в неё модов и не работала с img. Выложил её на www.playground.ru - всем понравилось. И скажи, пожалуйста, где именно ты выкладывал алгоритмы.
Из программиста и компьютера - дурак не компьютер.

#16 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 13 June 2009 - 15:13

ссылка в первом посте (конец пункта 1.2)

#17 Aptyp

Aptyp

    Новичок

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

Отправлено 13 June 2009 - 16:16

ссылка в первом посте (конец пункта 1.2)

Где это? Я не так часто пользуюсь форумами и не знаю что такое "пост".
Из программиста и компьютера - дурак не компьютер.

#18 Chipsman

Chipsman

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 786 сообщений
  • Пол:Не определился


Отправлено 13 June 2009 - 16:50

пост == сообщение :)

#19 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 13 June 2009 - 18:01

Значит речь идет именно о IV. Ты прав, для нее я ничего не выкладывал, однако делал).
Для начала прочитай внимательно в статье раздел про спецификацию IMG3. Обрати внимание на статью шифрования, там уже приведен код дешифровщика на Delphi и выложены соответствующие юниты. Просто к слову, архив можно расшифровать едва пересохранив его в SparkIV.

Итак, если архив расшифрован, то вот моя процедура считывания IMG:
var
Stream:TFileStream;
IVFileName:Array[0..30] of AnsiChar;
I,I1, I2, P:Integer;
IVobjcol, IVcatsize, IVObjsize, IVObjOffcet, Freex, UsedBlocks: Integer;

begin
Stream.Seek(8, 0); //пропускаем идентификатор и версию
Stream.Read(IVObjcol, 4); //считываем количество объектов
Stream.Read(IVCatSize, 4); //считываем размер каталога
Stream.Seek(16, 0);
I2:=0;
for I := 0 to IVObjcol do
begin
		  I1:=0;
		  Z:=Stream.Position; //запоминаем текущую позицию
		  Stream.Seek(IVObjcol*16+20+I2+P, 0); //смещаемся к разделу имен
		  Stream.Read(IVFileName, 30); //читаем имя
		  S:= IVFileName; //присваиваем имя переменной S
		  I1:=length(S); //вычисляем длину имени (это важно т.к. она нигде в архиве не задается)
		  Stream.Seek(Z,0); //возвращаемся назад
		  Stream.Read(IVObjsize, 4); //читаем размер объекта
		  Stream.Seek(Stream.Position+4, 0); //пропускаем версию ресурса (можно и прочитать)
		  Stream.Read(IVObjOffcet, 4); //читаем оффсет 
		  Stream.Read(UsedBlocks, 2);//читаем количество используемых блоков
		  Stream.Read(Freex, 2); //читаем размер неиспользуемого места в последнем блоке 
		  P:=P+1;
		  I2:=I2+I1;
		 {теперь, соответственно, надо добавить нужные из прочитанных данных в таблицу или массив}
end;
end;

Надеюсь, ничего не забыл)
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#20 Aptyp

Aptyp

    Новичок

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

Отправлено 13 June 2009 - 20:44

Прошу прощения за глупый вопрос, но напомните, как указать Steam с каким файлом работать.
Из программиста и компьютера - дурак не компьютер.




Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных