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

📄 menucharacter.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//*************************************************************************
//*************************************************************************
//***** MODULE  : MenuCharacter.cpp
//***** PURPOSE : Blood 2 Character Creation Screen
//***** CREATED : 10/11/98
//*************************************************************************
//*************************************************************************

#include "MenuBase.h"
#include "MenuCharacter.h"
#include "MainMenus.h"
#include "MenuCommands.h"
#include "BloodClientShell.h"
#include "WeaponDefs.h"
#include "VKDefs.h"
#include <direct.h>
#include <stdio.h>
#include <io.h>

//*************************************************************************

CharacterMenuInfo g_CharacterMenuInfo[MAX_CHARACTER_INFO] =
{
	{ "caleb_single.pcx", CHARACTER_CALEB, MULTIPLAY_SKIN_NORMAL, },
	{ "caleb_red.pcx", CHARACTER_CALEB, MULTIPLAY_SKIN_RED, },
	{ "caleb_blue.pcx", CHARACTER_CALEB, MULTIPLAY_SKIN_BLUE, },
	{ "caleb_green.pcx", CHARACTER_CALEB, MULTIPLAY_SKIN_GREEN, },
	{ "caleb_yellow.pcx", CHARACTER_CALEB, MULTIPLAY_SKIN_YELLOW, },
	{ "ophelia_single.pcx", CHARACTER_OPHELIA, MULTIPLAY_SKIN_NORMAL, },
	{ "ophelia_red.pcx", CHARACTER_OPHELIA, MULTIPLAY_SKIN_RED, },
	{ "ophelia_blue.pcx", CHARACTER_OPHELIA, MULTIPLAY_SKIN_BLUE, },
	{ "ophelia_green.pcx", CHARACTER_OPHELIA, MULTIPLAY_SKIN_GREEN, },
	{ "ophelia_yellow.pcx", CHARACTER_OPHELIA, MULTIPLAY_SKIN_YELLOW, },
	{ "ishmael_single.pcx", CHARACTER_ISHMAEL, MULTIPLAY_SKIN_NORMAL, },
	{ "ishmael_red.pcx", CHARACTER_ISHMAEL, MULTIPLAY_SKIN_RED, },
	{ "ishmael_blue.pcx", CHARACTER_ISHMAEL, MULTIPLAY_SKIN_BLUE, },
	{ "ishmael_green.pcx", CHARACTER_ISHMAEL, MULTIPLAY_SKIN_GREEN, },
	{ "ishmael_yellow.pcx", CHARACTER_ISHMAEL, MULTIPLAY_SKIN_YELLOW, },
	{ "gabby_single.pcx", CHARACTER_GABREILLA, MULTIPLAY_SKIN_NORMAL, },
	{ "gabby_red.pcx", CHARACTER_GABREILLA, MULTIPLAY_SKIN_RED, },
	{ "gabby_blue.pcx", CHARACTER_GABREILLA, MULTIPLAY_SKIN_BLUE, },
	{ "gabby_green.pcx", CHARACTER_GABREILLA, MULTIPLAY_SKIN_GREEN, },
	{ "gabby_yellow.pcx", CHARACTER_GABREILLA, MULTIPLAY_SKIN_YELLOW, },

#ifdef _ADDON
	{ "interface_AO\\m_cultist1.pcx", CHARACTER_M_CULTIST, MULTIPLAY_SKIN_NORMAL, },
	{ "interface_AO\\clown2.pcx", CHARACTER_M_CULTIST, MULTIPLAY_SKIN_RED, },
	{ "interface_AO\\clown1.pcx", CHARACTER_M_CULTIST, MULTIPLAY_SKIN_BLUE, },
	{ "interface_AO\\clown3.pcx", CHARACTER_M_CULTIST, MULTIPLAY_SKIN_GREEN, },
	{ "interface_AO\\m_cultist3.pcx", CHARACTER_M_CULTIST, MULTIPLAY_SKIN_YELLOW, },
	{ "interface_AO\\f_cultist1.pcx", CHARACTER_F_CULTIST, MULTIPLAY_SKIN_NORMAL, },
	{ "interface_AO\\souldrudge1.pcx", CHARACTER_SOULDRUDGE, MULTIPLAY_SKIN_NORMAL, },
	{ "interface_AO\\prophet.pcx", CHARACTER_PROPHET, MULTIPLAY_SKIN_NORMAL, },
#endif

};

