]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/menu.qc
Merge remote-tracking branch 'origin/master' into samual/respawn_improvements
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / menu.qc
index 4ae22cd08d14e9328f6272b08bf0874d9f8a355c..2dc73a8d22675d78d36d789408b907d6b40f2d75 100644 (file)
@@ -16,17 +16,44 @@ float menuInitialized;
 float menuNotTheFirstFrame;
 float menuMouseMode;
 
-void SUB_Null() { };
+void m_sync()
+{
+       updateCompression();
+       updateConwidths();
+
+       loadAllCvars(main);
+}
 
-void() m_init =
+void m_gamestatus()
 {
+       gamestatus = 0;
+       if(isserver())
+               gamestatus = gamestatus | GAME_ISSERVER;
+       if(clientstate() == CS_CONNECTED || isdemo())
+               gamestatus = gamestatus | GAME_CONNECTED;
+       if(cvar("developer"))
+               gamestatus = gamestatus | GAME_DEVELOPER;
+}
+
+void m_init()
+{
+       float restarting = 0;
        cvar_set("_menu_alpha", "0");
-       prvm_language = strzone(cvar_string("prvm_language"));
+       prvm_language = cvar_string("prvm_language");
+       if(prvm_language == "")
+       {
+               prvm_language = "en";
+               cvar_set("prvm_language", prvm_language);
+               localcmd("\nmenu_restart\n");
+               restarting = 1;
+       }
+       prvm_language = strzone(prvm_language);
+       cvar_set("_menu_prvm_language", prvm_language);
 
        check_unacceptable_compiler_bugs();
 
 #ifdef WATERMARK
-       print(sprintf(_("^4MQC Build information: %s\n"), WATERMARK()));
+       print(sprintf(_("^4MQC Build information: ^1%s\n"), WATERMARK));
 #endif
 
        // list all game dirs (TEST)
@@ -42,6 +69,26 @@ void() m_init =
                        dprint(s, ": ", getgamedirinfo(i, GETGAMEDIRINFO_DESCRIPTION));
                }
        }
+
+       // needs to be done so early because of the constants they create
+       CALL_ACCUMULATED_FUNCTION(RegisterWeapons);
+       CALL_ACCUMULATED_FUNCTION(RegisterGametypes);
+
+       float ddsload = cvar("r_texture_dds_load");
+       float texcomp = cvar("gl_texturecompression");
+       updateCompression();
+       if(ddsload != cvar("r_texture_dds_load") || texcomp != cvar("gl_texturecompression"))
+               localcmd("\nr_restart\n");
+       initConwidths();
+
+       if(!restarting)
+       {
+               if(cvar("_menu_initialized")) // always show menu after menu_restart
+                       m_display();
+               else
+                       m_hide();
+               cvar_set("_menu_initialized", "1");
+       }
 }
 
 float MENU_ASPECT = 1.25; // 1280x1024
@@ -95,7 +142,8 @@ void UpdateConWidthHeight()
        }
 }
 
-void() m_init_delayed =
+string m_goto_buffer;
+void m_init_delayed()
 {
        float fh, glob, n, i;
        string s;
@@ -108,9 +156,6 @@ void() m_init_delayed =
        if(!preMenuInit())
                return;
        menuInitialized = 1;
-       GameCommand_Init();
-
-       RegisterWeapons();
 
        fh = -1;
        if(cvar_string("menu_skin") != "")
@@ -121,7 +166,8 @@ void() m_init_delayed =
        if(fh < 0)
        if(cvar_defstring("menu_skin") != "")
        {
-               draw_currentSkin = strcat("gfx/menu/", cvar_defstring("menu_skin"));
+               cvar_set("menu_skin", cvar_defstring("menu_skin"));
+               draw_currentSkin = strcat("gfx/menu/", cvar_string("menu_skin"));
                fh = fopen(language_filename(strcat(draw_currentSkin, "/skinvalues.txt")), FILE_READ);
        }
        if(fh < 0)
@@ -129,6 +175,10 @@ void() m_init_delayed =
                draw_currentSkin = "gfx/menu/default";
                fh = fopen(language_filename(strcat(draw_currentSkin, "/skinvalues.txt")), FILE_READ);
        }
+       if(fh < 0)
+       {
+               error("cannot load any menu skin\n");
+       }
        draw_currentSkin = strzone(draw_currentSkin);
        while((s = fgets(fh)))
        {
@@ -164,11 +214,20 @@ void() m_init_delayed =
        menuShiftState = 0;
        menuMousePos = '0.5 0.5 0';
 
+       m_sync();
+
+       if(m_goto_buffer)
+       {
+               m_goto(m_goto_buffer);
+               strunzone(m_goto_buffer);
+               m_goto_buffer = string_null;
+       }
+
        if(Menu_Active)
                m_display(); // delayed menu display
-};
+}
 
