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 }