| 4277 | } |
| 4278 | |
| 4279 | void AIDoTrackFrame(object *obj) { |
| 4280 | ai_frame *ai_info = obj->ai_info; |
| 4281 | float track_distance; |
| 4282 | |
| 4283 | AI_FriendNumNear = 0; |
| 4284 | AI_EnemyNumNear = 0; |
| 4285 | |
| 4286 | if (ai_info->ai_type == AIT_BIRD_FLOCK1 || |
| 4287 | ai_info->flags & (AIF_TRACK_CLOSEST_2_FRIENDS | AIF_TRACK_CLOSEST_2_ENEMIES)) { |
| 4288 | |
| 4289 | if (ai_info->ai_type == AIT_BIRD_FLOCK1) |
| 4290 | track_distance = 100.0f; |
| 4291 | else |
| 4292 | track_distance = GoalDetermineTrackDist(obj); |
| 4293 | |
| 4294 | if (track_distance > 0.0f) { |
| 4295 | int16_t near_objs[10]; |
| 4296 | int num_near = fvi_QuickDistObjectList(&obj->pos, obj->roomnum, ai_info->avoid_friends_distance + track_distance, |
| 4297 | near_objs, 10, false, true, false, true); |
| 4298 | float dist; |
| 4299 | vector to; |
| 4300 | |
| 4301 | AI_EnemyDist[0] = AI_EnemyDist[1] = 9999999.0f; |
| 4302 | AI_FriendDist[0] = AI_FriendDist[1] = 9999999.0f; |
| 4303 | |
| 4304 | for (int xxx = 0; xxx < num_near; xxx++) { |
| 4305 | object *g_obj = &Objects[near_objs[xxx]]; |
| 4306 | |
| 4307 | if (g_obj->type == OBJ_POWERUP || (obj == g_obj) || ObjectsAreRelated(OBJNUM(obj), near_objs[xxx])) |
| 4308 | continue; |
| 4309 | |
| 4310 | int *cur_num_near; |
| 4311 | object **cur_obj; |
| 4312 | float *cur_dist; |
| 4313 | vector *cur_dir; |
| 4314 | |
| 4315 | if ((ai_info->flags & AIF_TRACK_CLOSEST_2_ENEMIES) && AIObjEnemy(obj, g_obj)) { |
| 4316 | cur_num_near = &AI_EnemyNumNear; |
| 4317 | cur_obj = AI_EnemyObj; |
| 4318 | cur_dist = AI_EnemyDist; |
| 4319 | cur_dir = AI_EnemyDir; |
| 4320 | } else if ((ai_info->flags & AIF_TRACK_CLOSEST_2_FRIENDS) && AIObjFriend(obj, g_obj)) { |
| 4321 | cur_num_near = &AI_FriendNumNear; |
| 4322 | cur_obj = AI_FriendObj; |
| 4323 | cur_dist = AI_FriendDist; |
| 4324 | cur_dir = AI_FriendDir; |
| 4325 | } else |
| 4326 | continue; |
| 4327 | |
| 4328 | to = g_obj->pos - obj->pos; |
| 4329 | dist = vm_NormalizeVector(&to); |
| 4330 | |
| 4331 | dist -= (obj->size + g_obj->size); |
| 4332 | if (dist < 0.0f) |
| 4333 | dist = 0.0f; |
| 4334 | |
| 4335 | vector fov_vec; |
| 4336 | AIDetermineFovVec(obj, &fov_vec); |
no test coverage detected