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 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;
}