]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/hud/panel/timer.qc
Merge branch 'master' into z411/bai-server
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / timer.qc
1 #include "timer.qh"
2
3 #include <client/draw.qh>
4 #include <client/view.qh>
5
6 // Timer (#5)
7 float last_timeleft;
8 int autocvar_cl_timer_countdown = 3; // 0 = disabled, 1 = always on, 2 = only spec, 3 = as dictated by server
9
10 void HUD_Timer_Export(int fh)
11 {
12         // allow saving cvars that aesthetically change the panel into hud skin files
13 }
14
15 void HUD_Timer()
16 {
17         if(!autocvar__hud_configure)
18         {
19                 if(!autocvar_hud_panel_timer) return;
20         }
21
22         HUD_Panel_LoadCvars();
23
24         draw_beginBoldFont();
25
26         vector pos, mySize;
27         pos = panel_pos;
28         mySize = panel_size;
29
30         if (autocvar_hud_panel_timer_dynamichud)
31                 HUD_Scale_Enable();
32         else
33                 HUD_Scale_Disable();
34         HUD_Panel_DrawBg();
35         if(panel_bg_padding)
36         {
37                 pos += '1 1 0' * panel_bg_padding;
38                 mySize -= '2 2 0' * panel_bg_padding;
39         }
40
41         string timer_sub = "";
42         float timelimit, timeleft, minutesLeft, overtimes, timeout_last;
43
44         timelimit = STAT(TIMELIMIT);
45         overtimes = STAT(OVERTIMESADDED);
46         timeout_last = STAT(TIMEOUT_LAST);
47
48         timeleft = max(0, timelimit * 60 + STAT(GAMESTARTTIME) - time);
49         timeleft = min(timeleft, timelimit * 60);
50         timeleft = ceil(timeleft);
51
52         // countdown sound
53         // if 3 use server dictated option, otherwise the client's
54         int countdown_type;
55         if(autocvar_cl_timer_countdown == 3)
56                 countdown_type = sv_timer_countdown;
57         else
58                 countdown_type = autocvar_cl_timer_countdown;
59         
60         if(countdown_type && !warmup_stage && timeleft > 0 && timeleft != last_timeleft && timeleft <= 10)
61         {
62                 if(countdown_type == 1 || (countdown_type == 2 && spectatee_status))
63                         sound(NULL, CH_INFO, SND_ENDCOUNT, VOL_BASE, ATTN_NONE);
64                 
65                 last_timeleft = timeleft;
66         }
67
68         minutesLeft = floor(timeleft / 60);
69
70         float warmup_timeleft = 0;
71         if(warmup_stage)
72         {
73                 float warmup_timelimit = STAT(WARMUP_TIMELIMIT);
74                 if(warmup_timelimit > 0)
75                         warmup_timeleft = max(0, warmup_timelimit - time);
76                 else if(warmup_timelimit == 0)
77                         warmup_timeleft = timeleft;
78                 warmup_timeleft = ceil(warmup_timeleft);
79         }
80
81         vector timer_color;
82         if(intermission_time || minutesLeft >= 5 || warmup_stage || timelimit == 0)
83                 timer_color = '1 1 1'; //white
84         else if(minutesLeft >= 1)
85                 timer_color = '1 1 0'; //yellow
86         else
87                 timer_color = '1 0 0'; //red
88
89         if (intermission_time) {
90                 timer = max(0, floor(intermission_time - STAT(GAMESTARTTIME)));
91                 timer_sub = "Intermission";
92         //} else if (autocvar_hud_panel_timer_increment || (!warmup_stage && timelimit == 0) || (warmup_stage && warmup_timeleft <= 0)) {
93         } else if (timeout_last) {
94                 if(autocvar_hud_panel_timer_increment)
95                         timer = max(0, floor(timeout_last - STAT(GAMESTARTTIME)));
96                 else
97                         timer = ceil(max(0, timelimit * 60 + STAT(GAMESTARTTIME) - timeout_last));
98                 timer_sub = "Timeout";
99         } else if (autocvar_hud_panel_timer_increment || timelimit == 0) {
100                 // Time elapsed timer
101                 if((warmup_stage && warmup_timeleft <= 0) || time < STAT(GAMESTARTTIME))
102                         timer = 0;
103                 else
104                         timer = floor(time - STAT(GAMESTARTTIME));
105         } else {
106                 // Time left timer
107                 if(warmup_stage) {
108                         if(warmup_timeleft <= 0)
109                                 timer = floor(timelimit * 60);
110                         else
111                                 timer = warmup_timeleft;
112                 } else {
113                         timer = timeleft;
114                 }
115         }
116         
117         if(warmup_stage)
118                 timer_sub = "Warmup";
119         else if(overtimes == 1)
120                 timer_sub = "Overtime";
121         else if (overtimes > 1)
122                 timer_sub = sprintf("Overtime #%d", overtimes);
123         
124         drawstring_aspect(pos, seconds_tostring(timer), mySize, timer_color, panel_fg_alpha, DRAWFLAG_NORMAL);
125         
126         if(timer_sub != "") {
127                 pos.y += mySize.y;
128                 mySize.y = mySize.y / 2;
129                 drawstring_aspect(pos, timer_sub, mySize, '1 0 0', panel_fg_alpha, DRAWFLAG_NORMAL);
130         }
131
132         draw_endBoldFont();
133 }