#include "SunClientPrecompiledHeader.h" #include "uiPerkDialog.h" #include "uiSkillMan/uiNewSkillMan.h" #include "SCPerkSlot.h" #include "ItemUnitRenderer.h" #include "InterfaceManager.h" #include "MouseHandler.h" #include "GlobalFunc.h" #include "Hero.h" #include "uiToolTipMan/uiToolTipMan.h" #include "ItemManager.h" #include "FTextParser.h" #include "FTextSentence.h" #include "GameFramework.h" #include "uiInventoryMan/uiInventoryDef.h" #include "InventoryDialog.h" #include "SCItemSlot.h" #include "OptionListParser.h" #include "BattleScene.h" #include "Map.h" #include "IconMgr.h" #include "Char_SkillDialog.h" #include "uiCharacterStatusMan/uiCharacterStatusMan.h" #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM #include "SkillSystem/PerkDataContainer.h" #include "HeroGaugeDialog2.h" #include "HeroActionInput.h" #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM const int kMaxOptionLine = 4; const DWORD message_font_id = StrToWzID("mn12"); const DWORD option_font_id = StrToWzID("st10"); uiPerkDialog::uiPerkDialog(InterfaceManager* ui_manager): uiBase(ui_manager), ui_skill_manager_(NULL), unit_renderer_(NULL), is_mouse_over_in_perk_slot_(false), mouse_over_perk_slot_(INVALID_POSTYPE_VALUE), is_store_perk_data_(false) #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM ,active_group_number_(0), active_group_number_prototype_(0), is_prototype_receive(FALSE) #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM { } uiPerkDialog::~uiPerkDialog() { } void uiPerkDialog::RegisterControl() { #ifdef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL // Åǹöư RegisterControlPosition(StrToWzID("C000"), kControl_CheckBT_C005); RegisterControlPosition(StrToWzID("C001"), kControl_CheckBT_C006); RegisterControlPosition(StrToWzID("C002"), kControl_CheckBT_C000); RegisterControlPosition(StrToWzID("P317"), kControl_Button_B010); RegisterControlPosition(StrToWzID("P318"), kControl_Button_B000); RegisterControlPosition(StrToWzID("P319"), kControl_Button_B001); RegisterControlPosition(StrToWzID("P320"), kControl_Button_B002); RegisterControlPosition(StrToWzID("P321"), kControl_Button_B003); RegisterControlPosition(StrToWzID("P322"), kControl_Button_B005); RegisterControlPosition(StrToWzID("P323"), kControl_Button_B006); RegisterControlPosition(StrToWzID("P324"), kControl_Button_B008); RegisterControlPosition(StrToWzID("P325"), kControl_Button_B009); RegisterControlPosition(StrToWzID("P326"), kControl_Button_B011); RegisterControlPosition(StrToWzID("P327"), kControl_Button_B013); RegisterControlPosition(StrToWzID("P328"), kControl_Button_B014); RegisterControlPosition(StrToWzID("P329"), kControl_Button_B015); RegisterControlPosition(StrToWzID("P330"), kControl_Button_B016); RegisterControlPosition(StrToWzID("P331"), kControl_Button_B017); RegisterControlPosition(StrToWzID("P337"), kControl_Button_B004); RegisterControlPosition(StrToWzID("P338"), kControl_Button_B012); RegisterControlPosition(StrToWzID("P339"), kControl_Button_B018); RegisterControlPosition(StrToWzID("P313"), kControl_Button_B019); RegisterControlPosition(StrToWzID("P314"), kControl_Button_B020); RegisterControlPosition(StrToWzID("P315"), kControl_Button_B021); RegisterControlPosition(StrToWzID("P316"), kControl_Button_B022); RegisterControlPosition(StrToWzID("P271"), kControl_Button_B023); RegisterControlPosition(StrToWzID("B000"), kControl_Button_B024); RegisterControlPosition(StrToWzID("B001"), kControl_Button_B025); RegisterControlPosition(StrToWzID("B003"), kControl_Button_B026); RegisterControlPosition(StrToWzID("B004"), kControl_Button_B027); RegisterControlPosition(StrToWzID("B002"), kControl_Button_B028); RegisterControlPosition(StrToWzID("R000"), kControl_Rect_R000); RegisterControlPosition(StrToWzID("R003"), kControl_Rect_R002); RegisterControlPosition(StrToWzID("R001"), kControl_Rect_R004); RegisterControlPosition(StrToWzID("R002"), kControl_Rect_R005); //RegisterControlPosition(StrToWzID("V000"), kControl_Scroll_V000); //RegisterControlPosition(StrToWzID("P000"), kControl_Picture_P000); RegisterControlPosition(StrToWzID("P014"), kControl_Picture_P001); RegisterControlPosition(StrToWzID("B086"), kControl_Button_B999); #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM RegisterControlPosition(StrToWzID("C003"), kControl_CheckBT_C003); RegisterControlPosition(StrToWzID("C004"), kControl_CheckBT_C004); RegisterControlPosition(StrToWzID("P015"), kControl_Picture_P017); RegisterControlPosition(StrToWzID("B005"), kControl_Button_B005_New); #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM #else RegisterControlPosition(StrToWzID("C005"), kControl_CheckBT_C005); RegisterControlPosition(StrToWzID("C006"), kControl_CheckBT_C006); RegisterControlPosition(StrToWzID("C000"), kControl_CheckBT_C000); RegisterControlPosition(StrToWzID("B999"), kControl_Button_B999); RegisterControlPosition(StrToWzID("B010"), kControl_Button_B010); RegisterControlPosition(StrToWzID("B000"), kControl_Button_B000); RegisterControlPosition(StrToWzID("B001"), kControl_Button_B001); RegisterControlPosition(StrToWzID("B002"), kControl_Button_B002); RegisterControlPosition(StrToWzID("B003"), kControl_Button_B003); RegisterControlPosition(StrToWzID("B004"), kControl_Button_B004); RegisterControlPosition(StrToWzID("B005"), kControl_Button_B005); RegisterControlPosition(StrToWzID("B006"), kControl_Button_B006); RegisterControlPosition(StrToWzID("B008"), kControl_Button_B008); RegisterControlPosition(StrToWzID("B009"), kControl_Button_B009); RegisterControlPosition(StrToWzID("B011"), kControl_Button_B011); RegisterControlPosition(StrToWzID("B012"), kControl_Button_B012); RegisterControlPosition(StrToWzID("B013"), kControl_Button_B013); RegisterControlPosition(StrToWzID("B014"), kControl_Button_B014); RegisterControlPosition(StrToWzID("B015"), kControl_Button_B015); RegisterControlPosition(StrToWzID("B016"), kControl_Button_B016); RegisterControlPosition(StrToWzID("B017"), kControl_Button_B017); RegisterControlPosition(StrToWzID("B018"), kControl_Button_B018); RegisterControlPosition(StrToWzID("B019"), kControl_Button_B019); RegisterControlPosition(StrToWzID("B020"), kControl_Button_B020); RegisterControlPosition(StrToWzID("B021"), kControl_Button_B021); RegisterControlPosition(StrToWzID("B022"), kControl_Button_B022); RegisterControlPosition(StrToWzID("B023"), kControl_Button_B023); RegisterControlPosition(StrToWzID("B024"), kControl_Button_B024); RegisterControlPosition(StrToWzID("B025"), kControl_Button_B025); RegisterControlPosition(StrToWzID("B026"), kControl_Button_B026); RegisterControlPosition(StrToWzID("B027"), kControl_Button_B027); RegisterControlPosition(StrToWzID("B028"), kControl_Button_B028); RegisterControlPosition(StrToWzID("R000"), kControl_Rect_R000); RegisterControlPosition(StrToWzID("R002"), kControl_Rect_R002); RegisterControlPosition(StrToWzID("R004"), kControl_Rect_R004); RegisterControlPosition(StrToWzID("R005"), kControl_Rect_R005); RegisterControlPosition(StrToWzID("V000"), kControl_Scroll_V000); RegisterControlPosition(StrToWzID("P000"), kControl_Picture_P000); RegisterControlPosition(StrToWzID("P001"), kControl_Picture_P001); #endif } void uiPerkDialog::Init(CDrawBase* pDrawBase) { uiBase::Init(pDrawBase); RegisterPerkControlMessenger(this); SetSlotIdx(SI_PERK); RegisterControl(); SetButtonControlBySlotPos(); unit_renderer_ = new ItemUnitRenderer; assert(unit_renderer_); if (unit_renderer_) { unit_renderer_->Init(GetDrawBase(), kMaxNumberOfNodes); unit_renderer_->SetOverLap(FALSE); } ui_skill_manager_ = static_cast(GetMan()); LoadPerkLevelImage(); #ifdef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL if( CControlWZ* control = GetControlWZ(GetControlID_byPosition(kControl_Picture_P001)) ) { control->ShowWindowWZ(WZ_HIDE); control->SetDiscardMessage(true); } for( size_t i=kControl_Button_B010;i<=kControl_Button_B023;++i) { if( CCtrlPictureWZ* control = (CCtrlPictureWZ*)GetControlWZ(GetControlID_byPosition(i)) ) { control->EnableLButtonEvent(true); } } #endif #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM // Page ¹Ì¸® ¼ÂÆÃ. current_page_ = eStylePageA; active_group_number_ = eStylePageA; active_group_number_prototype_ = eStylePageA; is_wait_packet_ = false; // vector ¹Ì¸® ÇÒ´ç. my_perk_data_.reserve(kPerkGroupMax); my_prototype_perk_data_.reserve(kPerkGroupMax); for ( unsigned int i = 0; i < kPerkGroupMax; ++i) { PerkGroupStruct temp; my_perk_data_.push_back(temp); my_prototype_perk_data_.push_back(temp); } #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } void uiPerkDialog::LoadPerkLevelImage() { perk_level_image.clear(); perk_level_image.reserve(KMaxPerkLevel); const DWORD perk_level_image_code[KMaxPerkLevel] = {36898, 36899, 36900, 36901, 36902}; IconImage* icon_image = NULL; for (int index = 0; index < KMaxPerkLevel; ++index) { icon_image = ICONMGR()->Add(perk_level_image_code[index]); perk_level_image.push_back(icon_image); } } void uiPerkDialog::RenderPerkLevelImage(int perk_level, RECT* draw_rect) { uiPerkDialog* perk_dialog = GET_CAST_DIALOG(uiPerkDialog, IM_SKILL_MANAGER::SKILL_PERK_DLG); if (perk_dialog != NULL) { IconImage* perk_level_image = perk_dialog->GetPerkLevelImage(perk_level); if (perk_level_image != NULL) { perk_level_image->Render(draw_rect); } } } void uiPerkDialog::Release() { if (unit_renderer_ != NULL) { unit_renderer_->FlushUnitDraw(); unit_renderer_->Release(); delete unit_renderer_; unit_renderer_ = NULL; } #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM my_prototype_perk_data_.clear(); my_perk_data_.clear(); is_wait_packet_ = false; #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } void uiPerkDialog::ClearAll() { for (int slot_pos = 0; slot_pos < GetMaxSlotNum(); slot_pos++) { if(IsEmpty(slot_pos) == FALSE) { DeleteSlot(slot_pos, NULL); } } SCPerkSlotContainer::ClearAll(); is_store_perk_data_ = false; benefit_option_map_.clear(); penalty_option_map_.clear(); #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM current_page_ = eStylePageA; active_group_number_ = eStylePageA; active_group_number_prototype_ = eStylePageA; // vector ¹Ì¸® ÇÒ´ç. my_perk_data_.reserve(kPerkGroupMax); my_prototype_perk_data_.reserve(kPerkGroupMax); for ( unsigned int i = 0; i < kPerkGroupMax; ++i) { for ( unsigned j = 0; j < 4; ++j ) { my_perk_data_[i].from_pos[j] = INVALID_POSTYPE_VALUE; my_prototype_perk_data_[i].from_pos[j] = INVALID_POSTYPE_VALUE; } } is_prototype_receive = FALSE; active_group_number_ = eStylePageA; active_group_number_prototype_ = eStylePageA; #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } void uiPerkDialog::OnShowWindow(BOOL val) { ui_skill_manager_->OpenDialog(uiSkillMan::kSkillPerk, val); if (val) { RefreshOptionText(); RefreshTab(); #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM Refresh_PerkSlock_My_Data(); current_page_ = active_group_number_; switch (active_group_number_) { case eStylePageA: OnClickAGroupButton(0 , 0); break; case eStylePageB: OnClickBGroupButton(0 , 0); break; } #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } else { // PerkDialog ¿¡¼­ Áý¾î¿Ã¸° °Å¶ó¸é ³»·Á³õ´Â´Ù. if (MouseHandler::Instance()->IsExistItemAtHand() == TRUE) { RollbackPerkItemAtHand(); } is_mouse_over_in_perk_slot_ = false; mouse_over_perk_slot_ = INVALID_POSTYPE_VALUE; #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM // óÀ½À¸·Î ¼­¹ö¿¡¼­ ¹ÞÀº Á¤º¸¿Í ÇöÀç Á¤º¸¿Í ¸ÂÁö ¾ÊÀ» °æ¿ì ÀúÀå if ( is_prototype_receive ) { SavePerkGroupListData(); } #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } } void uiPerkDialog::OnRenderSolarDialog() { if (IsVisibleWindow()) { for (int rect_index = kFTextRenderTop; rect_index < kFTextRenderMax; ++rect_index) { text_render_[rect_index].Render(); } if (unit_renderer_ != NULL) { unit_renderer_->Render(); } #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM // ÇöÀç ¾×Æ¼ºê ±×·ìÀ» º¸°í ÀÖ´Ù´Â °ÍÀ» Ç¥½ÃÇØ ÁÖÀÚ. if ( current_page_ == active_group_number_ ) { for (int i = kControl_Button_B019; i <= kControl_Button_B022; ++i) { CCtrlButtonWZ* button_control_ptr = static_cast(GetControlWZ (GetControlID_byPosition(i))); if ( button_control_ptr ) { RECT button_control_rect; button_control_rect = button_control_ptr->GetSizeRect(); button_control_rect.left -= 14; button_control_rect.right += 14; button_control_rect.top -= 14; button_control_rect.bottom += 13; g_InterfaceManager.RenderActivateMarkPerkGroup(button_control_rect.left, button_control_rect.top, button_control_rect.right - button_control_rect.left, button_control_rect.bottom - button_control_rect.top); } } } #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM #ifdef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL // ºñȰ¼º À̹ÌÁö Ãâ·Â if( CControlWZ* control_ptr = GetControlWZ(GetControlID_byPosition(kControl_Picture_P001)) ) { control_ptr->ShowWindowWZ( IsEnableSetting() == false ? WZ_SHOW : WZ_HIDE ); // ºñȰ¼ºÀ̸é Ç¥½Ã } #else if (IsEnableSetting() == false) { // ºñȰ¼º À̹ÌÁö Ãâ·Â CControlWZ* control_ptr = GetControlWZ(GetControlID_byPosition(kControl_Picture_P001)); if (control_ptr != NULL) { static int alpha_value = 125; RECT control_rect = control_ptr->GetSizeRect(); g_InterfaceManager.RenderRect(control_rect, WzColor_RGBA(0, 0, 0, alpha_value)); } } #endif if (is_mouse_over_in_perk_slot_ && (mouse_over_perk_slot_ != INVALID_POSTYPE_VALUE)) { CControlWZ* control_ptr = GetButtonControlBySlotPos(mouse_over_perk_slot_); if (control_ptr != NULL) { ENUM_DRAWSTATE control_draw_state = control_ptr->GetDrawState(); if (control_draw_state == E_BASE) { is_mouse_over_in_perk_slot_ = false; mouse_over_perk_slot_ = INVALID_POSTYPE_VALUE; } else { uiToolTipMan* tooltip_manager = GET_DIALOG_MANAGER(uiToolTipMan, UIMAN_TOOLTIP); if (tooltip_manager != NULL) { #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM // 30 ~ 34-> pos°¡ active ½½·Ô if ( mouse_over_perk_slot_ >= 30 && mouse_over_perk_slot_ < 34 ) { if (my_perk_data_[current_page_].from_pos[mouse_over_perk_slot_ - 30] == INVALID_POSTYPE_VALUE) return; // 0 ~ 14°¡ default slotÀÇ pos if (!(my_perk_data_[current_page_].from_pos[mouse_over_perk_slot_ - 30] >= 0 && my_perk_data_[current_page_].from_pos[mouse_over_perk_slot_ - 30] <= 14)) return; SCPerkSlot& perk_slot = static_cast(GetSlot(my_perk_data_[current_page_].from_pos[mouse_over_perk_slot_ - 30])); tooltip_manager->RegisterTooltipPerkInfo(&perk_slot, mouse_over_perk_slot_); tooltip_manager->SetTooltipDialogID(GetDialogKey()); } else { SCPerkSlot& perk_slot = static_cast(GetSlot(mouse_over_perk_slot_)); tooltip_manager->RegisterTooltipPerkInfo(&perk_slot, mouse_over_perk_slot_); tooltip_manager->SetTooltipDialogID(GetDialogKey()); } #else SCPerkSlot& perk_slot = static_cast(GetSlot(mouse_over_perk_slot_)); tooltip_manager->RegisterTooltipPerkInfo(&perk_slot, mouse_over_perk_slot_); tooltip_manager->SetTooltipDialogID(GetDialogKey()); #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } } } } } } void uiPerkDialog::OnUpdateSolarDialog() { if (IsVisibleWindow()) { RefreshTopMessage(); WzID rect_control[kFTextRenderMax] = {GetControlID_byPosition(kControl_Rect_R000), GetControlID_byPosition(kControl_Rect_R002), GetControlID_byPosition(kControl_Rect_R004), GetControlID_byPosition(kControl_Rect_R005)}; CCtrlRectangleWZ* rect_control_ptr = NULL; RECT rect; for (int rect_index = kFTextRenderTop; rect_index < kFTextRenderMax; ++rect_index) { rect_control_ptr = static_cast(GetControlWZ(rect_control[rect_index])); if (rect_control_ptr != NULL) { rect = rect_control_ptr->GetSizeRect(); text_render_[rect_index].SetRect(rect); } } } } void uiPerkDialog::SetButtonControlBySlotPos() { button_control_map_.clear(); const POSTYPE slot_num[3] = {kNumberOfDefaultSlots, kNumberOfCashSlots, kNumberOfActiveSlots}; const POSTYPE start_slot_pos[3] = {kDefaultPerkButton_Start, kCashPerkButton_Start, kActivePerkButton_Start}; const POSTYPE end_slot_pos[3] = {kDefaultPerkButton_End, kCashPerkButton_End, kActivePerkButton_End}; const POSTYPE* use_slot_pos_by_type[3] = {PerkDataList::kDefaultSlotPositions, PerkDataList::kCashSlotPositions, PerkDataList::kActiveSlotPositions}; pair temp_data_pair; CControlWZ* button_control = NULL; POSTYPE button_position; POSTYPE slot_pos; for (int slot_type = 0; slot_type < 3; ++slot_type) { for (int index = 0; index < slot_num[slot_type]; ++index) { button_position = start_slot_pos[slot_type] + index; if (button_position >= end_slot_pos[slot_type]) { break; } const POSTYPE* use_slot_pos = use_slot_pos_by_type[slot_type]; slot_pos = use_slot_pos[index]; button_control = GetControlWZ(GetControlID_byPosition(button_position)); temp_data_pair = pair(slot_pos, button_control); button_control_map_.insert(temp_data_pair); } } } CControlWZ* uiPerkDialog::GetButtonControlBySlotPos(POSTYPE slot_pos) { map::iterator map_itr_end = button_control_map_.end(); map::iterator find_itr = button_control_map_.find(slot_pos); if (find_itr != map_itr_end) { return find_itr->second; } return NULL; } RC::eSLOT_INSERT_RESULT uiPerkDialog::InsertSlot(POSTYPE at_pos, SCSlot& IN slot) { RC::eSLOT_INSERT_RESULT result_code = SCPerkSlotContainer::InsertSlot(at_pos, slot); if (result_code != RC::RC_INSERT_SLOT_SUCCESS) { return result_code; } SCPerkSlot& perk_slot = static_cast(GetSlot(at_pos)); const SCPerkSlot* perk_slot_ptr = NULL; CControlWZ* button_control = GetButtonControlBySlotPos(at_pos); if (button_control != NULL) { // unit_render Ãß°¡ bool is_active_slot = perk_slot.is_active_slot(); if (is_active_slot == true) { // ¾×ƼºêPerk ½½·Ôó¸® perk_slot_ptr = perk_slot.GetLinkSlot(); } else { // µðÆúÆ®/ij½ÃPerk ½½·Ôó¸® perk_slot_ptr = &perk_slot; } if ((perk_slot_ptr != NULL) && (perk_slot_ptr->perk_info() != NULL)) { RECT control_rect = button_control->GetSizeRect(); DWORD perk_group = perk_slot.GetPerkID().group_; unit_renderer_->AddItemUnit(perk_group, 0, &control_rect, perk_slot_ptr, button_control); } } return result_code; } BOOL uiPerkDialog::DeleteSlot(POSTYPE at_pos, SCSlot* slot_clone_before_delete) { SCPerkSlot temp_slot; if (slot_clone_before_delete == NULL) { slot_clone_before_delete = &temp_slot; } BOOL is_delete = SCPerkSlotContainer::DeleteSlot(at_pos, slot_clone_before_delete); if ((is_delete == TRUE) && (slot_clone_before_delete != NULL) && (unit_renderer_ != NULL)) { // unit_render Á¦°Å - ½½·ÔŸÀÔ»ó°ü ¾øÀÌ unit_render Á¦°Å SCPerkSlot* perk_slot = static_cast(slot_clone_before_delete); DWORD perk_group = perk_slot->GetPerkID().group_; unit_renderer_->RemoveItemUnit(perk_group); } return is_delete; } void uiPerkDialog::UpdateSlot(POSTYPE at_pos, int changed_num) { // UpdateSlot ½½·ÔÇÔ¼ö´Â Active½½·Ô¿¡ ´ëÇØ¼­¸¸ È£ÃâµÈ´Ù. // changed_num - 0 : »óž÷µ¥ÀÌÆ®(·¹º§¾÷µî), ÀÌ °æ¿ì ó¸®ÇÒ ÀÏÀº ¾ø´Ù. // 1 : ´Ù¸¥PerkÀÌ µî·ÏµÊ. // -1 : Cash Active ½½·ÔÀÇ ÇØÁ¦(Cash PerkÀÇ ¸¸·á) SCPerkSlotContainer::UpdateSlot(at_pos, changed_num); if (unit_renderer_ == NULL) { return; } SCPerkSlot& perk_slot = static_cast(GetSlot(at_pos)); if (perk_slot.is_active_slot() == false) { return; } const SCPerkSlot* link_perk_slot = perk_slot.GetLinkSlot(); DWORD perk_group = perk_slot.GetPerkID().group_; if (changed_num == 1) // ¾×ƼºêPerk½½·Ô¿¡ Perk link { if (link_perk_slot == NULL) { return; } const PerkInfo* link_perk_info = link_perk_slot->perk_info(); if (link_perk_info != NULL) { // ÄÁÆ®·ÑÀ» ¾ò¾î¿Í¾ß ÇÑ´Ù. CControlWZ* button_control = GetButtonControlBySlotPos(at_pos); if (button_control != NULL) { RECT control_rect = button_control->GetSizeRect(); unit_renderer_->RemoveItemUnit(perk_group); unit_renderer_->AddItemUnit(perk_group, 0, &control_rect, link_perk_slot, button_control); #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM // 0 ~ 3±îÁö active ½½·ÔÀ» ÀÇ¹Ì if (at_pos - 30 >= 0 && at_pos - 30 <= 3) { my_perk_data_[active_group_number_].from_pos[at_pos-30] = link_perk_slot->GetPos(); } #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } } } else if (changed_num == -1) // ¾×ƼºêPerk½½·Ô¿¡ Perk unlink { unit_renderer_->RemoveItemUnit(perk_group); #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM if (at_pos - 30 >= 0 && at_pos - 30 <= 3) { my_perk_data_[active_group_number_].from_pos[at_pos-30] = INVALID_POSTYPE_VALUE; } #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } else if (changed_num == 0) // »óž÷µ¥ÀÌÆ®(·¹º§¾÷µî) { ItemUnitRenderer::RenderUnit* render_unit = unit_renderer_->GetItemUnit(perk_group); if (render_unit != NULL) { render_unit->m_pRefSlot = link_perk_slot; } } } void uiPerkDialog::MessageProc(SI_MESSAGE * pMessage) { if (IsLock()) return; switch (pMessage->eResultMsg) { case RT_MSG_LBUTTONCLICK: OnLButtonClick(pMessage); break; case RT_MSG_MOUSEOVER: OnMouseOver(pMessage); break; #ifndef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL case RT_MSG_SB_PAGETOP://. À­ÂÊ ¸öÅëÀ» ´­·¶´Ù. case RT_MSG_SB_LINETOP://.À­ÂÊ È­»ìÇ¥¸¦ ´­·¶´Ù. OnUpScroll(pMessage); break; case RT_MSG_SB_PAGEBOTTOM://. ¾Æ·¡ÂÊ ¸öÅëÀ» ´­·¶´Ù. case RT_MSG_SB_LINEBOTTOM://.¾Æ·§ÂÊ È­»ìÇ¥¸¦ ´­·¶´Ù OnDownScroll(pMessage); break; case RT_MSG_SB_THUMBTRACK://. ½æÀ» µå·¡±× Çϰí ÀÖ´Ù. case RT_MSG_SB_THUMBPOSITION://. ½æÀ» µå·¡±×ÇÑÈÄ ¸¶¿ì½º¸¦ ³õ¾Ò´Ù. case RT_MSG_SB_ENDSCROLL://. ½ºÅ©·ÑÀÌ Á¾·á µÇ¾ú´Ù. OnThumbScroll(pMessage); break; #endif default: SolarDialog::MessageProc(pMessage); break; } } POSTYPE uiPerkDialog::GetSlotPositionByControlPosition(DWORD control_postion) { POSTYPE slot_postion = INVALID_POSTYPE_VALUE; int index_offset = 0; if (control_postion < kDefaultPerkButton_End) { index_offset = control_postion - kDefaultPerkButton_Start; if (index_offset < kNumberOfDefaultSlots) { slot_postion = static_cast(PerkDataList::kDefaultSlotPositions[index_offset]); } } else if (control_postion < kCashPerkButton_End) { index_offset = control_postion - kCashPerkButton_Start; if (index_offset < kNumberOfCashSlots) { slot_postion = static_cast(PerkDataList::kCashSlotPositions[index_offset]); } } else if (control_postion < kActivePerkButton_End) { index_offset = control_postion - kActivePerkButton_Start; if (index_offset < kNumberOfActiveSlots) { slot_postion = static_cast(PerkDataList::kActiveSlotPositions[index_offset]); } } return slot_postion; } bool uiPerkDialog::OnLButtonClick(SI_MESSAGE* message) { bool result = true; DWORD control_postion = GetControlPosition_byID(message->dwCtrlID); switch (control_postion) { // Åǹöư case kControl_CheckBT_C005: case kControl_CheckBT_C006: case kControl_CheckBT_C000: { RefreshTab(); int tab_index = (control_postion - kControl_CheckBT_C005) + 1; ui_skill_manager_->OpenTab(tab_index); } break; // ÀϹÝPerk ½½·Ô case kControl_Button_B010: case kControl_Button_B000: case kControl_Button_B001: case kControl_Button_B002: case kControl_Button_B003: case kControl_Button_B005: case kControl_Button_B006: case kControl_Button_B008: case kControl_Button_B009: case kControl_Button_B011: case kControl_Button_B013: case kControl_Button_B014: case kControl_Button_B015: case kControl_Button_B016: case kControl_Button_B017: // ij½Ã ¾×ƼºêPerk ½½·Ô case kControl_Button_B004: case kControl_Button_B012: case kControl_Button_B018: { OnClickPerkPalette(control_postion, message->dwCtrlID); } break; // Perk ¾×ƼºêPerk ½½·Ô case kControl_Button_B019: case kControl_Button_B020: case kControl_Button_B021: case kControl_Button_B022: case kControl_Button_B023: { OnClickActivePerk(control_postion, message->dwCtrlID); } break; // ´Ý±â¹öư case kControl_Button_B999: { ShowInterface(FALSE); } break; // ¾×ƼºêPerk µî·ÏÇØÁ¦ ¹öư case kControl_Button_B024: case kControl_Button_B025: case kControl_Button_B026: case kControl_Button_B027: case kControl_Button_B028: { OnClickUnregisterButton(control_postion, message->dwCtrlID); } break; #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM case kControl_CheckBT_C003: { OnClickAGroupButton(control_postion, message->dwCtrlID); if (eStylePageA == current_page_) { return false; } current_page_ = eStylePageA; ChangeGroupPageLogic(); } break; case kControl_CheckBT_C004: { OnClickBGroupButton(control_postion, message->dwCtrlID); if (eStylePageB == current_page_) { return false; } current_page_ = eStylePageB; ChangeGroupPageLogic(); } break; case kControl_Button_B005_New: { // ¾×¼Ç ¹øÈ£ g_HeroInput.OnSkill(35023); } break; #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM default: { } break; } return result; } //------------------------------------------------------------------------------ bool uiPerkDialog::OnMouseOver(SI_MESSAGE* message) { bool result = true; DWORD control_postion = GetControlPosition_byID(message->dwCtrlID); switch (control_postion) { // ÀϹÝPerk ½½·Ô case kControl_Button_B010: case kControl_Button_B000: case kControl_Button_B001: case kControl_Button_B002: case kControl_Button_B003: case kControl_Button_B005: case kControl_Button_B006: case kControl_Button_B008: case kControl_Button_B009: case kControl_Button_B011: case kControl_Button_B013: case kControl_Button_B014: case kControl_Button_B015: case kControl_Button_B016: case kControl_Button_B017: // ij½Ã ¾×ƼºêPerk ½½·Ô case kControl_Button_B004: case kControl_Button_B012: case kControl_Button_B018: // Perk ¾×ƼºêPerk ½½·Ô case kControl_Button_B019: case kControl_Button_B020: case kControl_Button_B021: case kControl_Button_B022: case kControl_Button_B023: { mouse_over_perk_slot_ = GetSlotPositionByControlPosition(control_postion); if (mouse_over_perk_slot_ != INVALID_POSTYPE_VALUE) { is_mouse_over_in_perk_slot_ = true; } } break; default: { is_mouse_over_in_perk_slot_ = false; mouse_over_perk_slot_ = INVALID_POSTYPE_VALUE; } } return result; } void uiPerkDialog::OnClickPerkPalette(DWORD control_position, DWORD control_id) { // Çʵå/¹Ì¼ÇÀÌ¸é µ¿ÀÛ ¾ÈÇÔ if (IsEnableSetting() == false) { return; } // ¸¶¿ì½ºÇڵ鷯¿¡ ¹«¾ùÀΰ¡ µé·ÁÀÖÀ» ¶§ if (MouseHandler::Instance()->IsExistItemAtHand() == TRUE) { if ((control_position >= kCashPerkButton_Start) && (control_position < kCashPerkButton_End)) { POSTYPE slot_pos = GetSlotPositionByControlPosition(control_position); MouseHandler::Instance()->ItemTransaction(SI_PERK, slot_pos, NULL); } RollbackPerkItemAtHand(); } else { // PerkÀ» Áý¾î ¿Ã¸± ¶§ // ÇØ´ç ½½·Ô¿¡ Á¤º¸°¡ ÀÖ´Ù¸é ó¸® / ¾øÀ¸¸é ó¸®ÇÏÁö ¾ÊÀ½ POSTYPE slot_pos = GetSlotPositionByControlPosition(control_position); BOOL is_empty_slot = IsEmpty(slot_pos); if (is_empty_slot == TRUE) { return; } CControlWZ* button_control = GetControlWZ(control_id); if (button_control == NULL) { return; } RECT control_rect = button_control->GetSizeRect(); MouseHandler::Instance()->ItemTransaction(SI_PERK, slot_pos, &control_rect); } } void uiPerkDialog::OnClickActivePerk(DWORD control_position, DWORD control_id) { // Çʵå/¹Ì¼ÇÀÌ¸é µ¿ÀÛ ¾ÈÇÔ if (IsEnableSetting() == false) { return; } // ¸¶¿ì½ºÇڵ鷯¿¡ ¹«¾ùÀΰ¡ µé·ÁÀÖÀ» ¶§ MouseHandler::MouseItem* mouse_item = MouseHandler::Instance()->GetMouseItem(); if (mouse_item->m_fromSlotIdx == SI_PERK) { // µé°íÀÖ´ø PerkÀ» ÇØ´ç ½½·Ô¿¡ µî·Ï POSTYPE slot_pos = GetSlotPositionByControlPosition(control_position); #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM // ÇöÀç page°¡ active page°¡ ¾Æ´Ò ¶§ if ( current_page_ != active_group_number_ && slot_pos - 30 < 4) { my_perk_data_[current_page_].from_pos[slot_pos - 30] = mouse_item->m_fromPos; } // slot_pos->39 Cash ¾×Ƽºê ½½·Ô if ( current_page_ == active_group_number_ || slot_pos == 39) { RequestPerkOperaion(PerkControl::eReq_Register, mouse_item->m_fromPos, slot_pos); } else { ChangeGroupPageLogic(); } MouseHandler::Instance()->RollbackItemAtHand(); #else RequestPerkOperaion(PerkControl::eReq_Register, mouse_item->m_fromPos, slot_pos); MouseHandler::Instance()->RollbackItemAtHand(); #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } // ¾×ƼºêPerk¿¡¼­ µé¾î¿Ã¸®´Â °ÍÀº ¾øÀ½. } void uiPerkDialog::OnClickUnregisterButton(DWORD control_position, DWORD control_id) { // Çʵå/¹Ì¼ÇÀÌ¸é µ¿ÀÛ ¾ÈÇÔ if (IsEnableSetting() == false) { return; } control_position -= kUnregisterButtonOffest; POSTYPE slot_pos = GetSlotPositionByControlPosition(control_position); BOOL is_empty_slot = IsEmpty(slot_pos); if (is_empty_slot == TRUE) { return; } SCPerkSlot& perk_slot = static_cast(GetSlot(slot_pos)); bool is_active_slot = perk_slot.is_active_slot(); bool is_link_slot = (perk_slot.GetLinkSlot() != NULL); #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM if (is_active_slot == true) #else if ((is_active_slot == true) && (is_link_slot == true)) #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM { #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM if (slot_pos - 30 >= 0 && slot_pos - 30 <= 3) { if ( current_page_ != active_group_number_ ) { my_perk_data_[current_page_].from_pos[slot_pos - 30] = INVALID_POSTYPE_VALUE; ChangeGroupPageLogic(); } else { // Active ½½·ÔÀÌ´Ù. RequestPerkOperaion(PerkControl::eReq_Unregister, slot_pos, 0); } } else { if (is_link_slot == true) { RequestPerkOperaion(PerkControl::eReq_Unregister, slot_pos, 0); } } #else RequestPerkOperaion(PerkControl::eReq_Unregister, slot_pos, 0); #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } } #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM void uiPerkDialog::OnClickAGroupButton( DWORD control_position, DWORD control_id ) { // Tab CCtrlButtonCheckWZ* button = NULL; WzID control_id_temp = GetControlID_byPosition(kControl_CheckBT_C003); button = static_cast(GetControlWZ(control_id_temp)); if (button) { button->SetCheckState(true); } control_id_temp = GetControlID_byPosition(kControl_CheckBT_C004); button = static_cast(GetControlWZ(control_id_temp)); if (button) { button->SetCheckState(false); } ChangeGroupPageLogic(); } void uiPerkDialog::OnClickBGroupButton( DWORD control_position, DWORD control_id ) { // Tab CCtrlButtonCheckWZ* button = NULL; WzID control_id_temp = GetControlID_byPosition(kControl_CheckBT_C004); button = static_cast(GetControlWZ(control_id_temp)); if (button) { button->SetCheckState(true); } control_id_temp = GetControlID_byPosition(kControl_CheckBT_C003); button = static_cast(GetControlWZ(control_id_temp)); if (button) { button->SetCheckState(false); } ChangeGroupPageLogic(); } #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM #ifndef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL bool uiPerkDialog::OnUpScroll(SI_MESSAGE* message) { bool result = true; WzID scroll_control_id = GetControlID_byPosition(kControl_Scroll_V000); CCtrlVScrollWZ* scroll_control = static_cast(GetControlWZ(scroll_control_id)); if (scroll_control != NULL) { int current_scroll_pos = scroll_control->GetScrollPosWZ(); --current_scroll_pos; current_scroll_pos = max(0, current_scroll_pos); scroll_control->SetScrollPosWZ(current_scroll_pos); text_render_[kFTextRenderOption1].SetBeginLineIndex(current_scroll_pos); text_render_[kFTextRenderOption2].SetBeginLineIndex(current_scroll_pos); } return result; } bool uiPerkDialog::OnDownScroll(SI_MESSAGE* message) { bool result = true; WzID scroll_control_id = GetControlID_byPosition(kControl_Scroll_V000); CCtrlVScrollWZ* scroll_control = static_cast(GetControlWZ(scroll_control_id)); if (scroll_control != NULL) { int current_scroll_pos = scroll_control->GetScrollPosWZ(); ++current_scroll_pos; current_scroll_pos = min(kMaxOptionLine, current_scroll_pos); scroll_control->SetScrollPosWZ(current_scroll_pos); text_render_[kFTextRenderOption1].SetBeginLineIndex(current_scroll_pos); text_render_[kFTextRenderOption2].SetBeginLineIndex(current_scroll_pos); } return result; } bool uiPerkDialog::OnThumbScroll(SI_MESSAGE* message) { bool result = true; WzID scroll_control_id = GetControlID_byPosition(kControl_Scroll_V000); CCtrlVScrollWZ* scroll_control = static_cast(GetControlWZ(scroll_control_id)); if (scroll_control != NULL) { int current_scroll_pos = scroll_control->GetScrollPosWZ(); current_scroll_pos = max(0, current_scroll_pos); current_scroll_pos = min(kMaxOptionLine, current_scroll_pos); text_render_[kFTextRenderOption1].SetBeginLineIndex(current_scroll_pos); text_render_[kFTextRenderOption2].SetBeginLineIndex(current_scroll_pos); } return result; } #endif void uiPerkDialog::RefreshTab() { CCtrlButtonCheckWZ* check_button = NULL; for (int position = kControl_CheckBT_C005; position < (kControl_CheckBT_C000 + 1); ++position) { check_button = static_cast(GetControlWZ(GetControlID_byPosition(position))); check_button->SetCheckState((position == kControl_CheckBT_C006) ? (true) : (false)); } } void uiPerkDialog::NetworkProc(MSG_BASE* recv_msg) { switch (recv_msg->m_byCategory) { case CG_CHARINFO: switch (recv_msg->m_byProtocol) { case CG_CHARINFO_SKILL_PERK_CMD: { MSG_CG_CHARINFO_SKILL_PERK_CMD* recv_packet = static_cast(recv_msg); RECV_CG_CHARINFO_SKILL_PERK_CMD(recv_packet); } break; } break; case CG_SKILL: switch (recv_msg->m_byProtocol) { case CG_SKILL_PERK_CONTROL_CMD: { MSG_CG_SKILL_PERK_CONTROL_CMD* recv_packet = static_cast(recv_msg); RECV_CG_SKILL_PERK_CONTROL_CMD(recv_packet); } break; case CG_SKILL_PERK_STATUS_CMD: { MSG_CG_SKILL_PERK_STATUS_CMD* recv_packet = static_cast(recv_msg); RECV_CG_SKILL_PERK_STATUS_CMD(recv_packet); } break; #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM case CG_SKILL_PERK_GROUP_CONTROL_CMD: { MSG_CG_SKILL_PERK_GROUP_CONTROL_CMD* recv_packet = static_cast(recv_msg); RECV_CG_SKILL_PERK_GROUP_CONTROL_CMD(recv_packet); is_wait_packet_ = false; } break; #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM } break; } } void uiPerkDialog::RECV_CG_CHARINFO_SKILL_PERK_CMD(MSG_CG_CHARINFO_SKILL_PERK_CMD* recv_packet) { // ÄÁÅ×À̳ʿ¡ ¼¼ÆÃ ClearAll(); StorePerk(recv_packet->container_, 0); is_store_perk_data_ = true; } void uiPerkDialog::RECV_CG_SKILL_PERK_CONTROL_CMD(MSG_CG_SKILL_PERK_CONTROL_CMD* recv_packet) { bool result = ProcessReplyMessage(recv_packet->header, recv_packet->data); if (result == true) { PerkControl* control_header = &(recv_packet->header); POSTYPE item_pos = INVALID_POSTYPE_VALUE; bool is_play_sound = false; switch (recv_packet->header.request) { case PerkControl::eReq_Unregister: { is_play_sound = true; } break; case PerkControl::eReq_Plants: { item_pos = control_header->args.plants.from_item_pos; ItemManager::Instance()->UseInventoryItem(SI_INVENTORY, item_pos); is_play_sound = true; } break; case PerkControl::eReq_Uproot: { InventoryDialog* inventory = GET_CAST_DIALOG(InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG); if (inventory) { item_pos = control_header->args.uproot.to_item_pos; recv_packet->data.uproot.maked_item; SCItemSlot item_slot(recv_packet->data.uproot.maked_item); inventory->InsertSlot(item_pos, item_slot); } } break; } if (is_play_sound == true) { SCPerkSlot temp_perk_slot; ItemManager::Instance()->PlaySlotSound(eSLOT_SOUND_TYPE_PUT, &temp_perk_slot); } RefreshBottomMessage(); RefreshOptionList(); } else { ProcessResultCode(recv_packet->header.result, recv_packet->header.result_code); } uiCharacterStatusMan::RefreshSimulationPlayerAttributes(); } void uiPerkDialog::SEND_CG_SKILL_PERK_CONTROL_SYN(MSG_CG_SKILL_PERK_CONTROL_SYN* send_packet) { GlobalFunc::SendPacket(CI_GAMESERVERIDX, send_packet, sizeof(*send_packet)); } void uiPerkDialog::RECV_CG_SKILL_PERK_STATUS_CMD(MSG_CG_SKILL_PERK_STATUS_CMD* recv_packet) { bool result = ProcessEventMessage(recv_packet->header, recv_packet->data); if (result == true) { RefreshOptionList(); } else { ProcessResultCode(recv_packet->header.result, recv_packet->header.result_code); } } void uiPerkDialog::RequestPerkOperaion(PerkControl::eRequest request_operation, POSTYPE from_pos, POSTYPE to_pos) { if (IsRequestTransaction() == true) { return; } if (IsEnableSetting() == false) { TCHAR message[INTERFACE_STRING_LENGTH] = {0, }; // 5536 ÆÜÀº ¾ÈÀüÁö´ë¿Í ¸¶À»¿¡¼­¸¸ º¯°æ °¡´ÉÇÕ´Ï´Ù. g_InterfaceManager.GetInterfaceString(5536, message); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, message); return; } MSG_CG_SKILL_PERK_CONTROL_SYN request_packet; bool result_value = false; switch (request_operation) { case PerkControl::eReq_Register: result_value = RequestRegister(&request_packet.header, from_pos, to_pos); break; case PerkControl::eReq_Unregister: result_value = RequestUnregister(&request_packet.header, from_pos); break; case PerkControl::eReq_Plants: result_value = RequestPlants(&request_packet.header, from_pos); break; case PerkControl::eReq_Uproot: result_value = RequestUproot(&request_packet.header, from_pos, to_pos); break; } if (result_value == true) { SEND_CG_SKILL_PERK_CONTROL_SYN(&request_packet); } else { ProcessResultCode(request_packet.header.result, request_packet.header.result_code); } } void uiPerkDialog::ProcessResultCode(DWORD result, DWORD result_code) { switch (result) { case PerkControl::eRet_SkillFailed: { BattleScene::ShowErrorCodeSkill(result_code); } break; case PerkControl::eRet_ItemFailed: { ItemManager::Instance()->NoticeReasonItemErrorCode(result_code); } break; default: { #ifdef _DEV_VER TCHAR debug_message[INTERFACE_STRING_LENGTH] = {0, }; Snprintf(debug_message, INTERFACE_STRING_LENGTH - 1, "PerkControl Result[%d] ResultCode[%d]" , result, result_code); #endif //_DEV_VER } } } void uiPerkDialog::RollbackPerkItemAtHand() { MouseHandler::MouseItem* mouse_item = MouseHandler::Instance()->GetMouseItem(); if (mouse_item->m_fromSlotIdx == SI_PERK) { MouseHandler::Instance()->RollbackItemAtHand(); } } bool uiPerkDialog::CheckRegisterActivePerk() { for (int index = 0; index < kNumberOfActiveSlots; ++index) { SCPerkSlot& active_slot = static_cast(GetSlot(PerkDataList::kActiveSlotPositions[index])); if (active_slot.GetLinkSlot() != NULL) { return true; } } return false; } void uiPerkDialog::RefreshOptionText() { RefreshTopMessage(); RefreshBottomMessage(); RefreshOptionList(); } void uiPerkDialog::RefreshTopMessage() { WzID rect_control_id = GetControlID_byPosition(kControl_Rect_R000); CCtrlRectangleWZ* rect_control = static_cast(GetControlWZ(rect_control_id)); if (rect_control == NULL) { return; } TCHAR message[INTERFACE_STRING_LENGTH] = {0, }; FTextRender& text_render = text_render_[kFTextRenderTop]; FTextParser parser; FTextSentence sentence; RECT rect = rect_control->GetSizeRect(); text_render.Init(GetDrawBase(), rect); text_render.SetVCenterAlign(true); text_render.SetHCenterAlign(true); text_render.ClearSentence(); if (IsEnableSetting() == true) { // 5535 ÀÚ½ÅÀÇ ¼ºÇâ°ú »óȲ¿¡ ¸Â´Â ¹öÇÁ¸¦ Á÷Á¢ Á¶ÇÕÇÏ¿© »ç¿ëÇÕ´Ï´Ù. g_InterfaceManager.GetInterfaceString(5535, message); } else { // 5536 ÆÜÀº ¾ÈÀüÁö´ë¿Í ¸¶À»¿¡¼­¸¸ º¯°æ °¡´ÉÇÕ´Ï´Ù. g_InterfaceManager.GetInterfaceString(5536, message); } parser.SetDefaultFont(message_font_id, WzColor_RGBA(247, 251, 190, 255)); BOOL result = parser.Parser(message, sentence); if (result) { text_render.Append(sentence); text_render.convertLineInfo(); } } void uiPerkDialog::RefreshBottomMessage() { WzID rect_control_id = GetControlID_byPosition(kControl_Rect_R002); CCtrlRectangleWZ* rect_control = static_cast(GetControlWZ(rect_control_id)); if (rect_control == NULL) { return; } TCHAR message[INTERFACE_STRING_LENGTH] = {0, }; FTextRender& text_render = text_render_[kFTextRenderBottom]; FTextParser parser; FTextSentence sentence; RECT rect = rect_control->GetSizeRect(); text_render.Init(GetDrawBase(), rect); text_render.SetVCenterAlign(true); text_render.SetHCenterAlign(true); text_render.ClearSentence(); // ¾×Ƽºêµî·ÏÇß´ÂÁö üũ bool is_register_active_perk = CheckRegisterActivePerk(); // ¾×Ƽºê½½·Ô¿¡ Çϳªµµ µî·ÏµÇ¾î ÀÖÁö ¾Ê´Ù¸é ¾È³»¸Þ½ÃÁö Ãâ·Â if (is_register_active_perk == false) { // 5537 Ãâ·Â g_InterfaceManager.GetInterfaceString(5537, message); parser.SetDefaultFont(message_font_id, WzColor_RGBA(188, 240, 120, 255)); BOOL result = parser.Parser(message, sentence); if (result) { text_render.Append(sentence); text_render.convertLineInfo(); } } } void uiPerkDialog::RefreshOptionList() { // Á¤±ÔÈ­ ÅØ½ºÆ® ¼¼ÆÃ const int kOptionTabCount = kFTextRenderMax - kFTextRenderOption1; const int kOptionTab1 = 0; const int kOptionTab2 = 1; WzID rect_control_id[kOptionTabCount] = {GetControlID_byPosition(kControl_Rect_R004), GetControlID_byPosition(kControl_Rect_R005)}; CCtrlRectangleWZ* rect_control[kOptionTabCount]; for (int index = 0; index < kOptionTabCount; ++index) { rect_control[index] = static_cast(GetControlWZ(rect_control_id[index])); if (rect_control[index] == NULL) { return; } } TCHAR message[INTERFACE_STRING_LENGTH] = {0, }; FTextRender* text_render[kOptionTabCount] = {&text_render_[kFTextRenderOption1], &text_render_[kFTextRenderOption2]}; TCHAR* empty_token = " "; FTextParser parser; FTextSentence sentence; FTextSentence empty_sentence; parser.Parser(empty_token, empty_sentence); RECT rect; for (int index = 0; index < kOptionTabCount; ++index) { rect = rect_control[index]->GetSizeRect(); text_render[index]->Init(GetDrawBase(), rect); text_render[index]->SetVCenterAlign(false); text_render[index]->SetHCenterAlign(false); text_render[index]->ClearSentence(); } #ifndef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL CCtrlVScrollWZ* scroll_control = static_cast(GetControlWZ(GetControlID_byPosition(kControl_Scroll_V000))); CControlWZ* scroll_picture_control = GetControlWZ(GetControlID_byPosition(kControl_Picture_P000)); if (scroll_control != NULL) { scroll_control->ShowWindowWZ(WZ_HIDE); } if (scroll_picture_control != NULL) { scroll_picture_control->ShowWindowWZ(WZ_HIDE); } #endif // ¾×Ƽºêµî·ÏÇß´ÂÁö üũ bool is_register_active_perk = CheckRegisterActivePerk(); // ¾×Ƽºê½½·ÔÀÌ Çϳª¶óµµ µî·ÏµÇ¾î ÀÖÀ¸¸é ¿É¼Ç Ãâ·Â if (is_register_active_perk == false) { return; } // ÆÜ ¼¼ÆÃ¿¡ ´ëÇÑ ¿É¼Ç °è»ê CalculateOptionList(); TCHAR temp_message[INTERFACE_STRING_LENGTH] = {0, }; TCHAR* option_value_string = {"%s : %+d"}; TCHAR* option_ratio_string = {"%s : %+d%%"}; BASE_OptionList* option_list = NULL; DWORD option_type = eATTR_TYPE_INVALID; DWORD option_value_type = 0; int option_value = 0; int option_count = 0; const int kMaxOptionMap = 2; CALCULATED_OPTION_VALUE_MAP* option_map_ptr[kMaxOptionMap] = { &benefit_option_map_, &penalty_option_map_}; CALCULATED_OPTION_VALUE_MAP::iterator option_list_itr; CALCULATED_OPTION_VALUE_MAP::iterator end_option_list_itr; for (int map_index = 0; map_index < kMaxOptionMap; ++map_index) { DWORD text_color; if (map_index < 1) { text_color = WzColor_RGBA(188, 240, 120, 255); } else { text_color = WzColor_RGBA(244, 120, 82, 255); } option_list_itr = option_map_ptr[map_index]->begin(); end_option_list_itr = option_map_ptr[map_index]->end(); for ( ; option_list_itr != end_option_list_itr; ++option_list_itr) { option_type = option_list_itr->first; option_list = OptionListParser::Instance()->GetOptionList(option_type); if (option_list == NULL) { continue; } option_value = option_list_itr->second.option_value; g_InterfaceManager.GetInterfaceString(option_list->mdwNameCode, temp_message, INTERFACE_STRING_LENGTH); #ifdef _NA_008823_20160517_ADD_ITEMOPTION_VALUETYPE_MILLISECOND Snprintf(message, INTERFACE_STRING_LENGTH, _T("%s : %+d"), temp_message, GlobalFunc::OptionValueQuantification(option_list, option_value)); #else Snprintf(message, INTERFACE_STRING_LENGTH, _T("%s : %+d"), temp_message, option_value); #endif //_NA_008823_20160517_ADD_ITEMOPTION_VALUETYPE_MILLISECOND GlobalFunc::AddOptionSuffix( option_list_itr->second.option_type, option_list, message); parser.SetDefaultFont(option_font_id, text_color); BOOL result = parser.Parser(message, sentence); if (result) { text_render[(option_count % kOptionTabCount)]->Append(sentence); ++option_count; } } } for (int rect_index = 0; rect_index < kOptionTabCount; ++rect_index) { text_render[rect_index]->convertLineInfo(); text_render[rect_index]->SetBeginLineIndex(0); } #ifndef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL if ((scroll_control != NULL) && (scroll_picture_control != NULL)) { int max_scroll = max(text_render_[kFTextRenderOption1].GetMaxLine(), text_render_[kFTextRenderOption2].GetMaxLine()); if (max_scroll > kMaxOptionLine) { scroll_control->ShowWindowWZ(WZ_SHOW); scroll_picture_control->ShowWindowWZ(WZ_SHOW); max_scroll -= kMaxOptionLine; scroll_control->SetScrollRangeWZ(0, max_scroll); scroll_control->SetScrollPosWZ(0); scroll_control->SetChangeSizeThumb(30); } else { max_scroll = 0; } } #endif } void uiPerkDialog::CalculateOptionList() { // ÄÁÅ×ÀÌ³Ê »ý¼º // ÇÊ¿äÄÁÅ×ÀÌ³Ê :PerkInfo ¹× Áߺ¹°³¼ö :Option+Type º° Value(Typeº°·Î 2°³ÇÊ¿ä) // 2011. 05. 30 ±âȹÆÀ ±èÁØÈ£¾¾¿Í ÇùÀÇÇÑ ³»¿ëÀ¸·Î Áõ°¡Ä¡ ¸ÕÀú º¸¿©ÁÖ°í °¨¼ÒÄ¡¸¦ º¸¿©ÁÖµÇ, //Áõ°¡Ä¡ ³¢¸®ÀÇ ¼ø¼­´Â Áß¿äÄ¡ ¾Ê¾Æ value, ratio t±¸ºÐÀº ÇÏÁö ¾ÊÀ½ CALCULATED_OPTION_VALUE_MAP option_map; benefit_option_map_.clear(); penalty_option_map_.clear(); PERK_INFO_DUPICATE_MAP register_active_perk_info; const PerkInfo* perk_info = NULL; int duplicate_value = 0; PERK_INFO_DUPICATE_MAP::iterator found_perk_info_itr; #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM for (int index = 0; index < kNumberOfActiveSlots; ++index) { bool is_default_slot = false; if ( index < kNumberOfActiveSlots - 1 && my_perk_data_[current_page_].from_pos[index] == INVALID_POSTYPE_VALUE ) { continue; } SCPerkSlot& active_slot = index < kNumberOfActiveSlots - 1 ? static_cast(GetSlot(my_perk_data_[current_page_].from_pos[index])) : static_cast(GetSlot(PerkDataList::kActiveSlotPositions[index])); if (index >= kNumberOfActiveSlots - 1 && active_slot.GetLinkSlot() != NULL) { perk_info = active_slot.GetLinkSlot()->perk_info(); if (perk_info == NULL) { continue; } found_perk_info_itr = register_active_perk_info.find(perk_info); if (found_perk_info_itr != register_active_perk_info.end()) { duplicate_value = found_perk_info_itr->second; ++duplicate_value; found_perk_info_itr->second = duplicate_value; } else { register_active_perk_info.insert(std::make_pair(perk_info, 1)); } } else { perk_info = active_slot.perk_info(); if (perk_info == NULL) { continue; } found_perk_info_itr = register_active_perk_info.find(perk_info); if (found_perk_info_itr != register_active_perk_info.end()) { duplicate_value = found_perk_info_itr->second; ++duplicate_value; found_perk_info_itr->second = duplicate_value; } else { register_active_perk_info.insert(std::make_pair(perk_info, 1)); } } } #else for (int index = 0; index < kNumberOfActiveSlots; ++index) { SCPerkSlot& active_slot = static_cast(GetSlot(PerkDataList::kActiveSlotPositions[index])); if (active_slot.GetLinkSlot() != NULL) { perk_info = active_slot.GetLinkSlot()->perk_info(); if (perk_info == NULL) { continue; } found_perk_info_itr = register_active_perk_info.find(perk_info); if (found_perk_info_itr != register_active_perk_info.end()) { duplicate_value = found_perk_info_itr->second; ++duplicate_value; found_perk_info_itr->second = duplicate_value; } else { register_active_perk_info.insert(std::make_pair(perk_info, 1)); } } } #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM BASE_OptionList* option_list = NULL; BYTE ontion_value_type = 0; DWORD ontion_value = 0; DWORD ontion_type = eATTR_TYPE_INVALID; PERK_INFO_DUPICATE_MAP::iterator end_perk_info_itr = register_active_perk_info.end(); found_perk_info_itr = register_active_perk_info.begin(); for ( ; found_perk_info_itr != end_perk_info_itr; ++found_perk_info_itr) { // ¿É¼Ç Á¤º¸ ÃëÇÕ perk_info = found_perk_info_itr->first; if (perk_info == NULL) { continue; } const PerkInfo::OptionNode* perk_optin_node = &(perk_info->benefit_option_[0]); for (int index = 0; index < PerkInfo::kNumberOfBenefitOptions; ++index) { ontion_type = perk_optin_node[index].item_option_; option_list = OptionListParser::Instance()->GetOptionList(ontion_type); if (option_list == NULL) { continue; } ontion_value_type = perk_optin_node[index].value_type_;//¼öġŸÀÔ ontion_value = perk_optin_node[index].value_;//°ª ontion_value *= found_perk_info_itr->second; CALCULATED_OPTION_VALUE_MAP* temp_option_container = NULL; temp_option_container = &option_map; CALCULATED_OPTION_VALUE_MAP::iterator found_option = temp_option_container->find(ontion_type); if (found_option != temp_option_container->end()) { ontion_value += found_option->second.option_value; found_option->second.option_value = ontion_value; } else { OPTION_VALUE_AND_TYPE value_and_option; value_and_option.option_value = ontion_value; value_and_option.option_type = ontion_value_type; temp_option_container->insert(std::make_pair(ontion_type, value_and_option)); } } switch (found_perk_info_itr->second) { case 2: perk_optin_node = &(perk_info->penalty_2x_option_[0]); break; case 3: perk_optin_node = &(perk_info->penalty_3x_option_[0]); break; case 4: perk_optin_node = &(perk_info->penalty_4x_option_[0]); break; default: continue; } for (index = 0; index < PerkInfo::kNumberOfPenaltyOptions; ++index) { ontion_type = perk_optin_node[index].item_option_; option_list = OptionListParser::Instance()->GetOptionList(ontion_type); if (option_list == NULL) { continue; } ontion_value_type = perk_optin_node[index].value_type_;//¼öġŸÀÔ ontion_value = perk_optin_node[index].value_;//°ª CALCULATED_OPTION_VALUE_MAP* temp_option_container = NULL; temp_option_container = &option_map; CALCULATED_OPTION_VALUE_MAP::iterator found_option = temp_option_container->find(ontion_type); if (found_option != temp_option_container->end()) { ontion_value += found_option->second.option_value; found_option->second.option_value = ontion_value; } else { OPTION_VALUE_AND_TYPE value_and_option; value_and_option.option_value = ontion_value; value_and_option.option_type = ontion_value_type; temp_option_container->insert(std::make_pair(ontion_type, value_and_option)); } } } // ( + / - ) ¿É¼Ç ºÐ¸® BASE_OptionList* optin_list_info; std::pair option_pair; CALCULATED_OPTION_VALUE_MAP::iterator end_option_map_itr = option_map.end(); CALCULATED_OPTION_VALUE_MAP::iterator option_map_itr = option_map.begin(); for ( ; option_map_itr != end_option_map_itr; ++option_map_itr) { if (option_map_itr->second.option_value == 0) { continue; } option_pair = std::make_pair(option_map_itr->first, option_map_itr->second); optin_list_info = OptionListParser::Instance()->GetOptionList(option_map_itr->first); if ((optin_list_info != NULL) && (optin_list_info->valuetype2 == OptionListParser::eOPTION_VALUE_TYPE_TWO_REVERSE_BENEFIT)) //À½¼ö°¡ À̵æÀÎ ¿É¼Ç { if (option_map_itr->second.option_value < 0) { benefit_option_map_.insert(option_pair); } else { penalty_option_map_.insert(option_pair); } } else { if (option_map_itr->second.option_value > 0) { benefit_option_map_.insert(option_pair); } else { penalty_option_map_.insert(option_pair); } } } } void uiPerkDialog::OnChangeAttributes() { if (g_pHero != NULL) { PlayerAttributes* attributes = g_pHero->GetPlayerAttribute(); if (attributes != NULL) { attributes->Update(); } } } void uiPerkDialog::OnChangeSlotContainer() { } void uiPerkDialog::OnLevelup() { if (g_pHero == NULL) { return; } WzVector effect_pos = g_pHero->GetSkillEffectPos(eSKILLEFFECT_POS_FOOT); GlobalFunc::CreateEffectBeUpToOption(StrToWzID("I535"), effect_pos, g_pHero->GetObjectKey()); } Attributes* uiPerkDialog::GetOwnerAttributes() { if (g_pHero != NULL) { return (Attributes*)(g_pHero->GetPlayerAttribute()); } return NULL; } bool uiPerkDialog::IsEnableSetting() { // program.ini - ENABLE_PERK_SETTING_FREE À» ÅëÇÏ¿© ¸¶À»¿Ü¿¡¼­µµ ÆÜ±³Ã¼°¡ °¡´ÉÇϵµ·Ï ¼¼ÆÃ if (PROGRAMPARAM->IsEnablePerkSetting() == true) { return true; } if (g_pMap == NULL) { return false; } if ((GameFramework::GetCurScene() == SCENE_TYPE_VILLAGE) || (g_pMap->IsTutorialField() == TRUE) || (IsSwitchablePerkState() == true) ) { return true; } if (g_pHero != NULL) { DWORD tile_attribute = g_pHero->GetCurrentTileAtt(FALSE); if (BIT_CHECK(tile_attribute, PTA_SAFETY_ZONE) == true) { return true; } } return false; } bool uiPerkDialog::IsSwitchablePerkState() { return g_pHero->FindSkillEffect( eCHAR_STATE_PERK_SWITCHABLE_STATE ) != NULL; } #ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM void uiPerkDialog::Refresh_PerkSlock_My_Data() { current_active_perk_my_data_.Clear(); bool is_differ = false; // Active SlotÀ» ã¾Æ LinkµÇ¾î ÀÖ´Â Perk½½·ÔÀ» my_perk_data¿¡ ÀúÀå ÇÑ´Ù. const bool kFindOption = true; // active slots for (int i = kActiveSlotPos0; i < kActiveSlotPosMax; ++i) { POSTYPE slot_pos = i; RC::eITEM_RESULT result = RC::RC_ITEM_SUCCESS; const SCPerkSlot* active_perk_slot = \ this->GetActivePartSlot(&result, slot_pos, kFindOption); // ÇöÀç ¾×Æ¼ºê ½½·Ô¿¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. if (!active_perk_slot) { my_perk_data_[active_group_number_].from_pos[i - kActiveSlotPos0] = INVALID_POSTYPE_VALUE; continue; } const SCPerkSlot* link_slot = active_perk_slot->GetLinkSlot(); if ( link_slot ) { if (my_perk_data_[active_group_number_].from_pos[i - kActiveSlotPos0] != link_slot->GetPos()) { is_differ = true; my_perk_data_[active_group_number_].from_pos[i - kActiveSlotPos0] = link_slot->GetPos(); } } } if ( is_differ ) { ChangeGroupPerkLogic(); } } void uiPerkDialog::SEND_CG_SKILL_PERK_GROUP_CONTROL_SYN( MSG_CG_SKILL_PERK_GROUP_CONTROL_SYN* send_packet ) { GlobalFunc::SendPacket(CI_GAMESERVERIDX, send_packet, sizeof(*send_packet)); is_wait_packet_ = true; } void uiPerkDialog::RECV_CG_SKILL_PERK_GROUP_CONTROL_CMD( MSG_CG_SKILL_PERK_GROUP_CONTROL_CMD* recv_packet ) { if (recv_packet->isCanProcessState == false) { ProcessResultCode(PerkControl::eRet_ItemFailed, RC_ITEM_INVALIDSTATE); return; } switch (active_group_number_) { case eStylePageA: { active_group_number_ = eStylePageB; } break; case eStylePageB: { active_group_number_ = eStylePageA; } break; default: { } } for (int i = 0; i < 4; ++i) { bool result = ProcessReplyMessage(recv_packet->header[i], recv_packet->data[i]); if (result == true) { PerkControl* control_header = &(recv_packet->header[i]); POSTYPE item_pos = INVALID_POSTYPE_VALUE; bool is_play_sound = false; switch (recv_packet->header[i].request) { case PerkControl::eReq_Unregister: { is_play_sound = true; } break; case PerkControl::eReq_Plants: { item_pos = control_header->args.plants.from_item_pos; ItemManager::Instance()->UseInventoryItem(SI_INVENTORY, item_pos); is_play_sound = true; } break; case PerkControl::eReq_Uproot: { InventoryDialog* inventory = GET_CAST_DIALOG(InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG); if (inventory) { item_pos = control_header->args.uproot.to_item_pos; recv_packet->data[i].uproot.maked_item; SCItemSlot item_slot(recv_packet->data[i].uproot.maked_item); inventory->InsertSlot(item_pos, item_slot); } } break; } RefreshBottomMessage(); RefreshOptionList(); } uiCharacterStatusMan::RefreshSimulationPlayerAttributes(); } SCPerkSlot temp_perk_slot; ItemManager::Instance()->PlaySlotSound(eSLOT_SOUND_TYPE_UNEQUIP, &temp_perk_slot); int current_active_group_number = get_active_group_number_(); hero_gauge_style_setting(current_active_group_number); ChangeGroupPageLogic(); } void uiPerkDialog::SEND_CG_ETC_GAMEOPTION_LOAD_SYN_PERK_LIST( MSG_CG_ETC_GAMEOPTION_LOAD_SYN* send_packet ) { send_packet->option_type_ = GameOption::kPerkListChar; GlobalFunc::SendPacket(CI_GAMESERVERIDX, send_packet, sizeof(*send_packet)); is_wait_packet_ = false; } void uiPerkDialog::SavePerkGroupListData() { bool is_differ = false; // óÀ½À¸·Î ¼­¹ö¿¡¼­ ¹ÞÀº Á¤º¸¿Í Áö±Ý Á¤º¸¿Í ´Ù¸¥Áö ºñ±³ for (int i = 0; i < 2; ++i) { for (int j = 0; j < 4; ++j) { if (my_prototype_perk_data_[i].from_pos[j] != my_perk_data_[i].from_pos[j]) { is_differ = true; my_prototype_perk_data_[i].from_pos[j] = my_perk_data_[i].from_pos[j]; } } } if ( active_group_number_prototype_ != active_group_number_ ) { is_differ = true; } if ( false == is_differ ) { return; } // ½ºÆ®¸²À¸·Î º¯°æ MSG_CG_ETC_GAMEOPTION_SAVE_SYN send_packet; send_packet.game_option_.option_type_ = GameOption::kPerkListChar; if (MakeToStream(send_packet.game_option_) == true) { GlobalFunc::SendPacket(CI_GAMESERVERIDX, &send_packet, sizeof(send_packet)); } } bool uiPerkDialog::MakeToStream( GameOption& game_option ) { WORD* stream = reinterpret_cast(&game_option.binary_data_[0]); uint offset = 0; bool is_success = false; // ÇöÀç active_group_number ÀúÀå memcpy(&game_option.binary_data_[offset], &active_group_number_, sizeof(active_group_number_)); offset += sizeof(active_group_number_); active_group_number_prototype_ = active_group_number_; vector::iterator found_itr = my_perk_data_.begin(); vector::iterator end_itr = my_perk_data_.end(); for (int i = 0; i < kPerkGroupMax; ++i) { memcpy(&game_option.binary_data_[offset], &(my_perk_data_[i]), sizeof(PerkGroupStruct)); offset += sizeof(PerkGroupStruct); my_prototype_perk_data_[i] = my_perk_data_[i]; } is_success = true; game_option.binary_data_size_ = offset; return is_success; } void uiPerkDialog::RecvPerkGroupList( GameOption& game_option ) { if (game_option.option_type_ == GameOption::kPerkListChar) { if (MakeToPerkGroupList(game_option)) { // ¼º°ø is_prototype_receive = TRUE; ChangeGroupPageLogic(); } } } bool uiPerkDialog::MakeToPerkGroupList( GameOption& game_option ) { bool is_success = false; if (game_option.binary_data_size_ < sizeof(WORD)) { // ¾÷µ¥ÀÌÆ® ÀÌÈÄ Ã³À½À¸·Î ¹Þ¾Ò´Ù. // ¸ðµÎ INVALID_POTYPE_VALUE ³Ö¾î ÁØ´Ù. PerkGroupStruct temp; current_page_ = active_group_number_prototype_ = active_group_number_ = eStylePageA; for ( int i = 0; i < 4; ++i) { if (my_perk_data_[active_group_number_].from_pos[i] >= 0 && my_perk_data_[active_group_number_].from_pos[i] <= 14) { my_prototype_perk_data_[eStylePageA].from_pos[i] = my_perk_data_[eStylePageA].from_pos[i]; } else { my_prototype_perk_data_[eStylePageA].from_pos[i] = my_perk_data_[eStylePageA].from_pos[i] = INVALID_POSTYPE_VALUE; } } my_prototype_perk_data_[eStylePageB] = my_perk_data_[eStylePageB] = temp; // óÀ½À̱⠶§¹®¿¡ ¿©±â¼­ AStyle·Î ÀÏ´Ü ÇØÁØ´Ù. hero_gauge_style_setting(active_group_number_); is_success = true; return is_success; } WORD* stream = reinterpret_cast(&game_option.binary_data_[0]); uint offset = 0; memcpy(&active_group_number_prototype_, (game_option.binary_data_ + offset), sizeof(active_group_number_prototype_)); offset += sizeof(active_group_number_prototype_); if (active_group_number_prototype_ > eStylePageB) active_group_number_prototype_ = eStylePageA; current_page_ = active_group_number_; PerkGroupStruct temp; for (int i = 0; i < kPerkGroupMax; ++i) { memcpy(&temp, (game_option.binary_data_ + offset), sizeof(PerkGroupStruct)); offset += sizeof(PerkGroupStruct); for (int j = 0; j < 4; ++j) { if (!(temp.from_pos[j] >= 0 && temp.from_pos[j] <= 14)) { // µ¥ÀÌÅͰ¡ Àß ¸ø µÇ¾úÀ» ¶§ temp.from_pos[j] = INVALID_POSTYPE_VALUE; } } // ¼­¹ö¿¡¼­ óÀ½¹ÞÀº µ¥ÀÌÅÍ ¼ÂÆÃ my_prototype_perk_data_[i] = temp; } // A½ºÅ¸ÀÏÀÎÁö B½ºÅ¸ÀÏÀÎÁö üũ // MakeToPerkGroupListÇÔ¼ö ÀÌÀü¿¡ UpdateSlot¿¡¼­ my_perk_data_°¡ ¸ÕÀú ¹Þ¾ÆÁ® ÀÖ´Ù. if (my_prototype_perk_data_[eStylePageA] == my_perk_data_[active_group_number_]) { active_group_number_ = active_group_number_prototype_ = eStylePageA; } else if (my_prototype_perk_data_[eStylePageB] == my_perk_data_[active_group_number_]) { active_group_number_ = active_group_number_prototype_ = eStylePageB; } active_group_number_prototype_ = active_group_number_; my_perk_data_[eStylePageA] = my_prototype_perk_data_[eStylePageA]; my_perk_data_[eStylePageB] = my_prototype_perk_data_[eStylePageB]; hero_gauge_style_setting(active_group_number_); is_success = true; return is_success; } void uiPerkDialog::ChangeGroupPerkLogic() { // ¹Ì¸® ÀúÀåÇØ µÎ¾ú´Ù°¡ ÀÚ¸®¸¦ ¹Ù²ãÁØ´Ù. current_active_perk_my_data_.Clear(); int reserve_active_group_number = 0; switch (active_group_number_) { case eStylePageA: { reserve_active_group_number = eStylePageB; } break; case eStylePageB: { reserve_active_group_number = eStylePageA; } break; default: { // ¿©±â¿¡ µé¾î¿À¸é ¾ÈµÈ´Ù. } } current_active_perk_my_data_ = my_perk_data_[reserve_active_group_number]; // ³ªÁß¿¡ OnClickLeftButton()°ú OnClickRightButton()ÇÔ¼ö ¾È¿¡ ÀÖ´Â ·ÎÁ÷Àº Çϳª·Î ¹­¾î¼­ ÇÔ¼ö¸¦ ¸¸µé °Í. int current_pos = 0; MSG_CG_SKILL_PERK_GROUP_CONTROL_SYN request_packet; bool result_value = false; for (int i = kActiveSlotPos0; i < kActiveSlotPosMax; ++i) { POSTYPE slot_pos = i; if ( current_active_perk_my_data_.from_pos[current_pos] != INVALID_POSTYPE_VALUE ) { result_value = RequestRegister(&request_packet.header[current_pos], current_active_perk_my_data_.from_pos[current_pos], slot_pos); } else { result_value = RequestUnregister(&request_packet.header[current_pos], slot_pos); } ++current_pos; } SEND_CG_SKILL_PERK_GROUP_CONTROL_SYN(&request_packet); } void uiPerkDialog::set_active_group_number( const int& active_group_number ) { active_group_number_ = active_group_number; } int uiPerkDialog::get_active_group_number_() { return active_group_number_; } void uiPerkDialog::ChangeGroupPageLogic() { // ¿©±â¿¡ µé¾î¿Ô´Ù´Â ¾ê±â´Â ¹«Á¶°Ç ÆäÀÌÁö°¡ ¹Ù²î¾ú´Ù´Â ¾ê±â´Ù. if (unit_renderer_ == NULL) { return; } // active_slotÀº 65001 ~ 65004±îÁöÀÇ perk_group¸¦ °¡Áø´Ù. for (int i = 0; i < 4; ++i) { if (my_perk_data_[current_page_].from_pos[i] != INVALID_POSTYPE_VALUE && (my_perk_data_[current_page_].from_pos[i] >= 0 && my_perk_data_[current_page_].from_pos[i] <= 14)) { SCPerkSlot& perk_slot = static_cast(GetSlot(my_perk_data_[current_page_].from_pos[i])); DWORD perk_group = perk_slot.GetPerkID().group_; // ÄÁÆ®·ÑÀ» ¾ò¾î¿Í¾ß ÇÑ´Ù. CControlWZ* button_control = GetButtonControlBySlotPos(i + 30); if (button_control != NULL) { RECT control_rect = button_control->GetSizeRect(); unit_renderer_->RemoveItemUnit(PerkDataList::eActiveGroup01 + i); if (perk_slot.GetPos() == INVALID_POSTYPE_VALUE) continue; unit_renderer_->AddItemUnit(PerkDataList::eActiveGroup01 + i, 0, &control_rect, static_cast(&perk_slot), button_control); } } else { unit_renderer_->RemoveItemUnit(PerkDataList::eActiveGroup01 + i); } } RefreshOptionText(); } void uiPerkDialog::hero_gauge_style_setting( const int& style ) { // ÀÌ°Ç ¹Ù²î´Â ·ÎÁ÷ HeroGaugeDialog2* hero_gauge = static_cast(g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_HEROGAUGE)); if (hero_gauge != NULL) { hero_gauge->set_perk_style_change(style); } } const PerkGroupStruct& uiPerkDialog::get_active_group_struct() { return my_perk_data_[active_group_number_]; } void uiPerkDialog::PerkGroupChange_On() { if (is_wait_packet_ == true) { return; } ChangeGroupPerkLogic(); } bool uiPerkDialog::get_is_wait_packet_() { return is_wait_packet_; } #endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM