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

📄 statusbar.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//	m_pStatFont4 = new CoolFont();
//	m_pStatFont4->Init(m_pClientDE, "interface/fonts/fixedsys8x14.pcx");
//	m_pStatFont4->CalcAll(8, 14);

	// Setup cursor with specific font
	m_pStatCursor = new CoolFontCursor();
	m_pStatCursor->SetFont(m_pStatFont2);
	m_pStatCursor->SetJustify(CF_JUSTIFY_CENTER);
	m_pInfoCursor = new CoolFontCursor();
	m_pInfoCursor->SetFont(m_pStatFont1);
	m_pEquipCursor = new CoolFontCursor();
	m_pEquipCursor->SetFont(m_pStatFont2);

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

	// Init Key list
	m_hFirstKey.next = &m_hLastKey;
	m_hLastKey.prev = &m_hFirstKey;

	// Init tab locations
	AdjustRes();

	// Init inventory lists
	ClearItems();
	ClearSpells();
	SetupEquipList();

	return DTRUE;
}

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

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

	HSURFACE hScreen = m_pClientDE->GetScreenSurface();
	m_pClientDE->GetSurfaceDims (hScreen, &m_nScreenWidth, &m_nScreenHeight);

	m_nHealthX = 0;
	m_nArmorX = SB_STATTAB_SIZE_X;
	m_nAmmoX = m_nScreenWidth - SB_STATTAB_SIZE_X;
	m_nManaX = m_nAmmoX - SB_STATTAB_SIZE_X;
	m_nHealthY = m_nArmorY = m_nManaY = m_nAmmoY = m_nScreenHeight - SB_STATTAB_SIZE_Y;

	m_nItemX = SB_STATTAB_SIZE_X << 1;
	m_nSpellX = m_nScreenWidth - m_nItemX - SB_INVICON_SIZE_X;
	m_nInventoryY = m_nItemY = m_nSpellY = m_nScreenHeight - SB_INVICON_SIZE_Y;
	if(!m_bStatsOn) m_nInventoryY = m_nScreenHeight;

	m_nCommPicX = m_nCommPicY = 25;
	m_nCommPicStartY = -50;
	m_nCommTextX = 85;
	m_nCommTextY = 25;
	m_nCommTextWidth = (short)m_nScreenWidth - 25 - 85;

	m_pStatCursor->SetLoc((short)(m_nScreenWidth >> 1), (short)(m_nScreenHeight - 25));

	m_hFirstKey.currentY = (short)m_nScreenHeight - SB_STATTAB_SIZE_Y;

	m_nInfoX = (short)m_nScreenWidth - SB_INFOTAB_SIZE_X;

	m_nEquipX = (m_nScreenWidth >> 1) - (SB_EQUIP_SIZE_X >> 1);
	m_nEquipY = (m_nScreenHeight >> 1) - (SB_EQUIP_SIZE_Y >> 1);
}

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

void	CStatusBar::Term()
{
	if (m_pClientDE)
	{
		if(m_hStatTabs)		{ m_pClientDE->DeleteSurface(m_hStatTabs); m_hStatTabs = 0; }
		if(m_hStatIcons)	{ m_pClientDE->DeleteSurface(m_hStatIcons); m_hStatIcons = 0; }
		if(m_hStatNums)		{ m_pClientDE->DeleteSurface(m_hStatNums); m_hStatNums = 0; }
		if(m_hItemIcons)	{ m_pClientDE->DeleteSurface(m_hItemIcons); m_hItemIcons = 0; }
		if(m_hSpellIcons)	{ m_pClientDE->DeleteSurface(m_hSpellIcons); m_hSpellIcons = 0; }
		if(m_hItemLight)	{ m_pClientDE->DeleteSurface(m_hItemLight); m_hItemLight = 0; }
		if(m_hSpellLight)	{ m_pClientDE->DeleteSurface(m_hSpellLight); m_hSpellLight = 0; }
		if(m_hKeyTabs)		{ m_pClientDE->DeleteSurface(m_hKeyTabs); m_hKeyTabs = 0; }
		if(m_hEquipTab)		{ m_pClientDE->DeleteSurface(m_hEquipTab); m_hEquipTab = 0; }
		if(m_hEquipCursor)	{ m_pClientDE->DeleteSurface(m_hEquipCursor); m_hEquipCursor = 0; }
		if(m_hCharFaces)	{ m_pClientDE->DeleteSurface(m_hCharFaces); m_hCharFaces = 0; }

		if(m_pStatCursor)	{ delete m_pStatCursor; m_pStatCursor = 0; }
		if(m_pInfoCursor)	{ delete m_pInfoCursor; m_pInfoCursor = 0; }
		if(m_pEquipCursor)	{ delete m_pEquipCursor; m_pEquipCursor = 0; }
		if(m_pStatFont1)	{ m_pStatFont1->Free(); delete m_pStatFont1; m_pStatFont1 = 0; }
		if(m_pStatFont2)	{ m_pStatFont2->Free(); delete m_pStatFont2; m_pStatFont2 = 0; }
		if(m_pStatFont3)	{ m_pStatFont3->Free(); delete m_pStatFont3; m_pStatFont3 = 0; }
		if(m_pStatFont4)	{ m_pStatFont4->Free(); delete m_pStatFont4; m_pStatFont4 = 0; }

		ClearKeys();
		ClearItems();
		ClearSpells();

		TermSpellbook();

		m_pClientDE = 0;
	}
}

