IMG архив
#1
Отправлено 07 January 2009 - 13:48
#2
Отправлено 07 January 2009 - 13:51
Сообщение отредактировал Axel218: 07 January 2009 - 13:51
#3
Отправлено 07 January 2009 - 15:26
#4
Отправлено 30 January 2009 - 18:20
#5
Отправлено 30 January 2009 - 18:55
а это должно автоматически делаться, если выполнено правило выше.как наоборот типу AnsiChar присвоить String?
var d: array[0..23] of AnsiChar; begin d := 'test'; // OK end;
#6
Отправлено 01 February 2009 - 06:25
Но у меня:
Var S:String;
d: array[0..23] of AnsiChar;
затем "S" присваивается какой-то текст
При "D:=S;" выдает ошибку.
Incompatible types: 'Array' and 'string'
Сообщение отредактировал Dageron: 01 February 2009 - 06:49
#7
Отправлено 01 February 2009 - 08:29
Move(s[1], d[0], Length(s));возможно есть и более элегантные варианты.
А вообще с такими вопросами лучше сюда.
Сообщение отредактировал Seemann: 01 February 2009 - 08:36
#8
Отправлено 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...), для текстур, моделей и коллизий соответственно. Оффсеты так же могут записываться по порядку. Гораздо сложнее будет действовать с размером файлов. Можно просто чтобы высчитать длину конкретного вычесть из оффсета следующего оффсет текущего, но в таком случае не понятно как поступать с пустым пространством в конце файлов...
#9
Отправлено 01 February 2009 - 16:27
#10
Отправлено 01 February 2009 - 16:55
#11
Отправлено 01 February 2009 - 17:32
#12
Отправлено 12 June 2009 - 21:00
#13
Отправлено 13 June 2009 - 03:05
#14
Отправлено 13 June 2009 - 04:43
Это что-то вроде консольного установщика, который можно в NSIS использовать? Так ведь есть SparkCS от aru.Aptyp, я бы посоветовал лучше занятся плагином для работы с игровыми ахривами для установочной системы NSIS, я бы попробовал помоч, хоть я и начинающий програмер! Примеры простого плагина есть.
Могу подсказать, но как ты хочешь чтобы выглядела твоя программа? (с какими играми должна быть совместима?)Решил тут написать программу, которая будет автоматически устанавливать моды. И следовательно надо же что бы она работала с img архивами, а точнее извлечение из него файлов и замена другими. Не надо даже просматривать. Пишу на Delphi 7.
Прошу помощи у Вас, кто чем сможет. Только должен признаться что никогда ещё не работал в направлении структуры файлов.
p.s. Я публиковал еще в январе-феврале основные алгоритмы работы с IMG в Delphi.
#15
Отправлено 13 June 2009 - 12:03
#16
Отправлено 13 June 2009 - 15:13
#17
Отправлено 13 June 2009 - 16:16
Где это? Я не так часто пользуюсь форумами и не знаю что такое "пост".ссылка в первом посте (конец пункта 1.2)
#19
Отправлено 13 June 2009 - 18:01
Для начала прочитай внимательно в статье раздел про спецификацию 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;
Надеюсь, ничего не забыл)
#20
Отправлено 13 June 2009 - 20:44
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных













