]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/include/turret_tturrets_early.qh
reverse the logic of the turrets flag
[divverent/nexuiz.git] / data / qcsrc / server / tturrets / include / turret_tturrets_early.qh
1 // Comment out below to skip turrets\r
2 #define TTURRETS_ENABLED\r
3 \r
4 #ifdef TTURRETS_ENABLED\r
5 \r
6 #message "with tZork turrets rc2"\r
7 \r
8 vector real_origin(entity ent);\r
9 \r
10 /// target selection flags\r
11 .float target_select_flags;\r
12 .float target_validate_flags;\r
13 /// Dont select a target on its own.\r
14 #define TFL_TARGETSELECT_NO            1024\r
15 /// Need line of sight\r
16 #define TFL_TARGETSELECT_LOS           2\r
17 /// Players are valid targets\r
18 #define TFL_TARGETSELECT_PLAYERS       4\r
19 /// Missiles are valid targets\r
20 #define TFL_TARGETSELECT_MISSILES      8\r
21 /// Responds to turret_trigger_target events\r
22 #define TFL_TARGETSELECT_TRIGGERTARGET 16\r
23 /// Angular limitations of turret head limits target selection\r
24 #define TFL_TARGETSELECT_ANGLELIMITS   32\r
25 /// Range limits apply in targetselection\r
26 #define TFL_TARGETSELECT_RANGELIMTS    64\r
27 /// DOnt select targets with a .team matching its own\r
28 #define TFL_TARGETSELECT_TEAMCHECK     4096\r
29 /// Cant select targets on its own. needs to be triggerd or slaved.\r
30 #define TFL_TARGETSELECT_NOBUILTIN     256\r
31 /// TFL_TARGETSELECT_TEAMCHECK is inverted (selects only mebers of own .team)\r
32 #define TFL_TARGETSELECT_OWNTEAM       2048\r
33 /// Turrets aren't valid targets\r
34 #define TFL_TARGETSELECT_NOTURRETS     128\r
35 \r
36 /// aim flags\r
37 .float aim_flags;\r
38 /// Dont aim.\r
39 #define TFL_AIM_NO                  512\r
40 /// Go for ground, not direct hit\r
41 #define TFL_AIM_GROUND              2\r
42 /// Go for ground, not direct hit if target is on ground too\r
43 #define TFL_AIM_GROUND2              1024\r
44 /// Use balistic aim (not implemented)\r
45 #define TFL_AIM_BALISTIC            4\r
46 /// Try to predict target movement\r
47 #define TFL_AIM_LEAD                8\r
48 /// Compensate for shot traveltime when lead\r
49 #define TFL_AIM_SHOTTIMECOMPENSATE  16\r
50 /// Aim slightly in front of target\r
51 #define TFL_AIM_INFRONT             32\r
52 /// Aim slightly behind target\r
53 #define TFL_AIM_BEHIND              64\r
54 /// blend real and predicted z positions. (fake bounce prediction)\r
55 #define TFL_AIM_ZEASE               128\r
56 /// Just poitn at target's current location\r
57 #define TFL_AIM_SIMPLE              256\r
58 \r
59 /// track (turn and pitch head) flags\r
60 .float track_flags;\r
61 /// Dont move head\r
62 #define TFL_TRACK_NO    2\r
63 /// Pitch the head\r
64 #define TFL_TRACK_PITCH 4\r
65 /// Rotate the head\r
66 #define TFL_TRACK_ROT   8\r
67 \r
68 /// How tracking is preformed\r
69 .float track_type;\r
70 /// Hard angle increments. Ugly for fast turning, best accuracy.\r
71 #define TFL_TRACKTYPE_STEPMOTOR    1\r
72 /// Smoth absolute movement. Looks ok, fair accuracy.\r
73 #define TFL_TRACKTYPE_FLUIDPRECISE 2\r
74 /// Simulated inertia. "Wobbly mode" Looks kool, can mean terrible accuracy depending on how the feilds below are set\r
75 #define TFL_TRACKTYPE_FLUIDINERTIA 3\r
76 /// TFL_TRACKTYPE_FLUIDINERTIA: pitch multiplier\r
77 .float track_accel_pitch;\r
78 /// TFL_TRACKTYPE_FLUIDINERTIA: rotation multiplier\r
79 .float  track_accel_rot;\r
80 /// TFL_TRACKTYPE_FLUIDINERTIA: Blendrate with old rotation (inertia simulation) 1  = only old, 0 = only new\r
81 .float  track_blendrate;\r
82 \r
83 /// How prefire check is preformed\r
84 .float firecheck_flags;\r
85 /// Dont do any chekcs\r
86 #define TFL_FIRECHECK_NO          8192\r
87 /// Dont kill the world\r
88 #define TFL_FIRECHECK_WORLD       2\r
89 /// Dont kill the dead\r
90 #define TFL_FIRECHECK_DEAD        4\r
91 /// Range limits apply\r
92 #define TFL_FIRECHECK_DISTANCES   8\r
93 /// Line Of Sight needs to be clear\r
94 #define TFL_FIRECHECK_LOS         16\r
95 /// Consider distance inpactpoint<->aimspot\r
96 #define TFL_FIRECHECK_AIMDIST     32\r
97 /// Consider enemy origin<->impactpoint\r
98 #define TFL_FIRECHECK_REALDIST    64\r
99 /// Consider angular diff head<->aimspot\r
100 #define TFL_FIRECHECK_ANGLEDIST  128\r
101 /// (re)consider target.team<->self.team\r
102 #define TFL_FIRECHECK_TEAMCECK   256\r
103 /// Try to avoid friendly fire\r
104 #define TFL_FIRECHECK_AFF        512\r
105 /// Own .ammo needs to be >= then own .shot_dmg\r
106 #define TFL_FIRECHECK_OWM_AMMO   1024\r
107 /// Others ammo need to be < others .ammo_max\r
108 #define TFL_FIRECHECK_OTHER_AMMO 2048\r
109 /// Check own .attack_finished_single vs time\r
110 #define TFL_FIRECHECK_REFIRE     4096\r
111 \r
112 /// How shooting is done\r
113 .float shoot_flags;\r
114 /// Dont shoot\r
115 #define  TFL_SHOOT_NO          64\r
116 /// Fire in vollys (partial implementation through .shot_volly)\r
117 #define  TFL_SHOOT_VOLLY       2\r
118 /// Always do a full volly, even if target is lost or dead. (not implemented)\r
119 #define  TFL_SHOOT_VOLLYALWAYS 4\r
120 /// Loop though all valid tarters, and hit them.\r
121 #define  TFL_SHOOT_HITALLVALID 8\r
122 /// Fiering makes unit loose target (after volly is done, if in volly mode)\r
123 #define  TFL_SHOOT_CLEARTARGET 16\r
124 ///Custom shooting;\r
125 #define  TFL_SHOOT_CUSTOM 32\r
126 \r
127 /// Information aboute the units capabilities\r
128 .float turrcaps_flags;\r
129 /// No kown capabilities\r
130 #define  TFL_TURRCAPS_NONE        0\r
131 /// Capable of sniping\r
132 #define  TFL_TURRCAPS_SNIPER      2\r
133 /// Capable of splasdamage\r
134 #define  TFL_TURRCAPS_RADIUSDMG   4\r
135 /// Has one or more cannons with zero shot traveltime\r
136 #define  TFL_TURRCAPS_HITSCAN     8\r
137 /// More then one (type of) gun\r
138 #define  TFL_TURRCAPS_MULTIGUN    16\r
139 /// Carries at least one guided weapon\r
140 #define  TFL_TURRCAPS_GUIDED      32\r
141 /// At least one gun fiers slow projectiles\r
142 #define  TFL_TURRCAPS_SLOWPROJ    64\r
143 /// At least one gun fiers medium speed projectiles\r
144 #define  TFL_TURRCAPS_MEDPROJ     128\r
145 /// At least one gun fiers fast projectiles\r
146 #define  TFL_TURRCAPS_FASTPROJ    256\r
147 /// At least one gun capable of damaging players\r
148 #define  TFL_TURRCAPS_PLAYERKILL  512\r
149 /// At least one gun that can shoot town missiles\r
150 #define  TFL_TURRCAPS_MISSILEKILL 1024\r
151 /// Has support capabilities. powerplants and sutch.\r
152 #define  TFL_TURRCAPS_SUPPORT     2048\r
153 /// Proveides at least one type of ammmo\r
154 #define  TFL_TURRCAPS_AMMOSOURCE  4096\r
155 /// Can recive targets from external sources\r
156 #define TFL_TURRCAPS_RECIVETARGETS 8192\r
157 /// Capable of self-transport\r
158 #define TFL_TURRCAPS_MOVE 16384\r
159 /// Will roam arround even if not chasing anyting\r
160 #define TFL_TURRCAPS_ROAM 32768\r
161 #define TFL_TURRCAPS_LINKED 65536\r
162 \r
163 /// Ammo types needed and/or provided\r
164 .float ammo_flags;\r
165 /// Has and needs no ammo\r
166 #define  TFL_AMMO_NONE     64\r
167 /// Uses power\r
168 #define  TFL_AMMO_ENERGY   2\r
169 /// Uses bullets\r
170 #define  TFL_AMMO_BULLETS  4\r
171 /// Uses explosives\r
172 #define  TFL_AMMO_ROCKETS  8\r
173 /// Regenerates ammo on its own\r
174 #define  TFL_AMMO_RECHARGE 16\r
175 /// Can recive ammo from others\r
176 #define  TFL_AMMO_RECIVE   32\r
177 \r
178 /// How incomming damage is handeld\r
179 .float damage_flags;\r
180 /// Cant be hurt\r
181 #define  TFL_DMG_NO              256\r
182 /// Can be damaged\r
183 #define  TFL_DMG_YES             2\r
184 /// Can be damaged  by teammates\r
185 #define  TFL_DMG_TAKEFROMTEAM    4\r
186 /// Traget attackers\r
187 #define  TFL_DMG_RETALIATE       8\r
188 /// Target attackers, even is on own team\r
189 #define  TFL_DMG_RETALIATEONTEAM 16\r
190 /// Loses target when damaged\r
191 #define  TFL_DMG_TARGETLOSS      32\r
192 /// Reciving damage trows off aim\r
193 #define  TFL_DMG_AIMSHAKE        64\r
194 /// Reciving damage slaps the head arround\r
195 #define  TFL_DMG_HEADSHAKE       128\r
196 \r
197 // Spawnflags\r
198 /// Spawn in teambased modes\r
199 #define TFL_SPAWN_TEAM      2\r
200 /// Spawn in FFA modes\r
201 #define TFL_SPAWN_FFA       4\r
202 /// Respawn after death\r
203 #define TFL_SPAWN_RESPAWN   8\r
204 \r
205 /*\r
206 * Fields commnly used by turrets\r
207 */\r
208 /// Turrets internal ai speed\r
209 .float      ticrate;\r
210 /// Where to point the head when no target\r
211 .vector     idle_aim;\r
212 /// Top part of turret\r
213 .entity     tur_head;\r
214 /// Start/respawn health\r
215 .float      tur_health;\r
216 /// Defend this entity (or ratehr this entitys position)\r
217 .entity     tur_defend;\r
218 /// on/off toggle.\r
219 .float      tur_active;\r
220 /// Aim from this point,\r
221 .vector     tur_aimorg;\r
222 /// and shoot from here. (could be non constant, think MLRS)\r
223 .vector     tur_shotorg;\r
224 /// Aim at this spot\r
225 .vector     tur_aimpos;\r
226 /// Predicted time the round will impact\r
227 .float      tur_impacttime;\r
228 /// Predicted place the round will impact\r
229 .vector     tur_impactpoint;\r
230 /// What entity the aimtrace hit, if any.\r
231 .entity     tur_impactent;\r
232 /// Distance to enemy\r
233 .float      tur_dist_enemy;\r
234 /// Distance impact<->aim\r
235 .float      tur_dist_toaimpos;\r
236 /// Decresment counter form .shot_volly to 0.\r
237 .float      volly_counter;\r
238 \r
239 /*\r
240 * Projectile/missile. its up to the individual turret implementation to\r
241 ** deal the damage, blow upp the missile or whatever.\r
242 */\r
243 /// Track then refireing is possible\r
244 //.float attack_finished; = attack_finished_single\r
245 /// Shoot this often\r
246 .float shot_refire;\r
247 /// Shots travel this fast, when appliable\r
248 .float shot_speed;\r
249 /// Inaccuracy\r
250 .float shot_spread;\r
251 /// Estimated (core) damage of projectiles. also reduce on ammo with this amount when fiering\r
252 .float shot_dmg;\r
253 /// If radius dmg, this is how big that radius is.\r
254 .float shot_radius;\r
255 /// Max force exserted by round impact\r
256 .float shot_force;\r
257 /// < 1 = shoot # times at target (if possible)\r
258 .float shot_volly;\r
259 /// Refire after a compleated or borken volly.\r
260 .float shot_volly_refire;\r
261 \r
262 /// Consider targets within this range\r
263 .float target_range;\r
264 /// Dont consider targets closer then\r
265 .float target_range_min;\r
266 /// Engage fire routine on targets within\r
267 .float target_range_fire;\r
268 /// Targets closer to this are prefered\r
269 .float target_range_optimal;\r
270 \r
271 /*\r
272 * The standard targetselection tries to select a target based on\r
273 * range, angle offset, target type, "is old target"\r
274 * Thise biases will allow score scaling to (dis)favor diffrent targets\r
275 */\r
276 /// (dis)Favor best range this mutch\r
277 .float target_select_rangebias;\r
278 /// (dis)Favor targeting my old enemy this mutch\r
279 .float target_select_samebias;\r
280 /// (dis)Favor targeting the enemy closest to my guns current angle this mutch\r
281 .float target_select_anglebias;\r
282 /// (dis)Favor Missiles? (-1 to diable targeting compleatly)\r
283 .float target_select_missilebias;\r
284 /// (dis)Favot living players (-1 to diable targeting compleatly)\r
285 .float target_select_playerbias;\r
286 \r
287 /*\r
288 * Aim refers to real aiming, not gun pos (thats done by track)\r
289 */\r
290 /// Maximum offset between impact and aim spot to fire\r
291 .float aim_firetolerance_dist;\r
292 /// Maximum angular offset between head and aimspot to fire\r
293 //.float aim_firetolerance_angle;\r
294 /// How fast can i rotate/pitch (per second in stepmotor mode, base force in smooth modes)\r
295 .float aim_speed;\r
296 /// cant aim higher/lower then this\r
297 .float aim_maxpitch;\r
298 /// I cant rotate more then this\r
299 .float aim_maxrot;\r
300 \r
301 // Ammo/power. keeping dmg and ammo on a one to one ratio is preferable (for rating)\r
302 /// Staring & current ammo\r
303 .float ammo;\r
304 /// Regenerate this mutch ammo (per second)\r
305 .float ammo_recharge;\r
306 /// Max amount of ammo i can hold\r
307 .float ammo_max;\r
308 \r
309 \r
310 // Uncomment below to enable various debug output.\r
311 //#define TURRET_DEBUG\r
312 //#define TURRET_DEBUG_TARGETVALIDATE\r
313 //#define TURRET_DEBUG_TARGETSELECT\r
314 \r
315 #ifdef TURRET_DEBUG\r
316 .float tur_dbg_dmg_t_h; // Total dmg that hit something (can be more then tur_dbg_dmg_t_f since it should count radius dmg.\r
317 .float tur_dbg_dmg_t_f; // Total damage spent\r
318 .float tur_dbg_start;   // When did i go online?\r
319 .float tur_dbg_tmr1;    // timer for random use\r
320 .float tur_dbg_tmr2;    // timer for random use\r
321 .float tur_dbg_tmr3;    // timer for random use\r
322 .vector tur_dbg_rvec;   // Random vector, mainly for coloruing stuff'\r
323 #endif\r
324 \r
325 // System main's\r
326 /// Main AI loop\r
327 void turret_think();\r
328 /// Prefire checks and sutch\r
329 void turret_fire();\r
330 \r
331 // Callbacks\r
332 /// implements the actual fiering\r
333 .void()  turret_firefunc;\r
334 /// prefire checks go here. return 1 to go bang, 0 not to.\r
335 .float() turret_firecheckfunc;\r
336 // Execure BEFORE main ai loop. return 0 to cancel any following proccessing.\r
337 //.float() turret_prethink;\r
338 /// Execure AFTER main AI loop UNLESS turret_prethink returnd 0\r
339 .void()  turret_postthink;\r
340 \r
341 /// Add a target\r
342 .float(entity e_target,entity e_sender) turret_addtarget;\r
343 \r
344 //.float call_diehook;\r
345 //.float call_respwnhook;\r
346 .void() turret_diehook;\r
347 .void() turret_respawnhook;\r
348 \r
349 /*\r
350 #define TEH_THINK 2\r
351 #define TEH_DAMAGE 4\r
352 #define TEH_DIE 8\r
353 #define TEH_RESPAWN 16\r
354 #define TEH_TRACK 32\r
355 #define TEH_AIM 64\r
356 #define TEH_SELECT 128\r
357 .float(float event_id) turret_eventhook;\r
358 */\r
359 \r
360 /*\r
361 * Some turrets need other aimsystems then other.\r
362 * This should return the place to aim at, not acctualy turn or\r
363 * pitch anyting.\r
364 *\r
365 * use turret_stdproc_aim* or Make your own.\r
366 * Make sure you update tur_enemy_dist and tur_enemy_adist\r
367 * with the apropriate info, if you do.\r
368 \r
369 removed.\r
370 */\r
371 /// function used to aim, usualy turret_stdproc_aim_generic\r
372 //.vector() turret_aim;\r
373 \r
374 /*\r
375 * This is where the acctual turret turning should take place\r
376 * Use turret_stdproc_track or make your own.\r
377 wkacked to save mem.\r
378 */\r
379 // Function used to turn and pitch the .tur_head usualy turret_stdproc_track\r
380 //.void() turret_track;\r
381 \r
382 /*\r
383 * Target selection, preferably but not nessesarely\r
384 * return a normalized result.\r
385 */\r
386 /// Function to use for target evaluation. usualy turret_stdproc_targetscore_generic\r
387 .float(entity e_turret, entity e_target) turret_score_target;\r
388 \r
389 /*\r
390 * Damage, death and respawn.\r
391 */\r
392 //void turret_gibs_precash();\r
393 // generalized so save mem (on fields)\r
394 // Function to handle incomming damage. usualy turret_stdproc_damage\r
395 //.void(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce) turret_damagefunc;\r
396 // Function to handle the event of death. usualy turret_stdproc_die\r
397 //.void() turret_diefunc;\r
398 // Function that handles rebirth. usualy turret_stdproc_respawn\r
399 //.void() turret_spawnfunc;\r
400 \r
401 /*\r
402 * Stuff to plug into requierd but unused callbacks.\r
403 */\r
404 /// Always return 1\r
405 float turret_stdproc_true();\r
406 /// Always return 0\r
407 float turret_stdproc_false();\r
408 /// Always return nothing at all\r
409 void turret_stdproc_nothing();\r
410 \r
411 /*\r
412 * Target selection\r
413 */\r
414 /// "closeer is beter" selection\r
415 float   turret_stdproc_targetscore_close(entity e_turret, entity e_target);\r
416 /// "further is beter" selection\r
417 float   turret_stdproc_targetscore_far(entity e_turret, entity e_target);\r
418 /// only target_range_optimal\r
419 float   turret_stdproc_targetscore_optimal(entity e_turret, entity e_target);\r
420 /// defendpos\r
421 float   turret_stdproc_targetscore_defend(entity e_turret, entity e_target);\r
422 /// Generic fairly smart bias-aware target selection.\r
423 float   turret_stdproc_targetscore_generic(entity e_turret, entity e_target);\r
424 /// Experimental supportunits targetselector\r
425 float   turret_stdproc_targetscore_support(entity e_turret,entity e_target);\r
426 \r
427 /*\r
428 * Aim functions\r
429 */\r
430 /// Generic aimer guided by self.aim_flags\r
431 vector turret_stdproc_aim_generic()\r
432 // Straight line, current location\r
433 //vector  turret_stdproc_aim_simple()\r
434 \r
435 /*\r
436 * Turret turning & pitch\r
437 */\r
438 /// Tries to line up the turret head with the aimpos\r
439 void turret_stdproc_track();\r
440 \r
441 /// Generic damage handeling. blows up the turret when health <= 0\r
442 void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce);\r
443 /// Spawns a explotion, does some damage & trows bits arround.\r
444 void turret_stdproc_die();\r
445 /// reassembles the turret.\r
446 void turret_stdproc_respawn();\r
447 \r
448 /// Evaluate target validity\r
449 float turret_validate_target(entity e_turret,entity e_target,float validate_flags);\r
450 /// Turret Head Angle Diff Vector. updated by a sucsessfull call to turret_validate_target\r
451 vector tvt_thadv;\r
452 /// Turret Angle Diff Vector. updated by a sucsessfull call to turret_validate_target\r
453 vector tvt_tadv;\r
454 /// Turret Head Angle Diff Float. updated by a sucsessfull call to turret_validate_target\r
455 float  tvt_thadf;\r
456 /// Turret Angle Diff Float. updated by a sucsessfull call to turret_validate_target\r
457 float  tvt_tadf;\r
458 /// Distance. updated by a sucsessfull call to turret_validate_target\r
459 float  tvt_dist;\r
460 \r
461 /// updates aim org, shot org, shot dir and enemy org for selected turret\r
462 void turret_do_updates(entity e_turret);\r
463 .vector tur_aimorg_updated;\r
464 .vector tur_shotorg_updated;\r
465 .vector tur_shotdir_updated;\r
466 \r
467 void turrets_precash();\r
468 #endif // TTURRETS_ENABLED\r