Example #1
0
Error CAutoResearch::GetError()
{
    if ( m_phase == ALP_SEARCH )
    {
        return ERR_OK;
    }

    if ( m_object->GetVirusMode() )
    {
        return ERR_BAT_VIRUS;
    }

    if (m_object->GetPower() == nullptr || !m_object->GetPower()->Implements(ObjectInterfaceType::PowerContainer))
    {
        return ERR_RESEARCH_POWER;
    }
    CPowerContainerObject* power = dynamic_cast<CPowerContainerObject*>(m_object->GetPower());
    if ( power->GetCapacity() > 1.0f )
    {
        return ERR_RESEARCH_TYPE;
    }
    if ( power->GetEnergy() < 1.0f )
    {
        return ERR_RESEARCH_ENERGY;
    }

    return ERR_OK;
}
Example #2
0
Error CAutoResearch::StartAction(int param)
{
    if ( m_phase != ALP_WAIT )
    {
        return ERR_UNKNOWN;
    }

    m_research = static_cast<ResearchType>(param);

    if ( m_main->IsResearchDone(m_research, m_object->GetTeam()) )
    {
        return ERR_RESEARCH_ALREADY;
    }

    if (m_object->GetPower() == nullptr || !m_object->GetPower()->Implements(ObjectInterfaceType::PowerContainer))
    {
        return ERR_RESEARCH_POWER;
    }
    CPowerContainerObject* power = dynamic_cast<CPowerContainerObject*>(m_object->GetPower());
    if ( power->GetCapacity() > 1.0f )
    {
        return ERR_RESEARCH_TYPE;
    }
    if ( power->GetEnergy() < 1.0f )
    {
        return ERR_RESEARCH_ENERGY;
    }

    float time = SEARCH_TIME;
    if ( m_research == RESEARCH_TANK   )  time *= 0.3f;
    if ( m_research == RESEARCH_FLY    )  time *= 0.3f;
    if ( m_research == RESEARCH_ATOMIC )  time *= 2.0f;

    SetBusy(true);
    InitProgressTotal(time);
    UpdateInterface();

    m_channelSound = m_sound->Play(SOUND_RESEARCH, m_object->GetPosition(), 0.0f, 1.0f, true);
    m_sound->AddEnvelope(m_channelSound, 1.0f, 1.0f,      2.0f, SOPER_CONTINUE);
    m_sound->AddEnvelope(m_channelSound, 1.0f, 1.0f, time-4.0f, SOPER_CONTINUE);
    m_sound->AddEnvelope(m_channelSound, 0.0f, 1.0f,      2.0f, SOPER_STOP);

    m_phase    = ALP_SEARCH;
    m_progress = 0.0f;
    m_speed    = 1.0f/time;
    return ERR_OK;
}
Example #3
0
bool CTaskFire::EventProcess(const Event &event)
{
    CPhysics*   physics;
    Math::Matrix*   mat;
    Math::Vector    pos, speed, dir, vib;
    ObjectType  type;
    Math::Point     dim;
    float       energy, fire;
    int         i, channel;

    if ( m_engine->GetPause() )  return true;
    if ( event.type != EVENT_FRAME )  return true;
    if ( m_bError )  return false;

    m_time += event.rTime;
    m_lastSound -= event.rTime;
    m_progress += event.rTime*m_speed;

    CPowerContainerObject* power = nullptr;
    if (m_object->GetPower() != nullptr && m_object->GetPower()->Implements(ObjectInterfaceType::PowerContainer))
    {
        power = dynamic_cast<CPowerContainerObject*>(m_object->GetPower());
        energy = power->GetEnergy();
             if ( m_bOrganic )  fire = ENERGY_FIREi;
        else if ( m_bRay     )  fire = ENERGY_FIREr;
        else                    fire = ENERGY_FIRE;
        energy -= event.rTime*fire;
        power->SetEnergy(energy);
    }

    if ( m_lastParticle+0.05f <= m_time )
    {
        m_lastParticle = m_time;

        if ( m_bOrganic )
        {
            mat = m_object->GetWorldMatrix(1);  // insect-cannon

            for ( i=0 ; i<6 ; i++ )
            {
                pos = Math::Vector(0.0f, 2.5f, 0.0f);
                pos = Math::Transform(*mat, pos);

                speed = Math::Vector(200.0f, 0.0f, 0.0f);

                physics = m_object->GetPhysics();
                if ( physics != nullptr )
                {
                    speed += physics->GetLinMotion(MO_REASPEED);
                }

                speed.x += (Math::Rand()-0.5f)*10.0f;
                speed.y += (Math::Rand()-0.5f)*20.0f;
                speed.z += (Math::Rand()-0.5f)*30.0f;
                speed = Math::Transform(*mat, speed);
                speed -= pos;

                dim.x = Math::Rand()*0.5f+0.5f;
                dim.y = dim.x;

                channel = m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIGUN4, 0.8f, 0.0f, 0.0f);
                m_particle->SetObjectFather(channel, m_object);
            }
        }
        else if ( m_bRay )
        {
            mat = m_object->GetWorldMatrix(2);  // cannon

            for ( i=0 ; i<4 ; i++ )
            {
                pos = Math::Vector(4.0f, 0.0f, 0.0f);
                pos.y += (rand()%3-1)*1.5f;
                pos.z += (rand()%3-1)*1.5f;
                pos = Math::Transform(*mat, pos);

                speed = Math::Vector(200.0f, 0.0f, 0.0f);
                speed.x += (Math::Rand()-0.5f)*6.0f;
                speed.y += (Math::Rand()-0.5f)*12.0f;
                speed.z += (Math::Rand()-0.5f)*12.0f;
                speed = Math::Transform(*mat, speed);
                speed -= pos;

                dim.x = 1.0f;
                dim.y = dim.x;
                channel = m_particle->CreateTrack(pos, speed, dim, Gfx::PARTITRACK11,
                                                   2.0f, 200.0f, 0.5f, 1.0f);
                m_particle->SetObjectFather(channel, m_object);

                speed = Math::Vector(5.0f, 0.0f, 0.0f);
                speed.x += (Math::Rand()-0.5f)*1.0f;
                speed.y += (Math::Rand()-0.5f)*2.0f;
                speed.z += (Math::Rand()-0.5f)*2.0f;
                speed = Math::Transform(*mat, speed);
                speed -= pos;
                speed.y += 5.0f;

                dim.x = 2.0f;
                dim.y = dim.x;
                m_particle->CreateParticle(pos, speed, dim, Gfx::PARTISMOKE2, 2.0f, 0.0f, 0.5f);
            }
        }
        else
        {
            type = m_object->GetType();

            if ( type == OBJECT_MOBILErc )
            {
                mat = m_object->GetWorldMatrix(2);  // cannon
            }
            else
            {
                mat = m_object->GetWorldMatrix(1);  // cannon
            }

            for ( i=0 ; i<3 ; i++ )
            {
                if ( type == OBJECT_MOBILErc )
                {
                    pos = Math::Vector(0.0f, 0.0f, 0.0f);
                }
                else
                {
                    pos = Math::Vector(3.0f, 1.0f, 0.0f);
                }
                pos.y += (Math::Rand()-0.5f)*1.0f;
                pos.z += (Math::Rand()-0.5f)*1.0f;
                pos = Math::Transform(*mat, pos);

                speed = Math::Vector(200.0f, 0.0f, 0.0f);

                physics = m_object->GetPhysics();
                if ( physics != nullptr )
                {
                    speed += physics->GetLinMotion(MO_REASPEED);
                }

                speed.x += (Math::Rand()-0.5f)*3.0f;
                speed.y += (Math::Rand()-0.5f)*6.0f;
                speed.z += (Math::Rand()-0.5f)*6.0f;
                speed = Math::Transform(*mat, speed);
                speed -= pos;

                dim.x = Math::Rand()*0.7f+0.7f;
                dim.y = dim.x;

                channel = m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIGUN1, 0.8f, 0.0f, 0.0f);
                m_particle->SetObjectFather(channel, m_object);
            }

            if ( type != OBJECT_MOBILErc &&
                 m_progress > 0.3f )
            {
                pos = Math::Vector(-1.0f, 1.0f, 0.0f);
                pos.y += (Math::Rand()-0.5f)*0.4f;
                pos.z += (Math::Rand()-0.5f)*0.4f;
                pos = Math::Transform(*mat, pos);

                speed = Math::Vector(-4.0f, 0.0f, 0.0f);
                speed.x += (Math::Rand()-0.5f)*2.0f;
                speed.y += (Math::Rand()-0.2f)*4.0f;
                speed.z += (Math::Rand()-0.5f)*4.0f;
                speed = Math::Transform(*mat, speed);
                speed -= pos;

                dim.x = Math::Rand()*1.2f+1.2f;
                dim.y = dim.x;

                m_particle->CreateParticle(pos, speed, dim, Gfx::PARTICRASH, 2.0f, 0.0f, 0.0f);
//?             m_particle->CreateParticle(pos, speed, dim, PARTISMOKE2, 4.0f, 0.0f, 0.0f);
            }
        }

        dir = Math::Vector(0.0f, 0.0f, 0.0f);
        if ( m_progress < 0.1f )
        {
            dir.z = (Math::PI*0.04f)*(m_progress*10.0f);
        }
        else if ( m_progress < 0.9f )
        {
            dir.z = (Math::PI*0.04f);
        }
        else
        {
            dir.z = (Math::PI*0.04f)*(1.0f-(m_progress-0.9f)*10.0f);
        }
        m_object->SetTilt(dir);

        vib.x = (Math::Rand()-0.5f)*0.01f;
        vib.y = (Math::Rand()-0.5f)*0.02f;
        vib.z = (Math::Rand()-0.5f)*0.02f;
        m_object->SetCirVibration(vib);

        vib.x = (Math::Rand()-0.5f)*0.20f;
        vib.y = (Math::Rand()-0.5f)*0.05f;
        vib.z = (Math::Rand()-0.5f)*0.20f;
        m_object->SetLinVibration(vib);
    }

    if ( m_bRay && m_lastSound <= 0.0f )
    {
        m_lastSound = Math::Rand()*0.4f+0.4f;
        m_sound->Play(SOUND_FIREp, m_object->GetPosition());
    }

    return true;
}
Example #4
0
bool CAutoTower::EventProcess(const Event &event)
{
    CObject*    target;
    Math::Vector    pos;
    float       angle, quick;

    CAuto::EventProcess(event);

    if ( m_engine->GetPause() )  return true;
    if ( event.type != EVENT_FRAME )  return true;

    m_timeVirus -= event.rTime;

    if ( m_object->GetVirusMode() )  // contaminated by a virus?
    {
        if ( m_timeVirus <= 0.0f )
        {
            m_timeVirus = 0.1f+Math::Rand()*0.3f;

            angle = m_object->GetPartRotationY(1);
            angle += Math::Rand()*0.5f;
            m_object->SetPartRotationY(1, angle);

            m_object->SetPartRotationZ(2, Math::Rand()*0.5f);
        }
        return true;
    }

    CPowerContainerObject* power = nullptr;
    float energy = 0.0f;
    if ( m_object->GetPower() != nullptr && m_object->GetPower()->Implements(ObjectInterfaceType::PowerContainer) )
    {
        power = dynamic_cast<CPowerContainerObject*>(m_object->GetPower());
        energy = power->GetEnergy();
    }

    UpdateInterface(event.rTime);

    if ( m_phase == ATP_WAIT )  return true;

    m_progress += event.rTime*m_speed;

    if ( m_phase == ATP_ZERO )
    {
        FireStopUpdate(m_progress, true);  // blinks
        if ( m_progress < 1.0f )
        {
            if ( energy >= ENERGY_FIRE )
            {
                m_phase    = ATP_SEARCH;
                m_progress = 0.0f;
                m_speed    = 1.0f/3.0f;
            }
        }
        else
        {
            m_phase    = ATP_ZERO;
            m_progress = 0.0f;
            m_speed    = 1.0f/1.0f;
        }
    }

    if ( m_phase == ATP_SEARCH )
    {
        FireStopUpdate(m_progress, false);  // extinguished
        if ( m_progress < 1.0f )
        {
            quick = 1.0f;
//?         if ( g_researchDone & RESEARCH_QUICK )  quick = 3.0f;

            angle = m_object->GetPartRotationY(1);
            angle -= event.rTime*quick*2.0f;
            m_object->SetPartRotationY(1, angle);

            angle = m_object->GetPartRotationZ(2);
            angle += event.rTime*quick*0.5f;
            if ( angle > 0.0f )  angle = 0.0f;
            m_object->SetPartRotationZ(2, angle);
        }
        else
        {
            target = SearchTarget(m_targetPos);
            if ( energy < ENERGY_FIRE )
            {
                m_main->DisplayError(ERR_TOWER_ENERGY, m_object);
            }
            if ( target == nullptr || energy < ENERGY_FIRE )
            {
                m_phase    = ATP_ZERO;
                m_progress = 0.0f;
                m_speed    = 1.0f/1.0f;
            }
            else
            {
                pos = m_object->GetPosition();
                pos.y += 24.5f;
                m_angleYfinal = Math::RotateAngle(m_targetPos.x-pos.x, pos.z-m_targetPos.z);  // CW !
                m_angleYfinal += Math::PI*2.0f;
                m_angleYfinal -= m_object->GetRotationY();
                m_angleYactual = Math::NormAngle(m_object->GetPartRotationY(1));

                m_angleZfinal = -Math::PI/2.0f;
                m_angleZfinal -= Math::RotateAngle(Math::DistanceProjected(m_targetPos, pos), pos.y-m_targetPos.y);  // CW !
                m_angleZactual = m_object->GetPartRotationZ(2);

                m_phase    = ATP_TURN;
                m_progress = 0.0f;
                m_speed    = 1.0f/1.0f;
//?             if ( g_researchDone & RESEARCH_QUICK )  m_speed = 1.0f/0.2f;
            }
        }
    }

    if ( m_phase == ATP_TURN )
    {
        if ( m_progress < 1.0f )
        {
            angle = m_angleYactual+(m_angleYfinal-m_angleYactual)*m_progress;
            m_object->SetPartRotationY(1, angle);

            angle = m_angleZactual+(m_angleZfinal-m_angleZactual)*m_progress;
            m_object->SetPartRotationZ(2, angle);
        }
        else
        {
            m_object->SetPartRotationY(1, m_angleYfinal);
            m_object->SetPartRotationZ(2, m_angleZfinal);

            if ( power != nullptr )
            {
                energy = power->GetEnergy();
                energy -= ENERGY_FIRE;
                power->SetEnergy(energy);
            }

            m_sound->Play(SOUND_GGG, m_object->GetPosition());

            m_phase    = ATP_FIRE;
            m_progress = 0.0f;
            m_speed    = 1.0f/1.5f;
        }
    }

    if ( m_phase == ATP_FIRE )
    {
        if ( m_progress == 0.0f )
        {
            pos = m_object->GetPosition();
            pos.y += 24.5f;
            m_particle->CreateRay(pos, m_targetPos, Gfx::PARTIRAY1,
                                  Math::Point(5.0f, 5.0f), 1.5f);
        }
        if ( m_progress >= 1.0f )
        {
            m_phase    = ATP_ZERO;
            m_progress = 0.0f;
            m_speed    = 1.0f/1.0f;
        }
    }

    return true;
}
Example #5
0
bool CTaskRecover::EventProcess(const Event &event)
{
    Math::Vector    pos, speed;
    Math::Point     dim;
    float       a, g, cirSpeed, angle, energy, dist, linSpeed;

    if ( m_engine->GetPause() )  return true;
    if ( event.type != EVENT_FRAME )  return true;
    if ( m_bError )  return false;

    if ( m_phase == TRP_TURN )  // preliminary rotation?
    {
        a = m_object->GetRotationY();
        g = m_angle;
        cirSpeed = Math::Direction(a, g)*1.0f;
        if ( cirSpeed >  1.0f )  cirSpeed =  1.0f;
        if ( cirSpeed < -1.0f )  cirSpeed = -1.0f;

        m_physics->SetMotorSpeedZ(cirSpeed);  // turns left / right
        return true;
    }

    m_progress += event.rTime*m_speed;  // others advance
    m_time += event.rTime;

    if ( m_phase == TRP_DOWN )
    {
        angle = Math::PropAngle(126, -10, m_progress);
        m_object->SetPartRotationZ(2, angle);
        m_object->SetPartRotationZ(4, angle);

        angle = Math::PropAngle(-144, 0, m_progress);
        m_object->SetPartRotationZ(3, angle);
        m_object->SetPartRotationZ(5, angle);
    }

    if ( m_phase == TRP_MOVE )  // preliminary forward/backward?
    {
        dist = Math::Distance(m_object->GetPosition(), m_ruin->GetPosition());
        linSpeed = 0.0f;
        if ( dist > RECOVER_DIST )  linSpeed =  1.0f;
        if ( dist < RECOVER_DIST )  linSpeed = -1.0f;
        m_physics->SetMotorSpeedX(linSpeed);  // forward/backward
        return true;
    }

    if ( m_phase == TRP_OPER )
    {
        assert(m_object->Implements(ObjectInterfaceType::Powered));
        CObject* powerObj = dynamic_cast<CPoweredObject*>(m_object)->GetPower();
        if (powerObj != nullptr && powerObj->Implements(ObjectInterfaceType::PowerContainer))
        {
            CPowerContainerObject* power = dynamic_cast<CPowerContainerObject*>(powerObj);
            energy = power->GetEnergy();
            energy -= event.rTime * ENERGY_RECOVER * m_speed;
            power->SetEnergy(energy);
        }


        speed.x = (Math::Rand()-0.5f)*0.1f*m_progress;
        speed.y = (Math::Rand()-0.5f)*0.1f*m_progress;
        speed.z = (Math::Rand()-0.5f)*0.1f*m_progress;
        m_ruin->SetCirVibration(speed);

        if ( m_progress >= 0.75f )
        {
            m_ruin->SetScale(1.0f-(m_progress-0.75f)/0.25f);
        }

        if ( m_progress > 0.5f && m_progress < 0.8f )
        {
            m_metal->SetScale((m_progress-0.5f)/0.3f);
        }

        if ( m_lastParticle+m_engine->ParticleAdapt(0.02f) <= m_time )
        {
            m_lastParticle = m_time;

            pos = m_recoverPos;
            pos.x += (Math::Rand()-0.5f)*8.0f*(1.0f-m_progress);
            pos.z += (Math::Rand()-0.5f)*8.0f*(1.0f-m_progress);
            pos.y -= 4.0f;
            speed.x = (Math::Rand()-0.5f)*0.0f;
            speed.z = (Math::Rand()-0.5f)*0.0f;
            speed.y = Math::Rand()*15.0f;
            dim.x = Math::Rand()*2.0f+1.5f;
            dim.y = dim.x;
            m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIRECOVER, 1.0f, 0.0f, 0.0f);
        }
    }

    if ( m_phase == TRP_UP )
    {
        angle = Math::PropAngle(-10, 126, m_progress);
        m_object->SetPartRotationZ(2, angle);
        m_object->SetPartRotationZ(4, angle);

        angle = Math::PropAngle(0, -144, m_progress);
        m_object->SetPartRotationZ(3, angle);
        m_object->SetPartRotationZ(5, angle);

        if ( m_lastParticle+m_engine->ParticleAdapt(0.02f) <= m_time )
        {
            m_lastParticle = m_time;

            pos = m_recoverPos;
            pos.y -= 4.0f;
            speed.x = (Math::Rand()-0.5f)*0.0f;
            speed.z = (Math::Rand()-0.5f)*0.0f;
            speed.y = Math::Rand()*15.0f;
            dim.x = Math::Rand()*2.0f+1.5f;
            dim.y = dim.x;
            m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIRECOVER, 1.0f, 0.0f, 0.0f);
        }
    }

    return true;
}
Example #6
0
bool CAutoResearch::EventProcess(const Event &event)
{
    CPowerContainerObject*    power;
    Math::Vector    pos, speed;
    Error       message;
    Math::Point     dim;
    float       angle;

    CAuto::EventProcess(event);

    if ( m_engine->GetPause() )  return true;

    if ( event.type == EVENT_UPDINTERFACE )
    {
        if ( m_object->GetSelect() )  CreateInterface(true);
    }

    if ( m_object->GetSelect() )  // center selected?
    {
        Error err = ERR_UNKNOWN;
        if ( event.type == EVENT_OBJECT_RTANK   ) err = StartAction(RESEARCH_TANK);
        if ( event.type == EVENT_OBJECT_RFLY    ) err = StartAction(RESEARCH_FLY);
        if ( event.type == EVENT_OBJECT_RTHUMP  ) err = StartAction(RESEARCH_THUMP);
        if ( event.type == EVENT_OBJECT_RCANON  ) err = StartAction(RESEARCH_CANON);
        if ( event.type == EVENT_OBJECT_RTOWER  ) err = StartAction(RESEARCH_TOWER);
        if ( event.type == EVENT_OBJECT_RPHAZER ) err = StartAction(RESEARCH_PHAZER);
        if ( event.type == EVENT_OBJECT_RSHIELD ) err = StartAction(RESEARCH_SHIELD);
        if ( event.type == EVENT_OBJECT_RATOMIC ) err = StartAction(RESEARCH_ATOMIC);

        if( err != ERR_OK && err != ERR_UNKNOWN )
            m_main->DisplayError(err, m_object);

        if( err != ERR_UNKNOWN )
            return false;
    }

    if ( event.type != EVENT_FRAME )  return true;

    m_progress += event.rTime*m_speed;
    m_timeVirus -= event.rTime;

    if ( m_object->GetVirusMode() )  // contaminated by a virus?
    {
        if ( m_timeVirus <= 0.0f )
        {
            m_timeVirus = 0.1f+Math::Rand()*0.3f;
        }
        return true;
    }

    UpdateInterface(event.rTime);
    EventProgress(event.rTime);

    angle = m_time*0.1f;
    m_object->SetPartRotationY(1, angle);  // rotates the antenna

    angle = (30.0f+sinf(m_time*0.3f)*20.0f)*Math::PI/180.0f;
    m_object->SetPartRotationZ(2, angle);  // directs the antenna

    if ( m_phase == ALP_WAIT )
    {
        FireStopUpdate(m_progress, false);  // extinguished
        return true;
    }

    if ( m_phase == ALP_SEARCH )
    {
        FireStopUpdate(m_progress, true);  // flashes
        if ( m_progress < 1.0f )
        {
            if ( m_object->GetPower() == nullptr || !m_object->GetPower()->Implements(ObjectInterfaceType::PowerContainer) )  // more battery?
            {
                SetBusy(false);
                UpdateInterface();

                m_phase    = ALP_WAIT;
                m_progress = 0.0f;
                m_speed    = 1.0f/1.0f;
                return true;
            }
            power = dynamic_cast<CPowerContainerObject*>(m_object->GetPower());
            power->SetEnergyLevel(1.0f-m_progress);

            if ( m_lastParticle+m_engine->ParticleAdapt(0.05f) <= m_time )
            {
                m_lastParticle = m_time;

                pos = m_object->GetPosition();
                pos.x += (Math::Rand()-0.5f)*6.0f;
                pos.z += (Math::Rand()-0.5f)*6.0f;
                pos.y += 11.0f;
                speed.x = (Math::Rand()-0.5f)*2.0f;
                speed.z = (Math::Rand()-0.5f)*2.0f;
                speed.y = Math::Rand()*20.0f;
                dim.x = Math::Rand()*1.0f+1.0f;
                dim.y = dim.x;
                m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIVAPOR);
            }
        }
        else
        {
            m_main->MarkResearchDone(m_research, m_object->GetTeam());  // research done

            m_eventQueue->AddEvent(Event(EVENT_UPDINTERFACE));
            UpdateInterface();

            m_main->DisplayError(INFO_RESEARCH, m_object);

            message = ERR_OK;
            if ( m_research == RESEARCH_TANK   )  message = INFO_RESEARCHTANK;
            if ( m_research == RESEARCH_FLY    )  message = INFO_RESEARCHFLY;
            if ( m_research == RESEARCH_THUMP  )  message = INFO_RESEARCHTHUMP;
            if ( m_research == RESEARCH_CANON  )  message = INFO_RESEARCHCANON;
            if ( m_research == RESEARCH_TOWER  )  message = INFO_RESEARCHTOWER;
            if ( m_research == RESEARCH_PHAZER )  message = INFO_RESEARCHPHAZER;
            if ( m_research == RESEARCH_SHIELD )  message = INFO_RESEARCHSHIELD;
            if ( m_research == RESEARCH_ATOMIC )  message = INFO_RESEARCHATOMIC;
            if ( message != ERR_OK )
            {
                m_main->DisplayError(message, m_object);
            }

            SetBusy(false);
            UpdateInterface();

            m_phase    = ALP_WAIT;
            m_progress = 0.0f;
            m_speed    = 1.0f/1.0f;
        }
    }

    return true;
}
Example #7
0
bool CObjectCondition::CheckForObject(CObject* obj)
{
    if (!this->countTransported)
    {
        if (IsObjectBeingTransported(obj)) return false;
    }

    ObjectType type = obj->GetType();

    ToolType tool = GetToolFromObject(type);
    DriveType drive = GetDriveFromObject(type);
    if (this->tool != ToolType::Other &&
        tool != this->tool)
        return false;

    if (this->drive != DriveType::Other &&
        drive != this->drive)
        return false;

    if (this->tool == ToolType::Other &&
        this->drive == DriveType::Other &&
        type != this->type &&
        this->type != OBJECT_NULL)
        return false;

    if ((this->team > 0 && obj->GetTeam() != this->team) ||
        (this->team < 0 && (obj->GetTeam() == -(this->team) || obj->GetTeam() == 0)))
        return false;

    float energyLevel = -1;
    CPowerContainerObject* power = nullptr;
    if (obj->Implements(ObjectInterfaceType::PowerContainer))
    {
        power = dynamic_cast<CPowerContainerObject*>(obj);
    }
    else if (obj->Implements(ObjectInterfaceType::Powered))
    {
        CObject* powerObj = dynamic_cast<CPoweredObject*>(obj)->GetPower();
        if(powerObj != nullptr && powerObj->Implements(ObjectInterfaceType::PowerContainer))
        {
            power = dynamic_cast<CPowerContainerObject*>(powerObj);
        }
    }

    if (power != nullptr)
    {
        energyLevel = power->GetEnergy();
        if (power->GetCapacity() > 1.0f) energyLevel *= 10; // TODO: Who designed it like that ?!?!
    }
    if (energyLevel < this->powermin || energyLevel > this->powermax) return false;

    Math::Vector oPos;
    if (IsObjectBeingTransported(obj))
        oPos = dynamic_cast<CTransportableObject*>(obj)->GetTransporter()->GetPosition();
    else
        oPos = obj->GetPosition();
    oPos.y = 0.0f;

    Math::Vector bPos = this->pos;
    bPos.y = 0.0f;

    if (Math::DistanceProjected(oPos, bPos) <= this->dist)
        return true;

    return false;
}
Example #8
0
bool CAutoPowerStation::EventProcess(const Event &event)
{
    CAuto::EventProcess(event);

    if ( m_engine->GetPause() )  return true;
    if ( event.type != EVENT_FRAME )  return true;

    m_timeVirus -= event.rTime;

    if ( m_object->GetVirusMode() )  // contaminated by a virus?
    {
        if ( !m_bLastVirus )
        {
            m_bLastVirus = true;
            m_energyVirus = dynamic_cast<CPowerContainerObject*>(m_object)->GetEnergyLevel();
        }

        if ( m_timeVirus <= 0.0f )
        {
            m_timeVirus = 0.1f+Math::Rand()*0.3f;

            dynamic_cast<CPowerContainerObject*>(m_object)->SetEnergyLevel(Math::Rand());
        }
        return true;
    }
    else
    {
        if ( m_bLastVirus )
        {
            m_bLastVirus = false;
            dynamic_cast<CPowerContainerObject*>(m_object)->SetEnergyLevel(m_energyVirus);
        }
    }

    UpdateInterface(event.rTime);

    float big = dynamic_cast<CPowerContainerObject*>(m_object)->GetEnergy();

    Gfx::TerrainRes res = m_terrain->GetResource(m_object->GetPosition());
    if ( res == Gfx::TR_POWER )
    {
        big += event.rTime*0.01f;  // recharges the large battery
    }

    float used = big;
    float freq = 1.0f;
    if (big > 0.0f)
    {
        CObject* vehicle = SearchVehicle();
        if (vehicle != nullptr)
        {
            if (vehicle->Implements(ObjectInterfaceType::Powered))
            {
                CObject* power = dynamic_cast<CPoweredObject*>(vehicle)->GetPower();
                if ( power != nullptr && power->Implements(ObjectInterfaceType::PowerContainer) )
                {
                    CPowerContainerObject* powerContainer = dynamic_cast<CPowerContainerObject*>(power);
                    if (powerContainer->IsRechargeable())
                    {
                        float energy = powerContainer->GetEnergy();
                        float add = event.rTime*0.2f;
                        if ( add > big*4.0f )  add = big*4.0f;
                        if ( add > 1.0f-energy )  add = 1.0f-energy;
                        energy += add;  // Charging the battery
                        powerContainer->SetEnergy(energy);
                        if ( energy < freq )  freq = energy;
                        big -= add/4.0f;  // discharge the large battery
                    }
                }
            }

            if (vehicle->Implements(ObjectInterfaceType::Carrier))
            {
                CObject* power = dynamic_cast<CCarrierObject*>(vehicle)->GetCargo();
                if ( power != nullptr && power->Implements(ObjectInterfaceType::PowerContainer) )
                {
                    CPowerContainerObject* powerContainer = dynamic_cast<CPowerContainerObject*>(power);
                    if (powerContainer->IsRechargeable())
                    {
                        float energy = powerContainer->GetEnergy();
                        float add = event.rTime*0.2f;
                        if ( add > big*4.0f )  add = big*4.0f;
                        if ( add > 1.0f-energy )  add = 1.0f-energy;
                        energy += add;  // Charging the battery
                        powerContainer->SetEnergy(energy);
                        if ( energy < freq )  freq = energy;
                        big -= add/4.0f;  // discharge the large battery
                    }
                }
            }
        }
    }
    used -= big;  // energy used

    if ( freq < 1.0f )  // charging in progress?
    {
        freq = 1.0f+3.0f*freq;
        if ( m_soundChannel == -1 )
        {
            m_soundChannel = m_sound->Play(SOUND_STATION, m_object->GetPosition(),
                                           0.3f, freq, true);
        }
        m_sound->Frequency(m_soundChannel, freq);
    }
    else
    {
        if ( m_soundChannel != -1 )
        {
            m_sound->Stop(m_soundChannel);
            m_soundChannel = -1;
        }
    }

    if ( used != 0.0f &&
         m_lastParticle+m_engine->ParticleAdapt(0.05f) <= m_time )
    {
        m_lastParticle = m_time;

        Math::Vector    pos, ppos, speed;
        Math::Point     dim;

        Math::Matrix* mat = m_object->GetWorldMatrix(0);
        pos = Math::Vector(-15.0f, 7.0f, 0.0f);  // battery position
        pos = Math::Transform(*mat, pos);
        speed.x = (Math::Rand()-0.5f)*20.0f;
        speed.y = (Math::Rand()-0.5f)*20.0f;
        speed.z = (Math::Rand()-0.5f)*20.0f;
        ppos.x = pos.x;
        ppos.y = pos.y+(Math::Rand()-0.5f)*4.0f;
        ppos.z = pos.z;
        dim.x = 1.5f;
        dim.y = 1.5f;
        m_particle->CreateParticle(ppos, speed, dim, Gfx::PARTIBLITZ, 1.0f, 0.0f, 0.0f);

        ppos = pos;
        ppos.y += 1.0f;
        ppos.x += (Math::Rand()-0.5f)*3.0f;
        ppos.z += (Math::Rand()-0.5f)*3.0f;
        speed.x = 0.0f;
        speed.z = 0.0f;
        speed.y = 2.5f+Math::Rand()*5.0f;
        dim.x = Math::Rand()*1.0f+0.6f;
        dim.y = dim.x;
        m_particle->CreateParticle(ppos, speed, dim, Gfx::PARTIVAPOR, 3.0f);
    }

    if ( big < 0.0f )  big = 0.0f;
    if ( big > 1.0f )  big = 1.0f;
    dynamic_cast<CPowerContainerObject*>(m_object)->SetEnergy(big);  // Shift the large battery

    return true;
}
Example #9
0
void CAutoPowerCaptor::ChargeObject(float rTime)
{
    Math::Vector sPos = m_object->GetPosition();

    for (CObject* obj : CObjectManager::GetInstancePointer()->GetAllObjects())
    {
        Math::Vector oPos = obj->GetPosition();
        float dist = Math::Distance(oPos, sPos);
        if ( dist > 20.0f )  continue;

        if (! IsObjectBeingTransported(obj) && obj->Implements(ObjectInterfaceType::PowerContainer) )
        {
            CPowerContainerObject* powerContainer = dynamic_cast<CPowerContainerObject*>(obj);
            if (powerContainer->IsRechargeable())
            {
                float energy = powerContainer->GetEnergy();
                energy += rTime/2.0f;
                if ( energy > 1.0f )  energy = 1.0f;
                powerContainer->SetEnergy(energy);
            }
        }

        if (obj->Implements(ObjectInterfaceType::Powered))
        {
            CObject* power = dynamic_cast<CPoweredObject*>(obj)->GetPower();
            if ( power != nullptr && power->Implements(ObjectInterfaceType::PowerContainer) )
            {
                CPowerContainerObject* powerContainer = dynamic_cast<CPowerContainerObject*>(power);
                if (powerContainer->IsRechargeable())
                {
                    float energy = powerContainer->GetEnergy();
                    energy += rTime/2.0f;
                    if ( energy > 1.0f )  energy = 1.0f;
                    powerContainer->SetEnergy(energy);
                }
            }
        }

        if (obj->Implements(ObjectInterfaceType::Carrier))
        {
            CObject* power = dynamic_cast<CCarrierObject*>(obj)->GetCargo();
            if ( power != nullptr && power->Implements(ObjectInterfaceType::PowerContainer) )
            {
                CPowerContainerObject* powerContainer = dynamic_cast<CPowerContainerObject*>(power);
                if (powerContainer->IsRechargeable())
                {
                    float energy = powerContainer->GetEnergy();
                    energy += rTime/2.0f;
                    if ( energy > 1.0f )  energy = 1.0f;
                    powerContainer->SetEnergy(energy);
                }
            }
        }
    }
}