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); }
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; }