]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/tfcombat.c
- Tesla no longer crashes game while attacking (changed MSG_BROADCAST to "2")
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / tfcombat.c
1 void () info_player_start;\r
2 void (entity targ, entity attacker) ClientObituary;\r
3 void (entity Goal, entity AP, float addb) DoResults;\r
4 float (entity Goal, entity AP) Activated;\r
5 float (entity targ, entity attacker, float damage) TeamEqualiseDamage; // TBA Add function for this\r
6 \r
7 // Death MSG Caller\r
8 float deathmsg; // Gonna have to make this work with NexTF's\r
9 \r
10 //compiler-satisfying vars (Add these to defs)\r
11 .void() th_die;                                                                 // Note to self: figure out wtf these 2 do\r
12 .void(entity attacker, float damage) th_pain;   ////\r
13 float skill;    // Skill level. Moot in NexTF (no SP, and bots use some other var)\r
14 .float super_damage_finished; //quad damage over <- convert this to work with nex!\r
15 entity damage_attacker;\r
16 .float immune_to_check;         // as it says\r
17 float rj;       // not sure, really..\r
18 \r
19 \r
20 float is_ally (entity targ, entity attacker) {\r
21         if(targ.team_no == attacker.team_no)\r
22                 return 1;\r
23 \r
24         // civilian class\r
25         //if(targ.class == CLASS_CIVILIAN)\r
26         //      return 2;\r
27 \r
28         return 0;\r
29 }\r
30 \r
31 \r
32 // COMBAT\r
33 void () monster_death_use =\r
34 {\r
35         if ((self.flags & 1))\r
36         {\r
37                 self.flags = (self.flags - 1);\r
38         }\r
39         if ((self.flags & 2))\r
40         {\r
41                 self.flags = (self.flags - 2);\r
42         }\r
43         if (!self.target)\r
44         {\r
45                 return;\r
46         }\r
47         activator = self.enemy;\r
48         SUB_UseTargets ();\r
49 };\r
50 \r
51 float (entity targ, entity inflictor) CanDamage =\r
52 {\r
53         if ((targ.movetype == 7))\r
54         {\r
55                 traceline (inflictor.origin, (0.5 * (targ.absmin + targ.absmax)), 1, self);\r
56                 if ((trace_fraction == 1))\r
57                 {\r
58                         return (1);\r
59                 }\r
60                 if ((trace_ent == targ))\r
61                 {\r
62                         return (1);\r
63                 }\r
64                 return (0);\r
65         }\r
66         traceline (inflictor.origin, targ.origin, 1, self);\r
67         if ((trace_fraction == 1))\r
68         {\r
69                 return (1);\r
70         }\r
71         traceline (inflictor.origin, (targ.origin + '15 15 0'), 1, self);\r
72         if ((trace_fraction == 1))\r
73         {\r
74                 return (1);\r
75         }\r
76         traceline (inflictor.origin, (targ.origin + '-15 -15 0'), 1, self);\r
77         if ((trace_fraction == 1))\r
78         {\r
79                 return (1);\r
80         }\r
81         traceline (inflictor.origin, (targ.origin + '-15 15 0'), 1, self);\r
82         if ((trace_fraction == 1))\r
83         {\r
84                 return (1);\r
85         }\r
86         traceline (inflictor.origin, (targ.origin + '15 -15 0'), 1, self);\r
87         if ((trace_fraction == 1))\r
88         {\r
89                 return (1);\r
90         }\r
91         return (0);\r
92 };\r
93 \r
94 void (entity targ, entity attacker) Killed =\r
95 {\r
96         local entity oself;\r
97 \r
98         oself = self;\r
99         self = targ;\r
100         if ((self.health < -99))\r
101         {\r
102                 self.health = -99;\r
103         }\r
104         if (((self.movetype == 7) || (self.movetype == 0)))\r
105         {\r
106                 self.th_die ();\r
107                 self = oself;\r
108                 return;\r
109         }\r
110         if (self.classname == "building_tesla")\r
111         {\r
112                 self.th_die ();\r
113                 self = oself;\r
114                 return;\r
115         }\r
116         self.enemy = attacker;\r
117         if ((self.flags & 32))\r
118         {\r
119                 killed_monsters = (killed_monsters + 1);\r
120                 WriteByte (2, 27);\r
121         }\r
122 //      ClientObituary (self, attacker);                // causing crash :/\r
123 //      Obituary (attacker, targ, deathmsg);\r
124         self.takedamage = 0;\r
125         self.touch = SUB_Null;\r
126         monster_death_use ();\r
127 //      self.th_die ();\r
128 // (float unnatural_death, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force\r
129         PlayerKilled (0, targ, attacker, 0, deathmsg);\r
130         self = oself;\r
131 };\r
132 \r
133 void (entity targ, entity inflictor, entity attacker, float damage) T_Damage =\r
134 {\r
135         local vector dir;\r
136         local entity oldself;\r
137         local entity te;\r
138         local float save;\r
139         local float take;\r
140 \r
141         local float damagearmor;\r
142 \r
143         if (targ.team_no < 1 && targ.classname != "func_button" && targ.classname != "door" && targ.classname != "building_tesla")                      // TEMP\r
144         {                                                               ////\r
145                 return;                                         ////\r
146         }                                                               ////\r
147 \r
148         /*if (targ.classname == "building_tesla")\r
149         {\r
150                 targ.health = (targ.health - take);\r
151                 if ((targ.health <= 0))\r
152                 {\r
153                         Killed (targ, attacker);\r
154                 }\r
155                 return;\r
156         }*/\r
157         if (!targ.takedamage)\r
158         {\r
159                 return;\r
160         }\r
161         if ((attacker.classname == "player"))\r
162         {\r
163                 damage = (damage * 0.9);\r
164         }\r
165         if ((attacker.classname == "player"))\r
166         {\r
167                 if ((attacker.strength_finished > time))\r
168                 {\r
169                         damage = (damage * 4);\r
170                 }\r
171                 if (((targ.classname != "player") && (targ.classname != "bot") && (targ.classname != "building_tesla")))\r
172                 {\r
173                         if (!Activated (targ, attacker))\r
174                         {\r
175                                 if ((targ.else_goal != 0))\r
176                                 {\r
177                                         te = Findgoal (targ.else_goal);\r
178                                         if (te)\r
179                                         {\r
180                                                 AttemptToActivate (te, attacker, targ);\r
181                                         }\r
182                                 }\r
183                                 return;\r
184                         }\r
185                 }\r
186         }\r
187         damage_attacker = attacker;\r
188         if ((teamplay & (64 | 32)))\r
189         {\r
190                 damage = TeamEqualiseDamage (targ, attacker, damage);\r
191         }\r
192         save = ceil ((targ.armortype * damage));\r
193         if ((save >= targ.armorvalue))\r
194         {\r
195                 save = targ.armorvalue;\r
196                 targ.armortype = 0;\r
197                 targ.armorclass = 0;\r
198                 targ.items = (targ.items - (targ.items & ((8192 | 16384) | 32768)));\r
199         }\r
200 \r
201         targ.armorvalue = (targ.armorvalue - save);\r
202         take = ceil ((damage - save));\r
203         if ((targ.flags & 8))\r
204         {\r
205                 targ.dmg_take = (targ.dmg_take + take);\r
206                 targ.dmg_save = (targ.dmg_save + save);\r
207                 targ.dmg_inflictor = inflictor;\r
208         }\r
209         if (((inflictor != world) && (targ.movetype == 3)))\r
210         {\r
211                 targ.immune_to_check = (time + (damage / 20));\r
212                 dir = (targ.origin - ((inflictor.absmin + inflictor.absmax) * 0.5));\r
213                 dir = normalize (dir);\r
214                 if ((((damage < 60) & ((attacker.classname == "player") & (targ.classname == "player"))) & (attacker.netname != targ.netname)))\r
215                 {\r
216                         targ.velocity = (targ.velocity + ((dir * damage) * 11));\r
217                 }\r
218                 else\r
219                 {\r
220                         targ.velocity = (targ.velocity + ((dir * damage) * 8));\r
221                 }\r
222                 if ((((rj > 1) & ((attacker.classname == "player") & (targ.classname == "player"))) & (attacker.netname == targ.netname)))\r
223                 {\r
224                         targ.velocity = (targ.velocity + ((dir * damage) * rj));\r
225                 }\r
226         }\r
227         if ((targ.flags & 64))\r
228         {\r
229                 return;\r
230         }\r
231         if ((targ.invincible_finished >= time))\r
232         {\r
233                 if ((self.invincible_sound < time))\r
234                 {\r
235                         sound (targ, 3, "items/protect3.wav", 1, 1);\r
236                         self.invincible_sound = (time + 2);\r
237                 }\r
238                 return;\r
239         }\r
240         if (((attacker.classname == "player") && ((targ.classname == "player") || (targ.classname == "building_sentrygun"))))\r
241         {\r
242                 if ((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker)))\r
243                 {\r
244                         if ((teamplay & 16))\r
245                         {\r
246                                 return;\r
247                         }\r
248                         else\r
249                         {\r
250                                 if ((teamplay & 8))\r
251                                 {\r
252                                         take = (take / 2);\r
253                                 }\r
254                         }\r
255                 }\r
256         }\r
257 \r
258         //                      MOVED HERE FROM PlayerDamage -- need to port the rest\r
259         // how much damage to deal to armor\r
260         damagearmor = bound(0, damage * 0.2 * (targ.armorvalue / 50) * cvar("g_balance_armor_takedamage"), targ.armorvalue);\r
261         // how much damage armor blocks\r
262         save = bound(0, damage * (targ.armorvalue / 100) * cvar("g_balance_armor_effectiveness"), damage);\r
263         // how much damage to deal to player\r
264         take = bound(0, damage - save, damage);\r
265         targ.armorvalue = targ.armorvalue - damagearmor;\r
266         DelayArmorRegen(targ);\r
267 \r
268         if (((take < 1) && (take != 0)))\r
269         {\r
270                 take = 1;\r
271         }\r
272 \r
273         if (((attacker.classname == "player") && (((((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_tesla")) || (targ.classname == "building_teleporter")) || (targ.classname == "building_camera")) || (targ.classname == "monster_helo")) || (targ.classname == "laser_drone"))))\r
274         {\r
275                 if ((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker)))\r
276                 {\r
277                         if ((teamplay & 16))\r
278                         {\r
279                                 return;\r
280                         }\r
281                         else\r
282                         {\r
283                                 if ((teamplay & 8))\r
284                                 {\r
285                                         take = take / 2;\r
286                                 }\r
287                         }\r
288                 }\r
289         }\r
290 \r
291         targ.health = (targ.health - take);\r
292         if ((targ.armorvalue < 1))\r
293         {\r
294                 targ.armorclass = 0;\r
295                 targ.armorvalue = 0;\r
296         }\r
297         if ((targ.health <= 0))\r
298         {\r
299                 Killed (targ, attacker);\r
300                 return;\r
301         }\r
302         oldself = self;\r
303         self = targ;\r
304         if (self.th_pain)\r
305         {\r
306                 self.th_pain (attacker, take);\r
307                 if ((skill >= 3))\r
308                 {\r
309                         self.pain_finished = (time + 5);\r
310                 }\r
311         }\r
312         self = oldself;\r
313 };\r
314 \r
315 void (entity targ, entity inflictor, entity attacker, float damage, float T_flags, float T_AttackType) TF_T_Damage =\r
316 {\r
317         local vector dir;\r
318         local entity oldself;\r
319         local entity te;\r
320         local float save;\r
321         local float take;\r
322         local float olddmsg;\r
323         local float no_damage;\r
324         local float moment;\r
325 \r
326         if (targ.team_no < 1 && targ.classname != "func_button" && targ.classname != "door" && targ.classname != "building_tesla")                      // TEMP\r
327         {                                                               ////\r
328                 return;                                         ////\r
329         }                                                               ////\r
330         if ((targ.takedamage == 0))\r
331         {\r
332                 return;\r
333         }\r
334         if ((T_AttackType & 256))\r
335         {\r
336                 targ.health = damage;\r
337                 return;\r
338         }\r
339         /*if (cease_fire) // this aint needed\r
340         {\r
341                 return;\r
342         }*/\r
343         no_damage = 0;\r
344         if ((attacker.classname == "player"))\r
345         {\r
346                 damage = (damage * 0.9);\r
347                 if ((attacker.strength_finished > time))\r
348                 {\r
349                         damage = (damage * 4);\r
350                 }\r
351                 if ((((((((((((targ.classname != "player") && (targ.classname != "bot")) && (targ.classname != "building_tesla")) && (targ.classname != "building_sentrygun")) && (targ.classname != "building_dispenser")) && (targ.classname != "trip_bomb")) && (targ.classname != "building_teleporter")) && (targ.classname != "building_camera")) && (targ.classname != "probe")) && (targ.classname != "monster_helo")) && (targ.classname != "laser_drone")))\r
352                 {\r
353                         if (!Activated (targ, attacker))\r
354                         {\r
355                                 if ((targ.else_goal != 0))\r
356                                 {\r
357                                         te = Findgoal (targ.else_goal);\r
358                                         if (te)\r
359                                         {\r
360                                                 AttemptToActivate (te, attacker, targ);\r
361                                         }\r
362                                 }\r
363                                 return;\r
364                         }\r
365                 }\r
366         }\r
367         damage_attacker = attacker;\r
368         if ((teamplay & (64 | 32)))\r
369         {\r
370                 damage = TeamEqualiseDamage (targ, attacker, damage);\r
371         }\r
372         if (((targ.armorclass != 0) && (T_AttackType != 0)))\r
373         {\r
374                 if (((targ.armorclass & 1) && (T_AttackType & 1)))\r
375                 {\r
376                         damage = floor ((damage * 0.5));\r
377                 }\r
378                 if (((targ.armorclass & 2) && (T_AttackType & 2)))\r
379                 {\r
380                         damage = floor ((damage * 0.5));\r
381                 }\r
382                 if (((targ.armorclass & 4) && (T_AttackType & 4)))\r
383                 {\r
384                         damage = floor ((damage * 0.5));\r
385                 }\r
386                 if (((targ.armorclass & 8) && (T_AttackType & 8)))\r
387                 {\r
388                         damage = floor ((damage * 0.5));\r
389                 }\r
390                 if (((targ.armorclass & 16) && (T_AttackType & 16)))\r
391                 {\r
392                         damage = floor ((damage * 0.5));\r
393                 }\r
394         }\r
395         if ((T_flags & 1))\r
396         {\r
397                 take = damage;\r
398                 save = 0;\r
399         }\r
400         else\r
401         {\r
402                 save = ceil ((targ.armortype * damage));\r
403                 if ((((((attacker.classname == "player") && (targ.team_no > 0)) && (targ.team_no == attacker.team_no)) && (targ != attacker)) && (T_flags & 2)))\r
404                 {\r
405                         if ((T_AttackType & 4))\r
406                         {\r
407                                 if ((teamplay & 1024))\r
408                                 {\r
409                                         save = 0;\r
410                                 }\r
411                                 else\r
412                                 {\r
413                                         if ((teamplay & 512))\r
414                                         {\r
415                                                 save = (save / 2);\r
416                                         }\r
417                                 }\r
418                         }\r
419                         else\r
420                         {\r
421                                 if ((teamplay & 256))\r
422                                 {\r
423                                         save = 0;\r
424                                 }\r
425                                 else\r
426                                 {\r
427                                         if ((teamplay & 128))\r
428                                         {\r
429                                                 save = (save / 2);\r
430                                         }\r
431                                 }\r
432                         }\r
433                 }\r
434                 if ((save >= targ.armorvalue))\r
435                 {\r
436                         save = targ.armorvalue;\r
437                         targ.armortype = 0;\r
438                         targ.armorclass = 0;\r
439                         targ.items = (targ.items - (targ.items & ((8192 | 16384) | 32768)));\r
440                 }\r
441                 targ.armorvalue = (targ.armorvalue - save);\r
442                 take = ceil ((damage - save));\r
443         }\r
444         if ((targ.flags & 8))\r
445         {\r
446                 targ.dmg_take = (targ.dmg_take + take);\r
447                 targ.dmg_save = (targ.dmg_save + save);\r
448                 targ.dmg_inflictor = inflictor;\r
449         }\r
450         if ((((inflictor != world) && (targ.movetype == 3)) && !(targ.tfstate & 65536)))\r
451         {\r
452                 if ((deathmsg != 9))\r
453                 {\r
454                         targ.immune_to_check = (time + (damage / 20));\r
455                         dir = (targ.origin - ((inflictor.absmin + inflictor.absmax) * 0.5));\r
456                         dir = normalize (dir);\r
457                         /*if ((targ.class == 6)) // moot function -- NexTF doesnt have an HWGuy\r
458                         {\r
459                                 moment = (damage / 4);\r
460                                 if ((damage <= 50))\r
461                                 {\r
462                                         moment = 0;\r
463                                 }\r
464                         }\r
465                         else*/\r
466                         {\r
467                                 moment = damage;\r
468                         }\r
469                         if ((((moment < 60) && ((attacker.classname == "player") && (targ.classname == "player"))) && (attacker.netname != targ.netname)))\r
470                         {\r
471                                 targ.velocity = (targ.velocity + ((dir * moment) * 11));\r
472                         }\r
473                         else\r
474                         {\r
475                                 targ.velocity = (targ.velocity + ((dir * moment) * 8));\r
476                         }\r
477                         if ((((rj > 1) && ((attacker.classname == "player") && (targ.classname == "player"))) && (attacker.netname == targ.netname)))\r
478                         {\r
479                                 targ.velocity = (targ.velocity + ((dir * moment) * rj));\r
480                         }\r
481                 }\r
482         }\r
483         if ((targ.flags & 64))\r
484         {\r
485                 return;\r
486         }\r
487         if ((targ.invincible_finished >= time))\r
488         {\r
489                 if ((self.invincible_sound < time))\r
490                 {\r
491                         sound (targ, 3, "items/protect3.wav", 1, 1);\r
492                         self.invincible_sound = (time + 2);\r
493                 }\r
494                 return;\r
495         }\r
496 //      if (((attacker.classname == "player") && (((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_dispenser")) || (targ.classname == "building_teleporter_entrance")) || (targ.classname == "building_teleporter_exit"))))\r
497         if (((attacker.classname == "player") && ((((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_tesla")) || (targ.classname == "building_teleporter")) || (targ.classname == "building_camera")) || (targ.classname == "laser_drone"))))\r
498         {\r
499                 if (((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker)) && (T_flags & 2)))\r
500                 {\r
501                         if ((T_AttackType & 4))\r
502                         {\r
503                                 if ((teamplay & 16))\r
504                                 {\r
505                                         no_damage = 1;\r
506                                 }\r
507                                 else\r
508                                 {\r
509                                         if ((teamplay & 8))\r
510                                         {\r
511                                                 take = (take / 2);\r
512                                         }\r
513                                 }\r
514                         }\r
515                         else\r
516                         {\r
517                                 if ((teamplay & 4))\r
518                                 {\r
519                                         no_damage = 1;\r
520                                 }\r
521                                 else\r
522                                 {\r
523                                         if ((teamplay & 2))\r
524                                         {\r
525                                                 take = (take / 2);\r
526                                         }\r
527                                 }\r
528                         }\r
529                 }\r
530         }\r
531         if ((T_flags & 4))\r
532         {\r
533                 if ((targ == attacker))\r
534                 {\r
535                         return;\r
536                 }\r
537         }\r
538 \r
539         local float damagearmor;\r
540         //                      MOVED HERE FROM PlayerDamage -- need to port the rest\r
541         // how much damage to deal to armor\r
542         damagearmor = bound(0, damage * 0.2 * (targ.armorvalue / 50) * cvar("g_balance_armor_takedamage"), targ.armorvalue);\r
543         // how much damage armor blocks\r
544         save = bound(0, damage * (targ.armorvalue / 100) * cvar("g_balance_armor_effectiveness"), damage);\r
545         // how much damage to deal to player\r
546         take = bound(0, damage - save, damage);\r
547         targ.armorvalue = targ.armorvalue - damagearmor;\r
548         DelayArmorRegen(targ);\r
549 \r
550         if ((take < 1))\r
551         {\r
552                 take = 1;\r
553         }\r
554         take = rint (take);\r
555         if ((no_damage == 0))\r
556         {\r
557                 targ.health = (targ.health - take);\r
558         }\r
559         if (((attacker.classname == "player") && (((((targ.classname == "player") || (targ.classname == "building_sentrygun")) || (targ.classname == "building_dispenser")) || (targ.classname == "building_teleporter_entrance")) || (targ.classname == "building_teleporter_exit"))))\r
560         {\r
561                 if (((((targ.team_no > 0) && (targ.team_no == attacker.team_no)) && (targ != attacker)) && (T_flags & 2)))\r
562                 {\r
563                         olddmsg = deathmsg;\r
564                         if ((T_AttackType & 4))\r
565                         {\r
566                                 deathmsg = 37;\r
567                                 if ((teamplay & 16384))\r
568                                 {\r
569                                         TF_T_Damage (attacker, world, world, take, 1, 0);\r
570                                 }\r
571                                 else\r
572                                 {\r
573                                         if ((teamplay & 8192))\r
574                                         {\r
575                                                 TF_T_Damage (attacker, world, world, (take / 2), 1, 0);\r
576                                         }\r
577                                 }\r
578                         }\r
579                         else\r
580                         {\r
581                                 deathmsg = 37;\r
582                                 if ((teamplay & 4096))\r
583                                 {\r
584                                         TF_T_Damage (attacker, world, world, take, 1, 0);\r
585                                 }\r
586                                 else\r
587                                 {\r
588                                         if ((teamplay & 2048))\r
589                                         {\r
590                                                 TF_T_Damage (attacker, world, world, (take / 2), 1, 0);\r
591                                         }\r
592                                 }\r
593                         }\r
594                         deathmsg = olddmsg;\r
595                 }\r
596         }\r
597         if ((no_damage == 1))\r
598         {\r
599                 return;\r
600         }\r
601         if ((targ.armorvalue < 1))\r
602         {\r
603                 targ.armorclass = 0;\r
604                 targ.armorvalue = 0;\r
605         }\r
606         if ((targ.health <= 0))\r
607         {\r
608                 if ((((inflictor.classname == "detpack") && (inflictor.weaponmode == 1)) && (inflictor.enemy == targ)))\r
609                 {\r
610                         deathmsg = 16;\r
611                 }\r
612                 Killed (targ, attacker);\r
613                 return;\r
614         }\r
615         oldself = self;\r
616         self = targ;\r
617         if (self.th_pain)\r
618         {\r
619                 self.th_pain (attacker, take);\r
620                 if ((skill >= 3))\r
621                 {\r
622                         self.pain_finished = (time + 5);\r
623                 }\r
624         }\r
625         self = oldself;\r
626 };\r
627 \r
628 void (entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDamage =\r
629 {\r
630         local float points;\r
631         local entity head;\r
632         local vector org;                                                       ////\r
633 \r
634         head = findradius (inflictor.origin, (damage + 40));\r
635         while (head)\r
636         {\r
637                 if ((head != ignore))\r
638                 {\r
639                         if (head.takedamage)\r
640                         {\r
641                                 org = (head.origin + ((head.mins + head.maxs) * 0.5));\r
642                                 points = (0.5 * vlen ((inflictor.origin - org)));\r
643                                 if ((points < 0))\r
644                                 {\r
645                                         points = 0;\r
646                                 }\r
647                                 points = (damage - points);\r
648                                 if ((head == attacker))\r
649                                 {\r
650                                         points = (points * 0.75);\r
651                                 }\r
652                                 if ((points > 0))\r
653                                 {\r
654                                         if (CanDamage (head, inflictor))\r
655                                         {\r
656                                                 if ((head.classname == "monster_shambler"))\r
657                                                 {\r
658                                                         T_Damage (head, inflictor, attacker, (points * 0.5));\r
659                                                 }\r
660                                                 else\r
661                                                 {\r
662                                                         TF_T_Damage (head, inflictor, attacker, points, 2, 4);\r
663                                                 }\r
664                                         }\r
665                                 }\r
666                         }\r
667                 }\r
668                 head = head.chain;\r
669         }\r
670 };\r