]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/spy.c
- Added new backpack/tfitem property -- item_backpack gives metal ammo when var...
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / spy.c
1 \r
2 void SpyDecloak()\r
3 {\r
4         if(!self.special_active)\r
5                 return;\r
6         self.special_active = 0;\r
7         ResetPlayerModel(self);\r
8         if(self.health < 2)\r
9                 self.alpha = 0;\r
10         else\r
11                 self.alpha = 0.1;\r
12 }\r
13 \r
14 void SpyCloak()\r
15 {\r
16         if(self.health <= cvar("g_balance_spy_cloak_min_health"))\r
17         {\r
18                 sprint(self, "not healthy enough\n");\r
19                 return;\r
20         }\r
21 \r
22         self.health = self.health - cvar("g_balance_spy_cloak_cost_start");\r
23 \r
24         self.alpha = 1;\r
25 \r
26         self.special_active = 1;\r
27         self.special_time = time;\r
28 }\r
29 \r
30 void SpySpecial()\r
31 {\r
32         if(self.special_active)\r
33         {\r
34                 SpyDecloak();\r
35                 return;\r
36         }\r
37         SpyCloak();\r
38 }\r
39 \r
40 void SpyGrenade(float req)\r
41 {\r
42         SpyDecloak();\r
43         if(req == WR_GRENADE1)\r
44         {\r
45                 if( W_ThrowGrenade(W_NailGrenade) )\r
46                         self.grenade_time = time + cvar("g_balance_grenade_nail_refire");\r
47         }\r
48         else if(req == WR_GRENADE2)\r
49         {\r
50         }\r
51 }\r
52 \r
53 void SpyCloakFlicker(entity pl)\r
54 {\r
55         if(pl.class != CLASS_SPY)\r
56                 return;\r
57         if(!pl.special_active)\r
58                 return;\r
59 \r
60         pl.alpha = bound(0.001, pl.alpha + 0.3 + random()*0.2, 1);\r
61 }\r
62 \r
63 void SpyPreThink()\r
64 {\r
65         local vector m1, m2;\r
66         local float desired_alpha, spd, min_health;\r
67 \r
68         if(self.special_active) // am I cloaked?\r
69         {\r
70                 min_health = cvar("g_balance_spy_cloak_min_health");\r
71                 if(self.health < min_health || self.onfire != world || self.poison_damage)\r
72                 {// out of health\r
73                         SpyDecloak();\r
74                         return;\r
75                 }\r
76 \r
77                 spd = vlen(self.velocity);\r
78                 spd = spd - self.speed*1.15; // spy can stay cloaked up to his max speed (plus some extra to keep from flickering on slopes), but any faster and he starts to show...\r
79                 if(spd <= 0)\r
80                         desired_alpha = 0;\r
81                 else\r
82                 {\r
83                         desired_alpha = bound(0, \r
84                                 cvar("g_balance_spy_move_alpha")*spd / self.speed, \r
85                                 cvar("g_balance_spy_move_alpha_max"));\r
86                 }\r
87 \r
88 \r
89                 // adjust alpha to reflect new value\r
90                 if(self.alpha < desired_alpha)\r
91                         self.alpha = bound(0.001, self.alpha + 0.1, 1);\r
92                 else if(self.alpha > desired_alpha)\r
93                         self.alpha = bound(0.001, self.alpha - 0.1, 1);\r
94 \r
95                 // take health/armor cost\r
96                 self.health = bound(min_health,\r
97                         self.health - cvar("g_balance_spy_cloak_cost_upkeeph") * frametime,\r
98                         self.health);\r
99                 // take health/armor cost\r
100                 self.armorvalue = bound(0,\r
101                         self.armorvalue - cvar("g_balance_spy_cloak_cost_upkeepa") * frametime,\r
102                         self.armorvalue);\r
103 \r
104                 if(self.health <= min_health)\r
105                 {// out of health\r
106                         SpyDecloak();\r
107                         return;\r
108                 }\r
109 \r
110 \r
111                 self.special_time = time + 0.1;\r
112 \r
113                 // if I'm fully cloaked, set my model to nothing\r
114                 if(self.alpha < 0.01 && self.model != "")\r
115                 {\r
116                         m1 = self.mins;\r
117                         m2 = self.maxs;\r
118                         setmodel (self, "");\r
119                         setsize (self, m1, m2);\r
120                 }\r
121                 else if(self.alpha > 0.01 && self.model == "")\r
122                 {\r
123                         ResetPlayerModel(self);\r
124                 }\r
125 \r
126                 self.alpha = bound(0.001, self.alpha, 1.0);\r
127 \r
128                 // also cloak weapons\r
129                 self.weaponentity.alpha = 1 - 0.5*(1 - self.alpha);//self.alpha + 0.1;\r
130                 self.exteriorweaponentity.alpha = self.alpha; //self.weaponentity.alpha;\r
131         }\r
132         else\r
133         {// decloaked\r
134                 if(self.alpha != 0)// && self.alpha != 1)\r
135                 {// not fully visible yet, keep phasing back in\r
136                         self.alpha = self.alpha + 0.1;\r
137                         self.weaponentity.alpha = 1 - (1 - self.alpha)*0.5;\r
138                         if(self.alpha > 1)\r
139                                 self.alpha = self.weaponentity.alpha = 0;\r
140                 }\r
141                 //else\r
142                 //      self.weaponentity.alpha = 0;\r
143         }\r
144 \r
145 \r
146         \r
147         /*      if(self.special_active) // am I cloaked?\r
148         {\r
149                 if(self.health < 10)\r
150                 {// out of health\r
151                         SpyDecloak();\r
152                 }\r
153                 else if(self.model != "" && self.special_time <= time)\r
154                 {// not fully cloaked yet, but working on it\r
155                         self.alpha = self.alpha - 0.1;\r
156                         self.weaponentity.alpha = 1 - (1 - self.alpha)*0.5;//self.alpha + 0.1;\r
157                         self.special_time = time + 0.1;\r
158                         if(self.alpha < 0.1)\r
159                         {\r
160                                 m1 = self.mins;\r
161                                 m2 = self.maxs;\r
162                                 setmodel (self, "");\r
163                                 setsize (self, m1, m2);\r
164                                 self.special_time = time + 1;\r
165                         }\r
166                 }\r
167                 else if(self.special_time <= time)\r
168                 {// fully cloaked, take health cost\r
169                         self.alpha = self.weaponentity.alpha = 0.25;\r
170                         self.special_time = time + 1;\r
171 \r
172                         // reduce health & armor while cloaked\r
173                         self.health = self.health - 2;//3;\r
174                         if(self.armorvalue > 2)//3)\r
175                                 self.armorvalue = self.armorvalue - 2;//3;\r
176                 }\r
177         }\r
178         else\r
179         {// decloaked\r
180                 if(self.alpha != 0 && self.alpha != 1)\r
181                 {// not fully visible yet, keep phasing back in\r
182                         self.alpha = self.alpha + 0.1;\r
183                         self.weaponentity.alpha = 1 - (1 - self.alpha)*0.5;\r
184                         if(self.alpha > 1)\r
185                                 self.alpha = 0;\r
186                 }\r
187                 else\r
188                         self.weaponentity.alpha = 0;\r
189         }\r
190 \r
191         self.exteriorweaponentity.alpha = self.weaponentity.alpha;*/\r
192 }\r
193 \r
194 void SpyPostThink()\r
195 {\r
196 }\r
197 \r
198 void BecomeSpy(float portion)\r
199 {\r
200         self.max_health = cvar("g_balance_class_spy_health") * portion;\r
201 \r
202         self.max_armor = cvar("g_balance_class_spy_armor") * portion;\r
203 \r
204         self.mass = cvar("g_balance_class_spy_mass");\r
205 \r
206         SetPlayerSpeed(self);\r
207 \r
208         self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4;\r
209         self.switchweapon = WEP2;\r
210         self.ammo_shells = floor(20 * portion);\r
211         self.ammo_nails = floor(50 * portion);\r
212         self.ammo_rockets = floor(3 * portion);\r
213         self.ammo_cells = floor(0 * portion);\r
214         self.playerclass = TF_CLASS_SPY;                // TF P.C.\r
215         SetMaxAmmoFor (2);\r
216         // fixme: also have off-hand grenade, different for each class\r
217         // where to do that?\r
218 }\r
219 \r
220 /*void () Switch_View_Think =\r
221 {\r
222         if (self.health < 1)\r
223                 dremove(self);\r
224         self.owner.view_ofs = self.view_ofs * self.health;\r
225 \r
226         self.health = self.health - 1;\r
227         self.nextthink = time;\r
228 \r
229 };\r
230 \r
231 void (vector vchange) Switch_View =\r
232 {\r
233         local entity viewchanger;\r
234         local vector changevec;\r
235 \r
236         changevec = ((self.view_ofs - vchange) * .10);\r
237 \r
238         viewchanger = spawn();\r
239         viewchanger.think = Switch_View_Think;\r
240         viewchanger.nextthink = time;\r
241         viewchanger.owner = self;\r
242         viewchanger.view_ofs = changevec;\r
243         viewchanger.health = 10;\r
244 };*/\r
245 \r
246 void () Switch_View_Think =\r
247 {\r
248         if (time > self.button1 + self.health)\r
249                 dremove(self);\r
250         self.owner.view_ofs = self.owner.view_ofs - ((self.view_ofs * frametime) * (1 / self.health));\r
251         self.nextthink = time;\r
252 };\r
253 void (vector vchange, float change_spd) Switch_View =\r
254 {\r
255         local entity viewchanger;\r
256         local vector changevec;\r
257         changevec = self.view_ofs - vchange;\r
258         viewchanger = spawn();\r
259         viewchanger.think = Switch_View_Think;\r
260         viewchanger.nextthink = time;\r
261         viewchanger.owner = self;\r
262         viewchanger.view_ofs = changevec;\r
263         viewchanger.health = change_spd;\r
264         viewchanger.button1 = time;\r
265 }\r
266 \r
267 // Spy Feign\r
268 void () TeamNexuiz_Feign =\r
269 {\r
270         if (self.playerclass != TF_CLASS_SPY)\r
271                 return;\r
272         if ((self.reload_time + .25) > time)\r
273                 return;\r
274         if (self.health <= 0)\r
275                 return;\r
276         if (!(self.flags & FL_ONGROUND))\r
277         {\r
278                 sprint(self, "You cannot feign mid-air\n");\r
279                 return;\r
280         }\r
281         local entity at_spot;\r
282         local float intgr;\r
283 \r
284         self.velocity = '0 0 0';\r
285         if (self.is_feigning == 1)\r
286         {\r
287                 at_spot = findradius(self.origin, 64);          // search for someone to make sure no-one is standing on\r
288                 intgr = 1;                                                                      //// the player when he tries to get up\r
289                 while (at_spot != world)\r
290                 {\r
291                         if (at_spot.classname == "player" && at_spot.is_dead != 1 && at_spot != self)\r
292                         {\r
293                                 intgr = 0;\r
294                         }\r
295                         at_spot = at_spot.chain;\r
296                 }\r
297                 if (intgr == 0)\r
298                 {\r
299                         sprint(self, "You can't get up while someone is standing on you.\n");\r
300                         return;\r
301                 }\r
302                 else\r
303                 {\r
304                         self.is_feigning = 0;\r
305                         setsize(self, PL_MIN, PL_MAX);\r
306                         Switch_View(PL_VIEW_OFS, .3);\r
307                         TeamNexuiz_GunUp();\r
308                 }\r
309         }\r
310         else\r
311         {\r
312                 self.is_feigning = 1;\r
313                 TeamFortress_ThrowGrenade();            // Toss any primed grenades while feigning\r
314                 setsize(self, '-16 -16 -24', '16 16 5');\r
315                 Switch_View(PL_FEIGN_VIEW_OFS, .3);\r
316                 TeamNexuiz_GunDown();\r
317         }\r
318 };