//*************************************************************************
//*****	Function:	InitSpellbook()
//*****	Details:	Allocate and setup the spellbook interface
//*************************************************************************

DBOOL	CStatusBar::InitSpellbook()
{
	m_pClientDE->SetInputState (DFALSE);

	m_hSpellBG = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spellBG.pcx");
	m_hSpellsLo = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spellsLo.pcx");
	m_hSpellsHi = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spellsHi.pcx");
	m_hSpellSymbols = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spellSymbols.pcx");
	m_hSpellCursor = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spellCursor.pcx");
	m_hSpellDot = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spelldot.pcx");

	m_pSpellFont1 = new CoolFont();
	m_pSpellFont1->Init(m_pClientDE, "interface/fonts/SpellFont1.pcx");
	m_pSpellFont1->LoadXWidths("blood2/interface/fonts/SpellFont1.fnt");

	m_pSpellFont2 = new CoolFont();
	m_pSpellFont2->Init(m_pClientDE, "interface/fonts/SpellFont2.pcx");
	m_pSpellFont2->LoadXWidths("blood2/interface/fonts/SpellFont2.fnt");

	m_pSpellCursor = new CoolFontCursor();
	m_pSpellCursor->SetFont(m_pSpellFont1);

	m_bSpellbookOn = 1;

	return	1;
}

//*************************************************************************
//*****	Function:	TermSpellbook()
//*****	Details:	Release any memory used by the spellbook interface
//*************************************************************************

void	CStatusBar::TermSpellbook()
{
	m_bSpellbookOn = 0;

	if(m_hSpellBG)		{ m_pClientDE->DeleteSurface(m_hSpellBG); m_hSpellBG = 0; }
	if(m_hSpellsLo)		{ m_pClientDE->DeleteSurface(m_hSpellsLo); m_hSpellsLo = 0; }
	if(m_hSpellsHi)		{ m_pClientDE->DeleteSurface(m_hSpellsHi); m_hSpellsHi = 0; }
	if(m_hSpellSymbols)	{ m_pClientDE->DeleteSurface(m_hSpellSymbols); m_hSpellSymbols = 0; }
	if(m_hSpellCursor)	{ m_pClientDE->DeleteSurface(m_hSpellCursor); m_hSpellCursor = 0; }
	if(m_hSpellDot)		{ m_pClientDE->DeleteSurface(m_hSpellDot); m_hSpellDot = 0; }

	if(m_pSpellCursor)	{ delete m_pSpellCursor; m_pSpellCursor = 0; }
	if(m_pSpellFont1)	{ m_pSpellFont1->Free(); delete m_pSpellFont1; m_pSpellFont1 = 0; }
	if(m_pSpellFont2)	{ m_pSpellFont2->Free(); delete m_pSpellFont2; m_pSpellFont2 = 0; }
}

//*************************************************************************
//*****	Function:	InitCharScreen()
//*****	Details:	Allocate and setup the character screen interface
//*************************************************************************

