3059 lines · 61.3 KB · C
RawDownload
#include <stdlib.h>#include "quakedef.h" void (*vid_menudrawfn)(void);void (*vid_menukeyfn)(int key); enum {m_none, m_main, m_singleplayer, m_load, m_save, m_multiplayer, m_setup, m_net, m_options, m_video, m_keys, m_help, m_quit, m_serialconfig, m_modemconfig, m_lanconfig, m_gameoptions, m_search, m_slist} m_state; void M_Menu_Main_f (void);	void M_Menu_SinglePlayer_f (void);		void M_Menu_Load_f (void);		void M_Menu_Save_f (void);	void M_Menu_MultiPlayer_f (void);		void M_Menu_Setup_f (void);		void M_Menu_Net_f (void);	void M_Menu_Options_f (void);		void M_Menu_Keys_f (void);		void M_Menu_Video_f (void);	void M_Menu_Help_f (void);	void M_Menu_Quit_f (void);void M_Menu_SerialConfig_f (void);	void M_Menu_ModemConfig_f (void);void M_Menu_LanConfig_f (void);void M_Menu_GameOptions_f (void);void M_Menu_Search_f (void);void M_Menu_ServerList_f (void); void M_Main_Draw (void);	void M_SinglePlayer_Draw (void);		void M_Load_Draw (void);		void M_Save_Draw (void);	void M_MultiPlayer_Draw (void);		void M_Setup_Draw (void);		void M_Net_Draw (void);	void M_Options_Draw (void);		void M_Keys_Draw (void);		void M_Video_Draw (void);	void M_Help_Draw (void);	void M_Quit_Draw (void);void M_SerialConfig_Draw (void);	void M_ModemConfig_Draw (void);void M_LanConfig_Draw (void);void M_GameOptions_Draw (void);void M_Search_Draw (void);void M_ServerList_Draw (void); void M_Main_Key (int key);	void M_SinglePlayer_Key (int key);		void M_Load_Key (int key);		void M_Save_Key (int key);	void M_MultiPlayer_Key (int key);		void M_Setup_Key (int key);		void M_Net_Key (int key);	void M_Options_Key (int key);		void M_Keys_Key (int key);		void M_Video_Key (int key);	void M_Help_Key (int key);	void M_Quit_Key (int key);void M_SerialConfig_Key (int key);	void M_ModemConfig_Key (int key);void M_LanConfig_Key (int key);void M_GameOptions_Key (int key);void M_Search_Key (int key);void M_ServerList_Key (int key); bool m_entersound; // play after drawing a frame, so caching								// won't disrupt the soundbool m_recursiveDraw; int m_return_state;bool m_return_onerror;char m_return_reason [32]; #define StartingGame (m_multiplayer_cursor == 1)#define JoiningGame (m_multiplayer_cursor == 0)#define SerialConfig (m_net_cursor == 0)#define DirectConfig (m_net_cursor == 1)#define IPXConfig (m_net_cursor == 2)#define TCPIPConfig (m_net_cursor == 3) void M_ConfigureNetSubsystem(void); /*================M_DrawCharacter Draws one solid graphics character================*/void M_DrawCharacter (int cx, int line, int num){	Draw_Character ( cx + ((vid.width - 320)>>1), line, num);} void M_Print (int cx, int cy, char *str){	while (*str)	{		M_DrawCharacter (cx, cy, (*str)+128);		str++;		cx += 8;	}} void M_PrintWhite (int cx, int cy, char *str){	while (*str)	{		M_DrawCharacter (cx, cy, *str);		str++;		cx += 8;	}} void M_DrawTransPic (int x, int y, qpic_t *pic){	Draw_TransPic (x + ((vid.width - 320)>>1), y, pic);} void M_DrawPic (int x, int y, qpic_t *pic){	Draw_Pic (x + ((vid.width - 320)>>1), y, pic);} uint8_t identityTable[256];uint8_t translationTable[256]; void M_BuildTranslationTable(int top, int bottom){	int j;	uint8_t *dest, *source; 	for (j = 0; j < 256; j++)		identityTable[j] = j;	dest = translationTable;	source = identityTable;	memmove (dest, source, 256); 	if (top < 128) // the artists made some backwards ranges. sigh.		memmove (dest + TOP_RANGE, source + top, 16);	else		for (j=0 ; j<16 ; j++)			dest[TOP_RANGE+j] = source[top+15-j]; 	if (bottom < 128)		memmove (dest + BOTTOM_RANGE, source + bottom, 16);	else		for (j=0 ; j<16 ; j++)			dest[BOTTOM_RANGE+j] = source[bottom+15-j];} void M_DrawTransPicTranslate (int x, int y, qpic_t *pic){	Draw_TransPicTranslate (x + ((vid.width - 320)>>1), y, pic, translationTable);} void M_DrawTextBox (int x, int y, int width, int lines){	qpic_t *p;	int cx, cy;	int n; 	// draw left side	cx = x;	cy = y;	p = Draw_CachePic ("gfx/box_tl.lmp");	M_DrawTransPic (cx, cy, p);	p = Draw_CachePic ("gfx/box_ml.lmp");	for (n = 0; n < lines; n++)	{		cy += 8;		M_DrawTransPic (cx, cy, p);	}	p = Draw_CachePic ("gfx/box_bl.lmp");	M_DrawTransPic (cx, cy+8, p); 	// draw middle	cx += 8;	while (width > 0)	{		cy = y;		p = Draw_CachePic ("gfx/box_tm.lmp");		M_DrawTransPic (cx, cy, p);		p = Draw_CachePic ("gfx/box_mm.lmp");		for (n = 0; n < lines; n++)		{			cy += 8;			if (n == 1)				p = Draw_CachePic ("gfx/box_mm2.lmp");			M_DrawTransPic (cx, cy, p);		}		p = Draw_CachePic ("gfx/box_bm.lmp");		M_DrawTransPic (cx, cy+8, p);		width -= 2;		cx += 16;	} 	// draw right side	cy = y;	p = Draw_CachePic ("gfx/box_tr.lmp");	M_DrawTransPic (cx, cy, p);	p = Draw_CachePic ("gfx/box_mr.lmp");	for (n = 0; n < lines; n++)	{		cy += 8;		M_DrawTransPic (cx, cy, p);	}	p = Draw_CachePic ("gfx/box_br.lmp");	M_DrawTransPic (cx, cy+8, p);} //============================================================================= int m_save_demonum; /*================M_ToggleMenu_f================*/void M_ToggleMenu_f (void){	m_entersound = true; 	if (key_dest == key_menu)	{		if (m_state != m_main)		{			M_Menu_Main_f ();			return;		}		key_dest = key_game;		m_state = m_none;		return;	}	if (key_dest == key_console)	{		Con_ToggleConsole_f ();	}	else	{		M_Menu_Main_f ();	}} //=============================================================================/* MAIN MENU */ int m_main_cursor;#define MAIN_ITEMS 5 void M_Menu_Main_f (void){	if (key_dest != key_menu)	{		m_save_demonum = cls.demonum;		cls.demonum = -1;	}	key_dest = key_menu;	m_state = m_main;	m_entersound = true;} void M_Main_Draw (void){	int f;	qpic_t *p; 	M_DrawTransPic (16, 4, Draw_CachePic ("gfx/qplaque.lmp") );	p = Draw_CachePic ("gfx/ttl_main.lmp");	M_DrawPic ( (320-p->width)/2, 4, p);	M_DrawTransPic (72, 32, Draw_CachePic ("gfx/mainmenu.lmp") ); 	f = (int)(host_time * 10)%6; 	M_DrawTransPic (54, 32 + m_main_cursor * 20,Draw_CachePic( va("gfx/menudot%i.lmp", f+1 ) ) );} void M_Main_Key (int key){	switch (key)	{	case K_ESCAPE:		key_dest = key_game;		m_state = m_none;		cls.demonum = m_save_demonum;		if (cls.demonum != -1 && !cls.demoplayback && cls.state != ca_connected)			CL_NextDemo ();		break; 	case K_DOWNARROW:		S_LocalSound ("misc/menu1.wav");		if (++m_main_cursor >= MAIN_ITEMS)			m_main_cursor = 0;		break; 	case K_UPARROW:		S_LocalSound ("misc/menu1.wav");		if (--m_main_cursor < 0)			m_main_cursor = MAIN_ITEMS - 1;		break; 	case K_ENTER:		m_entersound = true; 		switch (m_main_cursor)		{		case 0:			M_Menu_SinglePlayer_f ();			break; 		case 1:			M_Menu_MultiPlayer_f ();			break; 		case 2:			M_Menu_Options_f ();			break; 		case 3:			M_Menu_Help_f ();			break; 		case 4:			M_Menu_Quit_f ();			break;		}	}} //=============================================================================/* SINGLE PLAYER MENU */ int m_singleplayer_cursor;#define SINGLEPLAYER_ITEMS 3 void M_Menu_SinglePlayer_f (void){	key_dest = key_menu;	m_state = m_singleplayer;	m_entersound = true;} void M_SinglePlayer_Draw (void){	int f;	qpic_t *p; 	M_DrawTransPic (16, 4, Draw_CachePic ("gfx/qplaque.lmp") );	p = Draw_CachePic ("gfx/ttl_sgl.lmp");	M_DrawPic ( (320-p->width)/2, 4, p);	M_DrawTransPic (72, 32, Draw_CachePic ("gfx/sp_menu.lmp") ); 	f = (int)(host_time * 10)%6; 	M_DrawTransPic (54, 32 + m_singleplayer_cursor * 20,Draw_CachePic( va("gfx/menudot%i.lmp", f+1 ) ) );} void M_SinglePlayer_Key (int key){	switch (key)	{	case K_ESCAPE:		M_Menu_Main_f ();		break; 	case K_DOWNARROW:		S_LocalSound ("misc/menu1.wav");		if (++m_singleplayer_cursor >= SINGLEPLAYER_ITEMS)			m_singleplayer_cursor = 0;		break; 	case K_UPARROW:		S_LocalSound ("misc/menu1.wav");		if (--m_singleplayer_cursor < 0)			m_singleplayer_cursor = SINGLEPLAYER_ITEMS - 1;		break; 	case K_ENTER:		m_entersound = true; 		switch (m_singleplayer_cursor)		{		case 0:			if (sv.active)				if (!SCR_ModalMessage("Are you sure you want to\nstart a new game?\n"))					break;			key_dest = key_game;			if (sv.active)				Cbuf_AddText ("disconnect\n");			Cbuf_AddText ("maxplayers 1\n");			Cbuf_AddText ("map start\n");			break; 		case 1:			M_Menu_Load_f ();			break; 		case 2:			M_Menu_Save_f ();			break;		}	}} //=============================================================================/* LOAD/SAVE MENU */ int load_cursor; // 0 < load_cursor < MAX_SAVEGAMES #define MAX_SAVEGAMES 12char m_filenames[MAX_SAVEGAMES][SAVEGAME_COMMENT_LENGTH+1];int loadable[MAX_SAVEGAMES]; void M_ScanSaves (void){	int i, j;	char name[MAX_OSPATH];	FILE *f;	int version; 	for (i=0 ; i<MAX_SAVEGAMES ; i++)	{		strcpy (m_filenames[i], "--- UNUSED SLOT ---");		loadable[i] = false;		sprintf (name, "%s/s%i.sav", com_gamedir, i);		f = fopen (name, "r");		if (!f)			continue;		fscanf (f, "%i\n", &version);		fscanf (f, "%79s\n", name);		strncpy (m_filenames[i], name, sizeof(m_filenames[i])-1); 	// change _ back to space		for (j=0 ; j<SAVEGAME_COMMENT_LENGTH ; j++)			if (m_filenames[i][j] == '_')				m_filenames[i][j] = ' ';		loadable[i] = true;		fclose (f);	}} void M_Menu_Load_f (void){	m_entersound = true;	m_state = m_load;	key_dest = key_menu;	M_ScanSaves ();} void M_Menu_Save_f (void){	if (!sv.active)		return;	if (cl.intermission)		return;	if (svs.maxclients != 1)		return;	m_entersound = true;	m_state = m_save;	key_dest = key_menu;	M_ScanSaves ();} void M_Load_Draw (void){	int i;	qpic_t *p; 	p = Draw_CachePic ("gfx/p_load.lmp");	M_DrawPic ( (320-p->width)/2, 4, p); 	for (i=0 ; i< MAX_SAVEGAMES; i++)		M_Print (16, 32 + 8*i, m_filenames[i]); // line cursor	M_DrawCharacter (8, 32 + load_cursor*8, 12+((int)(realtime*4)&1));} void M_Save_Draw (void){	int i;	qpic_t *p; 	p = Draw_CachePic ("gfx/p_save.lmp");	M_DrawPic ( (320-p->width)/2, 4, p); 	for (i=0 ; i<MAX_SAVEGAMES ; i++)		M_Print (16, 32 + 8*i, m_filenames[i]); // line cursor	M_DrawCharacter (8, 32 + load_cursor*8, 12+((int)(realtime*4)&1));} void M_Load_Key (int k){	switch (k)	{	case K_ESCAPE:		M_Menu_SinglePlayer_f ();

Lines 1–500 of 3059.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t