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

📄 menu.h

📁 Blood 2全套源码
💻 H
字号:
//----------------------------------------------------------
//
// MODULE  : MENU.H
//
// PURPOSE : Blood 2 Menus
//
// CREATED : 10/15/97
//
//----------------------------------------------------------


#ifndef __MENU_H__
#define __MENU_H__

#include "basedefs_de.h"
#include "cpp_clientshell_de.h"
#include "LTGUIMgr.h" // For coolfont


// world menu items (temp)
#define ID_QUICKSAVE			128
#define	ID_SAVEGAME				129
#define ID_SAVESLOT9			(ID_SAVEGAME + 9)
#define	ID_LOADGAME				196
#define ID_LOADAUTOSAVE			196
#define ID_LOADQUICKSAVE		197
#define ID_LOADSLOT0			198
#define ID_LOADSLOT9			(ID_LOADSLOT0 + 9)
#define ID_BASEWORLD			256

#define	ID_BASEOPTION			32
#define	ID_BASEHELP				96
#define	ID_BASEMULTISETUP		112


#define MAX_FILE_LIST			128

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

#define		MENU_TITLE_X			35
#define		MENU_TITLE_Y			35

#define		OS_NUM_CATEGORIES		14

#define		SB_MAX_OS_STRING_SIZE	14

#define		OPTION_CFGFILE_VERSION	0x0002

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

struct MENUITEM
{
	MENUITEM()	{ nID = 0; hSurface = hSurfaceHi = NULL; nWidth = 0; pPrev = NULL; pNext = NULL; pParent = NULL; pChild = NULL; pTop = NULL; hString = NULL; nRing = 0; nRingPos = 0; }

	int			nID;
	HSURFACE	hSurface;
	HSURFACE	hSurfaceHi;
	int			nWidth;
	HSTRING		hString;

	MENUITEM*	pPrev;
	MENUITEM*	pNext;
	MENUITEM*	pParent;
	MENUITEM*	pChild;
	MENUITEM*	pTop;
	int			nRing;
	int			nRingPos;
};

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

struct OptionsStruct
{
	DBOOL		m_bAlwaysRun;
	DBOOL		m_bViewCenter;
	DBOOL		m_bFreeLook;
	DBOOL		m_bCrosshair;
	DBOOL		m_bHeadBob;
	DBOOL		m_bDodging;
	DBOOL		m_bHideWeapon;

	DBYTE		m_bScreenSize;

	DBYTE		m_bMusicType;
	DBYTE		m_bSoundQuality;
	DBOOL		m_bVoices;

	DBYTE		m_bWeaponCycle0;
	DBYTE		m_bWeaponCycle1;
	DBYTE		m_bWeaponCycle2;
	DBYTE		m_bWeaponCycle3;
	DBYTE		m_bWeaponCycle4;
	DBYTE		m_bWeaponCycle5;
	DBYTE		m_bWeaponCycle6;
	DBYTE		m_bWeaponCycle7;
	DBYTE		m_bWeaponCycle8;
	DBYTE		m_bWeaponCycle9;

	DFLOAT		m_fMouseSenseX;
	DFLOAT		m_fMouseSenseY;
	DBOOL		m_bInvertMouseY;

	DBOOL		m_bEnableJoystick;
};

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

struct OPTIONITEM
{
	char	type;			// Type of option: title, slider, toggle, value, text, etc.
	char	active;			// Is the option active?

	short	num1;			// Field value 1
	short	num2;			// Field value 1

	char	*string1;		// Field string 1
	char	**string2;		// Field string 1

	char	extra[64];		// Extra string field
};

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

class CMenu
{
public:
	
	CMenu();
	~CMenu();

	DBOOL		Init (CClientDE* pClientDE);
	void		Term();

	void		Activate(int nBaseMenuID);
	void		StartAnim();
	DBOOL		Animate(HSURFACE hSurface);
	void		StartAnimRings(DBOOL bFast, DFLOAT fRingAngle1, DFLOAT fRingAngle2, DFLOAT fRingAngle3);
	DBOOL		AnimateRings();
	void		Draw();

	DBOOL		HandleKeyDown(int key, int rep);
	void		Reset();
	void		ScrollUp();
	void		ScrollDown();
	DBOOL		BackOneLevel();			// returns DFALSE if already at top
	int			SelectCurrentItem();	// returns id of item, or zero if submenu exists
	MENUITEM*	GetMenuItemByID (int nID);

	// New stuff by Andy
	DBOOL		InitOptionsMenu();
	void		SetupOption(OPTIONITEM &op, char t, char *s1, char **s2, char n1, char n2, char a);
	void		TermOptionsMenu();

	OptionsStruct*	GetOptionsStruct()	{ return &m_osOptions; }

	char		HandleOptionsControl(int key);
	char		LoadConfigList();
	char		SaveConfigFile(DBOOL base);
	char		LoadConfigFile(char	*szFilename, DBOOL base);
	char		DeleteConfigFile(char *szFilename);
	FileEntry*	SortFileList(FileEntry *pfe);
	DBOOL		AcceptConfig();
	char		GetGraphicsMode();

protected:

