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

/// 미니윈도우에서 맵 이미지가 시작되야하는 좌표 & 맵 이미지 적용될 사이즈 
const int MAP_X = 10;
const int MAP_Y = 34;
const int MAP_W = 150;
const int MAP_H = 150;

const float MAX_PERCENT = 50.f;
const float MIN_PERCENT = 20.f;		
const float ADD_PERCENT = 20.f;		/// 추가 감소되는 값

const int NPCICON_SIZE = 16;		/// 사이즈
const int MAINTAIN_TIME = 60000;

struct sNpcData;
struct sAniParam;
class cUITransformImage;
class cPartyData;
class cIconParam;
class cLabel;


enum 
{
	eTYPE_NONE = 0,
	eTYPE_HERO,
	eTYPE_CAMERA,
	eTYPE_NPC,
	eTYPE_PORTAL,
	eTYPE_PARTY,
	eTYPE_DEATHMATCH,
	eTYPE_USERSELL,
};

struct sBaseImageData
{
	unsigned char			mType;
	cUITransformImage*		mpImage;
	cUIPos					mPos;		/// 데이터좌표
	cUIPos					mScreenPos;	/// 스크린좌표
	cUISize					mSize;
	bool					mShow;
	cStringT				mName;

	sBaseImageData()
	{
		mType = eTYPE_NONE;
		mpImage = 0;
		mPos.mX = 0;
		mPos.mY = 0;
		mScreenPos.mX = 0;
		mScreenPos.mY = 0;
		mSize.mWidth = 0;
		mSize.mHeight = 0;
		mShow = true;
	}
	virtual ~sBaseImageData(){}
};

/// npc 이미지 데이터
struct sNpcImageData : sBaseImageData
{
	unsigned long	mClassIndex;
	unsigned long	mNpcIndex;
	unsigned char	mQuestStatus;	/// 퀘스트 관련 상태
	sAniParam*		mAniParam;
	cUITransformImage*		mpAniImage;
	cStringT				mJobName;
	
	sNpcImageData()
	{
		mClassIndex = 0;
		mNpcIndex = 0;
		mQuestStatus = 0;
		mAniParam = 0;
		mpAniImage = 0;
	}
	~sNpcImageData(){}
};

/// 포탈 이미지 데이터
struct sPortalImageData : sBaseImageData
{
	int				mTargetMapNum;

	sPortalImageData()
	{
		mTargetMapNum = 0;
	}
	~sPortalImageData(){}
};


/// 다른 유저 데이터(파티원, 노점상등)
struct sUserImageData : sBaseImageData
{
	int				mOldX;
	int				mOldY;
	int				mMapNum;
	unsigned long	mUserIndex;
	cUINodeSkin*	mpInSkin;		/// 기본스킨
	cUINodeSkin*	mpOutSkin;		/// 맵 범위 외부에있을경우 출력할 스킨(화살표)
	
	sUserImageData()
	{
		mOldX = 0;
		mOldY = 0;
		mMapNum = 0;
		mpInSkin = 0;
		mpOutSkin = 0;
	}
	~sUserImageData(){}
};

/// 노점상데이터
struct sUserSellImageData : sUserImageData
{
	unsigned long	mStartTime;			/// 표시 시작시간

	sUserSellImageData()
	{
		mStartTime = 0;
	}
};

class cSmallMiniMapWindow : public cUIWindow
{
public:
	cSmallMiniMapWindow();
	virtual ~cSmallMiniMapWindow();

	/// 미니맵 재로딩
	void UIStageIn();
	void Clear();
	void ClearParty();

	/// 맵정보 가져다가 출력부 세팅
	virtual void SetMapData();

	/// npcindex : objectmanager 의 인덱스
	void AddNpc( sNpcData* data, bool IsSmall );
	void RemoveNpc( unsigned long index );
	void SetNpcQuestStatus( unsigned long index, unsigned char status );

	/// 파티정보 세팅
	virtual void AddPartyUser( cPartyData* data );
	void RemovePartyUser( unsigned long userIndex );
	void SetPosParty( unsigned long userIndex, float posX, float posY );
	void SetMapNumParty( int mapnum, unsigned long userIndex );

	/// 전장 정보 세팅
	virtual void AddDMUser( unsigned long userIndex, cStringT name, float posX, float posY );
	void RemoveDMUser( unsigned long userIndex );
	void SetPosDMUser( unsigned long userIndex, float posX, float posY );


	/// 노점상 정보 세팅
	void AddUserSell( cStringT name, int mapnum, float xpos, float ypos );
	void RemoveUserSell( sBaseImageData* data );

	float GetImagePercent() { return mPercent; }
	void SetImagePercent( float per );

protected:
	virtual bool OnCreate( cUINodeProperty* pproperty );
	virtual void OnRender( cUIFontItemKeeper* pKeeper );
	virtual void OnProcess( unsigned long deltaTime, unsigned long accumTime );	
	void OnCommand( cUINode* pnode, unsigned int id );
	void OnMouseMove( const cUIPos& pos );
	void OnMouseLeft( const cUIPos& pos );
	void UpdateRect();
	void UpdateSkin();
	void OnHide();

	/// 미니맵을 로딩
	virtual bool LoadMiniMap( const cString& pathName );

	/// 이름정보 위치 업데이트
	virtual void UpdateNamePos();

	virtual void AddPortal( unsigned long index );

	/// 퀘스트 애니메이션 갱신
	void UpdateQuestAni( sNpcImageData* data, unsigned long accumTime );

protected:
	/// 초기 텍스쳐 사이즈 
	unsigned short mOriginTexW, mOriginTexH;

	/// 맵 뷰 퍼센트에 따른 텍스쳐 사이즈 조정
	double mPerTexW, mPerTexH;

	/// 축소 퍼센트 ( 100 % 축소 : 전체 지도 )
	float mPercent;

	/// 업데이트 여부 
	bool mNeedUpdate;

	/// 이름 출력 
	cStringT mName;
	cStringT mJobName;
	cUIPos mNamePos;
	cUIPos mJobPos;

	/// 이미지 데이터맵
	typedef tPointerList<void*> cImageDataList;
	cImageDataList	mImageDataList;

	/// 미니맵 이미지 
	cUITransformImage*	mpMiniMapImage;
	sBaseImageData*		mHeroData;		/// hero 데이터
	sBaseImageData*		mCameraData;	/// 카메라 데이터
	sBaseImageData*		mCoverData;		/// 미니맵 틀
	sBaseImageData*		mHoverData;

	/// 노점상 데이타	
	sUserSellImageData* mUserSellData;	

	/// 방향
	NiPoint3 mHeroDir;
	NiPoint3 mCameraDir;

	/// 화면 출력 hero 위치 
	float mOldX, mOldY;
	int mHeroX, mHeroY;

	/// 퀘스트 이미지 스킨
	cUINodeSkin*	mpQuestNew;
	cUINodeSkin*	mpQuestPlay;
	cUINodeSkin*	mpQuestComplete;

	cLabel*		mpMapName;
	cLabel*		mpChannelNum;

	/// 파티원 스킨이름
	cString		mPartyInSkinName;
	cString		mPartyOutSkinName;
};

