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

📄 statusbar.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				if(m_bCSSelectState == 2)	LoadB2CFile(m_pCharFileIndex);
				if(m_bCSSelectState == 3)	DeleteB2CFile(m_pCharFileIndex);

				m_bCSSelectState = 0;
				m_pCharFileIndex = 0;
				m_pClientDE->FreeFileList(m_pCharFiles);
				m_pCharFiles = 0;
				return	1;

			case	VK_UP:
			case	VK_LEFT:
				return	HandleCharScreenLeft();

			case	VK_DOWN:
			case	VK_RIGHT:
				return	HandleCharScreenRight();
		}
		return	0;
	}

	if(m_bCSInputState)
	{
		if(m_bCSInputState == 1)	m_szCSInputString = m_szCSNameString;
			else					m_szCSInputString = m_szCSSaveFile;

		if(m_bCSInputChar < SB_MAX_CS_STRING_SIZE - 1)
		{
			if((key >= VK_0) && (key <= VK_9))
			{
				m_szCSInputString[m_bCSInputChar - 1] = key;
				m_szCSInputString[m_bCSInputChar++] = '_';
				m_szCSInputString[m_bCSInputChar] = 0;
				return	1;
			}

			if((key >= VK_A) && (key <= VK_Z))
			{
				m_szCSInputString[m_bCSInputChar - 1] = key;
				m_szCSInputString[m_bCSInputChar++] = '_';
				m_szCSInputString[m_bCSInputChar] = 0;
				return	1;
			}

			if(key == VK_SPACE)
			{
				m_szCSInputString[m_bCSInputChar - 1] = ' ';
				m_szCSInputString[m_bCSInputChar++] = '_';
				m_szCSInputString[m_bCSInputChar] = 0;
				return	1;
			}
		}

		if((key == VK_BACK) && (m_bCSInputChar > 1))
		{
			m_bCSInputChar--;
			m_szCSInputString[m_bCSInputChar] = 0;
			m_szCSInputString[m_bCSInputChar - 1] = '_';
			return	1;
		}

		if(key == VK_RETURN)
		{
			m_bCSInputChar--;
			m_szCSInputString[m_bCSInputChar] = 0;
			if(m_bCSInputState == 2)	SaveB2CFile();

			m_bCSInputState = 0;
//			m_bCSInputChar = 0;
			m_szCSInputString = 0;
			return	1;
		}

		if(key == VK_ESCAPE)
		{
			m_bCSInputState = 0;
			memset(m_szCSInputString, 0, SB_MAX_CS_STRING_SIZE);
			m_szCSInputString = 0;
//			m_bCSInputChar = 0;
			return	1;
		}
		return	0;
	}

	switch(key)
	{
		case	VK_DOWN:
		case	VK_W:
			do
			{
				m_bCSCurrentField++;
				if(m_bCSCurrentField >= SB_NUM_CSFIELDS)	m_bCSCurrentField = 0;
			}
			while(!(m_pCSFieldList[m_bCSCurrentField].active));
			return	1;

		case	VK_UP:
		case	VK_Q:
			do
			{
				m_bCSCurrentField--;
				if(m_bCSCurrentField < 0)	m_bCSCurrentField = SB_NUM_CSFIELDS - 1;
			}
			while(!(m_pCSFieldList[m_bCSCurrentField].active));
			return	1;

		case	VK_RIGHT:
		case	0xDD:
			return	HandleCharScreenRight();

		case	VK_LEFT:
		case	0xDB:
			return	HandleCharScreenLeft();

		case	VK_ESCAPE:
			if(m_bCSSelectState)
			{
				m_bCSSelectState = 0;
				LoadB2CFile(m_pCharFileIndex);
				m_pCharFileIndex = 0;
				m_pClientDE->FreeFileList(m_pCharFiles);
				m_pCharFiles = 0;
			}
			else
			{
				TermCharScreen();
				m_pClientDE->SetInputState(DTRUE);
			}
			return	1;

		case	VK_RETURN:
			switch(m_pCSFieldList[m_bCSCurrentField].use)
			{
				case	SB_CSFIELD_NEWNAME:
					m_bCSInputState = 1;
					memset(m_szCSNameString, 0, SB_MAX_CS_STRING_SIZE);
					m_szCSNameString[0] = '_';
					m_bCSInputChar = 1;
					break;
				case	SB_CSFIELD_LOADSKIN:
					break;
				case	SB_CSFIELD_SAVECHAR:
					m_bCSInputState = 2;
					memset(m_szCSSaveFile, 0, SB_MAX_CS_STRING_SIZE);
					m_szCSSaveFile[0] = '_';
					m_bCSInputChar = 1;
					break;
				case	SB_CSFIELD_LOADCHAR:
 					m_bCSSelectState = 2;
					m_bCharFileNum = 0;
					if(m_pCharFiles)	m_pClientDE->FreeFileList(m_pCharFiles);
					m_pCharFiles = m_pClientDE->GetFileList("B2CFiles");
					m_pCharFileIndex = m_pCharFiles;
					break;
				case	SB_CSFIELD_DELETECHAR:
					m_bCSSelectState = 3;
					m_bCharFileNum = 0;
					if(m_pCharFiles)	m_pClientDE->FreeFileList(m_pCharFiles);
					m_pCharFiles = m_pClientDE->GetFileList("B2CFiles");
					m_pCharFileIndex = m_pCharFiles;
					break;
				case	SB_CSFIELD_ACCEPT:
					TermCharScreen();
					m_pClientDE->SetInputState(DTRUE);
					return	2;
				case	SB_CSFIELD_CANCEL:
					TermCharScreen();
					m_pClientDE->SetInputState(DTRUE);
					break;
			}
			return	1;
	}
	return	0;
}

