DragonNest/GameCommon/DnPlayerState.cpp

3365 lines
125 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include "DnPlayerState.h"
#include "DnTableDB.h"
#include "MAPartsBody.h"
#include "DnActor.h"
#include "DnPlayerActor.h"
#include "DnGameTask.h"
#include "DnPvPGameTask.h"
#include "TaskManager.h"
#include "DnDLGameTask.h"
#include "DnItem.h"
#if defined(_GAMESERVER)
#include "DNGameDataManager.h"
#include "DNGameRoom.h"
#include "DNPvPGameRoom.h"
#include "DNUserSession.h"
#include "DNBestFriend.h"
#else //_GAMESERVER
#include "DnPetTask.h"
#include "DnItemTask.h"
#endif // _GAMESERVER
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CDnPlayerState::CDnPlayerState()
{
m_pSetItemState = NULL;
m_pAppellationState = NULL;
m_pPetAbilityState = NULL;
#if defined(PRE_ADD_SKILLBUF_RENEW)
m_BuffState.ResetState();
#endif
m_nExperience = 0;
m_nNextLevelExperience = 0;
m_nCurrentLevelExperience = 0;
m_fDeadDurabilityRatio = 0.f;
m_nAppellationIndex = -1;
m_nCoverAppellationIndex = -1;
m_cAccountLevel = 0;
m_cPvPLevel = 0;
#ifdef PRE_ADD_STAGE_LIMIT_INTERFACE
memset(&m_sDamageLimitInfo,0,sizeof(m_sDamageLimitInfo));
#endif
}
CDnPlayerState::~CDnPlayerState()
{
SAFE_DELETE( m_pSetItemState );
SAFE_DELETE( m_pAppellationState );
SAFE_DELETE( m_pPetAbilityState );
for( int i=0; i<(int)m_vecpPetAccessaryState.size(); i++ )
{
if( m_vecpPetAccessaryState[i] )
SAFE_DELETE( m_vecpPetAccessaryState[i] );
}
m_vecpPetAccessaryState.clear();
}
void CDnPlayerState::CalcBaseState( StateTypeEnum Type )
{
if( m_nLevel == 0 ) return;
m_BaseState.SetSuperAmmor( CPlayerLevelTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CPlayerLevelTable::SuperAmmor ) );
m_fDeadDurabilityRatio = CPlayerLevelTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CPlayerLevelTable::DeadDurabilityRatio ) / 100.f;
m_BaseState.CalcValueType();
}
void CDnPlayerState::CalcState( RefreshStateExtentEnum Extent, StateTypeEnum Type )
{
if( m_nLevel == 0 ) return;
std::vector<CDnState *> pVecAbsoluteList[2];
std::vector<CDnState *> pVecRatioList[2];
#if defined(PRE_ADD_TALISMAN_SYSTEM)
GetStateList( BaseList | WeaponList | DefenseList | AccessoryList | StateEffectList | SetItemList | AppellationList | GlyphList | PetAbility | TalismanList, ValueTypeAbsolute, pVecAbsoluteList[0] );
GetStateList( BaseList | WeaponList | DefenseList | AccessoryList | StateEffectList | SetItemList | AppellationList | GlyphList | PetAbility | TalismanList, ValueTypeRatio, pVecRatioList[0] );
#else
GetStateList( BaseList | WeaponList | DefenseList | AccessoryList | StateEffectList | SetItemList | AppellationList | GlyphList | PetAbility, ValueTypeAbsolute, pVecAbsoluteList[0] );
GetStateList( BaseList | WeaponList | DefenseList | AccessoryList | StateEffectList | SetItemList | AppellationList | GlyphList | PetAbility, ValueTypeRatio, pVecRatioList[0] );
#endif // PRE_ADD_TALISMAN_SYSTEM
GetStateList( PostStateEffectList, ValueTypeRatio, pVecRatioList[1] );
GetStateList( PostStateEffectList, ValueTypeAbsolute, pVecAbsoluteList[1] );
if( Type & ST_Strength ) CalcStrength( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_Agility ) CalcAgility( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_Intelligence ) CalcIntelligence( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_Stamina ) CalcStamina( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_AttackP ) CalcAttackP( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_AttackM ) CalcAttackM( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_DefenseP ) CalcDefenseP( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_DefenseM ) CalcDefenseM( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_HP ) CalcHP( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_SP ) CalcSP( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_MoveSpeed ) CalcMoveSpeed( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_DownDelay ) CalcDownDelay( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_Stiff ) CalcStiff( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_StiffResistance ) CalcStiffResistance( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_Critical ) CalcCritical( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_CriticalResistance ) CalcCriticalResistance( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_Stun ) CalcStun( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_StunResistance ) CalcStunResistance( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_RecoverySP ) CalcRecoverySP( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_SuperAmmor ) CalcSuperAmmor( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_FinalDamage ) CalcFinalDamage( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_Spirit ) CalcSpirit( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_SafeZoneMoveSpeed ) CalcSafeZoneMoveSpeed( Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_AddExp ) CalcAddExp( Extent, pVecAbsoluteList, pVecRatioList );
for( int i=0; i<ElementEnum_Amount; i++ ) {
if( Type & ST_ElementAttack ) CalcElementAttack( (ElementEnum)i, Extent, pVecAbsoluteList, pVecRatioList );
if( Type & ST_ElementDefense ) CalcElementDefense( (ElementEnum)i, Extent, pVecAbsoluteList, pVecRatioList );
}
if( Extent & RefreshBase ) m_BaseState.CalcValueType();
if( Extent & RefreshEquip ) m_StateStep[0].CalcValueType();
if( Extent & RefreshSkill ) m_StateStep[1].CalcValueType();
CalcValueType();
#if defined(PRE_ADD_MISSION_COUPON)
if( m_nHP > m_nMaxHP ) SetHP(m_nMaxHP);
if( m_nSP > m_nMaxSP ) SetSP(m_nMaxSP);
#else
if( m_nHP > m_nMaxHP ) m_nHP = m_nMaxHP;
if( m_nSP > m_nMaxSP ) m_nSP = m_nMaxSP;
#endif
OnCalcPlayerState();
}
#if defined (PRE_ADD_BESTFRIEND)
bool CDnPlayerState::IsApplyPartsState(CDnActor *pActor, CDnParts* pParts, bool Durability)
{
if( Durability && !pParts->IsInfinityDurability() && pParts->GetDurability() <= 0 )
return false;
int nParam1=0, nParam2 = 0;
#if defined (_GAMESERVER)
int* nTypePram = pParts->GetTypeParam();
nParam1 = nTypePram[0];
nParam2 = nTypePram[1];
#elif defined (_CLIENT)
nParam1 = pParts->GetTypeParam(0);
nParam2 = pParts->GetTypeParam(1);
#endif
if( !IsBestFriendItem(pActor, pParts->GetItemType(), nParam1, nParam2, pParts->GetSerialID()))
return false;
return true;
}
bool CDnPlayerState::IsApplyWeaponState(CDnActor *pActor, CDnWeapon* pWeapon, bool Durability)
{
if( Durability && !pWeapon->IsInfinityDurability() && pWeapon->GetDurability() <= 0 )
return false;
int nParam1=0, nParam2 = 0;
#if defined (_GAMESERVER)
int* nTypePram = pWeapon->GetTypeParam();
nParam1 = nTypePram[0];
nParam2 = nTypePram[1];
#elif defined (_CLIENT)
nParam1 = pWeapon->GetTypeParam(0);
nParam2 = pWeapon->GetTypeParam(1);
#endif
if( !IsBestFriendItem(pActor, pWeapon->GetItemType(), nParam1, nParam2, pWeapon->GetSerialID()))
return false;
return true;
}
bool CDnPlayerState::IsBestFriendItem(CDnActor* pActor, eItemTypeEnum cType, int nParam1, int nParam2, INT64 nSerial)
{
#if defined (_GAMESERVER)
if (pActor && pActor->IsPlayerActor())
{
CDNUserSession* pUserSession = ((CDnPlayerActor*)pActor)->GetUserSession();
if (pUserSession)
{
TBestFriendInfo& Info = pUserSession->GetBestFriend()->GetInfo();
if (cType == ITEMTYPE_PARTS && nParam1 == 10 && nParam2 == 10)
{
if (Info.biItemSerial != nSerial)
return false;
}
}
}
#elif defined (_CLIENT)
if( pActor &&
cType == ITEMTYPE_PARTS && nParam1 == 10 && nParam2 == 10 &&
pActor->GetBFserial() != nSerial )
{
return false;
}
#endif
return true;
}
#endif
void CDnPlayerState::GetStateList( int ListType, CDnState::ValueType Type, std::vector<CDnState *> &VecList )
{
VecList.clear();
CDnActorState::GetStateList( ListType, Type, VecList );
// <20><><EFBFBD><20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
if( ListType & DefenseList ) {
CDnPlayerActor *pParts = static_cast<CDnPlayerActor *>(m_pActor);
if( pParts ) {
// <20><EFBFBD><EBB8BB>
for( DWORD i=0; i<CDnParts::PartsTypeEnum_Amount; i++ ) {
DnPartsHandle hParts = pParts->GetParts( (CDnParts::PartsTypeEnum)i );
if( !hParts ) continue;
if( !hParts->IsInfinityDurability() && hParts->GetDurability() <= 0 ) continue;
std::vector<int> nVecJobHistory;
if( ((CDnPlayerActor*)m_pActor)->GetJobHistory( nVecJobHistory ) > 0 )
if( hParts->IsPermitPlayer( nVecJobHistory ) == false ) continue;
if( hParts->IsExistValueType( Type ) ) {
VecList.push_back( hParts );
}
if( hParts->IsActiveEnchant() ) {
if( hParts->GetEnchantState() && hParts->GetEnchantState()->IsExistValueType( Type ) )
VecList.push_back( hParts->GetEnchantState() );
}
if( hParts->IsActivePotential() ) {
if( hParts->GetPotentialState() && hParts->GetPotentialState()->IsExistValueType( Type ) )
VecList.push_back( hParts->GetPotentialState() );
}
}
// ij<><C4B3><EFBFBD><EFBFBD>
for( DWORD i=0; i<CDnParts::CashPartsTypeEnum_Amount; i++ ) {
DnPartsHandle hParts = pParts->GetCashParts( (CDnParts::PartsTypeEnum)i );
if( !hParts ) continue;
#if defined (PRE_ADD_BESTFRIEND)
if (!IsApplyPartsState(pParts, hParts)) continue;
#endif
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD><EFBFBD>ʴ´<CAB4>.
if( hParts->IsExistValueType( Type ) ) {
VecList.push_back( hParts );
}
if( hParts->IsActiveEnchant() ) {
if( hParts->GetEnchantState() && hParts->GetEnchantState()->IsExistValueType( Type ) )
VecList.push_back( hParts->GetEnchantState() );
}
if( hParts->IsActivePotential() ) {
if( hParts->GetPotentialState() && hParts->GetPotentialState()->IsExistValueType( Type ) )
VecList.push_back( hParts->GetPotentialState() );
}
}
// ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for( int i=0; i<2; i++ ) {
DnWeaponHandle hWeapon = pParts->GetCashWeapon(i);
if( !hWeapon ) continue;
#if defined (PRE_ADD_BESTFRIEND)
if (!IsApplyWeaponState(pParts, hWeapon)) continue;
#endif
if( hWeapon->IsExistValueType( Type ) ) {
VecList.push_back( hWeapon );
}
if( hWeapon->IsActiveEnchant() ) {
if( hWeapon->GetEnchantState() && hWeapon->GetEnchantState()->IsExistValueType( Type ) )
VecList.push_back( hWeapon->GetEnchantState() );
}
if( hWeapon->IsActivePotential() ) {
if( hWeapon->GetPotentialState() && hWeapon->GetPotentialState()->IsExistValueType( Type ) )
VecList.push_back( hWeapon->GetPotentialState() );
}
}
}
}
// SetItem State
if( ( ListType & SetItemList ) && m_pSetItemState ) {
VecList.push_back( m_pSetItemState );
}
// Appellation State
if( ( ListType & AppellationList ) && m_pAppellationState ) {
VecList.push_back( m_pAppellationState );
}
// Glyph State
if( ListType & GlyphList ) {
CDnPlayerActor *pGlyph = static_cast<CDnPlayerActor *>(m_pActor);
if( pGlyph ) {
for( DWORD i=0; i<CDnGlyph::GlyphSlotEnum_Amount; i++ ) {
DnGlyphHandle hGlyph = pGlyph->GetGlyph( (CDnGlyph::GlyphSlotEnum)i );
if( !hGlyph ) continue;
#if !defined(_GAMESERVER)
#if defined(PRE_ADD_DRAGON_FELLOWSHIP_GLYPH)
if( (i >= CDnGlyph::Cash1 && i <= CDnGlyph::Cash3) && false == GetItemTask().IsCashGlyphOpen( i - CDnGlyph::Cash1 ) )
#else
if( i >= CDnGlyph::Cash1 && false == GetItemTask().IsCashGlyphOpen( i - CDnGlyph::Cash1 ) )
#endif // #if defined(PRE_ADD_DRAGON_FELLOWSHIP_GLYPH)
continue;
#endif // #if !defined(_GAMESERVER)
if( hGlyph->IsExistValueType( Type ) )
{
VecList.push_back( hGlyph );
}
}
}
}
// Talisman State
#ifdef PRE_ADD_TALISMAN_SYSTEM
if( ListType & TalismanList) {
CDnPlayerActor* pTalisman = static_cast<CDnPlayerActor*>(m_pActor);
if(pTalisman) {
for( DWORD i = 0 ; i < TALISMAN_MAX ; ++i ) {
DnTalismanHandle hTalisman = pTalisman->GetTalisman(i);
if( !hTalisman ) continue;
if( hTalisman->IsExistValueType(Type) )
{
VecList.push_back( hTalisman );
}
}
}
}
#endif // PRE_ADD_TALISMAN_SYSTEM
if( ( ListType & PetAbility ) && m_pPetAbilityState )
{
VecList.push_back( m_pPetAbilityState );
}
if( ( ListType & PetAbility ) && m_vecpPetAccessaryState.size() > 0 )
{
for( int i=0; i<(int)m_vecpPetAccessaryState.size(); i++ )
VecList.push_back( m_vecpPetAccessaryState[i] );
}
}
void CDnPlayerState::CalcSetItemState()
{
if( m_nLevel == 0 ) return;
std::map<int, int> nMapSetList;
std::map<int, int>::iterator it;
CDnPlayerActor *pPlayerActor = static_cast<CDnPlayerActor *>(m_pActor);
if( !pPlayerActor ) return;
int nSetItemID = 0;
// <20><EFBFBD><EBB8BB>
for( int i=CDnParts::Helmet; i<=CDnParts::Ring2; i++ ) {
DnPartsHandle hParts = pPlayerActor->GetParts( (CDnParts::PartsTypeEnum)i );
if( !hParts ) continue;
nSetItemID = hParts->GetSetItemID();
if( nSetItemID < 1 ) continue;
#if defined( PRE_ADD_OVERLAP_SETEFFECT )
if( hParts->GetOverLapSet() )
{
CalcOverLapSetItemState(nSetItemID, nMapSetList);
continue;
}
#endif
it = nMapSetList.find( nSetItemID );
if( it != nMapSetList.end() ) {
it->second++;
}
else {
nMapSetList.insert( make_pair( nSetItemID, 1 ) );
}
}
//<2F>ɽ<EFBFBD><C9BD><EFBFBD>
for( int i=CDnParts::CashHelmet; i<=CDnParts::CashFairy; i++ ) {
DnPartsHandle hParts = pPlayerActor->GetCashParts( (CDnParts::PartsTypeEnum)i );
if( !hParts ) continue;
nSetItemID = hParts->GetSetItemID();
if( nSetItemID < 1 ) continue;
#if defined (PRE_ADD_BESTFRIEND)
if (!IsApplyPartsState(pPlayerActor, hParts, false)) continue;
#endif
#if defined( PRE_ADD_OVERLAP_SETEFFECT )
if( hParts->GetOverLapSet() )
{
CalcOverLapSetItemState(nSetItemID, nMapSetList);
continue;
}
#endif
it = nMapSetList.find( nSetItemID );
if( it != nMapSetList.end() ) {
it->second++;
}
else {
nMapSetList.insert( make_pair( nSetItemID, 1 ) );
}
}
// <20><EFBFBD><EBB8BB>
for( int i=0; i<2; i++ ) {
DnWeaponHandle hWeapon = m_pActor->GetWeapon(i);
if( !hWeapon ) continue;
nSetItemID = hWeapon->GetSetItemID();
if( nSetItemID < 1 ) continue;
#if defined( PRE_ADD_OVERLAP_SETEFFECT )
if( hWeapon->GetOverLapSet() )
{
CalcOverLapSetItemState(nSetItemID, nMapSetList);
continue;
}
#endif
it = nMapSetList.find( nSetItemID );
if( it != nMapSetList.end() ) {
it->second++;
}
else {
nMapSetList.insert( make_pair( nSetItemID, 1 ) );
}
}
// <20>ɽ<EFBFBD><C9BD><EFBFBD>
for( int i=0; i<2; i++ ) {
DnWeaponHandle hWeapon = pPlayerActor->GetCashWeapon(i);
if( !hWeapon ) continue;
nSetItemID = hWeapon->GetSetItemID();
if( nSetItemID < 1 ) continue;
#if defined (PRE_ADD_BESTFRIEND)
if (!IsApplyWeaponState(pPlayerActor, hWeapon, false)) continue;
#endif
#if defined( PRE_ADD_OVERLAP_SETEFFECT )
if( hWeapon->GetOverLapSet() )
{
CalcOverLapSetItemState(nSetItemID, nMapSetList);
continue;
}
#endif
it = nMapSetList.find( nSetItemID );
if( it != nMapSetList.end() ) {
it->second++;
}
else {
nMapSetList.insert( make_pair( nSetItemID, 1 ) );
}
}
SAFE_DELETE( m_pSetItemState );
if( nMapSetList.empty() )
{
#ifdef PRE_ADD_COSTUME_SKILL
pPlayerActor->RefreshCostumeSkill( 0, 0 );
#endif
return;
}
m_pSetItemState = new CDnState;
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TSETITEM );
char szLabel[32];
int nTemp;
for( it = nMapSetList.begin(); it != nMapSetList.end(); it++ ) {
if( it->second < 2 ) continue;
nSetItemID = it->first;
std::vector<int> nVecStateList;
for( int i=0; i<12; i++ ) {
sprintf_s( szLabel, "_NeedSetNum%d", i + 1 );
nTemp = pSox->GetFieldFromLablePtr( nSetItemID, szLabel )->GetInteger();
if( nTemp < 2 ) continue;
if( nTemp <= it->second ) nVecStateList.push_back(i);
}
for( DWORD i=0; i<nVecStateList.size(); i++ ) {
sprintf_s( szLabel, "_State%d", nVecStateList[i] + 1 );
int nStateType = pSox->GetFieldFromLablePtr( nSetItemID, szLabel )->GetInteger();
sprintf_s( szLabel, "_State%dValue", nVecStateList[i] + 1 );
char *szValue = pSox->GetFieldFromLablePtr( nSetItemID, szLabel )->GetString();
#ifdef _GAMESERVER
CDnItem::CalcStateValue( m_pActor->GetRoom(), m_pSetItemState, nStateType, szValue, szValue, false, false );
#else
CDnItem::CalcStateValue( m_pSetItemState, nStateType, szValue, szValue, false, false );
#endif
}
}
#ifdef PRE_ADD_COSTUME_SKILL
for( it = nMapSetList.begin(); it != nMapSetList.end(); it++ )
{
nSetItemID = it->first;
int nCustumeSkillNeedCount = pSox->GetFieldFromLablePtr( nSetItemID, "_NeedCSSetNum" )->GetInteger();
if( nCustumeSkillNeedCount > 0 )
{
if( it->second >= nCustumeSkillNeedCount )
{
int nSkillIndex = pSox->GetFieldFromLablePtr( nSetItemID, "_SkillID" )->GetInteger();
int nSkillLevel = pSox->GetFieldFromLablePtr( nSetItemID, "_SkillLevel" )->GetInteger();
pPlayerActor->RefreshCostumeSkill( nSkillIndex, nSkillLevel );
}
else
{
pPlayerActor->RefreshCostumeSkill( 0, 0 );
}
}
}
#endif
}
#if defined( PRE_ADD_OVERLAP_SETEFFECT )
void CDnPlayerState::CalcOverLapSetItemState(int nOverLapSetItemID, std::map<int, int> &nMapSetList)
{
if( nOverLapSetItemID > 0 )
{
int nOverLapID = 0;
std::map<int, int>::iterator it;
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TOVERLAPSETEFFECT );
char szLabel[32];
for(int i=0;i<10;i++)
{
sprintf_s( szLabel, "_SetItemID%d", i + 1 );
nOverLapID = pSox->GetFieldFromLablePtr( nOverLapSetItemID, szLabel )->GetInteger();
if( nOverLapID > 0 )
{
it = nMapSetList.find( nOverLapID );
if( it != nMapSetList.end() ) {
it->second++;
}
else {
nMapSetList.insert( make_pair( nOverLapID, 1 ) );
}
}
else
break;
}
}
}
#endif
void CDnPlayerState::CalcAppellationState()
{
SAFE_DELETE( m_pAppellationState );
if( m_nAppellationIndex == -1 ) return;
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TAPPELLATION );
int nItemID = pSox->GetItemID( m_nAppellationIndex );
if( nItemID == -1 ) return;
bool bExistState = false;
char szLabel[32];
int nState[10] = { -1, };
char *szStateValue[10];
for( int i=0; i<10; i++ ) {
sprintf_s( szLabel, "_State%d", i + 1 );
nState[i] = pSox->GetFieldFromLablePtr( nItemID, szLabel )->GetInteger();
if( nState[i] >= 0 ) bExistState = true;
sprintf_s( szLabel, "_StateValue%d", i + 1 );
szStateValue[i] = pSox->GetFieldFromLablePtr( nItemID, szLabel )->GetString();
}
if( bExistState ) {
m_pAppellationState = new CDnState;
for( int i=0; i<10; i++ ) {
#ifdef _GAMESERVER
CDnItem::CalcStateValue( m_pActor->GetRoom(), m_pAppellationState, nState[i], szStateValue[i], szStateValue[i], false );
#else
CDnItem::CalcStateValue( m_pAppellationState, nState[i], szStateValue[i], szStateValue[i], false );
#endif
}
}
}
void CDnPlayerState::SetAppellationIndex( int nCoverIndex, int nIndex )
{
m_nCoverAppellationIndex = nCoverIndex;
m_nAppellationIndex = nIndex;
}
void CDnPlayerState::ChangeAppellationState( int nCoverArrayIndex, int nArrayIndex )
{
SetAppellationIndex( nCoverArrayIndex, nArrayIndex );
RefreshState( RefreshEquip );
}
bool CDnPlayerState::IsSetAppellationIndex()
{
if( m_nAppellationIndex == -1 && m_nCoverAppellationIndex == -1 )
return false;
return true;
}
void CDnPlayerState::CalcPetAbilityState()
{
if( m_nLevel == 0 ) return;
SAFE_DELETE( m_pPetAbilityState );
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(m_pActor);
if( !pPlayer ) return;
#ifdef _GAMESERVER
if( !pPlayer->GetUserSession() || !pPlayer->GetUserSession()->GetItem() || !pPlayer->IsCanPetMode() ) return;
if( pPlayer->GetUserSession()->GetItem()->GetPetBodyItemID() == 0 && pPlayer->GetUserSession()->GetItem()->GetPetExp() == 0 ) return; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
TPetLevelDetail *pPetData = g_pDataManager->GetPetLevelDetail( pPlayer->GetUserSession()->GetItem()->GetPetBodyItemID(), pPlayer->GetUserSession()->GetItem()->GetPetExp() );
if( !pPetData ) return;
bool bExistState = false;
for( int i=0; i<PetStateMax; i++ )
{
if (pPetData->nState[i] >= 0)
{
bExistState = true;
break;
}
}
#else // _GAMESERVER
if( !pPlayer->GetSummonPet() || !pPlayer->IsSummonPet() ) return;
int nPetLevelTableIndex = GetPetTask().GetPetLevelTableIndex( pPlayer->GetUniqueID() );
if( nPetLevelTableIndex == -1 ) return;
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TPETLEVEL );
if( pSox == NULL ) return;
bool bExistState = false;
char szLabel[32];
int nState[10] = { -1, };
char* szStateMinValue[10];
char* szStateMaxValue[10];
for( int i=0; i<10; i++ )
{
sprintf_s( szLabel, "_State%d", i + 1 );
nState[i] = pSox->GetFieldFromLablePtr( nPetLevelTableIndex, szLabel )->GetInteger();
if( nState[i] >= 0 ) bExistState = true;
sprintf_s( szLabel, "_State%d_Min", i + 1 );
szStateMinValue[i] = pSox->GetFieldFromLablePtr( nPetLevelTableIndex, szLabel )->GetString();
sprintf_s( szLabel, "_State%d_Max", i + 1 );
szStateMaxValue[i] = pSox->GetFieldFromLablePtr( nPetLevelTableIndex, szLabel )->GetString();
}
#endif // _GAMESERVER
if( bExistState )
{
m_pPetAbilityState = new CDnState;
for( int i=0; i<10; i++ )
{
#ifdef _GAMESERVER
if( pPlayer->GetUserSession()->GetItem()->GetPetEquip()->nType & Pet::Type::ePETTYPE_SATIETY ) // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>
{
CDnItem::CalcStateValue( m_pActor->GetRoom(), m_pPetAbilityState, pPetData->nState[i], pPetData->szStateMin[i], pPetData->szStateMax[i], false ,
true, pPlayer->GetUserSession()->GetItem()->GetSatietyApplyStateRatio() );
}
else
{
CDnItem::CalcStateValue( m_pActor->GetRoom(), m_pPetAbilityState, pPetData->nState[i], pPetData->szStateMin[i], pPetData->szStateMax[i], false );
}
#else // _GAMESERVER
if( pPlayer->GetPetInfo().nType & Pet::Type::ePETTYPE_SATIETY ) // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>
{
CDnItem::CalcStateValue( m_pPetAbilityState, nState[i], szStateMinValue[i], szStateMaxValue[i], false, true, GetPetTask().GetSatietyApplyStateRatio() );
}
else
{
CDnItem::CalcStateValue( m_pPetAbilityState, nState[i], szStateMinValue[i], szStateMaxValue[i], false );
}
#endif // _GAMESERVER
}
}
}
void CDnPlayerState::CalcPetAccessaryAbilityState()
{
if( m_nLevel == 0 ) return;
for( int i=0; i<(int)m_vecpPetAccessaryState.size(); i++ )
{
if( m_vecpPetAccessaryState[i] )
SAFE_DELETE( m_vecpPetAccessaryState[i] );
}
m_vecpPetAccessaryState.clear();
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(m_pActor);
if( !pPlayer ) return;
vector<int> vecPartsItemID;
#ifdef _GAMESERVER
if( !pPlayer->GetUserSession() || !pPlayer->GetUserSession()->GetItem() || !pPlayer->IsCanPetMode() ) return;
const TVehicle* pPetEquip = pPlayer->GetUserSession()->GetItem()->GetPetEquip();
if( !pPetEquip ) return;
bool bExistState = false;
for( int i=Pet::Slot::Accessory1; i<Pet::Slot::Max; ++i )
{
if( !pPetEquip->Vehicle[i].nItemID ) continue;
vecPartsItemID.push_back( pPetEquip->Vehicle[i].nItemID );
}
#else // _GAMESERVER
if( !pPlayer->GetSummonPet() || !pPlayer->IsSummonPet() ) return;
for( int i=Pet::Slot::Accessory1; i<Pet::Slot::Max; ++i )
{
if( !pPlayer->GetPetInfo().Vehicle[i].nItemID ) continue;
vecPartsItemID.push_back( pPlayer->GetPetInfo().Vehicle[i].nItemID );
}
#endif // _GAMESERVER
if( vecPartsItemID.size() == 0 ) return;
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TITEM );
if( pSox == NULL ) return;
char szLabel[32];
for( int i=0; i<static_cast<int>( vecPartsItemID.size() ); i++ )
{
bool bExistState = false;
int nState[10] = { -1, };
char* szStateMinValue[10];
char* szStateMaxValue[10];
for( int j=0; j<10; j++ )
{
sprintf_s( szLabel, "_State%d", j + 1 );
nState[j] = pSox->GetFieldFromLablePtr( vecPartsItemID[i], szLabel )->GetInteger();
if( nState[j] >= 0 ) bExistState = true;
sprintf_s( szLabel, "_State%d_Min", j + 1 );
szStateMinValue[j] = pSox->GetFieldFromLablePtr( vecPartsItemID[i], szLabel )->GetString();
sprintf_s( szLabel, "_State%d_Max", j + 1 );
szStateMaxValue[j] = pSox->GetFieldFromLablePtr( vecPartsItemID[i], szLabel )->GetString();
}
if( bExistState )
{
CDnState* pPetEquipState = new CDnState;
for( int k=0; k<10; k++ )
{
#ifdef _GAMESERVER
CDnItem::CalcStateValue( m_pActor->GetRoom(), pPetEquipState, nState[k], szStateMinValue[k], szStateMaxValue[k], false );
#else // _GAMESERVER
CDnItem::CalcStateValue( pPetEquipState, nState[k], szStateMinValue[k], szStateMaxValue[k], false );
#endif // _GAMESERVER
}
m_vecpPetAccessaryState.push_back( pPetEquipState );
}
}
vecPartsItemID.clear();
// <20><> <20><>Ʈȿ<C6AE><C8BF>
pSox = GetDNTable( CDnTableDB::TVEHICLEPARTS );
if( !pSox ) return;
#ifdef _GAMESERVER
int nSetItemID1 = pSox->GetFieldFromLablePtr( pPetEquip->Vehicle[Pet::Slot::Accessory1].nItemID, "_SetItemID" )->GetInteger();
int nSetItemID2 = pSox->GetFieldFromLablePtr( pPetEquip->Vehicle[Pet::Slot::Accessory2].nItemID, "_SetItemID" )->GetInteger();
#else // _GAMESERVER
int nSetItemID1 = pSox->GetFieldFromLablePtr( pPlayer->GetPetInfo().Vehicle[Pet::Slot::Accessory1].nItemID, "_SetItemID" )->GetInteger();
int nSetItemID2 = pSox->GetFieldFromLablePtr( pPlayer->GetPetInfo().Vehicle[Pet::Slot::Accessory2].nItemID, "_SetItemID" )->GetInteger();
#endif // _GAMESERVER
if( nSetItemID1 > 0 && nSetItemID2 > 0 && nSetItemID1 == nSetItemID2 )
{
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TSETITEM );
char szLabel[32];
int nTemp;
std::vector<int> nVecStateList;
for( int i=0; i<12; i++ )
{
sprintf_s( szLabel, "_NeedSetNum%d", i+1 );
nTemp = pSox->GetFieldFromLablePtr( nSetItemID1, szLabel )->GetInteger();
if( nTemp < 2 ) continue;
nVecStateList.push_back(i);
}
CDnState* pPetEquipState = new CDnState;
for( DWORD i=0; i<nVecStateList.size(); i++ )
{
sprintf_s( szLabel, "_State%d", nVecStateList[i] + 1 );
int nStateType = pSox->GetFieldFromLablePtr( nSetItemID1, szLabel )->GetInteger();
sprintf_s( szLabel, "_State%dValue", nVecStateList[i] + 1 );
char *szValue = pSox->GetFieldFromLablePtr( nSetItemID1, szLabel )->GetString();
#ifdef _GAMESERVER
CDnItem::CalcStateValue( m_pActor->GetRoom(), pPetEquipState, nStateType, szValue, szValue, false, false );
#else // _GAMESERVER
CDnItem::CalcStateValue( pPetEquipState, nStateType, szValue, szValue, false, false );
#endif // _GAMESERVER
}
m_vecpPetAccessaryState.push_back( pPetEquipState );
}
}
void CDnPlayerState::RefreshAdditionalState( RefreshStateExtentEnum &Extent, StateTypeEnum &Type )
{
if( Extent != RefreshAll ) {
// RefreshSkill <20>ε<EFBFBD> <20><EFBFBD>ɷ<EFBFBD>ġ<EFBFBD><C4A1> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Equip <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>ϹǷ<CFB9> <20><><EFBFBD>⼭ üũ<C3BC><C5A9><EFBFBD>ش<EFBFBD>.
if( ( Extent & RefreshSkill ) || ( Extent & RefreshEquip ) ) {
if( (Type&ST_Strength) || (Type&ST_Agility) || (Type&ST_Intelligence) || (Type&ST_Stamina) ) {
Extent = RefreshAll;
}
}
}
// <20><><EFBFBD><EFBFBD> State <20><> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20>ɾ<EFBFBD><C9BE>ش<EFBFBD>.
if( Type & ST_Strength ) Type = (StateTypeEnum)( Type | ST_AttackP | ST_Stiff | ST_StiffResistance | ST_Stun );
if( Type & ST_Agility ) Type = (StateTypeEnum)( Type | ST_AttackP | ST_Critical | ST_CriticalResistance );
if( Type & ST_Intelligence ) Type = (StateTypeEnum)( Type | ST_AttackM | ST_DefenseM | ST_SP | ST_RecoverySP );
if( Type & ST_Stamina ) Type = (StateTypeEnum)( Type | ST_DefenseP | ST_HP | ST_StunResistance );
// <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( Type & RefreshEquip ) {
CalcSetItemState();
CalcAppellationState();
CalcPetAbilityState();
CalcPetAccessaryAbilityState();
}
}
#ifdef PRE_ADD_STAGE_DAMAGE_LIMIT
float CDnPlayerState::GetUseStageStateLimit()
{
#if defined(_GAMESERVER)
CDNGameRoom *pRoom = ((CDnPlayerActor*)m_pActor)->GetGameRoom();
if( pRoom )
{
CDnGameTask *pTask = pRoom->GetGameTask();
if( pTask && pTask->GetStageDamageLimit() )
{
return pTask->GetStageDamageLimit()->fStateLimit;
}
}
#else
CDnGameTask *pGameTask = (CDnGameTask*)CTaskManager::GetInstance().GetTask( "GameTask" );
if( pGameTask && pGameTask->GetStageDamageLimit() )
{
return pGameTask->GetStageDamageLimit()->fStateLimit;
}
#endif
return 0;
}
#endif
char CDnPlayerState::GetUseRegulation()
{
#if defined(_GAMESERVER)
CDNGameRoom *pRoom = ((CDnPlayerActor*)m_pActor)->GetGameRoom();
if( pRoom )
{
CDnGameTask *pTask = pRoom->GetGameTask();
if( pTask )
{
if (pRoom->bIsPvPRoom())
{
if( pRoom->bIsZombieMode() )
return 4; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾Ƽ<DEBE><C6BC><EFBFBD> <20>ȵ˴ϴ<CBB4>.
char cPvPRegulation = 1;
if( pRoom->bIsLadderRoom() )
cPvPRegulation = 3;
if( pRoom->bIsGuildWarSystem() )
cPvPRegulation = 5;
#ifdef PRE_ADD_DWC
if( GetAccountLevel() == AccountLevel_DWC )
cPvPRegulation = 9;
#endif
if( pRoom->bIsLevelRegulation() == false )
return 0;
return cPvPRegulation;
}
else if( pRoom->bIsDLRoom() )
{
#ifdef PRE_ADD_CHALLENGE_DARKLAIR
CDnDLGameTask *pDLTask = (CDnDLGameTask *)pTask;
if( pDLTask && pDLTask->IsChallengeDarkLair() )
{
return 7;
}
#endif
return 2;
}
else
{
#if defined( PRE_NORMALSTAGE_REGULATION )
const TMapInfo* pMapInfo = g_pDataManager->GetMapInfo( pRoom->GetGameTask()->GetMapTableID() );
if(pMapInfo)
{
return pMapInfo->cRevisionNum;
}
#endif
}
}
}
return 0;
#else // _CLIENT
CDnGameTask *pGameTask = (CDnGameTask*)CTaskManager::GetInstance().GetTask( "GameTask" );
if( pGameTask )
{
switch( pGameTask->GetGameTaskType() )
{
case GameTaskType::PvP:
{
if( ((CDnPvPGameTask*)pGameTask)->GetGameMode() == PvPCommon::GameMode::PvP_Zombie_Survival )
return 4; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾Ƽ<DEBE><C6BC><EFBFBD> <20>ȵ˴ϴ<CBB4>.
char cPvPRegulation = 1;
if( ((CDnPvPGameTask*)pGameTask)->IsLadderMode() == true )
cPvPRegulation = 3;
if( ((CDnPvPGameTask*)pGameTask)->GetGameMode() == PvPCommon::GameMode::PvP_GuildWar )
cPvPRegulation = 5;
#ifdef PRE_ADD_DWC
if( GetAccountLevel() == AccountLevel_DWC )
cPvPRegulation = 9;
#endif
if( ((CDnPvPGameTask*)pGameTask)->IsUseRegulation() == false )
return 0;
return cPvPRegulation;
}
break;
case GameTaskType::DarkLair:
{
#ifdef PRE_ADD_CHALLENGE_DARKLAIR
CDnDLGameTask* pDarkLairGameTask = static_cast<CDnDLGameTask*>(pGameTask);
if( pDarkLairGameTask && pDarkLairGameTask->IsChallengeDarkLair() )
return 7;
#endif
return 2;
}
break;
case GameTaskType::Normal:
{
#if defined( PRE_NORMALSTAGE_REGULATION )
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TMAP );
if ( pSox )
{
return pSox->GetFieldFromLablePtr( pGameTask->GetGameMapIndex(), "_RevisionNum" )->GetInteger();
}
#endif
}
break;
}
}
return 0;
#endif
}
void CDnPlayerState::CalcStrength( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetStrength( CPlayerLevelTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CPlayerLevelTable::Strength ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetStrength() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetStrengthRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetStrength( nTemp );
#ifdef PRE_ADD_BASE_STAT_REGULATION
OnCalcEquipStep( ST_Strength, &m_StateStep[0] );
#endif
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetStrength() );
nBuffValue = m_StateStep[0].GetStrength() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetStrengthRatio() );
#ifdef PRE_ADD_BASIC_STATE_LIMIT
MODIFY_STATE_VALUE_LIMIT_RATIO_INTEGER( pVecRatioBuffStateList , nBuffValue, fBuffRatioValue, GetStrengthRatio()
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Strength_Ratio_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Strength_Ratio_Max ) );
#endif
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetStrength( nBuffValue - m_StateStep[0].GetStrength() );
m_StateStep[0].SetStrength( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetStrength(), fRatioValue, GetStrengthRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetStrength() );
nTemp += nAddValue;
m_StateStep[1].SetStrength( nTemp );
}
m_nStrength = m_StateStep[0].GetStrength() + m_StateStep[1].GetStrength();
}
void CDnPlayerState::CalcAgility( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetAgility( CPlayerLevelTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CPlayerLevelTable::Agility ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetAgility() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetAgilityRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetAgility( nTemp );
#ifdef PRE_ADD_BASE_STAT_REGULATION
OnCalcEquipStep( ST_Agility, &m_StateStep[0] );
#endif
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetAgility() );
nBuffValue = m_StateStep[0].GetAgility() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetAgilityRatio() );
#ifdef PRE_ADD_BASIC_STATE_LIMIT
MODIFY_STATE_VALUE_LIMIT_RATIO_INTEGER( pVecRatioBuffStateList , nBuffValue, fBuffRatioValue, GetAgilityRatio()
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Agility_Ratio_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Agility_Ratio_Max ) );
#endif
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetAgility( nBuffValue - m_StateStep[0].GetAgility() );
m_StateStep[0].SetAgility( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetAgility(), fRatioValue, GetAgilityRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetAgility() );
nTemp += nAddValue;
m_StateStep[1].SetAgility( nTemp );
}
m_nAgility = m_StateStep[0].GetAgility() + m_StateStep[1].GetAgility();
}
void CDnPlayerState::CalcIntelligence( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetIntelligence( CPlayerLevelTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CPlayerLevelTable::Intelligence ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetIntelligence() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetIntelligenceRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetIntelligence( nTemp );
#ifdef PRE_ADD_BASE_STAT_REGULATION
OnCalcEquipStep( ST_Intelligence, &m_StateStep[0] );
#endif
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetIntelligence() );
nBuffValue = m_StateStep[0].GetIntelligence() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetIntelligenceRatio() );
#ifdef PRE_ADD_BASIC_STATE_LIMIT
MODIFY_STATE_VALUE_LIMIT_RATIO_INTEGER( pVecRatioBuffStateList , nBuffValue, fBuffRatioValue, GetIntelligenceRatio()
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Intelligence_Ratio_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Intelligence_Ratio_Max ) );
#endif
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetIntelligence( nBuffValue - m_StateStep[0].GetIntelligence() );
m_StateStep[0].SetIntelligence( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetIntelligence(), fRatioValue, GetIntelligenceRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetIntelligence() );
nTemp += nAddValue;
m_StateStep[1].SetIntelligence( nTemp );
}
m_nIntelligence = m_StateStep[0].GetIntelligence() + m_StateStep[1].GetIntelligence();
}
void CDnPlayerState::CalcStamina( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetStamina( CPlayerLevelTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CPlayerLevelTable::Stamina ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetStamina() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetStaminaRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetStamina( nTemp );
#ifdef PRE_ADD_BASE_STAT_REGULATION
OnCalcEquipStep( ST_Stamina, &m_StateStep[0] );
#endif
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetStamina() );
nBuffValue = m_StateStep[0].GetStamina() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetStaminaRatio() );
#ifdef PRE_ADD_BASIC_STATE_LIMIT
MODIFY_STATE_VALUE_LIMIT_RATIO_INTEGER( pVecRatioBuffStateList , nBuffValue, fBuffRatioValue, GetStaminaRatio()
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Stamina_Ratio_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Stamina_Ratio_Max ) );
#endif
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetStamina( nBuffValue - m_StateStep[0].GetStamina() );
m_StateStep[0].SetStamina( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetStamina(), fRatioValue, GetStaminaRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetStamina() );
nTemp += nAddValue;
m_StateStep[1].SetStamina( nTemp );
}
m_nStamina = m_StateStep[0].GetStamina() + m_StateStep[1].GetStamina();
}
void CDnPlayerState::CalcAttackP( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp[2] = {0,0};
if( Extent & RefreshBase )
{
int nBaseStrength = m_nStrength;
int nBaseAgility = m_nAgility;
#ifdef PRE_ADD_CHANGE_ATK_FORMULA_BY_STATE
nBaseStrength = m_StateStep[0].GetStrength() - m_BuffState.GetStrength();
nBaseAgility = m_StateStep[0].GetAgility() - m_BuffState.GetAgility();
#endif
int nAttackPoint = (int)( nBaseStrength * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::StrengthAttack ) );
nAttackPoint += (int)( nBaseAgility * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::AgilityAttack ) );
m_BaseState.SetAttackPMin( nAttackPoint );
m_BaseState.SetAttackPMax( nAttackPoint );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetAttackPMin() );
nTemp[0] = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp[0], fRatioValue, GetAttackPMinRatio() );
nTemp[0] += (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetAttackPMax() );
nTemp[1] = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp[1], fRatioValue, GetAttackPMaxRatio() );
nTemp[1] += (int)fRatioValue;
m_StateStep[0].SetAttackPMin( nTemp[0] );
m_StateStep[0].SetAttackPMax( nTemp[1] );
OnCalcEquipStep( ST_AttackP, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue[2];
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetAttackPMin() );
nBuffValue[0] = m_StateStep[0].GetAttackPMin() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue[0], fBuffRatioValue, GetAttackPMinRatio() );
#ifdef PRE_ADD_BUFF_STATE_LIMIT
MODIFY_STATE_VALUE_LIMIT_RATIO_INTEGER( pVecRatioBuffStateList , nBuffValue[0], fBuffRatioValue, GetAttackPMinRatio()
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Magical_AttackRatio_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Magical_AttackRatio_Max ) );
#endif
nBuffValue[0] += (int)fBuffRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetAttackPMax() );
nBuffValue[1] = m_StateStep[0].GetAttackPMax() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue[1], fBuffRatioValue, GetAttackPMaxRatio() );
#ifdef PRE_ADD_BUFF_STATE_LIMIT
MODIFY_STATE_VALUE_LIMIT_RATIO_INTEGER( pVecRatioBuffStateList , nBuffValue[1], fBuffRatioValue, GetAttackPMaxRatio()
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Magical_AttackRatio_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Magical_AttackRatio_Max ) );
#endif
nBuffValue[1] += (int)fBuffRatioValue;
#ifdef PRE_ADD_CHANGE_ATK_FORMULA_BY_STATE
int nBuffSkillStrengh = m_BuffState.GetStrength() + m_StateStep[1].GetStrength();
int nBuffSkillAgility = m_BuffState.GetAgility() + m_StateStep[1].GetAgility();
int nAttackPoint = (int)( nBuffSkillStrengh * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::StrengthAttack ) );
nAttackPoint += (int)( nBuffSkillAgility * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::AgilityAttack ) );
nBuffValue[0] += nAttackPoint;
nBuffValue[1] += nAttackPoint;
#endif
m_BuffState.SetAttackPMin( nBuffValue[0] - m_StateStep[0].GetAttackPMin() );
m_BuffState.SetAttackPMax( nBuffValue[1] - m_StateStep[0].GetAttackPMax() );
m_StateStep[0].SetAttackPMin( nBuffValue[0] );
m_StateStep[0].SetAttackPMax( nBuffValue[1] );
#endif
// #32220 <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. /////////////////////////
std::vector<CDnState *> pVecAbsoluteListBeforePost;
std::vector<CDnState *> pVecRatioListBeforePost;
GetStateList( BeforePostStateEffectList, ValueTypeAbsolute, pVecAbsoluteListBeforePost );
GetStateList( BeforePostStateEffectList, ValueTypeRatio, pVecRatioListBeforePost );
if( false == pVecAbsoluteListBeforePost.empty() || false == pVecRatioListBeforePost.empty() )
{
CALC_STATE_VALUE_RATIO( pVecRatioListBeforePost, m_StateStep[0].GetAttackPMin(), fRatioValue, GetAttackPMinRatio() );
nTemp[0] = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteListBeforePost, nAddValue, GetAttackPMin() );
nTemp[0] += nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioListBeforePost, m_StateStep[0].GetAttackPMax(), fRatioValue, GetAttackPMaxRatio() );
nTemp[1] = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteListBeforePost, nAddValue, GetAttackPMax() );
nTemp[1] += nAddValue;
m_StateStep[0].SetAttackPMin( m_StateStep[0].GetAttackPMin() + nTemp[ 0 ] );
m_StateStep[0].SetAttackPMax( m_StateStep[0].GetAttackPMax() + nTemp[ 1 ] );
}
#ifdef PRE_ADD_STAGE_DAMAGE_LIMIT
if( GetUseStageStateLimit() > 0.f )
{
nTemp[0] = m_StateStep[0].GetAttackPMin();
nTemp[1] = m_StateStep[0].GetAttackPMax();
int nEquipLevelAttackPowerMin = (int)( ( 1.f * GetUseStageStateLimit() ) * ( m_StateStep[0].GetAttackPMin() - m_BuffState.GetAttackPMin() ) );
int nEquipLevelAttackPowerMax = (int)( ( 1.f * GetUseStageStateLimit() ) * ( m_StateStep[0].GetAttackPMax() - m_BuffState.GetAttackPMax() ) );
CALC_STATE_LIMIT( nTemp[0], 0, nEquipLevelAttackPowerMin );
CALC_STATE_LIMIT( nTemp[1], 0, nEquipLevelAttackPowerMax );
#ifdef PRE_ADD_STAGE_LIMIT_INTERFACE
m_sDamageLimitInfo.bPhysicalAttack = ( nTemp[0] == nEquipLevelAttackPowerMin || nTemp[1] == nEquipLevelAttackPowerMax );
#endif
m_StateStep[0].SetAttackPMin( nTemp[0] );
m_StateStep[0].SetAttackPMax( nTemp[1] );
}
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetAttackPMin(), fRatioValue, GetAttackPMinRatio() );
nTemp[0] = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetAttackPMin() );
nTemp[0] += nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetAttackPMax(), fRatioValue, GetAttackPMaxRatio() );
nTemp[1] = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetAttackPMax() );
nTemp[1] += nAddValue;
m_StateStep[1].SetAttackPMin( nTemp[0] );
m_StateStep[1].SetAttackPMax( nTemp[1] );
}
m_nAttackP[0] = m_StateStep[0].GetAttackPMin() + m_StateStep[1].GetAttackPMin();
m_nAttackP[1] = m_StateStep[0].GetAttackPMax() + m_StateStep[1].GetAttackPMax();
#ifndef PRE_ADD_BUFF_STATE_LIMIT
// #31367 <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>ݷ<EFBFBD> <20>ּҰ<D6BC><D2B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>.
float fAttackPowerClampLowestRatio = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AttackPowerClampLowestRatio );
int nAttackPowerLowest = int((float)m_StateStep[0].GetAttackPMin() * fAttackPowerClampLowestRatio);
if( m_nAttackP[ 0 ] < nAttackPowerLowest )
{
m_nAttackP[ 0 ] = nAttackPowerLowest;
m_nAttackP[ 1 ] = int((float)m_StateStep[0].GetAttackPMax() * fAttackPowerClampLowestRatio);
}
#endif
}
void CDnPlayerState::CalcAttackM( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp[2] = {0,0};
if( Extent & RefreshBase )
{
int nBaseIntelligence = m_nIntelligence;
#ifdef PRE_ADD_CHANGE_ATK_FORMULA_BY_STATE
nBaseIntelligence = m_StateStep[0].GetIntelligence() - m_BuffState.GetIntelligence();
#endif
int nAttackPoint = (int)( nBaseIntelligence * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::IntelligenceAttack ) );
m_BaseState.SetAttackMMin( nAttackPoint );
m_BaseState.SetAttackMMax( nAttackPoint );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetAttackMMin() );
nTemp[0] = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp[0], fRatioValue, GetAttackMMinRatio() );
nTemp[0] += (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetAttackMMax() );
nTemp[1] = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp[1], fRatioValue, GetAttackMMaxRatio() );
nTemp[1] += (int)fRatioValue;
m_StateStep[0].SetAttackMMin( nTemp[0] );
m_StateStep[0].SetAttackMMax( nTemp[1] );
OnCalcEquipStep( ST_AttackM, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue[2];
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetAttackMMin() );
nBuffValue[0] = m_StateStep[0].GetAttackMMin() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue[0], fBuffRatioValue, GetAttackMMinRatio() );
#ifdef PRE_ADD_BUFF_STATE_LIMIT
MODIFY_STATE_VALUE_LIMIT_RATIO_INTEGER( pVecRatioBuffStateList , nBuffValue[0], fBuffRatioValue, GetAttackMMinRatio()
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Magical_AttackRatio_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Magical_AttackRatio_Max ) );
#endif
nBuffValue[0] += (int)fBuffRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetAttackMMax() );
nBuffValue[1] = m_StateStep[0].GetAttackMMax() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue[1], fBuffRatioValue, GetAttackMMaxRatio() );
#ifdef PRE_ADD_BUFF_STATE_LIMIT
MODIFY_STATE_VALUE_LIMIT_RATIO_INTEGER( pVecRatioBuffStateList , nBuffValue[1], fBuffRatioValue, GetAttackMMaxRatio()
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Magical_AttackRatio_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Magical_AttackRatio_Max ) );
#endif
nBuffValue[1] += (int)fBuffRatioValue;
#ifdef PRE_ADD_CHANGE_ATK_FORMULA_BY_STATE
int nBuffSkillIntelligence = m_BuffState.GetIntelligence() + m_StateStep[1].GetIntelligence();
int nAttackPoint = (int)( nBuffSkillIntelligence * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::IntelligenceAttack ) );
nBuffValue[0] += nAttackPoint;
nBuffValue[1] += nAttackPoint;
#endif
m_BuffState.SetAttackMMin( nBuffValue[0] - m_StateStep[0].GetAttackMMin() );
m_BuffState.SetAttackMMax( nBuffValue[1] - m_StateStep[0].GetAttackMMax() );
m_StateStep[0].SetAttackMMin( nBuffValue[0] );
m_StateStep[0].SetAttackMMax( nBuffValue[1] );
#endif
// #32220 <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. /////////////////////////
std::vector<CDnState *> pVecAbsoluteListBeforePost;
std::vector<CDnState *> pVecRatioListBeforePost;
GetStateList( BeforePostStateEffectList, ValueTypeAbsolute, pVecAbsoluteListBeforePost );
GetStateList( BeforePostStateEffectList, ValueTypeRatio, pVecRatioListBeforePost );
if( false == pVecAbsoluteListBeforePost.empty() || false == pVecRatioListBeforePost.empty() )
{
CALC_STATE_VALUE_RATIO( pVecRatioListBeforePost, m_StateStep[0].GetAttackMMin(), fRatioValue, GetAttackMMinRatio() );
nTemp[0] = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteListBeforePost, nAddValue, GetAttackMMin() );
nTemp[0] += nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioListBeforePost, m_StateStep[0].GetAttackMMax(), fRatioValue, GetAttackMMaxRatio() );
nTemp[1] = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteListBeforePost, nAddValue, GetAttackMMax() );
nTemp[1] += nAddValue;
m_StateStep[0].SetAttackMMin( m_StateStep[0].GetAttackMMin() + nTemp[ 0 ] );
m_StateStep[0].SetAttackMMax( m_StateStep[0].GetAttackMMax() + nTemp[ 1 ] );
}
#ifdef PRE_ADD_STAGE_DAMAGE_LIMIT
if( GetUseStageStateLimit() > 0.f )
{
nTemp[0] = m_StateStep[0].GetAttackMMin();
nTemp[1] = m_StateStep[0].GetAttackMMax();
int nEquipLevelAttackPowerMin = (int)( ( 1.f * GetUseStageStateLimit() ) * ( m_StateStep[0].GetAttackMMin() - m_BuffState.GetAttackMMin() ) );
int nEquipLevelAttackPowerMax = (int)( ( 1.f * GetUseStageStateLimit() ) * ( m_StateStep[0].GetAttackMMax() - m_BuffState.GetAttackMMax() ) );
CALC_STATE_LIMIT( nTemp[0], 0, nEquipLevelAttackPowerMin );
CALC_STATE_LIMIT( nTemp[1], 0, nEquipLevelAttackPowerMax );
#ifdef PRE_ADD_STAGE_LIMIT_INTERFACE
m_sDamageLimitInfo.bMagicalAttack = ( nTemp[0] == nEquipLevelAttackPowerMin || nTemp[1] == nEquipLevelAttackPowerMax );
#endif
m_StateStep[0].SetAttackMMin( nTemp[0] );
m_StateStep[0].SetAttackMMax( nTemp[1] );
}
#endif
}
if( Extent & RefreshSkill ) {
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetAttackMMin(), fRatioValue, GetAttackMMinRatio() );
nTemp[0] = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetAttackMMin() );
nTemp[0] += nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetAttackMMax(), fRatioValue, GetAttackMMaxRatio() );
nTemp[1] = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetAttackMMax() );
nTemp[1] += nAddValue;
m_StateStep[1].SetAttackMMin( nTemp[0] );
m_StateStep[1].SetAttackMMax( nTemp[1] );
}
m_nAttackM[0] = m_StateStep[0].GetAttackMMin() + m_StateStep[1].GetAttackMMin();
m_nAttackM[1] = m_StateStep[0].GetAttackMMax() + m_StateStep[1].GetAttackMMax();
#ifndef PRE_ADD_BUFF_STATE_LIMIT
// #31367 <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>ݷ<EFBFBD> <20>ּҰ<D6BC><D2B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>.
float fAttackPowerClampLowestRatio = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AttackPowerClampLowestRatio );
int nAttackPowerLowest = int((float)m_StateStep[0].GetAttackMMin() * fAttackPowerClampLowestRatio);
if( m_nAttackM[ 0 ] < nAttackPowerLowest )
{
m_nAttackM[ 0 ] = nAttackPowerLowest;
m_nAttackM[ 1 ] = int((float)m_StateStep[0].GetAttackMMax() * fAttackPowerClampLowestRatio);
}
#endif
}
void CDnPlayerState::CalcDefenseP( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetDefenseP( (int)( m_nStamina * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::PhysicalDefense ) ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetDefenseP() );
if( nAddValue <= 0 ) nAddValue = 1;
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetDefensePRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetDefenseP( nTemp );
OnCalcEquipStep( ST_DefenseP, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetDefenseP() );
nBuffValue = m_StateStep[0].GetDefenseP() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetDefensePRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetDefenseP( nBuffValue - m_StateStep[0].GetDefenseP() );
m_StateStep[0].SetDefenseP( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetDefenseP(), fRatioValue, GetDefensePRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetDefenseP() );
nTemp += nAddValue;
m_StateStep[1].SetDefenseP( nTemp );
}
m_nDefenseP = m_StateStep[0].GetDefenseP() + m_StateStep[1].GetDefenseP();
}
void CDnPlayerState::CalcDefenseM( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetDefenseM( (int)( m_nIntelligence * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::MagicDefense ) ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetDefenseM() );
if( nAddValue <= 0 ) nAddValue = 1;
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetDefenseMRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetDefenseM( nTemp );
OnCalcEquipStep( ST_DefenseM, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetDefenseM() );
nBuffValue = m_StateStep[0].GetDefenseM() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetDefenseMRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetDefenseM( nBuffValue - m_StateStep[0].GetDefenseM() );
m_StateStep[0].SetDefenseM( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetDefenseM(), fRatioValue, GetDefenseMRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetDefenseM() );
nTemp += nAddValue;
m_StateStep[1].SetDefenseM( nTemp );
}
m_nDefenseM = m_StateStep[0].GetDefenseM() + m_StateStep[1].GetDefenseM();
}
void CDnPlayerState::CalcHP( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList, bool bRevisionCurrentHP )
{
float fRatioValue;
INT64 nAddValue;
INT64 nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetMaxHP( (INT64)( m_nStamina * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::HP ) ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetMaxHP() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetMaxHPRatio() );
nTemp += (INT64)fRatioValue;
m_StateStep[0].SetMaxHP( nTemp );
OnCalcEquipStep( ST_HP, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
INT64 nBuffAddValue;
INT64 nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetMaxHP() );
nBuffValue = m_StateStep[0].GetMaxHP() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetMaxHPRatio() );
nBuffValue += (INT64)fBuffRatioValue;
m_BuffState.SetMaxHP( nBuffValue - m_StateStep[0].GetMaxHP() );
m_StateStep[0].SetMaxHP( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetMaxHP(), fRatioValue, GetMaxHPRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetMaxHP() );
nTemp += nAddValue;
m_StateStep[1].SetMaxHP( nTemp );
}
m_nMaxHP = m_StateStep[0].GetMaxHP() + m_StateStep[1].GetMaxHP();
#if defined(PRE_ADD_MISSION_COUPON)
if( bRevisionCurrentHP && m_nHP > m_nMaxHP ) SetHP(m_nMaxHP);
#else
if( bRevisionCurrentHP && m_nHP > m_nMaxHP ) m_nHP = m_nMaxHP;
#endif
}
void CDnPlayerState::CalcSP(RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList, bool bRevisionCurrentSP)
{
float fRatioValue;
int nAddValue;
int nTemp;
if (Extent & RefreshBase) {
m_BaseState.SetMaxSP((int)(m_nIntelligence * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::SP)));
}
if (Extent & RefreshEquip) {
CALC_STATE_VALUE_ABSOLUTE(pVecAbsoluteList[0], nAddValue, GetMaxSP());
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO(pVecRatioList[0], nTemp, fRatioValue, GetMaxSPRatio());
nTemp += (int)fRatioValue;
m_StateStep[0].SetMaxSP(nTemp);
OnCalcEquipStep(ST_SP, &m_StateStep[0]);
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetMaxSP() );
nBuffValue = m_StateStep[0].GetMaxSP() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetMaxSPRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetMaxSP( nBuffValue - m_StateStep[0].GetMaxSP() );
m_StateStep[0].SetMaxSP( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetMaxSP(), fRatioValue, GetMaxSPRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetMaxSP() );
nTemp += nAddValue;
m_StateStep[1].SetMaxSP( nTemp );
}
m_nMaxSP = m_StateStep[0].GetMaxSP() + m_StateStep[1].GetMaxSP();
#if defined(PRE_ADD_MISSION_COUPON)
if( bRevisionCurrentSP && m_nSP > m_nMaxSP ) SetSP(m_nMaxSP);
#else
if( bRevisionCurrentSP && m_nSP > m_nMaxSP ) m_nSP = m_nMaxSP;
#endif
}
void CDnPlayerState::CalcMoveSpeed( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase ) {
float fValue1 = CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::MoveSpeed );
m_BaseState.SetMoveSpeed( (int)fValue1 );
}
if( Extent & RefreshEquip ) {
float fValue1 = CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::MoveSpeed );
float fValue2 = CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::MoveSpeedRevision );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetMoveSpeed() );
nTemp = (int)( fValue1 * ( 2.f / ( 1.f + exp( -1 * ( ( nAddValue - fValue1 ) / fValue2 ) ) ) ) );
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetMoveSpeedRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetMoveSpeed( nTemp );
OnCalcEquipStep( ST_MoveSpeed, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetMoveSpeed() );
nBuffValue = m_StateStep[0].GetMoveSpeed() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetMoveSpeedRatio() );
#ifdef PRE_ADD_SLOW_DEBUFF_LIMIT
#ifdef _GAMESERVER
CDNGameRoom* pRoom = ((CDnPlayerActor*)m_pActor)->GetGameRoom();
if( pRoom && pRoom->bIsPvPRoom() )
#else // _GAMESERVER
CDnGameTask* pGameTask = (CDnGameTask*)CTaskManager::GetInstance().GetTask( "GameTask" );
if( pGameTask && pGameTask->GetGameTaskType() == GameTaskType::PvP )
#endif // _GAMESERVER
{
MODIFY_STATE_VALUE_LIMIT_RATIO_INTEGER( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetMoveSpeedRatio()
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MoveSpeedRatio_Limit_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MoveSpeedRatio_Limit_Max ) );
}
#endif // PRE_ADD_SLOW_DEBUFF_LIMIT
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetMoveSpeed( nBuffValue - m_StateStep[0].GetMoveSpeed() );
m_StateStep[0].SetMoveSpeed( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetMoveSpeed(), fRatioValue, GetMoveSpeedRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetMoveSpeed() );
nTemp += nAddValue;
m_StateStep[1].SetMoveSpeed( nTemp );
}
m_nMoveSpeed = m_StateStep[0].GetMoveSpeed() + m_StateStep[1].GetMoveSpeed();
}
void CDnPlayerState::CalcDownDelay( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fAddValue;
float fTemp;
if( Extent & RefreshBase ) {
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], fAddValue, GetDownDelayProb() );
fTemp = fAddValue;
CALC_STATE_LIMIT( fTemp, 0.f, 1.f );
m_StateStep[0].SetDownDelayProb( fTemp );
}
if( Extent & RefreshSkill ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], fAddValue, GetDownDelayProb() );
fTemp = fAddValue;
CALC_STATE_LIMIT( fTemp, 0.f, 1.f );
m_StateStep[1].SetDownDelayProb( fTemp );
}
m_fDownDelayProb = m_StateStep[0].GetDownDelayProb() + m_StateStep[1].GetDownDelayProb();
m_fDownDelayProb *= CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::DownDelay );
}
void CDnPlayerState::CalcStiff( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
int nAddValue;
float fRatioValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetStiff( (int)( m_nStrength * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::Stiff ) ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetStiff() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetStiffRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetStiff( nTemp );
OnCalcEquipStep( ST_Stiff, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetStiff() );
nBuffValue = m_StateStep[0].GetStiff() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetStiffRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetStiff( nBuffValue - m_StateStep[0].GetStiff() );
m_StateStep[0].SetStiff( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetStiff(), fRatioValue, GetStiffRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetStiff() );
nTemp += nAddValue;
m_StateStep[1].SetStiff( nTemp );
}
m_nStiff = m_StateStep[0].GetStiff() + m_StateStep[1].GetStiff();
}
void CDnPlayerState::CalcStiffResistance( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
int nAddValue;
float fRatioValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetStiffResistance( (int)( m_nStrength * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::StiffResistance ) ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetStiffResistance() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetStiffResistanceRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetStiffResistance( nTemp );
OnCalcEquipStep( ST_StiffResistance, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetStiffResistance() );
nBuffValue = m_StateStep[0].GetStiffResistance() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetStiffResistanceRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetStiffResistance( nBuffValue - m_StateStep[0].GetStiffResistance() );
m_StateStep[0].SetStiffResistance( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetStiffResistance(), fRatioValue, GetStiffResistanceRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetStiffResistance() );
nTemp += nAddValue;
m_StateStep[1].SetStiffResistance( nTemp );
}
m_nStiffResistance = m_StateStep[0].GetStiffResistance() + m_StateStep[1].GetStiffResistance();
}
void CDnPlayerState::CalcCritical( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
int nAddValue;
float fRatioValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetCritical( (int)( m_nAgility * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::Critical ) ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetCritical() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetCriticalRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetCritical( nTemp );
OnCalcEquipStep( ST_Critical, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetCritical() );
nBuffValue = m_StateStep[0].GetCritical() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetCriticalRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetCritical( nBuffValue - m_StateStep[0].GetCritical() );
m_StateStep[0].SetCritical( nBuffValue );
#endif
// #32220 <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. /////////////////////////
std::vector<CDnState *> pVecAbsoluteListBeforePost;
std::vector<CDnState *> pVecRatioListBeforePost;
GetStateList( BeforePostStateEffectList, ValueTypeAbsolute, pVecAbsoluteListBeforePost );
GetStateList( BeforePostStateEffectList, ValueTypeRatio, pVecRatioListBeforePost );
if( false == pVecAbsoluteListBeforePost.empty() || false == pVecRatioListBeforePost.empty() )
{
CALC_STATE_VALUE_RATIO( pVecRatioListBeforePost, m_StateStep[0].GetAttackPMin(), fRatioValue, GetCriticalRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteListBeforePost, nAddValue, GetCritical() );
nTemp += nAddValue;
m_StateStep[0].SetCritical( m_StateStep[0].GetCritical() + nTemp );
}
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetCritical(), fRatioValue, GetCriticalRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetCritical() );
nTemp += nAddValue;
m_StateStep[1].SetCritical( nTemp );
}
m_nCritical = m_StateStep[0].GetCritical() + m_StateStep[1].GetCritical();
}
void CDnPlayerState::CalcCriticalResistance( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
int nAddValue;
float fRatioValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetCriticalResistance( (int)( m_nAgility * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::CriticalResistance ) ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetCriticalResistance() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetCriticalResistanceRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetCriticalResistance( nTemp );
OnCalcEquipStep( ST_CriticalResistance, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetCriticalResistance() );
nBuffValue = m_StateStep[0].GetCriticalResistance() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetCriticalResistanceRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetCriticalResistance( nBuffValue - m_StateStep[0].GetCriticalResistance() );
m_StateStep[0].SetCriticalResistance( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetCriticalResistance(), fRatioValue, GetCriticalResistanceRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetCriticalResistance() );
nTemp += nAddValue;
m_StateStep[1].SetCriticalResistance( nTemp );
}
m_nCriticalResistance = m_StateStep[0].GetCriticalResistance() + m_StateStep[1].GetCriticalResistance();
}
void CDnPlayerState::CalcStun( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
int nAddValue;
float fRatioValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetStun( (int)( m_nStrength * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::Stun ) ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetStun() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetStunRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetStun( nTemp );
OnCalcEquipStep( ST_Stun, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetStun() );
nBuffValue = m_StateStep[0].GetStun() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetStunRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetStun( nBuffValue - m_StateStep[0].GetStun() );
m_StateStep[0].SetStun( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetStun(), fRatioValue, GetStunRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetStun() );
nTemp += nAddValue;
m_StateStep[1].SetStun( nTemp );
}
m_nStun = m_StateStep[0].GetStun() + m_StateStep[1].GetStun();
}
void CDnPlayerState::CalcStunResistance( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
int nAddValue;
float fRatioValue;
int nTemp;
if( Extent & RefreshBase ) {
m_BaseState.SetStunResistance( (int)( m_nStamina * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::StunResistance ) ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetStunResistance() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetStunResistanceRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetStunResistance( nTemp );
OnCalcEquipStep( ST_StunResistance, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetStunResistance() );
nBuffValue = m_StateStep[0].GetStunResistance() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetStunResistanceRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetStunResistance( nBuffValue - m_StateStep[0].GetStunResistance() );
m_StateStep[0].SetStunResistance( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetStunResistance(), fRatioValue, GetStunResistanceRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetStunResistance() );
nTemp += nAddValue;
m_StateStep[1].SetStunResistance( nTemp );
}
m_nStunResistance = m_StateStep[0].GetStunResistance() + m_StateStep[1].GetStunResistance();
}
void CDnPlayerState::CalcElementAttack( ElementEnum Type, RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fAddValue;
float fTemp;
if( Extent & RefreshBase ) {
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], fAddValue, GetElementAttack( Type ) );
fTemp = fAddValue * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::ElementAttack );
m_StateStep[0].SetElementAttack( Type , fTemp );
#ifdef PRE_FIX_ELEMENT_REGULATION
OnCalcEquipStep_ElementAttack( Type, &m_StateStep[0] );
#else
OnCalcEquipStep( ST_ElementAttack, &m_StateStep[0] );
#endif
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffAddValue;
float fBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , fBuffAddValue , GetElementAttack(Type) );
fBuffValue = m_StateStep[0].GetElementAttack(Type) + fBuffAddValue;
#ifdef PRE_ADD_BUFF_STATE_LIMIT
MODIFY_STATE_VALUE_LIMIT_ABSOLUTE( pVecAbsoluteBuffStateList , fBuffValue , GetElementAttack(Type)
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_Attack_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_Attack_Max ) );
#endif
m_BuffState.SetElementAttack( Type , fBuffValue - m_StateStep[0].GetElementAttack( Type ) );
m_StateStep[0].SetElementAttack( Type , fBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], fAddValue, GetElementAttack( Type ) );
fTemp = fAddValue;
m_StateStep[1].SetElementAttack( Type, fTemp );
}
m_fElementAttack[Type] = m_StateStep[0].GetElementAttack( Type ) + m_StateStep[1].GetElementAttack( Type );
}
void CDnPlayerState::CalcElementDefense( ElementEnum Type, RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fAddValue;
float fTemp;
if( Extent & RefreshBase ) {
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], fAddValue, GetElementDefense( Type ) );
fTemp = fAddValue * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::ElementDefense );
m_StateStep[0].SetElementDefense( Type , fTemp );
#ifdef PRE_FIX_ELEMENT_REGULATION
OnCalcEquipStep_ElementDefense( Type, &m_StateStep[0] );
#else
OnCalcEquipStep( ST_ElementDefense, &m_StateStep[0] );
#endif
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffAddValue;
float fBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , fBuffAddValue , GetElementDefense(Type) );
fBuffValue = m_StateStep[0].GetElementDefense(Type) + fBuffAddValue;
#ifdef PRE_ADD_BUFF_STATE_LIMIT
MODIFY_STATE_VALUE_LIMIT_ABSOLUTE( pVecAbsoluteBuffStateList , fBuffValue , GetElementDefense(Type)
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_Defense_Min )
, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_Defense_Max ) );
#endif
m_BuffState.SetElementDefense( Type , fBuffValue - m_StateStep[0].GetElementDefense( Type ) );
#ifdef PRE_ADD_ELEMENT_DEFENSE_LIMIT
if( fBuffValue > CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_Defense_Limit ) )
{
fBuffValue = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_Defense_Limit );
}
#endif
m_StateStep[0].SetElementDefense( Type , fBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], fAddValue, GetElementDefense( Type ) );
fTemp = fAddValue;
m_StateStep[1].SetElementDefense( Type, fTemp );
}
m_fElementDefense[Type] = m_StateStep[0].GetElementDefense( Type ) + m_StateStep[1].GetElementDefense( Type );
#ifdef PRE_ADD_ELEMENT_DEFENSE_LIMIT
if( m_fElementDefense[Type] > CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_Defense_Limit ) )
{
m_fElementDefense[Type] = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_Defense_Limit );
}
#endif
}
void CDnPlayerState::CalcRecoverySP( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase )
{
m_BaseState.SetRecoverySP( (int)( GetLevelWeightValue() * CPlayerWeightTable::GetInstance().GetValue( m_nActorTableID, CPlayerWeightTable::RecoverySP ) ) );
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetRecoverySP() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetRecoverySPRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetRecoverySP( nTemp );
OnCalcEquipStep( ST_RecoverySP, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetRecoverySP() );
nBuffValue = m_StateStep[0].GetRecoverySP() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetRecoverySPRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetRecoverySP( nBuffValue - m_StateStep[0].GetRecoverySP() );
m_StateStep[0].SetRecoverySP( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetRecoverySP(), fRatioValue, GetRecoverySPRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetRecoverySP() );
nTemp += nAddValue;
m_StateStep[1].SetRecoverySP( nTemp );
}
m_nRecoverySP = m_StateStep[0].GetRecoverySP() + m_StateStep[1].GetRecoverySP();
}
void CDnPlayerState::CalcSuperAmmor( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase ) {
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetSuperAmmor() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetSuperAmmorRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetSuperAmmor( nTemp );
OnCalcEquipStep( ST_SuperAmmor, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetSuperAmmor() );
nBuffValue = m_StateStep[0].GetSuperAmmor() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetSuperAmmorRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetSuperAmmor( nBuffValue - m_StateStep[0].GetSuperAmmor() );
m_StateStep[0].SetSuperAmmor( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetSuperAmmor(), fRatioValue, GetSuperAmmorRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetSuperAmmor() );
nTemp += nAddValue;
m_StateStep[1].SetSuperAmmor( nTemp );
}
m_nSuperAmmor = m_StateStep[0].GetSuperAmmor() + m_StateStep[1].GetSuperAmmor();
}
void CDnPlayerState::CalcFinalDamage( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp = 0;
if( Extent & RefreshBase ) {
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetFinalDamage() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetFinalDamageRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetFinalDamage( nTemp );
OnCalcEquipStep( ST_FinalDamage, &m_StateStep[0] );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetFinalDamage() );
nBuffValue = m_StateStep[0].GetFinalDamage() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetFinalDamageRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetFinalDamage( nBuffValue - m_StateStep[0].GetFinalDamage() );
m_StateStep[0].SetFinalDamage( nBuffValue );
#endif
}
if( Extent & RefreshSkill )
{
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetFinalDamageRatio(), fRatioValue, GetFinalDamageRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetFinalDamage() );
nTemp = nAddValue;
m_StateStep[1].SetFinalDamage( nTemp );
}
m_nFinalDamage = m_StateStep[0].GetFinalDamage() + m_StateStep[1].GetFinalDamage();
}
void CDnPlayerState::CalcSpirit( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase ) {
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetSpirit() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], nTemp, fRatioValue, GetSpiritRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetSpirit( nTemp );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetSpirit() );
nBuffValue = m_StateStep[0].GetSpirit() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetSpiritRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetSpirit( nBuffValue - m_StateStep[0].GetSpirit() );
m_StateStep[0].SetSpirit( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetSpirit(), fRatioValue, GetSpiritRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetSpirit() );
nTemp += nAddValue;
m_StateStep[1].SetSpirit( nTemp );
}
m_nSpirit = m_StateStep[0].GetSpirit() + m_StateStep[1].GetSpirit();
}
void CDnPlayerState::CalcSafeZoneMoveSpeed( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fRatioValue;
int nAddValue;
int nTemp;
if( Extent & RefreshBase ) {
}
if( Extent & RefreshEquip ) {
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], nAddValue, GetSafeZoneMoveSpeed() );
nTemp = nAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioList[0], (nTemp + m_nMoveSpeed), fRatioValue, GetSafeZoneMoveSpeedRatio() );
nTemp += (int)fRatioValue;
m_StateStep[0].SetSafeZoneMoveSpeed( nTemp );
#ifdef PRE_ADD_SKILLBUF_RENEW
float fBuffRatioValue;
int nBuffAddValue;
int nBuffValue;
std::vector<CDnState*> pVecAbsoluteBuffStateList;
std::vector<CDnState*> pVecRatioBuffStateList;
GetBuffStateList( CDnState::ValueType::ValueTypeAbsolute, pVecAbsoluteBuffStateList );
GetBuffStateList( CDnState::ValueType::ValueTypeRatio, pVecRatioBuffStateList );
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteBuffStateList , nBuffAddValue , GetSafeZoneMoveSpeed() );
nBuffValue = m_StateStep[0].GetSafeZoneMoveSpeed() + nBuffAddValue;
CALC_STATE_VALUE_RATIO( pVecRatioBuffStateList, nBuffValue, fBuffRatioValue, GetSafeZoneMoveSpeedRatio() );
nBuffValue += (int)fBuffRatioValue;
m_BuffState.SetSafeZoneMoveSpeed( nBuffValue - m_StateStep[0].GetSafeZoneMoveSpeed() );
m_StateStep[0].SetSafeZoneMoveSpeed( nBuffValue );
#endif
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_RATIO( pVecRatioList[1], m_StateStep[0].GetSafeZoneMoveSpeed(), fRatioValue, GetSafeZoneMoveSpeedRatio() );
nTemp = (int)fRatioValue;
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], nAddValue, GetSafeZoneMoveSpeed() );
nTemp += nAddValue;
m_StateStep[1].SetSafeZoneMoveSpeed( nTemp );
}
m_nSafeZoneMoveSpeed = m_StateStep[0].GetSafeZoneMoveSpeed() + m_StateStep[1].GetSafeZoneMoveSpeed();
}
void CDnPlayerState::CalcAddExp( RefreshStateExtentEnum Extent, std::vector<CDnState *> *pVecAbsoluteList, std::vector<CDnState *> *pVecRatioList )
{
float fAddValue;
float fTemp;
if( Extent & RefreshBase ) {
}
if( Extent & RefreshEquip ) {
//<2F><><EFBFBD><EFBFBD>
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[0], fAddValue, GetAddExp() );
fTemp = fAddValue;
m_StateStep[0].SetAddExp( fTemp );
}
if( Extent & RefreshSkill ) {
// PostStateEffect
CALC_STATE_VALUE_ABSOLUTE( pVecAbsoluteList[1], fAddValue, GetAddExp() );
fTemp = fAddValue;
m_StateStep[1].SetAddExp( fTemp );
}
m_fAddExp = m_StateStep[0].GetAddExp() + m_StateStep[1].GetAddExp();
}
void CDnPlayerState::OnCalcEquipStep_ElementAttack( ElementEnum eElementType , CDnState *pState )
{
char cRegulation = GetUseRegulation();
if( cRegulation == 0 ) return;
float fDeclarationRatio = 0.f;
float fRevision = 0.f;
#if defined(PRE_FIX_ELEMENT_REGULATION_RENEW)
float fCurrentElement = pState->GetElementAttack( eElementType );
float fBasisValue = (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::ElementAttackRevision );
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::ElementAttackRevision );
fDeclarationRatio = pow( fCurrentElement / fBasisValue , fRevision );
pState->SetElementAttack( eElementType , CEqualLevelTable::GetInstance().GetValueFloat( cRegulation, GetJobClassID(), CEqualLevelTable::ElementAttackRevision ) * fDeclarationRatio );
#else
float fCurrentElement = pState->GetElementAttack( eElementType );
float fExpotentLimit = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_Expotent_Limit );
float fBasisValue = (float)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_EqualBasis );
if( fCurrentElement <= fExpotentLimit)
{
pState->SetElementAttack( eElementType , fCurrentElement );
}
else
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::ElementAttackRevision );
fDeclarationRatio = pow( fCurrentElement / fBasisValue , fRevision );
pState->SetElementAttack( eElementType , (float)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::Element_EqualLevel ) * fDeclarationRatio );
}
#endif
}
void CDnPlayerState::OnCalcEquipStep_ElementDefense( ElementEnum eElementType , CDnState *pState )
{
char cRegulation = GetUseRegulation();
if( cRegulation == 0 ) return;
float fDeclarationRatio = 0.f;
float fRevision = 0.f;
#ifdef PRE_FIX_ELEMENT_REGULATION_RENEW // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>۵<EFBFBD><DBB5>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD>
float fCurrentElement = pState->GetElementDefense( eElementType );
float fBasisValue = (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::ElementDefenseRevision );
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::ElementDefenseRevision );
fDeclarationRatio = pow( fCurrentElement / fBasisValue , fRevision );
pState->SetElementDefense( eElementType , CEqualLevelTable::GetInstance().GetValueFloat( cRegulation, GetJobClassID(), CEqualLevelTable::ElementDefenseRevision ) * fDeclarationRatio );
#endif
}
void CDnPlayerState::OnCalcEquipStep( StateTypeEnum Type, CDnState *pState )
{
char cRegulation = GetUseRegulation();
if( cRegulation == 0 ) return;
float fDeclarationRatio = 0.f;
float fRevision = 0.f;
switch( Type ) {
#if defined(PRE_ADD_REVEAL_REGULATION_VALUE) || defined(_GAMESERVER)
case ST_AttackP:
{
#ifdef PRE_FIX_MODIFY_AVERAGE_DAMAGE_REGULATION
float fMinRevisionSquare = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::PhysicalAttackMinRevision );
float fMaxRevisionSquare = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::PhysicalAttackMaxRevision );
fRevision = (fMinRevisionSquare + fMaxRevisionSquare) / 2; // <20>񱳴<EFBFBD><F1B1B3B4><EFBFBD><EFBFBD>̵<EFBFBD> Square <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
float fMinRevisionValue = (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::PhysicalAttackMinRevision );
float fMaxRevisionValue = (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::PhysicalAttackMaxRevision );
float fTotalRevisionValue = fMinRevisionValue + fMaxRevisionValue; // <20>񱳴<EFBFBD><F1B1B3B4><EFBFBD><EFBFBD>̵<EFBFBD> Value <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
float fTotalAttackValue = (float)pState->GetAttackPMin() + (float)pState->GetAttackPMax();
fDeclarationRatio = pow( ( fTotalAttackValue / fTotalRevisionValue ) , fRevision );
float fBasisValueMin = (float)CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::PhysicalAttackMinRevision );
float fBaseisValueMax = (float)CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::PhysicalAttackMaxRevision );
float fResultTotalValue = (fBasisValueMin + fBaseisValueMax) * fDeclarationRatio;
float fResultMinValue = fResultTotalValue * ( (float)pState->GetAttackPMin() / (float)(pState->GetAttackPMin() + pState->GetAttackPMax()) );
float fResultMaxValue = fResultTotalValue * ( (float)pState->GetAttackPMax() / (float)(pState->GetAttackPMin() + pState->GetAttackPMax()) );
pState->SetAttackPMin( (int)fResultMinValue );
pState->SetAttackPMax( (int)fResultMaxValue );
#else
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::PhysicalAttackMinRevision );
fDeclarationRatio = pow( pState->GetAttackPMin() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::PhysicalAttackMinRevision ), fRevision );
pState->SetAttackPMin( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::PhysicalAttackMinRevision ) * fDeclarationRatio ) );
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::PhysicalAttackMaxRevision );
fDeclarationRatio = pow( pState->GetAttackPMax() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::PhysicalAttackMaxRevision ), fRevision );
pState->SetAttackPMax( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::PhysicalAttackMaxRevision ) * fDeclarationRatio ) );
#endif
}
break;
case ST_AttackM:
{
#ifdef PRE_FIX_MODIFY_AVERAGE_DAMAGE_REGULATION
float fMinRevisionSquare = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::MagicAttackMinRevision );
float fMaxRevisionSquare = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::MagicAttackMaxRevision );
fRevision = (fMinRevisionSquare + fMaxRevisionSquare) / 2; // <20>񱳴<EFBFBD><F1B1B3B4><EFBFBD><EFBFBD>̵<EFBFBD> Square <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
float fMinRevisionValue = (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::MagicAttackMinRevision );
float fMaxRevisionValue = (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::MagicAttackMaxRevision );
fDeclarationRatio = fMinRevisionValue + fMaxRevisionValue; // <20>񱳴<EFBFBD><F1B1B3B4><EFBFBD><EFBFBD>̵<EFBFBD> Value <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
float fTotalAttackValue = (float)pState->GetAttackMMin() + (float)pState->GetAttackMMax();
float fResultTotalRatio = pow( (fTotalAttackValue / fDeclarationRatio ) , fRevision );
float fBasisValueMin = (float)CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::MagicAttackMinRevision );
float fBaseisValueMax = (float)CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::MagicAttackMaxRevision );
float fResultTotalValue = (fBasisValueMin + fBaseisValueMax) * fResultTotalRatio;
float fResultMinValue = fResultTotalValue * ( (float)pState->GetAttackMMin() / (float)(pState->GetAttackMMin() + pState->GetAttackMMax()) );
float fResultMaxValue = fResultTotalValue * ( (float)pState->GetAttackMMax() / (float)(pState->GetAttackMMin() + pState->GetAttackMMax()) );
pState->SetAttackMMin( (int)fResultMinValue );
pState->SetAttackMMax( (int)fResultMaxValue );
#else
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::MagicAttackMinRevision );
fDeclarationRatio = pow( pState->GetAttackMMin() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::MagicAttackMinRevision ), fRevision );
pState->SetAttackMMin( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::MagicAttackMinRevision ) * fDeclarationRatio ) );
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::MagicAttackMaxRevision );
fDeclarationRatio = pow( pState->GetAttackMMax() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::MagicAttackMaxRevision ), fRevision );
pState->SetAttackMMax( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::MagicAttackMaxRevision ) * fDeclarationRatio ) );
#endif
}
break;
case ST_DefenseP:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::PhysicalDefenseRevision );
fDeclarationRatio = pow( pState->GetDefenseP() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::PhysicalDefenseRevision ), fRevision );
pState->SetDefenseP( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::PhysicalDefenseRevision ) * fDeclarationRatio ) );
}
break;
case ST_DefenseM:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::MagicDefenseRevision );
fDeclarationRatio = pow( pState->GetDefenseM() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::MagicDefenseRevision ), fRevision );
pState->SetDefenseM( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::MagicDefenseRevision ) * fDeclarationRatio ) );
}
break;
case ST_Stiff:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::StiffRevision );
fDeclarationRatio = pow( pState->GetStiff() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::StiffRevision ), fRevision );
pState->SetStiff( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::StiffRevision ) * fDeclarationRatio ) );
}
break;
case ST_StiffResistance:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::StiffResistanceRevision );
fDeclarationRatio = pow( pState->GetStiffResistance() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::StiffResistanceRevision ), fRevision );
pState->SetStiffResistance( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::StiffResistanceRevision ) * fDeclarationRatio ) );
}
break;
case ST_Critical:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::CriticalRevision );
fDeclarationRatio = pow( pState->GetCritical() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::CriticalRevision ), fRevision );
pState->SetCritical( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::CriticalRevision ) * fDeclarationRatio ) );
}
break;
case ST_CriticalResistance:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::CriticalResistanceRevision );
fDeclarationRatio = pow( pState->GetCriticalResistance() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::CriticalResistanceRevision ), fRevision );
pState->SetCriticalResistance( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::CriticalResistanceRevision ) * fDeclarationRatio ) );
}
break;
case ST_Stun:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::StunRevision );
fDeclarationRatio = pow( pState->GetStun() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::StunRevision ), fRevision );
pState->SetStun( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::StunRevision ) * fDeclarationRatio ) );
}
break;
case ST_StunResistance:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::StunResistanceRevision );
fDeclarationRatio = pow( pState->GetStunResistance() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::StunResistanceRevision ), fRevision );
pState->SetStunResistance( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::StunResistanceRevision ) * fDeclarationRatio ) );
}
break;
case ST_SuperAmmor:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::SuperAmmorRevision );
fDeclarationRatio = pow( pState->GetSuperAmmor() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::SuperAmmorRevision ), fRevision );
pState->SetSuperAmmor( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::SuperAmmorRevision ) * fDeclarationRatio ) );
}
break;
case ST_RecoverySP:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::RecoverySPRevision );
fDeclarationRatio = pow( pState->GetRecoverySP() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::RecoverySPRevision ), fRevision );
pState->SetRecoverySP( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::RecoverySPRevision ) * fDeclarationRatio ) );
}
break;
case ST_ElementAttack:
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><E2B6A7><EFBFBD><EFBFBD> Ex> <20><> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> Refresh <20><><EFBFBD>ֱ⶧<D6B1><E2B6A7>
// OnCalcEqupStep_Element<6E><74> <20><> <20>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>.
#ifndef PRE_FIX_ELEMENT_REGULATION
float fDeclaration = CEqualLevelTable::GetInstance().GetValueFloat( cRegulation, GetJobClassID(), CEqualLevelTable::ElementAttackRevision );
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::ElementAttackRevision );
for( int i=0; i<ElementEnum_Amount; i++ )
{
pState->SetElementAttack( (ElementEnum)i, fDeclaration * pow( pState->GetElementAttack( (ElementEnum)i ), fRevision ) );
}
#endif
}
break;
case ST_ElementDefense:
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<CFB1><E2B6A7><EFBFBD><EFBFBD> Ex> <20><> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> Refresh <20><><EFBFBD>ֱ⶧<D6B1><E2B6A7>
// OnCalcEqupStep_Element<6E><74> <20><> <20>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>.
// <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȹ<EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´ٰ<C2B4> <20>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵϴ<D3B4>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE>־ <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD>߳<EFBFBD><DFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD> <20>ȵ˴ϴ<CBB4>.
#ifndef PRE_FIX_ELEMENT_REGULATION
float fDeclaration = CEqualLevelTable::GetInstance().GetValueFloat( cRegulation, GetJobClassID(), CEqualLevelTable::ElementDefenseRevision );
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::ElementDefenseRevision );
for( int i=0; i<ElementEnum_Amount; i++ ) {
pState->SetElementDefense( (ElementEnum)i, fDeclaration * pow( pState->GetElementDefense( (ElementEnum)i ), fRevision ) );
}
#endif
}
break;
case ST_FinalDamage:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::FinalDamageRevision );
fDeclarationRatio = pow( pState->GetFinalDamage() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::FinalDamageRevision ), fRevision );
pState->SetFinalDamage( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::FinalDamageRevision ) * fDeclarationRatio ) );
}
break;
#endif // #if defined(PRE_ADD_REVEAL_REGULATION_VALUE) || defined(_GAMESERVER)
case ST_HP:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::MaxHPRevision );
fDeclarationRatio = pow( pState->GetMaxHP() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::MaxHPRevision ), fRevision );
pState->SetMaxHP( (INT64)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::MaxHPRevision ) * fDeclarationRatio ) );
}
break;
case ST_SP:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::MaxSPRevision );
fDeclarationRatio = pow( pState->GetMaxSP() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::MaxSPRevision ), fRevision );
pState->SetMaxSP( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::MaxSPRevision ) * fDeclarationRatio ) );
}
break;
case ST_MoveSpeed:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::MoveSpeedRevision );
fDeclarationRatio = pow( pState->GetMoveSpeed() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::MoveSpeedRevision ), fRevision );
pState->SetMoveSpeed( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::MoveSpeedRevision ) * fDeclarationRatio ) );
}
break;
#ifdef PRE_ADD_BASE_STAT_REGULATION
case ST_Strength:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::StrengthRevision );
fDeclarationRatio = pow( pState->GetStrength() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::StrengthRevision ), fRevision );
pState->SetStrength( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::StrengthRevision ) * fDeclarationRatio ) );
}
break;
case ST_Agility:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::AgilityRevision );
fDeclarationRatio = pow( pState->GetAgility() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::AgilityRevision ), fRevision );
pState->SetAgility( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::AgilityRevision ) * fDeclarationRatio ) );
}
break;
case ST_Intelligence:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::IntelligenceRevision );
fDeclarationRatio = pow( pState->GetIntelligence() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::IntelligenceRevision ), fRevision );
pState->SetIntelligence( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::IntelligenceRevision ) * fDeclarationRatio ) );
}
break;
case ST_Stamina:
{
fRevision = CEqualExponentTable::GetInstance().GetValue( cRegulation, CEqualExponentTable::StaminaRevision );
fDeclarationRatio = pow( pState->GetStamina() / (float)CEqualBasisTable::GetInstance().GetValue( GetJobClassID(), m_nLevel, CEqualBasisTable::StaminaRevision ), fRevision );
pState->SetStamina( (int)( CEqualLevelTable::GetInstance().GetValue( cRegulation, GetJobClassID(), CEqualLevelTable::StaminaRevision ) * fDeclarationRatio ) );
}
break;
#endif
}
}
int CDnPlayerState::GetJobClassID()
{
if( m_nVecJobHistoryList.empty() ) return 0;
return m_nVecJobHistoryList[ m_nVecJobHistoryList.size() - 1 ];
}
int CDnPlayerState::GetJobHistory( std::vector<int> &nVecResult )
{
nVecResult = m_nVecJobHistoryList;
return (int)m_nVecJobHistoryList.size();
}
void CDnPlayerState::SetJobHistory( const std::vector<int> &nVecList )
{
m_nVecJobHistoryList = nVecList;
}
void CDnPlayerState::SetJobHistory( int nValue )
{
//m_nVecJobHistoryList.clear();
vector<int>::iterator iter = find( m_nVecJobHistoryList.begin(), m_nVecJobHistoryList.end(), nValue );
_ASSERT( iter == m_nVecJobHistoryList.end() && "<EFBFBD>̹<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD>ƿ<EFBFBD>. ġƮŰ <20>߸<EFBFBD><DFB8><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>." );
if( iter == m_nVecJobHistoryList.end() )
m_nVecJobHistoryList.push_back( nValue );
}
// #26902 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ѹ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD> <20><> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> Ŭ<>󿡼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
void CDnPlayerState::PopJobHistory( int nValue )
{
if( nValue == m_nVecJobHistoryList.back() )
m_nVecJobHistoryList.pop_back();
}
bool CDnPlayerState::IsPassJob( int nJobClassID )
{
for( DWORD i=0; i<m_nVecJobHistoryList.size(); i++ ) {
if( m_nVecJobHistoryList[i] == nJobClassID ) return true;
}
return false;
}
void CDnPlayerState::OnChangeJob( int nJobID )
{
RefreshState();
}
void CDnPlayerState::SetExperience( int nValue )
{
m_nExperience = nValue;
CalcExperience();
}
void CDnPlayerState::AddExperience( int nValue, int nLogCode, INT64 biFKey )
{
#if defined(_GAMESERVER)
#ifndef _WORK
if( GetAccountLevel() < AccountLevel_Master ) {
int nLevelLimit = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::PlayerLevelLimit );
if( m_nLevel >= nLevelLimit ) return;
}
#endif
#endif
m_nExperience += nValue;
OnAddExperience( nValue, nLogCode, biFKey );
CalcExperience();
}
void CDnPlayerState::CalcExperience()
{
if( m_ActorType > ActorTypeEnum::Reserved6 ) return;
int nExperience;
int nTempLevel = 1;
int nOffset = m_nLevel - 1;
if( nOffset < 0 ) nOffset = 0;
for( int i=nOffset; i<PLAYER_MAX_LEVEL; i++ ) {
nExperience = CPlayerLevelTable::GetInstance().GetValue( GetJobClassID(), i + 1, CPlayerLevelTable::Experience );
if( m_nExperience >= nExperience ) {
m_nCurrentLevelExperience = nExperience;
nTempLevel = i + 1;
}
else {
m_nNextLevelExperience = nExperience;
break;
}
}
#if defined(_GAMESERVER)
#ifndef _WORK
if( GetAccountLevel() < AccountLevel_Master ) {
int nLevelLimit = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::PlayerLevelLimit );
if( nTempLevel >= nLevelLimit ) {
nTempLevel = nLevelLimit;
m_nExperience = CPlayerLevelTable::GetInstance().GetValue( GetJobClassID(), nLevelLimit, CPlayerLevelTable::Experience );
m_nCurrentLevelExperience = m_nExperience;
m_nNextLevelExperience = m_nExperience;
}
}
#endif
#endif
if( m_nLevel < nTempLevel ) {
int nLevelUpAmount = nTempLevel - m_nLevel;
SetLevel( nTempLevel );
OnLevelUp( nTempLevel, nLevelUpAmount );
}
}
int CDnPlayerState::GetJobToBaseClassID( int nJobID )
{
DNTableFileFormat* pSox = GetDNTable(CDnTableDB::TJOB);
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"JobTable.ext failed\r\n");
return nJobID;
}
if( !pSox->IsExistItem( nJobID ) ) return nJobID;
return pSox->GetFieldFromLablePtr( nJobID, "_BaseClass" )->GetInteger() + 1;
}
CDnState CDnPlayerState::MakeEquipState()
{
CDnState SumAbsolute;
CDnState SumRatio;
CDnState PureBaseState;
std::vector<CDnState *> pVecAbsoluteList;
std::vector<CDnState *> pVecRatioList;
// <20><><EFBFBD><20><><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.
#if defined(PRE_ADD_TALISMAN_SYSTEM)
GetStateList( WeaponList | DefenseList | AccessoryList | SetItemList | AppellationList | GlyphList | PetAbility | TalismanList, ValueTypeAbsolute, pVecAbsoluteList );
GetStateList( WeaponList | DefenseList | AccessoryList | SetItemList | AppellationList | GlyphList | PetAbility | TalismanList, ValueTypeRatio, pVecRatioList );
#else
GetStateList( WeaponList | DefenseList | AccessoryList | SetItemList | AppellationList | GlyphList | PetAbility, ValueTypeAbsolute, pVecAbsoluteList );
GetStateList( WeaponList | DefenseList | AccessoryList | SetItemList | AppellationList | GlyphList | PetAbility, ValueTypeRatio, pVecRatioList );
#endif
// <20><><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ޱ⶧<DEB1><E2B6A7><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>.
PureBaseState = m_BaseState; // <20><EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E2BABB>ġ<EFBFBD><C4A1> <20><>.
int nBaseStrength = m_StateStep[0].GetStrength() - m_BuffState.GetStrength();
int nBaseAgility = m_StateStep[0].GetAgility() - m_BuffState.GetAgility();
int nBaseIntelligence = m_StateStep[0].GetIntelligence() - m_BuffState.GetIntelligence();
int nBaseStamina = m_StateStep[0].GetStamina() - m_BuffState.GetStamina();
int nAttackPoint = (int)(nBaseStrength * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::StrengthAttack));
nAttackPoint += (int)(nBaseAgility * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::AgilityAttack));
PureBaseState.SetAttackPMin(nAttackPoint);
PureBaseState.SetAttackPMax(nAttackPoint);
nAttackPoint = (int)(nBaseIntelligence * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::IntelligenceAttack));
PureBaseState.SetAttackMMin(nAttackPoint);
PureBaseState.SetAttackMMax(nAttackPoint);
PureBaseState.SetMaxHP((INT64)(nBaseStamina * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::HP)));
PureBaseState.SetDefenseP((int)(nBaseStamina * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::PhysicalDefense)));
PureBaseState.SetStunResistance((int)(nBaseStamina * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::StunResistance)));
PureBaseState.SetDefenseM((int)(nBaseIntelligence * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::MagicDefense)));
PureBaseState.SetMaxSP((int)(nBaseIntelligence * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::SP)));
PureBaseState.SetStun((int)(nBaseStrength * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::Stun)));
PureBaseState.SetStiff((int)(nBaseStrength * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::Stiff)));
PureBaseState.SetStiffResistance((int)(nBaseStrength * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::StiffResistance)));
PureBaseState.SetCritical((int)(nBaseAgility * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::Critical)));
PureBaseState.SetCriticalResistance((int)(nBaseAgility * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::CriticalResistance)));
for( DWORD i=0; i<pVecAbsoluteList.size(); i++ )
{
CDnState *pState = pVecAbsoluteList[i];
if( pState )
SumAbsolute.MergeState( *pState, ValueTypeAbsolute );
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>
SumAbsolute.MergeState( PureBaseState , ValueTypeAbsolute );
for( DWORD i=0; i<pVecRatioList.size(); i++ )
{
CDnState *pState = pVecRatioList[i];
if( pState )
SumRatio.MergeState( *pState, ValueTypeRatio );
}
// PureBaseState <20><><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ⶧<CAB1><E2B6A7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡<CABF><E4B0A1><EFBFBD><EFBFBD>.
SumAbsolute.CalculateRatioValue( SumRatio );
return SumAbsolute;
}
CDnState CDnPlayerState::MakeComparePotentialState(CDnItem* pCurrItemState, CDnItem* pNewItemState)
{
ValueType eType = ValueType::ValueTypeNone;
CDnState SumAbsolute;
CDnState SumRatio;
CDnState* pTempPotentialState = NULL;
CDnState* pTempEnchantState = NULL;
std::vector<CDnState*> pVecAbsoluteList;
std::vector<CDnState*> pVecRatioList;
#if defined(PRE_ADD_TALISMAN_SYSTEM)
GetStateList( WeaponList | DefenseList | AccessoryList | StateEffectList | SetItemList | AppellationList | GlyphList | PetAbility | TalismanList, ValueTypeAbsolute, pVecAbsoluteList );
GetStateList( WeaponList | DefenseList | AccessoryList | StateEffectList | SetItemList | AppellationList | GlyphList | PetAbility | TalismanList, ValueTypeRatio, pVecRatioList );
#else
GetStateList( WeaponList | DefenseList | AccessoryList | StateEffectList | SetItemList | AppellationList | GlyphList | PetAbility, ValueTypeAbsolute, pVecAbsoluteList );
GetStateList( WeaponList | DefenseList | AccessoryList | StateEffectList | SetItemList | AppellationList | GlyphList | PetAbility, ValueTypeRatio, pVecRatioList );
#endif
#pragma region -------------------------- 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------
for( DWORD i=0; i<pVecAbsoluteList.size(); i++ )
{
CDnState *pState = pVecAbsoluteList[i];
if( pState )
SumAbsolute.MergeState( *pState, ValueTypeAbsolute );
}
SumAbsolute.MergeState( m_BaseState , ValueTypeAbsolute );
for( DWORD i=0; i<pVecRatioList.size(); i++ )
{
CDnState *pState = pVecRatioList[i];
if( pState )
SumRatio.MergeState( *pState, ValueTypeRatio );
}
if(pCurrItemState)
{
SumAbsolute -= (CDnState)*pCurrItemState;
pTempPotentialState = (CDnState*)pCurrItemState->GetPotentialState();
pTempEnchantState = (CDnState*)pCurrItemState->GetEnchantState();
if(pTempPotentialState)
{
eType = pTempPotentialState->GetValueType();
if(eType == ValueTypeAbsolute)
SumAbsolute -= *pTempPotentialState;
else if(eType == ValueTypeRatio)
SumRatio -= *pTempPotentialState;
}
if(pTempEnchantState)
{
eType = pTempEnchantState->GetValueType();
if(eType == ValueTypeAbsolute)
SumAbsolute -= *pTempEnchantState;
else if(eType == ValueTypeRatio)
SumRatio -= *pTempEnchantState;
}
}
if(pNewItemState)
{
SumAbsolute += (CDnState)*pNewItemState;
pTempPotentialState = (CDnState*)pNewItemState->GetPotentialState();
pTempEnchantState = (CDnState*)pNewItemState->GetEnchantState();
if(pTempPotentialState)
{
eType = pTempPotentialState->GetValueType();
if(eType == ValueTypeAbsolute)
SumAbsolute += *pTempPotentialState;
else if(eType == ValueTypeRatio)
SumRatio += *pTempPotentialState;
}
if(pTempEnchantState)
{
eType = pTempEnchantState->GetValueType();
if(eType == ValueTypeAbsolute)
SumAbsolute += *pTempEnchantState;
else if(eType == ValueTypeRatio)
SumRatio += *pTempEnchantState;
}
}
SumAbsolute.CalculateRatioValue( SumRatio );
#pragma endregion
#pragma region -------------------------- 2<><32> <20><><EFBFBD>̽<EFBFBD> <20><EFBFBD><E7B0BB> --------------------------
CDnState ResultBaseState = m_BaseState;
int nBaseStrength = SumAbsolute.GetStrength();
int nBaseAgility = SumAbsolute.GetAgility();
int nBaseIntelligence = SumAbsolute.GetIntelligence();
int nBaseStamina = SumAbsolute.GetStamina();
int nAttackPoint = (int)(nBaseStrength * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::StrengthAttack));
nAttackPoint += (int)(nBaseAgility * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::AgilityAttack));
ResultBaseState.SetAttackPMin(nAttackPoint);
ResultBaseState.SetAttackPMax(nAttackPoint);
nAttackPoint = (int)(nBaseIntelligence * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::IntelligenceAttack));
ResultBaseState.SetAttackMMin(nAttackPoint);
ResultBaseState.SetAttackMMax(nAttackPoint);
ResultBaseState.SetMaxHP((INT64)(nBaseStamina * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::HP)));
ResultBaseState.SetDefenseP((int)(nBaseStamina * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::PhysicalDefense)));
ResultBaseState.SetStunResistance((int)(nBaseStamina * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::StunResistance)));
ResultBaseState.SetDefenseM((int)(nBaseIntelligence * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::MagicDefense)));
ResultBaseState.SetMaxSP((int)(nBaseIntelligence * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::SP)));
ResultBaseState.SetStun((int)(nBaseStrength * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::Stun)));
ResultBaseState.SetStiff((int)(nBaseStrength * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::Stiff)));
ResultBaseState.SetStiffResistance((int)(nBaseStrength * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::StiffResistance)));
ResultBaseState.SetCritical((int)(nBaseAgility * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::Critical)));
ResultBaseState.SetCriticalResistance((int)(nBaseAgility * CPlayerWeightTable::GetInstance().GetValue(m_nActorTableID, CPlayerWeightTable::CriticalResistance)));
#pragma endregion
CDnState NewSumAbsolute;
CDnState NewSumRatio;
for( DWORD i=0; i<pVecAbsoluteList.size(); i++ )
{
CDnState *pState = pVecAbsoluteList[i];
if( pState )
NewSumAbsolute.MergeState( *pState, ValueTypeAbsolute );
}
NewSumAbsolute.MergeState( ResultBaseState , ValueTypeAbsolute );
for( DWORD i=0; i<pVecRatioList.size(); i++ )
{
CDnState *pState = pVecRatioList[i];
if( pState )
NewSumRatio.MergeState( *pState, ValueTypeRatio );
}
if(pCurrItemState)
{
NewSumAbsolute -= (CDnState)*pCurrItemState;
pTempPotentialState = (CDnState*)pCurrItemState->GetPotentialState();
pTempEnchantState = (CDnState*)pCurrItemState->GetEnchantState();
if(pTempPotentialState)
{
eType = pTempPotentialState->GetValueType();
if(eType == ValueTypeAbsolute)
NewSumAbsolute -= *pTempPotentialState;
else if(eType == ValueTypeRatio)
NewSumRatio -= *pTempPotentialState;
}
if(pTempEnchantState)
{
eType = pTempEnchantState->GetValueType();
if(eType == ValueTypeAbsolute)
NewSumAbsolute -= *pTempEnchantState;
else if(eType == ValueTypeRatio)
NewSumRatio -= *pTempEnchantState;
}
}
if(pNewItemState)
{
NewSumAbsolute += (CDnState)*pNewItemState;
pTempPotentialState = (CDnState*)pNewItemState->GetPotentialState();
pTempEnchantState = (CDnState*)pNewItemState->GetEnchantState();
if(pTempPotentialState)
{
eType = pTempPotentialState->GetValueType();
if(eType == ValueTypeAbsolute)
NewSumAbsolute += *pTempPotentialState;
else if(eType == ValueTypeRatio)
NewSumRatio += *pTempPotentialState;
}
if(pTempEnchantState)
{
eType = pTempEnchantState->GetValueType();
if(eType == ValueTypeAbsolute)
NewSumAbsolute += *pTempEnchantState;
else if(eType == ValueTypeRatio)
NewSumRatio += *pTempEnchantState;
}
}
NewSumAbsolute.CalculateRatioValue( NewSumRatio ); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD>
return NewSumAbsolute;
}
bool CDnPlayerState::IsDeveloperAccountLevel()
{
bool bIsDeveloper = true;
if(m_cAccountLevel < eAccountLevel::AccountLevel_New)
bIsDeveloper = false;
#ifdef PRE_ADD_DWC
if(m_cAccountLevel == eAccountLevel::AccountLevel_DWC)
bIsDeveloper = false;
#endif
return bIsDeveloper;
}
bool CDnPlayerState::IsDeveloperAccountLevel(char cAccountLevel)
{
bool bIsDeveloper = true;
if(cAccountLevel < eAccountLevel::AccountLevel_New)
bIsDeveloper = false;
#ifdef PRE_ADD_DWC
if(cAccountLevel == eAccountLevel::AccountLevel_DWC)
bIsDeveloper = false;
#endif
return bIsDeveloper;
}