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

📄 statusbar.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//*************************************************************************
//*************************************************************************
//***** MODULE  : StatusBar.cpp
//***** PURPOSE : Blood 2 Status Bar
//***** CREATED : 11/4/97
//***** MODIFIED: 3/30/98
//*************************************************************************
//*************************************************************************

#include "ClientRes.h"
#include "StatusBar.h"
#include "VKDefs.h"
#include "SharedDefs.h"
#include "ClientUtilities.h"
#include <stdio.h>

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

static short g_NumberXOffsets[10] = {0, 22, 44, 66, 88, 110, 132, 154, 176, 198};
static short g_NumberYOffsets[5] = {0, 28, 56, 84, 112};
static short g_ItemXOffsets[8] = {-108, -72, -36, 0, 36, 72, 108, 144};
static short g_SpellXOffsets[6] = {-108, -72, -36, 0, 36, 72};

static char  g_SpellNameFix[14] = {0,1,2,3,4,5,6,13,8,10,11,12,9,7};
static short g_SpellNameYOffsets[15] = {0,26,53,80,106,134,161,187,213,239,265,292,317,344,371};
static short g_SpellNameYLocs[14] = {84,110,135,162,188,212,239,265,291,315,341,368,393,417};
static short g_SpellCursorYLocs[14] = {68,93,118,145,170,197,222,246,273,298,325,351,374,401};
static short g_SpellDotYLocs[14] = {88,115,140,164,191,216,241,267,293,318,345,370,396,422};

static char  g_FieldBoxTypes[12] = {2,3,4,0,0,5,6,0,0,0,0,0};
static short g_FieldBoxesYPos[8] = {0,20,40,145,216,406,494,616};
static short g_FieldBoxesXLoc[12] = {15,15,15,235,235,455,455,455,455,455,455,455};
static short g_FieldBoxesYLoc[12] = {15,162,275,415,435,15,143,305,340,375,410,445};

static char  g_FieldNames[34]   = {0,1,2,3,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,5,6,7,8};
static char  g_FieldTypes[34]   = {0,0,0,0,1,1,1,2,2,2,2,2,2,2,2,2,2,3,4,5,5,5,5,6,6,6,6,6,6,7,8,9,10,11};
static char  g_FieldActiveS[34] = {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1};
static char  g_FieldActiveM[34] = {1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
static char  g_FieldUses[34]    = {0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,/**/2,3,1,1,1,1,1,1,1,1,1,1,4,5,6,7,8};
static char  g_FieldJustify[34] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1};
static short g_FieldXOffset[34] = {5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,85,85,5,5,5,5,5,5,5,5,5,5,85,85,85,85,85};
static short g_FieldYOffset[34] = {19,37,54,71,19,37,54,19,37,54,71,88,105,122,139,156,173,3,3,19,37,54,71,19,37,54,71,88,105,3,3,3,3,3};

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

static char *g_WeaponNames[33] =
{
	"<EMPTY>\0",
	"BERETTA\0",
	"SUB MACHINE GUN\0",
	"PULSE GUN\0",
	"FLARE GUN\0",
	"SHOTGUN\0",
	"SNIPER RIFLE\0",
	"COMBAT SHOTGUN\0",
	"RG LAUNCHER\0",
	"ASSAULT CANNON\0",
	"MISSILE LAUNCHER\0",
	"ENERGY CANNON\0",
	"CARBON FREEZER\0",
	"PARTICLE GUN\0",
	"SINGULARITY GUN\0",
	"ASSAULT RIFLE\0",
	"FLAMER\0",
	"MINIGUN\0",
	"LASER RIFLE\0",
	"MICROWAVE GUN\0",
	"GYROJET GUN\0",
	"TESLA CANNON\0",
	"VOODOO DOLL\0",
	"DEADLY DISC\0",
	"LIFE LEECH\0",
	"FLAYER\0",
	"SLICER\0",
	"WITHERING HAND\0",
	"DISINTEGRATOR\0",
	"EXPLOSIVE FIST\0",
	"BURN\0",
	"LIGHTNING STORM\0",
	"KNIFE\0"
};

static char g_WeaponStr[33] = {0,1,2,3,2,3,4,3,3,6,5,6,4,4,5,3,2,5,4,3,4,3,0,0,0,0,0,0,0,0,0,0,1};
static char g_WeaponFoc[33] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,4,2,2,2,3,4,3,4,0};
static char	*g_ItemNames[14] =
{
	"<EMPTY>\0",
	"MEDICAL KIT\0",
	"NIGHT VISION\0",
	"DEFENSE GLOBE\0",
	"THE EYE\0",
	"BINOCULARS\0",
	"PORTAL\0",
	"CLOAK\0",
	"FLASHLIGHT\0",
	"SPELL BOOK\0",
	"PROX BOMB\0",
	"REMOTE BOMB\0",
	"SMOKE BOMB\0",
	"TIME BOMB\0"
};

