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

#include "Skill_Common.h"

#pragma pack(push,1)
#include "CommonDefines.h"
#include "CommonNetworkMsgStruct.h"

/*-- 파티 가입권유
*/
#define ERROR_PARTY_ADD_SUCCESS			0	// 성공 - 파티신청 성공
#define ERROR_PARTY_ADD_CREATE_SUCCESS	1	// 성공 - 파티생성됨

#define ERROR_PARTY_ADD_STATUS			2	// 실패 - 신청할수 없는 상태
#define ERROR_PARTY_ADD_COMPLETE		3	// 실패 - 해당유저가 파티 가입중
#define ERROR_PARTY_ADD_CONTINUE		4	// 실패 - 자기자신이 초대중인 유저가 있으므로 초대불가.
#define ERROR_PARTY_ADD_USER			5	// 실패 - 초대한캐릭터 없음.
#define ERROR_PARTY_ADD_COUNT			6	// 실패 - 파티인원 풀
#define ERROR_PARTY_ADD_REFUSE			7	// 실패 - 파티초대 거절
#define ERROR_PARTY_ADD_NOTLEADER		8	// 실패 - 권한없음
#define ERROR_PARTY_ADD_USEROUT			9	// 실패 - 초대한 유저가 게임종료함
#define ERROR_PARTY_ADD_MAP				10	// 실패 - 초대한 유저가 맵이동중
#define ERROR_PARTY_ADD_CREATEFAIL		11	// 실패 - 파티 생성 실패
#define ERROR_PARTY_ADD_OPTIONREFUSE	12	// 실패 - 거부 상태
#define ERROR_PARTY_ADD_FAIL			13	// 실패 - 신청 실패

struct MSG_REQ_PARTY_ADD : MSGROOT 
{
	wchar_t Name[MAX_NAME_BUFFER_SIZE];		/// 파티초대할 캐릭터 이름
};

struct MSG_RES_PARTY_ADD : MSG_ERROR
{};

struct MSG_SYN_PARTY_ADD : MSGROOT
{
	wchar_t Name[MAX_NAME_BUFFER_SIZE];		/// 파티초대한 캐릭터 이름
};


/*-- 파티 가입결과
*/
#define ERROR_PARTY_REP_SUCESS		0	// 성공 - 가입
#define ERROR_PARTY_REP_REFUSE		1	// 성공 - 초대 거절
#define ERROR_PARTY_REP_FULL		2	// 실패 - 파티 풀
#define ERROR_PARTY_REP_FAIL		3	// 실패 - 존재하지 않음

struct MSG_REQ_PARTY_REP : MSGROOT 
{
	char	Reply;					/// 0 : 거절 1: 수락
};
struct MSG_RES_PARTY_REP : MSG_ERROR
{};


/*-- 파티 정보 리스트
*/
enum ePLAYER_JOB;
enum PARTY_DIVIDE_TYPE
{
	PARTY_DIVIDE_NONE = 0,
	PARTY_DIVIDE_TURN,		/// 순서대로
	PARTY_DIVIDE_RANDOM,	/// 랜덤
	PARTY_DIVIDE_DAMAGE,	/// 데미지
	PARTY_DIVIDE_FREE,		/// 자유분배 (획득권한자유)
};

/// 파티 정보 및 파티원 리스트
struct MSG_SYN_PARTY_LIST : MSGROOT
{
	unsigned long mIndex;				/// 파티 인덱스
	unsigned char mLevel;				/// 파티 레벨
	unsigned long mLeaderIndex;			/// 파티장 인덱스
	PARTY_DIVIDE_TYPE mDivideType;		/// 파티 분배방식

	long RowCount;				
	struct 
	{
		unsigned long	UserIndex;						/// 파티유저 인덱스
		wchar_t			Name[MAX_NAME_BUFFER_SIZE];		
		unsigned char	Level;
		ePLAYER_JOB		Job;
		unsigned int	MapNum;
		float			InitX;
		float			InitY;
		unsigned int	HP;
		unsigned int	MaxHP;
		unsigned int	MP;
		unsigned int	MaxMP;

	} party[1];
};

/// 파티원 1명 정보
struct MSG_SYN_PARTY_ADDONE : MSGROOT
{
	unsigned char	mPartyLevel;	

	unsigned long	UserIndex;	
	wchar_t			Name[MAX_NAME_BUFFER_SIZE];		
	unsigned char	Level;
	ePLAYER_JOB		Job;
	unsigned int	MapNum;	
	float			InitX;
	float			InitY;
	unsigned int	HP;
	unsigned int	MaxHP;
	unsigned int	MP;
	unsigned int	MaxMP;
};

