//--------------------------------------------------------------------------------------
// 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 Player.h
/// Para manejar los jugadores de la escena.
/// Cada jugador tiene asociado un vehículo. 
/// Este módulo implementa todas las operaciones para gestionar los jugadores
//--------------------------------------------------------------------------------------
#pragma once
#ifndef __CPLAYER_H__
#define __CPLAYER_H__

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

//--------------------------------------------------------------------------------------
// Constantes
//--------------------------------------------------------------------------------------
// Acciones de manejo del vehículo por el jugador
#define     PLAYER_ACTION_END_RELEASE       0
#define     PLAYER_ACTION_RELEASE           1
#define     PLAYER_ACTION_PRESS             2

// Otras constantes
#define     PLAYER_MAX_SEC_HEALTH			2.5f  ///< Máxima pérdida de vida por segundo permitida

//--------------------------------------------------------------------------------------
/// Clase base para manejar los jugadores de la escena
//--------------------------------------------------------------------------------------
class CPlayer
{

protected:  // Campos miembro

    bool                            m_bInit;              ///< Flag que indica si el objeto está inicializado
    LPWSTR                          m_awName;             ///< Nombre del jugador
    C3DObjVehicle                   *m_pVehicle;          ///< Puntero al vehículo del jugador
    C3DObjArena                     *m_pArena;            ///< Puntero a la arena de juego

	float							m_pOriFriction;		  ///< Fricción original del vehículo

    int                             m_iStateUp;           ///< Flag que indica el estado de la orden de UP
    int                             m_iStateDown;         ///< Flag que indica el estado de la orden de DOWN
    int                             m_iStateRight;        ///< Flag que indica el estado de la orden de RIGHT
    int                             m_iStateLeft;         ///< Flag que indica el estado de la orden de LEFT
    int                             m_iStateHandBrake;    ///< Flag que indica el estado de la orden de HANDBRAKE
    int                             m_iStateMine;         ///< Flag que indica el estado de la orden de MINE
    int                             m_iStateRocket;       ///< Flag que indica el estado de la orden de ROCKET

    int                             m_bUp;                ///< Flag que refleja la orden de UP
    int                             m_bDown;              ///< Flag que refleja la orden de DOWN
    int                             m_bRight;             ///< Flag que refleja la orden de RIGHT
    int                             m_bLeft;              ///< Flag que refleja la orden de LEFT
    int                             m_bHandBrake;         ///< Flag que refleja la orden de HANDBRAKE
    int                             m_bMine;              ///< Flag que refleja la orden de MINE
    int                             m_bRocket;            ///< Flag que refleja la orden de ROCKET

    float                           m_pHealth;            ///< Vida actual del jugador
    float                           m_pRockets;           ///< Número de cohetes actuales del jugador
    float                           m_pMines;             ///< Número de minas actuales del jugador
	float							m_pObjectives;		  ///< Número de objetos actuales del jugador

	float							m_pLastHealth;		  ///< Última vida del jugador
	float							m_pLastRockets;		  ///< Último número de cohetes del jugador
	float							m_pLastMines;		  ///< Último número de minas del jugador
	float							m_pLastObjectives;	  ///< Último número de objetivos del jugador

	float							m_pHealthSecond;      ///< Vida perdida durante el último segundo

    /// Actualiza el jugador tras la pulsación de la orden UP
    void pressUp();
    /// Actualiza el jugador tras la liberación de la orden UP
    void releaseUp();

    /// Actualiza el jugador tras la pulsación de la orden DOWN
    void pressDown();
    /// Actualiza el jugador tras la liberación de la orden DOWN
    void releaseDown();

    /// Actualiza el jugador tras la pulsación de la orden RIGHT
    void pressRight();
    /// Actualiza el jugador tras la liberación de la orden RIGHT
    void releaseRight();

    /// Actualiza el jugador tras la pulsación de la orden LEFT
    void pressLeft();
    /// Actualiza el jugador tras la liberación de la orden LEFT
    void releaseLeft();

    /// Actualiza el jugador tras la pulsación de la orden HANDBRAKE
    void pressHandBrake();
    /// Actualiza el jugador tras la liberación de la orden HANDBRAKE
    void releaseHandBrake();

    /// Actualiza el jugador tras la pulsación de la orden MINE
    void pressMine();
    /// Actualiza el jugador tras la liberación de la orden MINE
    void releaseMine();

    /// Actualiza el jugador tras la pulsación de la orden ROCKET
    void pressRocket();
    /// Actualiza el jugador tras la liberación de la orden ROCKET
    void releaseRocket();

public: // Métodos públicos

    /// Constructor
    CPlayer();
    /// Destructor
    ~CPlayer();

    /// Inicializa el jugador
    bool initialize(LPCWSTR dName, LPCWSTR dPathVehicle, C3DObject *dParent);
    /// Renderiza el jugador
    void render();
    /// Actualiza el jugador
    void update();
    /// Libera los datos del jugador
    void Release();

	/// Función observadora de la vida actual del jugador
    float getHealth(void)				{return m_pHealth;}
    /// Función para establecer la vida actual del jugador
    void setHealth(float val)			{m_pHealth = val;}
    /// Función observadora del número de cohetes actuales del jugador
    float getRockets(void)				{return m_pRockets;}
    /// Función para establecer un número de cohetes actuales del jugador
    void setRockets(float val)			{m_pRockets = val;}
    /// Función observadora del número de minas actuales del jugador
    float getMines(void)				{return m_pMines;}
    /// Función para establecer un número de minas actuales del jugador
    void setMines(float val)			{m_pMines = val;}
	/// Función observadora de los objetivos del jugador
    float getObjectives(void)			{return m_pObjectives;}
    /// Función para establecer los objetivos del jugador
    void setObjectives(float val)		{m_pObjectives = val;}

	/// Función para saber si en la última iteración cambió la vida del jugador
    bool changedHealth(void)			{return (m_pLastHealth!=m_pHealth);}
    /// Función para saber si en la última iteración cambió el número de cohetes del jugador
    bool changedRockets(void)			{return (m_pLastRockets!=m_pRockets);}
    /// Función para saber si en la última iteración cambió el número de minas del jugador
    bool changedMines(void)				{return (m_pLastMines!=m_pMines);}
	/// Función para saber si en la última iteración cambió el número de objetivos del jugador
    bool changedObjectives(void)		{return (m_pLastObjectives!=m_pObjectives);}

	/// Función observadora de la vida perdida durante el último segundo
    float getHealthSecond(void)			{return m_pHealthSecond;}
    /// Función para reiniciar la vida perdida durante el último segundo
    void setHealthSecond(float val)		{m_pHealthSecond = val;}

    /// Función observadora del vehículo del jugador
    C3DObjVehicle *getVehicle(void)     {return m_pVehicle;}
};

#endif