static char	*g_SpellNames[15] =
{
	"<EMPTY>\0",
	"SHIELD\0",
	"REFLECTION\0",
	"STONE\0",
	"TELEPORT\0",
	"ANIMATION\0",
	"SPEED\0",
	"HEAL\0",
	"CLAIRVOYANCE\0",
	"AURA\0",
	"FORCE WALL\0",
	"DOUBLE\0",
	"DARKNESS\0",
	"ILLUSION\0",
	"GRIM COMMUNION\0"
};

static char *g_BindingNames[16] =
{
	"<EMPTY>\0",
	"STRENGTH\0",
	"SPEED\0",
	"RESISTANCE\0",
	"FOCUS\0",
	"JUMPING\0",
	"CLIMB\0",
	"STEALTH\0",
	"PROTECTION\0",
	"CONSTITUTION\0",
	"REGENERATION\0",
	"IMPACT RESISTANCE\0",
	"QUICKNESS\0",
	"DAMAGE\0",
	"BLENDING\0",
	"SOUL STEALING\0"
};

static char *g_EquipTitles[3] =
{
	"WEAPONS:\0",
	"ITEMS:\0",
	"SPELLS:\0"
};

static char *g_SpellRequires[14] =
{
	" MAGIC: 1| FOCUS: SPECIAL\0",
	" MAGIC: 1| FOCUS: SPECIAL\0",
	" MAGIC: 2| FOCUS: 200\0",
	" MAGIC: 2| FOCUS: 200\0",
	" MAGIC: 2| FOCUS: 200\0",
	" MAGIC: 1| FOCUS: 100\0",
	" MAGIC: 1| FOCUS: SPECIAL\0",
	" MAGIC: 1| FOCUS: 100\0",
	" MAGIC: 1| FOCUS: 100\0",
	" MAGIC: 2| FOCUS: 150\0",
	" MAGIC: 1| FOCUS: 50\0",
	" MAGIC: 1| FOCUS: 100\0",
	" MAGIC: 1| FOCUS: 100\0",
	" MAGIC: 2| FOCUS: 150\0"
};

static char *g_SpellInfo[14] =
{
	"~A MAGICAL BARRIER THAT, WHEN ACTIVATED, WILL DETRACT PHYSICAL DAMAGE FROM YOUR FOCUS INSTEAD OF YOUR HEALTH.\0",
	"~REFLECTS ATTACKS BACK AT THEIR ORIGIN. THE MORE POWERFUL THE ATTACK, THE MORE FOCUS USED.|~INEFFECTIVE AGAINST AREA OF EFFECT DAMAGE.\0",
	"~TURNS THE CASTER TO STONE FOR A FEW SECONDS, MAKING HIM COMPLETELY IMMUNE TO ATTACKS, BUT PREVENTS MOVEMENT.\0",
	"~THE CASTER INSTANTLY TRAVERSES PHYSICAL SPACE FOR A SET DISTANCE IN A STRAIGHT LINE FORWARD, STOPPED ONLY BY PHYSICAL OBSTRUCTIONS.\0",
	"~REANIMATE THE DEAD AND HAVE THEM DO YOUR BIDDING.\0",
	"~GIVES THE CASTER A TEMPORARY BURST OF SPEED THAT ALLOWS FASTER MOVEMENT AND INCREASES THE SPEED OF MELEE ATTACKS.\0",
	"~RESTORES ONE POINT OF HEALTH FOR EVERY TWO FOCUS, UP TO THE PLAYERS MAXIMUM HEALTH OR FOCUS, WHICHEVER COMES FIRST.\0",
	"~ABSORBS BODIES AND ORGANIC REFUSE IN THE IMMEDIATE AREA AS HEALTH AND ARMOR.\0",
	"~A MAGICAL AURA APPEARS AROUND ALL ORGANIC MATTER, MAKING THEM EASIER TO SEE, EVEN IF HIDING IN DARKNESS.\0",
	"~CREATE UP TO THREE AUTONOMOUS DOUBLES TO FOOL YOUR ENEMIES.|~THEY WILL NOT ATTACK, BUT CANNOT BE HARMED EITHER.\0",
	"~CREATES AN AREA OF DARKNESS IN EVEN THE BRIGHTEST OF AREAS FOR A LIMITED PERIOD OF TIME.\0",
	"~ALLOWS THE CASTER TO USE ILLUSION TO ASSUME FORM OF A RANDOM POWERUP.|~INEFFECTIVE IF THE PLAYER MOVES OR ATTACKS.\0",
	"~CREATES A BARRIER THAT PREVENTS LIVING MATTER FROM PASSING FOR A LIMITED TIME.\0",
	"~ALLOWS THE CASTER TO SEE THROUGH THE EYES OF CREATURES THAT MAY BE NEARBY, EVEN IF THE CASTER CANNOT SEE THEM.\0"
};

