2 .float target_select_flags; /// target selection flags
\r
3 float TFL_TARGETSELECT_NO = 1; /// Dont select a target on its own.
\r
4 float TFL_TARGETSELECT_LOS = 2; /// Need line of sight
\r
5 float TFL_TARGETSELECT_PLAYERS = 4; /// Players are valid targets
\r
6 float TFL_TARGETSELECT_MISSILES = 8; /// Missiles are valid targets
\r
7 float TFL_TARGETSELECT_TRIGGERTARGET = 16; /// Responds to turret_trigger_target events
\r
8 float TFL_TARGETSELECT_ANGLELIMITS = 32; /// Angular limitations of turret head limits target selection
\r
9 float TFL_TARGETSELECT_RANGELIMTS = 64; /// Range limits apply in targetselection
\r
10 float TFL_TARGETSELECT_TEAMCHECK = 128; /// Consider team own <-> targets team
\r
11 float TFL_TARGETSELECT_NOBUILTIN = 256; /// Cant select targets on its own. needs to be triggerd or slaved.
\r
12 float TFL_TARGETSELECT_OWNTEAM = 512;
\r
15 float turret_stdproc_targetscore_support(entity e_turret,entity e_target)
\r
17 float score; // Total score
\r
18 float s_score,d_score;
\r
20 if (e_turret.enemy == e_target) s_score = 1;
\r
22 d_score = min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
\r
24 score = (d_score * e_turret.target_select_rangebias) +
\r
25 (s_score * e_turret.target_select_samebias);
\r
31 * Generic bias aware score system.
\r
33 float turret_stdproc_targetscore_generic(entity e_turret,entity e_target)
\r
36 float d_dist; // Defendmode Distance
\r
38 float score; // Total score
\r
40 float d_score; // Distance score
\r
41 float a_score; // Angular score
\r
42 float m_score; // missile score
\r
43 float p_score; // player score
\r
44 //float da_score; // Distance from aimpoint score
\r
46 float ikr; // ideal kill range
\r
48 if(!e_target) return 0;
\r
50 //if (e_target == e_turret.enemy) s_score = 1;
\r
52 if (e_turret.tur_defend)
\r
54 d_dist = vlen(real_origin(e_target) - e_turret.tur_defend.origin);
\r
55 ikr = vlen(e_turret.origin - e_turret.tur_defend.origin);
\r
56 d_score = 1 - d_dist / e_turret.target_range;
\r
60 // Make a normlized value base on the targets distance from our optimal killzone
\r
61 ikr = e_turret.target_range_optimal;
\r
62 d_score = min(ikr,tvt_dist) / max(ikr,tvt_dist);
\r
66 // Determine the maximum time it could take this turrent to aim at someting.
\r
67 max_aim_delay = (max(e_turret.aim_maxrot,e_turret.aim_maxpitch) / e_turret.aim_speed * 2);
\r
69 // Find out how long it would take to aim at this taget.
\r
70 aim_delay = (thadf+0.01) / e_turret.aim_speed;
\r
72 // Turn this info into a normalized value.
\r
73 aim_delay = (min(max_aim_delay,aim_delay) / max_aim_delay);
\r
74 a_score = 1 - aim_delay;
\r
77 //a_score = 1 - (tvt_thadf / max(e_turret.aim_maxrot,e_turret.aim_maxpitch));
\r
78 a_score = 1 - tvt_thadf / e_turret.aim_maxrot;
\r
80 if ((e_turret.target_select_missilebias > 0) && (e_target.flags & FL_PROJECTILE))
\r
83 if ((e_turret.target_select_playerbias > 0) && (e_target.flags & FL_CLIENT))
\r
86 d_score = max(d_score,0);
\r
87 a_score = max(a_score,0);
\r
88 m_score = max(m_score,0);
\r
89 p_score = max(p_score,0);
\r
91 score = (d_score * e_turret.target_select_rangebias) +
\r
92 (a_score * e_turret.target_select_anglebias) +
\r
93 (m_score * e_turret.target_select_missilebias) +
\r
94 (p_score * e_turret.target_select_playerbias);
\r
96 if(e_turret.target_range < vlen(e_turret.tur_shotorg - real_origin(e_target)))
\r
102 #ifdef TURRET_DEBUG
\r
103 string sd,sa,sm,sp,ss;
\r
104 string sdt,sat,smt,spt;
\r
106 sd = ftos(d_score);
\r
107 d_score *= e_turret.target_select_rangebias;
\r
108 sdt = ftos(d_score);
\r
110 //sv = ftos(v_score);
\r
111 //v_score *= e_turret.target_select_samebias;
\r
112 //svt = ftos(v_score);
\r
114 sa = ftos(a_score);
\r
115 a_score *= e_turret.target_select_anglebias;
\r
116 sat = ftos(a_score);
\r
118 sm = ftos(m_score);
\r
119 m_score *= e_turret.target_select_missilebias;
\r
120 smt = ftos(m_score);
\r
122 sp = ftos(p_score);
\r
123 p_score *= e_turret.target_select_playerbias;
\r
124 spt = ftos(p_score);
\r
128 bprint("^3Target scores^7 \[ ",e_turret.netname, " \] ^3for^7 \[ ", e_target.netname," \]\n");
\r
129 bprint("^5Range:\[ ",sd, " \]^2+bias:\[ ",sdt," \]\n");
\r
130 bprint("^5Angle:\[ ",sa, " \]^2+bias:\[ ",sat," \]\n");
\r
131 bprint("^5Missile:\[ ",sm," \]^2+bias:\[ ",smt," \]\n");
\r
132 bprint("^5Player:\[ ",sp, " \]^2+bias:\[ ",spt," \]\n");
\r
133 bprint("^3Total (w/bias):\[^1",ss,"\]\n");
\r
141 float turret_stdproc_targetscore_close(entity e_turret,entity e_target)
\r
143 return 1 - (tvt_dist / e_turret.target_range);
\r
146 float turret_stdproc_targetscore_far (entity e_turret,entity e_target)
\r
148 return tvt_dist / e_turret.target_range;
\r
151 float turret_stdproc_targetscore_optimal(entity e_turret,entity e_target)
\r
153 return min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
\r
156 float turret_stdproc_score_angular(entity e_turret,entity e_target)
\r
158 return 1 - (tvt_thadf / e_turret.aim_maxrot);
\r
161 float turret_stdproc_targetscore_defend(entity e_turret,entity e_target)
\r
164 //min(e_target.origin,e_turret.tur_defend.origin) / max(e_target.origin,e_turret.tur_defend.origin);
\r