]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/hud/panel/timer.qc
Merge branch 'master' into LegendaryGuard/cyber
[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 bool autocvar_hud_panel_timer_count = true;
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 = bound(0, timelimit * 60 + STAT(GAMESTARTTIME) - time, timelimit * 60);
49         timeleft = ceil(timeleft);
50
51         // countdown sound
52         if(autocvar_hud_panel_timer_count && timeleft > 0 && timeleft != last_timeleft && timeleft <= 10)
53         {
54                 sound(NULL, CH_INFO, SND_ENDCOUNT, VOL_BASE, ATTN_NONE);
55                 last_timeleft = timeleft;
56         }
57
58         minutesLeft = floor(timeleft / 60);
59
60         float warmup_timeleft = 0;
61         if(warmup_stage)
62         {
63                 float warmup_timelimit = STAT(WARMUP_TIMELIMIT);
64                 if(warmup_timelimit > 0)
65                         warmup_timeleft = max(0, warmup_timelimit - time + STAT(GAMESTARTTIME));
66                 else if(warmup_timelimit == 0)
67                         warmup_timeleft = timeleft;
68                 warmup_timeleft = ceil(warmup_timeleft);
69         }
70
71         vector timer_color;
72         if(intermission_time || minutesLeft >= 5 || warmup_stage || timelimit == 0)
73                 timer_color = '1 1 1'; //white
74         else if(minutesLeft >= 1)
75                 timer_color = '1 1 0'; //yellow
76         else
77                 timer_color = '1 0 0'; //red
78
79         if (intermission_time) {
80                 timer = max(0, floor(intermission_time - STAT(GAMESTARTTIME)));
81                 timer_sub = "Intermission";
82         //} else if (autocvar_hud_panel_timer_increment || (!warmup_stage && timelimit == 0) || (warmup_stage && warmup_timeleft <= 0)) {
83         } else if (timeout_last) {
84                 if(autocvar_hud_panel_timer_increment)
85                         timer = max(0, floor(timeout_last - STAT(GAMESTARTTIME)));
86                 else
87                         timer = ceil(max(0, timelimit * 60 + STAT(GAMESTARTTIME) - timeout_last));
88                 timer_sub = "Timeout";
89         } else if (autocvar_hud_panel_timer_increment || timelimit == 0) {
90                 // Time elapsed timer
91                 if((warmup_stage && warmup_timeleft <= 0) || time < STAT(GAMESTARTTIME))
92                         timer = 0;
93                 else
94                         timer = floor(time - STAT(GAMESTARTTIME));
95         } else {
96                 // Time left timer
97                 if(warmup_stage) {
98                         if(warmup_timeleft <= 0)
99                                 timer = floor(timelimit * 60);
100                         else
101                                 timer = warmup_timeleft;
102                 } else {
103                         if (time < STAT(GAMESTARTTIME))
104                                 timer = floor(timelimit * 60);
105                         //else if (overtimes > 0)
106                         //      timer = floor(time - STAT(OVERTIMESTARTTIME));
107                         else
108                                 timer = timeleft;
109                 }
110         }
111         
112         if(warmup_stage)
113                 timer_sub = "Warmup";
114         else if(overtimes == 1)
115                 timer_sub = "Overtime";
116         else if (overtimes > 1)
117                 timer_sub = sprintf("Overtime #%d", overtimes);
118         
119         drawstring_aspect(pos, seconds_tostring(timer), mySize, timer_color, panel_fg_alpha, DRAWFLAG_NORMAL);
120         
121         if(timer_sub != "") {
122                 pos.y += mySize.y;
123                 mySize.y = mySize.y / 2;
124                 drawstring_aspect(pos, timer_sub, mySize, '1 0 0', panel_fg_alpha, DRAWFLAG_NORMAL);
125         }
126
127         draw_endBoldFont();
128 }