-void(float key, float ascii) m_keyup =
+void m_keyup (float key, float ascii)
 {
        if(!menuInitialized)
                return;
@@ -190,9 +249,9 @@ void(float key, float ascii) m_keyup =
        if(key == K_ALT) menuShiftState -= (menuShiftState & S_ALT);
        if(key == K_CTRL) menuShiftState -= (menuShiftState & S_CTRL);
        if(key == K_SHIFT) menuShiftState -= (menuShiftState & S_SHIFT);
-};
+}
 
-void(float key, float ascii) m_keydown =
+void m_keydown(float key, float ascii)
 {
        if(!menuInitialized)
                return;
@@ -228,7 +287,7 @@ void(float key, float ascii) m_keydown =
        if(key == K_ALT) menuShiftState |= S_ALT;
        if(key == K_CTRL) menuShiftState |= S_CTRL;
        if(key == K_SHIFT) menuShiftState |= S_SHIFT;
-};
+}
 
 float SCALEMODE_CROP = 0;
 float SCALEMODE_LETTERBOX = 1;
@@ -245,6 +304,9 @@ void draw_Picture_Aligned(vector algn, float scalemode, string img, float a)
        isz_w = '1 0 0' + '0 1 0' * ((sz_y / sz_x) * (draw_scale_x / draw_scale_y));
        isz_h = '0 1 0' + '1 0 0' * ((sz_x / sz_y) * (draw_scale_y / draw_scale_x));
 
+#ifdef GMQCC
+       isz = '0 0 0';
+#endif
        switch(scalemode)
        {
                default:
@@ -269,7 +331,7 @@ void draw_Picture_Aligned(vector algn, float scalemode, string img, float a)
        draw_Picture(org, img, isz, '1 1 1', a);
 }
 
-void(string img, float a, string algn, float force1) drawBackground =
+void drawBackground(string img, float a, string algn, float force1)
 {
        if(main.mainNexposee.ModalController_state == 0)
                return;
@@ -283,6 +345,7 @@ void(string img, float a, string algn, float force1) drawBackground =
 
        scalemode = SCALEMODE_CROP;
 
+       l = 0;
        for(i = 0; i < strlen(algn); ++i)
        {
                c = substring(algn, i, 1);
@@ -328,10 +391,10 @@ vector menuTooltipSize;
 float menuTooltipAlpha;
 string menuTooltipText;
 float menuTooltipState; // 0: static, 1: fading in, 2: fading out
-float m_testmousetooltipbox()
+float m_testmousetooltipbox(vector pos)
 {
-       if(menuMousePos_x >= menuTooltipOrigin_x && menuMousePos_x < menuTooltipOrigin_x + menuTooltipSize_x)
-       if(menuMousePos_y >= menuTooltipOrigin_y && menuMousePos_y < menuTooltipOrigin_y + menuTooltipSize_y)
+       if(pos_x >= menuTooltipOrigin_x && pos_x < menuTooltipOrigin_x + menuTooltipSize_x)
+       if(pos_y >= menuTooltipOrigin_y && pos_y < menuTooltipOrigin_y + menuTooltipSize_y)
                return FALSE;
        return TRUE;
 }
@@ -454,7 +517,7 @@ string gettooltip()
        }
        return menuTooltipItem.tooltip;
 }
-void m_tooltip()
+void m_tooltip(vector pos)
 {
        float f, i, w;
        entity it;
@@ -473,10 +536,10 @@ void m_tooltip()
        else
        {
                f = bound(0, frametime * 2, 1);
-               menuTooltipAveragedMousePos = menuTooltipAveragedMousePos * (1 - f) + menuMousePos * f;
-               f = vlen(menuMousePos - menuTooltipAveragedMousePos);
+               menuTooltipAveragedMousePos = menuTooltipAveragedMousePos * (1 - f) + pos * f;
+               f = vlen(pos - menuTooltipAveragedMousePos);
                if(f < 0.01)
-                       it = m_findtooltipitem(main, menuMousePos);
+                       it = m_findtooltipitem(main, pos);
                else
                        it = world;
        }
@@ -501,7 +564,10 @@ void m_tooltip()
 
                                        menuTooltipOrigin_x = -1; // unallocated
 
+                                       if (menuTooltipText)
+                                               strunzone(menuTooltipText);
                                        menuTooltipText = strzone(gettooltip());
+
                                        i = 0;
                                        w = 0;
                                        getWrappedLine_remaining = menuTooltipText;
@@ -531,7 +597,7 @@ void m_tooltip()
                menuTooltipState = 1;
 
        if(menuTooltipItem)
-               if(!m_testmousetooltipbox())
+               if(!m_testmousetooltipbox(pos))
                        menuTooltipState = 2; // fade out if mouse touches it
 
        switch(menuTooltipState)
@@ -551,7 +617,16 @@ void m_tooltip()
                        break;
        }
 
