//--------------------------------------------------------------------------------------
// Copyright (C) 2008 http://shift.delblanco.es
//--------------------------------------------------------------------------------------
// SHIFT Videogame is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by the
// Free Software Foundation, either version 3 of the License, or later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
//--------------------------------------------------------------------------------------
/// \file 3DObjWeapon.h
/// Para manejar las armas del vehículo.
/// Este módulo ofrece un tratamiento específico a los objetos de tipo arma
//--------------------------------------------------------------------------------------
#pragma once
#ifndef __C3DOBJWEAPON_H__
#define __C3DOBJWEAPON_H__

//--------------------------------------------------------------------------------------
// Ficheros de cabecera
//--------------------------------------------------------------------------------------
#include "3DObject.h"
#include "3DObjVehicle.h"

//--------------------------------------------------------------------------------------
// Constantes
//--------------------------------------------------------------------------------------
// Tipos de armas
#define     OBJWEAPON_ROCKET			1
// Estados del arma
#define     OBJWEAPON_FREE				1
#define     OBJWEAPON_LAUNCH			2
#define     OBJWEAPON_COLLISION			3

//--------------------------------------------------------------------------------------
/// Clase hija de C3DObject para para manejar las armas del vehículo
//--------------------------------------------------------------------------------------
class C3DObjWeapon : public C3DObject
{

private:  // Campos miembro

    C3DObjVehicle					*m_pVehicle;          ///< Vehículo asociado a este arma
	int								m_pType;			  ///< Tipo de arma del vehículo
	int								m_pState;			  ///< Indica si el arma está libre, lanzado o colisionado
	float							m_pDelay;			  ///< Tiempo desde que colisionó el arma

    C3DSound                        *m_pSndLaunch;        ///< Sonido del lanzamiento
    C3DSound                        *m_pSndCrash;         ///< Sonido de la colisión
    C3DSound                        *m_pSndEmpty;         ///< Sonido de vacío

public: // Métodos públicos

    /// Constructor
    C3DObjWeapon();
    /// Destructor
    ~C3DObjWeapon();

    /// Inicializa el arma del vehículo
    bool initialize(C3DObjVehicle *Vehicle, LPCWSTR ObjectPath, int Type);
    /// Actualiza el arma del vehículo
    void update();

    /// Función para cambiar el estado de procesamiento del arma, activado/desactivado
    void setEnabled(bool enabled);

    /// Función observadora del tipo de arma
    int getType(void)							{return m_pType;}
    /// Función observadora del estado del arma
    int getState(void)							{return m_pState;}

    /// Para activar el sonido de lanzamiento del arma
    void playLaunch(bool loop, long volume = 0, long frecuency = 0);
    /// Para saber si está activo el sonido de lanzamiento del arma
	bool isPlayLaunch(bool)						{return (m_pSndLaunch && m_pSndLaunch->isPlaying());}
    /// Para desactivar el sonido de lanzamiento del arma
	void stopLaunch(void)						{if(m_pSndLaunch) m_pSndLaunch->Stop();}
    /// Para activar el sonido de colisiones del arma
    void playCrash(bool loop, long volume = 0, long frecuency = 0);
    /// Para saber si está activo el sonido de colisiones del arma
	bool isPlayCrash(bool)						{return (m_pSndCrash && m_pSndCrash->isPlaying());}
    /// Para desactivar el sonido de colisiones del arma
	void stopCrash(void)						{if(m_pSndCrash) m_pSndCrash->Stop();}
    /// Para activar el sonido de vacío del arma
    void playEmpty(bool loop, long volume = 0, long frecuency = 0);
    /// Para saber si está activo el sonido de vacío del arma
	bool isPlayEmpty(bool)						{return (m_pSndEmpty && m_pSndEmpty->isPlaying());}
    /// Para desactivar el sonido de vacío del arma
	void stopEmpty(void)						{if(m_pSndEmpty) m_pSndEmpty->Stop();}

	/// Manejador de colisión básica
	bool onQuickCollision(C3DObject *object);
	/// Manejador de colisión completa
	bool onFullCollision(C3DObject *object);
};

#endif
