Exemplo n.º 1
0
//-----------------------------------------------------------------------------
void ArenaAI::handleArenaUTurn(const float dt)
{
    const float turn_side = (m_adjusting_side ? 1.0f : -1.0f);

    if (fabsf(m_kart->getSpeed()) >
        (m_kart->getKartProperties()->getEngineMaxSpeed() / 5)
        && m_kart->getSpeed() < 0)    // Try to emulate reverse like human players
        m_controls->m_accel = -0.06f;
    else
        m_controls->m_accel = -5.0f;

    if (m_time_since_uturn >=
        (m_cur_difficulty == RaceManager::DIFFICULTY_EASY ? 2.0f : 1.5f))
        setSteering(-(turn_side), dt); // Preventing keep going around circle
    else
        setSteering(turn_side, dt);
    m_time_since_uturn += dt;

    checkPosition(m_target_point, &m_cur_kart_pos_data);
    if (!m_cur_kart_pos_data.behind || m_time_since_uturn >
        (m_cur_difficulty == RaceManager::DIFFICULTY_EASY ? 3.5f : 3.0f))
    {
        m_is_uturn = false;
        m_time_since_uturn = 0.0f;
    }
    else
        m_is_uturn = true;
}   // handleArenaUTurn
Exemplo n.º 2
0
/** 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
Exemplo n.º 3
0
int main(int argc, char** argv) {
    initTruck();
    int start_time = timeInSecs();
    long double start_lat = getLatitude();
    long double start_lon = getLongitude();
    int start_heading = getHeading();
    int phase = 0;

    setSteering(0);
    setThrottle(50);
    while(TRUE){

        int target_heading;
        if(phase == 0){
            if(distance(start_lat, getLatitude(), start_lon, getLongitude())>5){
                setThrottle(30);
                setSteering(60);
                phase = 1;
                target_heading = newHeading(90);
                }
        }
        else if (phase == 1){
            if(getHeading()==target_heading){
                setSteering(-60);
                target_heading=start_heading;
                phase = 2;

            }
        }
        else if (phase == 2){
            if(getHeading()==target_heading){
                setSteering(0);
                setThrottle(0);
                while(TRUE);
            }
        }

        background();
    }
    return (EXIT_SUCCESS);
}
Exemplo n.º 4
0
void Vehicle::setInput(const VehicleInput & input)
{
	setSteering(input.controls[VehicleInput::STEER]);
	setThrottle(input.controls[VehicleInput::THROTTLE]);
	setBrake(input.controls[VehicleInput::BRAKE]);
	setHandBrake(input.controls[VehicleInput::HBRAKE]);
	setClutch(1 - input.controls[VehicleInput::CLUTCH]);
	setNOS(input.controls[VehicleInput::NOS]);

	setGear(transmission.getGear() + input.shiftgear);
	autoshift = (input.logic & VehicleInput::AUTOSHIFT);
	autoclutch = (input.logic & VehicleInput::AUTOCLUTCH);
	setABS(input.logic & VehicleInput::ABS);
	setTCS(input.logic & VehicleInput::TCS);
	if (input.logic & VehicleInput::STARTENG)
		startEngine();
	if (input.logic & VehicleInput::RECOVER)
		rolloverRecover();
}
Exemplo n.º 5
0
/** Function to let AI get unstuck.
 *  \param dt Time step size.
 *  \return True if getting stuck is needed to be done.
 */
bool ArenaAI::gettingUnstuck(const float dt)
{
    if (!m_is_stuck || m_is_uturn) return false;

    resetAfterStop();
    setSteering(0.0f, dt);
    m_controls->setBrake(true);

    m_time_since_reversing += dt;

    if (m_time_since_reversing >= 1.0f)
    {
        m_is_stuck = false;
        m_time_since_reversing = 0.0f;
    }
    AIBaseController::update(dt);
    return true;

}   // gettingUnstuck
Exemplo n.º 6
0
/** Make AI reverse so that it faces in front of the last target point.
 */
void ArenaAI::doUTurn(const float dt)
{
    float turn_angle = atan2f(m_target_point_lc.x(),
        fabsf(m_target_point_lc.z()));
    m_controls->setBrake(true);
    setSteering(turn_angle > 0.0f ? -1.0f : 1.0f, dt);
    m_time_since_uturn += dt;

    if ((m_target_point_lc.z() > 0 && fabsf(turn_angle) < 0.2f) ||
        m_time_since_uturn > 1.5f)
    {
        // End U-turn until target point is in front of this AI
        m_is_uturn = false;
        m_time_since_uturn = 0.0f;
        m_time_since_driving = 0.0f;
        m_reverse_point = Vec3(0, 0, 0);
    }
    else
        m_is_uturn = true;
}   // doUTurn
Exemplo n.º 7
0
void initTruck(){
    //Setup Debugging Connection
    initUART1();

    //Check for any errors
    checkErrorCodes();

    //Setup GPS
    initGPS();
    initTimer4();

    //Setup Input and Output
    initPWM(0b11,0b11);
    PWMOutputCalibration(1,HUNTER_TRUCK_STEERING_SCALE_FACTOR, HUNTER_TRUCK_STEERING_OFFSET);
    PWMOutputCalibration(2,HUNTER_TRUCK_THROTTLE_SCALE_FACTOR, HUNTER_TRUCK_THROTTLE_OFFSET);

    setThrottle(0);
    setSteering(0);

    //Setup Datalink
//    initDataLink();
}
Exemplo n.º 8
0
bool GameDriver::prerenderUpdate(float frameTime)
{
	auto car = mWorld.getCar();
	if(!mBrake)
		car->setThrottle(mThrottle);
	if(!mThrottle)
		car->setBrake(mBrake);

	if((mSteeringVelocity > 0.0f && mSteering < 0.0f) ||
			(mSteeringVelocity < 0.0f && mSteering > 0.0f))
		mSteering = 0.0f;

	if(mSteeringVelocity) {
		mSteering += mSteeringVelocity * frameTime;
		mSteering = Common::clamp(-1.0f, mSteering, 1.0f);
	}

	if(!mSteeringWithMouse && mSteeringVelocity == 0.0f && mSteering != 0.0f) {
		if(fabs(mSteering) < 4.0f * frameTime)
			mSteering = 0.0f;
		else if(mSteering < 0.0f)
			mSteering += 4.0f * frameTime;
		else if(mSteering > 0.0f)
			mSteering -= 4.0f * frameTime;
	}

	car->setSteering(mSteering);
	mWorld.updatePhysics(frameTime);
	mZoom += mZoomSpeed * frameTime;
	mZoom = mRenderer.setZoom(mZoom);
	mRenderer.setSteering(mThrottle, mBrake, mSteering);

	if(mDebugDisplay.check(frameTime)) {
		mRenderer.updateDebug(&mWorld);
	}
	return false;
}
Exemplo n.º 9
0
//-----------------------------------------------------------------------------
bool ArenaAI::handleArenaUnstuck(const float dt)
{
    if (!m_is_stuck || m_is_uturn) return false;

    setSteering(0.0f, dt);

    if (fabsf(m_kart->getSpeed()) >
        (m_kart->getKartProperties()->getEngineMaxSpeed() / 5)
        && m_kart->getSpeed() < 0)
        m_controls->m_accel = -0.06f;
    else
        m_controls->m_accel = -4.0f;

    m_time_since_reversing += dt;

    if (m_time_since_reversing >= 1.0f)
    {
        m_is_stuck = false;
        m_time_since_reversing = 0.0f;
    }
    AIBaseController::update(dt);
    return true;

}   // handleArenaUnstuck
Exemplo n.º 10
0
/** 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