aboutsummaryrefslogtreecommitdiffstats
path: root/src/jake2/client/Menu.java
diff options
context:
space:
mode:
authorRene Stoeckel <[email protected]>2004-09-22 19:22:16 +0000
committerRene Stoeckel <[email protected]>2004-09-22 19:22:16 +0000
commitc4fcffe436fbfb5b0f3b7be2e5ee103ec74932f7 (patch)
tree7c9439ab1d9f5a4fd61bd57c755069007b23e0b6 /src/jake2/client/Menu.java
parentbcb4ac6eefb425d5b0a90009da506361d5739e75 (diff)
major refactoring in game, server and client package
Diffstat (limited to 'src/jake2/client/Menu.java')
-rw-r--r--src/jake2/client/Menu.java9794
1 files changed, 4854 insertions, 4940 deletions
diff --git a/src/jake2/client/Menu.java b/src/jake2/client/Menu.java
index b718b19..50797f5 100644
--- a/src/jake2/client/Menu.java
+++ b/src/jake2/client/Menu.java
@@ -2,27 +2,27 @@
* Menu.java
* Copyright (C) 2004
*
- * $Id: Menu.java,v 1.8 2004-09-12 19:52:58 hzi Exp $
+ * $Id: Menu.java,v 1.9 2004-09-22 19:22:07 salomo Exp $
*/
/*
-Copyright (C) 1997-2001 Id Software, Inc.
+ Copyright (C) 1997-2001 Id Software, Inc.
-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 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.
+ 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.
+ 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 the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
+ */
package jake2.client;
import jake2.Globals;
@@ -42,4968 +42,4882 @@ import java.util.Comparator;
/**
* Menu
*
- *
+ *
*/
abstract class keyfunc_t {
- abstract String execute(int key);
+ abstract String execute(int key);
}
public final class Menu extends Key {
- static int m_main_cursor;
- static final int NUM_CURSOR_FRAMES= 15;
+ static int m_main_cursor;
- static final String menu_in_sound= "misc/menu1.wav";
- static final String menu_move_sound= "misc/menu2.wav";
- static final String menu_out_sound= "misc/menu3.wav";
+ static final int NUM_CURSOR_FRAMES = 15;
- static boolean m_entersound; // play after drawing a frame, so caching
- // won't disrupt the sound
+ static final String menu_in_sound = "misc/menu1.wav";
- static xcommand_t m_drawfunc;
+ static final String menu_move_sound = "misc/menu2.wav";
- static keyfunc_t m_keyfunc;
+ static final String menu_out_sound = "misc/menu3.wav";
- // =============================================================================
- /* Support Routines */
+ static boolean m_entersound; // play after drawing a frame, so caching
- public final static int MAX_MENU_DEPTH= 8;
+ // won't disrupt the sound
- public static class menulayer_t {
- xcommand_t draw;
- keyfunc_t key;
- }
+ static xcommand_t m_drawfunc;
- static class menuframework_s {
- int x, y;
- int cursor;
+ static keyfunc_t m_keyfunc;
- int nitems;
- int nslots;
- menucommon_s items[]= new menucommon_s[64];
+ // =============================================================================
+ /* Support Routines */
- String statusbar;
+ public final static int MAX_MENU_DEPTH = 8;
- //void (*cursordraw)( struct _tag_menuframework *m );
- mcallback cursordraw;
+ public static class menulayer_t {
+ xcommand_t draw;
- }
+ keyfunc_t key;
+ }
- abstract static class mcallback {
- abstract public void execute(Object self);
- }
+ static class menuframework_s {
+ int x, y;
- static class menucommon_s {
- int type;
- String name= "";
- int x, y;
- menuframework_s parent;
- int cursor_offset;
- int localdata[]= { 0, 0, 0, 0 };
- int flags;
- int n= -1; //position in an array.
+ int cursor;
- String statusbar;
+ int nitems;
- mcallback callback;
- mcallback statusbarfunc;
- mcallback ownerdraw;
- mcallback cursordraw;
- }
+ int nslots;
- static class menufield_s extends menucommon_s {
- //char buffer[80];
- StringBuffer buffer; //allow deletion.
+ menucommon_s items[] = new menucommon_s[64];
- int cursor;
- int length;
- int visible_length;
- int visible_offset;
- }
+ String statusbar;
- static class menuslider_s extends menucommon_s {
+ //void (*cursordraw)( struct _tag_menuframework *m );
+ mcallback cursordraw;
- float minvalue;
- float maxvalue;
- float curvalue;
+ }
- float range;
- }
+ abstract static class mcallback {
+ abstract public void execute(Object self);
+ }
- static class menulist_s extends menucommon_s {
- int curvalue;
- String itemnames[];
- }
-
- static class menuaction_s extends menucommon_s {
-
- }
-
- static class menuseparator_s extends menucommon_s {
-
- }
-
- public static menulayer_t m_layers[]= new menulayer_t[MAX_MENU_DEPTH];
- public static int m_menudepth;
-
- static void Banner(String name) {
- Dimension dim= new Dimension();
- Globals.re.DrawGetPicSize(dim, name);
-
- Globals.re.DrawPic(viddef.width / 2 - dim.width / 2, viddef.height / 2 - 110, name);
- }
-
- static void PushMenu(xcommand_t draw, keyfunc_t key) { //, String(*key) (int k) ) {
- int i;
-
- if (Cvar.VariableValue("maxclients") == 1 && Globals.server_state != 0)
- Cvar.Set("paused", "1");
-
- // if this menu is already present, drop back to that level
- // to avoid stacking menus by hotkeys
- for (i= 0; i < m_menudepth; i++)
- if (m_layers[i].draw == draw && m_layers[i].key == key) {
- m_menudepth= i;
- }
-
- if (i == m_menudepth) {
- if (m_menudepth >= MAX_MENU_DEPTH)
- Com.Error(ERR_FATAL, "PushMenu: MAX_MENU_DEPTH");
-
- m_layers[m_menudepth].draw= m_drawfunc;
- m_layers[m_menudepth].key= m_keyfunc;
- m_menudepth++;
- }
-
- m_drawfunc= draw;
- m_keyfunc= key;
-
- m_entersound= true;
-
- cls.key_dest= key_menu;
- }
-
- static void ForceMenuOff() {
- m_drawfunc= null;
- m_keyfunc= null;
- cls.key_dest= key_game;
- m_menudepth= 0;
- Key.ClearStates();
- Cvar.Set("paused", "0");
- }
-
- static void PopMenu() {
- S.StartLocalSound(menu_out_sound);
- if (m_menudepth < 1)
- Com.Error(ERR_FATAL, "PopMenu: depth < 1");
- m_menudepth--;
-
- m_drawfunc= m_layers[m_menudepth].draw;
- m_keyfunc= m_layers[m_menudepth].key;
-
- if (0 == m_menudepth)
- ForceMenuOff();
- }
-
- static String Default_MenuKey(menuframework_s m, int key) {
- String sound= null;
- menucommon_s item;
-
- if (m != null) {
- if ((item= ((menucommon_s) Menu_ItemAtCursor(m))) != null) {
- if (item.type == MTYPE_FIELD) {
- if (Field_Key((menufield_s) item, key))
- return null;
- }
- }
- }
-
- switch (key) {
- case K_ESCAPE :
- PopMenu();
- return menu_out_sound;
- case K_KP_UPARROW :
- case K_UPARROW :
- if (m != null) {
- m.cursor--;
- Menu_AdjustCursor(m, -1);
- sound= menu_move_sound;
- }
- break;
- case K_TAB :
- if (m != null) {
- m.cursor++;
- Menu_AdjustCursor(m, 1);
- sound= menu_move_sound;
- }
- break;
- case K_KP_DOWNARROW :
- case K_DOWNARROW :
- if (m != null) {
- m.cursor++;
- Menu_AdjustCursor(m, 1);
- sound= menu_move_sound;
- }
- break;
- case K_KP_LEFTARROW :
- case K_LEFTARROW :
- if (m != null) {
- Menu_SlideItem(m, -1);
- sound= menu_move_sound;
- }
- break;
- case K_KP_RIGHTARROW :
- case K_RIGHTARROW :
- if (m != null) {
- Menu_SlideItem(m, 1);
- sound= menu_move_sound;
- }
- break;
-
- case K_MOUSE1 :
- case K_MOUSE2 :
- case K_MOUSE3 :
- case K_JOY1 :
- case K_JOY2 :
- case K_JOY3 :
- case K_JOY4 :
- /*
- case K_AUX1 :
- case K_AUX2 :
- case K_AUX3 :
- case K_AUX4 :
- case K_AUX5 :
- case K_AUX6 :
- case K_AUX7 :
- case K_AUX8 :
- case K_AUX9 :
- case K_AUX10 :
- case K_AUX11 :
- case K_AUX12 :
- case K_AUX13 :
- case K_AUX14 :
- case K_AUX15 :
- case K_AUX16 :
- case K_AUX17 :
- case K_AUX18 :
- case K_AUX19 :
- case K_AUX20 :
- case K_AUX21 :
- case K_AUX22 :
- case K_AUX23 :
- case K_AUX24 :
- case K_AUX25 :
- case K_AUX26 :
- case K_AUX27 :
- case K_AUX28 :
- case K_AUX29 :
- case K_AUX30 :
- case K_AUX31 :
- case K_AUX32 :
- */
- case K_KP_ENTER :
- case K_ENTER :
- if (m != null)
- Menu_SelectItem(m);
- sound= menu_move_sound;
- break;
- }
-
- return sound;
- }
-
- /*
- ================
- DrawCharacter
-
- Draws one solid graphics character
- cx and cy are in 320*240 coordinates, and will be centered on
- higher res screens.
- ================
- */
- public static void DrawCharacter(int cx, int cy, int num) {
- re.DrawChar(cx + ((viddef.width - 320) >> 1), cy + ((viddef.height - 240) >> 1), num);
- }
-
- public static void Print(int cx, int cy, String str) {
- //while (*str)
- for (int n= 0; n < str.length(); n++) {
- DrawCharacter(cx, cy, str.charAt(n) + 128);
- //str++;
- cx += 8;
- }
- }
-
- public static void PrintWhite(int cx, int cy, String str) {
- for (int n= 0; n < str.length(); n++) {
- DrawCharacter(cx, cy, str.charAt(n));
- //str++;
- cx += 8;
- }
- }
-
- public static void DrawPic(int x, int y, String pic) {
- re.DrawPic(x + ((viddef.width - 320) >> 1), y + ((viddef.height - 240) >> 1), pic);
- }
-
- /*
- =============
- DrawCursor
-
- Draws an animating cursor with the point at
- x,y. The pic will extend to the left of x,
- and both above and below y.
- =============
- */
- static boolean cached;
- static void DrawCursor(int x, int y, int f) {
- //char cursorname[80];
- String cursorname;
-
- assert(f >= 0) : "negative time and cursor bug";
-
- f= Math.abs(f);
-
- if (!cached) {
- int i;
-
- for (i= 0; i < NUM_CURSOR_FRAMES; i++) {
- cursorname= "m_cursor" + i;
-
- re.RegisterPic(cursorname);
- }
- cached= true;
- }
-
- cursorname= "m_cursor" + f;
- re.DrawPic(x, y, cursorname);
- }
-
- public static void DrawTextBox(int x, int y, int width, int lines) {
- int cx, cy;
- int n;
-
- // draw left side
- cx= x;
- cy= y;
- DrawCharacter(cx, cy, 1);
-
- for (n= 0; n < lines; n++) {
- cy += 8;
- DrawCharacter(cx, cy, 4);
- }
- DrawCharacter(cx, cy + 8, 7);
-
- // draw middle
- cx += 8;
- while (width > 0) {
- cy= y;
- DrawCharacter(cx, cy, 2);
-
- for (n= 0; n < lines; n++) {
- cy += 8;
- DrawCharacter(cx, cy, 5);
- }
- DrawCharacter(cx, cy + 8, 8);
-
- width -= 1;
- cx += 8;
- }
-
- // draw right side
- cy= y;
- DrawCharacter(cx, cy, 3);
- for (n= 0; n < lines; n++) {
- cy += 8;
- DrawCharacter(cx, cy, 6);
-
- }
- DrawCharacter(cx, cy + 8, 9);
-
- }
-
- /*
- =======================================================================
-
- MAIN MENU
-
- =======================================================================
- */
- static final int MAIN_ITEMS= 5;
-
- static xcommand_t Main_Draw= new xcommand_t() {
- public void execute() {
- Main_Draw();
- }
- };
- static void Main_Draw() {
- int i;
- int w, h;
- int ystart;
- int xoffset;
- int widest= -1;
- int totalheight= 0;
- String litname;
- String[] names= { "m_main_game", "m_main_multiplayer", "m_main_options", "m_main_video", "m_main_quit" };
- Dimension dim= new Dimension();
-
- for (i= 0; i < names.length; i++) {
- Globals.re.DrawGetPicSize(dim, names[i]);
- w= dim.width;
- h= dim.height;
-
- if (w > widest)
- widest= w;
- totalheight += (h + 12);
- }
-
- ystart= (Globals.viddef.height / 2 - 110);
- xoffset= (Globals.viddef.width - widest + 70) / 2;
-
- for (i= 0; i < names.length; i++) {
- if (i != m_main_cursor)
- Globals.re.DrawPic(xoffset, ystart + i * 40 + 13, names[i]);
- }
-
- //strcat(litname, "_sel");
- litname= names[m_main_cursor] + "_sel";
- Globals.re.DrawPic(xoffset, ystart + m_main_cursor * 40 + 13, litname);
-
- DrawCursor(xoffset - 25, ystart + m_main_cursor * 40 + 11, (int) ((Globals.cls.realtime / 100)) % NUM_CURSOR_FRAMES);
-
- Globals.re.DrawGetPicSize(dim, "m_main_plaque");
- w= dim.width;
- h= dim.height;
- Globals.re.DrawPic(xoffset - 30 - w, ystart, "m_main_plaque");
-
- Globals.re.DrawPic(xoffset - 30 - w, ystart + h + 5, "m_main_logo");
- }
-
- static keyfunc_t Main_Key= new keyfunc_t() {
- public String execute(int key) {
- return Main_Key(key);
- }
- };
-
- static String Main_Key(int key) {
- String sound= menu_move_sound;
-
- switch (key) {
- case Key.K_ESCAPE :
- PopMenu();
- break;
-
- case Key.K_KP_DOWNARROW :
- case Key.K_DOWNARROW :
- if (++m_main_cursor >= MAIN_ITEMS)
- m_main_cursor= 0;
- return sound;
-
- case Key.K_KP_UPARROW :
- case Key.K_UPARROW :
- if (--m_main_cursor < 0)
- m_main_cursor= MAIN_ITEMS - 1;
- return sound;
-
- case Key.K_KP_ENTER :
- case Key.K_ENTER :
- m_entersound= true;
-
- switch (m_main_cursor) {
- case 0 :
- Menu_Game_f();
- break;
-
- case 1 :
- Menu_Multiplayer_f();
- break;
-
- case 2 :
- Menu_Options_f();
- break;
-
- case 3 :
- Menu_Video_f();
- break;
-
- case 4 :
- Menu_Quit_f();
- break;
- }
- }
-
- return null;
- }
-
- static xcommand_t Menu_Main= new xcommand_t() {
- public void execute() {
- Menu_Main_f();
- }
- };
-
- static void Menu_Main_f() {
- PushMenu(new xcommand_t() {
- public void execute() {
- Main_Draw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return Main_Key(key);
- }
- });
- }
-
- /*
- =======================================================================
-
- MULTIPLAYER MENU
-
- =======================================================================
- */
- static menuframework_s s_multiplayer_menu= new menuframework_s();
- static menuaction_s s_join_network_server_action= new menuaction_s();
- static menuaction_s s_start_network_server_action= new menuaction_s();
- static menuaction_s s_player_setup_action= new menuaction_s();
-
- static void Multiplayer_MenuDraw() {
- Banner("m_banner_multiplayer");
-
- Menu_AdjustCursor(s_multiplayer_menu, 1);
- Menu_Draw(s_multiplayer_menu);
- }
-
- static void PlayerSetupFunc(Object unused) {
- Menu_PlayerConfig_f();
- }
-
- static void JoinNetworkServerFunc(Object unused) {
- Menu_JoinServer_f();
- }
-
- static void StartNetworkServerFunc(Object unused) {
- Menu_StartServer_f();
- }
-
- static void Multiplayer_MenuInit() {
- s_multiplayer_menu.x= (int) (viddef.width * 0.50f - 64);
- s_multiplayer_menu.nitems= 0;
-
- s_join_network_server_action.type= MTYPE_ACTION;
- s_join_network_server_action.flags= QMF_LEFT_JUSTIFY;
- s_join_network_server_action.x= 0;
- s_join_network_server_action.y= 0;
- s_join_network_server_action.name= " join network server";
- s_join_network_server_action.callback= new mcallback() {
- public void execute(Object o) {
- JoinNetworkServerFunc(o);
- };
- };
-
- s_start_network_server_action.type= MTYPE_ACTION;
- s_start_network_server_action.flags= QMF_LEFT_JUSTIFY;
- s_start_network_server_action.x= 0;
- s_start_network_server_action.y= 10;
- s_start_network_server_action.name= " start network server";
- s_start_network_server_action.callback= new mcallback() {
- public void execute(Object o) {
- StartNetworkServerFunc(o);
- }
- };
-
- s_player_setup_action.type= MTYPE_ACTION;
- s_player_setup_action.flags= QMF_LEFT_JUSTIFY;
- s_player_setup_action.x= 0;
- s_player_setup_action.y= 20;
- s_player_setup_action.name= " player setup";
- s_player_setup_action.callback= new mcallback() {
- public void execute(Object o) {
- PlayerSetupFunc(o);
- }
- };
-
- Menu_AddItem(s_multiplayer_menu, s_join_network_server_action);
- Menu_AddItem(s_multiplayer_menu, s_start_network_server_action);
- Menu_AddItem(s_multiplayer_menu, s_player_setup_action);
-
- Menu_SetStatusBar(s_multiplayer_menu, null);
-
- Menu_Center(s_multiplayer_menu);
- }
-
- static String Multiplayer_MenuKey(int key) {
- return Default_MenuKey(s_multiplayer_menu, key);
- }
-
- static xcommand_t Menu_Multiplayer= new xcommand_t() {
- public void execute() {
- Menu_Multiplayer_f();
- }
- };
-
- static void Menu_Multiplayer_f() {
- Multiplayer_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- Multiplayer_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return Multiplayer_MenuKey(key);
- }
- });
- }
-
- /*
- =======================================================================
-
- KEYS MENU
-
- =======================================================================
- */
- static String bindnames[][]= { { "+attack", "attack" }, {
- "weapnext", "next weapon" }, {
- "+forward", "walk forward" }, {
- "+back", "backpedal" }, {
- "+left", "turn left" }, {
- "+right", "turn right" }, {
- "+speed", "run" }, {
- "+moveleft", "step left" }, {
- "+moveright", "step right" }, {
- "+strafe", "sidestep" }, {
- "+lookup", "look up" }, {
- "+lookdown", "look down" }, {
- "centerview", "center view" }, {
- "+mlook", "mouse look" }, {
- "+klook", "keyboard look" }, {
- "+moveup", "up / jump" }, {
- "+movedown", "down / crouch" }, {
-
- "inven", "inventory" }, {
- "invuse", "use item" }, {
- "invdrop", "drop item" }, {
- "invprev", "prev item" }, {
- "invnext", "next item" }, {
-
- "cmd help", "help computer" }, {
- null, null }
- };
-
- int keys_cursor;
- static boolean bind_grab;
-
- static menuframework_s s_keys_menu= new menuframework_s();
- static menuaction_s s_keys_attack_action= new menuaction_s();
- static menuaction_s s_keys_change_weapon_action= new menuaction_s();
- static menuaction_s s_keys_walk_forward_action= new menuaction_s();
- static menuaction_s s_keys_backpedal_action= new menuaction_s();
- static menuaction_s s_keys_turn_left_action= new menuaction_s();
- static menuaction_s s_keys_turn_right_action= new menuaction_s();
- static menuaction_s s_keys_run_action= new menuaction_s();
- static menuaction_s s_keys_step_left_action= new menuaction_s();
- static menuaction_s s_keys_step_right_action= new menuaction_s();
- static menuaction_s s_keys_sidestep_action= new menuaction_s();
- static menuaction_s s_keys_look_up_action= new menuaction_s();
- static menuaction_s s_keys_look_down_action= new menuaction_s();
- static menuaction_s s_keys_center_view_action= new menuaction_s();
- static menuaction_s s_keys_mouse_look_action= new menuaction_s();
- static menuaction_s s_keys_keyboard_look_action= new menuaction_s();
- static menuaction_s s_keys_move_up_action= new menuaction_s();
- static menuaction_s s_keys_move_down_action= new menuaction_s();
- static menuaction_s s_keys_inventory_action= new menuaction_s();
- static menuaction_s s_keys_inv_use_action= new menuaction_s();
- static menuaction_s s_keys_inv_drop_action= new menuaction_s();
- static menuaction_s s_keys_inv_prev_action= new menuaction_s();
- static menuaction_s s_keys_inv_next_action= new menuaction_s();
-
- static menuaction_s s_keys_help_computer_action= new menuaction_s();
-
- static void UnbindCommand(String command) {
- int j;
- String b;
-
- for (j= 0; j < 256; j++) {
- b= keybindings[j];
- if (b == null)
- continue;
- if (b.equals(command))
- Key.SetBinding(j, "");
- }
- }
-
- static void FindKeysForCommand(String command, int twokeys[]) {
- int count;
- int j;
- String b;
-
- twokeys[0]= twokeys[1]= -1;
- count= 0;
-
- for (j= 0; j < 256; j++) {
- b= keybindings[j];
- if (b == null)
- continue;
-
- if (b.equals(command)) {
- twokeys[count]= j;
- count++;
- if (count == 2)
- break;
- }
- }
- }
-
- static void KeyCursorDrawFunc(menuframework_s menu) {
- if (bind_grab)
- re.DrawChar(menu.x, menu.y + menu.cursor * 9, '=');
- else
- re.DrawChar(menu.x, menu.y + menu.cursor * 9, 12 + ((int) (Sys.Milliseconds() / 250) & 1));
- }
-
- static void DrawKeyBindingFunc(Object self) {
- int keys[]= { 0, 0 };
- menuaction_s a= (menuaction_s) self;
-
- FindKeysForCommand(bindnames[a.localdata[0]][0], keys);
-
- if (keys[0] == -1) {
- Menu_DrawString(a.x + a.parent.x + 16, a.y + a.parent.y, "???");
- }
- else {
- int x;
- String name;
-
- name= Key.KeynumToString(keys[0]);
-
- Menu_DrawString(a.x + a.parent.x + 16, a.y + a.parent.y, name);
-
- x= name.length() * 8;
-
- if (keys[1] != -1) {
- Menu_DrawString(a.x + a.parent.x + 24 + x, a.y + a.parent.y, "or");
- Menu_DrawString(a.x + a.parent.x + 48 + x, a.y + a.parent.y, Key.KeynumToString(keys[1]));
- }
- }
- }
-
- static void KeyBindingFunc(Object self) {
- menuaction_s a= (menuaction_s) self;
- int keys[]= { 0, 0 };
-
- FindKeysForCommand(bindnames[a.localdata[0]][0], keys);
-
- if (keys[1] != -1)
- UnbindCommand(bindnames[a.localdata[0]][0]);
-
- bind_grab= true;
-
- Menu_SetStatusBar(s_keys_menu, "press a key or button for this action");
- }
-
- static void Keys_MenuInit() {
- int y= 0;
- int i= 0;
-
- s_keys_menu.x= (int) (viddef.width * 0.50);
- s_keys_menu.nitems= 0;
- s_keys_menu.cursordraw= new mcallback() {
- public void execute(Object o) {
- KeyCursorDrawFunc((menuframework_s) o);
- }
- };
-
- s_keys_attack_action.type= MTYPE_ACTION;
- s_keys_attack_action.flags= QMF_GRAYED;
- s_keys_attack_action.x= 0;
- s_keys_attack_action.y= y;
- s_keys_attack_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
- s_keys_attack_action.localdata[0]= i;
- s_keys_attack_action.name= bindnames[s_keys_attack_action.localdata[0]][1];
-
- s_keys_change_weapon_action.type= MTYPE_ACTION;
- s_keys_change_weapon_action.flags= QMF_GRAYED;
- s_keys_change_weapon_action.x= 0;
- s_keys_change_weapon_action.y= y += 9;
- s_keys_change_weapon_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_change_weapon_action.localdata[0]= ++i;
- s_keys_change_weapon_action.name= bindnames[s_keys_change_weapon_action.localdata[0]][1];
-
- s_keys_walk_forward_action.type= MTYPE_ACTION;
- s_keys_walk_forward_action.flags= QMF_GRAYED;
- s_keys_walk_forward_action.x= 0;
- s_keys_walk_forward_action.y= y += 9;
- s_keys_walk_forward_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
- s_keys_walk_forward_action.localdata[0]= ++i;
- s_keys_walk_forward_action.name= bindnames[s_keys_walk_forward_action.localdata[0]][1];
-
- s_keys_backpedal_action.type= MTYPE_ACTION;
- s_keys_backpedal_action.flags= QMF_GRAYED;
- s_keys_backpedal_action.x= 0;
- s_keys_backpedal_action.y= y += 9;
- s_keys_backpedal_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
- s_keys_backpedal_action.localdata[0]= ++i;
- s_keys_backpedal_action.name= bindnames[s_keys_backpedal_action.localdata[0]][1];
-
- s_keys_turn_left_action.type= MTYPE_ACTION;
- s_keys_turn_left_action.flags= QMF_GRAYED;
- s_keys_turn_left_action.x= 0;
- s_keys_turn_left_action.y= y += 9;
- s_keys_turn_left_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
- s_keys_turn_left_action.localdata[0]= ++i;
- s_keys_turn_left_action.name= bindnames[s_keys_turn_left_action.localdata[0]][1];
-
- s_keys_turn_right_action.type= MTYPE_ACTION;
- s_keys_turn_right_action.flags= QMF_GRAYED;
- s_keys_turn_right_action.x= 0;
- s_keys_turn_right_action.y= y += 9;
- s_keys_turn_right_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
- s_keys_turn_right_action.localdata[0]= ++i;
- s_keys_turn_right_action.name= bindnames[s_keys_turn_right_action.localdata[0]][1];
-
- s_keys_run_action.type= MTYPE_ACTION;
- s_keys_run_action.flags= QMF_GRAYED;
- s_keys_run_action.x= 0;
- s_keys_run_action.y= y += 9;
- s_keys_run_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
- s_keys_run_action.localdata[0]= ++i;
- s_keys_run_action.name= bindnames[s_keys_run_action.localdata[0]][1];
-
- s_keys_step_left_action.type= MTYPE_ACTION;
- s_keys_step_left_action.flags= QMF_GRAYED;
- s_keys_step_left_action.x= 0;
- s_keys_step_left_action.y= y += 9;
- s_keys_step_left_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
- s_keys_step_left_action.localdata[0]= ++i;
- s_keys_step_left_action.name= bindnames[s_keys_step_left_action.localdata[0]][1];
-
- s_keys_step_right_action.type= MTYPE_ACTION;
- s_keys_step_right_action.flags= QMF_GRAYED;
- s_keys_step_right_action.x= 0;
- s_keys_step_right_action.y= y += 9;
- s_keys_step_right_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_step_right_action.localdata[0]= ++i;
- s_keys_step_right_action.name= bindnames[s_keys_step_right_action.localdata[0]][1];
-
- s_keys_sidestep_action.type= MTYPE_ACTION;
- s_keys_sidestep_action.flags= QMF_GRAYED;
- s_keys_sidestep_action.x= 0;
- s_keys_sidestep_action.y= y += 9;
- s_keys_sidestep_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_sidestep_action.localdata[0]= ++i;
- s_keys_sidestep_action.name= bindnames[s_keys_sidestep_action.localdata[0]][1];
-
- s_keys_look_up_action.type= MTYPE_ACTION;
- s_keys_look_up_action.flags= QMF_GRAYED;
- s_keys_look_up_action.x= 0;
- s_keys_look_up_action.y= y += 9;
- s_keys_look_up_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_look_up_action.localdata[0]= ++i;
- s_keys_look_up_action.name= bindnames[s_keys_look_up_action.localdata[0]][1];
-
- s_keys_look_down_action.type= MTYPE_ACTION;
- s_keys_look_down_action.flags= QMF_GRAYED;
- s_keys_look_down_action.x= 0;
- s_keys_look_down_action.y= y += 9;
- s_keys_look_down_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_look_down_action.localdata[0]= ++i;
- s_keys_look_down_action.name= bindnames[s_keys_look_down_action.localdata[0]][1];
-
- s_keys_center_view_action.type= MTYPE_ACTION;
- s_keys_center_view_action.flags= QMF_GRAYED;
- s_keys_center_view_action.x= 0;
- s_keys_center_view_action.y= y += 9;
- s_keys_center_view_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_center_view_action.localdata[0]= ++i;
- s_keys_center_view_action.name= bindnames[s_keys_center_view_action.localdata[0]][1];
-
- s_keys_mouse_look_action.type= MTYPE_ACTION;
- s_keys_mouse_look_action.flags= QMF_GRAYED;
- s_keys_mouse_look_action.x= 0;
- s_keys_mouse_look_action.y= y += 9;
- s_keys_mouse_look_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_mouse_look_action.localdata[0]= ++i;
- s_keys_mouse_look_action.name= bindnames[s_keys_mouse_look_action.localdata[0]][1];
-
- s_keys_keyboard_look_action.type= MTYPE_ACTION;
- s_keys_keyboard_look_action.flags= QMF_GRAYED;
- s_keys_keyboard_look_action.x= 0;
- s_keys_keyboard_look_action.y= y += 9;
- s_keys_keyboard_look_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_keyboard_look_action.localdata[0]= ++i;
- s_keys_keyboard_look_action.name= bindnames[s_keys_keyboard_look_action.localdata[0]][1];
-
- s_keys_move_up_action.type= MTYPE_ACTION;
- s_keys_move_up_action.flags= QMF_GRAYED;
- s_keys_move_up_action.x= 0;
- s_keys_move_up_action.y= y += 9;
- s_keys_move_up_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_move_up_action.localdata[0]= ++i;
- s_keys_move_up_action.name= bindnames[s_keys_move_up_action.localdata[0]][1];
-
- s_keys_move_down_action.type= MTYPE_ACTION;
- s_keys_move_down_action.flags= QMF_GRAYED;
- s_keys_move_down_action.x= 0;
- s_keys_move_down_action.y= y += 9;
- s_keys_move_down_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_move_down_action.localdata[0]= ++i;
- s_keys_move_down_action.name= bindnames[s_keys_move_down_action.localdata[0]][1];
-
- s_keys_inventory_action.type= MTYPE_ACTION;
- s_keys_inventory_action.flags= QMF_GRAYED;
- s_keys_inventory_action.x= 0;
- s_keys_inventory_action.y= y += 9;
- s_keys_inventory_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_inventory_action.localdata[0]= ++i;
- s_keys_inventory_action.name= bindnames[s_keys_inventory_action.localdata[0]][1];
-
- s_keys_inv_use_action.type= MTYPE_ACTION;
- s_keys_inv_use_action.flags= QMF_GRAYED;
- s_keys_inv_use_action.x= 0;
- s_keys_inv_use_action.y= y += 9;
- s_keys_inv_use_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_inv_use_action.localdata[0]= ++i;
- s_keys_inv_use_action.name= bindnames[s_keys_inv_use_action.localdata[0]][1];
-
- s_keys_inv_drop_action.type= MTYPE_ACTION;
- s_keys_inv_drop_action.flags= QMF_GRAYED;
- s_keys_inv_drop_action.x= 0;
- s_keys_inv_drop_action.y= y += 9;
- s_keys_inv_drop_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_inv_drop_action.localdata[0]= ++i;
- s_keys_inv_drop_action.name= bindnames[s_keys_inv_drop_action.localdata[0]][1];
-
- s_keys_inv_prev_action.type= MTYPE_ACTION;
- s_keys_inv_prev_action.flags= QMF_GRAYED;
- s_keys_inv_prev_action.x= 0;
- s_keys_inv_prev_action.y= y += 9;
- s_keys_inv_prev_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_inv_prev_action.localdata[0]= ++i;
- s_keys_inv_prev_action.name= bindnames[s_keys_inv_prev_action.localdata[0]][1];
-
- s_keys_inv_next_action.type= MTYPE_ACTION;
- s_keys_inv_next_action.flags= QMF_GRAYED;
- s_keys_inv_next_action.x= 0;
- s_keys_inv_next_action.y= y += 9;
- s_keys_inv_next_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_inv_next_action.localdata[0]= ++i;
- s_keys_inv_next_action.name= bindnames[s_keys_inv_next_action.localdata[0]][1];
-
- s_keys_help_computer_action.type= MTYPE_ACTION;
- s_keys_help_computer_action.flags= QMF_GRAYED;
- s_keys_help_computer_action.x= 0;
- s_keys_help_computer_action.y= y += 9;
- s_keys_help_computer_action.ownerdraw= new mcallback() {
- public void execute(Object o) {
- DrawKeyBindingFunc(o);
- }
- };
-
- s_keys_help_computer_action.localdata[0]= ++i;
- s_keys_help_computer_action.name= bindnames[s_keys_help_computer_action.localdata[0]][1];
-
- Menu_AddItem(s_keys_menu, s_keys_attack_action);
- Menu_AddItem(s_keys_menu, s_keys_change_weapon_action);
- Menu_AddItem(s_keys_menu, s_keys_walk_forward_action);
- Menu_AddItem(s_keys_menu, s_keys_backpedal_action);
- Menu_AddItem(s_keys_menu, s_keys_turn_left_action);
- Menu_AddItem(s_keys_menu, s_keys_turn_right_action);
- Menu_AddItem(s_keys_menu, s_keys_run_action);
- Menu_AddItem(s_keys_menu, s_keys_step_left_action);
- Menu_AddItem(s_keys_menu, s_keys_step_right_action);
- Menu_AddItem(s_keys_menu, s_keys_sidestep_action);
- Menu_AddItem(s_keys_menu, s_keys_look_up_action);
- Menu_AddItem(s_keys_menu, s_keys_look_down_action);
- Menu_AddItem(s_keys_menu, s_keys_center_view_action);
- Menu_AddItem(s_keys_menu, s_keys_mouse_look_action);
- Menu_AddItem(s_keys_menu, s_keys_keyboard_look_action);
- Menu_AddItem(s_keys_menu, s_keys_move_up_action);
- Menu_AddItem(s_keys_menu, s_keys_move_down_action);
-
- Menu_AddItem(s_keys_menu, s_keys_inventory_action);
- Menu_AddItem(s_keys_menu, s_keys_inv_use_action);
- Menu_AddItem(s_keys_menu, s_keys_inv_drop_action);
- Menu_AddItem(s_keys_menu, s_keys_inv_prev_action);
- Menu_AddItem(s_keys_menu, s_keys_inv_next_action);
-
- Menu_AddItem(s_keys_menu, s_keys_help_computer_action);
-
- Menu_SetStatusBar(s_keys_menu, "enter to change, backspace to clear");
- Menu_Center(s_keys_menu);
- }
-
- static xcommand_t Keys_MenuDraw= new xcommand_t() {
- public void execute() {
- Keys_MenuDraw_f();
- }
- };
-
- static void Keys_MenuDraw_f() {
- Menu_AdjustCursor(s_keys_menu, 1);
- Menu_Draw(s_keys_menu);
- }
-
- static keyfunc_t Keys_MenuKey= new keyfunc_t() {
- public String execute(int key) {
- return Keys_MenuKey_f(key);
- }
- };
- static String Keys_MenuKey_f(int key) {
- menuaction_s item= (menuaction_s) Menu_ItemAtCursor(s_keys_menu);
-
- if (bind_grab) {
- if (key != K_ESCAPE && key != '`') {
- //char cmd[1024];
- String cmd;
-
- //Com_sprintf(cmd, sizeof(cmd), "bind \"%s\" \"%s\"\n", Key_KeynumToString(key), bindnames[item.localdata[0]][0]);
- cmd= "bind \"" + Key.KeynumToString(key) + "\" \"" + bindnames[item.localdata[0]][0] + "\"";
- Cbuf.InsertText(cmd);
- }
-
- Menu_SetStatusBar(s_keys_menu, "enter to change, backspace to clear");
- bind_grab= false;
- return menu_out_sound;
- }
-
- switch (key) {
- case K_KP_ENTER :
- case K_ENTER :
- KeyBindingFunc(item);
- return menu_in_sound;
- case K_BACKSPACE : // delete bindings
- case K_DEL : // delete bindings
- case K_KP_DEL :
- UnbindCommand(bindnames[item.localdata[0]][0]);
- return menu_out_sound;
- default :
- return Default_MenuKey(s_keys_menu, key);
- }
- }
-
- static xcommand_t Menu_Keys= new xcommand_t() {
- public void execute() {
- Menu_Keys_f();
- }
- };
- static void Menu_Keys_f() {
- Keys_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- Keys_MenuDraw_f();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return Keys_MenuKey_f(key);
- }
- });
- }
-
- /*
- =======================================================================
-
- CONTROLS MENU
-
- =======================================================================
- */
- static cvar_t win_noalttab;
-
- static menuframework_s s_options_menu= new menuframework_s();
- static menuaction_s s_options_defaults_action= new menuaction_s();
- static menuaction_s s_options_customize_options_action= new menuaction_s();
- static menuslider_s s_options_sensitivity_slider= new menuslider_s();
- static menulist_s s_options_freelook_box= new menulist_s();
- static menulist_s s_options_noalttab_box= new menulist_s();
- static menulist_s s_options_alwaysrun_box= new menulist_s();
- static menulist_s s_options_invertmouse_box= new menulist_s();
- static menulist_s s_options_lookspring_box= new menulist_s();
- static menulist_s s_options_lookstrafe_box= new menulist_s();
- static menulist_s s_options_crosshair_box= new menulist_s();
- static menuslider_s s_options_sfxvolume_slider= new menuslider_s();
- static menulist_s s_options_joystick_box= new menulist_s();
- static menulist_s s_options_cdvolume_box= new menulist_s();
- static menulist_s s_options_quality_list= new menulist_s();
- //static menulist_s s_options_compatibility_list = new menulist_s();
- static menuaction_s s_options_console_action= new menuaction_s();
-
- static void CrosshairFunc(Object unused) {
- Cvar.SetValue("crosshair", s_options_crosshair_box.curvalue);
- }
-
- static void JoystickFunc(Object unused) {
- Cvar.SetValue("in_joystick", s_options_joystick_box.curvalue);
- }
-
- static void CustomizeControlsFunc(Object unused) {
- Menu_Keys_f();
- }
-
- static void AlwaysRunFunc(Object unused) {
- Cvar.SetValue("cl_run", s_options_alwaysrun_box.curvalue);
- }
-
- static void FreeLookFunc(Object unused) {
- Cvar.SetValue("freelook", s_options_freelook_box.curvalue);
- }
-
- static void MouseSpeedFunc(Object unused) {
- Cvar.SetValue("sensitivity", s_options_sensitivity_slider.curvalue / 2.0F);
- }
-
- static void NoAltTabFunc(Object unused) {
- Cvar.SetValue("win_noalttab", s_options_noalttab_box.curvalue);
- }
-
- static float ClampCvar(float min, float max, float value) {
- if (value < min)
- return min;
- if (value > max)
- return max;
- return value;
- }
-
- static void ControlsSetMenuItemValues() {
- s_options_sfxvolume_slider.curvalue= Cvar.VariableValue("s_volume") * 10;
- s_options_cdvolume_box.curvalue= 1 - ((int) Cvar.VariableValue("cd_nocd"));
- //s_options_quality_list.curvalue = 1 - ((int) Cvar.VariableValue("s_loadas8bit"));
- if ("joal".equals(Cvar.VariableString("s_impl"))) {
- s_options_quality_list.curvalue= 0;
- }
- else {
- s_options_quality_list.curvalue= 1;
- }
-
- s_options_sensitivity_slider.curvalue= (sensitivity.value) * 2;
-
- Cvar.SetValue("cl_run", ClampCvar(0, 1, cl_run.value));
- s_options_alwaysrun_box.curvalue= (int) cl_run.value;
-
- s_options_invertmouse_box.curvalue= m_pitch.value < 0 ? 1 : 0;
-
- Cvar.SetValue("lookspring", ClampCvar(0, 1, lookspring.value));
- s_options_lookspring_box.curvalue= (int) lookspring.value;
-
- Cvar.SetValue("lookstrafe", ClampCvar(0, 1, lookstrafe.value));
- s_options_lookstrafe_box.curvalue= (int) lookstrafe.value;
-
- Cvar.SetValue("freelook", ClampCvar(0, 1, freelook.value));
- s_options_freelook_box.curvalue= (int) freelook.value;
-
- Cvar.SetValue("crosshair", ClampCvar(0, 3, Globals.crosshair.value));
- s_options_crosshair_box.curvalue= (int) Globals.crosshair.value;
-
- Cvar.SetValue("in_joystick", ClampCvar(0, 1, in_joystick.value));
- s_options_joystick_box.curvalue= (int) in_joystick.value;
-
- s_options_noalttab_box.curvalue= (int) win_noalttab.value;
- }
-
- static void ControlsResetDefaultsFunc(Object unused) {
- Cbuf.AddText("exec default.cfg\n");
- Cbuf.Execute();
-
- ControlsSetMenuItemValues();
- }
-
- static void InvertMouseFunc(Object unused) {
- Cvar.SetValue("m_pitch", -m_pitch.value);
- }
-
- static void LookspringFunc(Object unused) {
- Cvar.SetValue("lookspring", 1 - lookspring.value);
- }
-
- static void LookstrafeFunc(Object unused) {
- Cvar.SetValue("lookstrafe", 1 - lookstrafe.value);
- }
-
- static void UpdateVolumeFunc(Object unused) {
- Cvar.SetValue("s_volume", s_options_sfxvolume_slider.curvalue / 10);
- }
-
- static void UpdateCDVolumeFunc(Object unused) {
- Cvar.SetValue("cd_nocd", 1 - s_options_cdvolume_box.curvalue);
- }
-
- static void ConsoleFunc(Object unused) {
- /*
- ** the proper way to do this is probably to have ToggleConsole_f accept a parameter
- */
-
- if (cl.attractloop) {
- Cbuf.AddText("killserver\n");
- return;
- }
-
- Key.ClearTyping();
- Console.ClearNotify();
-
- ForceMenuOff();
- cls.key_dest= key_console;
- }
-
- static void UpdateSoundQualityFunc(Object unused) {
- boolean driverNotChanged= false;
- if (s_options_quality_list.curvalue != 0) {
- // Cvar.SetValue("s_khz", 22);
- // Cvar.SetValue("s_loadas8bit", 0);
- driverNotChanged= S.getDriverName().equals("dummy");
- Cvar.Set("s_impl", "dummy");
- }
- else {
- // Cvar.SetValue("s_khz", 11);
- // Cvar.SetValue("s_loadas8bit", 1);
- driverNotChanged= S.getDriverName().equals("joal");
- Cvar.Set("s_impl", "joal");
- }
-
- //Cvar.SetValue("s_primary", s_options_compatibility_list.curvalue);
-
- if (driverNotChanged) {
- re.EndFrame();
- return;
- }
- else {
-
- DrawTextBox(8, 120 - 48, 36, 3);
- Print(16 + 16, 120 - 48 + 8, "Restarting the sound system. This");
- Print(16 + 16, 120 - 48 + 16, "could take up to a minute, so");
- Print(16 + 16, 120 - 48 + 24, "please be patient.");
-
- // the text box won't show up unless we do a buffer swap
- re.EndFrame();
-
- CL.Snd_Restart_f.execute();
- }
- }
-
- static String cd_music_items[]= { "disabled", "enabled", null };
- static String soundstate_items[]= { "on", "off", null };
-
- static String compatibility_items[]= { "max compatibility", "max performance", null };
-
- static String yesno_names[]= { "no", "yes", null };
-
- static String crosshair_names[]= { "none", "cross", "dot", "angle", null };
-
- static void Options_MenuInit() {
-
- win_noalttab= Cvar.Get("win_noalttab", "0", CVAR_ARCHIVE);
-
- /*
- ** configure controls menu and menu items
- */
- s_options_menu.x= viddef.width / 2;
- s_options_menu.y= viddef.height / 2 - 58;
- s_options_menu.nitems= 0;
-
- s_options_sfxvolume_slider.type= MTYPE_SLIDER;
- s_options_sfxvolume_slider.x= 0;
- s_options_sfxvolume_slider.y= 0;
- s_options_sfxvolume_slider.name= "effects volume";
- s_options_sfxvolume_slider.callback= new mcallback() {
- public void execute(Object o) {
- UpdateVolumeFunc(o);
- }
- };
- s_options_sfxvolume_slider.minvalue= 0;
- s_options_sfxvolume_slider.maxvalue= 10;
- s_options_sfxvolume_slider.curvalue= Cvar.VariableValue("s_volume") * 10;
-
- s_options_cdvolume_box.type= MTYPE_SPINCONTROL;
- s_options_cdvolume_box.x= 0;
- s_options_cdvolume_box.y= 10;
- s_options_cdvolume_box.name= "CD music";
- s_options_cdvolume_box.callback= new mcallback() {
- public void execute(Object o) {
- UpdateCDVolumeFunc(o);
- }
- };
- s_options_cdvolume_box.itemnames= cd_music_items;
- s_options_cdvolume_box.curvalue= 1 - (int) Cvar.VariableValue("cd_nocd");
-
- s_options_quality_list.type= MTYPE_SPINCONTROL;
- s_options_quality_list.x= 0;
- s_options_quality_list.y= 20;
- ;
- s_options_quality_list.name= "sound";
- s_options_quality_list.callback= new mcallback() {
- public void execute(Object o) {
- UpdateSoundQualityFunc(o);
- }
- };
- s_options_quality_list.itemnames= soundstate_items;
- //s_options_quality_list.curvalue = 1 - (int) Cvar.VariableValue("s_loadas8bit");
-
- // s_options_compatibility_list.type = MTYPE_SPINCONTROL;
- // s_options_compatibility_list.x = 0;
- // s_options_compatibility_list.y = 30;
- // s_options_compatibility_list.name = "sound compatibility";
- // s_options_compatibility_list.callback = new mcallback() {
- // public void execute(Object o) {
- // UpdateSoundQualityFunc(o);
- // }
- // };
- // s_options_compatibility_list.itemnames = compatibility_items;
- // s_options_compatibility_list.curvalue = (int) Cvar.VariableValue("s_primary");
-
- s_options_sensitivity_slider.type= MTYPE_SLIDER;
- s_options_sensitivity_slider.x= 0;
- s_options_sensitivity_slider.y= 50;
- s_options_sensitivity_slider.name= "mouse speed";
- s_options_sensitivity_slider.callback= new mcallback() {
- public void execute(Object o) {
- MouseSpeedFunc(o);
- }
- };
- s_options_sensitivity_slider.minvalue= 2;
- s_options_sensitivity_slider.maxvalue= 22;
-
- s_options_alwaysrun_box.type= MTYPE_SPINCONTROL;
- s_options_alwaysrun_box.x= 0;
- s_options_alwaysrun_box.y= 60;
- s_options_alwaysrun_box.name= "always run";
- s_options_alwaysrun_box.callback= new mcallback() {
- public void execute(Object o) {
- AlwaysRunFunc(o);
- }
- };
- s_options_alwaysrun_box.itemnames= yesno_names;
-
- s_options_invertmouse_box.type= MTYPE_SPINCONTROL;
- s_options_invertmouse_box.x= 0;
- s_options_invertmouse_box.y= 70;
- s_options_invertmouse_box.name= "invert mouse";
- s_options_invertmouse_box.callback= new mcallback() {
- public void execute(Object o) {
- InvertMouseFunc(o);
- }
- };
- s_options_invertmouse_box.itemnames= yesno_names;
-
- s_options_lookspring_box.type= MTYPE_SPINCONTROL;
- s_options_lookspring_box.x= 0;
- s_options_lookspring_box.y= 80;
- s_options_lookspring_box.name= "lookspring";
- s_options_lookspring_box.callback= new mcallback() {
- public void execute(Object o) {
- LookspringFunc(o);
- }
- };
- s_options_lookspring_box.itemnames= yesno_names;
-
- s_options_lookstrafe_box.type= MTYPE_SPINCONTROL;
- s_options_lookstrafe_box.x= 0;
- s_options_lookstrafe_box.y= 90;
- s_options_lookstrafe_box.name= "lookstrafe";
- s_options_lookstrafe_box.callback= new mcallback() {
- public void execute(Object o) {
- LookstrafeFunc(o);
- }
- };
- s_options_lookstrafe_box.itemnames= yesno_names;
-
- s_options_freelook_box.type= MTYPE_SPINCONTROL;
- s_options_freelook_box.x= 0;
- s_options_freelook_box.y= 100;
- s_options_freelook_box.name= "free look";
- s_options_freelook_box.callback= new mcallback() {
- public void execute(Object o) {
- FreeLookFunc(o);
- }
- };
- s_options_freelook_box.itemnames= yesno_names;
-
- s_options_crosshair_box.type= MTYPE_SPINCONTROL;
- s_options_crosshair_box.x= 0;
- s_options_crosshair_box.y= 110;
- s_options_crosshair_box.name= "crosshair";
- s_options_crosshair_box.callback= new mcallback() {
- public void execute(Object o) {
- CrosshairFunc(o);
- }
- };
- s_options_crosshair_box.itemnames= crosshair_names;
- /*
- s_options_noalttab_box.type = MTYPE_SPINCONTROL;
- s_options_noalttab_box.x = 0;
- s_options_noalttab_box.y = 110;
- s_options_noalttab_box.name = "disable alt-tab";
- s_options_noalttab_box.callback = NoAltTabFunc;
- s_options_noalttab_box.itemnames = yesno_names;
- */
- s_options_joystick_box.type= MTYPE_SPINCONTROL;
- s_options_joystick_box.x= 0;
- s_options_joystick_box.y= 120;
- s_options_joystick_box.name= "use joystick";
- s_options_joystick_box.callback= new mcallback() {
- public void execute(Object o) {
- JoystickFunc(o);
- }
- };
- s_options_joystick_box.itemnames= yesno_names;
-
- s_options_customize_options_action.type= MTYPE_ACTION;
- s_options_customize_options_action.x= 0;
- s_options_customize_options_action.y= 140;
- s_options_customize_options_action.name= "customize controls";
- s_options_customize_options_action.callback= new mcallback() {
- public void execute(Object o) {
- CustomizeControlsFunc(o);
- }
- };
-
- s_options_defaults_action.type= MTYPE_ACTION;
- s_options_defaults_action.x= 0;
- s_options_defaults_action.y= 150;
- s_options_defaults_action.name= "reset defaults";
- s_options_defaults_action.callback= new mcallback() {
- public void execute(Object o) {
- ControlsResetDefaultsFunc(o);
- }
- };
-
- s_options_console_action.type= MTYPE_ACTION;
- s_options_console_action.x= 0;
- s_options_console_action.y= 160;
- s_options_console_action.name= "go to console";
- s_options_console_action.callback= new mcallback() {
- public void execute(Object o) {
- ConsoleFunc(o);
- }
- };
-
- ControlsSetMenuItemValues();
-
- Menu_AddItem(s_options_menu, s_options_sfxvolume_slider);
-
- Menu_AddItem(s_options_menu, s_options_cdvolume_box);
- Menu_AddItem(s_options_menu, s_options_quality_list);
- // Menu_AddItem(s_options_menu, s_options_compatibility_list);
- Menu_AddItem(s_options_menu, s_options_sensitivity_slider);
- Menu_AddItem(s_options_menu, s_options_alwaysrun_box);
- Menu_AddItem(s_options_menu, s_options_invertmouse_box);
- Menu_AddItem(s_options_menu, s_options_lookspring_box);
- Menu_AddItem(s_options_menu, s_options_lookstrafe_box);
- Menu_AddItem(s_options_menu, s_options_freelook_box);
- Menu_AddItem(s_options_menu, s_options_crosshair_box);
- // Menu_AddItem(s_options_menu, s_options_joystick_box);
- Menu_AddItem(s_options_menu, s_options_customize_options_action);
- Menu_AddItem(s_options_menu, s_options_defaults_action);
- Menu_AddItem(s_options_menu, s_options_console_action);
- }
-
- static void Options_MenuDraw() {
- Banner("m_banner_options");
- Menu_AdjustCursor(s_options_menu, 1);
- Menu_Draw(s_options_menu);
- }
-
- static String Options_MenuKey(int key) {
- return Default_MenuKey(s_options_menu, key);
- }
-
- static xcommand_t Menu_Options= new xcommand_t() {
- public void execute() {
- Menu_Options_f();
- }
- };
-
- static void Menu_Options_f() {
- Options_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- Options_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return Options_MenuKey(key);
- }
- });
- }
-
- /*
- =======================================================================
-
- VIDEO MENU
-
- =======================================================================
- */
-
- static xcommand_t Menu_Video= new xcommand_t() {
- public void execute() {
- Menu_Video_f();
- }
- };
-
- static void Menu_Video_f() {
- VID.MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- VID.MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return VID.MenuKey(key);
- }
- });
- }
-
- /*
- =============================================================================
-
- END GAME MENU
-
- =============================================================================
- */
- static int credits_start_time;
-
- static String creditsIndex[]= new String[256];
- static String creditsBuffer;
- static String idcredits[]=
- {
- "+QUAKE II BY ID SOFTWARE",
- "",
- "+PROGRAMMING",
- "John Carmack",
- "John Cash",
- "Brian Hook",
- "",
- "+JAVA PORT BY BYTONIC",
- "CWEI",
- "HOZ",
- "RST",
- "",
- "+ART",
- "Adrian Carmack",
- "Kevin Cloud",
- "Paul Steed",
- "",
- "+LEVEL DESIGN",
- "Tim Willits",
- "American McGee",
- "Christian Antkow",
- "Paul Jaquays",
- "Brandon James",
- "",
- "+BIZ",
- "Todd Hollenshead",
- "Barrett (Bear) Alexander",
- "Donna Jackson",
- "",
- "",
- "+SPECIAL THANKS",
- "Ben Donges for beta testing",
- "",
- "",
- "",
- "",
- "",
- "",
- "+ADDITIONAL SUPPORT",
- "",
- "+LINUX PORT AND CTF",
- "Dave \"Zoid\" Kirsch",
- "",
- "+CINEMATIC SEQUENCES",
- "Ending Cinematic by Blur Studio - ",
- "Venice, CA",
- "",
- "Environment models for Introduction",
- "Cinematic by Karl Dolgener",
- "",
- "Assistance with environment design",
- "by Cliff Iwai",
- "",
- "+SOUND EFFECTS AND MUSIC",
- "Sound Design by Soundelux Media Labs.",
- "Music Composed and Produced by",
- "Soundelux Media Labs. Special thanks",
- "to Bill Brown, Tom Ozanich, Brian",
- "Celano, Jeff Eisner, and The Soundelux",
- "Players.",
- "",
- "\"Level Music\" by Sonic Mayhem",
- "www.sonicmayhem.com",
- "",
- "\"Quake II Theme Song\"",
- "(C) 1997 Rob Zombie. All Rights",
- "Reserved.",
- "",
- "Track 10 (\"Climb\") by Jer Sypult",
- "",
- "Voice of computers by",
- "Carly Staehlin-Taylor",
- "",
- "+THANKS TO ACTIVISION",
- "+IN PARTICULAR:",
- "",
- "John Tam",
- "Steve Rosenthal",
- "Marty Stratton",
- "Henk Hartong",
- "",
- "Quake II(tm) (C)1997 Id Software, Inc.",
- "All Rights Reserved. Distributed by",
- "Activision, Inc. under license.",
- "Quake II(tm), the Id Software name,",
- "the \"Q II\"(tm) logo and id(tm)",
- "logo are trademarks of Id Software,",
- "Inc. Activision(R) is a registered",
- "trademark of Activision, Inc. All",
- "other trademarks and trade names are",
- "properties of their respective owners.",
- null };
- static String credits[]= idcredits;
- static String xatcredits[]=
- {
- "+QUAKE II MISSION PACK: THE RECKONING",
- "+BY",
- "+XATRIX ENTERTAINMENT, INC.",
- "",
- "+DESIGN AND DIRECTION",
- "Drew Markham",
- "",
- "+PRODUCED BY",
- "Greg Goodrich",
- "",
- "+PROGRAMMING",
- "Rafael Paiz",
- "",
- "+LEVEL DESIGN / ADDITIONAL GAME DESIGN",
- "Alex Mayberry",
- "",
- "+LEVEL DESIGN",
- "Mal Blackwell",
- "Dan Koppel",
- "",
- "+ART DIRECTION",
- "Michael \"Maxx\" Kaufman",
- "",
- "+COMPUTER GRAPHICS SUPERVISOR AND",
- "+CHARACTER ANIMATION DIRECTION",
- "Barry Dempsey",
- "",
- "+SENIOR ANIMATOR AND MODELER",
- "Jason Hoover",
- "",
- "+CHARACTER ANIMATION AND",
- "+MOTION CAPTURE SPECIALIST",
- "Amit Doron",
- "",
- "+ART",
- "Claire Praderie-Markham",
- "Viktor Antonov",
- "Corky Lehmkuhl",
- "",
- "+INTRODUCTION ANIMATION",
- "Dominique Drozdz",
- "",
- "+ADDITIONAL LEVEL DESIGN",
- "Aaron Barber",
- "Rhett Baldwin",
- "",
- "+3D CHARACTER ANIMATION TOOLS",
- "Gerry Tyra, SA Technology",
- "",
- "+ADDITIONAL EDITOR TOOL PROGRAMMING",
- "Robert Duffy",
- "",
- "+ADDITIONAL PROGRAMMING",
- "Ryan Feltrin",
- "",
- "+PRODUCTION COORDINATOR",
- "Victoria Sylvester",
- "",
- "+SOUND DESIGN",
- "Gary Bradfield",
- "",
- "+MUSIC BY",
- "Sonic Mayhem",
- "",
- "",
- "",
- "+SPECIAL THANKS",
- "+TO",
- "+OUR FRIENDS AT ID SOFTWARE",
- "",
- "John Carmack",
- "John Cash",
- "Brian Hook",
- "Adrian Carmack",
- "Kevin Cloud",
- "Paul Steed",
- "Tim Willits",
- "Christian Antkow",
- "Paul Jaquays",
- "Brandon James",
- "Todd Hollenshead",
- "Barrett (Bear) Alexander",
- "Dave \"Zoid\" Kirsch",
- "Donna Jackson",
- "",
- "",
- "",
- "+THANKS TO ACTIVISION",
- "+IN PARTICULAR:",
- "",
- "Marty Stratton",
- "Henk \"The Original Ripper\" Hartong",
- "Kevin Kraff",
- "Jamey Gottlieb",
- "Chris Hepburn",
- "",
- "+AND THE GAME TESTERS",
- "",
- "Tim Vanlaw",
- "Doug Jacobs",
- "Steven Rosenthal",
- "David Baker",
- "Chris Campbell",
- "Aaron Casillas",
- "Steve Elwell",
- "Derek Johnstone",
- "Igor Krinitskiy",
- "Samantha Lee",
- "Michael Spann",
- "Chris Toft",
- "Juan Valdes",
- "",
- "+THANKS TO INTERGRAPH COMPUTER SYTEMS",
- "+IN PARTICULAR:",
- "",
- "Michael T. Nicolaou",
- "",
- "",
- "Quake II Mission Pack: The Reckoning",
- "(tm) (C)1998 Id Software, Inc. All",
- "Rights Reserved. Developed by Xatrix",
- "Entertainment, Inc. for Id Software,",
- "Inc. Distributed by Activision Inc.",
- "under license. Quake(R) is a",
- "registered trademark of Id Software,",
- "Inc. Quake II Mission Pack: The",
- "Reckoning(tm), Quake II(tm), the Id",
- "Software name, the \"Q II\"(tm) logo",
- "and id(tm) logo are trademarks of Id",
- "Software, Inc. Activision(R) is a",
- "registered trademark of Activision,",
- "Inc. Xatrix(R) is a registered",
- "trademark of Xatrix Entertainment,",
- "Inc. All other trademarks and trade",
- "names are properties of their",
- "respective owners.",
- null };
-
- static String roguecredits[]=
- {
- "+QUAKE II MISSION PACK 2: GROUND ZERO",
- "+BY",
- "+ROGUE ENTERTAINMENT, INC.",
- "",
- "+PRODUCED BY",
- "Jim Molinets",
- "",
- "+PROGRAMMING",
- "Peter Mack",
- "Patrick Magruder",
- "",
- "+LEVEL DESIGN",
- "Jim Molinets",
- "Cameron Lamprecht",
- "Berenger Fish",
- "Robert Selitto",
- "Steve Tietze",
- "Steve Thoms",
- "",
- "+ART DIRECTION",
- "Rich Fleider",
- "",
- "+ART",
- "Rich Fleider",
- "Steve Maines",
- "Won Choi",
- "",
- "+ANIMATION SEQUENCES",
- "Creat Studios",
- "Steve Maines",
- "",
- "+ADDITIONAL LEVEL DESIGN",
- "Rich Fleider",
- "Steve Maines",
- "Peter Mack",
- "",
- "+SOUND",
- "James Grunke",
- "",
- "+GROUND ZERO THEME",
- "+AND",
- "+MUSIC BY",
- "Sonic Mayhem",
- "",
- "+VWEP MODELS",
- "Brent \"Hentai\" Dill",
- "",
- "",
- "",
- "+SPECIAL THANKS",
- "+TO",
- "+OUR FRIENDS AT ID SOFTWARE",
- "",
- "John Carmack",
- "John Cash",
- "Brian Hook",
- "Adrian Carmack",
- "Kevin Cloud",
- "Paul Steed",
- "Tim Willits",
- "Christian Antkow",
- "Paul Jaquays",
- "Brandon James",
- "Todd Hollenshead",
- "Barrett (Bear) Alexander",
- "Katherine Anna Kang",
- "Donna Jackson",
- "Dave \"Zoid\" Kirsch",
- "",
- "",
- "",
- "+THANKS TO ACTIVISION",
- "+IN PARTICULAR:",
- "",
- "Marty Stratton",
- "Henk Hartong",
- "Mitch Lasky",
- "Steve Rosenthal",
- "Steve Elwell",
- "",
- "+AND THE GAME TESTERS",
- "",
- "The Ranger Clan",
- "Dave \"Zoid\" Kirsch",
- "Nihilistic Software",
- "Robert Duffy",
- "",
- "And Countless Others",
- "",
- "",
- "",
- "Quake II Mission Pack 2: Ground Zero",
- "(tm) (C)1998 Id Software, Inc. All",
- "Rights Reserved. Developed by Rogue",
- "Entertainment, Inc. for Id Software,",
- "Inc. Distributed by Activision Inc.",
- "under license. Quake(R) is a",
- "registered trademark of Id Software,",
- "Inc. Quake II Mission Pack 2: Ground",
- "Zero(tm), Quake II(tm), the Id",
- "Software name, the \"Q II\"(tm) logo",
- "and id(tm) logo are trademarks of Id",
- "Software, Inc. Activision(R) is a",
- "registered trademark of Activision,",
- "Inc. Rogue(R) is a registered",
- "trademark of Rogue Entertainment,",
- "Inc. All other trademarks and trade",
- "names are properties of their",
- "respective owners.",
- null };
-
- public static void Credits_MenuDraw() {
- int i, y;
-
- /*
- ** draw the credits
- */
- for (i= 0, y= (int) (viddef.height - ((cls.realtime - credits_start_time) / 40.0F));
- credits[i] != null && y < viddef.height;
- y += 10, i++) {
- int j, stringoffset= 0;
- boolean bold= false;
-
- if (y <= -8)
- continue;
-
- if (credits[i].length() > 0 && credits[i].charAt(0) == '+') {
- bold= true;
- stringoffset= 1;
- }
- else {
- bold= false;
- stringoffset= 0;
- }
-
- for (j= 0; j + stringoffset < credits[i].length(); j++) {
- int x;
-
- x= (viddef.width - credits[i].length() * 8 - stringoffset * 8) / 2 + (j + stringoffset) * 8;
-
- if (bold)
- re.DrawChar(x, y, credits[i].charAt(j + stringoffset) + 128);
- else
- re.DrawChar(x, y, credits[i].charAt(j + stringoffset));
- }
- }
-
- if (y < 0)
- credits_start_time= cls.realtime;
- }
-
- public static String Credits_Key(int key) {
- switch (key) {
- case K_ESCAPE :
- if (creditsBuffer != null)
- //FS.FreeFile(creditsBuffer);
- ;
- PopMenu();
- break;
- }
-
- return menu_out_sound;
-
- }
-
- static xcommand_t Menu_Credits= new xcommand_t() {
- public void execute() {
- Menu_Credits_f();
- }
- };
- static void Menu_Credits_f() {
- int n;
- int isdeveloper= 0;
-
- byte b[]= FS.LoadFile("credits");
-
- if (b != null) {
- creditsBuffer= new String(b);
- String line[]= Lib.linesplit(creditsBuffer);
-
- for (n= 0; n < line.length; n++) {
- creditsIndex[n]= line[n];
- }
-
- creditsIndex[n]= null;
- credits= creditsIndex;
- }
- else {
- isdeveloper= FS.Developer_searchpath(1);
-
- if (isdeveloper == 1) // xatrix
- credits= xatcredits;
- else if (isdeveloper == 2) // ROGUE
- credits= roguecredits;
- else {
- credits= idcredits;
- }
-
- }
-
- credits_start_time= cls.realtime;
- PushMenu(new xcommand_t() {
- public void execute() {
- Credits_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return Credits_Key(key);
- }
- });
- }
-
- /*
- =============================================================================
-
- GAME MENU
-
- =============================================================================
- */
-
- static int m_game_cursor;
-
- static menuframework_s s_game_menu= new menuframework_s();
- static menuaction_s s_easy_game_action= new menuaction_s();
- static menuaction_s s_medium_game_action= new menuaction_s();
- static menuaction_s s_hard_game_action= new menuaction_s();
- static menuaction_s s_load_game_action= new menuaction_s();
- static menuaction_s s_save_game_action= new menuaction_s();
- static menuaction_s s_credits_action= new menuaction_s();
- static menuseparator_s s_blankline= new menuseparator_s();
-
- static void StartGame() {
- // disable updates and start the cinematic going
- cl.servercount= -1;
- ForceMenuOff();
- Cvar.SetValue("deathmatch", 0);
- Cvar.SetValue("coop", 0);
-
- Cvar.SetValue("gamerules", 0); //PGM
-
- Cbuf.AddText("loading ; killserver ; wait ; newgame\n");
- cls.key_dest= key_game;
- }
-
- static void EasyGameFunc(Object data) {
- Cvar.ForceSet("skill", "0");
- StartGame();
- }
-
- static void MediumGameFunc(Object data) {
- Cvar.ForceSet("skill", "1");
- StartGame();
- }
-
- static void HardGameFunc(Object data) {
- Cvar.ForceSet("skill", "2");
- StartGame();
- }
-
- static void LoadGameFunc(Object unused) {
- Menu_LoadGame_f();
- }
-
- static void SaveGameFunc(Object unused) {
- Menu_SaveGame_f();
- }
-
- static void CreditsFunc(Object unused) {
- Menu_Credits_f();
- }
-
- static String difficulty_names[]= { "easy", "medium", "fuckin shitty hard", null };
- static void Game_MenuInit() {
-
- s_game_menu.x= (int) (viddef.width * 0.50);
- s_game_menu.nitems= 0;
-
- s_easy_game_action.type= MTYPE_ACTION;
- s_easy_game_action.flags= QMF_LEFT_JUSTIFY;
- s_easy_game_action.x= 0;
- s_easy_game_action.y= 0;
- s_easy_game_action.name= "easy";
- s_easy_game_action.callback= new mcallback() {
- public void execute(Object o) {
- EasyGameFunc(o);
- }
- };
-
- s_medium_game_action.type= MTYPE_ACTION;
- s_medium_game_action.flags= QMF_LEFT_JUSTIFY;
- s_medium_game_action.x= 0;
- s_medium_game_action.y= 10;
- s_medium_game_action.name= "medium";
- s_medium_game_action.callback= new mcallback() {
- public void execute(Object o) {
- MediumGameFunc(o);
- }
- };
-
- s_hard_game_action.type= MTYPE_ACTION;
- s_hard_game_action.flags= QMF_LEFT_JUSTIFY;
- s_hard_game_action.x= 0;
- s_hard_game_action.y= 20;
- s_hard_game_action.name= "hard";
- s_hard_game_action.callback= new mcallback() {
- public void execute(Object o) {
- HardGameFunc(o);
- }
- };
-
- s_blankline.type= MTYPE_SEPARATOR;
-
- s_load_game_action.type= MTYPE_ACTION;
- s_load_game_action.flags= QMF_LEFT_JUSTIFY;
- s_load_game_action.x= 0;
- s_load_game_action.y= 40;
- s_load_game_action.name= "load game";
- s_load_game_action.callback= new mcallback() {
- public void execute(Object o) {
- LoadGameFunc(o);
- }
- };
-
- s_save_game_action.type= MTYPE_ACTION;
- s_save_game_action.flags= QMF_LEFT_JUSTIFY;
- s_save_game_action.x= 0;
- s_save_game_action.y= 50;
- s_save_game_action.name= "save game";
- s_save_game_action.callback= new mcallback() {
- public void execute(Object o) {
- SaveGameFunc(o);
- }
- };
-
- s_credits_action.type= MTYPE_ACTION;
- s_credits_action.flags= QMF_LEFT_JUSTIFY;
- s_credits_action.x= 0;
- s_credits_action.y= 60;
- s_credits_action.name= "credits";
- s_credits_action.callback= new mcallback() {
- public void execute(Object o) {
- CreditsFunc(o);
- }
- };
-
- Menu_AddItem(s_game_menu, s_easy_game_action);
- Menu_AddItem(s_game_menu, s_medium_game_action);
- Menu_AddItem(s_game_menu, s_hard_game_action);
- Menu_AddItem(s_game_menu, s_blankline);
- Menu_AddItem(s_game_menu, s_load_game_action);
- Menu_AddItem(s_game_menu, s_save_game_action);
- Menu_AddItem(s_game_menu, s_blankline);
- Menu_AddItem(s_game_menu, s_credits_action);
-
- Menu_Center(s_game_menu);
- }
-
- static void Game_MenuDraw() {
- Banner("m_banner_game");
- Menu_AdjustCursor(s_game_menu, 1);
- Menu_Draw(s_game_menu);
- }
-
- static String Game_MenuKey(int key) {
- return Default_MenuKey(s_game_menu, key);
- }
-
- static xcommand_t Menu_Game= new xcommand_t() {
- public void execute() {
- Menu_Game_f();
- }
- };
-
- static void Menu_Game_f() {
- Game_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- Game_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return Game_MenuKey(key);
- }
- });
- m_game_cursor= 1;
- }
-
- /*
- =============================================================================
-
- LOADGAME MENU
-
- =============================================================================
- */
-
- public final static int MAX_SAVEGAMES= 15;
-
- static menuframework_s s_savegame_menu= new menuframework_s();
- static menuframework_s s_loadgame_menu= new menuframework_s();
-
- static menuaction_s s_loadgame_actions[]= new menuaction_s[MAX_SAVEGAMES];
-
- static {
- for (int n= 0; n < MAX_SAVEGAMES; n++)
- s_loadgame_actions[n]= new menuaction_s();
- }
-
- //String m_savestrings[] = new String [MAX_SAVEGAMES][32];
- static String m_savestrings[]= new String[MAX_SAVEGAMES];
-
- static {
- for (int n= 0; n < MAX_SAVEGAMES; n++)
- m_savestrings[n]= "";
- }
-
- static boolean m_savevalid[]= new boolean[MAX_SAVEGAMES];
-
- /** Search the save dir for saved games and their names. */
- static void Create_Savestrings() {
- int i;
- QuakeFile f;
- String name;
-
- for (i= 0; i < MAX_SAVEGAMES; i++) {
-
- m_savestrings[i]= "<EMPTY>";
- name= FS.Gamedir() + "/save/save" + i + "/server.ssv";
-
- try {
- f= new QuakeFile(name, "r");
- if (f == null) {
- m_savestrings[i]= "<EMPTY>";
- m_savevalid[i]= false;
- }
- else {
- String str= f.readString();
- if (str != null)
- m_savestrings[i]= str;
- f.close();
- m_savevalid[i]= true;
- }
- }
- catch (Exception e) {
- m_savestrings[i]= "<EMPTY>";
- m_savevalid[i]= false;
- };
- }
- }
-
- static void LoadGameCallback(Object self) {
- menuaction_s a= (menuaction_s) self;
-
- if (m_savevalid[a.localdata[0]])
- Cbuf.AddText("load save" + a.localdata[0] + "\n");
- ForceMenuOff();
- }
-
- static void LoadGame_MenuInit() {
- int i;
-
- s_loadgame_menu.x= viddef.width / 2 - 120;
- s_loadgame_menu.y= viddef.height / 2 - 58;
- s_loadgame_menu.nitems= 0;
-
- Create_Savestrings();
-
- for (i= 0; i < MAX_SAVEGAMES; i++) {
- s_loadgame_actions[i].name= m_savestrings[i];
- s_loadgame_actions[i].flags= QMF_LEFT_JUSTIFY;
- s_loadgame_actions[i].localdata[0]= i;
- s_loadgame_actions[i].callback= new mcallback() {
- public void execute(Object o) {
- LoadGameCallback(o);
- }
- };
-
- s_loadgame_actions[i].x= 0;
- s_loadgame_actions[i].y= (i) * 10;
- if (i > 0) // separate from autosave
- s_loadgame_actions[i].y += 10;
-
- s_loadgame_actions[i].type= MTYPE_ACTION;
-
- Menu_AddItem(s_loadgame_menu, s_loadgame_actions[i]);
- }
- }
-
- static void LoadGame_MenuDraw() {
- Banner("m_banner_load_game");
- // Menu_AdjustCursor( &s_loadgame_menu, 1 );
- Menu_Draw(s_loadgame_menu);
- }
-
- static String LoadGame_MenuKey(int key) {
- if (key == K_ESCAPE || key == K_ENTER) {
- s_savegame_menu.cursor= s_loadgame_menu.cursor - 1;
- if (s_savegame_menu.cursor < 0)
- s_savegame_menu.cursor= 0;
- }
- return Default_MenuKey(s_loadgame_menu, key);
- }
-
- static xcommand_t Menu_LoadGame= new xcommand_t() {
- public void execute() {
- Menu_LoadGame_f();
- }
- };
- static void Menu_LoadGame_f() {
- LoadGame_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- LoadGame_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return LoadGame_MenuKey(key);
- }
- });
- }
-
- /*
- =============================================================================
-
- SAVEGAME MENU
-
- =============================================================================
- */
- //static menuframework_s s_savegame_menu;
- static menuaction_s s_savegame_actions[]= new menuaction_s[MAX_SAVEGAMES];
-
- static {
- for (int n= 0; n < MAX_SAVEGAMES; n++)
- s_savegame_actions[n]= new menuaction_s();
-
- }
-
- static void SaveGameCallback(Object self) {
- menuaction_s a= (menuaction_s) self;
-
- Cbuf.AddText("save save" + a.localdata[0] + "\n");
- ForceMenuOff();
- }
-
- static void SaveGame_MenuDraw() {
- Banner("m_banner_save_game");
- Menu_AdjustCursor(s_savegame_menu, 1);
- Menu_Draw(s_savegame_menu);
- }
-
- static void SaveGame_MenuInit() {
- int i;
-
- s_savegame_menu.x= viddef.width / 2 - 120;
- s_savegame_menu.y= viddef.height / 2 - 58;
- s_savegame_menu.nitems= 0;
-
- Create_Savestrings();
-
- // don't include the autosave slot
- for (i= 0; i < MAX_SAVEGAMES - 1; i++) {
- s_savegame_actions[i].name= m_savestrings[i + 1];
- s_savegame_actions[i].localdata[0]= i + 1;
- s_savegame_actions[i].flags= QMF_LEFT_JUSTIFY;
- s_savegame_actions[i].callback= new mcallback() {
- public void execute(Object o) {
- SaveGameCallback(o);
- }
- };
-
- s_savegame_actions[i].x= 0;
- s_savegame_actions[i].y= (i) * 10;
-
- s_savegame_actions[i].type= MTYPE_ACTION;
-
- Menu_AddItem(s_savegame_menu, s_savegame_actions[i]);
- }
- }
-
- static String SaveGame_MenuKey(int key) {
- if (key == K_ENTER || key == K_ESCAPE) {
- s_loadgame_menu.cursor= s_savegame_menu.cursor - 1;
- if (s_loadgame_menu.cursor < 0)
- s_loadgame_menu.cursor= 0;
- }
- return Default_MenuKey(s_savegame_menu, key);
- }
-
- static xcommand_t Menu_SaveGame= new xcommand_t() {
- public void execute() {
- Menu_SaveGame_f();
- }
- };
-
- static void Menu_SaveGame_f() {
- if (0 == Globals.server_state)
- return; // not playing a game
-
- SaveGame_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- SaveGame_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return SaveGame_MenuKey(key);
- }
- });
- Create_Savestrings();
- }
-
- /*
- =============================================================================
-
- JOIN SERVER MENU
-
- =============================================================================
- */
-
- static menuframework_s s_joinserver_menu= new menuframework_s();
- static menuseparator_s s_joinserver_server_title= new menuseparator_s();
- static menuaction_s s_joinserver_search_action= new menuaction_s();
- static menuaction_s s_joinserver_address_book_action= new menuaction_s();
-
- static netadr_t local_server_netadr[]= new netadr_t[MAX_LOCAL_SERVERS];
- static String local_server_names[]= new String[MAX_LOCAL_SERVERS]; //[80];
- static menuaction_s s_joinserver_server_actions[]= new menuaction_s[MAX_LOCAL_SERVERS];
-
- // user readable information
- // network address
- static {
- for (int n= 0; n < MAX_LOCAL_SERVERS; n++) {
- local_server_netadr[n]= new netadr_t();
- local_server_names[n]= "";
- s_joinserver_server_actions[n]= new menuaction_s();
- s_joinserver_server_actions[n].n= n;
- }
- }
-
- static int m_num_servers;
-
- static void AddToServerList(netadr_t adr, String info) {
- int i;
-
- if (m_num_servers == MAX_LOCAL_SERVERS)
- return;
-
- String x= info.trim();
-
- // ignore if duplicated
-
- for (i= 0; i < m_num_servers; i++)
- if (x.equals(local_server_names[i]))
- return;
-
- local_server_netadr[m_num_servers]= adr;
- local_server_names[m_num_servers]= x;
- m_num_servers++;
- }
-
- static void JoinServerFunc(Object self) {
- String buffer;
- int index;
-
- index= ((menucommon_s) self).n;
-
- if (Q_stricmp(local_server_names[index], NO_SERVER_STRING) == 0)
- return;
-
- if (index >= m_num_servers)
- return;
-
- buffer= "connect " + NET.AdrToString(local_server_netadr[index]) + "\n";
- Cbuf.AddText(buffer);
- ForceMenuOff();
- }
-
- static void AddressBookFunc(Object self) {
- Menu_AddressBook_f();
- }
-
- static void NullCursorDraw(Object self) {
- }
-
- static void SearchLocalGames() {
- int i;
-
- m_num_servers= 0;
- for (i= 0; i < MAX_LOCAL_SERVERS; i++)
- local_server_names[i]= NO_SERVER_STRING;
-
- DrawTextBox(8, 120 - 48, 36, 3);
- Print(16 + 16, 120 - 48 + 8, "Searching for local servers, this");
- Print(16 + 16, 120 - 48 + 16, "could take up to a minute, so");
- Print(16 + 16, 120 - 48 + 24, "please be patient.");
-
- // the text box won't show up unless we do a buffer swap
- re.EndFrame();
-
- // send out info packets
- CL.PingServers_f.execute();
- }
-
- static void SearchLocalGamesFunc(Object self) {
- SearchLocalGames();
- }
-
- static void JoinServer_MenuInit() {
- int i;
-
- s_joinserver_menu.x= (int) (viddef.width * 0.50 - 120);
- s_joinserver_menu.nitems= 0;
-
- s_joinserver_address_book_action.type= MTYPE_ACTION;
- s_joinserver_address_book_action.name= "address book";
- s_joinserver_address_book_action.flags= QMF_LEFT_JUSTIFY;
- s_joinserver_address_book_action.x= 0;
- s_joinserver_address_book_action.y= 0;
- s_joinserver_address_book_action.callback= new mcallback() {
- public void execute(Object o) {
- AddressBookFunc(o);
- }
- };
-
- s_joinserver_search_action.type= MTYPE_ACTION;
- s_joinserver_search_action.name= "refresh server list";
- s_joinserver_search_action.flags= QMF_LEFT_JUSTIFY;
- s_joinserver_search_action.x= 0;
- s_joinserver_search_action.y= 10;
- s_joinserver_search_action.callback= new mcallback() {
- public void execute(Object o) {
- SearchLocalGamesFunc(o);
- }
- };
- s_joinserver_search_action.statusbar= "search for servers";
-
- s_joinserver_server_title.type= MTYPE_SEPARATOR;
- s_joinserver_server_title.name= "connect to...";
- s_joinserver_server_title.x= 80;
- s_joinserver_server_title.y= 30;
-
- for (i= 0; i < MAX_LOCAL_SERVERS; i++) {
- s_joinserver_server_actions[i].type= MTYPE_ACTION;
- local_server_names[i]= NO_SERVER_STRING;
- s_joinserver_server_actions[i].name= local_server_names[i];
- s_joinserver_server_actions[i].flags= QMF_LEFT_JUSTIFY;
- s_joinserver_server_actions[i].x= 0;
- s_joinserver_server_actions[i].y= 40 + i * 10;
- s_joinserver_server_actions[i].callback= new mcallback() {
- public void execute(Object o) {
- JoinServerFunc(o);
- }
- };
- s_joinserver_server_actions[i].statusbar= "press ENTER to connect";
- }
-
- Menu_AddItem(s_joinserver_menu, s_joinserver_address_book_action);
- Menu_AddItem(s_joinserver_menu, s_joinserver_server_title);
- Menu_AddItem(s_joinserver_menu, s_joinserver_search_action);
-
- for (i= 0; i < 8; i++)
- Menu_AddItem(s_joinserver_menu, s_joinserver_server_actions[i]);
-
- Menu_Center(s_joinserver_menu);
-
- SearchLocalGames();
- }
-
- static void JoinServer_MenuDraw() {
- Banner("m_banner_join_server");
- Menu_Draw(s_joinserver_menu);
- }
-
- static String JoinServer_MenuKey(int key) {
- return Default_MenuKey(s_joinserver_menu, key);
- }
-
- static xcommand_t Menu_JoinServer= new xcommand_t() {
- public void execute() {
- Menu_JoinServer_f();
- }
- };
- static void Menu_JoinServer_f() {
- JoinServer_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- JoinServer_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return JoinServer_MenuKey(key);
- }
- });
- }
-
- /*
- =============================================================================
-
- START SERVER MENU
-
- =============================================================================
- */
- static menuframework_s s_startserver_menu= new menuframework_s();
- static String mapnames[];
- static int nummaps;
-
- static menuaction_s s_startserver_start_action= new menuaction_s();
- static menuaction_s s_startserver_dmoptions_action= new menuaction_s();
- static menufield_s s_timelimit_field= new menufield_s();
- static menufield_s s_fraglimit_field= new menufield_s();
- static menufield_s s_maxclients_field= new menufield_s();
- static menufield_s s_hostname_field= new menufield_s();
- static menulist_s s_startmap_list= new menulist_s();
- static menulist_s s_rules_box= new menulist_s();
-
- static void DMOptionsFunc(Object self) {
- if (s_rules_box.curvalue == 1)
- return;
- Menu_DMOptions_f();
- }
-
- static void RulesChangeFunc(Object self) {
- // DM
- if (s_rules_box.curvalue == 0) {
- s_maxclients_field.statusbar= null;
- s_startserver_dmoptions_action.statusbar= null;
- }
- else if (s_rules_box.curvalue == 1)
- // coop // PGM
- {
- s_maxclients_field.statusbar= "4 maximum for cooperative";
- if (atoi(s_maxclients_field.buffer.toString()) > 4)
- s_maxclients_field.buffer= new StringBuffer("4");
- s_startserver_dmoptions_action.statusbar= "N/A for cooperative";
- }
- // =====
- // PGM
- // ROGUE GAMES
- else if (FS.Developer_searchpath(2) == 2) {
- if (s_rules_box.curvalue == 2) // tag
- {
- s_maxclients_field.statusbar= null;
- s_startserver_dmoptions_action.statusbar= null;
- }
- /*
- else if(s_rules_box.curvalue == 3) // deathball
- {
- s_maxclients_field.statusbar = null;
- s_startserver_dmoptions_action.statusbar = null;
- }
- */
- }
- // PGM
- // =====
- }
-
- static void StartServerActionFunc(Object self) {
- //char startmap[1024];
- String startmap;
- int timelimit;
- int fraglimit;
- int maxclients;
- String spot;
-
- //strcpy(startmap, strchr(mapnames[s_startmap_list.curvalue], '\n') + 1);
- String x= mapnames[s_startmap_list.curvalue];
-
- int pos= x.indexOf('\n');
- if (pos == -1)
- startmap= x;
- else
- startmap= x.substring(pos + 1, x.length());
-
- maxclients= atoi(s_maxclients_field.buffer.toString());
- timelimit= atoi(s_timelimit_field.buffer.toString());
- fraglimit= atoi(s_fraglimit_field.buffer.toString());
-
- Cvar.SetValue("maxclients", ClampCvar(0, maxclients, maxclients));
- Cvar.SetValue("timelimit", ClampCvar(0, timelimit, timelimit));
- Cvar.SetValue("fraglimit", ClampCvar(0, fraglimit, fraglimit));
- Cvar.Set("hostname", s_hostname_field.buffer.toString());
- // Cvar.SetValue ("deathmatch", !s_rules_box.curvalue );
- // Cvar.SetValue ("coop", s_rules_box.curvalue );
-
- // PGM
- if ((s_rules_box.curvalue < 2) || (FS.Developer_searchpath(2) != 2)) {
- Cvar.SetValue("deathmatch", 1 - (int) (s_rules_box.curvalue));
- Cvar.SetValue("coop", s_rules_box.curvalue);
- Cvar.SetValue("gamerules", 0);
- }
- else {
- Cvar.SetValue("deathmatch", 1);
- // deathmatch is always true for rogue games, right?
- Cvar.SetValue("coop", 0);
- // FIXME - this might need to depend on which game we're running
- Cvar.SetValue("gamerules", s_rules_box.curvalue);
- }
- // PGM
-
- spot= null;
- if (s_rules_box.curvalue == 1) // PGM
- {
- if (Q_stricmp(startmap, "bunk1") == 0)
- spot= "start";
- else if (Q_stricmp(startmap, "mintro") == 0)
- spot= "start";
- else if (Q_stricmp(startmap, "fact1") == 0)
- spot= "start";
- else if (Q_stricmp(startmap, "power1") == 0)
- spot= "pstart";
- else if (Q_stricmp(startmap, "biggun") == 0)
- spot= "bstart";
- else if (Q_stricmp(startmap, "hangar1") == 0)
- spot= "unitstart";
- else if (Q_stricmp(startmap, "city1") == 0)
- spot= "unitstart";
- else if (Q_stricmp(startmap, "boss1") == 0)
- spot= "bosstart";
- }
-
- if (spot != null) {
- if (Globals.server_state != 0)
- Cbuf.AddText("disconnect\n");
- Cbuf.AddText("gamemap \"*" + startmap + "$" + spot + "\"\n");
- }
- else {
- Cbuf.AddText("map " + startmap + "\n");
- }
-
- ForceMenuOff();
- }
-
- static String dm_coop_names[]= { "deathmatch", "cooperative", null };
- static String dm_coop_names_rogue[]= { "deathmatch", "cooperative", "tag",
- // "deathball",
- null };
-
- static void StartServer_MenuInit() {
-
- // =======
- // PGM
- // =======
-
- byte[] buffer= null;
- String mapsname;
- String s;
- int i;
- RandomAccessFile fp;
-
- /*
- ** load the list of map names
- */
- mapsname= FS.Gamedir() + "/maps.lst";
-
- if ((fp= fopen(mapsname, "r")) == null) {
- buffer= FS.LoadFile("maps.lst");
- if (buffer == null)
- //if ((length = FS_LoadFile("maps.lst", (Object *) & buffer)) == -1)
- Com.Error(ERR_DROP, "couldn't find maps.lst\n");
- }
- else {
- try {
- int len= (int) fp.length();
- buffer= new byte[len];
- fp.readFully(buffer);
- }
- catch (Exception e) {
- Com.Error(ERR_DROP, "couldn't load maps.lst\n");
- }
- }
-
- s= new String(buffer);
- String lines[]= Lib.linesplit(s);
-
- nummaps= lines.length;
-
- if (nummaps == 0)
- Com.Error(ERR_DROP, "no maps in maps.lst\n");
-
- mapnames= new String[nummaps + 1];
-
- for (i= 0; i < nummaps; i++) {
- String shortname, longname, scratch;
-
- Com.ParseHelp ph= new Com.ParseHelp(lines[i]);
-
- shortname= Com.Parse(ph).toUpperCase();
- longname= Com.Parse(ph);
- scratch= longname + "\n" + shortname;
- mapnames[i]= scratch;
- }
- mapnames[nummaps]= null;
-
- if (fp != null) {
- fclose(fp);
- fp= null;
-
- }
- else {
- FS.FreeFile(buffer);
- }
-
- /*
- ** initialize the menu stuff
- */
- s_startserver_menu.x= (int) (viddef.width * 0.50);
- s_startserver_menu.nitems= 0;
-
- s_startmap_list.type= MTYPE_SPINCONTROL;
- s_startmap_list.x= 0;
- s_startmap_list.y= 0;
- s_startmap_list.name= "initial map";
- s_startmap_list.itemnames= mapnames;
-
- s_rules_box.type= MTYPE_SPINCONTROL;
- s_rules_box.x= 0;
- s_rules_box.y= 20;
- s_rules_box.name= "rules";
-
- // PGM - rogue games only available with rogue DLL.
- if (FS.Developer_searchpath(2) == 2)
- s_rules_box.itemnames= dm_coop_names_rogue;
- else
- s_rules_box.itemnames= dm_coop_names;
- // PGM
-
- if (Cvar.VariableValue("coop") != 0)
- s_rules_box.curvalue= 1;
- else
- s_rules_box.curvalue= 0;
- s_rules_box.callback= new mcallback() {
- public void execute(Object o) {
- RulesChangeFunc(o);
- }
- };
-
- s_timelimit_field.type= MTYPE_FIELD;
- s_timelimit_field.name= "time limit";
- s_timelimit_field.flags= QMF_NUMBERSONLY;
- s_timelimit_field.x= 0;
- s_timelimit_field.y= 36;
- s_timelimit_field.statusbar= "0 = no limit";
- s_timelimit_field.length= 3;
- s_timelimit_field.visible_length= 3;
- s_timelimit_field.buffer= new StringBuffer(Cvar.VariableString("timelimit"));
-
- s_fraglimit_field.type= MTYPE_FIELD;
- s_fraglimit_field.name= "frag limit";
- s_fraglimit_field.flags= QMF_NUMBERSONLY;
- s_fraglimit_field.x= 0;
- s_fraglimit_field.y= 54;
- s_fraglimit_field.statusbar= "0 = no limit";
- s_fraglimit_field.length= 3;
- s_fraglimit_field.visible_length= 3;
- s_fraglimit_field.buffer= new StringBuffer(Cvar.VariableString("fraglimit"));
-
- /*
- ** maxclients determines the maximum number of players that can join
- ** the game. If maxclients is only "1" then we should default the menu
- ** option to 8 players, otherwise use whatever its current value is.
- ** Clamping will be done when the server is actually started.
- */
- s_maxclients_field.type= MTYPE_FIELD;
- s_maxclients_field.name= "max players";
- s_maxclients_field.flags= QMF_NUMBERSONLY;
- s_maxclients_field.x= 0;
- s_maxclients_field.y= 72;
- s_maxclients_field.statusbar= null;
- s_maxclients_field.length= 3;
- s_maxclients_field.visible_length= 3;
- if (Cvar.VariableValue("maxclients") == 1)
- s_maxclients_field.buffer= new StringBuffer("8");
- else
- s_maxclients_field.buffer= new StringBuffer(Cvar.VariableString("maxclients"));
-
- s_hostname_field.type= MTYPE_FIELD;
- s_hostname_field.name= "hostname";
- s_hostname_field.flags= 0;
- s_hostname_field.x= 0;
- s_hostname_field.y= 90;
- s_hostname_field.statusbar= null;
- s_hostname_field.length= 12;
- s_hostname_field.visible_length= 12;
- s_hostname_field.buffer= new StringBuffer(Cvar.VariableString("hostname"));
- s_hostname_field.cursor= s_hostname_field.buffer.length();
-
- s_startserver_dmoptions_action.type= MTYPE_ACTION;
- s_startserver_dmoptions_action.name= " deathmatch flags";
- s_startserver_dmoptions_action.flags= QMF_LEFT_JUSTIFY;
- s_startserver_dmoptions_action.x= 24;
- s_startserver_dmoptions_action.y= 108;
- s_startserver_dmoptions_action.statusbar= null;
- s_startserver_dmoptions_action.callback= new mcallback() {
- public void execute(Object o) {
- DMOptionsFunc(o);
- }
- };
-
- s_startserver_start_action.type= MTYPE_ACTION;
- s_startserver_start_action.name= " begin";
- s_startserver_start_action.flags= QMF_LEFT_JUSTIFY;
- s_startserver_start_action.x= 24;
- s_startserver_start_action.y= 128;
- s_startserver_start_action.callback= new mcallback() {
- public void execute(Object o) {
- StartServerActionFunc(o);
- }
- };
-
- Menu_AddItem(s_startserver_menu, s_startmap_list);
- Menu_AddItem(s_startserver_menu, s_rules_box);
- Menu_AddItem(s_startserver_menu, s_timelimit_field);
- Menu_AddItem(s_startserver_menu, s_fraglimit_field);
- Menu_AddItem(s_startserver_menu, s_maxclients_field);
- Menu_AddItem(s_startserver_menu, s_hostname_field);
- Menu_AddItem(s_startserver_menu, s_startserver_dmoptions_action);
- Menu_AddItem(s_startserver_menu, s_startserver_start_action);
-
- Menu_Center(s_startserver_menu);
-
- // call this now to set proper inital state
- RulesChangeFunc(null);
- }
-
- static void StartServer_MenuDraw() {
- Menu_Draw(s_startserver_menu);
- }
-
- static String StartServer_MenuKey(int key) {
- if (key == K_ESCAPE) {
- if (mapnames != null) {
- int i;
-
- for (i= 0; i < nummaps; i++)
- mapnames[i]= null;
-
- }
- mapnames= null;
- nummaps= 0;
- }
-
- return Default_MenuKey(s_startserver_menu, key);
- }
-
- static xcommand_t Menu_StartServer= new xcommand_t() {
- public void execute() {
- Menu_StartServer_f();
- }
- };
- static void Menu_StartServer_f() {
- StartServer_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- StartServer_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return StartServer_MenuKey(key);
- }
- });
- }
-
- /*
- =============================================================================
-
- DMOPTIONS BOOK MENU
-
- =============================================================================
- */
- static String dmoptions_statusbar; //[128];
-
- static menuframework_s s_dmoptions_menu= new menuframework_s();
-
- static menulist_s s_friendlyfire_box= new menulist_s();
- static menulist_s s_falls_box= new menulist_s();
- static menulist_s s_weapons_stay_box= new menulist_s();
- static menulist_s s_instant_powerups_box= new menulist_s();
- static menulist_s s_powerups_box= new menulist_s();
- static menulist_s s_health_box= new menulist_s();
- static menulist_s s_spawn_farthest_box= new menulist_s();
- static menulist_s s_teamplay_box= new menulist_s();
- static menulist_s s_samelevel_box= new menulist_s();
- static menulist_s s_force_respawn_box= new menulist_s();
- static menulist_s s_armor_box= new menulist_s();
- static menulist_s s_allow_exit_box= new menulist_s();
- static menulist_s s_infinite_ammo_box= new menulist_s();
- static menulist_s s_fixed_fov_box= new menulist_s();
- static menulist_s s_quad_drop_box= new menulist_s();
-
- // ROGUE
- static menulist_s s_no_mines_box= new menulist_s();
- static menulist_s s_no_nukes_box= new menulist_s();
- static menulist_s s_stack_double_box= new menulist_s();
- static menulist_s s_no_spheres_box= new menulist_s();
- // ROGUE
-
- static void setvalue(int flags) {
- Cvar.SetValue("dmflags", flags);
- dmoptions_statusbar= "dmflags = " + flags;
- }
-
- static void DMFlagCallback(Object self) {
- menulist_s f= (menulist_s) self;
- int flags;
- int bit= 0;
-
- flags= (int) Cvar.VariableValue("dmflags");
-
- if (f == s_friendlyfire_box) {
- if (f.curvalue != 0)
- flags &= ~DF_NO_FRIENDLY_FIRE;
- else
- flags |= DF_NO_FRIENDLY_FIRE;
- setvalue(flags);
- return;
- }
- else if (f == s_falls_box) {
- if (f.curvalue != 0)
- flags &= ~DF_NO_FALLING;
- else
- flags |= DF_NO_FALLING;
- setvalue(flags);
- return;
- }
- else if (f == s_weapons_stay_box) {
- bit= DF_WEAPONS_STAY;
- }
- else if (f == s_instant_powerups_box) {
- bit= DF_INSTANT_ITEMS;
- }
- else if (f == s_allow_exit_box) {
- bit= DF_ALLOW_EXIT;
- }
- else if (f == s_powerups_box) {
- if (f.curvalue != 0)
- flags &= ~DF_NO_ITEMS;
- else
- flags |= DF_NO_ITEMS;
- setvalue(flags);
- return;
- }
- else if (f == s_health_box) {
- if (f.curvalue != 0)
- flags &= ~DF_NO_HEALTH;
- else
- flags |= DF_NO_HEALTH;
- setvalue(flags);
- return;
- }
- else if (f == s_spawn_farthest_box) {
- bit= DF_SPAWN_FARTHEST;
- }
- else if (f == s_teamplay_box) {
- if (f.curvalue == 1) {
- flags |= DF_SKINTEAMS;
- flags &= ~DF_MODELTEAMS;
- }
- else if (f.curvalue == 2) {
- flags |= DF_MODELTEAMS;
- flags &= ~DF_SKINTEAMS;
- }
- else {
- flags &= ~(DF_MODELTEAMS | DF_SKINTEAMS);
- }
-
- setvalue(flags);
- return;
- }
- else if (f == s_samelevel_box) {
- bit= DF_SAME_LEVEL;
- }
- else if (f == s_force_respawn_box) {
- bit= DF_FORCE_RESPAWN;
- }
- else if (f == s_armor_box) {
- if (f.curvalue != 0)
- flags &= ~DF_NO_ARMOR;
- else
- flags |= DF_NO_ARMOR;
- setvalue(flags);
- return;
- }
- else if (f == s_infinite_ammo_box) {
- bit= DF_INFINITE_AMMO;
- }
- else if (f == s_fixed_fov_box) {
- bit= DF_FIXED_FOV;
- }
- else if (f == s_quad_drop_box) {
- bit= DF_QUAD_DROP;
- }
-
- // =======
- // ROGUE
- else if (FS.Developer_searchpath(2) == 2) {
- if (f == s_no_mines_box) {
- bit= DF_NO_MINES;
- }
- else if (f == s_no_nukes_box) {
- bit= DF_NO_NUKES;
- }
- else if (f == s_stack_double_box) {
- bit= DF_NO_STACK_DOUBLE;
- }
- else if (f == s_no_spheres_box) {
- bit= DF_NO_SPHERES;
- }
- }
- // ROGUE
- // =======
-
- if (f != null) {
- if (f.curvalue == 0)
- flags &= ~bit;
- else
- flags |= bit;
- }
-
- Cvar.SetValue("dmflags", flags);
-
- dmoptions_statusbar= "dmflags = " + flags;
-
- }
-
- //static String yes_no_names[] = { "no", "yes", 0 };
- static String teamplay_names[]= { "disabled", "by skin", "by model", null };
-
- static void DMOptions_MenuInit() {
-
- int dmflags= (int) Cvar.VariableValue("dmflags");
- int y= 0;
-
- s_dmoptions_menu.x= (int) (viddef.width * 0.50);
- s_dmoptions_menu.nitems= 0;
-
- s_falls_box.type= MTYPE_SPINCONTROL;
- s_falls_box.x= 0;
- s_falls_box.y= y;
- s_falls_box.name= "falling damage";
- s_falls_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_falls_box.itemnames= yes_no_names;
- s_falls_box.curvalue= (dmflags & DF_NO_FALLING) == 0 ? 1 : 0;
-
- s_weapons_stay_box.type= MTYPE_SPINCONTROL;
- s_weapons_stay_box.x= 0;
- s_weapons_stay_box.y= y += 10;
- s_weapons_stay_box.name= "weapons stay";
- s_weapons_stay_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_weapons_stay_box.itemnames= yes_no_names;
- s_weapons_stay_box.curvalue= (dmflags & DF_WEAPONS_STAY) != 0 ? 1 : 0;
-
- s_instant_powerups_box.type= MTYPE_SPINCONTROL;
- s_instant_powerups_box.x= 0;
- s_instant_powerups_box.y= y += 10;
- s_instant_powerups_box.name= "instant powerups";
- s_instant_powerups_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_instant_powerups_box.itemnames= yes_no_names;
- s_instant_powerups_box.curvalue= (dmflags & DF_INSTANT_ITEMS) != 0 ? 1 : 0;
-
- s_powerups_box.type= MTYPE_SPINCONTROL;
- s_powerups_box.x= 0;
- s_powerups_box.y= y += 10;
- s_powerups_box.name= "allow powerups";
- s_powerups_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_powerups_box.itemnames= yes_no_names;
- s_powerups_box.curvalue= (dmflags & DF_NO_ITEMS) == 0 ? 1 : 0;
-
- s_health_box.type= MTYPE_SPINCONTROL;
- s_health_box.x= 0;
- s_health_box.y= y += 10;
- s_health_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_health_box.name= "allow health";
- s_health_box.itemnames= yes_no_names;
- s_health_box.curvalue= (dmflags & DF_NO_HEALTH) == 0 ? 1 : 0;
-
- s_armor_box.type= MTYPE_SPINCONTROL;
- s_armor_box.x= 0;
- s_armor_box.y= y += 10;
- s_armor_box.name= "allow armor";
- s_armor_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_armor_box.itemnames= yes_no_names;
- s_armor_box.curvalue= (dmflags & DF_NO_ARMOR) == 0 ? 1 : 0;
-
- s_spawn_farthest_box.type= MTYPE_SPINCONTROL;
- s_spawn_farthest_box.x= 0;
- s_spawn_farthest_box.y= y += 10;
- s_spawn_farthest_box.name= "spawn farthest";
- s_spawn_farthest_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_spawn_farthest_box.itemnames= yes_no_names;
- s_spawn_farthest_box.curvalue= (dmflags & DF_SPAWN_FARTHEST) != 0 ? 1 : 0;
-
- s_samelevel_box.type= MTYPE_SPINCONTROL;
- s_samelevel_box.x= 0;
- s_samelevel_box.y= y += 10;
- s_samelevel_box.name= "same map";
- s_samelevel_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_samelevel_box.itemnames= yes_no_names;
- s_samelevel_box.curvalue= (dmflags & DF_SAME_LEVEL) != 0 ? 1 : 0;
-
- s_force_respawn_box.type= MTYPE_SPINCONTROL;
- s_force_respawn_box.x= 0;
- s_force_respawn_box.y= y += 10;
- s_force_respawn_box.name= "force respawn";
- s_force_respawn_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_force_respawn_box.itemnames= yes_no_names;
- s_force_respawn_box.curvalue= (dmflags & DF_FORCE_RESPAWN) != 0 ? 1 : 0;
-
- s_teamplay_box.type= MTYPE_SPINCONTROL;
- s_teamplay_box.x= 0;
- s_teamplay_box.y= y += 10;
- s_teamplay_box.name= "teamplay";
- s_teamplay_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_teamplay_box.itemnames= teamplay_names;
-
- s_allow_exit_box.type= MTYPE_SPINCONTROL;
- s_allow_exit_box.x= 0;
- s_allow_exit_box.y= y += 10;
- s_allow_exit_box.name= "allow exit";
- s_allow_exit_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_allow_exit_box.itemnames= yes_no_names;
- s_allow_exit_box.curvalue= (dmflags & DF_ALLOW_EXIT) != 0 ? 1 : 0;
-
- s_infinite_ammo_box.type= MTYPE_SPINCONTROL;
- s_infinite_ammo_box.x= 0;
- s_infinite_ammo_box.y= y += 10;
- s_infinite_ammo_box.name= "infinite ammo";
- s_infinite_ammo_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_infinite_ammo_box.itemnames= yes_no_names;
- s_infinite_ammo_box.curvalue= (dmflags & DF_INFINITE_AMMO) != 0 ? 1 : 0;
-
- s_fixed_fov_box.type= MTYPE_SPINCONTROL;
- s_fixed_fov_box.x= 0;
- s_fixed_fov_box.y= y += 10;
- s_fixed_fov_box.name= "fixed FOV";
- s_fixed_fov_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_fixed_fov_box.itemnames= yes_no_names;
- s_fixed_fov_box.curvalue= (dmflags & DF_FIXED_FOV) != 0 ? 1 : 0;
-
- s_quad_drop_box.type= MTYPE_SPINCONTROL;
- s_quad_drop_box.x= 0;
- s_quad_drop_box.y= y += 10;
- s_quad_drop_box.name= "quad drop";
- s_quad_drop_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_quad_drop_box.itemnames= yes_no_names;
- s_quad_drop_box.curvalue= (dmflags & DF_QUAD_DROP) != 0 ? 1 : 0;
-
- s_friendlyfire_box.type= MTYPE_SPINCONTROL;
- s_friendlyfire_box.x= 0;
- s_friendlyfire_box.y= y += 10;
- s_friendlyfire_box.name= "friendly fire";
- s_friendlyfire_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_friendlyfire_box.itemnames= yes_no_names;
- s_friendlyfire_box.curvalue= (dmflags & DF_NO_FRIENDLY_FIRE) == 0 ? 1 : 0;
-
- // ============
- // ROGUE
- if (FS.Developer_searchpath(2) == 2) {
- s_no_mines_box.type= MTYPE_SPINCONTROL;
- s_no_mines_box.x= 0;
- s_no_mines_box.y= y += 10;
- s_no_mines_box.name= "remove mines";
- s_no_mines_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_no_mines_box.itemnames= yes_no_names;
- s_no_mines_box.curvalue= (dmflags & DF_NO_MINES) != 0 ? 1 : 0;
-
- s_no_nukes_box.type= MTYPE_SPINCONTROL;
- s_no_nukes_box.x= 0;
- s_no_nukes_box.y= y += 10;
- s_no_nukes_box.name= "remove nukes";
- s_no_nukes_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_no_nukes_box.itemnames= yes_no_names;
- s_no_nukes_box.curvalue= (dmflags & DF_NO_NUKES) != 0 ? 1 : 0;
-
- s_stack_double_box.type= MTYPE_SPINCONTROL;
- s_stack_double_box.x= 0;
- s_stack_double_box.y= y += 10;
- s_stack_double_box.name= "2x/4x stacking off";
- s_stack_double_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_stack_double_box.itemnames= yes_no_names;
- s_stack_double_box.curvalue= (dmflags & DF_NO_STACK_DOUBLE);
-
- s_no_spheres_box.type= MTYPE_SPINCONTROL;
- s_no_spheres_box.x= 0;
- s_no_spheres_box.y= y += 10;
- s_no_spheres_box.name= "remove spheres";
- s_no_spheres_box.callback= new mcallback() {
- public void execute(Object o) {
- DMFlagCallback(o);
- }
- };
- s_no_spheres_box.itemnames= yes_no_names;
- s_no_spheres_box.curvalue= (dmflags & DF_NO_SPHERES) != 0 ? 1 : 0;
-
- }
- // ROGUE
- // ============
-
- Menu_AddItem(s_dmoptions_menu, s_falls_box);
- Menu_AddItem(s_dmoptions_menu, s_weapons_stay_box);
- Menu_AddItem(s_dmoptions_menu, s_instant_powerups_box);
- Menu_AddItem(s_dmoptions_menu, s_powerups_box);
- Menu_AddItem(s_dmoptions_menu, s_health_box);
- Menu_AddItem(s_dmoptions_menu, s_armor_box);
- Menu_AddItem(s_dmoptions_menu, s_spawn_farthest_box);
- Menu_AddItem(s_dmoptions_menu, s_samelevel_box);
- Menu_AddItem(s_dmoptions_menu, s_force_respawn_box);
- Menu_AddItem(s_dmoptions_menu, s_teamplay_box);
- Menu_AddItem(s_dmoptions_menu, s_allow_exit_box);
- Menu_AddItem(s_dmoptions_menu, s_infinite_ammo_box);
- Menu_AddItem(s_dmoptions_menu, s_fixed_fov_box);
- Menu_AddItem(s_dmoptions_menu, s_quad_drop_box);
- Menu_AddItem(s_dmoptions_menu, s_friendlyfire_box);
-
- // =======
- // ROGUE
- if (FS.Developer_searchpath(2) == 2) {
- Menu_AddItem(s_dmoptions_menu, s_no_mines_box);
- Menu_AddItem(s_dmoptions_menu, s_no_nukes_box);
- Menu_AddItem(s_dmoptions_menu, s_stack_double_box);
- Menu_AddItem(s_dmoptions_menu, s_no_spheres_box);
- }
- // ROGUE
- // =======
-
- Menu_Center(s_dmoptions_menu);
-
- // set the original dmflags statusbar
- DMFlagCallback(null);
- Menu_SetStatusBar(s_dmoptions_menu, dmoptions_statusbar);
- }
-
- static void DMOptions_MenuDraw() {
- Menu_Draw(s_dmoptions_menu);
- }
-
- static String DMOptions_MenuKey(int key) {
- return Default_MenuKey(s_dmoptions_menu, key);
- }
-
- static xcommand_t Menu_DMOptions= new xcommand_t() {
- public void execute() {
- Menu_DMOptions_f();
- }
- };
- static void Menu_DMOptions_f() {
- DMOptions_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- DMOptions_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return DMOptions_MenuKey(key);
- }
- });
- }
-
- /*
- =============================================================================
-
- DOWNLOADOPTIONS BOOK MENU
-
- =============================================================================
- */
- static menuframework_s s_downloadoptions_menu= new menuframework_s();
-
- static menuseparator_s s_download_title= new menuseparator_s();
- static menulist_s s_allow_download_box= new menulist_s();
- static menulist_s s_allow_download_maps_box= new menulist_s();
- static menulist_s s_allow_download_models_box= new menulist_s();
- static menulist_s s_allow_download_players_box= new menulist_s();
- static menulist_s s_allow_download_sounds_box= new menulist_s();
-
- static void DownloadCallback(Object self) {
- menulist_s f= (menulist_s) self;
-
- if (f == s_allow_download_box) {
- Cvar.SetValue("allow_download", f.curvalue);
- }
-
- else if (f == s_allow_download_maps_box) {
- Cvar.SetValue("allow_download_maps", f.curvalue);
- }
-
- else if (f == s_allow_download_models_box) {
- Cvar.SetValue("allow_download_models", f.curvalue);
- }
-
- else if (f == s_allow_download_players_box) {
- Cvar.SetValue("allow_download_players", f.curvalue);
- }
-
- else if (f == s_allow_download_sounds_box) {
- Cvar.SetValue("allow_download_sounds", f.curvalue);
- }
- }
-
- static String yes_no_names[]= { "no", "yes", null };
- static void DownloadOptions_MenuInit() {
-
- int y= 0;
-
- s_downloadoptions_menu.x= (int) (viddef.width * 0.50);
- s_downloadoptions_menu.nitems= 0;
-
- s_download_title.type= MTYPE_SEPARATOR;
- s_download_title.name= "Download Options";
- s_download_title.x= 48;
- s_download_title.y= y;
-
- s_allow_download_box.type= MTYPE_SPINCONTROL;
- s_allow_download_box.x= 0;
- s_allow_download_box.y= y += 20;
- s_allow_download_box.name= "allow downloading";
- s_allow_download_box.callback= new mcallback() {
- public void execute(Object o) {
- DownloadCallback(o);
- }
- };
- s_allow_download_box.itemnames= yes_no_names;
- s_allow_download_box.curvalue= (Cvar.VariableValue("allow_download") != 0) ? 1 : 0;
-
- s_allow_download_maps_box.type= MTYPE_SPINCONTROL;
- s_allow_download_maps_box.x= 0;
- s_allow_download_maps_box.y= y += 20;
- s_allow_download_maps_box.name= "maps";
- s_allow_download_maps_box.callback= new mcallback() {
- public void execute(Object o) {
- DownloadCallback(o);
- }
- };
- s_allow_download_maps_box.itemnames= yes_no_names;
- s_allow_download_maps_box.curvalue= (Cvar.VariableValue("allow_download_maps") != 0) ? 1 : 0;
-
- s_allow_download_players_box.type= MTYPE_SPINCONTROL;
- s_allow_download_players_box.x= 0;
- s_allow_download_players_box.y= y += 10;
- s_allow_download_players_box.name= "player models/skins";
- s_allow_download_players_box.callback= new mcallback() {
- public void execute(Object o) {
- DownloadCallback(o);
- }
- };
- s_allow_download_players_box.itemnames= yes_no_names;
- s_allow_download_players_box.curvalue= (Cvar.VariableValue("allow_download_players") != 0) ? 1 : 0;
-
- s_allow_download_models_box.type= MTYPE_SPINCONTROL;
- s_allow_download_models_box.x= 0;
- s_allow_download_models_box.y= y += 10;
- s_allow_download_models_box.name= "models";
- s_allow_download_models_box.callback= new mcallback() {
- public void execute(Object o) {
- DownloadCallback(o);
- }
- };
- s_allow_download_models_box.itemnames= yes_no_names;
- s_allow_download_models_box.curvalue= (Cvar.VariableValue("allow_download_models") != 0) ? 1 : 0;
-
- s_allow_download_sounds_box.type= MTYPE_SPINCONTROL;
- s_allow_download_sounds_box.x= 0;
- s_allow_download_sounds_box.y= y += 10;
- s_allow_download_sounds_box.name= "sounds";
- s_allow_download_sounds_box.callback= new mcallback() {
- public void execute(Object o) {
- DownloadCallback(o);
- }
- };
- s_allow_download_sounds_box.itemnames= yes_no_names;
- s_allow_download_sounds_box.curvalue= (Cvar.VariableValue("allow_download_sounds") != 0) ? 1 : 0;
-
- Menu_AddItem(s_downloadoptions_menu, s_download_title);
- Menu_AddItem(s_downloadoptions_menu, s_allow_download_box);
- Menu_AddItem(s_downloadoptions_menu, s_allow_download_maps_box);
- Menu_AddItem(s_downloadoptions_menu, s_allow_download_players_box);
- Menu_AddItem(s_downloadoptions_menu, s_allow_download_models_box);
- Menu_AddItem(s_downloadoptions_menu, s_allow_download_sounds_box);
-
- Menu_Center(s_downloadoptions_menu);
-
- // skip over title
- if (s_downloadoptions_menu.cursor == 0)
- s_downloadoptions_menu.cursor= 1;
- }
-
- static void DownloadOptions_MenuDraw() {
- Menu_Draw(s_downloadoptions_menu);
- }
-
- static String DownloadOptions_MenuKey(int key) {
- return Default_MenuKey(s_downloadoptions_menu, key);
- }
-
- static xcommand_t Menu_DownloadOptions= new xcommand_t() {
- public void execute() {
- Menu_DownloadOptions_f();
- }
- };
- static void Menu_DownloadOptions_f() {
- DownloadOptions_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- DownloadOptions_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return DownloadOptions_MenuKey(key);
- }
- });
- }
- /*
- =============================================================================
-
- ADDRESS BOOK MENU
-
- =============================================================================
- */
-
- static menuframework_s s_addressbook_menu= new menuframework_s();
- static menufield_s s_addressbook_fields[]= new menufield_s[NUM_ADDRESSBOOK_ENTRIES];
- static {
- for (int n= 0; n < NUM_ADDRESSBOOK_ENTRIES; n++)
- s_addressbook_fields[n]= new menufield_s();
- }
-
- static void AddressBook_MenuInit() {
- int i;
-
- s_addressbook_menu.x= viddef.width / 2 - 142;
- s_addressbook_menu.y= viddef.height / 2 - 58;
- s_addressbook_menu.nitems= 0;
-
- for (i= 0; i < NUM_ADDRESSBOOK_ENTRIES; i++) {
- cvar_t adr;
- //char buffer[20];
- String buffer;
-
- //Com_sprintf(buffer, sizeof(buffer), "adr%d", i);
- buffer= "adr" + i;
-
- adr= Cvar.Get(buffer, "", CVAR_ARCHIVE);
-
- s_addressbook_fields[i].type= MTYPE_FIELD;
- s_addressbook_fields[i].name= null;
- s_addressbook_fields[i].callback= null;
- s_addressbook_fields[i].x= 0;
- s_addressbook_fields[i].y= i * 18 + 0;
- s_addressbook_fields[i].localdata[0]= i;
- s_addressbook_fields[i].cursor= 0;
- s_addressbook_fields[i].length= 60;
- s_addressbook_fields[i].visible_length= 30;
-
- s_addressbook_fields[i].buffer= new StringBuffer(adr.string);
-
- Menu_AddItem(s_addressbook_menu, s_addressbook_fields[i]);
- }
- }
-
- static keyfunc_t AddressBook_MenuKey= new keyfunc_t() {
- public String execute(int key) {
- return AddressBook_MenuKey_f(key);
- }
- };
-
- static String AddressBook_MenuKey_f(int key) {
- if (key == K_ESCAPE) {
- int index;
- //char buffer[20];
- String buffer;
-
- for (index= 0; index < NUM_ADDRESSBOOK_ENTRIES; index++) {
- buffer= "adr" + index;
- //Com_sprintf(buffer, sizeof(buffer), "adr%d", index);
- Cvar.Set(buffer, s_addressbook_fields[index].buffer.toString());
- }
- }
- return Default_MenuKey(s_addressbook_menu, key);
- }
-
- static xcommand_t AddressBook_MenuDraw= new xcommand_t() {
- public void execute() {
- AddressBook_MenuDraw_f();
- }
- };
- static void AddressBook_MenuDraw_f() {
- Banner("m_banner_addressbook");
- Menu_Draw(s_addressbook_menu);
- }
-
- static xcommand_t Menu_AddressBook= new xcommand_t() {
- public void execute() {
- Menu_AddressBook_f();
- }
- };
- static void Menu_AddressBook_f() {
- AddressBook_MenuInit();
- PushMenu(new xcommand_t() {
- public void execute() {
- AddressBook_MenuDraw_f();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return AddressBook_MenuKey_f(key);
- }
- });
- }
- /*
- =============================================================================
-
- PLAYER CONFIG MENU
-
- =============================================================================
- */
- static menuframework_s s_player_config_menu= new menuframework_s();
- static menufield_s s_player_name_field= new menufield_s();
- static menulist_s s_player_model_box= new menulist_s();
- static menulist_s s_player_skin_box= new menulist_s();
- static menulist_s s_player_handedness_box= new menulist_s();
- static menulist_s s_player_rate_box= new menulist_s();
- static menuseparator_s s_player_skin_title= new menuseparator_s();
- static menuseparator_s s_player_model_title= new menuseparator_s();
- static menuseparator_s s_player_hand_title= new menuseparator_s();
- static menuseparator_s s_player_rate_title= new menuseparator_s();
- static menuaction_s s_player_download_action= new menuaction_s();
-
- static class playermodelinfo_s {
- int nskins;
- String skindisplaynames[];
- //char displayname[MAX_DISPLAYNAME];
- String displayname;
- //char directory[MAX_QPATH];
- String directory;
- };
-
- static playermodelinfo_s s_pmi[]= new playermodelinfo_s[MAX_PLAYERMODELS];
- static String s_pmnames[]= new String[MAX_PLAYERMODELS];
- static int s_numplayermodels;
-
- static int rate_tbl[]= { 2500, 3200, 5000, 10000, 25000, 0 };
- static String rate_names[]= { "28.8 Modem", "33.6 Modem", "Single ISDN", "Dual ISDN/Cable", "T1/LAN", "User defined", null };
-
- static void DownloadOptionsFunc(Object self) {
- Menu_DownloadOptions_f();
- }
-
- static void HandednessCallback(Object unused) {
- Cvar.SetValue("hand", s_player_handedness_box.curvalue);
- }
-
- static void RateCallback(Object unused) {
- if (s_player_rate_box.curvalue != rate_tbl.length - 1) //sizeof(rate_tbl) / sizeof(* rate_tbl) - 1)
- Cvar.SetValue("rate", rate_tbl[s_player_rate_box.curvalue]);
- }
-
- static void ModelCallback(Object unused) {
- s_player_skin_box.itemnames= s_pmi[s_player_model_box.curvalue].skindisplaynames;
- s_player_skin_box.curvalue= 0;
- }
-
- static boolean IconOfSkinExists(String skin, String pcxfiles[], int npcxfiles) {
- int i;
- //char scratch[1024];
- String scratch;
-
- //strcpy(scratch, skin);
- scratch= skin;
- int pos= scratch.lastIndexOf('.');
- if (pos != -1)
- scratch= scratch.substring(0, pos) + "_i.pcx";
-
- else
- scratch += "_i.pcx";
-
- for (i= 0; i < npcxfiles; i++) {
- if (strcmp(pcxfiles[i], scratch) == 0)
- return true;
- }
-
- return false;
- }
-
- static boolean PlayerConfig_ScanDirectories() {
- //char findname[1024];
- String findname;
- //char scratch[1024];
- String scratch;
-
- int ndirs= 0, npms= 0;
- int a, b, c;
- String dirnames[];
-
- String path= null;
-
- int i;
-
- //extern String * FS_ListFiles(String , int *, unsigned, unsigned);
-
- s_numplayermodels= 0;
-
- /*
- ** get a list of directories
- */
- do {
- path= FS.NextPath(path);
- findname= path + "/players/*.*";
-
- if ((dirnames= FS.ListFiles(findname, 0, SFF_SUBDIR)) != null) {
- ndirs= dirnames.length;
- break;
- }
- }
- while (path != null);
-
- if (dirnames == null)
- return false;
-
- /*
- ** go through the subdirectories
- */
- npms= ndirs;
- if (npms > MAX_PLAYERMODELS)
- npms= MAX_PLAYERMODELS;
-
- for (i= 0; i < npms; i++) {
- int k, s;
- //String a, b, c;
- String pcxnames[];
- String skinnames[];
- int npcxfiles;
- int nskins= 0;
-
- if (dirnames[i] == null)
- continue;
-
- // verify the existence of tris.md2
- scratch= dirnames[i];
- scratch += "/tris.md2";
- if (Sys.FindFirst(scratch, 0, SFF_SUBDIR | SFF_HIDDEN | SFF_SYSTEM) == null) {
- //free(dirnames[i]);
- dirnames[i]= null;
- Sys.FindClose();
- continue;
- }
- Sys.FindClose();
-
- // verify the existence of at least one pcx skin
- scratch= dirnames[i] + "/*.pcx";
- pcxnames= FS.ListFiles(scratch, 0, 0);
- npcxfiles= pcxnames.length;
-
- if (pcxnames == null) {
-
- dirnames[i]= null;
- continue;
- }
-
- // count valid skins, which consist of a skin with a matching "_i" icon
- for (k= 0; k < npcxfiles - 1; k++) {
- if (!pcxnames[k].endsWith("_i.pcx")) {
- //if (!strstr(pcxnames[k], "_i.pcx")) {
- if (IconOfSkinExists(pcxnames[k], pcxnames, npcxfiles - 1)) {
- nskins++;
- }
- }
- }
- if (nskins == 0)
- continue;
-
- skinnames= new String[nskins + 1]; //malloc(sizeof(String) * (nskins + 1));
- //memset(skinnames, 0, sizeof(String) * (nskins + 1));
-
- // copy the valid skins
- for (s= 0, k= 0; k < npcxfiles - 1; k++) {
-
- if (pcxnames[k].indexOf("_i.pcx") < 0) {
- if (IconOfSkinExists(pcxnames[k], pcxnames, npcxfiles - 1)) {
- a= pcxnames[k].lastIndexOf('/');
- b= pcxnames[k].lastIndexOf('\\');
-
- if (a > b)
- c= a;
- else
- c= b;
-
- scratch= pcxnames[k].substring(c + 1, pcxnames[k].length());
- int pos= scratch.lastIndexOf('.');
- if (pos != -1)
- scratch= scratch.substring(0, pos);
-
- skinnames[s]= scratch;
- s++;
- }
- }
- }
-
- // at this point we have a valid player model
- if (s_pmi[s_numplayermodels] == null)
- s_pmi[s_numplayermodels]= new playermodelinfo_s();
-
- s_pmi[s_numplayermodels].nskins= nskins;
- s_pmi[s_numplayermodels].skindisplaynames= skinnames;
-
- // make short name for the model
- a= dirnames[i].lastIndexOf('/');
- b= dirnames[i].lastIndexOf('\\');
-
- if (a > b)
- c= a;
- else
- c= b;
-
- s_pmi[s_numplayermodels].displayname= dirnames[i].substring(c + 1);
- s_pmi[s_numplayermodels].directory= dirnames[i].substring(c + 1);
-
- s_numplayermodels++;
- }
-
- return true;
-
- }
-
- static int pmicmpfnc(Object _a, Object _b) {
- playermodelinfo_s a= (playermodelinfo_s) _a;
- playermodelinfo_s b= (playermodelinfo_s) _b;
-
- /*
- ** sort by male, female, then alphabetical
- */
- if (strcmp(a.directory, "male") == 0)
- return -1;
- else if (strcmp(b.directory, "male") == 0)
- return 1;
-
- if (strcmp(a.directory, "female") == 0)
- return -1;
- else if (strcmp(b.directory, "female") == 0)
- return 1;
-
- return strcmp(a.directory, b.directory);
- }
-
- static String handedness[]= { "right", "left", "center", null };
-
- static boolean PlayerConfig_MenuInit() {
- /*
- extern cvar_t * name;
- extern cvar_t * team;
- extern cvar_t * skin;
- */
- //har currentdirectory[1024];
- String currentdirectory;
- //char currentskin[1024];
- String currentskin;
-
- int i= 0;
-
- int currentdirectoryindex= 0;
- int currentskinindex= 0;
-
- cvar_t hand= Cvar.Get("hand", "0", CVAR_USERINFO | CVAR_ARCHIVE);
-
- PlayerConfig_ScanDirectories();
-
- if (s_numplayermodels == 0)
- return false;
-
- if (hand.value < 0 || hand.value > 2)
- Cvar.SetValue("hand", 0);
-
- currentdirectory= skin.string;
-
- if (currentdirectory.lastIndexOf('/') != -1) {
- currentskin= rightFrom(currentdirectory, '/');
- currentdirectory= leftFrom(currentdirectory, '/');
- }
- else if (currentdirectory.lastIndexOf('\\') != -1) {
- currentskin= rightFrom(currentdirectory, '\\');
- currentdirectory= leftFrom(currentdirectory, '\\');
- }
- else {
- currentdirectory= "male";
- currentskin= "grunt";
- }
-
- //qsort(s_pmi, s_numplayermodels, sizeof(s_pmi[0]), pmicmpfnc);
- Arrays.sort(s_pmi, 0, s_numplayermodels, new Comparator() {
- public int compare(Object o1, Object o2) {
- return pmicmpfnc(o1, o2);
- }
- });
-
- //memset(s_pmnames, 0, sizeof(s_pmnames));
- s_pmnames= new String[MAX_PLAYERMODELS];
-
- for (i= 0; i < s_numplayermodels; i++) {
- s_pmnames[i]= s_pmi[i].displayname;
- if (Q_stricmp(s_pmi[i].directory, currentdirectory) == 0) {
- int j;
-
- currentdirectoryindex= i;
-
- for (j= 0; j < s_pmi[i].nskins; j++) {
- if (Q_stricmp(s_pmi[i].skindisplaynames[j], currentskin) == 0) {
- currentskinindex= j;
- break;
- }
- }
- }
- }
-
- s_player_config_menu.x= viddef.width / 2 - 95;
- s_player_config_menu.y= viddef.height / 2 - 97;
- s_player_config_menu.nitems= 0;
-
- s_player_name_field.type= MTYPE_FIELD;
- s_player_name_field.name= "name";
- s_player_name_field.callback= null;
- s_player_name_field.x= 0;
- s_player_name_field.y= 0;
- s_player_name_field.length= 20;
- s_player_name_field.visible_length= 20;
- s_player_name_field.buffer= new StringBuffer(name.string);
- s_player_name_field.cursor= name.string.length();
-
- s_player_model_title.type= MTYPE_SEPARATOR;
- s_player_model_title.name= "model";
- s_player_model_title.x= -8;
- s_player_model_title.y= 60;
-
- s_player_model_box.type= MTYPE_SPINCONTROL;
- s_player_model_box.x= -56;
- s_player_model_box.y= 70;
- s_player_model_box.callback= new mcallback() {
- public void execute(Object o) {
- ModelCallback(o);
- }
- };
- s_player_model_box.cursor_offset= -48;
- s_player_model_box.curvalue= currentdirectoryindex;
- s_player_model_box.itemnames= s_pmnames;
-
- s_player_skin_title.type= MTYPE_SEPARATOR;
- s_player_skin_title.name= "skin";
- s_player_skin_title.x= -16;
- s_player_skin_title.y= 84;
-
- s_player_skin_box.type= MTYPE_SPINCONTROL;
- s_player_skin_box.x= -56;
- s_player_skin_box.y= 94;
- s_player_skin_box.name= null;
- s_player_skin_box.callback= null;
- s_player_skin_box.cursor_offset= -48;
- s_player_skin_box.curvalue= currentskinindex;
- s_player_skin_box.itemnames= s_pmi[currentdirectoryindex].skindisplaynames;
-
- s_player_hand_title.type= MTYPE_SEPARATOR;
- s_player_hand_title.name= "handedness";
- s_player_hand_title.x= 32;
- s_player_hand_title.y= 108;
-
- s_player_handedness_box.type= MTYPE_SPINCONTROL;
- s_player_handedness_box.x= -56;
- s_player_handedness_box.y= 118;
- s_player_handedness_box.name= null;
- s_player_handedness_box.cursor_offset= -48;
- s_player_handedness_box.callback= new mcallback() {
- public void execute(Object o) {
- HandednessCallback(o);
- }
- };
- s_player_handedness_box.curvalue= (int) Cvar.VariableValue("hand");
- s_player_handedness_box.itemnames= handedness;
-
- for (i= 0; i < rate_tbl.length - 1; i++)
- if (Cvar.VariableValue("rate") == rate_tbl[i])
- break;
-
- s_player_rate_title.type= MTYPE_SEPARATOR;
- s_player_rate_title.name= "connect speed";
- s_player_rate_title.x= 56;
- s_player_rate_title.y= 156;
-
- s_player_rate_box.type= MTYPE_SPINCONTROL;
- s_player_rate_box.x= -56;
- s_player_rate_box.y= 166;
- s_player_rate_box.name= null;
- s_player_rate_box.cursor_offset= -48;
- s_player_rate_box.callback= new mcallback() {
- public void execute(Object o) {
- RateCallback(o);
- }
- };
- s_player_rate_box.curvalue= i;
- s_player_rate_box.itemnames= rate_names;
-
- s_player_download_action.type= MTYPE_ACTION;
- s_player_download_action.name= "download options";
- s_player_download_action.flags= QMF_LEFT_JUSTIFY;
- s_player_download_action.x= -24;
- s_player_download_action.y= 186;
- s_player_download_action.statusbar= null;
- s_player_download_action.callback= new mcallback() {
- public void execute(Object o) {
- DownloadOptionsFunc(o);
- }
- };
-
- Menu_AddItem(s_player_config_menu, s_player_name_field);
- Menu_AddItem(s_player_config_menu, s_player_model_title);
- Menu_AddItem(s_player_config_menu, s_player_model_box);
- if (s_player_skin_box.itemnames != null) {
- Menu_AddItem(s_player_config_menu, s_player_skin_title);
- Menu_AddItem(s_player_config_menu, s_player_skin_box);
- }
- Menu_AddItem(s_player_config_menu, s_player_hand_title);
- Menu_AddItem(s_player_config_menu, s_player_handedness_box);
- Menu_AddItem(s_player_config_menu, s_player_rate_title);
- Menu_AddItem(s_player_config_menu, s_player_rate_box);
- Menu_AddItem(s_player_config_menu, s_player_download_action);
-
- return true;
- }
-
- static int yaw;
-
- static void PlayerConfig_MenuDraw() {
-
- refdef_t refdef= new refdef_t();
- //char scratch[MAX_QPATH];
- String scratch;
-
- //memset(refdef, 0, sizeof(refdef));
-
- refdef.x= viddef.width / 2;
- refdef.y= viddef.height / 2 - 72;
- refdef.width= 144;
- refdef.height= 168;
- refdef.fov_x= 40;
- refdef.fov_y= Math3D.CalcFov(refdef.fov_x, refdef.width, refdef.height);
- refdef.time= cls.realtime * 0.001f;
-
- if (s_pmi[s_player_model_box.curvalue].skindisplaynames != null) {
-
- int maxframe= 29;
- entity_t entity= new entity_t();
-
- //memset(entity, 0, sizeof(entity));
-
- scratch= "players/" + s_pmi[s_player_model_box.curvalue].directory + "/tris.md2";
-
- entity.model= re.RegisterModel(scratch);
-
- scratch=
- "players/"
- + s_pmi[s_player_model_box.curvalue].directory
- + "/"
- + s_pmi[s_player_model_box.curvalue].skindisplaynames[s_player_skin_box.curvalue]
- + ".pcx";
-
- entity.skin= re.RegisterSkin(scratch);
- entity.flags= RF_FULLBRIGHT;
- entity.origin[0]= 80;
- entity.origin[1]= 0;
- entity.origin[2]= 0;
- VectorCopy(entity.origin, entity.oldorigin);
- entity.frame= 0;
- entity.oldframe= 0;
- entity.backlerp= 0.0f;
- entity.angles[1]= yaw++;
- if (++yaw > 360)
- yaw -= 360;
-
- refdef.areabits= null;
- refdef.num_entities= 1;
- refdef.entities= new entity_t[] { entity };
- refdef.lightstyles= null;
- refdef.rdflags= RDF_NOWORLDMODEL;
-
- Menu_Draw(s_player_config_menu);
-
- DrawTextBox(
- (int) ((refdef.x) * (320.0F / viddef.width) - 8),
- (int) ((viddef.height / 2) * (240.0F / viddef.height) - 77),
- refdef.width / 8,
- refdef.height / 8);
- refdef.height += 4;
-
- re.RenderFrame(refdef);
-
- scratch=
- "/players/"
- + s_pmi[s_player_model_box.curvalue].directory
- + "/"
- + s_pmi[s_player_model_box.curvalue].skindisplaynames[s_player_skin_box.curvalue]
- + "_i.pcx";
-
- re.DrawPic(s_player_config_menu.x - 40, refdef.y, scratch);
- }
- }
-
- static String PlayerConfig_MenuKey(int key) {
- int i;
-
- if (key == K_ESCAPE) {
- //char scratch[1024];
- String scratch;
-
- Cvar.Set("name", s_player_name_field.buffer.toString());
-
- scratch=
- s_pmi[s_player_model_box.curvalue].directory
- + "/"
- + s_pmi[s_player_model_box.curvalue].skindisplaynames[s_player_skin_box.curvalue];
-
- Cvar.Set("skin", scratch);
-
- for (i= 0; i < s_numplayermodels; i++) {
- int j;
-
- for (j= 0; j < s_pmi[i].nskins; j++) {
- if (s_pmi[i].skindisplaynames[j] != null)
- s_pmi[i].skindisplaynames[j]= null;
- }
- s_pmi[i].skindisplaynames= null;
- s_pmi[i].nskins= 0;
- }
- }
- return Default_MenuKey(s_player_config_menu, key);
- }
-
- static xcommand_t Menu_PlayerConfig= new xcommand_t() {
- public void execute() {
- Menu_PlayerConfig_f();
- }
- };
- static void Menu_PlayerConfig_f() {
- if (!PlayerConfig_MenuInit()) {
- Menu_SetStatusBar(s_multiplayer_menu, "No valid player models found");
- return;
- }
- Menu_SetStatusBar(s_multiplayer_menu, null);
- PushMenu(new xcommand_t() {
- public void execute() {
- PlayerConfig_MenuDraw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return PlayerConfig_MenuKey(key);
- }
- });
- }
-
- /*
- =======================================================================
-
- QUIT MENU
-
- =======================================================================
- */
-
- static String Quit_Key(int key) {
- switch (key) {
- case K_ESCAPE :
- case 'n' :
- case 'N' :
- PopMenu();
- break;
-
- case 'Y' :
- case 'y' :
- cls.key_dest= key_console;
- CL.Quit_f.execute();
- break;
-
- default :
- break;
- }
-
- return null;
-
- }
-
- static void Quit_Draw() {
- int w, h;
- Dimension d= new Dimension();
- re.DrawGetPicSize(d, "quit");
- w= d.width;
- h= d.height;
- re.DrawPic((viddef.width - w) / 2, (viddef.height - h) / 2, "quit");
- }
-
- static xcommand_t Menu_Quit= new xcommand_t() {
- public void execute() {
- Menu_Quit_f();
- }
- };
-
- static void Menu_Quit_f() {
- PushMenu(new xcommand_t() {
- public void execute() {
- Quit_Draw();
- }
- }, new keyfunc_t() {
- public String execute(int key) {
- return Quit_Key(key);
- }
- });
- }
-
- // =============================================================================
- /* Menu Subsystem */
-
- /**
- * Init
- */
- public static void Init() {
- Cmd.AddCommand("menu_main", Menu_Main);
- Cmd.AddCommand("menu_game", Menu_Game);
- Cmd.AddCommand("menu_loadgame", Menu_LoadGame);
- Cmd.AddCommand("menu_savegame", Menu_SaveGame);
- Cmd.AddCommand("menu_joinserver", Menu_JoinServer);
- Cmd.AddCommand("menu_addressbook", Menu_AddressBook);
- Cmd.AddCommand("menu_startserver", Menu_StartServer);
- Cmd.AddCommand("menu_dmoptions", Menu_DMOptions);
- Cmd.AddCommand("menu_playerconfig", Menu_PlayerConfig);
- Cmd.AddCommand("menu_downloadoptions", Menu_DownloadOptions);
- Cmd.AddCommand("menu_credits", Menu_Credits);
- Cmd.AddCommand("menu_multiplayer", Menu_Multiplayer);
- Cmd.AddCommand("menu_video", Menu_Video);
- Cmd.AddCommand("menu_options", Menu_Options);
- Cmd.AddCommand("menu_keys", Menu_Keys);
- Cmd.AddCommand("menu_quit", Menu_Quit);
-
- for (int i= 0; i < m_layers.length; i++) {
- m_layers[i]= new menulayer_t();
- }
- }
-
- /*
- =================
- Draw
- =================
- */
- static void Draw() {
- if (cls.key_dest != key_menu)
- return;
-
- // repaint everything next frame
- SCR.DirtyScreen();
-
- // dim everything behind it down
- if (cl.cinematictime > 0)
- re.DrawFill(0, 0, viddef.width, viddef.height, 0);
- else
- re.DrawFadeScreen();
-
- m_drawfunc.execute();
-
- // delay playing the enter sound until after the
- // menu has been drawn, to avoid delay while
- // caching images
- if (m_entersound) {
- S.StartLocalSound(menu_in_sound);
- m_entersound= false;
- }
- }
-
- /*
- =================
- Keydown
- =================
- */
- static void Keydown(int key) {
- String s;
-
- if (m_keyfunc != null)
- if ((s= m_keyfunc.execute(key)) != null)
- S.StartLocalSound(s);
- }
-
- public static void Action_DoEnter(menuaction_s a) {
- if (a.callback != null)
- a.callback.execute(a);
- }
-
- public static void Action_Draw(menuaction_s a) {
- if ((a.flags & QMF_LEFT_JUSTIFY) != 0) {
- if ((a.flags & QMF_GRAYED) != 0)
- Menu_DrawStringDark(a.x + a.parent.x + LCOLUMN_OFFSET, a.y + a.parent.y, a.name);
- else
- Menu_DrawString(a.x + a.parent.x + LCOLUMN_OFFSET, a.y + a.parent.y, a.name);
- }
- else {
- if ((a.flags & QMF_GRAYED) != 0)
- Menu_DrawStringR2LDark(a.x + a.parent.x + LCOLUMN_OFFSET, a.y + a.parent.y, a.name);
- else
- Menu_DrawStringR2L(a.x + a.parent.x + LCOLUMN_OFFSET, a.y + a.parent.y, a.name);
- }
- if (a.ownerdraw != null)
- a.ownerdraw.execute(a);
- }
-
- public static boolean Field_DoEnter(menufield_s f) {
- if (f.callback != null) {
- f.callback.execute(f);
- return true;
- }
- return false;
- }
-
- public static void Field_Draw(menufield_s f) {
- int i;
- String tempbuffer;
- //[128] = "";
-
- if (f.name != null)
- Menu_DrawStringR2LDark(f.x + f.parent.x + LCOLUMN_OFFSET, f.y + f.parent.y, f.name);
-
- //strncpy(tempbuffer, f.buffer + f.visible_offset, f.visible_length);
- String s= f.buffer.toString();
- tempbuffer= s.substring(f.visible_offset, s.length());
- re.DrawChar(f.x + f.parent.x + 16, f.y + f.parent.y - 4, 18);
- re.DrawChar(f.x + f.parent.x + 16, f.y + f.parent.y + 4, 24);
-
- re.DrawChar(f.x + f.parent.x + 24 + f.visible_length * 8, f.y + f.parent.y - 4, 20);
- re.DrawChar(f.x + f.parent.x + 24 + f.visible_length * 8, f.y + f.parent.y + 4, 26);
-
- for (i= 0; i < f.visible_length; i++) {
- re.DrawChar(f.x + f.parent.x + 24 + i * 8, f.y + f.parent.y - 4, 19);
- re.DrawChar(f.x + f.parent.x + 24 + i * 8, f.y + f.parent.y + 4, 25);
- }
-
- Menu_DrawString(f.x + f.parent.x + 24, f.y + f.parent.y, tempbuffer);
-
- if (Menu_ItemAtCursor(f.parent) == f) {
- int offset;
-
- if (f.visible_offset != 0)
- offset= f.visible_length;
- else
- offset= f.cursor;
-
- if ((((int) (Sys.Milliseconds() / 250)) & 1) != 0) {
- re.DrawChar(f.x + f.parent.x + (offset + 2) * 8 + 8, f.y + f.parent.y, 11);
- }
- else {
- re.DrawChar(f.x + f.parent.x + (offset + 2) * 8 + 8, f.y + f.parent.y, ' ');
- }
- }
- }
-
- public static boolean Field_Key(menufield_s f, int k) {
- char key= (char) k;
-
- switch (key) {
- case K_KP_SLASH :
- key= '/';
- break;
- case K_KP_MINUS :
- key= '-';
- break;
- case K_KP_PLUS :
- key= '+';
- break;
- case K_KP_HOME :
- key= '7';
- break;
- case K_KP_UPARROW :
- key= '8';
- break;
- case K_KP_PGUP :
- key= '9';
- break;
- case K_KP_LEFTARROW :
- key= '4';
- break;
- case K_KP_5 :
- key= '5';
- break;
- case K_KP_RIGHTARROW :
- key= '6';
- break;
- case K_KP_END :
- key= '1';
- break;
- case K_KP_DOWNARROW :
- key= '2';
- break;
- case K_KP_PGDN :
- key= '3';
- break;
- case K_KP_INS :
- key= '0';
- break;
- case K_KP_DEL :
- key= '.';
- break;
- }
-
- if (key > 127) {
- switch (key) {
- case K_DEL :
- default :
- return false;
- }
- }
-
- /*
- ** support pasting from the clipboard
- */
- if ((Character.toUpperCase(key) == 'V' && keydown[K_CTRL]) || (((key == K_INS) || (key == K_KP_INS)) && keydown[K_SHIFT])) {
- String cbd;
-
- if ((cbd= Sys.GetClipboardData()) != null) {
- //strtok(cbd, "\n\r\b");
- String lines[]= Lib.linesplit(cbd);
- if (lines.length > 0 && lines[0].length() != 0) {
- //strncpy(f.buffer, cbd, f.length - 1);
- f.buffer= new StringBuffer(lines[0]);
- f.cursor= f.buffer.length();
-
- f.visible_offset= f.cursor - f.visible_length;
-
- if (f.visible_offset < 0)
- f.visible_offset= 0;
- }
- }
- return true;
- }
-
- switch (key) {
- case K_KP_LEFTARROW :
- case K_LEFTARROW :
- case K_BACKSPACE :
- if (f.cursor > 0) {
- f.buffer.deleteCharAt(f.cursor - 1);
- //memmove(f.buffer[f.cursor - 1], f.buffer[f.cursor], strlen(& f.buffer[f.cursor]) + 1);
- f.cursor--;
-
- if (f.visible_offset != 0) {
- f.visible_offset--;
- }
- }
- break;
-
- case K_KP_DEL :
- case K_DEL :
- //memmove(& f.buffer[f.cursor], & f.buffer[f.cursor + 1], strlen(& f.buffer[f.cursor + 1]) + 1);
- f.buffer.deleteCharAt(f.cursor);
- break;
-
- case K_KP_ENTER :
- case K_ENTER :
- case K_ESCAPE :
- case K_TAB :
- return false;
-
- case K_SPACE :
- default :
- if (!Character.isDigit(key) && (f.flags & QMF_NUMBERSONLY) != 0)
- return false;
-
- if (f.cursor < f.length) {
- f.buffer.append(key);
- f.cursor++;
-
- if (f.cursor > f.visible_length) {
- f.visible_offset++;
- }
- }
- }
-
- return true;
- }
-
- public static void Menu_AddItem(menuframework_s menu, menucommon_s item) {
- if (menu.nitems == 0)
- menu.nslots= 0;
-
- if (menu.nitems < MAXMENUITEMS) {
- menu.items[menu.nitems]= item;
- ((menucommon_s) menu.items[menu.nitems]).parent= menu;
- menu.nitems++;
- }
-
- menu.nslots= Menu_TallySlots(menu);
- }
-
- /*
- ** Menu_AdjustCursor
- **
- ** This function takes the given menu, the direction, and attempts
- ** to adjust the menu's cursor so that it's at the next available
- ** slot.
- */
- public static void Menu_AdjustCursor(menuframework_s m, int dir) {
- menucommon_s citem;
-
- /*
- ** see if it's in a valid spot
- */
- if (m.cursor >= 0 && m.cursor < m.nitems) {
- if ((citem= Menu_ItemAtCursor(m)) != null) {
- if (citem.type != MTYPE_SEPARATOR)
- return;
- }
- }
-
- /*
- ** it's not in a valid spot, so crawl in the direction indicated until we
- ** find a valid spot
- */
- if (dir == 1) {
- while (true) {
- citem= Menu_ItemAtCursor(m);
- if (citem != null)
- if (citem.type != MTYPE_SEPARATOR)
- break;
- m.cursor += dir;
- if (m.cursor >= m.nitems)
- m.cursor= 0;
- }
- }
- else {
- while (true) {
- citem= Menu_ItemAtCursor(m);
- if (citem != null)
- if (citem.type != MTYPE_SEPARATOR)
- break;
- m.cursor += dir;
- if (m.cursor < 0)
- m.cursor= m.nitems - 1;
- }
- }
- }
-
- public static void Menu_Center(menuframework_s menu) {
- int height;
-
- height= ((menucommon_s) menu.items[menu.nitems - 1]).y;
- height += 10;
-
- menu.y= (viddef.height - height) / 2;
- }
-
- public static void Menu_Draw(menuframework_s menu) {
- int i;
- menucommon_s item;
-
- /*
- ** draw contents
- */
- for (i= 0; i < menu.nitems; i++) {
- switch (((menucommon_s) menu.items[i]).type) {
- case MTYPE_FIELD :
- Field_Draw((menufield_s) menu.items[i]);
- break;
- case MTYPE_SLIDER :
- Slider_Draw((menuslider_s) menu.items[i]);
- break;
- case MTYPE_LIST :
- MenuList_Draw((menulist_s) menu.items[i]);
- break;
- case MTYPE_SPINCONTROL :
- SpinControl_Draw((menulist_s) menu.items[i]);
- break;
- case MTYPE_ACTION :
- Action_Draw((menuaction_s) menu.items[i]);
- break;
- case MTYPE_SEPARATOR :
- Separator_Draw((menuseparator_s) menu.items[i]);
- break;
- }
- }
-
- item= Menu_ItemAtCursor(menu);
-
- if (item != null && item.cursordraw != null) {
- item.cursordraw.execute(item);
- }
- else if (menu.cursordraw != null) {
- menu.cursordraw.execute(menu);
- }
- else if (item != null && item.type != MTYPE_FIELD) {
- if ((item.flags & QMF_LEFT_JUSTIFY) != 0) {
- re.DrawChar(menu.x + item.x - 24 + item.cursor_offset, menu.y + item.y, 12 + ((int) (Sys.Milliseconds() / 250) & 1));
- }
- else {
- re.DrawChar(menu.x + item.cursor_offset, menu.y + item.y, 12 + ((int) (Sys.Milliseconds() / 250) & 1));
- }
- }
-
- if (item != null) {
- if (item.statusbarfunc != null)
- item.statusbarfunc.execute(item);
- else if (item.statusbar != null)
- Menu_DrawStatusBar(item.statusbar);
- else
- Menu_DrawStatusBar(menu.statusbar);
-
- }
- else {
- Menu_DrawStatusBar(menu.statusbar);
- }
- }
-
- public static void Menu_DrawStatusBar(String string) {
- if (string != null) {
- int l= string.length();
- int maxrow= viddef.height / 8;
- int maxcol= viddef.width / 8;
- int col= maxcol / 2 - l / 2;
-
- re.DrawFill(0, viddef.height - 8, viddef.width, 8, 4);
- Menu_DrawString(col * 8, viddef.height - 8, string);
- }
- else {
- re.DrawFill(0, viddef.height - 8, viddef.width, 8, 0);
- }
- }
-
- public static void Menu_DrawString(int x, int y, String string) {
- int i;
-
- for (i= 0; i < string.length(); i++) {
- re.DrawChar((x + i * 8), y, string.charAt(i));
- }
- }
-
- public static void Menu_DrawStringDark(int x, int y, String string) {
- int i;
-
- for (i= 0; i < string.length(); i++) {
- re.DrawChar((x + i * 8), y, string.charAt(i) + 128);
- }
- }
-
- public static void Menu_DrawStringR2L(int x, int y, String string) {
- int i;
-
- int l= string.length();
- for (i= 0; i < l; i++) {
- re.DrawChar((x - i * 8), y, string.charAt(l - i - 1));
- }
- }
-
- public static void Menu_DrawStringR2LDark(int x, int y, String string) {
- int i;
-
- int l= string.length();
- for (i= 0; i < l; i++) {
- re.DrawChar((x - i * 8), y, string.charAt(l - i - 1) + 128);
- }
- }
-
- public static menucommon_s Menu_ItemAtCursor(menuframework_s m) {
- if (m.cursor < 0 || m.cursor >= m.nitems)
- return null;
-
- return (menucommon_s) m.items[m.cursor];
- }
-
- static boolean Menu_SelectItem(menuframework_s s) {
- menucommon_s item= Menu_ItemAtCursor(s);
-
- if (item != null) {
- switch (item.type) {
- case MTYPE_FIELD :
- return Field_DoEnter((menufield_s) item);
- case MTYPE_ACTION :
- Action_DoEnter((menuaction_s) item);
- return true;
- case MTYPE_LIST :
- // Menulist_DoEnter( ( menulist_s ) item );
- return false;
- case MTYPE_SPINCONTROL :
- // SpinControl_DoEnter( ( menulist_s ) item );
- return false;
- }
- }
- return false;
- }
-
- public static void Menu_SetStatusBar(menuframework_s m, String string) {
- m.statusbar= string;
- }
-
- public static void Menu_SlideItem(menuframework_s s, int dir) {
- menucommon_s item= (menucommon_s) Menu_ItemAtCursor(s);
-
- if (item != null) {
- switch (item.type) {
- case MTYPE_SLIDER :
- Slider_DoSlide((menuslider_s) item, dir);
- break;
- case MTYPE_SPINCONTROL :
- SpinControl_DoSlide((menulist_s) item, dir);
- break;
- }
- }
- }
-
- public static int Menu_TallySlots(menuframework_s menu) {
- int i;
- int total= 0;
-
- for (i= 0; i < menu.nitems; i++) {
- if (((menucommon_s) menu.items[i]).type == MTYPE_LIST) {
- int nitems= 0;
- String n[]= ((menulist_s) menu.items[i]).itemnames;
-
- while (n[nitems] != null)
- nitems++;
-
- total += nitems;
- }
- else {
- total++;
- }
- }
-
- return total;
- }
-
- public static void Menulist_DoEnter(menulist_s l) {
- int start;
-
- start= l.y / 10 + 1;
-
- l.curvalue= l.parent.cursor - start;
-
- if (l.callback != null)
- l.callback.execute(l);
- }
-
- public static void MenuList_Draw(menulist_s l) {
- String n[];
- int y= 0;
-
- Menu_DrawStringR2LDark(l.x + l.parent.x + LCOLUMN_OFFSET, l.y + l.parent.y, l.name);
-
- n= l.itemnames;
-
- re.DrawFill(l.x - 112 + l.parent.x, l.parent.y + l.y + l.curvalue * 10 + 10, 128, 10, 16);
- int i= 0;
-
- while (n[i] != null) {
- Menu_DrawStringR2LDark(l.x + l.parent.x + LCOLUMN_OFFSET, l.y + l.parent.y + y + 10, n[i]);
-
- i++;
- y += 10;
- }
- }
-
- public static void Separator_Draw(menuseparator_s s) {
- if (s.name != null)
- Menu_DrawStringR2LDark(s.x + s.parent.x, s.y + s.parent.y, s.name);
- }
-
- public static void Slider_DoSlide(menuslider_s s, int dir) {
- s.curvalue += dir;
-
- if (s.curvalue > s.maxvalue)
- s.curvalue= s.maxvalue;
- else if (s.curvalue < s.minvalue)
- s.curvalue= s.minvalue;
-
- if (s.callback != null)
- s.callback.execute(s);
- }
-
- public static final int SLIDER_RANGE= 10;
-
- public static void Slider_Draw(menuslider_s s) {
- int i;
-
- Menu_DrawStringR2LDark(s.x + s.parent.x + LCOLUMN_OFFSET, s.y + s.parent.y, s.name);
-
- s.range= (s.curvalue - s.minvalue) / (float) (s.maxvalue - s.minvalue);
-
- if (s.range < 0)
- s.range= 0;
- if (s.range > 1)
- s.range= 1;
- re.DrawChar(s.x + s.parent.x + RCOLUMN_OFFSET, s.y + s.parent.y, 128);
- for (i= 0; i < SLIDER_RANGE; i++)
- re.DrawChar(RCOLUMN_OFFSET + s.x + i * 8 + s.parent.x + 8, s.y + s.parent.y, 129);
- re.DrawChar(RCOLUMN_OFFSET + s.x + i * 8 + s.parent.x + 8, s.y + s.parent.y, 130);
- re.DrawChar((int) (8 + RCOLUMN_OFFSET + s.parent.x + s.x + (SLIDER_RANGE - 1) * 8 * s.range), s.y + s.parent.y, 131);
- }
-
- public static void SpinControl_DoEnter(menulist_s s) {
- s.curvalue++;
- if (s.itemnames[s.curvalue] == null)
- s.curvalue= 0;
+ static class menucommon_s {
+ int type;
- if (s.callback != null)
- s.callback.execute(s);
- }
+ String name = "";
- public static void SpinControl_DoSlide(menulist_s s, int dir) {
- s.curvalue += dir;
+ int x, y;
- if (s.curvalue < 0)
- s.curvalue= 0;
- else if (s.itemnames[s.curvalue] == null)
- s.curvalue--;
+ menuframework_s parent;
- if (s.callback != null)
- s.callback.execute(s);
- }
+ int cursor_offset;
- public static void SpinControl_Draw(menulist_s s) {
- //char buffer[100];
- String buffer;
+ int localdata[] = { 0, 0, 0, 0 };
- if (s.name != null) {
- Menu_DrawStringR2LDark(s.x + s.parent.x + LCOLUMN_OFFSET, s.y + s.parent.y, s.name);
- }
+ int flags;
- if (s.itemnames[s.curvalue].indexOf('\n') == -1) {
- Menu_DrawString(RCOLUMN_OFFSET + s.x + s.parent.x, s.y + s.parent.y, s.itemnames[s.curvalue]);
- }
- else {
- String line1, line2;
- line1= Lib.leftFrom(s.itemnames[s.curvalue], '\n');
- Menu_DrawString(RCOLUMN_OFFSET + s.x + s.parent.x, s.y + s.parent.y, line1);
+ int n = -1; //position in an array.
- line2= Lib.rightFrom(s.itemnames[s.curvalue], '\n');
+ String statusbar;
- int pos= line2.indexOf('\n');
- if (pos != -1)
- line2= line2.substring(0, pos);
+ mcallback callback;
- Menu_DrawString(RCOLUMN_OFFSET + s.x + s.parent.x, s.y + s.parent.y + 10, line2);
- }
- }
-}
+ mcallback statusbarfunc;
+
+ mcallback ownerdraw;
+
+ mcallback cursordraw;
+ }
+
+ static class menufield_s extends menucommon_s {
+ //char buffer[80];
+ StringBuffer buffer; //allow deletion.
+
+ int cursor;
+
+ int length;
+
+ int visible_length;
+
+ int visible_offset;
+ }
+
+ static class menuslider_s extends menucommon_s {
+
+ float minvalue;
+
+ float maxvalue;
+
+ float curvalue;
+
+ float range;
+ }
+
+ static class menulist_s extends menucommon_s {
+ int curvalue;
+
+ String itemnames[];
+ }
+
+ static class menuaction_s extends menucommon_s {
+
+ }
+
+ static class menuseparator_s extends menucommon_s {
+
+ }
+
+ public static menulayer_t m_layers[] = new menulayer_t[MAX_MENU_DEPTH];
+
+ public static int m_menudepth;
+
+ static void Banner(String name) {
+ Dimension dim = new Dimension();
+ Globals.re.DrawGetPicSize(dim, name);
+
+ Globals.re.DrawPic(viddef.width / 2 - dim.width / 2,
+ viddef.height / 2 - 110, name);
+ }
+
+ static void PushMenu(xcommand_t draw, keyfunc_t key) { //, String(*key)
+ // (int k) ) {
+ int i;
+
+ if (Cvar.VariableValue("maxclients") == 1 && Globals.server_state != 0)
+ Cvar.Set("paused", "1");
+
+ // if this menu is already present, drop back to that level
+ // to avoid stacking menus by hotkeys
+ for (i = 0; i < m_menudepth; i++)
+ if (m_layers[i].draw == draw && m_layers[i].key == key) {
+ m_menudepth = i;
+ }
+
+ if (i == m_menudepth) {
+ if (m_menudepth >= MAX_MENU_DEPTH)
+ Com.Error(ERR_FATAL, "PushMenu: MAX_MENU_DEPTH");
+
+ m_layers[m_menudepth].draw = m_drawfunc;
+ m_layers[m_menudepth].key = m_keyfunc;
+ m_menudepth++;
+ }
+
+ m_drawfunc = draw;
+ m_keyfunc = key;
+
+ m_entersound = true;
+
+ cls.key_dest = key_menu;
+ }
+
+ static void ForceMenuOff() {
+ m_drawfunc = null;
+ m_keyfunc = null;
+ cls.key_dest = key_game;
+ m_menudepth = 0;
+ Key.ClearStates();
+ Cvar.Set("paused", "0");
+ }
+
+ static void PopMenu() {
+ S.StartLocalSound(menu_out_sound);
+ if (m_menudepth < 1)
+ Com.Error(ERR_FATAL, "PopMenu: depth < 1");
+ m_menudepth--;
+
+ m_drawfunc = m_layers[m_menudepth].draw;
+ m_keyfunc = m_layers[m_menudepth].key;
+
+ if (0 == m_menudepth)
+ ForceMenuOff();
+ }
+
+ static String Default_MenuKey(menuframework_s m, int key) {
+ String sound = null;
+ menucommon_s item;
+
+ if (m != null) {
+ if ((item = ((menucommon_s) Menu_ItemAtCursor(m))) != null) {
+ if (item.type == MTYPE_FIELD) {
+ if (Field_Key((menufield_s) item, key))
+ return null;
+ }
+ }
+ }
+
+ switch (key) {
+ case K_ESCAPE:
+ PopMenu();
+ return menu_out_sound;
+ case K_KP_UPARROW:
+ case K_UPARROW:
+ if (m != null) {
+ m.cursor--;
+ Menu_AdjustCursor(m, -1);
+ sound = menu_move_sound;
+ }
+ break;
+ case K_TAB:
+ if (m != null) {
+ m.cursor++;
+ Menu_AdjustCursor(m, 1);
+ sound = menu_move_sound;
+ }
+ break;
+ case K_KP_DOWNARROW:
+ case K_DOWNARROW:
+ if (m != null) {
+ m.cursor++;
+ Menu_AdjustCursor(m, 1);
+ sound = menu_move_sound;
+ }
+ break;
+ case K_KP_LEFTARROW:
+ case K_LEFTARROW:
+ if (m != null) {
+ Menu_SlideItem(m, -1);
+ sound = menu_move_sound;
+ }
+ break;
+ case K_KP_RIGHTARROW:
+ case K_RIGHTARROW:
+ if (m != null) {
+ Menu_SlideItem(m, 1);
+ sound = menu_move_sound;
+ }
+ break;
+
+ case K_MOUSE1:
+ case K_MOUSE2:
+ case K_MOUSE3:
+ case K_JOY1:
+ case K_JOY2:
+ case K_JOY3:
+ case K_JOY4:
+ /*
+ * case K_AUX1 : case K_AUX2 : case K_AUX3 : case K_AUX4 : case K_AUX5 :
+ * case K_AUX6 : case K_AUX7 : case K_AUX8 : case K_AUX9 : case K_AUX10 :
+ * case K_AUX11 : case K_AUX12 : case K_AUX13 : case K_AUX14 : case
+ * K_AUX15 : case K_AUX16 : case K_AUX17 : case K_AUX18 : case K_AUX19 :
+ * case K_AUX20 : case K_AUX21 : case K_AUX22 : case K_AUX23 : case
+ * K_AUX24 : case K_AUX25 : case K_AUX26 : case K_AUX27 : case K_AUX28 :
+ * case K_AUX29 : case K_AUX30 : case K_AUX31 : case K_AUX32 :
+ */
+ case K_KP_ENTER:
+ case K_ENTER:
+ if (m != null)
+ Menu_SelectItem(m);
+ sound = menu_move_sound;
+ break;
+ }
+
+ return sound;
+ }
+
+ /*
+ * ================ DrawCharacter
+ *
+ * Draws one solid graphics character cx and cy are in 320*240 coordinates,
+ * and will be centered on higher res screens. ================
+ */
+ public static void DrawCharacter(int cx, int cy, int num) {
+ re.DrawChar(cx + ((viddef.width - 320) >> 1), cy
+ + ((viddef.height - 240) >> 1), num);
+ }
+
+ public static void Print(int cx, int cy, String str) {
+ //while (*str)
+ for (int n = 0; n < str.length(); n++) {
+ DrawCharacter(cx, cy, str.charAt(n) + 128);
+ //str++;
+ cx += 8;
+ }
+ }
+
+ public static void PrintWhite(int cx, int cy, String str) {
+ for (int n = 0; n < str.length(); n++) {
+ DrawCharacter(cx, cy, str.charAt(n));
+ //str++;
+ cx += 8;
+ }
+ }
+
+ public static void DrawPic(int x, int y, String pic) {
+ re.DrawPic(x + ((viddef.width - 320) >> 1), y
+ + ((viddef.height - 240) >> 1), pic);
+ }
+
+ /*
+ * ============= DrawCursor
+ *
+ * Draws an animating cursor with the point at x,y. The pic will extend to
+ * the left of x, and both above and below y. =============
+ */
+ static boolean cached;
+
+ static void DrawCursor(int x, int y, int f) {
+ //char cursorname[80];
+ String cursorname;
+
+ assert (f >= 0) : "negative time and cursor bug";
+
+ f = Math.abs(f);
+
+ if (!cached) {
+ int i;
+
+ for (i = 0; i < NUM_CURSOR_FRAMES; i++) {
+ cursorname = "m_cursor" + i;
+
+ re.RegisterPic(cursorname);
+ }
+ cached = true;
+ }
+
+ cursorname = "m_cursor" + f;
+ re.DrawPic(x, y, cursorname);
+ }
+
+ public static void DrawTextBox(int x, int y, int width, int lines) {
+ int cx, cy;
+ int n;
+
+ // draw left side
+ cx = x;
+ cy = y;
+ DrawCharacter(cx, cy, 1);
+
+ for (n = 0; n < lines; n++) {
+ cy += 8;
+ DrawCharacter(cx, cy, 4);
+ }
+ DrawCharacter(cx, cy + 8, 7);
+
+ // draw middle
+ cx += 8;
+ while (width > 0) {
+ cy = y;
+ DrawCharacter(cx, cy, 2);
+
+ for (n = 0; n < lines; n++) {
+ cy += 8;
+ DrawCharacter(cx, cy, 5);
+ }
+ DrawCharacter(cx, cy + 8, 8);
+
+ width -= 1;
+ cx += 8;
+ }
+
+ // draw right side
+ cy = y;
+ DrawCharacter(cx, cy, 3);
+ for (n = 0; n < lines; n++) {
+ cy += 8;
+ DrawCharacter(cx, cy, 6);
+
+ }
+ DrawCharacter(cx, cy + 8, 9);
+
+ }
+
+ /*
+ * =======================================================================
+ *
+ * MAIN MENU
+ *
+ * =======================================================================
+ */
+ static final int MAIN_ITEMS = 5;
+
+ static xcommand_t Main_Draw = new xcommand_t() {
+ public void execute() {
+ Main_Draw();
+ }
+ };
+
+ static void Main_Draw() {
+ int i;
+ int w, h;
+ int ystart;
+ int xoffset;
+ int widest = -1;
+ int totalheight = 0;
+ String litname;
+ String[] names = { "m_main_game", "m_main_multiplayer",
+ "m_main_options", "m_main_video", "m_main_quit" };
+ Dimension dim = new Dimension();
+
+ for (i = 0; i < names.length; i++) {
+ Globals.re.DrawGetPicSize(dim, names[i]);
+ w = dim.width;
+ h = dim.height;
+
+ if (w > widest)
+ widest = w;
+ totalheight += (h + 12);
+ }
+
+ ystart = (Globals.viddef.height / 2 - 110);
+ xoffset = (Globals.viddef.width - widest + 70) / 2;
+
+ for (i = 0; i < names.length; i++) {
+ if (i != m_main_cursor)
+ Globals.re.DrawPic(xoffset, ystart + i * 40 + 13, names[i]);
+ }
+
+ //strcat(litname, "_sel");
+ litname = names[m_main_cursor] + "_sel";
+ Globals.re.DrawPic(xoffset, ystart + m_main_cursor * 40 + 13, litname);
+
+ DrawCursor(xoffset - 25, ystart + m_main_cursor * 40 + 11,
+ (int) ((Globals.cls.realtime / 100)) % NUM_CURSOR_FRAMES);
+
+ Globals.re.DrawGetPicSize(dim, "m_main_plaque");
+ w = dim.width;
+ h = dim.height;
+ Globals.re.DrawPic(xoffset - 30 - w, ystart, "m_main_plaque");
+
+ Globals.re.DrawPic(xoffset - 30 - w, ystart + h + 5, "m_main_logo");
+ }
+
+ static keyfunc_t Main_Key = new keyfunc_t() {
+ public String execute(int key) {
+ return Main_Key(key);
+ }
+ };
+
+ static String Main_Key(int key) {
+ String sound = menu_move_sound;
+
+ switch (key) {
+ case Key.K_ESCAPE:
+ PopMenu();
+ break;
+
+ case Key.K_KP_DOWNARROW:
+ case Key.K_DOWNARROW:
+ if (++m_main_cursor >= MAIN_ITEMS)
+ m_main_cursor = 0;
+ return sound;
+
+ case Key.K_KP_UPARROW:
+ case Key.K_UPARROW:
+ if (--m_main_cursor < 0)
+ m_main_cursor = MAIN_ITEMS - 1;
+ return sound;
+
+ case Key.K_KP_ENTER:
+ case Key.K_ENTER:
+ m_entersound = true;
+
+ switch (m_main_cursor) {
+ case 0:
+ Menu_Game_f();
+ break;
+
+ case 1:
+ Menu_Multiplayer_f();
+ break;
+
+ case 2:
+ Menu_Options_f();
+ break;
+
+ case 3:
+ Menu_Video_f();
+ break;
+
+ case 4:
+ Menu_Quit_f();
+ break;
+ }
+ }
+
+ return null;
+ }
+
+ static xcommand_t Menu_Main = new xcommand_t() {
+ public void execute() {
+ Menu_Main_f();
+ }
+ };
+
+ static void Menu_Main_f() {
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ Main_Draw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return Main_Key(key);
+ }
+ });
+ }
+
+ /*
+ * =======================================================================
+ *
+ * MULTIPLAYER MENU
+ *
+ * =======================================================================
+ */
+ static menuframework_s s_multiplayer_menu = new menuframework_s();
+
+ static menuaction_s s_join_network_server_action = new menuaction_s();
+
+ static menuaction_s s_start_network_server_action = new menuaction_s();
+
+ static menuaction_s s_player_setup_action = new menuaction_s();
+
+ static void Multiplayer_MenuDraw() {
+ Banner("m_banner_multiplayer");
+
+ Menu_AdjustCursor(s_multiplayer_menu, 1);
+ Menu_Draw(s_multiplayer_menu);
+ }
+
+ static void PlayerSetupFunc(Object unused) {
+ Menu_PlayerConfig_f();
+ }
+
+ static void JoinNetworkServerFunc(Object unused) {
+ Menu_JoinServer_f();
+ }
+
+ static void StartNetworkServerFunc(Object unused) {
+ Menu_StartServer_f();
+ }
+
+ static void Multiplayer_MenuInit() {
+ s_multiplayer_menu.x = (int) (viddef.width * 0.50f - 64);
+ s_multiplayer_menu.nitems = 0;
+
+ s_join_network_server_action.type = MTYPE_ACTION;
+ s_join_network_server_action.flags = QMF_LEFT_JUSTIFY;
+ s_join_network_server_action.x = 0;
+ s_join_network_server_action.y = 0;
+ s_join_network_server_action.name = " join network server";
+ s_join_network_server_action.callback = new mcallback() {
+ public void execute(Object o) {
+ JoinNetworkServerFunc(o);
+ };
+ };
+
+ s_start_network_server_action.type = MTYPE_ACTION;
+ s_start_network_server_action.flags = QMF_LEFT_JUSTIFY;
+ s_start_network_server_action.x = 0;
+ s_start_network_server_action.y = 10;
+ s_start_network_server_action.name = " start network server";
+ s_start_network_server_action.callback = new mcallback() {
+ public void execute(Object o) {
+ StartNetworkServerFunc(o);
+ }
+ };
+
+ s_player_setup_action.type = MTYPE_ACTION;
+ s_player_setup_action.flags = QMF_LEFT_JUSTIFY;
+ s_player_setup_action.x = 0;
+ s_player_setup_action.y = 20;
+ s_player_setup_action.name = " player setup";
+ s_player_setup_action.callback = new mcallback() {
+ public void execute(Object o) {
+ PlayerSetupFunc(o);
+ }
+ };
+
+ Menu_AddItem(s_multiplayer_menu, s_join_network_server_action);
+ Menu_AddItem(s_multiplayer_menu, s_start_network_server_action);
+ Menu_AddItem(s_multiplayer_menu, s_player_setup_action);
+
+ Menu_SetStatusBar(s_multiplayer_menu, null);
+
+ Menu_Center(s_multiplayer_menu);
+ }
+
+ static String Multiplayer_MenuKey(int key) {
+ return Default_MenuKey(s_multiplayer_menu, key);
+ }
+
+ static xcommand_t Menu_Multiplayer = new xcommand_t() {
+ public void execute() {
+ Menu_Multiplayer_f();
+ }
+ };
+
+ static void Menu_Multiplayer_f() {
+ Multiplayer_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ Multiplayer_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return Multiplayer_MenuKey(key);
+ }
+ });
+ }
+
+ /*
+ * =======================================================================
+ *
+ * KEYS MENU
+ *
+ * =======================================================================
+ */
+ static String bindnames[][] = { { "+attack", "attack" },
+ { "weapnext", "next weapon" }, { "+forward", "walk forward" },
+ { "+back", "backpedal" }, { "+left", "turn left" },
+ { "+right", "turn right" }, { "+speed", "run" },
+ { "+moveleft", "step left" }, { "+moveright", "step right" },
+ { "+strafe", "sidestep" }, { "+lookup", "look up" },
+ { "+lookdown", "look down" }, { "centerview", "center view" },
+ { "+mlook", "mouse look" }, { "+klook", "keyboard look" },
+ { "+moveup", "up / jump" }, { "+movedown", "down / crouch" }, {
+
+ "inven", "inventory" }, { "invuse", "use item" },
+ { "invdrop", "drop item" }, { "invprev", "prev item" },
+ { "invnext", "next item" }, {
+
+ "cmd help", "help computer" }, { null, null } };
+
+ int keys_cursor;
+
+ static boolean bind_grab;
+
+ static menuframework_s s_keys_menu = new menuframework_s();
+
+ static menuaction_s s_keys_attack_action = new menuaction_s();
+
+ static menuaction_s s_keys_change_weapon_action = new menuaction_s();
+
+ static menuaction_s s_keys_walk_forward_action = new menuaction_s();
+
+ static menuaction_s s_keys_backpedal_action = new menuaction_s();
+
+ static menuaction_s s_keys_turn_left_action = new menuaction_s();
+
+ static menuaction_s s_keys_turn_right_action = new menuaction_s();
+
+ static menuaction_s s_keys_run_action = new menuaction_s();
+
+ static menuaction_s s_keys_step_left_action = new menuaction_s();
+
+ static menuaction_s s_keys_step_right_action = new menuaction_s();
+
+ static menuaction_s s_keys_sidestep_action = new menuaction_s();
+
+ static menuaction_s s_keys_look_up_action = new menuaction_s();
+
+ static menuaction_s s_keys_look_down_action = new menuaction_s();
+
+ static menuaction_s s_keys_center_view_action = new menuaction_s();
+
+ static menuaction_s s_keys_mouse_look_action = new menuaction_s();
+
+ static menuaction_s s_keys_keyboard_look_action = new menuaction_s();
+
+ static menuaction_s s_keys_move_up_action = new menuaction_s();
+
+ static menuaction_s s_keys_move_down_action = new menuaction_s();
+
+ static menuaction_s s_keys_inventory_action = new menuaction_s();
+
+ static menuaction_s s_keys_inv_use_action = new menuaction_s();
+
+ static menuaction_s s_keys_inv_drop_action = new menuaction_s();
+
+ static menuaction_s s_keys_inv_prev_action = new menuaction_s();
+
+ static menuaction_s s_keys_inv_next_action = new menuaction_s();
+
+ static menuaction_s s_keys_help_computer_action = new menuaction_s();
+
+ static void UnbindCommand(String command) {
+ int j;
+ String b;
+
+ for (j = 0; j < 256; j++) {
+ b = keybindings[j];
+ if (b == null)
+ continue;
+ if (b.equals(command))
+ Key.SetBinding(j, "");
+ }
+ }
+
+ static void FindKeysForCommand(String command, int twokeys[]) {
+ int count;
+ int j;
+ String b;
+
+ twokeys[0] = twokeys[1] = -1;
+ count = 0;
+
+ for (j = 0; j < 256; j++) {
+ b = keybindings[j];
+ if (b == null)
+ continue;
+
+ if (b.equals(command)) {
+ twokeys[count] = j;
+ count++;
+ if (count == 2)
+ break;
+ }
+ }
+ }
+
+ static void KeyCursorDrawFunc(menuframework_s menu) {
+ if (bind_grab)
+ re.DrawChar(menu.x, menu.y + menu.cursor * 9, '=');
+ else
+ re.DrawChar(menu.x, menu.y + menu.cursor * 9, 12 + ((int) (Sys
+ .Milliseconds() / 250) & 1));
+ }
+
+ static void DrawKeyBindingFunc(Object self) {
+ int keys[] = { 0, 0 };
+ menuaction_s a = (menuaction_s) self;
+
+ FindKeysForCommand(bindnames[a.localdata[0]][0], keys);
+
+ if (keys[0] == -1) {
+ Menu_DrawString(a.x + a.parent.x + 16, a.y + a.parent.y, "???");
+ } else {
+ int x;
+ String name;
+
+ name = Key.KeynumToString(keys[0]);
+
+ Menu_DrawString(a.x + a.parent.x + 16, a.y + a.parent.y, name);
+
+ x = name.length() * 8;
+
+ if (keys[1] != -1) {
+ Menu_DrawString(a.x + a.parent.x + 24 + x, a.y + a.parent.y,
+ "or");
+ Menu_DrawString(a.x + a.parent.x + 48 + x, a.y + a.parent.y,
+ Key.KeynumToString(keys[1]));
+ }
+ }
+ }
+
+ static void KeyBindingFunc(Object self) {
+ menuaction_s a = (menuaction_s) self;
+ int keys[] = { 0, 0 };
+
+ FindKeysForCommand(bindnames[a.localdata[0]][0], keys);
+
+ if (keys[1] != -1)
+ UnbindCommand(bindnames[a.localdata[0]][0]);
+
+ bind_grab = true;
+
+ Menu_SetStatusBar(s_keys_menu, "press a key or button for this action");
+ }
+
+ static void Keys_MenuInit() {
+ int y = 0;
+ int i = 0;
+
+ s_keys_menu.x = (int) (viddef.width * 0.50);
+ s_keys_menu.nitems = 0;
+ s_keys_menu.cursordraw = new mcallback() {
+ public void execute(Object o) {
+ KeyCursorDrawFunc((menuframework_s) o);
+ }
+ };
+
+ s_keys_attack_action.type = MTYPE_ACTION;
+ s_keys_attack_action.flags = QMF_GRAYED;
+ s_keys_attack_action.x = 0;
+ s_keys_attack_action.y = y;
+ s_keys_attack_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+ s_keys_attack_action.localdata[0] = i;
+ s_keys_attack_action.name = bindnames[s_keys_attack_action.localdata[0]][1];
+
+ s_keys_change_weapon_action.type = MTYPE_ACTION;
+ s_keys_change_weapon_action.flags = QMF_GRAYED;
+ s_keys_change_weapon_action.x = 0;
+ s_keys_change_weapon_action.y = y += 9;
+ s_keys_change_weapon_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_change_weapon_action.localdata[0] = ++i;
+ s_keys_change_weapon_action.name = bindnames[s_keys_change_weapon_action.localdata[0]][1];
+
+ s_keys_walk_forward_action.type = MTYPE_ACTION;
+ s_keys_walk_forward_action.flags = QMF_GRAYED;
+ s_keys_walk_forward_action.x = 0;
+ s_keys_walk_forward_action.y = y += 9;
+ s_keys_walk_forward_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+ s_keys_walk_forward_action.localdata[0] = ++i;
+ s_keys_walk_forward_action.name = bindnames[s_keys_walk_forward_action.localdata[0]][1];
+
+ s_keys_backpedal_action.type = MTYPE_ACTION;
+ s_keys_backpedal_action.flags = QMF_GRAYED;
+ s_keys_backpedal_action.x = 0;
+ s_keys_backpedal_action.y = y += 9;
+ s_keys_backpedal_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+ s_keys_backpedal_action.localdata[0] = ++i;
+ s_keys_backpedal_action.name = bindnames[s_keys_backpedal_action.localdata[0]][1];
+
+ s_keys_turn_left_action.type = MTYPE_ACTION;
+ s_keys_turn_left_action.flags = QMF_GRAYED;
+ s_keys_turn_left_action.x = 0;
+ s_keys_turn_left_action.y = y += 9;
+ s_keys_turn_left_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+ s_keys_turn_left_action.localdata[0] = ++i;
+ s_keys_turn_left_action.name = bindnames[s_keys_turn_left_action.localdata[0]][1];
+
+ s_keys_turn_right_action.type = MTYPE_ACTION;
+ s_keys_turn_right_action.flags = QMF_GRAYED;
+ s_keys_turn_right_action.x = 0;
+ s_keys_turn_right_action.y = y += 9;
+ s_keys_turn_right_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+ s_keys_turn_right_action.localdata[0] = ++i;
+ s_keys_turn_right_action.name = bindnames[s_keys_turn_right_action.localdata[0]][1];
+
+ s_keys_run_action.type = MTYPE_ACTION;
+ s_keys_run_action.flags = QMF_GRAYED;
+ s_keys_run_action.x = 0;
+ s_keys_run_action.y = y += 9;
+ s_keys_run_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+ s_keys_run_action.localdata[0] = ++i;
+ s_keys_run_action.name = bindnames[s_keys_run_action.localdata[0]][1];
+
+ s_keys_step_left_action.type = MTYPE_ACTION;
+ s_keys_step_left_action.flags = QMF_GRAYED;
+ s_keys_step_left_action.x = 0;
+ s_keys_step_left_action.y = y += 9;
+ s_keys_step_left_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+ s_keys_step_left_action.localdata[0] = ++i;
+ s_keys_step_left_action.name = bindnames[s_keys_step_left_action.localdata[0]][1];
+
+ s_keys_step_right_action.type = MTYPE_ACTION;
+ s_keys_step_right_action.flags = QMF_GRAYED;
+ s_keys_step_right_action.x = 0;
+ s_keys_step_right_action.y = y += 9;
+ s_keys_step_right_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_step_right_action.localdata[0] = ++i;
+ s_keys_step_right_action.name = bindnames[s_keys_step_right_action.localdata[0]][1];
+
+ s_keys_sidestep_action.type = MTYPE_ACTION;
+ s_keys_sidestep_action.flags = QMF_GRAYED;
+ s_keys_sidestep_action.x = 0;
+ s_keys_sidestep_action.y = y += 9;
+ s_keys_sidestep_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_sidestep_action.localdata[0] = ++i;
+ s_keys_sidestep_action.name = bindnames[s_keys_sidestep_action.localdata[0]][1];
+
+ s_keys_look_up_action.type = MTYPE_ACTION;
+ s_keys_look_up_action.flags = QMF_GRAYED;
+ s_keys_look_up_action.x = 0;
+ s_keys_look_up_action.y = y += 9;
+ s_keys_look_up_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_look_up_action.localdata[0] = ++i;
+ s_keys_look_up_action.name = bindnames[s_keys_look_up_action.localdata[0]][1];
+
+ s_keys_look_down_action.type = MTYPE_ACTION;
+ s_keys_look_down_action.flags = QMF_GRAYED;
+ s_keys_look_down_action.x = 0;
+ s_keys_look_down_action.y = y += 9;
+ s_keys_look_down_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_look_down_action.localdata[0] = ++i;
+ s_keys_look_down_action.name = bindnames[s_keys_look_down_action.localdata[0]][1];
+
+ s_keys_center_view_action.type = MTYPE_ACTION;
+ s_keys_center_view_action.flags = QMF_GRAYED;
+ s_keys_center_view_action.x = 0;
+ s_keys_center_view_action.y = y += 9;
+ s_keys_center_view_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_center_view_action.localdata[0] = ++i;
+ s_keys_center_view_action.name = bindnames[s_keys_center_view_action.localdata[0]][1];
+
+ s_keys_mouse_look_action.type = MTYPE_ACTION;
+ s_keys_mouse_look_action.flags = QMF_GRAYED;
+ s_keys_mouse_look_action.x = 0;
+ s_keys_mouse_look_action.y = y += 9;
+ s_keys_mouse_look_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_mouse_look_action.localdata[0] = ++i;
+ s_keys_mouse_look_action.name = bindnames[s_keys_mouse_look_action.localdata[0]][1];
+
+ s_keys_keyboard_look_action.type = MTYPE_ACTION;
+ s_keys_keyboard_look_action.flags = QMF_GRAYED;
+ s_keys_keyboard_look_action.x = 0;
+ s_keys_keyboard_look_action.y = y += 9;
+ s_keys_keyboard_look_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_keyboard_look_action.localdata[0] = ++i;
+ s_keys_keyboard_look_action.name = bindnames[s_keys_keyboard_look_action.localdata[0]][1];
+
+ s_keys_move_up_action.type = MTYPE_ACTION;
+ s_keys_move_up_action.flags = QMF_GRAYED;
+ s_keys_move_up_action.x = 0;
+ s_keys_move_up_action.y = y += 9;
+ s_keys_move_up_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_move_up_action.localdata[0] = ++i;
+ s_keys_move_up_action.name = bindnames[s_keys_move_up_action.localdata[0]][1];
+
+ s_keys_move_down_action.type = MTYPE_ACTION;
+ s_keys_move_down_action.flags = QMF_GRAYED;
+ s_keys_move_down_action.x = 0;
+ s_keys_move_down_action.y = y += 9;
+ s_keys_move_down_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_move_down_action.localdata[0] = ++i;
+ s_keys_move_down_action.name = bindnames[s_keys_move_down_action.localdata[0]][1];
+
+ s_keys_inventory_action.type = MTYPE_ACTION;
+ s_keys_inventory_action.flags = QMF_GRAYED;
+ s_keys_inventory_action.x = 0;
+ s_keys_inventory_action.y = y += 9;
+ s_keys_inventory_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_inventory_action.localdata[0] = ++i;
+ s_keys_inventory_action.name = bindnames[s_keys_inventory_action.localdata[0]][1];
+
+ s_keys_inv_use_action.type = MTYPE_ACTION;
+ s_keys_inv_use_action.flags = QMF_GRAYED;
+ s_keys_inv_use_action.x = 0;
+ s_keys_inv_use_action.y = y += 9;
+ s_keys_inv_use_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_inv_use_action.localdata[0] = ++i;
+ s_keys_inv_use_action.name = bindnames[s_keys_inv_use_action.localdata[0]][1];
+
+ s_keys_inv_drop_action.type = MTYPE_ACTION;
+ s_keys_inv_drop_action.flags = QMF_GRAYED;
+ s_keys_inv_drop_action.x = 0;
+ s_keys_inv_drop_action.y = y += 9;
+ s_keys_inv_drop_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_inv_drop_action.localdata[0] = ++i;
+ s_keys_inv_drop_action.name = bindnames[s_keys_inv_drop_action.localdata[0]][1];
+
+ s_keys_inv_prev_action.type = MTYPE_ACTION;
+ s_keys_inv_prev_action.flags = QMF_GRAYED;
+ s_keys_inv_prev_action.x = 0;
+ s_keys_inv_prev_action.y = y += 9;
+ s_keys_inv_prev_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_inv_prev_action.localdata[0] = ++i;
+ s_keys_inv_prev_action.name = bindnames[s_keys_inv_prev_action.localdata[0]][1];
+
+ s_keys_inv_next_action.type = MTYPE_ACTION;
+ s_keys_inv_next_action.flags = QMF_GRAYED;
+ s_keys_inv_next_action.x = 0;
+ s_keys_inv_next_action.y = y += 9;
+ s_keys_inv_next_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_inv_next_action.localdata[0] = ++i;
+ s_keys_inv_next_action.name = bindnames[s_keys_inv_next_action.localdata[0]][1];
+
+ s_keys_help_computer_action.type = MTYPE_ACTION;
+ s_keys_help_computer_action.flags = QMF_GRAYED;
+ s_keys_help_computer_action.x = 0;
+ s_keys_help_computer_action.y = y += 9;
+ s_keys_help_computer_action.ownerdraw = new mcallback() {
+ public void execute(Object o) {
+ DrawKeyBindingFunc(o);
+ }
+ };
+
+ s_keys_help_computer_action.localdata[0] = ++i;
+ s_keys_help_computer_action.name = bindnames[s_keys_help_computer_action.localdata[0]][1];
+
+ Menu_AddItem(s_keys_menu, s_keys_attack_action);
+ Menu_AddItem(s_keys_menu, s_keys_change_weapon_action);
+ Menu_AddItem(s_keys_menu, s_keys_walk_forward_action);
+ Menu_AddItem(s_keys_menu, s_keys_backpedal_action);
+ Menu_AddItem(s_keys_menu, s_keys_turn_left_action);
+ Menu_AddItem(s_keys_menu, s_keys_turn_right_action);
+ Menu_AddItem(s_keys_menu, s_keys_run_action);
+ Menu_AddItem(s_keys_menu, s_keys_step_left_action);
+ Menu_AddItem(s_keys_menu, s_keys_step_right_action);
+ Menu_AddItem(s_keys_menu, s_keys_sidestep_action);
+ Menu_AddItem(s_keys_menu, s_keys_look_up_action);
+ Menu_AddItem(s_keys_menu, s_keys_look_down_action);
+ Menu_AddItem(s_keys_menu, s_keys_center_view_action);
+ Menu_AddItem(s_keys_menu, s_keys_mouse_look_action);
+ Menu_AddItem(s_keys_menu, s_keys_keyboard_look_action);
+ Menu_AddItem(s_keys_menu, s_keys_move_up_action);
+ Menu_AddItem(s_keys_menu, s_keys_move_down_action);
+
+ Menu_AddItem(s_keys_menu, s_keys_inventory_action);
+ Menu_AddItem(s_keys_menu, s_keys_inv_use_action);
+ Menu_AddItem(s_keys_menu, s_keys_inv_drop_action);
+ Menu_AddItem(s_keys_menu, s_keys_inv_prev_action);
+ Menu_AddItem(s_keys_menu, s_keys_inv_next_action);
+
+ Menu_AddItem(s_keys_menu, s_keys_help_computer_action);
+
+ Menu_SetStatusBar(s_keys_menu, "enter to change, backspace to clear");
+ Menu_Center(s_keys_menu);
+ }
+
+ static xcommand_t Keys_MenuDraw = new xcommand_t() {
+ public void execute() {
+ Keys_MenuDraw_f();
+ }
+ };
+
+ static void Keys_MenuDraw_f() {
+ Menu_AdjustCursor(s_keys_menu, 1);
+ Menu_Draw(s_keys_menu);
+ }
+
+ static keyfunc_t Keys_MenuKey = new keyfunc_t() {
+ public String execute(int key) {
+ return Keys_MenuKey_f(key);
+ }
+ };
+
+ static String Keys_MenuKey_f(int key) {
+ menuaction_s item = (menuaction_s) Menu_ItemAtCursor(s_keys_menu);
+
+ if (bind_grab) {
+ if (key != K_ESCAPE && key != '`') {
+ //char cmd[1024];
+ String cmd;
+
+ //Com_sprintf(cmd, sizeof(cmd), "bind \"%s\" \"%s\"\n",
+ // Key_KeynumToString(key), bindnames[item.localdata[0]][0]);
+ cmd = "bind \"" + Key.KeynumToString(key) + "\" \""
+ + bindnames[item.localdata[0]][0] + "\"";
+ Cbuf.InsertText(cmd);
+ }
+
+ Menu_SetStatusBar(s_keys_menu,
+ "enter to change, backspace to clear");
+ bind_grab = false;
+ return menu_out_sound;
+ }
+
+ switch (key) {
+ case K_KP_ENTER:
+ case K_ENTER:
+ KeyBindingFunc(item);
+ return menu_in_sound;
+ case K_BACKSPACE: // delete bindings
+ case K_DEL: // delete bindings
+ case K_KP_DEL:
+ UnbindCommand(bindnames[item.localdata[0]][0]);
+ return menu_out_sound;
+ default:
+ return Default_MenuKey(s_keys_menu, key);
+ }
+ }
+
+ static xcommand_t Menu_Keys = new xcommand_t() {
+ public void execute() {
+ Menu_Keys_f();
+ }
+ };
+
+ static void Menu_Keys_f() {
+ Keys_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ Keys_MenuDraw_f();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return Keys_MenuKey_f(key);
+ }
+ });
+ }
+
+ /*
+ * =======================================================================
+ *
+ * CONTROLS MENU
+ *
+ * =======================================================================
+ */
+ static cvar_t win_noalttab;
+
+ static menuframework_s s_options_menu = new menuframework_s();
+
+ static menuaction_s s_options_defaults_action = new menuaction_s();
+
+ static menuaction_s s_options_customize_options_action = new menuaction_s();
+
+ static menuslider_s s_options_sensitivity_slider = new menuslider_s();
+
+ static menulist_s s_options_freelook_box = new menulist_s();
+
+ static menulist_s s_options_noalttab_box = new menulist_s();
+
+ static menulist_s s_options_alwaysrun_box = new menulist_s();
+
+ static menulist_s s_options_invertmouse_box = new menulist_s();
+
+ static menulist_s s_options_lookspring_box = new menulist_s();
+
+ static menulist_s s_options_lookstrafe_box = new menulist_s();
+
+ static menulist_s s_options_crosshair_box = new menulist_s();
+
+ static menuslider_s s_options_sfxvolume_slider = new menuslider_s();
+
+ static menulist_s s_options_joystick_box = new menulist_s();
+
+ static menulist_s s_options_cdvolume_box = new menulist_s();
+
+ static menulist_s s_options_quality_list = new menulist_s();
+
+ //static menulist_s s_options_compatibility_list = new menulist_s();
+ static menuaction_s s_options_console_action = new menuaction_s();
+
+ static void CrosshairFunc(Object unused) {
+ Cvar.SetValue("crosshair", s_options_crosshair_box.curvalue);
+ }
+
+ static void JoystickFunc(Object unused) {
+ Cvar.SetValue("in_joystick", s_options_joystick_box.curvalue);
+ }
+
+ static void CustomizeControlsFunc(Object unused) {
+ Menu_Keys_f();
+ }
+
+ static void AlwaysRunFunc(Object unused) {
+ Cvar.SetValue("cl_run", s_options_alwaysrun_box.curvalue);
+ }
+
+ static void FreeLookFunc(Object unused) {
+ Cvar.SetValue("freelook", s_options_freelook_box.curvalue);
+ }
+
+ static void MouseSpeedFunc(Object unused) {
+ Cvar.SetValue("sensitivity",
+ s_options_sensitivity_slider.curvalue / 2.0F);
+ }
+
+ static void NoAltTabFunc(Object unused) {
+ Cvar.SetValue("win_noalttab", s_options_noalttab_box.curvalue);
+ }
+
+ static float ClampCvar(float min, float max, float value) {
+ if (value < min)
+ return min;
+ if (value > max)
+ return max;
+ return value;
+ }
+
+ static void ControlsSetMenuItemValues() {
+ s_options_sfxvolume_slider.curvalue = Cvar.VariableValue("s_volume") * 10;
+ s_options_cdvolume_box.curvalue = 1 - ((int) Cvar
+ .VariableValue("cd_nocd"));
+ //s_options_quality_list.curvalue = 1 - ((int)
+ // Cvar.VariableValue("s_loadas8bit"));
+ if ("joal".equals(Cvar.VariableString("s_impl"))) {
+ s_options_quality_list.curvalue = 0;
+ } else {
+ s_options_quality_list.curvalue = 1;
+ }
+
+ s_options_sensitivity_slider.curvalue = (sensitivity.value) * 2;
+
+ Cvar.SetValue("cl_run", ClampCvar(0, 1, cl_run.value));
+ s_options_alwaysrun_box.curvalue = (int) cl_run.value;
+
+ s_options_invertmouse_box.curvalue = m_pitch.value < 0 ? 1 : 0;
+
+ Cvar.SetValue("lookspring", ClampCvar(0, 1, lookspring.value));
+ s_options_lookspring_box.curvalue = (int) lookspring.value;
+
+ Cvar.SetValue("lookstrafe", ClampCvar(0, 1, lookstrafe.value));
+ s_options_lookstrafe_box.curvalue = (int) lookstrafe.value;
+
+ Cvar.SetValue("freelook", ClampCvar(0, 1, freelook.value));
+ s_options_freelook_box.curvalue = (int) freelook.value;
+
+ Cvar.SetValue("crosshair", ClampCvar(0, 3, Globals.crosshair.value));
+ s_options_crosshair_box.curvalue = (int) Globals.crosshair.value;
+
+ Cvar.SetValue("in_joystick", ClampCvar(0, 1, in_joystick.value));
+ s_options_joystick_box.curvalue = (int) in_joystick.value;
+
+ s_options_noalttab_box.curvalue = (int) win_noalttab.value;
+ }
+
+ static void ControlsResetDefaultsFunc(Object unused) {
+ Cbuf.AddText("exec default.cfg\n");
+ Cbuf.Execute();
+
+ ControlsSetMenuItemValues();
+ }
+
+ static void InvertMouseFunc(Object unused) {
+ Cvar.SetValue("m_pitch", -m_pitch.value);
+ }
+
+ static void LookspringFunc(Object unused) {
+ Cvar.SetValue("lookspring", 1 - lookspring.value);
+ }
+
+ static void LookstrafeFunc(Object unused) {
+ Cvar.SetValue("lookstrafe", 1 - lookstrafe.value);
+ }
+
+ static void UpdateVolumeFunc(Object unused) {
+ Cvar.SetValue("s_volume", s_options_sfxvolume_slider.curvalue / 10);
+ }
+
+ static void UpdateCDVolumeFunc(Object unused) {
+ Cvar.SetValue("cd_nocd", 1 - s_options_cdvolume_box.curvalue);
+ }
+
+ static void ConsoleFunc(Object unused) {
+ /*
+ * * the proper way to do this is probably to have ToggleConsole_f
+ * accept a parameter
+ */
+
+ if (cl.attractloop) {
+ Cbuf.AddText("killserver\n");
+ return;
+ }
+
+ Key.ClearTyping();
+ Console.ClearNotify();
+
+ ForceMenuOff();
+ cls.key_dest = key_console;
+ }
+
+ static void UpdateSoundQualityFunc(Object unused) {
+ boolean driverNotChanged = false;
+ if (s_options_quality_list.curvalue != 0) {
+ // Cvar.SetValue("s_khz", 22);
+ // Cvar.SetValue("s_loadas8bit", 0);
+ driverNotChanged = S.getDriverName().equals("dummy");
+ Cvar.Set("s_impl", "dummy");
+ } else {
+ // Cvar.SetValue("s_khz", 11);
+ // Cvar.SetValue("s_loadas8bit", 1);
+ driverNotChanged = S.getDriverName().equals("joal");
+ Cvar.Set("s_impl", "joal");
+ }
+
+ //Cvar.SetValue("s_primary", s_options_compatibility_list.curvalue);
+
+ if (driverNotChanged) {
+ re.EndFrame();
+ return;
+ } else {
+
+ DrawTextBox(8, 120 - 48, 36, 3);
+ Print(16 + 16, 120 - 48 + 8, "Restarting the sound system. This");
+ Print(16 + 16, 120 - 48 + 16, "could take up to a minute, so");
+ Print(16 + 16, 120 - 48 + 24, "please be patient.");
+
+ // the text box won't show up unless we do a buffer swap
+ re.EndFrame();
+
+ CL.Snd_Restart_f.execute();
+ }
+ }
+
+ static String cd_music_items[] = { "disabled", "enabled", null };
+
+ static String soundstate_items[] = { "on", "off", null };
+
+ static String compatibility_items[] = { "max compatibility",
+ "max performance", null };
+
+ static String yesno_names[] = { "no", "yes", null };
+
+ static String crosshair_names[] = { "none", "cross", "dot", "angle", null };
+
+ static void Options_MenuInit() {
+
+ win_noalttab = Cvar.Get("win_noalttab", "0", CVAR_ARCHIVE);
+
+ /*
+ * * configure controls menu and menu items
+ */
+ s_options_menu.x = viddef.width / 2;
+ s_options_menu.y = viddef.height / 2 - 58;
+ s_options_menu.nitems = 0;
+
+ s_options_sfxvolume_slider.type = MTYPE_SLIDER;
+ s_options_sfxvolume_slider.x = 0;
+ s_options_sfxvolume_slider.y = 0;
+ s_options_sfxvolume_slider.name = "effects volume";
+ s_options_sfxvolume_slider.callback = new mcallback() {
+ public void execute(Object o) {
+ UpdateVolumeFunc(o);
+ }
+ };
+ s_options_sfxvolume_slider.minvalue = 0;
+ s_options_sfxvolume_slider.maxvalue = 10;
+ s_options_sfxvolume_slider.curvalue = Cvar.VariableValue("s_volume") * 10;
+
+ s_options_cdvolume_box.type = MTYPE_SPINCONTROL;
+ s_options_cdvolume_box.x = 0;
+ s_options_cdvolume_box.y = 10;
+ s_options_cdvolume_box.name = "CD music";
+ s_options_cdvolume_box.callback = new mcallback() {
+ public void execute(Object o) {
+ UpdateCDVolumeFunc(o);
+ }
+ };
+ s_options_cdvolume_box.itemnames = cd_music_items;
+ s_options_cdvolume_box.curvalue = 1 - (int) Cvar
+ .VariableValue("cd_nocd");
+
+ s_options_quality_list.type = MTYPE_SPINCONTROL;
+ s_options_quality_list.x = 0;
+ s_options_quality_list.y = 20;
+ ;
+ s_options_quality_list.name = "sound";
+ s_options_quality_list.callback = new mcallback() {
+ public void execute(Object o) {
+ UpdateSoundQualityFunc(o);
+ }
+ };
+ s_options_quality_list.itemnames = soundstate_items;
+ //s_options_quality_list.curvalue = 1 - (int)
+ // Cvar.VariableValue("s_loadas8bit");
+
+ // s_options_compatibility_list.type = MTYPE_SPINCONTROL;
+ // s_options_compatibility_list.x = 0;
+ // s_options_compatibility_list.y = 30;
+ // s_options_compatibility_list.name = "sound compatibility";
+ // s_options_compatibility_list.callback = new mcallback() {
+ // public void execute(Object o) {
+ // UpdateSoundQualityFunc(o);
+ // }
+ // };
+ // s_options_compatibility_list.itemnames = compatibility_items;
+ // s_options_compatibility_list.curvalue = (int)
+ // Cvar.VariableValue("s_primary");
+
+ s_options_sensitivity_slider.type = MTYPE_SLIDER;
+ s_options_sensitivity_slider.x = 0;
+ s_options_sensitivity_slider.y = 50;
+ s_options_sensitivity_slider.name = "mouse speed";
+ s_options_sensitivity_slider.callback = new mcallback() {
+ public void execute(Object o) {
+ MouseSpeedFunc(o);
+ }
+ };
+ s_options_sensitivity_slider.minvalue = 2;
+ s_options_sensitivity_slider.maxvalue = 22;
+
+ s_options_alwaysrun_box.type = MTYPE_SPINCONTROL;
+ s_options_alwaysrun_box.x = 0;
+ s_options_alwaysrun_box.y = 60;
+ s_options_alwaysrun_box.name = "always run";
+ s_options_alwaysrun_box.callback = new mcallback() {
+ public void execute(Object o) {
+ AlwaysRunFunc(o);
+ }
+ };
+ s_options_alwaysrun_box.itemnames = yesno_names;
+
+ s_options_invertmouse_box.type = MTYPE_SPINCONTROL;
+ s_options_invertmouse_box.x = 0;
+ s_options_invertmouse_box.y = 70;
+ s_options_invertmouse_box.name = "invert mouse";
+ s_options_invertmouse_box.callback = new mcallback() {
+ public void execute(Object o) {
+ InvertMouseFunc(o);
+ }
+ };
+ s_options_invertmouse_box.itemnames = yesno_names;
+
+ s_options_lookspring_box.type = MTYPE_SPINCONTROL;
+ s_options_lookspring_box.x = 0;
+ s_options_lookspring_box.y = 80;
+ s_options_lookspring_box.name = "lookspring";
+ s_options_lookspring_box.callback = new mcallback() {
+ public void execute(Object o) {
+ LookspringFunc(o);
+ }
+ };
+ s_options_lookspring_box.itemnames = yesno_names;
+
+ s_options_lookstrafe_box.type = MTYPE_SPINCONTROL;
+ s_options_lookstrafe_box.x = 0;
+ s_options_lookstrafe_box.y = 90;
+ s_options_lookstrafe_box.name = "lookstrafe";
+ s_options_lookstrafe_box.callback = new mcallback() {
+ public void execute(Object o) {
+ LookstrafeFunc(o);
+ }
+ };
+ s_options_lookstrafe_box.itemnames = yesno_names;
+
+ s_options_freelook_box.type = MTYPE_SPINCONTROL;
+ s_options_freelook_box.x = 0;
+ s_options_freelook_box.y = 100;
+ s_options_freelook_box.name = "free look";
+ s_options_freelook_box.callback = new mcallback() {
+ public void execute(Object o) {
+ FreeLookFunc(o);
+ }
+ };
+ s_options_freelook_box.itemnames = yesno_names;
+
+ s_options_crosshair_box.type = MTYPE_SPINCONTROL;
+ s_options_crosshair_box.x = 0;
+ s_options_crosshair_box.y = 110;
+ s_options_crosshair_box.name = "crosshair";
+ s_options_crosshair_box.callback = new mcallback() {
+ public void execute(Object o) {
+ CrosshairFunc(o);
+ }
+ };
+ s_options_crosshair_box.itemnames = crosshair_names;
+ /*
+ * s_options_noalttab_box.type = MTYPE_SPINCONTROL;
+ * s_options_noalttab_box.x = 0; s_options_noalttab_box.y = 110;
+ * s_options_noalttab_box.name = "disable alt-tab";
+ * s_options_noalttab_box.callback = NoAltTabFunc;
+ * s_options_noalttab_box.itemnames = yesno_names;
+ */
+ s_options_joystick_box.type = MTYPE_SPINCONTROL;
+ s_options_joystick_box.x = 0;
+ s_options_joystick_box.y = 120;
+ s_options_joystick_box.name = "use joystick";
+ s_options_joystick_box.callback = new mcallback() {
+ public void execute(Object o) {
+ JoystickFunc(o);
+ }
+ };
+ s_options_joystick_box.itemnames = yesno_names;
+
+ s_options_customize_options_action.type = MTYPE_ACTION;
+ s_options_customize_options_action.x = 0;
+ s_options_customize_options_action.y = 140;
+ s_options_customize_options_action.name = "customize controls";
+ s_options_customize_options_action.callback = new mcallback() {
+ public void execute(Object o) {
+ CustomizeControlsFunc(o);
+ }
+ };
+
+ s_options_defaults_action.type = MTYPE_ACTION;
+ s_options_defaults_action.x = 0;
+ s_options_defaults_action.y = 150;
+ s_options_defaults_action.name = "reset defaults";
+ s_options_defaults_action.callback = new mcallback() {
+ public void execute(Object o) {
+ ControlsResetDefaultsFunc(o);
+ }
+ };
+
+ s_options_console_action.type = MTYPE_ACTION;
+ s_options_console_action.x = 0;
+ s_options_console_action.y = 160;
+ s_options_console_action.name = "go to console";
+ s_options_console_action.callback = new mcallback() {
+ public void execute(Object o) {
+ ConsoleFunc(o);
+ }
+ };
+
+ ControlsSetMenuItemValues();
+
+ Menu_AddItem(s_options_menu, s_options_sfxvolume_slider);
+
+ Menu_AddItem(s_options_menu, s_options_cdvolume_box);
+ Menu_AddItem(s_options_menu, s_options_quality_list);
+ // Menu_AddItem(s_options_menu, s_options_compatibility_list);
+ Menu_AddItem(s_options_menu, s_options_sensitivity_slider);
+ Menu_AddItem(s_options_menu, s_options_alwaysrun_box);
+ Menu_AddItem(s_options_menu, s_options_invertmouse_box);
+ Menu_AddItem(s_options_menu, s_options_lookspring_box);
+ Menu_AddItem(s_options_menu, s_options_lookstrafe_box);
+ Menu_AddItem(s_options_menu, s_options_freelook_box);
+ Menu_AddItem(s_options_menu, s_options_crosshair_box);
+ // Menu_AddItem(s_options_menu, s_options_joystick_box);
+ Menu_AddItem(s_options_menu, s_options_customize_options_action);
+ Menu_AddItem(s_options_menu, s_options_defaults_action);
+ Menu_AddItem(s_options_menu, s_options_console_action);
+ }
+
+ static void Options_MenuDraw() {
+ Banner("m_banner_options");
+ Menu_AdjustCursor(s_options_menu, 1);
+ Menu_Draw(s_options_menu);
+ }
+
+ static String Options_MenuKey(int key) {
+ return Default_MenuKey(s_options_menu, key);
+ }
+
+ static xcommand_t Menu_Options = new xcommand_t() {
+ public void execute() {
+ Menu_Options_f();
+ }
+ };
+
+ static void Menu_Options_f() {
+ Options_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ Options_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return Options_MenuKey(key);
+ }
+ });
+ }
+
+ /*
+ * =======================================================================
+ *
+ * VIDEO MENU
+ *
+ * =======================================================================
+ */
+
+ static xcommand_t Menu_Video = new xcommand_t() {
+ public void execute() {
+ Menu_Video_f();
+ }
+ };
+
+ static void Menu_Video_f() {
+ VID.MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ VID.MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return VID.MenuKey(key);
+ }
+ });
+ }
+
+ /*
+ * =============================================================================
+ *
+ * END GAME MENU
+ *
+ * =============================================================================
+ */
+ static int credits_start_time;
+
+ static String creditsIndex[] = new String[256];
+
+ static String creditsBuffer;
+
+ static String idcredits[] = { "+QUAKE II BY ID SOFTWARE", "",
+ "+PROGRAMMING", "John Carmack", "John Cash", "Brian Hook", "",
+ "+JAVA PORT BY BYTONIC", "CWEI", "HOZ", "RST", "", "+ART",
+ "Adrian Carmack", "Kevin Cloud", "Paul Steed", "", "+LEVEL DESIGN",
+ "Tim Willits", "American McGee", "Christian Antkow",
+ "Paul Jaquays", "Brandon James", "", "+BIZ", "Todd Hollenshead",
+ "Barrett (Bear) Alexander", "Donna Jackson", "", "",
+ "+SPECIAL THANKS", "Ben Donges for beta testing", "", "", "", "",
+ "", "", "+ADDITIONAL SUPPORT", "", "+LINUX PORT AND CTF",
+ "Dave \"Zoid\" Kirsch", "", "+CINEMATIC SEQUENCES",
+ "Ending Cinematic by Blur Studio - ", "Venice, CA", "",
+ "Environment models for Introduction",
+ "Cinematic by Karl Dolgener", "",
+ "Assistance with environment design", "by Cliff Iwai", "",
+ "+SOUND EFFECTS AND MUSIC",
+ "Sound Design by Soundelux Media Labs.",
+ "Music Composed and Produced by",
+ "Soundelux Media Labs. Special thanks",
+ "to Bill Brown, Tom Ozanich, Brian",
+ "Celano, Jeff Eisner, and The Soundelux", "Players.", "",
+ "\"Level Music\" by Sonic Mayhem", "www.sonicmayhem.com", "",
+ "\"Quake II Theme Song\"", "(C) 1997 Rob Zombie. All Rights",
+ "Reserved.", "", "Track 10 (\"Climb\") by Jer Sypult", "",
+ "Voice of computers by", "Carly Staehlin-Taylor", "",
+ "+THANKS TO ACTIVISION", "+IN PARTICULAR:", "", "John Tam",
+ "Steve Rosenthal", "Marty Stratton", "Henk Hartong", "",
+ "Quake II(tm) (C)1997 Id Software, Inc.",
+ "All Rights Reserved. Distributed by",
+ "Activision, Inc. under license.",
+ "Quake II(tm), the Id Software name,",
+ "the \"Q II\"(tm) logo and id(tm)",
+ "logo are trademarks of Id Software,",
+ "Inc. Activision(R) is a registered",
+ "trademark of Activision, Inc. All",
+ "other trademarks and trade names are",
+ "properties of their respective owners.", null };
+
+ static String credits[] = idcredits;
+
+ static String xatcredits[] = { "+QUAKE II MISSION PACK: THE RECKONING",
+ "+BY", "+XATRIX ENTERTAINMENT, INC.", "", "+DESIGN AND DIRECTION",
+ "Drew Markham", "", "+PRODUCED BY", "Greg Goodrich", "",
+ "+PROGRAMMING", "Rafael Paiz", "",
+ "+LEVEL DESIGN / ADDITIONAL GAME DESIGN", "Alex Mayberry", "",
+ "+LEVEL DESIGN", "Mal Blackwell", "Dan Koppel", "",
+ "+ART DIRECTION", "Michael \"Maxx\" Kaufman", "",
+ "+COMPUTER GRAPHICS SUPERVISOR AND",
+ "+CHARACTER ANIMATION DIRECTION", "Barry Dempsey", "",
+ "+SENIOR ANIMATOR AND MODELER", "Jason Hoover", "",
+ "+CHARACTER ANIMATION AND", "+MOTION CAPTURE SPECIALIST",
+ "Amit Doron", "", "+ART", "Claire Praderie-Markham",
+ "Viktor Antonov", "Corky Lehmkuhl", "", "+INTRODUCTION ANIMATION",
+ "Dominique Drozdz", "", "+ADDITIONAL LEVEL DESIGN", "Aaron Barber",
+ "Rhett Baldwin", "", "+3D CHARACTER ANIMATION TOOLS",
+ "Gerry Tyra, SA Technology", "",
+ "+ADDITIONAL EDITOR TOOL PROGRAMMING", "Robert Duffy", "",
+ "+ADDITIONAL PROGRAMMING", "Ryan Feltrin", "",
+ "+PRODUCTION COORDINATOR", "Victoria Sylvester", "",
+ "+SOUND DESIGN", "Gary Bradfield", "", "+MUSIC BY", "Sonic Mayhem",
+ "", "", "", "+SPECIAL THANKS", "+TO",
+ "+OUR FRIENDS AT ID SOFTWARE", "", "John Carmack", "John Cash",
+ "Brian Hook", "Adrian Carmack", "Kevin Cloud", "Paul Steed",
+ "Tim Willits", "Christian Antkow", "Paul Jaquays", "Brandon James",
+ "Todd Hollenshead", "Barrett (Bear) Alexander",
+ "Dave \"Zoid\" Kirsch", "Donna Jackson", "", "", "",
+ "+THANKS TO ACTIVISION", "+IN PARTICULAR:", "", "Marty Stratton",
+ "Henk \"The Original Ripper\" Hartong", "Kevin Kraff",
+ "Jamey Gottlieb", "Chris Hepburn", "", "+AND THE GAME TESTERS", "",
+ "Tim Vanlaw", "Doug Jacobs", "Steven Rosenthal", "David Baker",
+ "Chris Campbell", "Aaron Casillas", "Steve Elwell",
+ "Derek Johnstone", "Igor Krinitskiy", "Samantha Lee",
+ "Michael Spann", "Chris Toft", "Juan Valdes", "",
+ "+THANKS TO INTERGRAPH COMPUTER SYTEMS", "+IN PARTICULAR:", "",
+ "Michael T. Nicolaou", "", "",
+ "Quake II Mission Pack: The Reckoning",
+ "(tm) (C)1998 Id Software, Inc. All",
+ "Rights Reserved. Developed by Xatrix",
+ "Entertainment, Inc. for Id Software,",
+ "Inc. Distributed by Activision Inc.",
+ "under license. Quake(R) is a",
+ "registered trademark of Id Software,",
+ "Inc. Quake II Mission Pack: The",
+ "Reckoning(tm), Quake II(tm), the Id",
+ "Software name, the \"Q II\"(tm) logo",
+ "and id(tm) logo are trademarks of Id",
+ "Software, Inc. Activision(R) is a",
+ "registered trademark of Activision,",
+ "Inc. Xatrix(R) is a registered",
+ "trademark of Xatrix Entertainment,",
+ "Inc. All other trademarks and trade",
+ "names are properties of their", "respective owners.", null };
+
+ static String roguecredits[] = { "+QUAKE II MISSION PACK 2: GROUND ZERO",
+ "+BY", "+ROGUE ENTERTAINMENT, INC.", "", "+PRODUCED BY",
+ "Jim Molinets", "", "+PROGRAMMING", "Peter Mack",
+ "Patrick Magruder", "", "+LEVEL DESIGN", "Jim Molinets",
+ "Cameron Lamprecht", "Berenger Fish", "Robert Selitto",
+ "Steve Tietze", "Steve Thoms", "", "+ART DIRECTION",
+ "Rich Fleider", "", "+ART", "Rich Fleider", "Steve Maines",
+ "Won Choi", "", "+ANIMATION SEQUENCES", "Creat Studios",
+ "Steve Maines", "", "+ADDITIONAL LEVEL DESIGN", "Rich Fleider",
+ "Steve Maines", "Peter Mack", "", "+SOUND", "James Grunke", "",
+ "+GROUND ZERO THEME", "+AND", "+MUSIC BY", "Sonic Mayhem", "",
+ "+VWEP MODELS", "Brent \"Hentai\" Dill", "", "", "",
+ "+SPECIAL THANKS", "+TO", "+OUR FRIENDS AT ID SOFTWARE", "",
+ "John Carmack", "John Cash", "Brian Hook", "Adrian Carmack",
+ "Kevin Cloud", "Paul Steed", "Tim Willits", "Christian Antkow",
+ "Paul Jaquays", "Brandon James", "Todd Hollenshead",
+ "Barrett (Bear) Alexander", "Katherine Anna Kang", "Donna Jackson",
+ "Dave \"Zoid\" Kirsch", "", "", "", "+THANKS TO ACTIVISION",
+ "+IN PARTICULAR:", "", "Marty Stratton", "Henk Hartong",
+ "Mitch Lasky", "Steve Rosenthal", "Steve Elwell", "",
+ "+AND THE GAME TESTERS", "", "The Ranger Clan",
+ "Dave \"Zoid\" Kirsch", "Nihilistic Software", "Robert Duffy", "",
+ "And Countless Others", "", "", "",
+ "Quake II Mission Pack 2: Ground Zero",
+ "(tm) (C)1998 Id Software, Inc. All",
+ "Rights Reserved. Developed by Rogue",
+ "Entertainment, Inc. for Id Software,",
+ "Inc. Distributed by Activision Inc.",
+ "under license. Quake(R) is a",
+ "registered trademark of Id Software,",
+ "Inc. Quake II Mission Pack 2: Ground",
+ "Zero(tm), Quake II(tm), the Id",
+ "Software name, the \"Q II\"(tm) logo",
+ "and id(tm) logo are trademarks of Id",
+ "Software, Inc. Activision(R) is a",
+ "registered trademark of Activision,",
+ "Inc. Rogue(R) is a registered",
+ "trademark of Rogue Entertainment,",
+ "Inc. All other trademarks and trade",
+ "names are properties of their", "respective owners.", null };
+
+ public static void Credits_MenuDraw() {
+ int i, y;
+
+ /*
+ * * draw the credits
+ */
+ for (i = 0, y = (int) (viddef.height - ((cls.realtime - credits_start_time) / 40.0F)); credits[i] != null
+ && y < viddef.height; y += 10, i++) {
+ int j, stringoffset = 0;
+ boolean bold = false;
+
+ if (y <= -8)
+ continue;
+
+ if (credits[i].length() > 0 && credits[i].charAt(0) == '+') {
+ bold = true;
+ stringoffset = 1;
+ } else {
+ bold = false;
+ stringoffset = 0;
+ }
+
+ for (j = 0; j + stringoffset < credits[i].length(); j++) {
+ int x;
+
+ x = (viddef.width - credits[i].length() * 8 - stringoffset * 8)
+ / 2 + (j + stringoffset) * 8;
+
+ if (bold)
+ re
+ .DrawChar(x, y,
+ credits[i].charAt(j + stringoffset) + 128);
+ else
+ re.DrawChar(x, y, credits[i].charAt(j + stringoffset));
+ }
+ }
+
+ if (y < 0)
+ credits_start_time = cls.realtime;
+ }
+
+ public static String Credits_Key(int key) {
+ switch (key) {
+ case K_ESCAPE:
+ if (creditsBuffer != null)
+ //FS.FreeFile(creditsBuffer);
+ ;
+ PopMenu();
+ break;
+ }
+
+ return menu_out_sound;
+
+ }
+
+ static xcommand_t Menu_Credits = new xcommand_t() {
+ public void execute() {
+ Menu_Credits_f();
+ }
+ };
+
+ static void Menu_Credits_f() {
+ int n;
+ int isdeveloper = 0;
+
+ byte b[] = FS.LoadFile("credits");
+
+ if (b != null) {
+ creditsBuffer = new String(b);
+ String line[] = Lib.linesplit(creditsBuffer);
+
+ for (n = 0; n < line.length; n++) {
+ creditsIndex[n] = line[n];
+ }
+
+ creditsIndex[n] = null;
+ credits = creditsIndex;
+ } else {
+ isdeveloper = FS.Developer_searchpath(1);
+
+ if (isdeveloper == 1) // xatrix
+ credits = xatcredits;
+ else if (isdeveloper == 2) // ROGUE
+ credits = roguecredits;
+ else {
+ credits = idcredits;
+ }
+
+ }
+
+ credits_start_time = cls.realtime;
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ Credits_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return Credits_Key(key);
+ }
+ });
+ }
+
+ /*
+ * =============================================================================
+ *
+ * GAME MENU
+ *
+ * =============================================================================
+ */
+
+ static int m_game_cursor;
+
+ static menuframework_s s_game_menu = new menuframework_s();
+
+ static menuaction_s s_easy_game_action = new menuaction_s();
+
+ static menuaction_s s_medium_game_action = new menuaction_s();
+
+ static menuaction_s s_hard_game_action = new menuaction_s();
+
+ static menuaction_s s_load_game_action = new menuaction_s();
+
+ static menuaction_s s_save_game_action = new menuaction_s();
+
+ static menuaction_s s_credits_action = new menuaction_s();
+
+ static menuseparator_s s_blankline = new menuseparator_s();
+
+ static void StartGame() {
+ // disable updates and start the cinematic going
+ cl.servercount = -1;
+ ForceMenuOff();
+ Cvar.SetValue("deathmatch", 0);
+ Cvar.SetValue("coop", 0);
+
+ Cvar.SetValue("gamerules", 0); //PGM
+
+ Cbuf.AddText("loading ; killserver ; wait ; newgame\n");
+ cls.key_dest = key_game;
+ }
+
+ static void EasyGameFunc(Object data) {
+ Cvar.ForceSet("skill", "0");
+ StartGame();
+ }
+
+ static void MediumGameFunc(Object data) {
+ Cvar.ForceSet("skill", "1");
+ StartGame();
+ }
+
+ static void HardGameFunc(Object data) {
+ Cvar.ForceSet("skill", "2");
+ StartGame();
+ }
+
+ static void LoadGameFunc(Object unused) {
+ Menu_LoadGame_f();
+ }
+
+ static void SaveGameFunc(Object unused) {
+ Menu_SaveGame_f();
+ }
+
+ static void CreditsFunc(Object unused) {
+ Menu_Credits_f();
+ }
+
+ static String difficulty_names[] = { "easy", "medium",
+ "fuckin shitty hard", null };
+
+ static void Game_MenuInit() {
+
+ s_game_menu.x = (int) (viddef.width * 0.50);
+ s_game_menu.nitems = 0;
+
+ s_easy_game_action.type = MTYPE_ACTION;
+ s_easy_game_action.flags = QMF_LEFT_JUSTIFY;
+ s_easy_game_action.x = 0;
+ s_easy_game_action.y = 0;
+ s_easy_game_action.name = "easy";
+ s_easy_game_action.callback = new mcallback() {
+ public void execute(Object o) {
+ EasyGameFunc(o);
+ }
+ };
+
+ s_medium_game_action.type = MTYPE_ACTION;
+ s_medium_game_action.flags = QMF_LEFT_JUSTIFY;
+ s_medium_game_action.x = 0;
+ s_medium_game_action.y = 10;
+ s_medium_game_action.name = "medium";
+ s_medium_game_action.callback = new mcallback() {
+ public void execute(Object o) {
+ MediumGameFunc(o);
+ }
+ };
+
+ s_hard_game_action.type = MTYPE_ACTION;
+ s_hard_game_action.flags = QMF_LEFT_JUSTIFY;
+ s_hard_game_action.x = 0;
+ s_hard_game_action.y = 20;
+ s_hard_game_action.name = "hard";
+ s_hard_game_action.callback = new mcallback() {
+ public void execute(Object o) {
+ HardGameFunc(o);
+ }
+ };
+
+ s_blankline.type = MTYPE_SEPARATOR;
+
+ s_load_game_action.type = MTYPE_ACTION;
+ s_load_game_action.flags = QMF_LEFT_JUSTIFY;
+ s_load_game_action.x = 0;
+ s_load_game_action.y = 40;
+ s_load_game_action.name = "load game";
+ s_load_game_action.callback = new mcallback() {
+ public void execute(Object o) {
+ LoadGameFunc(o);
+ }
+ };
+
+ s_save_game_action.type = MTYPE_ACTION;
+ s_save_game_action.flags = QMF_LEFT_JUSTIFY;
+ s_save_game_action.x = 0;
+ s_save_game_action.y = 50;
+ s_save_game_action.name = "save game";
+ s_save_game_action.callback = new mcallback() {
+ public void execute(Object o) {
+ SaveGameFunc(o);
+ }
+ };
+
+ s_credits_action.type = MTYPE_ACTION;
+ s_credits_action.flags = QMF_LEFT_JUSTIFY;
+ s_credits_action.x = 0;
+ s_credits_action.y = 60;
+ s_credits_action.name = "credits";
+ s_credits_action.callback = new mcallback() {
+ public void execute(Object o) {
+ CreditsFunc(o);
+ }
+ };
+
+ Menu_AddItem(s_game_menu, s_easy_game_action);
+ Menu_AddItem(s_game_menu, s_medium_game_action);
+ Menu_AddItem(s_game_menu, s_hard_game_action);
+ Menu_AddItem(s_game_menu, s_blankline);
+ Menu_AddItem(s_game_menu, s_load_game_action);
+ Menu_AddItem(s_game_menu, s_save_game_action);
+ Menu_AddItem(s_game_menu, s_blankline);
+ Menu_AddItem(s_game_menu, s_credits_action);
+
+ Menu_Center(s_game_menu);
+ }
+
+ static void Game_MenuDraw() {
+ Banner("m_banner_game");
+ Menu_AdjustCursor(s_game_menu, 1);
+ Menu_Draw(s_game_menu);
+ }
+
+ static String Game_MenuKey(int key) {
+ return Default_MenuKey(s_game_menu, key);
+ }
+
+ static xcommand_t Menu_Game = new xcommand_t() {
+ public void execute() {
+ Menu_Game_f();
+ }
+ };
+
+ static void Menu_Game_f() {
+ Game_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ Game_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return Game_MenuKey(key);
+ }
+ });
+ m_game_cursor = 1;
+ }
+
+ /*
+ * =============================================================================
+ *
+ * LOADGAME MENU
+ *
+ * =============================================================================
+ */
+
+ public final static int MAX_SAVEGAMES = 15;
+
+ static menuframework_s s_savegame_menu = new menuframework_s();
+
+ static menuframework_s s_loadgame_menu = new menuframework_s();
+
+ static menuaction_s s_loadgame_actions[] = new menuaction_s[MAX_SAVEGAMES];
+
+ static {
+ for (int n = 0; n < MAX_SAVEGAMES; n++)
+ s_loadgame_actions[n] = new menuaction_s();
+ }
+
+ //String m_savestrings[] = new String [MAX_SAVEGAMES][32];
+ static String m_savestrings[] = new String[MAX_SAVEGAMES];
+
+ static {
+ for (int n = 0; n < MAX_SAVEGAMES; n++)
+ m_savestrings[n] = "";
+ }
+
+ static boolean m_savevalid[] = new boolean[MAX_SAVEGAMES];
+
+ /** Search the save dir for saved games and their names. */
+ static void Create_Savestrings() {
+ int i;
+ QuakeFile f;
+ String name;
+
+ for (i = 0; i < MAX_SAVEGAMES; i++) {
+
+ m_savestrings[i] = "<EMPTY>";
+ name = FS.Gamedir() + "/save/save" + i + "/server.ssv";
+
+ try {
+ f = new QuakeFile(name, "r");
+ if (f == null) {
+ m_savestrings[i] = "<EMPTY>";
+ m_savevalid[i] = false;
+ } else {
+ String str = f.readString();
+ if (str != null)
+ m_savestrings[i] = str;
+ f.close();
+ m_savevalid[i] = true;
+ }
+ } catch (Exception e) {
+ m_savestrings[i] = "<EMPTY>";
+ m_savevalid[i] = false;
+ }
+ ;
+ }
+ }
+
+ static void LoadGameCallback(Object self) {
+ menuaction_s a = (menuaction_s) self;
+
+ if (m_savevalid[a.localdata[0]])
+ Cbuf.AddText("load save" + a.localdata[0] + "\n");
+ ForceMenuOff();
+ }
+
+ static void LoadGame_MenuInit() {
+ int i;
+
+ s_loadgame_menu.x = viddef.width / 2 - 120;
+ s_loadgame_menu.y = viddef.height / 2 - 58;
+ s_loadgame_menu.nitems = 0;
+
+ Create_Savestrings();
+
+ for (i = 0; i < MAX_SAVEGAMES; i++) {
+ s_loadgame_actions[i].name = m_savestrings[i];
+ s_loadgame_actions[i].flags = QMF_LEFT_JUSTIFY;
+ s_loadgame_actions[i].localdata[0] = i;
+ s_loadgame_actions[i].callback = new mcallback() {
+ public void execute(Object o) {
+ LoadGameCallback(o);
+ }
+ };
+
+ s_loadgame_actions[i].x = 0;
+ s_loadgame_actions[i].y = (i) * 10;
+ if (i > 0) // separate from autosave
+ s_loadgame_actions[i].y += 10;
+
+ s_loadgame_actions[i].type = MTYPE_ACTION;
+
+ Menu_AddItem(s_loadgame_menu, s_loadgame_actions[i]);
+ }
+ }
+
+ static void LoadGame_MenuDraw() {
+ Banner("m_banner_load_game");
+ // Menu_AdjustCursor( &s_loadgame_menu, 1 );
+ Menu_Draw(s_loadgame_menu);
+ }
+
+ static String LoadGame_MenuKey(int key) {
+ if (key == K_ESCAPE || key == K_ENTER) {
+ s_savegame_menu.cursor = s_loadgame_menu.cursor - 1;
+ if (s_savegame_menu.cursor < 0)
+ s_savegame_menu.cursor = 0;
+ }
+ return Default_MenuKey(s_loadgame_menu, key);
+ }
+
+ static xcommand_t Menu_LoadGame = new xcommand_t() {
+ public void execute() {
+ Menu_LoadGame_f();
+ }
+ };
+
+ static void Menu_LoadGame_f() {
+ LoadGame_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ LoadGame_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return LoadGame_MenuKey(key);
+ }
+ });
+ }
+
+ /*
+ * =============================================================================
+ *
+ * SAVEGAME MENU
+ *
+ * =============================================================================
+ */
+ //static menuframework_s s_savegame_menu;
+ static menuaction_s s_savegame_actions[] = new menuaction_s[MAX_SAVEGAMES];
+
+ static {
+ for (int n = 0; n < MAX_SAVEGAMES; n++)
+ s_savegame_actions[n] = new menuaction_s();
+
+ }
+
+ static void SaveGameCallback(Object self) {
+ menuaction_s a = (menuaction_s) self;
+
+ Cbuf.AddText("save save" + a.localdata[0] + "\n");
+ ForceMenuOff();
+ }
+
+ static void SaveGame_MenuDraw() {
+ Banner("m_banner_save_game");
+ Menu_AdjustCursor(s_savegame_menu, 1);
+ Menu_Draw(s_savegame_menu);
+ }
+
+ static void SaveGame_MenuInit() {
+ int i;
+
+ s_savegame_menu.x = viddef.width / 2 - 120;
+ s_savegame_menu.y = viddef.height / 2 - 58;
+ s_savegame_menu.nitems = 0;
+
+ Create_Savestrings();
+
+ // don't include the autosave slot
+ for (i = 0; i < MAX_SAVEGAMES - 1; i++) {
+ s_savegame_actions[i].name = m_savestrings[i + 1];
+ s_savegame_actions[i].localdata[0] = i + 1;
+ s_savegame_actions[i].flags = QMF_LEFT_JUSTIFY;
+ s_savegame_actions[i].callback = new mcallback() {
+ public void execute(Object o) {
+ SaveGameCallback(o);
+ }
+ };
+
+ s_savegame_actions[i].x = 0;
+ s_savegame_actions[i].y = (i) * 10;
+
+ s_savegame_actions[i].type = MTYPE_ACTION;
+
+ Menu_AddItem(s_savegame_menu, s_savegame_actions[i]);
+ }
+ }
+
+ static String SaveGame_MenuKey(int key) {
+ if (key == K_ENTER || key == K_ESCAPE) {
+ s_loadgame_menu.cursor = s_savegame_menu.cursor - 1;
+ if (s_loadgame_menu.cursor < 0)
+ s_loadgame_menu.cursor = 0;
+ }
+ return Default_MenuKey(s_savegame_menu, key);
+ }
+
+ static xcommand_t Menu_SaveGame = new xcommand_t() {
+ public void execute() {
+ Menu_SaveGame_f();
+ }
+ };
+
+ static void Menu_SaveGame_f() {
+ if (0 == Globals.server_state)
+ return; // not playing a game
+
+ SaveGame_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ SaveGame_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return SaveGame_MenuKey(key);
+ }
+ });
+ Create_Savestrings();
+ }
+
+ /*
+ * =============================================================================
+ *
+ * JOIN SERVER MENU
+ *
+ * =============================================================================
+ */
+
+ static menuframework_s s_joinserver_menu = new menuframework_s();
+
+ static menuseparator_s s_joinserver_server_title = new menuseparator_s();
+
+ static menuaction_s s_joinserver_search_action = new menuaction_s();
+
+ static menuaction_s s_joinserver_address_book_action = new menuaction_s();
+
+ static netadr_t local_server_netadr[] = new netadr_t[MAX_LOCAL_SERVERS];
+
+ static String local_server_names[] = new String[MAX_LOCAL_SERVERS]; //[80];
+
+ static menuaction_s s_joinserver_server_actions[] = new menuaction_s[MAX_LOCAL_SERVERS];
+
+ // user readable information
+ // network address
+ static {
+ for (int n = 0; n < MAX_LOCAL_SERVERS; n++) {
+ local_server_netadr[n] = new netadr_t();
+ local_server_names[n] = "";
+ s_joinserver_server_actions[n] = new menuaction_s();
+ s_joinserver_server_actions[n].n = n;
+ }
+ }
+
+ static int m_num_servers;
+
+ static void AddToServerList(netadr_t adr, String info) {
+ int i;
+
+ if (m_num_servers == MAX_LOCAL_SERVERS)
+ return;
+
+ String x = info.trim();
+
+ // ignore if duplicated
+
+ for (i = 0; i < m_num_servers; i++)
+ if (x.equals(local_server_names[i]))
+ return;
+
+ local_server_netadr[m_num_servers] = adr;
+ local_server_names[m_num_servers] = x;
+ m_num_servers++;
+ }
+
+ static void JoinServerFunc(Object self) {
+ String buffer;
+ int index;
+
+ index = ((menucommon_s) self).n;
+
+ if (Lib.Q_stricmp(local_server_names[index], NO_SERVER_STRING) == 0)
+ return;
+
+ if (index >= m_num_servers)
+ return;
+
+ buffer = "connect " + NET.AdrToString(local_server_netadr[index])
+ + "\n";
+ Cbuf.AddText(buffer);
+ ForceMenuOff();
+ }
+
+ static void AddressBookFunc(Object self) {
+ Menu_AddressBook_f();
+ }
+
+ static void NullCursorDraw(Object self) {
+ }
+
+ static void SearchLocalGames() {
+ int i;
+
+ m_num_servers = 0;
+ for (i = 0; i < MAX_LOCAL_SERVERS; i++)
+ local_server_names[i] = NO_SERVER_STRING;
+
+ DrawTextBox(8, 120 - 48, 36, 3);
+ Print(16 + 16, 120 - 48 + 8, "Searching for local servers, this");
+ Print(16 + 16, 120 - 48 + 16, "could take up to a minute, so");
+ Print(16 + 16, 120 - 48 + 24, "please be patient.");
+
+ // the text box won't show up unless we do a buffer swap
+ re.EndFrame();
+
+ // send out info packets
+ CL.PingServers_f.execute();
+ }
+
+ static void SearchLocalGamesFunc(Object self) {
+ SearchLocalGames();
+ }
+
+ static void JoinServer_MenuInit() {
+ int i;
+
+ s_joinserver_menu.x = (int) (viddef.width * 0.50 - 120);
+ s_joinserver_menu.nitems = 0;
+
+ s_joinserver_address_book_action.type = MTYPE_ACTION;
+ s_joinserver_address_book_action.name = "address book";
+ s_joinserver_address_book_action.flags = QMF_LEFT_JUSTIFY;
+ s_joinserver_address_book_action.x = 0;
+ s_joinserver_address_book_action.y = 0;
+ s_joinserver_address_book_action.callback = new mcallback() {
+ public void execute(Object o) {
+ AddressBookFunc(o);
+ }
+ };
+
+ s_joinserver_search_action.type = MTYPE_ACTION;
+ s_joinserver_search_action.name = "refresh server list";
+ s_joinserver_search_action.flags = QMF_LEFT_JUSTIFY;
+ s_joinserver_search_action.x = 0;
+ s_joinserver_search_action.y = 10;
+ s_joinserver_search_action.callback = new mcallback() {
+ public void execute(Object o) {
+ SearchLocalGamesFunc(o);
+ }
+ };
+ s_joinserver_search_action.statusbar = "search for servers";
+
+ s_joinserver_server_title.type = MTYPE_SEPARATOR;
+ s_joinserver_server_title.name = "connect to...";
+ s_joinserver_server_title.x = 80;
+ s_joinserver_server_title.y = 30;
+
+ for (i = 0; i < MAX_LOCAL_SERVERS; i++) {
+ s_joinserver_server_actions[i].type = MTYPE_ACTION;
+ local_server_names[i] = NO_SERVER_STRING;
+ s_joinserver_server_actions[i].name = local_server_names[i];
+ s_joinserver_server_actions[i].flags = QMF_LEFT_JUSTIFY;
+ s_joinserver_server_actions[i].x = 0;
+ s_joinserver_server_actions[i].y = 40 + i * 10;
+ s_joinserver_server_actions[i].callback = new mcallback() {
+ public void execute(Object o) {
+ JoinServerFunc(o);
+ }
+ };
+ s_joinserver_server_actions[i].statusbar = "press ENTER to connect";
+ }
+
+ Menu_AddItem(s_joinserver_menu, s_joinserver_address_book_action);
+ Menu_AddItem(s_joinserver_menu, s_joinserver_server_title);
+ Menu_AddItem(s_joinserver_menu, s_joinserver_search_action);
+
+ for (i = 0; i < 8; i++)
+ Menu_AddItem(s_joinserver_menu, s_joinserver_server_actions[i]);
+
+ Menu_Center(s_joinserver_menu);
+
+ SearchLocalGames();
+ }
+
+ static void JoinServer_MenuDraw() {
+ Banner("m_banner_join_server");
+ Menu_Draw(s_joinserver_menu);
+ }
+
+ static String JoinServer_MenuKey(int key) {
+ return Default_MenuKey(s_joinserver_menu, key);
+ }
+
+ static xcommand_t Menu_JoinServer = new xcommand_t() {
+ public void execute() {
+ Menu_JoinServer_f();
+ }
+ };
+
+ static void Menu_JoinServer_f() {
+ JoinServer_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ JoinServer_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return JoinServer_MenuKey(key);
+ }
+ });
+ }
+
+ /*
+ * =============================================================================
+ *
+ * START SERVER MENU
+ *
+ * =============================================================================
+ */
+ static menuframework_s s_startserver_menu = new menuframework_s();
+
+ static String mapnames[];
+
+ static int nummaps;
+
+ static menuaction_s s_startserver_start_action = new menuaction_s();
+
+ static menuaction_s s_startserver_dmoptions_action = new menuaction_s();
+
+ static menufield_s s_timelimit_field = new menufield_s();
+
+ static menufield_s s_fraglimit_field = new menufield_s();
+
+ static menufield_s s_maxclients_field = new menufield_s();
+
+ static menufield_s s_hostname_field = new menufield_s();
+
+ static menulist_s s_startmap_list = new menulist_s();
+
+ static menulist_s s_rules_box = new menulist_s();
+
+ static void DMOptionsFunc(Object self) {
+ if (s_rules_box.curvalue == 1)
+ return;
+ Menu_DMOptions_f();
+ }
+
+ static void RulesChangeFunc(Object self) {
+ // DM
+ if (s_rules_box.curvalue == 0) {
+ s_maxclients_field.statusbar = null;
+ s_startserver_dmoptions_action.statusbar = null;
+ } else if (s_rules_box.curvalue == 1)
+ // coop // PGM
+ {
+ s_maxclients_field.statusbar = "4 maximum for cooperative";
+ if (Lib.atoi(s_maxclients_field.buffer.toString()) > 4)
+ s_maxclients_field.buffer = new StringBuffer("4");
+ s_startserver_dmoptions_action.statusbar = "N/A for cooperative";
+ }
+ // =====
+ // PGM
+ // ROGUE GAMES
+ else if (FS.Developer_searchpath(2) == 2) {
+ if (s_rules_box.curvalue == 2) // tag
+ {
+ s_maxclients_field.statusbar = null;
+ s_startserver_dmoptions_action.statusbar = null;
+ }
+ /*
+ * else if(s_rules_box.curvalue == 3) // deathball {
+ * s_maxclients_field.statusbar = null;
+ * s_startserver_dmoptions_action.statusbar = null; }
+ */
+ }
+ // PGM
+ // =====
+ }
+
+ static void StartServerActionFunc(Object self) {
+ //char startmap[1024];
+ String startmap;
+ int timelimit;
+ int fraglimit;
+ int maxclients;
+ String spot;
+
+ //strcpy(startmap, strchr(mapnames[s_startmap_list.curvalue], '\n') +
+ // 1);
+ String x = mapnames[s_startmap_list.curvalue];
+
+ int pos = x.indexOf('\n');
+ if (pos == -1)
+ startmap = x;
+ else
+ startmap = x.substring(pos + 1, x.length());
+
+ maxclients = Lib.atoi(s_maxclients_field.buffer.toString());
+ timelimit = Lib.atoi(s_timelimit_field.buffer.toString());
+ fraglimit = Lib.atoi(s_fraglimit_field.buffer.toString());
+
+ Cvar.SetValue("maxclients", ClampCvar(0, maxclients, maxclients));
+ Cvar.SetValue("timelimit", ClampCvar(0, timelimit, timelimit));
+ Cvar.SetValue("fraglimit", ClampCvar(0, fraglimit, fraglimit));
+ Cvar.Set("hostname", s_hostname_field.buffer.toString());
+ // Cvar.SetValue ("deathmatch", !s_rules_box.curvalue );
+ // Cvar.SetValue ("coop", s_rules_box.curvalue );
+
+ // PGM
+ if ((s_rules_box.curvalue < 2) || (FS.Developer_searchpath(2) != 2)) {
+ Cvar.SetValue("deathmatch", 1 - (int) (s_rules_box.curvalue));
+ Cvar.SetValue("coop", s_rules_box.curvalue);
+ Cvar.SetValue("gamerules", 0);
+ } else {
+ Cvar.SetValue("deathmatch", 1);
+ // deathmatch is always true for rogue games, right?
+ Cvar.SetValue("coop", 0);
+ // FIXME - this might need to depend on which game we're running
+ Cvar.SetValue("gamerules", s_rules_box.curvalue);
+ }
+ // PGM
+
+ spot = null;
+ if (s_rules_box.curvalue == 1) // PGM
+ {
+ if (Lib.Q_stricmp(startmap, "bunk1") == 0)
+ spot = "start";
+ else if (Lib.Q_stricmp(startmap, "mintro") == 0)
+ spot = "start";
+ else if (Lib.Q_stricmp(startmap, "fact1") == 0)
+ spot = "start";
+ else if (Lib.Q_stricmp(startmap, "power1") == 0)
+ spot = "pstart";
+ else if (Lib.Q_stricmp(startmap, "biggun") == 0)
+ spot = "bstart";
+ else if (Lib.Q_stricmp(startmap, "hangar1") == 0)
+ spot = "unitstart";
+ else if (Lib.Q_stricmp(startmap, "city1") == 0)
+ spot = "unitstart";
+ else if (Lib.Q_stricmp(startmap, "boss1") == 0)
+ spot = "bosstart";
+ }
+
+ if (spot != null) {
+ if (Globals.server_state != 0)
+ Cbuf.AddText("disconnect\n");
+ Cbuf.AddText("gamemap \"*" + startmap + "$" + spot + "\"\n");
+ } else {
+ Cbuf.AddText("map " + startmap + "\n");
+ }
+
+ ForceMenuOff();
+ }
+
+ static String dm_coop_names[] = { "deathmatch", "cooperative", null };
+
+ static String dm_coop_names_rogue[] = { "deathmatch", "cooperative", "tag",
+ // "deathball",
+ null };
+
+ static void StartServer_MenuInit() {
+
+ // =======
+ // PGM
+ // =======
+
+ byte[] buffer = null;
+ String mapsname;
+ String s;
+ int i;
+ RandomAccessFile fp;
+
+ /*
+ * * load the list of map names
+ */
+ mapsname = FS.Gamedir() + "/maps.lst";
+
+ if ((fp = Lib.fopen(mapsname, "r")) == null) {
+ buffer = FS.LoadFile("maps.lst");
+ if (buffer == null)
+ //if ((length = FS_LoadFile("maps.lst", (Object *) & buffer))
+ // == -1)
+ Com.Error(ERR_DROP, "couldn't find maps.lst\n");
+ } else {
+ try {
+ int len = (int) fp.length();
+ buffer = new byte[len];
+ fp.readFully(buffer);
+ } catch (Exception e) {
+ Com.Error(ERR_DROP, "couldn't load maps.lst\n");
+ }
+ }
+
+ s = new String(buffer);
+ String lines[] = Lib.linesplit(s);
+
+ nummaps = lines.length;
+
+ if (nummaps == 0)
+ Com.Error(ERR_DROP, "no maps in maps.lst\n");
+
+ mapnames = new String[nummaps + 1];
+
+ for (i = 0; i < nummaps; i++) {
+ String shortname, longname, scratch;
+
+ Com.ParseHelp ph = new Com.ParseHelp(lines[i]);
+
+ shortname = Com.Parse(ph).toUpperCase();
+ longname = Com.Parse(ph);
+ scratch = longname + "\n" + shortname;
+ mapnames[i] = scratch;
+ }
+ mapnames[nummaps] = null;
+
+ if (fp != null) {
+ Lib.fclose(fp);
+ fp = null;
+
+ } else {
+ FS.FreeFile(buffer);
+ }
+
+ /*
+ * * initialize the menu stuff
+ */
+ s_startserver_menu.x = (int) (viddef.width * 0.50);
+ s_startserver_menu.nitems = 0;
+
+ s_startmap_list.type = MTYPE_SPINCONTROL;
+ s_startmap_list.x = 0;
+ s_startmap_list.y = 0;
+ s_startmap_list.name = "initial map";
+ s_startmap_list.itemnames = mapnames;
+
+ s_rules_box.type = MTYPE_SPINCONTROL;
+ s_rules_box.x = 0;
+ s_rules_box.y = 20;
+ s_rules_box.name = "rules";
+
+ // PGM - rogue games only available with rogue DLL.
+ if (FS.Developer_searchpath(2) == 2)
+ s_rules_box.itemnames = dm_coop_names_rogue;
+ else
+ s_rules_box.itemnames = dm_coop_names;
+ // PGM
+
+ if (Cvar.VariableValue("coop") != 0)
+ s_rules_box.curvalue = 1;
+ else
+ s_rules_box.curvalue = 0;
+ s_rules_box.callback = new mcallback() {
+ public void execute(Object o) {
+ RulesChangeFunc(o);
+ }
+ };
+
+ s_timelimit_field.type = MTYPE_FIELD;
+ s_timelimit_field.name = "time limit";
+ s_timelimit_field.flags = QMF_NUMBERSONLY;
+ s_timelimit_field.x = 0;
+ s_timelimit_field.y = 36;
+ s_timelimit_field.statusbar = "0 = no limit";
+ s_timelimit_field.length = 3;
+ s_timelimit_field.visible_length = 3;
+ s_timelimit_field.buffer = new StringBuffer(Cvar
+ .VariableString("timelimit"));
+
+ s_fraglimit_field.type = MTYPE_FIELD;
+ s_fraglimit_field.name = "frag limit";
+ s_fraglimit_field.flags = QMF_NUMBERSONLY;
+ s_fraglimit_field.x = 0;
+ s_fraglimit_field.y = 54;
+ s_fraglimit_field.statusbar = "0 = no limit";
+ s_fraglimit_field.length = 3;
+ s_fraglimit_field.visible_length = 3;
+ s_fraglimit_field.buffer = new StringBuffer(Cvar
+ .VariableString("fraglimit"));
+
+ /*
+ * * maxclients determines the maximum number of players that can join *
+ * the game. If maxclients is only "1" then we should default the menu *
+ * option to 8 players, otherwise use whatever its current value is. *
+ * Clamping will be done when the server is actually started.
+ */
+ s_maxclients_field.type = MTYPE_FIELD;
+ s_maxclients_field.name = "max players";
+ s_maxclients_field.flags = QMF_NUMBERSONLY;
+ s_maxclients_field.x = 0;
+ s_maxclients_field.y = 72;
+ s_maxclients_field.statusbar = null;
+ s_maxclients_field.length = 3;
+ s_maxclients_field.visible_length = 3;
+ if (Cvar.VariableValue("maxclients") == 1)
+ s_maxclients_field.buffer = new StringBuffer("8");
+ else
+ s_maxclients_field.buffer = new StringBuffer(Cvar
+ .VariableString("maxclients"));
+
+ s_hostname_field.type = MTYPE_FIELD;
+ s_hostname_field.name = "hostname";
+ s_hostname_field.flags = 0;
+ s_hostname_field.x = 0;
+ s_hostname_field.y = 90;
+ s_hostname_field.statusbar = null;
+ s_hostname_field.length = 12;
+ s_hostname_field.visible_length = 12;
+ s_hostname_field.buffer = new StringBuffer(Cvar
+ .VariableString("hostname"));
+ s_hostname_field.cursor = s_hostname_field.buffer.length();
+
+ s_startserver_dmoptions_action.type = MTYPE_ACTION;
+ s_startserver_dmoptions_action.name = " deathmatch flags";
+ s_startserver_dmoptions_action.flags = QMF_LEFT_JUSTIFY;
+ s_startserver_dmoptions_action.x = 24;
+ s_startserver_dmoptions_action.y = 108;
+ s_startserver_dmoptions_action.statusbar = null;
+ s_startserver_dmoptions_action.callback = new mcallback() {
+ public void execute(Object o) {
+ DMOptionsFunc(o);
+ }
+ };
+
+ s_startserver_start_action.type = MTYPE_ACTION;
+ s_startserver_start_action.name = " begin";
+ s_startserver_start_action.flags = QMF_LEFT_JUSTIFY;
+ s_startserver_start_action.x = 24;
+ s_startserver_start_action.y = 128;
+ s_startserver_start_action.callback = new mcallback() {
+ public void execute(Object o) {
+ StartServerActionFunc(o);
+ }
+ };
+
+ Menu_AddItem(s_startserver_menu, s_startmap_list);
+ Menu_AddItem(s_startserver_menu, s_rules_box);
+ Menu_AddItem(s_startserver_menu, s_timelimit_field);
+ Menu_AddItem(s_startserver_menu, s_fraglimit_field);
+ Menu_AddItem(s_startserver_menu, s_maxclients_field);
+ Menu_AddItem(s_startserver_menu, s_hostname_field);
+ Menu_AddItem(s_startserver_menu, s_startserver_dmoptions_action);
+ Menu_AddItem(s_startserver_menu, s_startserver_start_action);
+
+ Menu_Center(s_startserver_menu);
+
+ // call this now to set proper inital state
+ RulesChangeFunc(null);
+ }
+
+ static void StartServer_MenuDraw() {
+ Menu_Draw(s_startserver_menu);
+ }
+
+ static String StartServer_MenuKey(int key) {
+ if (key == K_ESCAPE) {
+ if (mapnames != null) {
+ int i;
+
+ for (i = 0; i < nummaps; i++)
+ mapnames[i] = null;
+
+ }
+ mapnames = null;
+ nummaps = 0;
+ }
+
+ return Default_MenuKey(s_startserver_menu, key);
+ }
+
+ static xcommand_t Menu_StartServer = new xcommand_t() {
+ public void execute() {
+ Menu_StartServer_f();
+ }
+ };
+
+ static void Menu_StartServer_f() {
+ StartServer_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ StartServer_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return StartServer_MenuKey(key);
+ }
+ });
+ }
+
+ /*
+ * =============================================================================
+ *
+ * DMOPTIONS BOOK MENU
+ *
+ * =============================================================================
+ */
+ static String dmoptions_statusbar; //[128];
+
+ static menuframework_s s_dmoptions_menu = new menuframework_s();
+
+ static menulist_s s_friendlyfire_box = new menulist_s();
+
+ static menulist_s s_falls_box = new menulist_s();
+
+ static menulist_s s_weapons_stay_box = new menulist_s();
+
+ static menulist_s s_instant_powerups_box = new menulist_s();
+
+ static menulist_s s_powerups_box = new menulist_s();
+
+ static menulist_s s_health_box = new menulist_s();
+
+ static menulist_s s_spawn_farthest_box = new menulist_s();
+
+ static menulist_s s_teamplay_box = new menulist_s();
+
+ static menulist_s s_samelevel_box = new menulist_s();
+
+ static menulist_s s_force_respawn_box = new menulist_s();
+
+ static menulist_s s_armor_box = new menulist_s();
+
+ static menulist_s s_allow_exit_box = new menulist_s();
+
+ static menulist_s s_infinite_ammo_box = new menulist_s();
+
+ static menulist_s s_fixed_fov_box = new menulist_s();
+
+ static menulist_s s_quad_drop_box = new menulist_s();
+
+ // ROGUE
+ static menulist_s s_no_mines_box = new menulist_s();
+
+ static menulist_s s_no_nukes_box = new menulist_s();
+
+ static menulist_s s_stack_double_box = new menulist_s();
+
+ static menulist_s s_no_spheres_box = new menulist_s();
+
+ // ROGUE
+
+ static void setvalue(int flags) {
+ Cvar.SetValue("dmflags", flags);
+ dmoptions_statusbar = "dmflags = " + flags;
+ }
+
+ static void DMFlagCallback(Object self) {
+ menulist_s f = (menulist_s) self;
+ int flags;
+ int bit = 0;
+
+ flags = (int) Cvar.VariableValue("dmflags");
+
+ if (f == s_friendlyfire_box) {
+ if (f.curvalue != 0)
+ flags &= ~DF_NO_FRIENDLY_FIRE;
+ else
+ flags |= DF_NO_FRIENDLY_FIRE;
+ setvalue(flags);
+ return;
+ } else if (f == s_falls_box) {
+ if (f.curvalue != 0)
+ flags &= ~DF_NO_FALLING;
+ else
+ flags |= DF_NO_FALLING;
+ setvalue(flags);
+ return;
+ } else if (f == s_weapons_stay_box) {
+ bit = DF_WEAPONS_STAY;
+ } else if (f == s_instant_powerups_box) {
+ bit = DF_INSTANT_ITEMS;
+ } else if (f == s_allow_exit_box) {
+ bit = DF_ALLOW_EXIT;
+ } else if (f == s_powerups_box) {
+ if (f.curvalue != 0)
+ flags &= ~DF_NO_ITEMS;
+ else
+ flags |= DF_NO_ITEMS;
+ setvalue(flags);
+ return;
+ } else if (f == s_health_box) {
+ if (f.curvalue != 0)
+ flags &= ~DF_NO_HEALTH;
+ else
+ flags |= DF_NO_HEALTH;
+ setvalue(flags);
+ return;
+ } else if (f == s_spawn_farthest_box) {
+ bit = DF_SPAWN_FARTHEST;
+ } else if (f == s_teamplay_box) {
+ if (f.curvalue == 1) {
+ flags |= DF_SKINTEAMS;
+ flags &= ~DF_MODELTEAMS;
+ } else if (f.curvalue == 2) {
+ flags |= DF_MODELTEAMS;
+ flags &= ~DF_SKINTEAMS;
+ } else {
+ flags &= ~(DF_MODELTEAMS | DF_SKINTEAMS);
+ }
+
+ setvalue(flags);
+ return;
+ } else if (f == s_samelevel_box) {
+ bit = DF_SAME_LEVEL;
+ } else if (f == s_force_respawn_box) {
+ bit = DF_FORCE_RESPAWN;
+ } else if (f == s_armor_box) {
+ if (f.curvalue != 0)
+ flags &= ~DF_NO_ARMOR;
+ else
+ flags |= DF_NO_ARMOR;
+ setvalue(flags);
+ return;
+ } else if (f == s_infinite_ammo_box) {
+ bit = DF_INFINITE_AMMO;
+ } else if (f == s_fixed_fov_box) {
+ bit = DF_FIXED_FOV;
+ } else if (f == s_quad_drop_box) {
+ bit = DF_QUAD_DROP;
+ }
+
+ // =======
+ // ROGUE
+ else if (FS.Developer_searchpath(2) == 2) {
+ if (f == s_no_mines_box) {
+ bit = DF_NO_MINES;
+ } else if (f == s_no_nukes_box) {
+ bit = DF_NO_NUKES;
+ } else if (f == s_stack_double_box) {
+ bit = DF_NO_STACK_DOUBLE;
+ } else if (f == s_no_spheres_box) {
+ bit = DF_NO_SPHERES;
+ }
+ }
+ // ROGUE
+ // =======
+
+ if (f != null) {
+ if (f.curvalue == 0)
+ flags &= ~bit;
+ else
+ flags |= bit;
+ }
+
+ Cvar.SetValue("dmflags", flags);
+
+ dmoptions_statusbar = "dmflags = " + flags;
+
+ }
+
+ //static String yes_no_names[] = { "no", "yes", 0 };
+ static String teamplay_names[] = { "disabled", "by skin", "by model", null };
+
+ static void DMOptions_MenuInit() {
+
+ int dmflags = (int) Cvar.VariableValue("dmflags");
+ int y = 0;
+
+ s_dmoptions_menu.x = (int) (viddef.width * 0.50);
+ s_dmoptions_menu.nitems = 0;
+
+ s_falls_box.type = MTYPE_SPINCONTROL;
+ s_falls_box.x = 0;
+ s_falls_box.y = y;
+ s_falls_box.name = "falling damage";
+ s_falls_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_falls_box.itemnames = yes_no_names;
+ s_falls_box.curvalue = (dmflags & DF_NO_FALLING) == 0 ? 1 : 0;
+
+ s_weapons_stay_box.type = MTYPE_SPINCONTROL;
+ s_weapons_stay_box.x = 0;
+ s_weapons_stay_box.y = y += 10;
+ s_weapons_stay_box.name = "weapons stay";
+ s_weapons_stay_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_weapons_stay_box.itemnames = yes_no_names;
+ s_weapons_stay_box.curvalue = (dmflags & DF_WEAPONS_STAY) != 0 ? 1 : 0;
+
+ s_instant_powerups_box.type = MTYPE_SPINCONTROL;
+ s_instant_powerups_box.x = 0;
+ s_instant_powerups_box.y = y += 10;
+ s_instant_powerups_box.name = "instant powerups";
+ s_instant_powerups_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_instant_powerups_box.itemnames = yes_no_names;
+ s_instant_powerups_box.curvalue = (dmflags & DF_INSTANT_ITEMS) != 0 ? 1
+ : 0;
+
+ s_powerups_box.type = MTYPE_SPINCONTROL;
+ s_powerups_box.x = 0;
+ s_powerups_box.y = y += 10;
+ s_powerups_box.name = "allow powerups";
+ s_powerups_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_powerups_box.itemnames = yes_no_names;
+ s_powerups_box.curvalue = (dmflags & DF_NO_ITEMS) == 0 ? 1 : 0;
+
+ s_health_box.type = MTYPE_SPINCONTROL;
+ s_health_box.x = 0;
+ s_health_box.y = y += 10;
+ s_health_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_health_box.name = "allow health";
+ s_health_box.itemnames = yes_no_names;
+ s_health_box.curvalue = (dmflags & DF_NO_HEALTH) == 0 ? 1 : 0;
+
+ s_armor_box.type = MTYPE_SPINCONTROL;
+ s_armor_box.x = 0;
+ s_armor_box.y = y += 10;
+ s_armor_box.name = "allow armor";
+ s_armor_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_armor_box.itemnames = yes_no_names;
+ s_armor_box.curvalue = (dmflags & DF_NO_ARMOR) == 0 ? 1 : 0;
+
+ s_spawn_farthest_box.type = MTYPE_SPINCONTROL;
+ s_spawn_farthest_box.x = 0;
+ s_spawn_farthest_box.y = y += 10;
+ s_spawn_farthest_box.name = "spawn farthest";
+ s_spawn_farthest_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_spawn_farthest_box.itemnames = yes_no_names;
+ s_spawn_farthest_box.curvalue = (dmflags & DF_SPAWN_FARTHEST) != 0 ? 1
+ : 0;
+
+ s_samelevel_box.type = MTYPE_SPINCONTROL;
+ s_samelevel_box.x = 0;
+ s_samelevel_box.y = y += 10;
+ s_samelevel_box.name = "same map";
+ s_samelevel_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_samelevel_box.itemnames = yes_no_names;
+ s_samelevel_box.curvalue = (dmflags & DF_SAME_LEVEL) != 0 ? 1 : 0;
+
+ s_force_respawn_box.type = MTYPE_SPINCONTROL;
+ s_force_respawn_box.x = 0;
+ s_force_respawn_box.y = y += 10;
+ s_force_respawn_box.name = "force respawn";
+ s_force_respawn_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_force_respawn_box.itemnames = yes_no_names;
+ s_force_respawn_box.curvalue = (dmflags & DF_FORCE_RESPAWN) != 0 ? 1
+ : 0;
+
+ s_teamplay_box.type = MTYPE_SPINCONTROL;
+ s_teamplay_box.x = 0;
+ s_teamplay_box.y = y += 10;
+ s_teamplay_box.name = "teamplay";
+ s_teamplay_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_teamplay_box.itemnames = teamplay_names;
+
+ s_allow_exit_box.type = MTYPE_SPINCONTROL;
+ s_allow_exit_box.x = 0;
+ s_allow_exit_box.y = y += 10;
+ s_allow_exit_box.name = "allow exit";
+ s_allow_exit_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_allow_exit_box.itemnames = yes_no_names;
+ s_allow_exit_box.curvalue = (dmflags & DF_ALLOW_EXIT) != 0 ? 1 : 0;
+
+ s_infinite_ammo_box.type = MTYPE_SPINCONTROL;
+ s_infinite_ammo_box.x = 0;
+ s_infinite_ammo_box.y = y += 10;
+ s_infinite_ammo_box.name = "infinite ammo";
+ s_infinite_ammo_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_infinite_ammo_box.itemnames = yes_no_names;
+ s_infinite_ammo_box.curvalue = (dmflags & DF_INFINITE_AMMO) != 0 ? 1
+ : 0;
+
+ s_fixed_fov_box.type = MTYPE_SPINCONTROL;
+ s_fixed_fov_box.x = 0;
+ s_fixed_fov_box.y = y += 10;
+ s_fixed_fov_box.name = "fixed FOV";
+ s_fixed_fov_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_fixed_fov_box.itemnames = yes_no_names;
+ s_fixed_fov_box.curvalue = (dmflags & DF_FIXED_FOV) != 0 ? 1 : 0;
+
+ s_quad_drop_box.type = MTYPE_SPINCONTROL;
+ s_quad_drop_box.x = 0;
+ s_quad_drop_box.y = y += 10;
+ s_quad_drop_box.name = "quad drop";
+ s_quad_drop_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_quad_drop_box.itemnames = yes_no_names;
+ s_quad_drop_box.curvalue = (dmflags & DF_QUAD_DROP) != 0 ? 1 : 0;
+
+ s_friendlyfire_box.type = MTYPE_SPINCONTROL;
+ s_friendlyfire_box.x = 0;
+ s_friendlyfire_box.y = y += 10;
+ s_friendlyfire_box.name = "friendly fire";
+ s_friendlyfire_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_friendlyfire_box.itemnames = yes_no_names;
+ s_friendlyfire_box.curvalue = (dmflags & DF_NO_FRIENDLY_FIRE) == 0 ? 1
+ : 0;
+
+ // ============
+ // ROGUE
+ if (FS.Developer_searchpath(2) == 2) {
+ s_no_mines_box.type = MTYPE_SPINCONTROL;
+ s_no_mines_box.x = 0;
+ s_no_mines_box.y = y += 10;
+ s_no_mines_box.name = "remove mines";
+ s_no_mines_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_no_mines_box.itemnames = yes_no_names;
+ s_no_mines_box.curvalue = (dmflags & DF_NO_MINES) != 0 ? 1 : 0;
+
+ s_no_nukes_box.type = MTYPE_SPINCONTROL;
+ s_no_nukes_box.x = 0;
+ s_no_nukes_box.y = y += 10;
+ s_no_nukes_box.name = "remove nukes";
+ s_no_nukes_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_no_nukes_box.itemnames = yes_no_names;
+ s_no_nukes_box.curvalue = (dmflags & DF_NO_NUKES) != 0 ? 1 : 0;
+
+ s_stack_double_box.type = MTYPE_SPINCONTROL;
+ s_stack_double_box.x = 0;
+ s_stack_double_box.y = y += 10;
+ s_stack_double_box.name = "2x/4x stacking off";
+ s_stack_double_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_stack_double_box.itemnames = yes_no_names;
+ s_stack_double_box.curvalue = (dmflags & DF_NO_STACK_DOUBLE);
+
+ s_no_spheres_box.type = MTYPE_SPINCONTROL;
+ s_no_spheres_box.x = 0;
+ s_no_spheres_box.y = y += 10;
+ s_no_spheres_box.name = "remove spheres";
+ s_no_spheres_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DMFlagCallback(o);
+ }
+ };
+ s_no_spheres_box.itemnames = yes_no_names;
+ s_no_spheres_box.curvalue = (dmflags & DF_NO_SPHERES) != 0 ? 1 : 0;
+
+ }
+ // ROGUE
+ // ============
+
+ Menu_AddItem(s_dmoptions_menu, s_falls_box);
+ Menu_AddItem(s_dmoptions_menu, s_weapons_stay_box);
+ Menu_AddItem(s_dmoptions_menu, s_instant_powerups_box);
+ Menu_AddItem(s_dmoptions_menu, s_powerups_box);
+ Menu_AddItem(s_dmoptions_menu, s_health_box);
+ Menu_AddItem(s_dmoptions_menu, s_armor_box);
+ Menu_AddItem(s_dmoptions_menu, s_spawn_farthest_box);
+ Menu_AddItem(s_dmoptions_menu, s_samelevel_box);
+ Menu_AddItem(s_dmoptions_menu, s_force_respawn_box);
+ Menu_AddItem(s_dmoptions_menu, s_teamplay_box);
+ Menu_AddItem(s_dmoptions_menu, s_allow_exit_box);
+ Menu_AddItem(s_dmoptions_menu, s_infinite_ammo_box);
+ Menu_AddItem(s_dmoptions_menu, s_fixed_fov_box);
+ Menu_AddItem(s_dmoptions_menu, s_quad_drop_box);
+ Menu_AddItem(s_dmoptions_menu, s_friendlyfire_box);
+
+ // =======
+ // ROGUE
+ if (FS.Developer_searchpath(2) == 2) {
+ Menu_AddItem(s_dmoptions_menu, s_no_mines_box);
+ Menu_AddItem(s_dmoptions_menu, s_no_nukes_box);
+ Menu_AddItem(s_dmoptions_menu, s_stack_double_box);
+ Menu_AddItem(s_dmoptions_menu, s_no_spheres_box);
+ }
+ // ROGUE
+ // =======
+
+ Menu_Center(s_dmoptions_menu);
+
+ // set the original dmflags statusbar
+ DMFlagCallback(null);
+ Menu_SetStatusBar(s_dmoptions_menu, dmoptions_statusbar);
+ }
+
+ static void DMOptions_MenuDraw() {
+ Menu_Draw(s_dmoptions_menu);
+ }
+
+ static String DMOptions_MenuKey(int key) {
+ return Default_MenuKey(s_dmoptions_menu, key);
+ }
+
+ static xcommand_t Menu_DMOptions = new xcommand_t() {
+ public void execute() {
+ Menu_DMOptions_f();
+ }
+ };
+
+ static void Menu_DMOptions_f() {
+ DMOptions_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ DMOptions_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return DMOptions_MenuKey(key);
+ }
+ });
+ }
+
+ /*
+ * =============================================================================
+ *
+ * DOWNLOADOPTIONS BOOK MENU
+ *
+ * =============================================================================
+ */
+ static menuframework_s s_downloadoptions_menu = new menuframework_s();
+
+ static menuseparator_s s_download_title = new menuseparator_s();
+
+ static menulist_s s_allow_download_box = new menulist_s();
+
+ static menulist_s s_allow_download_maps_box = new menulist_s();
+
+ static menulist_s s_allow_download_models_box = new menulist_s();
+
+ static menulist_s s_allow_download_players_box = new menulist_s();
+
+ static menulist_s s_allow_download_sounds_box = new menulist_s();
+
+ static void DownloadCallback(Object self) {
+ menulist_s f = (menulist_s) self;
+
+ if (f == s_allow_download_box) {
+ Cvar.SetValue("allow_download", f.curvalue);
+ }
+
+ else if (f == s_allow_download_maps_box) {
+ Cvar.SetValue("allow_download_maps", f.curvalue);
+ }
+
+ else if (f == s_allow_download_models_box) {
+ Cvar.SetValue("allow_download_models", f.curvalue);
+ }
+
+ else if (f == s_allow_download_players_box) {
+ Cvar.SetValue("allow_download_players", f.curvalue);
+ }
+
+ else if (f == s_allow_download_sounds_box) {
+ Cvar.SetValue("allow_download_sounds", f.curvalue);
+ }
+ }
+
+ static String yes_no_names[] = { "no", "yes", null };
+
+ static void DownloadOptions_MenuInit() {
+
+ int y = 0;
+
+ s_downloadoptions_menu.x = (int) (viddef.width * 0.50);
+ s_downloadoptions_menu.nitems = 0;
+
+ s_download_title.type = MTYPE_SEPARATOR;
+ s_download_title.name = "Download Options";
+ s_download_title.x = 48;
+ s_download_title.y = y;
+
+ s_allow_download_box.type = MTYPE_SPINCONTROL;
+ s_allow_download_box.x = 0;
+ s_allow_download_box.y = y += 20;
+ s_allow_download_box.name = "allow downloading";
+ s_allow_download_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DownloadCallback(o);
+ }
+ };
+ s_allow_download_box.itemnames = yes_no_names;
+ s_allow_download_box.curvalue = (Cvar.VariableValue("allow_download") != 0) ? 1
+ : 0;
+
+ s_allow_download_maps_box.type = MTYPE_SPINCONTROL;
+ s_allow_download_maps_box.x = 0;
+ s_allow_download_maps_box.y = y += 20;
+ s_allow_download_maps_box.name = "maps";
+ s_allow_download_maps_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DownloadCallback(o);
+ }
+ };
+ s_allow_download_maps_box.itemnames = yes_no_names;
+ s_allow_download_maps_box.curvalue = (Cvar
+ .VariableValue("allow_download_maps") != 0) ? 1 : 0;
+
+ s_allow_download_players_box.type = MTYPE_SPINCONTROL;
+ s_allow_download_players_box.x = 0;
+ s_allow_download_players_box.y = y += 10;
+ s_allow_download_players_box.name = "player models/skins";
+ s_allow_download_players_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DownloadCallback(o);
+ }
+ };
+ s_allow_download_players_box.itemnames = yes_no_names;
+ s_allow_download_players_box.curvalue = (Cvar
+ .VariableValue("allow_download_players") != 0) ? 1 : 0;
+
+ s_allow_download_models_box.type = MTYPE_SPINCONTROL;
+ s_allow_download_models_box.x = 0;
+ s_allow_download_models_box.y = y += 10;
+ s_allow_download_models_box.name = "models";
+ s_allow_download_models_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DownloadCallback(o);
+ }
+ };
+ s_allow_download_models_box.itemnames = yes_no_names;
+ s_allow_download_models_box.curvalue = (Cvar
+ .VariableValue("allow_download_models") != 0) ? 1 : 0;
+
+ s_allow_download_sounds_box.type = MTYPE_SPINCONTROL;
+ s_allow_download_sounds_box.x = 0;
+ s_allow_download_sounds_box.y = y += 10;
+ s_allow_download_sounds_box.name = "sounds";
+ s_allow_download_sounds_box.callback = new mcallback() {
+ public void execute(Object o) {
+ DownloadCallback(o);
+ }
+ };
+ s_allow_download_sounds_box.itemnames = yes_no_names;
+ s_allow_download_sounds_box.curvalue = (Cvar
+ .VariableValue("allow_download_sounds") != 0) ? 1 : 0;
+
+ Menu_AddItem(s_downloadoptions_menu, s_download_title);
+ Menu_AddItem(s_downloadoptions_menu, s_allow_download_box);
+ Menu_AddItem(s_downloadoptions_menu, s_allow_download_maps_box);
+ Menu_AddItem(s_downloadoptions_menu, s_allow_download_players_box);
+ Menu_AddItem(s_downloadoptions_menu, s_allow_download_models_box);
+ Menu_AddItem(s_downloadoptions_menu, s_allow_download_sounds_box);
+
+ Menu_Center(s_downloadoptions_menu);
+
+ // skip over title
+ if (s_downloadoptions_menu.cursor == 0)
+ s_downloadoptions_menu.cursor = 1;
+ }
+
+ static void DownloadOptions_MenuDraw() {
+ Menu_Draw(s_downloadoptions_menu);
+ }
+
+ static String DownloadOptions_MenuKey(int key) {
+ return Default_MenuKey(s_downloadoptions_menu, key);
+ }
+
+ static xcommand_t Menu_DownloadOptions = new xcommand_t() {
+ public void execute() {
+ Menu_DownloadOptions_f();
+ }
+ };
+
+ static void Menu_DownloadOptions_f() {
+ DownloadOptions_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ DownloadOptions_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return DownloadOptions_MenuKey(key);
+ }
+ });
+ }
+
+ /*
+ * =============================================================================
+ *
+ * ADDRESS BOOK MENU
+ *
+ * =============================================================================
+ */
+
+ static menuframework_s s_addressbook_menu = new menuframework_s();
+
+ static menufield_s s_addressbook_fields[] = new menufield_s[NUM_ADDRESSBOOK_ENTRIES];
+ static {
+ for (int n = 0; n < NUM_ADDRESSBOOK_ENTRIES; n++)
+ s_addressbook_fields[n] = new menufield_s();
+ }
+
+ static void AddressBook_MenuInit() {
+ int i;
+
+ s_addressbook_menu.x = viddef.width / 2 - 142;
+ s_addressbook_menu.y = viddef.height / 2 - 58;
+ s_addressbook_menu.nitems = 0;
+
+ for (i = 0; i < NUM_ADDRESSBOOK_ENTRIES; i++) {
+ cvar_t adr;
+ //char buffer[20];
+ String buffer;
+
+ //Com_sprintf(buffer, sizeof(buffer), "adr%d", i);
+ buffer = "adr" + i;
+
+ adr = Cvar.Get(buffer, "", CVAR_ARCHIVE);
+
+ s_addressbook_fields[i].type = MTYPE_FIELD;
+ s_addressbook_fields[i].name = null;
+ s_addressbook_fields[i].callback = null;
+ s_addressbook_fields[i].x = 0;
+ s_addressbook_fields[i].y = i * 18 + 0;
+ s_addressbook_fields[i].localdata[0] = i;
+ s_addressbook_fields[i].cursor = 0;
+ s_addressbook_fields[i].length = 60;
+ s_addressbook_fields[i].visible_length = 30;
+
+ s_addressbook_fields[i].buffer = new StringBuffer(adr.string);
+
+ Menu_AddItem(s_addressbook_menu, s_addressbook_fields[i]);
+ }
+ }
+
+ static keyfunc_t AddressBook_MenuKey = new keyfunc_t() {
+ public String execute(int key) {
+ return AddressBook_MenuKey_f(key);
+ }
+ };
+
+ static String AddressBook_MenuKey_f(int key) {
+ if (key == K_ESCAPE) {
+ int index;
+ //char buffer[20];
+ String buffer;
+
+ for (index = 0; index < NUM_ADDRESSBOOK_ENTRIES; index++) {
+ buffer = "adr" + index;
+ //Com_sprintf(buffer, sizeof(buffer), "adr%d", index);
+ Cvar.Set(buffer, s_addressbook_fields[index].buffer.toString());
+ }
+ }
+ return Default_MenuKey(s_addressbook_menu, key);
+ }
+
+ static xcommand_t AddressBook_MenuDraw = new xcommand_t() {
+ public void execute() {
+ AddressBook_MenuDraw_f();
+ }
+ };
+
+ static void AddressBook_MenuDraw_f() {
+ Banner("m_banner_addressbook");
+ Menu_Draw(s_addressbook_menu);
+ }
+
+ static xcommand_t Menu_AddressBook = new xcommand_t() {
+ public void execute() {
+ Menu_AddressBook_f();
+ }
+ };
+
+ static void Menu_AddressBook_f() {
+ AddressBook_MenuInit();
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ AddressBook_MenuDraw_f();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return AddressBook_MenuKey_f(key);
+ }
+ });
+ }
+
+ /*
+ * =============================================================================
+ *
+ * PLAYER CONFIG MENU
+ *
+ * =============================================================================
+ */
+ static menuframework_s s_player_config_menu = new menuframework_s();
+
+ static menufield_s s_player_name_field = new menufield_s();
+
+ static menulist_s s_player_model_box = new menulist_s();
+
+ static menulist_s s_player_skin_box = new menulist_s();
+
+ static menulist_s s_player_handedness_box = new menulist_s();
+
+ static menulist_s s_player_rate_box = new menulist_s();
+
+ static menuseparator_s s_player_skin_title = new menuseparator_s();
+
+ static menuseparator_s s_player_model_title = new menuseparator_s();
+
+ static menuseparator_s s_player_hand_title = new menuseparator_s();
+
+ static menuseparator_s s_player_rate_title = new menuseparator_s();
+
+ static menuaction_s s_player_download_action = new menuaction_s();
+
+ static class playermodelinfo_s {
+ int nskins;
+
+ String skindisplaynames[];
+
+ //char displayname[MAX_DISPLAYNAME];
+ String displayname;
+
+ //char directory[MAX_QPATH];
+ String directory;
+ };
+
+ static playermodelinfo_s s_pmi[] = new playermodelinfo_s[MAX_PLAYERMODELS];
+
+ static String s_pmnames[] = new String[MAX_PLAYERMODELS];
+
+ static int s_numplayermodels;
+
+ static int rate_tbl[] = { 2500, 3200, 5000, 10000, 25000, 0 };
+
+ static String rate_names[] = { "28.8 Modem", "33.6 Modem", "Single ISDN",
+ "Dual ISDN/Cable", "T1/LAN", "User defined", null };
+
+ static void DownloadOptionsFunc(Object self) {
+ Menu_DownloadOptions_f();
+ }
+
+ static void HandednessCallback(Object unused) {
+ Cvar.SetValue("hand", s_player_handedness_box.curvalue);
+ }
+
+ static void RateCallback(Object unused) {
+ if (s_player_rate_box.curvalue != rate_tbl.length - 1) //sizeof(rate_tbl)
+ // / sizeof(*
+ // rate_tbl) - 1)
+ Cvar.SetValue("rate", rate_tbl[s_player_rate_box.curvalue]);
+ }
+
+ static void ModelCallback(Object unused) {
+ s_player_skin_box.itemnames = s_pmi[s_player_model_box.curvalue].skindisplaynames;
+ s_player_skin_box.curvalue = 0;
+ }
+
+ static boolean IconOfSkinExists(String skin, String pcxfiles[],
+ int npcxfiles) {
+ int i;
+ //char scratch[1024];
+ String scratch;
+
+ //strcpy(scratch, skin);
+ scratch = skin;
+ int pos = scratch.lastIndexOf('.');
+ if (pos != -1)
+ scratch = scratch.substring(0, pos) + "_i.pcx";
+
+ else
+ scratch += "_i.pcx";
+
+ for (i = 0; i < npcxfiles; i++) {
+ if (Lib.strcmp(pcxfiles[i], scratch) == 0)
+ return true;
+ }
+
+ return false;
+ }
+
+ static boolean PlayerConfig_ScanDirectories() {
+ //char findname[1024];
+ String findname;
+ //char scratch[1024];
+ String scratch;
+
+ int ndirs = 0, npms = 0;
+ int a, b, c;
+ String dirnames[];
+
+ String path = null;
+
+ int i;
+
+ //extern String * FS_ListFiles(String , int *, unsigned, unsigned);
+
+ s_numplayermodels = 0;
+
+ /*
+ * * get a list of directories
+ */
+ do {
+ path = FS.NextPath(path);
+ findname = path + "/players/*.*";
+
+ if ((dirnames = FS.ListFiles(findname, 0, SFF_SUBDIR)) != null) {
+ ndirs = dirnames.length;
+ break;
+ }
+ } while (path != null);
+
+ if (dirnames == null)
+ return false;
+
+ /*
+ * * go through the subdirectories
+ */
+ npms = ndirs;
+ if (npms > MAX_PLAYERMODELS)
+ npms = MAX_PLAYERMODELS;
+
+ for (i = 0; i < npms; i++) {
+ int k, s;
+ //String a, b, c;
+ String pcxnames[];
+ String skinnames[];
+ int npcxfiles;
+ int nskins = 0;
+
+ if (dirnames[i] == null)
+ continue;
+
+ // verify the existence of tris.md2
+ scratch = dirnames[i];
+ scratch += "/tris.md2";
+ if (Sys.FindFirst(scratch, 0, SFF_SUBDIR | SFF_HIDDEN | SFF_SYSTEM) == null) {
+ //free(dirnames[i]);
+ dirnames[i] = null;
+ Sys.FindClose();
+ continue;
+ }
+ Sys.FindClose();
+
+ // verify the existence of at least one pcx skin
+ scratch = dirnames[i] + "/*.pcx";
+ pcxnames = FS.ListFiles(scratch, 0, 0);
+ npcxfiles = pcxnames.length;
+
+ if (pcxnames == null) {
+
+ dirnames[i] = null;
+ continue;
+ }
+
+ // count valid skins, which consist of a skin with a matching "_i"
+ // icon
+ for (k = 0; k < npcxfiles - 1; k++) {
+ if (!pcxnames[k].endsWith("_i.pcx")) {
+ //if (!strstr(pcxnames[k], "_i.pcx")) {
+ if (IconOfSkinExists(pcxnames[k], pcxnames, npcxfiles - 1)) {
+ nskins++;
+ }
+ }
+ }
+ if (nskins == 0)
+ continue;
+
+ skinnames = new String[nskins + 1]; //malloc(sizeof(String) *
+ // (nskins + 1));
+ //memset(skinnames, 0, sizeof(String) * (nskins + 1));
+
+ // copy the valid skins
+ for (s = 0, k = 0; k < npcxfiles - 1; k++) {
+
+ if (pcxnames[k].indexOf("_i.pcx") < 0) {
+ if (IconOfSkinExists(pcxnames[k], pcxnames, npcxfiles - 1)) {
+ a = pcxnames[k].lastIndexOf('/');
+ b = pcxnames[k].lastIndexOf('\\');
+
+ if (a > b)
+ c = a;
+ else
+ c = b;
+
+ scratch = pcxnames[k].substring(c + 1, pcxnames[k]
+ .length());
+ int pos = scratch.lastIndexOf('.');
+ if (pos != -1)
+ scratch = scratch.substring(0, pos);
+
+ skinnames[s] = scratch;
+ s++;
+ }
+ }
+ }
+
+ // at this point we have a valid player model
+ if (s_pmi[s_numplayermodels] == null)
+ s_pmi[s_numplayermodels] = new playermodelinfo_s();
+
+ s_pmi[s_numplayermodels].nskins = nskins;
+ s_pmi[s_numplayermodels].skindisplaynames = skinnames;
+
+ // make short name for the model
+ a = dirnames[i].lastIndexOf('/');
+ b = dirnames[i].lastIndexOf('\\');
+
+ if (a > b)
+ c = a;
+ else
+ c = b;
+
+ s_pmi[s_numplayermodels].displayname = dirnames[i].substring(c + 1);
+ s_pmi[s_numplayermodels].directory = dirnames[i].substring(c + 1);
+
+ s_numplayermodels++;
+ }
+
+ return true;
+
+ }
+
+ static int pmicmpfnc(Object _a, Object _b) {
+ playermodelinfo_s a = (playermodelinfo_s) _a;
+ playermodelinfo_s b = (playermodelinfo_s) _b;
+
+ /*
+ * * sort by male, female, then alphabetical
+ */
+ if (Lib.strcmp(a.directory, "male") == 0)
+ return -1;
+ else if (Lib.strcmp(b.directory, "male") == 0)
+ return 1;
+
+ if (Lib.strcmp(a.directory, "female") == 0)
+ return -1;
+ else if (Lib.strcmp(b.directory, "female") == 0)
+ return 1;
+
+ return Lib.strcmp(a.directory, b.directory);
+ }
+
+ static String handedness[] = { "right", "left", "center", null };
+
+ static boolean PlayerConfig_MenuInit() {
+ /*
+ * extern cvar_t * name; extern cvar_t * team; extern cvar_t * skin;
+ */
+ //har currentdirectory[1024];
+ String currentdirectory;
+ //char currentskin[1024];
+ String currentskin;
+
+ int i = 0;
+
+ int currentdirectoryindex = 0;
+ int currentskinindex = 0;
+
+ cvar_t hand = Cvar.Get("hand", "0", CVAR_USERINFO | CVAR_ARCHIVE);
+
+ PlayerConfig_ScanDirectories();
+
+ if (s_numplayermodels == 0)
+ return false;
+
+ if (hand.value < 0 || hand.value > 2)
+ Cvar.SetValue("hand", 0);
+
+ currentdirectory = skin.string;
+
+ if (currentdirectory.lastIndexOf('/') != -1) {
+ currentskin = Lib.rightFrom(currentdirectory, '/');
+ currentdirectory = Lib.leftFrom(currentdirectory, '/');
+ } else if (currentdirectory.lastIndexOf('\\') != -1) {
+ currentskin = Lib.rightFrom(currentdirectory, '\\');
+ currentdirectory = Lib.leftFrom(currentdirectory, '\\');
+ } else {
+ currentdirectory = "male";
+ currentskin = "grunt";
+ }
+
+ //qsort(s_pmi, s_numplayermodels, sizeof(s_pmi[0]), pmicmpfnc);
+ Arrays.sort(s_pmi, 0, s_numplayermodels, new Comparator() {
+ public int compare(Object o1, Object o2) {
+ return pmicmpfnc(o1, o2);
+ }
+ });
+
+ //memset(s_pmnames, 0, sizeof(s_pmnames));
+ s_pmnames = new String[MAX_PLAYERMODELS];
+
+ for (i = 0; i < s_numplayermodels; i++) {
+ s_pmnames[i] = s_pmi[i].displayname;
+ if (Lib.Q_stricmp(s_pmi[i].directory, currentdirectory) == 0) {
+ int j;
+
+ currentdirectoryindex = i;
+
+ for (j = 0; j < s_pmi[i].nskins; j++) {
+ if (Lib
+ .Q_stricmp(s_pmi[i].skindisplaynames[j],
+ currentskin) == 0) {
+ currentskinindex = j;
+ break;
+ }
+ }
+ }
+ }
+
+ s_player_config_menu.x = viddef.width / 2 - 95;
+ s_player_config_menu.y = viddef.height / 2 - 97;
+ s_player_config_menu.nitems = 0;
+
+ s_player_name_field.type = MTYPE_FIELD;
+ s_player_name_field.name = "name";
+ s_player_name_field.callback = null;
+ s_player_name_field.x = 0;
+ s_player_name_field.y = 0;
+ s_player_name_field.length = 20;
+ s_player_name_field.visible_length = 20;
+ s_player_name_field.buffer = new StringBuffer(name.string);
+ s_player_name_field.cursor = name.string.length();
+
+ s_player_model_title.type = MTYPE_SEPARATOR;
+ s_player_model_title.name = "model";
+ s_player_model_title.x = -8;
+ s_player_model_title.y = 60;
+
+ s_player_model_box.type = MTYPE_SPINCONTROL;
+ s_player_model_box.x = -56;
+ s_player_model_box.y = 70;
+ s_player_model_box.callback = new mcallback() {
+ public void execute(Object o) {
+ ModelCallback(o);
+ }
+ };
+ s_player_model_box.cursor_offset = -48;
+ s_player_model_box.curvalue = currentdirectoryindex;
+ s_player_model_box.itemnames = s_pmnames;
+
+ s_player_skin_title.type = MTYPE_SEPARATOR;
+ s_player_skin_title.name = "skin";
+ s_player_skin_title.x = -16;
+ s_player_skin_title.y = 84;
+
+ s_player_skin_box.type = MTYPE_SPINCONTROL;
+ s_player_skin_box.x = -56;
+ s_player_skin_box.y = 94;
+ s_player_skin_box.name = null;
+ s_player_skin_box.callback = null;
+ s_player_skin_box.cursor_offset = -48;
+ s_player_skin_box.curvalue = currentskinindex;
+ s_player_skin_box.itemnames = s_pmi[currentdirectoryindex].skindisplaynames;
+
+ s_player_hand_title.type = MTYPE_SEPARATOR;
+ s_player_hand_title.name = "handedness";
+ s_player_hand_title.x = 32;
+ s_player_hand_title.y = 108;
+
+ s_player_handedness_box.type = MTYPE_SPINCONTROL;
+ s_player_handedness_box.x = -56;
+ s_player_handedness_box.y = 118;
+ s_player_handedness_box.name = null;
+ s_player_handedness_box.cursor_offset = -48;
+ s_player_handedness_box.callback = new mcallback() {
+ public void execute(Object o) {
+ HandednessCallback(o);
+ }
+ };
+ s_player_handedness_box.curvalue = (int) Cvar.VariableValue("hand");
+ s_player_handedness_box.itemnames = handedness;
+
+ for (i = 0; i < rate_tbl.length - 1; i++)
+ if (Cvar.VariableValue("rate") == rate_tbl[i])
+ break;
+
+ s_player_rate_title.type = MTYPE_SEPARATOR;
+ s_player_rate_title.name = "connect speed";
+ s_player_rate_title.x = 56;
+ s_player_rate_title.y = 156;
+
+ s_player_rate_box.type = MTYPE_SPINCONTROL;
+ s_player_rate_box.x = -56;
+ s_player_rate_box.y = 166;
+ s_player_rate_box.name = null;
+ s_player_rate_box.cursor_offset = -48;
+ s_player_rate_box.callback = new mcallback() {
+ public void execute(Object o) {
+ RateCallback(o);
+ }
+ };
+ s_player_rate_box.curvalue = i;
+ s_player_rate_box.itemnames = rate_names;
+
+ s_player_download_action.type = MTYPE_ACTION;
+ s_player_download_action.name = "download options";
+ s_player_download_action.flags = QMF_LEFT_JUSTIFY;
+ s_player_download_action.x = -24;
+ s_player_download_action.y = 186;
+ s_player_download_action.statusbar = null;
+ s_player_download_action.callback = new mcallback() {
+ public void execute(Object o) {
+ DownloadOptionsFunc(o);
+ }
+ };
+
+ Menu_AddItem(s_player_config_menu, s_player_name_field);
+ Menu_AddItem(s_player_config_menu, s_player_model_title);
+ Menu_AddItem(s_player_config_menu, s_player_model_box);
+ if (s_player_skin_box.itemnames != null) {
+ Menu_AddItem(s_player_config_menu, s_player_skin_title);
+ Menu_AddItem(s_player_config_menu, s_player_skin_box);
+ }
+ Menu_AddItem(s_player_config_menu, s_player_hand_title);
+ Menu_AddItem(s_player_config_menu, s_player_handedness_box);
+ Menu_AddItem(s_player_config_menu, s_player_rate_title);
+ Menu_AddItem(s_player_config_menu, s_player_rate_box);
+ Menu_AddItem(s_player_config_menu, s_player_download_action);
+
+ return true;
+ }
+
+ static int yaw;
+
+ static void PlayerConfig_MenuDraw() {
+
+ refdef_t refdef = new refdef_t();
+ //char scratch[MAX_QPATH];
+ String scratch;
+
+ //memset(refdef, 0, sizeof(refdef));
+
+ refdef.x = viddef.width / 2;
+ refdef.y = viddef.height / 2 - 72;
+ refdef.width = 144;
+ refdef.height = 168;
+ refdef.fov_x = 40;
+ refdef.fov_y = Math3D
+ .CalcFov(refdef.fov_x, refdef.width, refdef.height);
+ refdef.time = cls.realtime * 0.001f;
+
+ if (s_pmi[s_player_model_box.curvalue].skindisplaynames != null) {
+
+ int maxframe = 29;
+ entity_t entity = new entity_t();
+
+ //memset(entity, 0, sizeof(entity));
+
+ scratch = "players/" + s_pmi[s_player_model_box.curvalue].directory
+ + "/tris.md2";
+
+ entity.model = re.RegisterModel(scratch);
+
+ scratch = "players/"
+ + s_pmi[s_player_model_box.curvalue].directory
+ + "/"
+ + s_pmi[s_player_model_box.curvalue].skindisplaynames[s_player_skin_box.curvalue]
+ + ".pcx";
+
+ entity.skin = re.RegisterSkin(scratch);
+ entity.flags = RF_FULLBRIGHT;
+ entity.origin[0] = 80;
+ entity.origin[1] = 0;
+ entity.origin[2] = 0;
+ Math3D.VectorCopy(entity.origin, entity.oldorigin);
+ entity.frame = 0;
+ entity.oldframe = 0;
+ entity.backlerp = 0.0f;
+ entity.angles[1] = yaw++;
+ if (++yaw > 360)
+ yaw -= 360;
+
+ refdef.areabits = null;
+ refdef.num_entities = 1;
+ refdef.entities = new entity_t[] { entity };
+ refdef.lightstyles = null;
+ refdef.rdflags = RDF_NOWORLDMODEL;
+
+ Menu_Draw(s_player_config_menu);
+
+ DrawTextBox(
+ (int) ((refdef.x) * (320.0F / viddef.width) - 8),
+ (int) ((viddef.height / 2) * (240.0F / viddef.height) - 77),
+ refdef.width / 8, refdef.height / 8);
+ refdef.height += 4;
+
+ re.RenderFrame(refdef);
+
+ scratch = "/players/"
+ + s_pmi[s_player_model_box.curvalue].directory
+ + "/"
+ + s_pmi[s_player_model_box.curvalue].skindisplaynames[s_player_skin_box.curvalue]
+ + "_i.pcx";
+
+ re.DrawPic(s_player_config_menu.x - 40, refdef.y, scratch);
+ }
+ }
+
+ static String PlayerConfig_MenuKey(int key) {
+ int i;
+
+ if (key == K_ESCAPE) {
+ //char scratch[1024];
+ String scratch;
+
+ Cvar.Set("name", s_player_name_field.buffer.toString());
+
+ scratch = s_pmi[s_player_model_box.curvalue].directory
+ + "/"
+ + s_pmi[s_player_model_box.curvalue].skindisplaynames[s_player_skin_box.curvalue];
+
+ Cvar.Set("skin", scratch);
+
+ for (i = 0; i < s_numplayermodels; i++) {
+ int j;
+
+ for (j = 0; j < s_pmi[i].nskins; j++) {
+ if (s_pmi[i].skindisplaynames[j] != null)
+ s_pmi[i].skindisplaynames[j] = null;
+ }
+ s_pmi[i].skindisplaynames = null;
+ s_pmi[i].nskins = 0;
+ }
+ }
+ return Default_MenuKey(s_player_config_menu, key);
+ }
+
+ static xcommand_t Menu_PlayerConfig = new xcommand_t() {
+ public void execute() {
+ Menu_PlayerConfig_f();
+ }
+ };
+
+ static void Menu_PlayerConfig_f() {
+ if (!PlayerConfig_MenuInit()) {
+ Menu_SetStatusBar(s_multiplayer_menu,
+ "No valid player models found");
+ return;
+ }
+ Menu_SetStatusBar(s_multiplayer_menu, null);
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ PlayerConfig_MenuDraw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return PlayerConfig_MenuKey(key);
+ }
+ });
+ }
+
+ /*
+ * =======================================================================
+ *
+ * QUIT MENU
+ *
+ * =======================================================================
+ */
+
+ static String Quit_Key(int key) {
+ switch (key) {
+ case K_ESCAPE:
+ case 'n':
+ case 'N':
+ PopMenu();
+ break;
+
+ case 'Y':
+ case 'y':
+ cls.key_dest = key_console;
+ CL.Quit_f.execute();
+ break;
+
+ default:
+ break;
+ }
+
+ return null;
+
+ }
+
+ static void Quit_Draw() {
+ int w, h;
+ Dimension d = new Dimension();
+ re.DrawGetPicSize(d, "quit");
+ w = d.width;
+ h = d.height;
+ re.DrawPic((viddef.width - w) / 2, (viddef.height - h) / 2, "quit");
+ }
+
+ static xcommand_t Menu_Quit = new xcommand_t() {
+ public void execute() {
+ Menu_Quit_f();
+ }
+ };
+
+ static void Menu_Quit_f() {
+ PushMenu(new xcommand_t() {
+ public void execute() {
+ Quit_Draw();
+ }
+ }, new keyfunc_t() {
+ public String execute(int key) {
+ return Quit_Key(key);
+ }
+ });
+ }
+
+ // =============================================================================
+ /* Menu Subsystem */
+
+ /**
+ * Init
+ */
+ public static void Init() {
+ Cmd.AddCommand("menu_main", Menu_Main);
+ Cmd.AddCommand("menu_game", Menu_Game);
+ Cmd.AddCommand("menu_loadgame", Menu_LoadGame);
+ Cmd.AddCommand("menu_savegame", Menu_SaveGame);
+ Cmd.AddCommand("menu_joinserver", Menu_JoinServer);
+ Cmd.AddCommand("menu_addressbook", Menu_AddressBook);
+ Cmd.AddCommand("menu_startserver", Menu_StartServer);
+ Cmd.AddCommand("menu_dmoptions", Menu_DMOptions);
+ Cmd.AddCommand("menu_playerconfig", Menu_PlayerConfig);
+ Cmd.AddCommand("menu_downloadoptions", Menu_DownloadOptions);
+ Cmd.AddCommand("menu_credits", Menu_Credits);
+ Cmd.AddCommand("menu_multiplayer", Menu_Multiplayer);
+ Cmd.AddCommand("menu_video", Menu_Video);
+ Cmd.AddCommand("menu_options", Menu_Options);
+ Cmd.AddCommand("menu_keys", Menu_Keys);
+ Cmd.AddCommand("menu_quit", Menu_Quit);
+
+ for (int i = 0; i < m_layers.length; i++) {
+ m_layers[i] = new menulayer_t();
+ }
+ }
+
+ /*
+ * ================= Draw =================
+ */
+ static void Draw() {
+ if (cls.key_dest != key_menu)
+ return;
+
+ // repaint everything next frame
+ SCR.DirtyScreen();
+
+ // dim everything behind it down
+ if (cl.cinematictime > 0)
+ re.DrawFill(0, 0, viddef.width, viddef.height, 0);
+ else
+ re.DrawFadeScreen();
+
+ m_drawfunc.execute();
+
+ // delay playing the enter sound until after the
+ // menu has been drawn, to avoid delay while
+ // caching images
+ if (m_entersound) {
+ S.StartLocalSound(menu_in_sound);
+ m_entersound = false;
+ }
+ }
+
+ /*
+ * ================= Keydown =================
+ */
+ static void Keydown(int key) {
+ String s;
+
+ if (m_keyfunc != null)
+ if ((s = m_keyfunc.execute(key)) != null)
+ S.StartLocalSound(s);
+ }
+
+ public static void Action_DoEnter(menuaction_s a) {
+ if (a.callback != null)
+ a.callback.execute(a);
+ }
+
+ public static void Action_Draw(menuaction_s a) {
+ if ((a.flags & QMF_LEFT_JUSTIFY) != 0) {
+ if ((a.flags & QMF_GRAYED) != 0)
+ Menu_DrawStringDark(a.x + a.parent.x + LCOLUMN_OFFSET, a.y
+ + a.parent.y, a.name);
+ else
+ Menu_DrawString(a.x + a.parent.x + LCOLUMN_OFFSET, a.y
+ + a.parent.y, a.name);
+ } else {
+ if ((a.flags & QMF_GRAYED) != 0)
+ Menu_DrawStringR2LDark(a.x + a.parent.x + LCOLUMN_OFFSET, a.y
+ + a.parent.y, a.name);
+ else
+ Menu_DrawStringR2L(a.x + a.parent.x + LCOLUMN_OFFSET, a.y
+ + a.parent.y, a.name);
+ }
+ if (a.ownerdraw != null)
+ a.ownerdraw.execute(a);
+ }
+
+ public static boolean Field_DoEnter(menufield_s f) {
+ if (f.callback != null) {
+ f.callback.execute(f);
+ return true;
+ }
+ return false;
+ }
+
+ public static void Field_Draw(menufield_s f) {
+ int i;
+ String tempbuffer;
+ //[128] = "";
+
+ if (f.name != null)
+ Menu_DrawStringR2LDark(f.x + f.parent.x + LCOLUMN_OFFSET, f.y
+ + f.parent.y, f.name);
+
+ //strncpy(tempbuffer, f.buffer + f.visible_offset, f.visible_length);
+ String s = f.buffer.toString();
+ tempbuffer = s.substring(f.visible_offset, s.length());
+ re.DrawChar(f.x + f.parent.x + 16, f.y + f.parent.y - 4, 18);
+ re.DrawChar(f.x + f.parent.x + 16, f.y + f.parent.y + 4, 24);
+
+ re.DrawChar(f.x + f.parent.x + 24 + f.visible_length * 8, f.y
+ + f.parent.y - 4, 20);
+ re.DrawChar(f.x + f.parent.x + 24 + f.visible_length * 8, f.y
+ + f.parent.y + 4, 26);
+
+ for (i = 0; i < f.visible_length; i++) {
+ re
+ .DrawChar(f.x + f.parent.x + 24 + i * 8, f.y + f.parent.y
+ - 4, 19);
+ re
+ .DrawChar(f.x + f.parent.x + 24 + i * 8, f.y + f.parent.y
+ + 4, 25);
+ }
+
+ Menu_DrawString(f.x + f.parent.x + 24, f.y + f.parent.y, tempbuffer);
+
+ if (Menu_ItemAtCursor(f.parent) == f) {
+ int offset;
+
+ if (f.visible_offset != 0)
+ offset = f.visible_length;
+ else
+ offset = f.cursor;
+
+ if ((((int) (Sys.Milliseconds() / 250)) & 1) != 0) {
+ re.DrawChar(f.x + f.parent.x + (offset + 2) * 8 + 8, f.y
+ + f.parent.y, 11);
+ } else {
+ re.DrawChar(f.x + f.parent.x + (offset + 2) * 8 + 8, f.y
+ + f.parent.y, ' ');
+ }
+ }
+ }
+
+ public static boolean Field_Key(menufield_s f, int k) {
+ char key = (char) k;
+
+ switch (key) {
+ case K_KP_SLASH:
+ key = '/';
+ break;
+ case K_KP_MINUS:
+ key = '-';
+ break;
+ case K_KP_PLUS:
+ key = '+';
+ break;
+ case K_KP_HOME:
+ key = '7';
+ break;
+ case K_KP_UPARROW:
+ key = '8';
+ break;
+ case K_KP_PGUP:
+ key = '9';
+ break;
+ case K_KP_LEFTARROW:
+ key = '4';
+ break;
+ case K_KP_5:
+ key = '5';
+ break;
+ case K_KP_RIGHTARROW:
+ key = '6';
+ break;
+ case K_KP_END:
+ key = '1';
+ break;
+ case K_KP_DOWNARROW:
+ key = '2';
+ break;
+ case K_KP_PGDN:
+ key = '3';
+ break;
+ case K_KP_INS:
+ key = '0';
+ break;
+ case K_KP_DEL:
+ key = '.';
+ break;
+ }
+
+ if (key > 127) {
+ switch (key) {
+ case K_DEL:
+ default:
+ return false;
+ }
+ }
+
+ /*
+ * * support pasting from the clipboard
+ */
+ if ((Character.toUpperCase(key) == 'V' && keydown[K_CTRL])
+ || (((key == K_INS) || (key == K_KP_INS)) && keydown[K_SHIFT])) {
+ String cbd;
+
+ if ((cbd = Sys.GetClipboardData()) != null) {
+ //strtok(cbd, "\n\r\b");
+ String lines[] = Lib.linesplit(cbd);
+ if (lines.length > 0 && lines[0].length() != 0) {
+ //strncpy(f.buffer, cbd, f.length - 1);
+ f.buffer = new StringBuffer(lines[0]);
+ f.cursor = f.buffer.length();
+
+ f.visible_offset = f.cursor - f.visible_length;
+
+ if (f.visible_offset < 0)
+ f.visible_offset = 0;
+ }
+ }
+ return true;
+ }
+
+ switch (key) {
+ case K_KP_LEFTARROW:
+ case K_LEFTARROW:
+ case K_BACKSPACE:
+ if (f.cursor > 0) {
+ f.buffer.deleteCharAt(f.cursor - 1);
+ //memmove(f.buffer[f.cursor - 1], f.buffer[f.cursor], strlen(&
+ // f.buffer[f.cursor]) + 1);
+ f.cursor--;
+
+ if (f.visible_offset != 0) {
+ f.visible_offset--;
+ }
+ }
+ break;
+
+ case K_KP_DEL:
+ case K_DEL:
+ //memmove(& f.buffer[f.cursor], & f.buffer[f.cursor + 1], strlen(&
+ // f.buffer[f.cursor + 1]) + 1);
+ f.buffer.deleteCharAt(f.cursor);
+ break;
+
+ case K_KP_ENTER:
+ case K_ENTER:
+ case K_ESCAPE:
+ case K_TAB:
+ return false;
+
+ case K_SPACE:
+ default:
+ if (!Character.isDigit(key) && (f.flags & QMF_NUMBERSONLY) != 0)
+ return false;
+
+ if (f.cursor < f.length) {
+ f.buffer.append(key);
+ f.cursor++;
+
+ if (f.cursor > f.visible_length) {
+ f.visible_offset++;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ public static void Menu_AddItem(menuframework_s menu, menucommon_s item) {
+ if (menu.nitems == 0)
+ menu.nslots = 0;
+
+ if (menu.nitems < MAXMENUITEMS) {
+ menu.items[menu.nitems] = item;
+ ((menucommon_s) menu.items[menu.nitems]).parent = menu;
+ menu.nitems++;
+ }
+
+ menu.nslots = Menu_TallySlots(menu);
+ }
+
+ /*
+ * * Menu_AdjustCursor * * This function takes the given menu, the
+ * direction, and attempts * to adjust the menu's cursor so that it's at the
+ * next available * slot.
+ */
+ public static void Menu_AdjustCursor(menuframework_s m, int dir) {
+ menucommon_s citem;
+
+ /*
+ * * see if it's in a valid spot
+ */
+ if (m.cursor >= 0 && m.cursor < m.nitems) {
+ if ((citem = Menu_ItemAtCursor(m)) != null) {
+ if (citem.type != MTYPE_SEPARATOR)
+ return;
+ }
+ }
+
+ /*
+ * * it's not in a valid spot, so crawl in the direction indicated until
+ * we * find a valid spot
+ */
+ if (dir == 1) {
+ while (true) {
+ citem = Menu_ItemAtCursor(m);
+ if (citem != null)
+ if (citem.type != MTYPE_SEPARATOR)
+ break;
+ m.cursor += dir;
+ if (m.cursor >= m.nitems)
+ m.cursor = 0;
+ }
+ } else {
+ while (true) {
+ citem = Menu_ItemAtCursor(m);
+ if (citem != null)
+ if (citem.type != MTYPE_SEPARATOR)
+ break;
+ m.cursor += dir;
+ if (m.cursor < 0)
+ m.cursor = m.nitems - 1;
+ }
+ }
+ }
+
+ public static void Menu_Center(menuframework_s menu) {
+ int height;
+
+ height = ((menucommon_s) menu.items[menu.nitems - 1]).y;
+ height += 10;
+
+ menu.y = (viddef.height - height) / 2;
+ }
+
+ public static void Menu_Draw(menuframework_s menu) {
+ int i;
+ menucommon_s item;
+
+ /*
+ * * draw contents
+ */
+ for (i = 0; i < menu.nitems; i++) {
+ switch (((menucommon_s) menu.items[i]).type) {
+ case MTYPE_FIELD:
+ Field_Draw((menufield_s) menu.items[i]);
+ break;
+ case MTYPE_SLIDER:
+ Slider_Draw((menuslider_s) menu.items[i]);
+ break;
+ case MTYPE_LIST:
+ MenuList_Draw((menulist_s) menu.items[i]);
+ break;
+ case MTYPE_SPINCONTROL:
+ SpinControl_Draw((menulist_s) menu.items[i]);
+ break;
+ case MTYPE_ACTION:
+ Action_Draw((menuaction_s) menu.items[i]);
+ break;
+ case MTYPE_SEPARATOR:
+ Separator_Draw((menuseparator_s) menu.items[i]);
+ break;
+ }
+ }
+
+ item = Menu_ItemAtCursor(menu);
+
+ if (item != null && item.cursordraw != null) {
+ item.cursordraw.execute(item);
+ } else if (menu.cursordraw != null) {
+ menu.cursordraw.execute(menu);
+ } else if (item != null && item.type != MTYPE_FIELD) {
+ if ((item.flags & QMF_LEFT_JUSTIFY) != 0) {
+ re.DrawChar(menu.x + item.x - 24 + item.cursor_offset, menu.y
+ + item.y, 12 + ((int) (Sys.Milliseconds() / 250) & 1));
+ } else {
+ re.DrawChar(menu.x + item.cursor_offset, menu.y + item.y,
+ 12 + ((int) (Sys.Milliseconds() / 250) & 1));
+ }
+ }
+
+ if (item != null) {
+ if (item.statusbarfunc != null)
+ item.statusbarfunc.execute(item);
+ else if (item.statusbar != null)
+ Menu_DrawStatusBar(item.statusbar);
+ else
+ Menu_DrawStatusBar(menu.statusbar);
+
+ } else {
+ Menu_DrawStatusBar(menu.statusbar);
+ }
+ }
+
+ public static void Menu_DrawStatusBar(String string) {
+ if (string != null) {
+ int l = string.length();
+ int maxrow = viddef.height / 8;
+ int maxcol = viddef.width / 8;
+ int col = maxcol / 2 - l / 2;
+
+ re.DrawFill(0, viddef.height - 8, viddef.width, 8, 4);
+ Menu_DrawString(col * 8, viddef.height - 8, string);
+ } else {
+ re.DrawFill(0, viddef.height - 8, viddef.width, 8, 0);
+ }
+ }
+
+ public static void Menu_DrawString(int x, int y, String string) {
+ int i;
+
+ for (i = 0; i < string.length(); i++) {
+ re.DrawChar((x + i * 8), y, string.charAt(i));
+ }
+ }
+
+ public static void Menu_DrawStringDark(int x, int y, String string) {
+ int i;
+
+ for (i = 0; i < string.length(); i++) {
+ re.DrawChar((x + i * 8), y, string.charAt(i) + 128);
+ }
+ }
+
+ public static void Menu_DrawStringR2L(int x, int y, String string) {
+ int i;
+
+ int l = string.length();
+ for (i = 0; i < l; i++) {
+ re.DrawChar((x - i * 8), y, string.charAt(l - i - 1));
+ }
+ }
+
+ public static void Menu_DrawStringR2LDark(int x, int y, String string) {
+ int i;
+
+ int l = string.length();
+ for (i = 0; i < l; i++) {
+ re.DrawChar((x - i * 8), y, string.charAt(l - i - 1) + 128);
+ }
+ }
+
+ public static menucommon_s Menu_ItemAtCursor(menuframework_s m) {
+ if (m.cursor < 0 || m.cursor >= m.nitems)
+ return null;
+
+ return (menucommon_s) m.items[m.cursor];
+ }
+
+ static boolean Menu_SelectItem(menuframework_s s) {
+ menucommon_s item = Menu_ItemAtCursor(s);
+
+ if (item != null) {
+ switch (item.type) {
+ case MTYPE_FIELD:
+ return Field_DoEnter((menufield_s) item);
+ case MTYPE_ACTION:
+ Action_DoEnter((menuaction_s) item);
+ return true;
+ case MTYPE_LIST:
+ // Menulist_DoEnter( ( menulist_s ) item );
+ return false;
+ case MTYPE_SPINCONTROL:
+ // SpinControl_DoEnter( ( menulist_s ) item );
+ return false;
+ }
+ }
+ return false;
+ }
+
+ public static void Menu_SetStatusBar(menuframework_s m, String string) {
+ m.statusbar = string;
+ }
+
+ public static void Menu_SlideItem(menuframework_s s, int dir) {
+ menucommon_s item = (menucommon_s) Menu_ItemAtCursor(s);
+
+ if (item != null) {
+ switch (item.type) {
+ case MTYPE_SLIDER:
+ Slider_DoSlide((menuslider_s) item, dir);
+ break;
+ case MTYPE_SPINCONTROL:
+ SpinControl_DoSlide((menulist_s) item, dir);
+ break;
+ }
+ }
+ }
+
+ public static int Menu_TallySlots(menuframework_s menu) {
+ int i;
+ int total = 0;
+
+ for (i = 0; i < menu.nitems; i++) {
+ if (((menucommon_s) menu.items[i]).type == MTYPE_LIST) {
+ int nitems = 0;
+ String n[] = ((menulist_s) menu.items[i]).itemnames;
+
+ while (n[nitems] != null)
+ nitems++;
+
+ total += nitems;
+ } else {
+ total++;
+ }
+ }
+
+ return total;
+ }
+
+ public static void Menulist_DoEnter(menulist_s l) {
+ int start;
+
+ start = l.y / 10 + 1;
+
+ l.curvalue = l.parent.cursor - start;
+
+ if (l.callback != null)
+ l.callback.execute(l);
+ }
+
+ public static void MenuList_Draw(menulist_s l) {
+ String n[];
+ int y = 0;
+
+ Menu_DrawStringR2LDark(l.x + l.parent.x + LCOLUMN_OFFSET, l.y
+ + l.parent.y, l.name);
+
+ n = l.itemnames;
+
+ re.DrawFill(l.x - 112 + l.parent.x, l.parent.y + l.y + l.curvalue * 10
+ + 10, 128, 10, 16);
+ int i = 0;
+
+ while (n[i] != null) {
+ Menu_DrawStringR2LDark(l.x + l.parent.x + LCOLUMN_OFFSET, l.y
+ + l.parent.y + y + 10, n[i]);
+
+ i++;
+ y += 10;
+ }
+ }
+
+ public static void Separator_Draw(menuseparator_s s) {
+ if (s.name != null)
+ Menu_DrawStringR2LDark(s.x + s.parent.x, s.y + s.parent.y, s.name);
+ }
+
+ public static void Slider_DoSlide(menuslider_s s, int dir) {
+ s.curvalue += dir;
+
+ if (s.curvalue > s.maxvalue)
+ s.curvalue = s.maxvalue;
+ else if (s.curvalue < s.minvalue)
+ s.curvalue = s.minvalue;
+
+ if (s.callback != null)
+ s.callback.execute(s);
+ }
+
+ public static final int SLIDER_RANGE = 10;
+
+ public static void Slider_Draw(menuslider_s s) {
+ int i;
+
+ Menu_DrawStringR2LDark(s.x + s.parent.x + LCOLUMN_OFFSET, s.y
+ + s.parent.y, s.name);
+
+ s.range = (s.curvalue - s.minvalue) / (float) (s.maxvalue - s.minvalue);
+
+ if (s.range < 0)
+ s.range = 0;
+ if (s.range > 1)
+ s.range = 1;
+ re.DrawChar(s.x + s.parent.x + RCOLUMN_OFFSET, s.y + s.parent.y, 128);
+ for (i = 0; i < SLIDER_RANGE; i++)
+ re.DrawChar(RCOLUMN_OFFSET + s.x + i * 8 + s.parent.x + 8, s.y
+ + s.parent.y, 129);
+ re.DrawChar(RCOLUMN_OFFSET + s.x + i * 8 + s.parent.x + 8, s.y
+ + s.parent.y, 130);
+ re
+ .DrawChar(
+ (int) (8 + RCOLUMN_OFFSET + s.parent.x + s.x + (SLIDER_RANGE - 1)
+ * 8 * s.range), s.y + s.parent.y, 131);
+ }
+
+ public static void SpinControl_DoEnter(menulist_s s) {
+ s.curvalue++;
+ if (s.itemnames[s.curvalue] == null)
+ s.curvalue = 0;
+
+ if (s.callback != null)
+ s.callback.execute(s);
+ }
+
+ public static void SpinControl_DoSlide(menulist_s s, int dir) {
+ s.curvalue += dir;
+
+ if (s.curvalue < 0)
+ s.curvalue = 0;
+ else if (s.itemnames[s.curvalue] == null)
+ s.curvalue--;
+
+ if (s.callback != null)
+ s.callback.execute(s);
+ }
+
+ public static void SpinControl_Draw(menulist_s s) {
+ //char buffer[100];
+ String buffer;
+
+ if (s.name != null) {
+ Menu_DrawStringR2LDark(s.x + s.parent.x + LCOLUMN_OFFSET, s.y
+ + s.parent.y, s.name);
+ }
+
+ if (s.itemnames[s.curvalue].indexOf('\n') == -1) {
+ Menu_DrawString(RCOLUMN_OFFSET + s.x + s.parent.x,
+ s.y + s.parent.y, s.itemnames[s.curvalue]);
+ } else {
+ String line1, line2;
+ line1 = Lib.leftFrom(s.itemnames[s.curvalue], '\n');
+ Menu_DrawString(RCOLUMN_OFFSET + s.x + s.parent.x,
+ s.y + s.parent.y, line1);
+
+ line2 = Lib.rightFrom(s.itemnames[s.curvalue], '\n');
+
+ int pos = line2.indexOf('\n');
+ if (pos != -1)
+ line2 = line2.substring(0, pos);
+
+ Menu_DrawString(RCOLUMN_OFFSET + s.x + s.parent.x, s.y + s.parent.y
+ + 10, line2);
+ }
+ }
+} \ No newline at end of file