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