XoxPlayers

@class BundleClasses : List
{
	const char* ext;
	int elen;
}

- initWith:(const char*) bext
{
	[super init];
	ext = bext;
	elen = strlen(ext);
	return self;
}

- loadFrom: (const char *) dirname 
{
    DIR *dir;
    struct direct *de;
    char path[MAXPATHLEN];
    char name[60];
	char *iptr;
	BOOL validName;

	if (!ext || !len) return nil;

	dir = opendir(dirname);
	if (dir == NULL)
	{
		return self;
	}

	while ((de = readdir(dir)) != NULL)
	{
		int i, numstrings;
	
		// Ignore '.'-files (not really necessary, I guess)
		if (de->d_name[0] == '.')
			continue;

		validName = NO;
		if (de->d_namlen > elen && 
				!strcmp(&de->d_name[de->d_namlen-elen], ext))
		{
			validName = YES;
		}

		if (!validName) continue;


		// check if the name matches a module already loaded
		numstrings = [gameList count];
		strcpy(name, de->d_name);

		// Smash out the '.' in "Foo.ext"
		if (iptr = rindex(name, '.'))
			*iptr = '\0';
		
		sprintf(path,"%s/%s.XoX",dirname,name);
		
		m = [[GameInfo alloc] 
			initWithScenario:NULL name:name path:path];
	    [gameList addObject: m];
	}

    closedir(dir);

    return self;
}

- setupGameBrowser
{
	id theMatrix;
	char buf[MAXPATHLEN];
	const char *ptr;

	strcpy( buf, NXHomeDirectory());
	strcat( buf, "/Library/XoxGames");

	gameList = [[GameList alloc] init];

	[self loadGamesFrom:buf];
	ptr = NXGetDefaultValue([NXApp appName], "altGamePath");
	if (ptr) [self loadGamesFrom:ptr];
	[self loadGamesFrom: [[NXBundle mainBundle] directory]];
	[self loadGamesFrom: "/LocalLibrary/XoxGames"];


	return self;
}

			do
			{
				NXBundle *myBundle = [[NXBundle allocFromZone:bundleZone]
					initForDirectory:[gi path]];

				theClass = [myBundle classNamed:[gi scenarioName]];

				if (theClass)
				{
					theScenario = [[theClass allocFromZone:scenarioZone] init];
				}
				else
				{
					[myBundle free];
				}

			} while ((!theClass) && [gi useNextPath]);