/// 파티 탈퇴 요청
struct MSG_REQ_PARTY_OUT : MSGROOT
{};
struct MSG_RES_PARTY_OUT : MSGROOT
{};
struct MSG_SYN_PARTY_OUT : MSGROOT
{
	unsigned long UserIndex;		/// 파티탈퇴한 유저 인덱스
};

/// 파티 해산 ( 인원부족 )
struct MSG_SYN_PARTY_DELETE : MSGROOT
{};

/// 파티 강제 해체 
struct MSG_SYN_PARTY_BREAK : MSGROOT
{};

/*-- 파티장위임 결과
*/
#define ERROR_PARTY_CHANGELEADER_SUCESS		0	// 성공 - 가입
#define ERROR_PARTY_CHANGELEADER_LEADER		1	// 실패 - 권한 없음
#define ERROR_PARTY_CHANGELEADER_FAIL		2	// 실패

/// 파티장위임
struct MSG_REQ_PARTY_CHANGELEADER : MSGROOT
{
	unsigned long UserIndex;					/// 파티장으로 위임할 유저 인덱스
};
struct MSG_RES_PARTY_CHANGELEADER : MSG_ERROR
{};
struct MSG_SYN_PARTY_CHANGELEADER : MSGROOT
{
	unsigned long UserIndex;					/// 파티장이 된 유저 인덱스
};


/*-- 파티 분배타입 변경 결과
*/
#define ERROR_PARTY_CHANGEDIVIDE_SUCESS		0	// 성공 - 분배타입 
#define ERROR_PARTY_CHANGEDIVIDE_LEADER		1	// 실패 - 권한 없음
#define ERROR_PARTY_CHANGEDIVIDE_FAIL		2	// 실패

struct MSG_REQ_PARTY_CHANGEDIVIDE : MSGROOT
{
	PARTY_DIVIDE_TYPE	type;					/// 변경할 분배타입
};
struct MSG_RES_PARTY_CHAGNEDIVIDE : MSG_ERROR
{};
struct MSG_SYN_PARTY_CHANGEDIVDE : MSGROOT
{
	PARTY_DIVIDE_TYPE	type;					/// 변경된 분배타입
};	


/*-- 파티원 추방 요청결과
*/
#define ERROR_PARTY_THROW_SUCESS		0	// 성공 
#define ERROR_PARTY_THROW_LEADER		1	// 실패 - 권한 없음
#define ERROR_PARTY_THROW_FAIL			2	// 실패 - 추방 실패

struct MSG_REQ_PARTY_THROW : MSGROOT
{
	unsigned long UserIndex;					/// 추방하려는 유저 
};
struct MSG_RES_PARTY_THROW : MSG_ERROR 
{};
struct MSG_SYN_PARTY_THROW : MSGROOT
{
	unsigned long UserIndex;					/// 추방된 유저
};

/// 파티로부터 추방당함
struct MSG_SYN_PARTY_CUT : MSGROOT 
{};

/// 파티원 맵체인지
struct MSG_SYN_PARTY_MAPCHANGE : MSGROOT
{
	unsigned long UserIndex;					/// 이동한유저
	unsigned int  MapNum;						/// 맵번호
};

/// 파티원 정보 : 일정시간마다 쏨
struct MSG_SYN_PARTY_DATA : MSGROOT
{
	unsigned long userIndex;
	unsigned char level;
	unsigned int  maxHP;
	unsigned int  maxMP;
	unsigned int  hp;
	unsigned int  mp;
	float		  posX;							/// 좌표
	float		  posY;

	long				RowCount;	
	sInfluenceClient	mTable[1];				/// 보유효과 리스트
	unsigned long GetMsgLength() { return sizeof(MSG_SYN_PARTY_DATA) - sizeof(mTable) + (RowCount * sizeof(sInfluenceClient)); }
};

/// 파티원 아이템 획득
struct MSG_SYN_PARTY_ITEMGET : MSGROOT
{
	unsigned long UserIndex;					/// 파티원 인덱스

	long RowCount;
	unsigned long  ItemIndex[1];			/// 아이템
};

struct MSG_SYN_PARTY_CHANGEJOB : MSGROOT
{
	unsigned long userIndex;
	ePLAYER_JOB	  job;
};

#pragma pack(pop)

