/* ====================================================================
 * 파    일 :	
 * 목    적 :	
 * 작 성 자 :	곽철중
 * 작 성 일 :	2008.02.15
 * 주의사항 :	
 * =================================================================== */
#pragma once
#pragma pack(push,1)

#include "CommonDefines.h"
#include "CommonNetworkMsgStruct.h"
#include "Item_Common.h"

#define MAX_FRIEND          50
#define MAX_CHAT_SESSION    3

/*-- 일반채팅 패킷
*/
struct MSG_REQ_CHAT : public MSGROOT
{
	unsigned long emotionIdx;						// 표정 연출 번호
	short		  InventoryNumber;					// 인벤 링크 넘버
	wchar_t	Message[MAX_CHAT_BUFFER_SIZE];			// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_REQ_CHAT) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};

#define ERROR_CHAT_SUCCESS			0				// 성공
#define ERROR_CHAT_BLOCK			1				// 채팅 금지 적용중
#define ERROR_CHAT_FAIL				2				// 실패

struct MSG_RES_CHAT : public MSG_ERROR
{
	SYSTEMTIME validTrue;							// 유효만기
};

struct MSG_SYN_CHAT : public MSGROOT
{
	unsigned long CharacterIdx;						// 보낸 캐릭터 고유번호
	unsigned long emotionIdx;						// 표정 연출 번호

	sInventory	  inventory;						// 아이템 정보
	wchar_t       Name[MAX_NAME_BUFFER_SIZE];		// 보낸 캐릭터 이름
	wchar_t       Message[MAX_CHAT_BUFFER_SIZE];	// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_SYN_CHAT) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};


/*-- 외치기 패킷
*/
struct MSG_REQ_CHAT_SHOUT : public MSGROOT
{
	wchar_t	Message[MAX_CHAT_BUFFER_SIZE];			// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_REQ_CHAT_SHOUT) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};
struct MSG_SYN_CHAT_SHOUT : public MSGROOT
{
	unsigned long CharacterIdx;						// 보낸 플레이어 인덱스
	wchar_t       Name[MAX_NAME_BUFFER_SIZE];		// 보낸 플레이어 이름
	wchar_t       Message[MAX_CHAT_BUFFER_SIZE];	// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_SYN_CHAT_SHOUT) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};

/*-- 거래채팅 패킷
*/
struct MSG_REQ_CHAT_TRADE : public MSGROOT
{
	short			InventoryNumber;
	wchar_t			Message[MAX_CHAT_BUFFER_SIZE];

	/// 실제 보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_REQ_CHAT_TRADE) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};
struct MSG_SYN_CHAT_TRADE : public MSGROOT
{
	sInventory		inventory;
	wchar_t			Name[MAX_NAME_BUFFER_SIZE];
	wchar_t			Message[MAX_CHAT_BUFFER_SIZE];

