Example #1
0
void FS_CopyFiles(const char *srcMask, const char *dstDir)
{
	FSLog->Printf("CopyFiles(%s->%s)\n", srcMask, dstDir);

	TString<256> Base; Base.filename(srcMask);
	char *s = Base.rchr('/');
	if (!s) s = Base;
	else s++;								// will point to mask start

	// prepare dst string: should ends with '/'
	TString<256> Pattern; Pattern.filename(dstDir);
	int pos = Pattern.len();
	if (!pos || Pattern[pos - 1] != '/')
		Pattern[pos++] = '/';

	appMakeDirectoryForFile(Pattern);
#if 1
	CFileList *list = new CFileList;
	appListDirectory(srcMask, *list, FS_FILE);
#else
	CFileList *list = GFileSystem->List(srcMask, FS_OS);
#endif
	for (TListIterator<CFileItem> it = *list; it; ++it)
	{
		strcpy(s, it->name);				// create source filename
		strcpy(Pattern + pos, it->name);	// create destination filename
		FS_CopyFile(Base, Pattern);
	}
	delete list;
}
Example #2
0
	// return "true" when game was changed
	bool SetGameDir(const char *name)
	{
		guard(CQuakeFileSystem::SetGameDir);

		FSLog->Printf("Set gamedir: %s\n", name);
		if (!name[0]) name = BASEDIRNAME;
		if (!stricmp(GameDir, name))
			return false;				// not changed
		// check directory
		CFileList *list = List(va("./%s/*", name), FS_DIR|FS_FILE|FS_OS, NULL);
		bool empty = !(*list);
		delete list;
		if (empty)
		{
			appWPrintf("Invalid game directory: %s\n", name);
			return false;
		}
		if (GameDir != BASEDIRNAME)		// base dir not umounted
		{
			Umount(va("./%s/*." PAK_EXTENSION, *GameDir));
			if (fs_cddir->string[0])
				Umount(va("%s/%s/*." PAK_EXTENSION, fs_cddir->string, *GameDir));
		}
		GameDir.filename(name);
		GDefMountPoint = GameDir;
		if (GameDir != BASEDIRNAME)		// do not remount base dir
			MountGame(name);

		return true;

		unguard;
	}
Example #3
0
static sfx_t *S_FindName(const char *name, bool create)
{
	guard(S_FindName);

	int		i;
	sfx_t	*sfx;

	if (!name)		appError("NULL name\n");
	if (!name[0])	appError("empty name\n");
	if (strlen(name) >= MAX_QPATH) appError("Sound name too long: %s", name);

	TString<MAX_QPATH> Filename;
	Filename.filename(name);

	// see if already loaded
	for (i = 0, sfx = known_sfx; i < num_sfx; i++, sfx++)
		if (sfx->Name == Filename)
			return sfx;

	if (!create)
		return NULL;

	// find a free sfx
	for (i = 0, sfx = known_sfx; i < num_sfx; i++, sfx++)
		if (!sfx->Name[0])
			break;

	if (i == num_sfx)
	{
		// not found
		if (num_sfx == MAX_SFX)
		{
#if 0
			appError("too much sfx records");
#else
			Com_DPrintf("too much sfx records\n");
			return NULL;
#endif
		}
		// alloc next free record
		num_sfx++;
	}

	memset(sfx, 0, sizeof(*sfx));
	sfx->Name = Filename;
	sfx->registration_sequence = s_registration_sequence;
	return sfx;

	unguard;
}
Example #4
0
	// support for checking for file current mod dir, then BASEDIRNAME
	void CheckFilename(const char *name)
	{
		Name2[0] = 0;
		TString<256> Name; Name.filename(name);
		if (Name[0] == '.' && Name[1] == '/')
		{
			// absolute path - only 1 name
			Name1 = Name;
			return;
		}
		Name1.sprintf("./%s/%s", *GameDir, *Name);
		if (!stricmp(GameDir, BASEDIRNAME)) return;	// mod == BASEDIRNAME
		Name2.sprintf("./" BASEDIRNAME "/%s", *Name);
	}
