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

349 lines
10 KiB
C++

// (C) 2010 Webzen Sun Studio
//------------------------------------------------------------------------------
#include "SunClientPrecompiledHeader.h"
#ifndef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL
#include "ItemUnitRenderer.h"
#include "uiSkillTree.h"
#include "SkillInventoryStoreParser.h"
#include "SkillSlot.h"
#include "SlotKeyGenerator.h"
#include "SkillInfoParser.h"
#include "QuickContainer.h"
#include "ItemManager.h"
#include "Hero.h"
#include "SkillMain.h"
//------------------------------------------------------------------------------
/**
*/
uiSkillTree::uiSkillTree(InterfaceManager* ui_man) :
uiBase(ui_man),
invalid_control_(false),
item_renderer_(NULL)
{
SkillSlotContainer::Init(kMaxSlot);
this->InitItemRender();
is_mouse_overed_on_button_ = false;
mouse_overed_control_ = 0;
}
//------------------------------------------------------------------------------
/**
*/
uiSkillTree::~uiSkillTree()
{
this->Release();
}
//------------------------------------------------------------------------------
/**
*/
SCSlotContainer* uiSkillTree::GetSlotContainer()
{
return static_cast<SCSlotContainer *>(this);
}
//------------------------------------------------------------------------------
/** 슬롯 삽입
*/
RC::eSLOT_INSERT_RESULT uiSkillTree::InsertSlot(POSTYPE at_pos, SCSlot& IN slot)
{
if (ValidPos(at_pos) == false)
{
return RC::RC_INSERT_SLOT_FAILED;
}
// 슬롯에 삽입
return SCSkillSlotContainer::InsertSlot(at_pos, slot);
}
//------------------------------------------------------------------------------
/** 슬롯 삭제
*/
BOOL uiSkillTree::DeleteSlot(POSTYPE at_pos, SCSlot* slot_clone_before_delete)
{
if (IsEmpty(at_pos))
{
return FALSE;
}
if (GetItemUnitRender())
{
GetItemUnitRender()->RemoveItemUnit(GetSlot(at_pos).GetSerial());
}
return SCSkillSlotContainer::DeleteSlot(at_pos, slot_clone_before_delete);
}
//------------------------------------------------------------------------------
/** SkillInventory.txt 정보내용을 채운다
*/
void uiSkillTree::LoadSkillTreeSlot(const SkillInven_s* data)
{
for (int idx = 0; idx < kMaxColumn; ++idx)
{
int skill_Code = data->iSkillID[idx];
if (skill_Code <= 0)
{
continue;
}
//슬롯 내용채움
SkillSlot skill_slot;
skill_slot.SetCode(skill_Code);
skill_slot.SetSerial(g_SlotKeyGenerator.GetKey());
int real_pos = (data->bSkillTab2 - 1)*kMaxColumn + idx;
InsertSlot(real_pos, skill_slot);
SkillData skill_data;
skill_data.SetSlotPosition( real_pos, data->bSkillTab2 - 1 );
skill_data.SetCurSkill( skill_Code );
xGetSkillData()->AddSkillData( skill_data );
//curSkillInfo->SetFirst();
//BASE_ABILITYINFO* ablity_info = NULL;
//while (ablity_info = curSkillInfo->GetNext())
//{
// info.currStateCodes.push_back(ablity_info->m_wAbilityID);
//}
// 스킬 등록 과정에서 요구 스킬이 있는 모든 스킬의 lock위치를 등록
if( skill_data.GetRequiredSkillClassCode() > INVALID_SKILL_CLASS_CODE )
{
skill_tree_effect_.AddLockInfo( real_pos, skill_data.GetSkillClassCode());
}
}
}
//------------------------------------------------------------------------------
/** SkillInventory.txt 정보내용을 채운다
*/
void uiSkillTree::LoadSkillTreeSlotArrow(const SkillInven_s* data)
{
for (int idx = 0; idx < kMaxColumn; ++idx)
{
int skill_Code = data->iSkillID[idx];
//if (skill_Code >= 0)
//{
// continue;
//}
// 위치
int real_pos = (data->bSkillTab2 - 1)*kMaxColumn + idx;
if( skill_Code == -1 || skill_Code == -2 || skill_Code == -5 || skill_Code == -6 )
{
int arrow_index = std::abs(skill_Code) -1;
// 아래쪽 스킬을 가리키는 화살표
if( SkillData* skill_data = xGetSkillData()->GetSkillDataBySlotPosition( real_pos + kMaxColumn ) )
{
if( skill_data->GetRequiredSkillClassCode() > INVALID_SKILL_CLASS_CODE && skill_data->GetRequiredSkillLevel() > INVALID_SKILL_LEVEL )
{
skill_tree_effect_.AddArrowInfo( real_pos, arrow_index, skill_data->GetRequiredSkillClassCode(), skill_data->GetRequiredSkillLevel() );
}
}
}
else if( skill_Code == -3 || skill_Code == -4 )
{
int arrow_index = std::abs(skill_Code) -1;
// 2칸 아래쪽 스킬을 가리키는 화살표
if( SkillData* skill_data = xGetSkillData()->GetSkillDataBySlotPosition( real_pos + kMaxColumn + kMaxColumn ) )
{
if( skill_data->GetRequiredSkillClassCode() > INVALID_SKILL_CLASS_CODE && skill_data->GetRequiredSkillLevel() > INVALID_SKILL_LEVEL )
{
skill_tree_effect_.AddArrowInfo( real_pos, arrow_index, skill_data->GetRequiredSkillClassCode(), skill_data->GetRequiredSkillLevel() );
}
}
}
}
}
//------------------------------------------------------------------------------
/** 게임 접속시 캐릭터정보의 스킬 슬롯스트림을 통해 스킬 정보를 초기화
*/
void uiSkillTree::SetSkillTotalInfo(const SKILL_TOTAL_INFO& skill_total_info)
{
const SKILLSLOT* total_slot = skill_total_info.m_Slot;
SkillInfoParser* parser = SkillInfoParser::Instance();
for (POSTYPE idx = 0; idx < skill_total_info.m_Count; ++idx)
{
SkillSlot post_slot(total_slot[idx].m_Stream);
if( SkillScriptInfo* skill_info = parser->GetSkillInfo(post_slot.GetCode()) )
{
// 스킬 활성화
xGetSkillData()->AddNewSkillCode( post_slot.GetCode() );
//SetSkillActive(post_slot.GetCode());
}
}
xGetSkillData()->RefreshActiveSkill( xGetSkillData()->GetSkillDataSet() );
RefreshArrowImage();
RefreshSkillSlot();
}
SkillSlot* uiSkillTree::GetSkillSlot( int skill_slot_position )
{
if( IsEmpty( skill_slot_position ) == FALSE )
{
return static_cast<SkillSlot*>(&GetSlot(skill_slot_position));
}
return NULL;
}
void uiSkillTree::RefreshArrowImage()
{
skill_tree_effect_.ResetLock();
skill_tree_effect_.ResetArrow();
// 이미 배운 스킬들에 대한 처리
SkillDataSet& skill_set = xGetSkillData()->GetSkillDataSetForTree();
for( size_t i=0;i!=skill_set.size();++i)
{
SkillData& skill_data = skill_set[i];
if( skill_data.IsActiveState() == true )
{
// 이미 습득한 스킬이므로 잠김표시 숨김
skill_tree_effect_.HideLock( skill_data.GetSkillClassCode() );
// 이 스킬을 습득했을때 활성화 되는 화살표가 있으면 표시하도록 설정
skill_tree_effect_.SetVisibleArrow( skill_data.GetSkillClassCode(), skill_data.GetSkillLevel() );
}
}
}
void uiSkillTree::RefreshSkillSlot()
{
// 스킬정보가 변경된것이 있다면 여기에서 갱신됨
SkillDataSet& skill_set = xGetSkillData()->GetSkillDataSetForTree();
for( size_t i=0;i!=skill_set.size();++i)
{
SkillData& skill_data = skill_set[i];
int slot_position = skill_data.GetSlotPosition();
if( IsEmpty( slot_position ) == FALSE )
{
SCSkillSlot& skill_slot = static_cast<SCSkillSlot&>(GetSlot( skill_data.GetSlotPosition() ) );
skill_slot.SetSlotType( ST_SKILL );
skill_slot.SetCode( skill_data.GetSkillCode() );
}
}
}
void uiSkillTree::UpdateArrowState()
{
const SkillDataSet& skill_set = xGetSkillData()->GetSkillDataSetForTree();
for( size_t i=0;i!=skill_set.size();++i)
{
const SkillData& skill_data = skill_set[i];
// 이 스킬을 습득했을때 활성화 되는 화살표가 있으면 표시하도록 설정
skill_tree_effect_.SetAnimationArrow( skill_data.GetSkillClassCode() , skill_data.GetSkillLevel() );
}
}
void uiSkillTree::UpdateLockState()
{
const SkillDataSet& skill_set = xGetSkillData()->GetSkillDataSetForTree();
// 업데이트 되는 시점에서 엑티브된 스킬로 lock을 사라지는 처리를 할 수있도록 처리
// (이미 사라져 있거나 애니메이션 중이라면 무시됨)
for( size_t i=0;i!=skill_set.size();++i)
{
const SkillData& skill_data = skill_set[i];
if( skill_data.IsActiveState() == true )
{
skill_tree_effect_.BegionFadeout( skill_data.GetSkillClassCode() );
}
}
}
//------------------------------------------------------------------------------
/** 탭정보 갱신(이펙트 애니를 위해 저장해둔다)
*/
void uiSkillTree::RefreshTree(bool data_clear)
{
// 스킬 레벨이 0보다 큰 경우만 모두 합산
int total_level = (int)xGetSkillData()->GetSkillDataSetForTree().GetTotalUsedPoint();
//
skill_tree_effect_.SetTotalSkillLevel( total_level, data_clear );
// 적용, 취소 버튼 표시여부
if( xGetSkillData()->IsSkillSimulated() )
{
GetControlWZ( wzId_[kButtonBlendImage] )->ShowWindowWZ(WZ_SHOW);
GetControlWZ( wzId_[kButton1] )->EnableWindowWZ(WZS_ENABLE);
GetControlWZ( wzId_[kButton2] )->EnableWindowWZ(WZS_ENABLE);
}
else
{
GetControlWZ( wzId_[kButtonBlendImage] )->ShowWindowWZ(WZ_HIDE);
GetControlWZ( wzId_[kButton1] )->EnableWindowWZ(WZS_DISABLE);
GetControlWZ( wzId_[kButton2] )->EnableWindowWZ(WZS_DISABLE);
}
// 모든 슬롯의 +버튼 감추기
for (int i = kPlusBegin; i <= kPlusEnd; ++i)
{
if( CControlWZ* control = getControl(i) )
{
control->ShowWindowWZ(WZ_HIDE);
}
}
// 레벨업 상태를 갱신한 후
xGetSkillData()->RefreshLevelupCondition();
// 레벨업 가능한것만 +버튼 표시
SkillDataSet& skill_set = xGetSkillData()->GetSkillDataSetForTree();
for (size_t i = 0; i < skill_set.size(); ++i)
{
if (skill_set[i].IsEnableLevelup())
{
if( CControlWZ* control = getControl(skill_set[i].GetSlotPosition() + kPlusBegin) )
{
control->ShowWindowWZ(WZ_SHOW);
}
}
}
// 잠김 이미지처리
UpdateLockState();
}
//------------------------------------------------------------------------------
/** 이 슬롯이 스킬 슬롯의 아이템인가 (아니면 퀵슬롯의 스킬슬롯인가 -_-)
*/
BOOL uiSkillTree::IsSkillSlot(SCSkillSlot* slot)
{
SkillDataSet& skill_set = xGetSkillData()->GetSkillDataSetForTree();
for( size_t i=0;i!=skill_set.size();++i)
{
SkillData& skill_data = skill_set[i];
SCSkillSlot& skill_slot = static_cast<SCSkillSlot&>(GetSlot( skill_data.GetSlotPosition() ) );
if( &skill_slot == slot )
{
return TRUE;
}
}
return FALSE;
}
#endif//'ndef' _NA_0_20120321_SKILLTREE_SECOND_RENEWAL