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