]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/menu.qc
Merge remote-tracking branch 'origin/divVerent/allow-override-item-model'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / menu.qc
index 0894856f1f9e27f0b72334a23940dcd86e88252c..536295fc2f479f66dbdd08641c10a4a49330bac6 100644 (file)
@@ -16,9 +16,17 @@ float menuInitialized;
 float menuNotTheFirstFrame;
 float menuMouseMode;
 
-void SUB_Null() { };
+void SUB_Null() { }
 
-void() m_init =
+void m_sync()
+{
+       updateCompression();
+       updateConwidths();
+
+       loadAllCvars(main);
+}
+
+void m_init()
 {
        cvar_set("_menu_alpha", "0");
        prvm_language = strzone(cvar_string("prvm_language"));
@@ -26,7 +34,7 @@ void() m_init =
        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 +50,10 @@ void() m_init =
                        dprint(s, ": ", getgamedirinfo(i, GETGAMEDIRINFO_DESCRIPTION));
                }
        }
+
+       // needs to be done so early because of the constants they create
+       RegisterWeapons();
+       RegisterGametypes();
 }
 
 float MENU_ASPECT = 1.25; // 1280x1024
@@ -95,7 +107,7 @@ void UpdateConWidthHeight()
        }
 }
 
-void() m_init_delayed =
+void m_init_delayed()
 {
        float fh, glob, n, i;
        string s;
@@ -108,9 +120,6 @@ void() m_init_delayed =
        if(!preMenuInit())
                return;
        menuInitialized = 1;
-       GameCommand_Init();
-
-       RegisterWeapons();
 
        fh = -1;
        if(cvar_string("menu_skin") != "")
@@ -121,7 +130,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 +139,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 +178,13 @@ void() m_init_delayed =
        menuShiftState = 0;
        menuMousePos = '0.5 0.5 0';
 
+       m_sync();
+
        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 +206,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 +244,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;
@@ -242,8 +258,8 @@ void draw_Picture_Aligned(vector algn, float scalemode, string img, float a)
 
        sz = draw_PictureSize(img);
        width_is_larger = (sz_x * draw_scale_y >= sz_y * draw_scale_x);
-       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)); 
+       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));
 
        switch(scalemode)
        {
@@ -269,7 +285,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;
@@ -319,12 +335,15 @@ void(string img, float a, string algn, float force1) drawBackground =
        }
 }
 
+float menu_tooltips;
+float menu_tooltips_old;
 vector menuTooltipAveragedMousePos;
 entity menuTooltipItem;
 vector menuTooltipOrigin;
 vector menuTooltipSize;
 float menuTooltipAlpha;
-float menuTooltipState; // 0: no tooltip, 1: fading in, 2: displaying, 3: fading out
+string menuTooltipText;
+float menuTooltipState; // 0: static, 1: fading in, 2: fading out
 float m_testmousetooltipbox(vector pos)
 {
        if(pos_x >= menuTooltipOrigin_x && pos_x < menuTooltipOrigin_x + menuTooltipSize_x)
@@ -410,6 +429,8 @@ entity m_findtooltipitem(entity root, vector pos)
                        it = it.itemFromPoint(it, pos);
                        if(it.tooltip)
                                best = it;
+                       else if(menu_tooltips == 2 && (it.cvarName || it.onClickCommand))
+                               best = it;
                        it = world;
                }
                else if(it.instanceOfModalController)
@@ -420,11 +441,35 @@ entity m_findtooltipitem(entity root, vector pos)
                        break;
                if(it.tooltip)
                        best = it;
+               else if(menu_tooltips == 2 && (it.cvarName || it.onClickCommand))
+                       best = it;
                pos = globalToBox(pos, it.Container_origin, it.Container_size);
        }
 
        return best;
 }
