]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - menu.c
removed particle compacting stage, this fixed all 'disappearing decals' problems...
[xonotic/darkplaces.git] / menu.c
diff --git a/menu.c b/menu.c
index b0b5b5cc2ae25208adf1ada79fd59a0dcb68bf5e..caaf255d909e62b4f397682cd617d35f17dd08a5 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -40,6 +40,7 @@ void M_Menu_Main_f (void);
                void M_Menu_Setup_f (void);
        void M_Menu_Options_f (void);
        void M_Menu_Options_Effects_f (void);
+       void M_Menu_Options_Graphics_f (void);
        void M_Menu_Options_ColorControl_f (void);
                void M_Menu_Keys_f (void);
                void M_Menu_Video_f (void);
@@ -57,6 +58,7 @@ void M_Main_Draw (void);
                void M_Setup_Draw (void);
        void M_Options_Draw (void);
        void M_Options_Effects_Draw (void);
+       void M_Options_Graphics_Draw (void);
        void M_Options_ColorControl_Draw (void);
                void M_Keys_Draw (void);
                void M_Video_Draw (void);
@@ -74,6 +76,7 @@ void M_Main_Key (int key, char ascii);
                void M_Setup_Key (int key, char ascii);
        void M_Options_Key (int key, char ascii);
        void M_Options_Effects_Key (int key, char ascii);
+       void M_Options_Graphics_Key (int key, char ascii);
        void M_Options_ColorControl_Key (int key, char ascii);
                void M_Keys_Key (int key, char ascii);
                void M_Video_Key (int key, char ascii);
@@ -317,7 +320,7 @@ void M_Demo_Key (int k, char ascii)
                break;
 
        case K_ENTER:
-               S_LocalSound ("misc/menu2.wav");
+               S_LocalSound ("misc/menu2.wav", true);
                m_state = m_none;
                key_dest = key_game;
                Cbuf_AddText (va ("playdemo %s\n", NehahraDemos[demo_cursor].name));
@@ -325,7 +328,7 @@ void M_Demo_Key (int k, char ascii)
 
        case K_UPARROW:
        case K_LEFTARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                demo_cursor--;
                if (demo_cursor < 0)
                        demo_cursor = NumberOfNehahraDemos-1;
@@ -333,7 +336,7 @@ void M_Demo_Key (int k, char ascii)
 
        case K_DOWNARROW:
        case K_RIGHTARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                demo_cursor++;
                if (demo_cursor >= NumberOfNehahraDemos)
                        demo_cursor = 0;
@@ -417,13 +420,13 @@ void M_Main_Key (int key, char ascii)
                break;
 
        case K_DOWNARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                if (++m_main_cursor >= MAIN_ITEMS)
                        m_main_cursor = 0;
                break;
 
        case K_UPARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                if (--m_main_cursor < 0)
                        m_main_cursor = MAIN_ITEMS - 1;
                break;
@@ -616,13 +619,13 @@ void M_SinglePlayer_Key (int key, char ascii)
                break;
 
        case K_DOWNARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                if (++m_singleplayer_cursor >= SINGLEPLAYER_ITEMS)
                        m_singleplayer_cursor = 0;
                break;
 
        case K_UPARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                if (--m_singleplayer_cursor < 0)
                        m_singleplayer_cursor = SINGLEPLAYER_ITEMS - 1;
                break;
@@ -764,7 +767,7 @@ void M_Load_Key (int k, char ascii)
                break;
 
        case K_ENTER:
-               S_LocalSound ("misc/menu2.wav");
+               S_LocalSound ("misc/menu2.wav", true);
                if (!loadable[load_cursor])
                        return;
                m_state = m_none;
@@ -776,7 +779,7 @@ void M_Load_Key (int k, char ascii)
 
        case K_UPARROW:
        case K_LEFTARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                load_cursor--;
                if (load_cursor < 0)
                        load_cursor = MAX_SAVEGAMES-1;
@@ -784,7 +787,7 @@ void M_Load_Key (int k, char ascii)
 
        case K_DOWNARROW:
        case K_RIGHTARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                load_cursor++;
                if (load_cursor >= MAX_SAVEGAMES)
                        load_cursor = 0;
