// c_common.qc: common functions const float PO2_LUT[25] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216 }; float(float x, float y) bit_shift_right = { return rint(x / PO2_LUT[y]); }; float(float x, float y) bit_shift_left = { return rint(x * PO2_LUT[y]); }; float() crandom = { return 2 * (random() - 0.5); }; float(float x, float y) max = { return x < y ? y : x; }; float(float x, float y) min = { return x < y ? x : y; }; float(float x, float mi, float ma) minmax = { return min(max(x, mi), ma); }; /* returns the range catagorization of an entity reletive to self * 0 melee range, will become hostile even if back is turned * 1 visibility and infront, or visibility and show hostile * 2 infront and show hostile * 3 only triggered by damage */ float(entity targ) range = { vector spot1, spot2; float r; spot1 = self.origin + self.view_ofs; spot2 = targ.origin + targ.view_ofs; r = vec_len(spot1 - spot2); if(r < AI_RANGE_MELEE) { return RANGE_MELEE; } else if(r < AI_RANGE_NEAR) { return RANGE_NEAR; } else if(r < AI_RANGE_MID) { return RANGE_MID; } else { return RANGE_FAR; } }; // returns 1 if the entity is visible to self, even if not infront() float(entity targ) visible = { vector spot1, spot2; spot1 = self.origin + self.view_ofs; spot2 = targ.origin + targ.view_ofs; trace_line(spot1, spot2, TRUE, self); // see through other monsters if(trace_inopen && trace_inwater) { return FALSE; // sight line crossed contents } return trace_fraction == 1; }; // returns 1 if the entity is in front(in sight) of self float(entity targ) infront = { vector vec; float dot; make_vectors(self.angles); vec = normalize(targ.origin - self.origin); dot = vec * v_forward; return dot > 0.3; }; // EOF