Ejemplo n.º 1
0
void savemap(void)
{
    FILE *handle;
    int c;

    enterfilename("SAVE MAP", mapname);
    if (!strlen(mapname)) return;
    handle = fopen(mapname, "wb");
    if (!handle) return;
    /* Write map header */
    fwrite(&map, sizeof(MAPHEADER), 1, handle);
    /* Write each layer */
    for (c = 0; c < MAX_LAYERS; c++)
    {
        fwritele32(handle, layer[c].xsize);
        fwritele32(handle, layer[c].ysize);
        fwrite8(handle, layer[c].xdivisor);
        fwrite8(handle, layer[c].ydivisor);
        fwrite8(handle, layer[c].xwrap);
        fwrite8(handle, layer[c].ywrap);
        if ((layer[c].xsize) && (layer[c].ysize))
        {
            int d;
            for (d = 0; d < layer[c].xsize * layer[c].ysize; d++)
            {
                fwritele16(handle, map_layerdataptr[c][d]);
            }
        }
    }
    fclose(handle);
}
Ejemplo n.º 2
0
int main(int argc, char **argv)
{
    FILE *datafile, *listfile;
    int c;

    if (argc < 3)
    {
        printf("Usage: DATAFILE <datafile> <filelistfile>\n\n"
               "The purpose of this program is to gather many files into one datafile, like\n"
               "usually seen in games. The files can be read by BME's IO functions after\n"
               "opening the datafile first with io_opendatafile(). The filelistfile must\n"
               "contain name (use only 8+3 chars) of each file on its own row, for example:\n\n"
               "editor.spr\n"
               "fonts.spr\n");
        return 0;
    }
    listfile = fopen(argv[2], "rt");
    if (!listfile)
    {
        printf("ERROR: Couldn't open filelist.\n");
        return 1;
    }
    datafile = fopen(argv[1], "wb");
    if (!datafile)
    {
        printf("ERROR: Couldn't create datafile.\n");
        fclose(listfile);
        return 1;
    }
    memset(&header[0], 0, MAXFILES * sizeof(HEADER));
    // Get names from list
    for (;;)
    {
        char searchname[64];
        int d;
        FILE *test;

        if (fscanf(listfile, "%63s", searchname) == EOF) break;
        test = fopen(searchname, "rb");
        if (test)
        {
            fclose(test);

            strcpy(fullname[files], searchname);

            for (c = strlen(fullname[files]) - 1; c >= 0; c--)
            {
                if (fullname[files][c] == '\\')
                {
                    c++;
                    break;
                }
            }
            if (c < 0) c = 0;
            memset(header[files].name, 0, 13);
            d = 0;
            while (fullname[files][c])
            {
                header[files].name[d] = toupper(fullname[files][c]);
                c++;
                d++;
            }
            files++;
            if (files == MAXFILES) break;
        }
        if (files == MAXFILES) break;
    }

    fclose(listfile);
    // Write datafile header
    fwrite("DAT!", 4, 1, datafile);
    fwritele32(datafile, files);
    // Write incomplete fileheaders
    for (c = 0; c < files; c++)
    {
        fwritele32(datafile, header[c].offset);
        fwritele32(datafile, header[c].length);
        fwrite(header[c].name, 13, 1, datafile);
    }
    // Process each file
    for (c = 0; c < files; c++)
    {
        printf("Adding %s...\n", header[c].name);
        if (!addfile(&header[c], datafile, fullname[c]))
        {
            printf("Terminating & deleting datafile...\n");
            fclose(datafile);
            remove(argv[1]);
            return 1;
        }
    }
    // Seek back to start & write correct headers
    fseek(datafile, sizeof files + 4, SEEK_SET);
    for (c = 0; c < files; c++)
    {
        fwritele32(datafile, header[c].offset);
        fwritele32(datafile, header[c].length);
        fwrite(header[c].name, 13, 1, datafile);
    }
    fclose(datafile);
    printf("Everything OK!\n");
    return 0;
}