//*************************************************************************

CMenuCharacter::CMenuCharacter()
{
	m_szBackground = "interface\\charscreen\\charbackground.pcx";
	m_bBoxFormat = DFALSE;

	m_hCharacterPic = DNULL;

	m_PlayerIndex = 0;
	m_ExtraPoints = 4;

	m_Player.dwCharacter = g_CharacterMenuInfo[m_PlayerIndex].nCharacter;
	m_Player.dwColor = g_CharacterMenuInfo[m_PlayerIndex].nColor;
	m_Player.dwStrength = DEFAULT_ATTRIBUTE - 1;
	m_Player.dwSpeed = DEFAULT_ATTRIBUTE - 1;
	m_Player.dwResist = DEFAULT_ATTRIBUTE - 1;
	m_Player.dwFocus = DEFAULT_ATTRIBUTE - 1;
	m_Player.dwWeap1 = WEAP_NONE;
	m_Player.dwWeap2 = WEAP_NONE;
	m_Player.dwWeap3 = WEAP_NONE;
	m_Player.dwWeap4 = WEAP_NONE;
	m_Player.dwWeap5 = WEAP_NONE;
	m_Player.dwWeap6 = WEAP_NONE;
	m_Player.dwWeap7 = WEAP_NONE;
	m_Player.dwWeap8 = WEAP_NONE;
	m_Player.dwWeap9 = WEAP_NONE;

	m_hRightArrow = DNULL;

	m_hStats[0] = DNULL;
	m_hStats[1] = DNULL;
	m_hStats[2] = DNULL;
	m_hStats[3] = DNULL;

	m_hExtraCtrl = DNULL;
	m_hExtraNumCtrl = DNULL;

	m_hWeaponsCtrl = DNULL;

	for(int i = 0; i < 10; i++)
	{
		m_hWeaponNums[i] = DNULL;
		m_hWeapons[i] = DNULL;
	}

	m_bSwitchResolutions=DFALSE;
	m_bGoingToFilesMenu=DFALSE;

	m_nOldScreenWidth=640;
	m_nOldScreenHeight=480;
}

//*************************************************************************

CMenuCharacter::~CMenuCharacter()
{
	if(m_hRightArrow)	delete m_hRightArrow;
	if(m_hExtraCtrl)	delete m_hExtraCtrl;
	if(m_hWeaponsCtrl)	delete m_hWeaponsCtrl;

	if(m_hExtraNumCtrl)	delete m_hExtraNumCtrl;

	for(int i = 0; i < 4; i++)
		if(m_hStats[i])		delete m_hStats[i];

	for(i = 0; i < 10; i++)
	{
		if(m_hWeaponNums[i])	delete m_hWeaponNums[i];
		if(m_hWeapons[i])		delete m_hWeapons[i];
	}
}

//*************************************************************************

void CMenuCharacter::Build()
{
	CMenuBase::Build();

	AddFadeItemOption("interface\\charscreen\\arrows\\leftarrow_", 6, "LEFT ARROW", 0, 60, 380);

	AddFadeItemOption("interface\\charscreen\\titles\\strength_", 6, "STRENGTH", 0, 206, 130);
	AddFadeItemOption("interface\\charscreen\\titles\\resistance_", 6, "RESISTANCE", 0, 204, 172);
	AddFadeItemOption("interface\\charscreen\\titles\\speed_", 6, "SPEED", 0, 206, 214);
	AddFadeItemOption("interface\\charscreen\\titles\\focus_", 6, "FOCUS", 0, 206, 256);

	AddFadeItemOption("interface\\charscreen\\fields\\weapon2_", 6, "WEAPON2", 0, 380, 134);
	AddFadeItemOption("interface\\charscreen\\fields\\weapon3_", 6, "WEAPON3", 0, 380, 158);
	AddFadeItemOption("interface\\charscreen\\fields\\weapon4_", 6, "WEAPON4", 0, 380, 181);
	AddFadeItemOption("interface\\charscreen\\fields\\weapon5_", 6, "WEAPON5", 0, 380, 204);
	AddFadeItemOption("interface\\charscreen\\fields\\weapon6_", 6, "WEAPON6", 0, 380, 226);
	AddFadeItemOption("interface\\charscreen\\fields\\weapon7_", 6, "WEAPON7", 0, 380, 249);
	AddFadeItemOption("interface\\charscreen\\fields\\weapon8_", 6, "WEAPON8", 0, 380, 272);
	AddFadeItemOption("interface\\charscreen\\fields\\weapon9_", 6, "WEAPON9", 0, 380, 295);
	AddFadeItemOption("interface\\charscreen\\fields\\weapon10_", 6, "WEAPON10", 0, 380, 319);

	AddFadeItemOption("interface\\charscreen\\titles\\save_", 6, "SAVE", MENU_CMD_SAVE_CHARACTER, 517, 356);
	AddFadeItemOption("interface\\charscreen\\titles\\load_", 6, "LOAD", MENU_CMD_LOAD_CHARACTER, 509, 382);
	AddFadeItemOption("interface\\charscreen\\titles\\delete_", 6, "DELETE", MENU_CMD_DELETE_CHARACTER, 499, 407);

	BuildExtraCtrls();

	ChangeCharacterPic(0);

	m_hTransColor = m_pClientDE->SetupColor1(1.0f, 0.0f, 1.0f, DFALSE);
}