DBOOL	CStatusBar::InitCharScreen()
{
	short	i;

	m_hCharFields = m_pClientDE->CreateSurfaceFromBitmap("interface/status/characterfields.pcx");

	m_pCharFont1 = new CoolFont();
	m_pCharFont1->Init(m_pClientDE, "interface/fonts/MenuFont1.pcx");
	m_pCharFont1->LoadXWidths("blood2/interface/fonts/MenuFont1.fnt");

	m_pCharCursor = new CoolFontCursor();
	m_pCharCursor->SetFont(m_pCharFont1);

	memset(m_pCSBoxes, 0, sizeof(CCharBox) * SB_NUM_CSBOXES);
	memset(m_pCSFieldList, 0, sizeof(CCharField) * SB_NUM_CSFIELDS);
	memset(&m_cfExtraPoints, 0, sizeof(CCharField));
	memset(m_rCSFields, 0, sizeof(DRect) * SB_NUM_BOXTYPES);

	for(i = 0; i < SB_NUM_CSBOXES; i++)
	{
		m_pCSBoxes[i].box = g_FieldBoxTypes[i];
		m_pCSBoxes[i].x = g_FieldBoxesXLoc[i];
		m_pCSBoxes[i].y = g_FieldBoxesYLoc[i];
	}

	m_pCSBoxes[0].list = g_FieldStatNames;
	m_pCSBoxes[1].list = g_BindingNames;
	m_pCSBoxes[2].list = g_WeaponNames;
	m_pCSBoxes[3].list = g_CharacterNames;
	m_pCSBoxes[4].list = g_SkinNames;
	m_pCSBoxes[5].list = g_ItemNames;
	m_pCSBoxes[6].list = g_SpellNames;
	m_pCSBoxes[7].list = g_FieldStatNames;
	m_pCSBoxes[8].list = g_FieldStatNames;
	m_pCSBoxes[9].list = g_FieldStatNames;
	m_pCSBoxes[10].list = g_FieldStatNames;
	m_pCSBoxes[11].list = g_FieldStatNames;

	m_pCSBoxes[1].max = 16;
	m_pCSBoxes[2].max = 33;
	m_pCSBoxes[3].max = 5;
	m_pCSBoxes[4].max = 4;
	m_pCSBoxes[5].max = 9;
	m_pCSBoxes[6].max = 15;
	m_pCSBoxes[7].max = 1;
	m_pCSBoxes[8].max = 1;
	m_pCSBoxes[9].max = 1;
	m_pCSBoxes[10].max = 1;
	m_pCSBoxes[11].max = 1;

	for(i = 0; i < SB_NUM_BOXTYPES; i++)
	{
		m_rCSFields[i].left = 0;
		m_rCSFields[i].right = SB_CHARFIELD_SIZE_X;
		m_rCSFields[i].top = g_FieldBoxesYPos[i];
		m_rCSFields[i].bottom = g_FieldBoxesYPos[i + 1];
	}

	for(i = 0; i < SB_NUM_CSFIELDS; i++)
	{
		m_pCSFieldList[i].type = g_FieldTypes[i];

//		if(m_bMultiInfo)
			m_pCSFieldList[i].active = g_FieldActiveM[i];
//		else
//			m_pCSFieldList[i].active = g_FieldActiveS[i];

		m_pCSFieldList[i].use = g_FieldUses[i];
		m_pCSFieldList[i].name = g_FieldNames[i];
		m_pCSFieldList[i].justify = g_FieldJustify[i];
		m_pCSFieldList[i].x = g_FieldXOffset[i];
		m_pCSFieldList[i].y = g_FieldYOffset[i];
	}

	m_pCSFieldList[0].num1 = m_pCSFieldList[0].num2 = 2;
	m_pCSFieldList[1].num1 = m_pCSFieldList[1].num2 = 2;
	m_pCSFieldList[2].num1 = m_pCSFieldList[2].num2 = 2;
	m_pCSFieldList[3].num1 = m_pCSFieldList[3].num2 = 1;

	m_cfExtraPoints.num1 = m_cfExtraPoints.num2 = 4;
	m_cfExtraPoints.x = 5;
	m_cfExtraPoints.y = 88;

	m_bCharScreenOn = 1;
	m_bCSCurrentField = 0;

	m_bCSInputState = 0;
	m_szCSInputString = 0;
	memset(m_szCSNameString, 0, SB_MAX_CS_STRING_SIZE);
	memset(m_szCSSaveFile, 0, SB_MAX_CS_STRING_SIZE);
	m_bCSInputChar = 0;
	m_bCSSelectState = 0;
	m_pCharFiles = 0;
	m_pCharFileIndex = 0;
	m_bCharFileNum = 0;
	return	1;
}

