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

📄 menu.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//----------------------------------------------------------
//
// MODULE  : MENU.CPP
//
// PURPOSE : Blood 2 Menus
//
// CREATED : 10/15/97
//
//----------------------------------------------------------

#include <stdio.h>
#include "Menu.h"
#include "ClientRes.h"
#include "stack.h"
#include "dynarray.h"
#include "VKDefs.h"
#include "SharedDefs.h"
#include "ClientUtilities.h"
#include "LoadSave.h"
#include "BloodClientShell.h"

#define MAX_CS_FILENAME_LEN	100

#define FONT_HEIGHT		40
#define FONT_WIDTH		20

#define MENU_TOP		100
#define MENU_LEFT		30
#define MENU_RIGHT		610
#define MENU_HEIGHT		350

#define RING_1_X			76
#define RING_1_Y			46
#define RING_2_X			130
#define RING_2_Y			101
#define RING_3_X			177
#define RING_3_Y			146

#define RING_MAX_ROTATE_SPEED	1.2
#define RING_MIN_ROTATE_SPEED	0.1


DFLOAT GetMoveSpeed(DFLOAT fDest,DFLOAT fCur,DFLOAT fTotal)
{
	double fMove = fabs(fDest - fCur);
	double fPercent = fMove / fTotal;
	double fSin = sin(fPercent * MATH_PI);
	DFLOAT fRet = ((DFLOAT)(RING_MIN_ROTATE_SPEED + (RING_MAX_ROTATE_SPEED - RING_MIN_ROTATE_SPEED) *
				fSin));
	return fRet;
}


// ----------------------------------------------------------------------- //

DBOOL	m_gGotKeyPress = 0;
DFLOAT	m_gKeyPressTime = 0.0f;

// ----------------------------------------------------------------------- //

// Coordinates for the words on the rotating rings
DFloatPt ptRingPos[6] = 
{
	{ 162, 60 },
	{ 172, 106 },
	{ 195, 158 },
	{ 231, 274 },
	{ 186, 311 },
	{ 167, 357 }
};

// ----------------------------------------------------------------------- //

// Coordinates for the main menu titles
DFloatPt ptMenuTitlePos[3] = 
{
	{ 6, 351 },
	{ 7, 441 },
	{ 8, 396 }
};

// ----------------------------------------------------------------------- //

char	*g_pMusicTypes[3] =
{
	"None",
	"CD Audio",
	"Interactive Music"
};

// ----------------------------------------------------------------------- //

char	*g_pSoundQuality[2] =
{
	"8-Bit",
	"16-Bit"
};

// ----------------------------------------------------------------------- //

char	*g_pActionName[47] =
{
	"Forward",			// 0
	"Backward",			// 1
	"Open",				// 2
	"TurnAround",		// 3
	"Duck",				// 4
	"Jump",				// 5
	"Speed",			// 6
	"Fire",				// 7
	"Strafe",			// 8
	"Left",				// 9
	"Right",			// 10
	"RunLock",			// 11
	"StrafeLeft",		// 12
	"StrafeRight",		// 13
	"AltFire",			// 14
	"MouseAimToggle",	// 15
	"LookUp",			// 16
	"LookDown",			// 17
	"AimUp",			// 18
	"AimDown",			// 19
	"Crosshair",		// 20
	"Message",			// 21
	"UseInventory",		// 22
	"InventoryLeft",	// 23
	"InventoryRight",	// 24
	"ScreenShrink",		// 25
	"ScreenEnlarge",	// 26
	"NextWeapon",		// 27
	"PrevWeapon",		// 28
	"DropWeapon",		// 29
	"InvItem_0",		// 30
	"InvItem_1",		// 31
	"InvItem_2",		// 32
	"InvItem_3",		// 33
	"Proximities",		// 34
	"Remotes",			// 35
	"Grab",				// 36
	"Weapon_0",			// 37
	"Weapon_1",			// 38
	"Weapon_2",			// 39
	"Weapon_3",			// 40
	"Weapon_4",			// 41
	"Weapon_5",			// 42
	"Weapon_6",			// 43
	"Weapon_7",			// 44
	"Weapon_8",			// 45
	"Weapon_9"			// 46
};

// ----------------------------------------------------------------------- //

