📄 statusbar.cpp
字号:
if(m_bCSSelectState == 2) LoadB2CFile(m_pCharFileIndex);
if(m_bCSSelectState == 3) DeleteB2CFile(m_pCharFileIndex);
m_bCSSelectState = 0;
m_pCharFileIndex = 0;
m_pClientDE->FreeFileList(m_pCharFiles);
m_pCharFiles = 0;
return 1;
case VK_UP:
case VK_LEFT:
return HandleCharScreenLeft();
case VK_DOWN:
case VK_RIGHT:
return HandleCharScreenRight();
}
return 0;
}
if(m_bCSInputState)
{
if(m_bCSInputState == 1) m_szCSInputString = m_szCSNameString;
else m_szCSInputString = m_szCSSaveFile;
if(m_bCSInputChar < SB_MAX_CS_STRING_SIZE - 1)
{
if((key >= VK_0) && (key <= VK_9))
{
m_szCSInputString[m_bCSInputChar - 1] = key;
m_szCSInputString[m_bCSInputChar++] = '_';
m_szCSInputString[m_bCSInputChar] = 0;
return 1;
}
if((key >= VK_A) && (key <= VK_Z))
{
m_szCSInputString[m_bCSInputChar - 1] = key;
m_szCSInputString[m_bCSInputChar++] = '_';
m_szCSInputString[m_bCSInputChar] = 0;
return 1;
}
if(key == VK_SPACE)
{
m_szCSInputString[m_bCSInputChar - 1] = ' ';
m_szCSInputString[m_bCSInputChar++] = '_';
m_szCSInputString[m_bCSInputChar] = 0;
return 1;
}
}
if((key == VK_BACK) && (m_bCSInputChar > 1))
{
m_bCSInputChar--;
m_szCSInputString[m_bCSInputChar] = 0;
m_szCSInputString[m_bCSInputChar - 1] = '_';
return 1;
}
if(key == VK_RETURN)
{
m_bCSInputChar--;
m_szCSInputString[m_bCSInputChar] = 0;
if(m_bCSInputState == 2) SaveB2CFile();
m_bCSInputState = 0;
// m_bCSInputChar = 0;
m_szCSInputString = 0;
return 1;
}
if(key == VK_ESCAPE)
{
m_bCSInputState = 0;
memset(m_szCSInputString, 0, SB_MAX_CS_STRING_SIZE);
m_szCSInputString = 0;
// m_bCSInputChar = 0;
return 1;
}
return 0;
}
switch(key)
{
case VK_DOWN:
case VK_W:
do
{
m_bCSCurrentField++;
if(m_bCSCurrentField >= SB_NUM_CSFIELDS) m_bCSCurrentField = 0;
}
while(!(m_pCSFieldList[m_bCSCurrentField].active));
return 1;
case VK_UP:
case VK_Q:
do
{
m_bCSCurrentField--;
if(m_bCSCurrentField < 0) m_bCSCurrentField = SB_NUM_CSFIELDS - 1;
}
while(!(m_pCSFieldList[m_bCSCurrentField].active));
return 1;
case VK_RIGHT:
case 0xDD:
return HandleCharScreenRight();
case VK_LEFT:
case 0xDB:
return HandleCharScreenLeft();
case VK_ESCAPE:
if(m_bCSSelectState)
{
m_bCSSelectState = 0;
LoadB2CFile(m_pCharFileIndex);
m_pCharFileIndex = 0;
m_pClientDE->FreeFileList(m_pCharFiles);
m_pCharFiles = 0;
}
else
{
TermCharScreen();
m_pClientDE->SetInputState(DTRUE);
}
return 1;
case VK_RETURN:
switch(m_pCSFieldList[m_bCSCurrentField].use)
{
case SB_CSFIELD_NEWNAME:
m_bCSInputState = 1;
memset(m_szCSNameString, 0, SB_MAX_CS_STRING_SIZE);
m_szCSNameString[0] = '_';
m_bCSInputChar = 1;
break;
case SB_CSFIELD_LOADSKIN:
break;
case SB_CSFIELD_SAVECHAR:
m_bCSInputState = 2;
memset(m_szCSSaveFile, 0, SB_MAX_CS_STRING_SIZE);
m_szCSSaveFile[0] = '_';
m_bCSInputChar = 1;
break;
case SB_CSFIELD_LOADCHAR:
m_bCSSelectState = 2;
m_bCharFileNum = 0;
if(m_pCharFiles) m_pClientDE->FreeFileList(m_pCharFiles);
m_pCharFiles = m_pClientDE->GetFileList("B2CFiles");
m_pCharFileIndex = m_pCharFiles;
break;
case SB_CSFIELD_DELETECHAR:
m_bCSSelectState = 3;
m_bCharFileNum = 0;
if(m_pCharFiles) m_pClientDE->FreeFileList(m_pCharFiles);
m_pCharFiles = m_pClientDE->GetFileList("B2CFiles");
m_pCharFileIndex = m_pCharFiles;
break;
case SB_CSFIELD_ACCEPT:
TermCharScreen();
m_pClientDE->SetInputState(DTRUE);
return 2;
case SB_CSFIELD_CANCEL:
TermCharScreen();
m_pClientDE->SetInputState(DTRUE);
break;
}
return 1;
}
return 0;
}
//*************************************************************************
//***** Function: HandleCharScreenLeft()
//***** Details:
//*************************************************************************
char CStatusBar::HandleCharScreenLeft()
{
char use = m_pCSFieldList[m_bCSCurrentField].use;
switch(use)
{
case SB_CSFIELD_VALUE:
if((m_bCSCurrentField != 3) && (m_pCSFieldList[m_bCSCurrentField].num2 == 1))
return 1;
if(m_pCSFieldList[m_bCSCurrentField].num2 > 0)
{
m_pCSFieldList[m_bCSCurrentField].num2--;
m_cfExtraPoints.num2++;
}
return 1;
case SB_CSFIELD_SELECT:
{
char type = m_pCSFieldList[m_bCSCurrentField].type;
char i, start, num, selected;
switch(type)
{
case 1: start = 4; num = 3; break; // Binding list
case 2: start = 7; num = 10; break; // Weapon list
case 5: start = 19; num = 4; break; // Item list
case 6: start = 23; num = 6; break; // Spell list
}
selected = m_pCSFieldList[m_bCSCurrentField].name;
while(selected > 0)
{
selected--;
for(i = start; i < start + num; i++)
if(selected && (selected == m_pCSFieldList[i].name)) break;
if(i == start + num)
{ m_pCSFieldList[m_bCSCurrentField].name = selected; break; }
}
return 1;
}
case SB_CSFIELD_NEWNAME:
return 1;
case SB_CSFIELD_LOADCHAR:
case SB_CSFIELD_DELETECHAR:
if(m_bCSSelectState && (m_bCharFileNum > 0))
{
m_bCharFileNum--;
m_pCharFileIndex = m_pCharFiles;
for(char i = 0; i < m_bCharFileNum; i++)
m_pCharFileIndex = m_pCharFileIndex->m_pNext;
}
return 1;
}
return 0;
}
//*************************************************************************
//***** Function: HandleCharScreenRight()
//***** Details:
//*************************************************************************
char CStatusBar::HandleCharScreenRight()
{
char use = m_pCSFieldList[m_bCSCurrentField].use;
switch(use)
{
case SB_CSFIELD_VALUE:
if(m_cfExtraPoints.num2 > 0)
{
if((m_bCSCurrentField == 3) && (m_pCSFieldList[m_bCSCurrentField].num2 == 4))
return 1;
if(m_pCSFieldList[m_bCSCurrentField].num2 < 5)
{
m_pCSFieldList[m_bCSCurrentField].num2++;
m_cfExtraPoints.num2--;
}
}
return 1;
case SB_CSFIELD_SELECT:
{
char type = m_pCSFieldList[m_bCSCurrentField].type;
char i, start, num, selected;
switch(type)
{
case 1: start = 4; num = 3; break; // Binding list
case 2: start = 7; num = 10; break; // Weapon list
case 5: start = 19; num = 4; break; // Item list
case 6: start = 23; num = 6; break; // Spell list
}
selected = m_pCSFieldList[m_bCSCurrentField].name;
while(selected < m_pCSBoxes[type].max - 1)
{
selected++;
for(i = start; i < start + num; i++)
if(selected == m_pCSFieldList[i].name) break;
if(i == start + num)
{ m_pCSFieldList[m_bCSCurrentField].name = selected; break; }
}
return 1;
}
case SB_CSFIELD_NEWNAME:
return 1;
case SB_CSFIELD_LOADCHAR:
case SB_CSFIELD_DELETECHAR:
if(m_bCSSelectState && m_pCharFileIndex->m_pNext)
{
m_bCharFileNum++;
m_pCharFileIndex = m_pCharFiles;
for(char i = 0; i < m_bCharFileNum; i++)
m_pCharFileIndex = m_pCharFileIndex->m_pNext;
}
return 1;
}
return 0;
}
//*************************************************************************
//***** Function: StartCommunication(char chosen, char *szFile, char *szText)
//***** Details: Draws all active in-game interfaces
//*************************************************************************
char CStatusBar::StartCommunication(char chosen, char *szFile, char *szText)
{
if(m_bCommState) return 0;
m_bCommState = 1;
m_bCommPic = chosen;
memset(m_szCommVoice, 0, 100);
strcpy(m_szCommVoice, szFile);
memset(m_szCommText, 0, 200);
strcpy(m_szCommText, szText);
m_fCommLength = strlen(szText) / 15.0f;
if(m_fCommLength < 1.5f) m_fCommLength = 1.5f;
if( m_sCommSound )
{
g_pClientDE->KillSound( m_sCommSound );
m_sCommSound = 0;
}
if(szFile && strcmp(szFile, "default.wav"))
m_bPlayVoice = 1;
else
m_bPlayVoice = 0;
m_fCommStartTime = m_pClientDE->GetTime();
return 1;
}
//*************************************************************************
//***** Function: Draw()
//***** Details: Draws all active in-game interfaces
//*************************************************************************
void CStatusBar::Draw(DBOOL bDrawBar)
{
if (!m_pClientDE) return;
HSURFACE hScreen = m_pClientDE->GetScreenSurface();
// Always draw this.. GK 9/1
if(m_bCommState) DrawCommunication(hScreen);
// this stuff depends on whether the status bar is visible..
if (bDrawBar)
{
if(m_bCharScreenOn) { DrawCharacterScreen(hScreen); return; }
if(m_bSpellbookOn) { DrawSpellbook(hScreen); return; }
if(m_bStatsOn) DrawStatTabs(hScreen);
if(m_bKeysOn) DrawKeyTabs(hScreen);
if(m_bInfoOn) DrawInfoTab(hScreen);
switch(m_bInventoryOn)
{
case 0: if(m_bStatsOn) DrawItemTabs(hScreen); break;
case 1: HandleItemInventory(hScreen); break;
// case 2: HandleSpellInventory(hScreen); break;
}
if(m_bEquipOn) DrawEquipTab(hScreen);
}
}
//*************************************************************************
//***** Function: DrawCommunication(HSURFACE hScreen)
//***** Details: Draws the communication link at the top left
//*************************************************************************
void CStatusBar::DrawCommunication(HSURFACE hScreen)
{
DRect locRect;
DFLOAT currentTime = m_pClientDE->GetTime();
DFLOAT ratio, dif;
HDECOLOR white = m_pClientDE->SetupColor1(1.0f, 1.0f, 1.0f, DFALSE);
locRect.top = 0;
locRect.bottom = SB_CHARPIC_SIZE;
locRect.left = SB_CHARPIC_SIZE * m_bCommPic;
locRect.right = locRect.left + SB_CHARPIC_SIZE;
switch(m_bCommState)
{
case 1:
dif = currentTime - m_fCommStartTime;
if(dif > SB_COMMLINK_TIME_1)
{
m_bCommState = 2;
m_fCommStartTime = currentTime;
ratio = 0.0;
}
else
ratio = 1.0f - (dif / SB_COMMLINK_TIME_1);
m_pClientDE->DrawSurfaceToSurface(hScreen, m_hCharFaces, &locRect, m_nCommPicX, (DDWORD)(m_nCommPicY - ((m_nCommPicY - m_nCommPicStartY) * ratio)));
break;
case 2:
if(currentTime - m_fCommStartTime > SB_COMMLINK_TIME_2)
{
m_bCommState = 3;
if(m_bPlayVoice)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -