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

📄 menucharacter.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
	}
}

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

// This is called to determine whether we should ask the user if they wish to switch
// resolutions back to the previous resolution if it had been changed to 640x480.
void CMenuCharacter::SetResolutionSwitch(DBOOL bAsk, int nOldWidth, int nOldHeight)
{
	m_bSwitchResolutions=bAsk;
	m_nOldScreenWidth=nOldWidth;
	m_nOldScreenHeight=nOldHeight;
}

//*************************************************************************
// This is called when the menu gets or loses focus
void CMenuCharacter::OnFocus(DBOOL bFocus)
{
	if (!bFocus)
	{
		if (m_bSwitchResolutions && !m_bGoingToFilesMenu)
		{
			char szMessage[2048];
			sprintf(szMessage, "Would you like to return to your previous screen resolution of %dx%d? (Y/N)", m_nOldScreenWidth, m_nOldScreenHeight);

			HSTRING hString=m_pClientDE->CreateString(szMessage);

			m_pMainMenus->DoMessageBox(hString, this);
			m_pMainMenus->AddMessageKey(m_pMainMenus->GetYesVKeyCode(), MENU_CMD_CHARACTER_SETUP_SWITCH_RES_BACK);
			m_pMainMenus->AddMessageKey(m_pMainMenus->GetNoVKeyCode(), MENU_CMD_KILL_MESSAGEBOX);			

			m_pClientDE->FreeString(hString);
		}
		m_bGoingToFilesMenu=DFALSE;
	}
}

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

DDWORD CMenuCharacter::OnCommand(DDWORD dwCommand, DDWORD dwParam1, DDWORD dwParam2)
{	
	switch (dwCommand)
	{
		case MENU_CMD_SAVE_CHARACTER:
		{
			(m_pMainMenus->GetCharacterFiles())->SetAction(MENU_ACTION_SAVE);
			(m_pMainMenus->GetCharacterFiles())->Build();

			m_bGoingToFilesMenu=DTRUE;
			m_pMainMenus->SetCurrentMenu(MENU_ID_CHARACTERFILES);
			break;
		}

		case MENU_CMD_LOAD_CHARACTER:
		{
			(m_pMainMenus->GetCharacterFiles())->SetAction(MENU_ACTION_LOAD);
			(m_pMainMenus->GetCharacterFiles())->Build();

			m_bGoingToFilesMenu=DTRUE;
			m_pMainMenus->SetCurrentMenu(MENU_ID_CHARACTERFILES);
			break;
		}

		case MENU_CMD_DELETE_CHARACTER:
		{
			(m_pMainMenus->GetCharacterFiles())->SetAction(MENU_ACTION_DELETE);
			(m_pMainMenus->GetCharacterFiles())->Build();

			m_bGoingToFilesMenu=DTRUE;
			m_pMainMenus->SetCurrentMenu(MENU_ID_CHARACTERFILES);
			break;
		}

		case MENU_CMD_KILL_MESSAGEBOX:
		{
			m_pMainMenus->KillMessageBox();
			break;
		}

		case MENU_CMD_CHARACTER_SETUP_SWITCH_RES_BACK:
		{
			m_pMainMenus->SwitchResolution(m_nOldScreenWidth, m_nOldScreenHeight);
			m_pMainMenus->KillMessageBox();
			break;
		}
	}
	return 0;
}

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

DBOOL CMenuCharacter::SaveB2CFile(char *szFile)
{
	FILE	*file = 0;
	char	str1[128];

	if(chdir("players") != 0)
		mkdir("players");
	else
		chdir("..");

	sprintf(str1, "players\\%s.b2c", szFile);

	if(file = fopen(str1, "wb"))
	{
		fwrite(&m_Player, sizeof(B2C), 1, file);
		fclose(file);
	}
	else
		return	DFALSE;

	return	DTRUE;
}

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

DBOOL CMenuCharacter::LoadB2CFile(char *szFile)
{
	FILE	*file = 0;
	char	str1[128];

	sprintf(str1, "players\\%s", szFile);

	if(file = fopen(str1, "rb"))
	{
		fread(&m_Player, sizeof(B2C), 1, file);
		fclose(file);
	}
	else
		return	DFALSE;

	return	DTRUE;
}

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

DBOOL CMenuCharacter::DeleteB2CFile(char *szFile)
{
	char	str1[128];

	sprintf(str1, "players\\%s", szFile);

	// Don't delete the default files
	if(_mbscmp((const unsigned char*)szFile, (const unsigned char*)"caleb.b2c") == 0)	return DFALSE;
	if(_mbscmp((const unsigned char*)szFile, (const unsigned char*)"ophelia.b2c") == 0)	return DFALSE;
	if(_mbscmp((const unsigned char*)szFile, (const unsigned char*)"ishmael.b2c") == 0)	return DFALSE;
	if(_mbscmp((const unsigned char*)szFile, (const unsigned char*)"gabby.b2c") == 0)	return DFALSE;
	
	if(!remove(str1))
		return	DTRUE;
	else
		return	DFALSE;
}

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