DFLOAT	fRingAngles1[3] = { DEG2RAD(-4.4f), DEG2RAD(62.7f), DEG2RAD(120.7f) };
DFLOAT	fRingAngles2[3] = { DEG2RAD(134.4f), DEG2RAD(45.6f), DEG2RAD(-46.7f) };
DFLOAT	fRingAngles3[3] = { DEG2RAD(-90.0f), DEG2RAD(150.0f), DEG2RAD(-120.0f) };

// ----------------------------------------------------------------------- //

CMenu::CMenu()
{
	m_pClientDE = NULL;
	m_hstrVersion = NULL;
	m_hDimBack = NULL;
	m_hBackL = NULL;
	m_hBackR = NULL;
	m_hRing1 = NULL;
	m_hRing2 = NULL;
	m_hRing3 = NULL;
	m_hTitle = NULL;
	m_hMenuTitle1 = NULL;
	m_hMenuTitle2 = NULL;
	m_hMenuTitle3 = NULL;

	m_hSaveTitle = NULL;
	m_hLoadTitle = NULL;
	m_hCustomTitle = NULL;
	m_hMenuScreen = NULL;

	m_pMenuCursor = 0;
	m_pMenuFont1 = 0;

	m_bSlideMenu = DFALSE;
	m_bRotateRings = DFALSE;

	m_hPointer = NULL;
	m_cxPointer = 0;
	m_cyPointer = 0;

	m_nAnimStartTime = 0.0f;
	m_fRingAngle1 = 0.0f;
	m_fRingAngle2 = 0.0f;
	m_fRingAngle3 = 0.0f;
	m_fRingMoveDist1 = 0.0f;
	m_fRingMoveDist2 = 0.0f;
	m_fRingMoveDist3 = 0.0f;
	m_fDestRingAngle1 = 0.0f;
	m_fDestRingAngle2 = 0.0f;
	m_fDestRingAngle3 = 0.0f;

//	m_hFont = NULL;
	m_pMenuItems = NULL;
	m_pBaseMenu = NULL;
	m_pCurrentItem = NULL;

	m_bOptionsOn = 0;
}

// ----------------------------------------------------------------------- //