@@ -809,7 +812,7 @@ void M_Save_Key (int k, char ascii)
 
        case K_UPARROW:
        case K_LEFTARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                load_cursor--;
                if (load_cursor < 0)
                        load_cursor = MAX_SAVEGAMES-1;
@@ -817,7 +820,7 @@ void M_Save_Key (int k, char ascii)
 
        case K_DOWNARROW:
        case K_RIGHTARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                load_cursor++;
                if (load_cursor >= MAX_SAVEGAMES)
                        load_cursor = 0;
@@ -867,13 +870,13 @@ void M_MultiPlayer_Key (int key, char ascii)
                break;
 
        case K_DOWNARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                if (++m_multiplayer_cursor >= MULTIPLAYER_ITEMS)
                        m_multiplayer_cursor = 0;
                break;
 
        case K_UPARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                if (--m_multiplayer_cursor < 0)
                        m_multiplayer_cursor = MULTIPLAYER_ITEMS - 1;
                break;
@@ -1038,14 +1041,14 @@ void M_Setup_Key (int k, char ascii)
                break;
 
        case K_UPARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                setup_cursor--;
                if (setup_cursor < 0)
                        setup_cursor = NUM_SETUP_CMDS-1;
                break;
 
        case K_DOWNARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                setup_cursor++;
                if (setup_cursor >= NUM_SETUP_CMDS)
                        setup_cursor = 0;
@@ -1054,7 +1057,7 @@ void M_Setup_Key (int k, char ascii)
        case K_LEFTARROW:
                if (setup_cursor < 1)
                        return;
-               S_LocalSound ("misc/menu3.wav");
+               S_LocalSound ("misc/menu3.wav", true);
                if (setup_cursor == 1)
                        setup_top = setup_top - 1;
                if (setup_cursor == 2)
@@ -1071,7 +1074,7 @@ void M_Setup_Key (int k, char ascii)
                if (setup_cursor < 1)
                        return;
 forward:
-               S_LocalSound ("misc/menu3.wav");
+               S_LocalSound ("misc/menu3.wav", true);
                if (setup_cursor == 1)
                        setup_top = setup_top + 1;
                if (setup_cursor == 2)
@@ -1180,7 +1183,6 @@ void M_Menu_Options_f (void)
 }
 
 extern cvar_t snd_staticvolume;
-extern cvar_t gl_delayfinish;
 extern cvar_t slowmo;
 extern dllhandle_t jpeg_dll;
 extern cvar_t gl_texture_anisotropy;
