X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud.qc;h=8f20c6d6c8a99e43251cfb877c3046d22950bd19;hb=c44aaef210fffaba1be59c27e9f5b15b31588f7a;hp=4493d7bc1029fa35207e5cfec9df636e46172538;hpb=1bd5a5b05a9a8285c2c0be0df746fdb30b58a81a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index 4493d7bc1..8f20c6d6c 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -75,6 +75,11 @@ void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector the } } +// draw HUD element with image from gfx/hud/hud_skin/foo.tga if it exists, otherwise gfx/hud/default/foo.tga +void drawpic_skin(vector pos, string pic, vector sz, vector color, float alpha, float drawflag) { + drawpic(pos, strcat("gfx/hud/", cvar_string("hud_skin"), "/", pic), sz, color, alpha, drawflag); +} + // return HUD background color vector HUD_GetBgColor() { @@ -94,7 +99,7 @@ vector HUD_GetBgColor() vector HUD_AccuracyColor(float accuracy) { vector rgb; - float yellow_accuracy = cvar("hud_accuracy_yellow"); // value at which this function returns yellow + float yellow_accuracy = cvar("hud_weaponicons_accuracy_yellow"); // value at which this function returns yellow if(accuracy >= 100) { rgb_x = 0; rgb_y = 1; @@ -172,7 +177,7 @@ void HUD_DrawXNum (vector pos, float num, float digits, float showsign, float le hl_pos_y = pos_y - lettersize/20; hl_pos_z = 0; - drawpic(hl_pos, strcat("gfx/hud/sb_highlight_", l_length), hl_size, '1 1 1', alpha, dflags); + drawpic_skin(hl_pos, strcat("highlight_", l_length), hl_size, '1 1 1', alpha, dflags); } if (stroke == 1) @@ -183,14 +188,14 @@ void HUD_DrawXNum (vector pos, float num, float digits, float showsign, float le if(minus) { if (stroke == 1) - drawpic(pos, "gfx/hud/num_minus_stroke", vsize, rgb, alpha, dflags); - drawpic(pos, "gfx/hud/num_minus", vsize, num_color, alpha, dflags); + drawpic_skin(pos, "num_minus_stroke", vsize, rgb, alpha, dflags); + drawpic_skin(pos, "num_minus", vsize, num_color, alpha, dflags); pos_x += lettersize; } else if(plus) { if (stroke == 1) - drawpic(pos, "gfx/hud/num_plus_stroke", vsize, rgb, alpha, dflags); - drawpic(pos, "gfx/hud/num_plus", vsize, num_color, alpha, dflags); + drawpic_skin(pos, "num_plus_stroke", vsize, rgb, alpha, dflags); + drawpic_skin(pos, "num_plus", vsize, num_color, alpha, dflags); pos_x += lettersize; } @@ -198,8 +203,8 @@ void HUD_DrawXNum (vector pos, float num, float digits, float showsign, float le { tmp = substring(str, i, 1); if (stroke == 1) - drawpic(pos, strcat("gfx/hud/num_", tmp, "_stroke"), vsize, rgb, alpha, dflags); - drawpic(pos, strcat("gfx/hud/num_", tmp), vsize, num_color, alpha, dflags); + drawpic_skin(pos, strcat("num_", tmp, "_stroke"), vsize, rgb, alpha, dflags); + drawpic_skin(pos, strcat("num_", tmp), vsize, num_color, alpha, dflags); pos_x += lettersize; } } @@ -555,6 +560,73 @@ string HUD_Panel_GetName(float id) } } +// Save the config +void HUD_Panel_ExportCfg(string cfgname) +{ + float fh; + fh = fopen(strcat("hud_", cvar_string("hud_skin"), "_", cfgname, ".cfg"), FILE_WRITE); + if(fh >= 0) + { + fputs(fh, strcat("seta hud_skin \"", cvar_string("hud_skin"), "\"", "\n")); + fputs(fh, strcat("seta hud_bg \"", cvar_string("hud_bg"), "\"", "\n")); + fputs(fh, strcat("seta hud_bg_color \"", cvar_string("hud_bg_color"), "\"", "\n")); + 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, "\n"); + + fputs(fh, strcat("seta hud_dock \"", cvar_string("hud_dock"), "\"", "\n")); + fputs(fh, strcat("seta hud_dock_color \"", cvar_string("hud_dock_color"), "\"", "\n")); + fputs(fh, strcat("seta hud_dock_alpha ", ftos(cvar("hud_dock_alpha")), "\n")); + fputs(fh, "\n"); + + fputs(fh, strcat("seta hud_progressbar_alpha ", ftos(cvar("hud_progressbar_alpha")), "\n")); + fputs(fh, strcat("seta hud_progressbar_strength_color \"", cvar_string("hud_progressbar_strength_color"), "\"", "\n")); + fputs(fh, strcat("seta hud_progressbar_shield_color \"", cvar_string("hud_progressbar_shield_color"), "\"", "\n")); + fputs(fh, strcat("seta hud_progressbar_health_color \"", cvar_string("hud_progressbar_health_color"), "\"", "\n")); + fputs(fh, strcat("seta hud_progressbar_armor_color \"", cvar_string("hud_progressbar_armor_color"), "\"", "\n")); + fputs(fh, strcat("seta hud_progressbar_fuel_color \"", cvar_string("hud_progressbar_fuel_color"), "\"", "\n")); + fputs(fh, "\n"); + + // common cvars for all panels + float i; + for (i = 0; i < panel_cnt; ++i) + { + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), " ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i)))), "\n")); + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_pos \"", cvar_string(strcat("hud_", HUD_Panel_GetName(i), "_pos")), "\"", "\n")); + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_size \"", cvar_string(strcat("hud_", HUD_Panel_GetName(i), "_size")), "\"", "\n")); + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_bg \"", cvar_string(strcat("hud_", HUD_Panel_GetName(i), "_bg")), "\"", "\n")); + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_bg_color \"", cvar_string(strcat("hud_", HUD_Panel_GetName(i), "_bg_color")), "\"", "\n")); + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_bg_alpha ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_bg_alpha"))), "\n")); + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_bg_border ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_bg_border"))), "\n")); + switch(i) { + case 0: + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_accuracy_height ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_accuracy_height"))), "\n")); + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_accuracy_yellow ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_accuracy_yellow"))), "\n")); + break; + case 1: + fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_onlycurrent ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_onlycurrent"))), "\n")); + 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")); + break; + } + fputs(fh, "\n"); + } + + print("^2Successfully exported to hud_", cvar_string("hud_skin"), "_", cfgname, ".cfg! (Note: It's saved in data/data/)\n"); + } + fclose(fh); +} + vector HUD_Panel_CheckLimitSize(float id, vector mySize) { switch(id) { @@ -565,17 +637,17 @@ 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 * 2, 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 = (17/90) * mySize_x; // 17/90 * width + mySize_y = (1/4) * mySize_x; // 1/4 * width break; case 8: mySize_y = (1/4) * mySize_x; // 1/4 * width @@ -601,7 +673,12 @@ float HUD_Panel_CheckActive(float id) // return size of given panel vector HUD_Panel_GetSize(float id) { - return stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_size"))); + vector mySize; + mySize = stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_size"))); + + mySize = eX * mySize_x * vid_conwidth + eY * mySize_y * vid_conheight; + + return mySize; } // return pos of given panel @@ -610,6 +687,8 @@ vector HUD_Panel_GetPos(float id) vector pos; pos = stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_pos"))); + pos = eX * pos_x * vid_conwidth + eY * pos_y * vid_conheight; + if (pos_x < 0) pos_x = vid_conwidth + pos_x; if (pos_y < 0) @@ -629,7 +708,7 @@ float HUD_Panel_GetBorder(float id) // draw the background/borders void HUD_Panel_DrawBg(float id, vector pos, vector mySize) { - if(!cvar("_hud_configure") && cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_bg")) == "0") + if(!hud_configure && cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_bg")) == "0") return; string bg; @@ -652,8 +731,10 @@ void HUD_Panel_DrawBg(float id, vector pos, vector mySize) alpha = cvar(strcat("hud_", HUD_Panel_GetName(id), "_bg_alpha")); if(!alpha) alpha = cvar("hud_bg_alpha"); + if(hud_configure) + alpha = max(cvar("hud_configure_bg_minalpha"), alpha); - draw_BorderPicture(pos - '1 1 0' * border, strcat("gfx/hud/", bg), mySize + '1 1 0' * 2 * border, color, alpha, '1 1 0' * (border/BORDER_MULTIPLIER)); + draw_BorderPicture(pos - '1 1 0' * border, strcat("gfx/hud/", cvar_string("hud_skin"), "/", bg), mySize + '1 1 0' * 2 * border, color, alpha, '1 1 0' * (border/BORDER_MULTIPLIER)); } } @@ -750,7 +831,8 @@ float HUD_Panel_SetSize(float id, vector mySize) myPos = HUD_Panel_GetPos(id); // check for collisions - mySize = HUD_Panel_CheckResize(id, HUD_Panel_GetPos(id), mySize); + if(cvar("hud_configure_checkcollisions")) + mySize = HUD_Panel_CheckResize(id, HUD_Panel_GetPos(id), mySize); mySize_x = bound(0.025 * vid_conwidth, mySize_x, vid_conwidth - myPos_x); mySize_y = bound(0.025 * vid_conheight, mySize_y, vid_conheight - myPos_y); @@ -771,7 +853,7 @@ float HUD_Panel_SetSize(float id, vector mySize) didntresize = 1; // resized X string s; - s = strcat(ftos(mySize_x), " ", ftos(mySize_y)); + s = strcat(ftos(mySize_x/vid_conwidth), " ", ftos(mySize_y/vid_conheight)); cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_size"), s); return didntresize; } @@ -862,7 +944,8 @@ void HUD_Panel_SetPos(float id, vector pos, float didntresize) vector mySize; mySize = HUD_Panel_GetSize(id); - pos = HUD_Panel_CheckMove(id, pos, mySize); + if(cvar("hud_configure_checkcollisions")) + pos = HUD_Panel_CheckMove(id, pos, mySize); pos_x = bound(0, pos_x, vid_conwidth - mySize_x); pos_y = bound(0, pos_y, vid_conheight - mySize_y); @@ -873,7 +956,7 @@ void HUD_Panel_SetPos(float id, vector pos, float didntresize) pos_y = pos_y - vid_conheight; string s; - s = strcat(ftos(pos_x), " ", ftos(pos_y)); + s = strcat(ftos(pos_x/vid_conwidth), " ", ftos(pos_y/vid_conheight)); cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_pos"), s); } @@ -915,7 +998,7 @@ void HUD_Panel_Mouse() mousepos_x = bound(0, mousepos_x, vid_conwidth); mousepos_y = bound(0, mousepos_y, vid_conheight); - drawpic(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) { @@ -1044,19 +1127,20 @@ 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); - accuracybar_height = cvar_or("hud_weaponicons_accuracybar_height", 3); + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); + accuracybar_height = cvar_or("hud_weaponicons_accuracy_height", 3); stat_weapons = getstati(STAT_WEAPONS); for(i = WEP_FIRST; i <= WEP_LAST; ++i) { self = get_weaponinfo(i); - if(self.weapons && (self.impulse >= 0) && (stat_weapons & self.weapons) || cvar("_hud_configure")) + if(self.weapons && (self.impulse >= 0) && (stat_weapons & self.weapons) || hud_configure) { weaponorder[weapon_cnt] = self; ++weapon_cnt; @@ -1064,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); @@ -1095,9 +1179,9 @@ void HUD_WeaponIcons() for(i = 0; i < weapon_cnt; ++i) { self = weaponorder[i]; - if((self.weapons && (self.impulse >= 0) && (stat_weapons & self.weapons)) || cvar("_hud_configure")) + 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; @@ -1105,11 +1189,11 @@ void HUD_WeaponIcons() weapon_damage = weapon_fired[self.weapon-WEP_FIRST]; if(self.weapon == activeweapon) - drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), "gfx/hud/sb_ammobg", 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/hud/inv_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)) @@ -1119,7 +1203,7 @@ void HUD_WeaponIcons() accuracy_color = HUD_AccuracyColor(weapon_stats); if(weapon_damage) - drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) - '2 0 0' + eY * (mySize_y/rows - accuracybar_height), "gfx/hud/sb_accuracy_bar.tga", eX * mySize_x*(1/columns) + eY * accuracybar_height, accuracy_color, hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) - '2 0 0' + eY * (mySize_y/rows - accuracybar_height), "accuracy_bar.tga", eX * mySize_x*(1/columns) + eY * accuracybar_height, accuracy_color, hud_alpha_fg, DRAWFLAG_NORMAL); } } @@ -1166,38 +1250,39 @@ string GetAmmoPicture(float i) { switch(i) { - case 0: return "gfx/hud/sb_shells"; - case 1: return "gfx/hud/sb_bullets"; - case 2: return "gfx/hud/sb_rocket"; - case 3: return "gfx/hud/sb_cells"; - case 4: return "gfx/hud/sb_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); for (i = 0; i < 4; ++i) { float a; a = getstati(GetAmmoStat(i)); // how much ammo do we have of type i? - if(cvar("_hud_configure")) + if(hud_configure) a = 100; if(cvar("hud_inventory_onlycurrent")) { if (stat_items & GetAmmoItemCode(i)) { - drawpic(pos, "gfx/hud/sb_ammobg", mySize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(pos + eY * 0.05 * mySize_y, GetAmmoPicture(i), '1 1 0' * 0.8 * mySize_y, '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); else @@ -1235,8 +1320,8 @@ void HUD_Inventory() } if (stat_items & GetAmmoItemCode(i)) - drawpic(mypos, "gfx/hud/sb_ammobg", mysize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(mypos + eY * 0.05 * mysize_y, GetAmmoPicture(i), '1 1 0' * 0.8 * mysize_y, '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)) HUD_DrawXNum(mypos + 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); @@ -1258,10 +1343,11 @@ void HUD_Inventory() float shield_maxtime; float strength_maxtime; void HUD_Powerups() { + float id = 2; float stat_items; stat_items = getstati(STAT_ITEMS); - if(!cvar("_hud_configure")) + if(!hud_configure) { if not(stat_items & IT_STRENGTH) if not(stat_items & IT_INVINCIBLE) @@ -1272,26 +1358,32 @@ 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; - strength_time = bound(0, ceil(getstatf(STAT_STRENGTH_FINISHED) - time), 999); - shield_time = bound(0, ceil(getstatf(STAT_INVINCIBLE_FINISHED) - time), 999); + strength_time = bound(0, ceil(getstatf(STAT_STRENGTH_FINISHED) - time), 99); + shield_time = bound(0, ceil(getstatf(STAT_INVINCIBLE_FINISHED) - time), 99); - if(cvar("_hud_configure")) + if(hud_configure) { strength_time = 15; 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; @@ -1307,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(pos, "gfx/hud/statusbar", eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos, strcat("gfx/hud/sb_", 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(pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/30), "gfx/hud/statusbar", eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos + eX * mySize_x - eX * mySize_y, strcat("gfx/hud/sb_", 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(pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/30), "gfx/hud/statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30), HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos + eX * 0.4 * mySize_y, strcat("gfx/hud/sb_", 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(pos + eX * 0.5 * mySize_x + eY * mySize_y - eY * mySize_y * min(1, rightcnt/30), "gfx/hud/statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30), HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos + eX * mySize_x - eX * 1.1 * mySize_y, strcat("gfx/hud/sb_", 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 @@ -1352,22 +1494,46 @@ void HUD_Powerups() { { len = strlen(ftos(leftcnt)); - drawpic(pos, "gfx/hud/statusbar", eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos, strcat("gfx/hud/sb_", 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(pos + eY * 0.5 * mySize_y, "gfx/hud/statusbar", eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos + eY * 0.5 * mySize_y, strcat("gfx/hud/sb_", 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; @@ -1375,18 +1541,18 @@ void HUD_Powerups() { { if(dt < 5) { - drawpic_expanding_two(pos, "gfx/hud/sb_str", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE, + drawpic_expanding_two(pos, "str", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE, bound(0, (ceil(dt) - dt) / 0.5, 1)); } else { - drawpic(pos, "gfx/hud/sb_str", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE); + drawpic_skin(pos, "str", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE); } HUD_DrawXNum(pos - '40 -2 0', ceil(dt), 2, 0, countdown_fontsize, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); } else if(dt > -1) { - drawpic_expanding(pos, "gfx/hud/sb_str", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE, + drawpic_expanding(pos, "str", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE, bound(0, -dt / 0.5, 1)); } } @@ -1398,18 +1564,18 @@ void HUD_Powerups() { { if(dt < 5) { - drawpic_expanding_two(pos - '0 -22 0', "gfx/hud/sb_invinc", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE, + drawpic_expanding_two(pos - '0 -22 0', "invinc", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE, bound(0, (ceil(dt) - dt) / 0.5, 1)); } else { - drawpic(pos - '0 -22 0', "gfx/hud/sb_invinc", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE); + drawpic_skin(pos - '0 -22 0', "invinc", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE); } HUD_DrawXNum(pos - '40 -24 0', ceil(dt), 2, 0, countdown_fontsize, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); } else if(dt > -1) { - drawpic_expanding(pos - '0 -22 0', "gfx/hud/sb_invinc", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE, + drawpic_expanding(pos - '0 -22 0', "invinc", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE, bound(0, -dt / 0.5, 1)); } } @@ -1420,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); - if(cvar("_hud_configure")) + + float fuel; + fuel = getstati(GetAmmoStat(4)); // how much fuel do we have? + + if(hud_configure) { armor = 150; health = 100; + fuel = 70; } if(health <= 0) @@ -1441,6 +1613,7 @@ void HUD_HealthArmor(void) float len; // TODO! + /* if(hud_hudselector == 2) // combined health and armor display { vector v; @@ -1454,238 +1627,651 @@ void HUD_HealthArmor(void) if(v_z) // fully armored { // here, armorideal > armor - drawpic(num_pos + '78 -4.5 0', "gfx/hud/sb_health", '32 32 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(num_pos + '108 -4.5 0', "gfx/hud/sb_armor", '20 20 0', '1 1 1', hud_alpha_fg * armor / v_y, DRAWFLAG_NORMAL); + drawpic_skin(num_pos + '78 -4.5 0', "health", '32 32 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(num_pos + '108 -4.5 0', "armor", '20 20 0', '1 1 1', hud_alpha_fg * armor / v_y, DRAWFLAG_NORMAL); } else { - drawpic(num_pos + '108 -4.5 0', "gfx/hud/sb_health", '20 20 0', '1 1 1', hud_alpha_fg * v_y / armor, DRAWFLAG_NORMAL); - drawpic(num_pos + '78 -4.5 0', "gfx/hud/sb_armor", '32 32 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(num_pos + '108 -4.5 0', "health", '20 20 0', '1 1 1', hud_alpha_fg * v_y / armor, DRAWFLAG_NORMAL); + drawpic_skin(num_pos + '78 -4.5 0', "armor", '32 32 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); } HUD_DrawXNum_Colored(num_pos, x, 3, 24, hud_alpha_fg); // draw the combined health and armor } else { - 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 - leftname = "armor"; - leftcnt = armor; - if(leftcnt) - leftactive = 1; - leftalpha = min((armor+10)/55, 1); - - rightname = "health"; - rightcnt = health; - rightactive = 1; - rightalpha = 1; - } else { - leftname = "health"; - leftcnt = health; + */ + 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(id), "_flip"))) { // old style layout with armor left/top of health + leftname = "armor"; + leftcnt = armor; + if(leftcnt) leftactive = 1; - leftalpha = 1; + leftalpha = min((armor+10)/55, 1); - rightname = "armor"; - rightcnt = armor; - if(rightcnt) - rightactive = 1; - rightalpha = min((armor+10)/55, 1); - } + rightname = "health"; + rightcnt = health; + rightactive = 1; + rightalpha = 1; + } else { + leftname = "health"; + leftcnt = health; + leftactive = 1; + leftalpha = 1; - float fuel; - fuel = getstati(GetAmmoStat(4)); // how much fuel do we have? + rightname = "armor"; + rightcnt = armor; + if(rightcnt) + rightactive = 1; + rightalpha = min((armor+10)/55, 1); + } - if (mySize_x/mySize_y > 5) + // TODO: tile statusbars? + if (mySize_x/mySize_y > 5) + { + if(leftactive) { - if(leftactive) - { - len = strlen(ftos(leftcnt)); + len = strlen(ftos(leftcnt)); - drawpic(pos, "gfx/hud/statusbar", eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos, strcat("gfx/hud/sb_", 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; } - if(rightactive) - { - drawpic(pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, rightcnt/200), "gfx/hud/statusbar", eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos + eX * mySize_x - eX * mySize_y, strcat("gfx/hud/sb_", 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); + 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) + { + 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; } - if(fuel) - drawpic(pos, "gfx/hud/statusbar", eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL); + 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); } - else if (mySize_x/mySize_y > 3.2) + + 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 > 2) + { + if(leftactive) { - if(leftactive) - { - len = strlen(ftos(leftcnt)); + len = strlen(ftos(leftcnt)); - drawpic(pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/200), "gfx/hud/statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200), HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos + eX * 0.4 * mySize_y, strcat("gfx/hud/sb_", 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; } - if(rightactive) - { - len = strlen(ftos(rightcnt)); - - drawpic(pos + eX * 0.5 * mySize_x + eY * mySize_y - eY * mySize_y * min(1, rightcnt/200), "gfx/hud/statusbar", eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200), HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos + eX * mySize_x - eX * 1.1 * mySize_y, strcat("gfx/hud/sb_", 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); + 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)); + + 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; } - if(fuel) - drawpic(pos, "gfx/hud/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(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); } - else + + 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(barpos, "statusbar", barsize, HUD_Panel_GetProgressBarColor("fuel"), hud_alpha_fg * 0.8, DRAWFLAG_NORMAL); + } + else + { + if(leftactive) { - if(leftactive) - { - len = strlen(ftos(leftcnt)); + len = strlen(ftos(leftcnt)); - drawpic(pos, "gfx/hud/statusbar", eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(leftname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos, strcat("gfx/hud/sb_", 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; } - if(rightactive) - { - len = strlen(ftos(rightcnt)); + 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); + } - drawpic(pos + eY * 0.5 * mySize_y, "gfx/hud/statusbar", eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor(rightname), cvar("hud_progressbar_alpha"), DRAWFLAG_NORMAL); - drawpic(pos + eY * 0.5 * mySize_y, strcat("gfx/hud/sb_", 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(rightactive) + { + 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 + 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; } - if(fuel) - drawpic(pos, "gfx/hud/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(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(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); - - HUD_Panel_DrawBg(7, 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]; + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); - if (!teamplay) { // non-teamgames - // me vector := [team/connected frags id] - pl = players.sort_next; - if(pl == me) - pl = pl.sort_next; + HUD_Panel_DrawBg(id, pos, mySize); - if(cvar("_hud_configure")) - distribution = 42; - else if(pl) - distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]); + string s; + entity tm; + if(spectatee_status && !intermission) + { + drawfont = hud_bigfont; + if(spectatee_status == -1) + s = "^1Observing"; else - distribution = 0; - - score = me.(scores[ps_primary]); - if(cvar("_hud_configure")) - score = 1337; + 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(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'; + // spectator text in the upper right corner + if(spectatee_status == -1) + s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate"); else - distribution_color = eX; - - score_len = strlen(ftos(score)); - distr_len = strlen(ftos(distribution)); + s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player"); - HUD_DrawXNum(pos + eX * mySize_x - eX * 4 * 0.33 * mySize_y, distribution, 4, 3, 0.33 * mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - if (leader) - drawpic(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 4 * 0.33 * mySize_y, strcat("gfx/hud/sb_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 * 4 * mySize_y - eX * 4 * 0.33 * mySize_y, score, 4, 0, mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - } else { // teamgames - float max_fragcount; - max_fragcount = -999; + 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"); - float teamnum; - for(tm = teams.sort_next; tm; tm = tm.sort_next) { - if(tm.team == COLOR_SPECTATOR || (!tm.team_size && !cvar("_hud_configure"))) // no players? don't display - continue; - score = tm.(teamscores[ts_primary]); - if(cvar("_hud_configure")) - score = 1337; - leader = 0; - - score_len = strlen(ftos(score)); + s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info"); - if (score > max_fragcount) - max_fragcount = score; + 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"); - if(tm.team == myteam) { - if (max_fragcount == score) - leader = 1; - if (leader) - drawpic(pos + eX * mySize_x - eX * score_len * mySize_y - eX * 4 * 0.33 * mySize_y, strcat("gfx/hud/sb_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 * 4 * mySize_y - eX * 4 * 0.33 * mySize_y, score, 4, 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(pos + eX * mySize_x - eX * 0.33 * score_len * mySize_y + eY * 0.33 * mySize_y * teamnum, strcat("gfx/hud/sb_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 * 4 * 0.33 * mySize_y + eY * 0.33 * mySize_y * teamnum, score, 4, 0, 0.33 * mySize_y, GetTeamRGB(tm.team) * 0.8, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - teamnum += 1; - } + //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"); } } -} - -// Race timer (#8) -// -void HUD_RaceTimer (void) { - vector pos, mySize; - pos = HUD_Panel_GetPos(8); - mySize = HUD_Panel_GetSize(8); + if(warmup_stage && !intermission) + { + s = "^2Currently in ^1warmup^2 stage!"; + } - HUD_Panel_DrawBg(8, pos, mySize); + // move more important stuff more to the middle so its more visible - drawfont = hud_bigfont; - float a, t; - string s, forcetime; + string blinkcolor; + if(mod(time, 1) >= 0.5) + blinkcolor = "^1"; + else + blinkcolor = "^3"; - if(cvar("_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) + if(ready_waiting && !intermission && !spectatee_status) { - a = bound(0, 2 - (time - race_checkpointtime), 1); - s = ""; - forcetime = ""; - if(a > 0) // just hit a checkpoint? + if(ready_waiting_for_me) { - if(race_checkpoint != 254) - { - if(race_time && race_previousbesttime) + 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"); + + } + } + } +} + +// Timer (#5) +// +void HUD_Timer() +{ + float id = 5; + vector pos, mySize; + pos = HUD_Panel_GetPos(id); + mySize = HUD_Panel_GetSize(id); + + HUD_Panel_DrawBg(id, pos, mySize); + + float timelimit, elapsedTime, minutes, seconds, timeleft, minutesLeft, secondsLeft; + + 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? + { + if(race_checkpoint != 254) + { + if(race_time && race_previousbesttime) s = MakeRaceString(race_checkpoint, TIME_DECODE(race_time) - TIME_DECODE(race_previousbesttime), 0, 0, race_previousbestname); else s = MakeRaceString(race_checkpoint, 0, -1, 0, race_previousbestname); @@ -1712,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); @@ -1727,182 +2314,56 @@ 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; -} - -// 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"); + //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) @@ -1918,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; @@ -1934,7 +2396,7 @@ void HUD_VoteWindow(void) else vote_alpha = bound(0, 1 - (time - vote_change) * 2, 1); - if(cvar("_hud_configure")) + if(hud_configure) { vote_alpha = 1; vote_yescount = 3; @@ -1942,17 +2404,17 @@ 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); - drawpic(pos, "gfx/hud/voteprogress_back", mySize, HUD_GetBgColor(), a * hud_alpha_bg, DRAWFLAG_NORMAL); + drawpic_skin(pos, "voteprogress_back", mySize, HUD_GetBgColor(), a * hud_alpha_bg, DRAWFLAG_NORMAL); s = "A vote has been called for: "; drawstring(pos + '0.5 0 0' * mySize_x + '0 0.1 0' * mySize_y - eX * stringwidth(s, FALSE, '1 1 0' * 0.5 * mySize_y*(1/5)), s, '1 1 0' * mySize_y*(1/5), '1 1 1', a * hud_alpha_fg, DRAWFLAG_NORMAL); s = textShortenToWidth(vote_called_vote, mySize_x * 0.96, '10 0 0', stringwidth_colors); - if(cvar("_hud_configure")) + if(hud_configure) s = "Configure the HUD"; drawcolorcodedstring(pos + '0.52 0 0' * mySize_x + '0 0.3 0' * mySize_y - eX * stringwidth(s, FALSE, '1 1 0' * 0.5 * mySize_y*(1/6)), s, '1 1 0' * mySize_y*(1/6), a * hud_alpha_fg, DRAWFLAG_NORMAL); @@ -1964,19 +2426,19 @@ void HUD_VoteWindow(void) // draw the progress bars drawsetcliparea(pos_x, pos_y, mySize_x * 0.5 * (vote_yescount/vote_needed), mySize_y); - drawpic(pos, "gfx/hud/voteprogress_prog", mySize, eY, a * hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos, "voteprogress_prog", mySize, eY, a * hud_alpha_fg, DRAWFLAG_NORMAL); drawsetcliparea(pos_x + mySize_x - mySize_x * 0.5 * (vote_nocount/vote_needed), pos_y, mySize_x * 0.5, mySize_y); - drawpic(pos, "gfx/hud/voteprogress_prog", mySize, eX, a * hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos, "voteprogress_prog", mySize, eX, a * hud_alpha_fg, DRAWFLAG_NORMAL); // draw the highlights if(vote_highlighted == 1) { drawsetcliparea(pos_x, pos_y, mySize_x * 0.5, mySize_y); - drawpic(pos, "gfx/hud/voteprogress_voted", mySize, eY, a * hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos, "voteprogress_voted", mySize, eY, a * hud_alpha_fg, DRAWFLAG_NORMAL); } else if(vote_highlighted == 2) { drawsetcliparea(pos_x + 0.5 * mySize_x, pos_y, mySize_x * 0.5, mySize_y); - drawpic(pos, "gfx/hud/voteprogress_voted", mySize, eX, a * hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos, "voteprogress_voted", mySize, eX, a * hud_alpha_fg, DRAWFLAG_NORMAL); } drawresetcliparea(); @@ -2013,20 +2475,20 @@ void HUD_DrawRaceStatus(vector pos) rankname = race_PlaceName(rank); if(race_status == 0) - drawpic(pos, "gfx/hud/race/newfail", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); + drawpic_skin(pos, "race_newfail", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); else if(race_status == 1) { - drawpic(pos, "gfx/hud/race/newtime", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); + drawpic_skin(pos, "race_newtime", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); drawcolorcodedstring(pos + '40 80 0' - eX * stringwidth(s, TRUE, '5 0 0'), s, '10 10 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); drawstring(pos + '40 20 0' - eX * stringwidth(rankname, TRUE, '7 0 0'), rankname, '14 14 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); } else if(race_status == 2) { if(race_status_name == GetPlayerName(player_localentnum -1) || !race_myrank || race_myrank < rank) - drawpic(pos, "gfx/hud/race/newrankgreen", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); + drawpic_skin(pos, "race_newrankgreen", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); else - drawpic(pos, "gfx/hud/race/newrankyellow", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); + drawpic_skin(pos, "race_newrankyellow", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); drawcolorcodedstring(pos + '40 80 0' - eX * stringwidth(s, TRUE, '5 0 0'), s, '10 10 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); drawstring(pos + '40 20 0' - eX * stringwidth(rankname, TRUE, '7 0 0'), rankname, '14 14 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); } else if(race_status == 3) { - drawpic(pos, "gfx/hud/race/newrecordserver", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); + drawpic_skin(pos, "race_newrecordserver", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); drawcolorcodedstring(pos + '40 80 0' - eX * stringwidth(s, TRUE, '5 0 0'), s, '10 10 0', hud_alpha_fg * a, DRAWFLAG_NORMAL); drawstring(pos + '40 20 0' - eX * stringwidth(rankname, TRUE, '7 0 0'), rankname, '14 14 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL); } @@ -2099,25 +2561,25 @@ void CSQC_ctf_hud(void) float red_alpha, red_alpha_prevstatus; red_alpha = red_alpha_prevstatus = 1; switch(redflag) { - case 1: red_icon = "gfx/hud/sb_flag_red_taken"; break; - case 2: red_icon = "gfx/hud/sb_flag_red_lost"; break; - case 3: red_icon = "gfx/hud/sb_flag_red_carrying"; red_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; + case 1: red_icon = "flag_red_taken"; break; + case 2: red_icon = "flag_red_lost"; break; + case 3: red_icon = "flag_red_carrying"; red_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; default: if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM2)) - red_icon = "gfx/hud/sb_flag_red_shielded"; + red_icon = "flag_red_shielded"; else red_icon = string_null; break; } switch(redflag_prevstatus) { - case 1: red_icon_prevstatus = "gfx/hud/sb_flag_red_taken"; break; - case 2: red_icon_prevstatus = "gfx/hud/sb_flag_red_lost"; break; - case 3: red_icon_prevstatus = "gfx/hud/sb_flag_red_carrying"; red_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; + case 1: red_icon_prevstatus = "flag_red_taken"; break; + case 2: red_icon_prevstatus = "flag_red_lost"; break; + case 3: red_icon_prevstatus = "flag_red_carrying"; red_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; default: if(redflag == 3) - red_icon_prevstatus = "gfx/hud/sb_flag_red_carrying"; // make it more visible + red_icon_prevstatus = "flag_red_carrying"; // make it more visible else if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM2)) - red_icon_prevstatus = "gfx/hud/sb_flag_red_shielded"; + red_icon_prevstatus = "flag_red_shielded"; else red_icon_prevstatus = string_null; break; @@ -2127,25 +2589,25 @@ void CSQC_ctf_hud(void) float blue_alpha, blue_alpha_prevstatus; blue_alpha = blue_alpha_prevstatus = 1; switch(blueflag) { - case 1: blue_icon = "gfx/hud/sb_flag_blue_taken"; break; - case 2: blue_icon = "gfx/hud/sb_flag_blue_lost"; break; - case 3: blue_icon = "gfx/hud/sb_flag_blue_carrying"; blue_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; + case 1: blue_icon = "flag_blue_taken"; break; + case 2: blue_icon = "flag_blue_lost"; break; + case 3: blue_icon = "flag_blue_carrying"; blue_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; default: if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM1)) - blue_icon = "gfx/hud/sb_flag_blue_shielded"; + blue_icon = "flag_blue_shielded"; else blue_icon = string_null; break; } switch(blueflag_prevstatus) { - case 1: blue_icon_prevstatus = "gfx/hud/sb_flag_blue_taken"; break; - case 2: blue_icon_prevstatus = "gfx/hud/sb_flag_blue_lost"; break; - case 3: blue_icon_prevstatus = "gfx/hud/sb_flag_blue_carrying"; blue_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; + case 1: blue_icon_prevstatus = "flag_blue_taken"; break; + case 2: blue_icon_prevstatus = "flag_blue_lost"; break; + case 3: blue_icon_prevstatus = "flag_blue_carrying"; blue_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; default: if(blueflag == 3) - blue_icon_prevstatus = "gfx/hud/sb_flag_blue_carrying"; // make it more visible + blue_icon_prevstatus = "flag_blue_carrying"; // make it more visible else if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM1)) - blue_icon_prevstatus = "gfx/hud/sb_flag_blue_shielded"; + blue_icon_prevstatus = "flag_blue_shielded"; else blue_icon_prevstatus = string_null; break; @@ -2165,13 +2627,13 @@ void CSQC_ctf_hud(void) if(red_icon_prevstatus && f < 1) drawpic_expanding(redflag_pos, red_icon_prevstatus, sz, '1 1 1', hud_alpha_fg * red_alpha_prevstatus, DRAWFLAG_NORMAL, f); if(red_icon) - drawpic(redflag_pos, red_icon, sz, '1 1 1', hud_alpha_fg * red_alpha * f, DRAWFLAG_NORMAL); + drawpic_skin(redflag_pos, red_icon, sz, '1 1 1', hud_alpha_fg * red_alpha * f, DRAWFLAG_NORMAL); f = bound(0, blueflag_statuschange_elapsedtime*2, 1); if(blue_icon_prevstatus && f < 1) drawpic_expanding(blueflag_pos, blue_icon_prevstatus, sz, '1 1 1', hud_alpha_fg * blue_alpha_prevstatus, DRAWFLAG_NORMAL, f); if(blue_icon) - drawpic(blueflag_pos, blue_icon, sz, '1 1 1', hud_alpha_fg * blue_alpha * f, DRAWFLAG_NORMAL); + drawpic_skin(blueflag_pos, blue_icon, sz, '1 1 1', hud_alpha_fg * blue_alpha * f, DRAWFLAG_NORMAL); } /*void HUD_Mod_Race (void) { @@ -2215,18 +2677,18 @@ void CSQC_ctf_hud(void) } HUD_DrawXNum(bottomright - '0 48 0' - '16 0 0' * TIME_DECIMALS, distmsec, -TIME_DECIMALS, 0, 16, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); HUD_DrawXNum(bottomright - '68 48 0' - '16 0 0' * TIME_DECIMALS, distsec, 4, minusplus, 16, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(bottomright - '10 48 0' - '16 0 0' * TIME_DECIMALS, "gfx/hud/num_dot", '16 16 0', distribution_color, hud_alpha_fg, DRAWFLAG_ADDITIVE); + drawpic_skin(bottomright - '10 48 0' - '16 0 0' * TIME_DECIMALS, "num_dot", '16 16 0', distribution_color, hud_alpha_fg, DRAWFLAG_ADDITIVE); } // race record display if (distribution <= 0 || distribution == score) // draw the highlight background behind the timer if we have the lead - drawpic(bottomright - '0 32 0' - '32 0 0' * (4 + TIME_DECIMALS), "gfx/hud/sb_highlight_4", '0 28 0' + '32 0 0' * (4 + TIME_DECIMALS), '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(bottomright - '0 32 0' - '32 0 0' * (4 + TIME_DECIMALS), "highlight_4", '0 28 0' + '32 0 0' * (4 + TIME_DECIMALS), '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); HUD_DrawXNum(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0', racemsec, -TIME_DECIMALS, 0, 30, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); HUD_DrawXNum(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0' - '66 0 0', racesec, -2, 0, 30, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0' - '18 0 0', "gfx/hud/num_dot", '30 30 0', '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE); + drawpic_skin(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0' - '18 0 0', "num_dot", '30 30 0', '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE); HUD_DrawXNum(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0' - '132 0 0', racemin, -2, 0, 30, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0' - '84 0 0', "gfx/hud/num_colon", '30 30 0', '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE); + drawpic_skin(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0' - '84 0 0', "num_colon", '30 30 0', '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE); } }*/ @@ -2306,16 +2768,16 @@ void CSQC_kh_hud(void) switch(keyteam) { case COLOR_TEAM1: - drawpic (pa, "gfx/hud/sb_kh_redarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% alpha key + drawpic (pa, "kh_redarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% alpha key break; case COLOR_TEAM2: - drawpic (pa, "gfx/hud/sb_kh_bluearrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% alpha key + drawpic (pa, "kh_bluearrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% alpha key break; case COLOR_TEAM3: - drawpic (pa, "gfx/hud/sb_kh_yellowarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% alpha key + drawpic (pa, "kh_yellowarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% alpha key break; case COLOR_TEAM4: - drawpic (pa, "gfx/hud/sb_kh_pinkarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% alpha key + drawpic (pa, "kh_pinkarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL); // show 30% alpha key break; default: break; @@ -2323,16 +2785,16 @@ void CSQC_kh_hud(void) switch(i) // YAY! switch(i) inside a for loop for i. DailyWTF, here we come! { case 0: - drawpic (p, "gfx/hud/sb_kh_red", kh_size, '1 1 1', a, DRAWFLAG_NORMAL); // show 30% alpha key + drawpic (p, "kh_red", kh_size, '1 1 1', a, DRAWFLAG_NORMAL); // show 30% alpha key break; case 1: - drawpic (p, "gfx/hud/sb_kh_blue", kh_size, '1 1 1', a, DRAWFLAG_NORMAL); // show 30% alpha key + drawpic (p, "kh_blue", kh_size, '1 1 1', a, DRAWFLAG_NORMAL); // show 30% alpha key break; case 2: - drawpic (p, "gfx/hud/sb_kh_yellow", kh_size, '1 1 1', a, DRAWFLAG_NORMAL); // show 30% alpha key + drawpic (p, "kh_yellow", kh_size, '1 1 1', a, DRAWFLAG_NORMAL); // show 30% alpha key break; case 3: - drawpic (p, "gfx/hud/sb_kh_pink", kh_size, '1 1 1', a, DRAWFLAG_NORMAL); // show 30% alpha key + drawpic (p, "kh_pink", kh_size, '1 1 1', a, DRAWFLAG_NORMAL); // show 30% alpha key break; } } @@ -2389,7 +2851,7 @@ void CSQC_nb_hud(void) pos_y += 2; //vertical margin to the picture if (stat_items & IT_KEY1) - drawpic(pos, "gfx/hud/sb_nexball_carrying", '80 34 0', '1 1 1', 1, DRAWFLAG_NORMAL); + drawpic_skin(pos, "nexball_carrying", '80 34 0', '1 1 1', 1, DRAWFLAG_NORMAL); } // Race/CTS HUD modicon section @@ -2468,232 +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(pos + eX * mySize_x - eX * 5.1 * mySize_y, "gfx/hud/sb_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(pos + eX * mySize_x - eX * 2.57 * mySize_y, "gfx/hud/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(pos + eX * 0.5 * mySize_x - eX * 0.5 * 0.5 * mySize_y, "gfx/hud/sb_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(pos + eX * 0.5 * mySize_x - eX * 0.5 * 0.5 * mySize_y + eY * 0.5 * mySize_y, "gfx/hud/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'; - if(pos == eX * vid_conwidth) - { - if(cl_teamradar_nohudhack < 2) - pos_y += 25; - if(cl_teamradar_nohudhack < 1) - teamradar_extraclip_mins_y -= 25; - } - else if(pos == eY * vid_conheight || pos == eX * vid_conwidth + eY * vid_conheight) - { - if(cl_teamradar_nohudhack < 2) - pos_y -= 50; - //if(cl_teamradar_nohudhack < 1) - //teamradar_extraclip_size_y += 50; // don't, the HUD looks nice - } - - // 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, - pos_x + mySize_x, - pos_y + 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(frame_origin, "gfx/ons-frame.tga", frame_size, '1 1 1', hud_alpha_fg, 0); - drawpic(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 @@ -2702,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(pos, "gfx/hud/keys/key_bg.tga", mySize, '1 1 1', 0.1 * hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(pos + eX * mySize_x - eX * 0.22 * mySize_x + eY * 0.195 * mySize_y, ((pressedkeys & KEY_CROUCH) ? "gfx/hud/keys/key_crouch_inv.tga" : "gfx/hud/keys/key_crouch.tga"), '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.040 * mySize_y, ((pressedkeys & KEY_FORWARD) ? "gfx/hud/keys/key_forward_inv.tga" : "gfx/hud/keys/key_forward.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(pos + eX * 0.023 * mySize_x + eY * 0.195 * mySize_y, ((pressedkeys & KEY_JUMP) ? "gfx/hud/keys/key_jump_inv.tga" : "gfx/hud/keys/key_jump.tga"), '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(pos + eX * 0.1 * mySize_x + eY * 0.486 * mySize_y, ((pressedkeys & KEY_LEFT) ? "gfx/hud/keys/key_left_inv.tga" : "gfx/hud/keys/key_left.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.486 * mySize_y, ((pressedkeys & KEY_BACKWARD) ? "gfx/hud/keys/key_backward_inv.tga" : "gfx/hud/keys/key_backward.tga"), '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL); - drawpic(pos + eX * mySize_x - eX * 0.372 * mySize_x + eY * 0.486 * mySize_y, ((pressedkeys & KEY_RIGHT) ? "gfx/hud/keys/key_right_inv.tga" : "gfx/hud/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) @@ -2811,9 +3048,9 @@ void HUD_ShowAcceleration(void) } if (acceleration > 0) - drawpic(pos, "gfx/hud/statusbar", acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos, "statusbar", acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * hud_alpha_fg, DRAWFLAG_NORMAL); else if (acceleration < 0) - drawpic(pos + acceleration * scale * '40 0 0', "gfx/hud/statusbar", -acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * hud_alpha_fg, DRAWFLAG_NORMAL); + drawpic_skin(pos + acceleration * scale * '40 0 0', "statusbar", -acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * hud_alpha_fg, DRAWFLAG_NORMAL); } void HUD_Reset (void) @@ -2835,6 +3072,12 @@ void HUD_Main (void) hud_fontsize = HUD_GetFontsize("hud_fontsize"); hud_fontsize_spec = HUD_GetFontsize("hud_fontsize_spec"); + hud_configure = cvar("_hud_configure"); + + // Drawing stuff + if(cvar("hud_dock")) + drawpic_skin('0 0 0', "dock", eX * vid_conwidth + eY * vid_conheight, stov(cvar_string("hud_dock_color")), cvar("hud_dock_alpha"), DRAWFLAG_NORMAL); + if(HUD_Panel_CheckActive(0)) HUD_WeaponIcons(); if(HUD_Panel_CheckActive(1)) @@ -2854,13 +3097,13 @@ void HUD_Main (void) if(HUD_Panel_CheckActive(7)) HUD_Score(); if(HUD_Panel_CheckActive(8)) - if(gametype == GAME_RACE || gametype == GAME_CTS || cvar("_hud_configure")) + if(gametype == GAME_RACE || gametype == GAME_CTS || hud_configure) HUD_RaceTimer(); if(HUD_Panel_CheckActive(9)) HUD_VoteWindow(); // TODO hud'ify if(HUD_Panel_CheckActive(10)) - if(spectatee_status > 0 || cvar("cl_showpressedkeys") >= 2 || cvar("_hud_configure")) + if(spectatee_status > 0 || cvar("cl_showpressedkeys") >= 2 || hud_configure) HUD_DrawPressedKeys(); // TODO hud_'ify these