//*************************************************************************

void CMenuCharacter::BuildExtraCtrls()
{
	m_hRightArrow = InitFadeItemCtrl("interface\\charscreen\\arrows\\rightarrow_", 6, "RIGHT ARROW", 0, 188, 377);
	m_hExtraCtrl = InitFadeItemCtrl("interface\\charscreen\\titles\\extrapts_", 6, "EXTRA POINTS", 0, 206, 295);
	m_hWeaponsCtrl = InitFadeItemCtrl("interface\\charscreen\\titles\\weapons_", 6, "WEAPONS", 0, 491, 95);

	m_hExtraNumCtrl = InitNumberCtrl(0, 8, m_ExtraPoints, 0, 330, 313);

	m_hStats[0] = InitNumberCtrl(0, 5, m_Player.dwStrength, 0, 330, 145);
	m_hStats[1] = InitNumberCtrl(0, 5, m_Player.dwResist, 0, 330, 187);
	m_hStats[2] = InitNumberCtrl(0, 5, m_Player.dwSpeed, 0, 330, 229);
	m_hStats[3] = InitNumberCtrl(0, 5, m_Player.dwFocus, 0, 330, 271);

	m_hWeapons[0] = InitWeaponCtrl(WEAP_MELEE, 0, 410, 116, DFALSE);
	m_hWeapons[1] = InitWeaponCtrl(0, 0, 410, 139, DTRUE);
	m_hWeapons[2] = InitWeaponCtrl(0, 0, 410, 162, DTRUE);
	m_hWeapons[3] = InitWeaponCtrl(0, 0, 410, 185, DTRUE);
	m_hWeapons[4] = InitWeaponCtrl(0, 0, 410, 208, DTRUE);
	m_hWeapons[5] = InitWeaponCtrl(0, 0, 410, 231, DTRUE);
	m_hWeapons[6] = InitWeaponCtrl(0, 0, 410, 254, DTRUE);
	m_hWeapons[7] = InitWeaponCtrl(0, 0, 410, 277, DTRUE);
	m_hWeapons[8] = InitWeaponCtrl(0, 0, 410, 300, DTRUE);
	m_hWeapons[9] = InitWeaponCtrl(0, 0, 410, 323, DTRUE);

	m_hWeaponNums[0] = InitWeaponNumCtrl(WEAP_MELEE, 0, 390, 116, DFALSE);
	m_hWeaponNums[1] = InitWeaponNumCtrl(0, 0, 390, 139, DTRUE);
	m_hWeaponNums[2] = InitWeaponNumCtrl(0, 0, 390, 162, DTRUE);
	m_hWeaponNums[3] = InitWeaponNumCtrl(0, 0, 390, 185, DTRUE);
	m_hWeaponNums[4] = InitWeaponNumCtrl(0, 0, 390, 208, DTRUE);
	m_hWeaponNums[5] = InitWeaponNumCtrl(0, 0, 390, 231, DTRUE);
	m_hWeaponNums[6] = InitWeaponNumCtrl(0, 0, 390, 254, DTRUE);
	m_hWeaponNums[7] = InitWeaponNumCtrl(0, 0, 390, 277, DTRUE);
	m_hWeaponNums[8] = InitWeaponNumCtrl(0, 0, 390, 300, DTRUE);
	m_hWeaponNums[9] = InitWeaponNumCtrl(0, 0, 390, 323, DTRUE);
}

