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