/* ==========================================================================
* 파    일 : GuildManager.h
* 목    적 : 
* 작 성 자 : 김가람
* 작 성 일 : 2008-10-31
* 주의사항 :
*===========================================================================*/
#include "BaseStage.h"
#include "Guild_Common.h"

#define REGIST_GUILDMARK	"./GuildMark/mark.tga"

typedef struct tgaTARGAFILEHEADER
{
	unsigned char imageIDLength;		/// 식별 필드의 길이	: 0 이면 식별필드 포함안됨
	unsigned char colorMapType;			/// 색상 맵의 종류		: 항상 0임
	unsigned char imageTypeCode;		/// 2 : 압축안된 RGB, 3 : 압축안된 그레이 스케일

	short int colorMapOrigin;			/// 색상 맵의 시작위치	: 항상 0임
	short int colorMapLength;			/// 색상 맵의 길이		: 항상 0임
	unsigned char colorMapEntrySize;	/// 색상 맵의 항목크기  : 항상 0임
	short int imageXOrigin;				/// 이미지 우측 하단 x 좌표 : 항상 0임
	short int imageYOrigin;				/// 이미지 좌측 하단 y 좌표
	short int imageWidth;				/// 이미지의 픽셀 단위 너비
	short int imageHeight;				/// 이미지의 픽셀 단위 높이
	unsigned char bitCount;				/// 색상 비트수 
	unsigned char imageDescriptor;		/// 24비트 : 0x00, 32비트 : 0x08

} TARGAFILEHEADER;

const unsigned long GUILD_WAIT_TIME = 10000;		// 길드초대 지속시간

struct MSG_RES_NPC_GUILD_CREATE;

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

	void Close();
	
	///
	bool CheckCreate( unsigned long npcIdx );				/// 길드생성 가능 여부 검사
	bool GuildCreate();
	void GuildAdd( cStringT name );
	void GuildOut();
	void GuildCut( unsigned long characterIdx );
	void GuildDelete();
	void GuildGivePosition( unsigned long characterIdx, unsigned char position, unsigned char newPosition );
	void GuildNotice( LPCTSTR notice );
	void GuildMarkUpdate();

	void ResGuildCreate( MSG_RES_NPC_GUILD_CREATE* pmsg );

	///
	void NetworkMsgParser( char* msg );

	/// 직위의 텍스트 인덱스 가져오기
	LPCTSTR GetTextIndex( unsigned char position );

	void SetTempData( LPCTSTR name, unsigned long npcIdx );
	void ClearTempData();
	unsigned long GetMasterIndex() { return mGuildInfo.masterIndex; }
	wchar_t* GetGuildNotice() { return mGuildInfo.notice; }

public:
	static cGuildManager* mpSingleton;	
	static cGuildManager* GetSingleton();

protected:
	void Clear();
	void ClearUI();

	/// 길드 정보 시트 갱신
	void UpdateInfoSheet();

	/// 길드원 가입/탈퇴 에 의한 변경
	void UpdateInfoSheetByUser();

	/// 길드 공지 출력
	void UpdateNotice( bool sendChat = true );

	/// 길드윈도우 마크 등록
	void UpdateGuildMark();

	///
	void AddGuildUser( sGuildUserInfo* user );

public:
	/// 길드 마크 텍스쳐 뽑기
	NiTexture* LoadGuildMark( const cString& pathName, bool tempMark = false );

	/// 
	NiTexture* CheckGuildMark( unsigned long guildIndex, unsigned long markIndex );

	/// 길드마크 버퍼
	BYTE			mMarkBuffer[MARK_SIZE];

	/// 길드마크 맵( 마크인덱스, NiTexture*)
	typedef tPointerHashMap<unsigned long, void*> cGuildMarkMap;
	cGuildMarkMap	mGuildMarkMap;

	/// 길드마크 요청 정보( 길드인덱스, 마크인덱스)
	typedef tHashMap<unsigned long, unsigned long> cRequestMarkMap;
	cRequestMarkMap		mRequestMarkMap;

private:
	/// 길드 정보
	sGuildInfo		mGuildInfo;

	/// 길드 유저리스트 (sGuildUserInfo)
	typedef tPointerHashMap<unsigned long, void*> cGuildUserMap;
	cGuildUserMap	mGuildUserMap;

	/// 접속 인원 수
	unsigned long	mConnectCount;

	/// 길드이름 생성
	cStringT		mTempName;
	unsigned long	mTempNpcIndex;

	/// 추방유저 인덱스 임시 저장
	unsigned long	mTempCutPlayerIdx;

	/// 길드원 추가 유저명 저장
	cStringT		mTempAddName;
};

inline cGuildManager* cGuildManager::GetSingleton()
{
	return mpSingleton;
}

#define GUILDMAN cGuildManager::GetSingleton()

