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

📄 commlink.cpp

📁 Blood 2全套源码
💻 CPP
字号:
//*************************************************************************
//*************************************************************************
//***** MODULE  : CommLink.cpp
//***** PURPOSE : Blood 2 Communcation Tab
//***** CREATED : 9/29/98
//*************************************************************************
//*************************************************************************

#include "CommLink.h"
#include "ClientUtilities.h"
#include "BloodClientShell.h"
#include <stdio.h>
#include "SoundTypes.h"


//*************************************************************************
//*****	Function:	CCommLink()
//*****	Details:	Constructor
//*************************************************************************

CCommLink::CCommLink()
{
	m_pClientDE = 0;

	// Surfaces
	m_hFace = 0;
	m_hText = 0;

	// Fonts and cursors
	m_pCommCursor = 0;
	m_pCommFont1 = 0;

	m_nCommLevel = COMMTAB_INVISIBLE;
	m_nTextLevel = COMMTEXT_INVISIBLE;

	memset(m_szCommVoice, 0, COMM_MAX_VOICE);
	memset(m_szCommText, 0, COMM_MAX_TEXT);

	m_fCommUpdateTime = 0.0f;
	m_fCommScrollRatio = 0.0f;
	m_fCommLength = 0.0f;

	m_fTextUpdateTime = 0.0f;
	m_fTextScrollRatio = 0.0f;
	m_fTextScrollTime = 0.0f;
	m_fTextLength = 0.0f;

	m_sCommSound = 0;
	m_bPlayVoice = DFALSE;

	m_nCommTextWidth = 0;
	m_nFaceWidth = 0;
	m_nCommTextX = 0;
	m_nCommTextY = 0;

	// General
	m_nScreenWidth = 0;
	m_nScreenHeight = 0;
	m_hTransColor = 0;
	m_hTextColor = 0;
}

//*************************************************************************
//*****	Function:	~CCommLink()
//*****	Details:	Destructor
//*************************************************************************

CCommLink::~CCommLink()
{
	if( m_sCommSound )
		g_pClientDE->KillSound( m_sCommSound );
}

//*************************************************************************
//*****	Function:	Init(CClientDE* pClientDE)
//*****	Details:	Initializes the status screens
//*************************************************************************

DBOOL CCommLink::Init(CClientDE* pClientDE)
{
	if (!pClientDE) return DFALSE;
	Term();

	m_pClientDE = pClientDE;

	// Initialize the graphic surfaces
	m_hFace		= m_pClientDE->CreateSurfaceFromBitmap("interface/commlink/c_comm.pcx");

	// Create a font cursor
	m_pCommCursor = new CoolFontCursor();

	// Setup fonts
	m_pCommFont1 = new CoolFont();
	m_pCommFont1->Init(m_pClientDE, "interface/commlink/comm_font_1.pcx");
	m_pCommFont1->LoadXWidths("interface/commlink/comm_font_1.fnt");

	// Setup transparency color
	m_hTransColor = m_pClientDE->SetupColor1(1.0f, 0.0f, 1.0f, DFALSE);
	m_hTextColor = m_pClientDE->SetupColor1(1.0f, 1.0f, 1.0f, DFALSE);

	AdjustRes();
	return DTRUE;
}

//*************************************************************************
//*****	Function:	AdjustRes()
//*****	Details:	Sets new locations for status tabs if the game resolution changes
//*************************************************************************

void CCommLink::AdjustRes()
{
	if (!m_pClientDE) return;

	// Check to see if the screen resolution has changed... if not then return
	DDWORD	width, height;
	HSURFACE hScreen = m_pClientDE->GetScreenSurface();

	m_pClientDE->GetSurfaceDims(hScreen, &width, &height);
	if((m_nScreenWidth == width) && (m_nScreenHeight == height))	return;

	// Set the screen width and height variables to the new resolution
	m_nScreenWidth = width;
	m_nScreenHeight = height;

	// Adjust the commlink tab location to the new resolution
	m_pClientDE->GetSurfaceDims(m_hFace, &width, &height);
	m_nFaceWidth = width;
	m_nCommTextWidth = (short)(m_nScreenWidth - width - 20);
	m_nCommTextX = width + 10;
	m_nCommTextY = 10;

	// Delete the current text surface and make a new one that's the right size
	if(m_hText)		{ m_pClientDE->DeleteSurface(m_hText); m_hText = 0; }
	m_hText = m_pClientDE->CreateSurface(m_nCommTextWidth, m_pCommFont1->height * COMM_MAX_LINES);
	m_pClientDE->FillRect(m_hText, DNULL, m_hTransColor);
}

