📄 menu.cpp
字号:
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 + -