	void		DrawWorldMenu(HSURFACE hScreen);
	void		DrawNewGameMenu(HSURFACE hScreen);
	void		DrawSaveGameMenu(HSURFACE hScreen);
	void		DrawLoadGameMenu(HSURFACE hScreen);
	void		DrawOptions(HSURFACE hScreen);
	void		DrawHelp(HSURFACE hScreen);
	void		DrawMultiSetup(HSURFACE hScreen);

	void		DeleteMenuItems (MENUITEM* pItems);
	DBOOL		BuildMenu();
	DBOOL		SetupMenuItem (MENUITEM* pItem, int nStringID, MENUITEM* pTop, MENUITEM* pPrev, MENUITEM* pParent, int pos);
	DBOOL		SetupWorldMenuItem (MENUITEM* pItem, int nID, char* strWorldName, MENUITEM* pTop, MENUITEM* pPrev, MENUITEM* pParent);
	
protected:
	
	CClientDE*	m_pClientDE;			// the client interface
	HSTRING		m_hstrVersion;			// The version string from the resources
	HSURFACE	m_hDimBack;				// entire background surface
	HSURFACE	m_hBackL;				// upper-left background surface
	HSURFACE	m_hBackR;				// upper-right background surface
	HSURFACE	m_hRing1;				// Outer ring
	HSURFACE	m_hRing2;				// Middle ring
	HSURFACE	m_hRing3;				// Inner ring
	HSURFACE	m_hTitle;				// Game title
	HSURFACE	m_hMenuTitle1;
	HSURFACE	m_hMenuTitle2;
	HSURFACE	m_hMenuTitle3;
	HSURFACE	m_hMenuScreen;			// Menu screen buffer

	HSURFACE	m_hSaveTitle;			// Title for savegame screen
	HSURFACE	m_hLoadTitle;			// Title for loadgame screen
	HSURFACE	m_hCustomTitle;			// Title for custom level screen

	CoolFontCursor	*m_pMenuCursor;
	CoolFont	*m_pMenuFont1;			// Andy's cool font for the world selection screens

	DBOOL		m_bSlideMenu;			// Menu is sliding open
	DBOOL		m_bRotateRings;			// Rings are rotating

	HSURFACE	m_hPointer;				// current menu item pointer
	DDWORD		m_cxPointer;			// width of pointer image
	DDWORD		m_cyPointer;			// height of pointer image

	DFLOAT		m_nAnimStartTime;		// starting time of the menu animation
	DFLOAT		m_fRingAngle1;			// Rotation angles for the rings
	DFLOAT		m_fRingAngle2;
	DFLOAT		m_fRingAngle3;

	DFLOAT		m_fRingMoveDist1;		// Amount to move the rings to rotate them to the correct pos.
	DFLOAT		m_fRingMoveDist2;
	DFLOAT		m_fRingMoveDist3;

	DFLOAT		m_fDestRingAngle1;		// Position that the rings want to be
	DFLOAT		m_fDestRingAngle2;
	DFLOAT		m_fDestRingAngle3;

//	HDEFONT		m_hFont;				// menu font
//
	MENUITEM*	m_pMenuItems;			// top of menu item tree
	MENUITEM*	m_pCurrentItem;			// current menu item
	MENUITEM*	m_pBaseMenu;			// current base menu

	// Option screen stuff
	char		m_bOptionsOn;			// Is the option screen on?
	OPTIONITEM	m_pOSCategory[OS_NUM_CATEGORIES];	// The main options menu categories
	char		m_bOSCategory;
	OPTIONITEM	*m_pOSSubItems[OS_NUM_CATEGORIES];	// The sub items for each category
	char		m_bOSSubItem;
	char		m_bOSTopSubItem;
	RMode		*m_pRModes;
	char		m_numModes;
	char		m_curMode;
	char		m_bOSInputMode;
	char		m_szOSInputString[SB_MAX_OS_STRING_SIZE];
	char		m_bOSInputChar;
	DeviceInput		m_pInput[MAX_INPUT_BUFFER_SIZE];
	OptionsStruct	m_osOptions;
};

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

#define STARTMENU(pParent, nRingMenu)\
	{\
		MENUITEM* pMenuParent = (pParent);\
		MENUITEM* pPrev = NULL;\
		MENUITEM* pItem = NULL;\
		MENUITEM* pTop = NULL;\
		if (pParent)\
		{\
			(pParent)->pChild = new MENUITEM;\
			pItem = (pParent)->pChild;\
			pTop = (pParent)->pChild;\
		}\
		else\
		{\
			(pParent) = new MENUITEM;\
			pItem = (pParent);\
			pTop = (pParent);\
		}\
		pTop->nRing = (nRingMenu);

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

#define ADDMENUITEM(id, pos)\
		SetupMenuItem (pItem, (id), pTop, pPrev, pMenuParent, pos);\
		pItem->pNext = new MENUITEM;\
		pPrev = pItem;\
		pItem = pItem->pNext;

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

#define ADDWORLDMENUITEM(str, id)\
		SetupWorldMenuItem (pItem, (id), (str), pTop, pPrev, pMenuParent);\
		pItem->pNext = new MENUITEM;\
		pPrev = pItem;\
		pItem = pItem->pNext;

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

#define ENDMENU()\
		{\
			pPrev->pNext = pTop;\
			pTop->pPrev = pPrev;\
			delete pItem;\
		}\
	}

#endif	// __MENU_H__

⌨️ 快捷键说明

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