/* ================ FS_AddGameDirectory Sets fs_gamedir, adds the directory to the head of the path, then loads and adds pak1.pak pak2.pak ... ================ */ void FS_AddGameDirectory (char *dir) { int i; searchpath_t *search; pack_t *pak; char pakfile[MAX_OSPATH]; strcpy (fs_gamedir, dir); // // add the directory to the search path // search = Z_Malloc (sizeof(searchpath_t)); strcpy (search->filename, dir); search->next = fs_searchpaths; fs_searchpaths = search; // // add any pak files in the format pak0.pak pak1.pak, ... // for (i=0; i<10; i++) { Com_sprintf (pakfile, sizeof(pakfile), "%s/pak%i.pak", dir, i); pak = FS_LoadPackFile (pakfile); if (!pak) continue; search = Z_Malloc (sizeof(searchpath_t)); search->pack = pak; search->next = fs_searchpaths; fs_searchpaths = search; } }
/* ================ FS_AddGameDirectory Sets fs_gamedir, adds the directory to the head of the path, then loads and adds pak1.pak pak2.pak ... ================ */ void FS_AddGameDirectory(char *dir) { int i; searchpath_t *search; pack_t *pak; char pakfile[MAX_OSPATH]; //VoiD -S- *.pak support //char *path = NULL; char findname[1024]; char **dirnames; int ndirs; char *tmp; //VoiD -E- *.pack support strcpy(fs_gamedir, dir); // // add the directory to the search path // search = Z_Malloc(sizeof(searchpath_t)); strcpy(search->filename, dir); search->next = fs_searchpaths; fs_searchpaths = search; // // add any pak files in the format pak0.pak pak1.pak, ... // for (i = 0; i < 100; i++) // Knightmare- go up to pak99 { Com_sprintf(pakfile, sizeof(pakfile), "%s/pak%i.pak", dir, i); pak = FS_LoadPackFile(pakfile); if (!pak) continue; search = Z_Malloc(sizeof(searchpath_t)); search->pack = pak; search->next = fs_searchpaths; fs_searchpaths = search; } //VoiD -S- *.pack support //qb: from BES 3.22 // Standard Quake II pack file '.pak' Com_sprintf(findname, sizeof(findname), "%s/%s", dir, "*.pak"); //qb: was a typo in BES, ".pak" (no asterisk) tmp = findname; while (*tmp != 0) { if (*tmp == '\\') *tmp = '/'; tmp++; } if ((dirnames = FS_ListFiles(findname, &ndirs, 0, 0)) != 0) { int i; for (i = 0; i < ndirs - 1; i++) { if (strrchr(dirnames[i], '/')) { pak = FS_LoadPackFile(dirnames[i]); if (!pak) continue; search = Z_Malloc(sizeof(searchpath_t)); search->pack = pak; search->next = fs_searchpaths; fs_searchpaths = search; } free(dirnames[i]); } free(dirnames); } //VoiD -E- *.pack support }
static void FS_LoadPaks (const char *dir, const char *ext) { int i; int total; int totalpaks; size_t pakmatchlen; char pakfile[MAX_OSPATH]; char pakmatch[MAX_OSPATH]; char *s; char *filenames[4096]; int pakfiles[1024]; pack_t *pak; searchpath_t *search; //r1: load all *.pak files Com_sprintf (pakfile, sizeof(pakfile), "%s/*.%s", dir, ext); Com_sprintf (pakmatch, sizeof(pakmatch), "%s/pak", dir); pakmatchlen = strlen(pakmatch); total = 0; totalpaks = 0; if ((s = Sys_FindFirst (pakfile, 0, SFF_SUBDIR | SFF_HIDDEN | SFF_SYSTEM)) != NULL) { while (s) { i = (int)strlen (s); if (*(s+(i-4)) == '.' && !Q_stricmp (s+(i-3), ext)) { if (!Q_strncasecmp (s, pakmatch, pakmatchlen)) { pakfiles[totalpaks++] = atoi(s+pakmatchlen); } else { filenames[total++] = strdup(s); //filenames[total] = alloca(strlen(s)+1); //strcpy (filenames[total], s); //total++; } } s = Sys_FindNext (0, SFF_SUBDIR | SFF_HIDDEN | SFF_SYSTEM); } } Sys_FindClose (); //sort for filenames designed to override earlier pak files qsort (filenames, total, sizeof(filenames[0]), filecmp); qsort (pakfiles, totalpaks, sizeof(pakfiles[0]), pakcmp); //r1: load pak*.pak first for (i = 0; i < totalpaks; i++) { Com_sprintf (pakfile, sizeof(pakfile), "%s/pak%d.%s", dir, pakfiles[i], ext); pak = FS_LoadPackFile (pakfile, ext); if (pak) { search = Z_TagMalloc (sizeof(searchpath_t), TAGMALLOC_SEARCHPATH); search->pack = pak; search->filename[0] = 0; search->next = fs_searchpaths; fs_searchpaths = search; } } //now the rest of them for (i = 0; i < total; i++) { pak = FS_LoadPackFile (filenames[i], ext); if (pak) { search = Z_TagMalloc (sizeof(searchpath_t), TAGMALLOC_SEARCHPATH); search->pack = pak; search->filename[0] = 0; search->next = fs_searchpaths; fs_searchpaths = search; } free (filenames[i]); } }