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

//--------------------------------------------------------------------------------------
// Ficheros de cabecera
//--------------------------------------------------------------------------------------
#include "3DObject.h"
#include <vector>
#include <list>
class C3DObjElement;

//--------------------------------------------------------------------------------------
// Constantes
//--------------------------------------------------------------------------------------
/// Directorio dónde se deben buscar los ficheros descriptivos de las arenas del juego
#define     OBJARENA_DIR             L".\\models\\arenas\\"
/// Número máximo de entradas en el ranking
#define     OBJARENA_NUM_RANK        4
/// Tamaño máximo del ranking de la arena
#define     OBJARENA_MAX_RANKTXT    (MAX_STRING*OBJARENA_NUM_RANK)

//--------------------------------------------------------------------------------------
/// Estructura para mantener la información del ranking de mejores tiempos de la arena
//--------------------------------------------------------------------------------------
struct Rank
{
    WCHAR m_Player[MAX_STRING+1];		///< Nombre del jugador
    WCHAR m_Vehicle[MAX_STRING+1];		///< Nombre del vehículo
	float m_Time;						///< Tiempo en el que ha realizado la arena
	// Operación menor estricto (por defecto para para ordenaciones)
	bool operator<(const Rank &y) const {
		return m_Time < y.m_Time;
	}
};

//--------------------------------------------------------------------------------------
/// Clase hija de C3DObject para para manejar las arenas de la escena.
//--------------------------------------------------------------------------------------
class C3DObjArena : public C3DObject
{

private:  // Campos miembro

    LPWSTR                          m_awName;             ///< Nombre de la arena
    LPWSTR                          m_awDescription;      ///< Descripción textual de la arena
    LPWSTR                          m_awRankFile;         ///< Ruta del fichero de rankings
    LPWSTR                          m_awRankTxt;          ///< Texto del ranking

    C3DObject                       *m_pSky;              ///< Puntero al cielo de la arena

    C3DObjElement                   *m_pObjetive;         ///< Puntero al elemento objetivo
    C3DObjElement                   *m_pRand;             ///< Puntero al elemento interrogación
    C3DObjElement                   *m_pHealth;           ///< Puntero al elemento de vida
    C3DObjElement                   *m_pRocket;           ///< Puntero al elemento cohete
    C3DObjElement                   *m_pMine;             ///< Puntero al elemento mina

	std::vector<D3DXVECTOR3>		m_pPositions;		  ///< Lista de posibles ubicaciones para los elementos
	int								m_pPosObjective;      ///< Última posición del objetivo
	int								m_pPosElement;        ///< Última posición del elemento

	float							m_pNumObj;			  ///< Número de objetivos a capturar
	float							m_pTimeIni;			  ///< Tiempo inicial para la arena
	float							m_pTimeObj;			  ///< Tiempo por objetivo capturado
	float							m_pSize;			  ///< Tamaño de la arena

	std::list<Rank>					m_pRanking;           ///< Ranking de mejores tiempos de la arena

public: // Métodos públicos

    /// Constructor
    C3DObjArena();
    /// Destructor
    ~C3DObjArena();

    /// Inicializa la arena
    bool initialize(C3DObject *dParent, LPCWSTR ObjectPath);
    /// Actualiza la arena
    void update();
    /// Renderiza la arena
    void render();

    /// Carga el fichero de ranking
    bool loadRanking(void);
    /// Guarda el fichero de ranking
    bool saveRanking(void);
    /// Añade un elemento al ranking
    void addRanking(Rank &R);

    /// Función observadora del nombre de la arena
    LPWSTR getName(void)                {return m_awName;}
    /// Función observadora de la descripción de la arena
    LPWSTR getDescription(void)         {return m_awDescription;}
    /// Función observadora del texto de ranking
    LPWSTR getRankTxt(void);

	// Función observadora del número de objetivos a capturar
	float getNumObj(void)				{return m_pNumObj;}
	// Función observadora del tiempo inicial para la arena
	float getTimeIni(void)				{return m_pTimeIni;}
	// Función observadora del tiempo por objetivo capturado
	float getTimeObj(void)				{return m_pTimeObj;}
	// Función observadora del tamaño de la arena
	float getSize(void)					{return m_pSize;}

    /// Función observadora del cielo de la arena
    C3DObject *getSky(void)             {return m_pSky;}

    /// Toma la siguiente posición para el objetivo
    void getPosObjective(D3DXVECTOR3 &Vec);
    /// Toma la siguiente posición para elementos
    void getPosElement(D3DXVECTOR3 &Vec);
    /// Situa el siguiente objetivo
	void nextObjective(void);
    /// Situa el siguiente elemento
	void nextElement(void);

    /// Función observadora del elemento objetivo de la arena
    C3DObjElement *getObjetive(void)    {return m_pObjetive;}
    /// Función observadora del elemento interrogación de la arena
    C3DObjElement *getRand(void)        {return m_pRand;}
    /// Función observadora del elemento de vida de la arena
    C3DObjElement *getHealth(void)      {return m_pHealth;}
    /// Función observadora del elemento cohete de la arena
    C3DObjElement *getRocket(void)      {return m_pRocket;}
    /// Función observadora del elemento mina de la arena
    C3DObjElement *getMine(void)        {return m_pMine;}

};

#endif
