//--------------------------------------------------------------------------------------
// 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 3DObjElement.h
/// Para manejar los elementos de la arena.
/// Este módulo ofrece un tratamiento específico a los objetos de tipo elemento
//--------------------------------------------------------------------------------------
#pragma once
#ifndef __C3DOBJELEMENT_H__
#define __C3DOBJELEMENT_H__

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

//--------------------------------------------------------------------------------------
// Constantes
//--------------------------------------------------------------------------------------
// Tipos de elementos
#define     OBJELEMENT_OBJECTIVE		1
#define     OBJELEMENT_RAND				2
#define     OBJELEMENT_HEALTH			3
#define     OBJELEMENT_ROCKET			4
// Estados del elemento
#define     OBJELEMENT_FREE				1
#define     OBJELEMENT_LAUNCH			2
#define     OBJELEMENT_PRECOLLISION		3
#define     OBJELEMENT_COLLISION		4

//--------------------------------------------------------------------------------------
/// Clase hija de C3DObject para para manejar los elementos de la arena
//--------------------------------------------------------------------------------------
class C3DObjElement : public C3DObject
{

private:  // Campos miembro

    C3DObjArena						*m_pArena;            ///< Arena asociada a este elemento
	int								m_pType;			  ///< Tipo de elemento de la arena
	int								m_pState;			  ///< Indica si el elemento está libre, lanzado o colisionado
	float							m_pDelay;			  ///< Tiempo desde que colisionó el elemento

    C3DSound                        *m_pSndAppear;        ///< Sonido del aparición
    C3DSound                        *m_pSndGet;           ///< Sonido del captura

public: // Métodos públicos

    /// Constructor
    C3DObjElement();
    /// Destructor
    ~C3DObjElement();

    /// Inicializa el elemento de la arena
    bool initialize(C3DObjArena *Arena, LPCWSTR ObjectPath, int Type);
    /// Actualiza el elemento de la arena
    void update();

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

    /// Función observadora del tipo de elemento
    int getType(void)							{return m_pType;}
    /// Función observadora del estado del elemento
    int getState(void)							{return m_pState;}
    /// Función para cambiar el estado del elemento
    void setState(int dState)					{m_pState = dState;}

    /// Para activar el sonido de aparición del elemento
    void playAppear(bool loop, long volume = 0, long frecuency = 0);
    /// Para saber si está activo el sonido de aparición del elemento
	bool isPlayAppear(bool)						{return (m_pSndAppear && m_pSndAppear->isPlaying());}
    /// Para desactivar el sonido de aparición del elemento
	void stopAppear(void)						{if(m_pSndAppear) m_pSndAppear->Stop();}
    /// Para activar el sonido de captura del elemento
    void playGet(bool loop, long volume = 0, long frecuency = 0);
    /// Para saber si está activo el sonido de captura del elemento
	bool isPlayGet(bool)						{return (m_pSndGet && m_pSndGet->isPlaying());}
    /// Para desactivar el sonido de captura del elemento
	void stopGet(void)							{if(m_pSndGet) m_pSndGet->Stop();}

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

#endif
