Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

ui_demo2.c (8070B)


      1 /*
      2 ===========================================================================
      3 Copyright (C) 1999-2005 Id Software, Inc.
      4 
      5 This file is part of Quake III Arena source code.
      6 
      7 Quake III Arena source code is free software; you can redistribute it
      8 and/or modify it under the terms of the GNU General Public License as
      9 published by the Free Software Foundation; either version 2 of the License,
     10 or (at your option) any later version.
     11 
     12 Quake III Arena source code is distributed in the hope that it will be
     13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 GNU General Public License for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with Foobar; if not, write to the Free Software
     19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     20 ===========================================================================
     21 */
     22 //
     23 /*
     24 =======================================================================
     25 
     26 DEMOS MENU
     27 
     28 =======================================================================
     29 */
     30 
     31 
     32 #include "ui_local.h"
     33 
     34 
     35 #define ART_BACK0			"menu/art/back_0"
     36 #define ART_BACK1			"menu/art/back_1"	
     37 #define ART_GO0				"menu/art/play_0"
     38 #define ART_GO1				"menu/art/play_1"
     39 #define ART_FRAMEL			"menu/art/frame2_l"
     40 #define ART_FRAMER			"menu/art/frame1_r"
     41 #define ART_ARROWS			"menu/art/arrows_horz_0"
     42 #define ART_ARROWLEFT		"menu/art/arrows_horz_left"
     43 #define ART_ARROWRIGHT		"menu/art/arrows_horz_right"
     44 
     45 #define MAX_DEMOS			128
     46 #define NAMEBUFSIZE			( MAX_DEMOS * 16 )
     47 
     48 #define ID_BACK				10
     49 #define ID_GO				11
     50 #define ID_LIST				12
     51 #define ID_RIGHT			13
     52 #define ID_LEFT				14
     53 
     54 #define ARROWS_WIDTH		128
     55 #define ARROWS_HEIGHT		48
     56 
     57 
     58 typedef struct {
     59 	menuframework_s	menu;
     60 
     61 	menutext_s		banner;
     62 	menubitmap_s	framel;
     63 	menubitmap_s	framer;
     64 
     65 	menulist_s		list;
     66 
     67 	menubitmap_s	arrows;
     68 	menubitmap_s	left;
     69 	menubitmap_s	right;
     70 	menubitmap_s	back;
     71 	menubitmap_s	go;
     72 
     73 	int				numDemos;
     74 	char			names[NAMEBUFSIZE];
     75 	char			*demolist[MAX_DEMOS];
     76 } demos_t;
     77 
     78 static demos_t	s_demos;
     79 
     80 
     81 /*
     82 ===============
     83 Demos_MenuEvent
     84 ===============
     85 */
     86 static void Demos_MenuEvent( void *ptr, int event ) {
     87 	if( event != QM_ACTIVATED ) {
     88 		return;
     89 	}
     90 
     91 	switch( ((menucommon_s*)ptr)->id ) {
     92 	case ID_GO:
     93 		UI_ForceMenuOff ();
     94 		trap_Cmd_ExecuteText( EXEC_APPEND, va( "demo %s\n",
     95 								s_demos.list.itemnames[s_demos.list.curvalue]) );
     96 		break;
     97 
     98 	case ID_BACK:
     99 		UI_PopMenu();
    100 		break;
    101 
    102 	case ID_LEFT:
    103 		ScrollList_Key( &s_demos.list, K_LEFTARROW );
    104 		break;
    105 
    106 	case ID_RIGHT:
    107 		ScrollList_Key( &s_demos.list, K_RIGHTARROW );
    108 		break;
    109 	}
    110 }
    111 
    112 
    113 /*
    114 =================
    115 UI_DemosMenu_Key
    116 =================
    117 */
    118 static sfxHandle_t UI_DemosMenu_Key( int key ) {
    119 	menucommon_s	*item;
    120 
    121 	item = Menu_ItemAtCursor( &s_demos.menu );
    122 
    123 	return Menu_DefaultKey( &s_demos.menu, key );
    124 }
    125 
    126 
    127 /*
    128 ===============
    129 Demos_MenuInit
    130 ===============
    131 */
    132 static void Demos_MenuInit( void ) {
    133 	int		i;
    134 	int		len;
    135 	char	*demoname, extension[32];
    136 
    137 	memset( &s_demos, 0 ,sizeof(demos_t) );
    138 	s_demos.menu.key = UI_DemosMenu_Key;
    139 
    140 	Demos_Cache();
    141 
    142 	s_demos.menu.fullscreen = qtrue;
    143 	s_demos.menu.wrapAround = qtrue;
    144 
    145 	s_demos.banner.generic.type		= MTYPE_BTEXT;
    146 	s_demos.banner.generic.x		= 320;
    147 	s_demos.banner.generic.y		= 16;
    148 	s_demos.banner.string			= "DEMOS";
    149 	s_demos.banner.color			= color_white;
    150 	s_demos.banner.style			= UI_CENTER;
    151 
    152 	s_demos.framel.generic.type		= MTYPE_BITMAP;
    153 	s_demos.framel.generic.name		= ART_FRAMEL;
    154 	s_demos.framel.generic.flags	= QMF_INACTIVE;
    155 	s_demos.framel.generic.x		= 0;  
    156 	s_demos.framel.generic.y		= 78;
    157 	s_demos.framel.width			= 256;
    158 	s_demos.framel.height			= 329;
    159 
    160 	s_demos.framer.generic.type		= MTYPE_BITMAP;
    161 	s_demos.framer.generic.name		= ART_FRAMER;
    162 	s_demos.framer.generic.flags	= QMF_INACTIVE;
    163 	s_demos.framer.generic.x		= 376;
    164 	s_demos.framer.generic.y		= 76;
    165 	s_demos.framer.width			= 256;
    166 	s_demos.framer.height			= 334;
    167 
    168 	s_demos.arrows.generic.type		= MTYPE_BITMAP;
    169 	s_demos.arrows.generic.name		= ART_ARROWS;
    170 	s_demos.arrows.generic.flags	= QMF_INACTIVE;
    171 	s_demos.arrows.generic.x		= 320-ARROWS_WIDTH/2;
    172 	s_demos.arrows.generic.y		= 400;
    173 	s_demos.arrows.width			= ARROWS_WIDTH;
    174 	s_demos.arrows.height			= ARROWS_HEIGHT;
    175 
    176 	s_demos.left.generic.type		= MTYPE_BITMAP;
    177 	s_demos.left.generic.flags		= QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_MOUSEONLY;
    178 	s_demos.left.generic.x			= 320-ARROWS_WIDTH/2;
    179 	s_demos.left.generic.y			= 400;
    180 	s_demos.left.generic.id			= ID_LEFT;
    181 	s_demos.left.generic.callback	= Demos_MenuEvent;
    182 	s_demos.left.width				= ARROWS_WIDTH/2;
    183 	s_demos.left.height				= ARROWS_HEIGHT;
    184 	s_demos.left.focuspic			= ART_ARROWLEFT;
    185 
    186 	s_demos.right.generic.type		= MTYPE_BITMAP;
    187 	s_demos.right.generic.flags		= QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_MOUSEONLY;
    188 	s_demos.right.generic.x			= 320;
    189 	s_demos.right.generic.y			= 400;
    190 	s_demos.right.generic.id		= ID_RIGHT;
    191 	s_demos.right.generic.callback	= Demos_MenuEvent;
    192 	s_demos.right.width				= ARROWS_WIDTH/2;
    193 	s_demos.right.height			= ARROWS_HEIGHT;
    194 	s_demos.right.focuspic			= ART_ARROWRIGHT;
    195 
    196 	s_demos.back.generic.type		= MTYPE_BITMAP;
    197 	s_demos.back.generic.name		= ART_BACK0;
    198 	s_demos.back.generic.flags		= QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
    199 	s_demos.back.generic.id			= ID_BACK;
    200 	s_demos.back.generic.callback	= Demos_MenuEvent;
    201 	s_demos.back.generic.x			= 0;
    202 	s_demos.back.generic.y			= 480-64;
    203 	s_demos.back.width				= 128;
    204 	s_demos.back.height				= 64;
    205 	s_demos.back.focuspic			= ART_BACK1;
    206 
    207 	s_demos.go.generic.type			= MTYPE_BITMAP;
    208 	s_demos.go.generic.name			= ART_GO0;
    209 	s_demos.go.generic.flags		= QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
    210 	s_demos.go.generic.id			= ID_GO;
    211 	s_demos.go.generic.callback		= Demos_MenuEvent;
    212 	s_demos.go.generic.x			= 640;
    213 	s_demos.go.generic.y			= 480-64;
    214 	s_demos.go.width				= 128;
    215 	s_demos.go.height				= 64;
    216 	s_demos.go.focuspic				= ART_GO1;
    217 
    218 	s_demos.list.generic.type		= MTYPE_SCROLLLIST;
    219 	s_demos.list.generic.flags		= QMF_PULSEIFFOCUS;
    220 	s_demos.list.generic.callback	= Demos_MenuEvent;
    221 	s_demos.list.generic.id			= ID_LIST;
    222 	s_demos.list.generic.x			= 118;
    223 	s_demos.list.generic.y			= 130;
    224 	s_demos.list.width				= 16;
    225 	s_demos.list.height				= 14;
    226 	Com_sprintf(extension, sizeof(extension), "dm_%d", (int)trap_Cvar_VariableValue( "protocol" ) );
    227 	s_demos.list.numitems			= trap_FS_GetFileList( "demos", extension, s_demos.names, NAMEBUFSIZE );
    228 	s_demos.list.itemnames			= (const char **)s_demos.demolist;
    229 	s_demos.list.columns			= 3;
    230 
    231 	if (!s_demos.list.numitems) {
    232 		strcpy( s_demos.names, "No Demos Found." );
    233 		s_demos.list.numitems = 1;
    234 
    235 		//degenerate case, not selectable
    236 		s_demos.go.generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
    237 	}
    238 	else if (s_demos.list.numitems > MAX_DEMOS)
    239 		s_demos.list.numitems = MAX_DEMOS;
    240 
    241 	demoname = s_demos.names;
    242 	for ( i = 0; i < s_demos.list.numitems; i++ ) {
    243 		s_demos.list.itemnames[i] = demoname;
    244 		
    245 		// strip extension
    246 		len = strlen( demoname );
    247 		if (!Q_stricmp(demoname +  len - 4,".dm3"))
    248 			demoname[len-4] = '\0';
    249 
    250 		Q_strupr(demoname);
    251 
    252 		demoname += len + 1;
    253 	}
    254 
    255 	Menu_AddItem( &s_demos.menu, &s_demos.banner );
    256 	Menu_AddItem( &s_demos.menu, &s_demos.framel );
    257 	Menu_AddItem( &s_demos.menu, &s_demos.framer );
    258 	Menu_AddItem( &s_demos.menu, &s_demos.list );
    259 	Menu_AddItem( &s_demos.menu, &s_demos.arrows );
    260 	Menu_AddItem( &s_demos.menu, &s_demos.left );
    261 	Menu_AddItem( &s_demos.menu, &s_demos.right );
    262 	Menu_AddItem( &s_demos.menu, &s_demos.back );
    263 	Menu_AddItem( &s_demos.menu, &s_demos.go );
    264 }
    265 
    266 /*
    267 =================
    268 Demos_Cache
    269 =================
    270 */
    271 void Demos_Cache( void ) {
    272 	trap_R_RegisterShaderNoMip( ART_BACK0 );
    273 	trap_R_RegisterShaderNoMip( ART_BACK1 );
    274 	trap_R_RegisterShaderNoMip( ART_GO0 );
    275 	trap_R_RegisterShaderNoMip( ART_GO1 );
    276 	trap_R_RegisterShaderNoMip( ART_FRAMEL );
    277 	trap_R_RegisterShaderNoMip( ART_FRAMER );
    278 	trap_R_RegisterShaderNoMip( ART_ARROWS );
    279 	trap_R_RegisterShaderNoMip( ART_ARROWLEFT );
    280 	trap_R_RegisterShaderNoMip( ART_ARROWRIGHT );
    281 }
    282 
    283 /*
    284 ===============
    285 UI_DemosMenu
    286 ===============
    287 */
    288 void UI_DemosMenu( void ) {
    289 	Demos_MenuInit();
    290 	UI_PushMenu( &s_demos.menu );
    291 }