#include "Hecto.h"

Hecto::Hecto()
:Shot( HECTO_DEGAT ), m_velocity( -HECTO_SPEED ), m_life( HECTO_DURABILTY )
{
    //ctor
}

Hecto::Hecto( Sint16 x, Sint16 y, bool ally )
:Shot( HECTO_DEGAT, x, y, ally ), m_velocity( HECTO_SPEED ), m_life( HECTO_DURABILTY )
{
    if ( ally )
        m_velocity = -m_velocity;
}

Hecto::~Hecto()
{
    //dtor
}

void Hecto::update()
{
    m_x += m_velocity;
}

void Hecto::draw( SDL_Surface* screen )
{
    if ( m_exist )
        stringRGBA(screen, m_x - 4, m_y - 4, "H", 128, m_life * 255 / HECTO_DURABILTY, 0, 255);
}

bool Hecto::damageSolid( Uint8** solid, const Uint16 dimH, const Uint16 dimW, const SDL_Rect& hitbox )
{
    // Déterminer les cordonnées de l'impact
    Uint16 yImpct( ( m_y - hitbox.y ) / 8 );
    Uint16 xImpct( ( m_x - hitbox.x ) / 8 );

    // Bloc présent ?
    if ( solid[yImpct][xImpct] == 0 )
        return false;

    // Déstruction du centre
    damageBloc( solid, dimH, dimW, yImpct, xImpct, 255 );

    // Forts dégats sur l'immédiat
    #define HECTO_NEAREST_BAM 200
    damageBloc( solid, dimH, dimW, yImpct - 1, xImpct, HECTO_NEAREST_BAM );
    damageBloc( solid, dimH, dimW, yImpct + 1, xImpct, HECTO_NEAREST_BAM );
    damageBloc( solid, dimH, dimW, yImpct, xImpct - 1, HECTO_NEAREST_BAM );
    damageBloc( solid, dimH, dimW, yImpct, xImpct + 1, HECTO_NEAREST_BAM );
    damageBloc( solid, dimH, dimW, yImpct - 1, xImpct - 1, HECTO_NEAREST_BAM );
    damageBloc( solid, dimH, dimW, yImpct + 1, xImpct - 1, HECTO_NEAREST_BAM );
    damageBloc( solid, dimH, dimW, yImpct - 1, xImpct + 1, HECTO_NEAREST_BAM );
    damageBloc( solid, dimH, dimW, yImpct + 1, xImpct + 1, HECTO_NEAREST_BAM );

    // Faibles dégats sur l'adjacent
    #define HECTO_FAR_BAM 60
    damageBloc( solid, dimH, dimW, yImpct - 2, xImpct, HECTO_FAR_BAM );
    damageBloc( solid, dimH, dimW, yImpct + 2, xImpct, HECTO_FAR_BAM );
    damageBloc( solid, dimH, dimW, yImpct, xImpct - 2, HECTO_FAR_BAM );
    damageBloc( solid, dimH, dimW, yImpct, xImpct + 2, HECTO_FAR_BAM );

    // Déstruction du projectile
    m_life-- ;
    if ( m_life == 0 )
        m_exist = false;

    return true;
}