/* ==========================================================================
* 파    일 : Party.h
* 목    적 : 
* 작 성 자 : 김가람
* 작 성 일 : 2007-11-05
* 주의사항 :
*===========================================================================*/
#pragma once
#include "Party_Common.h"

const int MAX_PARTY = 6;
const float PARTY_RANGE = 4000; // 40M

class cParty
{
public:
	cParty();
	~cParty();

	/// 메모리풀을 이용하므로 new, delete 오버로딩
	void* operator new( size_t n );
	void operator delete( void* ptr, size_t n );

	void SetIndex( unsigned long index );
	void SetLevel( unsigned char level );
	void SetDivideType( PARTY_DIVIDE_TYPE type );

	unsigned long* GetUserArr();
	unsigned int   GetCount();

	bool IsUser( unsigned long userIdx );
	bool AddUser( unsigned long userIdx );
	bool DeleteUser( unsigned long userIdx );

	void SetLeader( unsigned long userIdx );
	unsigned long GetLeader();

	/// [순서분배]의 유저인덱스 획득
	unsigned long GetTurnUser( unsigned short mapNumber, float x, float y );

	/// [랜덤분배]의 유저인덱스 획득
	unsigned long GetRandomUser( unsigned short mapNumber, float x, float y );

	void SetOwnUserNum( unsigned int num );
	unsigned int GetOwnUserNum();

	unsigned long GetIndex();
	PARTY_DIVIDE_TYPE	GetDivideType();
	unsigned char GetLevel();

	/// 경험치 drop 처리
	void AddDropValue( unsigned long maxHP, unsigned long damage, float money, float exp, float sxp );
	/// 건을 만족하는 파티원 중 모두에게 드롭 수치 분배
	void DivideDropValue( unsigned long monsterIdx, unsigned char monsterLevel );

	/// 갱신 시간 저장
	void SetLastAccumTime( unsigned long accumTime ) { mLastAccumTime = accumTime; }
	unsigned long GetLastAccumTime() { return mLastAccumTime; }

private:
	/// 파티 인덱스
	unsigned long mIndex;

	/// 파티 분배방식
	PARTY_DIVIDE_TYPE mDivideType;

	/// 파티 레벨
	unsigned char mLevel;

	/// 파티유저 인덱스
	unsigned long mUserArr[MAX_PARTY];

	/// 파티인원수
	unsigned int mCount;

	/// 파티장 인덱스
	unsigned long mLeaderIndex;

	/// 아이템 소유권 유저 배열 번호
	int mOwnUserNum;

	/// 파티에 drop된 money
	float mDropMoney;
	float mDropExp;
	float mDropSxp;

	/// 드롭보상할 몬스터의 최대 hp
	unsigned long mMonsterMaxHP;
	/// 몬스터가 받은 데미지
	unsigned long mDamage;

	/// 파티 갱신 시간
	unsigned long mLastAccumTime;
};

inline void cParty::SetLeader( unsigned long userIdx )
{
	mLeaderIndex = userIdx;
}

inline unsigned long cParty::GetLeader()
{
	return mLeaderIndex;
}

inline unsigned long* cParty::GetUserArr()
{
	return mUserArr;
}

inline unsigned int cParty::GetCount()
{
	return mCount;
}

inline void cParty::SetIndex( unsigned long index )
{
	mIndex = index;
}

inline void cParty::SetLevel( unsigned char level )
{
	mLevel = level;
}

inline void cParty::SetDivideType( PARTY_DIVIDE_TYPE type )
{
	mDivideType = type;
}

inline unsigned long cParty::GetIndex()
{
	return mIndex;
}

inline PARTY_DIVIDE_TYPE cParty::GetDivideType()
{
	return mDivideType;
}

inline unsigned char cParty::GetLevel()
{
	return mLevel;
}

inline void cParty::SetOwnUserNum( unsigned int num )
{
	mOwnUserNum = num;
}

inline unsigned int cParty::GetOwnUserNum()
{
	return mOwnUserNum;
}
