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