X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fmenu%2Fmenu.qc;h=640581b9a49f348fb5594efb74a032a7477b3b42;hp=71cc021b5ae9cb239afec9395a46e3e2c3f43922;hb=6a7f5e625437e71149484bc81eb7eddef69f176e;hpb=8b5335b125ddeb8a0c023ff5cf7f5f28f034f4e3 diff --git a/qcsrc/menu/menu.qc b/qcsrc/menu/menu.qc index 71cc021b5a..640581b9a4 100644 --- a/qcsrc/menu/menu.qc +++ b/qcsrc/menu/menu.qc @@ -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) @@ -95,7 +103,7 @@ void UpdateConWidthHeight() } } -void() m_init_delayed = +void m_init_delayed() { float fh, glob, n, i; string s; @@ -121,7 +129,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 +138,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 +177,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 +205,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 +243,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 +257,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 +284,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 +334,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) @@ -350,12 +368,12 @@ float m_allocatetooltipbox(vector pos) vector avoidplus, avoidminus; vector v; - avoidplus_x = (SKINAVOID_TOOLTIP_x + SKINSIZE_CURSOR_x - SKINOFFSET_CURSOR_x) / conwidth; - avoidplus_y = (SKINAVOID_TOOLTIP_y + SKINSIZE_CURSOR_y - SKINOFFSET_CURSOR_y) / conheight; + avoidplus_x = (SKINAVOID_TOOLTIP_x + SKINSIZE_CURSOR_x - SKINOFFSET_CURSOR_x * SKINSIZE_CURSOR_x) / conwidth; + avoidplus_y = (SKINAVOID_TOOLTIP_y + SKINSIZE_CURSOR_y - SKINOFFSET_CURSOR_y * SKINSIZE_CURSOR_y) / conheight; avoidplus_z = 0; - avoidminus_x = (SKINAVOID_TOOLTIP_x + SKINOFFSET_CURSOR_x) / conwidth + menuTooltipSize_x; - avoidminus_y = (SKINAVOID_TOOLTIP_y + SKINOFFSET_CURSOR_y) / conheight + menuTooltipSize_y; + avoidminus_x = (SKINAVOID_TOOLTIP_x + SKINOFFSET_CURSOR_x * SKINSIZE_CURSOR_x) / conwidth + menuTooltipSize_x; + avoidminus_y = (SKINAVOID_TOOLTIP_y + SKINOFFSET_CURSOR_y * SKINSIZE_CURSOR_y) / conheight + menuTooltipSize_y; avoidminus_z = 0; // bottom right @@ -410,6 +428,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 +440,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 +476,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 +515,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 +569,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 +599,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 +610,7 @@ void m_tooltip(vector pos) } } -void() m_draw = +void m_draw() { float t; float realFrametime; @@ -561,9 +635,11 @@ void() m_draw = if(Menu_Active) if(!cvar("menu_video_played")) { - localcmd("set menu_video_played 1; cd loop $menu_cdtrack; play sound/announcer/default/welcome.ogg\n"); + localcmd("cd loop $menu_cdtrack; play sound/announcer/default/welcome.ogg\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! + localcmd("set menu_video_played 1\n"); } t = gettime(); @@ -711,9 +787,9 @@ void() m_draw = postMenuDraw(); frametime = 0; -}; +} -void() m_display = +void m_display() { Menu_Active = true; setkeydest(KEY_MENU); @@ -728,9 +804,9 @@ void() m_display = main.focusEnter(main); main.showNotify(main); -}; +} -void() m_hide = +void m_hide() { Menu_Active = false; setkeydest(KEY_GAME); @@ -741,17 +817,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; @@ -762,7 +846,7 @@ void() m_shutdown = if(e.destroy) e.destroy(e); } -}; +} void m_focus_item_chain(entity outermost, entity innermost) { @@ -818,7 +902,7 @@ void m_setpointerfocus(entity wnd) } } -void(string itemname) m_goto = +void m_goto(string itemname) { entity e; if(!menuInitialized) @@ -835,7 +919,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) @@ -848,7 +932,7 @@ void(string itemname) m_goto = } } -void() m_goto_skin_selector = +void m_goto_skin_selector() { if(!menuInitialized) return; @@ -856,7 +940,7 @@ void() m_goto_skin_selector = m_goto("skinselector"); } -void() m_goto_language_selector = +void m_goto_language_selector() { if(!menuInitialized) return; @@ -864,7 +948,7 @@ void() m_goto_language_selector = m_goto("languageselector"); } -void() m_goto_video_settings = +void m_goto_video_settings() { if(!menuInitialized) return;