]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/spy.c
Morphed's new Nex model
[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 = 8;           // 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