static char g_SpellLevel[14] = {1,1,2,2,2,1,1,1,1,1,2,1,1,2};

static char *g_CharScreenValues[10] =	{"0\0","1\0","2\0","3\0","4\0","5\0","6\0","7\0","8\0","9\0"};

static char *g_FieldStatNames[9] =
{
	"STRENGTH\0",
	"SPEED\0",
	"RESISTANCE\0",
	"FOCUS\0",
	"SAVE CHARACTER",
	"LOAD CHARACTER",
	"DELETE CHARACTER",
	"CONTINUE",
	"CANCEL"
};

static char *g_SkinNames[4] =
{
	"DEFAULT SKIN\0",
	"BARE ASS NAKED\0",
	"SUPER HERO\0",
	"WHIPS AND CHAINS\0"
};

static char *g_CharacterNames[5] =
{
	"   CHARACTER NAME   \0",
	"CALEB\0",
	"OPHELIA\0",
	"ISHMAEL\0",
	"GABREILLA\0"
};

//*************************************************************************
//*****	Function:	CStatusBar()
//*****	Details:	Constructor
//*************************************************************************

CStatusBar::CStatusBar()
{
	m_pClientDE = 0;

	m_hStatTabs = 0;
	m_hStatIcons = 0;
	m_hStatNums = 0;
	m_hItemIcons = 0;
	m_hSpellIcons = 0;
	m_hItemLight = 0;
	m_hSpellLight = 0;
	m_hKeyTabs = 0;
	m_hEquipTab = 0;
	m_hEquipCursor = 0;
	m_hCharFaces = 0;

	m_hSpellBG = 0;
	m_hSpellsLo = 0;
	m_hSpellsHi = 0;
	m_hSpellSymbols = 0;
	m_hSpellCursor = 0;
	m_hSpellDot = 0;

	m_pStatCursor = 0;
	m_pInfoCursor = 0;
	m_pEquipCursor = 0;
	m_pSpellCursor = 0;
	m_pCharCursor = 0;

	m_pStatFont1 = 0;
	m_pStatFont2 = 0;
	m_pStatFont3 = 0;
	m_pStatFont4 = 0;
	m_pSpellFont1 = 0;
	m_pSpellFont2 = 0;
	m_pCharFont1 = 0;

	m_bStatsOn = 4;			// All stats are drawn initially
	m_nHealth = 0;
	m_nArmor = 0;
	m_nAmmo = 0;
	m_nMana = 0;
	m_nAmmoType = 0;
	m_nHeartFrame = 0;
	m_nAmmoFrame = 0;
	m_fHeartBeat = SB_HEARTBEAT_TIME_1;
	m_fHeartTime = 0.0f;

	m_nHealthX = 0;
	m_nHealthY = 0;
	m_nArmorX = 0;
	m_nArmorY = 0;
	m_nManaX = 0;
	m_nManaY = 0;
	m_nAmmoX = 0;
	m_nAmmoY = 0;

	m_bCommState = 0;
	m_bCommPic = 0;
	memset(m_szCommVoice, 0, 100);
	memset(m_szCommText, 0, 200);
	m_fCommStartTime = 0.0f;
	m_sCommSound = 0;
	m_nCommTextWidth = 0;

	m_nCommPicX = 0;
	m_nCommPicY = 0;
	m_nCommPicStartY = 0;
	m_nCommTextX = 0;
	m_nCommTextY = 0;

	m_bInventoryOn = 0;		// Inventory is not active initially
	m_bInventoryState = 0;
	memset(m_hWeapons, 0, SB_NUM_WEAPONS);
	memset(m_hItems, 0, sizeof(CInventoryItem) * SB_NUM_ITEMS);
	memset(m_hSpells, 0, sizeof(CInventoryItem) * SB_NUM_SPELLS);
	memset(m_hItemList, 0, sizeof(CInventoryItem*) * SB_NUM_ITEMS);
	memset(m_hSpellList, 0, sizeof(CInventoryItem*) * SB_NUM_SPELLS);
	m_hSelectedItem = 0;
	m_hSelectedSpell = 0;
	m_nNumItems = 0;
	m_nNumSpells = 0;
	m_fInvStartTime = 0.0f;
	m_bCurrentItem = 0;

	m_nItemX = 0;
	m_nItemY = 0;
	m_nSpellX = 0;
	m_nSpellY = 0;
	m_nInventoryY = 0;
	m_nHighlightFrame = 0;

	m_bEquipOn = 0;			// Equipment screen is not active initially
	memset(m_pEquipList, 0, sizeof(CEquipItem) * SB_NUM_EQUIP_ITEMS);
	m_bTopEquipItem = 0;
	m_bSelectedEquipItem = 1;

	m_nEquipX = 0;
	m_nEquipY = 0;

	m_bSpellbookOn = 0;		// Spellbook is not active initially
	m_bCurrentSpell = 0;
	m_bCurrentSpell = 0;
	m_bSpellLevel = 0;
	memset(m_pCurrentSpells, 0, SB_NUM_SINGLEPLAYER_SPELLS + 1);
	m_nSpellTextWidth = SB_SPELL_TEXT_WIDTH;

	m_bCharScreenOn = 0;
	memset(m_pCSBoxes, 0, sizeof(CCharBox) * SB_NUM_CSBOXES);
	memset(m_pCSFieldList, 0, sizeof(CCharField) * SB_NUM_CSFIELDS);
	memset(&m_cfExtraPoints, 0, sizeof(CCharField));
	m_bCSCurrentField = 0;
	memset(m_rCSFields, 0, sizeof(DRect) * SB_NUM_BOXTYPES);
	m_bCSInputChar = 0;
	m_bCSSelectState = 0;
	m_pCharFiles = 0;
	m_pCharFileIndex = 0;
	m_bCharFileNum = 0;

	m_bKeysOn = 1;			// Keys are turned on by default

	m_bInfoOn = 0;			// Information screen in not displayed initially
	m_bMultiInfo = 0;
	m_fInfoStartTime = 0.0f;

	m_nInfoX = 0;
	m_nInfoY = 0;

	m_nScreenWidth = 0;
	m_nScreenHeight = 0;
	m_hTransColor = 0;
}

