Example #1
0
HS_BOOL8 CHSSysEngines::GetAttributeValue(const HS_INT8 * pcAttrName,
        CHSVariant & rvarValue, HS_BOOL8 bAdjusted, HS_BOOL8 bLocalOnly)
{
    // Determine attribute, and return the value.
    if (!_stricmp(pcAttrName, "EFFICIENCY"))
    {
        if (m_puiEfficiency)
        {
            rvarValue = *m_puiEfficiency;
        }
        else if (!bLocalOnly)
        {
            rvarValue = GetEfficiency();
        }
        else
        {
            return false;
        }
        return true;
    }
    else if (!_stricmp(pcAttrName, "MAX VELOCITY"))
    {
        if (m_puiMaxVelocity)
        {
            rvarValue = *m_puiMaxVelocity;
        }
        else if (!bLocalOnly)
        {
            rvarValue = GetMaxVelocity();
        }
        else
        {
            return false;
        }
        return true;
    }
    else if (!_stricmp(pcAttrName, "ACCELERATION"))
    {
        if (m_puiAcceleration)
        {
            rvarValue = *m_puiAcceleration;
        }
        else if (!bLocalOnly)
        {
            rvarValue = GetAcceleration();
        }
        else
        {
            return false;
        }

        return true;
    }
    else if (!_stricmp(pcAttrName, "DESIRED SPEED"))
    {
        rvarValue = m_desired_speed;
        return true;
    }
    else if (!_stricmp(pcAttrName, "CURRENT SPEED"))
    {
        rvarValue = m_current_speed;
        return true;
    }
    else if (!_stricmp(pcAttrName, "CAN AFTERBURN"))
    {
        if (m_pbCanAfterburn)
        {
            rvarValue = *m_pbCanAfterburn;
        }
        else if (!bLocalOnly)
        {
            rvarValue = CanBurn();
        }
        else
        {
            return false;
        }

        return true;
    }
    else if (!_stricmp(pcAttrName, "AFTERBURNING"))
    {
        rvarValue = m_afterburning;
        return true;
    }
    else if (!_stricmp(pcAttrName, "AFTERBURN RATIO"))
    {
        rvarValue = m_iAfterburnRatio;
        return true;
    }
    else
    {
        return CHSEngSystem::GetAttributeValue(pcAttrName, rvarValue,
                                               bAdjusted, bLocalOnly);
    }
}
Example #2
0
// Handles slowing or speeding up the engines
void CHSSysEngines::ChangeSpeed()
{
    HS_UINT32 uMax;
    HS_UINT32 uAccel;

    // Grab maximum velocity
    uMax = GetMaxVelocity();

    // If afterburning, max is increased by some ratio.
    if (m_afterburning)
    {
        uMax *= m_iAfterburnRatio;      //HSCONF.afterburn_ratio;
    }

    // Make sure the desired speed doesn't currently
    // exceed the maximum speed limits.
    if (m_desired_speed > uMax)
    {
        m_desired_speed = (float) uMax;
    }
    else if (m_desired_speed < (uMax * -.5))
    {
        m_desired_speed = uMax * (float) -.5;
    }


    // This has to come after the checking of uMax.  Otherwise,
    // the ship could be at top speed, power is taken away from
    // engines, but the speed doesn't change because the desired
    // and current speed are already equal.
    if (m_desired_speed == m_current_speed)
    {
        return;
    }


    // Change the speed closer to the desired speed
    if (m_current_speed > m_desired_speed)
    {
        // Grab deceleration rate, which is always the
        // same as maximum acceleration.  Deceleration is
        // not affected by engine damage or power.
        uAccel = GetAcceleration(false);

        m_current_speed -= uAccel;

        if (m_desired_speed < 0)
        {
            m_current_speed += m_desired_speed;
        }

        // Did we go too far?
        if (m_current_speed < m_desired_speed)
        {
            m_current_speed = m_desired_speed;
        }
    }
    else if (m_current_speed < m_desired_speed)
    {
        // Grab the acceleration rate, which is affected
        // by power and damage.
        uAccel = GetAcceleration(true);

        m_current_speed += uAccel;

        // Did we go too far?
        if (m_current_speed > m_desired_speed)
        {
            m_current_speed = m_desired_speed;
        }
    }
}
Example #3
0
void CHelicopter::MoveStep()
{
    Fvector dir, pathDir;
    float desired_H = m_movement.currPathH;
    float desired_P;
    if(m_movement.type != eMovNone) {

        float dist = m_movement.currP.distance_to(m_movement.desiredPoint);

        dir.sub(m_movement.desiredPoint,m_movement.currP);
        dir.normalize_safe();
        pathDir = dir;
        dir.getHP(desired_H, desired_P);
        float speed_ = _min(m_movement.GetSpeedInDestPoint(), GetMaxVelocity() );

        static float ang = pSettings->r_float	(cNameSect(),"magic_angle");
        if(m_movement.curLinearSpeed>GetMaxVelocity() || angle_difference(m_movement.currPathH,desired_H)>ang)
            m_movement.curLinearAcc = -m_movement.LinearAcc_bk;
        else
            m_movement.curLinearAcc = GetCurrAcc(	m_movement.curLinearSpeed,
                                                    speed_,
                                                    dist*0.95f,
                                                    m_movement.LinearAcc_fw,
                                                    -m_movement.LinearAcc_bk);


        angle_lerp	(m_movement.currPathH, desired_H, m_movement.GetAngSpeedHeading(m_movement.curLinearSpeed), STEP);
        angle_lerp	(m_movement.currPathP, desired_P, m_movement.GetAngSpeedPitch(m_movement.curLinearSpeed), STEP);

        dir.setHP(m_movement.currPathH, m_movement.currPathP);

        float vp = m_movement.curLinearSpeed*STEP+(m_movement.curLinearAcc*STEP*STEP)/2.0f;
        m_movement.currP.mad	(dir, vp);
        m_movement.curLinearSpeed += m_movement.curLinearAcc*STEP;
        static bool aaa = false;
        if(aaa)
            Log("1-m_movement.curLinearSpeed=",m_movement.curLinearSpeed);
        clamp(m_movement.curLinearSpeed,0.0f,1000.0f);
        if(aaa)
            Log("2-m_movement.curLinearSpeed=",m_movement.curLinearSpeed);
    } else { //go stopping
        if( !fis_zero(m_movement.curLinearSpeed) ) {
            m_movement.curLinearAcc = -m_movement.LinearAcc_bk;

            float vp = m_movement.curLinearSpeed*STEP+(m_movement.curLinearAcc*STEP*STEP)/2.0f;
            dir.setHP(m_movement.currPathH, m_movement.currPathP);
            dir.normalize_safe();
            m_movement.currP.mad	(dir, vp);
            m_movement.curLinearSpeed += m_movement.curLinearAcc*STEP;
            clamp(m_movement.curLinearSpeed,0.0f,1000.0f);
//			clamp(m_movement.curLinearSpeed,0.0f,m_movement.maxLinearSpeed);

        } else {
            m_movement.curLinearAcc		= 0.0f;
            m_movement.curLinearSpeed	= 0.0f;
        }

    };

    if(	m_body.b_looking_at_point) {
        Fvector desired_dir;
        desired_dir.sub(m_body.looking_point, m_movement.currP ).normalize_safe();

        float center_desired_H,tmp_P;
        desired_dir.getHP(center_desired_H, tmp_P);
        angle_lerp			(m_body.currBodyHPB.x, center_desired_H, m_movement.GetAngSpeedHeading(m_movement.curLinearSpeed), STEP);
    } else {
        angle_lerp			(m_body.currBodyHPB.x, m_movement.currPathH, m_movement.GetAngSpeedHeading(m_movement.curLinearSpeed), STEP);
    }


    float needBodyP = -m_body.model_pitch_k*m_movement.curLinearSpeed;
    if(m_movement.curLinearAcc < 0) needBodyP*=-1;
    angle_lerp	(m_body.currBodyHPB.y, needBodyP, m_body.model_angSpeedPitch, STEP);


    float sign;
    Fvector cp;
    cp.crossproduct (pathDir,dir);
    (cp.y>0.0)?sign=1.0f:sign=-1.0f;
    float ang_diff = angle_difference (m_movement.currPathH, desired_H);

    float needBodyB = -ang_diff*sign*m_body.model_bank_k*m_movement.curLinearSpeed;
    angle_lerp	(m_body.currBodyHPB.z, needBodyB, m_body.model_angSpeedBank, STEP);


    XFORM().setHPB(m_body.currBodyHPB.x,m_body.currBodyHPB.y,m_body.currBodyHPB.z);

    XFORM().translate_over(m_movement.currP);
}