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