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