X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud.qc;h=8f20c6d6c8a99e43251cfb877c3046d22950bd19;hb=c44aaef210fffaba1be59c27e9f5b15b31588f7a;hp=52c70eb513560187ffcfb30aaa5f8efd79d95864;hpb=8c5371ef493c42635bdb7bd9b2d2b7361b0cc037;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index 52c70eb51..8f20c6d6c 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -573,7 +573,6 @@ void HUD_Panel_ExportCfg(string cfgname) fputs(fh, strcat("seta hud_bg_alpha ", ftos(cvar("hud_bg_alpha")), "\n")); fputs(fh, strcat("seta hud_bg_border ", ftos(cvar("hud_bg_border")), "\n")); fputs(fh, strcat("seta hud_fg_alpha ", ftos(cvar("hud_fg_alpha")), "\n")); - fputs(fh, strcat("seta hud_accuracy_yellow ", ftos(cvar("hud_accuracy_yellow")), "\n")); fputs(fh, "\n"); fputs(fh, strcat("seta hud_dock \"", cvar_string("hud_dock"), "\"", "\n")); @@ -610,9 +609,11 @@ void HUD_Panel_ExportCfg(string cfgname) break; case 2: fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_flip ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_flip"))), "\n")); + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_mirror ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_mirror"))), "\n")); break; case 3: fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_flip ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_flip"))), "\n")); + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_mirror ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_mirror"))), "\n")); break; case 9: fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_alreadyvoted_alpha ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_alreadyvoted_alpha"))), "\n")); @@ -636,14 +637,14 @@ vector HUD_Panel_CheckLimitSize(float id, vector mySize) case 1: mySize_x = max(mySize_y * 0.7, mySize_x); // at least 0.7 * height break; - case 2: - mySize_x = max(mySize_y * 1.5, mySize_x); // at least 2 * height - break; - case 3: - mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height - break; + //case 2: + // mySize_x = max(mySize_y * 1.5, mySize_x); // at least 1.5 * height + // break; + //case 3: + // mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height + // break; case 5: - mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height + mySize_y = (1/4.1) * mySize_x; // 1/4.1 * width, trial and error... break; case 7: mySize_y = (1/4) * mySize_x; // 1/4 * width @@ -997,7 +998,7 @@ void HUD_Panel_Mouse() mousepos_x = bound(0, mousepos_x, vid_conwidth); mousepos_y = bound(0, mousepos_y, vid_conheight); - drawpic_skin(mousepos, "gfx/menu/default/cursor.tga", '32 32 0', '1 1 1', 1, hud_alpha_fg); + drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL); if(mouseClicked) { @@ -1126,12 +1127,13 @@ float weaponorder_cmp(float i, float j, entity pass) void HUD_WeaponIcons() { + float id = 0; float alpha, height, accuracybar_height, stat_weapons; // "constants" vector pos, mySize, mysize, mypos, accuracy_color; - float i, id, fade, weapon_stats, weapon_hit, weapon_damage, weapon_cnt; // variables + float i, weapid, fade, weapon_stats, weapon_hit, weapon_damage, weapon_cnt; // variables - pos = HUD_Panel_GetPos(0); - mySize = HUD_Panel_GetSize(0); + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); accuracybar_height = cvar_or("hud_weaponicons_accuracy_height", 3); stat_weapons = getstati(STAT_WEAPONS); @@ -1146,7 +1148,7 @@ void HUD_WeaponIcons() } heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world); - HUD_Panel_DrawBg(0, pos, mySize); + HUD_Panel_DrawBg(id, pos, mySize); // hits weapon_stats = getstati(STAT_DAMAGE_HITS); @@ -1179,7 +1181,7 @@ void HUD_WeaponIcons() self = weaponorder[i]; if((self.weapons && (self.impulse >= 0) && (stat_weapons & self.weapons)) || hud_configure) { - id = self.impulse; + weapid = self.impulse; alpha = (self.weapon == activeweapon) ? 1 : 0.6; @@ -1187,11 +1189,11 @@ void HUD_WeaponIcons() weapon_damage = weapon_fired[self.weapon-WEP_FIRST]; if(self.weapon == activeweapon) - drawpic_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), "ammobg", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), strcat("weapon", self.netname), eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), "weapon_current_bg", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), strcat("gfx/weapons/weapon", self.netname), eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL); if(cvar_or("hud_weaponicons_number", 1)) - drawstring(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), ftos(id), '1 1 0' * 0.5 * mySize_y*(1/rows), '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawstring(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), ftos(weapid), '1 1 0' * 0.5 * mySize_y*(1/rows), '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); // draw the weapon accuracy on the HUD if(hud_accuracy_hud && !(gametype == GAME_RACE || gametype == GAME_CTS)) @@ -1248,25 +1250,26 @@ string GetAmmoPicture(float i) { switch(i) { - case 0: return "shells"; - case 1: return "bullets"; - case 2: return "rocket"; - case 3: return "cells"; - case 4: return "fuel"; + case 0: return "ammo_shells"; + case 1: return "ammo_bullets"; + case 2: return "ammo_rocket"; + case 3: return "ammo_cells"; + case 4: return "ammo_fuel"; default: return ""; } } void HUD_Inventory() { + float id = 1; float i; float stat_items; vector pos, mySize, mysize, mypos; - pos = HUD_Panel_GetPos(1); - mySize = HUD_Panel_GetSize(1); + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); - HUD_Panel_DrawBg(1, pos, mySize); + HUD_Panel_DrawBg(id, pos, mySize); // ammo stat_items = getstati(STAT_ITEMS); @@ -1278,7 +1281,7 @@ void HUD_Inventory() if(cvar("hud_inventory_onlycurrent")) { if (stat_items & GetAmmoItemCode(i)) { - drawpic_skin(pos, "ammobg", mySize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos, "ammo_current_bg", mySize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); drawpic_skin(pos + eY * 0.05 * mySize_y, GetAmmoPicture(i), '1 1 0' * 0.8 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); if(a < 10) HUD_DrawXNum(pos + eX * 0.8 * mySize_y + eY * 0.25 * mySize_y, a, strlen(ftos(a)), 0, 0.5 * mySize_y, '0.7 0 0', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); @@ -1317,7 +1320,7 @@ void HUD_Inventory() } if (stat_items & GetAmmoItemCode(i)) - drawpic_skin(mypos, "ammobg", mysize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(mypos, "ammo_current_bg", mysize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); drawpic_skin(mypos + eY * 0.05 * mysize_y, GetAmmoPicture(i), '1 1 0' * 0.8 * mysize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); if (a < 10) { if(stat_items & GetAmmoItemCode(i)) @@ -1340,6 +1343,7 @@ void HUD_Inventory() float shield_maxtime; float strength_maxtime; void HUD_Powerups() { + float id = 2; float stat_items; stat_items = getstati(STAT_ITEMS); @@ -1354,10 +1358,10 @@ void HUD_Powerups() { } vector pos, mySize; - pos = HUD_Panel_GetPos(2); - mySize = HUD_Panel_GetSize(2); + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); - HUD_Panel_DrawBg(2, pos, mySize); + HUD_Panel_DrawBg(id, pos, mySize); float strength_time, shield_time; @@ -1370,10 +1374,16 @@ void HUD_Powerups() { shield_time = 27; } + float len; + + vector barpos, barsize; + vector picpos; + vector numpos; + string leftname, rightname; float leftcnt, rightcnt; float leftalpha, rightalpha; - if (cvar(strcat("hud_", HUD_Panel_GetName(2), "_flip"))) { + if (cvar(strcat("hud_", HUD_Panel_GetName(id), "_flip"))) { leftname = "strength"; leftcnt = strength_time; @@ -1389,43 +1399,93 @@ void HUD_Powerups() { leftalpha = bound(0, leftcnt, 1); rightalpha = bound(0, rightcnt, 1); - float len; - if (mySize_x/mySize_y > 5) + // TODO: tile statusbars? + if (mySize_x/mySize_y > 4) { if(leftcnt) { len = strlen(ftos(leftcnt)); - drawpic_skin(pos, "statusbar", eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos, strcat("", leftname), '1 1 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * mySize_y + eY * 0.25 * mySize_y, leftcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + 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; + picpos = pos + eX * 0.5 * mySize_x - eX * mySize_y; + numpos = picpos - eX * 2 * 0.5 * mySize_y + eX * (2-len) * 0.5 * mySize_y + eY * 0.25 * mySize_y; + } else { + barpos = pos; + barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y; + picpos = pos; + numpos = picpos + eX * mySize_y - eX * (2-len) * 0.5 * mySize_y + eY * 0.25 * mySize_y; + } + + drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, leftname, '1 1 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum(numpos, leftcnt, 2, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); } if(rightcnt) { - drawpic_skin(pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/30), "statusbar", eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * mySize_x - eX * mySize_y, strcat("", rightname), '1 1 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * mySize_x - eX * 2.5 * mySize_y + eY * 0.25 * mySize_y, rightcnt, 3, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + len = strlen(ftos(rightcnt)); + + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + barpos = pos + eX * 0.5 * mySize_x; + barsize = eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y; + picpos = pos + eX * 0.5 * mySize_x; + numpos = picpos + eX * mySize_y - eX * (2-len) * 0.5 * mySize_y + eY * 0.25 * mySize_y; + } else { + 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; + picpos = pos + eX * mySize_x - eX * mySize_y; + numpos = picpos - eX * mySize_y + eY * 0.25 * mySize_y; + } + + drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, rightname, '1 1 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum(numpos, rightcnt, 2, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); } } - else if (mySize_x/mySize_y > 3.2) + else if (mySize_x/mySize_y > 1.5) { if(leftcnt) { len = strlen(ftos(leftcnt)); - drawpic_skin(pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/30), "statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30), HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * 0.4 * mySize_y, strcat("", leftname), '0.7 0.7 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * ((3-len)/2) * 0.5 * mySize_y + eY * 0.55 * mySize_y, leftcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + 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; + picpos = pos + eX * mySize_x - eX * 0.5 * mySize_y; + numpos = picpos - eX * len * 0.5 * mySize_y; + } else { + barpos = pos; + barsize = eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y; + picpos = pos; + numpos = picpos + eX * 0.5 * mySize_y; + } + + drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, leftname, '0.5 0.5 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum(numpos, leftcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); } if(rightcnt) { len = strlen(ftos(rightcnt)); - - drawpic_skin(pos + eX * 0.5 * mySize_x + eY * mySize_y - eY * mySize_y * min(1, rightcnt/30), "statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30), HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * mySize_x - eX * 1.1 * mySize_y, strcat("", rightname), '0.7 0.7 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * mySize_x - eX * len * 0.5 * mySize_y - eX * ((3-len)/2) * 0.5 * mySize_y + eY * 0.55 * mySize_y, rightcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + 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; + picpos = pos + eX * mySize_x - eX * 0.5 * mySize_y + eY * 0.5 * mySize_y; + numpos = picpos - eX * len * 0.5 * mySize_y; + } else { + barpos = pos + eY * 0.5 * mySize_y; + barsize = eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y; + picpos = pos + eY * 0.5 * mySize_y; + numpos = picpos + eX * 0.5 * mySize_y; + } + + drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, rightname, '0.5 0.5 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum(numpos, rightcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); } } else @@ -1434,22 +1494,46 @@ void HUD_Powerups() { { len = strlen(ftos(leftcnt)); - drawpic_skin(pos, "statusbar", eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos, strcat("", leftname), '0.5 0.5 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * 0.5 * mySize_y, leftcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + barpos = pos; + barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30); + picpos = pos + eX * 0.05 * mySize_x; + numpos = pos + eX * ((2-len)/2) * 0.25 * mySize_x + eY * 0.4 * mySize_x; + } else { + 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); + picpos = pos + eX * 0.05 * mySize_x + eY * mySize_y - eY * 0.65 * mySize_x; + numpos = pos + eX * ((2-len)/2) * 0.25 * mySize_x + eY * mySize_y - eY * 0.25 * mySize_x; + } + + drawpic_skin(barpos, "statusbar_vertical", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum(numpos, leftcnt, len, 0, 0.25 * mySize_x, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); } if(rightcnt) { len = strlen(ftos(rightcnt)); - drawpic_skin(pos + eY * 0.5 * mySize_y, "statusbar", eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos + eY * 0.5 * mySize_y, strcat("", rightname), '0.5 0.5 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * 0.5 * mySize_y + eY * 0.5 * mySize_y, rightcnt, len, 0, 0.5 * mySize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + barpos = pos + eX * 0.5 * mySize_x; + barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30); + picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x; + numpos = pos + eX * ((2-len)/2) * 0.25 * mySize_x + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x; + } else { + 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); + picpos = pos + eX * 0.05 * mySize_x + eY * mySize_y - eY * 0.65 * mySize_x + eX * 0.5 * mySize_x; + numpos = pos + eX * ((2-len)/2) * 0.25 * mySize_x + eY * mySize_y - eY * 0.25 * mySize_x + eX * 0.5 * mySize_x; + } + + drawpic_skin(barpos, "statusbar_vertical", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum(numpos, rightcnt, len, 0, 0.25 * mySize_x, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); } } - /* TODO: add expand! + /* TODO: add expand from old code! //strength if (strength_time) { dt = strength_time - time; @@ -1502,19 +1586,25 @@ void HUD_Powerups() { // void HUD_HealthArmor(void) { + float id = 3; vector pos, mySize; - pos = HUD_Panel_GetPos(3); - mySize = HUD_Panel_GetSize(3); + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); - HUD_Panel_DrawBg(3, pos, mySize); + HUD_Panel_DrawBg(id, pos, mySize); float armor, health, x; armor = getstati(STAT_ARMOR); health = getstati(STAT_HEALTH); + + float fuel; + fuel = getstati(GetAmmoStat(4)); // how much fuel do we have? + if(hud_configure) { armor = 150; health = 100; + fuel = 70; } if(health <= 0) @@ -1551,12 +1641,16 @@ void HUD_HealthArmor(void) else { */ + vector barpos, barsize; + vector picpos; + vector numpos; + string leftname, rightname; float leftcnt, rightcnt; float leftactive, rightactive; float leftalpha, rightalpha; // TODO! - if (cvar(strcat("hud_", HUD_Panel_GetName(3), "_flip"))) { // old style layout with armor left/top of health + if (cvar(strcat("hud_", HUD_Panel_GetName(id), "_flip"))) { // old style layout with armor left/top of health leftname = "armor"; leftcnt = armor; if(leftcnt) @@ -1580,52 +1674,107 @@ void HUD_HealthArmor(void) rightalpha = min((armor+10)/55, 1); } - float fuel; - fuel = getstati(GetAmmoStat(4)); // how much fuel do we have? - + // TODO: tile statusbars? if (mySize_x/mySize_y > 5) { if(leftactive) { len = strlen(ftos(leftcnt)); - drawpic_skin(pos, "statusbar", eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos, strcat("", leftname), '1 1 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum_Colored(pos + eX * mySize_y + eY * 0.25 * mySize_y, leftcnt, len, 0.5 * mySize_y, hud_alpha_fg); + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + 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; + picpos = pos + eX * 0.5 * mySize_x - eX * mySize_y; + numpos = picpos - eX * 3 * 0.5 * mySize_y + eX * (3-len) * 0.5 * mySize_y + eY * 0.25 * mySize_y; + } else { + barpos = pos; + barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y; + picpos = pos; + numpos = picpos + eX * mySize_y + eY * 0.25 * mySize_y; + } + + drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, leftname, '1 1 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum_Colored(numpos, leftcnt, len, 0.5 * mySize_y, hud_alpha_fg); } if(rightactive) { - drawpic_skin(pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/200), "statusbar", eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * mySize_x - eX * mySize_y, strcat("", rightname), '1 1 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum_Colored(pos + eX * mySize_x - eX * 2.5 * mySize_y + eY * 0.25 * mySize_y, rightcnt, 3, 0.5 * mySize_y, hud_alpha_fg); + len = strlen(ftos(rightcnt)); + + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + barpos = pos + eX * 0.5 * mySize_x; + barsize = eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y; + picpos = pos + eX * 0.5 * mySize_x; + numpos = picpos + eX * mySize_y - eX * (3-len) * 0.5 * mySize_y + eY * 0.25 * mySize_y; + } else { + 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; + picpos = pos + eX * mySize_x - eX * mySize_y; + numpos = picpos - eX * 1.5 * mySize_y + eY * 0.25 * mySize_y; + } + + drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, rightname, '1 1 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum_Colored(numpos, rightcnt, 3, 0.5 * mySize_y, hud_alpha_fg); } if(fuel) drawpic_skin(pos, "statusbar", eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL); } - else if (mySize_x/mySize_y > 3.2) + else if (mySize_x/mySize_y > 2) { if(leftactive) { len = strlen(ftos(leftcnt)); - drawpic_skin(pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/200), "statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200), HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * 0.4 * mySize_y, strcat("", leftname), '0.7 0.7 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum_Colored(pos + eX * ((3-len)/2) * 0.5 * mySize_y + eY * 0.55 * mySize_y, leftcnt, len, 0.5 * mySize_y, hud_alpha_fg); + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + 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; + picpos = pos + eX * mySize_x - eX * 0.5 * mySize_y; + numpos = picpos - eX * len * 0.5 * mySize_y; + } else { + barpos = pos; + barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y; + picpos = pos; + numpos = picpos + eX * 0.5 * mySize_y; + } + + drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, leftname, '0.5 0.5 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum_Colored(numpos, leftcnt, len, 0.5 * mySize_y, hud_alpha_fg); } if(rightactive) { len = strlen(ftos(rightcnt)); - - drawpic_skin(pos + eX * 0.5 * mySize_x + eY * mySize_y - eY * mySize_y * min(1, rightcnt/200), "statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200), HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * mySize_x - eX * 1.1 * mySize_y, strcat("", rightname), '0.7 0.7 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum_Colored(pos + eX * mySize_x - eX * len * 0.5 * mySize_y - eX * ((3-len)/2) * 0.5 * mySize_y + eY * 0.55 * mySize_y, rightcnt, len, 0.5 * mySize_y, hud_alpha_fg); + + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + 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; + picpos = pos + eX * mySize_x - eX * 0.5 * mySize_y + eY * 0.5 * mySize_y; + numpos = picpos - eX * len * 0.5 * mySize_y; + } else { + barpos = pos + eY * 0.5 * mySize_y; + barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y; + picpos = pos + eY * 0.5 * mySize_y; + numpos = picpos + eX * 0.5 * mySize_y; + } + + drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, rightname, '0.5 0.5 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum_Colored(numpos, rightcnt, len, 0.5 * mySize_y, hud_alpha_fg); } + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + 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; + } if(fuel) - drawpic_skin(pos, "statusbar", eX * mySize_x * min(1, fuel/100) + eY * 0.15 * mySize_y, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL); + drawpic_skin(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL); } else { @@ -1633,136 +1782,489 @@ void HUD_HealthArmor(void) { len = strlen(ftos(leftcnt)); - drawpic_skin(pos, "statusbar", eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos, strcat("", leftname), '0.5 0.5 0' * mySize_y, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum_Colored(pos + eX * 0.5 * mySize_y, leftcnt, len, 0.5 * mySize_y, hud_alpha_fg); + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + barpos = pos; + barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200); + picpos = pos + eX * 0.05 * mySize_x; + numpos = pos + eX * ((3-len)/2) * 0.25 * mySize_x + eY * 0.4 * mySize_x; + } else { + 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); + picpos = pos + eX * 0.05 * mySize_x + eY * mySize_y - eY * 0.566 * mySize_x; + numpos = pos + eX * ((3-len)/2) * 0.25 * mySize_x + eY * mySize_y - eY * 0.166 * mySize_x; + } + + drawpic_skin(barpos, "statusbar_vertical", barsize, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', leftalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum_Colored(numpos, leftcnt, len, 0.166 * mySize_x, hud_alpha_fg); } if(rightactive) { len = strlen(ftos(rightcnt)); - drawpic_skin(pos + eY * 0.5 * mySize_y, "statusbar", eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic_skin(pos + eY * 0.5 * mySize_y, strcat("", rightname), '0.5 0.5 0' * mySize_y, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum_Colored(pos + eX * 0.5 * mySize_y + eY * 0.5 * mySize_y, rightcnt, len, 0.5 * mySize_y, hud_alpha_fg); + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + barpos = pos + eX * 0.5 * mySize_x; + barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200); + picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x; + numpos = pos + eX * ((3-len)/2) * 0.25 * mySize_x + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x; + } else { + 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); + picpos = pos + eX * 0.05 * mySize_x + eY * mySize_y - eY * 0.566 * mySize_x + eX * 0.5 * mySize_x; + numpos = pos + eX * ((3-len)/2) * 0.25 * mySize_x + eY * mySize_y - eY * 0.166 * mySize_x + eX * 0.5 * mySize_x; + } + + drawpic_skin(barpos, "statusbar_vertical", barsize, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); + drawpic_skin(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', rightalpha * hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum_Colored(numpos, rightcnt, len, 0.166 * mySize_x, hud_alpha_fg); } + if(cvar(strcat("hud_", HUD_Panel_GetName(id), "_mirror"))) { + 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); + } if(fuel) - drawpic_skin(pos, "statusbar", eX * mySize_x * min(1, fuel/100) + eY * 0.1 * mySize_y, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL); - //} + drawpic_skin(barpos, "statusbar_vertical", barsize, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL); } } -// Score (#7) -// -void HUD_Score() +// ___TODO___ !!! +// Notification area (#4) +void HUD_Notify (void) { + float id = 4; vector pos, mySize; - pos = HUD_Panel_GetPos(7); - mySize = HUD_Panel_GetSize(7); + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); - HUD_Panel_DrawBg(7, pos, mySize); + HUD_Panel_DrawBg(id, pos, mySize); - float score, distribution, leader; - float score_len, distr_len; - vector score_pos, secondary_score_pos, distribution_color; - entity tm, pl, me; - me = (spectatee_status > 0) ? playerslots[spectatee_status - 1] : playerslots[player_localentnum - 1]; + string s; + entity tm; + if(spectatee_status && !intermission) + { + drawfont = hud_bigfont; + if(spectatee_status == -1) + s = "^1Observing"; + else + s = GetPlayerName(spectatee_status - 1); + // spectated player name between HUD and chat area, aligned to the left + pos_x = 0; + pos_y = - 50 - hud_fontsize_spec_y; + s = textShortenToWidth(s, vid_conwidth/2.5, hud_fontsize_spec, stringwidth_colors); + drawcolorcodedstring(pos, s, hud_fontsize_spec, hud_alpha_fg, DRAWFLAG_NORMAL); + drawfont = hud_font; - if (!teamplay) { // non-teamgames - // me vector := [team/connected frags id] - pl = players.sort_next; - if(pl == me) - pl = pl.sort_next; + // spectator text in the upper right corner + if(spectatee_status == -1) + s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate"); + else + s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player"); - if(hud_configure) - distribution = 42; - else if(pl) - distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]); + if(spectatee_status == -1) + s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed"); else - distribution = 0; + s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe"); - score = me.(scores[ps_primary]); - if(hud_configure) - score = 123; + s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info"); - if(distribution >= 5) { - distribution_color = eY; - leader = 1; - } else if(distribution >= 0) { - distribution_color = '1 1 1'; - leader = 1; - } else if(distribution >= -5) - distribution_color = '1 1 0'; + if(gametype == GAME_ARENA) + s = "^1Wait for your turn to join"; + else if(gametype == GAME_LMS) + { + entity sk; + sk = playerslots[player_localentnum - 1]; + if(sk.(scores[ps_primary]) >= 666) + s = "^1Match has already begun"; + else if(sk.(scores[ps_primary]) > 0) + s = "^1You have no more lives left"; + else + s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join"); + } else - distribution_color = eX; + s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join"); - score_len = strlen(ftos(score)); - distr_len = strlen(ftos(distribution)); + //show restart countdown: + if (time < getstatf(STAT_GAMESTARTTIME)) { + float countdown; + //we need to ceil, otherwise the countdown would be off by .5 when using round() + countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time); + s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds"); + } + } + if(warmup_stage && !intermission) + { + s = "^2Currently in ^1warmup^2 stage!"; + } - HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * 0.33 * mySize_y, distribution, 3, 3, 0.33 * mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - if (leader) - drawpic_skin(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("highlight_", ftos(score_len)), eX * score_len * mySize_y + eY * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * mySize_y - eX * 3 * 0.33 * mySize_y, score, 3, 0, mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - } else { // teamgames - float max_fragcount; - max_fragcount = -99; + // move more important stuff more to the middle so its more visible - float teamnum; - for(tm = teams.sort_next; tm; tm = tm.sort_next) { - if(tm.team == COLOR_SPECTATOR || (!tm.team_size && !hud_configure)) // no players? don't display - continue; - score = tm.(teamscores[ts_primary]); - if(hud_configure) - score = 123; - leader = 0; - - score_len = strlen(ftos(score)); + string blinkcolor; + if(mod(time, 1) >= 0.5) + blinkcolor = "^1"; + else + blinkcolor = "^3"; - if (score > max_fragcount) - max_fragcount = score; + if(ready_waiting && !intermission && !spectatee_status) + { + if(ready_waiting_for_me) + { + if(warmup_stage) + s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " to end warmup"); + else + s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " once you are ready"); + } + else + { + if(warmup_stage) + s = strcat("^2Waiting for others to ready up to end warmup..."); + else + s = strcat("^2Waiting for others to ready up..."); + } + } + else if(warmup_stage && !intermission && !spectatee_status) + { + s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup"); + } + + if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger) + { + float ts_min, ts_max; + tm = teams.sort_next; + if (tm) + { + for(; tm.sort_next; tm = tm.sort_next) + { + if(!tm.team_size || tm.team == COLOR_SPECTATOR) + continue; + if(!ts_min) ts_min = tm.team_size; + else ts_min = min(ts_min, tm.team_size); + if(!ts_max) ts_max = tm.team_size; + else ts_max = max(ts_max, tm.team_size); + } + if ((ts_max - ts_min) > 1) + { + s = strcat(blinkcolor, "Teamnumbers are unbalanced!"); + tm = GetTeam(myteam, false); + if (tm) + if (tm.team != COLOR_SPECTATOR) + if (tm.team_size == ts_max) + s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust"); - if(tm.team == myteam) { - if (max_fragcount == score) - leader = 1; - if (leader) - drawpic_skin(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("highlight_", ftos(score_len)), eX * score_len * mySize_y + eY * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * mySize_y - eX * 3 * 0.33 * mySize_y, score, 3, 0, mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - } else { - if (max_fragcount == score) - leader = 1; - if (leader) - drawpic_skin(pos + eX * mySize_x - eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y * teamnum, strcat("highlight_", ftos(score_len)), eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * 0.33 * mySize_y + eY * 0.33 * mySize_y * teamnum, score, 3, 0, 0.33 * mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - teamnum += 1; } } } } -// Race timer (#8) +// Timer (#5) // -void HUD_RaceTimer (void) { +void HUD_Timer() +{ + float id = 5; vector pos, mySize; - pos = HUD_Panel_GetPos(8); - mySize = HUD_Panel_GetSize(8); + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); - HUD_Panel_DrawBg(8, pos, mySize); + HUD_Panel_DrawBg(id, pos, mySize); - drawfont = hud_bigfont; - float a, t; - string s, forcetime; + float timelimit, elapsedTime, minutes, seconds, timeleft, minutesLeft, secondsLeft; - if(hud_configure) - { - s = "0:13:37"; - drawstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, FALSE, '0.75 0.75 0' * mySize_y), s, '0.75 0.75 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - s = "^1Intermediate 1 (+15.42)"; - drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.25 * mySize_y) + eY * 0.75 * mySize_y, s, '1 1 0' * 0.25 * mySize_y, hud_alpha_fg, DRAWFLAG_NORMAL); - } - else if(race_checkpointtime) - { - a = bound(0, 2 - (time - race_checkpointtime), 1); + timelimit = getstatf(STAT_TIMELIMIT); + + timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time); + timeleft = ceil(timeleft); + minutesLeft = floor(timeleft / 60); + secondsLeft = timeleft - minutesLeft*60; + + vector timer_color; + if(minutesLeft >= 5 || warmup_stage || timelimit == 0) //don't use red or yellow in warmup or when there is no timelimit + timer_color = '1 1 1'; //white + else if(minutesLeft >= 1) + timer_color = '1 1 0'; //yellow + else + timer_color = '1 0 0'; //red + + if (cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) { + if (time < getstatf(STAT_GAMESTARTTIME)) { + //while restart is still active, show 00:00 + minutes = seconds = 0; + } else { + elapsedTime = floor(time - getstatf(STAT_GAMESTARTTIME)); //127 + minutes = floor(elapsedTime / 60); + seconds = elapsedTime - minutes*60; + } + } else { + minutes = minutesLeft; + seconds = secondsLeft; + } + + if(minutes > 999) + seconds = 99; + minutes = min(minutes, 999); + if(minutesLeft >= 1 || cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) { + HUD_DrawXNum(pos + eX * mySize_x - eX * 5.1 * mySize_y, minutes, 3, 0, mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos + eX * mySize_x - eX * 2.57 * mySize_y, "num_colon", '1 1 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL); + } + HUD_DrawXNum(pos + eX * mySize_x - eX * 2 * mySize_y, seconds, -2, 0, mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); +} + +// Radar (#6) +// +void HUD_Radar(void) +{ + float id = 6; + vector pos, mySize; + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); + + HUD_Panel_DrawBg(id, pos, mySize); + + local float color1, color2; // color already declared as a global in hud.qc + local vector rgb; + local entity tm; + float scale2d, normalsize, bigsize; + float f; + + teamradar_origin2d = pos + 0.5 * mySize; // TODO: stupid compat, should be removed + teamradar_size2d = mySize; + + if(minimapname == "" && !ons_showmap) + return; + + teamradar_loadcvars(); + + switch(cl_teamradar_zoommode) + { + default: + case 0: + f = current_zoomfraction; + break; + case 1: + f = 1 - current_zoomfraction; + break; + case 2: + f = 0; + break; + case 3: + f = 1; + break; + } + + switch(cl_teamradar_rotation) + { + case 0: + teamradar_angle = view_angles_y - 90; + break; + default: + teamradar_angle = 90 * cl_teamradar_rotation; + break; + } + + scale2d = vlen_maxnorm2d(mi_picmax - mi_picmin); + teamradar_size2d = mySize; + + teamradar_extraclip_mins = teamradar_extraclip_maxs = '0 0 0'; // we always center + + // pixels per world qu to match the teamradar_size2d_x range in the longest dimension + if(cl_teamradar_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)); + } + else + { + vector c0, c1, c2, c3, span; + c0 = rotate(mi_min, teamradar_angle * DEG2RAD); + c1 = rotate(mi_max, teamradar_angle * DEG2RAD); + c2 = rotate('1 0 0' * mi_min_x + '0 1 0' * mi_max_y, teamradar_angle * DEG2RAD); + c3 = rotate('1 0 0' * mi_max_x + '0 1 0' * mi_min_y, teamradar_angle * DEG2RAD); + span = '0 0 0'; + span_x = max4(c0_x, c1_x, c2_x, c3_x) - min4(c0_x, c1_x, c2_x, c3_x); + span_y = max4(c0_y, c1_y, c2_y, c3_y) - min4(c0_y, c1_y, c2_y, c3_y); + + // max-min distance must fit the radar in x=x, y=y + bigsize = min( + teamradar_size2d_x * scale2d / (1.05 * span_x), + teamradar_size2d_y * scale2d / (1.05 * span_y) + ); + } + + normalsize = vlen_maxnorm2d(teamradar_size2d) * scale2d / cl_teamradar_scale; + if(bigsize > normalsize) + normalsize = bigsize; + + teamradar_size = + f * bigsize + + (1 - f) * normalsize; + teamradar_origin3d_in_texcoord = teamradar_3dcoord_to_texcoord( + f * (mi_min + mi_max) * 0.5 + + (1 - f) * view_origin); + + color1 = GetPlayerColor(player_localentnum-1); + rgb = GetTeamRGB(color1); + + drawsetcliparea( + pos_x, + pos_y, + mySize_x, + mySize_y + ); + + draw_teamradar_background(cl_teamradar_background_alpha, cl_teamradar_foreground_alpha); + + if(ons_showmap) + { + drawresetcliparea(); + + vector frame_origin, frame_size; + frame_origin = frame_size = '0 0 0'; + + frame_origin_x = pos_x - teamradar_size2d_x * 0.55859375; // matches the picture + frame_origin_y = pos_y - teamradar_size2d_y * 0.55859375; // matches the picture + frame_size_x = pos_x * 1.1171875; // matches the picture + frame_size_y = pos_y * 1.1171875; // matches the picture + drawpic_skin(frame_origin, "gfx/ons-frame.tga", frame_size, '1 1 1', hud_alpha_fg, 0); + drawpic_skin(frame_origin, "gfx/ons-frame-team.tga", frame_size, rgb, hud_alpha_fg, 0); + + drawsetcliparea( + pos_x - teamradar_size2d_x * 0.5, + pos_y - teamradar_size2d_y * 0.5, + teamradar_size2d_x, + teamradar_size2d_y + ); + } + + for(tm = world; (tm = find(tm, classname, "radarlink")); ) + draw_teamradar_link(tm.origin, tm.velocity, tm.team); + for(tm = world; (tm = findflags(tm, teamradar_icon, 0xFFFFFF)); ) + draw_teamradar_icon(tm.origin, tm.teamradar_icon, tm, tm.teamradar_color, hud_alpha_fg); + for(tm = world; (tm = find(tm, classname, "entcs_receiver")); ) + { + color2 = GetPlayerColor(tm.sv_entnum); + //if(color == COLOR_SPECTATOR || color == color2) + draw_teamradar_player(tm.origin, tm.angles, GetTeamRGB(color2)); + } + draw_teamradar_player(view_origin, view_angles, '1 1 1'); + + drawresetcliparea(); +}; + +// Score (#7) +// +void HUD_Score() +{ + float id = 7; + vector pos, mySize; + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); + + HUD_Panel_DrawBg(id, pos, mySize); + + float score, distribution, leader; + float score_len, distr_len; + vector score_pos, secondary_score_pos, distribution_color; + entity tm, pl, me; + me = (spectatee_status > 0) ? playerslots[spectatee_status - 1] : playerslots[player_localentnum - 1]; + + if (!teamplay) { // non-teamgames + // me vector := [team/connected frags id] + pl = players.sort_next; + if(pl == me) + pl = pl.sort_next; + + if(hud_configure) + distribution = 42; + else if(pl) + distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]); + else + distribution = 0; + + score = me.(scores[ps_primary]); + if(hud_configure) + score = 123; + + if(distribution >= 5) { + distribution_color = eY; + leader = 1; + } else if(distribution >= 0) { + distribution_color = '1 1 1'; + leader = 1; + } else if(distribution >= -5) + distribution_color = '1 1 0'; + else + distribution_color = eX; + + score_len = strlen(ftos(score)); + distr_len = strlen(ftos(distribution)); + + HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * 0.33 * mySize_y, distribution, 3, 3, 0.33 * mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + if (leader) + drawpic_skin(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("highlight_", ftos(score_len)), eX * score_len * mySize_y + eY * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * mySize_y - eX * 3 * 0.33 * mySize_y, score, 3, 0, mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + } else { // teamgames + float max_fragcount; + max_fragcount = -99; + + float teamnum; + for(tm = teams.sort_next; tm; tm = tm.sort_next) { + if(tm.team == COLOR_SPECTATOR || (!tm.team_size && !hud_configure)) // no players? don't display + continue; + score = tm.(teamscores[ts_primary]); + if(hud_configure) + score = 123; + leader = 0; + + score_len = strlen(ftos(score)); + + if (score > max_fragcount) + max_fragcount = score; + + if(tm.team == myteam) { + if (max_fragcount == score) + leader = 1; + if (leader) + drawpic_skin(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 3 * 0.33 * mySize_y, strcat("highlight_", ftos(score_len)), eX * score_len * mySize_y + eY * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * mySize_y - eX * 3 * 0.33 * mySize_y, score, 3, 0, mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + } else { + if (max_fragcount == score) + leader = 1; + if (leader) + drawpic_skin(pos + eX * mySize_x - eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y * teamnum, strcat("highlight_", ftos(score_len)), eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + HUD_DrawXNum(pos + eX * mySize_x - eX * 3 * 0.33 * mySize_y + eY * 0.33 * mySize_y * teamnum, score, 3, 0, 0.33 * mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); + teamnum += 1; + } + } + } +} + +// Race timer (#8) +// +void HUD_RaceTimer (void) { + float id = 8; + vector pos, mySize; + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); + + HUD_Panel_DrawBg(id, pos, mySize); + + drawfont = hud_bigfont; + float a, t; + string s, forcetime; + + if(hud_configure) + { + s = "0:13:37"; + drawstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, FALSE, '0.75 0.75 0' * mySize_y), s, '0.75 0.75 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + s = "^1Intermediate 1 (+15.42)"; + drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.25 * mySize_y) + eY * 0.75 * mySize_y, s, '1 1 0' * 0.25 * mySize_y, hud_alpha_fg, DRAWFLAG_NORMAL); + } + else if(race_checkpointtime) + { + a = bound(0, 2 - (time - race_checkpointtime), 1); s = ""; forcetime = ""; if(a > 0) // just hit a checkpoint? @@ -1796,6 +2298,7 @@ void HUD_RaceTimer (void) { drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.25 * mySize_y) + eY * 0.75 * mySize_y, s, '1 1 0' * 0.25 * mySize_y, hud_alpha_fg * a, DRAWFLAG_NORMAL); } + // ___ TODO!!!___ if(race_penaltytime) { a = bound(0, 2 - (time - race_penaltyeventtime), 1); @@ -1810,184 +2313,57 @@ void HUD_RaceTimer (void) { if(forcetime != "") { - a = bound(0, (time - race_checkpointtime) / 0.5, 1); - //drawstring_expanding(m - '16 0 0' * stringwidth(forcetime, FALSE), forcetime, '32 32 0', '1 1 1', hud_alpha_fg, 0, a); - drawstring_expanding(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(forcetime, FALSE, '1 1 0' * 0.75 * mySize_y), forcetime, '1 1 0' * 0.75 * mySize_y, '1 1 1', hud_alpha_fg, 0, a); - } - else - a = 1; - - if(race_laptime && race_checkpoint != 255) - { - s = TIME_ENCODED_TOSTRING(TIME_ENCODE(time + TIME_DECODE(race_penaltyaccumulator) - race_laptime)); - //drawstring(m - '16 0 0' * stringwidth(s, FALSE), s, '32 32 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); - drawstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, FALSE, '0.75 0.75 0' * mySize_y), s, '0.75 0.75 0' * mySize_y, '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); - } - } - else - { - if(race_mycheckpointtime) - { - a = bound(0, 2 - (time - race_mycheckpointtime), 1); - s = MakeRaceString(race_mycheckpoint, TIME_DECODE(race_mycheckpointdelta), -!race_mycheckpointenemy, race_mycheckpointlapsdelta, race_mycheckpointenemy); - dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0) - //drawcolorcodedstring(m - '0 16 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); - drawcolorcodedstring(pos - '0 16 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); - } - if(race_othercheckpointtime && race_othercheckpointenemy != "") - { - a = bound(0, 2 - (time - race_othercheckpointtime), 1); - s = MakeRaceString(race_othercheckpoint, -TIME_DECODE(race_othercheckpointdelta), -!race_othercheckpointenemy, race_othercheckpointlapsdelta, race_othercheckpointenemy); - dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0) - //drawcolorcodedstring(m - '0 0 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); - drawcolorcodedstring(pos - '0 0 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); - } - - if(race_penaltytime && !race_penaltyaccumulator) - { - t = race_penaltytime * 0.1 + race_penaltyeventtime; - a = bound(0, (1 + t - time), 1); - if(a > 0) - { - if(time < t) - s = strcat("^1PENALTY: ", ftos_decimals(t - time, 1), " (", race_penaltyreason, ")"); - else - s = strcat("^2PENALTY: 0.0 (", race_penaltyreason, ")"); - dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0) - //drawcolorcodedstring(m - '0 32 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); - drawcolorcodedstring(pos - '0 32 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); - } - } - } - - drawfont = hud_font; -} - -// ___TODO___ !!! -// Notification area (#4) -void HUD_Notify (void) -{ - vector pos, mySize; - pos = HUD_Panel_GetPos(4); - mySize = HUD_Panel_GetSize(4); - - HUD_Panel_DrawBg(4, pos, mySize); - - string s; - entity tm; - if(spectatee_status && !intermission) - { - drawfont = hud_bigfont; - if(spectatee_status == -1) - s = "^1Observing"; - else - s = GetPlayerName(spectatee_status - 1); - // spectated player name between HUD and chat area, aligned to the left - pos_x = 0; - pos_y = - 50 - hud_fontsize_spec_y; - s = textShortenToWidth(s, vid_conwidth/2.5, hud_fontsize_spec, stringwidth_colors); - drawcolorcodedstring(pos, s, hud_fontsize_spec, hud_alpha_fg, DRAWFLAG_NORMAL); - drawfont = hud_font; - - // spectator text in the upper right corner - if(spectatee_status == -1) - s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate"); - else - s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player"); - - if(spectatee_status == -1) - s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed"); - else - s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe"); - - s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info"); - - if(gametype == GAME_ARENA) - s = "^1Wait for your turn to join"; - else if(gametype == GAME_LMS) - { - entity sk; - sk = playerslots[player_localentnum - 1]; - if(sk.(scores[ps_primary]) >= 666) - s = "^1Match has already begun"; - else if(sk.(scores[ps_primary]) > 0) - s = "^1You have no more lives left"; - else - s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join"); - } - else - s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join"); - - //show restart countdown: - if (time < getstatf(STAT_GAMESTARTTIME)) { - float countdown; - //we need to ceil, otherwise the countdown would be off by .5 when using round() - countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time); - s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds"); - } - } - if(warmup_stage && !intermission) - { - s = "^2Currently in ^1warmup^2 stage!"; - } - - // move more important stuff more to the middle so its more visible - - string blinkcolor; - if(mod(time, 1) >= 0.5) - blinkcolor = "^1"; - else - blinkcolor = "^3"; - - if(ready_waiting && !intermission && !spectatee_status) - { - if(ready_waiting_for_me) - { - if(warmup_stage) - s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " to end warmup"); - else - s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " once you are ready"); + a = bound(0, (time - race_checkpointtime) / 0.5, 1); + //drawstring_expanding(m - '16 0 0' * stringwidth(forcetime, FALSE), forcetime, '32 32 0', '1 1 1', hud_alpha_fg, 0, a); + drawstring_expanding(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(forcetime, FALSE, '1 1 0' * 0.75 * mySize_y), forcetime, '1 1 0' * 0.75 * mySize_y, '1 1 1', hud_alpha_fg, 0, a); } else + a = 1; + + if(race_laptime && race_checkpoint != 255) { - if(warmup_stage) - s = strcat("^2Waiting for others to ready up to end warmup..."); - else - s = strcat("^2Waiting for others to ready up..."); + s = TIME_ENCODED_TOSTRING(TIME_ENCODE(time + TIME_DECODE(race_penaltyaccumulator) - race_laptime)); + //drawstring(m - '16 0 0' * stringwidth(s, FALSE), s, '32 32 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); + drawstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, FALSE, '0.75 0.75 0' * mySize_y), s, '0.75 0.75 0' * mySize_y, '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); } } - else if(warmup_stage && !intermission && !spectatee_status) + else { - s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup"); - } + if(race_mycheckpointtime) + { + a = bound(0, 2 - (time - race_mycheckpointtime), 1); + s = MakeRaceString(race_mycheckpoint, TIME_DECODE(race_mycheckpointdelta), -!race_mycheckpointenemy, race_mycheckpointlapsdelta, race_mycheckpointenemy); + dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0) + //drawcolorcodedstring(m - '0 16 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); + drawcolorcodedstring(pos - '0 16 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); + } + if(race_othercheckpointtime && race_othercheckpointenemy != "") + { + a = bound(0, 2 - (time - race_othercheckpointtime), 1); + s = MakeRaceString(race_othercheckpoint, -TIME_DECODE(race_othercheckpointdelta), -!race_othercheckpointenemy, race_othercheckpointlapsdelta, race_othercheckpointenemy); + dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0) + //drawcolorcodedstring(m - '0 0 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); + drawcolorcodedstring(pos - '0 0 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); + } - if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger) - { - float ts_min, ts_max; - tm = teams.sort_next; - if (tm) + if(race_penaltytime && !race_penaltyaccumulator) { - for(; tm.sort_next; tm = tm.sort_next) - { - if(!tm.team_size || tm.team == COLOR_SPECTATOR) - continue; - if(!ts_min) ts_min = tm.team_size; - else ts_min = min(ts_min, tm.team_size); - if(!ts_max) ts_max = tm.team_size; - else ts_max = max(ts_max, tm.team_size); - } - if ((ts_max - ts_min) > 1) + t = race_penaltytime * 0.1 + race_penaltyeventtime; + a = bound(0, (1 + t - time), 1); + if(a > 0) { - s = strcat(blinkcolor, "Teamnumbers are unbalanced!"); - tm = GetTeam(myteam, false); - if (tm) - if (tm.team != COLOR_SPECTATOR) - if (tm.team_size == ts_max) - s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust"); - + if(time < t) + s = strcat("^1PENALTY: ", ftos_decimals(t - time, 1), " (", race_penaltyreason, ")"); + else + s = strcat("^2PENALTY: 0.0 (", race_penaltyreason, ")"); + dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0) + //drawcolorcodedstring(m - '0 32 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); + drawcolorcodedstring(pos - '0 32 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); } } } + + drawfont = hud_font; } // Vote window (#9) @@ -2003,9 +2379,10 @@ float vote_change; // "time" when vote_active changed void HUD_VoteWindow(void) { + float id = 9; vector pos, mySize; - pos = HUD_Panel_GetPos(9); - mySize = HUD_Panel_GetSize(9); + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); string s; float a; @@ -2027,7 +2404,7 @@ void HUD_VoteWindow(void) vote_needed = 4; } - HUD_Panel_DrawBg(9, pos, mySize); + HUD_Panel_DrawBg(id, pos, mySize); if(vote_alpha) { a = vote_alpha * bound(cvar_or("hud_vote_alreadyvoted_alpha", 0.75), 1 - vote_highlighted, 1); @@ -2553,218 +2930,6 @@ void CSQC_race_hud(void) drawfont = hud_font; } -// Timer (#5) -// -void HUD_Timer() -{ - vector pos, mySize; - pos = HUD_Panel_GetPos(5); - mySize = HUD_Panel_GetSize(5); - - HUD_Panel_DrawBg(5, pos, mySize); - - float timelimit, elapsedTime, minutes, seconds, timeleft, minutesLeft, secondsLeft; - - timelimit = getstatf(STAT_TIMELIMIT); - - HUD_DrawRaceStatus(pos + '0 30 0'); - - timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time); - timeleft = ceil(timeleft); - minutesLeft = floor(timeleft / 60); - secondsLeft = timeleft - minutesLeft*60; - - vector timer_color; - if(minutesLeft >= 5 || warmup_stage || timelimit == 0) //don't use red or yellow in warmup or when there is no timelimit - timer_color = '1 1 1'; //white - else if(minutesLeft >= 1) - timer_color = '1 1 0'; //yellow - else - timer_color = '1 0 0'; //red - - if (cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) { - if (time < getstatf(STAT_GAMESTARTTIME)) { - //while restart is still active, show 00:00 - minutes = seconds = 0; - } else { - elapsedTime = floor(time - getstatf(STAT_GAMESTARTTIME)); //127 - minutes = floor(elapsedTime / 60); - seconds = elapsedTime - minutes*60; - } - } else { - minutes = minutesLeft; - seconds = secondsLeft; - } - - if(mySize_x/mySize_y > 5.1) - { - if(minutes > 999) - seconds = 99; - minutes = min(minutes, 999); - if(minutesLeft >= 1 || cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) { - if(minutes < 100) - drawpic_skin(pos + eX * mySize_x - eX * 5.1 * mySize_y, "timer", '1 1 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * mySize_x - eX * 5.1 * mySize_y, minutes, 3, 0, mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * mySize_x - eX * 2.57 * mySize_y, "num_colon", '1 1 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL); - } - HUD_DrawXNum(pos + eX * mySize_x - eX * 2 * mySize_y, seconds, -2, 0, mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - } - else - { - if(minutes > 99) - seconds = 99; - minutes = min(minutes, 99); - if(minutesLeft >= 1 || cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) { - if(minutes < 100) - drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.5 * 0.5 * mySize_y, "timer", '0.5 0.5 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL); - HUD_DrawXNum(pos + eX * 0.5 * mySize_x - eX * mySize_y + eY * 0.5 * mySize_y, minutes, -2, 0, 0.5 * mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.5 * 0.5 * mySize_y + eY * 0.5 * mySize_y, "num_colon", '0.5 0.5 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL); - } - HUD_DrawXNum(pos + eX * 0.51 * mySize_x + eY * 0.5 * mySize_y, seconds, -2, 0, 0.5 * mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - } -} - -// Radar (#6) -// - -void HUD_Radar(void) -{ - vector pos, mySize; - pos = HUD_Panel_GetPos(6); - mySize = HUD_Panel_GetSize(6); - - HUD_Panel_DrawBg(6, pos, mySize); - - local float color1, color2; // color already declared as a global in hud.qc - local vector rgb; - local entity tm; - float scale2d, normalsize, bigsize; - float f; - - teamradar_origin2d = pos + 0.5 * mySize; // TODO: stupid compat, should be removed - teamradar_size2d = mySize; - - if(minimapname == "" && !ons_showmap) - return; - - teamradar_loadcvars(); - - switch(cl_teamradar_zoommode) - { - default: - case 0: - f = current_zoomfraction; - break; - case 1: - f = 1 - current_zoomfraction; - break; - case 2: - f = 0; - break; - case 3: - f = 1; - break; - } - - switch(cl_teamradar_rotation) - { - case 0: - teamradar_angle = view_angles_y - 90; - break; - default: - teamradar_angle = 90 * cl_teamradar_rotation; - break; - } - - scale2d = vlen_maxnorm2d(mi_picmax - mi_picmin); - teamradar_size2d = mySize; - - teamradar_extraclip_mins = teamradar_extraclip_maxs = '0 0 0'; // we always center - - // pixels per world qu to match the teamradar_size2d_x range in the longest dimension - if(cl_teamradar_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)); - } - else - { - vector c0, c1, c2, c3, span; - c0 = rotate(mi_min, teamradar_angle * DEG2RAD); - c1 = rotate(mi_max, teamradar_angle * DEG2RAD); - c2 = rotate('1 0 0' * mi_min_x + '0 1 0' * mi_max_y, teamradar_angle * DEG2RAD); - c3 = rotate('1 0 0' * mi_max_x + '0 1 0' * mi_min_y, teamradar_angle * DEG2RAD); - span = '0 0 0'; - span_x = max4(c0_x, c1_x, c2_x, c3_x) - min4(c0_x, c1_x, c2_x, c3_x); - span_y = max4(c0_y, c1_y, c2_y, c3_y) - min4(c0_y, c1_y, c2_y, c3_y); - - // max-min distance must fit the radar in x=x, y=y - bigsize = min( - teamradar_size2d_x * scale2d / (1.05 * span_x), - teamradar_size2d_y * scale2d / (1.05 * span_y) - ); - } - - normalsize = vlen_maxnorm2d(teamradar_size2d) * scale2d / cl_teamradar_scale; - if(bigsize > normalsize) - normalsize = bigsize; - - teamradar_size = - f * bigsize - + (1 - f) * normalsize; - teamradar_origin3d_in_texcoord = teamradar_3dcoord_to_texcoord( - f * (mi_min + mi_max) * 0.5 - + (1 - f) * view_origin); - - color1 = GetPlayerColor(player_localentnum-1); - rgb = GetTeamRGB(color1); - - drawsetcliparea( - pos_x, - pos_y, - mySize_x, - mySize_y - ); - - draw_teamradar_background(cl_teamradar_background_alpha, cl_teamradar_foreground_alpha); - - if(ons_showmap) - { - drawresetcliparea(); - - vector frame_origin, frame_size; - frame_origin = frame_size = '0 0 0'; - - frame_origin_x = pos_x - teamradar_size2d_x * 0.55859375; // matches the picture - frame_origin_y = pos_y - teamradar_size2d_y * 0.55859375; // matches the picture - frame_size_x = pos_x * 1.1171875; // matches the picture - frame_size_y = pos_y * 1.1171875; // matches the picture - drawpic_skin(frame_origin, "gfx/ons-frame.tga", frame_size, '1 1 1', hud_alpha_fg, 0); - drawpic_skin(frame_origin, "gfx/ons-frame-team.tga", frame_size, rgb, hud_alpha_fg, 0); - - drawsetcliparea( - pos_x - teamradar_size2d_x * 0.5, - pos_y - teamradar_size2d_y * 0.5, - teamradar_size2d_x, - teamradar_size2d_y - ); - } - - for(tm = world; (tm = find(tm, classname, "radarlink")); ) - draw_teamradar_link(tm.origin, tm.velocity, tm.team); - for(tm = world; (tm = findflags(tm, teamradar_icon, 0xFFFFFF)); ) - draw_teamradar_icon(tm.origin, tm.teamradar_icon, tm, tm.teamradar_color, hud_alpha_fg); - for(tm = world; (tm = find(tm, classname, "entcs_receiver")); ) - { - color2 = GetPlayerColor(tm.sv_entnum); - //if(color == COLOR_SPECTATOR || color == color2) - draw_teamradar_player(tm.origin, tm.angles, GetTeamRGB(color2)); - } - draw_teamradar_player(view_origin, view_angles, '1 1 1'); - - drawresetcliparea(); -}; - /* ================== Main HUD system @@ -2773,22 +2938,23 @@ Main HUD system void HUD_DrawPressedKeys(void) { + float id = 10; vector pos, mySize; - pos = HUD_Panel_GetPos(10); - mySize = HUD_Panel_GetSize(10); + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); - HUD_Panel_DrawBg(10, pos, mySize); + HUD_Panel_DrawBg(id, pos, mySize); float pressedkeys; pressedkeys = getstatf(STAT_PRESSED_KEYS); - drawpic_skin(pos, "keys/key_bg.tga", mySize, '1 1 1', 0.1 * hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * mySize_x - eX * 0.22 * mySize_x + eY * 0.195 * mySize_y, ((pressedkeys & KEY_CROUCH) ? "keys/key_crouch_inv.tga" : "keys/key_crouch.tga"), '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.040 * mySize_y, ((pressedkeys & KEY_FORWARD) ? "keys/key_forward_inv.tga" : "keys/key_forward.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * 0.023 * mySize_x + eY * 0.195 * mySize_y, ((pressedkeys & KEY_JUMP) ? "keys/key_jump_inv.tga" : "keys/key_jump.tga"), '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * 0.1 * mySize_x + eY * 0.486 * mySize_y, ((pressedkeys & KEY_LEFT) ? "keys/key_left_inv.tga" : "keys/key_left.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.486 * mySize_y, ((pressedkeys & KEY_BACKWARD) ? "keys/key_backward_inv.tga" : "keys/key_backward.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic_skin(pos + eX * mySize_x - eX * 0.372 * mySize_x + eY * 0.486 * mySize_y, ((pressedkeys & KEY_RIGHT) ? "keys/key_right_inv.tga" : "keys/key_right.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos, "key_bg.tga", mySize, '1 1 1', 0.1 * hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos + eX * mySize_x - eX * 0.22 * mySize_x + eY * 0.195 * mySize_y, ((pressedkeys & KEY_CROUCH) ? "key_crouch_inv.tga" : "key_crouch.tga"), '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.040 * mySize_y, ((pressedkeys & KEY_FORWARD) ? "key_forward_inv.tga" : "key_forward.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos + eX * 0.023 * mySize_x + eY * 0.195 * mySize_y, ((pressedkeys & KEY_JUMP) ? "key_jump_inv.tga" : "key_jump.tga"), '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos + eX * 0.1 * mySize_x + eY * 0.486 * mySize_y, ((pressedkeys & KEY_LEFT) ? "key_left_inv.tga" : "key_left.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.486 * mySize_y, ((pressedkeys & KEY_BACKWARD) ? "key_backward_inv.tga" : "key_backward.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos + eX * mySize_x - eX * 0.372 * mySize_x + eY * 0.486 * mySize_y, ((pressedkeys & KEY_RIGHT) ? "key_right_inv.tga" : "key_right.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); } void HUD_ShowSpeed(void)