⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 statscalcmanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// StatsCalcManager.cpp: implementation of the CStatsCalcManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "StatsCalcManager.h"
#include "..\[CC]Header\GameResourceManager.h"

#ifdef _MHCLIENT_
#include "Hero.h"
#include "GameIn.h"
#endif

#ifdef _MAPSERVER_
#include "Player.h"
#endif

#include "CharacterCalcManager.h"
#include "ItemManager.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CStatsCalcManager::CStatsCalcManager()
{

}

CStatsCalcManager::~CStatsCalcManager()
{

}

void CStatsCalcManager::Clear(player_calc_stats * pStats)
{
	memset(pStats, 0, sizeof(player_calc_stats));
}


float ItemApplyRate[] = 
{
	1,
	0.6f,
	0.55f,
	0.5f,
	0.45f,
	0.4f,
	0.35f,
	0.30f,
	0.3f,
	0.25f,
	0.2f,
	0.15f,
	0.1f,
	0.05f,
	0.f,
};

// ÀåÂøÃ¢¿¡ ¾ÆÀÌÅÛ ÀåÂø,ÇØÁ¦½Ã
void CStatsCalcManager::CalcItemStats(PLAYERTYPE* pPlayer)
{
	player_calc_stats * item_stats = pPlayer->GetItemStats();
	Clear(item_stats);

//	WORD ItemIdx;
//		for(int part=0;part<eWearedItem_Max;++part)
//		{
//		ItemIdx = pPlayer->GetWearedItemIdx(part);
//		if(ItemIdx == 0)
//			continue;
	
	ASSERT(pPlayer->GetMaxLevel() >= pPlayer->GetLevel());
	
	for(POSTYPE part = TP_WEAR_START ; part < TP_WEAR_END ; ++part )
	{
		const ITEMBASE * pTargetItemBase = ITEMMGR->GetItemInfoAbsIn(pPlayer, part);

		// yh óÀ½ µé¾î°¥¶§ ¹®Á¦°¡... -_-a
		if(pTargetItemBase == NULL)
			continue;

		if(pTargetItemBase->dwDBIdx == 0)
			continue;

		ITEM_INFO * pItemInfo = ITEMMGR->GetItemInfo(pTargetItemBase->wIconIdx);
///		ASSERT(pItemInfo);
		if(pItemInfo == NULL)
			continue;
		
		float ApplyRate = 1;
		int gap = pItemInfo->LimitLevel - pPlayer->GetLevel();
		if(gap > 0)
		{
			if(gap > 13) gap = 13;
			ApplyRate = ItemApplyRate[gap];
		}

		if(pItemInfo->ItemKind == eEQUIP_ITEM_ARMLET)
		{
			// ȣȯÀϰæ¿ì ÃÖÁ¾µ¥¹ÌÁö¿¡ %·Î ´õÇØÁÜ
			item_stats->MeleeAttackPowerAddRateMin += pItemInfo->MeleeAttackMin*ApplyRate * 0.01f;
			item_stats->MeleeAttackPowerAddRateMax += pItemInfo->MeleeAttackMax*ApplyRate * 0.01f;
			item_stats->RangeAttackPowerAddRateMin += pItemInfo->RangeAttackMin*ApplyRate * 0.01f;
			item_stats->RangeAttackPowerAddRateMax += pItemInfo->RangeAttackMax*ApplyRate * 0.01f;
		}
		else
		{
			// ´Ù¸¥ °ÍµéÀº ±×³É °ø°Ý°è»ê½Ä¿¡ ´õÇØÁÜ
			item_stats->MeleeAttackPowerMin += (WORD)(pItemInfo->MeleeAttackMin*ApplyRate);		
			item_stats->MeleeAttackPowerMax += (WORD)(pItemInfo->MeleeAttackMax*ApplyRate);
			item_stats->RangeAttackPowerMin += (WORD)(pItemInfo->RangeAttackMin*ApplyRate);
			item_stats->RangeAttackPowerMax += (WORD)(pItemInfo->RangeAttackMax*ApplyRate);
		}
		
		item_stats->PhysicalDefense += (WORD)(pItemInfo->PhyDef*ApplyRate);
		item_stats->AttributeAttack.AddATTRIBUTE_VAL(pItemInfo->AttrAttack,ApplyRate);
		item_stats->AttributeResist.AddATTRIBUTE_VAL(pItemInfo->AttrRegist,ApplyRate);
		item_stats->GenGol += (WORD)(pItemInfo->GenGol*ApplyRate);
		item_stats->MinChub += (WORD)(pItemInfo->MinChub*ApplyRate);
		item_stats->CheRyuk += (WORD)(pItemInfo->CheRyuk*ApplyRate);
		item_stats->SimMaek += (WORD)(pItemInfo->SimMek*ApplyRate);
		item_stats->MaxLife += (DWORD)(pItemInfo->Life*ApplyRate);
		item_stats->MaxShield += (DWORD)(pItemInfo->Shield*ApplyRate);
		item_stats->MaxNaeRyuk += (DWORD)(pItemInfo->NaeRyuk*ApplyRate);
		
		if(ITEMMGR->IsOptionItem(pTargetItemBase->wIconIdx, pTargetItemBase->Durability))
		{
			DWORD chrid;
#ifdef _MHCLIENT_
			chrid = HEROID;
			ITEM_OPTION_INFO * pOptionInfo = ITEMMGR->GetItemOption(pTargetItemBase->Durability);
#else
			chrid = pPlayer->GetID();
			ITEM_OPTION_INFO * pOptionInfo = pPlayer->GetItemOption(pTargetItemBase->Durability);
#endif
			if(pOptionInfo)
			{
				item_stats->MeleeAttackPowerMin += (WORD)(pOptionInfo->PhyAttack*ApplyRate);		
				item_stats->MeleeAttackPowerMax += (WORD)(pOptionInfo->PhyAttack*ApplyRate);
				item_stats->RangeAttackPowerMin += (WORD)(pOptionInfo->PhyAttack*ApplyRate);
				item_stats->RangeAttackPowerMax += (WORD)(pOptionInfo->PhyAttack*ApplyRate);

				item_stats->PhysicalDefense += (WORD)(pOptionInfo->PhyDefense*ApplyRate);
				item_stats->AttributeAttack.AddATTRIBUTE_VAL(pOptionInfo->AttrAttack,ApplyRate);
				item_stats->AttributeResist.AddATTRIBUTE_VAL(pOptionInfo->AttrRegist,ApplyRate);
				item_stats->GenGol += (WORD)(pOptionInfo->GenGol*ApplyRate);
				item_stats->MinChub += (WORD)(pOptionInfo->MinChub*ApplyRate);
				item_stats->CheRyuk += (WORD)(pOptionInfo->CheRyuk*ApplyRate);
				item_stats->SimMaek += (WORD)(pOptionInfo->SimMek*ApplyRate);
				item_stats->MaxLife += (DWORD)(pOptionInfo->Life*ApplyRate);
				item_stats->MaxShield += (DWORD)(pOptionInfo->Shield*ApplyRate);
				item_stats->MaxNaeRyuk += (DWORD)(pOptionInfo->NaeRyuk*ApplyRate);
				item_stats->Critical += (DWORD)(pOptionInfo->CriticalPercent*ApplyRate);
			}
			else
			{
				ASSERTMSG(pOptionInfo,"GetItemOption() is NULL");
				char temp[128];

				sprintf(temp,"%d  %d  %d",chrid,pTargetItemBase->dwDBIdx,pTargetItemBase->Durability);
			}
		}
	}
	
	if(item_stats->MeleeAttackPowerMax == 0)		// ±âº» ¹«±â °ø°Ý·ÂÀº 5
	{
		item_stats->MeleeAttackPowerMax = 5;
		item_stats->MeleeAttackPowerMin = 5;
	}
	if(item_stats->RangeAttackPowerMax == 0)
	{
		item_stats->RangeAttackPowerMax = 5;
		item_stats->RangeAttackPowerMin = 5;
	}
	item_stats->AttributeResist.CheckLimit(1);	// ÀúÇ×·ÂÀº ÃÖ´ë°ªÀÌ 1


	// ¾ÆÀÌÅÛ ¼öÄ¡°¡ º¯°æµÇ¸é ij¸¯ÅÍ ¼öÄ¡µµ º¯°æ
	CalcCharStats(pPlayer);
}