	/// 실제 보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_SYN_CHAT_TRADE) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};

/*-- 귓속말(귀엣말) 패킷
*/
struct MSG_REQ_CHAT_WHISPER : public MSGROOT
{
	short			InventoryNumber;
	wchar_t			Name[MAX_NAME_BUFFER_SIZE];			// 받는 플레이어 이름
	wchar_t			Message[MAX_CHAT_BUFFER_SIZE];		// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_REQ_CHAT_WHISPER) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};

#define ERROR_CHAT_WHISPER_SUCCESS			0	// 성공
#define ERROR_CHAT_WHISPER_CHARACTER_NAME	1	// 존재하지 않는 캐릭터 이름
#define ERROR_CHAT_WHISPER_DISCONNECT		2	// 게임에 접속하고 있지 않음
#define ERROR_CHAT_WHISPER_NO_MESSAGE		3	// 메시지입력 없음
#define ERROR_CHAT_WHISPER_INPUT_TIME		4	// 메시지 입력시간이 짧음
#define ERROR_CHAT_WHISPER_MYSELF			5	// 자기자신에게 보내기
#define ERROR_CHAT_WHISPER_OPTIONREFUSE		6	// 상대방 옵션 거부 상태

struct MSG_RES_CHAT_WHISPER : public MSG_ERROR
{
	sInventory		inventory;
	wchar_t			Name[MAX_NAME_BUFFER_SIZE];			// 받는 플레이어 이름
	wchar_t			Message[MAX_CHAT_BUFFER_SIZE];		// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_RES_CHAT_WHISPER) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};
struct MSG_SYN_CHAT_WHISPER : public MSGROOT
{
	sInventory		inventory;
	wchar_t			Name[MAX_NAME_BUFFER_SIZE];			// 보낸 플레이어 이름
	wchar_t			Message[MAX_CHAT_BUFFER_SIZE];		// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_SYN_CHAT_WHISPER) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};


/*-- 쪽지 패킷 - 보내기/받기(전체)/삭제
*/
#define ERROR_CHAT_NOTE_SUCCESS			0	// 성공
#define ERROR_CHAT_NOTE_NOTEXIST		1	// 존재하지 않는 캐릭터
#define ERROR_CHAT_NOTE_OVER			2	// 보관갯수 초과
#define ERROR_CHAT_NOTE_OPTIONREFUSE	3	// 거부상태
#define ERROR_CHAT_NOTE_UNKNOWN			4	// 알수없는 오류
#define ERROR_CHAT_NOTE_GUILD			5	// 길드 아님

#define MAX_NOTE_MESSAGE_SIZE			100	// 쪽지 메시지 최대크기
#define MAX_NOTE_MESSAGE_BUFFER_SIZE	(MAX_NOTE_MESSAGE_SIZE + 1) // 쪽지 메시지 최대크기
#define MAX_NOTE_DELETE                 10
#define MAX_NOTE_COUNT					50	// 쪽지 최대 보관갯수

struct sNoteList
{
	long           Idx;                                     // 고유번호
	short          Year;									// 년
	unsigned short Month;									// 월
	unsigned short Day;										// 일
	unsigned short Hour;									// 시간
	unsigned short Minute;									// 분
	wchar_t        CharacterName[ MAX_NAME_BUFFER_SIZE ];	//	보낸 캐릭터이름
	wchar_t        Message[ MAX_NOTE_MESSAGE_BUFFER_SIZE ];	// 메시지
	unsigned long  RemainTime;								// 남은보관일(ms)
};

struct MSG_RES_NOTE_RECV : public MSGROOT
{
	long RowCount;												// 쪽지 갯수
	sNoteList table[1];
};

struct MSG_REQ_NOTE_SEND : public MSGROOT
{
	wchar_t	Name[MAX_NAME_BUFFER_SIZE];							// 받는 플레이어 이름
	wchar_t	Message[ MAX_NOTE_MESSAGE_BUFFER_SIZE ];			// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_REQ_NOTE_SEND) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};
struct MSG_RES_NOTE_SEND : public MSG_ERROR
{};

// 쪽지받음
struct MSG_SYN_NOTE_SEND : public MSGROOT
{
	sNoteList	table;											// 받은 쪽지
};

struct MSG_REQ_NOTE_DEL : public MSGROOT
{
	long RowCount;												// 삭제 갯수
	long Idx[MAX_NOTE_DELETE];									// 고유번호

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_REQ_NOTE_DEL) - sizeof(Idx) + (RowCount*sizeof(long)); }
};
struct MSG_RES_NOTE_DEL : public MSG_ERROR
{};


/*-- 친구 패킷 - 목록/추가/삭제/갱신
*/
#define ERROR_CHAT_FRIEND_SUCCESS			0					// 성공
#define ERROR_CHAT_FRIEND_CHARACTER_NAME	1					// 존재하지 않는 캐릭터 이름
#define ERROR_CHAT_FRIEND_OVER1				2					// 등록갯수 초과
#define ERROR_CHAT_FRIEND_OVER2				3					// 등록갯수 초과
#define ERROR_CHAT_FRIEND_UNKNOWN			4					// 알수없는 오류

struct MSG_REQ_FRIEND_LIST : public MSGROOT
{};
struct MSG_RES_FRIEND_LIST : public MSGROOT
{
	long RowCount;												// 영향받은 행 갯수
	struct
	{
		long			Idx;									// 고유번호
		unsigned long	CharacterIdx;							// 캐릭터 고유번호
		wchar_t			CharacterName[ MAX_NAME_BUFFER_SIZE ];	// 캐릭터 이름(친구)
		char            Race;									// 종족
		char            Gender;									// 성별
		char			Level;									// 레벨
		unsigned long	Job;									// 직업(ePLAYER_JOB)
		unsigned short	MapNum;									// 맵(위치)
		BYTE            GameIn;									// 접속상태(0접속안됨/1접속중)
		BYTE            Status;									// 친구상태(0등록완료/1등록신청)
	} table[1];
};
struct MSG_REQ_FRIEND_ADD : public MSGROOT
{
	wchar_t	Name[MAX_NAME_BUFFER_SIZE];							// 캐릭터 이름(친구)
};
struct MSG_RES_FRIEND_ADD : public MSG_ERROR
{};
struct MSG_REQ_FRIEND_DEL : public MSGROOT
{
	long Idx;													// 고유번호
};
struct MSG_REQ_FRIEND_REP : public MSGROOT
{
	long Idx;													// 고유번호
};


/*-- 파티 패킷
*/
struct MSG_REQ_CHAT_PARTY : public MSGROOT
{
	short	InventoryNumber;					// 인벤 링크 넘버
	wchar_t	Message[MAX_CHAT_BUFFER_SIZE];		// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_REQ_CHAT_PARTY) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};

struct MSG_SYN_CHAT_PARTY : public MSGROOT
{
	sInventory		inventory;							// 아이템 정보
    wchar_t			Name[MAX_NAME_BUFFER_SIZE];			// 보낸 플레이어 이름
	wchar_t			Message[MAX_CHAT_BUFFER_SIZE];		// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_SYN_CHAT_PARTY) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};

/*-- 길드 패킷
*/

struct MSG_REQ_CHAT_GUILD : public MSGROOT
{
	short	InventoryNumber;					// 인벤 링크 넘버
	wchar_t	Message[MAX_CHAT_BUFFER_SIZE];		// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_REQ_CHAT_GUILD) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};

struct MSG_SYN_CHAT_GUILD : public MSGROOT
{
	sInventory		inventory;							// 아이템 정보
	wchar_t			Name[MAX_NAME_BUFFER_SIZE];			// 보낸 플레이어 이름
	wchar_t			Message[MAX_CHAT_BUFFER_SIZE];		// 메세지

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_SYN_CHAT_GUILD) - sizeof(Message) + ::wcslen(Message)*sizeof(wchar_t); }
};


//////////////////////////////////////////////////////////
// GAME SYN
struct MSG_SYN_POSTCHAT_WHISPER : public MSGROOT
{
	sInventory		inventory;							// 인벤정보