Example #5
0
void FS_RemoveFiles(const char *mask)
{
	FSLog->Printf(va("RemoveFiles(%s)\n", mask));

	TString<256> Base; Base.filename(mask);
	char *s = Base.rchr('/');
	if (!s) s = Base;
	else s++;								// will point to mask start

#if 1
	CFileList *list = new CFileList;
	appListDirectory(mask, *list, FS_FILE);
#else
	CFileList *list = GFileSystem->List(mask, FS_OS);
#endif
	for (TListIterator<CFileItem> it = *list; it; ++it)
	{
		strcpy(s, it->name);				// create full filename
		remove(Base);
	}
	delete list;
}
Example #6
0
static char *ScanForCD()
{
#ifdef CD_PATH
	static TString<MAX_OSPATH> CdDir;
	static char drive[4] = "c:/";

	// no abort/retry/fail errors
	SetErrorMode(SEM_FAILCRITICALERRORS);

	// scan the drives
	for (drive[0] = 'c'; drive[0] <= 'z'; drive[0]++)
	{
		if (GetDriveType(drive) != DRIVE_CDROM) continue;
		if (FILE *f = fopen(va("%s"CD_CHECK, drive), "r"))
		{
			fclose(f);
			CdDir.filename(va("%s"CD_PATH, drive));
			return CdDir;
		}
	}
#endif
	return NULL;
}
Example #7
0
// false when: a) no skin file b) absent one of skin shaders
static bool SetMd3Skin(const char *skinName, CModelSkin &skin)
{
	// load skin file
	TString<MAX_QPATH> Filename;
	Filename.sprintf("models/players/%s.skin", skinName);
	char	*buf;
	if (!(buf = (char*) GFileSystem->LoadFile(Filename)))
	{
		Com_DPrintf("no skin: %s\n", *Filename);
		return false;
	}

	// parse skin
	memset(&skin, 0, sizeof(skin));
	bool result = true;
	CSimpleParser text;
	text.InitFromBuf(buf);

	int numSurfs = 0;
	while (const char *line = text.GetLine())
	{
		const char *p = strchr(line, ',');
		if (!p || !p[1]) continue;		// no shader
		// check/load shader

		// special processing of "nodraw" shader
		const char *n = strrchr(p+1, '/');
		if (n) n++; else n = p+1;
		if (!strnicmp(n, "nodraw", 6) && (n[6] == 0 || n[6] == '.'))	// "nodraw" or "nodraw.ext"
		{
			Com_DPrintf("nodraw for %s/%s\n", skinName, line);
			continue;
		}

		CBasicImage *shader = RE_RegisterSkin(p+1);
		if (!shader)
		{
			// code based on gl_trimodel.cpp::SetMd3Skin()
			TString<64> MName;			// new skin name
			// try to find skin forcing model directory
			MName.filename(Filename);
			char *mPtr = MName.rchr('/');
			if (mPtr)	mPtr++;			// skip '/'
			else		mPtr = MName;

			const char *sPtr = strrchr(p+1, '/');
			if (sPtr)	sPtr++;			// skip '/'
			else		sPtr = p+1;

			strcpy(mPtr, sPtr);		// make "modelpath/skinname"
			shader = RE_RegisterSkin(MName, true);
		}
		if (numSurfs >= ARRAY_COUNT(skin.surf))
		{
			appWPrintf("Too much skin surfaces in %s\n", skinName);
			result = false;
			break;
		}
		// store info
		skin.surf[numSurfs].Name.toLower(line, p-line+1);
		skin.surf[numSurfs].shader = shader;
//		appPrintf("%s %d : [%s] <- %s\n", skinName, numSurfs, *skin.surf[numSurfs].Name, *shader->Name);
		numSurfs++;
	}
	if (result)
		skin.numSurfs = numSurfs;

	delete buf;

	return result;
}