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

#define	MAX_SPREAD_COUNT	13			/// 한 스프레드의 정보 최대 수
#define MAX_TAROT_COUNT		22			/// 한 덱의 카드 수
#define MAX_HAVESPREAD		5			/// 보유 최대 갯수

/// 페이지 정보
enum eNpcTarotPage
{
	eNPCPAGE_NONE = 0,
	eNPCPAGE_CHECK,
	eNPCPAGE_SELECT,
	eNPCPAGE_RESULT,
};

// 운세속성
enum eFortuneProp
{
	eFORTUNE_LOVE,	// 애정
	eFORTUNE_HEALTH,// 건강
	eFORTUNE_WORK,	// 직장
	eFORTUNE_MONEY,	// 재물
	eFORTUNE_LUCK,	// 행운

	eFORTUNE_NONE,
};

// 위치 속성
enum ePositionProp
{
	ePOS_FIRST,		// 첫번째
	ePOS_SECOND,	// 두번째
	ePOS_THIRD,		// 세번째

	ePOS_NONE,
};

struct sNpcSpreadParam
{
	int mImageIndex;		/// 이미지 인덱스
	short mX, mY;			/// 좌표
	short mFortuneProp;		/// 운세 속성
	short mPositionProp;	/// 위치 속성
	long mQuestionIdx;		/// 질문 인덱스
};

// npc 스프레드 속성
struct sNpcSpread
{
	sNpcSpreadParam		mParam[MAX_SPREAD_COUNT];	
	unsigned int		mCount;					/// 들어있는 스프레드 정보 갯수

	sNpcSpread()
	{
		memset( mParam, 0, sizeof(mParam) );
		mCount = 0;
	}
};

/// npc 타로카드
struct sNpcTarotCard
{
	//unsigned long	mCardIndex;
	unsigned int	mImageIndex;
	unsigned long	mStraightIdx;		/// 정방향 설명 인덱스 
	unsigned long	mInverseIdx;		/// 역방향 설명 인덱스	
	unsigned long	mCommnetIndex;		/// 해석 인덱스
};

// npc 타로카드 덱
struct sNpcTarotDeck
{
	unsigned long mCard[MAX_TAROT_COUNT];	/// 카드 인덱스

	sNpcTarotDeck()
	{
		memset( mCard, 0, sizeof(mCard) );
	}
};

// 타로카드 해석
struct sNpcTarotComment
{
	unsigned long mComment[5][3][2][3]; /// [운세속성][위치속성][방향][해석] = 해석번호

	sNpcTarotComment()
	{
		memset( mComment, 0, sizeof(mComment) );
	}
};

// NPC 타로 매니저
class cNpcTarotManager
{
public:
	cNpcTarotManager();
	~cNpcTarotManager();

	bool Init();
	void Clear();

	///
	void NpcTarotOpen( unsigned long deckIdx, unsigned long price, unsigned long* spreadArr, short size );
	void NpcTarotClose();
	void NpcTarotJoin();

	void NetworkMsgParser( char* msg );

	sNpcSpread* GetNpcSpread( unsigned long spreadIdx );
	sNpcTarotDeck* GetNpcTarotDeck( unsigned long deckIdx );
	sNpcTarotCard* GetNpcTarot( unsigned long cardIdx );
	sNpcTarotComment* GetNpcTarotComment( unsigned long commentIdx );

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

protected:
	bool LoadNpcSpread( const cString& path );
	bool LoadTarotDeck( const cString& path );
	bool LoadComment( const cString& path );

private:
	/// 스프레드 정보 (sNpcSpread)
	typedef tPointerHashMap<unsigned long, void*> cNpcSpreadMap;
	cNpcSpreadMap	mNpcSpreadMap;
         
	/// 카드 덱 정보 (sNpcTarotDeck)
	typedef tPointerHashMap<unsigned long, void*> cNpcDeckMap;
	cNpcDeckMap		mNpcDeckMap;

	/// 타로 카드 정보 (sNpcTarotCard)
	typedef tPointerHashMap<unsigned long, void*> cNpcTarotMap;
	cNpcTarotMap	mNpcTarotMap;

	/// 해석 정보 (sNpcTarotComment)
	typedef tPointerHashMap<unsigned long, void*> cNpcCommentMap;
	cNpcCommentMap		mNpcCommentMap;

	///// 가진 카드 덱
	//unsigned long mTarotIndex;

	///// 타로점집 요금
	//unsigned long mTarotPrice;

	///// 가진 스프레드 정보
	//unsigned int mSpreadCount;
	//unsigned long mSpreadIndex[MAX_HAVESPREAD];
};

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

#define NPCTAROTMAN cNpcTarotManager::GetSingleton()