-       if(menuTooltipItem)
+       if(menuTooltipItem == world)
+       {
+               if (menuTooltipText)
+               {
+                       strunzone(menuTooltipText);
+                       menuTooltipText = string_null;
+               }
+               return;
+       }
+       else
        {
                if(menu_tooltips != menu_tooltips_old)
                {
@@ -560,7 +635,7 @@ void m_tooltip()
                        menu_tooltips_old = menu_tooltips;
                }
                else if(menuTooltipOrigin_x < 0) // unallocated?
-                       m_allocatetooltipbox(menuMousePos);
+                       m_allocatetooltipbox(pos);
 
                if(menuTooltipOrigin_x >= 0)
                {
@@ -583,11 +658,15 @@ void m_tooltip()
        }
 }
 
-void() m_draw =
+void m_draw()
 {
        float t;
        float realFrametime;
 
+       m_gamestatus();
+
+       execute_next_frame();
+
        menuMouseMode = cvar("menu_mouse_absolute");
 
        if (anim)
@@ -608,7 +687,7 @@ void() m_draw =
                if(Menu_Active)
                if(!cvar("menu_video_played"))
                {
-                       localcmd("cd loop $menu_cdtrack; play sound/announcer/default/welcome.ogg\n");
+                       localcmd("cd loop $menu_cdtrack; play sound/announcer/default/welcome.wav\n");
                        menuLogoAlpha = -0.8; // no idea why, but when I start this at zero, it jumps instead of fading FIXME
                }
                // ALWAYS set this cvar; if we start but menu is not active, this means we want no background music!
@@ -640,14 +719,6 @@ void() m_draw =
        if(cvar("cl_capturevideo"))
                frametime = t / cvar("cl_capturevideo_fps"); // make capturevideo work smoothly
 
-       gamestatus = 0;
-       if(isserver())
-               gamestatus = gamestatus | GAME_ISSERVER;
-       if(clientstate() == CS_CONNECTED)
-               gamestatus = gamestatus | GAME_CONNECTED;
-       if(cvar("developer"))
-               gamestatus = gamestatus | GAME_DEVELOPER;
-
        prevMenuAlpha = menuAlpha;
        if(Menu_Active)
        {
@@ -750,7 +821,7 @@ void() m_draw =
        }
        main.draw(main);
 
-       m_tooltip();
+       m_tooltip(menuMousePos);
 
        draw_alpha = max(draw_alpha, SKINALPHA_CURSOR_INTRO * bound(0, menuLogoAlpha, 1));
 
@@ -760,9 +831,9 @@ void() m_draw =
        postMenuDraw();
 
        frametime = 0;
-};
+}
 
-void() m_display =
+void m_display()
 {
        Menu_Active = true;
        setkeydest(KEY_MENU);
@@ -777,9 +848,9 @@ void() m_display =
 
        main.focusEnter(main);
        main.showNotify(main);
-};
+}
 
-void() m_hide =
+void m_hide()
 {
        Menu_Active = false;
        setkeydest(KEY_GAME);
@@ -790,17 +861,25 @@ void() m_hide =
 
        main.focusLeave(main);
        main.hideNotify(main);
-};
+}
 
-void() m_toggle =
+void m_toggle(float mode)
 {
        if(Menu_Active)
+       {
+               if (mode == 1)
+                       return;
                m_hide();
+       }
        else
+       {
+               if (mode == 0)
+                       return;
                m_display();
-};
+       }
+}
 
-void() m_shutdown =
+void Shutdown()
 {
        entity e;
 
@@ -811,7 +890,7 @@ void() m_shutdown =
                        if(e.destroy)
                                e.destroy(e);
        }
-};
+}
 
 void m_focus_item_chain(entity outermost, entity innermost)
 {
@@ -867,15 +946,22 @@ void m_setpointerfocus(entity wnd)
        }
 }
 
-void(string itemname) m_goto =
+void m_goto(string itemname)
 {
        entity e;
        if(!menuInitialized)
+       {
+               if(m_goto_buffer)
+                       strunzone(m_goto_buffer);
+               m_goto_buffer = strzone(itemname);
                return;
+       }
        if(itemname == "") // this can be called by GameCommand
        {
                if(gamestatus & (GAME_ISSERVER | GAME_CONNECTED))
+               {
                        m_hide();
+               }
                else
                {
                        m_activate_window(main.mainNexposee);
@@ -884,7 +970,7 @@ void(string itemname) m_goto =
        }
        else
        {
-               for(e = NULL; (e = findstring(e, name, itemname)); )
+               for(e = NULL; (e = find(e, name, itemname)); )
                        if(e.classname != "vtbl")
                                break;
                if(e)
@@ -896,27 +982,3 @@ void(string itemname) m_goto =
                }
        }
 }
-
-void() m_goto_skin_selector =
-{
-       if(!menuInitialized)
-               return;
-       // TODO add code to switch back to the skin selector (no idea how to do it now)
-       m_goto("skinselector");
-}
-
-void() m_goto_language_selector =
-{
-       if(!menuInitialized)
-               return;
-       // TODO add code to switch back to the language selector (no idea how to do it now)
-       m_goto("languageselector");
-}
-
-void() m_goto_video_settings =
-{
-       if(!menuInitialized)
-               return;
-       // TODO add code to switch back to the video settings (no idea how to do it now)
-       m_goto("videosettings");
-}