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