//*************************************************************************

CLTGUIFadeItemCtrl* CMenuCharacter::InitFadeItemCtrl(char *lpszOptionSurfPrefix, int nSurfaces, char *lpszOptionText, DWORD dwCommandID, int x, int y)
{
	char szTempString[256];

	assert(nSurfaces > 0);

	HSURFACE *pSurfArray=new HSURFACE[nSurfaces];

	// Load the option surfaces
	int i;
	for ( i=0; i < nSurfaces; i++ )
	{		
		// Add the extra zero if we are under 10 (index < 9)
		if ( i+1 < 10 )
			sprintf(szTempString, "%s0%d.pcx", lpszOptionSurfPrefix, i+1);
		else
			sprintf(szTempString, "%s%d.pcx", lpszOptionSurfPrefix, i+1);

		pSurfArray[i]=m_pClientDE->CreateSurfaceFromBitmap(szTempString);
	}

	// Load the disabled surface
	sprintf(szTempString, "%sdis.pcx", lpszOptionSurfPrefix);
	HSURFACE hDisabledSurf=m_pClientDE->CreateSurfaceFromBitmap(szTempString);

	// Create the new menu option
	CLTGUIFadeItemCtrl *pOption=new CLTGUIFadeItemCtrl;
	if ( !pOption->Create(m_pClientDE, dwCommandID, pSurfArray, nSurfaces, hDisabledSurf, TRUE, DNULL) )
	{
		delete []pSurfArray;
		delete pOption;

		return DNULL;
	}

	pOption->SetPos(x, y);

	delete []pSurfArray;

	return pOption;
}

//*************************************************************************

CLTGUITextItemCtrl* CMenuCharacter::InitNumberCtrl(int low, int high, int index, DWORD dwCommandID, int x, int y)
{
	char	str[5];

	itoa(low, str, 10);

	HSTRING hString=m_pClientDE->CreateString(str);

	// Create the new menu option
	CLTGUITextItemCtrl *pOption = new CLTGUITextItemCtrl;
	if(!pOption->Create(m_pClientDE, dwCommandID, hString, m_pMainMenus->GetSmallFont(), 1, DTRUE, DNULL))
	{
		m_pClientDE->FreeString(hString);
		delete pOption;
		return DNULL;
	}
	m_pClientDE->FreeString(hString);

	for(int i = low + 1; i <= high; i++)
	{		
		itoa(i, str, 10);

		hString=m_pClientDE->CreateString(str);
		pOption->AddString(hString);
		m_pClientDE->FreeString(hString);
	}

	pOption->SetColor(SETRGB(220,190,170), SETRGB(125,30,0));
	pOption->SetSelIndex(index);
	pOption->SetPos(x, y);

	return pOption;
}

//*************************************************************************

CLTGUITextItemCtrl* CMenuCharacter::InitWeaponCtrl(int index, DWORD dwCommandID, int x, int y, DBOOL enable)
{
	// Create the new menu option
	HSTRING hString=m_pClientDE->CreateString("NONE");

	CLTGUITextItemCtrl *pOption = new CLTGUITextItemCtrl;
	if(!pOption->Create(m_pClientDE, dwCommandID, hString, m_pMainMenus->GetSmallFont(), 1, DTRUE, DNULL))
	{
		m_pClientDE->FreeString(hString);
		delete pOption;
		return DNULL;
	}
	m_pClientDE->FreeString(hString);

	for(int i = 1; i <= WEAP_LASTPLAYERWEAPON; i++)
	{
		hString = m_pClientDE->FormatString(g_WeaponDefaults[i - 1].m_nWeaponNameID);
		pOption->AddString(hString);
		m_pClientDE->FreeString(hString);
	}

	pOption->SetColor(SETRGB(220,190,170), SETRGB(125,30,0));
	pOption->SetSelIndex(index);
	pOption->SetPos(x, y);
	pOption->Enable(enable);

	return pOption;
}

