📄 menucharacter.cpp
字号:
//*************************************************************************
//*************************************************************************
//***** 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 + -