CMenu::~CMenu()
{
	// Term();
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CMenu::Init (CClientDE* pClientDE)
//
//	PURPOSE:	Initializes the menu
//
// ----------------------------------------------------------------------- //

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

	m_pClientDE = pClientDE;

	m_hstrVersion = m_pClientDE->FormatString(IDS_VERSION);

	// initialize the bitmaps
	m_hDimBack = m_pClientDE->CreateSurfaceFromBitmap ("interface/menus/Blkout.pcx");
	m_hBackL = m_pClientDE->CreateSurfaceFromBitmap ("interface/menus/LHalf.pcx");
	m_hBackR = m_pClientDE->CreateSurfaceFromBitmap ("interface/menus/RHalf.pcx");
	m_hRing1 = m_pClientDE->CreateSurfaceFromBitmap ("interface/menus/Ring1.pcx");
	m_hRing2 = m_pClientDE->CreateSurfaceFromBitmap ("interface/menus/Ring2.pcx");
	m_hRing3 = m_pClientDE->CreateSurfaceFromBitmap ("interface/menus/Ring3.pcx");
	m_hTitle = m_pClientDE->CreateSurfaceFromBitmap ("interface/menus/chosenHI.pcx");
	m_hMenuTitle1 = m_pClientDE->CreateSurfaceFromBitmap ("interface/menus/mainHI.pcx");
	m_hMenuTitle2 = m_pClientDE->CreateSurfaceFromBitmap ("interface/menus/singleHI.pcx");
	m_hMenuTitle3 = m_pClientDE->CreateSurfaceFromBitmap ("interface/menus/bbathHI.pcx");

	m_hSaveTitle = m_pClientDE->CreateSurfaceFromBitmap("interface/menus/savegame.pcx");
	m_hLoadTitle = m_pClientDE->CreateSurfaceFromBitmap("interface/menus/loadgame.pcx");
	m_hCustomTitle = m_pClientDE->CreateSurfaceFromBitmap("interface/menus/customlevel.pcx");
	m_hMenuScreen = m_pClientDE->CreateSurface(640, 480);

	// create the cool font
	m_pMenuFont1 = new CoolFont();
	m_pMenuFont1->Init(m_pClientDE, "interface/fonts/MenuFont1.pcx");
	m_pMenuFont1->LoadXWidths("interface/fonts/MenuFont1.fnt");

	// setup the menu cursor
	m_pMenuCursor = new CoolFontCursor();
	m_pMenuCursor->SetFont(m_pMenuFont1);

	// Set the configuration to the last one used
	InitOptionsMenu();
	if(LoadConfigFile("curb2cfg.cfg", DTRUE))
		AcceptConfig();
	TermOptionsMenu();

	// build the menu
	BuildMenu();
	m_pCurrentItem = m_pMenuItems;
	if (!m_pCurrentItem || !m_pCurrentItem->pTop) return DFALSE;

	if (m_pCurrentItem->pTop->nRing)
	{
		int nRing = m_pCurrentItem->pTop->nRing - 1;
		StartAnimRings(DFALSE, fRingAngles1[nRing], fRingAngles2[nRing], fRingAngles3[nRing]);
	}
	else
	{
		StartAnimRings(DTRUE, 0.0f, 0.0f, 0.0f);
	}

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CMenu::Term()
//
//	PURPOSE:	Terminates the menu
//
// ----------------------------------------------------------------------- //

void CMenu::Term()
{
	if (m_pClientDE)
	{
		if (m_hstrVersion) { m_pClientDE->FreeString(m_hstrVersion); m_hstrVersion = NULL; }
		if (m_hDimBack)	{ m_pClientDE->DeleteSurface (m_hDimBack); m_hDimBack = NULL; }
		if (m_hBackL)	{ m_pClientDE->DeleteSurface (m_hBackL); m_hBackL = NULL; }
		if (m_hBackR)	{ m_pClientDE->DeleteSurface (m_hBackR); m_hBackR = NULL; }
		if (m_hRing1)	{ m_pClientDE->DeleteSurface (m_hRing1); m_hRing1 = NULL; }
		if (m_hRing2)	{ m_pClientDE->DeleteSurface (m_hRing2); m_hRing2 = NULL; }
		if (m_hRing3)	{ m_pClientDE->DeleteSurface (m_hRing3); m_hRing3 = NULL; }
		if (m_hTitle)	{ m_pClientDE->DeleteSurface (m_hTitle); m_hTitle = NULL; }
		if (m_hMenuTitle1) { m_pClientDE->DeleteSurface (m_hMenuTitle1); m_hMenuTitle1 = NULL; }
		if (m_hMenuTitle2) { m_pClientDE->DeleteSurface (m_hMenuTitle2); m_hMenuTitle2 = NULL; }
		if (m_hMenuTitle3) { m_pClientDE->DeleteSurface (m_hMenuTitle3); m_hMenuTitle3 = NULL; }

		if (m_hSaveTitle)	{ m_pClientDE->DeleteSurface (m_hSaveTitle); m_hSaveTitle = NULL; }
		if (m_hLoadTitle)	{ m_pClientDE->DeleteSurface (m_hLoadTitle); m_hLoadTitle = NULL; }
		if (m_hCustomTitle)	{ m_pClientDE->DeleteSurface (m_hCustomTitle); m_hCustomTitle = NULL; }
		if (m_hMenuScreen) { m_pClientDE->DeleteSurface (m_hMenuScreen); m_hMenuScreen = NULL; }

		if (m_hPointer)		{ m_pClientDE->DeleteSurface (m_hPointer); m_hPointer = NULL; }

		if (m_pMenuCursor)	{ delete m_pMenuCursor; m_pMenuCursor = 0; }
		if (m_pMenuFont1)	{ m_pMenuFont1->Free(); delete m_pMenuFont1; m_pMenuFont1 = 0; }

		if (m_pMenuItems)	{ DeleteMenuItems (m_pMenuItems); m_pMenuItems = NULL; }
	}
}

// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CMenu::InitOptionsMenu()
//
//	PURPOSE:	Inits the options menu
//
// --------------------------------------------------------------------------- //

DBOOL	CMenu::InitOptionsMenu()
{
	m_pClientDE->SetInputState(DFALSE);

	memset(m_pOSCategory, 0, sizeof(OPTIONITEM) * OS_NUM_CATEGORIES);
	memset(m_pOSSubItems, 0, sizeof(OPTIONITEM*) * OS_NUM_CATEGORIES);

	m_bOSCategory = 0;
	m_bOSSubItem = 0;

	SetupOption(m_pOSCategory[0], 0, "General Options\0", 0, 7, 0, 1);
	SetupOption(m_pOSCategory[1], 0, "Display Options\0", 0, 3, 0, 1);
	SetupOption(m_pOSCategory[2], 0, "Audio Options\0", 0, 5, 0, 1);
	SetupOption(m_pOSCategory[3], 0, "Advanced Weapon Options\0", 0, 10, 0, 1);
	SetupOption(m_pOSCategory[4], 0, "\0", 0, 0, 0, 0);
	SetupOption(m_pOSCategory[5], 0, "Keyboard Config\0", 0, 45, 0, 1);
	SetupOption(m_pOSCategory[6], 0, "Mouse Config\0", 0, 7, 0, 1);
	SetupOption(m_pOSCategory[7], 0, "Joystick Config\0", 0, 1, 0, 1);
	SetupOption(m_pOSCategory[8], 0, "\0", 0, 0, 0, 0);
	SetupOption(m_pOSCategory[9], 0, "Save Config\0", 0, 1, 0, 1);
	SetupOption(m_pOSCategory[10], 0, "Load Config\0", 0, 0, 0, 1);
	SetupOption(m_pOSCategory[11], 0, "Delete Config\0", 0, 0, 0, 1);
	SetupOption(m_pOSCategory[12], 0, "Accept\0", 0, 0, 0, 1);
	SetupOption(m_pOSCategory[13], 0, "Cancel\0", 0, 0, 0, 1);

	m_pOSSubItems[0] = new OPTIONITEM[m_pOSCategory[0].num1];
	m_pOSSubItems[1] = new OPTIONITEM[m_pOSCategory[1].num1];
	m_pOSSubItems[2] = new OPTIONITEM[m_pOSCategory[2].num1];
	m_pOSSubItems[3] = new OPTIONITEM[m_pOSCategory[3].num1];
	m_pOSSubItems[5] = new OPTIONITEM[m_pOSCategory[5].num1];
	m_pOSSubItems[6] = new OPTIONITEM[m_pOSCategory[6].num1];
	m_pOSSubItems[7] = new OPTIONITEM[m_pOSCategory[7].num1];

	SetupOption(m_pOSSubItems[0][0], 3, "Always Run\0", 0, 0, 0, 1);
	SetupOption(m_pOSSubItems[0][1], 3, "View Centering\0", 0, 0, 0, 1);
	SetupOption(m_pOSSubItems[0][2], 3, "Free Look\0", 0, 0, 0, 1);
	SetupOption(m_pOSSubItems[0][3], 3, "Crosshair\0", 0, 0, 0, 1);
	SetupOption(m_pOSSubItems[0][4], 3, "Head Bobbing\0", 0, 1, 0, 1);
	SetupOption(m_pOSSubItems[0][5], 3, "Dodging\0", 0, 0, 0, 1);
	SetupOption(m_pOSSubItems[0][6], 3, "Hide Weapon\0", 0, 0, 0, 1);

	// Make the display modes list
	m_pRModes = m_pClientDE->GetRenderModes();
	RMode	*modeIndex = m_pRModes;
	RMode	curRMode;
	m_numModes = 0;
	m_curMode = 0;

	m_pClientDE->GetRenderMode(&curRMode);
	while(modeIndex)
	{
		if((modeIndex->m_Width == curRMode.m_Width) && (modeIndex->m_Height == curRMode.m_Height))
			m_curMode = m_numModes;
		m_numModes++;
		modeIndex = modeIndex->m_pNext;
	}

	SetupOption(m_pOSSubItems[1][0], 5, "Graphics Resolution\0", 0, m_curMode, m_numModes - 1, 1);
	SetupOption(m_pOSSubItems[1][1], 2, "Screen Size\0", 0, 4, 4, 1);
	SetupOption(m_pOSSubItems[1][2], 2, "Gamma Correction\0", 0, 5, 10, 1);

	SetupOption(m_pOSSubItems[2][0], 2, "Sound Volume\0", 0, (char)(m_pClientDE->GetSoundVolume() / 10), 10, 1);
	SetupOption(m_pOSSubItems[2][1], 2, "Music Volume\0", 0, (char)(m_pClientDE->GetMusicVolume() / 10), 10, 1);
	SetupOption(m_pOSSubItems[2][2], 5, "Music Source\0", g_pMusicTypes, 0, 2, 1);
	SetupOption(m_pOSSubItems[2][3], 5, "Sound Quality\0", g_pSoundQuality, 0, 1, 1);
	SetupOption(m_pOSSubItems[2][4], 3, "Voices\0", 0, 1, 0, 1);

	SetupOption(m_pOSSubItems[3][0], 4, "Weapon 1 Cycle\0", 0, 0, 10, 1);

⌨️ 快捷键说明

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