//*************************************************************************
//*****	Function:	TermCharScreen()
//*****	Details:	Release any memory used by the character screen interface
//*************************************************************************

void	CStatusBar::TermCharScreen()
{
	m_bCharScreenOn = 0;

	if(m_hCharFields)	{ m_pClientDE->DeleteSurface(m_hCharFields); m_hCharFields = 0; }

	if(m_pCharCursor)	{ delete m_pCharCursor; m_pCharCursor = 0; }
	if(m_pCharFont1)	{ m_pCharFont1->Free(); delete m_pCharFont1; m_pCharFont1 = 0; }
}

//*************************************************************************
//*****	Function:	SetupStatStrings(char **w, char numW, char **i, char numI, char **s, char numS)
//*****	Details:	
//*************************************************************************

/*void	CStatusBar::SetupStatStrings(char **w, char numW, char **i, char numI, char **s, char numS, char **b, char numB)
{
	m_hWeaponNames = w;
	m_nTotalWeapons = numW;
	m_hItemNames = i;
	m_nTotalItems = numI;
	m_hSpellNames = s;
	m_nTotalSpells = numS;
	m_hBindingNames = b;
	m_nTotalBindings = numB;
}*/

//*************************************************************************
//*****	Function:	AddKey(char type)
//*****	Details:	Adds a new key to the end of the current key list
//*************************************************************************

DBOOL	CStatusBar::AddKey(char type)
{
	CKeyTab		*key = m_hFirstKey.next;

	while(key->next)
	{
		if(key->type == type)	return	0;
		key = key->next;
	}

	key = new CKeyTab;
	key->prev = m_hLastKey.prev;
	key->next = &m_hLastKey;
	m_hLastKey.prev->next = key;
	m_hLastKey.prev = key;
	key->type = type;

	key->currentX = -SB_KEYTAB_SIZE_X;
	key->currentY = key->prev->currentY - SB_KEYTAB_SIZE_Y;
	key->locYTop = type * SB_KEYTAB_SIZE_Y;
	key->locYBottom = key->locYTop + SB_KEYTAB_SIZE_Y;
	key->startTime = m_pClientDE->GetTime();
	key->direction = 1;

	return	1;
}

//*************************************************************************
//*****	Function:	RemoveKey(char type)
//*****	Details:	Removes a specific key from anywhere in the current key list
//*************************************************************************

DBOOL	CStatusBar::RemoveKey(char type)
{
	CKeyTab		*set, *key = m_hFirstKey.next;
	DBOOL		removeKey = 0;
	DFLOAT		time;

	while(key->next)
	{
		if(key->type == type)	{	removeKey = 1; break;	}
		key = key->next;
	}

	if(removeKey)
	{
		set = key->next;
		key->prev->next = key->next;
		key->next->prev = key->prev;
		key->prev = key->next = 0;
		delete key;

		time = m_pClientDE->GetTime();
		while(set->next)
		{
			set->direction = 2;
			set->startTime = time;
			set = set->next;
		}
		return	1;
	}

	return	0;
}

//*************************************************************************
//*****	Function:	ClearKeys()
//*****	Details:	Removes all keys
//*************************************************************************

void	CStatusBar::ClearKeys()
{
	CKeyTab		*key = m_hFirstKey.next;

	while(key->next)
		RemoveKey(key->type);
}

//*************************************************************************
//*****	Function:	AddItem(char type)
//*****	Details:	Add a specific item to the player's inventory
//*************************************************************************

DBOOL	CStatusBar::AddItem(char type)
{
	CInventoryItem	*tempItem;
	char	i;

	for(i = 0; i < SB_NUM_ITEMS; i++)
		if(m_hItems[i].type == type)	{ m_hItems[i].amount++; return 1; }

	if(m_nNumItems == SB_NUM_ITEMS)	return 0;

	for(i = 0; i < SB_NUM_ITEMS; i++)
		if(!m_hItems[i].type)	{ tempItem = &(m_hItems[i]); break; }

	tempItem->type = type;
	tempItem->slot = i;
	tempItem->amount = 1;
	tempItem->locXLeft = type * SB_INVICON_SIZE_X;
	tempItem->locXRight = tempItem->locXLeft + SB_INVICON_SIZE_X;
	m_nNumItems++;
	m_hSelectedItem = tempItem;
	m_bCurrentItem = m_hSelectedItem->type;
	tempItem = 0;

	SetupEquipList();
	return	1;
}

⌨️ 快捷键说明

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