mirror of
https://github.com/ioquake/ioq3.git
synced 2024-11-10 15:21:35 +00:00
05e8ab9538
* Updated TODO * Moved ChangeLog to root * Updated ChangeLog * s/Foobar/Quake III Arena Source Code/ * Biggest patch EVAR. I wonder how many mail boxes this will fill...
349 lines
9.9 KiB
C
349 lines
9.9 KiB
C
/*
|
|
===========================================================================
|
|
Copyright (C) 1999-2005 Id Software, Inc.
|
|
|
|
This file is part of Quake III Arena source code.
|
|
|
|
Quake III Arena source code is free software; you can redistribute it
|
|
and/or modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of the License,
|
|
or (at your option) any later version.
|
|
|
|
Quake III Arena source code is distributed in the hope that it will be
|
|
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Quake III Arena source code; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
===========================================================================
|
|
*/
|
|
//
|
|
/*
|
|
=======================================================================
|
|
|
|
INGAME MENU
|
|
|
|
=======================================================================
|
|
*/
|
|
|
|
|
|
#include "ui_local.h"
|
|
|
|
|
|
#define INGAME_FRAME "menu/art/addbotframe"
|
|
//#define INGAME_FRAME "menu/art/cut_frame"
|
|
#define INGAME_MENU_VERTICAL_SPACING 28
|
|
|
|
#define ID_TEAM 10
|
|
#define ID_ADDBOTS 11
|
|
#define ID_REMOVEBOTS 12
|
|
#define ID_SETUP 13
|
|
#define ID_SERVERINFO 14
|
|
#define ID_LEAVEARENA 15
|
|
#define ID_RESTART 16
|
|
#define ID_QUIT 17
|
|
#define ID_RESUME 18
|
|
#define ID_TEAMORDERS 19
|
|
|
|
|
|
typedef struct {
|
|
menuframework_s menu;
|
|
|
|
menubitmap_s frame;
|
|
menutext_s team;
|
|
menutext_s setup;
|
|
menutext_s server;
|
|
menutext_s leave;
|
|
menutext_s restart;
|
|
menutext_s addbots;
|
|
menutext_s removebots;
|
|
menutext_s teamorders;
|
|
menutext_s quit;
|
|
menutext_s resume;
|
|
} ingamemenu_t;
|
|
|
|
static ingamemenu_t s_ingame;
|
|
|
|
|
|
/*
|
|
=================
|
|
InGame_RestartAction
|
|
=================
|
|
*/
|
|
static void InGame_RestartAction( qboolean result ) {
|
|
if( !result ) {
|
|
return;
|
|
}
|
|
|
|
UI_PopMenu();
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, "map_restart 0\n" );
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
InGame_QuitAction
|
|
=================
|
|
*/
|
|
static void InGame_QuitAction( qboolean result ) {
|
|
if( !result ) {
|
|
return;
|
|
}
|
|
UI_PopMenu();
|
|
UI_CreditMenu();
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
InGame_Event
|
|
=================
|
|
*/
|
|
void InGame_Event( void *ptr, int notification ) {
|
|
if( notification != QM_ACTIVATED ) {
|
|
return;
|
|
}
|
|
|
|
switch( ((menucommon_s*)ptr)->id ) {
|
|
case ID_TEAM:
|
|
UI_TeamMainMenu();
|
|
break;
|
|
|
|
case ID_SETUP:
|
|
UI_SetupMenu();
|
|
break;
|
|
|
|
case ID_LEAVEARENA:
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, "disconnect\n" );
|
|
break;
|
|
|
|
case ID_RESTART:
|
|
UI_ConfirmMenu( "RESTART ARENA?", 0, InGame_RestartAction );
|
|
break;
|
|
|
|
case ID_QUIT:
|
|
UI_ConfirmMenu( "EXIT GAME?", 0, InGame_QuitAction );
|
|
break;
|
|
|
|
case ID_SERVERINFO:
|
|
UI_ServerInfoMenu();
|
|
break;
|
|
|
|
case ID_ADDBOTS:
|
|
UI_AddBotsMenu();
|
|
break;
|
|
|
|
case ID_REMOVEBOTS:
|
|
UI_RemoveBotsMenu();
|
|
break;
|
|
|
|
case ID_TEAMORDERS:
|
|
UI_TeamOrdersMenu();
|
|
break;
|
|
|
|
case ID_RESUME:
|
|
UI_PopMenu();
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
InGame_MenuInit
|
|
=================
|
|
*/
|
|
void InGame_MenuInit( void ) {
|
|
int y;
|
|
uiClientState_t cs;
|
|
char info[MAX_INFO_STRING];
|
|
int team;
|
|
|
|
memset( &s_ingame, 0 ,sizeof(ingamemenu_t) );
|
|
|
|
InGame_Cache();
|
|
|
|
s_ingame.menu.wrapAround = qtrue;
|
|
s_ingame.menu.fullscreen = qfalse;
|
|
|
|
s_ingame.frame.generic.type = MTYPE_BITMAP;
|
|
s_ingame.frame.generic.flags = QMF_INACTIVE;
|
|
s_ingame.frame.generic.name = INGAME_FRAME;
|
|
s_ingame.frame.generic.x = 320-233;//142;
|
|
s_ingame.frame.generic.y = 240-166;//118;
|
|
s_ingame.frame.width = 466;//359;
|
|
s_ingame.frame.height = 332;//256;
|
|
|
|
//y = 96;
|
|
y = 88;
|
|
s_ingame.team.generic.type = MTYPE_PTEXT;
|
|
s_ingame.team.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
|
|
s_ingame.team.generic.x = 320;
|
|
s_ingame.team.generic.y = y;
|
|
s_ingame.team.generic.id = ID_TEAM;
|
|
s_ingame.team.generic.callback = InGame_Event;
|
|
s_ingame.team.string = "START";
|
|
s_ingame.team.color = color_red;
|
|
s_ingame.team.style = UI_CENTER|UI_SMALLFONT;
|
|
|
|
y += INGAME_MENU_VERTICAL_SPACING;
|
|
s_ingame.addbots.generic.type = MTYPE_PTEXT;
|
|
s_ingame.addbots.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
|
|
s_ingame.addbots.generic.x = 320;
|
|
s_ingame.addbots.generic.y = y;
|
|
s_ingame.addbots.generic.id = ID_ADDBOTS;
|
|
s_ingame.addbots.generic.callback = InGame_Event;
|
|
s_ingame.addbots.string = "ADD BOTS";
|
|
s_ingame.addbots.color = color_red;
|
|
s_ingame.addbots.style = UI_CENTER|UI_SMALLFONT;
|
|
if( !trap_Cvar_VariableValue( "sv_running" ) || !trap_Cvar_VariableValue( "bot_enable" ) || (trap_Cvar_VariableValue( "g_gametype" ) == GT_SINGLE_PLAYER)) {
|
|
s_ingame.addbots.generic.flags |= QMF_GRAYED;
|
|
}
|
|
|
|
y += INGAME_MENU_VERTICAL_SPACING;
|
|
s_ingame.removebots.generic.type = MTYPE_PTEXT;
|
|
s_ingame.removebots.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
|
|
s_ingame.removebots.generic.x = 320;
|
|
s_ingame.removebots.generic.y = y;
|
|
s_ingame.removebots.generic.id = ID_REMOVEBOTS;
|
|
s_ingame.removebots.generic.callback = InGame_Event;
|
|
s_ingame.removebots.string = "REMOVE BOTS";
|
|
s_ingame.removebots.color = color_red;
|
|
s_ingame.removebots.style = UI_CENTER|UI_SMALLFONT;
|
|
if( !trap_Cvar_VariableValue( "sv_running" ) || !trap_Cvar_VariableValue( "bot_enable" ) || (trap_Cvar_VariableValue( "g_gametype" ) == GT_SINGLE_PLAYER)) {
|
|
s_ingame.removebots.generic.flags |= QMF_GRAYED;
|
|
}
|
|
|
|
y += INGAME_MENU_VERTICAL_SPACING;
|
|
s_ingame.teamorders.generic.type = MTYPE_PTEXT;
|
|
s_ingame.teamorders.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
|
|
s_ingame.teamorders.generic.x = 320;
|
|
s_ingame.teamorders.generic.y = y;
|
|
s_ingame.teamorders.generic.id = ID_TEAMORDERS;
|
|
s_ingame.teamorders.generic.callback = InGame_Event;
|
|
s_ingame.teamorders.string = "TEAM ORDERS";
|
|
s_ingame.teamorders.color = color_red;
|
|
s_ingame.teamorders.style = UI_CENTER|UI_SMALLFONT;
|
|
if( !(trap_Cvar_VariableValue( "g_gametype" ) >= GT_TEAM) ) {
|
|
s_ingame.teamorders.generic.flags |= QMF_GRAYED;
|
|
}
|
|
else {
|
|
trap_GetClientState( &cs );
|
|
trap_GetConfigString( CS_PLAYERS + cs.clientNum, info, MAX_INFO_STRING );
|
|
team = atoi( Info_ValueForKey( info, "t" ) );
|
|
if( team == TEAM_SPECTATOR ) {
|
|
s_ingame.teamorders.generic.flags |= QMF_GRAYED;
|
|
}
|
|
}
|
|
|
|
y += INGAME_MENU_VERTICAL_SPACING;
|
|
s_ingame.setup.generic.type = MTYPE_PTEXT;
|
|
s_ingame.setup.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
|
|
s_ingame.setup.generic.x = 320;
|
|
s_ingame.setup.generic.y = y;
|
|
s_ingame.setup.generic.id = ID_SETUP;
|
|
s_ingame.setup.generic.callback = InGame_Event;
|
|
s_ingame.setup.string = "SETUP";
|
|
s_ingame.setup.color = color_red;
|
|
s_ingame.setup.style = UI_CENTER|UI_SMALLFONT;
|
|
|
|
y += INGAME_MENU_VERTICAL_SPACING;
|
|
s_ingame.server.generic.type = MTYPE_PTEXT;
|
|
s_ingame.server.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
|
|
s_ingame.server.generic.x = 320;
|
|
s_ingame.server.generic.y = y;
|
|
s_ingame.server.generic.id = ID_SERVERINFO;
|
|
s_ingame.server.generic.callback = InGame_Event;
|
|
s_ingame.server.string = "SERVER INFO";
|
|
s_ingame.server.color = color_red;
|
|
s_ingame.server.style = UI_CENTER|UI_SMALLFONT;
|
|
|
|
y += INGAME_MENU_VERTICAL_SPACING;
|
|
s_ingame.restart.generic.type = MTYPE_PTEXT;
|
|
s_ingame.restart.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
|
|
s_ingame.restart.generic.x = 320;
|
|
s_ingame.restart.generic.y = y;
|
|
s_ingame.restart.generic.id = ID_RESTART;
|
|
s_ingame.restart.generic.callback = InGame_Event;
|
|
s_ingame.restart.string = "RESTART ARENA";
|
|
s_ingame.restart.color = color_red;
|
|
s_ingame.restart.style = UI_CENTER|UI_SMALLFONT;
|
|
if( !trap_Cvar_VariableValue( "sv_running" ) ) {
|
|
s_ingame.restart.generic.flags |= QMF_GRAYED;
|
|
}
|
|
|
|
y += INGAME_MENU_VERTICAL_SPACING;
|
|
s_ingame.resume.generic.type = MTYPE_PTEXT;
|
|
s_ingame.resume.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
|
|
s_ingame.resume.generic.x = 320;
|
|
s_ingame.resume.generic.y = y;
|
|
s_ingame.resume.generic.id = ID_RESUME;
|
|
s_ingame.resume.generic.callback = InGame_Event;
|
|
s_ingame.resume.string = "RESUME GAME";
|
|
s_ingame.resume.color = color_red;
|
|
s_ingame.resume.style = UI_CENTER|UI_SMALLFONT;
|
|
|
|
y += INGAME_MENU_VERTICAL_SPACING;
|
|
s_ingame.leave.generic.type = MTYPE_PTEXT;
|
|
s_ingame.leave.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
|
|
s_ingame.leave.generic.x = 320;
|
|
s_ingame.leave.generic.y = y;
|
|
s_ingame.leave.generic.id = ID_LEAVEARENA;
|
|
s_ingame.leave.generic.callback = InGame_Event;
|
|
s_ingame.leave.string = "LEAVE ARENA";
|
|
s_ingame.leave.color = color_red;
|
|
s_ingame.leave.style = UI_CENTER|UI_SMALLFONT;
|
|
|
|
y += INGAME_MENU_VERTICAL_SPACING;
|
|
s_ingame.quit.generic.type = MTYPE_PTEXT;
|
|
s_ingame.quit.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
|
|
s_ingame.quit.generic.x = 320;
|
|
s_ingame.quit.generic.y = y;
|
|
s_ingame.quit.generic.id = ID_QUIT;
|
|
s_ingame.quit.generic.callback = InGame_Event;
|
|
s_ingame.quit.string = "EXIT GAME";
|
|
s_ingame.quit.color = color_red;
|
|
s_ingame.quit.style = UI_CENTER|UI_SMALLFONT;
|
|
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.frame );
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.team );
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.addbots );
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.removebots );
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.teamorders );
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.setup );
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.server );
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.restart );
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.resume );
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.leave );
|
|
Menu_AddItem( &s_ingame.menu, &s_ingame.quit );
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
InGame_Cache
|
|
=================
|
|
*/
|
|
void InGame_Cache( void ) {
|
|
trap_R_RegisterShaderNoMip( INGAME_FRAME );
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_InGameMenu
|
|
=================
|
|
*/
|
|
void UI_InGameMenu( void ) {
|
|
// force as top level menu
|
|
uis.menusp = 0;
|
|
|
|
// set menu cursor to a nice location
|
|
uis.cursorx = 319;
|
|
uis.cursory = 80;
|
|
|
|
InGame_MenuInit();
|
|
UI_PushMenu( &s_ingame.menu );
|
|
}
|