⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			case	VK_RETURN:
				if(m_bOptionsOn == 1)
				{
					m_pClientDE->PlaySoundLocal("sounds/interface/MenuSelect3.wav", NULL, SOUNDPRIORITY_MISC_HIGH);
					m_bOptionsOn = 2;
					m_bOSSubItem = 0;
					m_bOSTopSubItem = 0;

					switch(m_bOSCategory)
					{
						case	9:
							m_bOSInputMode = 2;
							memset(m_szOSInputString, 0, SB_MAX_OS_STRING_SIZE);
							m_szOSInputString[0] = '_';
							m_bOSInputChar = 1;
							break;
						case	10:
						case	11:		LoadConfigList();					break;
						case	12:		if (!AcceptConfig()) 
											return 1;		
										break;
						case	13:		TermOptionsMenu(); 
										if (!BackOneLevel()) 
											return 1;
										break;
					}
				}
				else if(m_bOptionsOn == 2)
				{
					if(m_bOSCategory == 10)
					{
						LoadConfigFile(m_pOSSubItems[m_bOSCategory][m_bOSSubItem].string1, DFALSE);
						delete	m_pOSSubItems[m_bOSCategory];
						m_pOSSubItems[m_bOSCategory] = 0;
						m_bOptionsOn--;
					}
					else if(m_bOSCategory == 11)
					{
						DeleteConfigFile(m_pOSSubItems[m_bOSCategory][m_bOSSubItem].string1);
						delete	m_pOSSubItems[m_bOSCategory];
						m_pOSSubItems[m_bOSCategory] = 0;
						m_bOptionsOn--;
					}
					else if(m_pOSSubItems[m_bOSCategory][m_bOSSubItem].type == 6)
					{
						m_pClientDE->PlaySoundLocal("sounds/interface/MenuSelect3.wav", NULL, SOUNDPRIORITY_MISC_HIGH);

						if(m_pClientDE->StartDeviceTrack (DEVICETYPE_KEYBOARD, MAX_INPUT_BUFFER_SIZE) != LT_OK)
							{ m_pClientDE->EndDeviceTrack(); return 0; }

						m_bOSInputMode = 1;
					}
				}
				return	0;
		}

	// Set the volume controls
	m_pClientDE->SetSoundVolume(m_pOSSubItems[2][0].num1 * 10);
	m_pClientDE->SetMusicVolume(m_pOSSubItems[2][1].num1 * 10);

	// Set the Gamma
	char	tempStr[32];
	sprintf(tempStr, "\"gamma\" \"%f\"", 0.5f + (m_pOSSubItems[1][2].num1 / m_pOSSubItems[1][2].num2));
	m_pClientDE->RunConsoleString(tempStr);
	return	0;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CMenu::LoadConfigList()
//
//	PURPOSE:	
//
// ----------------------------------------------------------------------- //

char CMenu::LoadConfigList()
{
	FileEntry	*pfe = m_pClientDE->GetFileList("CFGFiles");
	FileEntry	*index = pfe;
	short		i, numFiles = 0;

	// Count the number of files
	while(index)	{ numFiles++; index = index->m_pNext; }

	m_pOSCategory[m_bOSCategory].num1 = numFiles;
	m_pOSSubItems[m_bOSCategory] = new OPTIONITEM[numFiles];

	index = pfe;
	for(i = 0; i < numFiles; i++)
	{
		SetupOption(m_pOSSubItems[m_bOSCategory][i], 1, index->m_pBaseFilename, 0, 0, 0, 1);
		index = index->m_pNext;
	}

	index = 0;
	m_pClientDE->FreeFileList(pfe);
	return	1;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CMenu::SaveConfigFile()
//
//	PURPOSE:	
//
// ----------------------------------------------------------------------- //

char CMenu::SaveConfigFile(DBOOL base)
{
	FILE	*file = 0;
	char	str1[128];
	char	*str2 = ".cfg";
	short	i, j, num;

	if(base)
		_mbscpy((unsigned char*)str1, (const unsigned char*)"blood2/");
	else
		_mbscpy((unsigned char*)str1, (const unsigned char*)"blood2/cfgfiles/");

	_mbscat((unsigned char*)str1, (const unsigned char*)m_szOSInputString);
	_mbscat((unsigned char*)str1, (const unsigned char*)str2);

	if(file = fopen(str1, "wb"))
	{
		short	version = OPTION_CFGFILE_VERSION;
		fwrite(&version, sizeof(short), 1, file);

		for(i = 0; i < 8; i++)
		{
			num = m_pOSCategory[i].num1;
			for(j = 0; j < num; j++)
			{
				fwrite(&(m_pOSSubItems[i][j].num1), sizeof(short), 1, file);
				fwrite(&(m_pOSSubItems[i][j].num2), sizeof(short), 1, file);
				fwrite(m_pOSSubItems[i][j].extra, sizeof(char), 64, file);
			}
		}
		fclose(file);
	}
	return	1;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CMenu::LoadConfigFile()
//
//	PURPOSE:	
//
// ----------------------------------------------------------------------- //

char CMenu::LoadConfigFile(char	*szFilename, DBOOL base)
{
	FILE	*file = 0;
	char	str1[128];
	short	i, j, num;

	if(base)
		_mbscpy((unsigned char*)str1, (const unsigned char*)"blood2/");
	else
		_mbscpy((unsigned char*)str1, (const unsigned char*)"blood2/cfgfiles/");

	_mbscat((unsigned char*)str1, (const unsigned char*)szFilename);

	if(file = fopen(str1, "rb"))
	{
		short	version;
		fread(&version, sizeof(short), 1, file);

		if(version != OPTION_CFGFILE_VERSION)
		{
			fclose(file);
			return	0;
		}

		for(i = 0; i < 8; i++)
		{
			num = m_pOSCategory[i].num1;
			for(j = 0; j < num; j++)
			{
				fread(&(m_pOSSubItems[i][j].num1), sizeof(short), 1, file);
				fread(&(m_pOSSubItems[i][j].num2), sizeof(short), 1, file);
				fread(m_pOSSubItems[i][j].extra, sizeof(char), 64, file);
			}
		}
		fclose(file);
	}
	else
		return	0;

	return	1;
}



// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CMenu::SortFileList()
//
//	PURPOSE:	sorts a file linked list, returns the sorted list.
//
// ----------------------------------------------------------------------- //

FileEntry* CMenu::SortFileList(FileEntry *pfe)
{

	FileEntry	*pfindex;
	FileEntry	*pfList[MAX_FILE_LIST];
	int nCount=0;


	// Build an array of FileEntries.
	pfindex = pfe;
	while (pfindex && nCount < MAX_FILE_LIST)
	{
		pfList[nCount++] = pfindex;
		pfindex = pfindex->m_pNext;
	}
	if (pfindex) // Free any remaining items
	{
		m_pClientDE->FreeFileList(pfindex);
	}

	for (int i = nCount / 2; i > 0; i = (i == 2) ? 1 : (int) (i / 2.2))
	{
		for (int j = i; j < nCount; j++)
		{
			FileEntry *pfTemp = pfList[j];
			
			for (int k = j; k >= i && _mbsicmp((const unsigned char*)pfTemp->m_pBaseFilename, (const unsigned char*)pfList[k - i]->m_pBaseFilename) < 0; k -= i)
			{
				pfList[k] = pfList[k - i];
			}

			pfList[k] = pfTemp;
		}
	}

	pfindex = pfList[0];
	for (i=1; i < nCount-1; i++)
	{
		pfindex->m_pNext = pfList[i];
		pfindex = pfindex->m_pNext;
	}
	pfindex->m_pNext = DNULL;

	return pfList[0];
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CMenu::DeleteConfigFile()
//
//	PURPOSE:	
//
// ----------------------------------------------------------------------- //

char CMenu::DeleteConfigFile(char *szFilename)
{
	char	str1[128] = "blood2/cfgfiles/";
	_mbscat((unsigned char*)str1, (const unsigned char*)szFilename);
	if(_mbscmp((const unsigned char*)szFilename, (const unsigned char*)"default.cfg"))	remove(str1);

	return	1;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CMenu::AcceptConfig()
//
//	PURPOSE:	
//
// ----------------------------------------------------------------------- //

DBOOL CMenu::AcceptConfig()
{
	char	tempStr[128];

	// Fill in the options structure for external use
	m_osOptions.m_bAlwaysRun		= (DBOOL)m_pOSSubItems[0][0].num1;
	m_osOptions.m_bViewCenter		= (DBOOL)m_pOSSubItems[0][1].num1;
	m_osOptions.m_bFreeLook			= (DBOOL)m_pOSSubItems[0][2].num1;
	m_osOptions.m_bCrosshair		= (DBOOL)m_pOSSubItems[0][3].num1;
	m_osOptions.m_bHeadBob			= (DBOOL)m_pOSSubItems[0][4].num1;
	m_osOptions.m_bDodging			= (DBOOL)m_pOSSubItems[0][5].num1;
	m_osOptions.m_bHideWeapon		= (DBOOL)m_pOSSubItems[0][6].num1;

	m_osOptions.m_bScreenSize		= (DBYTE)m_pOSSubItems[1][1].num1;

	m_osOptions.m_bMusicType		= (DBYTE)m_pOSSubItems[2][2].num1;
	m_osOptions.m_bSoundQuality		= (DBYTE)m_pOSSubItems[2][3].num1;
	m_osOptions.m_bVoices			= (DBOOL)m_pOSSubItems[2][4].num1;

	m_osOptions.m_bWeaponCycle0		= (DBYTE)m_pOSSubItems[3][0].num1;
	m_osOptions.m_bWeaponCycle1		= (DBYTE)m_pOSSubItems[3][1].num1;
	m_osOptions.m_bWeaponCycle2		= (DBYTE)m_pOSSubItems[3][2].num1;
	m_osOptions.m_bWeaponCycle3		= (DBYTE)m_pOSSubItems[3][3].num1;
	m_osOptions.m_bWeaponCycle4		= (DBYTE)m_pOSSubItems[3][4].num1;
	m_osOptions.m_bWeaponCycle5		= (DBYTE)m_pOSSubItems[3][5].num1;
	m_osOptions.m_bWeaponCycle6		= (DBYTE)m_pOSSubItems[3][6].num1;
	m_osOptions.m_bWeaponCycle7		= (DBYTE)m_pOSSubItems[3][7].num1;
	m_osOptions.m_bWeaponCycle8		= (DBYTE)m_pOSSubItems[3][8].num1;
	m_osOptions.m_bWeaponCycle9		= (DBYTE)m_pOSSubItems[3][9].num1;

	m_osOptions.m_fMouseSenseX		= 0.5f + (2.0f * ((float)m_pOSSubItems[6][0].num1 / (float)m_pOSSubItems[6][0].num2));
	m_osOptions.m_fMouseSenseY		= 0.5f + (2.0f * ((float)m_pOSSubItems[6][1].num1 / (float)m_pOSSubItems[6][1].num2));
	m_osOptions.m_bInvertMouseY		= (DBOOL)m_pOSSubItems[6][2].num1;

	m_osOptions.m_bEnableJoystick	= (DBOOL)m_pOSSubItems[7][0].num1;

	// Set the keyboard configuration
	for(short i = 0; i < 45; i++)
	{
		sprintf(tempStr, "rangebind \"keyboard\" \"%s\" 0 0 \"\"", m_pOSSubItems[5][i].extra);
		m_pClientDE->RunConsoleString(tempStr);

		if(m_pOSSubItems[5][i].num1)
		{
			sprintf(tempStr, "rangebind \"keyboard\" \"%s\" 0 0 \"%s\"",
				 m_pOSSubItems[5][i].extra, g_pActionName[m_pOSSubItems[5][i].num2]);
			m_pClientDE->RunConsoleString(tempStr);
		}
	}

	// Set the mouse configuration
	sprintf(tempStr, "scale \"mouse\" \"x-axis\" %f", m_osOptions.m_fMouseSenseX);
	m_pClientDE->RunConsoleString(tempStr);
	sprintf(tempStr, "scale \"mouse\" \"y-axis\" %f", m_osOptions.m_fMouseSenseY);
	m_pClientDE->RunConsoleString(tempStr);

	sprintf(tempStr, "rangebind \"mouse\" \"button 0\" 0 0 \"%s\"", g_pActionName[m_pOSSubItems[6][4].num1]);
	m_pClientDE->RunConsoleString(tempStr);
	sprintf(tempStr, "rangebind \"mouse\" \"button 1\" 0 0 \"%s\"", g_pActionName[m_pOSSubItems[6][5].num1]);
	m_pClientDE->RunConsoleString(tempStr);
	sprintf(tempStr, "rangebind \"mouse\" \"button 2\" 0 0 \"%s\"", g_pActionName[m_pOSSubItems[6][6].num1]);
	m_pClientDE->RunConsoleString(tempStr);

	// Change the graphics resolution and driver if it is different than the current one
	short	num = m_pOSSubItems[1][0].num1;

	if(num != m_curMode)
	{
		RMode	*modeIndex = m_pRModes;
		char	i, tempStr1[50] = "ResizeScreen ", tempStr2[10], tempStr3[10];

		for(i = 0; i < num; i++)
		{
			if (modeIndex)
			{
				modeIndex = modeIndex->m_pNext;
			}
		}

		if (modeIndex)
		{
			itoa(modeIndex->m_Width, tempStr2, 10);
			itoa(modeIndex->m_Height, tempStr3, 10);
			_mbscat((unsigned char*)tempStr1, (const unsigned char*)tempStr2);
			for(i = 9; i > 0; i--)		tempStr3[i] = tempStr3[i - 1];
			tempStr3[0] = ' ';
			_mbscat((unsigned char*)tempStr1, (const unsigned char*)tempStr3);

			m_pClientDE->RunConsoleString(tempStr1);
		}
	}

	// Save the current configuration for reload purposes
	memset(m_szOSInputString, 0, SB_MAX_OS_STRING_SIZE);
	_mbscpy((unsigned char*)m_szOSInputString, (const unsigned char*)"curb2cfg");
	SaveConfigFile(DTRUE);

	// Terminate the options menu and return control to the main menu
	TermOptionsMenu();
	return BackOneLevel();
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CMenu::StartAnim()
//
//	PURPOSE:	Records the animation's starting time for use in Animate()
//
// ----------------------------------------------------------------------- //

void CMenu::StartAnim()
{
	if (!m_pClientDE) return;

	// get the start time for the animation
	m_bSlideMenu = DTRUE;
	m_bRotateRings = DTRUE;
	m_nAnimStartTime = m_pClientDE->GetTime();
	m_fRingAngle1 = m_fRingAngle2 = m_fRingAngle3 = 0.0f;
	
	m_fDestRingAngle1 = fRingAngles1[0];
	m_fRingMoveDist1 = (DFLOAT)fabs(m_fDestRingAngle1 - m_fRingAngle1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -