Files
Sun1602/Client/GameClient/SkillData.cpp
T
2022-10-26 12:25:11 +08:00

366 lines
7.9 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "SkillData.h"
#include "ItemUnitRenderer.h"
#include "SkillInfoParser.h"
SkillData::SkillData()
{
m_BlockState = SLOT_RENDER_STATE_NONE;
m_State = SLOT_RENDER_STATE_DEACTIVATED;
if (GENERALPARAM->IsNet() == FALSE)
{
m_State = SLOT_RENDER_STATE_ACTIVATED;
}
}
void SkillData::SetSlotPosition( int pos, int tab )
{
uicSkillInfo::m_SlotIndex = pos;
uicSkillInfo::m_TabIndex = tab;
}
bool SkillData::LevelUp()
{
#ifdef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL
if( GetSkillLevel() == 1 && IsActive() == false)
{
SetActive(true);
return true;
}
#endif
if( GetCurSkillInfo() == NULL || GetNextSkillInfo() == NULL )
{
return false;
}
SetCurSkill( GetNextSkillInfo()->m_SkillCode );
return true;
}
void SkillData::SetCurSkill( int skill_Code )
{
if( skill_Code == INVALID_SKILL_CODE )
return;
SkillInfoParser* parser = SkillInfoParser::Instance();
if( SkillScriptInfo* cur_skill = parser->GetSkillInfo(skill_Code) )
{
m_pCurrentSkillInfo = cur_skill;
m_pNextSkillInfo = NULL;
if( SkillScriptInfo* next_skill = SkillInfoParser::Instance()->GetSkillInfo( skill_Code + 1) )
{
if( next_skill->m_SkillClassCode == cur_skill->m_SkillClassCode )
{
m_pNextSkillInfo = next_skill;
}
}
}
}
int SkillData::GetRequiredSkillClassCode() const
{
if( m_pCurrentSkillInfo != NULL )
return m_pCurrentSkillInfo->m_UpperSkillClass;
return INVALID_SKILL_CLASS_CODE;
}
int SkillData::GetRequiredSkillLevel() const
{
if( m_pCurrentSkillInfo != NULL )
return m_pCurrentSkillInfo->m_RequireUpperSkillLevel;
return INVALID_SKILL_LEVEL;
}
int SkillData::GetSkillCode() const
{
if( m_pCurrentSkillInfo != NULL )
return m_pCurrentSkillInfo->m_SkillCode;
return INVALID_SKILL_CODE;
}
int SkillData::GetSkillClassCode() const
{
if( m_pCurrentSkillInfo != NULL )
return m_pCurrentSkillInfo->m_SkillClassCode;
return INVALID_SKILL_CLASS_CODE;
}
DWORD SkillData::GetSkillNameCode() const
{
if( m_pCurrentSkillInfo != NULL )
return m_pCurrentSkillInfo->m_dwSkillNcode;
return 0; // INALID_SKILL_NAME_CODE
}
int SkillData::GetSkillLevel() const
{
if( m_pCurrentSkillInfo != NULL )
return m_pCurrentSkillInfo->m_wSkillLv;
return INVALID_SKILL_LEVEL;
}
#ifdef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL
bool SkillData::IsLeftSide() const
{
return (uicSkillInfo::m_SlotIndex % 6) < 3; // x 위치가 0,1,2번
}
void SkillData::SetDeactiveState()
{
m_State = SLOT_RENDER_STATE_DEACTIVATED;
}
#endif
void SkillData::SetActiveState()
{
m_State = SLOT_RENDER_STATE_ACTIVATED;
}
bool SkillData::IsActiveState() const
{
return m_pCurrentSkillInfo != NULL && m_State == SLOT_RENDER_STATE_ACTIVATED;
}
bool SkillData::IsBlockedState() const
{
return m_State == SLOT_RENDER_STATE_ACTIVATED && m_BlockState == SLOT_RENDER_STATE_BLOCK;
}
void SkillData::SetBlockState( bool bBlock )
{
m_BlockState = bBlock ? SLOT_RENDER_STATE_BLOCK : SLOT_RENDER_STATE_NONE;
}
bool SkillData::IsUseableClass(DWORD character_class)
{
if( m_pCurrentSkillInfo != NULL )
{
DWORD skill_class = m_pCurrentSkillInfo->m_dwClassDefine;
if (skill_class >= 11 && skill_class < 20)
{
// 체인지업 일 땐 10을 빼서 기본클래스로...
skill_class -= 10;
}
// 9번은 드나, 드나(변신중) 둘다 사용가능한 케이스라 특별히 예외처리한다
if( skill_class == eDRAGON_COMMON_SKILL_1stTRANS )
{
if( character_class == eCHAR_DRAGON || character_class == eTRANSFORM_TYPE_DRAGON1 )
return true;
}
return character_class == skill_class;
}
return false;
}
int SkillData::GetClassDefine() const
{
if( m_pCurrentSkillInfo != NULL )
{
return m_pCurrentSkillInfo->m_dwClassDefine > 10 ? m_pCurrentSkillInfo->m_dwClassDefine - 10 : m_pCurrentSkillInfo->m_dwClassDefine;
}
return INVALID_CLASS_CODE;
}
WORD SkillData::GetSkillRange() const
{
if( m_pCurrentSkillInfo != NULL )
{
return m_pCurrentSkillInfo->m_wSkillRange;
}
return 0;
}
bool SkillData::IsPassiveSkill() const
{
if( m_pCurrentSkillInfo != NULL )
{
return m_pCurrentSkillInfo->m_bySkillType == SKILL_TYPE_PASSIVE;
}
return false;
}
#ifdef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL
size_t SkillDataSet::GetTotalUsedPoint(bool left) const
{
int line_index = 0;
size_t total_cost = 0;
for (int i=0;i!=size();++i)
{
const SkillData& skill_data = Get(i);
if( left == skill_data.IsLeftSide() )
{
int cost = 0;
if( skill_data.GetSkillLevel() == 1 && skill_data.IsActive() == true )
{
cost = skill_data.GetSkillLevel();
}
else if( skill_data.GetSkillLevel() > 1 )
{
cost = skill_data.GetSkillLevel();
}
if( cost > 0 )
{
// 더 높은 라인이면 그 라인을 기준으로 다시 카운팅한다
if( skill_data.GetLineIndex() > line_index )
{
total_cost = cost;
line_index = skill_data.GetLineIndex();
}
else if( skill_data.GetLineIndex() == line_index )
{
total_cost += cost;
}
}
}
}
// 한 라인은 최대 20포인트
if( total_cost > 20 )
total_cost = 20;
return line_index * 20 + total_cost;
}
#else
size_t SkillDataSet::GetTotalUsedPoint() const
{
size_t total_cost = 0;
for (int i=0;i!=size();++i)
{
const SkillData& skill_data = Get(i);
if( skill_data.GetSkillLevel() > 0 )
{
total_cost += skill_data.GetSkillLevel();
}
}
return total_cost;
}
#endif
//------------------------------------------------------------------------------
/** 슬롯위치를 통한 스크립트 정보얻기
*/
SkillData* SkillDataSet::GetSkillDataBySlotPosition(int position)
{
if( position == INVALID_SLOT_POS )
{
return NULL;
}
for (size_t i = 0; i < size(); ++i)
{
if (Get(i).GetSlotPosition() == position)
{
return &(Get(i));
}
}
return NULL;
}
SkillData* SkillDataSet::GetSkillDataBySkillClassCode(CODETYPE skill_class_code)
{
if( skill_class_code == INVALID_SKILL_CLASS_CODE )
{
return NULL;
}
for (size_t i = 0; i < size(); ++i)
{
if (Get(i).GetSkillClassCode() == skill_class_code )
{
return &(Get(i));
}
}
return NULL;
}
SkillData* SkillDataSet::GetSkillDataBySkillCode(CODETYPE skill_code)
{
if( skill_code == INVALID_SKILL_CODE )
{
return NULL;
}
for (size_t i = 0; i < size(); ++i)
{
if (Get(i).GetSkillCode() == skill_code )
{
return &(Get(i));
}
}
return NULL;
}
//------------------------------------------------------------------------------
/** 스킬정보를 통한 슬롯위치찾기
*/
int SkillDataSet::FindPosBySkillClassCode(int skill_class_code)
{
if( skill_class_code == INVALID_SKILL_CLASS_CODE )
{
return INVALID_SLOT_POS;
}
for (size_t i = 0; i < size(); ++i)
{
if( Get(i).GetSkillClassCode() == skill_class_code )
{
return i;
}
}
return INVALID_SLOT_POS;
}
bool SkillDataSet::CheckSkillLevel(DWORD skill_class, int skill_level, DWORD* skill_name_code)
{
SkillData* skill_data = GetSkillDataBySkillClassCode(skill_class);
// 스킬이 없으면 실패
if( skill_data == NULL )
{
return false;
}
// 일단 이름은 복사
if (skill_name_code)
{
*skill_name_code = skill_data->GetSkillNameCode();
}
// 레벨이 부족하면 실패
if( skill_level > skill_data->GetSkillLevel() )
{
return false;
}
return true;
}