/* ==========================================================================
* 파    일 : DropScript.h
* 목    적 : 드롭에 관련된 스크립트 파일을 읽어 온다.
* 작 성 자 : 박경희
* 작 성 일 : 2007-01-12
* 주의사항 :
*===========================================================================*/
#pragma once

struct sDropMoney;
struct sDropNType;
struct sDropSWType;
struct sDropQtyItem;
struct sDropQtyMonster;
struct sDropQuantity;
struct sPartyExp;
struct sDropNTypeGather;
struct sDropSTypeGather;

class cDropScript
{

public:
	cDropScript(void);
	~cDropScript(void){};


	bool				Init();
	void				Release();

	/// 스크립트에서 N타입 아이템 드롭 정보를 읽어온다.
	bool				LoadDropNType();
	bool				LoadDropNTypeData();
	/// 해쉬맵에 위치한 N타입 아이템 드롭 정보를 읽어온다.
	sDropNType*			GetDropNType( unsigned long idx );

	/// 스크립트에서 S타입 아이템 드롭 정보를 읽어온다.
	bool				LoadDropSType();
	bool				LoadDropSTypeData();
	/// 해쉬맵에 위치한 S타입 아이템 드롭 정보를 읽어온다.
	sDropSWType*		GetDropSType( unsigned long monsterClassIdx );

	/// 스크립트에서 월드타입 아이템 드롭 정보를 읽어온다.
	bool				LoadDropWType();
	bool				LoadDropWTypeData();
	/// 해쉬맵에 위치한 월드타입 아이템 드롭 정보를 읽어온다.
	tArray<void*>*		GetDropWType( unsigned long monsterLv );

	/// 스크립트에서 퀘스트 아이템 드롭 정보를 읽어온다.
	bool				LoadDropQType();
	/// 몬스터&퀘스트 조건에 맞는 아이템 배열을 찾는다.
	tArray<void*>*		GetDropQtype( unsigned long monsterClassIdx, unsigned long questIdx );


	/// 채집
	bool				LoadDropNTypeGather();
	bool				LoadDropNTypeDataGather();
	sDropNTypeGather*	GetDropNTypeGather( unsigned long idx );

	bool				LoadDropSTypeGather();
	bool				LoadDropSTypeDataGather();
	sDropSTypeGather*	GetDropSTypeGather( unsigned long classIdx );

	bool				LoadDropQTypeGather();
	tArray<void*>*		GetDropQtypeGather( unsigned long classIdx, unsigned long questIdx );


	/// 몬스터 - 캐릭터 레벨차에 따른 수정치 차이 정보 로드
	bool				LoadDropExpIncrease();
	/// 해쉬맵에 위치한 레벨차수정치를 읽어옴
	float				GetDropExpIncrease( char levelDifference );
	char				GetMinLevelDifferent() { return mScriptMinLevelDifferent; }
	char				GetMaxLevelDifferent() { return mScriptMaxLevelDifferent; }

	/// 파티 인원에 따른 경험치 증가 퍼센트
	bool				LoadPartyExpIncrease();
	float				GetPartyExpIncrease( unsigned char partyMemberCnt );
	float				GetPartySxpIncrease( unsigned char partyMemberCnt );

public:

	static cDropScript* mpDropScript;

private:

	typedef tPointerHashMap<unsigned long, void*> cPointrHashMap;
	typedef tArray<void*> cAry;


	//////////////////////////////////////////////////////////////////////////
	/// 몬스터

	/// N타입 아이템 드롭 정보
	//	typedef tPointerHashMap<unsigned long, sDropNType*> cDropNType;
	cPointrHashMap*		mpDropNTypeMap;

	/// B타입 아이템 드롭 정보
	//	typedef tPointerHashMap<unsigned long, sDropSType*> cDropSType;
	cPointrHashMap*		mpDropSTypeMap;

	/// 월드타입 아이템 드롭 정보
	//	typedef tArray<sDropWType*> cDropWAry;
	//	typedef tPointerHashMap<unsigned long, cDropWAry*> cDropSType;
	cPointrHashMap*		mpDropWTypeMap;
	cAry				mpTempWData;
	/// 시스템 shutdown 시 sDropSType*를 중복 delete 를 하지않기위해 만듬
	cAry				mpShutDownDeleteWAry;


	//////////////////////////////////////////////////////////////////////////
	/// 채집

	//	typedef tPointerHashMap<unsigned long, sDropNTypeGather*> cDropNTypeGather;
	cPointrHashMap*		mpDropNTypeGatherMap;		/// N타입 아이템 드롭 정보

	//	typedef tPointerHashMap<unsigned long, sDropSTypeGather*> cDropSTypeGather;
	cPointrHashMap*		mpDropSTypeGatherMap;		/// B타입 아이템 드롭 정보


	/// 몬스터 - 캐릭터 레벨차에 따른 수정치 차이 정보
	typedef tPointerHashMap<char, float> cDropExpIncrease;
	cDropExpIncrease*	mpDropExpIncreaseMap;

	char				mScriptMinLevelDifferent;	/// 스크립트에 정의된 최소 레벨차
	char				mScriptMaxLevelDifferent;	/// 스크립트에 정의된 최대 레벨차


	/// 파티 인원에 따른 경험치 증가 퍼센트
	//	typedef tPointerHashMap<unsigned long, sPartyExp*> cPartyExpIncrease;
	cPointrHashMap		mPartyExpIncrease;


	/// 퀘스트 드롭 아이템 정보
	//	typedef cAry<sDropQType*> cDropQTypeAry;
	//	typedef tPointerHashmap<unsigned long, cDropQTypeAry*> cDropQTypeMap;
	cPointrHashMap		mDropQTypeMap;

};

#define DROPSCRIPT cDropScript::mpDropScript