Пример #1
0
void SpaceStation::takeDamage(float damage_amount, DamageInfo info)
{
    shields -= damage_amount;
    if (shields < 0)
    {
        if (info.type != DT_EMP)
        {
            hull_strength -= damage_amount;
            if (hull_strength <= 0.0)
            {
                ExplosionEffect* e = new ExplosionEffect();
                e->setSize(getRadius());
                e->setPosition(getPosition());

                if (info.instigator)
                {
                    if (isEnemy(info.instigator))
                        info.instigator->addReputationPoints((hull_max + shields_max) * 0.1);
                    else
                        info.instigator->removeReputationPoints((hull_max + shields_max) * 0.1);
                }

                destroy();
            }
        }
        shields = 0;
    }else{
        shieldHitEffect = 1.0;
    }
}
 void ExplosionEffectsManager::addExplosion(const Vec2& position, TokenColor color)
 {
     ExplosionEffect* explosionEffect = nullptr;
     
     if (!explosionsPool.empty())
     {
         auto it = explosionsPool.begin();
         while ((it != explosionsPool.end()) && (explosionEffect == nullptr))
         {
             auto nextExplosion = *it;
             if (nextExplosion->getColor() == color)
             {
                 explosionEffect = nextExplosion;
                 explosionsPool.erase(it);
             }
             else
             {
                 ++it;
             }
         }
     }
     
     if (explosionEffect == nullptr)
     {
         explosionEffect = new ExplosionEffect(color);
     }
     
     explosionEffect->setVisible(true);
     explosionEffect->setPosition(position);
     
     runningExplosions.push_back(explosionEffect);
     
     explosionEffect->run(tweensManager, [this, explosionEffect]()->void{
         explosionsPool.push_back(explosionEffect);
         runningExplosions.erase(std::find(runningExplosions.begin(), runningExplosions.end(), explosionEffect));
     });
 }
Пример #3
0
void SpaceStation::destroyedByDamage(DamageInfo& info)
{
    ExplosionEffect* e = new ExplosionEffect();
    e->setSize(getRadius());
    e->setPosition(getPosition());
    
    if (info.instigator)
    {
        float points = 0;
        if (shield_count > 0)
        {
            for(int n=0; n<shield_count; n++)
            {
                points += shield_max[n] * 0.1;
            }
            points /= shield_count;
        }
        points += hull_max * 0.1;
        if (isEnemy(info.instigator))
            info.instigator->addReputationPoints(points);
        else
            info.instigator->removeReputationPoints(points);
    }
}