	DWORD			sendChannelNum;						// 보낸 채널 번호
	DWORD			recvChannelNum;						// 받아야할 채널 번호
	unsigned long	senderIndex;						// 보낸 유저
	wchar_t			senderName[MAX_NAME_BUFFER_SIZE];	// 보낸 플레이어 이름
	wchar_t			recvName[MAX_NAME_BUFFER_SIZE];		// 받는 플레이어 이름
	wchar_t			message[MAX_CHAT_BUFFER_SIZE];		// 메세지
	
	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_SYN_POSTCHAT_WHISPER) - sizeof(message) + ::wcslen(message)*sizeof(wchar_t); }
};

struct MSG_SYN_POSTCHAT_WHISPERRESULT : public MSGROOT
{
	sInventory		inventory;							// 인벤정보
	int				error;								// 결과

	DWORD			recvChannelNum;						// 받아야할 채널 번호
	unsigned long	senderIndex;						// 보낸 유저
	wchar_t			recvName[MAX_NAME_BUFFER_SIZE];		// 받는 플레이어 이름
	wchar_t			message[MAX_CHAT_BUFFER_SIZE];		// 메세지
	
	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_SYN_POSTCHAT_WHISPERRESULT) - sizeof(message) + ::wcslen(message)*sizeof(wchar_t); }
};

#include "Guild_Common.h"
struct MSG_SYN_POSTCHAT_NOTESEND : public MSGROOT
{
	DWORD			recvChannelNum;						// 받아야할 채널 번호
	wchar_t			recvName[MAX_NAME_BUFFER_SIZE];		// 받는 플레이어 이름
	tbNOTE			table;								// 받은 쪽지
};
#pragma pack(pop)
