]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/tfq3fitems.c
now menu qc respects g_campaign_name
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / tfq3fitems.c
1 /*\r
2 =============\r
3         XavioR's Q3F/ETF Entity recognition\r
4                                                         ==============\r
5 */\r
6 // q3f_forts seems to work almost perfectly --\r
7 //any other map will probably need a small to large amount of entity editing;\r
8 //still, this code does do a lot of work for you so give it a look :)\r
9 .string groupname;\r
10 //.string allowteams;\r
11 .string give;\r
12 .string active_all_sound;\r
13 .string carried_message;\r
14 .string active_all_message;\r
15 .string carried_sound;\r
16 .string holding;\r
17 .string team_owner;\r
18 .float gameindex;\r
19 .float teamscore;\r
20 //.vector orig_origin;\r
21 float RED_GOAL = 200;\r
22 float BLUE_GOAL = 100;\r
23 float ANY_GOAL = 50;\r
24 \r
25 // Parse ETF/Q3F's "give" property (substrings ftw!)\r
26 .float ammo_charge;\r
27 .float stleng;\r
28 float (string give_string, float st_len1, float st_len2) grabval =\r
29 {\r
30         local float posneg;\r
31 //      local float maxstl;\r
32         local string st;\r
33         posneg = 1;\r
34 \r
35         st = substring(give_string, st_len1, 1);\r
36         if (st == "-")\r
37                 posneg = -1;\r
38         \r
39         st = substring(give_string, st_len1 + st_len2 - 1, 1);\r
40         if (st == ",")\r
41 //              self.stleng = 2;\r
42                 self.stleng = st_len2 - 2;\r
43 \r
44         else\r
45 //              self.stleng = 3;\r
46                 self.stleng = st_len2 - 1;\r
47 \r
48         st = substring(give_string, st_len1 + 1, self.stleng);\r
49         return(stof(st) * posneg);\r
50 };\r
51 \r
52 void (entity goal) ParseGive =\r
53 {\r
54         if (goal.give == "converted")\r
55                 return;\r
56         local string give_string;\r
57         local string st;\r
58         local string chargeorcell;\r
59         local float st_len;\r
60         local float en_len;\r
61         local entity oself;\r
62         st_len = 0;\r
63         en_len = 5;\r
64         give_string = self.give;\r
65         self = oself;\r
66         self = goal;\r
67 \r
68         st = substring(give_string, st_len, 6);\r
69         while (st != "")\r
70         {\r
71                 if (st == "health" )\r
72                 {\r
73                         st_len = st_len + 7;\r
74                         self.health = grabval (give_string, st_len, 4);\r
75                 }\r
76                 else if (st == "armor=" )\r
77                 {\r
78                         st_len = st_len + 6;\r
79                         self.armorvalue = grabval (give_string, st_len, 4);\r
80                 }\r
81                 else if (st == "ammo_s" )\r
82                 {\r
83                         st_len = st_len + 12;\r
84                         self.ammo_shells = grabval (give_string, st_len, 4);\r
85                 }\r
86                 else if (st == "ammo_b" )\r
87                 {\r
88                         st_len = st_len + 13;\r
89                         self.ammo_shells = grabval (give_string, st_len, 4);\r
90                 }\r
91                 else if (st == "ammo_c" )\r
92                 {\r
93                         chargeorcell = substring(give_string, st_len, 7);\r
94 //                      bprint(2,chargeorcell);\r
95 //                      bprint(2,"\n");\r
96                         if (chargeorcell == "ammo_ch" ) // if it's ammo_charge, we really dont care much\r
97                         {\r
98                                 st_len = st_len + 12;\r
99                                 self.ammo_charge = self.ammo_charge = grabval (give_string, st_len, 3);\r
100                         }\r
101                         else\r
102                         {\r
103                                 st_len = st_len + 11;\r
104                                 self.ammo_cells = grabval (give_string, st_len, 4);\r
105                         }\r
106                 }\r
107                 else if (st == "ammo_r" )\r
108                 {\r
109                         st_len = st_len + 13;\r
110                         self.ammo_rockets = grabval (give_string, st_len, 4);\r
111                 }\r
112                 else if (st == "ammo_n" )\r
113                 {\r
114                         st_len = st_len + 11;\r
115                         self.ammo_nails = grabval (give_string, st_len, 4);\r
116                 }\r
117                 else if (st == "ammo_m" )\r
118                 {\r
119                         st_len = st_len + 13;\r
120                         self.ammo_medikit = grabval (give_string, st_len, 4);\r
121                 }\r
122                 else if (st == "score=" )\r
123                 {\r
124                         st_len = st_len + 6;\r
125                         self.frags = grabval (give_string, st_len, 3);\r
126                 }\r
127                 else if (st == "gren1=" )\r
128                 {\r
129                         st_len = st_len + 6;\r
130                         self.no_grenades_1 = grabval (give_string, st_len, 3);\r
131                 }\r
132                 else if (st == "gren2=" )\r
133                 {\r
134                         st_len = st_len + 6;\r
135                         self.no_grenades_2 = grabval (give_string, st_len, 3);\r
136                 }\r
137                 st_len = st_len + self.stleng + 2;\r
138                 st = substring(give_string, st_len, 6);\r
139         }\r
140         self.give = "";\r
141         oself = self;\r
142 \r
143 //      bprint(2, self.classname);\r
144 //      bprint(2, " ");\r
145 //      bprint(2, "finishes\n");\r
146 };\r
147 \r
148 // Q3F/ETF Maps dont have info_tfdetects, so this calls it.\r
149 void () DoTFDetect =\r
150 {\r
151         if (q3fdetect == 1)\r
152                 return;\r
153 self.display_item_status1 = 1;\r
154 self.n_s_c = "ÅÎÅÍÙ flag: carried by";\r
155 self.display_item_status2 = 2;\r
156 self.impulse = 64;\r
157 //self.classname = "info_tfdetect";\r
158 self.b_n = "\n";\r
159 self.t_s_h = "ÙÏÕÒ flag: base.";\r
160 //self.origin = '-80 -60 108';\r
161 self.t_s_c = "ÙÏÕÒ flag: carried by";\r
162 self.n_s_h = "ÅÎÅÍÙ flag: base.";\r
163 self.b_t = "Amnesia\n\9d\9e\9f CHOOSE YOUR TEAM \9d\9e\9f\n\n\90..\85 BLUE TEAM\n\90..\85 ÒÅÄ TEAM \n\n\90\97.\85 AUTO TEAM\n";\r
164 self.b_b = "TeamFortress";\r
165 self.n_s_m = "ÅÎÅÍÙ flag: down.";\r
166 self.t_s_m = "ÙÏÕÒ flag: down.";\r
167 q3fdetect = 1;\r
168 info_tfdetect();\r
169 };\r
170 \r
171 void () PossiblyDoTFDetect =\r
172 {\r
173         if (q3fdetect != 1)\r
174         {\r
175                 newmis = spawn();\r
176                 newmis.classname = "info_tfdetect";\r
177                 newmis.nextthink = time;\r
178                 newmis.think = DoTFDetect;\r
179         }\r
180 }\r
181 \r
182 //      Converts item to FLAG\r
183 void (float tno) ConvertToFlag =\r
184 {\r
185         PossiblyDoTFDetect();\r
186         local string droppedmsg;\r
187 \r
188         if (self.allowteams == "red")\r
189         {\r
190 //              if (redflagexists == 1)\r
191 //                      return;\r
192                 self.team_no = 2;\r
193                 self.owned_by = 1;\r
194                 if (!self.n_b)\r
195                         self.n_b = " took the Blue Æìáç!\n";\r
196                 droppedmsg = " Dropped the Blue flag\n";\r
197                 self.netname = "Red Flag";\r
198                 redflagexists = 1;\r
199 \r
200                         if (!self.goal_no)\r
201                 self.goal_no = RED_GOAL;                // Temp Goal Number, can be overridden by a "goal" def in the entity\r
202         }\r
203         if (self.allowteams == "blue")\r
204         {\r
205 //              if (blueflagexists == 1)\r
206 //                      return;\r
207                 self.team_no = 1;\r
208                 self.owned_by = 2;\r
209                 if (!self.n_b)\r
210                         self.n_b = " took the Red Æìáç!\n";\r
211                 droppedmsg = " Dropped the Red flag\n";\r
212                 self.netname = "Blue Flag";\r
213                 blueflagexists = 1;\r
214 \r
215                         if (!self.goal_no)\r
216                 self.goal_no = BLUE_GOAL;               // Temp Goal Number, can be overridden by a "goal" def in the entity\r
217         }\r
218         if (self.allowteams == "all" || tno == 0)\r
219         {\r
220                 self.owned_by = 0;\r
221                 self.goal_no = ANY_GOAL;\r
222         }\r
223 \r
224         self.classname = "item_tfgoal";\r
225         if (self.carried_message)\r
226                 self.message = self.carried_message;\r
227 \r
228         self.d_t = "the ÅÎÅÍÙ ìïóô your flag!\n";               // The enemy stole your flag msg\r
229         self.b_o = "Your flag has been stolen!\n";\r
230 \r
231         self.noise = self.carried_sound;\r
232 //      self.noise3 = self.inactive_all_message;\r
233         self.noise3 = "Your flag has returned to base!\n";\r
234 //      self.noise4 = self.inactive_all_message;\r
235         self.noise4 = "The enemy flag has returned to base!\n";\r
236 \r
237 //      self.impulse = 9;\r
238         self.items = 133701;\r
239 \r
240         if (self.model)\r
241                 self.mdl = self.model;\r
242 \r
243 //      self.mdl = "models/flag.md3";\r
244 \r
245         if (!self.delay)\r
246                 self.delay = self.wait;\r
247 \r
248         self.d_n_n = droppedmsg;\r
249         self.d_n_t = droppedmsg;\r
250 \r
251         self.g_a = 2741;\r
252         self.g_e = 17;\r
253 \r
254 \r
255         item_tfgoal();\r
256 };\r
257 \r
258 // This is the function that will convert an item to a backpack\r
259 //(happens with any item that has a "give" value).\r
260 void () ConvertToBackPack =\r
261 {\r
262         PossiblyDoTFDetect();\r
263 //      ParseGive();\r
264 \r
265         if (self.give == "")\r
266                 return;\r
267 \r
268 //      self.classname = "i_t_g";\r
269         if (self.allowteams == "red")\r
270         {\r
271                 self.team_no = 2;\r
272                 self.owned_by = 2;\r
273         }\r
274         if (self.allowteams == "blue")\r
275         {\r
276                 self.team_no = 1;\r
277                 self.owned_by = 1;\r
278         }\r
279 \r
280         self.message = "Resupplied!\n";\r
281         if (self.carried_message != "")\r
282                 self.message = self.carried_message;\r
283         if (self.active_all_message != "")\r
284                 self.message = self.active_all_message;\r
285 \r
286         self.mdl = self.model;\r
287         self.noise = self.active_all_sound;\r
288         self.g_e = 1;\r
289         self.g_a = 1;\r
290 \r
291         self.flags = self.flags & FL_ITEM & FL_WEAPON; // makes it turn around -- much more bandwidth efficient\r
292 \r
293 /*      self.orig_origin = self.origin;         // old pack float code\r
294         newmis = spawn();                                       // thx savagex for making me aware of cl_itembobheight\r
295         newmis.floating = -17;\r
296         newmis.owner = self;\r
297         newmis.think = PackFloat;\r
298         newmis.nextthink = (time + 1.000000);*/\r
299 \r
300         // If no ammo amount is specified in the entity, it will default to these values.\r
301         // The reason for this is because q3f/etf uses "give" commands to add ammo, and I can't\r
302         //convert those easily :(\r
303         if (!(self.ammo_nails || self.ammo_cells || self.ammo_rockets || self.health))\r
304         {\r
305                 self.health = 50;\r
306                 self.ammo_shells = 20;\r
307                 self.ammo_nails = 100;\r
308                 self.ammo_rockets = 15;\r
309                 self.a_c = 25;\r
310                 self.armorvalue = 100;\r
311                 self.no_grenades_1 = 2;\r
312                 self.no_grenades_2 = 1;\r
313         }\r
314         i_t_g ();\r
315 };\r
316 \r
317 // Converts Q3F/ETF Team Spawn points to tf-recognized ones.\r
318 /*void () info_player_start =\r
319 {\r
320         if (self.allowteams == "blue")\r
321                 self.team_no = 1;\r
322         if (self.allowteams == "red")\r
323                 self.team_no = 2;\r
324         i_p_t();\r
325 };*/\r
326 \r
327 void() info_notnull =\r
328 {\r
329         if (self.give != "")\r
330         {\r
331                 ConvertToBackPack ();\r
332         }\r
333         if (self.groupname == "anyflag")\r
334                 ConvertToFlag(0);\r
335         if (self.groupname == "blueflag")\r
336                 ConvertToFlag(1);\r
337         if (self.groupname == "redflag")\r
338                 ConvertToFlag(2);\r
339 };\r
340 \r
341 void() func_goalinfo =\r
342 {\r
343         if (self.give != "")\r
344         {\r
345                 ConvertToBackPack ();\r
346         }\r
347         if (self.groupname == "anyflag")\r
348                 ConvertToFlag(0);\r
349         if (self.groupname == "blueflag")\r
350                 ConvertToFlag(1);\r
351         if (self.groupname == "redflag")\r
352                 ConvertToFlag(2);\r
353 };\r
354 \r
355 void() func_goalitem =\r
356 {\r
357         if (self.give != "")\r
358         {\r
359                 ConvertToBackPack ();\r
360         }\r
361         if (self.groupname == "anyflag" && self.gameindex != 3) {\r
362                 ConvertToFlag(0);\r
363         }\r
364         if (self.groupname == "blueflag" && self.gameindex != 3) {\r
365                 ConvertToFlag(1);\r
366         }\r
367         if (self.groupname == "redflag" && self.gameindex != 3) {\r
368                 ConvertToFlag(2);\r
369         }\r
370 };\r
371 \r
372 // Converts trigger_multiples to Flag Goals (the point(s) where the flag is capped).\r
373 //This works for q3f_forts and machse and a couple other ones. \r
374 void(float tno) ConvertToGoal =\r
375 {\r
376         if (!self.holding)\r
377                 return;\r
378         if (tno == 1)\r
379         {\r
380                 self.team_no = 2;\r
381                 self.axhitme = 200;\r
382                 self.items_allowed = 200;\r
383         }\r
384         if (tno == 2)\r
385         {\r
386                 self.team_no = 1;\r
387                 self.axhitme = 100;\r
388                 self.items_allowed = 100;\r
389         }\r
390         if (tno == 0)\r
391         {\r
392                 self.axhitme = ANY_GOAL;\r
393                 self.items_allowed = ANY_GOAL;\r
394                 if (self.team_owner == "blue" || self.owned_by == 1)\r
395                         self.team_no = 1;\r
396                 else if (self.team_owner == "red" || self.owned_by == 2)\r
397                         self.team_no = 2;\r
398         }\r
399 \r
400         self.is_converted_goal = "yes"; // used with spawn point finder, no connnection with the actual conversion\r
401 \r
402         self.goal_result = 2;\r
403         self.noise = self.active_all_sound;\r
404         self.frags = self.teamscore;\r
405         self.count = self.teamscore;\r
406         self.classname = "i_t_g";\r
407 \r
408 //      ParseGive();\r
409 \r
410         self.g_a = 1;\r
411         self.g_e = 3;\r
412 \r
413         i_t_g();\r
414 };\r
415 \r
416 void() CheckIfQ3FTrigger =                      // Handles trigger_multiples from Q3F/ETF -- called from trigger_multiple\r
417 {\r
418         if (self.holding == "blueflag")\r
419                 ConvertToGoal (1);\r
420         if (self.holding == "redflag")\r
421                 ConvertToGoal (2);\r
422         if (self.holding == "anyflag")\r
423                 ConvertToGoal (0);\r
424         if (self.holding == "oneflag" && self.allowteams == "blue")\r
425                 ConvertToGoal (1);\r
426         if (self.holding == "oneflag" && self.allowteams == "red")\r
427                 ConvertToGoal (2);\r
428 };\r
429 \r
430 // func_hud is not valid in Team:Nexuiz (dont know if it will ever be)\r
431 void () func_hud =\r
432 {\r
433         dremove(self);\r
434 };\r