Files
Leviathan/Client/Game/game/Interface/CharacterInfo/SUICharacterInfoSubBasicWnd.cpp
T
2026-06-01 12:46:52 +02:00

415 lines
19 KiB
C++

#include "stdafx.h"
#include "CharacterInfo/SUICharacterInfoSubBasicWnd.h"
#include "CharacterInfo/SUICharacterInfoWnd.h"
#include "SPlayerInfoMgr.h"
//#include "Util.h"
//-----------------------------------------------------------------------------------------------------------------
// 생성자
//-----------------------------------------------------------------------------------------------------------------
SUICharacterInfoSubBasicWnd::SUICharacterInfoSubBasicWnd(SGameManager* pGameManager)
: SUICharacterInfoSubMainWnd(pGameManager)
, m_strPlusColorValue( "000000" )
, m_strMinusColorValue( "000000" )
{
}
//-----------------------------------------------------------------------------------------------------------------
// 윈도우 생성
//-----------------------------------------------------------------------------------------------------------------
SUIWnd* SUICharacterInfoSubBasicWnd::CreateWnd( const char* szFile, KUIWndManager* pWndManager, KPoint kPos, int nWindowID )
{
SUIWnd::CreateWnd( szFile, pWndManager, kPos, nWindowID );
KUIWnd* pChildWnd_Plus( GetChild("static_plus01_value_01") );
if( pChildWnd_Plus )
{
std::string strPlusColorValue( pChildWnd_Plus->GetCaption() );
CStringUtil::GetTextColorValue( strPlusColorValue, m_strPlusColorValue );
}
else
{
SDEBUGLOG( "[SUICharacterInfoSubBasicWnd] Can't Find Plus Color Value Sample Control" );
assert( NULL );
}
KUIWnd* pChildWnd_Minus( GetChild("static_minus01_value_01") );
if( pChildWnd_Minus )
{
std::string strMinusColorValue( pChildWnd_Minus->GetCaption() );
CStringUtil::GetTextColorValue( strMinusColorValue, m_strMinusColorValue );
}
else
{
SDEBUGLOG( "[SUICharacterInfoSubBasicWnd] Can't Find Minus Color Value Sample Control" );
assert( NULL );
}
return this;
}
void SUICharacterInfoSubBasicWnd::refreshBaseStat()
{
CreatureStat stat;
::memcpy( &stat, &(m_PlayerInfoMgr.GetStat()), sizeof(stat) );
setOriValue( "static_status01_value", stat.strength , false, S(1410)); // 힘
setOriValue( "static_status02_value", stat.agility , false, S(1412)); // 민첩
setOriValue( "static_status03_value", stat.intelligence , false, S(1413)); // 지력
setOriValue( "static_status04_value", stat.luck , false, S(1416)); // 행운
setOriValue( "static_status05_value", stat.vital , false, S(1411)); // 체력
setOriValue( "static_status06_value", stat.dexterity , false, S(1415)); // 집중
setOriValue( "static_status07_value", stat.mentality , false, S(1414)); // 정신
}
void SUICharacterInfoSubBasicWnd::refreshBattleStat()
{
CreatureAttribute attribute;
::memcpy( &attribute, &(m_PlayerInfoMgr.GetAttribute()), sizeof(attribute) );
setOriValue("static_basic01_value", attribute.nAttackPointRight, false, S(1417)); // 공격력 오른손
/*KUIControlStatic* pStatic = dynamicCast< KUIControlStatic* > (GetChild( "static_basic01_value" ));
if ( !m_bLeft )
{
m_nBasicY = pStatic->GetRect().top;
m_bLeft = TRUE;
}*/
/*if ( attribute.nAttackPointLeft == 0 )
{ SetChildShow ( "static_basic01_left_value", false );
// SetMovePos ( "static_basic01_value", pStatic->GetRect().left,m_nBasicY+5 );
}
else
{ SetChildShow ( "static_basic01_left_value", true );
// SetMovePos ( "static_basic01_value", pStatic->GetRect().left,m_nBasicY );
}*/
setOriValue("static_basic01_left_value", attribute.nAttackPointLeft, false, S(1417)); // 공격력 왼손
setOriValue("static_basic02_value", attribute.nAccuracyRight, false, S(1418)); // 명중
// setOriValue("static_basic02_left_value", attribute.nAccuracyLeft, false, S(1418)); // 명중
setOriValue("static_basic03_value", attribute.nDefence, false, S(1421)); // 방어력
setOriValue("static_basic04_value", attribute.nAvoid, false, S(1423)); // 회피
//AziaMafia Fix Attack Speed
//float fAttackSpeedPerSec = (attribute.nAttackSpeed + m_PlayerInfoMgr.GetItemAttribute().nAttackSpeed) / 115.f;
float fAttackSpeedPerSec = (attribute.nAttackSpeed + m_PlayerInfoMgr.GetItemAttribute().nAttackSpeed) / 100.f;
setOriValue("static_basic05_value", attribute.nAttackSpeed, false, SR( 1425, "#@VALUE@#", fAttackSpeedPerSec ).c_str()); // 공격 속도
setOriValue("static_basic06_value", attribute.nCritical, true, S(1432)); // 치명타율
setOriValue("static_basic07_value", attribute.nBlockChance, true, S(1432)); // 블럭률
setOriValue("static_basic08_value", attribute.nMagicPoint, false, S(1419)); // 마력
setOriValue("static_basic09_value", attribute.nMagicAccuracy, false, S(1420)); // 마명중
setOriValue("static_basic10_value", attribute.nMagicDefence, false, S(1422)); // 마법 방어
setOriValue("static_basic11_value", attribute.nMagicAvoid, false, S(1424)); // 마법 저항
float fCastingDelay = 100.f - (100.f / (attribute.nCastingSpeed + m_PlayerInfoMgr.GetItemAttribute().nCastingSpeed)*100.f);
setOriValue("static_basic12_value", attribute.nCastingSpeed, false, SR( 1427, "#@VALUE@#", fCastingDelay ).c_str()); // 시전 속도
setOriValue("static_basic13_value", attribute.nCriticalPower, true, S(1435)); // 치명타위력
setOriValue("static_basic14_value", attribute.nBlockDefence, false, S(1433)); // 블럭방어력
setOriValue("static_basic15_value", attribute.nPerfectBlock, true, S(1437)); // 퍼펙트 블럭률
setOriValue("static_basic16_value", attribute.nMoveSpeed, false, S(1426)); // 이동 속도
refreshExpandBattleStat(attribute);
}
void SUICharacterInfoSubBasicWnd::refreshExpandBattleStat(CreatureAttribute const& attribute)
{
setOriValue("static_expand01_value", attribute.nHPRegenPercentage, true, S(1428)); // hp 재생률
setOriValue("static_expand02_value", attribute.nMPRegenPercentage, true, S(1430)); // mp 재생률
setOriValue("static_expand03_value", attribute.nPhysicalPenetration, false, S(1440)); // 물리피해무시
setOriValue("static_expand04_value", attribute.nPhysicalDefIgnore, false, S(1438)); // 물리방어무시
setOriValue("static_expand05_value", attribute.nHPRegenPoint, false, S(1429)); // hp 회복력
setOriValue("static_expand06_value", attribute.nMPRegenPoint, false, S(1431)); // mp 회복력
setOriValue("static_expand07_value", attribute.nMagicalPenetration, false, S(1441)); // 마법피해관통
setOriValue("static_expand08_value", attribute.nMagicalDefIgnore, false, S(1439)); // 마법방어무시
//setOriValue("static_expand05_value", attribute.nCoolTimeSpeed, false, S(1436)); // 재시전속도
//setOriValue("static_expand04_value", attribute.nCritical, true, S(1434)); // 치명타률
//setOriValue("static_expand03_value", attribute.nPhysicalPenetrationRatio, false, S(1444)); // 물리피해관통%
//setOriValue("static_expand04_value", attribute.nPhysicalDefIgnoreRatio, false, S(1442)); // 물리방어무시%
//setOriValue("static_expand10_value", attribute.nBlockDefence, false, S(1433)); // 블럭 방어력
//setOriValue("static_expand07_value", attribute.nMagicalPenetrationRatio, false, S(1445)); // 마법피해관통%
//setOriValue("static_expand17_value", attribute.nMagicalDefIgnoreRatio, false, S(1443)); // 마법방어무시%
}
void SUICharacterInfoSubBasicWnd::refreshBaseItemStat(CreatureStat const& stat)
{
setItemValue( "static_status01_plus_value" , stat.strength ); // 힘
setItemValue( "static_status02_plus_value" , stat.agility ); // 민첩
setItemValue( "static_status03_plus_value" , stat.intelligence ); // 지력
setItemValue( "static_status04_plus_value" , stat.luck ); // 행운
setItemValue( "static_status05_plus_value" , stat.vital ); // 체력
setItemValue( "static_status06_plus_value" , stat.dexterity ); // 집중
setItemValue( "static_status07_plus_value" , stat.mentality ); // 정신
setSignString( "static_status01_p", stat.strength );
setSignString( "static_status02_p", stat.agility );
setSignString( "static_status03_p", stat.intelligence );
setSignString( "static_status04_p", stat.luck );
setSignString( "static_status05_p", stat.vital );
setSignString( "static_status06_p", stat.dexterity );
setSignString( "static_status07_p", stat.mentality );
}
void SUICharacterInfoSubBasicWnd::refreshBattleItemStat(CreatureAttribute const& attribute)
{
memcpy(&m_creatureAttribute, &attribute, sizeof (m_creatureAttribute));
setItemValue("static_basic01_plus_value", attribute.nAttackPointRight); // 공격력 오른손
setItemValue("static_basic01_left_plus_value", attribute.nAttackPointLeft); // 공격력 왼손
setItemValue("static_basic02_plus_value", attribute.nAccuracyRight); // 명중 오른손
//setItemValue("static_basic02_left_plus_value", attribute.nAccuracyLeft); // 명중 왼손
setItemValue("static_basic03_plus_value", attribute.nDefence); // 방어력
setItemValue("static_basic04_plus_value", attribute.nAvoid); // 회피
setItemValue("static_basic05_plus_value", attribute.nAttackSpeed); // 공격 속도
setItemValue("static_basic06_plus_value", attribute.nCritical, true); // 치명타률
setItemValue("static_basic07_plus_value", attribute.nBlockChance, true); // 블럭률
setItemValue("static_basic08_plus_value", attribute.nMagicPoint); // 마력
setItemValue("static_basic09_plus_value", attribute.nMagicAccuracy); // 마명중
setItemValue("static_basic10_plus_value", attribute.nMagicDefence); // 마법 방어
setItemValue("static_basic11_plus_value", attribute.nMagicAvoid); // 마법 저항
setItemValue("static_basic12_plus_value", attribute.nCastingSpeed); // 시전 속도
setItemValue("static_basic13_plus_value", attribute.nCriticalPower, true); // 치명타위력
setItemValue("static_basic14_plus_value", attribute.nBlockDefence, true); // 블럭방어력
setItemValue("static_basic15_plus_value", attribute.nPerfectBlock, true); // 퍼펙트 블럭률
setItemValue("static_basic16_plus_value", attribute.nMoveSpeed); // 이동 속도
setSignString("static_basic01_p", attribute.nAttackPointRight); // 공격력 오른손
setSignString("static_basic01_left_p", attribute.nAttackPointLeft); // 공격력 왼손
setSignString("static_basic02_p", attribute.nAccuracyRight); // 명중 오른손
//setSignString("static_basic02_left_p", attribute.nAccuracyLeft); // 명중 왼손
setSignString("static_basic03_p", attribute.nDefence); // 방어력
setSignString("static_basic04_p", attribute.nAvoid); // 회피
setSignString("static_basic05_p", attribute.nAttackSpeed); // 공격 속도
setSignString("static_basic06_p", attribute.nCritical); // 치명타률
setSignString("static_basic07_p", attribute.nBlockChance); // 블럭률
setSignString("static_basic08_p", attribute.nMagicPoint); // 마력
setSignString("static_basic09_p", attribute.nMagicAccuracy); // 마명중
setSignString("static_basic10_p", attribute.nMagicDefence); // 마법 방어
setSignString("static_basic11_p", attribute.nMagicAvoid); // 마법 저항
setSignString("static_basic12_p", attribute.nCastingSpeed); // 시전 속도
setSignString("static_basic13_p", attribute.nCriticalPower); // 치명타위력
setSignString("static_basic14_p", attribute.nBlockDefence); // 블럭방어력
setSignString("static_basic15_p", attribute.nPerfectBlock); // 퍼펙트 블럭률
setSignString("static_basic16_p", attribute.nMoveSpeed); // 이동 속도
refreshExpandBattleItemStat(attribute);
}
void SUICharacterInfoSubBasicWnd::refreshExpandBattleItemStat(CreatureAttribute const& attribute)
{
setItemValue("static_expand01_plus_value", attribute.nHPRegenPercentage, true); // hp 재생률
setItemValue("static_expand02_plus_value", attribute.nMPRegenPercentage, true); // mp 재생률
int nNum = ( attribute.nPhysicalPenetration * ( 100 + attribute.nPhysicalPenetrationRatio ) ) / 100;
setItemValue("static_expand03_plus_value", nNum ); // 물리피해관통
nNum = ( attribute.nPhysicalDefIgnore * ( 100 + attribute.nPhysicalDefIgnoreRatio ) ) / 100;
setItemValue("static_expand04_plus_value", nNum); // 물리방어무시
setItemValue("static_expand05_plus_value", attribute.nHPRegenPoint); // hp 회복력
setItemValue("static_expand06_plus_value", attribute.nMPRegenPoint); // mp 회복력
nNum = ( attribute.nMagicalPenetration * ( 100 + attribute.nMagicalPenetrationRatio ) ) / 100;
setItemValue("static_expand07_plus_value", attribute.nMagicalPenetration*1.5f); // 마법피해관통
nNum = ( attribute.nMagicalDefIgnore * ( 100 + attribute.nMagicalDefIgnoreRatio ) ) / 100;
setItemValue("static_expand08_plus_value", attribute.nMagicalDefIgnore*1.5f); // 마법방어무시
//setItemValue("static_expand03_plus_value", attribute.nBlockChance, true); // 블럭율
//setItemValue("static_expand05_plus_value", attribute.nCoolTimeSpeed); // 재시전속도
//setItemValue("static_expand06_plus_value", attribute.nPhysicalDefIgnore); // 물리방어무시
//setItemValue("static_expand07_plus_value", attribute.nPhysicalPenetration); // 물리피해관통
//setItemValue("static_expand03_plus_value", attribute.nPhysicalPenetrationRatio);// 물리피해관통%
//setItemValue("static_expand04_plus_value", attribute.nPhysicalDefIgnoreRatio); // 물리방어무시%
//setItemValue("static_expand10_plus_value", attribute.nBlockDefence); // 블럭 방어력
//setItemValue("static_expand07_plus_value", attribute.nMagicalPenetrationRatio); // 마법피해관통%
//setItemValue("static_expand08_plus_value", attribute.nMagicalDefIgnoreRatio); // 마법방어무시%
setSignString("static_expand01_p", attribute.nHPRegenPercentage); // hp 재생률
setSignString("static_expand02_p", attribute.nMPRegenPercentage); // mp 재생률
setSignString("static_expand03_p", attribute.nPhysicalPenetration); // 물리피해관통
setSignString("static_expand04_p", attribute.nPhysicalDefIgnore); // 물리방어무시
setSignString("static_expand05_p", attribute.nHPRegenPoint); // hp 회복력
setSignString("static_expand06_p", attribute.nMPRegenPoint); // mp 회복력
setSignString("static_expand07_p", attribute.nMagicalPenetration); // 마법피해관통
setSignString("static_expand08_p", attribute.nMagicalDefIgnore); // 마법방어무시
//setSignString("static_expand03_p", attribute.nBlockChance); // 블럭율
//setSignString("static_expand04_p", attribute.nCritical); // 치명타률
//setSignString("static_expand05_p", attribute.nCoolTimeSpeed); // 재시전속도
//setSignString("static_expand03_p", attribute.nPhysicalPenetrationRatio);// 물리피해관통%
//setSignString("static_expand04_p", attribute.nPhysicalDefIgnoreRatio); // 물리방어무시%
//setSignString("static_expand10_p", attribute.nBlockDefence); // 블럭 방어력
//setSignString("static_expand11_p", attribute.nCriticalPower); // 치명타위력
//setSignString("static_expand12_p", attribute.nPerfectBlock); // 퍼펙트 블럭률
//setSignString("static_expand13_p", attribute.nMagicalDefIgnore); // 마법방어무시
//setSignString("static_expand07_p", attribute.nMagicalPenetrationRatio); // 마법피해관통%
//setSignString("static_expand08_p", attribute.nMagicalDefIgnoreRatio); // 마법방어무시%
}
void SUICharacterInfoSubBasicWnd::setOriValue(char const* controlId, int value, bool isPer, const char* szTooltip )
{
if( NULL == controlId )
{
SDEBUGLOG( "[SUICharacterInfoSubBasicWnd] Control Id Ptr is NULL" );
assert( NULL );
return ;
}
std::string strFilter = "%";
if( !isPer )
strFilter = "";
KUIWnd* pChildWnd( GetChild( controlId ) );
if( NULL == pChildWnd )
return ;
string strChildCaption( "" );
CStringUtil::GetTextDecoration( pChildWnd->GetCaption(), strChildCaption );
strChildCaption.append( "%d%s" );
std::string str( CStringUtil::StringFormat( strChildCaption.c_str() , value, strFilter.c_str()) );
SetChildCaption(controlId, str.c_str());
// 툴팁 추가
if( szTooltip != NULL )
{
SetChildTooltip( controlId, szTooltip );
}
}
void SUICharacterInfoSubBasicWnd::setItemValue(char const* controlId, int value, bool isPer)
{
if( NULL == controlId )
{
SDEBUGLOG( "[SUICharacterInfoSubBasicWnd] Control Id Ptr is NULL" );
assert( NULL );
return ;
}
bool show = (value == 0) ? false : true;
SetChildShow(controlId, show);
if ( false == show )
return ;
KUIWnd* pChildWnd( GetChild( controlId ) );
if( NULL == pChildWnd )
{
SDEBUGLOG( "[SUICharacterInfoSubBasicWnd] Can't Find Control ID - [ %s ]", controlId );
return ;
}
string strChildCaption( "" );
CStringUtil::GetTextDecoration( pChildWnd->GetCaption(), strChildCaption );
string strValue( "" );
if( value > 0 )
CStringUtil::ReplaceTextColorValue( strChildCaption, m_strPlusColorValue );
else
CStringUtil::ReplaceTextColorValue( strChildCaption, m_strMinusColorValue );
strChildCaption.append( "%d%s" );
std::string strFilter( "%" );
if( !isPer )
strFilter = "";
SetChildCaption(controlId, CStringUtil::StringFormat( strChildCaption.c_str(), abs(value), strFilter.c_str() ).c_str() );
}
void SUICharacterInfoSubBasicWnd::setSignString(char const* controlId, int value)
{
if( NULL == controlId )
{
SDEBUGLOG( "[SUICharacterInfoSubBasicWnd] Control Id Ptr is NULL" );
assert( NULL );
return ;
}
bool show = (value == 0) ? false : true;
SetChildShow(controlId, show);
if ( false == show )
return ;
KUIWnd* pChildWnd( GetChild( controlId ) );
if( NULL == pChildWnd )
return ;
string strChildCaption( "" );
CStringUtil::GetTextDecoration( pChildWnd->GetCaption(), strChildCaption );
string strSign( "" );
if (value > 0)
{
CStringUtil::ReplaceTextColorValue( strChildCaption, m_strPlusColorValue );
strSign = "+";
}
else
{
CStringUtil::ReplaceTextColorValue( strChildCaption, m_strMinusColorValue );
strSign = "-";
}
strChildCaption.append( "%s" );
SetChildCaption( controlId, CStringUtil::StringFormat( strChildCaption.c_str(), strSign.c_str() ).c_str() );
}
void SUICharacterInfoSubBasicWnd::setExpand(bool expand, bool applyParent)
{
m_isExpand = expand;
/// parent
if (applyParent)
{
SUICharacterInfoWnd* parent = dynamicCast<SUICharacterInfoWnd*>(GetParent());
parent->setExpand(expand);
}
bool show = expand ? true : false;
SetChildShow("text_basic_03", show);
SetChildShow("basic_table_03", show);
for (int i = 1; i < 15; ++i)
{
SetChildShow(CStringUtil::StringFormat("static_expand%02d", i).c_str(), show);
SetChildShow(CStringUtil::StringFormat("static_expand%02d_value", i).c_str(), show);
}
/// 확장이 보여질 때 아이템에 의한 값의 show/hide는 아이템의 값에 의해서 결정된다
if (show)
{
refreshExpandBattleItemStat(m_creatureAttribute);
}
else
{
for (int i = 1; i < 15; ++i)
{
SetChildShow(CStringUtil::StringFormat("static_expand%02d_p", i).c_str(), show);
SetChildShow(CStringUtil::StringFormat("static_expand%02d_plus_value", i).c_str(), show);
}
}
SetChildShow("tab_select_cyan_01", false);
SetChildShow("tab_select_cyan_02", false);
if (!expand) SetChildShow("tab_select_cyan_01", true);
else SetChildShow("tab_select_cyan_02", true);
setShowFoldButton(expand);
}