Files
Jedi-Academy/tools/create_soundbank/main.cpp
2013-04-04 14:32:05 -07:00

171 lines
3.1 KiB
C++

#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <direct.h>
#include <io.h>
#include <windows.h>
#include "../../code/zlib/zlib.h"
static int count = 0;
static int basesize = 0;
//Changing this? It needs to be synced with the snd_local_console.h.
enum SoundFilenameFlags
{
SFF_WEAPONS_ATST,
SFF_SAND_CREATURE,
SFF_HOWLER,
SFF_ALTCHARGE,
SFF_FALLING,
SFF_TIEEXPLODE
//Can't have more than 8.
};
//Changing this? It needs to be synced with the snd_local_console.h.
FILE* out;
FILE* out2;
FILE* out3;
void processfile( const char* path, const char* filename)
{
FILE* in;
char name[256];
// open the file and write it to the massive bank
strcpy(name, path);
strcat(name,"\\");
strcat(name, filename);
in = fopen(name, "rb");
if(!in)
{
printf("Error, could not open file, %s, for reading.\n", name);
return;
}
fseek(in, 0, SEEK_END);
int len = ftell(in);
fseek(in, 0, SEEK_SET);
void* crap = malloc(len);
fread(crap, len, 1, in);
fclose(in);
unsigned int offset = ftell(out);
//fwrite(&len, sizeof(len), 1, out);
fwrite(crap, len, 1, out);
free(crap);
char osname[256];
strcpy(osname, "d:\\base");
strcat(osname, name + basesize);
unsigned int filecode = crc32(0, (const byte *)osname, strlen(osname));
char qname[64];
strcpy(qname, name + basesize + 1);
fwrite(&filecode, sizeof(filecode), 1, out2);
fwrite(&offset, sizeof(offset), 1, out2);
fwrite(&len, sizeof(len), 1, out2);
unsigned char flags = 0;
if(strstr(qname, "weapons\\atst")) {
flags |= (1 << SFF_WEAPONS_ATST);
}
if(strstr(qname, "sand_creature")) {
flags |= (1 << SFF_SAND_CREATURE);
}
if(strstr(qname, "howler")) {
flags |= (1 << SFF_HOWLER);
}
if(strstr(qname, "altcharge")) {
flags |= (1 << SFF_ALTCHARGE);
}
if(strstr(qname, "falling")) {
flags |= (1 << SFF_FALLING);
}
if(strstr(qname, "tieexplode")) {
flags |= (1 << SFF_TIEEXPLODE);
}
fwrite(&flags, sizeof(flags), 1, out2);
fprintf(out3, "%u\t\t%s\n", filecode, qname);
}
void process( const char* path)
{
char spec[256];
strcpy(spec, path);
strcat(spec, "\\*.*");
_finddata_t data;
int h = _findfirst(spec, &data);
while( h != -1)
{
if(data.attrib & _A_SUBDIR && strcmp(data.name,".") && strcmp(data.name,"..") )
{
char sub[256];
strcpy(sub,path);
strcat(sub,"\\");
strcat(sub,data.name);
process(sub);
}
else if(strstr(data.name,".wxb"))
{
processfile(path, data.name);
count++;
}
if (_findnext(h, &data)) break;
}
_findclose(h);
}
int main(int argc, const char** argv)
{
// open a file to become the massive soundbank
out = fopen("sound.bnk", "wb");
out2 = fopen("sound.tbl", "wb");
out3 = fopen("crclookup.txt", "w");
if(!out)
{
printf("Error, could not open sound.bnk for writing.\n");
exit(0);
}
if(!out2)
{
printf("Error, could not open sound.tbl for writing.\n");
exit(0);
}
if(!out3)
{
printf("Error, could not open crclookup.txt for writing.\n");
exit(0);
}
basesize = strlen(argv[1]);
// find all WXP files in the path
printf("Processing...\n");
process(argv[1]);
fclose(out);
fclose(out2);
fclose(out3);
printf("%d files processed.\n", count);
return 1;
}