Files
2022-10-26 12:25:11 +08:00

478 lines
13 KiB
C++

#include "SunClientPrecompiledHeader.h"
//------------------------------------------------------------------------------
// (C) 2010 Webzen Sunstudio
//------------------------------------------------------------------------------
#include "uiNewSkillAction.h"
#include "ItemUnitRenderer.h"
#include "SkillInventoryStoreParser.h"
#include "ItemManager.h"
#include "uiSkillMan/uiNewSkillMan.h"
#include "SlotKeyGenerator.h"
#include "SkillInfoParser.h"
#include "SkillSlot.h"
#include "Mouse.h"
#include "MouseHandler.h"
#include "uiToolTipMan/uiToolTipMan.h"
#include "GlobalFunc.h"
//------------------------------------------------------------------------------
WzID uiSkillAction::wzId_[kDlgMax] =
{
#ifdef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL
// 액션
StrToWzID("P056"),StrToWzID("P242"),StrToWzID("P243"), StrToWzID("P077"),StrToWzID("P262"),StrToWzID("P263"),
StrToWzID("P244"),StrToWzID("P245"),StrToWzID("P246"), StrToWzID("P264"),StrToWzID("P265"),StrToWzID("P266"),
StrToWzID("P247"),StrToWzID("P248"),StrToWzID("P249"), StrToWzID("P267"),StrToWzID("P268"),StrToWzID("P269"),
StrToWzID("P250"),StrToWzID("P251"),StrToWzID("P252"), StrToWzID("P270"),StrToWzID("P271"),StrToWzID("P272"),
StrToWzID("P253"),StrToWzID("P254"),StrToWzID("P255"), StrToWzID("P273"),StrToWzID("P274"),StrToWzID("P275"),
StrToWzID("P256"),StrToWzID("P257"),StrToWzID("P258"), StrToWzID("P276"),StrToWzID("P277"),StrToWzID("P278"),
StrToWzID("P259"),StrToWzID("P260"),StrToWzID("P261"), StrToWzID("P279"),StrToWzID("P280"),StrToWzID("P281"),
// 탭
StrToWzID("C000"), StrToWzID("C001"), StrToWzID("C002"),
// 텍스트
StrToWzID("S001"), StrToWzID("S002"),
// ESC
StrToWzID("B086")
#else
// 액션
StrToWzID("B010"), StrToWzID("B000"), StrToWzID("B001"),
StrToWzID("B004"), StrToWzID("B003"), StrToWzID("B002"),
StrToWzID("B005"), StrToWzID("B006"), StrToWzID("B007"),
StrToWzID("B008"), StrToWzID("B009"), StrToWzID("B011"),
StrToWzID("B018"), StrToWzID("B019"), StrToWzID("B020"),
StrToWzID("B021"), StrToWzID("B022"), StrToWzID("B023"),
StrToWzID("B012"), StrToWzID("B013"), StrToWzID("B014"),
StrToWzID("B015"), StrToWzID("B016"), StrToWzID("B017"),
StrToWzID("B031"), StrToWzID("B032"), StrToWzID("B033"),
StrToWzID("B034"), StrToWzID("B035"), StrToWzID("B036"),
StrToWzID("B024"), StrToWzID("B025"), StrToWzID("B026"),
StrToWzID("B027"), StrToWzID("B028"), StrToWzID("B030"),
// 탭
StrToWzID("C005"), StrToWzID("C006"), StrToWzID("C000"),
// ESC
StrToWzID("B999")
#endif
};
//------------------------------------------------------------------------------
/**
*/
uiSkillAction::uiSkillAction(InterfaceManager* ui_man):
uiBase(ui_man),
invalid_control_(false),
item_renderer_(NULL)
{
SkillSlotContainer::Init(kMaxSlot*2);
this->InitItemRender();
}
//------------------------------------------------------------------------------
/**
*/
uiSkillAction::~uiSkillAction()
{
this->Release();
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::Init(CDrawBase* draw_base)
{
uiBase::Init(draw_base);
// 컨트롤러 유효성 체크
for (int idx = 0; idx < kDlgMax; ++idx)
{
if (this->getControl(idx) == NULL)
{
invalid_control_ = true;
break;
}
}
#ifdef _NA_0_20120321_SKILLTREE_SECOND_RENEWAL
for (int idx = 0; idx < kMaxSlot; ++idx )
{
CCtrlPictureWZ* control = (CCtrlPictureWZ*)getControl(idx);
control->EnableLButtonEvent(true);
}
// 좌우 타이틀
TCHAR text[INTERFACE_STRING_LENGTH];
if( CControlWZ* control = getControl(kTextLeft) )
{
g_InterfaceManager.GetInterfaceString(eST_BUTTON_TEXT_ACTION, text, INTERFACE_STRING_LENGTH);
control->SetTextWZ(text);
}
if( CControlWZ* control = getControl(kTextRight) )
{
g_InterfaceManager.GetInterfaceString(eST_BUTTON_TEXT_EMOTICON, text, INTERFACE_STRING_LENGTH);
control->SetTextWZ(text);
}
#endif
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::Release()
{
FlushUnitDraw();
SAFE_RELEASENDELETE(item_renderer_);
}
//------------------------------------------------------------------------------
/**
*/
SCSlotContainer* uiSkillAction::GetSlotContainer()
{
return static_cast<SCSlotContainer *>(this);
}
//------------------------------------------------------------------------------
/** 정보로딩
*/
void uiSkillAction::LoadSkillActionSlot(const SkillInven_s* data)
{
SkillInfoParser* parser = SkillInfoParser::Instance();
for (int idx = 0; idx < kMaxColumn; ++idx)
{
SLOTCODE skill_Code = SLOTCODE(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);
uicSkillInfo info;
info.m_pCurrentSkillInfo = parser->GetSkillInfo(skill_Code);
// 스킬 정보 세팅
info.m_SlotIndex = real_pos;
info.m_State = SLOT_RENDER_STATE_FORCE_ACTIVATED;
info.m_bEnableLevelup = false;
// 삽입(순서대로 기입되어있다)
skill_action_list().push_back(info);
}
}
//------------------------------------------------------------------------------
/** 슬롯 삽입
*/
RC::eSLOT_INSERT_RESULT uiSkillAction::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 uiSkillAction::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);
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::OnShowWindow(BOOL val)
{
uiSkillMan* ui_skill_man = GET_DIALOG_MANAGER(uiSkillMan, UIMAN_SKILL);
if (invalid_control())
{
return;
}
ui_skill_man->OpenDialog(uiSkillMan::kSkillAction, val);
if (val)
{
RefreshActionIcon();
RefreshTab();
}
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::InitItemRender()
{
if (GetItemUnitRender() == NULL)
{
item_renderer_ = new ItemUnitRenderer;
item_renderer_->Init( uiBase::GetDrawBase(), GetMaxSlotNum() );
item_renderer_->ShowCooldown(TRUE);
}
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::OnUpdateSolarDialog()
{
if (invalid_control())
{
return;
}
UpdateUnitRender();
UpdateMouse();
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::OnRenderSolarDialog()
{
if (invalid_control() ||
(GetItemUnitRender() == NULL))
{
return;
}
GetItemUnitRender()->Render();
RenderToolTip();
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::MessageProc(SI_MESSAGE* message)
{
if (invalid_control())
{
return;
}
POSTYPE pos = GetControlPos(message->dwCtrlID);
switch (message->eResultMsg)
{
case RT_MSG_RBUTTONCLICK:
{
MouseClickSlot(pos, false);
}
break;
case RT_MSG_LBUTTONCLICK:
{
MouseClickSlot(pos, true);
MouseClickTab(pos);
if (pos == kEscButton)
{
ShowInterface(FALSE);
}
}
break;
default:
{
SolarDialog::MessageProc(message);
}
break;
}
}
//------------------------------------------------------------------------------
/** 마우스클릭처리(우클릭:집기, 좌클릭:사용)
*/
void uiSkillAction::MouseClickSlot(POSTYPE pos, bool pickup)
{
if ((pos >= kMaxSlot) ||
IsEmpty(pos))
{
return;
}
if (pickup)
{
RECT rect = getControl(pos)->GetSizeRect();
MouseHandler::Instance()->ItemTransaction(SI_SKILL, pos, &rect);
}
else
{
MouseHandler::Instance()->ItemUseTransaction(SI_SKILL, pos);
}
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::Clear()
{
FlushUnitDraw();
skill_action_list().clear();
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::FlushUnitDraw()
{
for (int idx = 0; idx < GetMaxSlotNum(); ++idx)
{
if (IsEmpty(idx) == FALSE)
{
g_SlotKeyGenerator.Restore(DWORD(GetSlot(idx).GetSerial()));
this->DeleteSlot(idx, NULL);
}
}
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::MouseClickTab(POSTYPE pos)
{
if ((pos < kTabBein) ||
(pos > kTabEnd))
{
return;
}
RefreshTab();
uiSkillMan* ui_skill_man = GET_DIALOG_MANAGER(uiSkillMan, UIMAN_SKILL);
if (ui_skill_man)
{
ui_skill_man->OpenTab((pos - kTabBein) + 1);
}
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::RenderToolTip()
{
if (m_MouseOverObject.eMouseOverType != eMOUSE_OVER_SKILL)
{
return;
}
uicSkillInfo& skill_info = skill_action_list(m_MouseOverObject.iSkillIdx);
SCSkillSlot& skill_slot = static_cast<SCSkillSlot &>(GetSlot(skill_info.m_SlotIndex));
uiToolTipMan* tooltip = GET_DIALOG_MANAGER(uiToolTipMan, UIMAN_TOOLTIP);
if (tooltip)
{
tooltip->RegisterTooltipSkillEtc(skill_info.m_pCurrentSkillInfo);
tooltip->SetTooltipDialogID(GetDialogKey());
}
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::RefreshActionIcon()
{
int max_slot = GetMaxSlotNum();
for( int idx = 0; idx < max_slot; ++idx)
{
if (IsEmpty(idx) == FALSE)
{
SCSlot& slot = SCSlotContainer::GetSlot(idx);
if (GetItemUnitRender()->GetItemUnit(slot.GetSerial()) == false)
{
GetItemUnitRender()->AddItemUnit(slot.GetSerial(), slot.GetCode(),
&getControl(idx)->GetSizeRect(), &slot,
getControl(idx));
}
}
}
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::RefreshTab()
{
// Tab
CCtrlButtonCheckWZ* button = NULL;
for (int idx = 0; idx < kMaxTab; ++idx)
{
button = static_cast<CCtrlButtonCheckWZ*>(getControl(idx + kTabBein));
button->SetCheckState((idx == 2) ? (true) : (false));
}
}
//------------------------------------------------------------------------------
/**
*/
void uiSkillAction::UpdateUnitRender()
{
if (GetItemUnitRender() == NULL)
{
return;
}
GetItemUnitRender()->Update();
int list_size = skill_action_size();
ItemUnitRenderer::RenderUnit* render_unit = NULL;
for (int idx = 0; idx < list_size; ++idx)
{
uicSkillInfo& info = skill_action_list(idx);
render_unit = GetItemUnitRender()->GetItemUnit(GetSlot(info.m_SlotIndex).GetSerial());
if (render_unit)
{
render_unit->SetShow(TRUE);
}
}
}
//------------------------------------------------------------------------------
/** 스킬정보를 통한 슬롯위치찾기
*/
SkillSlot* uiSkillAction::FindSlotByCode(CODETYPE skill_code)
{
int max_slot = GetMaxSlotNum();
for( int idx = 0; idx < max_slot; ++idx)
{
if (IsEmpty(idx) == FALSE)
{
SCSlot& slot = SCSlotContainer::GetSlot(idx);
if (slot.GetCode() == skill_code)
{
return static_cast<SkillSlot*>(&GetSlot(idx));
}
}
}
return NULL;
}
//------------------------------------------------------------------------------
/** 슬롯돌며 마우스 오버 체크
*/
void uiSkillAction::UpdateMouse()
{
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX;
int mouse_x = Mouse::Instance()->GetMouseX();
int mouse_y = Mouse::Instance()->GetMouseY();
int list_size = skill_action_size();
for (int idx = 0; idx < list_size; ++idx)
{
POSTYPE slot_pos = skill_action_list(idx).m_SlotIndex;
RECT rect = getControl(slot_pos)->GetSizeRect();
if (rect.left <= mouse_x && rect.right >= mouse_x)
{
if (rect.top <= mouse_y && rect.bottom >= mouse_y)
{
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_SKILL;
m_MouseOverObject.iSkillIdx = idx;//리스트 인덱스
break;
}
}
}
}