/*
 * DoDX 
 * Copyright (c) 2004 Lukasz Wlasinski
 *
 *
 *    This program 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 2 of the License, or (at
 *    your option) any 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.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software Foundation,
 *    Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *    In addition, as a special exception, the author gives permission to
 *    link the code of this program with the Half-Life Game Engine ("HL
 *    Engine") and Modified Game Libraries ("MODs") developed by Valve,
 *    L.L.C ("Valve").  You must obey the GNU General Public License in all
 *    respects for all of the code used other than the HL Engine and MODs
 *    from Valve.  If you modify this file, you may extend this exception
 *    to your version of the file, but you are not obligated to do so.  If
 *    you do not wish to do so, delete this exception statement from your
 *    version.
 *
 */

#ifndef CMISC_H
#define CMISC_H

#include "CRank.h"

#define DODMAX_CUSTOMWPNS	5	// custom weapons
#define DODMAX_WEAPONS		42 + DODMAX_CUSTOMWPNS

#ifndef __linux__
#define LINUXOFFSET	0
#else
#define LINUXOFFSET	5
#endif

#define DOD_VERSION "0.1"

#define MAX_TRACE	6

struct traceVault {
	char szName[16];
	int iId;
	int iAction;
	float fDel;
};

#define ACT_NADE_NONE		0
#define ACT_NADE_SHOT		1<<0
#define ACT_NADE_PUT		1<<1
#define ACT_NADE_THROW		1<<2


// *****************************************************
// class CPlayer
// *****************************************************

class CPlayer {
private:
	char ip[32];
public:
	edict_t* pEdict;
	int index;
	int aiming;
	int current;
	int wpnModel;

	float savedScore;
	int lastScore;
	int sendScore;

	bool ingame;
	bool bot;
	float clearStats;
	float clearRound;

	struct PlayerWeapon : public Stats {
		char*		name;
		int			ammo;
		int			clip;
	};

	PlayerWeapon	weapons[DODMAX_WEAPONS];
	PlayerWeapon	attackers[33];
	PlayerWeapon	victims[33];
	Stats			weaponsLife[DODMAX_WEAPONS]; // DEC-Weapon (Life) stats
	Stats			weaponsRnd[DODMAX_WEAPONS]; // DEC-Weapon (Round) stats
	Stats			life;
	Stats			round;

	RankSystem::RankStats*	rank;

	void Init(  int pi, edict_t* pe );
	void Connect(const char* name,const char* ip );
	void PutInServer();
	void Disconnect();
	void saveKill(CPlayer* pVictim, int weapon, int hs, int tk);
	void saveHit(CPlayer* pVictim, int weapon, int damage, int aiming);
	void saveShot(int weapon);
	void updateScore(int weapon, int score);
	void restartStats(bool all = true);
	void killPlayer();

	inline bool IsBot(){
		const char* auth= (*g_engfuncs.pfnGetPlayerAuthId)(pEdict);
		return ( auth && !strcmp( auth , "BOT" ) );
	}
	inline bool IsAlive(){
		return ((pEdict->v.deadflag==DEAD_NO)&&(pEdict->v.health>0));
	}
};

// *****************************************************
// class Grenades
// *****************************************************

class Grenades
{
  struct Obj 
  {
    CPlayer* player;
    edict_t* grenade;
    float time;
    int type;
    Obj* next;
  } *head;


public:
  Grenades() { head = 0; }
  ~Grenades() { clear(); }
  void put( edict_t* grenade, float time, int type, CPlayer* player  );
  bool find( edict_t* enemy, CPlayer** p, int& type );
  void clear();
};

// *****************************************************
// class CMapInfo
// *****************************************************

class CMapInfo
{
public:
	edict_t* pEdict;
	bool initialized;

	int detect_axis_paras;
	int detect_allies_paras;
	int detect_allies_country;

	void Init();
};

#endif // CMISC_H