示例#1
0
文件: config.cpp 项目: paud/d2x-xl
int ReadConfigFile()
{
	CFILE cf;
	char line[80], *token, *value, *ptr;
	ubyte gamma;
	int joy_axis_min[7];
	int joy_axis_center[7];
	int joy_axis_max[7];
	int i;

	strcpy( gameConfig.szLastPlayer, "" );

	joy_axis_min[0] = joy_axis_min[1] = joy_axis_min[2] = joy_axis_min[3] = 0;
	joy_axis_max[0] = joy_axis_max[1] = joy_axis_max[2] = joy_axis_max[3] = 0;
	joy_axis_center[0] = joy_axis_center[1] = joy_axis_center[2] = joy_axis_center[3] = 0;
	JoySetCalVals(joy_axis_min, joy_axis_center, joy_axis_max);
	gameConfig.nDigiVolume = 8;
	gameConfig.nMidiVolume = 8;
	gameConfig.nRedbookVolume = 8;
	gameConfig.nControlType = 0;
	gameConfig.bReverseChannels = 0;

	//set these here in case no cfg file
	bHiresMoviesSave = gameOpts->movies.bHires;
	bRedbookEnabledSave = gameStates.sound.bRedbookEnabled;

	if (!CFOpen (&cf, "descent.cfg", gameFolders.szConfigDir, "rt", 0)) {
		return 1;
	}
	while (!CFEoF(&cf)) {
		memset (line, 0, 80);
		CFGetS (line, 80, &cf);
		ptr = &line [0];
		while (::isspace (*ptr))
			ptr++;
		if (*ptr != '\0') {
			token = strtok (ptr, "=");
			value = strtok (NULL, "=");
			if (!(value && token)) {
				PrintLog ("configuration file (descent.cfg) looks messed up.\n");
				continue;
				}
			if (value[strlen(value)-1] == '\n')
				value[strlen(value)-1] = 0;
			if (!strcmp(token, pszDigiVolume))
				gameConfig.nDigiVolume = (ubyte) strtol(value, NULL, 10);
			else if (!strcmp(token, pszMidiVolume))
				gameConfig.nMidiVolume = (ubyte) strtol(value, NULL, 10);
			else if (!strcmp(token, pszRedbookEnabled))
				gameStates.sound.bRedbookEnabled = bRedbookEnabledSave = strtol(value, NULL, 10);
			else if (!strcmp(token, pszRedbookVolume))
				gameConfig.nRedbookVolume = (ubyte) strtol(value, NULL, 10);
			else if (!strcmp(token, pszStereoRev))
				gameConfig.bReverseChannels = (ubyte) strtol(value, NULL, 10);
			else if (!strcmp(token, pszGammaLevel)) {
				gamma = (ubyte) strtol(value, NULL, 10);
				GrSetPaletteGamma( gamma );
			}
			else if (!strcmp(token, pszDetailLevel)) {
				gameStates.app.nDetailLevel = strtol(value, NULL, 10);
				if (gameStates.app.nDetailLevel == NUM_DETAIL_LEVELS-1) {
					int count,dummy,oc,od,wd,wrd,da,sc;

					count = sscanf (value, "%d,%d,%d,%d,%d,%d,%d\n",&dummy,&oc,&od,&wd,&wrd,&da,&sc);

					if (count == 7) {
						gameStates.render.detail.nObjectComplexity = oc;
						gameStates.render.detail.nObjectDetail = od;
						gameStates.render.detail.nWallDetail = wd;
						gameStates.render.detail.nWallRenderDepth = wrd;
						gameStates.render.detail.nDebrisAmount = da;
						gameStates.sound.nSoundChannels = sc;
						InitCustomDetails();
					}
				  #ifdef PA_3DFX_VOODOO   // Set to highest detail because you can't change em
					   gameStates.render.detail.nObjectComplexity=gameStates.render.detail.nObjectDetail=gameStates.render.detail.nWallDetail=
						gameStates.render.detail.nWallRenderDepth=gameStates.render.detail.nDebrisAmount=SoundChannels = NUM_DETAIL_LEVELS-1;
						gameStates.app.nDetailLevel=NUM_DETAIL_LEVELS-1;
						InitCustomDetails();
					#endif
				}
			}
			else if (!strcmp(token, pszJoystickMin))	{
				sscanf( value, "%d,%d,%d,%d", &joy_axis_min[0], &joy_axis_min[1], &joy_axis_min[2], &joy_axis_min[3] );
			}
			else if (!strcmp(token, pszJoystickMax))	{
				sscanf( value, "%d,%d,%d,%d", &joy_axis_max[0], &joy_axis_max[1], &joy_axis_max[2], &joy_axis_max[3] );
			}
			else if (!strcmp(token, pszJoystickCen))	{
				sscanf( value, "%d,%d,%d,%d", &joy_axis_center[0], &joy_axis_center[1], &joy_axis_center[2], &joy_axis_center[3] );
			}
			else if (!strcmp(token, pszLastPlayer))	{
				char * p;
				strncpy( gameConfig.szLastPlayer, value, CALLSIGN_LEN );
				p = strchr( gameConfig.szLastPlayer, '\n');
				if ( p ) *p = 0;
			}
			else if (!strcmp(token, pszLastMission))	{
				char * p;
				strncpy( gameConfig.szLastMission, value, MISSION_NAME_LEN );
				p = strchr( gameConfig.szLastMission, '\n');
				if ( p ) *p = 0;
			} else if (!strcmp(token, pszVrType)) {
				gameConfig.vrType = strtol(value, NULL, 10);
			} else if (!strcmp(token, pszVrResolution)) {
				gameConfig.vrResolution = strtol(value, NULL, 10);
			} else if (!strcmp(token, pszVrTracking)) {
				gameConfig.vrTracking = strtol(value, NULL, 10);
			} else if (!strcmp(token, pszHiresMovies)) {
				bHiresMoviesSave = gameOpts->movies.bHires = strtol(value, NULL, 10);
			}
		}
	}
	CFClose(&cf);
	JoySetCalVals(joy_axis_min, joy_axis_center, joy_axis_max);
	i = FindArg( "-volume" );

	if ( i > 0 )	{
		i = atoi( pszArgList[i+1] );
		if ( i < 0 ) i = 0;
		if ( i > 100 ) i = 100;
		gameConfig.nDigiVolume = (i*8)/100;
		gameConfig.nMidiVolume = (i*8)/100;
		gameConfig.nRedbookVolume = (i*8)/100;
	}

	if ( gameConfig.nDigiVolume > 8 ) gameConfig.nDigiVolume = 8;
	if ( gameConfig.nMidiVolume > 8 ) gameConfig.nMidiVolume = 8;
	if ( gameConfig.nRedbookVolume > 8 ) gameConfig.nRedbookVolume = 8;

	DigiMidiVolume( (gameConfig.nDigiVolume*32768)/8, (gameConfig.nMidiVolume*128)/8 );
/*
	//printf( "DigiDeviceID: 0x%x\n", digi_driver_board );
	//printf( "DigiPort: 0x%x\n", digi_driver_port		);
	//printf( "DigiIrq: 0x%x\n",  digi_driver_irq		);
	//printf( "DigiDma: 0x%x\n",	digi_driver_dma	);
	//printf( "MidiDeviceID: 0x%x\n", digi_midiType	);
	//printf( "MidiPort: 0x%x\n", digi_midi_port		);
  	KeyGetChar();
*/

	/*gameConfig.nMidiType = digi_midiType;
	gameConfig.nDigiType = digi_driver_board;
	gameConfig.nDigiDMA = digi_driver_dma;*/

#if 0
	if (digi_driver_board_16 > 0 && !FindArg("-no16bit") && digi_driver_board_16 != _GUS_16_ST) {
		digi_driver_board = digi_driver_board_16;
		digi_driver_dma = digi_driver_dma_16;
	}

	// HACK!!!
	//Hack to make some cards look like others, such as
	//the Crytal Lake look like Microsoft Sound System
	if ( digi_driver_board == _CRYSTAL_LAKE_8_ST )	{
		ubyte tmp;
		tmp = CrystalLakeReadMCP( CL_MC1 );
		if ( !(tmp & 0x80) )
			atexit( CrystalLakeSetSB );		// Restore to SB when done.
	 	CrystalLakeSetWSS();
		digi_driver_board = _MICROSOFT_8_ST;
	} else if ( digi_driver_board == _CRYSTAL_LAKE_16_ST )	{
		ubyte tmp;
		tmp = CrystalLakeReadMCP( CL_MC1 );
		if ( !(tmp & 0x80) )
			atexit( CrystalLakeSetSB );		// Restore to SB when done.
	 	CrystalLakeSetWSS();
		digi_driver_board = _MICROSOFT_16_ST;
	} else if ( digi_driver_board == _AWE32_8_ST )	{
		digi_driver_board = _SB16_8_ST;
	} else if ( digi_driver_board == _AWE32_16_ST )	{
		digi_driver_board = _SB16_16_ST;
	} else
		digi_driver_board		= digi_driver_board;
#else
	if (CFOpen (&cf, "descentw.cfg", gameFolders.szConfigDir, "rt", 0)) {
		while (!CFEoF(&cf)) {
			memset(line, 0, 80);
			CFGetS(line, 80, &cf);
			ptr = &(line[0]);
			while (::isspace(*ptr))
				ptr++;
			if (*ptr != '\0') {
				token = strtok(ptr, "=");
				value = strtok(NULL, "=");
				if (!(value && token)) {
					PrintLog ("configuration file (descentw.cfg) looks messed up.\n");
					continue;
					}
				if (value[strlen(value)-1] == '\n')
					value[strlen(value)-1] = 0;
				if (!strcmp(token, pszJoystickMin))	{
					sscanf( value, "%d,%d,%d,%d,%d,%d,%d", &joy_axis_min[0], &joy_axis_min[1], &joy_axis_min[2], &joy_axis_min[3], &joy_axis_min[4], &joy_axis_min[5], &joy_axis_min[6] );
				}
				else if (!strcmp(token, pszJoystickMax))	{
					sscanf( value, "%d,%d,%d,%d,%d,%d,%d", &joy_axis_max[0], &joy_axis_max[1], &joy_axis_max[2], &joy_axis_max[3], &joy_axis_max[4], &joy_axis_max[5], &joy_axis_max[6] );
				}
				else if (!strcmp(token, pszJoystickCen))	{
					sscanf( value, "%d,%d,%d,%d,%d,%d,%d", &joy_axis_center[0], &joy_axis_center[1], &joy_axis_center[2], &joy_axis_center[3], &joy_axis_center[4], &joy_axis_center[5], &joy_axis_center[6] );
				}
			}
		}
		CFClose(&cf);
	}
#endif

	return 0;
}
示例#2
0
int ReadConfigFile()
{
	FILE *infile;
	char line[80], *token, *value, *ptr;
	ubyte gamma;
	int joy_axis_min[4];
	int joy_axis_center[4];
	int joy_axis_max[4];
	int i;

	strcpy( config_last_player, "" );

	joy_axis_min[0] = joy_axis_min[1] = joy_axis_min[2] = joy_axis_min[3] = 0;
	joy_axis_max[0] = joy_axis_max[1] = joy_axis_max[2] = joy_axis_max[3] = 0;
	joy_axis_center[0] = joy_axis_center[1] = joy_axis_center[2] = joy_axis_center[3] = 0;
	joy_set_cal_vals(joy_axis_min, joy_axis_center, joy_axis_max);

	digi_driver_board = 0;
	digi_driver_port = 0;
	digi_driver_irq = 0;
	digi_driver_dma = 0;

	digi_midi_type = 0;
	digi_midi_port = 0;

	Config_digi_volume = 4;
	Config_midi_volume = 4;
	Config_control_type = 0;
	Config_channels_reversed = 0;

	infile = fopen("descent.cfg", "rt");
	if (infile == NULL) {
		return 1;
	}
	while (!feof(infile)) {
		memset(line, 0, 80);
		fgets(line, 80, infile);
		ptr = &(line[0]);
		while (isspace(*ptr))
			ptr++;
		if (*ptr != '\0') {
			token = strtok(ptr, "=");
			value = strtok(NULL, "=");
			if (!strcmp(token, digi_dev_str))
				digi_driver_board = strtol(value, NULL, 16);
			else if (!strcmp(token, digi_port_str))
				digi_driver_port = strtol(value, NULL, 16);
			else if (!strcmp(token, digi_irq_str))
				digi_driver_irq = strtol(value, NULL, 10);
			else if (!strcmp(token, digi_dma_str))
				digi_driver_dma = strtol(value, NULL, 10);
			else if (!strcmp(token, digi_volume_str))
				Config_digi_volume = strtol(value, NULL, 10);
			else if (!strcmp(token, midi_dev_str))
				digi_midi_type = strtol(value, NULL, 16);
			else if (!strcmp(token, midi_port_str))
				digi_midi_port = strtol(value, NULL, 16);
			else if (!strcmp(token, midi_volume_str))
				Config_midi_volume = strtol(value, NULL, 10);
			else if (!strcmp(token, stereo_rev_str))
				Config_channels_reversed = strtol(value, NULL, 10);
			else if (!strcmp(token, gamma_level_str)) {
				gamma = strtol(value, NULL, 10);
				gr_palette_set_gamma( gamma );
			}
			else if (!strcmp(token, detail_level_str)) {
				Detail_level = strtol(value, NULL, 10);
				if (Detail_level == NUM_DETAIL_LEVELS-1) {
					int count,dummy,oc,od,wd,wrd,da,sc;

					count = sscanf (value, "%d,%d,%d,%d,%d,%d,%d\n",&dummy,&oc,&od,&wd,&wrd,&da,&sc);

					if (count == 7) {
						Object_complexity = oc;
						Object_detail = od;
						Wall_detail = wd;
						Wall_render_depth = wrd;
						Debris_amount = da;
						SoundChannels = sc;
						set_custom_detail_vars();
					}
				}
			}
			else if (!strcmp(token, joystick_min_str))	{
				sscanf( value, "%d,%d,%d,%d", &joy_axis_min[0], &joy_axis_min[1], &joy_axis_min[2], &joy_axis_min[3] );
			} 
			else if (!strcmp(token, joystick_max_str))	{
				sscanf( value, "%d,%d,%d,%d", &joy_axis_max[0], &joy_axis_max[1], &joy_axis_max[2], &joy_axis_max[3] );
			}
			else if (!strcmp(token, joystick_cen_str))	{
				sscanf( value, "%d,%d,%d,%d", &joy_axis_center[0], &joy_axis_center[1], &joy_axis_center[2], &joy_axis_center[3] );
			}
			else if (!strcmp(token, last_player_str))	{
				char * p;
				strncpy( config_last_player, value, CALLSIGN_LEN );
				p = strchr( config_last_player, '\n');
				if ( p ) *p = 0;
			}
			else if (!strcmp(token, last_mission_str))	{
				char * p;
				strncpy( config_last_mission, value, MISSION_NAME_LEN );
				p = strchr( config_last_mission, '\n');
				if ( p ) *p = 0;
			} else if (!strcmp(token, config_vr_type_str)) {
				Config_vr_type = strtol(value, NULL, 10);
			} else if (!strcmp(token, config_vr_tracking_str)) {
				Config_vr_tracking = strtol(value, NULL, 10);
			}
		}
	}

	fclose(infile);

	i = FindArg( "-volume" );
	
	if ( i > 0 )	{
		i = atoi( Args[i+1] );
		if ( i < 0 ) i = 0;
		if ( i > 100 ) i = 100;
		Config_digi_volume = (i*8)/100;
		Config_midi_volume = (i*8)/100;
	}

	if ( Config_digi_volume > 8 ) Config_digi_volume = 8;

	if ( Config_midi_volume > 8 ) Config_midi_volume = 8;

	joy_set_cal_vals(joy_axis_min, joy_axis_center, joy_axis_max);
	digi_set_volume( (Config_digi_volume*32768)/8, (Config_midi_volume*128)/8 );
/*
	printf( "DigiDeviceID: 0x%x\n", digi_driver_board );
	printf( "DigiPort: 0x%x\n", digi_driver_port		);
	printf( "DigiIrq: 0x%x\n",  digi_driver_irq		);
	printf( "DigiDma: 0x%x\n",	digi_driver_dma	);
	printf( "MidiDeviceID: 0x%x\n", digi_midi_type	);
	printf( "MidiPort: 0x%x\n", digi_midi_port		);
  	key_getch();
*/

	Config_midi_type = digi_midi_type;
	Config_digi_type = digi_driver_board;

	// HACK!!! 
	//Hack to make the Crytal Lake look like Microsoft Sound System
	if ( digi_driver_board == 0xe200 )	{
		ubyte tmp;
		tmp = CrystalLakeReadMCP( CL_MC1 );
		if ( !(tmp & 0x80) )
			atexit( CrystalLakeSetSB );		// Restore to SB when done.
	 	CrystalLakeSetWSS();
		digi_driver_board = 0;//_MICROSOFT_8_ST;<was this microsoft thing, but its irrelevant, because we have no sound here yet,being that its also undefined, I set it to 0 -KRB
	}

	return 0;
}