Morphed's new Nex model
[divverent/nexuiz.git] / data / qcsrc / gamec / w_nex.c
1 void() nex_ready_01;
2 void() nex_fire1_01;
3 void() nex_deselect_01;
4 void() nex_select_01;
5 void() nex_selfkill;
6
7 float() nex_check =
8 {
9         if (cvar("g_minstagib"))
10         {
11                 if (self.ammo_cells >= 1)
12                         return TRUE;
13         } else {
14                 if (self.ammo_cells >= 5)
15                         return TRUE;
16         }
17         return FALSE;
18 };
19
20 void nex_selfkill (void)
21 {
22         if (!cvar("g_minstagib"))
23                 return;
24
25         if (self.ammo_cells <= 0)
26         {
27                 if (self.health == 5)
28                 {
29                         centerprint(self, "you're dead now...\n");
30                         Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
31                         stuffcmd(self, "play2 announcer/robotic/terminated.ogg\n");
32                 }
33                 if (self.health == 10)
34                 {
35                         centerprint(self, "^11^7 second left to find some ammo\n");
36                         Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
37                         stuffcmd(self, "play2 announcer/robotic/1.ogg\n");
38                 }
39                 if (self.health == 20)
40                 {
41                         centerprint(self, "^12^7 seconds left to find some ammo\n");
42                         Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
43                         stuffcmd(self, "play2 announcer/robotic/2.ogg\n");
44                 }
45                 if (self.health == 30)
46                 {
47                         centerprint(self, "^13^7 seconds left to find some ammo\n");
48                         Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
49                         stuffcmd(self, "play2 announcer/robotic/3.ogg\n");
50                 }
51                 if (self.health == 40)
52                 {
53                         centerprint(self, "^14^7 seconds left to find some ammo\n");
54                         Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
55                         stuffcmd(self, "play2 announcer/robotic/4.ogg\n");
56                 }
57                 if (self.health == 50)
58                 {
59                         centerprint(self, "^15^7 seconds left to find some ammo\n");
60                         Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
61                         stuffcmd(self, "play2 announcer/robotic/5.ogg\n");
62                 }
63                 if (self.health == 60)
64                 {
65                         centerprint(self, "^36^7 seconds left to find some ammo\n");
66                         Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
67                         stuffcmd(self, "play2 announcer/robotic/6.ogg\n");
68                 }
69                 if (self.health == 70)
70                 {
71                         centerprint(self, "^37^7 seconds left to find some ammo\n");
72                         Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
73                         stuffcmd(self, "play2 announcer/robotic/7.ogg\n");
74                 }
75                 if (self.health == 80)
76                 {
77                         centerprint(self, "^38^7 seconds left to find some ammo\n");
78                         Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
79                         stuffcmd(self, "play2 announcer/robotic/8.ogg\n");
80                 }
81                 if (self.health == 90)
82                 {
83                         centerprint(self, "^39^7 seconds left to find some ammo\n");
84                         Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
85                         stuffcmd(self, "play2 announcer/robotic/9.ogg\n");
86                 }
87                 if (self.health == 100)
88                 {
89                         weapon_prepareattack(nex_check, nex_check, nex_fire1_01, 1.0);
90                         centerprint(self, "get some ammo or\nyou'll be dead in ^310^7 seconds...");
91                         Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
92                         stuffcmd(self, "play2 announcer/robotic/10.ogg\n");
93                 }
94                 
95         }
96         self.think = nex_selfkill;
97         self.nextthink = time + 1;
98         
99 }
100
101 void(float req) w_nex =
102 {
103         if (req == WR_IDLE)
104                 nex_ready_01();
105         else if (req == WR_FIRE1)
106                 weapon_prepareattack(nex_check, nex_check, nex_fire1_01, cvar("g_balance_nex_refire"));
107         else if (req == WR_RAISE)
108                 nex_select_01();
109         else if (req == WR_UPDATECOUNTS)
110                 self.currentammo = self.ammo_cells;
111         else if (req == WR_DROP)
112                 nex_deselect_01();
113         else if (req == WR_SETUP)
114                 weapon_setup(WEP_NEX, "w_nex.zym", IT_CELLS);
115         else if (req == WR_CHECKAMMO)
116                 weapon_hasammo = nex_check();
117 };
118
119
120 void W_Nex_Attack (void)
121 {
122         local vector org, org2;
123         local vector end;
124         local entity flash;
125
126         sound (self, CHAN_WEAPON, "weapons/nexfire.ogg", 1, ATTN_NORM);
127         if (self.items & IT_STRENGTH) {
128                 sound (self, CHAN_AUTO, "weapons/strength_fire.ogg", 1, ATTN_NORM);
129         }
130         
131         self.punchangle_x = -5;
132         org = self.origin + self.view_ofs + v_forward * 5 + v_right * 14 + v_up * -7;
133         end = self.origin + self.view_ofs + v_forward * 4096;
134
135         // assure that nexdamage is high enough in minstagib
136         if (cvar("g_minstagib"))
137                 FireRailgunBullet (org, end, 200, IT_NEX);
138         else
139                 FireRailgunBullet (org, end, cvar("g_balance_nex_damage"), IT_NEX);
140
141         // trace as if shot started inside gun
142         traceline (org, end, TRUE, self);
143         // show as if shot started outside of gun
144         org = self.origin + self.view_ofs + v_forward * 35 + v_right * 14 + v_up * -8;
145         org2 = self.origin + self.view_ofs + v_forward * 52 + v_right * 14 + v_up * -8;
146         // muzzleflash light
147         te_smallflash (org2);
148         // beam effect
149         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
150         WriteByte (MSG_BROADCAST, 76);
151         WriteCoord (MSG_BROADCAST, org_x);
152         WriteCoord (MSG_BROADCAST, org_y);
153         WriteCoord (MSG_BROADCAST, org_z);
154         WriteCoord (MSG_BROADCAST, trace_endpos_x);
155         WriteCoord (MSG_BROADCAST, trace_endpos_y);
156         WriteCoord (MSG_BROADCAST, trace_endpos_z);
157         WriteCoord (MSG_BROADCAST, 0);
158         WriteCoord (MSG_BROADCAST, 0);
159         WriteCoord (MSG_BROADCAST, 0);
160         // flash and burn the wall
161         te_plasmaburn (trace_endpos);
162         /*
163         // flame effect at impact
164         dir = trace_plane_normal * 100;
165         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
166         WriteByte (MSG_BROADCAST, TE_FLAMEJET);
167         WriteCoord (MSG_BROADCAST, trace_endpos_x);
168         WriteCoord (MSG_BROADCAST, trace_endpos_y);
169         WriteCoord (MSG_BROADCAST, trace_endpos_z);
170         WriteCoord (MSG_BROADCAST, dir_x);
171         WriteCoord (MSG_BROADCAST, dir_y);
172         WriteCoord (MSG_BROADCAST, dir_z);
173         WriteByte (MSG_BROADCAST, 255);
174         */
175         // play a sound
176         PointSound (trace_endpos, "weapons/neximpact.ogg", 1, ATTN_NORM);
177
178         if (cvar("g_use_ammunition") && !cvar("g_instagib"))
179         {
180                 if (cvar("g_minstagib"))
181                         self.ammo_cells = self.ammo_cells - 1;
182                 else
183                         self.ammo_cells = self.ammo_cells - 5;
184         }
185
186         flash = spawn ();
187         org = self.origin + self.view_ofs + v_forward * 33 + v_right * 14 + v_up * -7;
188         setorigin (flash, org);
189         setmodel (flash, "models/nexflash.md3");
190         flash.velocity = v_forward * 20;
191         flash.angles = vectoangles (flash.velocity);
192         SUB_SetFade (flash, time, 0.4);
193         flash.effects = flash.effects | EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
194 }
195
196 // weapon frames
197 void()  nex_ready_01 =  {weapon_thinkf(WFRAME_IDLE, 0.1, nex_ready_01); self.weaponentity.state = WS_READY;};
198 void()  nex_select_01 = {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0'); nex_selfkill();};
199 void()  nex_deselect_01 =       {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);};
200 void()  nex_fire1_01 =
201 {
202         weapon_doattack(nex_check, nex_check, W_Nex_Attack);
203         weapon_thinkf(WFRAME_FIRE1, 0.3, nex_ready_01);
204 };
205