@@ -1188,9 +1190,9 @@ extern cvar_t gl_texture_anisotropy;
 void M_Menu_Options_AdjustSliders (int dir)
 {
        int optnum;
-       S_LocalSound ("misc/menu3.wav");
+       S_LocalSound ("misc/menu3.wav", true);
 
-       optnum = 6;
+       optnum = 7;
        if (options_cursor == optnum++)
                Cvar_SetValueQuick (&vid_conwidth, bound(320, vid_conwidth.value + dir * 64, 2048));
        else if (options_cursor == optnum++)
@@ -1215,8 +1217,6 @@ void M_Menu_Options_AdjustSliders (int dir)
                Cvar_SetValueQuick (&gl_combine, !gl_combine.integer);
        else if (options_cursor == optnum++)
                Cvar_SetValueQuick (&gl_dither, !gl_dither.integer);
-       else if (options_cursor == optnum++)
-               Cvar_SetValueQuick (&gl_delayfinish, !gl_delayfinish.integer);
        else if (options_cursor == optnum++)
                Cvar_SetValueQuick (&gl_texture_anisotropy, bound(1, gl_texture_anisotropy.integer + dir, gl_max_anisotropy));
        else if (options_cursor == optnum++)
@@ -1326,6 +1326,7 @@ void M_Options_Draw (void)
        M_Options_PrintCommand( " Reset to defaults", true);
        M_Options_PrintCommand( "             Video", true);
        M_Options_PrintCommand( "           Effects", true);
+       M_Options_PrintCommand( "          Graphics", true);
        M_Options_PrintCommand( "     Color Control", true);
        M_Options_PrintSlider(  "  2D Screen Width ", true, vid_conwidth.value, 320, 2048);
        M_Options_PrintSlider(  "  2D Screen Height", true, vid_conheight.value, 240, 1536);
@@ -1339,7 +1340,6 @@ void M_Options_Draw (void)
        M_Options_PrintCheckbox("               Sky", true, r_sky.integer);
        M_Options_PrintCheckbox("   Texture Combine", true, gl_combine.integer);
        M_Options_PrintCheckbox("         Dithering", true, gl_dither.integer);
-       M_Options_PrintCheckbox("Delay gfx (faster)", true, gl_delayfinish.integer);
        M_Options_PrintSlider(  "Anisotropic Filter", gl_support_anisotropy, gl_texture_anisotropy.integer, 1, gl_max_anisotropy);
        M_Options_PrintSlider(  "        Game Speed", sv.active, slowmo.value, 0, 5);
        M_Options_PrintSlider(  "   CD Music Volume", cdaudioinitialized.integer, bgmvolume.value, 0, 1);
@@ -1391,6 +1391,9 @@ void M_Options_Key (int k, char ascii)
                        M_Menu_Options_Effects_f ();
                        break;
                case 5:
+                       M_Menu_Options_Graphics_f ();
+                       break;
+               case 6:
                        M_Menu_Options_ColorControl_f ();
                        break;
                default:
@@ -1400,14 +1403,14 @@ void M_Options_Key (int k, char ascii)
                return;
 
        case K_UPARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                options_cursor--;
                if (options_cursor < 0)
                        options_cursor = OPTIONS_ITEMS-1;
                break;
 
        case K_DOWNARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                options_cursor++;
                if (options_cursor >= OPTIONS_ITEMS)
                        options_cursor = 0;
@@ -1463,7 +1466,7 @@ extern cvar_t r_lightningbeam_qmbtexture;
 void M_Menu_Options_Effects_AdjustSliders (int dir)
 {
        int optnum;
-       S_LocalSound ("misc/menu3.wav");
+       S_LocalSound ("misc/menu3.wav", true);
 
        optnum = 0;
             if (options_effects_cursor == optnum++) Cvar_SetValueQuick (&r_modellights, bound(0, r_modellights.value + dir, 8));
@@ -1566,14 +1569,14 @@ void M_Options_Effects_Key (int k, char ascii)
                break;
 
        case K_UPARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                options_effects_cursor--;
                if (options_effects_cursor < 0)
                        options_effects_cursor = OPTIONS_EFFECTS_ITEMS-1;
                break;
 
        case K_DOWNARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                options_effects_cursor++;
                if (options_effects_cursor >= OPTIONS_EFFECTS_ITEMS)
                        options_effects_cursor = 0;
@@ -1590,7 +1593,103 @@ void M_Options_Effects_Key (int k, char ascii)
 }
 
 
+#define        OPTIONS_GRAPHICS_ITEMS  7
+
+int options_graphics_cursor;
+
+void M_Menu_Options_Graphics_f (void)
+{
+       key_dest = key_menu;
+       m_state = m_options_graphics;
+       m_entersound = true;
+}
+
+extern cvar_t r_shadow_gloss;
+extern cvar_t r_shadow_realtime_dlight;
+extern cvar_t r_shadow_realtime_dlight_shadows;
+extern cvar_t r_shadow_realtime_world;
+extern cvar_t r_shadow_realtime_world_dlightshadows;
+extern cvar_t r_shadow_realtime_world_lightmaps;
+extern cvar_t r_shadow_realtime_world_shadows;
+
+void M_Menu_Options_Graphics_AdjustSliders (int dir)
+{
+       int optnum;
+       S_LocalSound ("misc/menu3.wav", true);
+       optnum = 0;
+
+                if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_gloss,                                                  bound(0, r_shadow_gloss.integer + dir, 2));
+       else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_realtime_dlight,                            !r_shadow_realtime_dlight.integer);
+       else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_realtime_dlight_shadows,            !r_shadow_realtime_dlight_shadows.integer);
+       else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_realtime_world,                                     !r_shadow_realtime_world.integer);
+       else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_realtime_world_dlightshadows,       !r_shadow_realtime_world_dlightshadows.integer);
+       else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_realtime_world_lightmaps,           !r_shadow_realtime_world_lightmaps.integer);
+       else if (options_graphics_cursor == optnum++) Cvar_SetValueQuick (&r_shadow_realtime_world_shadows,                     !r_shadow_realtime_world_shadows.integer);
+}
+
+
+void M_Options_Graphics_Draw (void)
+{
+       int visible;
+       cachepic_t      *p;
 
+       M_Background(320, 200);
+
+       M_DrawPic(16, 4, "gfx/qplaque.lmp");
+       p = Draw_CachePic("gfx/p_option.lmp");
+       M_DrawPic((320-p->width)/2, 4, "gfx/p_option.lmp");
+
+       optcursor = options_graphics_cursor;
+       optnum = 0;
+       visible = (vid.conheight - 32) / 8;
+       opty = 32 - bound(0, optcursor - (visible >> 1), max(0, OPTIONS_GRAPHICS_ITEMS - visible)) * 8;
+
+       M_Options_PrintSlider(  "             Gloss Mode", true, r_shadow_gloss.integer, 0, 2);
+       M_Options_PrintCheckbox("             RT DLights", true, r_shadow_realtime_dlight.integer);
+       M_Options_PrintCheckbox("      RT DLight Shadows", true, r_shadow_realtime_dlight_shadows.integer);
+       M_Options_PrintCheckbox("               RT World", true, r_shadow_realtime_world.integer);
+       M_Options_PrintCheckbox("RT World DLight Shadows", true, r_shadow_realtime_world_dlightshadows.integer);
+       M_Options_PrintCheckbox("     RT World Lightmaps", true, r_shadow_realtime_world_lightmaps.integer);
+       M_Options_PrintCheckbox("        RT World Shadow", true, r_shadow_realtime_world_shadows.integer);
+}
+
+
+void M_Options_Graphics_Key (int k, char ascii)
+{
+       switch (k)
+       {
+       case K_ESCAPE:
+               M_Menu_Options_f ();
+               break;
+
+       case K_ENTER:
+               M_Menu_Options_Graphics_AdjustSliders (1);
+               break;
+
+       case K_UPARROW:
+               S_LocalSound ("misc/menu1.wav", true);
+               options_graphics_cursor--;
+               if (options_graphics_cursor < 0)
+                       options_graphics_cursor = OPTIONS_GRAPHICS_ITEMS-1;
+               break;
+
+       case K_DOWNARROW:
+               S_LocalSound ("misc/menu1.wav", true);
+               options_graphics_cursor++;
+               if (options_graphics_cursor >= OPTIONS_GRAPHICS_ITEMS)
+                       options_graphics_cursor = 0;
+               break;
+
+       case K_LEFTARROW:
+               M_Menu_Options_Graphics_AdjustSliders (-1);
+               break;
+
+       case K_RIGHTARROW:
+               M_Menu_Options_Graphics_AdjustSliders (1);
+               break;
+       }
+}
 
 
 #define        OPTIONS_COLORCONTROL_ITEMS      18
