X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud.qc;h=a8d82dd76a9d0e6b23d85a0e171268bd65c298d8;hb=2f2147a6c665f04d1b6e860dce8a8a093e7d2b9e;hp=01dc0166305f20a7b30ef955958444d1ab71b196;hpb=026b1e9f8a6d485705aaf949b7e16c08f50ba28f;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index 01dc01663..a8d82dd76 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -14,7 +14,12 @@ Misc HUD functions // 1/4 height: bottom part void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha, vector theBorderSize) { - if (theBorderSize_x <= 0 && theBorderSize_y <= 0) // no border + if (theBorderSize_x < 0 && theBorderSize_y < 0) // draw whole image as it is + { + drawpic(theOrigin, pic, theSize, theColor, theAlpha, 0); + return; + } + if (theBorderSize_x == 0 && theBorderSize_y == 0) // no border { // draw only the central part drawsubpic(theOrigin, theSize, pic, '0.25 0.25 0', '0.5 0.5 0', theColor, theAlpha, 0); @@ -146,7 +151,7 @@ void centerprint(string strMessage) centerprint_expire = min(centerprint_expire, time); // if any of the returns happens, this message will fade out - if(cvar("scr_centertime") <= 0) + if(autocvar_scr_centertime <= 0) return; if(strMessage == "") @@ -205,8 +210,8 @@ void centerprint(string strMessage) h = centerprint_fontsize_y*hcount; havail = vid_conheight; - if(cvar("con_chatpos") < 0) - havail -= (-cvar("con_chatpos") + cvar("con_chat")) * cvar("con_chatsize"); // avoid overlapping chat + if(autocvar_con_chatpos < 0) + havail -= (-autocvar_con_chatpos + autocvar_con_chat) * autocvar_con_chatsize; // avoid overlapping chat if(havail > vid_conheight - 70) havail = vid_conheight - 70; // avoid overlapping HUD @@ -264,7 +269,7 @@ void centerprint(string strMessage) centerprint_num = i; - centerprint_expire = time + cvar("scr_centertime"); + centerprint_expire = time + autocvar_scr_centertime; } void HUD_DrawCenterPrint (void) @@ -284,7 +289,7 @@ void HUD_DrawCenterPrint (void) sz = 0.8 + (a / 5); - if(centerprint_num * cvar("scr_centersize") > 24 && scoreboard_active) // 24 = height of Scoreboard text + if(centerprint_num * autocvar_scr_centersize > 24 && scoreboard_active) // 24 = height of Scoreboard text centerprint_start_y = scoreboard_bottom + centerprint_fontsize_y; pos = centerprint_start; @@ -422,7 +427,7 @@ HUD panels void HUD_Panel_ExportCfg(string cfgname) { float fh; - string filename = strcat("hud_", cvar_string("hud_skin"), "_", cfgname, ".cfg"); + string filename = strcat("hud_", autocvar_hud_skin, "_", cfgname, ".cfg"); fh = fopen(filename, FILE_WRITE); if(fh >= 0) { @@ -487,22 +492,33 @@ void HUD_Panel_ExportCfg(string cfgname) HUD_Write_PanelCvar_q("_ammo_color"); HUD_Write_PanelCvar_q("_ammo_alpha"); HUD_Write_PanelCvar_q("_aspect"); + HUD_Write_PanelCvar_q("_timeout"); + HUD_Write_PanelCvar_q("_timeout_effect"); break; case HUD_PANEL_AMMO: HUD_Write_PanelCvar_q("_onlycurrent"); HUD_Write_PanelCvar_q("_iconalign"); + HUD_Write_PanelCvar_q("_progressbar"); + HUD_Write_PanelCvar_q("_progressbar_name"); + HUD_Write_PanelCvar_q("_progressbar_xoffset"); + HUD_Write_PanelCvar_q("_text"); break; case HUD_PANEL_POWERUPS: HUD_Write_PanelCvar_q("_flip"); HUD_Write_PanelCvar_q("_iconalign"); HUD_Write_PanelCvar_q("_baralign"); HUD_Write_PanelCvar_q("_progressbar"); + HUD_Write_PanelCvar_q("_progressbar_strength"); + HUD_Write_PanelCvar_q("_progressbar_shield"); break; case HUD_PANEL_HEALTHARMOR: HUD_Write_PanelCvar_q("_flip"); HUD_Write_PanelCvar_q("_iconalign"); HUD_Write_PanelCvar_q("_baralign"); HUD_Write_PanelCvar_q("_progressbar"); + HUD_Write_PanelCvar_q("_progressbar_health"); + HUD_Write_PanelCvar_q("_progressbar_armor"); + HUD_Write_PanelCvar_q("_text"); break; case HUD_PANEL_NOTIFY: HUD_Write_PanelCvar_q("_flip"); @@ -520,6 +536,11 @@ void HUD_Panel_ExportCfg(string cfgname) case HUD_PANEL_INFOMESSAGES: HUD_Write_PanelCvar_q("_flip"); break; + case HUD_PANEL_PHYSICS: + HUD_Write_PanelCvar_q("_flip"); + HUD_Write_PanelCvar_q("_baralign"); + HUD_Write_PanelCvar_q("_progressbar"); + break; } HUD_Write("\n"); } @@ -548,35 +569,79 @@ void HUD_Panel_HlBorder(float myBorder, vector color, float alpha) #define HUD_Panel_DrawBg(alpha)\ if(panel_bg != "0")\ draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, panel_bg, panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha * alpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER));\ -if(highlightedPanel_prev == active_panel && autocvar__hud_configure)\ +if(highlightedPanel_prev == hud_configure_active_panel && autocvar__hud_configure)\ {\ HUD_Panel_HlBorder(panel_bg_border + 1.5 * hlBorderSize, '0 0.5 1', 0.25 * (1 - autocvar__menu_alpha) * alpha);\ } ENDS_WITH_CURLY_BRACE -void HUD_Panel_DrawProgressBar(vector pos, float vertical, vector mySize, vector color, float alpha, float drawflag) +//basically the same code of draw_ButtonPicture and draw_VertButtonPicture for the menu +void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, float lenght_ratio, float vertical, float right_align, vector theColor, float theAlpha, float drawflag) { - if(!alpha) + if(lenght_ratio <= 0 || !theAlpha) return; + if(lenght_ratio > 1) + lenght_ratio = 1; - string pic; + vector square; + vector width, height; if(vertical) { - pic = strcat(hud_skin_path, "/statusbar_vertical"); + pic = strcat(hud_skin_path, "/", pic, "_vertical"); if(precache_pic(pic) == "") { pic = "gfx/hud/default/statusbar_vertical"; } - drawsubpic(pos, eY * min(mySize_y * 0.5, mySize_x) + eX * mySize_x, pic, '0 0 0', '1 0.25 0', color, alpha, drawflag); - if(mySize_y/mySize_x > 2) - drawsubpic(pos + eY * mySize_x, eY * (mySize_y - 2 * mySize_x) + eX * mySize_x, pic, '0 0.25 0', '1 0.5 0', color, alpha, drawflag); - drawsubpic(pos + eY * mySize_y - eY * min(mySize_y * 0.5, mySize_x), eY * min(mySize_y * 0.5, mySize_x) + eX * mySize_x, pic, '0 0.75 0', '1 0.25 0', color, alpha, drawflag); + + if (right_align) + theOrigin_y += (1 - lenght_ratio) * theSize_y; + theSize_y *= lenght_ratio; + + vector bH; + width = eX * theSize_x; + height = eY * theSize_y; + if(theSize_y <= theSize_x * 2) + { + // button not high enough + // draw just upper and lower part then + square = eY * theSize_y * 0.5; + bH = eY * (0.25 * theSize_y / (theSize_x * 2)); + drawsubpic(theOrigin, square + width, pic, '0 0 0', eX + bH, theColor, theAlpha, drawflag); + drawsubpic(theOrigin + square, square + width, pic, eY - bH, eX + bH, theColor, theAlpha, drawflag); + } + else + { + square = eY * theSize_x; + drawsubpic(theOrigin, width + square, pic, '0 0 0', '1 0.25 0', theColor, theAlpha, drawflag); + drawsubpic(theOrigin + square, theSize - 2 * square, pic, '0 0.25 0', '1 0.5 0', theColor, theAlpha, drawflag); + drawsubpic(theOrigin + height - square, width + square, pic, '0 0.75 0', '1 0.25 0', theColor, theAlpha, drawflag); + } } else { - pic = strcat(hud_skin_path, "/statusbar"); + pic = strcat(hud_skin_path, "/", pic); if(precache_pic(pic) == "") { pic = "gfx/hud/default/statusbar"; } - drawsubpic(pos, eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0 0 0', '0.25 1 0', color, alpha, drawflag); - if(mySize_x/mySize_y > 2) - drawsubpic(pos + eX * mySize_y, eX * (mySize_x - 2 * mySize_y) + eY * mySize_y, pic, '0.25 0 0', '0.5 1 0', color, alpha, drawflag); - drawsubpic(pos + eX * mySize_x - eX * min(mySize_x * 0.5, mySize_y), eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0.75 0 0', '0.25 1 0', color, alpha, drawflag); + + if (right_align) + theOrigin_x += (1 - lenght_ratio) * theSize_x; + theSize_x *= lenght_ratio; + + vector bW; + width = eX * theSize_x; + height = eY * theSize_y; + if(theSize_x <= theSize_y * 2) + { + // button not wide enough + // draw just left and right part then + square = eX * theSize_x * 0.5; + bW = eX * (0.25 * theSize_x / (theSize_y * 2)); + drawsubpic(theOrigin, square + height, pic, '0 0 0', eY + bW, theColor, theAlpha, drawflag); + drawsubpic(theOrigin + square, square + height, pic, eX - bW, eY + bW, theColor, theAlpha, drawflag); + } + else + { + square = eX * theSize_y; + drawsubpic(theOrigin, height + square, pic, '0 0 0', '0.25 1 0', theColor, theAlpha, drawflag); + drawsubpic(theOrigin + square, theSize - 2 * square, pic, '0.25 0 0', '0.5 1 0', theColor, theAlpha, drawflag); + drawsubpic(theOrigin + width - square, height + square, pic, '0.75 0 0', '0.25 1 0', theColor, theAlpha, drawflag); + } } } @@ -601,15 +666,10 @@ void HUD_Panel_DrawHighlight(vector pos, vector mySize, vector color, float alph vector HUD_Panel_CheckMove(vector myPos, vector mySize) { float i; - + float myCenter_x, myCenter_y, targCenter_x, targCenter_y; vector myTarget; myTarget = myPos; - vector myCenter; - vector targCenter; - myCenter = '0 0 0'; // shut up fteqcc, there IS a reference - targCenter = '0 0 0'; // shut up fteqcc, there IS a reference - for (i = 0; i < HUD_PANEL_NUM; ++i) { if(i == highlightedPanel || !panel_enabled) continue; @@ -683,8 +743,8 @@ void HUD_Panel_SetPos(vector pos) if(autocvar_hud_configure_grid) { - pos_x = floor((pos_x/vid_conwidth)/bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) + 0.5) * bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) * vid_conwidth; - pos_y = floor((pos_y/vid_conheight)/bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) + 0.5) * bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) * vid_conheight; + pos_x = floor((pos_x/vid_conwidth)/hud_configure_gridSize_x + 0.5) * hud_configure_realGridSize_x; + pos_y = floor((pos_y/vid_conheight)/hud_configure_gridSize_y + 0.5) * hud_configure_realGridSize_y; } if(hud_configure_checkcollisions) @@ -742,7 +802,7 @@ vector HUD_Panel_CheckResize(vector mySize, vector resizeorigin) { // (which side the resize direction finds for first) and reduce the size up to there // // dist is the distance between resizeorigin and the "analogous" point of the panel - // in this case resizeorigin (bottom-right point) and the bottom-right point of the panel + // in this case between resizeorigin (bottom-right point) and the bottom-right point of the panel dist_x = resizeorigin_x - targEndPos_x; dist_y = resizeorigin_y - targEndPos_y; if (dist_y <= 0 || dist_x / dist_y > ratio) @@ -824,8 +884,8 @@ void HUD_Panel_SetPosSize(vector mySize) if(highlightedPanel == HUD_PANEL_CHAT) // some panels have their own restrictions, like the chat panel (which actually only moves the engine chat print around). Looks bad if it's too small. { - mySize_x = max(17 * cvar("con_chatsize"), mySize_x); - mySize_y = max(2 * cvar("con_chatsize") + 2 * panel_bg_padding, mySize_y); + mySize_x = max(17 * autocvar_con_chatsize, mySize_x); + mySize_y = max(2 * autocvar_con_chatsize + 2 * panel_bg_padding, mySize_y); } // collision testing| @@ -864,8 +924,8 @@ void HUD_Panel_SetPosSize(vector mySize) // before checkresize, otherwise panel can be snapped partially inside another panel or panel aspect ratio can be broken if(autocvar_hud_configure_grid) { - mySize_x = floor((mySize_x/vid_conwidth)/bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) + 0.5) * bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) * vid_conwidth; - mySize_y = floor((mySize_y/vid_conheight)/bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) + 0.5) * bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) * vid_conheight; + mySize_x = floor((mySize_x/vid_conwidth)/hud_configure_gridSize_x + 0.5) * hud_configure_realGridSize_x; + mySize_y = floor((mySize_y/vid_conheight)/hud_configure_gridSize_y + 0.5) * hud_configure_realGridSize_y; } if(hud_configure_checkcollisions) @@ -913,7 +973,7 @@ void HUD_Panel_Arrow_Action(float nPrimary) if (highlightedPanel_prev == -1 || mouseClicked) return; - hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && cvar("hud_configure_checkcollisions")); + hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions); float step; if(autocvar_hud_configure_grid) @@ -921,16 +981,16 @@ void HUD_Panel_Arrow_Action(float nPrimary) if (nPrimary == K_UPARROW || nPrimary == K_DOWNARROW) { if (hudShiftState & S_SHIFT) - step = bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) * vid_conheight; + step = hud_configure_realGridSize_y; else - step = 2 * bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) * vid_conheight; + step = 2 * hud_configure_realGridSize_y; } else { if (hudShiftState & S_SHIFT) - step = bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) * vid_conwidth; + step = hud_configure_realGridSize_x; else - step = 2 * bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) * vid_conwidth; + step = 2 * hud_configure_realGridSize_x; } } else @@ -1018,6 +1078,17 @@ void HUD_Panel_Arrow_Action(float nPrimary) } } +void HUD_Panel_EnableMenu(); +float tab_panels[HUD_PANEL_NUM]; +float tab_panel, tab_backward; +vector tab_panel_pos; +void HUD_Panel_FirstInDrawQ(float id); +void reset_tab_panels() +{ + int i; + for(i = 0; i < HUD_PANEL_NUM; ++i) + tab_panels[i] = -1; +} float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary) { string s; @@ -1049,6 +1120,22 @@ float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary) if(nPrimary == K_SHIFT) hudShiftState -= (hudShiftState & S_SHIFT); } + if(nPrimary == K_CTRL) + { + if (bInputType == 1) //ctrl has been released + { + if (tab_panel != -1) + { + //switch to selected panel + highlightedPanel = tab_panel; + highlightedPanel_prev = tab_panel; + HUD_Panel_FirstInDrawQ(highlightedPanel_prev); + } + tab_panel = -1; + reset_tab_panels(); + } + } + if(nPrimary == K_MOUSE1) { if(bInputType == 0) { // key pressed @@ -1068,74 +1155,157 @@ float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary) menu_enabled_time = time; localcmd("menu_showhudexit\n"); } - else if(hudShiftState & S_CTRL) + else if(nPrimary == K_TAB && hudShiftState & S_CTRL) // select and highlight another panel { - if (mouseClicked) + if (bInputType == 1 || mouseClicked) return true; - if(nPrimary == K_SPACE) // enable/disable highlighted panel or dock - { - if (bInputType == 1) - return true; + //FIXME: if a panel is highlighted, has the same pos_x and lays in the same level + //of other panels then next consecutive ctrl-tab will select the highlighted panel too + //(it should only after every other panel of the hud) + //It's a minor bug anyway, we can live with it + float starting_panel; + float old_tab_panel = tab_panel; + if (tab_panel == -1) //first press of TAB + { if (highlightedPanel_prev != -1) - cvar_set(strcat("hud_panel_", panel_name), ftos(!(panel_enabled))); + HUD_Panel_UpdatePosSizeForId(highlightedPanel_prev) else - cvar_set(strcat("hud_dock"), (autocvar_hud_dock == "") ? "dock" : ""); + panel_pos = '0 0 0'; + starting_panel = highlightedPanel_prev; //can be -1, it means no starting panel + tab_panel_pos = panel_pos; //to compute level } - if(nPrimary == 'c') // copy highlighted panel size + else { - if (bInputType == 1) - return true; - - if (highlightedPanel_prev != -1) + if ( ((!tab_backward) && (hudShiftState & S_SHIFT)) || (tab_backward && !(hudShiftState & S_SHIFT)) ) //tab direction changed? + reset_tab_panels(); + starting_panel = tab_panel; + } + tab_backward = (hudShiftState & S_SHIFT); + + float k, level, start_pos_x; + vector candidate_pos; + const float LEVELS_NUM = 4; + const float level_height = vid_conheight / LEVELS_NUM; +:find_tab_panel + level = floor(tab_panel_pos_y / level_height) * level_height; //starting level + candidate_pos_x = (!tab_backward) ? vid_conwidth : 0; + start_pos_x = tab_panel_pos_x; + tab_panel = -1; + k=0; + while(++k) + { + for(i = 0; i < HUD_PANEL_NUM; ++i) + { + if (i == tab_panels[i] || i == starting_panel) + continue; + HUD_Panel_UpdatePosSizeForId(i) + if (panel_pos_y >= level && (panel_pos_y - level) < level_height) + if ( ( !tab_backward && panel_pos_x >= start_pos_x && (panel_pos_x < candidate_pos_x || (panel_pos_x == candidate_pos_x && panel_pos_y <= candidate_pos_y)) ) + || ( tab_backward && panel_pos_x <= start_pos_x && (panel_pos_x > candidate_pos_x || (panel_pos_x == candidate_pos_x && panel_pos_y >= candidate_pos_y)) ) ) + { + tab_panel = i; + tab_panel_pos = candidate_pos = panel_pos; + } + } + if (tab_panel != -1) + break; + if (k == LEVELS_NUM) //tab_panel not found + { + reset_tab_panels(); + if (old_tab_panel == -2) //this prevents an infinite loop (should not happen normally) + { + tab_panel = -1; + return true; + } + starting_panel = old_tab_panel; + old_tab_panel = -2; + goto find_tab_panel; //u must find tab_panel! + } + if (!tab_backward) + { + level = mod(level + level_height, vid_conheight); + start_pos_x = 0; + candidate_pos_x = vid_conwidth; + } + else { - panel_size_copied = panel_size; - highlightedPanel_copied = highlightedPanel_prev; + level = mod(level - level_height, vid_conheight); + start_pos_x = vid_conwidth; + candidate_pos_x = 0; } } - else if(nPrimary == 'v') // past copied size on the highlighted panel - { - if (bInputType == 1) - return true; - if (highlightedPanel_copied == -1 || highlightedPanel_prev == -1) - return true; + tab_panels[tab_panel] = tab_panel; + } + else if(nPrimary == K_SPACE && hudShiftState & S_CTRL) // enable/disable highlighted panel or dock + { + if (bInputType == 1 || mouseClicked) + return true; + + if (highlightedPanel_prev != -1) + { + HUD_Panel_GetName(highlightedPanel_prev); + cvar_set(strcat("hud_panel_", panel_name), ftos(!(panel_enabled))); + } + else + cvar_set(strcat("hud_dock"), (autocvar_hud_dock == "") ? "dock" : ""); + } + else if(nPrimary == 'c' && hudShiftState & S_CTRL) // copy highlighted panel size + { + if (bInputType == 1 || mouseClicked) + return true; + if (highlightedPanel_prev != -1) + { HUD_Panel_UpdatePosSizeForId(highlightedPanel_prev); + panel_size_copied = panel_size; + highlightedPanel_copied = highlightedPanel_prev; + } + } + else if(nPrimary == 'v' && hudShiftState & S_CTRL) // past copied size on the highlighted panel + { + if (bInputType == 1 || mouseClicked) + return true; - // reduce size if it'd go beyond screen boundaries - vector tmp_size = panel_size_copied; - if (panel_pos_x + panel_size_copied_x > vid_conwidth) - tmp_size_x = vid_conwidth - panel_pos_x; - if (panel_pos_y + panel_size_copied_y > vid_conheight) - tmp_size_y = vid_conheight - panel_pos_y; + if (highlightedPanel_copied == -1 || highlightedPanel_prev == -1) + return true; - if (panel_size == tmp_size) - return true; + HUD_Panel_UpdatePosSizeForId(highlightedPanel_prev); - // backup first! - panel_pos_backup = panel_pos; - panel_size_backup = panel_size; - highlightedPanel_backup = highlightedPanel_prev; + // reduce size if it'd go beyond screen boundaries + vector tmp_size = panel_size_copied; + if (panel_pos_x + panel_size_copied_x > vid_conwidth) + tmp_size_x = vid_conwidth - panel_pos_x; + if (panel_pos_y + panel_size_copied_y > vid_conheight) + tmp_size_y = vid_conheight - panel_pos_y; - s = strcat(ftos(tmp_size_x/vid_conwidth), " ", ftos(tmp_size_y/vid_conheight)); - cvar_set(strcat("hud_panel_", panel_name, "_size"), s); - } - else if(nPrimary == 'z') // undo last action + if (panel_size == tmp_size) + return true; + + // backup first! + panel_pos_backup = panel_pos; + panel_size_backup = panel_size; + highlightedPanel_backup = highlightedPanel_prev; + + s = strcat(ftos(tmp_size_x/vid_conwidth), " ", ftos(tmp_size_y/vid_conheight)); + HUD_Panel_GetName(highlightedPanel_prev); + cvar_set(strcat("hud_panel_", panel_name, "_size"), s); + } + else if(nPrimary == 'z' && hudShiftState & S_CTRL) // undo last action + { + if (bInputType == 1 || mouseClicked) + return true; + //restore previous values + if (highlightedPanel_backup != -1) { - if (bInputType == 1) - return true; - //restore previous values - if (highlightedPanel_backup != -1) - { - HUD_Panel_GetName(highlightedPanel_backup); - s = strcat(ftos(panel_pos_backup_x/vid_conwidth), " ", ftos(panel_pos_backup_y/vid_conheight)); - cvar_set(strcat("hud_panel_", panel_name, "_pos"), s); - s = strcat(ftos(panel_size_backup_x/vid_conwidth), " ", ftos(panel_size_backup_y/vid_conheight)); - cvar_set(strcat("hud_panel_", panel_name, "_size"), s); - highlightedPanel_backup = -1; - } + HUD_Panel_GetName(highlightedPanel_backup); + s = strcat(ftos(panel_pos_backup_x/vid_conwidth), " ", ftos(panel_pos_backup_y/vid_conheight)); + cvar_set(strcat("hud_panel_", panel_name, "_pos"), s); + s = strcat(ftos(panel_size_backup_x/vid_conwidth), " ", ftos(panel_size_backup_y/vid_conheight)); + cvar_set(strcat("hud_panel_", panel_name, "_size"), s); + highlightedPanel_backup = -1; } } else if(nPrimary == K_UPARROW || nPrimary == K_DOWNARROW || nPrimary == K_LEFTARROW || nPrimary == K_RIGHTARROW) @@ -1150,51 +1320,57 @@ float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary) HUD_Panel_Arrow_Action(nPrimary); //move or resize panel } + else if(nPrimary == K_ENTER || nPrimary == K_SPACE || nPrimary == K_KP_ENTER) + { + if (bInputType == 1) + return true; + if (highlightedPanel_prev != -1) + { + highlightedPanel = highlightedPanel_prev; + HUD_Panel_EnableMenu(); + } + } else if(hit_con_bind) return false; - return true; // Suppress ALL other input + return true; } float HUD_Panel_HighlightCheck() { float i, j, border; - vector panelPos; - vector panelSize; - while(j <= HUD_PANEL_NUM) + while(j < HUD_PANEL_NUM) { i = panel_order[j]; j += 1; HUD_Panel_UpdatePosSizeForId(i); - panelPos = panel_pos; - panelSize = panel_size; border = max(8, panel_bg_border); // FORCED border so a small border size doesn't mean you can't resize // move - if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y) + if(mousepos_x >= panel_pos_x && mousepos_y >= panel_pos_y && mousepos_x <= panel_pos_x + panel_size_x && mousepos_y <= panel_pos_y + panel_size_y) { return 1; } // resize from topleft border - else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + 0.5 * panelSize_y) + else if(mousepos_x >= panel_pos_x - border && mousepos_y >= panel_pos_y - border && mousepos_x <= panel_pos_x + 0.5 * panel_size_x && mousepos_y <= panel_pos_y + 0.5 * panel_size_y) { return 2; } // resize from topright border - else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + 0.5 * panelSize_y) + else if(mousepos_x >= panel_pos_x + 0.5 * panel_size_x && mousepos_y >= panel_pos_y - border && mousepos_x <= panel_pos_x + panel_size_x + border && mousepos_y <= panel_pos_y + 0.5 * panel_size_y) { return 3; } // resize from bottomleft border - else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + panelSize_y + border) + else if(mousepos_x >= panel_pos_x - border && mousepos_y >= panel_pos_y + 0.5 * panel_size_y && mousepos_x <= panel_pos_x + 0.5 * panel_size_x && mousepos_y <= panel_pos_y + panel_size_y + border) { return 3; } // resize from bottomright border - else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + panelSize_y + border) + else if(mousepos_x >= panel_pos_x + 0.5 * panel_size_x && mousepos_y >= panel_pos_y + 0.5 * panel_size_y && mousepos_x <= panel_pos_x + panel_size_x + border && mousepos_y <= panel_pos_y + panel_size_y + border) { return 2; } @@ -1243,73 +1419,69 @@ void HUD_Panel_FirstInDrawQ(float id) void HUD_Panel_Highlight() { float i, j, border; - vector panelPos; - vector panelSize; - while(j <= HUD_PANEL_NUM) + while(j < HUD_PANEL_NUM) { i = panel_order[j]; j += 1; HUD_Panel_UpdatePosSizeForId(i); - panelPos = panel_pos; - panelSize = panel_size; border = max(8, panel_bg_border); // FORCED border so a small border size doesn't mean you can't resize // move - if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y) + if(mousepos_x >= panel_pos_x && mousepos_y >= panel_pos_y && mousepos_x <= panel_pos_x + panel_size_x && mousepos_y <= panel_pos_y + panel_size_y) { highlightedPanel = i; HUD_Panel_FirstInDrawQ(i); highlightedAction = 1; - panel_click_distance = mousepos - panelPos; + panel_click_distance = mousepos - panel_pos; return; } // resize from topleft border - else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + 0.5 * panelSize_y) + else if(mousepos_x >= panel_pos_x - border && mousepos_y >= panel_pos_y - border && mousepos_x <= panel_pos_x + 0.5 * panel_size_x && mousepos_y <= panel_pos_y + 0.5 * panel_size_y) { highlightedPanel = i; HUD_Panel_FirstInDrawQ(i); highlightedAction = 2; resizeCorner = 1; - panel_click_distance = mousepos - panelPos; - panel_click_resizeorigin = panelPos + panelSize; + panel_click_distance = mousepos - panel_pos; + panel_click_resizeorigin = panel_pos + panel_size; return; } // resize from topright border - else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + 0.5 * panelSize_y) + else if(mousepos_x >= panel_pos_x + 0.5 * panel_size_x && mousepos_y >= panel_pos_y - border && mousepos_x <= panel_pos_x + panel_size_x + border && mousepos_y <= panel_pos_y + 0.5 * panel_size_y) { highlightedPanel = i; HUD_Panel_FirstInDrawQ(i); highlightedAction = 2; resizeCorner = 2; - panel_click_distance_x = panelSize_x - mousepos_x + panelPos_x; - panel_click_distance_y = mousepos_y - panelPos_y; - panel_click_resizeorigin = panelPos + eY * panelSize_y; + panel_click_distance_x = panel_size_x - mousepos_x + panel_pos_x; + panel_click_distance_y = mousepos_y - panel_pos_y; + panel_click_resizeorigin = panel_pos + eY * panel_size_y; return; } // resize from bottomleft border - else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + panelSize_y + border) + else if(mousepos_x >= panel_pos_x - border && mousepos_y >= panel_pos_y + 0.5 * panel_size_y && mousepos_x <= panel_pos_x + 0.5 * panel_size_x && mousepos_y <= panel_pos_y + panel_size_y + border) { highlightedPanel = i; HUD_Panel_FirstInDrawQ(i); highlightedAction = 2; resizeCorner = 3; - panel_click_distance_x = mousepos_x - panelPos_x; - panel_click_distance_y = panelSize_y - mousepos_y + panelPos_y; - panel_click_resizeorigin = panelPos + eX * panelSize_x; + panel_click_distance_x = mousepos_x - panel_pos_x; + panel_click_distance_y = panel_size_y - mousepos_y + panel_pos_y; + panel_click_resizeorigin = panel_pos + eX * panel_size_x; return; } // resize from bottomright border - else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + panelSize_y + border) + else if(mousepos_x >= panel_pos_x + 0.5 * panel_size_x && mousepos_y >= panel_pos_y + 0.5 * panel_size_y && mousepos_x <= panel_pos_x + panel_size_x + border && mousepos_y <= panel_pos_y + panel_size_y + border) { highlightedPanel = i; HUD_Panel_FirstInDrawQ(i); highlightedAction = 2; resizeCorner = 4; - panel_click_distance = panelSize - mousepos + panelPos; - panel_click_resizeorigin = panelPos; + panel_click_distance = panel_size - mousepos + panel_pos; + panel_click_resizeorigin = panel_pos; return; } else @@ -1319,6 +1491,13 @@ void HUD_Panel_Highlight() } } +void HUD_Panel_EnableMenu() +{ + menu_enabled = 2; + menu_enabled_time = time; + HUD_Panel_GetName(highlightedPanel); + localcmd("menu_showhudoptions ", panel_name, "\n"); +} float highlightcheck; vector prev_pos, prev_size; void HUD_Panel_Mouse() @@ -1330,7 +1509,7 @@ void HUD_Panel_Mouse() /* print("menu_enabled: ", ftos(menu_enabled), "\n"); print("Highlighted: ", ftos(highlightedPanel), "\n"); - print("Menu alpha: ", cvar_string("_menu_alpha"), "\n"); + print("Menu alpha: ", ftos(autocvar__menu_alpha), "\n"); */ // instantly hide the editor cursor if we open the HUDExit dialog @@ -1346,13 +1525,19 @@ void HUD_Panel_Mouse() if(highlightedPanel != -1) highlightedPanel_prev = highlightedPanel; - mousepos = mousepos + getmousepos() * cvar("menu_mouse_speed"); + mousepos = mousepos + getmousepos() * autocvar_menu_mouse_speed; mousepos_x = bound(0, mousepos_x, vid_conwidth); mousepos_y = bound(0, mousepos_y, vid_conheight); if(mouseClicked) { + if (tab_panel != -1) + { + //stop ctrl-tab selection + tab_panel = -1; + reset_tab_panels(); + } if(prevMouseClicked == 0) { HUD_Panel_Highlight(); // sets highlightedPanel, highlightedAction, panel_click_distance, panel_click_resizeorigin @@ -1365,7 +1550,7 @@ void HUD_Panel_Mouse() if (prev_pos != panel_pos || prev_size != panel_size) { - hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && cvar("hud_configure_checkcollisions")); + hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions); // backup! panel_pos_backup = prev_pos; panel_size_backup = prev_size; @@ -1402,10 +1587,7 @@ void HUD_Panel_Mouse() if(time - prevMouseClickedTime < 0.4 && prevMouseClicked == 0 && prevMouseClickedPos == mousepos && highlightedPanel >= 0) { mouseClicked = 0; // to prevent spam, I guess. - menu_enabled = 2; - menu_enabled_time = time; - HUD_Panel_GetName(highlightedPanel); - localcmd("menu_showhudoptions ", panel_name, "\n"); + HUD_Panel_EnableMenu(); return; } if(prevMouseClicked == 0) @@ -1423,13 +1605,13 @@ void HUD_Panel_Mouse() cursorsize = '32 32 0'; if(highlightcheck == 0) - drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); + drawpic(mousepos, strcat("gfx/menu/", autocvar_menu_skin, "/cursor.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); else if(highlightcheck == 1) - drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_move.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); + drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", autocvar_menu_skin, "/cursor_move.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); else if(highlightcheck == 2) - drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); + drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", autocvar_menu_skin, "/cursor_resize.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); else - drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize2.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); + drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", autocvar_menu_skin, "/cursor_resize2.tga"), cursorsize, '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL); prevMouseClicked = mouseClicked; } @@ -1501,12 +1683,17 @@ void HUD_Weapons(void) float f, screen_ar; float center_x, center_y; - if(!autocvar_hud_panel_weapons && !autocvar__hud_configure) - return; + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_weapons) return; + if(spectatee_status == -1) return; + } + else + hud_configure_active_panel = HUD_PANEL_WEAPONS; - float timeout = cvar("hud_panel_weapons_timeout"); + float timeout = autocvar_hud_panel_weapons_timeout; float timeout_effect_length, timein_effect_length; - if (cvar("hud_panel_weapons_timeout_effect") == 0) + if (autocvar_hud_panel_weapons_timeout_effect == 0) { timeout_effect_length = 0; timein_effect_length = 0; @@ -1523,18 +1710,17 @@ void HUD_Weapons(void) return; } - active_panel = HUD_PANEL_WEAPONS; HUD_Panel_UpdateCvars(weapons); if (timeout && time >= weapontime + timeout && !autocvar__hud_configure) { f = (time - (weapontime + timeout)) / timeout_effect_length; - if (cvar("hud_panel_weapons_timeout_effect")) + if (autocvar_hud_panel_weapons_timeout_effect) { panel_bg_alpha *= (1 - f); panel_fg_alpha *= (1 - f); } - if (cvar("hud_panel_weapons_timeout_effect") == 1) + if (autocvar_hud_panel_weapons_timeout_effect == 1) { f *= f; // for a cooler movement center_x = panel_pos_x + panel_size_x/2; @@ -1560,12 +1746,12 @@ void HUD_Weapons(void) else if (timeout && time < weaponprevtime + timein_effect_length && !autocvar__hud_configure) { f = (time - weaponprevtime) / timein_effect_length; - if (cvar("hud_panel_weapons_timeout_effect")) + if (autocvar_hud_panel_weapons_timeout_effect) { panel_bg_alpha *= (f); panel_fg_alpha *= (f); } - if (cvar("hud_panel_weapons_timeout_effect") == 1) + if (autocvar_hud_panel_weapons_timeout_effect == 1) { f *= f; // for a cooler movement f = 1 - f; @@ -1599,14 +1785,14 @@ void HUD_Weapons(void) } // TODO make this configurable - if(weaponorder_bypriority != cvar_string("cl_weaponpriority")) + if(weaponorder_bypriority != autocvar_cl_weaponpriority) { if(weaponorder_bypriority) strunzone(weaponorder_bypriority); if(weaponorder_byimpulse) strunzone(weaponorder_byimpulse); - weaponorder_bypriority = strzone(cvar_string("cl_weaponpriority")); + weaponorder_bypriority = strzone(autocvar_cl_weaponpriority); weaponorder_byimpulse = strzone(W_FixWeaponOrder_BuildImpulseList(W_FixWeaponOrder_ForceComplete(W_NumberWeaponOrder(weaponorder_bypriority)))); weaponorder_cmp_str = strcat(" ", weaponorder_byimpulse, " "); @@ -1632,7 +1818,7 @@ void HUD_Weapons(void) panel_size -= '2 2 0' * panel_bg_padding; } - if(cvar_or("hud_panel_weapons_fade", 1)) + if(autocvar_hud_panel_weapons_fade) { wpnalpha = 3.2 - 2 * (time - weapontime); wpnalpha = bound(0.7, wpnalpha, 1) * panel_fg_alpha; @@ -1643,7 +1829,7 @@ void HUD_Weapons(void) HUD_Weapons_Clear(); float rows, columns; - float aspect = cvar("hud_panel_weapons_aspect"); + float aspect = autocvar_hud_panel_weapons_aspect; rows = panel_size_y/panel_size_x; rows = bound(1, floor((sqrt(4 * aspect * rows * WEP_COUNT + rows * rows) + rows + 0.5) / 2), WEP_COUNT); @@ -1652,29 +1838,22 @@ void HUD_Weapons(void) float a, type, fullammo; float when; - when = cvar("hud_panel_weapons_complainbubble_time"); + when = autocvar_hud_panel_weapons_complainbubble_time; float fadetime; - fadetime = cvar("hud_panel_weapons_complainbubble_fadetime"); + fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime; vector color; vector wpnpos; vector wpnsize; - float fullammo_shells, fullammo_nails, fullammo_rockets, fullammo_cells, fullammo_fuel; vector ammo_color; float ammo_alpha; wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows); float barsize_x, barsize_y, baroffset_x, baroffset_y; - float show_ammo = cvar("hud_panel_weapons_ammo"); - if (show_ammo) + if (autocvar_hud_panel_weapons_ammo) { - fullammo_shells = cvar("hud_panel_weapons_ammo_full_shells"); - fullammo_nails = cvar("hud_panel_weapons_ammo_full_nails"); - fullammo_rockets = cvar("hud_panel_weapons_ammo_full_rockets"); - fullammo_cells = cvar("hud_panel_weapons_ammo_full_cells"); - fullammo_fuel = cvar("hud_panel_weapons_ammo_full_fuel"); - ammo_color = stov(cvar_string("hud_panel_weapons_ammo_color")); - ammo_alpha = panel_fg_alpha * cvar("hud_panel_weapons_ammo_alpha"); + ammo_color = stov(autocvar_hud_panel_weapons_ammo_color); + ammo_alpha = panel_fg_alpha * autocvar_hud_panel_weapons_ammo_alpha; if(wpnsize_x/wpnsize_y > aspect) @@ -1693,7 +1872,7 @@ void HUD_Weapons(void) float show_accuracy; float weapon_stats; - if(cvar("hud_panel_weapons_accuracy") && acc_levels) + if(autocvar_hud_panel_weapons_accuracy && acc_levels) { show_accuracy = true; if (acc_col_x[0] == -1) @@ -1702,7 +1881,7 @@ void HUD_Weapons(void) } float weapons_st = getstati(STAT_WEAPONS); - float label = cvar("hud_panel_weapons_label"); + float label = autocvar_hud_panel_weapons_label; for(i = 0; i < weapon_cnt; ++i) { @@ -1748,7 +1927,7 @@ void HUD_Weapons(void) drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * wpnsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); // draw ammo status bar - if(show_ammo && weapid != WEP_TUBA && weapid != WEP_LASER && weapid != WEP_PORTO) + if(autocvar_hud_panel_weapons_ammo && weapid != WEP_TUBA && weapid != WEP_LASER && weapid != WEP_PORTO) { a = 0; type = GetAmmoTypeForWep(weapid); @@ -1758,11 +1937,11 @@ void HUD_Weapons(void) if(a > 0) { switch(type) { - case 0: fullammo = fullammo_shells; break; - case 1: fullammo = fullammo_nails; break; - case 2: fullammo = fullammo_rockets; break; - case 3: fullammo = fullammo_cells; break; - case 4: fullammo = fullammo_fuel; break; + case 0: fullammo = autocvar_hud_panel_weapons_ammo_full_shells; break; + case 1: fullammo = autocvar_hud_panel_weapons_ammo_full_nails; break; + case 2: fullammo = autocvar_hud_panel_weapons_ammo_full_rockets; break; + case 3: fullammo = autocvar_hud_panel_weapons_ammo_full_cells; break; + case 4: fullammo = autocvar_hud_panel_weapons_ammo_full_fuel; break; default: fullammo = 60; } @@ -1784,7 +1963,7 @@ void HUD_Weapons(void) } // draw the complain message - if(time - complain_weapon_time < when + fadetime && self.weapon == complain_weapon && cvar("hud_panel_weapons_complainbubble")) + if(time - complain_weapon_time < when + fadetime && self.weapon == complain_weapon && autocvar_hud_panel_weapons_complainbubble) { if(fadetime) { @@ -1804,17 +1983,17 @@ void HUD_Weapons(void) string s; if(complain_weapon_type == 0) { s = "Out of ammo"; - color = stov(cvar_string("hud_panel_weapons_complainbubble_color_outofammo")); + color = stov(autocvar_hud_panel_weapons_complainbubble_color_outofammo); } else if(complain_weapon_type == 1) { s = "Don't have"; - color = stov(cvar_string("hud_panel_weapons_complainbubble_color_donthave")); + color = stov(autocvar_hud_panel_weapons_complainbubble_color_donthave); } else { s = "Unavailable"; - color = stov(cvar_string("hud_panel_weapons_complainbubble_color_unavailable")); + color = stov(autocvar_hud_panel_weapons_complainbubble_color_unavailable); } - float padding = cvar("hud_panel_weapons_complainbubble_padding"); + float padding = autocvar_hud_panel_weapons_complainbubble_padding; drawpic_aspect_skin(wpnpos + '1 1 0' * padding, "weapon_complainbubble", wpnsize - '2 2 0' * padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL); drawstring_aspect(wpnpos + '1 1 0' * padding, s, wpnsize - '2 2 0' * padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL); } @@ -1864,7 +2043,7 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s if(autocvar__hud_configure) { currently_selected = (itemcode == 2); //rockets always selected - a = 100; + a = 31 + mod(itemcode*93, 128); } else a = getstati(GetAmmoStat(itemcode)); // how much ammo do we have of type itemcode? @@ -1896,10 +2075,16 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s if (currently_selected) drawpic_aspect_skin(myPos, "ammo_current_bg", mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - if(a > 0) - drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL); - else // "ghost" ammo count - drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL); + if(a > 0 && autocvar_hud_panel_ammo_progressbar) + HUD_Panel_DrawProgressBar(myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, autocvar_hud_panel_ammo_progressbar_name, 0, 0, a/autocvar_hud_panel_ammo_maxammo, color, autocvar_hud_progressbar_alpha * panel_fg_alpha * alpha, DRAWFLAG_NORMAL); + + if(autocvar_hud_panel_ammo_text) + { + if(a > 0) + drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL); + else // "ghost" ammo count + drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL); + } if(a > 0) drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL); else // "ghost" ammo icon @@ -1908,10 +2093,14 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s void HUD_Ammo(void) { - if(!autocvar_hud_panel_ammo && !autocvar__hud_configure) - return; + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_ammo) return; + if(spectatee_status == -1) return; + } + else + hud_configure_active_panel = HUD_PANEL_AMMO; - active_panel = HUD_PANEL_AMMO; HUD_Panel_UpdateCvars(ammo); vector pos, mySize; pos = panel_pos; @@ -1991,10 +2180,51 @@ void HUD_Ammo(void) drawfont = hud_font; } -void DrawNumIcon(float iconalign, vector myPos, vector mySize, float x, string icon, float left, vector color, float alpha) +void DrawNumIcon(vector myPos, vector mySize, float x, string icon, float vertical, float icon_right_align, vector color, float alpha) { - vector newPos; - float newSize_x, newSize_y; + vector newPos, newSize; + vector picpos, numpos; + + if (vertical) + { + if(mySize_y/mySize_x > 2) + { + newSize_y = 2 * mySize_x; + newSize_x = mySize_x; + + newPos_y = myPos_y + (mySize_y - newSize_y) / 2; + newPos_x = myPos_x; + } + else + { + newSize_x = 1/2 * mySize_y; + newSize_y = mySize_y; + + newPos_x = myPos_x + (mySize_x - newSize_x) / 2; + newPos_y = myPos_y; + } + + if(icon_right_align) + { + numpos = newPos; + picpos = newPos + eY * newSize_x; + } + else + { + picpos = newPos; + numpos = newPos + eY * newSize_x; + } + + newSize_y /= 2; + drawpic_aspect_skin(picpos, icon, newSize, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL); + // make number smaller than icon, it looks better + // reduce only y to draw numbers with different number of digits with the same y size + numpos_y += newSize_y * ((1 - 0.7) / 2); + newSize_y *= 0.7; + drawstring_aspect(numpos, ftos(x), newSize, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL); + return; + } + if(mySize_x/mySize_y > 3) { newSize_x = 3 * mySize_y; @@ -2012,81 +2242,57 @@ void DrawNumIcon(float iconalign, vector myPos, vector mySize, float x, string i newPos_x = myPos_x; } - vector picpos, numpos; - if(left) + if(icon_right_align) // right align { - if(iconalign == 1 || iconalign == 3) // right align - { - numpos = newPos; - picpos = newPos + eX * 2 * newSize_y; - } - else // left align - { - numpos = newPos + eX * newSize_y; - picpos = newPos; - } + numpos = newPos; + picpos = newPos + eX * 2 * newSize_y; } - else + else // left align { - if(iconalign == 0 || iconalign == 3) // left align - { - numpos = newPos + eX * newSize_y; - picpos = newPos; - } - else // right align - { - numpos = newPos; - picpos = newPos + eX * 2 * newSize_y; - } + numpos = newPos + eX * newSize_y; + picpos = newPos; } - drawfont = hud_bigfont; - drawstring_aspect(numpos, ftos(x), eX * (2/3) * newSize_x + eY * newSize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL); - drawfont = hud_font; + drawstring_aspect(numpos, ftos(x), '2 1 0' * newSize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL); drawpic_aspect_skin(picpos, icon, '1 1 0' * newSize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL); } -void DrawNumIcon_expanding(float iconalign, vector myPos, vector mySize, float x, string icon, float left, vector color, float fadelerp) +void DrawNumIcon_expanding(vector myPos, vector mySize, float x, string icon, float vertical, float icon_right_align, vector color, float fadelerp) { float sz; sz = expandingbox_sizefactor_from_fadelerp(fadelerp); - DrawNumIcon(iconalign, myPos + expandingbox_resize_centered_box_offset(sz, mySize, 1), mySize * sz, x, icon, left, color, (1 - fadelerp)); + DrawNumIcon(myPos + expandingbox_resize_centered_box_offset(sz, mySize, 1), mySize * sz, x, icon, vertical, icon_right_align, color, (1 - fadelerp)); } // Powerups (#2) // -void HUD_Powerups(void) { - if(!autocvar_hud_panel_powerups && !autocvar__hud_configure) - return; - +void HUD_Powerups(void) +{ + float strength_time, shield_time; if(!autocvar__hud_configure) { - if not(getstati(STAT_ITEMS) & (IT_STRENGTH | IT_INVINCIBLE)) - return; + if(!autocvar_hud_panel_powerups) return; + if(spectatee_status == -1) return; + if not(getstati(STAT_ITEMS) & (IT_STRENGTH | IT_INVINCIBLE)) return; + if (getstati(STAT_HEALTH) <= 0) return; - if (getstati(STAT_HEALTH) <= 0) - return; + strength_time = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99); + shield_time = bound(0, getstatf(STAT_INVINCIBLE_FINISHED) - time, 99); + } + else + { + hud_configure_active_panel = HUD_PANEL_POWERUPS; + + strength_time = 15; + shield_time = 27; } - active_panel = HUD_PANEL_POWERUPS; HUD_Panel_UpdateCvars(powerups); vector pos, mySize; pos = panel_pos; mySize = panel_size; - float strength_time, shield_time; - if(autocvar__hud_configure) - { - strength_time = 15; - shield_time = 27; - } - else - { - strength_time = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99); - shield_time = bound(0, getstatf(STAT_INVINCIBLE_FINISHED) - time, 99); - } - HUD_Panel_DrawBg(bound(0, max(strength_time, shield_time), 1)); if(panel_bg_padding) { @@ -2094,184 +2300,112 @@ void HUD_Powerups(void) { mySize -= '2 2 0' * panel_bg_padding; } - vector barpos, barsize; + vector barsize; vector picpos; vector numpos; string leftname, rightname; + string leftprogressname, rightprogressname; float leftcnt, rightcnt; float leftexact, rightexact; - float flip = cvar("hud_panel_powerups_flip"); - if (flip) { + if (autocvar_hud_panel_powerups_flip) { leftname = "strength"; + leftprogressname = autocvar_hud_panel_powerups_progressbar_strength; leftcnt = ceil(strength_time); leftexact = strength_time; rightname = "shield"; + rightprogressname = autocvar_hud_panel_powerups_progressbar_shield; rightcnt = ceil(shield_time); rightexact = shield_time; } else { leftname = "shield"; + leftprogressname = autocvar_hud_panel_powerups_progressbar_shield; leftcnt = ceil(shield_time); leftexact = shield_time; rightname = "strength"; + rightprogressname = autocvar_hud_panel_powerups_progressbar_strength; rightcnt = ceil(strength_time); rightexact = strength_time; } drawfont = hud_bigfont; - float baralign = cvar("hud_panel_powerups_baralign"); - float iconalign = cvar("hud_panel_powerups_iconalign"); - float progressbar = cvar("hud_panel_powerups_progressbar"); - if (mySize_x/mySize_y > 4) - { - if(leftcnt) - { - if(baralign == 1 || baralign == 3) { // right align - barpos = pos + eX * 0.5 * mySize_x - eX * 0.5 * mySize_x * min(1, leftcnt/30); - barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y; - } else { // left align - barpos = pos; - barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y; - } - - if(progressbar) - { - HUD_Panel_GetProgressBarColorForString(leftname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); - } - if(leftcnt > 1) - DrawNumIcon(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', 1); - if(leftcnt <= 5) - DrawNumIcon_expanding(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1)); - } - - if(rightcnt) - { - if(baralign == 0 || baralign == 3) { // left align - barpos = pos + eX * 0.5 * mySize_x; - barsize = eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y; - } else { // right align - barpos = pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/30); - barsize = eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y; - } + float baralign = autocvar_hud_panel_powerups_baralign; + float iconalign = autocvar_hud_panel_powerups_iconalign; - if(progressbar) - { - HUD_Panel_GetProgressBarColorForString(rightname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); - } - if(rightcnt > 1) - DrawNumIcon(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', 1); - if(rightcnt <= 5) - DrawNumIcon_expanding(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1)); - } - } - else if (mySize_x/mySize_y > 1.5) + float panel_ar = mySize_x/mySize_y; + float is_vertical = (panel_ar < 1); + if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1)) { + barsize = eX * 0.5 * mySize_x + eY * mySize_y; if(leftcnt) { - if(baralign == 1 || baralign == 3) { // right align - barpos = pos + eX * mySize_x - eX * mySize_x * min(1, leftcnt/30); - barsize = eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y; - } else { // left align - barpos = pos; - barsize = eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y; - } - - if(progressbar) + if(autocvar_hud_panel_powerups_progressbar) { HUD_Panel_GetProgressBarColorForString(leftname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos, barsize, leftprogressname, leftcnt/30, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); + } + if(autocvar_hud_panel_powerups_text) + { + if(leftcnt > 1) + DrawNumIcon(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', 1); + if(leftcnt <= 5) + DrawNumIcon_expanding(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1)); } - if(leftcnt > 1) - DrawNumIcon(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', 1); - if(leftcnt <= 5) - DrawNumIcon_expanding(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1)); } if(rightcnt) { - if(baralign == 0 || baralign == 3) { // left align - barpos = pos + eY * 0.5 * mySize_y; - barsize = eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y; - } else { // right align - barpos = pos + eX * mySize_x - eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y; - barsize = eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y; - } - - if(progressbar) + pos_x += barsize_x; + if(autocvar_hud_panel_powerups_progressbar) { HUD_Panel_GetProgressBarColorForString(rightname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos, barsize, rightprogressname, rightcnt/30, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); + } + if(autocvar_hud_panel_powerups_text) + { + if(rightcnt > 1) + DrawNumIcon(pos, barsize, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', 1); + if(rightcnt <= 5) + DrawNumIcon_expanding(pos, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1)); } - if(rightcnt > 1) - DrawNumIcon(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', 1); - if(rightcnt <= 5) - DrawNumIcon_expanding(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1)); } } else { + barsize = eX * mySize_x + eY * 0.5 * mySize_y; if(leftcnt) { - if(baralign == 1 || baralign == 3) { // down align - barpos = pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/30); - barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30); - } else { // up align - barpos = pos; - barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30); - } - - if(iconalign == 1 || iconalign == 3) { // down align - picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x); - numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x; - } else { // up align - picpos = pos + eX * 0.05 * mySize_x; - numpos = pos + eY * 0.4 * mySize_x; - } - - if(progressbar) + if(autocvar_hud_panel_powerups_progressbar) { HUD_Panel_GetProgressBarColorForString(leftname); - HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos, barsize, leftprogressname, leftcnt/30, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); + } + if(autocvar_hud_panel_powerups_text) + { + if(leftcnt > 1) + DrawNumIcon(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', 1); + if(leftcnt <= 5) + DrawNumIcon_expanding(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1)); } - if(leftcnt <= 5) - drawpic_aspect_skin_expanding(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, bound(0, (leftcnt - leftexact) / 0.5, 1)); - if(leftcnt > 1) - drawpic_aspect_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawstring_aspect(numpos, ftos(leftcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); } if(rightcnt) { - if(baralign == 0 || baralign == 3) { // up align - barpos = pos + eX * 0.5 * mySize_x; - barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30); - } else { // down align - barpos = pos + eY * mySize_y - eY * mySize_y * min(1, rightcnt/30) + eX * 0.5 * mySize_x; - barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30); - } - - if(iconalign == 0 || iconalign == 3) { // up align - picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x; - numpos = pos + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x; - } else { // down align - picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x) + eX * 0.5 * mySize_x; - numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x + eX * 0.5 * mySize_x; - } - - if(progressbar) + pos_y += barsize_y; + if(autocvar_hud_panel_powerups_progressbar) { HUD_Panel_GetProgressBarColorForString(rightname); - HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos, barsize, rightprogressname, rightcnt/30, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); + } + if(autocvar_hud_panel_powerups_text) + { + if(rightcnt > 1) + DrawNumIcon(pos, barsize, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', 1); + if(rightcnt <= 5) + DrawNumIcon_expanding(pos, barsize, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1)); } - if(rightcnt <= 5) - drawpic_aspect_skin_expanding(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, bound(0, (rightcnt - rightexact) / 0.5, 1)); - if(rightcnt > 1) - drawpic_aspect_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawstring_aspect(numpos, ftos(rightcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); } } drawfont = hud_font; @@ -2281,10 +2415,27 @@ void HUD_Powerups(void) { // void HUD_HealthArmor(void) { - if(!autocvar_hud_panel_healtharmor && !autocvar__hud_configure) - return; + float armor, health, fuel; + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_healtharmor) return; + if(spectatee_status == -1) return; + + health = getstati(STAT_HEALTH); + if(health <= 0) + return; + armor = getstati(STAT_ARMOR); + fuel = getstati(STAT_FUEL); + } + else + { + hud_configure_active_panel = HUD_PANEL_HEALTHARMOR; + + health = 150; + armor = 75; + fuel = 20; + } - active_panel = HUD_PANEL_HEALTHARMOR; HUD_Panel_UpdateCvars(healtharmor); vector pos, mySize; pos = panel_pos; @@ -2297,29 +2448,15 @@ void HUD_HealthArmor(void) mySize -= '2 2 0' * panel_bg_padding; } - float armor, health, fuel; - armor = getstati(STAT_ARMOR); - health = getstati(STAT_HEALTH); - fuel = getstati(STAT_FUEL); - - if(autocvar__hud_configure) - { - armor = 150; - health = 100; - fuel = 70; - } - - if(health <= 0) - return; - - vector barpos, barsize; - vector picpos; - vector numpos; + vector barsize; + vector picpos, numpos; drawfont = hud_bigfont; - float baralign = cvar("hud_panel_healtharmor_baralign"); - float iconalign = cvar("hud_panel_healtharmor_iconalign"); - float progressbar = cvar("hud_panel_healtharmor_progressbar"); + float baralign = autocvar_hud_panel_healtharmor_baralign; + float iconalign = autocvar_hud_panel_healtharmor_iconalign; + + float maxhealth = autocvar_hud_panel_healtharmor_maxhealth; + float maxarmor = autocvar_hud_panel_healtharmor_maxarmor; if(autocvar_hud_panel_healtharmor == 2) // combined health and armor display { vector v; @@ -2328,258 +2465,156 @@ void HUD_HealthArmor(void) float x; x = floor(v_x + 1); - if(baralign == 1 || baralign == 3) { // right align - barpos = pos + eX * mySize_x - eX * mySize_x * min(1, x/400); - barsize = eX * mySize_x * min(1, x/400) + eY * mySize_y; - } else { // left align - barpos = pos; - barsize = eX * mySize_x * min(1, x/400) + eY * mySize_y; - } - + float maxtotal = maxhealth + maxarmor; string biggercount; if(v_z) // NOT fully armored { biggercount = "health"; - if(progressbar) + if(autocvar_hud_panel_healtharmor_progressbar) { HUD_Panel_GetProgressBarColor(health); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos, mySize, autocvar_hud_panel_healtharmor_progressbar_health, x/maxtotal, 0, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } if(armor) + if(autocvar_hud_panel_healtharmor_text) drawpic_aspect_skin(pos + eX * mySize_x - eX * 0.5 * mySize_y, "armor", '0.5 0.5 0' * mySize_y, '1 1 1', panel_fg_alpha * armor / health, DRAWFLAG_NORMAL); } else { biggercount = "armor"; - if(progressbar) + if(autocvar_hud_panel_healtharmor_progressbar) { HUD_Panel_GetProgressBarColor(armor); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos, mySize, autocvar_hud_panel_healtharmor_progressbar_armor, x/maxtotal, 0, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } if(health) + if(autocvar_hud_panel_healtharmor_text) drawpic_aspect_skin(pos + eX * mySize_x - eX * 0.5 * mySize_y, "health", '0.5 0.5 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); } - DrawNumIcon(iconalign, pos, mySize, x, biggercount, 1, HUD_Get_Num_Color(x, 2 * 200), 1); + if(autocvar_hud_panel_healtharmor_text) + DrawNumIcon(pos, mySize, x, biggercount, 0, iconalign, HUD_Get_Num_Color(x, maxtotal), 1); - // fuel if(fuel) { - if(baralign == 0 || baralign == 3) { // left align - barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100); - barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y; - } else { - barpos = pos; - barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y; - } HUD_Panel_GetProgressBarColor(fuel); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos, eX * mySize_x + eY * 0.2 * mySize_y, "progressbar", fuel/100, 0, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL); } } else { string leftname, rightname; + string leftprogressname, rightprogressname; float leftcnt, rightcnt; + float leftmax, rightmax; float leftactive, rightactive; float leftalpha, rightalpha; - float flip = cvar("hud_panel_healtharmor_flip"); - if (flip) { // old style layout with armor left/top of health + if (autocvar_hud_panel_healtharmor_flip) { // old style layout with armor left/top of health leftname = "armor"; + leftprogressname = autocvar_hud_panel_healtharmor_progressbar_armor; leftcnt = armor; if(leftcnt) leftactive = 1; leftalpha = min((armor+10)/55, 1); + leftmax = maxarmor; rightname = "health"; + rightprogressname = autocvar_hud_panel_healtharmor_progressbar_health; rightcnt = health; rightactive = 1; rightalpha = 1; + rightmax = maxhealth; } else { leftname = "health"; + leftprogressname = autocvar_hud_panel_healtharmor_progressbar_health; leftcnt = health; leftactive = 1; leftalpha = 1; + leftmax = maxhealth; rightname = "armor"; + rightprogressname = autocvar_hud_panel_healtharmor_progressbar_armor; rightcnt = armor; if(rightcnt) rightactive = 1; rightalpha = min((armor+10)/55, 1); + rightmax = maxarmor; } - if (mySize_x/mySize_y > 4) + float panel_ar = mySize_x/mySize_y; + float is_vertical = (panel_ar < 1); + if (panel_ar >= 4 || (panel_ar >= 1/4 && panel_ar < 1)) { + barsize = eX * 0.5 * mySize_x + eY * mySize_y; if(leftactive) { - if(baralign == 1 || baralign == 3) { // right align - barpos = pos + eX * 0.5 * mySize_x - eX * 0.5 * mySize_x * min(1, leftcnt/200); - barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y; - } else { // left align - barpos = pos; - barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y; - } - - if(progressbar) + if(autocvar_hud_panel_healtharmor_progressbar) { HUD_Panel_GetProgressBarColorForString(leftname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos, barsize, leftprogressname, leftcnt/leftmax, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - DrawNumIcon(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, 200), 1); + if(autocvar_hud_panel_healtharmor_text) + DrawNumIcon(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), HUD_Get_Num_Color(leftcnt, leftmax), 1); } if(rightactive) { - if(baralign == 0 || baralign == 3) { // left align - barpos = pos + eX * 0.5 * mySize_x; - barsize = eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y; - } else { // right align - barpos = pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/200); - barsize = eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y; - } - - if(progressbar) + if(autocvar_hud_panel_healtharmor_progressbar) { HUD_Panel_GetProgressBarColorForString(rightname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos + eX * 0.5 * mySize_x, barsize, rightprogressname, rightcnt/rightmax, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - DrawNumIcon(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, 200), 1); + if(autocvar_hud_panel_healtharmor_text) + DrawNumIcon(pos + eX * 0.5 * mySize_x, barsize, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), HUD_Get_Num_Color(rightcnt, rightmax), 1); } if(fuel) { - if(baralign == 0 || baralign == 3) { // left align - barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100); - barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y; - } else { - barpos = pos; - barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y; - } HUD_Panel_GetProgressBarColor(fuel); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL); + if (is_vertical) //if vertical always halve x to not cover too much numbers with 3 digits + mySize_x *= 0.2 * 0.5 / 2; + else + mySize_y *= 0.2; + HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", fuel/100, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL); } } - else if (mySize_x/mySize_y > 1.5) + else { + barsize = eX * mySize_x + eY * 0.5 * mySize_y; if(leftactive) { - if(baralign == 1 || baralign == 3) { // right align - barpos = pos + eX * mySize_x - eX * mySize_x * min(1, leftcnt/200); - barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y; - } else { // left align - barpos = pos; - barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y; - } - - if(progressbar) + if(autocvar_hud_panel_healtharmor_progressbar) { HUD_Panel_GetProgressBarColorForString(leftname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos, barsize, leftprogressname, leftcnt/leftmax, is_vertical, (baralign == 1 || baralign == 2), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - DrawNumIcon(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, 200), 1); + if(autocvar_hud_panel_healtharmor_text) + DrawNumIcon(pos, barsize, leftcnt, leftname, is_vertical, (iconalign == 1 || iconalign == 2), HUD_Get_Num_Color(leftcnt, leftmax), 1); } if(rightactive) { - if(baralign == 0 || baralign == 3) { // left align - barpos = pos + eY * 0.5 * mySize_y; - barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y; - } else { // right align - barpos = pos + eX * mySize_x - eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y; - barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y; - } - - if(progressbar) + if(autocvar_hud_panel_healtharmor_progressbar) { HUD_Panel_GetProgressBarColorForString(rightname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos + eY * 0.5 * mySize_y, barsize, rightprogressname, rightcnt/rightmax, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - DrawNumIcon(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, 200), 1); + if(autocvar_hud_panel_healtharmor_text) + DrawNumIcon(pos + eY * 0.5 * mySize_y, barsize, rightcnt, rightname, is_vertical, (iconalign == 1 || iconalign == 3), HUD_Get_Num_Color(rightcnt, rightmax), 1); } if(fuel) { - if(baralign == 0 || baralign == 3) { // left align - barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100); - barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.1 * mySize_y; - } else { - barpos = pos; - barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.1 * mySize_y; - } HUD_Panel_GetProgressBarColor(fuel); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL); + if (is_vertical) //if vertical always halve x to not cover numbers with 3 digits + mySize_x *= 0.2 / 2; + else + mySize_y *= 0.2 * 0.5; + HUD_Panel_DrawProgressBar(pos, mySize, "progressbar", fuel/100, is_vertical, (baralign == 1 || baralign == 3), progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL); } } - else - { - if(leftactive) - { - if(baralign == 1 || baralign == 3) { // down align - barpos = pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/200); - barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200); - } else { // up align - barpos = pos; - barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200); - } - - if(iconalign == 1 || iconalign == 3) { // down align - picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x); - numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x; - } else { // up align - picpos = pos + eX * 0.05 * mySize_x; - numpos = pos + eY * 0.4 * mySize_x; - } - - if(progressbar) - { - HUD_Panel_GetProgressBarColorForString(leftname); - HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); - } - drawpic_aspect_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', leftalpha * panel_fg_alpha, DRAWFLAG_NORMAL); - drawstring_aspect(numpos, ftos(leftcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, HUD_Get_Num_Color(leftcnt, 200), panel_fg_alpha, DRAWFLAG_NORMAL); - } - - if(rightactive) - { - if(baralign == 0 || baralign == 3) { // up align - barpos = pos + eX * 0.5 * mySize_x; - barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200); - } else { // down align - barpos = pos + eY * mySize_y - eY * mySize_y * min(1, rightcnt/200) + eX * 0.5 * mySize_x; - barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200); - } - - if(iconalign == 0 || iconalign == 3) { // up align - picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x; - numpos = pos + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x; - } else { // down align - picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x) + eX * 0.5 * mySize_x; - numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x + eX * 0.5 * mySize_x; - } - - if(progressbar) - { - HUD_Panel_GetProgressBarColorForString(rightname); - HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); - } - drawpic_aspect_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', rightalpha * panel_fg_alpha, DRAWFLAG_NORMAL); - drawstring_aspect(numpos, ftos(rightcnt), eX * 0.5 * mySize_x + eY * 0.25 * mySize_x, HUD_Get_Num_Color(rightcnt, 200), panel_fg_alpha, DRAWFLAG_NORMAL); - } - - if(fuel) - { - if(baralign == 0 || baralign == 3) { // left align - barpos = pos; - barsize = eX * 0.05 * mySize_x + eY * mySize_y * min(1, fuel/100); - } else { - barpos = pos + eY * mySize_y - eY * mySize_y * min(1, fuel/100); - barsize = eX * 0.05 * mySize_x + eY * mySize_y * min(1, fuel/100); - } - HUD_Panel_GetProgressBarColor(fuel); - HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, panel_fg_alpha * 0.8, DRAWFLAG_NORMAL); - } - } - } - drawfont = hud_font; -} + } + drawfont = hud_font; +} // Notification area (#4) // @@ -2625,8 +2660,8 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s { float w; float alsoprint, gentle; - alsoprint = (cvar("hud_panel_notify_print") || !panel_enabled); // print message to console if: notify panel disabled, or cvar to do so enabled - gentle = (cvar("cl_gentle") || cvar("cl_gentle_messages")); + alsoprint = (autocvar_hud_panel_notify_print || !panel_enabled); // print message to console if: notify panel disabled, or cvar to do so enabled + gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages); if ((msg == MSG_SUICIDE || msg == MSG_KILL || msg == MSG_KILL_ACTION) && gametype == GAME_CTS) // selfkill isn't interesting in CTS and only spams up the notify panel return; @@ -2974,6 +3009,17 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s else if(type == RACE_FAIL) { HUD_KillNotify_Push(s1, s2, 1, RACE_FAIL); } + } else if(msg == MSG_KA) { + if(type == KA_PICKUPBALL) { + HUD_KillNotify_Push(s1, s2, 0, KA_PICKUPBALL); + if(alsoprint) + print (s1, "^7 has picked up the ball!\n"); + } + else if(type == KA_DROPBALL) { + HUD_KillNotify_Push(s1, s2, 0, KA_DROPBALL); + if(alsoprint) + print(s1, "^7 has dropped the ball!\n"); + } } } @@ -2982,7 +3028,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s void HUD_Centerprint(string s1, string s2, float type, float msg) { float gentle; - gentle = (cvar("cl_gentle") || cvar("cl_gentle_messages")); + gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages); if(msg == MSG_SUICIDE) { if (type == DEATH_TEAMCHANGE) { centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "You are now on: ", s1)); @@ -3068,10 +3114,13 @@ void HUD_Centerprint(string s1, string s2, float type, float msg) void HUD_Notify (void) { - if(!autocvar_hud_panel_notify && !autocvar__hud_configure) - return; + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_notify) return; + } + else + hud_configure_active_panel = HUD_PANEL_NOTIFY; - active_panel = HUD_PANEL_NOTIFY; HUD_Panel_UpdateCvars(notify); vector pos, mySize; pos = panel_pos; @@ -3093,9 +3142,9 @@ void HUD_Notify (void) float a; float when; - when = cvar("hud_panel_notify_time"); + when = autocvar_hud_panel_notify_time; float fadetime; - fadetime = cvar("hud_panel_notify_fadetime"); + fadetime = autocvar_hud_panel_notify_fadetime; string s; @@ -3105,7 +3154,7 @@ void HUD_Notify (void) string attacker, victim; float i, j, w, step, limit; - if(cvar("hud_panel_notify_flip")) //order items from the top down + if(autocvar_hud_panel_notify_flip) //order items from the top down { i = 0; step = +1; @@ -3253,6 +3302,15 @@ void HUD_Notify (void) s = "notify_blue_captured"; } } + else if(killnotify_deathtype[j] == KA_DROPBALL) + { + s = "notify_balldropped"; + } + else if(killnotify_deathtype[j] == KA_PICKUPBALL) + { + s = "notify_ballpickedup"; + } + attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors); pos_attacker = pos + eX * (0.52 * mySize_x + height) + eY * (0.5 * fontsize_y + i * height); weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height; @@ -3372,10 +3430,13 @@ string seconds_tostring(float sec) void HUD_Timer(void) { - if(!autocvar_hud_panel_timer && !autocvar__hud_configure) - return; + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_timer) return; + } + else + hud_configure_active_panel = HUD_PANEL_TIMER; - active_panel = HUD_PANEL_TIMER; HUD_Panel_UpdateCvars(timer); vector pos, mySize; pos = panel_pos; @@ -3427,10 +3488,14 @@ void HUD_Timer(void) // void HUD_Radar(void) { - if ((autocvar_hud_panel_radar == 0 || (autocvar_hud_panel_radar != 2 && !teamplay)) && !autocvar__hud_configure) - return; + if (!autocvar__hud_configure) + { + if (autocvar_hud_panel_radar == 0) return; + if (autocvar_hud_panel_radar != 2 && !teamplay) return; + } + else + hud_configure_active_panel = HUD_PANEL_RADAR; - active_panel = HUD_PANEL_RADAR; HUD_Panel_UpdateCvars(radar); vector pos, mySize; pos = panel_pos; @@ -3443,8 +3508,7 @@ void HUD_Radar(void) mySize -= '2 2 0' * panel_bg_padding; } - local float color1, color2; // color already declared as a global in hud.qc - local vector rgb; + local float color2; local entity tm; float scale2d, normalsize, bigsize; float f; @@ -3493,7 +3557,7 @@ void HUD_Radar(void) if(hud_panel_radar_rotation == 0) { // max-min distance must fit the radar in any rotation - bigsize = vlen_minnorm2d(teamradar_size2d) * scale2d / (1.05 * vlen2d(mi_max - mi_min)); + bigsize = vlen_minnorm2d(teamradar_size2d) * scale2d / (1.05 * vlen2d(mi_scale)); } else { @@ -3521,12 +3585,9 @@ void HUD_Radar(void) f * bigsize + (1 - f) * normalsize; teamradar_origin3d_in_texcoord = teamradar_3dcoord_to_texcoord( - f * (mi_min + mi_max) * 0.5 + f * mi_center + (1 - f) * view_origin); - color1 = GetPlayerColor(player_localentnum-1); - rgb = GetTeamRGB(color1); - drawsetcliparea( pos_x, pos_y, @@ -3553,12 +3614,16 @@ void HUD_Radar(void) // Score (#7) // +void HUD_UpdatePlayerTeams(); void HUD_Score(void) { - if(!autocvar_hud_panel_score && !autocvar__hud_configure) - return; + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_score) return; + } + else + hud_configure_active_panel = HUD_PANEL_SCORE; - active_panel = HUD_PANEL_SCORE; HUD_Panel_UpdateCvars(score); vector pos, mySize; pos = panel_pos; @@ -3571,7 +3636,7 @@ void HUD_Score(void) mySize -= '2 2 0' * panel_bg_padding; } - float score, distribution, leader; + float score, distribution; string sign; vector distribution_color; entity tm, pl, me; @@ -3613,6 +3678,86 @@ void HUD_Score(void) drawstring_aspect(pos, timer, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); drawfont = hud_font; } else if (!teamplay) { // non-teamgames + if ((spectatee_status == -1 && !autocvar__hud_configure) || autocvar_hud_panel_score_rankings) + { +#define SCOREPANEL_MAX_ENTRIES 6 +#define SCOREPANEL_ASPECTRATIO 2 + float entries = bound(1, floor(SCOREPANEL_MAX_ENTRIES * mySize_y/mySize_x * SCOREPANEL_ASPECTRATIO), SCOREPANEL_MAX_ENTRIES); + float height = mySize_y/entries; + vector fontsize = '0.9 0.9 0' * height; + pos_y += height * (1 - 0.9) / 2; + + vector rgb; + rgb = '1 1 1'; + + float name_size = mySize_x*0.75; + float i, me_printed; + string s; + if (autocvar__hud_configure) + { + score = 10 + SCOREPANEL_MAX_ENTRIES * 3; + for (i=0; i= 5) { + if(distribution >= 5) distribution_color = eY; - leader = 1; - } else if(distribution >= 0) { + else if(distribution >= 0) distribution_color = '1 1 1'; - leader = 1; - } else if(distribution >= -5) + else if(distribution >= -5) distribution_color = '1 1 0'; else distribution_color = eX; - drawstring_aspect(pos + eX * 0.75 * mySize_x, ftos(distribution), eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL); - if (leader) + string distribution_str; + distribution_str = ftos(distribution); + if (distribution >= 0) + { + if (distribution > 0) + distribution_str = strcat("+", distribution_str); HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + } drawfont = hud_bigfont; drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize_x + eY * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL); drawfont = hud_font; + drawstring_aspect(pos + eX * 0.75 * mySize_x, distribution_str, eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL); } else { // teamgames float max_fragcount; max_fragcount = -99; - float teamnum; + float scores_count, row, column, rows, columns; + vector offset; + vector score_pos, score_size; //for scores other than myteam + if (spectatee_status == -1) + { + if (autocvar__hud_configure) + scores_count = 4; + else for(tm = teams.sort_next; tm; tm = tm.sort_next) { + if(tm.team == COLOR_SPECTATOR) + continue; + ++scores_count; + } + rows = mySize_y/mySize_x; + rows = bound(1, floor((sqrt(4 * (3/1) * rows * scores_count + rows * rows) + rows + 0.5) / 2), scores_count); + // ^^^ ammo item aspect goes here + + columns = ceil(scores_count/rows); + + score_size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows); + + float newSize; + if(score_size_x/score_size_y > 3) + { + newSize = 3 * score_size_y; + offset_x = score_size_x - newSize; + pos_x += offset_x/2; + score_size_x = newSize; + } + else + { + newSize = 1/3 * score_size_x; + offset_y = score_size_y - newSize; + pos_y += offset_y/2; + score_size_y = newSize; + } + } + else + score_size = eX * mySize_x*(1/4) + eY * mySize_y*(1/3); for(tm = teams.sort_next; tm; tm = tm.sort_next) { - if(tm.team == COLOR_SPECTATOR || (!tm.team_size && !autocvar__hud_configure)) // no players? don't display + if(tm.team == COLOR_SPECTATOR) continue; score = tm.(teamscores[ts_primary]); if(autocvar__hud_configure) score = 123; - leader = 0; if (score > max_fragcount) max_fragcount = score; - if(tm.team == myteam) { + if (spectatee_status == -1) + { + score_pos = pos + eX * column * (score_size_x + offset_x) + eY * row * (score_size_y + offset_y); + if (max_fragcount == score) + HUD_Panel_DrawHighlight(score_pos, score_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawfont = hud_bigfont; + drawstring_aspect(score_pos, ftos(score), score_size, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL); + drawfont = hud_font; + ++row; + if(row >= rows) + { + row = 0; + ++column; + } + } + else if(tm.team == myteam) { if (max_fragcount == score) - leader = 1; - if (leader) HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); drawfont = hud_bigfont; drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize_x + eY * mySize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL); drawfont = hud_font; } else { if (max_fragcount == score) - leader = 1; - if (leader) - HUD_Panel_DrawHighlight(pos + eX * 0.75 * mySize_x + eY * (1/3) * teamnum * mySize_y, eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawstring_aspect(pos + eX * 0.75 * mySize_x + eY * (1/3) * teamnum * mySize_y, ftos(score), eX * 0.25 * mySize_x + eY * (1/3) * mySize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL); - teamnum += 1; + HUD_Panel_DrawHighlight(pos + eX * 0.75 * mySize_x + eY * (1/3) * rows * mySize_y, score_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring_aspect(pos + eX * 0.75 * mySize_x + eY * (1/3) * rows * mySize_y, ftos(score), score_size, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL); + ++rows; } } } @@ -3684,11 +3880,17 @@ void HUD_Score(void) // Race timer (#8) // -void HUD_RaceTimer (void) { - if(!autocvar_hud_panel_racetimer && !(gametype == GAME_RACE || gametype == GAME_CTS) && !autocvar__hud_configure) - return; +void HUD_RaceTimer (void) +{ + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_racetimer) return; + if(!(gametype == GAME_RACE || gametype == GAME_CTS)) return; + if(spectatee_status == -1) return; + } + else + hud_configure_active_panel = HUD_PANEL_RACETIMER; - active_panel = HUD_PANEL_RACETIMER; HUD_Panel_UpdateCvars(racetimer); vector pos, mySize; pos = panel_pos; @@ -3840,22 +4042,37 @@ void HUD_VoteWindow(void) if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE)) { vote_active = 1; - vote_called_vote = strzone(strcat("^2Name ^7instead of \"^1Unregistered player\"", " ^7in stats")); + if (autocvar__hud_configure) + { + vote_yescount = 0; + vote_nocount = 0; + print("^1You have to answer before entering hud configure mode\n"); + cvar_set("_hud_configure", "0"); + } + vote_called_vote = strzone("^2Name ^7instead of \"^1Unregistered player^7\" in stats"); + uid2name_dialog = 1; } - if(!autocvar_hud_panel_vote && !autocvar__hud_configure) - return; - if(!autocvar__hud_configure) { + if(!autocvar_hud_panel_vote) return; + panel_fg_alpha = autocvar_hud_panel_fg_alpha; - panel_bg_alpha_str = cvar_string("hud_panel_vote_bg_alpha"); + panel_bg_alpha_str = autocvar_hud_panel_vote_bg_alpha; if(panel_bg_alpha_str == "") { panel_bg_alpha_str = ftos(autocvar_hud_panel_bg_alpha); } panel_bg_alpha = stof(panel_bg_alpha_str); } + else + { + hud_configure_active_panel = HUD_PANEL_VOTE; + + vote_yescount = 3; + vote_nocount = 2; + vote_needed = 4; + } string s; float a; @@ -3869,29 +4086,23 @@ void HUD_VoteWindow(void) else vote_alpha = bound(0, 1 - (time - vote_change) * 2, 1); - if(autocvar__hud_configure) - { - vote_yescount = 3; - vote_nocount = 2; - vote_needed = 4; - } - if(!vote_alpha) return; - active_panel = HUD_PANEL_VOTE; HUD_Panel_UpdateCvars(vote); - vector pos, mySize; - pos = panel_pos; - mySize = panel_size; - if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE)) + if(uid2name_dialog) { panel_pos = eX * 0.3 * vid_conwidth + eY * 0.1 * vid_conheight; panel_size = eX * 0.4 * vid_conwidth + eY * 0.3 * vid_conheight; } - a = vote_alpha * bound(cvar("hud_panel_vote_alreadyvoted_alpha"), 1 - vote_highlighted, 1); + // these must be below above block + vector pos, mySize; + pos = panel_pos; + mySize = panel_size; + + a = vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1); HUD_Panel_DrawBg(a); a = panel_fg_alpha * a; @@ -3920,7 +4131,7 @@ void HUD_VoteWindow(void) mySize = newSize; s = "A vote has been called for:"; - if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE)) + if(uid2name_dialog) s = "Allow servers to store and display your name?"; drawstring_aspect(pos, s, eX * mySize_x + eY * (2/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); s = textShortenToWidth(vote_called_vote, mySize_x, '1 1 0' * mySize_y * (1/8), stringwidth_colors); @@ -3929,13 +4140,9 @@ void HUD_VoteWindow(void) drawcolorcodedstring_aspect(pos + eY * (2/8) * mySize_y, s, eX * mySize_x + eY * (1.75/8) * mySize_y, a, DRAWFLAG_NORMAL); // print the yes/no counts - s = strcat("Yes (", getcommandkey("vyes", "vyes"), "): ", ftos(vote_yescount)); - if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE)) - s = strcat("Yes: (press y)"); + s = strcat("Yes (", getcommandkey("vyes", "vyes"), "): ", ftos(vote_yescount)); drawstring_aspect(pos + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '0 1 0', a, DRAWFLAG_NORMAL); - s = strcat("No (", getcommandkey("vno", "vno"), "): ", ftos(vote_nocount)); - if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE)) - s = strcat("No: (press n)"); + s = strcat("No (", getcommandkey("vno", "vno"), "): ", ftos(vote_nocount)); drawstring_aspect(pos + eX * 0.5 * mySize_x + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '1 0 0', a, DRAWFLAG_NORMAL); // draw the progress bar backgrounds @@ -4303,6 +4510,44 @@ void HUD_Mod_KH(vector pos, vector mySize) } } +// Keepaway HUD mod icon +float kaball_prevstatus; // last remembered status +float kaball_statuschange_time; // time when the status changed + +// we don't need to reset for keepaway since it immediately +// autocorrects prevstatus as to if the player has the ball or not + +void HUD_Mod_Keepaway(vector pos, vector mySize) +{ + mod_active = 1; // keepaway should always show the mod HUD + + float BLINK_FACTOR = 0.15; + float BLINK_BASE = 0.85; + float BLINK_FREQ = 5; + float kaball_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); + + float stat_items = getstati(STAT_ITEMS); + float kaball = (stat_items/IT_KEY1) & 1; + + if(kaball != kaball_prevstatus) + { + kaball_statuschange_time = time; + kaball_prevstatus = kaball; + } + + // todo: Fix the sizing with the expanding image + + float kaball_statuschange_elapsedtime = time - kaball_statuschange_time; + float f = bound(0, kaball_statuschange_elapsedtime*2, 1); + + if(kaball_prevstatus && f < 1) + drawpic_aspect_skin_expanding(pos + eY * 0.25 * mySize_y, "keepawayball_carrying", eX * mySize_x + eY * mySize_y * 0.5, '1 1 1', panel_fg_alpha * kaball_alpha, DRAWFLAG_NORMAL, f); + + if(kaball) + drawpic_aspect_skin(pos, "keepawayball_carrying", eX * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha * kaball_alpha * f, DRAWFLAG_NORMAL); +} + + // Nexball HUD mod icon void HUD_Mod_NexBall(vector pos, vector mySize) { @@ -4326,20 +4571,11 @@ void HUD_Mod_NexBall(vector pos, vector mySize) p = 2 - p; //Draw the filling - vector barsize; - float vertical; + HUD_Panel_GetProgressBarColor(nexball); if(mySize_x > mySize_y) - { - barsize = eX * p * mySize_x + eY * mySize_y; - vertical = 0; - } + HUD_Panel_DrawProgressBar(pos, mySize, "statusbar", p, 0, 0, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); else - { - barsize = eX * mySize_x + eY * p * mySize_y; - vertical = 1; - } - HUD_Panel_GetProgressBarColor(nexball); - HUD_Panel_DrawProgressBar(pos, vertical, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(pos, mySize, "statusbar", p, 1, 0, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } if (stat_items & IT_KEY1) @@ -4379,9 +4615,9 @@ void HUD_Mod_Race(vector pos, vector mySize) if(score && (score < t || !t)) { db_put(ClientProgsDB, strcat(shortmapname, rr, "time"), ftos(score)); - if(cvar("cl_autodemo_delete_keeprecords")) + if(autocvar_cl_autodemo_delete_keeprecords) { - f = cvar("cl_autodemo_delete"); + f = autocvar_cl_autodemo_delete; f &~= 1; cvar_set("cl_autodemo_delete", ftos(f)); // don't delete demo with new record! } @@ -4494,19 +4730,119 @@ void HUD_Mod_Race(vector pos, vector mySize) drawfont = hud_font; } +void DrawDomItem(vector myPos, vector mySize, float aspect_ratio, float layout, float i) +{ + float dom_pps, dom_pps_ratio; + string pic; + vector color; + switch(i) + { + case 0: + dom_pps = dom_pps_red; + pic = "dom_icon_red"; + color = '1 0 0'; + break; + case 1: + dom_pps = dom_pps_blue; + pic = "dom_icon_blue"; + color = '0 0 1'; + break; + case 2: + dom_pps = dom_pps_yellow; + pic = "dom_icon_yellow"; + color = '1 1 0'; + break; + case 3: + dom_pps = dom_pps_pink; + pic = "dom_icon_pink"; + color = '1 0 1'; + } + dom_pps_ratio = dom_pps / dom_total_pps; + + if(mySize_x/mySize_y > aspect_ratio) + { + i = aspect_ratio * mySize_y; + myPos_x = myPos_x + (mySize_x - i) / 2; + mySize_x = i; + } + else + { + i = 1/aspect_ratio * mySize_x; + myPos_y = myPos_y + (mySize_y - i) / 2; + mySize_y = i; + } + + if (layout) // show text too + { + //draw the text + color *= 0.5 + dom_pps_ratio * (1 - 0.5); // half saturated color at min, full saturated at max + if (layout == 2) // average pps + drawstring_aspect(myPos + eX * mySize_y, ftos_decimals(dom_pps, 2), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL); + else // percentage of average pps + drawstring_aspect(myPos + eX * mySize_y, strcat( ftos(floor(dom_pps_ratio*100 + 0.5)), "%" ), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL); + } + + //draw the icon + drawpic_aspect_skin(myPos, pic, '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + if (dom_pps > 0) + { + drawsetcliparea(myPos_x, myPos_y + mySize_y * (1 - dom_pps_ratio), mySize_y, mySize_y * dom_pps_ratio); + drawpic_aspect_skin(myPos, strcat(pic, "-highlighted"), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawresetcliparea(); + } +} + +void HUD_Mod_Dom(vector myPos, vector mySize) +{ + mod_active = 1; // required in each mod function that always shows something + entity tm; + float teams_count; + for(tm = teams.sort_next; tm; tm = tm.sort_next) + if(tm.team != COLOR_SPECTATOR) + ++teams_count; + + float layout = cvar("hud_panel_modicons_dom_layout"); + float rows, columns, aspect_ratio; + rows = mySize_y/mySize_x; + aspect_ratio = (layout) ? 3 : 1; + rows = bound(1, floor((sqrt((4 * aspect_ratio * teams_count + rows) * rows) + rows + 0.5) / 2), teams_count); + columns = ceil(teams_count/rows); + + drawfont = hud_bigfont; + int i; + float row, column; + for(i=0; i= rows) + { + row = 0; + ++column; + } + } + drawfont = hud_font; +} + float mod_prev; // previous state of mod_active to check for a change float mod_alpha; float mod_change; // "time" when mod_active changed void HUD_ModIcons(void) { - if(!autocvar_hud_panel_modicons && !autocvar__hud_configure) - return; - - if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && !autocvar__hud_configure) - return; + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_modicons) return; + if (gametype != GAME_CTF && gametype != GAME_KEYHUNT && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_CA && gametype != GAME_FREEZETAG && gametype != GAME_KEEPAWAY && gametype != GAME_DOMINATION) return; + } + else + hud_configure_active_panel = HUD_PANEL_MODICONS; - active_panel = HUD_PANEL_MODICONS; HUD_Panel_UpdateCvars(modicons); vector pos, mySize; pos = panel_pos; @@ -4540,21 +4876,27 @@ void HUD_ModIcons(void) HUD_Mod_NexBall(pos, mySize); else if(gametype == GAME_CTS || gametype == GAME_RACE) HUD_Mod_Race(pos, mySize); - else if(gametype == GAME_CA) + else if(gametype == GAME_CA || gametype == GAME_FREEZETAG) HUD_Mod_CA(pos, mySize); + else if(gametype == GAME_DOMINATION) + HUD_Mod_Dom(pos, mySize); + else if(gametype == GAME_KEEPAWAY) + HUD_Mod_Keepaway(pos, mySize); } // Draw pressed keys (#11) // void HUD_DrawPressedKeys(void) { - if(!autocvar_hud_panel_pressedkeys && !autocvar__hud_configure) - return; + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_pressedkeys) return; + if(spectatee_status <= 0 && autocvar_hud_panel_pressedkeys < 2) return; + } + else + hud_configure_active_panel = HUD_PANEL_PRESSEDKEYS; - if(!(spectatee_status > 0 || autocvar_hud_panel_pressedkeys >= 2 || autocvar__hud_configure)) - return; - active_panel = HUD_PANEL_PRESSEDKEYS; HUD_Panel_UpdateCvars(pressedkeys); vector pos, mySize; pos = panel_pos; @@ -4568,7 +4910,7 @@ void HUD_DrawPressedKeys(void) } // force custom aspect - float aspect = cvar("hud_panel_pressedkeys_aspect"); + float aspect = autocvar_hud_panel_pressedkeys_aspect; if(aspect) { vector newSize; @@ -4592,27 +4934,33 @@ void HUD_DrawPressedKeys(void) vector keysize; keysize = eX * mySize_x * (1/3) + eY * mySize_y * 0.5; float pressedkeys; - pressedkeys = getstatf(STAT_PRESSED_KEYS); + drawpic_aspect_skin(pos, ((pressedkeys & KEY_CROUCH) ? "key_crouch_inv.tga" : "key_crouch.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawpic_aspect_skin(pos + eX * mySize_x * (1/3), ((pressedkeys & KEY_FORWARD) ? "key_forward_inv.tga" : "key_forward.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawpic_aspect_skin(pos + eX * mySize_x * (2/3), ((pressedkeys & KEY_JUMP) ? "key_jump_inv.tga" : "key_jump.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawpic_aspect_skin(pos + eY * 0.5 * mySize_y, ((pressedkeys & KEY_LEFT) ? "key_left_inv.tga" : "key_left.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawpic_aspect_skin(pos + eY * 0.5 * mySize_y + eX * mySize_x * (1/3), ((pressedkeys & KEY_BACKWARD) ? "key_backward_inv.tga" : "key_backward.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawpic_aspect_skin(pos + eY * 0.5 * mySize_y + eX * mySize_x * (2/3), ((pressedkeys & KEY_RIGHT) ? "key_right_inv.tga" : "key_right.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(pos + eX * keysize_x, ((pressedkeys & KEY_FORWARD) ? "key_forward_inv.tga" : "key_forward.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(pos + eX * keysize_x * 2, ((pressedkeys & KEY_JUMP) ? "key_jump_inv.tga" : "key_jump.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + pos_y += keysize_y; + drawpic_aspect_skin(pos, ((pressedkeys & KEY_LEFT) ? "key_left_inv.tga" : "key_left.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(pos + eX * keysize_x, ((pressedkeys & KEY_BACKWARD) ? "key_backward_inv.tga" : "key_backward.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(pos + eX * keysize_x * 2, ((pressedkeys & KEY_RIGHT) ? "key_right_inv.tga" : "key_right.tga"), keysize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); } // Handle chat as a panel (#12) // void HUD_Chat(void) { - if(!autocvar_hud_panel_chat && !autocvar__hud_configure) + if(!autocvar__hud_configure) { - cvar_set("con_chatrect", "0"); - return; + if (!autocvar_hud_panel_chat) + { + if (!autocvar_con_chatrect) + cvar_set("con_chatrect", "0"); + return; + } } + else + hud_configure_active_panel = HUD_PANEL_CHAT; - active_panel = HUD_PANEL_CHAT; HUD_Panel_UpdateCvars(chat); if(autocvar__con_chat_maximized && !autocvar__hud_configure) // draw at full screen height if maximized @@ -4643,27 +4991,29 @@ void HUD_Chat(void) mySize -= '2 2 0' * panel_bg_padding; } - cvar_set("con_chatrect", "1"); + if (!autocvar_con_chatrect) + cvar_set("con_chatrect", "1"); cvar_set("con_chatrect_x", ftos(pos_x/vid_conwidth)); cvar_set("con_chatrect_y", ftos(pos_y/vid_conheight)); cvar_set("con_chatwidth", ftos(mySize_x/vid_conwidth)); - cvar_set("con_chat", ftos(floor(mySize_y/cvar("con_chatsize") - 0.5))); + cvar_set("con_chat", ftos(floor(mySize_y/autocvar_con_chatsize - 0.5))); if(autocvar__hud_configure) { - float chatsize; - chatsize = cvar("con_chatsize"); + vector chatsize; + chatsize = '1 1 0' * autocvar_con_chatsize; cvar_set("con_chatrect_x", "9001"); // over 9000, we'll fake it instead for more control over alpha and such float i, a; - for(i = 0; i < cvar("con_chat"); ++i) + for(i = 0; i < autocvar_con_chat; ++i) { - if(i == cvar("con_chat") - 1) + if(i == autocvar_con_chat - 1) a = panel_fg_alpha; else - a = panel_fg_alpha * floor(((i + 1) * 7 + cvar("con_chattime"))/45); - drawcolorcodedstring(pos + eY * i * chatsize, textShortenToWidth("^3Player^7: This is the chat area.", mySize_x, '1 1 0' * chatsize, stringwidth_colors), '1 1 0' * chatsize, a, DRAWFLAG_NORMAL); + a = panel_fg_alpha * floor(((i + 1) * 7 + autocvar_con_chattime)/45); + drawcolorcodedstring(pos, textShortenToWidth("^3Player^7: This is the chat area.", mySize_x, chatsize, stringwidth_colors), chatsize, a, DRAWFLAG_NORMAL); + pos_y += chatsize_y; } } } @@ -4679,10 +5029,13 @@ float frametimeavg1; // 1 frame ago float frametimeavg2; // 2 frames ago void HUD_EngineInfo(void) { - if(!autocvar_hud_panel_engineinfo && !autocvar__hud_configure) - return; + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_engineinfo) return; + } + else + hud_configure_active_panel = HUD_PANEL_ENGINEINFO; - active_panel = HUD_PANEL_ENGINEINFO; HUD_Panel_UpdateCvars(engineinfo); vector pos, mySize; pos = panel_pos; @@ -4716,7 +5069,7 @@ void HUD_EngineInfo(void) else { framecounter += 1; - if(currentTime - prevfps_time > cvar("hud_panel_engineinfo_framecounter_time")) + if(currentTime - prevfps_time > autocvar_hud_panel_engineinfo_framecounter_time) { prevfps = framecounter/(currentTime - prevfps_time); framecounter = 0; @@ -4727,7 +5080,7 @@ void HUD_EngineInfo(void) vector color; color = HUD_Get_Num_Color (prevfps, 100); drawfont = hud_bigfont; - drawstring_aspect(pos, strcat("FPS: ", ftos_decimals(prevfps, cvar("hud_panel_engineinfo_framecounter_decimals"))), mySize, color, panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring_aspect(pos, strcat("FPS: ", ftos_decimals(prevfps, autocvar_hud_panel_engineinfo_framecounter_decimals)), mySize, color, panel_fg_alpha, DRAWFLAG_NORMAL); drawfont = hud_font; } @@ -4740,10 +5093,13 @@ void HUD_EngineInfo(void) o_y += fontsize_y; void HUD_InfoMessages(void) { - if(!autocvar_hud_panel_infomessages && !autocvar__hud_configure) - return; + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_infomessages) return; + } + else + hud_configure_active_panel = HUD_PANEL_INFOMESSAGES; - active_panel = HUD_PANEL_INFOMESSAGES; HUD_Panel_UpdateCvars(infomessages); vector pos, mySize; pos = panel_pos; @@ -4917,108 +5273,218 @@ void HUD_InfoMessages(void) } } -/* -================== -Main HUD system -================== -*/ +// Physics panel (#15) +// +vector acc_prevspeed; +float acc_prevtime, acc_avg, top_speed, top_speed_time; -void HUD_ShowSpeed(void) +void HUD_Physics(void) { - vector numsize; - float pos, conversion_factor; - string speed, zspeed, unit; + if(!autocvar_hud_panel_physics) + { + if(!autocvar__hud_configure) return; + } + else + hud_configure_active_panel = HUD_PANEL_PHYSICS; + + HUD_Panel_UpdateCvars(physics); + + HUD_Panel_DrawBg(1); + if(panel_bg_padding) + { + panel_pos += '1 1 0' * panel_bg_padding; + panel_size -= '2 2 0' * panel_bg_padding; + } + + //compute speed + float speed, conversion_factor; + string unit; - switch(cvar("cl_showspeed_unit")) + switch(autocvar_cl_showspeed_unit) { default: - case 0: - unit = ""; - conversion_factor = 1.0; - break; case 1: - unit = " qu/s"; + unit = "qu/s"; conversion_factor = 1.0; break; case 2: - unit = " m/s"; + unit = "m/s"; conversion_factor = 0.0254; break; case 3: - unit = " km/h"; + unit = "km/h"; conversion_factor = 0.0254 * 3.6; break; case 4: - unit = " mph"; + unit = "mph"; conversion_factor = 0.0254 * 3.6 * 0.6213711922; break; case 5: - unit = " knots"; + unit = "knots"; conversion_factor = 0.0254 * 1.943844492; // 1 m/s = 1.943844492 knots, because 1 knot = 1.852 km/h break; } - speed = strcat(ftos(floor( vlen(pmove_vel - pmove_vel_z * '0 0 1') * conversion_factor + 0.5 )), unit); + float max_speed = floor( autocvar_hud_panel_physics_speed_max * conversion_factor + 0.5 ); + if (autocvar__hud_configure) + speed = floor( max_speed * 0.65 + 0.5 ); + else if(autocvar_hud_panel_physics_speed_z) + speed = floor( vlen(pmove_vel) * conversion_factor + 0.5 ); + else + speed = floor( vlen(pmove_vel - pmove_vel_z * '0 0 1') * conversion_factor + 0.5 ); - numsize_x = numsize_y = cvar("cl_showspeed_size"); - pos = (vid_conheight - numsize_y) * cvar("cl_showspeed_position"); + //compute acceleration + float acceleration, f; + if (autocvar__hud_configure) + acceleration = autocvar_hud_panel_physics_acceleration_max * 0.3; + else + { + f = time - acc_prevtime; + if(autocvar_hud_panel_physics_acceleration_z) + acceleration = (vlen(pmove_vel) - vlen(acc_prevspeed)) * (1 / f); + else + acceleration = (vlen(pmove_vel - '0 0 1' * pmove_vel_z) - vlen(acc_prevspeed - '0 0 1' * acc_prevspeed_z)) * (1 / f); + acc_prevspeed = pmove_vel; + acc_prevtime = time; - drawfont = hud_bigfont; - drawstringcenter(eX + pos * eY, speed, numsize, '1 1 1', autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL); + f = bound(0, f * 10, 1); + acc_avg = acc_avg * (1 - f) + acceleration * f; + acceleration = acc_avg / getstatf(STAT_MOVEVARS_MAXSPEED); + } - if (cvar("cl_showspeed_z") == 1) { - zspeed = strcat(ftos(fabs(floor( pmove_vel_z * conversion_factor + 0.5 ))), unit); - drawstringcenter(eX + pos * eY + numsize_y * eY, zspeed, numsize * 0.5, '1 1 1', autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL); + //compute layout + drawfont = hud_bigfont; + float panel_ar = panel_size_x/panel_size_y; + vector speed_offset, acceleration_offset; + if (panel_ar >= 5) + { + panel_size_x *= 0.5; + if (autocvar_hud_panel_physics_flip) + speed_offset_x = panel_size_x; + else + acceleration_offset_x = panel_size_x; + } + else + { + panel_size_y *= 0.5; + if (autocvar_hud_panel_physics_flip) + speed_offset_y = panel_size_y; + else + acceleration_offset_y = panel_size_y; + } + float speed_baralign, acceleration_baralign; + if (autocvar_hud_panel_physics_baralign == 1) + acceleration_baralign = speed_baralign = 1; + else if (autocvar_hud_panel_physics_flip) + { + acceleration_baralign = (autocvar_hud_panel_physics_baralign == 2); + speed_baralign = (autocvar_hud_panel_physics_baralign == 3); + } + else + { + speed_baralign = (autocvar_hud_panel_physics_baralign == 2); + acceleration_baralign = (autocvar_hud_panel_physics_baralign == 3); } - drawfont = hud_font; -} + //draw speed + if(speed && autocvar_hud_panel_physics_progressbar) + { + HUD_Panel_GetProgressBarColor(speed); + HUD_Panel_DrawProgressBar(panel_pos + speed_offset, panel_size, "progressbar", speed/max_speed, 0, speed_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + } -vector acc_prevspeed; -float acc_prevtime; -float acc_avg; + vector tmp_offset, tmp_size; + tmp_size_x = panel_size_x * 0.75; + tmp_size_y = panel_size_y; + if (speed_baralign) + tmp_offset_x = panel_size_x - tmp_size_x; + //else + //tmp_offset_x = 0; + drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(speed), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); -void HUD_ShowAcceleration(void) -{ - float acceleration, sz, scale, alpha, f; - vector pos, top, rgb; - top_x = vid_conwidth/2; - top_y = 0; - - f = time - acc_prevtime; - if(cvar("cl_showacceleration_z")) - acceleration = (vlen(pmove_vel) - vlen(acc_prevspeed)) * (1 / f); + //draw speed unit + if (speed_baralign) + tmp_offset_x = 0; else - acceleration = (vlen(pmove_vel - '0 0 1' * pmove_vel_z) - vlen(acc_prevspeed - '0 0 1' * acc_prevspeed_z)) * (1 / f); - acc_prevspeed = pmove_vel; - acc_prevtime = time; - - f = bound(0, f * 10, 1); - acc_avg = acc_avg * (1 - f) + acceleration * f; - acceleration = acc_avg / getstatf(STAT_MOVEVARS_MAXSPEED); - if (acceleration == 0) - return; + tmp_offset_x = tmp_size_x; + if (autocvar_hud_panel_physics_speed_unit_show) + { + //tmp_offset_y = 0; + tmp_size_x = panel_size_x * (1 - 0.75); + tmp_size_y = panel_size_y * 0.4; + drawstring_aspect(panel_pos + speed_offset + tmp_offset, unit, tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + } - pos = top - sz/2 * eY + (cvar("cl_showacceleration_position") * vid_conheight) * eY; + //compute and draw top speed + if (autocvar_hud_panel_physics_topspeed) + { + if (autocvar__hud_configure) + { + top_speed = floor( max_speed * 0.75 + 0.5 ); + f = 1; + } + else + { + if (speed >= top_speed) + { + top_speed = speed; + top_speed_time = time; + } + if (top_speed == 0) //hide top speed 0, it would be stupid + f = 0; + else + { + f = max(1, autocvar_hud_panel_physics_topspeed_time); + // divide by f to make it start from 1 + f = cos( ((time - top_speed_time) / f) * PI/2 ); + } + } + if (f > 0) + { + //top speed progressbar peek + if(autocvar_hud_panel_physics_progressbar && speed < top_speed) + { + float peek_offset_x, peek_size_x; + if (speed_baralign) + peek_offset_x = (1 - min(top_speed, max_speed)/max_speed) * panel_size_x; + else + peek_offset_x = min(top_speed, max_speed)/max_speed * panel_size_x; + //if speed is not 0 the speed progressbar already fetched the color + if (speed == 0) + HUD_Panel_GetProgressBarColor(speed); + peek_size_x = panel_size_x * 0.01; + drawfill(panel_pos + speed_offset + eX * (peek_offset_x - peek_size_x), eX * peek_size_x + eY * panel_size_y, progressbar_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + } - sz = cvar("cl_showacceleration_size"); - scale = cvar("cl_showacceleration_scale"); - alpha = cvar("cl_showacceleration_alpha"); - if (cvar("cl_showacceleration_color_custom")) - rgb = stov(cvar_string("cl_showacceleration_color")); - else { - if (acceleration < 0) - rgb = '1 .5 .5' - '0 .5 .5' * bound(0, -acceleration * 0.2, 1); + //top speed + tmp_offset_y = panel_size_y * 0.4; + tmp_size_x = panel_size_x * (1 - 0.75); + tmp_size_y = panel_size_y - tmp_offset_y; + drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(top_speed), tmp_size, '1 0 0', f * panel_fg_alpha, DRAWFLAG_NORMAL); + } else - rgb = '.5 1 .5' - '.5 0 .5' * bound(0, +acceleration * 0.2, 1); + top_speed = 0; } - if (acceleration > 0) - HUD_Panel_DrawProgressBar(pos, 0, acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL); - else - HUD_Panel_DrawProgressBar(pos + acceleration * scale * '40 0 0', 0, -acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * autocvar_hud_panel_fg_alpha * hud_fade_alpha, DRAWFLAG_NORMAL); + //draw acceleration + if(acceleration && autocvar_hud_panel_physics_progressbar) + { + if (acceleration < 0) + HUD_Panel_GetProgressBarColor(acceleration_neg); + else + HUD_Panel_GetProgressBarColor(acceleration); + HUD_Panel_DrawProgressBar(panel_pos + acceleration_offset, panel_size, "progressbar", fabs(acceleration)/autocvar_hud_panel_physics_acceleration_max, 0, acceleration_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + } + drawstring_aspect(panel_pos + acceleration_offset, ftos_decimals(acceleration, 3), panel_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawfont = hud_font; } +/* +================== +Main HUD system +================== +*/ + void HUD_Reset (void) { // reset gametype specific icons @@ -5060,6 +5526,8 @@ switch (id) {\ HUD_EngineInfo(); break;\ case (HUD_PANEL_INFOMESSAGES):\ HUD_InfoMessages(); break;\ + case (HUD_PANEL_PHYSICS):\ + HUD_Physics(); break;\ } ENDS_WITH_CURLY_BRACE void HUD_Main (void) @@ -5079,32 +5547,30 @@ void HUD_Main (void) else if(autocvar__menu_alpha == 0 && scoreboard_fade_alpha == 0) hud_fade_alpha = 1; - hud_fontsize = HUD_GetFontsize("hud_fontsize"); - if(!autocvar__hud_configure && !hud_fade_alpha) return; // Drawing stuff - if (hud_skin_path != cvar_string("hud_skin")) + if (hud_skin_path != autocvar_hud_skin) { if (hud_skin_path) strunzone(hud_skin_path); - hud_skin_path = strzone(strcat("gfx/hud/", cvar_string("hud_skin"))); + hud_skin_path = strzone(strcat("gfx/hud/", autocvar_hud_skin)); } // HUD configure visible grid if(autocvar__hud_configure && autocvar_hud_configure_grid && autocvar_hud_configure_grid_alpha) { + hud_configure_gridSize_x = bound(0.005, cvar("hud_configure_grid_xsize"), 0.2); + hud_configure_gridSize_y = bound(0.005, cvar("hud_configure_grid_ysize"), 0.2); + hud_configure_realGridSize_x = hud_configure_gridSize_x * vid_conwidth; + hud_configure_realGridSize_y = hud_configure_gridSize_y * vid_conheight; // x-axis - for(i = 0; i < 1/bound(0.005, autocvar_hud_configure_grid_xsize, 0.2); ++i) - { - drawfill(eX * i * vid_conwidth * bound(0.005, autocvar_hud_configure_grid_xsize, 0.2), eX + eY * vid_conheight, '0.5 0.5 0.5', autocvar_hud_configure_grid_alpha, DRAWFLAG_NORMAL); - } + for(i = 0; i < 1/hud_configure_gridSize_x; ++i) + drawfill(eX * i * hud_configure_realGridSize_x, eX + eY * vid_conheight, '0.5 0.5 0.5', autocvar_hud_configure_grid_alpha, DRAWFLAG_NORMAL); // y-axis - for(i = 0; i < 1/bound(0.005, autocvar_hud_configure_grid_ysize, 0.2); ++i) - { - drawfill(eY * i * vid_conheight * bound(0.005, autocvar_hud_configure_grid_ysize, 0.2), eY + eX * vid_conwidth, '0.5 0.5 0.5', autocvar_hud_configure_grid_alpha, DRAWFLAG_NORMAL); - } + for(i = 0; i < 1/hud_configure_gridSize_y; ++i) + drawfill(eY * i * hud_configure_realGridSize_y, eY + eX * vid_conwidth, '0.5 0.5 0.5', autocvar_hud_configure_grid_alpha, DRAWFLAG_NORMAL); } // draw the dock @@ -5112,7 +5578,7 @@ void HUD_Main (void) { float f; vector color; - float hud_dock_color_team = cvar("hud_dock_color_team"); + float hud_dock_color_team = autocvar_hud_dock_color_team; if((teamplay) && hud_dock_color_team) { f = stof(getplayerkey(player_localentnum - 1, "colors")); color = colormapPaletteColor(mod(f, 16), 1) * hud_dock_color_team; @@ -5122,7 +5588,7 @@ void HUD_Main (void) } else { - string hud_dock_color = cvar_string("hud_dock_color"); + string hud_dock_color = autocvar_hud_dock_color; if(hud_dock_color == "shirt") { f = stof(getplayerkey(player_localentnum - 1, "colors")); color = colormapPaletteColor(floor(f / 16), 0); @@ -5143,19 +5609,50 @@ void HUD_Main (void) pic = "gfx/hud/default/dock_medium"; } } - drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, cvar("hud_dock_alpha") * hud_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock... + drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, autocvar_hud_dock_alpha * hud_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock... } // cache the panel order into the panel_order array if(autocvar__hud_panelorder != hud_panelorder_prev) { + for(i = 0; i < HUD_PANEL_NUM; ++i) + panel_order[i] = -1; + string s; + float p_num, warning; + float argc = tokenize_console(autocvar__hud_panelorder); + if (argc > HUD_PANEL_NUM) + warning = true; + //first detect wrong/missing panel numbers + for(i = 0; i < HUD_PANEL_NUM; ++i) { + p_num = stof(argv(i)); + if (p_num >= 0 && p_num < HUD_PANEL_NUM) { //correct panel number? + if (panel_order[p_num] == -1) //found for the first time? + s = strcat(s, ftos(p_num), " "); + panel_order[p_num] = 1; //mark as found + } + else + warning = true; + } + for(i = 0; i < HUD_PANEL_NUM; ++i) { + if (panel_order[i] == -1) { + warning = true; + s = strcat(s, ftos(i), " "); //add missing panel number + } + } + if (warning) + print("Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"); + + cvar_set("_hud_panelorder", s); if(hud_panelorder_prev) strunzone(hud_panelorder_prev); - hud_panelorder_prev = strzone(autocvar__hud_panelorder); - tokenize_console(autocvar__hud_panelorder); + hud_panelorder_prev = strzone(s); + + //now properly set panel_order + tokenize_console(s); for(i = 0; i < HUD_PANEL_NUM; ++i) { panel_order[i] = stof(argv(i)); } } + // draw panels in order specified by panel_order array for(i = HUD_PANEL_NUM - 1; i >= 0; --i) { if(i != HUD_PANEL_CHAT || !autocvar__con_chat_maximized) // don't draw maximized chat panel twice! @@ -5166,15 +5663,15 @@ void HUD_Main (void) if(autocvar__con_chat_maximized) HUD_Chat(); // HUD_DrawPanel(HUD_PANEL_CHAT); - // TODO hud_'ify these - if (cvar("cl_showspeed")) - HUD_ShowSpeed(); - if (cvar("cl_showacceleration")) - HUD_ShowAcceleration(); - if (autocvar__hud_configure && spectatee_status && hud_configure_prev == -1) // try to join if we are in hud_configure mode, but still spectating, and in the first frame (in order to get rid of motd when launching a server via the menu "HUD Setup" button) localcmd("cmd selectteam auto; cmd join\n"); + if(autocvar__hud_configure && tab_panel != -1) + { + HUD_Panel_UpdatePosSizeForId(tab_panel) + drawfill(panel_pos - '1 1 0' * panel_bg_border, panel_size + '2 2 0' * panel_bg_border, '1 1 1', .2, DRAWFLAG_NORMAL); + } + hud_configure_prev = autocvar__hud_configure; if (!autocvar__hud_configure) // hud config mode disabled, enable normal alpha stuff again