X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud.qc;h=7359468e0969d236738b619a367e8fa8c8553d7f;hp=9faf594451175f0bc2e97deb416ec6800d52488a;hb=531c25df6a8e61e3839087568a44dc80d3e47f90;hpb=14f88293289444c9a39357a88c1980c019733eff diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index 9faf59445..7359468e0 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -218,9 +218,9 @@ string MakeRaceString(float cp, float mytime, float histime, float lapdelta, str if(histime < 0) return strcat(col, cpname); else if(hisname == "") - return strcat(col, sprintf(_("%s (%s)"), cpname, timestr)); + return strcat(col, sprintf("%s (%s)", cpname, timestr)); else - return strcat(col, sprintf(_("%s (%s %s)"), cpname, timestr, strcat(hisname, col, lapstr))); + return strcat(col, sprintf("%s (%s %s)", cpname, timestr, strcat(hisname, col, lapstr))); } // Check if the given name already exist in race rankings? In that case, where? (otherwise return 0) @@ -408,42 +408,6 @@ float weaponorder_cmp(float i, float j, entity pass) return aj - ai; // the string is in REVERSE order (higher prio at the right is what we want, but higher prio first is the string) } -float GetAmmoStat(float i) -{ - switch(i) - { - case 0: return STAT_SHELLS; - case 1: return STAT_NAILS; - case 2: return STAT_ROCKETS; - case 3: return STAT_CELLS; - case 4: return STAT_FUEL; - default: return -1; - } -} - -float GetAmmoTypeForWep(float i) -{ - switch(i) - { - case WEP_SHOTGUN: return 0; - case WEP_UZI: return 1; - case WEP_GRENADE_LAUNCHER: return 2; - case WEP_MINE_LAYER: return 2; - case WEP_ELECTRO: return 3; - case WEP_CRYLINK: return 3; - case WEP_HLAC: return 3; - case WEP_MINSTANEX: return 3; - case WEP_NEX: return 3; - case WEP_RIFLE: return 1; - case WEP_HAGAR: return 2; - case WEP_ROCKET_LAUNCHER: return 2; - case WEP_SEEKER: return 2; - case WEP_FIREBALL: return 4; - case WEP_HOOK: return 3; - default: return -1; - } -} - void HUD_Weapons(void) { // declarations @@ -460,7 +424,7 @@ void HUD_Weapons(void) float timein_effect_length = autocvar_hud_panel_weapons_timeout_speed_in; //? 0.375 : 0); float timeout_effect_length = autocvar_hud_panel_weapons_timeout_speed_out; //? 0.75 : 0); - float ammo_type, ammo_full; + float ammo_full; float barsize_x = 0, barsize_y = 0, baroffset_x = 0, baroffset_y = 0; vector ammo_color = '1 0 1'; float ammo_alpha = 1; @@ -764,7 +728,7 @@ void HUD_Weapons(void) if(weapons_stat & WepSet_FromWeapon(self.weapon)) { // draw the weapon image - drawpic_aspect_skin(weapon_pos, strcat("weapon", self.netname), weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(weapon_pos, self.model2, weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); // draw weapon label string switch(autocvar_hud_panel_weapons_label) @@ -778,7 +742,7 @@ void HUD_Weapons(void) break; case 3: // weapon name - drawstring(weapon_pos, self.netname, '1 1 0' * 0.5 * weapon_size_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring(weapon_pos, strtolower(self.message), '1 1 0' * 0.5 * weapon_size_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); break; default: // nothing @@ -786,21 +750,20 @@ void HUD_Weapons(void) } // draw ammo status bar - if(autocvar_hud_panel_weapons_ammo && self.weapon != WEP_TUBA && self.weapon != WEP_LASER && self.weapon != WEP_PORTO) + if(autocvar_hud_panel_weapons_ammo && (self.ammo_field != ammo_none)) { - a = 0; - ammo_type = GetAmmoTypeForWep(self.weapon); - if(ammo_type != -1) - a = getstati(GetAmmoStat(ammo_type)); // how much ammo do we have? + a = getstati(GetAmmoStat(self.ammo_field)); // how much ammo do we have? if(a > 0) { - switch(ammo_type) { - case 0: ammo_full = autocvar_hud_panel_weapons_ammo_full_shells; break; - case 1: ammo_full = autocvar_hud_panel_weapons_ammo_full_nails; break; - case 2: ammo_full = autocvar_hud_panel_weapons_ammo_full_rockets; break; - case 3: ammo_full = autocvar_hud_panel_weapons_ammo_full_cells; break; - case 4: ammo_full = autocvar_hud_panel_weapons_ammo_full_fuel; break; + switch(self.ammo_field) + { + case ammo_shells: ammo_full = autocvar_hud_panel_weapons_ammo_full_shells; break; + case ammo_nails: ammo_full = autocvar_hud_panel_weapons_ammo_full_nails; break; + case ammo_rockets: ammo_full = autocvar_hud_panel_weapons_ammo_full_rockets; break; + case ammo_cells: ammo_full = autocvar_hud_panel_weapons_ammo_full_cells; break; + case ammo_plasma: ammo_full = autocvar_hud_panel_weapons_ammo_full_plasma; break; + case ammo_fuel: ammo_full = autocvar_hud_panel_weapons_ammo_full_fuel; break; default: ammo_full = 60; } @@ -808,15 +771,25 @@ void HUD_Weapons(void) weapon_pos_x + baroffset_x, weapon_pos_y + baroffset_y, barsize_x * bound(0, a/ammo_full, 1), - barsize_y); - drawpic_aspect_skin(weapon_pos, "weapon_ammo", weapon_size, ammo_color, ammo_alpha, DRAWFLAG_NORMAL); + barsize_y + ); + + drawpic_aspect_skin( + weapon_pos, + "weapon_ammo", + weapon_size, + ammo_color, + ammo_alpha, + DRAWFLAG_NORMAL + ); + drawresetcliparea(); } } } else // draw a "ghost weapon icon" if you don't have the weapon { - drawpic_aspect_skin(weapon_pos, strcat("weapon", self.netname), weapon_size, '0 0 0', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL); + drawpic_aspect_skin(weapon_pos, self.model2, weapon_size, '0 0 0', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL); } // draw the complain message @@ -858,44 +831,78 @@ void HUD_Weapons(void) } // Ammo (#1) -// -// TODO: macro -float GetAmmoItemCode(float i) +void DrawNadeScoreBar(vector myPos, vector mySize, vector color) { - switch(i) - { - case 0: return IT_SHELLS; - case 1: return IT_NAILS; - case 2: return IT_ROCKETS; - case 3: return IT_CELLS; - case 4: return IT_FUEL; - default: return -1; - } + + HUD_Panel_DrawProgressBar( + myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, + mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, + autocvar_hud_panel_ammo_progressbar_name, + getstatf(STAT_NADE_BONUS_SCORE), 0, 0, color, + autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + } -string GetAmmoPicture(float i) +void DrawAmmoNades(vector myPos, vector mySize, float draw_expanding, float expand_time) { - switch(i) + float theAlpha = 1, a, b; + vector nade_color, picpos, numpos; + + nade_color = Nade_Color(getstati(STAT_NADE_BONUS_TYPE)); + + a = getstatf(STAT_NADE_BONUS); + b = getstatf(STAT_NADE_BONUS_SCORE); + + if(autocvar_hud_panel_ammo_iconalign) + { + numpos = myPos; + picpos = myPos + eX * 2 * mySize_y; + } + else { - case 0: return "ammo_shells"; - case 1: return "ammo_bullets"; - case 2: return "ammo_rockets"; - case 3: return "ammo_cells"; - case 4: return "ammo_fuel"; - default: return ""; + numpos = myPos + eX * mySize_y; + picpos = myPos; + } + + DrawNadeScoreBar(myPos, mySize, nade_color); + + if(b > 0 || a > 0) + { + if(autocvar_hud_panel_ammo_text) + drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + + if(draw_expanding) + drawpic_aspect_skin_expanding(picpos, "nade_nbg", '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL, expand_time); + + drawpic_aspect_skin(picpos, "nade_bg" , '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(picpos, "nade_nbg" , '1 1 0' * mySize_y, nade_color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); } } -void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_selected, float infinite_ammo) +void DrawAmmoItem(vector myPos, vector mySize, .float ammotype, float currently_selected, float infinite_ammo) { - float a; - if(autocvar__hud_configure) + float a = 0; + if(ammotype != ammo_none) { - currently_selected = (itemcode == 2); //rockets always selected - a = 31 + mod(itemcode*93, 128); + if(autocvar__hud_configure) + { + currently_selected = (ammotype == ammo_rockets); //rockets always selected + a = 60; + } + else + { + // how much ammo do we have of this ammotype? + a = getstati(GetAmmoStat(ammotype)); + } } else - a = getstati(GetAmmoStat(itemcode)); // how much ammo do we have of type itemcode? + { + #if 0 + infinite_ammo = TRUE; + #else + return; // just don't draw infinite ammo at all. + #endif + } vector color; if(infinite_ammo) @@ -923,25 +930,28 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s picpos = myPos; } - if (currently_selected) + if(currently_selected) drawpic_aspect_skin(myPos, "ammo_current_bg", mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - if(a > 0 && autocvar_hud_panel_ammo_progressbar) - HUD_Panel_DrawProgressBar(myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, autocvar_hud_panel_ammo_progressbar_name, a/autocvar_hud_panel_ammo_maxammo, 0, 0, color, autocvar_hud_progressbar_alpha * panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + if(a > 0 && autocvar_hud_panel_ammo_progressbar) + HUD_Panel_DrawProgressBar(myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize_x, autocvar_hud_panel_ammo_progressbar_name, a/autocvar_hud_panel_ammo_maxammo, 0, 0, color, autocvar_hud_progressbar_alpha * panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); - if(autocvar_hud_panel_ammo_text) - { - if(a > 0 || infinite_ammo) - drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); - else // "ghost" ammo count - drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * theAlpha * 0.5, DRAWFLAG_NORMAL); - } + if(autocvar_hud_panel_ammo_text) + { + if(a > 0 || infinite_ammo) + drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + else // "ghost" ammo count + drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * theAlpha * 0.5, DRAWFLAG_NORMAL); + } if(a > 0 || infinite_ammo) - drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(picpos, GetAmmoPicture(ammotype), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL); else // "ghost" ammo icon - drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '0 0 0', panel_fg_alpha * theAlpha * 0.5, DRAWFLAG_NORMAL); + drawpic_aspect_skin(picpos, GetAmmoPicture(ammotype), '1 1 0' * mySize_y, '0 0 0', panel_fg_alpha * theAlpha * 0.5, DRAWFLAG_NORMAL); } +float nade_prevstatus; +float nade_prevframe; +float nade_statuschange_time; void HUD_Ammo(void) { if(hud != HUD_NORMAL) return; @@ -966,21 +976,38 @@ void HUD_Ammo(void) mySize -= '2 2 0' * panel_bg_padding; } - const float AMMO_COUNT = 4; float rows = 0, columns, row, column; + float nade_cnt = getstatf(STAT_NADE_BONUS), nade_score = getstatf(STAT_NADE_BONUS_SCORE); + float draw_nades = (nade_cnt > 0 || nade_score > 0), nade_statuschange_elapsedtime; + float total_ammo_count; + vector ammo_size; if (autocvar_hud_panel_ammo_onlycurrent) - ammo_size = mySize; + total_ammo_count = 1; else + total_ammo_count = AMMO_COUNT; + + if(draw_nades) { - rows = mySize_y/mySize_x; - rows = bound(1, floor((sqrt(4 * (3/1) * rows * AMMO_COUNT + rows * rows) + rows + 0.5) / 2), AMMO_COUNT); - // ^^^ ammo item aspect goes here + ++total_ammo_count; + if (nade_cnt != nade_prevframe) + { + nade_statuschange_time = time; + nade_prevstatus = nade_prevframe; + nade_prevframe = nade_cnt; + } + } + else + nade_prevstatus = nade_prevframe = nade_statuschange_time = 0; + + rows = mySize_y/mySize_x; + rows = bound(1, floor((sqrt(4 * (3/1) * rows * (total_ammo_count) + rows * rows) + rows + 0.5) / 2), (total_ammo_count)); + // ^^^ ammo item aspect goes here - columns = ceil(AMMO_COUNT/rows); + columns = ceil((total_ammo_count)/rows); - ammo_size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows); - } + ammo_size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows); + local vector offset = '0 0 0'; // fteqcc sucks float newSize; @@ -999,38 +1026,48 @@ void HUD_Ammo(void) ammo_size_y = newSize; } - float i, stat_items, currently_selected, infinite_ammo; - infinite_ammo = FALSE; - if (autocvar_hud_panel_ammo_onlycurrent) + float i; + float infinite_ammo = (getstati(STAT_ITEMS, 0, 24) & IT_UNLIMITED_WEAPON_AMMO); + row = column = 0; + if(autocvar_hud_panel_ammo_onlycurrent) { if(autocvar__hud_configure) { - DrawAmmoItem(pos, ammo_size, 2, true, FALSE); //show rockets + DrawAmmoItem(pos, ammo_size, ammo_rockets, TRUE, FALSE); } else { - stat_items = getstati(STAT_ITEMS, 0, 24); - if (stat_items & IT_UNLIMITED_WEAPON_AMMO) - infinite_ammo = TRUE; - for (i = 0; i < AMMO_COUNT; ++i) { - currently_selected = stat_items & GetAmmoItemCode(i); - if (currently_selected) - { - DrawAmmoItem(pos, ammo_size, i, true, infinite_ammo); - break; - } - } + DrawAmmoItem( + pos, + ammo_size, + (get_weaponinfo(switchweapon)).ammo_field, + TRUE, + infinite_ammo + ); + } + + ++row; + if(row >= rows) + { + row = 0; + column = column + 1; } } else { - stat_items = getstati(STAT_ITEMS, 0, 24); - if (stat_items & IT_UNLIMITED_WEAPON_AMMO) - infinite_ammo = TRUE; + .float ammotype; row = column = 0; - for (i = 0; i < AMMO_COUNT; ++i) { - currently_selected = stat_items & GetAmmoItemCode(i); - DrawAmmoItem(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, i, currently_selected, infinite_ammo); + for(i = 0; i < AMMO_COUNT; ++i) + { + ammotype = GetAmmoFieldFromNum(i); + DrawAmmoItem( + pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), + ammo_size, + ammotype, + ((get_weaponinfo(switchweapon)).ammo_field == ammotype), + infinite_ammo + ); + ++row; if(row >= rows) { @@ -1040,6 +1077,15 @@ void HUD_Ammo(void) } } + if (draw_nades) + { + nade_statuschange_elapsedtime = time - nade_statuschange_time; + + float f = bound(0, nade_statuschange_elapsedtime*2, 1); + + DrawAmmoNades(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, nade_prevstatus < nade_cnt && nade_cnt != 0 && f < 1, f); + } + draw_endBoldFont(); } @@ -1704,7 +1750,7 @@ void HUD_Notify(void) { attacker = sprintf(_("Player %d"), count + 1); victim = sprintf(_("Player %d"), count + 2); - icon = strcat("weapon", get_weaponinfo(min(WEP_FIRST + count * 2, WEP_LAST)).netname); + icon = get_weaponinfo(min(WEP_FIRST + count * 2, WEP_LAST)).model2; alpha = bound(0, 1.2 - count / entry_count, 1); } else @@ -4179,9 +4225,9 @@ void HUD_CenterPrint (void) { float r; r = random(); - if (r > 0.9) + if (r > 0.75) centerprint_generic(floor(r*1000), strcat(sprintf("^3Countdown message at time %s", seconds_tostring(time)), ", seconds left: ^COUNT"), 1, 10); - else if (r > 0.8) + else if (r > 0.5) centerprint_generic(0, sprintf("^1Multiline message at time %s that\n^1lasts longer than normal", seconds_tostring(time)), 20, 0); else centerprint_hud(sprintf("Message at time %s", seconds_tostring(time))); @@ -4273,7 +4319,8 @@ void HUD_CenterPrint (void) else // Expiring soon, so fade it out. a = (centerprint_expire_time[j] - time) / max(0.0001, autocvar_hud_panel_centerprint_fade_out); - if (a <= 0.5/255.0) // Guaranteed invisible - don't show. + // while counting down show it anyway in order to hold the current message position + if (a <= 0.5/255.0 && centerprint_countdown_num[j] == 0) // Guaranteed invisible - don't show. continue; if (a > 1) a = 1; @@ -4372,6 +4419,66 @@ void HUD_CenterPrint (void) } } +// Buffs (#18) +// +void HUD_Buffs(void) +{ + float buffs = getstati(STAT_BUFFS, 0, 24); + if(!autocvar__hud_configure) + { + if(!autocvar_hud_panel_buffs) return; + if(spectatee_status == -1) return; + if(getstati(STAT_HEALTH) <= 0) return; + if(!buffs) return; + } + else + { + buffs = Buff_Type_first.items; // force first buff + } + + float b = 0; // counter to tell other functions that we have buffs + entity e; + string s = ""; + for(e = Buff_Type_first; e; e = e.enemy) if(buffs & e.items) + { + ++b; + string o = strcat(rgb_to_hexcolor(Buff_Color(e.items)), Buff_PrettyName(e.items)); + if(s == "") + s = o; + else + s = strcat(s, " ", o); + } + + HUD_Panel_UpdateCvars(); + + draw_beginBoldFont(); + + vector pos, mySize; + pos = panel_pos; + mySize = panel_size; + + HUD_Panel_DrawBg(bound(0, b, 1)); + if(panel_bg_padding) + { + pos += '1 1 0' * panel_bg_padding; + mySize -= '2 2 0' * panel_bg_padding; + } + + //float panel_ar = mySize_x/mySize_y; + //float is_vertical = (panel_ar < 1); + //float buff_iconalign = autocvar_hud_panel_buffs_iconalign; + vector buff_offset = '0 0 0'; + + for(e = Buff_Type_first; e; e = e.enemy) if(buffs & e.items) + { + //DrawNumIcon(pos + buff_offset, mySize, shield, "shield", is_vertical, buff_iconalign, '1 1 1', 1); + drawcolorcodedstring_aspect(pos + buff_offset, s, mySize, panel_fg_alpha * 0.5, DRAWFLAG_NORMAL); + } + + draw_endBoldFont(); +} + + /* ================== Main HUD system @@ -4500,7 +4607,7 @@ void HUD_Main (void) } } if (warning) - print(_("Automatically fixed wrong/missing panel numbers in _hud_panelorder\n")); + dprint("Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"); cvar_set("_hud_panelorder", s); if(hud_panelorder_prev)