Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

ui_spskill.c (11249B)


      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 SINGLE PLAYER SKILL MENU
     27 
     28 =============================================================================
     29 */
     30 
     31 #include "ui_local.h"
     32 
     33 
     34 #define ART_FRAME					"menu/art/cut_frame"
     35 #define ART_BACK					"menu/art/back_0.tga"
     36 #define ART_BACK_FOCUS				"menu/art/back_1.tga"
     37 #define ART_FIGHT					"menu/art/fight_0"
     38 #define ART_FIGHT_FOCUS				"menu/art/fight_1"
     39 #define ART_MAP_COMPLETE1			"menu/art/level_complete1"
     40 #define ART_MAP_COMPLETE2			"menu/art/level_complete2"
     41 #define ART_MAP_COMPLETE3			"menu/art/level_complete3"
     42 #define ART_MAP_COMPLETE4			"menu/art/level_complete4"
     43 #define ART_MAP_COMPLETE5			"menu/art/level_complete5"
     44 
     45 #define ID_BABY						10
     46 #define ID_EASY						11
     47 #define ID_MEDIUM					12
     48 #define ID_HARD						13
     49 #define ID_NIGHTMARE				14
     50 #define ID_BACK						15
     51 #define ID_FIGHT					16
     52 
     53 
     54 typedef struct {
     55 	menuframework_s	menu;
     56 
     57 	menubitmap_s	art_frame;
     58 	menutext_s		art_banner;
     59 
     60 	menutext_s		item_baby;
     61 	menutext_s		item_easy;
     62 	menutext_s		item_medium;
     63 	menutext_s		item_hard;
     64 	menutext_s		item_nightmare;
     65 
     66 	menubitmap_s	art_skillPic;
     67 	menubitmap_s	item_back;
     68 	menubitmap_s	item_fight;
     69 
     70 	const char		*arenaInfo;
     71 	qhandle_t		skillpics[5];
     72 	sfxHandle_t		nightmareSound;
     73 	sfxHandle_t		silenceSound;
     74 } skillMenuInfo_t;
     75 
     76 static skillMenuInfo_t	skillMenuInfo;
     77 
     78 
     79 static void SetSkillColor( int skill, vec4_t color ) {
     80 	switch( skill ) {
     81 	case 1:
     82 		skillMenuInfo.item_baby.color = color;
     83 		break;
     84 	case 2:
     85 		skillMenuInfo.item_easy.color = color;
     86 		break;
     87 	case 3:
     88 		skillMenuInfo.item_medium.color = color;
     89 		break;
     90 	case 4:
     91 		skillMenuInfo.item_hard.color = color;
     92 		break;
     93 	case 5:
     94 		skillMenuInfo.item_nightmare.color = color;
     95 		break;
     96 	default:
     97 		break;
     98 	}
     99 }
    100 
    101 
    102 /*
    103 =================
    104 UI_SPSkillMenu_SkillEvent
    105 =================
    106 */
    107 static void UI_SPSkillMenu_SkillEvent( void *ptr, int notification ) {
    108 	int		id;
    109 	int		skill;
    110 
    111 	if (notification != QM_ACTIVATED)
    112 		return;
    113 
    114 	SetSkillColor( (int)trap_Cvar_VariableValue( "g_spSkill" ), color_red );
    115 
    116 	id = ((menucommon_s*)ptr)->id;
    117 	skill = id - ID_BABY + 1;
    118 	trap_Cvar_SetValue( "g_spSkill", skill );
    119 
    120 	SetSkillColor( skill, color_white );
    121 	skillMenuInfo.art_skillPic.shader = skillMenuInfo.skillpics[skill - 1];
    122 
    123 	if( id == ID_NIGHTMARE ) {
    124 		trap_S_StartLocalSound( skillMenuInfo.nightmareSound, CHAN_ANNOUNCER );
    125 	}
    126 	else {
    127 		trap_S_StartLocalSound( skillMenuInfo.silenceSound, CHAN_ANNOUNCER );
    128 	}
    129 }
    130 
    131 
    132 /*
    133 =================
    134 UI_SPSkillMenu_FightEvent
    135 =================
    136 */
    137 static void UI_SPSkillMenu_FightEvent( void *ptr, int notification ) {
    138 	if (notification != QM_ACTIVATED)
    139 		return;
    140 
    141 	UI_SPArena_Start( skillMenuInfo.arenaInfo );
    142 }
    143 
    144 
    145 /*
    146 =================
    147 UI_SPSkillMenu_BackEvent
    148 =================
    149 */
    150 static void UI_SPSkillMenu_BackEvent( void* ptr, int notification ) {
    151 	if (notification != QM_ACTIVATED) {
    152 		return;
    153 	}
    154 
    155 	trap_S_StartLocalSound( skillMenuInfo.silenceSound, CHAN_ANNOUNCER );
    156 	UI_PopMenu();
    157 }
    158 
    159 
    160 /*
    161 =================
    162 UI_SPSkillMenu_Key
    163 =================
    164 */
    165 static sfxHandle_t UI_SPSkillMenu_Key( int key ) {
    166 	if( key == K_MOUSE2 || key == K_ESCAPE ) {
    167 		trap_S_StartLocalSound( skillMenuInfo.silenceSound, CHAN_ANNOUNCER );
    168 	}
    169 	return Menu_DefaultKey( &skillMenuInfo.menu, key );
    170 }
    171 
    172 
    173 /*
    174 =================
    175 UI_SPSkillMenu_Cache
    176 =================
    177 */
    178 void UI_SPSkillMenu_Cache( void ) {
    179 	trap_R_RegisterShaderNoMip( ART_FRAME );
    180 	trap_R_RegisterShaderNoMip( ART_BACK );
    181 	trap_R_RegisterShaderNoMip( ART_BACK_FOCUS );
    182 	trap_R_RegisterShaderNoMip( ART_FIGHT );
    183 	trap_R_RegisterShaderNoMip( ART_FIGHT_FOCUS );
    184 	skillMenuInfo.skillpics[0] = trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE1 );
    185 	skillMenuInfo.skillpics[1] = trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE2 );
    186 	skillMenuInfo.skillpics[2] = trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE3 );
    187 	skillMenuInfo.skillpics[3] = trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE4 );
    188 	skillMenuInfo.skillpics[4] = trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE5 );
    189 
    190 	skillMenuInfo.nightmareSound = trap_S_RegisterSound( "sound/misc/nightmare.wav", qfalse );
    191 	skillMenuInfo.silenceSound = trap_S_RegisterSound( "sound/misc/silence.wav", qfalse );
    192 }
    193 
    194 
    195 /*
    196 =================
    197 UI_SPSkillMenu_Init
    198 =================
    199 */
    200 static void UI_SPSkillMenu_Init( void ) {
    201 	int		skill;
    202 
    203 	memset( &skillMenuInfo, 0, sizeof(skillMenuInfo) );
    204 	skillMenuInfo.menu.fullscreen = qtrue;
    205 	skillMenuInfo.menu.key = UI_SPSkillMenu_Key;
    206 
    207 	UI_SPSkillMenu_Cache();
    208 
    209 	skillMenuInfo.art_frame.generic.type		= MTYPE_BITMAP;
    210 	skillMenuInfo.art_frame.generic.name		= ART_FRAME;
    211 	skillMenuInfo.art_frame.generic.flags		= QMF_LEFT_JUSTIFY|QMF_INACTIVE;
    212 	skillMenuInfo.art_frame.generic.x			= 142;
    213 	skillMenuInfo.art_frame.generic.y			= 118;
    214 	skillMenuInfo.art_frame.width				= 359;
    215 	skillMenuInfo.art_frame.height				= 256;
    216 
    217 	skillMenuInfo.art_banner.generic.type		= MTYPE_BTEXT;
    218 	skillMenuInfo.art_banner.generic.flags		= QMF_CENTER_JUSTIFY;
    219 	skillMenuInfo.art_banner.generic.x			= 320;
    220 	skillMenuInfo.art_banner.generic.y			= 16;
    221 	skillMenuInfo.art_banner.string				= "DIFFICULTY";
    222 	skillMenuInfo.art_banner.color				= color_white;
    223 	skillMenuInfo.art_banner.style				= UI_CENTER;
    224 
    225 	skillMenuInfo.item_baby.generic.type		= MTYPE_PTEXT;
    226 	skillMenuInfo.item_baby.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    227 	skillMenuInfo.item_baby.generic.x			= 320;
    228 	skillMenuInfo.item_baby.generic.y			= 170;
    229 	skillMenuInfo.item_baby.generic.callback	= UI_SPSkillMenu_SkillEvent;
    230 	skillMenuInfo.item_baby.generic.id			= ID_BABY;
    231 	skillMenuInfo.item_baby.string				= "I Can Win";
    232 	skillMenuInfo.item_baby.color				= color_red;
    233 	skillMenuInfo.item_baby.style				= UI_CENTER;
    234 
    235 	skillMenuInfo.item_easy.generic.type		= MTYPE_PTEXT;
    236 	skillMenuInfo.item_easy.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    237 	skillMenuInfo.item_easy.generic.x			= 320;
    238 	skillMenuInfo.item_easy.generic.y			= 198;
    239 	skillMenuInfo.item_easy.generic.callback	= UI_SPSkillMenu_SkillEvent;
    240 	skillMenuInfo.item_easy.generic.id			= ID_EASY;
    241 	skillMenuInfo.item_easy.string				= "Bring It On";
    242 	skillMenuInfo.item_easy.color				= color_red;
    243 	skillMenuInfo.item_easy.style				= UI_CENTER;
    244 
    245 	skillMenuInfo.item_medium.generic.type		= MTYPE_PTEXT;
    246 	skillMenuInfo.item_medium.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    247 	skillMenuInfo.item_medium.generic.x			= 320;
    248 	skillMenuInfo.item_medium.generic.y			= 227;
    249 	skillMenuInfo.item_medium.generic.callback	= UI_SPSkillMenu_SkillEvent;
    250 	skillMenuInfo.item_medium.generic.id		= ID_MEDIUM;
    251 	skillMenuInfo.item_medium.string			= "Hurt Me Plenty";
    252 	skillMenuInfo.item_medium.color				= color_red;
    253 	skillMenuInfo.item_medium.style				= UI_CENTER;
    254 
    255 	skillMenuInfo.item_hard.generic.type		= MTYPE_PTEXT;
    256 	skillMenuInfo.item_hard.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    257 	skillMenuInfo.item_hard.generic.x			= 320;
    258 	skillMenuInfo.item_hard.generic.y			= 255;
    259 	skillMenuInfo.item_hard.generic.callback	= UI_SPSkillMenu_SkillEvent;
    260 	skillMenuInfo.item_hard.generic.id			= ID_HARD;
    261 	skillMenuInfo.item_hard.string				= "Hardcore";
    262 	skillMenuInfo.item_hard.color				= color_red;
    263 	skillMenuInfo.item_hard.style				= UI_CENTER;
    264 
    265 	skillMenuInfo.item_nightmare.generic.type		= MTYPE_PTEXT;
    266 	skillMenuInfo.item_nightmare.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    267 	skillMenuInfo.item_nightmare.generic.x			= 320;
    268 	skillMenuInfo.item_nightmare.generic.y			= 283;
    269 	skillMenuInfo.item_nightmare.generic.callback	= UI_SPSkillMenu_SkillEvent;
    270 	skillMenuInfo.item_nightmare.generic.id			= ID_NIGHTMARE;
    271 	skillMenuInfo.item_nightmare.string				= "NIGHTMARE!";
    272 	skillMenuInfo.item_nightmare.color				= color_red;
    273 	skillMenuInfo.item_nightmare.style				= UI_CENTER;
    274 
    275 	skillMenuInfo.item_back.generic.type		= MTYPE_BITMAP;
    276 	skillMenuInfo.item_back.generic.name		= ART_BACK;
    277 	skillMenuInfo.item_back.generic.flags		= QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
    278 	skillMenuInfo.item_back.generic.x			= 0;
    279 	skillMenuInfo.item_back.generic.y			= 480-64;
    280 	skillMenuInfo.item_back.generic.callback	= UI_SPSkillMenu_BackEvent;
    281 	skillMenuInfo.item_back.generic.id			= ID_BACK;
    282 	skillMenuInfo.item_back.width				= 128;
    283 	skillMenuInfo.item_back.height				= 64;
    284 	skillMenuInfo.item_back.focuspic			= ART_BACK_FOCUS;
    285 
    286 	skillMenuInfo.art_skillPic.generic.type		= MTYPE_BITMAP;
    287 	skillMenuInfo.art_skillPic.generic.flags	= QMF_LEFT_JUSTIFY|QMF_INACTIVE;
    288 	skillMenuInfo.art_skillPic.generic.x		= 320-64;
    289 	skillMenuInfo.art_skillPic.generic.y		= 368;
    290 	skillMenuInfo.art_skillPic.width			= 128;
    291 	skillMenuInfo.art_skillPic.height			= 96;
    292 
    293 	skillMenuInfo.item_fight.generic.type		= MTYPE_BITMAP;
    294 	skillMenuInfo.item_fight.generic.name		= ART_FIGHT;
    295 	skillMenuInfo.item_fight.generic.flags		= QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
    296 	skillMenuInfo.item_fight.generic.callback	= UI_SPSkillMenu_FightEvent;
    297 	skillMenuInfo.item_fight.generic.id			= ID_FIGHT;
    298 	skillMenuInfo.item_fight.generic.x			= 640;
    299 	skillMenuInfo.item_fight.generic.y			= 480-64;
    300 	skillMenuInfo.item_fight.width				= 128;
    301 	skillMenuInfo.item_fight.height				= 64;
    302 	skillMenuInfo.item_fight.focuspic			= ART_FIGHT_FOCUS;
    303 
    304 	Menu_AddItem( &skillMenuInfo.menu, ( void * )&skillMenuInfo.art_frame );
    305 	Menu_AddItem( &skillMenuInfo.menu, ( void * )&skillMenuInfo.art_banner );
    306 	Menu_AddItem( &skillMenuInfo.menu, ( void * )&skillMenuInfo.item_baby );
    307 	Menu_AddItem( &skillMenuInfo.menu, ( void * )&skillMenuInfo.item_easy );
    308 	Menu_AddItem( &skillMenuInfo.menu, ( void * )&skillMenuInfo.item_medium );
    309 	Menu_AddItem( &skillMenuInfo.menu, ( void * )&skillMenuInfo.item_hard );
    310 	Menu_AddItem( &skillMenuInfo.menu, ( void * )&skillMenuInfo.item_nightmare );
    311 	Menu_AddItem( &skillMenuInfo.menu, ( void * )&skillMenuInfo.art_skillPic );
    312 	Menu_AddItem( &skillMenuInfo.menu, ( void * )&skillMenuInfo.item_back );
    313 	Menu_AddItem( &skillMenuInfo.menu, ( void * )&skillMenuInfo.item_fight );
    314 
    315 	skill = (int)Com_Clamp( 1, 5, trap_Cvar_VariableValue( "g_spSkill" ) );
    316 	SetSkillColor( skill, color_white );
    317 	skillMenuInfo.art_skillPic.shader = skillMenuInfo.skillpics[skill - 1];
    318 	if( skill == 5 ) {
    319 		trap_S_StartLocalSound( skillMenuInfo.nightmareSound, CHAN_ANNOUNCER );
    320 	}
    321 }
    322 
    323 
    324 void UI_SPSkillMenu( const char *arenaInfo ) {
    325 	UI_SPSkillMenu_Init();
    326 	skillMenuInfo.arenaInfo = arenaInfo;
    327 	UI_PushMenu( &skillMenuInfo.menu );
    328 	Menu_SetCursorToItem( &skillMenuInfo.menu, &skillMenuInfo.item_fight );
    329 }