/** This is the main entry point for the AI. * It is called once per frame for each AI and determines the behaviour of * the AI, e.g. steering, accelerating/braking, firing. */ void ArenaAI::update(float dt) { // This is used to enable firing an item backwards. m_controls->m_look_back = false; m_controls->m_nitro = false; // Don't do anything if there is currently a kart animations shown. if (m_kart->getKartAnimation()) return; if (isWaiting()) { AIBaseController::update(dt); return; } checkIfStuck(dt); if (handleArenaUnstuck(dt)) return; findClosestKart(true); findTarget(); handleArenaItems(dt); handleArenaBanana(); if (m_kart->getSpeed() > 15.0f && m_cur_kart_pos_data.angle < 0.2f) { // Only use nitro when target is straight m_controls->m_nitro = true; } if (m_is_uturn) { handleArenaUTurn(dt); } else { handleArenaAcceleration(dt); handleArenaSteering(dt); handleArenaBraking(); } AIBaseController::update(dt); } // update
/** This is the main entry point for the AI. * It is called once per frame for each AI and determines the behaviour of * the AI, e.g. steering, accelerating/braking, firing. * \param dt Time step size. */ void ArenaAI::update(float dt) { // This is used to enable firing an item backwards. m_controls->setLookBack(false); m_controls->setNitro(false); // Let the function below to reset it later m_controls->setAccel(0.0f); m_controls->setBrake(false); m_mini_skid = false; // Don't do anything if there is currently a kart animations shown. if (m_kart->getKartAnimation()) { resetAfterStop(); return; } if (!isKartOnRoad() && m_kart->isOnGround()) { m_time_since_off_road += dt; } else if (m_time_since_off_road != 0.0f) { m_time_since_off_road = 0.0f; } // If the kart needs to be rescued, do it now (and nothing else) if (m_time_since_off_road > 5.0f && m_kart->isOnGround()) { m_time_since_off_road = 0.0f; new RescueAnimation(m_kart); AIBaseController::update(dt); return; } if (isWaiting()) { AIBaseController::update(dt); return; } checkIfStuck(dt); if (gettingUnstuck(dt)) return; findTarget(); // After found target, convert it to local coordinate, used for skidding or // u-turn if (!m_is_uturn) { m_target_point_lc = m_kart->getTrans().inverse()(m_target_point); doSkiddingTest(); configSteering(); } else { m_target_point_lc = m_kart->getTrans().inverse()(m_reverse_point); } useItems(dt); if (m_kart->getSpeed() > 15.0f && !m_is_uturn && m_turn_radius > 30.0f && !ignorePathFinding()) { // Only use nitro when turn angle is big (180 - angle) m_controls->setNitro(true); } if (m_is_uturn) { resetAfterStop(); doUTurn(dt); } else { configSpeed(); setSteering(m_steering_angle, dt); } AIBaseController::update(dt); } // update