//*************************************************************************
//*****	Function:	Term()
//*****	Details:	Terminates the status screens
//*************************************************************************

void CCommLink::Term()
{
	if(m_pClientDE)
	{
		if(m_hFace)		{ m_pClientDE->DeleteSurface(m_hFace); m_hFace = 0; }
		if(m_hText)		{ m_pClientDE->DeleteSurface(m_hText); m_hText = 0; }

		if(m_pCommCursor)	{ delete m_pCommCursor; m_pCommCursor = 0; }
		if(m_pCommFont1)	{ m_pCommFont1->Free(); delete m_pCommFont1; m_pCommFont1 = 0; }

		m_pClientDE = 0;
	}
}

//*************************************************************************
//*****	Function:	StartCommunication()
//*****	Details:	Setup the communication and turn it on
//*************************************************************************

char CCommLink::StartCommunication(DBYTE nPic, char *szFile, char *szText)
{
	if(!m_pClientDE || m_nCommLevel)	return	COMM_BUSY;

	m_nCommLevel = COMMTAB_SCROLL_IN;
	if( m_sCommSound )
	{	
		g_pClientDE->KillSound( m_sCommSound );
		m_sCommSound = 0;
	}

	// Clear and reinit the voice sound and text strings
	memset(m_szCommVoice, 0, COMM_MAX_VOICE);
	_mbscpy((unsigned char*)m_szCommVoice, (const unsigned char*)szFile);
	memset(m_szCommText, 0, COMM_MAX_TEXT);
	_mbscpy((unsigned char*)m_szCommText, (const unsigned char*)szText);

	// Get an average time to display the text, just in case the sound isn't there
	m_fCommLength = _mbstrlen(szText) / 15.0f;
	if(m_fCommLength < 2.5f)	m_fCommLength = 2.5f;

	m_fTextLength = m_fCommLength / 1.5f;
	m_fTextScrollTime = (m_fCommLength - m_fTextLength) / 2.0f;

	// Check to see if there is a valid sound file to use
	if(szFile && _mbscmp((const unsigned char*)szFile, (const unsigned char*)"default.wav"))
		m_bPlayVoice = DTRUE;
	else
		m_bPlayVoice = DFALSE;

	// Get the time that we start so that it can animate properly
	m_fCommUpdateTime = m_pClientDE->GetTime();

	// Setup the new picture and resize accordingly
	char	string1[100] = "interface/commlink/";

	switch(nPic)
	{
		case COMM_CALEB:		_mbscat((unsigned char*)string1, (const unsigned char*)"c_comm.pcx");	break;
		case COMM_OPHELIA:		_mbscat((unsigned char*)string1, (const unsigned char*)"o_comm.pcx");	break;
		case COMM_ISHMAEL:		_mbscat((unsigned char*)string1, (const unsigned char*)"i_comm.pcx");	break;
		case COMM_GABREILLA:	_mbscat((unsigned char*)string1, (const unsigned char*)"g_comm.pcx");	break;
		case COMM_VOICE:		_mbscat((unsigned char*)string1, (const unsigned char*)"v_comm.pcx");	break;
		default:				_mbscat((unsigned char*)string1, (const unsigned char*)"u_comm.pcx");	break;
	}

	if(m_hFace)		{ m_pClientDE->DeleteSurface(m_hFace); m_hFace = 0; }
	m_hFace = m_pClientDE->CreateSurfaceFromBitmap(string1);

	AdjustRes();
	return	COMM_STARTED;
}