//*************************************************************************

CLTGUITextItemCtrl* CMenuCharacter::InitWeaponNumCtrl(int index, DWORD dwCommandID, int x, int y, DBOOL enable)
{
	char	str[5];

	HSTRING hString=m_pClientDE->CreateString("0");

	// Create the new menu option
	CLTGUITextItemCtrl *pOption = new CLTGUITextItemCtrl;
	if(!pOption->Create(m_pClientDE, dwCommandID, hString, m_pMainMenus->GetSmallFont(), 1, DTRUE, DNULL))
	{
		m_pClientDE->FreeString(hString);
		delete pOption;
		return DNULL;
	}
	m_pClientDE->FreeString(hString);

	for(int i = 1; i <= WEAP_LASTPLAYERWEAPON; i++)
	{
		itoa(g_WeaponDefaults[i - 1].m_dwStrengthReq, str, 10);

		hString=m_pClientDE->CreateString(str);
		pOption->AddString(hString);
		m_pClientDE->FreeString(hString);
	}

	pOption->SetColor(SETRGB(220,190,170), SETRGB(125,30,0));
	pOption->SetSelIndex(index);
	pOption->SetPos(x, y);
	pOption->Enable(enable);

	return pOption;
}

//*************************************************************************

void CMenuCharacter::Render(HSURFACE hDestSurf)
{
	m_pClientDE->DrawSurfaceToSurfaceTransparent(hDestSurf, m_hCharacterPic, DNULL, 78, 119, m_hTransColor);

	// Render the list of options
	m_listOption.EnableBoxFormat(m_bBoxFormat);
	m_listOption.Render(hDestSurf);

	CheckSelectedLinks();

	m_hRightArrow->Render(hDestSurf);
	m_hExtraCtrl->Render(hDestSurf);
	m_hExtraNumCtrl->Render(hDestSurf);
	m_hWeaponsCtrl->Render(hDestSurf);

	for(int i = 0; i < 4; i++)
		m_hStats[i]->Render(hDestSurf);

	for(i = 0; i < 10; i++)
	{
		m_hWeaponNums[i]->Render(hDestSurf);
		m_hWeapons[i]->Render(hDestSurf);
	}
}

//*************************************************************************

void CMenuCharacter::CheckSelectedLinks()
{
	int selected = m_listOption.GetSelectedItem();

	// Toggle the right arrow with the left arrow
	m_hRightArrow->Select(selected == ARROW_CTRLS);

	// Toggle on the Extra Stats stuff with any of the other stats
	if(selected >= MIN_STAT_INDEX && selected <= MAX_STAT_INDEX)
	{
		int	extraIndex = m_hExtraNumCtrl->GetSelIndex();
		m_hExtraCtrl->Select(extraIndex);
		m_hExtraNumCtrl->Select(extraIndex);

		m_hStats[0]->Select(selected == MIN_STAT_INDEX);
		m_hStats[1]->Select(selected == MIN_STAT_INDEX + 1);
		m_hStats[2]->Select(selected == MIN_STAT_INDEX + 2);
		m_hStats[3]->Select(selected == MIN_STAT_INDEX + 3);
	}
	else
	{
		m_hExtraCtrl->Select(DFALSE);
		m_hExtraNumCtrl->Select(DFALSE);

		m_hStats[0]->Select(DFALSE);
		m_hStats[1]->Select(DFALSE);
		m_hStats[2]->Select(DFALSE);
		m_hStats[3]->Select(DFALSE);
	}

	// Toggle the Weapons title with any of the weapon fields
	if(selected >= MIN_WEAPON_INDEX && selected <= MAX_WEAPON_INDEX)
	{
		m_hWeaponsCtrl->Select(DTRUE);

		for(int i = 1; i < 10; i++)
		{
			m_hWeapons[i]->Select(selected == MIN_WEAPON_INDEX + i - 1);
			m_hWeaponNums[i]->Select(selected == MIN_WEAPON_INDEX + i - 1);
		}
	}
	else
	{
		m_hWeaponsCtrl->Select(DFALSE);

		for(int i = 1; i < 10; i++)
		{
			m_hWeapons[i]->Select(DFALSE);
			m_hWeaponNums[i]->Select(DFALSE);

⌨️ 快捷键说明

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