#include "ui_local.h" // Precache stuff for Game Options Menu static struct { qhandle_t slant1; qhandle_t slant2; qhandle_t swooptop; qhandle_t swoopbottom; qhandle_t singraph; qhandle_t graphbox; qhandle_t lswoop; qhandle_t lswoop2; qhandle_t tallswoop; qhandle_t tallswoop2; qhandle_t round1; qhandle_t round2; qhandle_t round10; qhandle_t round11; } gameoptionsmenu_cache; #define ID_SUBTITLE 125 #define ID_TEXTLANGUAGE 126 #define ID_CROSSHAIR 127 #define ID_LIGHTFLARES 129 #define ID_LIGHTFLARES_VALUE 130 #define ID_EJECTINGBRASS 131 #define ID_WALLMARKS 132 #define ID_WALLMARKS_VALUE 133 #define ID_DYNAMICLIGHTS 134 #define ID_DYNAMICLIGHTS_VALUE 135 #define ID_IDENTIFYTARGET 136 #define ID_IDENTIFYTARGET_VALUE 137 #define ID_SYNCEVERYFRAME 138 #define ID_SYNCEVERYFRAME_VALUE 139 #define ID_VOICELANGUAGE 140 #define ID_RETURN 141 #define ID_MAINMENU 100 #define ID_CONTROLS 101 #define ID_VIDEO 102 #define ID_SOUND 103 #define ID_GAMEOPTIONS 104 #define ID_CDKEY 105 static menubitmap_s s_preferences_crosshair_box; static menubitmap_s s_preferences_wallmarks_box; static menubitmap_s s_preferences_wallmarks_value; static menubitmap_s s_preferences_dynamiclights_box; static menubitmap_s s_preferences_dynamiclights_value; static menubitmap_s s_preferences_lightflares_box; static menubitmap_s s_preferences_lightflares_value; static menubitmap_s s_preferences_identifytarget_box; static menubitmap_s s_preferences_identifytarget_value; static menubitmap_s s_preferences_synceveryframe_box; static menubitmap_s s_preferences_synceveryframe_value; static menulist_s s_subtitle; static menulist_s s_textlanguage; static menulist_s s_voicelanguage; static menuframework_s s_gameoptions_menu; #define NUM_CROSSHAIRS 12 static qhandle_t crosshairShader[NUM_CROSSHAIRS]; static int curCrosshair; int s_textlanguage_Names[] = { MNT_ENGLISH, MNT_GERMAN, MNT_FRENCH, MNT_NONE }; int s_voicelanguage_Names[] = { MNT_ENGLISH, MNT_GERMAN, MNT_NONE }; typedef enum { GOMG_CENTERDOT1, GOMG_CENTERDOT2, GOMG_CENTERDOT3, GOMG_CENTERDOT4, GOMG_BLEFTSIDE, GOMG_BRIGHTSIDE, GOMG_SINE1, GOMG_SINE2, GOMG_SINE3, GOMG_NUMBERS_START, GOMG_COL1_ROW1, GOMG_COL1_ROW2, GOMG_COL1_ROW3, GOMG_COL1_ROW4, GOMG_COL2_ROW1, GOMG_COL2_ROW2, GOMG_COL2_ROW3, GOMG_COL2_ROW4, GOMG_COL3_ROW1, GOMG_COL3_ROW2, GOMG_COL3_ROW3, GOMG_COL3_ROW4, GOMG_COL4_ROW1, GOMG_COL4_ROW2, GOMG_COL4_ROW3, GOMG_COL4_ROW4, GOMG_COL5_ROW1, GOMG_COL5_ROW2, GOMG_COL5_ROW3, GOMG_COL5_ROW4, GOMG_COL6_ROW1, GOMG_COL6_ROW2, GOMG_COL6_ROW3, GOMG_COL6_ROW4, GOMG_COL7_ROW1, GOMG_COL7_ROW2, GOMG_COL7_ROW3, GOMG_COL7_ROW4, GOMG_COL8_ROW1, GOMG_COL8_ROW2, GOMG_COL8_ROW3, GOMG_COL8_ROW4, GOMG_NUMBERS_END, GOMG_MAX } mainmenu_graphics_t; menugraphics_s gameoptionsmenu_graphics[GOMG_MAX] = { // type timer x y width height file/text graphic, min max target inc style color MG_GRAPHIC, 0.0, 157, 260, 64, 64, "menu/lcarscontrols/round14.tga",0,0,NULL, 0, 0, 0, 1, 0, CT_DKGOLD1, NULL, // GOMG_CENTERDOT1 MG_GRAPHIC, 0.0, 196, 259, 64, 64, "menu/lcarscontrols/round15.tga",0,0,NULL, 0, 0, 0, 1, 0, CT_LTBLUE1, NULL, // GOMG_CENTERDOT2 MG_GRAPHIC, 0.0, 196, 298, 64, 64, "menu/lcarscontrols/round16.tga",0,0,NULL, 0, 0, 0, 1, 0, CT_LTBLUE1, NULL, // GOMG_CENTERDOT3 MG_GRAPHIC, 0.0, 157, 297, 64, 64, "menu/lcarscontrols/round17.tga",0,0,NULL, 0, 0, 0, 1, 0, CT_LTBLUE2, NULL, // GOMG_CENTERDOT4 MG_VAR, 0.0, 0, 0, 0, 0, NULL, 0,0, NULL, 0, 0, 0, 1, 0, CT_NONE, NULL, // GOMG_BLEFTSIDE MG_VAR, 0.0, 0, 0, 0, 0, NULL, 0,0, NULL, 0, 0, 0, 1, 0, CT_NONE, NULL, // GOMG_BRIGHTSIDE MG_GRAPHIC, 0.0, 548, 214, 64, 166, "menu/lcarscontrols/sin1.tga",0,0, NULL, 0, 0, 0, 1, 0, CT_RED, NULL, // GOMG_SINE1 MG_GRAPHIC, 0.0, 548, 214, 64, 166, "menu/lcarscontrols/sin2.tga",0,0, NULL, 0, 0, 0, 1, 0, CT_BLUE, NULL, // GOMG_SINE2 MG_GRAPHIC, 0.0, 548, 214, 64, 166, "menu/lcarscontrols/sin3.tga",0,0, NULL, 0, 0, 0, 1, 0, CT_YELLOW, NULL, // GOMG_SINE3 MG_VAR, 0.0, 0, 0, 0, 0, NULL, 0,0, NULL, 0, 0, 0, 1, 0, CT_NONE, NULL, // GOMG_NUMBERS_START MG_NUMBER, 0.0, 460, 68, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL1_ROW1 MG_NUMBER, 0.0, 460, 80, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL1_ROW2 MG_NUMBER, 0.0, 460, 92, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL1_ROW3 MG_NUMBER, 0.0, 460, 104, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL1_ROW4 MG_NUMBER, 0.0, 474, 68, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL2_ROW1 MG_NUMBER, 0.0, 474, 80, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL2_ROW2 MG_NUMBER, 0.0, 474, 92, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL2_ROW3 MG_NUMBER, 0.0, 474, 104, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL2_ROW4 MG_NUMBER, 0.0, 516, 68, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL3_ROW1 MG_NUMBER, 0.0, 516, 80, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL3_ROW2 MG_NUMBER, 0.0, 516, 92, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL3_ROW3 MG_NUMBER, 0.0, 516, 104, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL3_ROW4 MG_NUMBER, 0.0, 530, 68, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL4_ROW1 MG_NUMBER, 0.0, 530, 80, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL4_ROW2 MG_NUMBER, 0.0, 530, 92, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL4_ROW3 MG_NUMBER, 0.0, 530, 104, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL4_ROW4 MG_NUMBER, 0.0, 544, 68, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL5_ROW1 MG_NUMBER, 0.0, 544, 80, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL5_ROW2 MG_NUMBER, 0.0, 544, 92, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL5_ROW3 MG_NUMBER, 0.0, 544, 104, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL5_ROW4 MG_NUMBER, 0.0, 558, 68, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL6_ROW1 MG_NUMBER, 0.0, 558, 80, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL6_ROW2 MG_NUMBER, 0.0, 558, 92, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL6_ROW3 MG_NUMBER, 0.0, 558, 104, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL6_ROW4 MG_NUMBER, 0.0, 572, 68, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL7_ROW1 MG_NUMBER, 0.0, 572, 80, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL7_ROW2 MG_NUMBER, 0.0, 572, 92, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL7_ROW3 MG_NUMBER, 0.0, 572, 104, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL7_ROW4 MG_NUMBER, 0.0, 596, 68, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL8_ROW1 MG_NUMBER, 0.0, 596, 80, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL8_ROW2 MG_NUMBER, 0.0, 596, 92, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL8_ROW3 MG_NUMBER, 0.0, 596, 104, 16, 10, NULL, 0,0, NULL, 0, 2, 0, 12, UI_TINYFONT, CT_LTGOLD1, NULL, // GOMG_COL8_ROW4 MG_VAR, 0.0, 0, 0, 0, 0, NULL, 0,0, NULL, 0, 0, 0, 1, 0, CT_NONE, NULL, // GOMG_NUMBERS_END }; int s_subtitle_Names[] = { MNT_OFF, MNT_ON, MNT_CINEMATIC, MNT_NONE }; //static menulist_s s_preferences_crosshair_box; //static menuradiobutton_s s_preferences_brass_box; //static menuradiobutton_s s_preferences_highqualitysky_box; //static menubitmap_s s_preferences_return; /* ================= ClampCvar ================= */ static float ClampCvar( float min, float max, float value ) { if ( value < min ) { return min; } if ( value > max ) { return max; } return value; } /* ================= Preferences_CvarOnOff ================= */ void Preferences_CvarOnOff(char *cvarName,menubitmap_s *bitMap,menubitmap_s *buttonBitMap) { int curValue; curValue = ui.Cvar_VariableValue( cvarName ); if (curValue) // It's on - turn if off { bitMap->textEnum = MBT_OFF; bitMap->color =buttonBitMap->color; curValue = 0; } else { bitMap->textEnum = MBT_ON; bitMap->color =buttonBitMap->color2; curValue = 1; } ui.Cvar_SetValue( cvarName, curValue ); } /* ================= Preferences_CvarSet ================= */ void Preferences_CvarSet(char *cvarName,menubitmap_s *bitMap,int colorOn,int colorOff) { int curValue; curValue = ui.Cvar_VariableValue( cvarName ); if (curValue) { bitMap->textEnum = MBT_ON; bitMap->color = colorOn; bitMap->color2 = colorOn; } else { bitMap->textEnum = MBT_OFF; bitMap->color = colorOff; bitMap->color2 = colorOff; } } /* ================= Preferences_Event ================= */ static void Preferences_Event( void* ptr, int notification ) { menuframework_s* m; int curValue; if (notification != QM_ACTIVATED) { return; } m = ((menucommon_s*)ptr)->parent; switch (((menucommon_s*)ptr)->id) { case ID_SUBTITLE: ui.Cvar_SetValue( "g_subtitles", s_subtitle.curvalue ); break; case ID_TEXTLANGUAGE: ui.Cvar_Set( "g_language", menu_normal_text[s_textlanguage_Names[s_textlanguage.curvalue]] ); UI_LoadButtonText(); UI_LoadMenuText(); break; case ID_VOICELANGUAGE: ui.Cvar_Set( "s_language", menu_normal_text[s_voicelanguage_Names[s_voicelanguage.curvalue]] ); ui.Cmd_ExecuteText( EXEC_APPEND, "snd_restart\n" ); break; case ID_CROSSHAIR: curCrosshair++; if (curCrosshair == NUM_CROSSHAIRS) { curCrosshair=0; } ui.Cvar_SetValue( "cg_drawCrosshair", curCrosshair ); break; case ID_LIGHTFLARES: curValue = !ui.Cvar_VariableValue( "r_flares" ); if (curValue) { s_preferences_lightflares_value.color =s_preferences_lightflares_box.color2; s_preferences_lightflares_value.textEnum = MBT_ON; gameoptionsmenu_graphics[GOMG_BLEFTSIDE].target = 1; } else { s_preferences_lightflares_value.color =s_preferences_lightflares_box.color; s_preferences_lightflares_value.textEnum = MBT_OFF; gameoptionsmenu_graphics[GOMG_BLEFTSIDE].target = 0; gameoptionsmenu_graphics[GOMG_CENTERDOT1].color = CT_DKORANGE; gameoptionsmenu_graphics[GOMG_CENTERDOT4].color = CT_DKORANGE; } ui.Cvar_SetValue( "r_flares", curValue ); break; case ID_WALLMARKS: Preferences_CvarOnOff("cg_marks",&s_preferences_wallmarks_value,&s_preferences_wallmarks_box); if (s_preferences_wallmarks_value.textEnum == MBT_ON) { gameoptionsmenu_graphics[GOMG_SINE1].type = MG_GRAPHIC; } else { gameoptionsmenu_graphics[GOMG_SINE1].type = MG_OFF; } break; case ID_DYNAMICLIGHTS: Preferences_CvarOnOff("r_dynamiclight",&s_preferences_dynamiclights_value,&s_preferences_dynamiclights_box); if (s_preferences_dynamiclights_value.textEnum == MBT_ON) { gameoptionsmenu_graphics[GOMG_SINE2].type = MG_GRAPHIC; } else { gameoptionsmenu_graphics[GOMG_SINE2].type = MG_OFF; } break; case ID_IDENTIFYTARGET: Preferences_CvarOnOff("cg_drawCrosshairNames",&s_preferences_identifytarget_value,&s_preferences_identifytarget_box); if (s_preferences_identifytarget_value.textEnum == MBT_ON) { gameoptionsmenu_graphics[GOMG_SINE3].type = MG_GRAPHIC; } else { gameoptionsmenu_graphics[GOMG_SINE3].type = MG_OFF; } break; case ID_SYNCEVERYFRAME: Preferences_CvarOnOff("r_finish", &s_preferences_synceveryframe_value,&s_preferences_synceveryframe_box); if (s_preferences_synceveryframe_value.textEnum == MBT_ON) { gameoptionsmenu_graphics[GOMG_BRIGHTSIDE].target = 1; } else { gameoptionsmenu_graphics[GOMG_BRIGHTSIDE].target = 0; gameoptionsmenu_graphics[GOMG_CENTERDOT2].color = CT_DKBLUE1; gameoptionsmenu_graphics[GOMG_CENTERDOT3].color = CT_DKBLUE1; } break; case ID_RETURN: UI_PopMenu(); break; } } /* ================= GameOptions_MenuEvent ================= */ static void GameOptions_MenuEvent( void* ptr, int notification ) { menuframework_s* m; if (notification != QM_ACTIVATED) return; m = ((menucommon_s*)ptr)->parent; switch (((menucommon_s*)ptr)->id) { case ID_SOUND: UI_PopMenu(); // Get rid of whatever is ontop UI_SoundMenu(); // Move to the Sound Menu break; case ID_CONTROLS: UI_PopMenu(); // Get rid of whatever is ontop UI_SetupWeaponsMenu(); // Move to the Controls Menu break; case ID_VIDEO: UI_PopMenu(); // Get rid of whatever is ontop UI_VideoDataMenu(); // Move to the Video Menu break; case ID_GAMEOPTIONS: break; case ID_CDKEY: UI_PopMenu(); // Get rid of whatever is ontop UI_CDKeyMenu(); // Move to the CD Key Menu break; case ID_MAINMENU: UI_PopMenu(); } } /* ================= Preferences_MenuBlinkies ================= */ static void Preferences_MenuBlinkies( void ) { int i; if (gameoptionsmenu_graphics[GOMG_BLEFTSIDE].target) { // Change color every 2 to 6 seconds if (gameoptionsmenu_graphics[GOMG_CENTERDOT1].timer < uis.realtime) { gameoptionsmenu_graphics[GOMG_CENTERDOT1].timer = uis.realtime + (random() * 4000) + 2000; if (gameoptionsmenu_graphics[GOMG_CENTERDOT1].color != CT_DKORANGE) { gameoptionsmenu_graphics[GOMG_CENTERDOT1].color = CT_DKORANGE; } else { gameoptionsmenu_graphics[GOMG_CENTERDOT1].color = CT_LTORANGE; } } // Change color every 1 seconds if (gameoptionsmenu_graphics[GOMG_CENTERDOT4].timer < uis.realtime) { gameoptionsmenu_graphics[GOMG_CENTERDOT4].timer = uis.realtime + 1000; if (gameoptionsmenu_graphics[GOMG_CENTERDOT4].color != CT_DKORANGE) { gameoptionsmenu_graphics[GOMG_CENTERDOT4].color = CT_DKORANGE; } else { gameoptionsmenu_graphics[GOMG_CENTERDOT4].color = CT_LTORANGE; } } } if (gameoptionsmenu_graphics[GOMG_BRIGHTSIDE].target) { // Change color every 3 to 6 seconds if (gameoptionsmenu_graphics[GOMG_CENTERDOT2].timer < uis.realtime) { gameoptionsmenu_graphics[GOMG_CENTERDOT2].timer = uis.realtime + (random() * 3000) + 3000; if (gameoptionsmenu_graphics[GOMG_CENTERDOT2].color != CT_DKBLUE1) { gameoptionsmenu_graphics[GOMG_CENTERDOT2].color = CT_DKBLUE1; } else { gameoptionsmenu_graphics[GOMG_CENTERDOT2].color = CT_LTBLUE1; } } // Change color every 2 to 4 seconds if (gameoptionsmenu_graphics[GOMG_CENTERDOT3].timer < uis.realtime) { gameoptionsmenu_graphics[GOMG_CENTERDOT3].timer = uis.realtime + (random() * 2000) + 2000; if (gameoptionsmenu_graphics[GOMG_CENTERDOT3].color != CT_DKBLUE1) { gameoptionsmenu_graphics[GOMG_CENTERDOT3].color = CT_DKBLUE1; } else { gameoptionsmenu_graphics[GOMG_CENTERDOT3].color = CT_LTBLUE1; } } } if (gameoptionsmenu_graphics[GOMG_COL1_ROW1].timer < uis.realtime) { // Make numbers change gameoptionsmenu_graphics[GOMG_COL1_ROW1].timer = uis.realtime + 5000; for (i=GOMG_NUMBERS_START + 1;i