//*************************************************************************
//*****	Function:	HandleCharScreenLeft()
//*****	Details:	
//*************************************************************************

char	CStatusBar::HandleCharScreenLeft()
{
	char	use = m_pCSFieldList[m_bCSCurrentField].use;

	switch(use)
	{
		case	SB_CSFIELD_VALUE:
			if((m_bCSCurrentField != 3) && (m_pCSFieldList[m_bCSCurrentField].num2 == 1))
				return	1;
			if(m_pCSFieldList[m_bCSCurrentField].num2 > 0)
			{
				m_pCSFieldList[m_bCSCurrentField].num2--;
				m_cfExtraPoints.num2++;
			}
			return	1;

		case	SB_CSFIELD_SELECT:
		{
			char	type = m_pCSFieldList[m_bCSCurrentField].type;
			char	i, start, num, selected;

			switch(type)
			{
				case	1:	start = 4; num = 3;		break;		// Binding list
				case	2:	start = 7; num = 10;	break;		// Weapon list
				case	5:	start = 19; num = 4;	break;		// Item list
				case	6:	start = 23; num = 6;	break;		// Spell list
			}

			selected = m_pCSFieldList[m_bCSCurrentField].name;
			while(selected > 0)
			{
				selected--;
				for(i = start; i < start + num; i++)
					if(selected && (selected == m_pCSFieldList[i].name))	break;

				if(i == start + num)
					{	m_pCSFieldList[m_bCSCurrentField].name = selected; break;	}
			}
			return	1;
		}

		case	SB_CSFIELD_NEWNAME:
			return	1;

		case	SB_CSFIELD_LOADCHAR:
		case	SB_CSFIELD_DELETECHAR:
			if(m_bCSSelectState && (m_bCharFileNum > 0))
			{
				m_bCharFileNum--;
				m_pCharFileIndex = m_pCharFiles;
				for(char i = 0; i < m_bCharFileNum; i++)
					m_pCharFileIndex = m_pCharFileIndex->m_pNext;
			}
			return	1;
	}
	return	0;
}

//*************************************************************************
//*****	Function:	HandleCharScreenRight()
//*****	Details:	
//*************************************************************************

char	CStatusBar::HandleCharScreenRight()
{
	char	use = m_pCSFieldList[m_bCSCurrentField].use;

	switch(use)
	{
		case	SB_CSFIELD_VALUE:
			if(m_cfExtraPoints.num2 > 0) 
			{
				if((m_bCSCurrentField == 3) && (m_pCSFieldList[m_bCSCurrentField].num2 == 4))
					return	1;
				if(m_pCSFieldList[m_bCSCurrentField].num2 < 5)
				{
					m_pCSFieldList[m_bCSCurrentField].num2++;
					m_cfExtraPoints.num2--;
				}
			}
			return	1;

		case	SB_CSFIELD_SELECT:
		{
			char	type = m_pCSFieldList[m_bCSCurrentField].type;
			char	i, start, num, selected;

			switch(type)
			{
				case	1:	start = 4; num = 3;		break;		// Binding list
				case	2:	start = 7; num = 10;	break;		// Weapon list
				case	5:	start = 19; num = 4;	break;		// Item list
				case	6:	start = 23; num = 6;	break;		// Spell list
			}

			selected = m_pCSFieldList[m_bCSCurrentField].name;
			while(selected < m_pCSBoxes[type].max - 1)
			{
				selected++;
				for(i = start; i < start + num; i++)
					if(selected == m_pCSFieldList[i].name)		break;

				if(i == start + num)
					{	m_pCSFieldList[m_bCSCurrentField].name = selected; break;	}
			}
			return	1;
		}

		case	SB_CSFIELD_NEWNAME:
			return	1;

		case	SB_CSFIELD_LOADCHAR:
		case	SB_CSFIELD_DELETECHAR:
			if(m_bCSSelectState && m_pCharFileIndex->m_pNext)
			{
				m_bCharFileNum++;
				m_pCharFileIndex = m_pCharFiles;
				for(char i = 0; i < m_bCharFileNum; i++)
					m_pCharFileIndex = m_pCharFileIndex->m_pNext;
			}
			return	1;
	}
	return	0;
}

