/* options.qc Options menu Copyright (C) 2002 Robin Redeker This program 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. This program 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 this program; if not, write to: Free Software Foundation, Inc. 59 Temple Place - Suite 330 Boston, MA 02111-1307, USA */ #include "debug.h" #include "options.h" #include "cbuf.h" #include "menu.h" #include "system.h" #include "string.h" #include "draw.h" #include "cvar.h" #include "key.h" #include "controls_o.h" #include "options_util.h" #include "qfs.h" #include "plistmenu.h" #include "gui/Group.h" #include "gui/InputLine.h" #include "gui/Pic.h" #include "gui/Rect.h" #include "gui/Slider.h" #include "gui/Text.h" #include "CvarToggleView.h" #include "CvarRangeView.h" #include "CvarColorView.h" #include "CvarColor.h" #include "CvarToggle.h" Group *video_options; Group *audio_options; Group *control_options; Group *feature_options; Group *network_options; Group *player_options; InputLine *player_config_plname_il; InputLine *player_config_tname_il; InputLine *player_config_iactive; CvarColorView *topcolor_view; CvarColorView *bottomcolor_view; /* some definitions of border values for different things */ #define MIN_GAMMA 0.4 #define MAX_GAMMA 3 #define GAMMA_STEP 0.1 #define MIN_VIEWSIZE 30 #define MAX_VIEWSIZE 120 #define VIEWSIZE_STEP 10 #define MIN_MOUSE_AMP 0 #define MAX_MOUSE_AMP 60 #define MOUSE_AMP_STEP 1 #define MIN_VOLUME 0 #define MAX_VOLUME 1.5 #define VOLUME_STEP 0.1 #define MIN_COLOR 0 #define MAX_COLOR 13 #define COLOR_STEP 1 /**************************** * VIDEO OPTIONS * Video settings menu code ****************************/ /* DRAW_video_options Drawing function for the video options menu */ int (int x, int y) DRAW_video_options = { [video_options setBasePos:x y:y]; [video_options draw]; return 1; }; int (int key, int unicode, int down) KEY_video_options = { return [video_options keyEvent:key unicode:unicode down:down]; } /* MENU_video_options Menu function for the video options menu. */ void MENU_video_options (PLItem *plist) { local @param ret; Menu_Begin (54, 50, "Video"); Menu_FadeScreen (1); Menu_Draw (DRAW_video_options); Menu_KeyEvent (KEY_video_options); if (plist) { ret = object_from_plist ([(PLDictionary*) plist getObjectForKey:"video_options"]); video_options = (Group *) ret.pointer_val; } Menu_End (); }; /************************************* * AUDIO OPTIONS * Code for the audio settings menu *************************************/ /* DRAW_audio_options Draws the audio options menu */ int (int x, int y) DRAW_audio_options = { [audio_options setBasePos:x y:y]; [audio_options draw]; return 1; }; int (int key, int unicode, int down) KEY_audio_options = { return [audio_options keyEvent:key unicode:unicode down:down]; } /* MENU_audio_options Makes the audio menu */ void MENU_audio_options (PLItem *plist) { local @param ret; Menu_Begin (54, 60, "Audio"); Menu_FadeScreen (1); Menu_Draw (DRAW_audio_options); Menu_KeyEvent (KEY_audio_options); if (plist) { ret = object_from_plist ([(PLDictionary*) plist getObjectForKey:"audio_options"]); audio_options = (Group *) ret.pointer_val; } Menu_End (); }; /************************ * CONTROL OPTIONS * Control setting code ************************/ /* DRAW_control_options Draws the control option menu */ int (int x, int y) DRAW_control_options = { [control_options setBasePos:x y:y]; [control_options draw]; return 0; }; int (int key, int unicode, int down) KEY_control_options = { return [control_options keyEvent:key unicode:unicode down:down]; } /* MENU_control_options Menu make function for control options */ void MENU_control_options (PLItem *plist) { local @param ret; Menu_Begin (54, 40, "Controls"); Menu_FadeScreen (1); Menu_Draw (DRAW_control_options); Menu_KeyEvent (KEY_control_options); if (plist) { ret = object_from_plist ([(PLDictionary*) plist getObjectForKey:"control_options"]); control_options = (Group *) ret.pointer_val; } MENU_control_binding (); //FIXME how to hook in the bindings menu? Menu_End (); }; /*********************************************** * FEATURES OPTIONS * Code of settings for special features of QF ***********************************************/ /* DRAW_feature_options Draws the feature option menu */ int (int x, int y) DRAW_feature_options = { local int cursor_pad = 0, spacing = 120; [feature_options setBasePos:x y:y]; [feature_options draw]; return 1; }; int (int key, int unicode, int down) KEY_feature_options = { return [feature_options keyEvent:key unicode:unicode down:down]; } /* MENU_feature_options Makes the feature option menu */ void MENU_feature_options (PLItem *plist) { local @param ret; Menu_Begin (54, 70, "Features"); Menu_FadeScreen (1); Menu_CenterPic (160, 4, "gfx/p_option.lmp"); Menu_Draw (DRAW_feature_options); Menu_KeyEvent (KEY_feature_options); if (plist) { ret = object_from_plist ([(PLDictionary*) plist getObjectForKey:"feature_options"]); feature_options = (Group *) ret.pointer_val; } Menu_End (); }; /*************************************************** * PLAYER OPTIONS * Player settings, generally name, team, and color ***************************************************/ string playername_cvar; // name of the cvar holding playername (gametype dependend) string teamname_cvar; // name of the cvar holding teamname (MAY ? gametype dependend) // Y padding for the player config #define PLAYER_CONF_Y_PAD 60 // table for cursor-positions #define NUM_PLAYERCONFIG_CMDS 4 int player_config_cursor_tbl[NUM_PLAYERCONFIG_CMDS] = { PLAYER_CONF_Y_PAD + 8, PLAYER_CONF_Y_PAD + 20 + 8, PLAYER_CONF_Y_PAD + 45, PLAYER_CONF_Y_PAD + 60 }; int player_config_cursor; // array, which holds commands for this menu string player_config_vals[NUM_PLAYERCONFIG_CMDS] = { "", "", "topcolor", "bottomcolor" }; int (int key, int unicode, int down) KEY_player_options = { return [player_options keyEvent:key unicode:unicode down:down]; }; /* DRAW_player_options Draws the player option menu */ int (int x, int y) DRAW_player_options = { [player_options setBasePos:x y:y]; [player_options draw]; return 1; }; /* MENU_player_options Makes the player option menu */ void MENU_player_options (PLItem *plist) { local @param ret; Menu_Begin (54, 80, "Player"); Menu_FadeScreen (1); Menu_Draw (DRAW_player_options); Menu_KeyEvent (KEY_player_options); // setup cvar aliases so the player options can refer to the appropriate // cvar using just the one name if (gametype () == "quakeworld") { Cvar_MakeAlias ("menu_name", "name"); } else { Cvar_MakeAlias ("menu_name", "_cl_name"); } // FIXME: is this something else in netquake? Cvar_MakeAlias ("menu_team", "team"); if (plist) { ret = object_from_plist ([(PLDictionary*) plist getObjectForKey:"player_options"]); player_options = (Group *) ret.pointer_val; } Menu_End (); }; /***************************************************************************** * NETWORK OPTIONS * Options, which have to do with network stuff (rate, noskins, netgraph, ...) *****************************************************************************/ int network_config_cursor; // Y padding for the player config #define NETWORK_CONF_Y_PAD 60 // table for cursor-positions #define NUM_NETWORKCONFIG_CMDS 1 int network_config_cursor_tbl[NUM_NETWORKCONFIG_CMDS] = { PLAYER_CONF_Y_PAD + 8, }; int network_config_cursor; // array, which holds commands for this menu string network_config_vals[NUM_NETWORKCONFIG_CMDS] = { "", }; int (int key, int unicode, int down) KEY_network_options = { return [network_options keyEvent:key unicode:unicode down:down]; }; /* DRAW_network_options Draws the network option menu */ int (int x, int y) DRAW_network_options = { [network_options setBasePos:x y:y]; [network_options draw]; return 1; }; /* MENU_network_options Makes the network option menu */ void MENU_network_options (PLItem *plist) { local @param ret; Menu_Begin (54, 90, "Network"); Menu_FadeScreen (1); Menu_KeyEvent (KEY_network_options); Menu_Draw (DRAW_network_options); if (plist) { ret = object_from_plist ([(PLDictionary*) plist getObjectForKey:"network_options"]); network_options = (Group *) ret.pointer_val; } Menu_End (); }; int (string text, int key) op_goto_console = { Menu_SelectMenu (""); Cbuf_AddText (nil, "toggleconsole\n"); return 0; }; /************************* * MAIN OPTIONS * Main options menu code *************************/ /* MENU_options Makes the main options menu */ void () MENU_options = { local int spacing = 120; local PLItem *plist; plist = read_plist ("menu.plist"); Menu_Begin (54, 72, ""); Menu_FadeScreen (1); Menu_Pic (16, 4, "gfx/qplaque.lmp"); Menu_CenterPic (160, 4, "gfx/p_option.lmp"); Menu_Item (54, 32, "Go to Console", op_goto_console, 0); MENU_control_options (plist); MENU_video_options (plist); MENU_audio_options (plist); MENU_feature_options (plist); MENU_player_options (plist); MENU_network_options (plist); Menu_End (); };