/* =========================================================================== Copyright (C) 1999-2005 Id Software, Inc. Copyright (C) 2002-2021 Q3Rally Team (Per Thormann - q3rally@gmail.com) This file is part of q3rally source code. q3rally source code is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. q3rally source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with q3rally; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ // /* ======================================================================= GAME OPTIONS MENU ======================================================================= */ #include "ui_local.h" #define PREFERENCES_X_POS 360 #define ID_SIMPLEITEMS 128 #define ID_HIGHQUALITYSKY 129 #define ID_EJECTINGBRASS 130 #define ID_WALLMARKS 131 #define ID_DYNAMICLIGHTS 132 #define ID_IDENTIFYTARGET 133 #define ID_SYNCEVERYFRAME 134 #define ID_FORCEMODEL 135 #define ID_DRAWTEAMOVERLAY 136 #define ID_ALLOWDOWNLOAD 137 #define ID_BACK 138 #define ID_DRAWFPS 139 #define NUM_CROSSHAIRS 10 typedef struct { menuframework_s menu; menutext_s banner; menuradiobutton_s simpleitems; menuradiobutton_s brass; menuradiobutton_s wallmarks; menuradiobutton_s dynamiclights; menuradiobutton_s identifytarget; menuradiobutton_s highqualitysky; menuradiobutton_s synceveryframe; menuradiobutton_s forcemodel; menulist_s drawteamoverlay; menuradiobutton_s allowdownload; menuradiobutton_s drawfps; menutext_s back; qhandle_t crosshairShader[NUM_CROSSHAIRS]; } preferences_t; static preferences_t s_preferences; static const char *teamoverlay_names[] = { "off", "upper right", "lower right", "lower left", 0 }; static void Preferences_SetMenuItems( void ) { s_preferences.simpleitems.curvalue = trap_Cvar_VariableValue( "cg_simpleItems" ) != 0; s_preferences.brass.curvalue = trap_Cvar_VariableValue( "cg_brassTime" ) != 0; s_preferences.wallmarks.curvalue = trap_Cvar_VariableValue( "cg_marks" ) != 0; s_preferences.identifytarget.curvalue = trap_Cvar_VariableValue( "cg_drawCrosshairNames" ) != 0; s_preferences.dynamiclights.curvalue = trap_Cvar_VariableValue( "r_dynamiclight" ) != 0; s_preferences.highqualitysky.curvalue = trap_Cvar_VariableValue ( "r_fastsky" ) == 0; s_preferences.synceveryframe.curvalue = trap_Cvar_VariableValue( "r_finish" ) != 0; s_preferences.forcemodel.curvalue = trap_Cvar_VariableValue( "cg_forcemodel" ) != 0; s_preferences.drawteamoverlay.curvalue = Com_Clamp( 0, 3, trap_Cvar_VariableValue( "cg_drawTeamOverlay" ) ); s_preferences.allowdownload.curvalue = trap_Cvar_VariableValue( "cl_allowDownload" ) != 0; s_preferences.drawfps.curvalue = trap_Cvar_VariableValue( "cg_DrawFPS" ) != 0; } static void Preferences_Event( void* ptr, int notification ) { if( notification != QM_ACTIVATED ) { return; } switch( ((menucommon_s*)ptr)->id ) { case ID_SIMPLEITEMS: trap_Cvar_SetValue( "cg_simpleItems", s_preferences.simpleitems.curvalue ); break; case ID_HIGHQUALITYSKY: trap_Cvar_SetValue( "r_fastsky", !s_preferences.highqualitysky.curvalue ); break; case ID_EJECTINGBRASS: if ( s_preferences.brass.curvalue ) trap_Cvar_Reset( "cg_brassTime" ); else trap_Cvar_SetValue( "cg_brassTime", 0 ); break; case ID_WALLMARKS: trap_Cvar_SetValue( "cg_marks", s_preferences.wallmarks.curvalue ); break; case ID_DYNAMICLIGHTS: trap_Cvar_SetValue( "r_dynamiclight", s_preferences.dynamiclights.curvalue ); break; case ID_IDENTIFYTARGET: trap_Cvar_SetValue( "cg_drawCrosshairNames", s_preferences.identifytarget.curvalue ); break; case ID_SYNCEVERYFRAME: trap_Cvar_SetValue( "r_finish", s_preferences.synceveryframe.curvalue ); break; case ID_FORCEMODEL: trap_Cvar_SetValue( "cg_forcemodel", s_preferences.forcemodel.curvalue ); break; case ID_DRAWTEAMOVERLAY: trap_Cvar_SetValue( "cg_drawTeamOverlay", s_preferences.drawteamoverlay.curvalue ); break; case ID_ALLOWDOWNLOAD: trap_Cvar_SetValue( "cl_allowDownload", s_preferences.allowdownload.curvalue ); break; case ID_DRAWFPS: trap_Cvar_SetValue( "cg_DrawFPS", s_preferences.drawfps.curvalue ); break; case ID_BACK: UI_PopMenu(); break; } } static void Preferences_MenuInit( void ) { int y; memset( &s_preferences, 0 ,sizeof(preferences_t) ); Preferences_Cache(); s_preferences.menu.wrapAround = qtrue; s_preferences.menu.fullscreen = qtrue; s_preferences.banner.generic.type = MTYPE_BTEXT; s_preferences.banner.generic.x = 320; s_preferences.banner.generic.y = 16; s_preferences.banner.string = "GAME OPTIONS"; s_preferences.banner.color = color_white; s_preferences.banner.style = UI_CENTER; y = 144; s_preferences.simpleitems.generic.type = MTYPE_RADIOBUTTON; s_preferences.simpleitems.generic.name = "Simple Items:"; s_preferences.simpleitems.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.simpleitems.generic.callback = Preferences_Event; s_preferences.simpleitems.generic.id = ID_SIMPLEITEMS; s_preferences.simpleitems.generic.x = PREFERENCES_X_POS; s_preferences.simpleitems.generic.y = y; y += BIGCHAR_HEIGHT; s_preferences.wallmarks.generic.type = MTYPE_RADIOBUTTON; s_preferences.wallmarks.generic.name = "Marks on Walls:"; s_preferences.wallmarks.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.wallmarks.generic.callback = Preferences_Event; s_preferences.wallmarks.generic.id = ID_WALLMARKS; s_preferences.wallmarks.generic.x = PREFERENCES_X_POS; s_preferences.wallmarks.generic.y = y; y += BIGCHAR_HEIGHT+2; s_preferences.brass.generic.type = MTYPE_RADIOBUTTON; s_preferences.brass.generic.name = "Ejecting Brass:"; s_preferences.brass.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.brass.generic.callback = Preferences_Event; s_preferences.brass.generic.id = ID_EJECTINGBRASS; s_preferences.brass.generic.x = PREFERENCES_X_POS; s_preferences.brass.generic.y = y; y += BIGCHAR_HEIGHT+2; s_preferences.dynamiclights.generic.type = MTYPE_RADIOBUTTON; s_preferences.dynamiclights.generic.name = "Dynamic Lights:"; s_preferences.dynamiclights.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.dynamiclights.generic.callback = Preferences_Event; s_preferences.dynamiclights.generic.id = ID_DYNAMICLIGHTS; s_preferences.dynamiclights.generic.x = PREFERENCES_X_POS; s_preferences.dynamiclights.generic.y = y; y += BIGCHAR_HEIGHT+2; s_preferences.identifytarget.generic.type = MTYPE_RADIOBUTTON; s_preferences.identifytarget.generic.name = "Identify Target:"; s_preferences.identifytarget.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.identifytarget.generic.callback = Preferences_Event; s_preferences.identifytarget.generic.id = ID_IDENTIFYTARGET; s_preferences.identifytarget.generic.x = PREFERENCES_X_POS; s_preferences.identifytarget.generic.y = y; y += BIGCHAR_HEIGHT+2; s_preferences.highqualitysky.generic.type = MTYPE_RADIOBUTTON; s_preferences.highqualitysky.generic.name = "High Quality Sky:"; s_preferences.highqualitysky.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.highqualitysky.generic.callback = Preferences_Event; s_preferences.highqualitysky.generic.id = ID_HIGHQUALITYSKY; s_preferences.highqualitysky.generic.x = PREFERENCES_X_POS; s_preferences.highqualitysky.generic.y = y; y += BIGCHAR_HEIGHT+2; s_preferences.synceveryframe.generic.type = MTYPE_RADIOBUTTON; s_preferences.synceveryframe.generic.name = "Sync Every Frame:"; s_preferences.synceveryframe.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.synceveryframe.generic.callback = Preferences_Event; s_preferences.synceveryframe.generic.id = ID_SYNCEVERYFRAME; s_preferences.synceveryframe.generic.x = PREFERENCES_X_POS; s_preferences.synceveryframe.generic.y = y; y += BIGCHAR_HEIGHT+2; s_preferences.forcemodel.generic.type = MTYPE_RADIOBUTTON; s_preferences.forcemodel.generic.name = "Force Player Models:"; s_preferences.forcemodel.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.forcemodel.generic.callback = Preferences_Event; s_preferences.forcemodel.generic.id = ID_FORCEMODEL; s_preferences.forcemodel.generic.x = PREFERENCES_X_POS; s_preferences.forcemodel.generic.y = y; y += BIGCHAR_HEIGHT+2; s_preferences.drawteamoverlay.generic.type = MTYPE_SPINCONTROL; s_preferences.drawteamoverlay.generic.name = "Draw Team Overlay:"; s_preferences.drawteamoverlay.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.drawteamoverlay.generic.callback = Preferences_Event; s_preferences.drawteamoverlay.generic.id = ID_DRAWTEAMOVERLAY; s_preferences.drawteamoverlay.generic.x = PREFERENCES_X_POS; s_preferences.drawteamoverlay.generic.y = y; s_preferences.drawteamoverlay.itemnames = teamoverlay_names; y += BIGCHAR_HEIGHT+2; s_preferences.allowdownload.generic.type = MTYPE_RADIOBUTTON; s_preferences.allowdownload.generic.name = "Automatic Downloading:"; s_preferences.allowdownload.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.allowdownload.generic.callback = Preferences_Event; s_preferences.allowdownload.generic.id = ID_ALLOWDOWNLOAD; s_preferences.allowdownload.generic.x = PREFERENCES_X_POS; s_preferences.allowdownload.generic.y = y; y += BIGCHAR_HEIGHT+2; s_preferences.drawfps.generic.type = MTYPE_RADIOBUTTON; s_preferences.drawfps.generic.name = "Draw FPS:"; s_preferences.drawfps.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_preferences.drawfps.generic.callback = Preferences_Event; s_preferences.drawfps.generic.id = ID_DRAWFPS; s_preferences.drawfps.generic.x = PREFERENCES_X_POS; s_preferences.drawfps.generic.y = y; s_preferences.back.generic.type = MTYPE_PTEXT; s_preferences.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS; s_preferences.back.generic.x = 20; s_preferences.back.generic.y = 480 - 50; s_preferences.back.generic.id = ID_BACK; s_preferences.back.generic.callback = Preferences_Event; s_preferences.back.string = "< BACK"; s_preferences.back.color = text_color_normal; s_preferences.back.style = UI_LEFT | UI_SMALLFONT; Menu_AddItem( &s_preferences.menu, &s_preferences.banner ); Menu_AddItem( &s_preferences.menu, &s_preferences.simpleitems ); Menu_AddItem( &s_preferences.menu, &s_preferences.wallmarks ); Menu_AddItem( &s_preferences.menu, &s_preferences.brass ); Menu_AddItem( &s_preferences.menu, &s_preferences.dynamiclights ); Menu_AddItem( &s_preferences.menu, &s_preferences.identifytarget ); Menu_AddItem( &s_preferences.menu, &s_preferences.highqualitysky ); Menu_AddItem( &s_preferences.menu, &s_preferences.synceveryframe ); Menu_AddItem( &s_preferences.menu, &s_preferences.forcemodel ); Menu_AddItem( &s_preferences.menu, &s_preferences.drawteamoverlay ); Menu_AddItem( &s_preferences.menu, &s_preferences.allowdownload ); Menu_AddItem( &s_preferences.menu, &s_preferences.drawfps ); Menu_AddItem( &s_preferences.menu, &s_preferences.back ); Preferences_SetMenuItems(); } /* ================= Preferences_Cache ================= */ void Preferences_Cache( void ) { int n; for( n = 0; n < NUM_CROSSHAIRS; n++ ) { s_preferences.crosshairShader[n] = trap_R_RegisterShaderNoMip( va("gfx/2d/crosshair%c", 'a' + n ) ); } } /* ================== UI_PreferencesMenu ================== */ void UI_PreferencesMenu( void ) { Preferences_MenuInit(); UI_PushMenu( &s_preferences.menu ); }