//*************************************************************************
//*****	Function:	StartCommunication(char chosen, char *szFile, char *szText)
//*****	Details:	Draws all active in-game interfaces
//*************************************************************************

char	CStatusBar::StartCommunication(char chosen, char *szFile, char *szText)
{
	if(m_bCommState)		return	0;

	m_bCommState = 1;
	m_bCommPic = chosen;
	memset(m_szCommVoice, 0, 100);
	strcpy(m_szCommVoice, szFile);
	memset(m_szCommText, 0, 200);
	strcpy(m_szCommText, szText);
	m_fCommLength = strlen(szText) / 15.0f;
	if(m_fCommLength < 1.5f)	m_fCommLength = 1.5f;
	if( m_sCommSound )
	{
		g_pClientDE->KillSound( m_sCommSound );
		m_sCommSound = 0;
	}

	if(szFile && strcmp(szFile, "default.wav"))
		m_bPlayVoice = 1;
	else
		m_bPlayVoice = 0;

	m_fCommStartTime = m_pClientDE->GetTime();
	return	1;
}

//*************************************************************************
//*****	Function:	Draw()
//*****	Details:	Draws all active in-game interfaces
//*************************************************************************

void	CStatusBar::Draw(DBOOL bDrawBar)
{
	if (!m_pClientDE) return;

	HSURFACE hScreen = m_pClientDE->GetScreenSurface();

	// Always draw this.. GK 9/1
	if(m_bCommState)	DrawCommunication(hScreen);

	// this stuff depends on whether the status bar is visible..
	if (bDrawBar)
	{
		if(m_bCharScreenOn)	{ DrawCharacterScreen(hScreen); return; }
		if(m_bSpellbookOn)	{ DrawSpellbook(hScreen); return; }
		if(m_bStatsOn)	DrawStatTabs(hScreen);
		if(m_bKeysOn)	DrawKeyTabs(hScreen);
		if(m_bInfoOn)	DrawInfoTab(hScreen);

		switch(m_bInventoryOn)
		{
			case	0:	if(m_bStatsOn)	DrawItemTabs(hScreen);	break;
			case	1:	HandleItemInventory(hScreen);	break;
			// case	2:	HandleSpellInventory(hScreen);	break;
		}

		if(m_bEquipOn)	DrawEquipTab(hScreen);
	}
}

//*************************************************************************
//*****	Function:	DrawCommunication(HSURFACE hScreen)
//*****	Details:	Draws the communication link at the top left
//*************************************************************************

void	CStatusBar::DrawCommunication(HSURFACE hScreen)
{
	DRect	locRect;
	DFLOAT	currentTime = m_pClientDE->GetTime();
	DFLOAT	ratio, dif;
	HDECOLOR	white = m_pClientDE->SetupColor1(1.0f, 1.0f, 1.0f, DFALSE);

	locRect.top = 0;
	locRect.bottom = SB_CHARPIC_SIZE;
	locRect.left = SB_CHARPIC_SIZE * m_bCommPic;
	locRect.right = locRect.left + SB_CHARPIC_SIZE;

	switch(m_bCommState)
	{
		case	1:
			dif = currentTime - m_fCommStartTime;
			if(dif > SB_COMMLINK_TIME_1)
			{
				m_bCommState = 2;
				m_fCommStartTime = currentTime;
				ratio = 0.0;
			}
			else
				ratio = 1.0f - (dif / SB_COMMLINK_TIME_1);

			m_pClientDE->DrawSurfaceToSurface(hScreen, m_hCharFaces, &locRect, m_nCommPicX, (DDWORD)(m_nCommPicY - ((m_nCommPicY - m_nCommPicStartY) * ratio)));
			break;

		case	2:
			if(currentTime - m_fCommStartTime > SB_COMMLINK_TIME_2)
			{
				m_bCommState = 3;

				if(m_bPlayVoice)
				{

⌨️ 快捷键说明

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