/** This function sets the steering. * \param dt Time step size. */ void ArenaAI::handleArenaSteering(const float dt) { const int current_node = getCurrentNode(); if (current_node == BattleGraph::UNKNOWN_POLY || m_target_node == BattleGraph::UNKNOWN_POLY) return; if (m_target_node == current_node) { // Very close to the item, steer directly checkPosition(m_target_point, &m_cur_kart_pos_data); #ifdef AI_DEBUG m_debug_sphere->setPosition(m_target_point.toIrrVector()); #endif if (m_cur_kart_pos_data.behind) { m_adjusting_side = m_cur_kart_pos_data.on_side; m_is_uturn = true; } else { float target_angle = steerToPoint(m_target_point); setSteering(target_angle, dt); } return; } else if (m_target_node != current_node) { findPortals(current_node, m_target_node); stringPull(m_kart->getXYZ(), m_target_point); if (m_path_corners.size() > 0) m_target_point = m_path_corners[0]; checkPosition(m_target_point, &m_cur_kart_pos_data); #ifdef AI_DEBUG m_debug_sphere->setPosition(m_target_point.toIrrVector()); #endif if (m_cur_kart_pos_data.behind) { m_adjusting_side = m_cur_kart_pos_data.on_side; m_is_uturn = true; } else { float target_angle = steerToPoint(m_target_point); setSteering(target_angle, dt); } return; } else { // Do nothing (go straight) if no targets found setSteering(0.0f, dt); return; } } // handleSteering
/** This function config the steering (\ref m_steering_angle) of AI. */ void ArenaAI::configSteering() { m_steering_angle = 0.0f; const int current_node = getCurrentNode(); if (current_node == Graph::UNKNOWN_SECTOR || m_target_node == Graph::UNKNOWN_SECTOR) { return; } if (ignorePathFinding()) { // Steer directly, don't brake m_turn_radius = 100.0f; #ifdef AI_DEBUG m_debug_sphere->setPosition(m_target_point.toIrrVector()); #endif if (m_target_point_lc.z() < 0) { m_is_uturn = true; m_reverse_point = m_target_point; } else { m_steering_angle = steerToPoint(m_target_point); } return; } // Otherwise use path finding to get target point Vec3 target_point; const bool found_position = updateAimingPosition(&target_point); if (found_position) { m_target_point = target_point; m_target_point_lc = m_kart->getTrans().inverse()(m_target_point); #ifdef AI_DEBUG m_debug_sphere->setVisible(true); m_debug_sphere->setPosition(m_target_point.toIrrVector()); #endif if (m_target_point_lc.z() < 0) { m_is_uturn = true; m_reverse_point = m_target_point; } else { m_steering_angle = steerToPoint(m_target_point); } } } // configSteering