//--------------------------------------------------------------------------------------
// 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"

//--------------------------------------------------------------------------------------
// 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

//--------------------------------------------------------------------------------------
/// 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

	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_pRockets;           ///< Número de cohetes actuales del vehículo
    float                           m_pHealth;            ///< Vida actual del vehículo

    /// 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 del número de cohetes actuales del vehículo
    float getRockets(void)				{return m_pRockets;}
    /// Función para establecer un número de cohetes actuales del vehículo
    void setRockets(float val)			{m_pRockets = val;}
    /// Función observadora de la vida actual del vehículo
    float getHealth(void)				{return m_pHealth;}
    /// Función para establecer la vida actual del vehículo
    void setHealth(float val)			{m_pHealth = val;}

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

#endif
