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
39 float d_score; // Distance score
\r
40 //float da_score; // Distance from aimpoint score
\r
41 float a_score; // Angular score
\r
42 float s_score; // samescore (same target as last time)
\r
43 float m_score; // missile score
\r
44 float p_score; // player 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
79 if ((e_turret.target_select_missilebias > 0) && (e_target.flags & FL_PROJECTILE))
\r
82 if ((e_turret.target_select_playerbias > 0) && (e_target.flags & FL_CLIENT))
\r
85 d_score = max(d_score,0);
\r
86 s_score = max(s_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 (s_score * e_turret.target_select_samebias) +
\r
93 (a_score * e_turret.target_select_anglebias) +
\r
94 (m_score * e_turret.target_select_missilebias) +
\r
95 (p_score * e_turret.target_select_playerbias);
\r
97 if(e_turret.target_range_fire < vlen(e_turret.tur_shotorg_updated - real_origin(e_target)))
\r
100 #ifdef TURRET_DEBUG
\r
101 string sd,sv,sa,sm,sp,ss;
\r
102 string sdt,svt,sat,smt,spt;
\r
104 sd = ftos(d_score);
\r
105 d_score *= e_turret.target_select_rangebias;
\r
106 sdt = ftos(d_score);
\r
108 //sv = ftos(v_score);
\r
109 //v_score *= e_turret.target_select_samebias;
\r
110 //svt = ftos(v_score);
\r
112 sa = ftos(a_score);
\r
113 a_score *= e_turret.target_select_anglebias;
\r
114 sat = ftos(a_score);
\r
116 sm = ftos(m_score);
\r
117 m_score *= e_turret.target_select_missilebias;
\r
118 smt = ftos(m_score);
\r
120 sp = ftos(p_score);
\r
121 p_score *= e_turret.target_select_playerbias;
\r
122 spt = ftos(p_score);
\r
126 bprint("^3Target scores^7 \[ ",e_turret.netname, " \] ^3for^7 \[ ", e_target.netname," \]\n");
\r
127 bprint("^5Range:\[ ",sd, " \]^2+bias:\[ ",sdt," \]\n");
\r
128 //bprint("^5Volly:\[ ",sv, " \]^2+bias:\[ ",svt," \]\n");
\r
129 bprint("^5Angle:\[ ",sa, " \]^2+bias:\[ ",sat," \]\n");
\r
130 bprint("^5Missile:\[ ",sm," \]^2+bias:\[ ",smt," \]\n");
\r
131 bprint("^5Player:\[ ",sp, " \]^2+bias:\[ ",spt," \]\n");
\r
132 bprint("^3Total (w/bias):\[^1",ss,"\]\n");
\r
139 float turret_stdproc_targetscore_close(entity e_turret,entity e_target)
\r
141 return 1 - (tvt_dist / e_turret.target_range);
\r
144 float turret_stdproc_targetscore_far (entity e_turret,entity e_target)
\r
146 return tvt_dist / e_turret.target_range;
\r
149 float turret_stdproc_targetscore_optimal(entity e_turret,entity e_target)
\r
151 return min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
\r
154 float turret_stdproc_score_angular(entity e_turret,entity e_target)
\r
156 return 1 - (tvt_thadf / e_turret.aim_maxrot);
\r
159 float turret_stdproc_targetscore_defend(entity e_turret,entity e_target)
\r
162 //min(e_target.origin,e_turret.tur_defend.origin) / max(e_target.origin,e_turret.tur_defend.origin);
\r