#include "fly.hpp"


//======================================================
//constructeur
fly::fly():sprite()
{
    _muteX =_muteZ = _muteControl = false;
    _dir = point(0,0,1);
    _speed = 0.07;
    _cooldown = 100;
}
//constructeur
fly::fly(const shell& model) : sprite(model)
{
    _muteX = _muteZ = _muteControl = false;
    _dir = point(0,0,1);
    _speed = 0.07;
    _cooldown = 100;
}

//avancer, et mettre a jour l'animation selon les mutes
void fly::forward(float power)
{
    _pos = _pos + (_dir * _speed);
    if(!cool())
        _cooldown++;
    if(_speed > 0.07)
        _speed -= 0.001;
    //pivote l'avion tan que les bouttons sont enfoncé
    if(_muteZ)
        _muteZ=false;
    else if(_radZ < -pi/20)
        _radZ += pi/20;
    else if(_radZ > pi/20)
        _radZ -= pi/20;
    else if(_radZ != 0)
        _radZ = 0;
    //bouge le nez de l'avion tan que les boutton sont enfoncé
    if(_muteX)
        _muteX=false;
    else if(_radX < -pi/20)
        _radX += pi/20;
    else if(_radX > pi/20)
        _radX -= pi/20;
    else if(_radX != 0)
        _radX = 0;
}

//tourné et pivoter
void fly::turnLeft(float rad)
{
    if(_muteControl)
        return;
    _radY -= rad;
    _dir = point(0,0,1).rotY(_radY);
    if (_radZ > -pi/4)
        _radZ -= pi/20;
    _muteZ = true;
}

void fly::turnRight(float rad)
{
    if(_muteControl)
        return;
    _radY += rad;
    _dir = point(0,0,1).rotY(_radY);
    if (_radZ < pi/4)
        _radZ += pi/20;
    _muteZ = true;
}

//monté
void fly::climb(float h)
{
    if(_muteControl)
        return;
    _pos = _pos - point(0,h,0);
    if (_radX < pi/8)
        _radX += pi/40;
    _muteX = true;
}

//descendre
void fly::descent(float h)
{
    if(_muteControl)
        return;
    _pos = _pos + point(0,h,0);
    if (_radX > -pi/8)
        _radX -= pi/40;
    _muteX = true;
}

bullet fly::shoot(const shell& Model)
{
    _cooldown -= 10;
    bullet tmp(Model);
    tmp.setRad(_radX, _radY, _radZ);
    tmp.setPos(_pos + _dir);
    tmp.setSpeed(-0.3);
    tmp.setExpire(30);
    return tmp;
}

void fly::boost(float power)
{
    if(_muteControl)
        return;
    if (cool())
        _speed = 0.15;
    _cooldown = 0;
}

void fly::damage()
{
    if (_health)
        _health--;
}

bool fly::cool()const
{
    return _cooldown>=30 && !_muteControl;
}

float fly::speed()const
{
    return _speed;
}

bool fly::health()const
{
    return _health;
}

