#include "menu.qh"
-#include "classes.qc"
+
+#include "item.qh"
+
+#include "anim/animhost.qh"
+
+#include "item/dialog.qh"
+#include "item/listbox.qh"
+#include "item/nexposee.qh"
+
+#include "xonotic/commandbutton.qh"
+#include "xonotic/mainwindow.qh"
+#include "xonotic/serverlist.qh"
+#include "xonotic/slider_resolution.qh"
+
+.string controlledCvar;
+
#include "xonotic/util.qh"
-#include "../common/items/all.qh"
-#include "../common/weapons/all.qh"
-#include "../common/mapinfo.qh"
-#include "../common/mutators/base.qh"
+#include <common/items/_mod.qh>
+#include <common/weapons/_all.qh>
+#include <common/mapinfo.qh>
+#include <common/mutators/base.qh>
int mouseButtonsPressed;
vector menuMousePos;
gamestatus = 0;
if (isserver()) gamestatus |= GAME_ISSERVER;
if (clientstate() == CS_CONNECTED || isdemo()) gamestatus |= GAME_CONNECTED;
- if (cvar("developer")) gamestatus |= GAME_DEVELOPER;
+ if (cvar("developer") > 0) gamestatus |= GAME_DEVELOPER;
}
void m_init()
cvar_set("_menu_prvm_language", prvm_language);
#ifdef WATERMARK
- LOG_INFOF("^4MQC Build information: ^1%s\n", WATERMARK);
+ LOG_TRACEF("^4MQC Build information: ^1%s", WATERMARK);
#endif
// list all game dirs (TEST)
- if (cvar("developer"))
+ if (cvar("developer") > 0)
{
for (int i = 0; ; ++i)
{
if (m_goto_buffer)
{
m_goto(m_goto_buffer);
- strunzone(m_goto_buffer);
- m_goto_buffer = string_null;
+ strfree(m_goto_buffer);
}
if (Menu_Active) m_display(); // delayed menu display
+
+ cvar_set("_menu_initialized", "2");
}
void m_keyup(float key, float ascii)
if (mouseButtonsPressed < 0)
{
mouseButtonsPressed = 0;
- LOG_TRACE("Warning: released an already released button\n");
+ LOG_TRACE("Warning: released an already released button");
}
}
if (key == K_ALT) menuShiftState &= ~S_ALT;
else
{
draw_reset_cropped();
- if (!mouseButtonsPressed && key >= K_MOUSE1 && key <= K_MOUSE3) main.mousePress(main, menuMousePos);
+ if (!mouseButtonsPressed && key >= K_MOUSE1 && key <= K_MOUSE3)
+ main.mousePress(main, menuMousePos);
if (!main.keyDown(main, key, ascii, menuShiftState))
{
// disable menu on unhandled ESC
if (mouseButtonsPressed > 10)
{
mouseButtonsPressed = 10;
- LOG_TRACE("Warning: pressed an already pressed button\n");
+ LOG_TRACE("Warning: pressed an already pressed button");
}
}
if (key == K_ALT) menuShiftState |= S_ALT;
if (main.mainNexposee.ModalController_state == 0) return;
vector v = '0 0 0';
int scalemode = SCALEMODE_CROP;
- for (int i = 0, l = 0; i < strlen(algn); ++i)
+ int len = strlen(algn);
+ for (int i = 0, l = 0; i < len; ++i)
{
string c = substring(algn, i, 1);
switch (c)
draw_Picture_Aligned(v, scalemode, strcat(img, "_l", ftos(l + 1)), a);
}
++l;
- : nopic
+LABEL(nopic)
}
}
{
it = it.itemFromPoint(it, pos);
if (it.tooltip) best = it;
- else if (menu_tooltips == 2 && (it.cvarName || it.onClickCommand)) best = it;
+ else if (menu_tooltips == 2 && (it.controlledCvar || it.onClickCommand)) best = it;
it = NULL;
}
else if (it.instanceOfModalController)
}
if (!it) break;
if (it.tooltip) best = it;
- else if (menu_tooltips == 2 && (it.cvarName || it.onClickCommand)) best = it;
+ else if (menu_tooltips == 2 && (it.controlledCvar || it.onClickCommand)) best = it;
pos = globalToBox(pos, it.Container_origin, it.Container_size);
}
if (menu_tooltips == 2)
{
string s;
- if (menuTooltipItem.cvarName)
+ if (menuTooltipItem.controlledCvar)
{
- if (getCvarsMulti(menuTooltipItem)) s =
- strcat("[", menuTooltipItem.cvarName, " ", getCvarsMulti(menuTooltipItem), "]");
- else s = strcat("[", menuTooltipItem.cvarName, "]");
+ string cvar_list = getCvarsMulti(menuTooltipItem);
+ if (cvar_list)
+ cvar_list = strcat(menuTooltipItem.controlledCvar, " ", cvar_list);
+ else
+ cvar_list = menuTooltipItem.controlledCvar;
+ s = strcat("[", cvar_list, " \"", cvar_string(menuTooltipItem.controlledCvar), "\"]");
}
else if (menuTooltipItem.onClickCommand)
{
{
float f = bound(0, frametime * 2, 1);
menuTooltipAveragedMousePos = menuTooltipAveragedMousePos * (1 - f) + pos * f;
- f = vlen(pos - menuTooltipAveragedMousePos);
- if (f < 0.01)
+ if (vdist(pos - menuTooltipAveragedMousePos, <, 0.01))
{
it = m_findtooltipitem(main, pos);
- if (it.instanceOfListBox && it.isScrolling(it)) it = world;
+ if (it.instanceOfListBox && it.isScrolling(it)) it = NULL;
if (it && prev_tooltip != it.tooltip)
{
// fade out if tooltip of a certain item has changed
menuTooltipState = 3;
- if (prev_tooltip) strunzone(prev_tooltip);
- prev_tooltip = strzone(it.tooltip);
+ strcpy(prev_tooltip, it.tooltip);
}
else if (menuTooltipItem && !m_testmousetooltipbox(pos))
{
menuTooltipOrigin.x = -1; // unallocated
- if (menuTooltipText) strunzone(menuTooltipText);
- menuTooltipText = strzone(gettooltip());
+ strcpy(menuTooltipText, gettooltip());
int i = 0;
float w = 0;
- for (getWrappedLine_remaining = menuTooltipText; getWrappedLine_remaining; ++i)
+ for (getWrappedLine_remaining = menuTooltipText; getWrappedLine_remaining && i <= 16; ++i)
{
string s = getWrappedLine(SKINWIDTH_TOOLTIP, fontsize, draw_TextWidth_WithoutColors);
+ if (i == 16)
+ s = "...";
float f = draw_TextWidth(s, false, fontsize);
if (f > w) w = f;
}
if (menuTooltipItem == NULL)
{
- if (menuTooltipText)
- {
- strunzone(menuTooltipText);
- menuTooltipText = string_null;
- }
+ strfree(menuTooltipText);
return;
}
else
p = menuTooltipOrigin;
p.x += SKINMARGIN_TOOLTIP_x / conwidth;
p.y += SKINMARGIN_TOOLTIP_y / conheight;
- for (getWrappedLine_remaining = menuTooltipText; getWrappedLine_remaining; p.y += fontsize.y)
+ int i = 0;
+ for (getWrappedLine_remaining = menuTooltipText; getWrappedLine_remaining && i <= 16; ++i, p.y += fontsize.y)
{
string s = getWrappedLine(SKINWIDTH_TOOLTIP, fontsize, draw_TextWidth_WithoutColors);
+ if (i == 16)
+ s = "...";
draw_Text(p, s, fontsize, SKINCOLOR_TOOLTIP, SKINALPHA_TOOLTIP * menuTooltipAlpha, false);
}
}
}
}
+const int MIN_DISCONNECTION_TIME = 1;
+float autocvar_menu_force_on_disconnection;
+bool autocvar_g_campaign;
void m_draw(float width, float height)
{
+ static float connected_time;
+ if (clientstate() == CS_DISCONNECTED)
+ {
+ if (connected_time && time - connected_time > MIN_DISCONNECTION_TIME)
+ {
+ if (autocvar_g_campaign)
+ {
+ // in the case player uses the disconnect command (in the console or with a key)
+ // reset g_campaign and update menu items to reflect cvar values that may have been restored after quiting the campaign
+ // see also LEAVEMATCH_CMD
+ cvar_set("g_campaign", "0");
+ m_sync();
+ }
+ if (autocvar_menu_force_on_disconnection > 0)
+ m_toggle(true);
+ localcmd("\nmenu_cmd directmenu Welcome RESET\n");
+ connected_time = 0;
+ }
+ }
+ else
+ connected_time = time;
+
m_gamestatus();
execute_next_frame();
menuNotTheFirstFrame = true;
if (Menu_Active && !cvar("menu_video_played"))
{
- localcmd("cd loop $menu_cdtrack; play sound/announcer/default/welcome.wav\n");
+ localcmd("cd loop $menu_cdtrack\n");
+ // TODO: use this when we have a welcome sound
+ //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!
draw_alpha *= menuAlpha;
- if (!Menu_Active)
+ if (menuMouseMode)
{
- // do not update mouse position
- // it prevents mouse jumping to '0 0 0' when menu is fading out
- }
- else if (menuMouseMode)
- {
- vector newMouse = globalToBox(getmousepos(), draw_shift, draw_scale);
- if (newMouse != '0 0 0' && newMouse != menuMousePos)
+ vector rawMousePos = getmousepos();
+ vector newMouse = globalToBox(rawMousePos, draw_shift, draw_scale);
+ if (rawMousePos != '0 0 0' && newMouse != menuMousePos)
{
menuMousePos = newMouse;
if (mouseButtonsPressed) main.mouseDrag(main, menuMousePos);
postMenuDraw();
frametime = 0;
+ IL_ENDFRAME();
}
void m_display()
void Shutdown()
{
m_hide();
- FOREACH_ENTITY_ORDERED(it.destroy, LAMBDA(
+ FOREACH_ENTITY_ORDERED(it.destroy, {
if (it.classname == "vtbl") continue;
it.destroy(it);
- ));
+ });
}
void m_focus_item_chain(entity outermost, entity innermost)
{
if (!menuInitialized)
{
- if (m_goto_buffer) strunzone(m_goto_buffer);
- m_goto_buffer = strzone(itemname);
+ strcpy(m_goto_buffer, itemname);
return;
}
if (itemname == "") // this can be called by GameCommand
if (gamestatus & (GAME_ISSERVER | GAME_CONNECTED))
{
m_hide();
+ return;
}
- else
- {
- m_activate_window(main.mainNexposee);
- m_display();
- }
+ itemname = "nexposee";
+ }
+
+ if (itemname == "nexposee")
+ {
+ // unlike 'togglemenu 1', this closes modal and root dialogs if opened
+ m_activate_window(main.mainNexposee);
+ m_display();
}
else
{
if ((e) && (!e.requiresConnection || (gamestatus & (GAME_ISSERVER | GAME_CONNECTED))))
{
+ if(!Menu_Active)
+ e.hideMenuOnClose = true;
m_hide();
m_activate_window(e);
m_setpointerfocus(e);