Собственно написал, распаковщик, по традиции, если кому-то надо - прошу
P.S. А игра-то неплохая.
P.P.S. Компилировал с выравниванием еденица, но должно работать по идее с выравниванием до 4х.
Drakensang
Автор
Bourn
, Feb 21 2009 07:33
Сообщений в теме: 3
#1
Отправлено 21 February 2009 - 07:33
Код |
#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
Отправлено 21 February 2009 - 08:28
Скачать саму скомпиленную версию можно:
http://letitbit.net/...UNPNPK.zip.html
А так же файл для тестирования:
http://letitbit.net/.../locale.7z.html
http://letitbit.net/...UNPNPK.zip.html
А так же файл для тестирования:
http://letitbit.net/.../locale.7z.html
#3
Отправлено 20 March 2009 - 20:00
А есть возможность, запаковать обратно?
#4
Отправлено 23 March 2009 - 21:53
ну если обратно алгоритм прокрутить - то есть , хотя зачем это надо?