void CMenuCharacter::ChangeCharacterPic(int index)
{
	if((index < 0) || (index >= MAX_CHARACTER_INFO))
		return;

	char file[128];
	sprintf(file, "interface\\charscreen\\characterpics\\%s", g_CharacterMenuInfo[m_PlayerIndex].szFile);

#ifdef _ADDON
	char* sPic = g_CharacterMenuInfo[m_PlayerIndex].szFile;
	if (sPic)
	{
		if (strstr(sPic, "_AO"))
		{
			strcpy(file, sPic);
		}
	}
#endif

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

	m_hCharacterPic = m_pClientDE->CreateSurfaceFromBitmap(file);

	m_Player.dwCharacter = g_CharacterMenuInfo[m_PlayerIndex].nCharacter;
	m_Player.dwColor = g_CharacterMenuInfo[m_PlayerIndex].nColor;
}

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

void CMenuCharacter::UpdateCharacterStruct()
{
	m_Player.dwCharacter	= g_CharacterMenuInfo[m_PlayerIndex].nCharacter;
	m_Player.dwColor		= g_CharacterMenuInfo[m_PlayerIndex].nColor;
	m_Player.dwStrength		= m_hStats[0]->GetSelIndex();
	m_Player.dwResist		= m_hStats[1]->GetSelIndex();
	m_Player.dwSpeed		= m_hStats[2]->GetSelIndex();
	m_Player.dwFocus		= m_hStats[3]->GetSelIndex();
	m_Player.dwWeap1		= m_hWeapons[1]->GetSelIndex();
	m_Player.dwWeap2		= m_hWeapons[2]->GetSelIndex();
	m_Player.dwWeap3		= m_hWeapons[3]->GetSelIndex();
	m_Player.dwWeap4		= m_hWeapons[4]->GetSelIndex();
	m_Player.dwWeap5		= m_hWeapons[5]->GetSelIndex();
	m_Player.dwWeap6		= m_hWeapons[6]->GetSelIndex();
	m_Player.dwWeap7		= m_hWeapons[7]->GetSelIndex();
	m_Player.dwWeap8		= m_hWeapons[8]->GetSelIndex();
	m_Player.dwWeap9		= m_hWeapons[9]->GetSelIndex();
}

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

void CMenuCharacter::SetPlayerIndexFromStruct()
{
	for(int i = 0; i < MAX_CHARACTER_INFO; i++)
	{
		if(m_Player.dwCharacter == g_CharacterMenuInfo[i].nCharacter)
			if(m_Player.dwColor == g_CharacterMenuInfo[i].nColor)
				break;
	}

	m_PlayerIndex = i;
}

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

void CMenuCharacter::UpdateScreenFromStruct()
{
	int total = m_Player.dwStrength + m_Player.dwSpeed + m_Player.dwResist + m_Player.dwFocus;
	int i;
	DBOOL nuke = DFALSE;

	// Check the total attributes
	if(total > MAX_ATTRIBUTES)		nuke = DTRUE;

	// Check the individual attributes
	if((m_Player.dwStrength < 0) || (m_Player.dwStrength > MAX_ATTRIBUTE))	nuke = DTRUE;
	if((m_Player.dwSpeed < 0) || (m_Player.dwSpeed > MAX_ATTRIBUTE))		nuke = DTRUE;
	if((m_Player.dwResist < 0) || (m_Player.dwResist > MAX_ATTRIBUTE))		nuke = DTRUE;
	if((m_Player.dwFocus < 0) || (m_Player.dwFocus > MAX_ATTRIBUTE))		nuke = DTRUE;

	if(nuke)
	{
		// If the attributes in the file are too high (someone trys to cheat) then nuke 'em
		m_PlayerIndex = 0;

		for(i = 0; i < 4; i++)
			m_hStats[i]->SetSelIndex(DEFAULT_ATTRIBUTE);

		m_hExtraNumCtrl->SetSelIndex(0);
	}
	else
	{
		// Otherwise just set them to what's in the file
		SetPlayerIndexFromStruct();

		m_hStats[0]->SetSelIndex(m_Player.dwStrength);
		m_hStats[1]->SetSelIndex(m_Player.dwResist);
		m_hStats[2]->SetSelIndex(m_Player.dwSpeed);
		m_hStats[3]->SetSelIndex(m_Player.dwFocus);
		m_hExtraNumCtrl->SetSelIndex(MAX_ATTRIBUTES - total);
	}

	// Get a pointer to the first weapon for easier loop checkin'
	DDWORD	*weapon = &(m_Player.dwWeap1);

	for(i = 1; i < 10; i++)
	{
		DDWORD	weap = weapon[i - 1];

		if((weap > 0) && (weap <= WEAP_LASTPLAYERWEAPON))
		{
			m_hWeapons[i]->SetSelIndex(weap);
			m_hWeaponNums[i]->SetSelIndex(weap);
		}
		else
		{
			m_hWeapons[i]->SetSelIndex(0);
			m_hWeaponNums[i]->SetSelIndex(0);
			weapon[i - 1] = 0;
		}
	}

	ChangeCharacterPic(m_PlayerIndex);
}

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

