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