]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu/nexuiz/util.qc
the fitting menu changes
[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.cvarName)
13                 e.saveCvars(e);
14 }
15 void loadCvarsOf(entity ignore, entity e)
16 {
17         if(e.cvarName)
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;
30 void saveCvarsMulti(entity me)
31 {
32         float n, i;
33         string s;
34         n = tokenize(me.cvarNames);
35         s = ftos(me.value);
36         cvar_set(me.cvarName, s);
37         for(i = 0; i < n; ++i)
38                 cvar_set(argv(i), s);
39 }
40
41 .void(entity) draw_setDependent;
42 .string cvar_setDependent;
43 .float cvarMin_setDependent;
44 .float cvarMax_setDependent;
45 .string cvar2_setDependent;
46 .float cvar2Min_setDependent;
47 .float cvar2Max_setDependent;
48 .float op_setDependent;
49 .string cvarString_setDependent;
50 .string cvarValue_setDependent;
51 void setDependent_Check(entity e)
52 {
53         float f;
54         string s;
55         if(e.cvarString_setDependent)
56         {
57                 s = cvar_string(e.cvarString_setDependent);
58                 e.disabled = (cvar_string(e.cvarString_setDependent) == e.cvarValue_setDependent);
59         }
60         else
61         {
62                 if(e.cvar_setDependent)
63                 {
64                         f = cvar(e.cvar_setDependent);
65                         if(e.cvarMin_setDependent <= e.cvarMax_setDependent)
66                                 e.disabled = ((f < e.cvarMin_setDependent) || (f > e.cvarMax_setDependent));
67                         else
68                                 e.disabled = ((f >= e.cvarMax_setDependent) && (f <= e.cvarMin_setDependent));
69                 }
70                 if(e.cvar2_setDependent)
71                 {
72                         f = cvar(e.cvar2_setDependent);
73                         if(e.cvar2Min_setDependent <= e.cvar2Max_setDependent)
74                                 e.disabled = (e.disabled + ((f < e.cvar2Min_setDependent) || (f > e.cvar2Max_setDependent)) > e.op_setDependent);
75                         else
76                                 e.disabled = (e.disabled + ((f >= e.cvar2Max_setDependent) && (f <= e.cvar2Min_setDependent)) > e.op_setDependent);
77                 }
78         }
79 }
80 void setDependent_Draw(entity e)
81 {
82         setDependent_Check(e);
83         e.draw_setDependent(e);
84 }
85 void setDependent(entity e, string theCvarName, float theCvarMin, float theCvarMax)
86 {
87         e.draw_setDependent = e.draw;
88         e.cvar_setDependent = theCvarName;
89         e.cvarMin_setDependent = theCvarMin;
90         e.cvarMax_setDependent = theCvarMax;
91         e.cvar2_setDependent = string_null;
92         e.draw = setDependent_Draw;
93         setDependent_Check(e);
94 }
95 void setDependentStringNotEqual(entity e, string theCvarName, string theCvarValue)
96 {
97         e.draw_setDependent = e.draw;
98         e.cvarString_setDependent = theCvarName;
99         e.cvarValue_setDependent = theCvarValue;
100         e.cvar_setDependent = string_null;
101         e.cvar2_setDependent = string_null;
102         e.draw = setDependent_Draw;
103         setDependent_Check(e);
104 }
105 void setDependentAND(entity e, string theCvarName, float theCvarMin, float theCvarMax, string theCvar2Name, float theCvar2Min, float theCvar2Max)
106 {
107         e.draw_setDependent = e.draw;
108         e.cvar_setDependent = theCvarName;
109         e.cvarMin_setDependent = theCvarMin;
110         e.cvarMax_setDependent = theCvarMax;
111         e.cvar2_setDependent = theCvar2Name;
112         e.cvar2Min_setDependent = theCvar2Min;
113         e.cvar2Max_setDependent = theCvar2Max;
114         e.op_setDependent = 0;
115         e.draw = setDependent_Draw;
116         setDependent_Check(e);
117 }
118 void setDependentOR(entity e, string theCvarName, float theCvarMin, float theCvarMax, string theCvar2Name, float theCvar2Min, float theCvar2Max)
119 {
120         e.draw_setDependent = e.draw;
121         e.cvar_setDependent = theCvarName;
122         e.cvarMin_setDependent = theCvarMin;
123         e.cvarMax_setDependent = theCvarMax;
124         e.cvar2_setDependent = theCvar2Name;
125         e.cvar2Min_setDependent = theCvar2Min;
126         e.cvar2Max_setDependent = theCvar2Max;
127         e.op_setDependent = 1;
128         e.draw = setDependent_Draw;
129         setDependent_Check(e);
130 }
131
132 // EXTRESPONSE SYSTEM ////////////////////////////////////////////////////////
133
134 float _Nex_ExtResponseSystem_RequestsSent;
135 float _Nex_ExtResponseSystem_VersionHandled;
136 string _Nex_ExtResponseSystem_UpdateTo;
137 float _Nex_ExtResponseSystem_RetryTime;
138 float _Nex_ExtResponseSystem_RetryTime_LastDelay;
139
140 void() Item_Nex_ExtResponseSystem_SendQuery =
141 {
142         dprint("Sending extended response requests...\n");
143         localcmd(strcat("packet update.alientrap.org:27950 \"getExtResponse checkUpdates nexuiz ", cvar_string("g_nexuizversion"), "\"\n"));
144         _Nex_ExtResponseSystem_RequestsSent = TRUE;
145         _Nex_ExtResponseSystem_RetryTime_LastDelay = _Nex_ExtResponseSystem_RetryTime_LastDelay * 2 + 1;
146         _Nex_ExtResponseSystem_RetryTime = time + _Nex_ExtResponseSystem_RetryTime_LastDelay;
147 }
148
149 void(float argc) Item_Nex_ExtResponseSystem_Parse =
150 {
151         dprint("Received extended response packet from ", argv(0), "\n");
152         if(!_Nex_ExtResponseSystem_RequestsSent)
153         {
154                 dprint("  But I haven't sent a request yet! Ignoring.\n");
155                 return;
156         }
157         if(argv(1) == "noUpdateAvailable")
158         {
159                 if(_Nex_ExtResponseSystem_VersionHandled)
160                 {
161                         dprint("  duplicated update notice, ignored\n");
162                         return;
163                 }
164                 _Nex_ExtResponseSystem_VersionHandled = 1;
165         }
166         else if(argv(1) == "updateAvailable")
167         {
168                 if(_Nex_ExtResponseSystem_VersionHandled)
169                 {
170                         dprint("  duplicated update notice, ignored\n");
171                         return;
172                 }
173                 _Nex_ExtResponseSystem_VersionHandled = 1;
174                 _Nex_ExtResponseSystem_UpdateTo = strzone(argv(2)); // note: only one packet can be handled, so this can't be a leak
175         }
176         else
177                 dprint("  UNKNOWN RESPONSE TYPE: ", argv(1), "\n");
178 }
179
180 void() Item_Nex_ExtResponseSystem_CheckForResponse =
181 {
182         local string s;
183         local float argc;
184         while(strlen((s = getextresponse())))
185         {
186                 argc = tokenize(s);
187                 Item_Nex_ExtResponseSystem_Parse(argc);
188         }
189 }
190
191 // END OF EXTRESPONSE SYSTEM /////////////////////////////////////////////////
192
193 float preMenuInit()
194 {
195         vector sz;
196         vector boxA, boxB;
197
198         MapInfo_Cache_Create();
199         MapInfo_Enumerate();
200         if(!MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 1))
201         {
202                 draw_reset();
203
204                 sz = eX * 0.025 + eY * 0.025 * (draw_scale_x / draw_scale_y);
205                 draw_CenterText('0.5 0.5 0' - 1.25 * sz_y * eY, "Autogenerating mapinfo for newly added maps...", sz, '1 1 1', 1, 0);
206
207                 boxA = '0.05 0.5 0' + 0.25 * sz_y * eY;
208                 boxB = '0.95 0.5 0' + 1.25 * sz_y * eY;
209                 draw_Fill(boxA, boxB - boxA, '1 1 1', 1);
210                 
211                 boxA += sz * 0.1;
212                 boxB -= sz * 0.1;
213                 draw_Fill(boxA, boxB - boxA, '0.1 0.1 0.1', 1);
214
215                 boxB_x = boxA_x * (1 - MapInfo_progress) + boxB_x * MapInfo_progress;
216                 draw_Fill(boxA, boxB - boxA, '0 0 1', 1);
217
218                 return FALSE;
219         }
220         return TRUE;
221 }
222
223 string campaign_name_previous;
224 float campaign_won_previous;
225 void postMenuDraw()
226 {
227 }
228 void preMenuDraw()
229 {
230         vector fs, sz, line, mid;
231         Item_Nex_ExtResponseSystem_CheckForResponse();
232         if(!_Nex_ExtResponseSystem_VersionHandled)
233                 if(time > _Nex_ExtResponseSystem_RetryTime)
234                         Item_Nex_ExtResponseSystem_SendQuery();
235
236         if(_Nex_ExtResponseSystem_UpdateTo != "")
237         {
238                 fs = ((1/draw_scale_x) * eX + (1/draw_scale_y) * eY) * 12;
239                 line = eY * fs_y;
240                 sz_x = draw_TextWidth("  http://www.nexuiz.com/  ", 0) * fs_x;
241                 sz_y = 3 * fs_y;
242
243                 draw_alpha = sin(time * 0.112 - 0.3) * 0.7;
244                 mid = eX * (0.5 + 0.5 * (1 - sz_x) * cos(time * 0.071))
245                     + eY * (0.5 + 0.5 * (1 - sz_y) * sin(time * 0.071));
246
247                 draw_Fill(mid - 0.5 * sz, sz, '1 1 0', 1);
248                 draw_CenterText(mid - 1 * line, strcat("Update to ", _Nex_ExtResponseSystem_UpdateTo, " now!"), fs, '1 0 0', 1, 0);
249                 draw_CenterText(mid - 0 * line, "http://www.nexuiz.com/", fs, '0 0 1', 1, 0);
250         }
251         if not(campaign_name_previous)
252                 campaign_name_previous = strzone(strcat(campaign_name, "x")); // force unequal
253         if(campaign_name == campaign_name_previous)
254         {
255                 if(cvar(strcat("g_campaign", campaign_name, "_won")))
256                 {
257                         if(!campaign_won_previous)
258                         {
259                                 m_display();
260                                 DialogOpenButton_Click_withCoords(NULL, main.winnerDialog, '0 0 0', eX * conwidth + eY * conheight);
261                         }
262                         campaign_won_previous = 1;
263                 }
264                 else
265                         campaign_won_previous = 0;
266         }
267         else
268         {
269                 strunzone(campaign_name_previous);
270                 campaign_name_previous = strzone(campaign_name);
271                 campaign_won_previous = cvar(strcat("g_campaign", campaign_name, "_won"));
272         }
273 }