[Extractor-gtk-cvslog] SF.net SVN: extractor-gtk: [75] trunk/extractor
Extract files from unusual archive formats
Brought to you by:
someone-guy
From: <som...@us...> - 2008-04-06 20:09:59
|
Revision: 75 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=75&view=rev Author: someone-guy Date: 2008-04-06 13:09:49 -0700 (Sun, 06 Apr 2008) Log Message: ----------- Add parsing support for Metal Gear Solid: The Twin Snakes vox.dat file Modified Paths: -------------- trunk/extractor/Makefile trunk/extractor/extractor.c trunk/extractor/formats.h Added Paths: ----------- trunk/extractor/solid.c Modified: trunk/extractor/Makefile =================================================================== --- trunk/extractor/Makefile 2008-04-06 20:09:20 UTC (rev 74) +++ trunk/extractor/Makefile 2008-04-06 20:09:49 UTC (rev 75) @@ -9,6 +9,7 @@ homeworld2.c \ nwn.c \ pak.c \ + solid.c \ wad.c \ xtre.c \ Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-04-06 20:09:20 UTC (rev 74) +++ trunk/extractor/extractor.c 2008-04-06 20:09:49 UTC (rev 75) @@ -23,6 +23,7 @@ &homeworld2_fmt, &nwn_fmt, &pak_fmt, + &solid_fmt, &wad_fmt, &xtre_fmt, NULL Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-04-06 20:09:20 UTC (rev 74) +++ trunk/extractor/formats.h 2008-04-06 20:09:49 UTC (rev 75) @@ -30,6 +30,7 @@ extern const fmt_desc_t homeworld2_fmt; extern const fmt_desc_t nwn_fmt; extern const fmt_desc_t pak_fmt; +extern const fmt_desc_t solid_fmt; extern const fmt_desc_t wad_fmt; extern const fmt_desc_t xtre_fmt; Added: trunk/extractor/solid.c =================================================================== --- trunk/extractor/solid.c (rev 0) +++ trunk/extractor/solid.c 2008-04-06 20:09:49 UTC (rev 75) @@ -0,0 +1,105 @@ +/** + * \file solid.c + * \brief routines for handling the GameCube Metal Gear Solid: Twin Snakes vox.dat format + * + * Copyright (C) 2008 Reimar Döffinger + * License: GPL v2 (see LICENSE file) + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include "formats.h" +#include "helpers.h" + +//! this is only a heuristic check, hopefully it is reliable enough +static int check_file(FILE *in) { + rewind(in); + return read_be32(in) == 0x10 && read_be32(in) == 0x10 && read_be32(in) == 0; +} + +enum { + LANG_ANY, + LANG_EN, + LANG_FR, + LANG_DE, + LANG_IT, + LANG_ES, +}; + +static const char *langstr(int lang) { + switch (lang) { + case LANG_ANY: return ""; + case LANG_EN : return "en"; + case LANG_FR : return "fr"; + case LANG_DE : return "de"; + case LANG_IT : return "it"; + case LANG_ES : return "es"; + } + return "nn"; +} + +enum { + TYPE_AUDIO = 0x01, + TYPE_SUB = 0x04, + TYPE_T6 = 0x06, // subtitle references? (unsure) + TYPE_T7 = 0x07, + TYPE_INDEX = 0x10, + TYPE_PADDING = 0xf0, +}; + +static const char *typestr(int type) { + switch (type) { + case TYPE_AUDIO : return "ogg"; + case TYPE_SUB : return "sub"; + case TYPE_T6 : return "t6"; + case TYPE_T7 : return "t7"; + case TYPE_INDEX : return "idx"; // should never be used + case TYPE_PADDING: return "pad"; // should not be used either + } + return "bin"; +} + +static file_t *get_list(FILE *in) { + int cnt = 0; + file_t *list = calloc(1, sizeof(file_t)); + rewind(in); + while (cnt < MAX_FILES) { + int lang = read_be16(in); + int type = read_be16(in); + uint32_t len = read_be32(in); + if (feof(in)) break; + if (type == TYPE_INDEX) { + char ext[8]; + read_be32(in); // unknown, always 0? + lang = read_be16(in); + type = read_be16(in); + if (*langstr(lang)) + snprintf(ext, sizeof(ext), "%s.%s", langstr(lang), typestr(type)); + else + snprintf(ext, sizeof(ext), "%s", typestr(type)); + add_entry(&list, cnt, ext); + list[cnt].start = ftell(in) - 16; + cnt++; + } else if (type == TYPE_PADDING) { + uint64_t pos = ftell(in); + len = 16; // should be already 16, just to be sure + pos = (pos + 0x800) & ~0x7ff; + fseek(in, pos, SEEK_SET); + } else + fseek(in, 8, SEEK_CUR); + fseek(in, len - 16, SEEK_CUR); + } + return list; +} + +const fmt_desc_t solid_fmt = { + "MetalGear Solid: TS", + "MetalGear Solid: TS (vox.dat)", + "vox.dat", + check_file, + get_list, + default_free_list, + default_extract_file, + default_extract_mem, +}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |