diff --git a/qbsp/cmdlib.c b/qbsp/cmdlib.c
index 71a5ccd9..18390794 100644
--- a/qbsp/cmdlib.c
+++ b/qbsp/cmdlib.c
@@ -107,3 +107,20 @@ StripExtension(char *path)
if (length)
path[length] = 0;
}
+
+void
+StripFilename(char *path)
+{
+ int length;
+
+ length = strlen(path) - 1;
+ while (length > 0 && path[length] != PATHSEPERATOR)
+ length--;
+ path[length] = '\0';
+}
+
+int
+IsAbsolutePath(const char *path)
+{
+ return path[0] == '/' || (isalpha(path[0]) && path[1] == ':');
+}
diff --git a/qbsp/qbsp.c b/qbsp/qbsp.c
index 0d2d2313..496c0947 100644
--- a/qbsp/qbsp.c
+++ b/qbsp/qbsp.c
@@ -315,6 +315,7 @@ PrintOptions(void)
printf(" -nopercent Prevents output of percent completion information\n");
printf(" -leakdist [n] Space between leakfile points (default 2)\n");
printf(" -subdivide [n] Use different texture subdivision (default 240)\n");
+ printf(" -wadpath
Search this directory for wad files\n");
printf(" sourcefile .MAP file to process\n");
printf(" destfile .BSP file to output\n");
@@ -433,6 +434,12 @@ ParseOptions(char *szOptions)
Message(msgError, errInvalidOption, szTok);
options.dxSubdivide = atoi(szTok2);
szTok = szTok2;
+ } else if (!strcasecmp(szTok, "wadpath")) {
+ szTok2 = GetTok(szTok + strlen(szTok) + 1, szEnd);
+ if (!szTok2)
+ Message(msgError, errInvalidOption, szTok);
+ strcpy(options.wadPath, szTok2);
+ szTok = szTok2;
} else if (!strcasecmp(szTok, "?") || !strcasecmp(szTok, "help"))
PrintOptions();
else
@@ -467,7 +474,7 @@ InitQBSP(int argc, char **argv)
options.dxLeakDist = 2;
options.dxSubdivide = 240;
options.fVerbose = true;
- options.szMapName[0] = options.szBSPName[0] = 0;
+ options.szMapName[0] = options.szBSPName[0] = options.wadPath[0] = 0;
length = LoadFile("qbsp.ini", (void *)&szBuf, false);
if (length) {
@@ -509,6 +516,12 @@ InitQBSP(int argc, char **argv)
if (options.szBSPName[0] == 0)
strcpy(options.szBSPName, options.szMapName);
+ /* If no wadpath given, default to the map directory */
+ if (options.wadPath[0] == 0) {
+ strcpy(options.wadPath, options.szMapName);
+ StripFilename(options.wadPath);
+ }
+
// Remove already existing files
if (!options.fOnlyents) {
StripExtension(options.szBSPName);
diff --git a/qbsp/qbsp.h b/qbsp/qbsp.h
index 1417eca9..00fb98ec 100644
--- a/qbsp/qbsp.h
+++ b/qbsp/qbsp.h
@@ -163,6 +163,8 @@ double I_FloatTime(void);
void DefaultExtension(char *path, char *extension);
void StripExtension(char *path);
+void StripFilename(char *path);
+int IsAbsolutePath(const char *path);
char *copystring(char *s);
@@ -525,6 +527,7 @@ typedef struct options_s {
int dxLeakDist;
char szMapName[512];
char szBSPName[512];
+ char wadPath[512];
} options_t;
extern options_t options;
diff --git a/qbsp/wad.c b/qbsp/wad.c
index 801c3002..97b3ab4a 100644
--- a/qbsp/wad.c
+++ b/qbsp/wad.c
@@ -57,6 +57,8 @@ WADList_Init(wad_t **wads, char *wadstring)
int i, len, numwads;
wad_t *tmp, *w;
char *fname;
+ char *fpath;
+ int pathlen;
numwads = 0;
*wads = NULL;
@@ -83,14 +85,25 @@ WADList_Init(wad_t **wads, char *wadstring)
while (wadstring[i] != 0 && wadstring[i] != ';')
i++;
wadstring[i++] = 0;
- w->file = fopen(fname, "rb");
+
+ if (!options.wadPath[0] || IsAbsolutePath(fname))
+ fpath = copystring(fname);
+ else {
+ pathlen = strlen(options.wadPath) + strlen(fname) + 1;
+ fpath = AllocMem(OTHER, pathlen + 1, false);
+ sprintf(fpath, "%s/%s", options.wadPath, fname);
+ }
+ w->file = fopen(fpath, "rb");
if (w->file) {
+ if (options.fVerbose)
+ Message(msgLiteral, "Opened WAD: %s\n", fpath);
if (!WAD_LoadInfo(w)) {
- Message(msgWarning, warnNotWad, fname);
+ Message(msgWarning, warnNotWad, fpath);
fclose(w->file);
} else
w++;
}
+ FreeMem(fpath, OTHER, strlen(fpath) + 1);
}
/* Re-allocate just the required amount */