#include "gamesrv.h"

#include "stdafx.h"
#include "Protocol.h"

#include "Level_Common.h"
#include "LevelScript.h"

#include "levelmanager.h"
#include "ObjectManager.h"
#include "Player.h"
#include "StatusCalc_Server.h"


cLevelManager* cLevelManager::mpLevelManager = NULL;



cLevelManager::cLevelManager(void)
{
	/// 싱글톤
	if( mpLevelManager )
	{
		Verbose->WriteLog( "mLevelManager new error");
	}
	else
	{
		mpLevelManager = this;
	}
}



cLevelManager::~cLevelManager(void)
{
}



bool cLevelManager::Init()
{

	mpLevelScript = new cLevelScript;
	if( mpLevelScript->Init() == false )
	{
		Verbose->WriteLog("ASSERT-070515-LevelScript::Init ERROR");
		MessageBox(NULL,_T("LevelScript::Init ERROR"),_T("ERROR"),MB_OK);
		assert(NULL);
	}

	return true;
}



void cLevelManager::Release()
{
	SAFE_RELEASE_DELETE( mpLevelScript );
}


void cLevelManager::AddExp( unsigned long playerIdx, unsigned int addExp )
{
	cPlayer* pPlayer = OBJECTMANAGER->GetPlayer( playerIdx );

	/// 습득한 경험치를 현재경험치에 더함
	pPlayer->GetHeroInfo()->Exp += addExp;

	/// 다음 레벨로 넘어가기 위한 필요 경험치를 얻어옴
	sExpTable* pExpTable = mpLevelScript->GetExpTable( pPlayer->GetLevel() );
	/// 경험치 정보가 없으면 현재 만렙인 상태 - 종료
	if( pExpTable == NULL )
		return; 

	/// 현재 레벨 경험치 최대 값을 가져옴
	unsigned long maxExp = pExpTable->mExp;
	/// 플레이어의 현재 경험치
	unsigned long playerExp = pPlayer->GetHeroInfo()->Exp;
	/// 레벨업 수치
	unsigned char levelUp = 0;

	/// 경험치 총합이 다음 레벨로 넘어가기 위한 경험치 보다 크면 레벨업
	while( playerExp >= maxExp )
	{
		/// 현재 경험치에서 레벨업할 만큼의 경험치를 감소
		playerExp -= maxExp;
		pPlayer->GetHeroInfo()->Exp = playerExp;

		++levelUp;

		/// 레벨업한 후다음 레벨로 넘어 가기 위한 경험치 최대 값
		pExpTable = mpLevelScript->GetExpTable( pPlayer->GetLevel() + levelUp );
		maxExp = pExpTable->mExp;
	}

	/// 플레이어 레벨업
	if( levelUp > 0 )
		pPlayer->LevelUp( levelUp );

}

void cLevelManager::AddSxp( unsigned long playerIdx, unsigned int addSxp )
{
	cPlayer* pPlayer = OBJECTMANAGER->GetPlayer( playerIdx );

	/// 습득한 경험치를 현재경험치에 더함
	pPlayer->GetHeroInfo()->SkillExp += addSxp;

	/// 다음 레벨로 넘어가기 위한 필요 경험치를 얻어옴
	sSxpTable* pSxpTable = mpLevelScript->GetSxpTable( pPlayer->GetSkillLevel() );
	/// 경험치 정보가 없으면 현재 만렙인 상태 - 종료
	if( pSxpTable == NULL )	
		return; 

	/// 현재 레벨 경험치 최대 값을 가져옴
	unsigned long maxSxp = pSxpTable->mSxp;
	/// 플레이어의 현재 경험치
	unsigned long playerSxp = pPlayer->GetHeroInfo()->SkillExp;
	/// 레벨업 수치
	unsigned char levelUp = 0;

	/// 경험치 총합이 다음 레벨로 넘어가기 위한 경험치 보다 크면 레벨업
	while( playerSxp >= maxSxp )
	{
		/// 현재 경험치에서 레벨업할 만큼의 경험치를 감소
		playerSxp -= maxSxp;
		pPlayer->GetHeroInfo()->SkillExp = playerSxp;

		++levelUp;

		/// 다음 레벨로 넘어 가기 위한 경험치 최대 값
		pSxpTable = mpLevelScript->GetSxpTable( pPlayer->GetSkillLevel() + levelUp );
		maxSxp = pSxpTable->mSxp;
	}

	/// 플레이어 스킬 레벨업
	if( levelUp > 0 )
		pPlayer->SkillLevelUp( levelUp );
}
