]> icculus.org git repositories - divverent/nexuiz.git/blob - attic/TeamNexuiz/game/gamec/w_flamer.c
now menu qc respects g_campaign_name
[divverent/nexuiz.git] / attic / TeamNexuiz / game / gamec / w_flamer.c
1 void() flamer_ready_01;\r
2 void() flamer_fire1_01;\r
3 void() flamer_deselect_01;\r
4 void() flamer_select_01;\r
5 \r
6 float() flamer_check =\r
7 {\r
8         if (self.ammo_nails >= 4)\r
9                 return TRUE;\r
10         return FALSE;\r
11 };\r
12 \r
13 void(float req) w_flamer =\r
14 {\r
15         if (req == WR_IDLE)\r
16                 flamer_ready_01();\r
17         else if (req == WR_FIRE1 || req == WR_FIRE2)\r
18                 weapon_prepareattack(flamer_check, flamer_check, flamer_fire1_01, .09);\r
19         else if (req == WR_RAISE)\r
20                 flamer_select_01();\r
21         else if (req == WR_UPDATECOUNTS)\r
22                 self.currentammo = floor(self.ammo_nails/4);\r
23         else if (req == WR_DROP)\r
24                 flamer_deselect_01();\r
25         else if (req == WR_SETUP)\r
26                 weapon_setup(WEP_FLAMER, "w_flamethrower.zym", IT_ROCKETS);\r
27         else if (req == WR_CHECKAMMO)\r
28                 weapon_hasammo = flamer_check();\r
29 };\r
30 \r
31 void W_Flamer_Touch (void)\r
32 {\r
33         float wasliving, burntime, minburntime, maxburntime;\r
34         if (other == self.owner)\r
35                 return;\r
36         else if (pointcontents (self.origin) == CONTENT_SKY)\r
37         {\r
38                 remove (self);\r
39                 return;\r
40         }\r
41 \r
42 //      dillute = 1 - 0.65*(1 - self.alpha);\r
43 //      dillute = 1 - cvar("g_balance_flamer_dillute")*(self.frame / 20);\r
44 \r
45         wasliving = other.health;\r
46         if(!self.cnt) // direct damage only if haven't touched once before\r
47         {\r
48                 RadiusDamage (self, self.owner, cvar("g_balance_flamer_damage"), cvar("g_balance_flamer_edgedamage"), cvar("g_balance_flamer_radius"), world, cvar("g_balance_flamer_force"), WEP_FLAMER);\r
49 \r
50                 if(other.takedamage == DAMAGE_AIM)//health > 2)\r
51                 { // ignite target or renew fire damage\r
52                         burntime = other.onfire.wait - time;\r
53                         minburntime = cvar("g_balance_flamer_burntime");\r
54                         maxburntime = cvar("g_balance_flamer_burntime_max");\r
55                         if(burntime < minburntime)\r
56                                 burntime = minburntime;\r
57                         else\r
58                                 burntime = burntime + cvar("g_balance_flamer_burntime_inc");\r
59 \r
60                         if(burntime > maxburntime)\r
61                                 burntime = maxburntime;\r
62 \r
63 \r
64                         IgniteTarget(other, self.owner,\r
65                                 burntime,\r
66                                 cvar("g_balance_flamer_burndamage"),\r
67                                 cvar("g_balance_flamer_burnrate"),\r
68                                 TRUE);\r
69                 }\r
70         }\r
71 \r
72         if(wasliving > 2)\r
73                 self.cnt = 1; // once it's touched something it can damage, it can't directly damage anymore, or set on fire or renew the flame damage (just for looks)\r
74         self.velocity_x = self.velocity_x * 0.5;\r
75         self.velocity_y = self.velocity_y * 0.5;\r
76 }\r
77 \r
78 // fade the flame off, the only way the fire can be destroyed\r
79 void W_Flamer_Dissipate ()\r
80 {\r
81         if (self.alpha < 0.01 || pointcontents (self.origin) == CONTENT_WATER)// || self.frame >= 20)\r
82         {\r
83                 remove(self);\r
84                 return;\r
85         }\r
86         self.scale = self.scale + 0.35;//0.2;\r
87         self.alpha = self.alpha - 0.08;//0.04;\r
88         self.frame = self.frame + 1;\r
89         if(self.frame > 20)\r
90                 self.frame = 20;\r
91         self.think = W_Flamer_Dissipate;\r
92         self.nextthink = time + 0.1;\r
93         //if(self.colormod_y > 0)\r
94                 self.colormod = self.colormod - '0 0.004 0.01' * 25;//'0 0.2 0.12'; // fade to red!\r
95 };\r
96 \r
97 void W_Flamer_Attack (void)\r
98 {\r
99         local entity missile;\r
100         local vector org;\r
101         local vector end;\r
102 \r
103         local vector trueaim;\r
104         org = self.origin + self.view_ofs;\r
105         end = self.origin + self.view_ofs + v_forward * 4096;\r
106         traceline(org,end,TRUE,self);\r
107         trueaim = trace_endpos;\r
108 \r
109         sound (self, CHAN_WEAPON, "weapons/flamer.wav", 1, ATTN_NORM);\r
110         self.ammo_nails = self.ammo_nails - 4;\r
111         org = self.origin + self.view_ofs + v_forward * 1 + v_right * 14 + v_up * -5;\r
112 \r
113         missile = spawn ();\r
114         missile.owner = self;\r
115         missile.classname = "flame";\r
116         missile.think = W_Flamer_Dissipate;\r
117         missile.nextthink = time + 0.01;\r
118         missile.touch = W_Flamer_Touch;\r
119         missile.solid = SOLID_BBOX;\r
120         setorigin (missile, org);\r
121         setmodel (missile, "models/sprites/hagarexplosion.spr32");\r
122         setsize (missile, '0 0 0', '0 0 0');\r
123         missile.effects = EF_LOWPRECISION | EF_ADDITIVE;\r
124         missile.alpha = 0.7;//0.3;\r
125         missile.scale = 0.005;//0.015;//0.15;\r
126         missile.colormod = '1 1 1'; // set full colors, then reduce later\r
127         missile.frame = random() * 4 + 2;\r
128 \r
129         missile.movetype = MOVETYPE_BOUNCE;\r
130         missile.gravity = -0.07; // fall lightly up\r
131 //      missile.velocity = (v_forward + v_right * crandom() * 0.035 + v_up * crandom() * 0.015) * cvar("g_balance_flamer_speed");\r
132         missile.velocity = normalize(trueaim - org) * cvar("g_balance_flamer_speed");\r
133 \r
134         missile.angles = vectoangles (missile.velocity);\r
135 }\r
136 \r
137 // weapon frames\r
138 void()  flamer_ready_01 =       {weapon_thinkf(WFRAME_IDLE, 0.1, flamer_ready_01); self.weaponentity.state = WS_READY;};\r
139 void()  flamer_select_01 =      {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0');};\r
140 void()  flamer_deselect_01 =    {weapon_thinkf(-1, cvar("g_balance_weaponswitchdelay"), w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);};\r
141 \r
142 void()  flamer_fire1_02 =\r
143 {\r
144         if (self.button0 || self.button3)\r
145         {\r
146                 weapon_doattack(flamer_check, flamer_check, W_Flamer_Attack);\r
147                 weapon_thinkf(WFRAME_FIRE1, 0.09, flamer_fire1_02);\r
148                 weapon_prepareattack(flamer_check, flamer_check, SUB_Null, .09);\r
149         }\r
150         else\r
151                 weapon_thinkf(WFRAME_FIRE1, 0.09, flamer_ready_01);\r
152 };\r
153 void()  flamer_fire1_01 =\r
154 {\r
155         weapon_doattack(flamer_check, flamer_check, W_Flamer_Attack);\r
156         weapon_thinkf(WFRAME_FIRE1, 0.09, flamer_fire1_02);\r
157 };\r
158 /*\r
159 void()  flamer_fire1_01 =\r
160 {\r
161         weapon_doattack(flamer_check, flamer_check, W_Flamer_Attack);\r
162         weapon_thinkf(WFRAME_FIRE1, 0.003, flamer_ready_01);\r
163         //flamer_ready_01();\r
164 };*/\r
165 \r