//*************************************************************************
//*****	Function:	StartCommunication()
//*****	Details:	Setup the communication and turn it on
//*************************************************************************

char CCommLink::StartCommunication(char *szPic, char *szFile, char *szText)
{
	if(!m_pClientDE || m_nCommLevel)	return	COMM_BUSY;

	m_nCommLevel = COMMTAB_SCROLL_IN;
	if( m_sCommSound )
	{	
		g_pClientDE->KillSound( m_sCommSound );
		m_sCommSound = 0;
	}

	// Clear and reinit the voice sound and text strings
	memset(m_szCommVoice, 0, COMM_MAX_VOICE);
	_mbscpy((unsigned char*)m_szCommVoice, (const unsigned char*)szFile);
	memset(m_szCommText, 0, COMM_MAX_TEXT);
	_mbscpy((unsigned char*)m_szCommText, (const unsigned char*)szText);

	// Get an average time to display the text, just in case the sound isn't there
	m_fCommLength = _mbstrlen(szText) / 15.0f;
	if(m_fCommLength < 2.5f)	m_fCommLength = 2.5f;

	m_fTextLength = m_fCommLength / 1.5f;
	m_fTextScrollTime = m_fTextLength / 2.0f;

	// Check to see if there is a valid sound file to use
	if(szFile && _mbscmp((const unsigned char*)szFile, (const unsigned char*)"default.wav"))
		m_bPlayVoice = DTRUE;
	else
		m_bPlayVoice = DFALSE;

	// Get the time that we start so that it can animate properly
	m_fCommUpdateTime = m_pClientDE->GetTime();

	// Setup the new picture and resize accordingly
	char	string1[100] = "interface/commlink/";

	if(szPic)	_mbscat((unsigned char*)string1, (const unsigned char*)szPic);
		else	_mbscat((unsigned char*)string1, (const unsigned char*)"c_comm.pcx");

	if(m_hFace)		{ m_pClientDE->DeleteSurface(m_hFace); m_hFace = 0; }
	m_hFace = m_pClientDE->CreateSurfaceFromBitmap(string1);

	AdjustRes();
	return	COMM_STARTED;
}

//*************************************************************************
//*****	Function:	Draw()
//*****	Details:	Draw the picture and text
//*************************************************************************