//*************************************************************************
//*****	Function:	~CStatusBar()
//*****	Details:	Destructor
//*************************************************************************

CStatusBar::~CStatusBar()
{
	if( m_sCommSound )
	{
		g_pClientDE->KillSound( m_sCommSound );
	}
}

//*************************************************************************
//*****	Function:	Init(CClientDE* pClientDE)
//*****	Details:	Initializes the status screens
//*************************************************************************

DBOOL CStatusBar::Init(CClientDE* pClientDE)
{
	if (!pClientDE) return DFALSE;
	Term();

	m_pClientDE = pClientDE;

	// Initialize the graphic surfaces
	m_hStatTabs = m_pClientDE->CreateSurfaceFromBitmap ("interface/status/stattabs.pcx");
	m_hStatIcons = m_pClientDE->CreateSurfaceFromBitmap ("interface/status/staticons.pcx");
	m_hStatNums = m_pClientDE->CreateSurfaceFromBitmap ("interface/status/statnums.pcx");
	m_hItemIcons = m_pClientDE->CreateSurfaceFromBitmap ("interface/status/itemicons.pcx");
	m_hSpellIcons = m_pClientDE->CreateSurfaceFromBitmap ("interface/status/spellicons.pcx");
	m_hItemLight = m_pClientDE->CreateSurfaceFromBitmap ("interface/status/itemhighlight.pcx");
	m_hSpellLight = m_pClientDE->CreateSurfaceFromBitmap ("interface/status/spellhighlight.pcx");
	m_hKeyTabs = m_pClientDE->CreateSurfaceFromBitmap ("interface/status/keytabs.pcx");
	m_hEquipTab = m_pClientDE->CreateSurfaceFromBitmap ("interface/status/equiptab.pcx");
	m_hEquipCursor = m_pClientDE->CreateSurfaceFromBitmap ("interface/status/equipcursor.pcx");
	m_hCharFaces = m_pClientDE->CreateSurfaceFromBitmap("interface/status/characterfaces.pcx");

	// Setup fonts
	m_pStatFont1 = new CoolFont();
	m_pStatFont1->Init(m_pClientDE, "interface/fonts/StatFont1.pcx");
	m_pStatFont1->LoadXWidths("blood2/interface/fonts/StatFont1.fnt");

	m_pStatFont2 = new CoolFont();
	m_pStatFont2->Init(m_pClientDE, "interface/fonts/StatFont2.pcx");
	m_pStatFont2->LoadXWidths("blood2/interface/fonts/StatFont2.fnt");

	m_pStatFont3 = new CoolFont();
	m_pStatFont3->Init(m_pClientDE, "interface/fonts/StatFont2Hi.pcx");
	m_pStatFont3->LoadXWidths("blood2/interface/fonts/StatFont2.fnt");

	m_pStatFont4 = new CoolFont();
	m_pStatFont4->Init(m_pClientDE, "interface/fonts/MenuFont1.pcx");
	m_pStatFont4->LoadXWidths("blood2/interface/fonts/MenuFont1.fnt");

⌨️ 快捷键说明

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