#pragma once

#include <Bild.h>

using namespace Framework;

class ActiveSkill
{
protected:
    struct SkillDataSave
    {
        bool active;
        double time;
    } current, last;
    double maxTime;
    int ref;
    double reloadTimeFactor;
    Bild *bild;

    // skill bonus added when active
    double beschleunigungBonus;
    double reparaturBonus;
    double laserIntensit�tBonus;
    double laserEffizienzBonus;
    double akkuLeistungBonus;
    double maxEnergieBonus;
    double maxStabilit�tBonus;
    double laserTempoBonus;
    double wendigkeitBonus;
    double antriebEffizienzBonus;
    double energieSchildBonus;
    double energieSchildEffizienzBonus;

    // skil multiplier when active
    double beschleunigungFactor;
    double reparaturFactor;
    double laserIntensit�tFactor;
    double laserEffizienzFactor;
    double akkuLeistungFactor;
    double maxEnergieFactor;
    double maxStabilit�tFactor;
    double laserTempoFactor;
    double wendigkeitFactor;
    double antriebEffizienzFactor;
    double energieSchildFactor;
    double energieSchildEffizienzFactor;

public:
    ActiveSkill( Bild *bild );
    ~ActiveSkill();
    void save();
    void load();
    void tick( double time );
    void render( int x, int y, Bild &zRObj );
    bool isActive() const;
    void activate();
    void reset();

    double getBeschleunigungBonus();
    double getReparaturBonus();
    double getLaserIntensit�tBonus();
    double getLaserEffizienzBonus();
    double getAkkuLeistungBonus();
    double getMaxEnergieBonus();
    double getMaxStabilit�tBonus();
    double getLaserTempoBonus();
    double getWendigkeitBonus();
    double getAntriebEffizienzBonus();
    double getEnergieSchildBonus();
    double getEnergieSchildEffizienzBonus();

    double getBeschleunigungFactor();
    double getReparaturFactor();
    double getLaserIntensit�tFactor();
    double getLaserEffizienzFactor();
    double getAkkuLeistungFactor();
    double getMaxEnergieFactor();
    double getMaxStabilit�tFactor();
    double getLaserTempoFactor();
    double getWendigkeitFactor();
    double getAntriebEffizienzFactor();
    double getEnergieSchildFactor();
    double getEnergieSchildEffizienzFactor();

    ActiveSkill *getThis();
    ActiveSkill *release();
};

class SpeedBoost : public ActiveSkill
{
public:
    SpeedBoost( Bild *bild );
};

class ShieldBoost : public ActiveSkill
{
public:
    ShieldBoost( Bild *bild );
};