]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/announcer.qc
Merge branch 'master' into terencehill/ca_arena_mutators
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / announcer.qc
1 float previous_announcement_time;
2 float previous_game_starttime;
3 string previous_announcement;
4
5 // remaining maptime announcer sounds, true when sound was already played
6 float announcer_1min;
7 float announcer_5min;
8
9 void Announcer_Play(string announcement)
10 {
11         if((announcement != previous_announcement) || (time >= (previous_announcement_time + autocvar_cl_announcer_antispam)))
12         {
13                 sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", announcement, ".wav"), VOL_BASEVOICE, ATTN_NONE);
14
15                 if(previous_announcement) { strunzone(previous_announcement); }
16                 
17                 previous_announcement = strzone(announcement);
18                 previous_announcement_time = time;
19         }
20 }
21
22 void Announcer_Countdown() 
23 {
24         float starttime = getstatf(STAT_GAMESTARTTIME);
25         float roundstarttime = getstatf(STAT_ROUNDSTARTTIME);
26         if(roundstarttime == -1)
27         {
28                 Local_Notification(MSG_CENTER, CENTER_COUNTDOWN_ROUNDSTOP);
29                 remove(self);
30                 return;
31         }
32         if(roundstarttime >= starttime)
33                 starttime = roundstarttime;
34         if(starttime <= time && roundstarttime != starttime) // game start time has passed
35                 announcer_5min = announcer_1min = FALSE; // reset maptime announcers now as well
36
37         float countdown = (starttime - time);
38         float countdown_rounded = floor(0.5 + countdown);
39
40         if(countdown <= 0) // countdown has finished, starttime is now
41         {
42                 Local_Notification(MSG_CENTER, CENTER_COUNTDOWN_BEGIN); 
43
44                 Announcer_Play("begin");
45                 remove(self);
46                 return;
47         }
48         else // countdown is still going
49         {
50                 if(roundstarttime == starttime)
51                         Local_Notification(MSG_CENTER, CENTER_COUNTDOWN_ROUNDSTART, countdown_rounded);
52                 else
53                         Local_Notification(MSG_CENTER, CENTER_COUNTDOWN_GAMESTART, countdown_rounded);
54
55                 if(countdown_rounded <= 3 && countdown_rounded >= 1) 
56                         Announcer_Play(ftos(countdown_rounded));
57
58                 self.nextthink = (starttime - (countdown - 1));
59         }
60 }
61
62 /**
63  * Checks whether the server initiated a map restart (stat_game_starttime changed)
64  *
65  * TODO: Use a better solution where a common shared entitiy is used that contains
66  * timelimit, fraglimit and game_starttime! Requires engine changes (remove STAT_TIMELIMIT
67  * and STAT_FRAGLIMIT to be auto-sent)
68  */
69 void Announcer_Gamestart() 
70 {
71         float startTime = getstatf(STAT_GAMESTARTTIME);
72         float roundstarttime = getstatf(STAT_ROUNDSTARTTIME);
73         if(roundstarttime > startTime)
74                 startTime = roundstarttime;
75
76         if(previous_game_starttime != startTime) 
77         {
78                 if((time + 5.0) < startTime) // if connecting to server while restart was active don't always play prepareforbattle
79                         Announcer_Play("prepareforbattle");
80
81                 if(time < startTime) 
82                 {
83                         entity e = find(world, classname, "announcer_countdown");
84                         if not(e)
85                         {
86                                 e = spawn();
87                                 e.classname = "announcer_countdown";
88                                 e.think = Announcer_Countdown;
89                         }
90                         e.nextthink = startTime - floor(startTime - time); //synchronize nextthink to startTime
91                 }
92         }
93         
94         previous_game_starttime = startTime;
95 }
96
97
98 // Plays the 1 minute or 5 minutes (of maptime) remaining sound, if client wants it
99 void Announcer_Time() 
100 {
101         float timelimit = getstatf(STAT_TIMELIMIT);
102         float timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time);
103         float warmup_timeleft = 0;
104         
105         if(warmup_stage) 
106                 if(autocvar_g_warmup_limit > 0)
107                         warmup_timeleft = max(0, autocvar_g_warmup_limit + getstatf(STAT_GAMESTARTTIME) - time); 
108
109         // 5 minute check
110         if(autocvar_cl_announcer_maptime >= 2) 
111         {
112                 // make sure that after connect (and e.g. 4 minutes left) we will not get a wrong sound
113                 if(announcer_5min)
114                 {
115                         if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timeleft > 300) 
116                                 || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft > 300))
117                                         announcer_5min = FALSE;
118                 }
119                 else 
120                 {
121                         if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timelimit > 0 && timeleft < 300 && timeleft > 299) 
122                                 || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft < 300 && warmup_timeleft > 299))
123                         {
124                                 //if we're in warmup mode, check whether there's a warmup timelimit
125                                 if not(autocvar_g_warmup_limit == -1 && warmup_stage) 
126                                 {
127                                         announcer_5min = TRUE;
128                                         Announcer_Play("5minutesremain");
129                                 }
130                         }
131                 }
132         }
133
134         // 1 minute check
135         if((autocvar_cl_announcer_maptime == 1) || (autocvar_cl_announcer_maptime == 3))
136         {
137                 if (announcer_1min)
138                 {
139                         if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timeleft > 60) 
140                                 || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft > 60))
141                                         announcer_1min = FALSE;
142                 }
143                 else if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timelimit > 0 && timeleft < 60) 
144                         || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft < 60))
145                 {
146                         // if we're in warmup mode, check whether there's a warmup timelimit
147                         if not(autocvar_g_warmup_limit == -1 && warmup_stage) 
148                         {
149                                 announcer_1min = TRUE;
150                                 Announcer_Play("1minuteremains");
151                         }
152                 }
153         }
154 }
155
156 void Announcer()
157 {
158         Announcer_Gamestart();
159         Announcer_Time();
160 }
161
162 void Announcer_Precache () 
163 {
164         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"));
165         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"));
166
167         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/electrobitch.wav"));
168         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/airshot.wav"));
169         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/03kills.wav"));
170         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/05kills.wav"));
171         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/10kills.wav"));
172         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/15kills.wav"));
173         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/20kills.wav"));
174         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/25kills.wav"));
175         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/30kills.wav"));
176         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/botlike.wav"));
177         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/yoda.wav"));
178         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/amazing.wav"));
179         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/awesome.wav"));
180         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/impressive.wav"));
181
182         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"));
183         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/begin.wav"));
184         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/timeoutcalled.wav"));
185         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1fragleft.wav"));
186         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/2fragsleft.wav"));
187         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/3fragsleft.wav"));
188         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/terminated.wav"));
189
190         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1.wav"));
191         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/2.wav"));
192         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/3.wav"));
193         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/4.wav"));
194         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5.wav"));
195         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/6.wav"));
196         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/7.wav"));
197         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/8.wav"));
198         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/9.wav"));
199         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/10.wav"));
200
201         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/lastsecond.wav"));
202         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/narrowly.wav"));
203
204         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/voteaccept.wav"));
205         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votecall.wav"));
206         precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votefail.wav"));
207 }