// (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(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() ); } } } } } //------------------------------------------------------------------------------ /** °ÔÀÓ Á¢¼Ó½Ã ij¸¯ÅÍÁ¤º¸ÀÇ ½ºÅ³ ½½·Ô½ºÆ®¸²À» ÅëÇØ ½ºÅ³ Á¤º¸¸¦ ÃʱâÈ­ */ 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(&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(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(GetSlot( skill_data.GetSlotPosition() ) ); if( &skill_slot == slot ) { return TRUE; } } return FALSE; } #endif//'ndef' _NA_0_20120321_SKILLTREE_SECOND_RENEWAL