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

719 lines
18 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "ExtendInventoryDialog.h"
#include <SCItemSlot.h>
#include "InterfaceManager.h"
#include "uiInventoryMan/uiInventoryMan.h"
#include "inventorydialog.h"
#include "Hero.h"
#include "globalfunc.h"
#include "ItemUnitRenderer.h"
#include "MouseHandler.h"
#include "Mouse.h"
#include "CursorChangeTransact.h"
#include "uiToolTipMan/uiToolTipMan.h"
#include "uiSocketRemove/uiSocketRemove.h"
#include "ItemInfoParser.h"
#include "ItemManager.h"
#include "BattleScene.h"
#include "EnchantDialog2.h"
#include "EventInventoryDialog.h"
#include "ItemCompositeParser.h"
#include "HeroEquipmentContainer.h"
#include "uiPersonalWayPointWindow/uiPersonalWayPointWindow.h"
const DWORD c_dwFlashTick = 500;
//----------------------------------------------------------------------------
/**
*/
WzID ExtendInventoryDialog::controls_id_[EXTEND_INVENTORY_CONTROLS_MAX] =
{
StrToWzID("B020"),
StrToWzID("B021"),
StrToWzID("B022"),
StrToWzID("B023"),
StrToWzID("B024"),
StrToWzID("B025"),
StrToWzID("B026"),
StrToWzID("B027"),
StrToWzID("B028"),
StrToWzID("B029"),
StrToWzID("B030"),
StrToWzID("B031"),
StrToWzID("B032"),
StrToWzID("B033"),
StrToWzID("B034"),//1
StrToWzID("BT20"),
StrToWzID("BT19"),
StrToWzID("BT18"),
StrToWzID("BT17"),
StrToWzID("BT16"),
StrToWzID("BT11"),
StrToWzID("BT12"),
StrToWzID("BT13"),
StrToWzID("BT14"),
StrToWzID("BT15"),
StrToWzID("BT10"),
StrToWzID("BT09"),
StrToWzID("BT08"),
StrToWzID("BT07"),
StrToWzID("BT06"),//2
StrToWzID("BT36"),
StrToWzID("BT37"),
StrToWzID("BT38"),
StrToWzID("BT39"),
StrToWzID("BT40"),
StrToWzID("BT45"),
StrToWzID("BT44"),
StrToWzID("BT43"),
StrToWzID("BT42"),
StrToWzID("BT41"),
StrToWzID("BT46"),
StrToWzID("BT47"),
StrToWzID("BT48"),
StrToWzID("BT49"),
StrToWzID("BT50"),//3
StrToWzID("BT22"),
StrToWzID("BT21"),
StrToWzID("BT23"),
StrToWzID("BT24"),
StrToWzID("BT25"),
StrToWzID("BT30"),
StrToWzID("BT29"),
StrToWzID("BT28"),
StrToWzID("BT27"),
StrToWzID("BT26"),
StrToWzID("BT31"),
StrToWzID("BT32"),
StrToWzID("BT33"),
StrToWzID("BT34"),
StrToWzID("BT35"),//4
StrToWzID("BT82"),
StrToWzID("BT81"),
StrToWzID("BT83"),
StrToWzID("BT84"),
StrToWzID("BT85"),
StrToWzID("BT86"),
StrToWzID("BT87"),
StrToWzID("BT88"),
StrToWzID("BT89"),
StrToWzID("BT90"),
StrToWzID("BT91"),
StrToWzID("BT92"),
StrToWzID("BT93"),
StrToWzID("BT94"),
StrToWzID("BT95"),//5
StrToWzID("BT80"),
StrToWzID("BT79"),
StrToWzID("BT78"),
StrToWzID("BT77"),
StrToWzID("BT76"),
StrToWzID("BT75"),
StrToWzID("BT74"),
StrToWzID("BT73"),
StrToWzID("BT72"),
StrToWzID("BT71"),
StrToWzID("BT70"),
StrToWzID("BT69"),
StrToWzID("BT68"),
StrToWzID("BT67"),
StrToWzID("BT66"),//6
StrToWzID("BT51"),
StrToWzID("BT52"),
StrToWzID("BT53"),
StrToWzID("BT54"),
StrToWzID("BT55"),
StrToWzID("BT60"),
StrToWzID("BT59"),
StrToWzID("BT58"),
StrToWzID("BT57"),
StrToWzID("BT56"),
StrToWzID("BT61"),
StrToWzID("BT62"),
StrToWzID("BT63"),
StrToWzID("BT64"),
StrToWzID("BT65"),//7
StrToWzID("B000"),
StrToWzID("B001"),
StrToWzID("B002"),
StrToWzID("B003"),
StrToWzID("B004"),
StrToWzID("B005"),
StrToWzID("B006"),
StrToWzID("B007"),
StrToWzID("B008"),
StrToWzID("B009"),
StrToWzID("B010"),
StrToWzID("B011"),
StrToWzID("B012"),
StrToWzID("B013"),
StrToWzID("B014"),//8
StrToWzID("B047"),
StrToWzID("B048"),
StrToWzID("B049"),
StrToWzID("B050"),
StrToWzID("B051"),
StrToWzID("B057"),
StrToWzID("B058"),
StrToWzID("B059"),
StrToWzID("B060"),
StrToWzID("B061"),
StrToWzID("B067"),
StrToWzID("B068"),
StrToWzID("B069"),
StrToWzID("B070"),
StrToWzID("B071"),//9
StrToWzID("B052"),
StrToWzID("B053"),
StrToWzID("B054"),
StrToWzID("B055"),
StrToWzID("B056"),
StrToWzID("B062"),
StrToWzID("B063"),
StrToWzID("B064"),
StrToWzID("B065"),
StrToWzID("B066"),
StrToWzID("B072"),
StrToWzID("B073"),
StrToWzID("B074"),
StrToWzID("B075"),
StrToWzID("B076"),
StrToWzID("T999"),//title
StrToWzID("BT01"),//unlock
StrToWzID("B036"),//lock
StrToWzID("BT04"),//설정필터
StrToWzID("BT05"),//펼쳐보기
StrToWzID("B037"),//휴지통
StrToWzID("BT03"),//웨이포인트
StrToWzID("BT00"),//eve off
StrToWzID("BT02"),//eve on
StrToWzID("T001"),//money
StrToWzID("B015"),//INVEN_BT_EXIT
StrToWzID("P000"),//lock blind0
StrToWzID("P001"),//lock blind1
StrToWzID("P003"),//lock blind2
StrToWzID("P002"),//lock blind3
StrToWzID("P004"),//lock blind4
};
ExtendInventoryDialog::ExtendInventoryDialog(InterfaceManager* manager_ptr)
:uiBase(manager_ptr)
{
inventory_manager_ptr_ = NULL;
item_unit_renderer_ = NULL;
this->inventory_manager_ptr_ = GET_DIALOG_MANAGER(uiInventoryMan, UIMAN_INVENTORY);
assert(inventory_manager_ptr_);
}
ExtendInventoryDialog::~ExtendInventoryDialog(void)
{
Release();
}
void ExtendInventoryDialog::Init(CDrawBase* draw_base_ptr)
{
InitControls();
if(event_button_ != NULL)
{
event_button_->ShowWindowWZ(WZ_HIDE);
}
flash_tick_for_event_inven_ = c_dwFlashTick;
event_inven_on_ = false;
event_inven_off_ = false;
charge_count_ = 0;
}
void ExtendInventoryDialog::CheckChargeInventory(int charge_count)
{
if (g_pHero == NULL)
{
return;
}
CCtrlImageStaticWZ* blind_background_image = NULL;
int max_inven_blind = (EXTEND_INVEN_IMAGE_BLIND04 - EXTEND_INVEN_IMAGE_BLIND00) + 1;
for(int i = 0; i < max_inven_blind; ++i)
{
blind_background_image =
static_cast<CCtrlImageStaticWZ*>(get_control(EXTEND_INVEN_IMAGE_BLIND00 + i));
if (blind_background_image != NULL)
{
if (charge_count > i)
{
blind_background_image->ShowWindowWZ(WZ_HIDE);
}
else
{
blind_background_image->ShowWindowWZ(WZ_SHOW);
}
}
}
}
void ExtendInventoryDialog::InitControls()
{
money_text_control_ = static_cast<CCtrlStaticWZ*>(get_control(EXTEND_INVEN_BUTTON_MONEY));
assert(money_text_control_);
title_static_text_ = static_cast<CCtrlStaticWZ *>(get_control(EXTEND_INVEN_TEXT_TITLE));
assert(title_static_text_);
for(int i = 0; i < EXTEND_INVENTORY_LOCK_STATE_MAX; ++i)
{
lock_buttons_[i] = static_cast<CCtrlButtonCheckWZ*>(get_control(EXTEND_INVEN_BUTTON_UNLOCK + i));
assert(lock_buttons_[i]);
}
event_button_ = (CCtrlButtonWZ*)get_control(EXTEND_INVEN_BUTTON_EVENT_INVEN_ON);
assert(event_button_);
}
void ExtendInventoryDialog::InitRenderer()
{
inventory_dialog_
= GET_CAST_DIALOG(InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG);
if (inventory_dialog_ != NULL)
{
item_unit_renderer_ = inventory_dialog_->GetItemUnitRender();
}
}
void ExtendInventoryDialog::Release()
{
}
uiInventoryMan* ExtendInventoryDialog::GetManager()
{
return inventory_manager_ptr_;
}
void ExtendInventoryDialog::OnUpdateSolarDialog()
{
if (item_unit_renderer_ != NULL)
{
item_unit_renderer_->Update();
}
if (inventory_dialog_ != NULL && money_text_control_ != NULL)
{
inventory_dialog_->updateMoney(money_text_control_);
}
int charge_count = g_pHero->GetCharInfo()->m_ExtraInventoryTabCount;
if (charge_count_ != charge_count)
{
charge_count_ = charge_count;
CheckChargeInventory(charge_count);// 변경된 경우(캐쉬아이템으로 사면)
}
}
void ExtendInventoryDialog::OnRenderSolarDialog()
{
/*if (item_unit_renderer_ != NULL)
{
item_unit_renderer_->Render();
}*/
UpdateToolTip();
if (inventory_dialog_ != NULL)
{
inventory_dialog_->InventoryUnitRender();
}
if((true == event_inven_on_) && (WZ_HIDE == event_button_->GetState()))
{
event_button_->ShowWindowWZ(WZ_SHOW);
}
else if((false == event_inven_on_) && (WZ_SHOW == event_button_->GetState()))
{
event_button_->ShowWindowWZ(WZ_HIDE);
}
}
void ExtendInventoryDialog::Process(DWORD tick_count)
{
if (event_inven_off_)
{
if ((DWORD)flash_tick_for_event_inven_ > tick_count && IsVisible())
{
flash_tick_for_event_inven_ -= tick_count;
if (flash_tick_for_event_inven_ <= 100)
{
if (event_inven_on_ == true)
{
event_inven_on_ = false;
}
else
{
event_inven_on_ = true;
}
flash_tick_for_event_inven_ = c_dwFlashTick;
}
}
}
else
{
event_inven_on_ = FALSE;
}
}
void ExtendInventoryDialog::MessageProc(SI_MESSAGE* message_ptr)
{
static BOOL double_clicked = FALSE;
switch (message_ptr->eResultMsg)
{
case RT_MSG_LBUTTONDCLICK:
{
POSTYPE control_position = get_control_id_to_position(message_ptr->dwCtrlID);
if (inventory_dialog_ == NULL || inventory_dialog_->GetCurInvenContainer() != EXTEND_INVENTORY)
{
return;
}
CControlWZ* control_ptr = get_control(control_position);
if (control_ptr == NULL)
{
return;
}
double_clicked = TRUE;
if (inventory_dialog_ != NULL)
{
inventory_dialog_->DoubleClickSlotBtn(control_position);
}
}
break;
case RT_MSG_LBUTTONCLICK:
{
POSTYPE control_position = get_control_id_to_position(message_ptr->dwCtrlID);
if ((control_position < EXTEND_INVENTORY_MAX) && (double_clicked == FALSE))
{
CControlWZ* pControl = get_control(control_position);
if (pControl != NULL)
{
inventory_dialog_->ClickSlotBtn(control_position, pControl->GetSizeRect());
}
}
else
{
if (double_clicked)
{
double_clicked = FALSE;
}
POSTYPE normal_inventory_control_position = EXTEND_INVENTORY_CONTROLS_MAX;
switch (control_position)
{
case EXTEND_INVEN_BUTTON_VIEW_OPTION:
normal_inventory_control_position = InventoryDialog::INVEN_BT_EXTEND;
break;
case EXTEND_INVEN_BUTTON_FILTER:
normal_inventory_control_position = InventoryDialog::INVEN_BT_SETTING;
break;
case EXTEND_INVEN_BUTTON_EVENT_INVEN_OFF:
normal_inventory_control_position = InventoryDialog::INVEN_BT_OPEN_EVENT;
break;
case EXTEND_INVEN_BUTTON_EVENT_INVEN_ON:
normal_inventory_control_position = InventoryDialog::INVEN_FLASH_BT_OPEN_EVENT;
break;
case EXTEND_INVEN_BUTTON_WASTE:
normal_inventory_control_position = InventoryDialog::INVEN_BT_WASTE_BASKET;
break;
case EXTEND_INVEN_BUTTON_UNLOCK:
normal_inventory_control_position = InventoryDialog::INVEN_BT_UNLOCK;
break;
case EXTEND_INVEN_BUTTON_LOCK:
normal_inventory_control_position = InventoryDialog::INVEN_BT_LOCK;
break;
case EXTEND_INVEN_BUTTON_EXIT:
ShowDialog(FALSE);
break;
case EXTEND_INVEN_BUTTON_WAY_POINT:
normal_inventory_control_position = InventoryDialog::INVEN_PERSONAL_WAYPOINT_BTN;
break;
default:
break;
}//switch
if (normal_inventory_control_position != EXTEND_INVENTORY_CONTROLS_MAX)
{
if (inventory_dialog_ != NULL)
{
inventory_dialog_->ClickETCBtn(normal_inventory_control_position);
}
}
}
}
break;
case RT_MSG_RBUTTONCLICK:
{
POSTYPE control_position = get_control_id_to_position(message_ptr->dwCtrlID);
CControlWZ* control_ptr = get_control(control_position);
if (control_ptr == NULL)
{
return;
}
if (control_position >= EXTEND_INVENTORY_MAX)
{
return;
}
if (inventory_dialog_ != NULL)
{
inventory_dialog_->RightClickProcess(control_position);
}
}
break;
default:
{
SolarDialog::MessageProc(message_ptr);
}
break;
}//switch
}
void ExtendInventoryDialog::ShowExtendInventory()
{
HeroEquipmentContainer* hero_equip = g_pHero->GetHeroEquipContainer();
// 캐릭터 장착창이 열려 있지 않은 경우만 토글한다.
if (hero_equip && !hero_equip->IsVisible())
{
return;
//hero_equip->ShowDialog(TRUE);
}
// 큰인벤이 열려 있다 -> 큰인벤을 닫고 작은인벤을 연다.
// 큰인벤이 닫혀 있다 -> 작은인벤을 닫고 큰인벤을 연다.
if (GetManager())
{
GetManager()->ToggleExtendInvenDlg();
}
}
void ExtendInventoryDialog::OnShowWindow(BOOL value)
{
SolarDialog::OnShowWindow(value);
if (value != FALSE)
{
if(inventory_dialog_ != NULL)
{
inventory_dialog_->InitTitleByLockState(title_static_text_,
lock_buttons_[EXTEND_INVENTORY_LOCK_STATE_LOCK],
lock_buttons_[EXTEND_INVENTORY_LOCK_STATE_UNLOCK]);
}
//MSG_CG_EVENT_QUERY_EXIST_SYN는 받지 않는다. 기본인벤에서 받아 처리한다.
RefreshExtendInventoryRenderUnit();
}
else
{
if (inventory_dialog_ != NULL)
{
inventory_dialog_->HideWindowProcess();
}
}
}
void ExtendInventoryDialog::RefreshRenderSlot()
{
if (!this->IsVisibleWindow())
{
return;
}
RefreshExtendInventoryRenderUnit();
}
void ExtendInventoryDialog::RefreshExtendInventoryRenderUnit()
{
ItemUnitRenderer::RenderUnit* pRender = NULL;
RECT rcSlot;
CControlWZ* pCtrl = NULL;
if (inventory_dialog_ == NULL)
{
return;
}
for (int i = 0; i < inventory_dialog_->GetMaxSlotNum(); ++i)
{
SCSlot& rSlot = inventory_dialog_->GetSlot(i);
if (inventory_dialog_->IsEmpty(i))
{
continue;
}
if (inventory_dialog_->GetCurInvenContainer() == 0 && // 0: InventoryDialog::INVENTORY
(i < EXTEND_INVENTORY_MAX))
{
// 보여줘야할 목록
if(item_unit_renderer_ == NULL)
{
continue;
}
pRender = item_unit_renderer_->GetItemUnit(rSlot.GetSerial());
pCtrl = get_control(i);//i가 바로 위치
rcSlot = pCtrl->GetSizeRect();
if (pRender == NULL)
{
pRender = item_unit_renderer_->AddItemUnit(rSlot.GetSerial(), rSlot.GetCode(), &rcSlot, &rSlot ,pCtrl);
}
else
{
item_unit_renderer_->ChangePositionItemUnit(rSlot.GetSerial(), &rcSlot, pCtrl);
}
if (pRender && pRender != MouseHandler::Instance()->GetMouseItem()->m_pRenderUnit)
{
pRender->SetShow(TRUE);
}
}
}
}
void ExtendInventoryDialog::UpdateToolTip()
{
int iMouseX = Mouse::Instance()->GetMouseX();
int iMouseY = Mouse::Instance()->GetMouseY();
// 스킵처리
// 인터페이스에서 Dialog 바탕에서는 Mouse Over가 오지 않는다.
bool is_mouse_over = false;
int loop_end = EXTEND_INVENTORY_CONTROLS_MAX;
for (POSTYPE position = 0; position < loop_end; ++position)
{
CControlWZ* control = get_control(position);
if(control)
{
RECT control_rect = control->GetSizeRect();
if (control_rect.left <= iMouseX && control_rect.right >= iMouseX)
{
if (control_rect.top <= iMouseY && control_rect.bottom >= iMouseY)
{
is_mouse_over = true;
break;
}
}
}
}
if (inventory_dialog_ != NULL)
{
inventory_dialog_->ProcessToolTip(is_mouse_over, GetDialogKey());
}
}
void ExtendInventoryDialog::MouseOver_MsgProc(SI_MESSAGE* pMessage)
{
if (inventory_dialog_ == NULL)
{
return;
}
switch(pMessage->eResultMsg)
{
case RT_MSG_MOUSEOVER:
{
POSTYPE position = get_control_id_to_position(pMessage->dwCtrlID);
// 0~ EXTEND_INVENTORY_MAX 까지 아이템 정보를 보여준다.
if (position < inventory_dialog_->GetMaxSlotNum() &&
position >= 0 && position < EXTEND_INVENTORY_MAX)
{
inventory_dialog_->MouseOverProcess(position);
}
else
{
POSTYPE normal_inventory_position = 0;
switch (position)
{
case EXTEND_INVEN_BUTTON_UNLOCK:
normal_inventory_position = InventoryDialog::INVEN_BT_UNLOCK;
break;
case EXTEND_INVEN_BUTTON_LOCK:
normal_inventory_position = InventoryDialog::INVEN_BT_LOCK;
break;
case EXTEND_INVEN_BUTTON_WAY_POINT:
normal_inventory_position = InventoryDialog::INVEN_PERSONAL_WAYPOINT_BTN;
break;
case EXTEND_INVEN_BUTTON_FILTER:
normal_inventory_position = InventoryDialog::INVEN_BT_SETTING;
break;
case EXTEND_INVEN_BUTTON_VIEW_OPTION:
normal_inventory_position = InventoryDialog::INVEN_BT_EXTEND;
break;
case EXTEND_INVEN_BUTTON_WASTE:
normal_inventory_position = InventoryDialog::INVEN_BT_WASTE_BASKET;
break;
case EXTEND_INVEN_BUTTON_EVENT_INVEN_OFF:
case EXTEND_INVEN_BUTTON_EVENT_INVEN_ON:
normal_inventory_position = InventoryDialog::INVEN_BT_OPEN_EVENT;
break;
default:
break;
}
if ((normal_inventory_position != 0) && (inventory_dialog_ != NULL))
{
inventory_dialog_->SetTooltipString(
inventory_dialog_->getTooltipString(normal_inventory_position));
}
else
{
inventory_dialog_->SetTooltipString(0);
}
inventory_dialog_->SetInventoryMouseOverType(eMOUSE_OVER_MAX);
}
}
break;
}
}
void ExtendInventoryDialog::InitTitleByLockState()
{
if(inventory_dialog_ != NULL)
{
inventory_dialog_->InitTitleByLockState(title_static_text_,
lock_buttons_[EXTEND_INVENTORY_LOCK_STATE_LOCK],
lock_buttons_[EXTEND_INVENTORY_LOCK_STATE_UNLOCK]);
}
}
//void ExtendInventoryDialog::UpdatePosition()
//{
// // 장착 창 뜰때 포지션 지정해준다.
// // 스킵~
//}