// ij¸¯°ÔÀÓIn
// ·¹º§¾÷½Ã ( ´É·ÂÄ¡ ¹Ù²ð¶§)
// ¹«°ø¹ßµ¿½Ã(+´É·ÂÄ¡) : ±¸Á¶Ã¼¸¦ Çϳª ´õ µÖ¾ß Çϳª?
void CStatsCalcManager::CalcCharStats(PLAYERTYPE* pPlayer)
{
	player_calc_stats * char_stats = pPlayer->GetCharStats();
	Clear(char_stats);

	HERO_TOTALINFO pHeroInfo;
	pPlayer->GetHeroTotalInfo(&pHeroInfo);
	// ¾ÆÀÌÅÛ ÀåÂøÇѰſ¡ µû¸¥ ij¸¯ÅÍ ¼öÄ¡ ¼ÂÆÃ
	char_stats->MinChub = pHeroInfo.wMinChub;
	char_stats->GenGol = pHeroInfo.wGenGol;

	char_stats->PhysicalDefense = (WORD)(pPlayer->GetCheRyuk()/1.5);
	// 10/27 ¼öÄ¡ º¯°æÀü	char_stats->PhysicalDefense = pHeroInfo.wCheRyuk/3;

	char_stats->Critical = pPlayer->GetGenGol() / 4;

#ifdef _MAPSERVER_
	CCharacterCalcManager::CalcMaxLife(pPlayer);
	CCharacterCalcManager::CalcMaxShield(pPlayer);
	CCharacterCalcManager::CalcMaxNaeRyuk(pPlayer);
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -