There is actually a whole modding community for this game.
The company themselves released an extractor for these archives.
and the website that tells how to use this.
Code: Select all
# include <windows.h>
#include <stdio.h> # include <stdio.h>
#include <direct.h> # include <direct.h>
struct NPKheader struct NPKheader
{ (
char sig[8]; char sig [8];
unsigned int dataoffset; unsigned int dataoffset;
}sHeader; ) sHeader;
struct NPKsubheader struct NPKsubheader
{ (
char sig[4];//_RID //ELIF //DEND char sig [4 ];//_ RID / / ELIF / / DEND
unsigned int id; unsigned int id;
unsigned int offset; unsigned int offset;
unsigned int size; unsigned int size;
unsigned short len; unsigned short len;
char *name; char * name;
}sSubHeader; ) sSubHeader;
int main(int argc,char **argv) int main (int argc, char ** argv)
{ (
char sig[5]; char sig [5];
FILE *f; FILE * f;
printf("Drakensang NPK files unpacker by Bourn v1.0\n"); printf ( "Drakensang NPK files unpacker by Bourn v1.0 \ n");
if(argc!=2||(GetFileAttributes(argv[1])==DWORD(-1))) if (argc! = 2 | | (GetFileAttributes (argv [1]) == DWORD (-1)))
{ (
printf("Usage: UNPNPK <filename>\n"); printf ( "Usage: UNPNPK <filename> \ n");
system("pause"); system ( "pause");
return 0; return 0;
} )
f=fopen(argv[1],"rb"); f = fopen (argv [1], "rb");
if(!f) if (! f)
return 1; return 1;
fread(&sHeader,sizeof(NPKheader),1,f); fread (& sHeader, sizeof (NPKheader), 1, f);
while(ftell(f)<sHeader.dataoffset) while (ftell (f) <sHeader.dataoffset)
{ (
fread(sig,sizeof(char),4,f); fread (sig, sizeof (char), 4, f);
sig[4]=0; sig [4] = 0;
if(!strcmp(sig,"_RID")) if (! strcmp (sig, "_RID"))
{ (
fread(&sSubHeader.id,sizeof(unsigned int),1,f); fread (& sSubHeader.id, sizeof (unsigned int), 1, f);
fread(&sSubHeader.len,sizeof(unsigned short),1,f); fread (& sSubHeader.len, sizeof (unsigned short), 1, f);
//int ftell0=ftell(f); / / int ftell0 = ftell (f);
char *name=new char[sSubHeader.len+1]; char * name = new char [sSubHeader.len +1];
fread(name,sSubHeader.len,1,f); fread (name, sSubHeader.len, 1, f);
name[sSubHeader.len]=0; name [sSubHeader.len] = 0;
mkdir(name); mkdir (name);
chdir(name); chdir (name);
printf("Create directory: %s\n",name); printf ( "Create directory:% s \ n", name);
delete [] name; delete [] name;
} )
else if(!strcmp(sig,"ELIF")) else if (! strcmp (sig, "ELIF"))
{ (
fread(&sSubHeader.id,sizeof(unsigned int),1,f); fread (& sSubHeader.id, sizeof (unsigned int), 1, f);
fread(&sSubHeader.offset,sizeof(unsigned int),1,f); fread (& sSubHeader.offset, sizeof (unsigned int), 1, f);
fread(&sSubHeader.size,sizeof(unsigned int),1,f); fread (& sSubHeader.size, sizeof (unsigned int), 1, f);
fread(&sSubHeader.len,sizeof(unsigned short),1,f); fread (& sSubHeader.len, sizeof (unsigned short), 1, f);
char *name=new char[sSubHeader.len+1]; char * name = new char [sSubHeader.len +1];
fread(name,sSubHeader.len,1,f); fread (name, sSubHeader.len, 1, f);
name[sSubHeader.len]=0; name [sSubHeader.len] = 0;
FILE *fl=fopen(name,"wb"); FILE * fl = fopen (name, "wb");
if(fl) if (fl)
{ (
char *buf=new char[sSubHeader.size]; char * buf = new char [sSubHeader.size];
int curpos=ftell(f); int curpos = ftell (f);
fseek(f,sSubHeader.offset+sHeader.dataoffset+8,SEEK_SET); fseek (f, sSubHeader.offset + sHeader.dataoffset +8, SEEK_SET);
fread(buf,sSubHeader.size,1,f); fread (buf, sSubHeader.size, 1, f);
fwrite(buf,sSubHeader.size,1,fl); fwrite (buf, sSubHeader.size, 1, fl);
fclose(fl); fclose (fl);
fseek(f,curpos,SEEK_SET); fseek (f, curpos, SEEK_SET);
delete [] buf; delete [] buf;
} )
printf("Create file: %s\n",name); printf ( "Create file:% s \ n", name);
delete [] name; delete [] name;
} )
else if(!strcmp(sig,"DNED")) else if (! strcmp (sig, "DNED"))
{ (
fread(&sSubHeader.id,sizeof(unsigned int),1,f); fread (& sSubHeader.id, sizeof (unsigned int), 1, f);
chdir(".."); chdir ("..");
} )
else if(!strcmp(sig,"ATAD")) else if (! strcmp (sig, "ATAD"))
{ (
fread(&sSubHeader.size,sizeof(unsigned int),1,f); fread (& sSubHeader.size, sizeof (unsigned int), 1, f);
} )
} )
fclose(f); fclose (f);
system("pause"); system ( "pause");
return 0; return 0;
} )