]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/hud/panel/infomessages.qc
Merge branch 'master' into martin-t/defaults
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / infomessages.qc
1 #include "infomessages.qh"
2
3 #include <client/autocvars.qh>
4 #include <client/miscfunctions.qh>
5
6 #include <common/ent_cs.qh>
7 #include <common/mapinfo.qh>
8
9 // Info messages (#14)
10
11 float autocvar_hud_panel_infomessages_group0 = 1;
12 float autocvar_hud_panel_infomessages_group_fadetime = 0.4;
13 float autocvar_hud_panel_infomessages_group_time = 6;
14 const int IMG_COUNT = 1; // number of InfoMessage Groups
15 float img_fade[IMG_COUNT];
16 int img_cur_msg[IMG_COUNT];
17 float img_time[IMG_COUNT];
18
19 int img_select(int group_id)
20 {
21         float fadetime = max(0.001, autocvar_hud_panel_infomessages_group_fadetime);
22         if(time > img_time[group_id])
23         {
24                 img_fade[group_id] = max(0, img_fade[group_id] - frametime / fadetime);
25                 if(!img_fade[group_id])
26                 {
27                         ++img_cur_msg[group_id];
28                         img_time[group_id] = floor(time) + autocvar_hud_panel_infomessages_group_time;
29                 }
30         }
31         else
32                 img_fade[group_id] = min(1, img_fade[group_id] + frametime / fadetime);
33         return img_cur_msg[group_id];
34 }
35
36 float stringwidth_colors(string s, vector theSize);
37 vector InfoMessages_drawstring(string s, vector pos, vector sz, float a, vector fontsize)
38 {
39         getWrappedLine_remaining = s;
40         float offset = 0;
41         while(getWrappedLine_remaining)
42         {
43                 s = getWrappedLine(sz.x - offset, fontsize, stringwidth_colors);
44                 if(autocvar_hud_panel_infomessages_flip)
45                         offset = sz.x - stringwidth_colors(s, fontsize) - offset;
46                 drawcolorcodedstring(pos + eX * offset, s, fontsize, a, DRAWFLAG_NORMAL);
47                 pos.y += fontsize.y;
48                 offset = fontsize.x;
49         }
50         pos.y += fontsize.y * 0.25;
51         return pos;
52 }
53
54 #define InfoMessage(s) MACRO_BEGIN { \
55         pos = InfoMessages_drawstring(s, pos, mySize, ((img_curr_group >= 0) ? panel_fg_alpha * img_fade[img_curr_group] : panel_fg_alpha), fontsize); \
56         img_curr_group = -1; \
57 } MACRO_END
58
59 void HUD_InfoMessages()
60 {
61         if(!autocvar__hud_configure)
62         {
63                 if(!autocvar_hud_panel_infomessages) return;
64         }
65
66         HUD_Panel_LoadCvars();
67         vector pos, mySize;
68         pos = panel_pos;
69         mySize = panel_size;
70
71         if (autocvar_hud_panel_infomessages_dynamichud)
72                 HUD_Scale_Enable();
73         else
74                 HUD_Scale_Disable();
75         HUD_Panel_DrawBg();
76         if(panel_bg_padding)
77         {
78                 pos += '1 1 0' * panel_bg_padding;
79                 mySize -= '2 2 0' * panel_bg_padding;
80         }
81
82         vector fontsize = '0.2 0.2 0' * mySize.y;
83         string s;
84         int img_curr_group = -1;
85         if(!autocvar__hud_configure)
86         {
87                 if(spectatee_status)
88                 {
89                         if(spectatee_status == -1)
90                                 s = _("^1Observing");
91                         else
92                                 s = sprintf(_("^1Spectating: ^7%s"), entcs_GetName(current_player));
93                         InfoMessage(s);
94
95                         if(autocvar_hud_panel_infomessages_group0)
96                         {
97                                 img_curr_group = 0;
98                                 switch(img_select(img_curr_group) % 3)
99                                 {
100                                         default:
101                                         case 0:
102                                                 if(spectatee_status == -1)
103                                                         s = sprintf(_("^1Press ^3%s^1 to spectate"), getcommandkey(_("primary fire"), "+fire"));
104                                                 else
105                                                         s = sprintf(_("^1Press ^3%s^1 or ^3%s^1 for next or previous player"), getcommandkey(_("next weapon"), "weapnext"), getcommandkey(_("previous weapon"), "weapprev"));
106                                                 break;
107                                         case 1:
108                                                 if(spectatee_status == -1)
109                                                         s = sprintf(_("^1Use ^3%s^1 or ^3%s^1 to change the speed"), getcommandkey(_("next weapon"), "weapnext"), getcommandkey(_("previous weapon"), "weapprev"));
110                                                 else
111                                                         s = sprintf(_("^1Press ^3%s^1 to observe, ^3%s^1 to change camera mode"), getcommandkey(_("secondary fire"), "+fire2"), getcommandkey(_("drop weapon"), "dropweapon"));
112                                                 break;
113                                         case 2:
114                                                 s = sprintf(_("^1Press ^3%s^1 for gamemode info"), getcommandkey(_("server info"), "+show_info"));
115                                                 break;
116                                 }
117                                 InfoMessage(s);
118                         }
119
120                         MUTATOR_CALLHOOK(DrawInfoMessages, pos, mySize);
121
122                         if(!warmup_stage && gametype == MAPINFO_TYPE_LMS)
123                         {
124                                 entity sk;
125                                 sk = playerslots[player_localnum];
126                                 if(sk.(scores(ps_primary)) >= 666)
127                                         s = _("^1Match has already begun");
128                                 else if(sk.(scores(ps_primary)) > 0)
129                                         s = _("^1You have no more lives left");
130                                 else
131                                         s = sprintf(_("^1Press ^3%s^1 to join"), getcommandkey(_("jump"), "+jump"));
132                         }
133                         else
134                                 s = sprintf(_("^1Press ^3%s^1 to join"), getcommandkey(_("jump"), "+jump"));
135                         InfoMessage(s);
136                 }
137
138                 if (time < STAT(GAMESTARTTIME))
139                 {
140                         //we need to ceil, otherwise the countdown would be off by .5 when using round()
141                         float countdown = ceil(STAT(GAMESTARTTIME) - time);
142                         s = sprintf(_("^1Game starts in ^3%d^1 seconds"), countdown);
143                         InfoMessage(s);
144                 }
145
146                 if(warmup_stage)
147                 {
148                         s = _("^2Currently in ^1warmup^2 stage!");
149                         InfoMessage(s);
150                 }
151
152                 string blinkcolor;
153                 if(time % 1 >= 0.5)
154                         blinkcolor = "^1";
155                 else
156                         blinkcolor = "^3";
157
158                 if(ready_waiting && !spectatee_status)
159                 {
160                         if(ready_waiting_for_me)
161                         {
162                                 if(warmup_stage)
163                                         s = sprintf(_("%sPress ^3%s%s to end warmup"), blinkcolor, getcommandkey(_("ready"), "ready"), blinkcolor);
164                                 else
165                                         s = sprintf(_("%sPress ^3%s%s once you are ready"), blinkcolor, getcommandkey(_("ready"), "ready"), blinkcolor);
166                         }
167                         else
168                         {
169                                 if(warmup_stage)
170                                         s = _("^2Waiting for others to ready up to end warmup...");
171                                 else
172                                         s = _("^2Waiting for others to ready up...");
173                         }
174                         InfoMessage(s);
175                 }
176                 else if(warmup_stage && !spectatee_status)
177                 {
178                         s = sprintf(_("^2Press ^3%s^2 to end warmup"), getcommandkey(_("ready"), "ready"));
179                         InfoMessage(s);
180                 }
181
182                 if(teamplay && !spectatee_status && teamnagger)
183                 {
184                         float ts_min = 0, ts_max = 0;
185                         entity tm = teams.sort_next;
186                         if (tm)
187                         {
188                                 for (; tm.sort_next; tm = tm.sort_next)
189                                 {
190                                         if(!tm.team_size || tm.team == NUM_SPECTATOR)
191                                                 continue;
192                                         if(!ts_min) ts_min = tm.team_size;
193                                         else ts_min = min(ts_min, tm.team_size);
194                                         if(!ts_max) ts_max = tm.team_size;
195                                         else ts_max = max(ts_max, tm.team_size);
196                                 }
197                                 if ((ts_max - ts_min) > 1)
198                                 {
199                                         s = strcat(blinkcolor, _("Teamnumbers are unbalanced!"));
200                                         tm = GetTeam(myteam, false);
201                                         if (tm && tm.team != NUM_SPECTATOR && tm.team_size == ts_max)
202                                                 s = strcat(s, sprintf(_(" Press ^3%s%s to adjust"), getcommandkey(_("team menu"), "menu_showteamselect"), blinkcolor));
203                                         InfoMessage(s);
204                                 }
205                         }
206                 }
207
208                 if(autocvar_cl_showspectators)
209                 if(num_spectators)
210                 //if(spectatee_status != -1)
211                 {
212                         s = ((spectatee_status) ? _("^1Spectating this player:") : _("^1Spectating you:"));
213                         // InfoMessage(s)
214                         int limit = min(num_spectators, MAX_SPECTATORS);
215                         for(int i = 0; i < limit; ++i)
216                         {
217                                 float slot = spectatorlist[i];
218                                 if(i == 0)
219                                         s = strcat(s, " ^7", entcs_GetName(slot));
220                                 else
221                                         s = strcat("^7", entcs_GetName(slot));
222                                 InfoMessage(s);
223                         }
224                 }
225         }
226         else
227         {
228                 InfoMessage(_("^7Press ^3ESC ^7to show HUD options."));
229                 InfoMessage(_("^3Doubleclick ^7a panel for panel-specific options."));
230                 InfoMessage(_("^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"));
231                 InfoMessage(_("^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."));
232         }
233 }