@@ -1612,7 +1711,7 @@ void M_Menu_Options_ColorControl_AdjustSliders (int dir)
 {
        int optnum;
        float f;
-       S_LocalSound ("misc/menu3.wav");
+       S_LocalSound ("misc/menu3.wav", true);
 
        optnum = 1;
        if (options_colorcontrol_cursor == optnum++)
@@ -1816,14 +1915,14 @@ void M_Options_ColorControl_Key (int k, char ascii)
                return;
 
        case K_UPARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                options_colorcontrol_cursor--;
                if (options_colorcontrol_cursor < 0)
                        options_colorcontrol_cursor = OPTIONS_COLORCONTROL_ITEMS-1;
                break;
 
        case K_DOWNARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                options_colorcontrol_cursor++;
                if (options_colorcontrol_cursor >= OPTIONS_COLORCONTROL_ITEMS)
                        options_colorcontrol_cursor = 0;
@@ -2162,7 +2261,7 @@ void M_Keys_Key (int k, char ascii)
 
        if (bind_grab)
        {       // defining a key
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                if (k == K_ESCAPE)
                {
                        bind_grab = false;
@@ -2185,7 +2284,7 @@ void M_Keys_Key (int k, char ascii)
 
        case K_LEFTARROW:
        case K_UPARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                do
                {
                        keys_cursor--;
@@ -2197,7 +2296,7 @@ void M_Keys_Key (int k, char ascii)
 
        case K_DOWNARROW:
        case K_RIGHTARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                do
                {
                        keys_cursor++;
@@ -2209,7 +2308,7 @@ void M_Keys_Key (int k, char ascii)
 
        case K_ENTER:           // go into bind mode
                M_FindKeysForCommand (bindnames[keys_cursor][0], keys);
-               S_LocalSound ("misc/menu2.wav");
+               S_LocalSound ("misc/menu2.wav", true);
                if (keys[NUMKEYS - 1] != -1)
                        M_UnbindCommand (bindnames[keys_cursor][0]);
                bind_grab = true;
@@ -2217,7 +2316,7 @@ void M_Keys_Key (int k, char ascii)
 
        case K_BACKSPACE:               // delete bindings
        case K_DEL:                             // delete bindings
-               S_LocalSound ("misc/menu2.wav");
+               S_LocalSound ("misc/menu2.wav", true);
                M_UnbindCommand (bindnames[keys_cursor][0]);
                break;
        }
@@ -2303,7 +2402,7 @@ void M_Video_Draw (void)
 
 void M_Menu_Video_AdjustSliders (int dir)
 {
-       S_LocalSound ("misc/menu3.wav");
+       S_LocalSound ("misc/menu3.wav", true);
 
        switch (video_cursor)
        {
@@ -2345,7 +2444,7 @@ void M_Video_Key (int key, char ascii)
                        Cvar_SetValueQuick(&vid_height, current_vid_height);
                        Cvar_SetValueQuick(&vid_bitsperpixel, current_vid_bitsperpixel);
 
-                       S_LocalSound ("misc/menu1.wav");
+                       S_LocalSound ("misc/menu1.wav", true);
                        M_Menu_Options_f ();
                        break;
 
@@ -2363,14 +2462,14 @@ void M_Video_Key (int key, char ascii)
                        break;
 
                case K_UPARROW:
-                       S_LocalSound ("misc/menu1.wav");
+                       S_LocalSound ("misc/menu1.wav", true);
                        video_cursor--;
                        if (video_cursor < 0)
                                video_cursor = VIDEO_ITEMS-1;
                        break;
 
                case K_DOWNARROW:
-                       S_LocalSound ("misc/menu1.wav");
+                       S_LocalSound ("misc/menu1.wav", true);
                        video_cursor++;
                        if (video_cursor >= VIDEO_ITEMS)
                                video_cursor = 0;
@@ -2497,6 +2596,12 @@ int M_ChooseQuitMessage(int request)
                if (request-- == 0) return M_QuitMessage("Your mech here is way more impressive","than your car out there...","Press Y to quit, N to keep fraggin'",NULL,NULL,NULL,NULL,NULL);
                if (request-- == 0) return M_QuitMessage("Quitting won't reduce your debt","Press Y to quit, N to keep fraggin'",NULL,NULL,NULL,NULL,NULL,NULL);
                break;
+       case GAME_OPENQUARTZ:
+               if (request-- == 0) return M_QuitMessage("There is nothing like free beer!","Press Y to quit, N to stay",NULL,NULL,NULL,NULL,NULL,NULL);
+               if (request-- == 0) return M_QuitMessage("GNU is not Unix!","Press Y to quit, N to stay",NULL,NULL,NULL,NULL,NULL,NULL);
+               if (request-- == 0) return M_QuitMessage("You prefer free beer over free speech?","Press Y to quit, N to stay",NULL,NULL,NULL,NULL,NULL,NULL);
+               if (request-- == 0) return M_QuitMessage("Is OpenQuartz Propaganda?","Press Y to quit, N to stay",NULL,NULL,NULL,NULL,NULL,NULL);
+               break;
        default:
                if (request-- == 0) return M_QuitMessage("Tired of fragging already?",NULL,NULL,NULL,NULL,NULL,NULL,NULL);
                if (request-- == 0) return M_QuitMessage("Quit now and forfeit your bodycount?",NULL,NULL,NULL,NULL,NULL,NULL,NULL);
@@ -2668,14 +2773,14 @@ void M_LanConfig_Key (int key, char ascii)
                break;
 
        case K_UPARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                lanConfig_cursor--;
                if (lanConfig_cursor < 0)
                        lanConfig_cursor = NUM_LANCONFIG_CMDS-1;
                break;
 
        case K_DOWNARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                lanConfig_cursor++;
                if (lanConfig_cursor >= NUM_LANCONFIG_CMDS)
                        lanConfig_cursor = 0;
@@ -2964,6 +3069,7 @@ level_t           transfusionlevels[] =
        {"e1m2",                "Wrong Side of the Tracks"},
        {"e1m7",                "Altar of Stone"},
        {"e2m8",                "The Lair of Shial"},
+       {"e3m1",                "Ghost Town"},
        {"e3m7",                "The Pit of Cerberus"},
        {"e4m1",                "Butchery Loves Company"},
        {"e4m7",                "In the Flesh"},
@@ -2994,6 +3100,7 @@ level_t           transfusionlevels[] =
        {"qbb1",                "The Confluence"},
        {"qbb2",                "KathartiK"},
        {"qbb3",                "Caleb's Woodland Retreat"},
+       {"zoo",                 "Zoo"},
 
        {"dranzbb6",    "Black Coffee"},
        {"fragm",               "Frag'M"},
@@ -3006,12 +3113,12 @@ level_t         transfusionlevels[] =
 episode_t      transfusionepisodes[] =
 {
        {"Blood", 0, 8},
-       {"Blood Single Player", 8, 9},
-       {"Plasma Pack", 17, 6},
-       {"Cryptic Passage", 23, 2},
-       {"Blood 2", 25, 5},
-       {"Transfusion", 30, 8},
-       {"Conversions", 38, 6}
+       {"Blood Single Player", 8, 10},
+       {"Plasma Pack", 18, 6},
+       {"Cryptic Passage", 24, 2},
+       {"Blood 2", 26, 5},
+       {"Transfusion", 31, 9},
+       {"Conversions", 40, 6}
 };
 
 level_t goodvsbad2levels[] =
@@ -3048,6 +3155,32 @@ episode_t battlemechepisodes[] =
        {"Time for Battle", 0, 7},
 };
 
+level_t openquartzlevels[] =
+{
+       {"start", "Welcome to Openquartz"},
+
+       {"void1", "The center of nowhere"},                        // 1
+       {"void2", "The place with no name"},
+       {"void3", "The lost supply base"},
+       {"void4", "Past the outer limits"},
+       {"void5", "Into the nonexistance"},
+       {"void6", "Void walk"},
+
+       {"vtest", "Warp Central"},
+       {"box", "The deathmatch box"},
+       {"bunkers", "Void command"},
+       {"house", "House of chaos"},
+       {"office", "Overnight office kill"},
+       {"am1", "The nameless chambers"},
+};
+
+episode_t openquartzepisodes[] =
+{
+       {"Single Player", 0, 1},
+       {"Void Deathmatch", 1, 6},
+       {"Contrib", 7, 6},
+};
+
 gamelevels_t sharewarequakegame = {"Shareware Quake", quakelevels, quakeepisodes, 2};
 gamelevels_t registeredquakegame = {"Quake", quakelevels, quakeepisodes, 7};
 gamelevels_t hipnoticgame = {"Scourge of Armagon", hipnoticlevels, hipnoticepisodes, 6};
@@ -3056,6 +3189,7 @@ gamelevels_t nehahragame = {"Nehahra", nehahralevels, nehahraepisodes, 4};
 gamelevels_t transfusiongame = {"Transfusion", transfusionlevels, transfusionepisodes, 7};
 gamelevels_t goodvsbad2game = {"Good Vs. Bad 2", goodvsbad2levels, goodvsbad2episodes, 1};
 gamelevels_t battlemechgame = {"Battlemech", battlemechlevels, battlemechepisodes, 1};
+gamelevels_t openquartzgame = {"OpenQuartz", openquartzlevels, openquartzepisodes, 3};
 
 typedef struct
 {
@@ -3074,6 +3208,7 @@ gameinfo_t gamelist[] =
        {GAME_TRANSFUSION, &transfusiongame, &transfusiongame},
        {GAME_GOODVSBAD2, &goodvsbad2game, &goodvsbad2game},
        {GAME_BATTLEMECH, &battlemechgame, &battlemechgame},
+       {GAME_OPENQUARTZ, &openquartzgame, &openquartzgame},
        {-1, &sharewarequakegame, &registeredquakegame} // final fallback
 };
 
@@ -3400,14 +3535,14 @@ void M_GameOptions_Key (int key, char ascii)
                break;
 
        case K_UPARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                gameoptions_cursor--;
                if (gameoptions_cursor < 0)
                        gameoptions_cursor = NUM_GAMEOPTIONS-1;
                break;
 
        case K_DOWNARROW:
-               S_LocalSound ("misc/menu1.wav");
+               S_LocalSound ("misc/menu1.wav", true);
                gameoptions_cursor++;
                if (gameoptions_cursor >= NUM_GAMEOPTIONS)
                        gameoptions_cursor = 0;
@@ -3416,19 +3551,19 @@ void M_GameOptions_Key (int key, char ascii)
        case K_LEFTARROW:
                if (gameoptions_cursor == 0)
                        break;
-               S_LocalSound ("misc/menu3.wav");
+               S_LocalSound ("misc/menu3.wav", true);
                M_NetStart_Change (-1);
                break;
 
        case K_RIGHTARROW:
                if (gameoptions_cursor == 0)
                        break;
-               S_LocalSound ("misc/menu3.wav");
+               S_LocalSound ("misc/menu3.wav", true);
                M_NetStart_Change (1);
                break;
 
        case K_ENTER:
-               S_LocalSound ("misc/menu2.wav");
+               S_LocalSound ("misc/menu2.wav", true);
                if (gameoptions_cursor == 0)
                {
                        if (sv.active)
@@ -3543,7 +3678,7 @@ void M_ServerList_Key(int k, char ascii)
 
        case K_UPARROW:
        case K_LEFTARROW:
-               S_LocalSound("misc/menu1.wav");
+               S_LocalSound("misc/menu1.wav", true);
                slist_cursor--;
                if (slist_cursor < 0)
                        slist_cursor = hostCacheCount - 1;
@@ -3551,14 +3686,14 @@ void M_ServerList_Key(int k, char ascii)
 
        case K_DOWNARROW:
        case K_RIGHTARROW:
-               S_LocalSound("misc/menu1.wav");
+               S_LocalSound("misc/menu1.wav", true);
                slist_cursor++;
                if (slist_cursor >= hostCacheCount)
                        slist_cursor = 0;
                break;
 
        case K_ENTER:
-               S_LocalSound("misc/menu2.wav");
+               S_LocalSound("misc/menu2.wav", true);
                Cbuf_AddText(va("connect \"%s\"\n", hostcache[slist_cursor].cname));
                break;
 
@@ -3590,6 +3725,7 @@ void M_Init (void)
        Cmd_AddCommand ("menu_setup", M_Menu_Setup_f);
        Cmd_AddCommand ("menu_options", M_Menu_Options_f);
        Cmd_AddCommand ("menu_options_effects", M_Menu_Options_Effects_f);
+       Cmd_AddCommand ("menu_options_graphics", M_Menu_Options_Graphics_f);
        Cmd_AddCommand ("menu_options_colorcontrol", M_Menu_Options_ColorControl_f);
        Cvar_RegisterVariable (&menu_options_colorcontrol_correctionvalue);
        Cmd_AddCommand ("menu_keys", M_Menu_Keys_f);
@@ -3705,6 +3841,10 @@ void M_Draw (void)
                M_Options_Effects_Draw ();
                break;
 
+       case m_options_graphics:
+               M_Options_Graphics_Draw ();
+               break;
+
        case m_options_colorcontrol:
                M_Options_ColorControl_Draw ();
                break;
@@ -3740,7 +3880,7 @@ void M_Draw (void)
 
        if (m_entersound)
        {
-               S_LocalSound ("misc/menu2.wav");
+               S_LocalSound ("misc/menu2.wav", true);
                m_entersound = false;
        }
 
@@ -3791,6 +3931,10 @@ void M_Keydown (int key, char ascii)
                M_Options_Effects_Key (key, ascii);
                return;
 
+       case m_options_graphics:
+               M_Options_Graphics_Key (key, ascii);
+               return;
+
        case m_options_colorcontrol:
                M_Options_ColorControl_Key (key, ascii);
                return;
@@ -4073,8 +4217,8 @@ void MR_Init()
        // the normal quake menu only the first time
        else if(COM_CheckParm("-useqmenu"))
                MR_SetRouting (TRUE);
-       else
-               MR_SetRouting (FALSE);
+       
+       MR_SetRouting (FALSE);
 }