📄 statusbar.cpp
字号:
// m_pStatFont4 = new CoolFont();
// m_pStatFont4->Init(m_pClientDE, "interface/fonts/fixedsys8x14.pcx");
// m_pStatFont4->CalcAll(8, 14);
// Setup cursor with specific font
m_pStatCursor = new CoolFontCursor();
m_pStatCursor->SetFont(m_pStatFont2);
m_pStatCursor->SetJustify(CF_JUSTIFY_CENTER);
m_pInfoCursor = new CoolFontCursor();
m_pInfoCursor->SetFont(m_pStatFont1);
m_pEquipCursor = new CoolFontCursor();
m_pEquipCursor->SetFont(m_pStatFont2);
// Setup transparency color
m_hTransColor = m_pClientDE->SetupColor1(1.0f, 0.0f, 1.0f, DFALSE);
// Init Key list
m_hFirstKey.next = &m_hLastKey;
m_hLastKey.prev = &m_hFirstKey;
// Init tab locations
AdjustRes();
// Init inventory lists
ClearItems();
ClearSpells();
SetupEquipList();
return DTRUE;
}
//*************************************************************************
//***** Function: AdjustRes()
//***** Details: Sets new locations for status tabs if the game resolution changes
//*************************************************************************
void CStatusBar::AdjustRes()
{
if (!m_pClientDE) return;
HSURFACE hScreen = m_pClientDE->GetScreenSurface();
m_pClientDE->GetSurfaceDims (hScreen, &m_nScreenWidth, &m_nScreenHeight);
m_nHealthX = 0;
m_nArmorX = SB_STATTAB_SIZE_X;
m_nAmmoX = m_nScreenWidth - SB_STATTAB_SIZE_X;
m_nManaX = m_nAmmoX - SB_STATTAB_SIZE_X;
m_nHealthY = m_nArmorY = m_nManaY = m_nAmmoY = m_nScreenHeight - SB_STATTAB_SIZE_Y;
m_nItemX = SB_STATTAB_SIZE_X << 1;
m_nSpellX = m_nScreenWidth - m_nItemX - SB_INVICON_SIZE_X;
m_nInventoryY = m_nItemY = m_nSpellY = m_nScreenHeight - SB_INVICON_SIZE_Y;
if(!m_bStatsOn) m_nInventoryY = m_nScreenHeight;
m_nCommPicX = m_nCommPicY = 25;
m_nCommPicStartY = -50;
m_nCommTextX = 85;
m_nCommTextY = 25;
m_nCommTextWidth = (short)m_nScreenWidth - 25 - 85;
m_pStatCursor->SetLoc((short)(m_nScreenWidth >> 1), (short)(m_nScreenHeight - 25));
m_hFirstKey.currentY = (short)m_nScreenHeight - SB_STATTAB_SIZE_Y;
m_nInfoX = (short)m_nScreenWidth - SB_INFOTAB_SIZE_X;
m_nEquipX = (m_nScreenWidth >> 1) - (SB_EQUIP_SIZE_X >> 1);
m_nEquipY = (m_nScreenHeight >> 1) - (SB_EQUIP_SIZE_Y >> 1);
}
//*************************************************************************
//***** Function: Term()
//***** Details: Terminates the status screens
//*************************************************************************
void CStatusBar::Term()
{
if (m_pClientDE)
{
if(m_hStatTabs) { m_pClientDE->DeleteSurface(m_hStatTabs); m_hStatTabs = 0; }
if(m_hStatIcons) { m_pClientDE->DeleteSurface(m_hStatIcons); m_hStatIcons = 0; }
if(m_hStatNums) { m_pClientDE->DeleteSurface(m_hStatNums); m_hStatNums = 0; }
if(m_hItemIcons) { m_pClientDE->DeleteSurface(m_hItemIcons); m_hItemIcons = 0; }
if(m_hSpellIcons) { m_pClientDE->DeleteSurface(m_hSpellIcons); m_hSpellIcons = 0; }
if(m_hItemLight) { m_pClientDE->DeleteSurface(m_hItemLight); m_hItemLight = 0; }
if(m_hSpellLight) { m_pClientDE->DeleteSurface(m_hSpellLight); m_hSpellLight = 0; }
if(m_hKeyTabs) { m_pClientDE->DeleteSurface(m_hKeyTabs); m_hKeyTabs = 0; }
if(m_hEquipTab) { m_pClientDE->DeleteSurface(m_hEquipTab); m_hEquipTab = 0; }
if(m_hEquipCursor) { m_pClientDE->DeleteSurface(m_hEquipCursor); m_hEquipCursor = 0; }
if(m_hCharFaces) { m_pClientDE->DeleteSurface(m_hCharFaces); m_hCharFaces = 0; }
if(m_pStatCursor) { delete m_pStatCursor; m_pStatCursor = 0; }
if(m_pInfoCursor) { delete m_pInfoCursor; m_pInfoCursor = 0; }
if(m_pEquipCursor) { delete m_pEquipCursor; m_pEquipCursor = 0; }
if(m_pStatFont1) { m_pStatFont1->Free(); delete m_pStatFont1; m_pStatFont1 = 0; }
if(m_pStatFont2) { m_pStatFont2->Free(); delete m_pStatFont2; m_pStatFont2 = 0; }
if(m_pStatFont3) { m_pStatFont3->Free(); delete m_pStatFont3; m_pStatFont3 = 0; }
if(m_pStatFont4) { m_pStatFont4->Free(); delete m_pStatFont4; m_pStatFont4 = 0; }
ClearKeys();
ClearItems();
ClearSpells();
TermSpellbook();
m_pClientDE = 0;
}
}
//*************************************************************************
//***** Function: InitSpellbook()
//***** Details: Allocate and setup the spellbook interface
//*************************************************************************
DBOOL CStatusBar::InitSpellbook()
{
m_pClientDE->SetInputState (DFALSE);
m_hSpellBG = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spellBG.pcx");
m_hSpellsLo = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spellsLo.pcx");
m_hSpellsHi = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spellsHi.pcx");
m_hSpellSymbols = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spellSymbols.pcx");
m_hSpellCursor = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spellCursor.pcx");
m_hSpellDot = m_pClientDE->CreateSurfaceFromBitmap("interface/spellbook/spelldot.pcx");
m_pSpellFont1 = new CoolFont();
m_pSpellFont1->Init(m_pClientDE, "interface/fonts/SpellFont1.pcx");
m_pSpellFont1->LoadXWidths("blood2/interface/fonts/SpellFont1.fnt");
m_pSpellFont2 = new CoolFont();
m_pSpellFont2->Init(m_pClientDE, "interface/fonts/SpellFont2.pcx");
m_pSpellFont2->LoadXWidths("blood2/interface/fonts/SpellFont2.fnt");
m_pSpellCursor = new CoolFontCursor();
m_pSpellCursor->SetFont(m_pSpellFont1);
m_bSpellbookOn = 1;
return 1;
}
//*************************************************************************
//***** Function: TermSpellbook()
//***** Details: Release any memory used by the spellbook interface
//*************************************************************************
void CStatusBar::TermSpellbook()
{
m_bSpellbookOn = 0;
if(m_hSpellBG) { m_pClientDE->DeleteSurface(m_hSpellBG); m_hSpellBG = 0; }
if(m_hSpellsLo) { m_pClientDE->DeleteSurface(m_hSpellsLo); m_hSpellsLo = 0; }
if(m_hSpellsHi) { m_pClientDE->DeleteSurface(m_hSpellsHi); m_hSpellsHi = 0; }
if(m_hSpellSymbols) { m_pClientDE->DeleteSurface(m_hSpellSymbols); m_hSpellSymbols = 0; }
if(m_hSpellCursor) { m_pClientDE->DeleteSurface(m_hSpellCursor); m_hSpellCursor = 0; }
if(m_hSpellDot) { m_pClientDE->DeleteSurface(m_hSpellDot); m_hSpellDot = 0; }
if(m_pSpellCursor) { delete m_pSpellCursor; m_pSpellCursor = 0; }
if(m_pSpellFont1) { m_pSpellFont1->Free(); delete m_pSpellFont1; m_pSpellFont1 = 0; }
if(m_pSpellFont2) { m_pSpellFont2->Free(); delete m_pSpellFont2; m_pSpellFont2 = 0; }
}
//*************************************************************************
//***** Function: InitCharScreen()
//***** Details: Allocate and setup the character screen interface
//*************************************************************************
DBOOL CStatusBar::InitCharScreen()
{
short i;
m_hCharFields = m_pClientDE->CreateSurfaceFromBitmap("interface/status/characterfields.pcx");
m_pCharFont1 = new CoolFont();
m_pCharFont1->Init(m_pClientDE, "interface/fonts/MenuFont1.pcx");
m_pCharFont1->LoadXWidths("blood2/interface/fonts/MenuFont1.fnt");
m_pCharCursor = new CoolFontCursor();
m_pCharCursor->SetFont(m_pCharFont1);
memset(m_pCSBoxes, 0, sizeof(CCharBox) * SB_NUM_CSBOXES);
memset(m_pCSFieldList, 0, sizeof(CCharField) * SB_NUM_CSFIELDS);
memset(&m_cfExtraPoints, 0, sizeof(CCharField));
memset(m_rCSFields, 0, sizeof(DRect) * SB_NUM_BOXTYPES);
for(i = 0; i < SB_NUM_CSBOXES; i++)
{
m_pCSBoxes[i].box = g_FieldBoxTypes[i];
m_pCSBoxes[i].x = g_FieldBoxesXLoc[i];
m_pCSBoxes[i].y = g_FieldBoxesYLoc[i];
}
m_pCSBoxes[0].list = g_FieldStatNames;
m_pCSBoxes[1].list = g_BindingNames;
m_pCSBoxes[2].list = g_WeaponNames;
m_pCSBoxes[3].list = g_CharacterNames;
m_pCSBoxes[4].list = g_SkinNames;
m_pCSBoxes[5].list = g_ItemNames;
m_pCSBoxes[6].list = g_SpellNames;
m_pCSBoxes[7].list = g_FieldStatNames;
m_pCSBoxes[8].list = g_FieldStatNames;
m_pCSBoxes[9].list = g_FieldStatNames;
m_pCSBoxes[10].list = g_FieldStatNames;
m_pCSBoxes[11].list = g_FieldStatNames;
m_pCSBoxes[1].max = 16;
m_pCSBoxes[2].max = 33;
m_pCSBoxes[3].max = 5;
m_pCSBoxes[4].max = 4;
m_pCSBoxes[5].max = 9;
m_pCSBoxes[6].max = 15;
m_pCSBoxes[7].max = 1;
m_pCSBoxes[8].max = 1;
m_pCSBoxes[9].max = 1;
m_pCSBoxes[10].max = 1;
m_pCSBoxes[11].max = 1;
for(i = 0; i < SB_NUM_BOXTYPES; i++)
{
m_rCSFields[i].left = 0;
m_rCSFields[i].right = SB_CHARFIELD_SIZE_X;
m_rCSFields[i].top = g_FieldBoxesYPos[i];
m_rCSFields[i].bottom = g_FieldBoxesYPos[i + 1];
}
for(i = 0; i < SB_NUM_CSFIELDS; i++)
{
m_pCSFieldList[i].type = g_FieldTypes[i];
// if(m_bMultiInfo)
m_pCSFieldList[i].active = g_FieldActiveM[i];
// else
// m_pCSFieldList[i].active = g_FieldActiveS[i];
m_pCSFieldList[i].use = g_FieldUses[i];
m_pCSFieldList[i].name = g_FieldNames[i];
m_pCSFieldList[i].justify = g_FieldJustify[i];
m_pCSFieldList[i].x = g_FieldXOffset[i];
m_pCSFieldList[i].y = g_FieldYOffset[i];
}
m_pCSFieldList[0].num1 = m_pCSFieldList[0].num2 = 2;
m_pCSFieldList[1].num1 = m_pCSFieldList[1].num2 = 2;
m_pCSFieldList[2].num1 = m_pCSFieldList[2].num2 = 2;
m_pCSFieldList[3].num1 = m_pCSFieldList[3].num2 = 1;
m_cfExtraPoints.num1 = m_cfExtraPoints.num2 = 4;
m_cfExtraPoints.x = 5;
m_cfExtraPoints.y = 88;
m_bCharScreenOn = 1;
m_bCSCurrentField = 0;
m_bCSInputState = 0;
m_szCSInputString = 0;
memset(m_szCSNameString, 0, SB_MAX_CS_STRING_SIZE);
memset(m_szCSSaveFile, 0, SB_MAX_CS_STRING_SIZE);
m_bCSInputChar = 0;
m_bCSSelectState = 0;
m_pCharFiles = 0;
m_pCharFileIndex = 0;
m_bCharFileNum = 0;
return 1;
}
//*************************************************************************
//***** Function: TermCharScreen()
//***** Details: Release any memory used by the character screen interface
//*************************************************************************
void CStatusBar::TermCharScreen()
{
m_bCharScreenOn = 0;
if(m_hCharFields) { m_pClientDE->DeleteSurface(m_hCharFields); m_hCharFields = 0; }
if(m_pCharCursor) { delete m_pCharCursor; m_pCharCursor = 0; }
if(m_pCharFont1) { m_pCharFont1->Free(); delete m_pCharFont1; m_pCharFont1 = 0; }
}
//*************************************************************************
//***** Function: SetupStatStrings(char **w, char numW, char **i, char numI, char **s, char numS)
//***** Details:
//*************************************************************************
/*void CStatusBar::SetupStatStrings(char **w, char numW, char **i, char numI, char **s, char numS, char **b, char numB)
{
m_hWeaponNames = w;
m_nTotalWeapons = numW;
m_hItemNames = i;
m_nTotalItems = numI;
m_hSpellNames = s;
m_nTotalSpells = numS;
m_hBindingNames = b;
m_nTotalBindings = numB;
}*/
//*************************************************************************
//***** Function: AddKey(char type)
//***** Details: Adds a new key to the end of the current key list
//*************************************************************************
DBOOL CStatusBar::AddKey(char type)
{
CKeyTab *key = m_hFirstKey.next;
while(key->next)
{
if(key->type == type) return 0;
key = key->next;
}
key = new CKeyTab;
key->prev = m_hLastKey.prev;
key->next = &m_hLastKey;
m_hLastKey.prev->next = key;
m_hLastKey.prev = key;
key->type = type;
key->currentX = -SB_KEYTAB_SIZE_X;
key->currentY = key->prev->currentY - SB_KEYTAB_SIZE_Y;
key->locYTop = type * SB_KEYTAB_SIZE_Y;
key->locYBottom = key->locYTop + SB_KEYTAB_SIZE_Y;
key->startTime = m_pClientDE->GetTime();
key->direction = 1;
return 1;
}
//*************************************************************************
//***** Function: RemoveKey(char type)
//***** Details: Removes a specific key from anywhere in the current key list
//*************************************************************************
DBOOL CStatusBar::RemoveKey(char type)
{
CKeyTab *set, *key = m_hFirstKey.next;
DBOOL removeKey = 0;
DFLOAT time;
while(key->next)
{
if(key->type == type) { removeKey = 1; break; }
key = key->next;
}
if(removeKey)
{
set = key->next;
key->prev->next = key->next;
key->next->prev = key->prev;
key->prev = key->next = 0;
delete key;
time = m_pClientDE->GetTime();
while(set->next)
{
set->direction = 2;
set->startTime = time;
set = set->next;
}
return 1;
}
return 0;
}
//*************************************************************************
//***** Function: ClearKeys()
//***** Details: Removes all keys
//*************************************************************************
void CStatusBar::ClearKeys()
{
CKeyTab *key = m_hFirstKey.next;
while(key->next)
RemoveKey(key->type);
}
//*************************************************************************
//***** Function: AddItem(char type)
//***** Details: Add a specific item to the player's inventory
//*************************************************************************
DBOOL CStatusBar::AddItem(char type)
{
CInventoryItem *tempItem;
char i;
for(i = 0; i < SB_NUM_ITEMS; i++)
if(m_hItems[i].type == type) { m_hItems[i].amount++; return 1; }
if(m_nNumItems == SB_NUM_ITEMS) return 0;
for(i = 0; i < SB_NUM_ITEMS; i++)
if(!m_hItems[i].type) { tempItem = &(m_hItems[i]); break; }
tempItem->type = type;
tempItem->slot = i;
tempItem->amount = 1;
tempItem->locXLeft = type * SB_INVICON_SIZE_X;
tempItem->locXRight = tempItem->locXLeft + SB_INVICON_SIZE_X;
m_nNumItems++;
m_hSelectedItem = tempItem;
m_bCurrentItem = m_hSelectedItem->type;
tempItem = 0;
SetupEquipList();
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -