case HUD_PANEL_WEAPONICONS:
fputs(fh, strcat("seta hud_", panel_name, "_complainbubble \"", cvar_string(strcat("hud_", panel_name, "_complainbubble")), "\"", "\n"));
fputs(fh, strcat("seta hud_", panel_name, "_complainbubble_padding \"", cvar_string(strcat("hud_", panel_name, "_complainbubble_padding")), "\"", "\n"));
+ fputs(fh, strcat("seta hud_", panel_name, "_complainbubble_color_outofammo \"", cvar_string(strcat("hud_", panel_name, "_complainbubble_color_outofammo")), "\"", "\n"));
+ fputs(fh, strcat("seta hud_", panel_name, "_complainbubble_color_donthave \"", cvar_string(strcat("hud_", panel_name, "_complainbubble_color_donthave")), "\"", "\n"));
+ fputs(fh, strcat("seta hud_", panel_name, "_complainbubble_color_unavailable \"", cvar_string(strcat("hud_", panel_name, "_complainbubble_color_unavailable")), "\"", "\n"));
fputs(fh, strcat("seta hud_", panel_name, "_ammo_color \"", cvar_string(strcat("hud_", panel_name, "_ammo_color")), "\"", "\n"));
fputs(fh, strcat("seta hud_", panel_name, "_ammo_alpha \"", cvar_string(strcat("hud_", panel_name, "_ammo_alpha")), "\"", "\n"));
fputs(fh, strcat("seta hud_", panel_name, "_aspect \"", cvar_string(strcat("hud_", panel_name, "_ammo_alpha")), "\"", "\n"));
if(highlightedPanel != -1)
highlightedPanel_prev = highlightedPanel;
- mousepos = mousepos + getmousepos();
+ mousepos = mousepos + getmousepos() * cvar("menu_mouse_speed");
mousepos_x = bound(0, mousepos_x, vid_conwidth);
mousepos_y = bound(0, mousepos_y, vid_conheight);
}
}
+#define acc_color(i) stov(cvar_string(strcat("hud_weaponicons_accuracy_color", ftos(i))))
+#define MAX_ACCURACY_LEVELS 10
+float acc_lev[MAX_ACCURACY_LEVELS];
+
void HUD_WeaponIcons(void)
{
if(!autocvar_hud_weaponicons && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_WEAPONICONS;
- HUD_Panel_UpdateCvarsForId(id);
- float alpha, stat_weapons; // "constants"
+ active_panel = HUD_PANEL_WEAPONICONS;
+ HUD_Panel_UpdateCvars(weaponicons);
vector pos, mySize;
- float i, weapid, fade, weapon_stats, weapon_hit, weapon_damage, weapon_cnt; // variables
+ float i, weapid, fade, weapon_stats, weapon_number, weapon_cnt;
pos = panel_pos;
mySize = panel_size;
- stat_weapons = getstati(STAT_WEAPONS);
weapon_cnt = 0;
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
{
vector color;
vector wpnpos;
vector wpnsize;
+
+ float acc_levels;
+ if(autocvar_hud_weaponicons_accuracy && !(gametype == GAME_RACE || gametype == GAME_CTS))
+ {
+ acc_levels = tokenize(cvar_string("hud_weaponicons_accuracy_color_levels"));
+ if (acc_levels > MAX_ACCURACY_LEVELS)
+ acc_levels = MAX_ACCURACY_LEVELS;
+
+ for (i = 0; i < acc_levels; ++i)
+ acc_lev[i] = stof(argv(i));
+ }
+
for(i = 0; i < weapon_cnt; ++i)
{
wpnpos = pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows);
self = weaponorder[i];
weapid = self.impulse;
- alpha = (self.weapon == activeweapon) ? 1 : 0.6;
-
- weapon_hit = weapon_hits[self.weapon-WEP_FIRST];
- weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
-
// draw background behind currently selected weapon
if(self.weapon == activeweapon)
drawpic_aspect_skin(wpnpos, "weapon_current_bg", wpnsize, '1 1 1', fade * panel_fg_alpha, DRAWFLAG_NORMAL);
// draw the weapon accuracy
- if(autocvar_hud_weaponicons_accuracy && !(gametype == GAME_RACE || gametype == GAME_CTS))
+ if(acc_levels)
{
+ float weapon_hit, weapon_damage;
+ weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
if(weapon_damage)
+ {
+ weapon_hit = weapon_hits[self.weapon-WEP_FIRST];
weapon_stats = floor(100 * weapon_hit / weapon_damage);
-
- // yellow_accuracy = value at which accuracy becomes yellow
- if(weapon_stats >= 100) {
- color_x = 0;
- color_y = 1;
- }
- else if(weapon_stats > autocvar_hud_weaponicons_accuracy_yellow) {
- color_x = 1 - (weapon_stats-autocvar_hud_weaponicons_accuracy_yellow)/(100-autocvar_hud_weaponicons_accuracy_yellow); // red value between 1 -> 0
- color_y = 1;
- } else {
- color_x = 1;
- color_y = weapon_stats/autocvar_hud_weaponicons_accuracy_yellow; // green value between 0 -> 1
}
- color_z = 0;
+
+ // find the max level lower than weapon_stats
+ float j;
+ j = acc_levels-1;
+ while ( j && weapon_stats < acc_lev[j] )
+ --j;
+
+ // inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j
+ float factor;
+ factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]);
+ color = acc_color(j);
+ color = color + factor * (acc_color(j+1) - color);
if(weapon_damage)
drawpic_aspect_skin(wpnpos, "weapon_accuracy", wpnsize, color, panel_fg_alpha, DRAWFLAG_NORMAL);
}
// draw the weapon icon
- if((self.impulse >= 0) && (stat_weapons & self.weapons))
+ if((self.impulse >= 0) && (getstati(STAT_WEAPONS) & self.weapons))
{
drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', fade * panel_fg_alpha, DRAWFLAG_NORMAL);
string s;
if(complain_weapon_type == 0) {
s = "Out of ammo";
- color = '1 0 0';
+ color = autocvar_hud_weaponicons_complainbubble_color_outofammo;
}
else if(complain_weapon_type == 1) {
s = "Don't have";
- color = '1 1 0';
+ color = autocvar_hud_weaponicons_complainbubble_color_donthave;
}
else {
s = "Unavailable";
- color = '1 1 1';
+ color = autocvar_hud_weaponicons_complainbubble_color_unavailable;
}
- drawpic_aspect_skin(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) + '1 1 0' * autocvar_hud_weaponicons_complainbubble_padding, "weapon_complainbubble", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows) - '2 2 0' * autocvar_hud_weaponicons_complainbubble_padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
- drawstring_aspect(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) + '1 1 0' * autocvar_hud_weaponicons_complainbubble_padding, s, eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows) - '2 2 0' * autocvar_hud_weaponicons_complainbubble_padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
+ drawpic_aspect_skin(wpnpos + '1 1 0' * autocvar_hud_weaponicons_complainbubble_padding, "weapon_complainbubble", wpnsize - '2 2 0' * autocvar_hud_weaponicons_complainbubble_padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(wpnpos + '1 1 0' * autocvar_hud_weaponicons_complainbubble_padding, s, wpnsize - '2 2 0' * autocvar_hud_weaponicons_complainbubble_padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
}
++row;
if(!autocvar_hud_inventory && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_INVENTORY;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_INVENTORY;
+ HUD_Panel_UpdateCvars(inventory);
float i, currently_selected;
vector pos, mySize;
if(!autocvar_hud_powerups && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_POWERUPS;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_POWERUPS;
+ HUD_Panel_UpdateCvars(powerups);
float stat_items;
stat_items = getstati(STAT_ITEMS);
if(!autocvar_hud_healtharmor && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_HEALTHARMOR;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_HEALTHARMOR;
+ HUD_Panel_UpdateCvars(healtharmor);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
{
if(autocvar_hud_healtharmor_baralign == 1 || autocvar_hud_healtharmor_baralign == 3) { // right align
barpos = pos + eX * mySize_x - eX * mySize_x * min(1, leftcnt/200);
- barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
+ barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y;
} else { // left align
barpos = pos;
- barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y;
+ barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y;
}
HUD_Panel_GetProgressBarColor(leftname)
if(!autocvar_hud_notify && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_NOTIFY;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_NOTIFY;
+ HUD_Panel_UpdateCvars(notify);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
{
s = "notify_death";
}
- // TODO: ctf icons...
else if(killnotify_deathtype[j] == INFO_GOTFLAG)
{
if(killnotify_victims[j] == "^1RED^7 flag")
if(!autocvar_hud_timer && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_TIMER;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_TIMER;
+ HUD_Panel_UpdateCvars(timer);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
if ((autocvar_hud_radar == 0 || (autocvar_hud_radar != 2 && !teamplay)) && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_RADAR;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_RADAR;
+ HUD_Panel_UpdateCvars(radar);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
if(!autocvar_hud_score && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_SCORE;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_SCORE;
+ HUD_Panel_UpdateCvars(score);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
pl = world;
score = me.(scores[ps_primary]);
- timer = seconds_tostring(score/TIME_FACTOR);
- timer = strcat(timer, ":", ftos_decimals(mod(score, TIME_FACTOR), log(TIME_FACTOR)));
+ timer = TIME_ENCODED_TOSTRING(score);
if (pl && ((!(scores_flags[ps_primary] & SFL_ZERO_IS_WORST)) || score)) {
// distribution display
distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]);
- distrtimer = seconds_tostring(distribution/TIME_FACTOR);
- distrtimer = strcat(timer, ":", ftos_decimals(mod(distribution, TIME_FACTOR), log(TIME_FACTOR)));
+ distrtimer = ftos(distribution/pow(10, TIME_DECIMALS));
if (distribution <= 0) {
distribution_color = '0 1 0';
if(!autocvar_hud_racetimer && !(gametype == GAME_RACE || gametype == GAME_CTS) && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_RACETIMER;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_RACETIMER;
+ HUD_Panel_UpdateCvars(racetimer);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
if(!autocvar_hud_vote && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_VOTE;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_VOTE;
+ HUD_Panel_UpdateCvars(vote);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_MODICONS;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_MODICONS;
+ HUD_Panel_UpdateCvars(modicons);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
if(!(spectatee_status > 0 || autocvar_hud_pressedkeys >= 2 || autocvar__hud_configure))
return;
- float id = HUD_PANEL_PRESSEDKEYS;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_PRESSEDKEYS;
+ HUD_Panel_UpdateCvars(pressedkeys);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
return;
}
- float id = HUD_PANEL_CHAT;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_CHAT;
+ HUD_Panel_UpdateCvars(chat);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
if(!autocvar_hud_engineinfo && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_ENGINEINFO;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_ENGINEINFO;
+ HUD_Panel_UpdateCvars(engineinfo);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
if(!autocvar_hud_infomessages && !autocvar__hud_configure)
return;
- float id = HUD_PANEL_INFOMESSAGES;
- HUD_Panel_UpdateCvarsForId(id);
+ active_panel = HUD_PANEL_INFOMESSAGES;
+ HUD_Panel_UpdateCvars(infomessages);
vector pos, mySize;
pos = panel_pos;
mySize = panel_size;
float f;
vector color;
- if(teamplay && autocvar_hud_dock_color_team) {
+ if((teamplay) && autocvar_hud_dock_color_team) {
f = stof(getplayerkey(player_localentnum - 1, "colors"));
color = colormapPaletteColor(mod(f, 16), 1) * autocvar_hud_dock_color_team;
}
+ else if(autocvar_hud_configure_teamcolorforced && autocvar__hud_configure && autocvar_hud_dock_color_team) {
+ color = '1 0 0' * autocvar_hud_dock_color_team;
+ }
else if(autocvar_hud_dock_color == "shirt") {
f = stof(getplayerkey(player_localentnum - 1, "colors"));
color = colormapPaletteColor(floor(f / 16), 0);