DBOOL CMenuCharacter::IsWeaponADupe(int index)
{
	for(int i = 0; i < 10; i++)
	{
		if(i != index)
		{
			int	index1 = m_hWeapons[index]->GetSelIndex();
			int	index2 = m_hWeapons[i]->GetSelIndex();
			if(index1 == index2) return DTRUE;
		}
	}

	return	DFALSE;
}

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

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

	// Handle left on arrows
	if(selected == ARROW_CTRLS)
	{
		m_PlayerIndex--;

		if(m_PlayerIndex < 0)
			m_PlayerIndex = MAX_CHARACTER_INFO - 1;

		ChangeCharacterPic(m_PlayerIndex);
	}

	// Handle left on stats
	if(selected >= MIN_STAT_INDEX && selected <= MAX_STAT_INDEX)
	{
		int	index1 = m_hStats[selected - MIN_STAT_INDEX]->GetSelIndex();
		int index2 = m_hExtraNumCtrl->GetSelIndex();

		if(index1 > 1)
		{
			m_hStats[selected - MIN_STAT_INDEX]->OnLeft();
			index2++;
			m_hExtraNumCtrl->SetSelIndex(index2);
		}
	}

	// Handle left on weapons
	if(selected >= MIN_WEAPON_INDEX && selected <= MAX_WEAPON_INDEX)
	{
		int value = selected - MIN_WEAPON_INDEX + 1;
		int	index1 = m_hWeapons[value]->GetSelIndex();

		// Find the next available weapon to the left or set to NONE
		if(index1 > 0)
		{
			while(1)
			{
				m_hWeapons[value]->OnLeft();
				m_hWeaponNums[value]->OnLeft();
				index1--;

				if((index1 == 0) || (!IsWeaponADupe(value)))
					break;
			}
		}
	}

	UpdateCharacterStruct();
}

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

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

	// Handle left on arrows
	if(selected == ARROW_CTRLS)
	{
		m_PlayerIndex++;

		if(m_PlayerIndex >= MAX_CHARACTER_INFO)
			m_PlayerIndex = 0;

		ChangeCharacterPic(m_PlayerIndex);
	}

	// Toggle on the Extra Stats stuff with any of the other stats
	if(selected >= MIN_STAT_INDEX && selected <= MAX_STAT_INDEX)
	{
		int	index1 = m_hStats[selected - MIN_STAT_INDEX]->GetSelIndex();
		int index2 = m_hExtraNumCtrl->GetSelIndex();

		if((index1 < MAX_ATTRIBUTE) && (index2 > 0))
		{
			m_hStats[selected - MIN_STAT_INDEX]->OnRight();
			index2--;
			m_hExtraNumCtrl->SetSelIndex(index2);
		}
	}

	// Toggle the Weapons title with any of the weapon fields
	if(selected >= MIN_WEAPON_INDEX && selected <= MAX_WEAPON_INDEX)
	{
		int value = selected - MIN_WEAPON_INDEX + 1;
		int	index1 = m_hWeapons[value]->GetSelIndex();
		int index2 = index1;
		DBOOL resetWeap = DFALSE;

		// Find the next available weapon to the left or set to NONE
		if(index2 < WEAP_LASTPLAYERWEAPON)
		{
			while(1)
			{
				m_hWeapons[value]->OnRight();
				m_hWeaponNums[value]->OnRight();
				index2++;

				if(!IsWeaponADupe(value))
					break;
				else if((index2 == WEAP_LASTPLAYERWEAPON) && (IsWeaponADupe(value)))
				{
					resetWeap = DTRUE;
					break;
				}
			}
		}

		// If there wasn't a valid weapon to the right... then reset it to what it was
		if(resetWeap)
		{
			m_hWeapons[value]->SetSelIndex(index1);
			m_hWeaponNums[value]->SetSelIndex(index1);
		}
	}

	UpdateCharacterStruct();
}

⌨️ 快捷键说明

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