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