📄 statscalcmanager.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 + -