/********************************************************************** UI_TACTICAL.C User interface trigger from within game **********************************************************************/ #include "ui_local.h" typedef struct { char weaponName[MAX_QPATH]; int weaponMaxCount; int weaponCurrentCount; char weaponTarget[MAX_QPATH]; int weaponNum; } weaponData_t; typedef struct { menuframework_s menu; int maxWeapons; int choosenWeapon; int highLightedWeapon; sfxHandle_t openingVoice; sfxHandle_t fireVoice; menubitmap_s quitmenu; menubitmap_s fire; menubitmap_s weap1; menubitmap_s weap2; menubitmap_s weap3; menubitmap_s weap4; menubitmap_s weap5; menubitmap_s weap6; weaponData_t weaponData[MAX_TACTICAL_WEAPONS]; int numWeapons; } tactical_t; tactical_t s_tactical; void TacticalMenu_LoadText (void); #define ID_COMPUTERVOISE 6 #define ID_QUIT 10 #define ID_WEAP1 11 #define ID_WEAP2 12 #define ID_WEAP3 13 #define ID_WEAP4 14 #define ID_WEAP5 15 #define ID_WEAP6 16 #define ID_FIRE 100 void UI_TacticalMenu_Cache (void); /* ================= M_Tactical_Event ================= */ static void M_Tactical_Event (void* ptr, int notification) { int id; menubitmap_s *holdWeapon; id = ((menucommon_s*)ptr)->id; switch(id) { case ID_QUIT: if(notification == QM_ACTIVATED) UI_PopMenu(); trap_Cmd_ExecuteText(EXEC_APPEND, "ui_tactical_free"); break; case ID_WEAP1: case ID_WEAP2: case ID_WEAP3: case ID_WEAP4: case ID_WEAP5: case ID_WEAP6: if(notification == QM_ACTIVATED) { if(s_tactical.choosenWeapon >= 0) { holdWeapon = &s_tactical.weap1; holdWeapon += s_tactical.choosenWeapon; holdWeapon->textcolor = CT_BLACK; } s_tactical.choosenWeapon = id - ID_WEAP1; s_tactical.fire.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; holdWeapon = &s_tactical.weap1; holdWeapon += s_tactical.choosenWeapon; } else if(notification == QM_GOTFOCUS) { s_tactical.highLightedWeapon = id - ID_WEAP1; } break; case ID_FIRE: if(notification == QM_ACTIVATED) { //UI_ForceMenuOff(); trap_Cmd_ExecuteText( EXEC_APPEND, va( "tactical %s", s_tactical.weaponData[s_tactical.choosenWeapon].weaponTarget )); } break; } } /* ================= TacticalMenu_Key ================= */ sfxHandle_t TacticalMenu_Key (int key) { return ( Menu_DefaultKey( &s_tactical.menu, key ) ); } extern qhandle_t leftRound; qhandle_t tactical; qhandle_t square_rl; qhandle_t square_rr; qhandle_t corner_tact_ul; qhandle_t corner_tact_ll; /* ================= M_TacticalMenu_Graphics ================= */ static void M_TacticalMenu_Graphics (void) { menubitmap_s *holdWeapon; int i,length,xWeaponStart; int numColor,roundColor; vec4_t bgColor = { 0.1, 0.1, 0.1, .75 }; // background //UI_DrawRect(75, 420, 490, 50, bgColor); trap_R_SetColor(bgColor); UI_DrawHandlePic(150, 375, 100, 100, square_rl); UI_DrawHandlePic(250, 375, 140, 100, uis.whiteShader); UI_DrawHandlePic(390, 375, 100, 100, square_rr); // upper left trap_R_SetColor(colorTable[CT_DKPURPLE1]); UI_DrawHandlePic(151, 376, 75, 50, corner_tact_ul); UI_DrawHandlePic(218, 376, 270, 28, uis.whiteShader); } /* =============== TacticalMenu_Draw =============== */ static void TacticalMenu_Draw(void) { // Draw graphics particular to Main Menu M_TacticalMenu_Graphics(); Menu_Draw( &s_tactical.menu ); } /* =============== UI_TacticalMenu_Cache =============== */ void UI_TacticalMenu_Cache (void) { leftRound = trap_R_RegisterShaderNoMip("menu/common/halfroundl_24.tga"); tactical = trap_R_RegisterShaderNoMip("menu/common/lift_button.tga"); square_rl = trap_R_RegisterShaderNoMip("menu/common/square_rounded_left.tga"); square_rr = trap_R_RegisterShaderNoMip("menu/common/square_rounded_right.tga"); corner_tact_ll = trap_R_RegisterShaderNoMip("menu/common/corner_tact_ll.tga"); corner_tact_ul = trap_R_RegisterShaderNoMip("menu/common/corner_ul_18_50.tga"); } static void UI_TacticalMenu_LoadWeapons( void ) { char buffer[MAX_TOKEN_CHARS]; int i; char *temp; s_tactical.numWeapons = 0; //load the string trap_GetConfigString( CS_TACTICAL_DATA, buffer, sizeof( buffer ) ); if ( !buffer[0] ) return; memset( &s_tactical.weaponData, 0, sizeof( s_tactical.weaponData ) ); for ( i=0; i < MAX_TACTICAL_WEAPONS; i++ ) { temp = Info_ValueForKey( buffer, va( "d%i", i ) ); if ( !temp[0] ) break; s_tactical.weaponData[ s_tactical.numWeapons ].weaponNum = atoi( temp ); temp = Info_ValueForKey( buffer, va( "n%i", i ) ); Q_strncpyz( s_tactical.weaponData[ s_tactical.numWeapons ].weaponName, temp, sizeof( s_tactical.weaponData[ s_tactical.numWeapons ].weaponName ) ); s_tactical.numWeapons++; } } static void UI_ManageWeaponLoading( void ) { char fileRoute[MAX_QPATH]; char mapRoute[MAX_QPATH]; char info[MAX_TOKEN_CHARS]; fileHandle_t f; int file_len; char *textPtr; char buffer[20000]; char *token; //get the map name trap_GetConfigString( CS_SERVERINFO, info, sizeof( info ) ); Com_sprintf( mapRoute, sizeof( fileRoute ), "maps/%s", Info_ValueForKey( info, "mapname" ) ); //check for language UI_LanguageFilename( mapRoute, "tactical", fileRoute ); file_len = trap_FS_FOpenFile( fileRoute, &f, FS_READ ); if ( file_len <= 1 ) { //Com_Printf( S_COLOR_YELLOW "WARNING: Attempted to load %s, but wasn't found.\n", fileRoute ); UI_TacticalMenu_LoadWeapons(); return; } trap_FS_Read( buffer, file_len, f ); trap_FS_FCloseFile( f ); if ( !buffer[0] ) { Com_Printf( S_COLOR_RED "ERROR: Attempted to load %s, but no data was read.\n", fileRoute ); UI_TacticalMenu_LoadWeapons(); return; } s_tactical.numWeapons = 0; memset( &s_tactical.weaponData, 0, sizeof( s_tactical.weaponData ) ); buffer[file_len] = '\0'; COM_BeginParseSession(); textPtr = buffer; //Com_Printf( S_COLOR_RED "Beginning Parse\n" ); //expected format is 'weapon num' 'weapon desc' 'weapon target' while( 1 ) { token = COM_Parse( &textPtr ); if ( !token[0] ) break; //Com_Printf( S_COLOR_RED "First Token: %s\n", token ); //grab the weapon number s_tactical.weaponData[s_tactical.numWeapons].weaponNum = atoi( token ); token = COM_ParseExt( &textPtr, qfalse ); if (!token[0]) continue; //Com_Printf( S_COLOR_RED "Second Token: %s\n", token ); Q_strncpyz( s_tactical.weaponData[s_tactical.numWeapons].weaponName, token, sizeof( s_tactical.weaponData[s_tactical.numWeapons].weaponName ) ); token = COM_ParseExt( &textPtr, qfalse ); if(!token[0]) continue; Q_strncpyz( s_tactical.weaponData[s_tactical.numWeapons].weaponTarget, token, sizeof(s_tactical.weaponData[s_tactical.numWeapons].weaponTarget) ); s_tactical.numWeapons++; } } /* =============== TacticalMenu_Init =============== */ void TacticalMenu_Init(void) { int y,pad,x; menubitmap_s *holdWeapon; int i,width; UI_ManageWeaponLoading(); s_tactical.menu.fullscreen = qfalse; s_tactical.menu.nobackground = qtrue; s_tactical.menu.nitems = 0; s_tactical.menu.draw = TacticalMenu_Draw; s_tactical.menu.key = TacticalMenu_Key; s_tactical.menu.wrapAround = qtrue; s_tactical.menu.descX = MENU_DESC_X; s_tactical.menu.descY = MENU_DESC_Y; s_tactical.menu.titleX = MENU_TITLE_X; s_tactical.menu.titleY = MENU_TITLE_Y; s_tactical.choosenWeapon = -1; s_tactical.highLightedWeapon = -1; pad = PROP_BIG_HEIGHT + 10; y = 72; x = 319; width = MENU_BUTTON_MED_WIDTH-20; s_tactical.maxWeapons = MAX_TACTICAL_WEAPONS; holdWeapon = &s_tactical.weap1; for (i=0;igeneric.type = MTYPE_BITMAP; holdWeapon->generic.flags = QMF_HIGHLIGHT_IF_FOCUS; holdWeapon->generic.x = x; holdWeapon->generic.y = y; holdWeapon->generic.name = GRAPHIC_BUTTONRIGHT; holdWeapon->generic.id = ID_WEAP1 + i; holdWeapon->generic.callback = M_Tactical_Event; holdWeapon->width = width; holdWeapon->height = PROP_BIG_HEIGHT; holdWeapon->color = CT_DKPURPLE1;//CT_VDKRED1;//CT_DKGOLD1; holdWeapon->color2 = CT_LTPURPLE1;//CT_DKRED1;//CT_LTGOLD1; holdWeapon->textX = MENU_BUTTON_TEXT_X; holdWeapon->textY = 12; holdWeapon->textEnum = MBT_WEAPON; holdWeapon->textcolor = CT_BLACK; holdWeapon->textcolor2 = CT_WHITE; holdWeapon->textStyle = UI_TINYFONT; holdWeapon++; y += pad; // Start the next column if (i == ((s_tactical.maxWeapons-1)/2)) { x += width + 90; y = 80; } } s_tactical.fire.generic.type = MTYPE_BITMAP; s_tactical.fire.generic.flags = QMF_GRAYED; s_tactical.fire.generic.x = 110; s_tactical.fire.generic.y = 72 + (pad * 5); s_tactical.fire.generic.name = GRAPHIC_BUTTONRIGHT; s_tactical.fire.generic.id = ID_FIRE; s_tactical.fire.generic.callback = M_Tactical_Event; s_tactical.fire.width = width; s_tactical.fire.height = PROP_BIG_HEIGHT; s_tactical.fire.color = CT_DKORANGE; s_tactical.fire.color2 = CT_LTORANGE; s_tactical.fire.textX = MENU_BUTTON_TEXT_X; s_tactical.fire.textY = 6; s_tactical.fire.textEnum = MBT_FIRE; s_tactical.fire.textcolor = CT_BLACK; s_tactical.fire.textcolor2 = CT_WHITE; s_tactical.quitmenu.generic.type = MTYPE_BITMAP; s_tactical.quitmenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_tactical.quitmenu.generic.x = 110; s_tactical.quitmenu.generic.y = 72 + (pad * 7); s_tactical.quitmenu.generic.name = GRAPHIC_BUTTONRIGHT; s_tactical.quitmenu.generic.id = ID_QUIT; s_tactical.quitmenu.generic.callback = M_Tactical_Event; s_tactical.quitmenu.width = width; s_tactical.quitmenu.height = PROP_BIG_HEIGHT; s_tactical.quitmenu.color = CT_DKORANGE; s_tactical.quitmenu.color2 = CT_LTORANGE; s_tactical.quitmenu.textX = MENU_BUTTON_TEXT_X; s_tactical.quitmenu.textY = 6; s_tactical.quitmenu.textEnum = MBT_RETURNMENU;//MBT_RETURN; s_tactical.quitmenu.textcolor = CT_BLACK; s_tactical.quitmenu.textcolor2 = CT_WHITE; Menu_AddItem( &s_tactical.menu, &s_tactical.fire ); Menu_AddItem( &s_tactical.menu, &s_tactical.quitmenu ); holdWeapon = &s_tactical.weap1; for (i=0;i