1#include "vote.qh"
2
3#include <common/mapinfo.qh>
4
5// Vote (#9)
6
7void HUD_Vote()
8{
9	if(autocvar_cl_allow_uid2name == -1 && (gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE || (serverflags & SERVERFLAG_PLAYERSTATS)))
10	{
11		// this dialog gets overriden by the uid2name menu dialog, if it exists
12		// TODO remove this client side uid2name dialog in the next release
13		if(!autocvar__menu_alpha)
14			uid2name_dialog = 0;
15
16		if (!uid2name_dialog)
17			localcmd("menu_cmd directmenu Uid2Name\n");
18
19		vote_active = 1;
20		if (autocvar__hud_configure)
21		{
22			vote_yescount = 0;
23			vote_nocount = 0;
24			LOG_INFO(_("^1You must answer before entering hud configure mode\n"));
25			cvar_set("_hud_configure", "0");
26		}
27		if(vote_called_vote)
28			strunzone(vote_called_vote);
29		vote_called_vote = strzone(_("^2Name ^7instead of \"^1Anonymous player^7\" in stats"));
30		uid2name_dialog = 1;
31	}
32
33	if(!autocvar__hud_configure)
34	{
35		if(!autocvar_hud_panel_vote) return;
36		/*
37		if(cvar("hud_panel_vote_test")) {
38			if(vote_called_vote) strunzone(vote_called_vote); vote_called_vote = strzone("^1test the vote panel");
39			vote_active = true; vote_yescount = 3; vote_nocount = 2; vote_needed = 4;
40		} else vote_active = false;
41		*/
42	}
43	else
44	{
45		vote_yescount = 3;
46		vote_nocount = 2;
47		vote_needed = 4;
48	}
49
50	string s;
51	float a;
52	if(vote_active != vote_prev) {
53		vote_change = time;
54		vote_prev = vote_active;
55	}
56
57	if(vote_active || autocvar__hud_configure)
58		vote_alpha = bound(0, (time - vote_change) * 2, 1);
59	else
60		vote_alpha = bound(0, 1 - (time - vote_change) * 2, 1);
61
62	a = vote_alpha * (vote_highlighted ? autocvar_hud_panel_vote_alreadyvoted_alpha : 1);
63	if(a <= 0)
64		return;
65	//panel_fade_alpha *= a;
66	// nothing can hide this panel, not even the menu
67	float hud_fade_alpha_save = hud_fade_alpha;
68	if(uid2name_dialog && autocvar__menu_alpha)
69		hud_fade_alpha = 0;
70	else
71		hud_fade_alpha = a;
72	HUD_Panel_LoadCvars();
73	hud_fade_alpha = hud_fade_alpha_save;
74
75	if(uid2name_dialog)
76	{
77		panel_pos = eX * 0.3 * vid_conwidth + eY * 0.1 * vid_conheight;
78		panel_size = eX * 0.4 * vid_conwidth + eY * 0.3 * vid_conheight;
79	}
80
81	vector pos, mySize;
82	pos = panel_pos;
83	mySize = panel_size;
84
85	if (autocvar_hud_panel_vote_dynamichud)
86		HUD_Scale_Enable();
87	else
88		HUD_Scale_Disable();
89	HUD_Panel_DrawBg();
90
91	if(panel_bg_padding)
92	{
93		pos += '1 1 0' * panel_bg_padding;
94		mySize -= '2 2 0' * panel_bg_padding;
95	}
96
97	// always force 3:1 aspect
98	vector newSize = '0 0 0';
99	if(mySize.x/mySize.y > 3)
100	{
101		newSize.x = 3 * mySize.y;
102		newSize.y = mySize.y;
103
104		pos.x = pos.x + (mySize.x - newSize.x) / 2;
105	}
106	else
107	{
108		newSize.y = 1/3 * mySize.x;
109		newSize.x = mySize.x;
110
111		pos.y = pos.y + (mySize.y - newSize.y) / 2;
112	}
113	mySize = newSize;
114
115	s = _("A vote has been called for:");
116	if(uid2name_dialog)
117		s = _("Allow servers to store and display your name?");
118	drawstring_aspect(pos, s, eX * mySize.x + eY * (2/8) * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
119	s = textShortenToWidth(ColorTranslateRGB(vote_called_vote), mySize.x, '1 1 0' * mySize.y * (1/8), stringwidth_colors);
120	if(autocvar__hud_configure)
121		s = _("^1Configure the HUD");
122	drawcolorcodedstring_aspect(pos + eY * (2/8) * mySize.y, s, eX * mySize.x + eY * (1.75/8) * mySize.y, panel_fg_alpha, DRAWFLAG_NORMAL);
123
124	// print the yes/no counts
125	s = sprintf("^2%s ^7(%d)", getcommandkey_forcename(_("Yes"), "vyes"), vote_yescount);
126	drawcolorcodedstring_aspect(pos + eY * (4/8) * mySize.y, s, eX * 0.5 * mySize.x + eY * (1.5/8) * mySize.y, panel_fg_alpha, DRAWFLAG_NORMAL);
127	s = sprintf("^1%s ^7(%d)", getcommandkey_forcename(_("No"), "vno"), vote_nocount);
128	drawcolorcodedstring_aspect(pos + eX * 0.5 * mySize.x + eY * (4/8) * mySize.y, s, eX * 0.5 * mySize.x + eY * (1.5/8) * mySize.y, panel_fg_alpha, DRAWFLAG_NORMAL);
129
130	pos.y += (5/8) * mySize.y;
131	vector tmp_size = eX * mySize.x + eY * (3/8) * mySize.y;
132	// draw the progress bar backgrounds
133	drawpic_skin(pos, "voteprogress_back", tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
134
135	// draw the highlights
136	if(vote_highlighted == 1) {
137		drawsetcliparea(pos.x, pos.y, mySize.x * 0.5, mySize.y);
138		drawpic_skin(pos, "voteprogress_voted", tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
139	}
140	else if(vote_highlighted == -1) {
141		drawsetcliparea(pos.x + 0.5 * mySize.x, pos.y, mySize.x * 0.5, mySize.y);
142		drawpic_skin(pos, "voteprogress_voted", tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
143	}
144
145	// draw the progress bars
146	if(vote_yescount && vote_needed)
147	{
148		drawsetcliparea(pos.x, pos.y, mySize.x * 0.5 * (vote_yescount/vote_needed), mySize.y);
149		drawpic_skin(pos, "voteprogress_prog", tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
150	}
151
152	if(vote_nocount && vote_needed)
153	{
154		drawsetcliparea(pos.x + mySize.x - mySize.x * 0.5 * (vote_nocount/vote_needed), pos.y, mySize.x * 0.5, mySize.y);
155		drawpic_skin(pos, "voteprogress_prog", tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
156	}
157
158	drawresetcliparea();
159}
160