Beispiel #1
0
//
// W_InitMultipleFiles
// Pass a null terminated list of files to use.
// All files are optional, but at least one file
//  must be found.
// Files with a .wad extension are idlink files
//  with multiple lumps.
// Other files are single lumps with the base filename
//  for the lump name.
// Lump names can appear multiple times.
// The name searcher looks backwards, so a later file
//  does override all earlier ones.
//
void W_InitMultipleFiles (char **filenames)
{
    int		size;

    // open all the files, load headers, and count lumps
    numlumps = 0;

    // will be realloced as lumps are added
    lumpinfo = malloc(1);

    for (; *filenames; filenames++)
	W_AddFile(*filenames);

    if (!numlumps)
	I_Error("W_InitFiles: no files found");

    // merge the sprites and flats namespaces
    W_MergeLumps("S_START", "S_END");
    W_MergeLumps("F_START", "F_END");

    // set up caching
    size = numlumps * sizeof(*lumpcache);
    lumpcache = malloc(size);

    if (!lumpcache)
	I_Error("Couldn't allocate lumpcache");

    memset(lumpcache, 0, size);

    W_InitLumpHash();
}
Beispiel #2
0
//
// W_InitMultipleFiles
// Pass a null terminated list of files to use.
// All files are optional, but at least one file
//  must be found.
// Files with a .wad extension are idlink files
//  with multiple lumps.
// Other files are single lumps with the base filename
//  for the lump name.
// Lump names can appear multiple times.
// The name searcher looks backwards, so a later file
//  does override all earlier ones.
//
std::vector<std::string> W_InitMultipleFiles (std::vector<std::string> &filenames)
{
    size_t		size, i;

    // open all the files, load headers, and count lumps
    // will be realloced as lumps are added
    numlumps = 0;

    if(lumpinfo)
    {
        free(lumpinfo);
        lumpinfo = 0;
    }

    std::vector<std::string> hashes(filenames);

    // open each file once, load headers, and count lumps
    int j = 0;
    std::vector<std::string> loaded;
    for(i = 0; i < filenames.size(); i++)
    {
        if(std::find(loaded.begin(), loaded.end(), filenames[i].c_str()) == loaded.end())
        {
            hashes[j++] = W_AddFile(filenames[i].c_str());
            loaded.push_back(filenames[i].c_str());
        }
    }
    filenames = loaded;
    hashes.resize(j);

    if (!numlumps)
        I_Error ("W_InitFiles: no files found");

    // [RH] Set namespace markers to global for everything
    for (i = 0; i < numlumps; i++)
        lumpinfo[i].namespc = ns_global;

    // [RH] Merge sprite and flat groups.
    //		(We don't need to bother with patches, since
    //		Doom doesn't use markers to identify them.)
    W_MergeLumps ("S_START", "S_END", ns_sprites); // denis - fixme - security
    W_MergeLumps ("F_START", "F_END", ns_flats);
    W_MergeLumps ("C_START", "C_END", ns_colormaps);

    // set up caching
    if(lumpcache)
        free(lumpcache);

    size = numlumps * sizeof(*lumpcache);
    lumpcache = (void **)Malloc (size);

    if (!lumpcache)
        I_Error ("Couldn't allocate lumpcache");

    memset (lumpcache,0, size);

    return hashes;
}