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


Внимание!

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


Фотография

Drakensang


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

#1 Bourn

Bourn

    Старший сержант

  • Пользователи
  • 74 сообщений
  • Город:Нижний Новгород

Отправлено 21 February 2009 - 07:33

Собственно написал, распаковщик, по традиции, если кому-то надо - прошу smile.gif

P.S. А игра-то неплохая.
P.P.S. Компилировал с выравниванием еденица, но должно работать по идее с выравниванием до 4х.

Код
#include <windows.h>
#include <stdio.h>
#include <direct.h>



struct NPKheader
{
char sig[8];
unsigned int dataoffset;
}sHeader;

struct NPKsubheader
{
char sig[4];//_RID //ELIF //DEND
unsigned int id;
unsigned int offset;
unsigned int size;
unsigned short len;
char *name;
}sSubHeader;

int main(int argc,char **argv)
{    
char sig[5];
FILE *f;
printf("Drakensang NPK files unpacker by Bourn v1.0\n");
if(argc!=2||(GetFileAttributes(argv[1])==DWORD(-1)))
{
 printf("Usage: UNPNPK <filename>\n");
 system("pause");
 return 0;
}      
f=fopen(argv[1],"rb");
if(!f)
 return 1;
fread(&sHeader,sizeof(NPKheader),1,f);
while(ftell(f)<sHeader.dataoffset)
{
 fread(sig,sizeof(char),4,f);
 sig[4]=0;
 if(!strcmp(sig,"_RID"))
 {
  fread(&sSubHeader.id,sizeof(unsigned int),1,f);
  fread(&sSubHeader.len,sizeof(unsigned short),1,f);
  //int ftell0=ftell(f);
  char *name=new char[sSubHeader.len+1];
  fread(name,sSubHeader.len,1,f);
  name[sSubHeader.len]=0;
  mkdir(name);
  chdir(name);
  printf("Create directory: %s\n",name);
  delete [] name;
 }
 else if(!strcmp(sig,"ELIF"))
 {
  fread(&sSubHeader.id,sizeof(unsigned int),1,f);
  fread(&sSubHeader.offset,sizeof(unsigned int),1,f);
  fread(&sSubHeader.size,sizeof(unsigned int),1,f);
  fread(&sSubHeader.len,sizeof(unsigned short),1,f);
  char *name=new char[sSubHeader.len+1];
  fread(name,sSubHeader.len,1,f);
  name[sSubHeader.len]=0;
  FILE *fl=fopen(name,"wb");
  if(fl)
  {
   char *buf=new char[sSubHeader.size];
   int curpos=ftell(f);
   fseek(f,sSubHeader.offset+sHeader.dataoffset+8,SEEK_SET);
   fread(buf,sSubHeader.size,1,f);
   fwrite(buf,sSubHeader.size,1,fl);
   fclose(fl);
   fseek(f,curpos,SEEK_SET);
   delete [] buf;
  }
  printf("Create file: %s\n",name);
     delete [] name;
 }
 else if(!strcmp(sig,"DNED"))
 {
  fread(&sSubHeader.id,sizeof(unsigned int),1,f);
  chdir("..");
 }
 else if(!strcmp(sig,"ATAD"))
 {
  fread(&sSubHeader.size,sizeof(unsigned int),1,f);
 }
}
fclose(f);
system("pause");
return 0;
}


#2 Bourn

Bourn

    Старший сержант

  • Пользователи
  • 74 сообщений
  • Город:Нижний Новгород

Отправлено 21 February 2009 - 08:28

Скачать саму скомпиленную версию можно:
http://letitbit.net/...UNPNPK.zip.html

А так же файл для тестирования:
http://letitbit.net/.../locale.7z.html

#3 Angel3D

Angel3D

    Рядовой

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

Отправлено 20 March 2009 - 20:00

А есть возможность, запаковать обратно?

#4 Bourn

Bourn

    Старший сержант

  • Пользователи
  • 74 сообщений
  • Город:Нижний Новгород

Отправлено 23 March 2009 - 21:53

ну если обратно алгоритм прокрутить - то есть smile.gif, хотя зачем это надо?