#define CENTERPRINT_MAX_LINES 30
string centerprint_messages[CENTERPRINT_MAX_LINES];
float centerprint_width[CENTERPRINT_MAX_LINES];
-vector centerprint_start;
+float centerprint_time;
float centerprint_expire;
float centerprint_num;
float centerprint_offset_hint;
while(getWrappedLine_remaining)
{
s = getWrappedLine(vid_conwidth * 0.75, centerprint_fontsize, stringwidth_colors);
+ if(centerprint_messages[i] != s) // don't fade the same message in, looks stupid
+ centerprint_time = time;
if(centerprint_messages[i])
strunzone(centerprint_messages[i]);
centerprint_messages[i] = strzone(s);
if(havail > vid_conheight - 70)
havail = vid_conheight - 70; // avoid overlapping HUD
- centerprint_start_x = 0;
-
#if 0
float forbiddenmin, forbiddenmax, allowedmin, allowedmax, preferred;
centerprint_start_y = bound(forbiddenmax, preferred, allowedmax);
}
#else
- centerprint_start_y =
- min(
- max(
- max(scoreboard_bottom, vid_conheight * 0.5 + 16),
- (havail - h)/2
- ),
- havail - h
- );
#endif
centerprint_num = i;
+
centerprint_expire = time + cvar("scr_centertime");
}
float i;
vector pos;
string ts;
- float a;
-
- //if(time > centerprint_expire)
- // return;
+ float a, sz;
- //a = bound(0, 1 - 2 * (time - centerprint_expire), 1);
- a = bound(0, 1 - 4 * (time - centerprint_expire), 1);
- //sz = 1.2 / (a + 0.2);
+ if(time - centerprint_time < 0.25)
+ a = (time - centerprint_time) / 0.25;
+ else
+ a = bound(0, 1 - 4 * (time - centerprint_expire), 1);
if(a <= 0)
return;
+ sz = 0.8 + (a / 5);
+
+ if(centerprint_num * cvar("scr_centersize") > 24 && HUD_WouldDrawScoreboard()) // 24 = height of Scoreboard text
+ {
+ centerprint_start_y = scoreboard_bottom + centerprint_fontsize_y;
+ }
pos = centerprint_start;
for (i=0; i<centerprint_num; i = i + 1)
{
- pos_x = (vid_conwidth - centerprint_width[i]) * 0.5;
ts = centerprint_messages[i];
+ drawfontscale = sz * '1 1 0';
+ drawfont = hud_bigfont;
+ pos_x = (vid_conwidth - stringwidth(ts, TRUE, centerprint_fontsize)) * 0.5;
if (ts != "")
{
- drawcolorcodedstring(pos, ts, centerprint_fontsize, a, DRAWFLAG_NORMAL);
- // - '0 0.5 0' * (sz - 1) * centerprint_fontsize_x - '0.5 0 0' * (sz - 1) * centerprint_width[i] * centerprint_fontsize_y, centerprint_fontsize * sz
+ drawcolorcodedstring(pos + '0 1 0' * (1 - sz) * 0.5 *centerprint_fontsize_y, ts, centerprint_fontsize, a, DRAWFLAG_NORMAL);
pos_y = pos_y + centerprint_fontsize_y;
}
else
// half height for empty lines looks better
- pos_y = pos_y + centerprint_fontsize_y * 0.5;
+ pos_y = pos_y + sz * centerprint_fontsize_y * 0.5;
+ drawfontscale = '1 1 0';
+ drawfont = hud_font;
}
}
fputs(fh, strcat("seta hud_configure_grid_ysize \"", cvar_string("hud_configure_grid_ysize"), "\"", "\n"));
fputs(fh, "\n");
+ fputs(fh, strcat("seta scr_centerpos \"", cvar_string("scr_centerpos"), "\"", "\n"));
+ fputs(fh, "\n");
+
// common cvars for all panels
float i;
for (i = 0; i < HUD_PANEL_NUM; ++i)
case HUD_PANEL_PRESSEDKEYS:
fputs(fh, strcat("seta hud_panel_", panel_name, "_aspect \"", cvar_string(strcat("hud_panel_", panel_name, "_aspect")), "\"", "\n"));
break;
+ case HUD_PANEL_INFOMESSAGES:
+ fputs(fh, strcat("seta hud_panel_", panel_name, "_flip \"", cvar_string(strcat("hud_panel_", panel_name, "_flip")), "\"", "\n"));
+ break;
}
fputs(fh, "\n");
}
- fputs(fh, strcat("menu_restart", "\n")); // force a menu update when execing config, so that the dialogs are updated
+ fputs(fh, strcat("menu_sync", "\n")); // force the menu to reread the cvars, so that the dialogs are updated
print("^2Successfully exported to hud_", autocvar_hud_skin, "_", cfgname, ".cfg! (Note: It's saved in data/data/)\n");
}
if (bInputType == 1)
return true;
- if (highlightedPanel_copied != -1 && highlightedPanel_prev != -1)
- {
- // backup first!
- panel_pos_backup = panel_pos;
- panel_size_backup = panel_size;
- highlightedPanel_backup = highlightedPanel_prev;
+ if (highlightedPanel_copied == -1 || highlightedPanel_prev == -1)
+ return true;
- string s;
- s = strcat(ftos(panel_size_copied_x/vid_conwidth), " ", ftos(panel_size_copied_y/vid_conheight));
- cvar_set(strcat("hud_panel_", panel_name, "_size"), s);
- }
+ HUD_Panel_UpdatePosSizeForId(highlightedPanel_prev)
+
+ // reduce size if it'd go beyond screen boundaries
+ vector tmp_size = panel_size_copied;
+ if (panel_pos_x + panel_size_copied_x > vid_conwidth)
+ tmp_size_x = vid_conwidth - panel_pos_x;
+ if (panel_pos_y + panel_size_copied_y > vid_conheight)
+ tmp_size_y = vid_conheight - panel_pos_y;
+
+ if (panel_size == tmp_size)
+ return true;
+
+ // backup first!
+ panel_pos_backup = panel_pos;
+ panel_size_backup = panel_size;
+ highlightedPanel_backup = highlightedPanel_prev;
+
+ string s;
+ s = strcat(ftos(tmp_size_x/vid_conwidth), " ", ftos(tmp_size_y/vid_conheight));
+ cvar_set(strcat("hud_panel_", panel_name, "_size"), s);
}
else if(nPrimary == 'z') // undo last action
{
}
float highlightcheck;
-float would_backup;
+vector prev_pos, prev_size;
void HUD_Panel_Mouse()
{
// TODO: needs better check... is there any float that contains the current state of the menu? _menu_alpha isn't apparently updated the frame the menu gets enabled
if(mouseClicked)
{
- vector prev_pos, prev_size;
if(prevMouseClicked == 0)
{
HUD_Panel_Highlight(); // sets highlightedPanel, highlightedAction, panel_click_distance, panel_click_resizeorigin
// and calls HUD_Panel_UpdatePosSizeForId() for the highlighted panel
- would_backup = TRUE;
- }
- else if (would_backup)
- {
- // this is not the actual backup! Saving pos and size values
- // only to check later if they are different from new values
prev_pos = panel_pos;
prev_size = panel_size;
}
+ else
+ HUD_Panel_UpdatePosSizeForId(highlightedPanel)
- hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions);
+ if (prev_pos != panel_pos || prev_size != panel_size)
+ {
+ hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions);
+ // backup!
+ panel_pos_backup = prev_pos;
+ panel_size_backup = prev_size;
+ highlightedPanel_backup = highlightedPanel;
+ }
+ else
+ // in case the clicked panel is inside another panel and we aren't
+ // moving it, avoid the immediate "fix" of its position/size
+ // (often unwanted and hateful) by disabling collisions check
+ hud_configure_checkcollisions = false;
if(highlightedAction == 1)
HUD_Panel_SetPos(mousepos - panel_click_distance);
HUD_Panel_SetPosSize(mySize);
}
- HUD_Panel_UpdatePosSizeForId(highlightedPanel)
- if (prevMouseClicked)
- if (would_backup)
- if (prev_pos != panel_pos || prev_size != panel_size)
- {
- // backup!
- panel_pos_backup = prev_pos;
- panel_size_backup = prev_size;
- highlightedPanel_backup = highlightedPanel;
- would_backup = FALSE;
- }
-
// doubleclick check
if(time - prevMouseClickedTime < 0.4 && prevMouseClicked == 0 && prevMouseClickedPos == mousepos && highlightedPanel >= 0)
{
cursorsize = '32 32 0';
if(highlightcheck == 0)
- drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
else if(highlightcheck == 1)
- drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_move.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_move.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
else if(highlightcheck == 2)
- drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
else
- drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize2.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+ drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize2.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
prevMouseClicked = mouseClicked;
}
case WEP_UZI: return 1;
case WEP_CAMPINGRIFLE: 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;
return;
float timeout = cvar("hud_panel_weapons_timeout");
- float timeout_effect_lenght;
+ float timeout_effect_length, timein_effect_length;
if (cvar("hud_panel_weapons_timeout_effect") == 0)
- timeout_effect_lenght = 0;
+ {
+ timeout_effect_length = 0;
+ timein_effect_length = 0;
+ }
else
- timeout_effect_lenght = 0.75;
+ {
+ timeout_effect_length = 0.75;
+ timein_effect_length = 0.375;
+ }
- if (timeout && time >= weapontime + timeout + timeout_effect_lenght && !autocvar__hud_configure)
+ if (timeout && time >= weapontime + timeout + timeout_effect_length && !autocvar__hud_configure)
+ {
+ weaponprevtime = time;
return;
+ }
active_panel = HUD_PANEL_WEAPONS;
HUD_Panel_UpdateCvars(weapons);
if (timeout && time >= weapontime + timeout && !autocvar__hud_configure)
{
- float f = (time - (weapontime + timeout)) / timeout_effect_lenght;
- if (cvar("hud_panel_weapons_timeout_effect") == 2)
+ float f = (time - (weapontime + timeout)) / timeout_effect_length;
+ if (cvar("hud_panel_weapons_timeout_effect"))
{
panel_bg_alpha *= (1 - f);
panel_fg_alpha *= (1 - f);
}
- else
+ if (cvar("hud_panel_weapons_timeout_effect") == 1)
+ {
+ f *= f; // for a cooler movement
+ vector center;
+ center_x = panel_pos_x + panel_size_x/2;
+ center_y = panel_pos_y + panel_size_y/2;
+ float screen_ar = vid_conwidth/vid_conheight;
+ if (center_x/center_y < screen_ar) //bottom left
+ {
+ if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
+ panel_pos_y += f * (vid_conheight - panel_pos_y);
+ else //left
+ panel_pos_x -= f * (panel_pos_x + panel_size_x);
+ }
+ else //top right
+ {
+ if ((vid_conwidth - center_x)/center_y < screen_ar) //right
+ panel_pos_x += f * (vid_conwidth - panel_pos_x);
+ else //top
+ panel_pos_y -= f * (panel_pos_y + panel_size_y);
+ }
+ }
+ weaponprevtime = time - (1 - f) * timein_effect_length;
+ }
+ else if (timeout && time < weaponprevtime + timein_effect_length && !autocvar__hud_configure)
+ {
+ float f = (time - weaponprevtime) / timein_effect_length;
+ if (cvar("hud_panel_weapons_timeout_effect"))
+ {
+ panel_bg_alpha *= (f);
+ panel_fg_alpha *= (f);
+ }
+ if (cvar("hud_panel_weapons_timeout_effect") == 1)
{
f *= f; // for a cooler movement
+ f = 1 - f;
vector center;
center_x = panel_pos_x + panel_size_x/2;
center_y = panel_pos_y + panel_size_y/2;
mySize -= '2 2 0' * panel_bg_padding;
}
- float armor, health;
+ float armor, health, fuel;
armor = getstati(STAT_ARMOR);
health = getstati(STAT_HEALTH);
-
- float fuel;
- fuel = getstati(GetAmmoStat(4)); // how much fuel do we have?
+ fuel = getstati(STAT_FUEL);
if(autocvar__hud_configure)
{
killnotify_victims[0] = strzone(victim);
}
-void HUD_KillNotify(string s1, string s2, string s3, float type, float msg)
+void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s1 = attacker, s2 = victim
{
float w;
float alsoprint, gentle;
}
else if(type == KILL_FIRST_BLOOD)
print("^1",s1, "^1 drew first blood", "\n");
- // TODO: icon!
- else if (type == DEATH_TELEFRAG)
- print ("^1",s1, "^1 was telefragged by ", s2, "\n");
+ else if (type == DEATH_TELEFRAG) {
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_TELEFRAG);
+ if(gentle)
+ print ("^1",s2, "^1 tried to occupy ", s1, "^1's teleport destination space\n");
+ else
+ print ("^1",s2, "^1 was telefragged by ", s1, "\n");
+ }
else if (type == DEATH_DROWN) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_DROWN);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_DROWN);
if(alsoprint)
- print ("^1",s1, "^1 was drowned by ", s2, "\n");
+ print ("^1",s2, "^1 was drowned by ", s1, "\n");
}
else if (type == DEATH_SLIME) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_SLIME);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_SLIME);
if(alsoprint)
- print ("^1",s1, "^1 was slimed by ", s2, "\n");
+ print ("^1",s2, "^1 was slimed by ", s1, "\n");
}
else if (type == DEATH_LAVA) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_LAVA);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_LAVA);
if(alsoprint)
- print ("^1",s1, "^1 was cooked by ", s2, "\n");
+ print ("^1",s2, "^1 was cooked by ", s1, "\n");
}
else if (type == DEATH_FALL) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_FALL);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_FALL);
if(alsoprint)
- print ("^1",s1, "^1 was grounded by ", s2, "\n");
+ print ("^1",s2, "^1 was grounded by ", s1, "\n");
}
else if (type == DEATH_SHOOTING_STAR) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_SHOOTING_STAR);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_SHOOTING_STAR);
if(alsoprint)
- print ("^1",s1, "^1 was shot into space by ", s2, "\n");
+ print ("^1",s2, "^1 was shot into space by ", s1, "\n");
}
else if (type == DEATH_SWAMP) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was conserved by ", s2, "\n");
+ print ("^1",s2, "^1 was conserved by ", s1, "\n");
}
else if (type == DEATH_HURTTRIGGER)
{
- HUD_KillNotify_Push(s2, s1, 1, DEATH_HURTTRIGGER);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER);
if(alsoprint)
- print("^1",s1, "^1 was thrown into a world of hurt by ", s2, "\n");
+ print("^1",s2, "^1 was thrown into a world of hurt by ", s1, "\n");
} else if(type == DEATH_SBCRUSH) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was crushed by ^1", s2, "\n");
+ print ("^1",s2, "^1 was crushed by ^1", s1, "\n");
} else if(type == DEATH_SBMINIGUN) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 got shredded by ^1", s2, "\n");
+ print ("^1",s2, "^1 got shredded by ^1", s1, "\n");
} else if(type == DEATH_SBROCKET) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was blased to bits by ^1", s2, "\n");
+ print ("^1",s2, "^1 was blased to bits by ^1", s1, "\n");
} else if(type == DEATH_SBBLOWUP) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 got caught in the destruction of ^1", s2, "'s vehicle\n");
+ print ("^1",s2, "^1 got caught in the destruction of ^1", s1, "'s vehicle\n");
} else if(type == DEATH_WAKIGUN) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was bolted down by ^1", s2, "\n");
+ print ("^1",s2, "^1 was bolted down by ^1", s1, "\n");
} else if(type == DEATH_WAKIROCKET) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 could find no shelter from ^1", s2, "'s rockets\n");
+ print ("^1",s2, "^1 could find no shelter from ^1", s1, "'s rockets\n");
} else if(type == DEATH_WAKIBLOWUP) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 dies when ^1", s2, "'s wakizashi dies.\n");
+ print ("^1",s2, "^1 dies when ^1", s1, "'s wakizashi dies.\n");
} else if(type == DEATH_TURRET) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was pushed into the line of fire by ^1", s2, "\n");
+ print ("^1",s2, "^1 was pushed into the line of fire by ^1", s1, "\n");
} else if(type == DEATH_TOUCHEXPLODE) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was pushed into an accident by ^1", s2, "\n");
+ print ("^1",s2, "^1 was pushed into an accident by ^1", s1, "\n");
} else if(type == DEATH_CHEAT) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was unfairly eliminated by ^1", s2, "\n");
+ print ("^1",s2, "^1 was unfairly eliminated by ^1", s1, "\n");
} else if (type == DEATH_FIRE) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was burnt to death by ^1", s2, "\n");
+ print ("^1",s2, "^1 was burnt to death by ^1", s1, "\n");
} else if (type == DEATH_CUSTOM) {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_CUSTOM);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_CUSTOM);
+ if(alsoprint)
+ print("^1", sprintf(s3, strcat(s2, "^1"), strcat(s1, "^1")), "\n");
+ } else if (type == DEATH_HURTTRIGGER) {
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER);
if(alsoprint)
- print ("^1",s1, "^1 ", s2, "\n");
+ print("^1", sprintf(s3, strcat(s2, "^1"), strcat(s1, "^1")), "\n");
} else {
- HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+ HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
if(alsoprint)
- print ("^1",s1, "^1 was fragged by ", s2, "\n");
+ print ("^1",s2, "^1 was fragged by ", s1, "\n");
}
} else if(msg == MSG_SPREE) {
if(type == KILL_END_SPREE) {
} else if (type == DEATH_CUSTOM) {
HUD_KillNotify_Push(s1, "", 0, DEATH_CUSTOM);
if(alsoprint)
- print ("^1",s1, "^1 ", s2, "\n");
+ print("^1", sprintf(s2, strcat(s1, "^1")), "\n");
} else if (type == DEATH_HURTTRIGGER) {
HUD_KillNotify_Push(s1, "", 0, DEATH_HURTTRIGGER);
if(alsoprint)
- print ("^1",s1, "^1 was in the wrong place\n");
+ print("^1", sprintf(s2, strcat(s1, "^1")), "\n");
} else if(type == DEATH_TOUCHEXPLODE) {
HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
if(alsoprint)
centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1Don't shoot your team mates!"));
} else if (type == DEATH_QUIET) {
// do nothing
- } else if (type == DEATH_KILL) {
+ } else { // generic message
if(gentle)
centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You need to be more careful!"));
else
} else {
centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You fragged ^7", s1, s2));
}
- } else if (type == KILL_FRAGGED) {
+ } else { // generic message
if(gentle) {
centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were scored against by ^7", s1, s2));
} else {
float width_attacker;
string attacker, victim;
- float i, j;
+ float i, j, w;
for(j = 0; j < entries; ++j)
{
s = "";
a = 0;
}
- float w;
+ w = -1;
w = DEATH_WEAPONOF(killnotify_deathtype[j]);
// TODO: maybe print in team colors?
{
s = "notify_teamkill_red";
}
+ else if(killnotify_deathtype[j] == DEATH_TELEFRAG)
+ {
+ s = "notify_telefrag";
+ }
else if(killnotify_deathtype[j] == DEATH_DROWN)
{
s = "notify_water";
pos = panel_pos;
mySize = panel_size;
+ if(!autocvar__hud_configure)
+ {
+ panel_fg_alpha = autocvar_hud_panel_fg_alpha;
+ panel_bg_alpha_str = autocvar_hud_panel_vote_bg_alpha;
+
+ if(panel_bg_alpha_str == "") {
+ panel_bg_alpha_str = ftos(autocvar_hud_panel_bg_alpha);
+ }
+ panel_bg_alpha = stof(panel_bg_alpha_str);
+ }
+
string s;
float a;
if(vote_active != vote_prev) {
if(!vote_alpha)
return;
- a = vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
-
+ a = panel_bg_alpha * vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
HUD_Panel_DrawBg(a);
+ a = panel_fg_alpha * vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
if(panel_bg_padding)
{
pos += '1 1 0' * panel_bg_padding;
mySize = newSize;
s = "A vote has been called for:";
- drawstring_aspect(pos, s, eX * mySize_x + eY * (2/8) * mySize_y, '1 1 1', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring_aspect(pos, s, eX * mySize_x + eY * (2/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
s = textShortenToWidth(vote_called_vote, mySize_x, '1 1 0' * mySize_y * (1.75/8), stringwidth_colors);
if(autocvar__hud_configure)
s = "^1Configure the HUD";
- drawcolorcodedstring_aspect(pos + eY * (2/8) * mySize_y, s, eX * mySize_x + eY * (1.75/8) * mySize_y, a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawcolorcodedstring_aspect(pos + eY * (2/8) * mySize_y, s, eX * mySize_x + eY * (1.75/8) * mySize_y, a, DRAWFLAG_NORMAL);
// print the yes/no counts
- s = strcat("Yes (", getcommandkey("not bound", "vyes"), "): ", ftos(vote_yescount));
- drawstring_aspect(pos + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
- s = strcat("No (", getcommandkey("not bound", "vno"), "): ", ftos(vote_nocount));
- drawstring_aspect(pos + eX * 0.5 * mySize_x + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '1 0 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ s = strcat("Yes (", getcommandkey("vyes", "vyes"), "): ", ftos(vote_yescount));
+ drawstring_aspect(pos + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '0 1 0', a, DRAWFLAG_NORMAL);
+ s = strcat("No (", getcommandkey("vno", "vno"), "): ", ftos(vote_nocount));
+ drawstring_aspect(pos + eX * 0.5 * mySize_x + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '1 0 0', a, DRAWFLAG_NORMAL);
// draw the progress bar backgrounds
- drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_back", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_back", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
// draw the highlights
if(vote_highlighted == 1) {
drawsetcliparea(pos_x, pos_y, mySize_x * 0.5, mySize_y);
- drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
}
else if(vote_highlighted == 2) {
drawsetcliparea(pos_x + 0.5 * mySize_x, pos_y, mySize_x * 0.5, mySize_y);
- drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
}
// draw the progress bars
drawsetcliparea(pos_x, pos_y, mySize_x * 0.5 * (vote_yescount/vote_needed), mySize_y);
- drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
drawsetcliparea(pos_x + mySize_x - mySize_x * 0.5 * (vote_nocount/vote_needed), pos_y, mySize_x * 0.5, mySize_y);
- drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 0 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
drawresetcliparea();
drawfont = hud_font;
}
+void DrawDomItem(vector myPos, vector mySize, float aspect_ratio, float i)
+{
+ float stat, pps_ratio;
+ string pic;
+ vector color;
+ switch(i)
+ {
+ case 0:
+ stat = getstatf(STAT_DOM_PPS_RED);
+ pic = "dom_icon_red";
+ color = '1 0 0';
+ break;
+ case 1:
+ stat = getstatf(STAT_DOM_PPS_BLUE);
+ pic = "dom_icon_blue";
+ color = '0 0 1';
+ break;
+ case 2:
+ stat = getstatf(STAT_DOM_PPS_YELLOW);
+ pic = "dom_icon_yellow";
+ color = '1 1 0';
+ break;
+ case 3:
+ stat = getstatf(STAT_DOM_PPS_PINK);
+ pic = "dom_icon_pink";
+ color = '1 0 1';
+ }
+ pps_ratio = stat / getstatf(STAT_DOM_TOTAL_PPS);
+
+ if(mySize_x/mySize_y > aspect_ratio)
+ {
+ i = aspect_ratio * mySize_y;
+ myPos_x = myPos_x + (mySize_x - i) / 2;
+ mySize_x = i;
+ }
+ else
+ {
+ i = 1/aspect_ratio * mySize_x;
+ myPos_y = myPos_y + (mySize_y - i) / 2;
+ mySize_y = i;
+ }
+
+ if (cvar("hud_panel_modicons_dom_layout")) // show text too
+ {
+ //draw the text
+ drawfont = hud_bigfont;
+ color *= 0.5 + pps_ratio * (1 - 0.5); // half saturated color at min, full saturated at max
+ if (cvar("hud_panel_modicons_dom_layout") == 2) // average pps
+ drawstring_aspect(myPos + eX * mySize_y, ftos_decimals(stat, 2), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+ else // percentage of average pps
+ drawstring_aspect(myPos + eX * mySize_y, strcat( ftos(floor(pps_ratio*100 + 0.5)), "%" ), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawfont = hud_font;
+ }
+
+ //draw the icon
+ drawpic_aspect_skin(myPos, pic, '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ if (stat > 0)
+ {
+ drawsetcliparea(myPos_x, myPos_y + mySize_y * (1 - pps_ratio), mySize_y, mySize_y * pps_ratio);
+ drawpic_aspect_skin(myPos, strcat(pic, "-highlighted"), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawresetcliparea();
+ }
+}
+
+void HUD_Mod_Dom(vector myPos, vector mySize)
+{
+ entity tm;
+ float teams_count;
+ for(tm = teams.sort_next; tm; tm = tm.sort_next)
+ if(tm.team != COLOR_SPECTATOR)
+ ++teams_count;
+
+ float rows, columns, aspect_ratio;
+ rows = mySize_y/mySize_x;
+ aspect_ratio = (cvar("hud_panel_modicons_dom_layout")) ? 3 : 1;
+ rows = bound(1, floor((sqrt((4 * aspect_ratio * teams_count + rows) * rows) + rows + 0.5) / 2), teams_count);
+ columns = ceil(teams_count/rows);
+
+ drawfont = hud_bigfont;
+ int i;
+ float row, column;
+ for(i=0; i<teams_count; ++i)
+ {
+ vector pos, size;
+ pos = myPos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows);
+ size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows);
+
+ DrawDomItem(pos, size, aspect_ratio, i);
+
+ ++row;
+ if(row >= rows)
+ {
+ row = 0;
+ ++column;
+ }
+ }
+ drawfont = hud_font;
+}
+
float mod_prev; // previous state of mod_active to check for a change
float mod_alpha;
float mod_change; // "time" when mod_active changed
if(!autocvar_hud_panel_modicons && !autocvar__hud_configure)
return;
- if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && !autocvar__hud_configure)
+ if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_DOMINATION && !autocvar__hud_configure)
return;
active_panel = HUD_PANEL_MODICONS;
HUD_Mod_NexBall(pos, mySize);
else if(gametype == GAME_CTS || gametype == GAME_RACE)
HUD_Mod_Race(pos, mySize);
+ else if(gametype == GAME_DOMINATION)
+ HUD_Mod_Dom(pos, mySize);
}
// Draw pressed keys (#11)
{
panel_pos_y = panel_bg_border;
panel_size_y = vid_conheight - panel_bg_border * 2;
- if(panel_bg == "0")
- panel_bg = "border"; // force a border when maximized
+ if(panel_bg == "0") // force a border when maximized
+ {
+ if(precache_pic(panel_bg) == "") {
+ panel_bg = strcat(hud_skin_path, "/border_default");
+ if(precache_pic(panel_bg) == "") {
+ panel_bg = "gfx/hud/default/border_default";
+ }
+ }
+ }
panel_bg_alpha = max(0.75, panel_bg_alpha); // force an alpha of at least 0.75
}
mySize -= '2 2 0' * panel_bg_padding;
}
+ float currentTime = gettime(GETTIME_REALTIME);
if(cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage"))
{
- frametimeavg = (frametimeavg + frametimeavg1 + frametimeavg2 + frametime)/4; // average three frametimes into framecounter for slightly more stable fps readings :P
+ float currentframetime = currentTime - prevfps_time;
+ frametimeavg = (frametimeavg + frametimeavg1 + frametimeavg2 + currentframetime)/4; // average three frametimes into framecounter for slightly more stable fps readings :P
frametimeavg2 = frametimeavg1;
frametimeavg1 = frametimeavg;
float weight;
weight = cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight");
- if(frametime > 0.0001) // filter out insane values which sometimes seem to occur and throw off the average? If you are getting 10,000 fps or more, then you don't need a framerate counter.
+ if(currentframetime > 0.0001) // filter out insane values which sometimes seem to occur and throw off the average? If you are getting 10,000 fps or more, then you don't need a framerate counter.
{
- if(fabs(prevfps - (1/frametimeavg)) > prevfps * cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold")) // if there was a big jump in fps, just force prevfps at current (1/frametime) to make big updates instant
- prevfps = (1/frametime);
+ if(fabs(prevfps - (1/frametimeavg)) > prevfps * cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold")) // if there was a big jump in fps, just force prevfps at current (1/currentframetime) to make big updates instant
+ prevfps = (1/currentframetime);
prevfps = (1 - weight) * prevfps + weight * (1/frametimeavg); // framecounter just used so there's no need for a new variable, think of it as "frametime average"
}
+ prevfps_time = currentTime;
}
else
{
framecounter += 1;
- if(time - prevfps_time > cvar("hud_panel_engineinfo_framecounter_time"))
+ if(currentTime - prevfps_time > cvar("hud_panel_engineinfo_framecounter_time"))
{
- prevfps = framecounter/cvar("hud_panel_engineinfo_framecounter_time");
+ prevfps = framecounter/(currentTime - prevfps_time);
framecounter = 0;
- prevfps_time = time;
+ prevfps_time = currentTime;
}
}
// Info messages panel (#14)
//
+#define drawInfoMessage(s)\
+ if(autocvar_hud_panel_infomessages_flip)\
+ o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);\
+ drawcolorcodedstring(o, s, fontsize, a, DRAWFLAG_NORMAL);\
+ o_y += fontsize_y;
void HUD_InfoMessages(void)
{
if(!autocvar_hud_panel_infomessages && !autocvar__hud_configure)
vector fontsize;
fontsize = '0.20 0.20 0' * mySize_y;
+ float a;
+ if(spectatee_status != 0)
+ a = 1;
+ else
+ a = panel_fg_alpha;
+
string s;
if(!autocvar__hud_configure)
{
s = "^1Observing";
else
s = strcat("^1Spectating: ^7", GetPlayerName(spectatee_status - 1));
-
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
if(spectatee_status == -1)
- s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate");
+ s = strcat("^1Press ^3", getcommandkey("primary fire", "+fire"), "^1 to spectate");
else
- s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player");
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ s = strcat("^1Press ^3", getcommandkey("primary fire", "+fire"), "^1 for another player");
+ drawInfoMessage(s)
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");
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ s = strcat("^1Press ^3", getcommandkey("secondary fire", "+fire2"), "^1 to observe");
+ drawInfoMessage(s)
s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info");
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
if(gametype == GAME_ARENA)
s = "^1Wait for your turn to join";
}
else
s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
//show restart countdown:
if (time < getstatf(STAT_GAMESTARTTIME)) {
//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");
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawcolorcodedstring(o, s, fontsize, a, DRAWFLAG_NORMAL);
+ o_y += fontsize_y;
}
}
if(warmup_stage && !intermission)
{
s = "^2Currently in ^1warmup^2 stage!";
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
}
string blinkcolor;
else
s = strcat("^2Waiting for others to ready up...");
}
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
}
else if(warmup_stage && !intermission && !spectatee_status)
{
s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup");
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
}
if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger)
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(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
}
}
}
else
{
s = "^7Press ^3ESC ^7to show HUD options.";
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
s = "^3Doubleclick ^7a panel for panel-specific options.";
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
s = "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and";
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
s = "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments.";
- if(autocvar_hud_panel_infomessages_flip)
- o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);
- drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
- o += eY * fontsize_y;
+ drawInfoMessage(s)
}
}
{
hud_skin_path = strcat("gfx/hud/", autocvar_hud_skin);
+ // global hud alpha fade
if(disable_menu_alphacheck == 1)
- menu_fade_alpha = 1;
+ hud_fade_alpha = 1;
else
- menu_fade_alpha = (1 - autocvar__menu_alpha);
+ hud_fade_alpha = (1 - autocvar__menu_alpha);
+
+ if(scoreboard_fade_alpha)
+ hud_fade_alpha = (1 - scoreboard_fade_alpha);
+
+ if(intermission == 2) // no hud during mapvote
+ hud_fade_alpha = 0;
+ else if(autocvar__menu_alpha == 0 && scoreboard_fade_alpha == 0)
+ hud_fade_alpha = 1;
hud_border_thickness = bound(0, cvar("hud_border_thickness"), 5);
hud_accuracy_border_thickness = bound(0, cvar_or("hud_accuracy_border_thickness", 1), 5);
string pic;
pic = strcat(hud_skin_path, "/", autocvar_hud_dock);
if(precache_pic(pic) == "") {
- pic = "gfx/hud/default/dock";
+ pic = strcat(hud_skin_path, "/dock_medium");
+ if(precache_pic(pic) == "") {
+ pic = "gfx/hud/default/dock_medium";
+ }
}
- drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, autocvar_hud_dock_alpha * menu_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock...
+ drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, autocvar_hud_dock_alpha * hud_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock...
}
// cache the panel order into the panel_order array