void CCommLink::Draw(DBOOL bDrawBar)
{
	if(!m_pClientDE || !m_nCommLevel || !bDrawBar) return;

	HSURFACE	hScreen	= m_pClientDE->GetScreenSurface();
	DFLOAT		fTime = m_pClientDE->GetTime();

	if (!hScreen) return;

	AdjustRes();

	m_pCommCursor->SetFont(m_pCommFont1);
	m_pCommCursor->SetDest(m_hText);
	m_pCommCursor->SetJustify(CF_JUSTIFY_LEFT);
	m_pCommCursor->SetLoc(0, 0);

	// Handle the scrolling in and out of the inventory item tabs
	switch(m_nCommLevel)
	{
		case	COMMTAB_SCROLL_IN:
			if(fTime - m_fCommUpdateTime > COMM_SCROLL_TIME)
			{
				m_fCommScrollRatio = 1.0f;
				m_nCommLevel = COMMTAB_STOPPED;
				m_fCommUpdateTime = fTime;

				m_nTextLevel = COMMTEXT_SCROLL_IN;
				m_fTextUpdateTime = fTime;

				if(m_bPlayVoice)
				{
					g_pBloodClientShell->GetVoiceMgr()->StopAll();	// [blg] Stop any voice mgr sounds

					if( m_sCommSound )
					{	
						g_pClientDE->KillSound( m_sCommSound );
						m_sCommSound = 0;
					}
					m_sCommSound = PlaySoundLocal(m_szCommVoice, SOUNDPRIORITY_MISC_HIGH, DFALSE, DTRUE, DTRUE, DFALSE, 100);

					if (m_sCommSound)	// [blg] Don't let voice mgr interrupt
					{
						DFLOAT  fSoundTime = 3;

						m_pClientDE->GetSoundDuration(m_sCommSound, &fSoundTime);
						g_pBloodClientShell->GetVoiceMgr()->SetNextPlayTime(fSoundTime + 0.5f);
					}
				}
			}
			else
			{
				m_fCommScrollRatio = (fTime - m_fCommUpdateTime) / COMM_SCROLL_TIME;

			}
			break;

		case	COMMTAB_STOPPED:
//			if(!m_sCommSound || !m_bPlayVoice)
//			{
				if(fTime - m_fCommUpdateTime > m_fCommLength)
				{
					m_nCommLevel = COMMTAB_SCROLL_OUT;
					m_fCommUpdateTime = fTime;
					if(m_sCommSound)
					{
						m_pClientDE->KillSound(m_sCommSound);
						m_sCommSound = DNULL;
					}

				}
//			}
//			else if(m_bPlayVoice && m_pClientDE->IsDone(m_sCommSound))
//			{
//				m_nCommLevel = COMMTAB_SCROLL_OUT;
//				m_fCommUpdateTime = fTime;
//				if(m_sCommSound)	m_pClientDE->KillSound(m_sCommSound);
//			}
			break;

		case	COMMTAB_SCROLL_OUT:
			if(fTime - m_fCommUpdateTime > COMM_SCROLL_TIME)
			{
				m_fCommScrollRatio = 0.0f;
				m_nCommLevel = COMMTAB_INVISIBLE;
				m_fCommUpdateTime = fTime;
			}
			else
				m_fCommScrollRatio = 1.0f - (fTime - m_fCommUpdateTime) / COMM_SCROLL_TIME;

			break;
	}

	// Handle the text scrolling ratios and stuff...
	switch(m_nTextLevel)
	{
		case	COMMTEXT_SCROLL_IN:
			if(fTime - m_fTextUpdateTime > m_fTextScrollTime)
			{
				m_nTextLevel = COMMTEXT_STOPPED;
				m_fTextUpdateTime = fTime;
			}
			else
			{
				m_fTextScrollRatio = (fTime - m_fTextUpdateTime) / m_fTextScrollTime;

				m_pClientDE->FillRect(m_hText, DNULL, m_hTransColor);
				m_pCommCursor->DrawFormatTimed(m_szCommText, m_nCommTextWidth, m_fTextScrollRatio, DTRUE);
			}
			break;

		case	COMMTEXT_STOPPED:
			if(fTime - m_fTextUpdateTime > m_fTextLength)
			{
				m_nTextLevel = COMMTEXT_SCROLL_OUT;
				m_fTextUpdateTime = fTime;
			}
			else
			{
				m_pClientDE->FillRect(m_hText, DNULL, m_hTransColor);
				m_pCommCursor->DrawFormatTimed(m_szCommText, m_nCommTextWidth, 1.0f, DTRUE);
			}
			break;

		case	COMMTEXT_SCROLL_OUT:
			if(fTime - m_fTextUpdateTime > m_fTextScrollTime)
			{
				m_nTextLevel = COMMTEXT_INVISIBLE;
				m_fTextUpdateTime = fTime;
			}
			else
			{
				m_fTextScrollRatio = (fTime - m_fTextUpdateTime) / m_fTextScrollTime;

				m_pClientDE->FillRect(m_hText, DNULL, m_hTransColor);
				m_pCommCursor->DrawFormatTimed(m_szCommText, m_nCommTextWidth, m_fTextScrollRatio, DFALSE);
			}
			break;
	}

	// Draw the face to the screen
	if(m_hFace)
	{
		DDWORD nNewX = (DDWORD)(m_nFaceWidth * m_fCommScrollRatio) - m_nFaceWidth;
		m_pClientDE->DrawSurfaceToSurfaceTransparent(hScreen, m_hFace, DNULL, nNewX, m_nCommTextY, m_hTransColor);
	}

	// Draw the text to the screen
	if(m_hText && m_nTextLevel)
		m_pClientDE->DrawSurfaceToSurfaceTransparent(hScreen, m_hText, DNULL, m_nCommTextX, m_nCommTextY, m_hTransColor);
}

⌨️ 快捷键说明

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