+string gettooltip()
+{
+       if (menu_tooltips == 2)
+       {
+               string s;
+               if (menuTooltipItem.cvarName)
+               {
+                       if (getCvarsMulti(menuTooltipItem))
+                               s = strcat("[", menuTooltipItem.cvarName, " ", getCvarsMulti(menuTooltipItem), "]");
+                       else
+                               s = strcat("[", menuTooltipItem.cvarName, "]");
+               }
+               else if (menuTooltipItem.onClickCommand)
+                       s = strcat("<", menuTooltipItem.onClickCommand, ">");
+               else
+                       return menuTooltipItem.tooltip;
+               if (menuTooltipItem.tooltip)
+                       return strcat(menuTooltipItem.tooltip, " ", s);
+               return s;
+       }
+       return menuTooltipItem.tooltip;
+}
 void m_tooltip(vector pos)
 {
        float f, i, w;
@@ -432,16 +477,26 @@ void m_tooltip(vector pos)
        vector fontsize, p;
        string s;
 
-       fontsize = '1 0 0' * (SKINFONTSIZE_TOOLTIP / conwidth) + '0 1 0' * (SKINFONTSIZE_TOOLTIP / conheight);
-
-       f = bound(0, frametime * 2, 1);
-       menuTooltipAveragedMousePos = menuTooltipAveragedMousePos * (1 - f) + pos * f;
-       f = vlen(pos - menuTooltipAveragedMousePos);
-
-       if(f < 0.01)
-               it = m_findtooltipitem(main, pos);
-       else    
+       menu_tooltips = cvar("menu_tooltips");
+       if (!menu_tooltips)
+       {
+               // don't return immediately, fade out the active tooltip first
+               if (menuTooltipItem == world)
+                       return;
                it = world;
+               menu_tooltips_old = menu_tooltips;
+       }
+       else
+       {
+               f = bound(0, frametime * 2, 1);
+               menuTooltipAveragedMousePos = menuTooltipAveragedMousePos * (1 - f) + pos * f;
+               f = vlen(pos - menuTooltipAveragedMousePos);
+               if(f < 0.01)
+                       it = m_findtooltipitem(main, pos);
+               else
+                       it = world;
+       }
+       fontsize = '1 0 0' * (SKINFONTSIZE_TOOLTIP / conwidth) + '0 1 0' * (SKINFONTSIZE_TOOLTIP / conheight);
 
        // float menuTooltipState; // 0: static, 1: fading in, 2: fading out
        if(it != menuTooltipItem)
@@ -461,9 +516,14 @@ void m_tooltip(vector pos)
                                        menuTooltipItem = it;
 
                                        menuTooltipOrigin_x = -1; // unallocated
+
+                                       if (menuTooltipText)
+                                               strunzone(menuTooltipText);
+                                       menuTooltipText = strzone(gettooltip());
+
                                        i = 0;
-                                       w =  0;
-                                       getWrappedLine_remaining = it.tooltip;
+                                       w = 0;
+                                       getWrappedLine_remaining = menuTooltipText;
                                        while(getWrappedLine_remaining)
                                        {
                                                s = getWrappedLine(SKINWIDTH_TOOLTIP, fontsize, draw_TextWidth_WithoutColors);
@@ -510,9 +570,24 @@ void m_tooltip(vector pos)
                        break;
        }
 
-       if(menuTooltipItem)
+       if(menuTooltipItem == world)
+       {
+               if (menuTooltipText)
+               {
+                       strunzone(menuTooltipText);
+                       menuTooltipText = string_null;
+               }
+               return;
+       }
+       else
        {
-               if(menuTooltipOrigin_x < 0) // unallocated?
+               if(menu_tooltips != menu_tooltips_old)
+               {
+                       if (menu_tooltips != 0 && menu_tooltips_old != 0)
+                               menuTooltipItem = world; // reload tooltip next frame
+                       menu_tooltips_old = menu_tooltips;
+               }
+               else if(menuTooltipOrigin_x < 0) // unallocated?
                        m_allocatetooltipbox(pos);
 
                if(menuTooltipOrigin_x >= 0)
@@ -525,7 +600,7 @@ void m_tooltip(vector pos)
                        p = menuTooltipOrigin;
                        p_x += SKINMARGIN_TOOLTIP_x / conwidth;
                        p_y += SKINMARGIN_TOOLTIP_y / conheight;
-                       getWrappedLine_remaining = menuTooltipItem.tooltip;
+                       getWrappedLine_remaining = menuTooltipText;
                        while(getWrappedLine_remaining)
                        {
                                s = getWrappedLine(SKINWIDTH_TOOLTIP, fontsize, draw_TextWidth_WithoutColors);
@@ -536,7 +611,7 @@ void m_tooltip(vector pos)
        }
 }
 
-void() m_draw =
+void m_draw()
 {
        float t;
        float realFrametime;
@@ -713,9 +788,9 @@ void() m_draw =
        postMenuDraw();
 
        frametime = 0;
-};
+}
 
-void() m_display =
+void m_display()
 {
        Menu_Active = true;
        setkeydest(KEY_MENU);
@@ -730,9 +805,9 @@ void() m_display =
 
        main.focusEnter(main);
        main.showNotify(main);
-};
+}
 
-void() m_hide =
+void m_hide()
 {
        Menu_Active = false;
        setkeydest(KEY_GAME);
@@ -743,17 +818,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;
 
@@ -764,7 +847,7 @@ void() m_shutdown =
                        if(e.destroy)
                                e.destroy(e);
        }
-};
+}
 
 void m_focus_item_chain(entity outermost, entity innermost)
 {
@@ -820,7 +903,7 @@ void m_setpointerfocus(entity wnd)
        }
 }
 
-void(string itemname) m_goto =
+void m_goto(string itemname)
 {
        entity e;
        if(!menuInitialized)
@@ -837,7 +920,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)
@@ -850,7 +933,7 @@ void(string itemname) m_goto =
        }
 }
 
-void() m_goto_skin_selector =
+void m_goto_skin_selector()
 {
        if(!menuInitialized)
                return;
@@ -858,7 +941,7 @@ void() m_goto_skin_selector =
        m_goto("skinselector");
 }
 
-void() m_goto_language_selector =
+void m_goto_language_selector()
 {
        if(!menuInitialized)
                return;
@@ -866,7 +949,7 @@ void() m_goto_language_selector =
        m_goto("languageselector");
 }
 
-void() m_goto_video_settings =
+void m_goto_video_settings()
 {
        if(!menuInitialized)
                return;