Thread: [Extractor-gtk-cvslog] SF.net SVN: extractor-gtk:[86] trunk/extractor/nwn.c
Extract files from unusual archive formats
Brought to you by:
someone-guy
From: <som...@us...> - 2008-08-22 16:03:33
|
Revision: 86 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=86&view=rev Author: someone-guy Date: 2008-08-22 16:03:31 +0000 (Fri, 22 Aug 2008) Log Message: ----------- Partial support for NWN2 data files Modified Paths: -------------- trunk/extractor/nwn.c Modified: trunk/extractor/nwn.c =================================================================== --- trunk/extractor/nwn.c 2008-08-22 16:03:12 UTC (rev 85) +++ trunk/extractor/nwn.c 2008-08-22 16:03:31 UTC (rev 86) @@ -13,18 +13,23 @@ #include "formats.h" #include "helpers.h" -//! check for nwn archive (starts with MOD V1.0) +//! check for nwn archive (starts with MOD V1.0 or MOD V1.1 for NWN2) static int check_file(FILE *in) { char sig[9] = {0}; rewind(in); fread(sig, 8, 1, in); - return strcmp(sig, "MOD V1.0") == 0; + return strcmp(sig, "MOD V1.0") == 0 || strcmp(sig, "MOD V1.1") == 0; } static file_t *get_list(FILE *in) { file_t *list; uint32_t count, namepos, tblpos; + int namelen = 16; int i; + char sig[9] = {0}; + rewind(in); + fread(sig, 8, 1, in); + if (strcmp(sig, "MOD V1.1") == 0) namelen = 32; fseek(in, 0x10, SEEK_SET); count = read_le32(in); if (count > MAX_FILES) count = MAX_FILES; @@ -34,10 +39,10 @@ list = calloc(count + 1, sizeof(file_t)); for (i = 0; i < count; i++) { uint32_t type_id; - fseek(in, namepos + 24 * i, SEEK_SET); - list[i].name = calloc(1, 21); - fread(list[i].name, 16, 1, in); - list[i].name[16] = 0; + fseek(in, namepos + (namelen + 8) * i, SEEK_SET); + list[i].name = calloc(1, namelen + 5); + fread(list[i].name, namelen, 1, in); + list[i].name[namelen] = 0; read_le32(in); // file number type_id = read_le32(in); fseek(in, tblpos + 8 * i, SEEK_SET); @@ -63,8 +68,8 @@ } const fmt_desc_t nwn_fmt = { - "Neverwinter Nights", - "Neverwinter Nights (*.mod;*.nwm;*.sav)", + "Neverwinter Nights (1/2)", + "Neverwinter Nights (1/2) (*.mod;*.nwm;*.sav)", "*.mod;*.nwm;*.sav", check_file, get_list, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-08-22 16:03:59
|
Revision: 87 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=87&view=rev Author: someone-guy Date: 2008-08-22 16:03:53 +0000 (Fri, 22 Aug 2008) Log Message: ----------- NWN2 support, hopefully more reliable type detection Modified Paths: -------------- trunk/extractor/nwn.c Modified: trunk/extractor/nwn.c =================================================================== --- trunk/extractor/nwn.c 2008-08-22 16:03:31 UTC (rev 86) +++ trunk/extractor/nwn.c 2008-08-22 16:03:53 UTC (rev 87) @@ -24,12 +24,14 @@ static file_t *get_list(FILE *in) { file_t *list; uint32_t count, namepos, tblpos; + int version = 0; int namelen = 16; int i; char sig[9] = {0}; rewind(in); fread(sig, 8, 1, in); - if (strcmp(sig, "MOD V1.1") == 0) namelen = 32; + if (strcmp(sig, "MOD V1.1") == 0) version = 1; + if (version) namelen = 32; fseek(in, 0x10, SEEK_SET); count = read_le32(in); if (count > MAX_FILES) count = MAX_FILES; @@ -48,20 +50,40 @@ fseek(in, tblpos + 8 * i, SEEK_SET); list[i].start = read_le32(in); list[i].len = read_le32(in); - if (type_id == 0x7d9) // script source - strcat(list[i].name, ".nss"); - else { // generate extension from content start - char *ptr = &list[i].name[strlen(list[i].name)]; - fseek(in, list[i].start, SEEK_SET); - *ptr++ = '.'; - fread(ptr, 3, 1, in); - *ptr = tolower(*ptr); - ptr++; - *ptr = tolower(*ptr); - ptr++; - *ptr = tolower(*ptr); - ptr++; - *ptr = 0; + switch (type_id) { + case 0x07d9: // script source + strcat(list[i].name, ".nss"); + break; + case 0x0bcd: // visual sourcesafe stuff?? + strcat(list[i].name, ".vss"); + break; + case 0x0000: + case 0x0bc1: + case 0x0bc3: + case 0x0bca: + case 0x0bbe: + case 0x0bbf: // effect xml files? + strcat(list[i].name, ".xml"); + break; + case 0x0003: // act start image + strcat(list[i].name, ".img"); + break; + default: + { + // generate extension from content start + char *ptr = &list[i].name[strlen(list[i].name)]; + fseek(in, list[i].start, SEEK_SET); + *ptr++ = '.'; + fread(ptr, 3, 1, in); + *ptr = tolower(*ptr); + ptr++; + *ptr = tolower(*ptr); + ptr++; + *ptr = tolower(*ptr); + ptr++; + *ptr = 0; + break; + } } } return list; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-08-22 16:12:18
|
Revision: 107 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=107&view=rev Author: someone-guy Date: 2008-08-22 16:12:15 +0000 (Fri, 22 Aug 2008) Log Message: ----------- NWN2 act images are in Targa (.tga) format. Modified Paths: -------------- trunk/extractor/nwn.c Modified: trunk/extractor/nwn.c =================================================================== --- trunk/extractor/nwn.c 2008-08-22 16:12:00 UTC (rev 106) +++ trunk/extractor/nwn.c 2008-08-22 16:12:15 UTC (rev 107) @@ -66,7 +66,7 @@ strcat(list[i].name, ".xml"); break; case 0x0003: // act start image - strcat(list[i].name, ".img"); + strcat(list[i].name, ".tga"); break; default: { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-08-24 10:26:55
|
Revision: 110 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=110&view=rev Author: someone-guy Date: 2008-08-24 10:26:53 +0000 (Sun, 24 Aug 2008) Log Message: ----------- Distinguish between NWN1 V1.1 and NWN2 files Modified Paths: -------------- trunk/extractor/nwn.c Modified: trunk/extractor/nwn.c =================================================================== --- trunk/extractor/nwn.c 2008-08-23 11:21:39 UTC (rev 109) +++ trunk/extractor/nwn.c 2008-08-24 10:26:53 UTC (rev 110) @@ -31,7 +31,9 @@ rewind(in); fread(sig, 8, 1, in); if (strcmp(sig, "MOD V1.1") == 0) version = 1; - if (version) namelen = 32; + // for some idiocy, both NWN1 premium modules and + // NWN2 modules use MOD V1.1. Try to distinguish them. + if (version && read_le32(in) == 0 && read_le32(in) == 0) namelen = 32; fseek(in, 0x10, SEEK_SET); count = read_le32(in); if (count > MAX_FILES) count = MAX_FILES; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-08-24 10:27:22
|
Revision: 111 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=111&view=rev Author: someone-guy Date: 2008-08-24 10:27:20 +0000 (Sun, 24 Aug 2008) Log Message: ----------- Partial support for V1.1 HAKs Modified Paths: -------------- trunk/extractor/nwn.c Modified: trunk/extractor/nwn.c =================================================================== --- trunk/extractor/nwn.c 2008-08-24 10:26:53 UTC (rev 110) +++ trunk/extractor/nwn.c 2008-08-24 10:27:20 UTC (rev 111) @@ -18,7 +18,8 @@ char sig[9] = {0}; rewind(in); fread(sig, 8, 1, in); - return strcmp(sig, "MOD V1.0") == 0 || strcmp(sig, "MOD V1.1") == 0; + return strcmp(sig, "MOD V1.0") == 0 || strcmp(sig, "MOD V1.1") == 0 || + strcmp(sig, "HAK V1.0") == 0; } static file_t *get_list(FILE *in) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |