📄 menu.c
字号:
M_Menu_SaveGame_f();
}
static void CreditsFunc( void *unused )
{
M_Menu_Credits_f();
}
void Game_MenuInit( void )
{
static const char *difficulty_names[] =
{
"easy",
"medium",
"hard",
0
};
s_game_menu.x = viddef.width * 0.50;
s_game_menu.nitems = 0;
s_easy_game_action.generic.type = MTYPE_ACTION;
s_easy_game_action.generic.flags = QMF_LEFT_JUSTIFY;
s_easy_game_action.generic.x = 0;
s_easy_game_action.generic.y = 0;
s_easy_game_action.generic.name = "easy";
s_easy_game_action.generic.callback = EasyGameFunc;
s_medium_game_action.generic.type = MTYPE_ACTION;
s_medium_game_action.generic.flags = QMF_LEFT_JUSTIFY;
s_medium_game_action.generic.x = 0;
s_medium_game_action.generic.y = 10;
s_medium_game_action.generic.name = "medium";
s_medium_game_action.generic.callback = MediumGameFunc;
s_hard_game_action.generic.type = MTYPE_ACTION;
s_hard_game_action.generic.flags = QMF_LEFT_JUSTIFY;
s_hard_game_action.generic.x = 0;
s_hard_game_action.generic.y = 20;
s_hard_game_action.generic.name = "hard";
s_hard_game_action.generic.callback = HardGameFunc;
s_blankline.generic.type = MTYPE_SEPARATOR;
s_load_game_action.generic.type = MTYPE_ACTION;
s_load_game_action.generic.flags = QMF_LEFT_JUSTIFY;
s_load_game_action.generic.x = 0;
s_load_game_action.generic.y = 40;
s_load_game_action.generic.name = "load game";
s_load_game_action.generic.callback = LoadGameFunc;
s_save_game_action.generic.type = MTYPE_ACTION;
s_save_game_action.generic.flags = QMF_LEFT_JUSTIFY;
s_save_game_action.generic.x = 0;
s_save_game_action.generic.y = 50;
s_save_game_action.generic.name = "save game";
s_save_game_action.generic.callback = SaveGameFunc;
s_credits_action.generic.type = MTYPE_ACTION;
s_credits_action.generic.flags = QMF_LEFT_JUSTIFY;
s_credits_action.generic.x = 0;
s_credits_action.generic.y = 60;
s_credits_action.generic.name = "credits";
s_credits_action.generic.callback = CreditsFunc;
Menu_AddItem( &s_game_menu, ( void * ) &s_easy_game_action );
Menu_AddItem( &s_game_menu, ( void * ) &s_medium_game_action );
Menu_AddItem( &s_game_menu, ( void * ) &s_hard_game_action );
Menu_AddItem( &s_game_menu, ( void * ) &s_blankline );
Menu_AddItem( &s_game_menu, ( void * ) &s_load_game_action );
Menu_AddItem( &s_game_menu, ( void * ) &s_save_game_action );
Menu_AddItem( &s_game_menu, ( void * ) &s_blankline );
Menu_AddItem( &s_game_menu, ( void * ) &s_credits_action );
Menu_Center( &s_game_menu );
}
void Game_MenuDraw( void )
{
M_Banner( "m_banner_game" );
Menu_AdjustCursor( &s_game_menu, 1 );
Menu_Draw( &s_game_menu );
}
const char *Game_MenuKey( int key )
{
return Default_MenuKey( &s_game_menu, key );
}
void M_Menu_Game_f (void)
{
Game_MenuInit();
M_PushMenu( Game_MenuDraw, Game_MenuKey );
m_game_cursor = 1;
}
/*
=============================================================================
LOADGAME MENU
=============================================================================
*/
#define MAX_SAVEGAMES 15
static menuframework_s s_savegame_menu;
static menuframework_s s_loadgame_menu;
static menuaction_s s_loadgame_actions[MAX_SAVEGAMES];
char m_savestrings[MAX_SAVEGAMES][32];
qboolean m_savevalid[MAX_SAVEGAMES];
void Create_Savestrings (void)
{
int i;
FILE *f;
char name[MAX_OSPATH];
for (i=0 ; i<MAX_SAVEGAMES ; i++)
{
Com_sprintf (name, sizeof(name), "%s/save/save%i/server.ssv", FS_Gamedir(), i);
f = fopen (name, "rb");
if (!f)
{
strcpy (m_savestrings[i], "<EMPTY>");
m_savevalid[i] = false;
}
else
{
FS_Read (m_savestrings[i], sizeof(m_savestrings[i]), f);
fclose (f);
m_savevalid[i] = true;
}
}
}
void LoadGameCallback( void *self )
{
menuaction_s *a = ( menuaction_s * ) self;
if ( m_savevalid[ a->generic.localdata[0] ] )
Cbuf_AddText (va("load save%i\n", a->generic.localdata[0] ) );
M_ForceMenuOff ();
}
void LoadGame_MenuInit( void )
{
int i;
s_loadgame_menu.x = viddef.width / 2 - 120;
s_loadgame_menu.y = viddef.height / 2 - 58;
s_loadgame_menu.nitems = 0;
Create_Savestrings();
for ( i = 0; i < MAX_SAVEGAMES; i++ )
{
s_loadgame_actions[i].generic.name = m_savestrings[i];
s_loadgame_actions[i].generic.flags = QMF_LEFT_JUSTIFY;
s_loadgame_actions[i].generic.localdata[0] = i;
s_loadgame_actions[i].generic.callback = LoadGameCallback;
s_loadgame_actions[i].generic.x = 0;
s_loadgame_actions[i].generic.y = ( i ) * 10;
if (i>0) // separate from autosave
s_loadgame_actions[i].generic.y += 10;
s_loadgame_actions[i].generic.type = MTYPE_ACTION;
Menu_AddItem( &s_loadgame_menu, &s_loadgame_actions[i] );
}
}
void LoadGame_MenuDraw( void )
{
M_Banner( "m_banner_load_game" );
// Menu_AdjustCursor( &s_loadgame_menu, 1 );
Menu_Draw( &s_loadgame_menu );
}
const char *LoadGame_MenuKey( int key )
{
if ( key == K_ESCAPE || key == K_ENTER )
{
s_savegame_menu.cursor = s_loadgame_menu.cursor - 1;
if ( s_savegame_menu.cursor < 0 )
s_savegame_menu.cursor = 0;
}
return Default_MenuKey( &s_loadgame_menu, key );
}
void M_Menu_LoadGame_f (void)
{
LoadGame_MenuInit();
M_PushMenu( LoadGame_MenuDraw, LoadGame_MenuKey );
}
/*
=============================================================================
SAVEGAME MENU
=============================================================================
*/
static menuframework_s s_savegame_menu;
static menuaction_s s_savegame_actions[MAX_SAVEGAMES];
void SaveGameCallback( void *self )
{
menuaction_s *a = ( menuaction_s * ) self;
Cbuf_AddText (va("save save%i\n", a->generic.localdata[0] ));
M_ForceMenuOff ();
}
void SaveGame_MenuDraw( void )
{
M_Banner( "m_banner_save_game" );
Menu_AdjustCursor( &s_savegame_menu, 1 );
Menu_Draw( &s_savegame_menu );
}
void SaveGame_MenuInit( void )
{
int i;
s_savegame_menu.x = viddef.width / 2 - 120;
s_savegame_menu.y = viddef.height / 2 - 58;
s_savegame_menu.nitems = 0;
Create_Savestrings();
// don't include the autosave slot
for ( i = 0; i < MAX_SAVEGAMES-1; i++ )
{
s_savegame_actions[i].generic.name = m_savestrings[i+1];
s_savegame_actions[i].generic.localdata[0] = i+1;
s_savegame_actions[i].generic.flags = QMF_LEFT_JUSTIFY;
s_savegame_actions[i].generic.callback = SaveGameCallback;
s_savegame_actions[i].generic.x = 0;
s_savegame_actions[i].generic.y = ( i ) * 10;
s_savegame_actions[i].generic.type = MTYPE_ACTION;
Menu_AddItem( &s_savegame_menu, &s_savegame_actions[i] );
}
}
const char *SaveGame_MenuKey( int key )
{
if ( key == K_ENTER || key == K_ESCAPE )
{
s_loadgame_menu.cursor = s_savegame_menu.cursor - 1;
if ( s_loadgame_menu.cursor < 0 )
s_loadgame_menu.cursor = 0;
}
return Default_MenuKey( &s_savegame_menu, key );
}
void M_Menu_SaveGame_f (void)
{
if (!Com_ServerState())
return; // not playing a game
SaveGame_MenuInit();
M_PushMenu( SaveGame_MenuDraw, SaveGame_MenuKey );
Create_Savestrings ();
}
/*
=============================================================================
JOIN SERVER MENU
=============================================================================
*/
#define MAX_LOCAL_SERVERS 8
static menuframework_s s_joinserver_menu;
static menuseparator_s s_joinserver_server_title;
static menuaction_s s_joinserver_search_action;
static menuaction_s s_joinserver_address_book_action;
static menuaction_s s_joinserver_server_actions[MAX_LOCAL_SERVERS];
int m_num_servers;
#define NO_SERVER_STRING "<no server>"
// user readable information
static char local_server_names[MAX_LOCAL_SERVERS][80];
// network address
static netadr_t local_server_netadr[MAX_LOCAL_SERVERS];
void M_AddToServerList (netadr_t adr, char *info)
{
int i;
if (m_num_servers == MAX_LOCAL_SERVERS)
return;
while ( *info == ' ' )
info++;
// ignore if duplicated
for (i=0 ; i<m_num_servers ; i++)
if (!strcmp(info, local_server_names[i]))
return;
local_server_netadr[m_num_servers] = adr;
strncpy (local_server_names[m_num_servers], info, sizeof(local_server_names[0])-1);
m_num_servers++;
}
void JoinServerFunc( void *self )
{
char buffer[128];
int index;
index = ( menuaction_s * ) self - s_joinserver_server_actions;
if ( Q_stricmp( local_server_names[index], NO_SERVER_STRING ) == 0 )
return;
if (index >= m_num_servers)
return;
Com_sprintf (buffer, sizeof(buffer), "connect %s\n", NET_AdrToString (local_server_netadr[index]));
Cbuf_AddText (buffer);
M_ForceMenuOff ();
}
void AddressBookFunc( void *self )
{
M_Menu_AddressBook_f();
}
void NullCursorDraw( void *self )
{
}
void SearchLocalGames( void )
{
int i;
m_num_servers = 0;
for (i=0 ; i<MAX_LOCAL_SERVERS ; i++)
strcpy (local_server_names[i], NO_SERVER_STRING);
M_DrawTextBox( 8, 120 - 48, 36, 3 );
M_Print( 16 + 16, 120 - 48 + 8, "Searching for local servers, this" );
M_Print( 16 + 16, 120 - 48 + 16, "could take up to a minute, so" );
M_Print( 16 + 16, 120 - 48 + 24, "please be patient." );
// the text box won't show up unless we do a buffer swap
re.EndFrame();
// send out info packets
CL_PingServers_f();
}
void SearchLocalGamesFunc( void *self )
{
SearchLocalGames();
}
void JoinServer_MenuInit( void )
{
int i;
s_joinserver_menu.x = viddef.width * 0.50 - 120;
s_joinserver_menu.nitems = 0;
s_joinserver_address_book_action.generic.type = MTYPE_ACTION;
s_joinserver_address_book_action.generic.name = "address book";
s_joinserver_address_book_action.generic.flags = QMF_LEFT_JUSTIFY;
s_joinserver_address_book_action.generic.x = 0;
s_joinserver_address_book_action.generic.y = 0;
s_joinserver_address_book_action.generic.callback = AddressBookFunc;
s_joinserver_search_action.generic.type = MTYPE_ACTION;
s_joinserver_search_action.generic.name = "refresh server list";
s_joinserver_search_action.generic.flags = QMF_LEFT_JUSTIFY;
s_joinserver_search_action.generic.x = 0;
s_joinserver_search_action.generic.y = 10;
s_joinserver_search_action.generic.callback = SearchLocalGamesFunc;
s_joinserver_search_action.generic.statusbar = "search for servers";
s_joinserver_server_title.generic.type = MTYPE_SEPARATOR;
s_joinserver_server_title.generic.name = "connect to...";
s_joinserver_server_title.generic.x = 80;
s_joinserver_server_title.generic.y = 30;
for ( i = 0; i < MAX_LOCAL_SERVERS; i++ )
{
s_joinserver_server_actions[i].generic.type = MTYPE_ACTION;
strcpy (local_server_names[i], NO_SERVER_STRING);
s_joinserver_server_actions[i].generic.name = local_server_names[i];
s_joinserver_server_actions[i].generic.flags = QMF_LEFT_JUSTIFY;
s_joinserver_server_actions[i].generic.x = 0;
s_joinserver_server_actions[i].generic.y = 40 + i*10;
s_joinserver_server_actions[i].generic.callback = JoinServerFunc;
s_joinserver_server_actions[i].generic.statusbar = "press ENTER to connect";
}
Menu_AddItem( &s_joinserver_menu, &s_joinserver_address_book_action );
Menu_AddItem( &s_joinserver_menu, &s_joinserver_server_title );
Menu_AddItem( &s_joinserver_menu, &s_joinserver_search_action );
for ( i = 0; i < 8; i++ )
Menu_AddItem( &s_joinserver_menu, &s_joinserver_server_actions[i] );
Menu_Center( &s_joinserver_menu );
SearchLocalGames();
}
void JoinServer_MenuDraw(void)
{
M_Banner( "m_banner_join_server" );
Menu_Draw( &s_joinserver_menu );
}
const char *JoinServer_MenuKey( int key )
{
return Default_MenuKey( &s_joinserver_menu, key );
}
void M_Menu_JoinServer_f (void)
{
JoinServer_MenuInit();
M_PushMenu( JoinServer_MenuDraw, JoinServer_MenuKey );
}
/*
=============================================================================
START SERVER MENU
=============================================================================
*/
static menuframework_s s_startserver_menu;
static char **mapnames;
static int nummaps;
static menuaction_s s_startserver_start_action;
static menuaction_s s_startserver_dmoptions_action;
static menufield_s s_timelimit_field;
static menufield_s s_fraglimit_field;
static menufield_s s_maxclients_field;
static menufield_s s_hostname_field;
static menulist_s s_startmap_list;
static menulist_s s_rules_box;
void DMOptionsFunc( void *self )
{
if (s_rules_box.curvalue == 1)
return;
M_Menu_DMOptions_f();
}
void RulesChangeFunc ( void *self )
{
// DM
if (s_rules_box.curvalue == 0)
{
s_maxclients_field.generic.statusbar = NULL;
s_startserver_dmoptions_action.generic.statusbar = NULL;
}
else if(s_rules_box.curvalue == 1) // coop // PGM
{
s_maxclients_field.generic.statusbar = "4 maximum for cooperative";
if (atoi(s_maxclients_field.buffer) > 4)
strcpy( s_maxclients_field.buffer, "4" );
s_startserver_dmoptions_action.generic.statusba
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -