DragonNest/GameCommon/NpcReputationSystem.cpp

174 lines
3.9 KiB
C++
Raw Normal View History

#include "Stdafx.h"
#include "NpcReputationSystem.h"
#if defined( _SERVER )
#include "DNGameDataManager.h"
#else
#include "DnTableDB.h"
#endif // #if defined( _SERVER )
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
CNpcReputationSystem::CNpcReputationSystem( const int iNpcID, IReputationSystemEventHandler* pHandler )
:IReputationSystem(pHandler),m_iNpcID(iNpcID),m_Favor(std::make_pair(0,0)),m_Malice(std::make_pair(0,0))
{
}
// _ReputeTable <20><><EFBFBD><EFBFBD> Max <20><> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD>δ<EFBFBD>.
void CNpcReputationSystem::Init()
{
#if defined( _SERVER )
TReputeTableData* pReputationTable = g_pDataManager->GetReputeTableData( m_iNpcID );
_ASSERT( pReputationTable );
if( pReputationTable )
{
m_Favor.second = pReputationTable->iMaxFavor;
m_Malice.second = pReputationTable->iMaxMalice;
}
#else
DNTableFileFormat* pNpcReputeTable = GetDNTable( CDnTableDB::TREPUTE );
vector<int> vlReputeList;
pNpcReputeTable->GetItemIDListFromField( "_NpcID", m_iNpcID, vlReputeList );
_ASSERT( 1 == vlReputeList.size() );
m_Favor.second = pNpcReputeTable->GetFieldFromLablePtr( vlReputeList.front(), "_MaxFavor" )->GetInteger();
vlReputeList.clear();
pNpcReputeTable->GetItemIDListFromField( "_NpcID", m_iNpcID, vlReputeList );
_ASSERT( 1 == vlReputeList.size() );
m_Malice.second = pNpcReputeTable->GetFieldFromLablePtr( vlReputeList.front(), "_MaxMalice" )->GetInteger();
#endif // #if defined( _SERVER )
}
REPUTATION_TYPE CNpcReputationSystem::Get( const eType Type )
{
switch( Type )
{
case IReputationSystem::NpcFavor:
return m_Favor.first;
case IReputationSystem::NpcMalice:
return m_Malice.first;
}
return -1;
}
REPUTATION_TYPE CNpcReputationSystem::GetMax( const eType Type )
{
switch( Type )
{
case IReputationSystem::NpcFavor:
return m_Favor.second;
case IReputationSystem::NpcMalice:
return m_Malice.second;
}
return 0;
}
float CNpcReputationSystem::GetPercent( const eType Type )
{
switch( Type )
{
case IReputationSystem::NpcFavor:
{
if( m_Favor.second > 0 )
return m_Favor.first/static_cast<float>(m_Favor.second)*100;
break;
}
case IReputationSystem::NpcMalice:
{
if( m_Malice.second > 0 )
return m_Malice.first/static_cast<float>(m_Malice.second)*100;
break;
}
}
return 0.f;
}
bool CNpcReputationSystem::IsComplete( const eType Type )
{
switch( Type )
{
case IReputationSystem::NpcFavor:
{
if( m_Favor.second > 0 )
return (m_Favor.first >= m_Favor.second);
break;
}
case IReputationSystem::NpcMalice:
{
if( m_Malice.second > 0 )
return (m_Malice.first >= m_Malice.second);
break;
}
}
return false;
}
// * value <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
void CNpcReputationSystem::_Add( const eType Type, const REPUTATION_TYPE value, bool bIsReachMax )
{
switch( Type )
{
case IReputationSystem::NpcFavor:
{
m_Favor.first += value;
if( m_Favor.first > m_Favor.second )
m_Favor.first = m_Favor.second;
if( m_Favor.first < 0 )
m_Favor.first = 0;
if( bIsReachMax == false )
{
if( m_Favor.first == m_Favor.second )
m_Favor.first = m_Favor.second-1;
}
break;
}
case IReputationSystem::NpcMalice:
{
m_Malice.first += value;
if( m_Malice.first > m_Malice.second )
m_Malice.first = m_Malice.second;
if( m_Malice.first < 0 )
m_Malice.first = 0;
if( bIsReachMax == false )
{
if( m_Malice.first == m_Malice.second )
m_Malice.first = m_Malice.second-1;
}
break;
}
}
}
void CNpcReputationSystem::_Set( const eType Type, const REPUTATION_TYPE value )
{
switch( Type )
{
case IReputationSystem::NpcFavor:
{
m_Favor.first = value;
if( m_Favor.first > m_Favor.second )
m_Favor.first = m_Favor.second;
if( m_Favor.first < 0 )
m_Favor.first = 0;
break;
}
case IReputationSystem::NpcMalice:
{
m_Malice.first = value;
if( m_Malice.first > m_Malice.second )
m_Malice.first = m_Malice.second;
if( m_Malice.first < 0 )
m_Malice.first = 0;
break;
}
}
}
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )