]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/menu/voret/util.qc
Actually, set the gametype in the .instantaction file
[voretournament/voretournament.git] / data / qcsrc / menu / voret / util.qc
1 float tooltipdb;\r
2 void loadTooltips()\r
3 {\r
4         tooltipdb = db_load("tooltips.db");\r
5 }\r
6 void unloadTooltips()\r
7 {\r
8         db_close(tooltipdb);\r
9         tooltipdb = -1;\r
10 }\r
11 string getZonedTooltipForIdentifier(string s)\r
12 {\r
13         string t;\r
14         if(s == "")\r
15                 return string_null;\r
16         t = db_get(tooltipdb, s);\r
17         if(t == "-")\r
18                 return string_null;\r
19         if(t != "")\r
20                 return strzone(t);\r
21         t = cvar_description(s);\r
22         if(t != "" && t != "custom cvar")\r
23                 return strzone(t);\r
24         dprint("WARNING: no tooltip set for ", s, "\n");\r
25         return string_null;\r
26 }\r
27 \r
28 void forAllDescendants(entity root, void(entity, entity) funcPre, void(entity, entity) funcPost, entity pass)\r
29 {\r
30         depthfirst(root, parent, firstChild, nextSibling, funcPre, funcPost, pass);\r
31 }\r
32 \r
33 .string cvarName;\r
34 void SUB_Null_ee(entity e1, entity e2)\r
35 {\r
36 }\r
37 void saveCvarsOf(entity ignore, entity e)\r
38 {\r
39         if(e.saveCvars)\r
40                 e.saveCvars(e);\r
41 }\r
42 void loadCvarsOf(entity ignore, entity e)\r
43 {\r
44         if(e.loadCvars)\r
45                 e.loadCvars(e);\r
46 }\r
47 void saveAllCvars(entity root)\r
48 {\r
49         forAllDescendants(root, saveCvarsOf, SUB_Null_ee, NULL);\r
50 }\r
51 void loadAllCvars(entity root)\r
52 {\r
53         forAllDescendants(root, loadCvarsOf, SUB_Null_ee, NULL);\r
54 }\r
55 \r
56 .string cvarNames_Multi;\r
57 .void(entity me) saveCvars_Multi;\r
58 void saveCvarsMulti(entity me)\r
59 {\r
60         float n, i;\r
61         string s;\r
62 \r
63         me.saveCvars_Multi(me);\r
64         s = cvar_string(me.cvarName);\r
65 \r
66         n = tokenize_console(me.cvarNames_Multi);\r
67         for(i = 0; i < n; ++i)\r
68                 cvar_set(argv(i), s);\r
69 }\r
70 void makeMulti(entity e, string otherCvars)\r
71 {\r
72         e.cvarNames_Multi = otherCvars;\r
73         e.saveCvars_Multi = e.saveCvars;\r
74         e.saveCvars = saveCvarsMulti;\r
75 }\r
76 \r
77 .void(entity me) saveCvars_Callback;\r
78 .entity saveCvars_Callback_ent;\r
79 .void(entity me, entity cb) saveCvars_Callback_func;\r
80 void saveCvarsCallback(entity me)\r
81 {\r
82         me.saveCvars_Callback(me);\r
83         me.saveCvars_Callback_func(me.saveCvars_Callback_ent, me);\r
84 }\r
85 void makeCallback(entity e, entity cbent, void(entity, entity) cbfunc)\r
86 {\r
87         e.saveCvars_Callback = e.saveCvars;\r
88         e.saveCvars = saveCvarsCallback;\r
89         e.saveCvars_Callback_ent = cbent;\r
90         e.saveCvars_Callback_func = cbfunc;\r
91 }\r
92 \r
93 .void(entity) draw_setDependent;\r
94 .string cvar_setDependent;\r
95 .float cvarMin_setDependent;\r
96 .float cvarMax_setDependent;\r
97 .string cvar2_setDependent;\r
98 .float cvar2Min_setDependent;\r
99 .float cvar2Max_setDependent;\r
100 .string cvar3_setDependent;\r
101 .float cvar3Min_setDependent;\r
102 .float cvar3Max_setDependent;\r
103 .float op_setDependent;\r
104 .string cvarString_setDependent;\r
105 .string cvarValue_setDependent;\r
106 .float(entity) func_setDependent;\r
107 void setDependent_Check(entity e)\r
108 {\r
109         float f;\r
110         string s;\r
111         if(e.func_setDependent)\r
112         {\r
113                 e.disabled = !(e.func_setDependent(e));\r
114         }\r
115         else if(e.cvarString_setDependent)\r
116         {\r
117                 s = cvar_string(e.cvarString_setDependent);\r
118                 e.disabled = (cvar_string(e.cvarString_setDependent) == e.cvarValue_setDependent);\r
119         }\r
120         else\r
121         {\r
122                 if(e.cvar_setDependent)\r
123                 {\r
124                         f = cvar(e.cvar_setDependent);\r
125                         if(e.cvarMin_setDependent <= e.cvarMax_setDependent)\r
126                                 e.disabled = ((f < e.cvarMin_setDependent) || (f > e.cvarMax_setDependent));\r
127                         else\r
128                                 e.disabled = ((f >= e.cvarMax_setDependent) && (f <= e.cvarMin_setDependent));\r
129                 }\r
130                 if(e.cvar2_setDependent)\r
131                 {\r
132                         f = cvar(e.cvar2_setDependent);\r
133                         if(e.cvar2Min_setDependent <= e.cvar2Max_setDependent)\r
134                                 e.disabled = (e.disabled + ((f < e.cvar2Min_setDependent) || (f > e.cvar2Max_setDependent)) > e.op_setDependent);\r
135                         else\r
136                                 e.disabled = (e.disabled + ((f >= e.cvar2Max_setDependent) && (f <= e.cvar2Min_setDependent)) > e.op_setDependent);\r
137                 }\r
138                 if(e.cvar3_setDependent)\r
139                 {\r
140                         f = cvar(e.cvar3_setDependent);\r
141                         if(e.cvar3Min_setDependent <= e.cvar3Max_setDependent)\r
142                                 e.disabled = (e.disabled + ((f < e.cvar3Min_setDependent) || (f > e.cvar3Max_setDependent)) > e.op_setDependent);\r
143                         else\r
144                                 e.disabled = (e.disabled + ((f >= e.cvar3Max_setDependent) && (f <= e.cvar3Min_setDependent)) > e.op_setDependent);\r
145                 }\r
146         }\r
147 }\r
148 void setDependent_Draw(entity e)\r
149 {\r
150         setDependent_Check(e);\r
151         e.draw_setDependent(e);\r
152 }\r
153 void setDependent(entity e, string theCvarName, float theCvarMin, float theCvarMax)\r
154 {\r
155         e.draw_setDependent = e.draw;\r
156         e.cvar_setDependent = theCvarName;\r
157         e.cvarMin_setDependent = theCvarMin;\r
158         e.cvarMax_setDependent = theCvarMax;\r
159         e.cvar2_setDependent = string_null;\r
160         e.cvar3_setDependent = string_null;\r
161         e.func_setDependent = func_null;\r
162         e.draw = setDependent_Draw;\r
163         setDependent_Check(e);\r
164 }\r
165 void setDependentStringNotEqual(entity e, string theCvarName, string theCvarValue)\r
166 {\r
167         e.draw_setDependent = e.draw;\r
168         e.cvarString_setDependent = theCvarName;\r
169         e.cvarValue_setDependent = theCvarValue;\r
170         e.cvar_setDependent = string_null;\r
171         e.cvar2_setDependent = string_null;\r
172         e.cvar3_setDependent = string_null;\r
173         e.func_setDependent = func_null;\r
174         e.draw = setDependent_Draw;\r
175         setDependent_Check(e);\r
176 }\r
177 void setDependentAND(entity e, string theCvarName, float theCvarMin, float theCvarMax, string theCvar2Name, float theCvar2Min, float theCvar2Max)\r
178 {\r
179         e.draw_setDependent = e.draw;\r
180         e.cvar_setDependent = theCvarName;\r
181         e.cvarMin_setDependent = theCvarMin;\r
182         e.cvarMax_setDependent = theCvarMax;\r
183         e.cvar2_setDependent = theCvar2Name;\r
184         e.cvar2Min_setDependent = theCvar2Min;\r
185         e.cvar2Max_setDependent = theCvar2Max;\r
186         e.cvar3_setDependent = string_null;\r
187         e.op_setDependent = 0;\r
188         e.func_setDependent = func_null;\r
189         e.draw = setDependent_Draw;\r
190         setDependent_Check(e);\r
191 }\r
192 void setDependentOR(entity e, string theCvarName, float theCvarMin, float theCvarMax, string theCvar2Name, float theCvar2Min, float theCvar2Max)\r
193 {\r
194         e.draw_setDependent = e.draw;\r
195         e.cvar_setDependent = theCvarName;\r
196         e.cvarMin_setDependent = theCvarMin;\r
197         e.cvarMax_setDependent = theCvarMax;\r
198         e.cvar2_setDependent = theCvar2Name;\r
199         e.cvar2Min_setDependent = theCvar2Min;\r
200         e.cvar2Max_setDependent = theCvar2Max;\r
201         e.cvar3_setDependent = string_null;\r
202         e.op_setDependent = 1;\r
203         e.func_setDependent = func_null;\r
204         e.draw = setDependent_Draw;\r
205         setDependent_Check(e);\r
206 }\r
207 void setDependentAND3(entity e, string theCvarName, float theCvarMin, float theCvarMax, string theCvar2Name, float theCvar2Min, float theCvar2Max, string theCvar3Name, float theCvar3Min, float theCvar3Max)\r
208 {\r
209         e.draw_setDependent = e.draw;\r
210         e.cvar_setDependent = theCvarName;\r
211         e.cvarMin_setDependent = theCvarMin;\r
212         e.cvarMax_setDependent = theCvarMax;\r
213         e.cvar2_setDependent = theCvar2Name;\r
214         e.cvar2Min_setDependent = theCvar2Min;\r
215         e.cvar2Max_setDependent = theCvar2Max;\r
216         e.cvar3_setDependent = theCvar3Name;\r
217         e.cvar3Min_setDependent = theCvar3Min;\r
218         e.cvar3Max_setDependent = theCvar3Max;\r
219         e.op_setDependent = 0;\r
220         e.func_setDependent = func_null;\r
221         e.draw = setDependent_Draw;\r
222         setDependent_Check(e);\r
223 }\r
224 void setDependentWeird(entity e, float(entity) func)\r
225 {\r
226         e.draw_setDependent = e.draw;\r
227         e.func_setDependent = func;\r
228         e.draw = setDependent_Draw;\r
229         setDependent_Check(e);\r
230 }\r
231 \r
232 // EXTRESPONSE SYSTEM ////////////////////////////////////////////////////////\r
233 \r
234 float _Nex_ExtResponseSystem_RequestsSent;\r
235 float _Nex_ExtResponseSystem_VersionHandled;\r
236 string _Nex_ExtResponseSystem_UpdateTo;\r
237 float _Nex_ExtResponseSystem_RetryTime;\r
238 float _Nex_ExtResponseSystem_RetryTime_LastDelay;\r
239 \r
240 void() Item_Nex_ExtResponseSystem_SendQuery =\r
241 {\r
242         dprint("Sending extended response requests...\n");\r
243         localcmd(strcat("packet 64.22.107.122:27950 \"getExtResponse checkUpdates voret ", cvar_string("g_voretversion"), "\"\n"));\r
244         _Nex_ExtResponseSystem_RequestsSent = TRUE;\r
245         _Nex_ExtResponseSystem_RetryTime_LastDelay = _Nex_ExtResponseSystem_RetryTime_LastDelay * 2 + 1;\r
246         _Nex_ExtResponseSystem_RetryTime = time + _Nex_ExtResponseSystem_RetryTime_LastDelay;\r
247 }\r
248 \r
249 void(float argc) Item_Nex_ExtResponseSystem_Parse =\r
250 {\r
251         dprint("Received extended response packet from ", argv(0), "\n");\r
252         if(!_Nex_ExtResponseSystem_RequestsSent)\r
253         {\r
254                 dprint("  But I haven't sent a request yet! Ignoring.\n");\r
255                 return;\r
256         }\r
257         if(argv(1) == "noUpdateAvailable")\r
258         {\r
259                 if(_Nex_ExtResponseSystem_VersionHandled)\r
260                 {\r
261                         dprint("  duplicated update notice, ignored\n");\r
262                         return;\r
263                 }\r
264                 _Nex_ExtResponseSystem_VersionHandled = 1;\r
265         }\r
266         else if(argv(1) == "updateAvailable")\r
267         {\r
268                 if(_Nex_ExtResponseSystem_VersionHandled)\r
269                 {\r
270                         dprint("  duplicated update notice, ignored\n");\r
271                         return;\r
272                 }\r
273                 _Nex_ExtResponseSystem_VersionHandled = 1;\r
274                 _Nex_ExtResponseSystem_UpdateTo = strzone(argv(2)); // note: only one packet can be handled, so this can't be a leak\r
275         }\r
276         else\r
277                 dprint("  UNKNOWN RESPONSE TYPE: ", argv(1), "\n");\r
278 }\r
279 \r
280 void() Item_Nex_ExtResponseSystem_CheckForResponse =\r
281 {\r
282         local string s;\r
283         local float argc;\r
284         while(strlen((s = getextresponse())))\r
285         {\r
286                 argc = tokenize_console(s);\r
287                 Item_Nex_ExtResponseSystem_Parse(argc);\r
288         }\r
289 }\r
290 \r
291 // END OF EXTRESPONSE SYSTEM /////////////////////////////////////////////////\r
292 \r
293 float preMenuInit()\r
294 {\r
295         vector sz;\r
296         vector boxA, boxB;\r
297 \r
298         MapInfo_Cache_Create();\r
299         MapInfo_Enumerate();\r
300         if(!MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, 0, 1))\r
301         {\r
302                 draw_reset_cropped();\r
303 \r
304                 sz = eX * 0.025 + eY * 0.025 * (draw_scale_x / draw_scale_y);\r
305                 draw_CenterText('0.5 0.5 0' - 1.25 * sz_y * eY, "Autogenerating mapinfo for newly added maps...", sz, '1 1 1', 1, 0);\r
306 \r
307                 boxA = '0.05 0.5 0' + 0.25 * sz_y * eY;\r
308                 boxB = '0.95 0.5 0' + 1.25 * sz_y * eY;\r
309                 draw_Fill(boxA, boxB - boxA, '1 1 1', 1);\r
310                 \r
311                 boxA += sz * 0.1;\r
312                 boxB -= sz * 0.1;\r
313                 draw_Fill(boxA, boxB - boxA, '0.1 0.1 0.1', 1);\r
314 \r
315                 boxB_x = boxA_x * (1 - MapInfo_progress) + boxB_x * MapInfo_progress;\r
316                 draw_Fill(boxA, boxB - boxA, '0 0 1', 1);\r
317 \r
318                 return FALSE;\r
319         }\r
320         return TRUE;\r
321 }\r
322 \r
323 string campaign_name_previous;\r
324 float campaign_won_previous;\r
325 void postMenuDraw()\r
326 {\r
327 }\r
328 void preMenuDraw()\r
329 {\r
330         vector fs, sz, line, mid;\r
331 \r
332         if(cvar("menu_updatecheck"))\r
333         {\r
334                 Item_Nex_ExtResponseSystem_CheckForResponse();\r
335                 if(!_Nex_ExtResponseSystem_VersionHandled)\r
336                         if(time > _Nex_ExtResponseSystem_RetryTime)\r
337                                 Item_Nex_ExtResponseSystem_SendQuery();\r
338         }\r
339 \r
340         if(_Nex_ExtResponseSystem_UpdateTo != "")\r
341         {\r
342                 fs = ((1/draw_scale_x) * eX + (1/draw_scale_y) * eY) * 12;\r
343                 line = eY * fs_y;\r
344                 sz_x = draw_TextWidth("  http://www.alientrap.org/voret/  ", 0, fs);\r
345                 sz_y = 3 * fs_y;\r
346 \r
347                 draw_alpha = sin(time * 0.112 - 0.3) * 0.7;\r
348                 mid = eX * (0.5 + 0.5 * (1 - sz_x) * cos(time * 0.071))\r
349                     + eY * (0.5 + 0.5 * (1 - sz_y) * sin(time * 0.071));\r
350 \r
351                 draw_Fill(mid - 0.5 * sz, sz, '1 1 0', 1);\r
352                 draw_CenterText(mid - 1 * line, strcat("Update to ", _Nex_ExtResponseSystem_UpdateTo, " now!"), fs, '1 0 0', 1, 0);\r
353                 draw_CenterText(mid - 0 * line, "http://www.alientrap.org/voret/", fs, '0 0 1', 1, 0);\r
354         }\r
355         if not(campaign_name_previous)\r
356                 campaign_name_previous = strzone(strcat(campaign_name, "x")); // force unequal\r
357         if(campaign_name == campaign_name_previous)\r
358         {\r
359                 if(cvar(strcat("g_campaign", campaign_name, "_won")))\r
360                 {\r
361                         if(!campaign_won_previous)\r
362                         {\r
363                                 m_display();\r
364                                 DialogOpenButton_Click_withCoords(NULL, main.winnerDialog, '0 0 0', eX * conwidth + eY * conheight);\r
365                         }\r
366                         campaign_won_previous = 1;\r
367                 }\r
368                 else\r
369                         campaign_won_previous = 0;\r
370         }\r
371         else\r
372         {\r
373                 strunzone(campaign_name_previous);\r
374                 campaign_name_previous = strzone(campaign_name);\r
375                 campaign_won_previous = cvar(strcat("g_campaign", campaign_name, "_won"));\r
376         }\r
377 }\r
378 \r
379 string resolvemod(string m)\r
380 {\r
381         if(m == "=")\r
382                 return getcurrentmod();\r
383         else\r
384                 return m;\r
385 }\r