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

1315 lines
32 KiB
C++

//---------------------------------------------------------------------------
// QuickContainer
//
// (C) 2005 y2jinc
//---------------------------------------------------------------------------
#include "SunClientPrecompiledHeader.h"
#include "quickcontainer.h"
#include "ItemUnitRenderer.h"
#include "MouseHandler.h"
#include "QuickSlot.h"
#include "ItemManager.h"
#include "InventoryDialog.h"
#include "Hero.h"
#include "HeroEquipmentContainer.h"
#include "HeroActionInput.h"
#include "mouse.h"
#include "interfaceManager.h"
#include "ObjectManager.h"
#include "SlotKeyGenerator.h"
#include "CursorChangeTransact.h"
#include "uiToolTipMan/uiToolTipMan.h"
#include "GlobalFunc.h"
#include "uiChatMan/uichatman.h"
#include "uiSkillQueueMan/uiSkillQueueMan.h"
#include "uiSummonSkillMan/uiSummonSkillMan.h"
#include "uiSummonTargetMan/uiSummonTargetMan.h"
#include "HotKeyDefine.h"
#include "Input/HotKeyInfoParser.h"
#include "HotKeyManager.h"
#ifdef _NA_000000_20130114_RENEWER_UI
#include "GameOptionParser.h"
#endif
//----------------------------------------------------------------------------
/**
*/
WzID QuickContainer::m_wzId[QUICK_MAX] =
{
StrToWzID("BT14"),
StrToWzID("BT15"),
StrToWzID("BT16"),
StrToWzID("BT17"),
StrToWzID("BT18"),
StrToWzID("BT19"),
StrToWzID("BT20"),
StrToWzID("BT21"),
StrToWzID("BT22"),
StrToWzID("BT23"),//10
StrToWzID("BT24"),
StrToWzID("BT25"),
StrToWzID("BT34"),
StrToWzID("BT35"),
StrToWzID("BT36"),
StrToWzID("BT37"),
StrToWzID("BT38"),
StrToWzID("BT39"),
StrToWzID("BT40"),
StrToWzID("BT41"),//20
StrToWzID("BT02"),
StrToWzID("BT03"),
StrToWzID("BT04"),
StrToWzID("BT05"),
StrToWzID("BT06"),
StrToWzID("BT07"),
StrToWzID("BT08"),
StrToWzID("BT09"),
StrToWzID("BT10"),
StrToWzID("BT11"),//30
StrToWzID("BT12"),
StrToWzID("BT13"),
StrToWzID("BT33"),
StrToWzID("BT32"),
StrToWzID("BT31"),
StrToWzID("BT30"),
StrToWzID("BT29"),
StrToWzID("BT28"),
StrToWzID("BT27"),
StrToWzID("BT26"),//40
StrToWzID("BT00"),//+
StrToWzID("BT01"),//-
StrToWzID("BT42"),//∞ QUICK_CHANGE_SLOT
StrToWzID("PI02"),//background_of_single
StrToWzID("PI03"),//background_of_double
#ifdef _NA_000000_20130114_RENEWER_UI
StrToWzID("P002"),//QUICK_PICTURE_EXPP002
StrToWzID("P000"),//QUICK_PICTURE_EXPP000
StrToWzID("T009"),//QUICK_STATIC_TEXT009
#else
StrToWzID("PI01"),//
#endif
};
static float CalculateExp()
{
float fExpPercent=0.0f;
EXPTYPE destexp = g_pHero->GetNextExp();
EXPTYPE curaccumexp = g_pHero->GetAccumExp(g_pHero->GetLevel());
EXPTYPE curexp = g_pHero->GetExp();
__int64 iXpForNextLevel = (__int64)destexp - (__int64)curaccumexp;
__int64 iCurrentXpForNextLevel = (__int64)curexp - (__int64)curaccumexp;
if (iXpForNextLevel < 1)
{
iXpForNextLevel = 1;
}
if (iCurrentXpForNextLevel < 0)
{
iCurrentXpForNextLevel = 0;
}
fExpPercent = ((float)iCurrentXpForNextLevel / (float)iXpForNextLevel) * 100.0f;
fExpPercent = min(100.0f,fExpPercent);
return fExpPercent;
}
//----------------------------------------------------------------------------
/**
*/
QuickContainer::QuickContainer()
: m_TabNum ( 0 ),
m_TabIndex( 0 ),
m_PrevTabIndex( -1 ),
m_pItemUnitRenderer ( NULL )
,is_double_slot_(false)
{
}
//----------------------------------------------------------------------------
/**
*/
QuickContainer::~QuickContainer()
{
assert( NULL == m_pItemUnitRenderer );
}
//----------------------------------------------------------------------------
/**
*/
VOID
QuickContainer::Release()
{
SAFE_RELEASENDELETE( m_pItemUnitRenderer );
}
//----------------------------------------------------------------------------
/**
*/
VOID
QuickContainer::OnUpdateSolarDialog()
{
if (m_pItemUnitRenderer)
m_pItemUnitRenderer->Update();
#ifdef _NA_000000_20130114_RENEWER_UI
float fExpPercent = CalculateExp();
SetHeroExp(fExpPercent);
#endif
}
//----------------------------------------------------------------------------
/**
*/
VOID
QuickContainer::OnRenderSolarDialog()
{
if (m_pItemUnitRenderer)
m_pItemUnitRenderer->Render();
#ifdef _NA_000000_20130114_RENEWER_UI
//RenderText();
#endif
{
// 퀵슬록 설정 단축키 출력
STLX_STRING hot_key_string;
ENUM_STATEWZ show_state;
RECT control_rect;
HOT_KEY_CODE hot_ket_code;
HOT_KEY_FUNCTION_INDEX function_index;
KEY_BIND_PAIR_MAP key_bind_pair_map =
HotKeyManager::Instance()->current_using_key_bind_info().key_bind_pair_map();
KEY_BIND_PAIR_MAP::iterator found_itr;
KEY_BIND_PAIR_MAP::iterator end_itr = key_bind_pair_map.end();
POSTYPE max_position = QUICK_SLOT_HALF;
if (double_size() == true)
{
max_position += QUICK_SLOT_HALF;
}
for (POSTYPE control_position = QUICK_BT00; control_position < max_position; ++control_position)
{
CControlWZ* slot_button = getControl(control_position);
if (slot_button == NULL)
{
continue;
}
show_state = slot_button->GetState();
if (show_state != WZ_SHOW)
{
continue;
}
function_index =
static_cast<HOT_KEY_FUNCTION_INDEX>(kUse_QuickSlot1 + (control_position - QUICK_BT00));
found_itr = key_bind_pair_map.find(function_index);
if (found_itr == end_itr)
{
continue;
}
KEY_BIND_PAIR& key_bind_pair = found_itr->second;
hot_ket_code.hot_key_code_ = key_bind_pair.GetHotKeyCode(KEY_BIND_PAIR::kMainHotKey);
if (hot_ket_code.hot_key_code_ == 0)
{
hot_ket_code.hot_key_code_ = key_bind_pair.GetHotKeyCode(KEY_BIND_PAIR::kSubHotKey);
}
if (hot_ket_code.hot_key_code_ == 0)
{
continue;
}
hot_key_string.clear();
if (hot_ket_code.ctrl_key_ == 1)
{
hot_key_string += "C";
}
if (hot_ket_code.alt_key_ == 1)
{
hot_key_string += "A";
}
if (hot_ket_code.shift_key_ == 1)
{
hot_key_string += "S";
}
if (hot_key_string.length() > 0)
{
hot_key_string += ":";
}
int string_code = HotKeyInfoParser::Instance()->GetStringCodeForQuickSlot(hot_ket_code.key_code_);
hot_key_string += g_InterfaceManager.GetInterfaceString(string_code);
control_rect = slot_button->GetSizeRect();
const WzColor text_color = WzColor_RGB(195, 171, 122);
g_pSunRenderer->x_pManagerTextOut->StartToUseFont(StrToWzID("st07"));
g_pSunRenderer->x_pManagerTextOut->DrawText(hot_key_string.c_str(),
&control_rect,
text_color,
WzColor_RGBA( 0, 0, 0, 0),
TP_HLEFT,
ETS_OUTLINE);
g_pSunRenderer->x_pManagerTextOut->EndUseFont();
}
}
int iMouseX = Mouse::Instance()->GetMouseX();
int iMouseY = Mouse::Instance()->GetMouseY();
// 스킵처리
// 인터페이스에서 Dialog 바탕에서는 Mouse Over가 오지 않는다.
BOOL bMouseOver = FALSE;
POSTYPE pos = 0;
int string_code = 0;
for (POSTYPE a = QUICK_BT00; a < QUICK_MAX; a++)
{
CControlWZ * pControl = getControl(a);
if(pControl)
{
RECT rc = pControl->GetSizeRect();
if (rc.left <= iMouseX && rc.right >= iMouseX)
{
if (rc.top <= iMouseY && rc.bottom >= iMouseY)
{
bMouseOver = TRUE;
switch (a)
{
case QUICK_CHANGE_SLOT:
string_code = 2170;
break;
case QUICK_UPBT:
case QUICK_DNBT:
string_code = 2171;
break;
}
}
}
}
}
if ( !bMouseOver )
{
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX;
}
else
{
ProcessToolTip(!!bMouseOver, string_code);
}
}
//----------------------------------------------------------------------------
/**
*/
VOID
QuickContainer::Init( CDrawBase * pDrawBase )
{
m_TabNum = 0;
QuickSlotContainer::Init(MAX_QUICK_SLOT_NUM);
button_of_double_ =
static_cast<CCtrlButtonWZ*>(getControl(QUICK_UPBT));
assert(button_of_double_);
button_of_single_ =
static_cast<CCtrlButtonWZ*>(getControl(QUICK_DNBT));
assert(button_of_single_);
#ifdef _NA_000000_20130114_RENEWER_UI
#else
numbers_of_bottom_line_ =
static_cast<CCtrlPictureWZ*>(getControl(QUICK_NUMBER_BOTTOM_LINE));
assert(numbers_of_bottom_line_);
#endif //_NA_000000_20130114_RENEWER_UI
background_of_single_slot_ =
static_cast<CCtrlPictureWZ*>(getControl(QUICK_BACKGROUND_SINGLE));
assert(background_of_single_slot_);
background_of_double_slot_ =
static_cast<CCtrlPictureWZ*>(getControl(QUICK_BACKGROUND_DOUBLE));
assert(background_of_double_slot_);
BYTE result_val = CGameOption::Instance()->GetQuickSlotSize();
if (result_val == 1)
{
double_size_ = false;
}
else
{
double_size_ = true;
}
ChangeSlotLine(double_size_);
result_val = CGameOption::Instance()->GetQuickSlotIndex();
SetCurQuickSlot(result_val);
#ifdef _NA_000000_20130114_RENEWER_UI
#else
if (numbers_of_bottom_line_ != NULL)
{
numbers_of_bottom_line_->ShowWindowWZ(WZ_HIDE);
}
if (numbers_of_bottom_line_ != NULL)
{
rectangles_[RECTANGEL_OF_UI] = numbers_of_bottom_line_->GetSizeRect();
rectangles_[RECTANGEL_OF_CONTROL] = numbers_of_bottom_line_->GetSize();
format_of_image_control_ = numbers_of_bottom_line_->GetCtrlImageFormat();
if (format_of_image_control_ != NULL)
{
rectangle_of_texture_ = format_of_image_control_->m_sImageState[E_BASE].m_sFRect;
}
else
{
rectangle_of_texture_.fTopX = 0;
rectangle_of_texture_.fTopY = 0;
rectangle_of_texture_.fWidth = 0;
rectangle_of_texture_.fHeight = 0;
assert(!("can not get image control format"));
}
}
#endif //_NA_000000_20130114_RENEWER_UI
#ifdef _NA_000000_20130114_RENEWER_UI
CCtrlPictureWZ* exp_line_Max =
static_cast<CCtrlPictureWZ*>(getControl(QUICK_PICTURE_EXPP002));
if(exp_line_Max)
{
exp_line_Max->ShowWindowWZ(WZ_HIDE);
}
exp_line_ =
static_cast<CCtrlPictureWZ*>(getControl(QUICK_PICTURE_EXPP000));
exp_gauge_size = 0;
if (exp_line_)
{
exp_gauge_size = (float)exp_line_->GetSize().right;
}
Text_EXP_Info_ =
static_cast<CCtrlStaticWZ*>(getControl(QUICK_STATIC_TEXT009));
#endif
is_item_move_ = false;
}
//----------------------------------------------------------------------------
/**
*/
void QuickContainer::ChangeSlotLine(bool double_size)
{
if (background_of_single_slot_ == NULL || background_of_double_slot_ == NULL ||
button_of_double_ == NULL || button_of_single_ == NULL)
{
return;
}
if (double_size_ == true)
{
#ifdef _NA_000000_20130114_RENEWER_UI
background_of_single_slot_->ShowWindowWZ(WZ_SHOW);
#else
background_of_single_slot_->ShowWindowWZ(WZ_HIDE);
#endif
background_of_double_slot_->ShowWindowWZ(WZ_SHOW);
button_of_double_->ShowWindowWZ(WZ_HIDE);
button_of_single_->ShowWindowWZ(WZ_SHOW);
CGameOption::Instance()->SetQuickSlotSize(2);
}
else
{
background_of_single_slot_->ShowWindowWZ(WZ_SHOW);
background_of_double_slot_->ShowWindowWZ(WZ_HIDE);
button_of_double_->ShowWindowWZ(WZ_SHOW);
button_of_single_->ShowWindowWZ(WZ_HIDE);
CGameOption::Instance()->SetQuickSlotSize(1);
}
UpdateDialogSize();
}
//----------------------------------------------------------------------------
/**
*/
VOID
QuickContainer::InitItemRender()
{
// 임시
if (m_pItemUnitRenderer)
{
SAFE_RELEASENDELETE( m_pItemUnitRenderer );
}
m_pItemUnitRenderer = new ItemUnitRenderer;
m_pItemUnitRenderer->Init( g_pSunRenderer, GetMaxSlotNum() );
m_pItemUnitRenderer->ShowCooldown(TRUE);
}
//----------------------------------------------------------------------------
/**
*/
BOOL
QuickContainer::IsExistSameSerialItem(DBSERIAL Serial)
{
for (int i = 0; i < GetMaxSlotNum(); ++i)
{
if (IsEmpty(i))
{
continue;
}
QuickSlot & rQuickSlot = (QuickSlot &)GetSlot(i);
if ( rQuickSlot.GetOrgSerial() == Serial )
{
return TRUE;
}
}
return FALSE;
}
//----------------------------------------------------------------------------
/**
*/
BOOL
QuickContainer::IsExistSameCodeItem( CODETYPE Code )
{
for (int i = 0; i < GetMaxSlotNum(); ++i)
{
if (IsEmpty(i))
{
continue;
}
QuickSlot & rQuickSlot = (QuickSlot &) GetSlot(i);
if ( rQuickSlot.GetOrgCode() == Code )
{
return TRUE;
}
}
return FALSE;
}
//----------------------------------------------------------------------------
/**
*/
POSTYPE
QuickContainer::GetPosByCode( CODETYPE Code , POSTYPE AfterPos /* = 0 */)
{
for (int i = AfterPos; i < GetMaxSlotNum(); ++i)
{
if (IsEmpty(i))
{
continue;
}
QuickSlot & rQuickSlot = (QuickSlot &) GetSlot(i);
if ( rQuickSlot.GetOrgCode() == Code )
{
return i;
}
}
return QUICK_SLOT_NULL_VALUE;
}
//----------------------------------------------------------------------------
/**
*/
RC::eSLOT_INSERT_RESULT QuickContainer::InsertSlot( POSTYPE AtPos, SCSlot & rSlot )
{
if (AtPos > QUICK_SLOT_MAX)
{
return RC::RC_INSERT_SLOT_FAILED;
}
RC::eSLOT_INSERT_RESULT eInsertSlotResult = QuickSlotContainer::InsertSlot( AtPos, rSlot );
//QuickSlot & rQuickSlot = (QuickSlot & )GetSlot(AtPos));
QuickSlot & rQuickSlot = (QuickSlot & )QuickSlotContainer::GetSlot(AtPos);
CControlWZ * pCtrl = getControl( GetRelativeSlotPos(AtPos) );
if(!pCtrl)
return RC::RC_INSERT_SLOT_FAILED;
RECT rect = pCtrl->GetSizeRect();
assert( ST_QUICK == rSlot.GetSlotType() );
DBSERIAL Serial = g_SlotKeyGenerator.GetKey();
assert(Serial);
rQuickSlot.SetOrgSerial( Serial );
if(m_pItemUnitRenderer)
{
// 3D 모델링 Render
m_pItemUnitRenderer->AddItemUnit(
rQuickSlot.GetSerial(),
rQuickSlot.GetOrgCode(),
&rect,
&rQuickSlot ,pCtrl);
}
else
{
assert(m_pItemUnitRenderer);
}
return eInsertSlotResult;
}
//----------------------------------------------------------------------------
/**
*/
VOID
QuickContainer::getControlPos( POSTYPE AtPos, RECT & rectOut )
{
CControlWZ * pCtrl = getControl( AtPos );
rectOut = pCtrl->GetSizeRect();
}
//----------------------------------------------------------------------------
/**
*/
BOOL
QuickContainer::DeleteSlot( POSTYPE AtPos, SCSlot * pSlotOut )
{
// 소스 퀵 포지션 초기화
QuickSlot & rSlot = (QuickSlot &)GetSlot(AtPos);
if (rSlot.GetOrgSerial())
{
g_SlotKeyGenerator.Restore((DWORD)rSlot.GetOrgSerial() );
if(m_pItemUnitRenderer)
{
m_pItemUnitRenderer->RemoveItemUnit( rSlot.GetOrgSerial() );
}
else
{
assert(m_pItemUnitRenderer);
}
}
return QuickSlotContainer::DeleteSlot( AtPos, pSlotOut );
}
//----------------------------------------------------------------------------
/**
*/
CControlWZ *
QuickContainer::getControl( POSTYPE AtPos )
{
assert( AtPos < QUICK_MAX );
return GetControlWZ( m_wzId[ AtPos % QUICK_MAX ] );
}
//----------------------------------------------------------------------------
/**
*/
POSTYPE
QuickContainer::getCtrlIDToPos( WzID wzId )
{
for( POSTYPE i = 0 ; i < QUICK_MAX ; ++i )
{
if( m_wzId[i] == wzId )
{
return i % QUICK_MAX;
}
}
return QUICK_MAX;
}
//----------------------------------------------------------------------------
/**
*/
ItemUnitRenderer *
QuickContainer::GetItemUnitRender() const
{
return m_pItemUnitRenderer;
}
//----------------------------------------------------------------------------
/**
*/
VOID
QuickContainer::MessageProc( SI_MESSAGE * pMessage )
{
switch( pMessage->eResultMsg )
{
case RT_MSG_LBUTTONCLICK:
{
POSTYPE pos = getCtrlIDToPos( pMessage->dwCtrlID );
if( pos >= QUICK_BT00 && pos < QUICK_SLOT_MAX )
{
CControlWZ * pControl = getControl(pos);
assert(pControl);
if(pControl)
{
RECT rcSlot = pControl->GetSizeRect();
MouseHandler::Instance()->ItemTransaction(SI_QUICK, GetRealSlotPos(pos), &rcSlot);
}
}
else
{
switch (pos)
{
case QUICK_UPBT:
{
double_size_ = true;
ChangeSlotLine(double_size_);
ReFreshRenderSlot();
uiChatMan* puiChatMap = GET_DIALOG_MANAGER(uiChatMan, UIMAN_CHAT);
if (puiChatMap != NULL)
{
puiChatMap->MoveChatDialog(2);
}
uiSkillQueueMan* ui_skill_queue_manager_ptr =
GET_DIALOG_MANAGER(uiSkillQueueMan, UIMAN_SKILLQUEUE);
if (ui_skill_queue_manager_ptr != NULL)
{
ui_skill_queue_manager_ptr->MoveSkillQueueDialog(2);
}
uiSummonTargetMan* ui_summon_target_manager_ptr =
GET_DIALOG_MANAGER(uiSummonTargetMan, UIMAN_SUMMONTARGET);
if (ui_summon_target_manager_ptr != NULL)
{
ui_summon_target_manager_ptr->MoveSummonTargetDialog(2);
}
#ifdef _NA_000000_20130521_NOT_SUMMON_SKILL
#else
uiSummonSkillMan* ui_summon_manager_ptr =
GET_DIALOG_MANAGER(uiSummonSkillMan, UIMAN_SUMMONSKILL);
if (ui_summon_manager_ptr != NULL)
{
ui_summon_manager_ptr->MoveSummonSkillDialog(2);
}
#endif
}
break;
case QUICK_DNBT:
{
double_size_ = false;
ChangeSlotLine(double_size_);
ReFreshRenderSlot();
uiChatMan* puiChatMap = GET_DIALOG_MANAGER(uiChatMan, UIMAN_CHAT);
if (puiChatMap != NULL)
{
puiChatMap->MoveChatDialog(1);
}
uiSkillQueueMan* ui_skill_queue_manager_ptr =
GET_DIALOG_MANAGER(uiSkillQueueMan, UIMAN_SKILLQUEUE);
if (ui_skill_queue_manager_ptr != NULL)
{
ui_skill_queue_manager_ptr->MoveSkillQueueDialog(1);
}
uiSummonTargetMan* ui_summon_target_manager_ptr =
GET_DIALOG_MANAGER(uiSummonTargetMan, UIMAN_SUMMONTARGET);
if (ui_summon_target_manager_ptr != NULL)
{
ui_summon_target_manager_ptr->MoveSummonTargetDialog(1);
}
#ifdef _NA_000000_20130521_NOT_SUMMON_SKILL
#else
uiSummonSkillMan* ui_summon_manager_ptr =
GET_DIALOG_MANAGER(uiSummonSkillMan, UIMAN_SUMMONSKILL);
if (ui_summon_manager_ptr != NULL)
{
ui_summon_manager_ptr->MoveSummonSkillDialog(1);
}
#endif
}
break;
case QUICK_CHANGE_SLOT:
{
ToggleSlot();
}
break;
}
}
}
break;
//case RT_MSG_RBUTTONCLICK:
case RT_MSG_RBUTTONDOWN: // 애니메이션 동작시 Click 메시지가 들어오지 않는 버그가 있어서 down으로 변경
{
POSTYPE pos = getCtrlIDToPos( pMessage->dwCtrlID );
if( pos > QUICK_SLOT_MAX ) return;
CControlWZ * pControl = getControl(pos);
assert(pControl);
if(pControl)
{
MouseHandler::Instance()->ItemUseTransaction(SI_QUICK, pos);
}
}
break;
default:
{
SolarDialog::MessageProc( pMessage );
}
break;
}
}
//----------------------------------------------------------------------------
/**
*/
VOID
QuickContainer::MouseOver_MsgProc( SI_MESSAGE * pMessage )
{
switch( pMessage->eResultMsg )
{
case RT_MSG_MOUSEOVER:
{
POSTYPE pos = getCtrlIDToPos( pMessage->dwCtrlID );
POSTYPE RelativePos = GetRealSlotPos(pos);
if (pos >= 0 && pos < QUICK_SLOT_MAX)
{
if (!IsEmpty( RelativePos ))
{
SCSlot & rSlot = GetSlot( RelativePos );
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_SLOT;
m_MouseOverObject.pSlot = &rSlot;
}
else
{
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX;
}
}
else
{
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX;
}
}
break;
}
}
//----------------------------------------------------------------------------
/**
*/
VOID
QuickContainer::NetworkProc( MSG_BASE * pMsg )
{
}
//----------------------------------------------------------------------------
/**
*/
VOID
QuickContainer::OnShowWindow(BOOL val)
{
if (val)
{
this->ReFreshRenderSlot();
}
else
{
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX;
}
}
// 실제 슬롯정보관련한 위치
POSTYPE QuickContainer::GetRealSlotPos( POSTYPE pos )
{
if (double_size_)
{
if (m_TabNum == 0)
{
return (pos + m_TabNum);
}
else
{
return ((pos+QUICK_SLOT_HALF) % QUICK_SLOT_MAX);
}
}
return ((pos + m_TabNum) % QUICK_SLOT_MAX);
}
// 인터페이스 컨트롤 위치.
POSTYPE QuickContainer::GetRelativeSlotPos(POSTYPE pos)
{
if(double_size_)
{
if(m_TabNum == 0)
{
return (pos % QUICK_SLOT_MAX);
}
else
{
return ((pos+QUICK_SLOT_HALF) % QUICK_SLOT_MAX);
}
}
else
{
return pos%QUICK_SLOT_HALF;
}
}
VOID QuickContainer::FlushUnitDraw()
{
if (!m_pItemUnitRenderer)
{
return;
}
m_pItemUnitRenderer->FlushUnitDraw();
QuickSlot FromSlot;
for (int i = 0; i < GetMaxSlotNum(); i++)
{
if( !IsEmpty(i) )
DeleteSlot(i, NULL);
}
}
VOID QuickContainer::ReFreshRenderSlot()
{
ItemUnitRenderer::RenderUnit * pRender = NULL;
RECT rcSlot;
CControlWZ * pCtrl = NULL;
int end_of_quick_slot = QUICK_SLOT_HALF;
int start_of_quick_slot = 0;
if (double_size_)
{
end_of_quick_slot = QUICK_SLOT_MAX;
}
else
{
end_of_quick_slot = QUICK_SLOT_HALF;
}
for (int i = 0; i < GetMaxSlotNum(); i++)//real
{
if (double_size_ == true)
{
start_of_quick_slot = 0;
end_of_quick_slot = QUICK_SLOT_MAX;
}
else
{
start_of_quick_slot = m_TabNum;
end_of_quick_slot = end_of_quick_slot+m_TabNum;
}
QuickSlot & rQuickSlot = (QuickSlot &)SCSlotContainer::GetSlot(i);
if (!IsEmpty(i))
{
if (i >= start_of_quick_slot && i < end_of_quick_slot)
{
if(!m_pItemUnitRenderer)
continue;
// 보여줘야할 목록
rcSlot = getControl(GetRelativeSlotPos(i))->GetSizeRect();
pCtrl = getControl(GetRelativeSlotPos(i));
m_pItemUnitRenderer->ChangePositionItemUnit(rQuickSlot.GetOrgSerial(), &rcSlot, pCtrl);
pRender = m_pItemUnitRenderer->GetItemUnit( rQuickSlot.GetOrgSerial() );
if (!pRender )
{
pCtrl = getControl( GetRelativeSlotPos(i) );
if(pCtrl)
{
rcSlot = pCtrl->GetSizeRect();
m_pItemUnitRenderer->AddItemUnit(
rQuickSlot.GetOrgSerial(),
rQuickSlot.GetOrgCode(),
&rcSlot,
rQuickSlot.GetOrgSlot() ,pCtrl);
}
}
if (pRender &&
pRender != MouseHandler::Instance()->GetMouseItem()->m_pRenderUnit)
{
pRender->SetState(rQuickSlot.GetStatus());
pRender->SetShow(TRUE);
}
}
else
{
if(!m_pItemUnitRenderer)
continue;
// 보여지지 말아야 할 목록
pRender = m_pItemUnitRenderer->GetItemUnit( rQuickSlot.GetOrgSerial() );
if (!pRender )
{
pCtrl = getControl( GetRelativeSlotPos(i) );
if(pCtrl)
{
rcSlot = pCtrl->GetSizeRect();
m_pItemUnitRenderer->AddItemUnit(
rQuickSlot.GetOrgSerial(),
rQuickSlot.GetOrgCode(),
&rcSlot,
rQuickSlot.GetOrgSlot() ,pCtrl);
}
}
if (pRender)
pRender->SetShow(FALSE);
}
}
}
}
void QuickContainer::SetCurQuickSlot(int iIndex)
{
if(iIndex != -1)
m_TabIndex = iIndex;
m_TabNum = m_TabIndex * QUICK_SLOT_HALF;
CGameOption::Instance()->SetQuickSlotIndex(iIndex);
this->ReFreshRenderSlot();
}
void QuickContainer::UpdateDialogSize()
{
RECT DialogRect;
GetDialogWZ()->GetClientRect(&DialogRect);
RECT rcDisableRect = {DialogRect.left, DialogRect.top,
DialogRect.right, DialogRect.bottom}; // 무효화 영역
if(double_size_ == true)// 두줄
{
if(background_of_double_slot_ != NULL)
{
rcDisableRect.bottom = background_of_double_slot_->GetSizeRect().top;
DialogRect.top = background_of_double_slot_->GetSizeRect().top;
}
}
else
{
if(background_of_single_slot_ != NULL)
{
CControlWZ* pControl = getControl(QUICK_BT20);
rcDisableRect.bottom = pControl->GetSizeRect().bottom;
DialogRect.top = background_of_single_slot_->GetSizeRect().top;
}
}
DisableInterSectRect(rcDisableRect);
//this->GetDialogWZ()->SetDlgPartSizeRect(DialogRect);
}
void QuickContainer::ToggleSlot()
{
if(m_TabIndex == 0)
{
SetCurQuickSlot(1);
}
else
{
SetCurQuickSlot(0);
}
}
void QuickContainer::ToggleChangeSlotSize()
{
uiChatMan* puiChatMap = GET_DIALOG_MANAGER(uiChatMan, UIMAN_CHAT);
uiSkillQueueMan* ui_skill_queue_manager_ptr =
GET_DIALOG_MANAGER(uiSkillQueueMan, UIMAN_SKILLQUEUE);
uiSummonTargetMan* ui_summon_target_manager_ptr =
GET_DIALOG_MANAGER(uiSummonTargetMan, UIMAN_SUMMONTARGET);
uiSummonSkillMan* ui_summon_manager_ptr =
GET_DIALOG_MANAGER(uiSummonSkillMan, UIMAN_SUMMONSKILL);
if (puiChatMap == NULL || ui_skill_queue_manager_ptr == NULL ||
ui_summon_target_manager_ptr == NULL || ui_summon_manager_ptr == NULL)
{
return;
}
if (double_size_ == true)
{
double_size_ = false;
puiChatMap->MoveChatDialog(1);
ui_skill_queue_manager_ptr->MoveSkillQueueDialog(1);
ui_summon_target_manager_ptr->MoveSummonTargetDialog(1);
#ifdef _NA_000000_20130521_NOT_SUMMON_SKILL
#else
ui_summon_manager_ptr->MoveSummonSkillDialog(1);
#endif
}
else
{
double_size_ = true;
puiChatMap->MoveChatDialog(2);
ui_skill_queue_manager_ptr->MoveSkillQueueDialog(2);
ui_summon_target_manager_ptr->MoveSummonTargetDialog(2);
#ifdef _NA_000000_20130521_NOT_SUMMON_SKILL
#else
ui_summon_manager_ptr->MoveSummonSkillDialog(2);
#endif
}
ChangeSlotLine(double_size_);
ReFreshRenderSlot();
}
VOID
QuickContainer::PrevQuickTab()
{
m_TabIndex = ((m_TabIndex) > 0)? --m_TabIndex : 0;
SetCurQuickSlot();
}
VOID
QuickContainer::NextQuickTab()
{
m_TabIndex = (++m_TabIndex > 3)? 3 : m_TabIndex;
SetCurQuickSlot();
}
void QuickContainer::ProcessToolTip(bool bMouseOver, int tooltip_string_code)
{
if (!bMouseOver)
{
tooltip_string_code = 0;
m_MouseOverObject.eMouseOverType = eMOUSE_OVER_MAX;
return;
}
else
{
if ( this->m_MouseOverObject.eMouseOverType != eMOUSE_OVER_MAX)
{
if ( eMOUSE_OVER_SLOT == m_MouseOverObject.eMouseOverType )
{
uiToolTipMan* pUIMan = (uiToolTipMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_TOOLTIP);
if(pUIMan)
{
pUIMan->RegisterSlotInfoTooltip(m_MouseOverObject.pSlot);
pUIMan->SetTooltipDialogID(GetDialogKey());
}
CursorChangeTransact::Instance()->ChangeTranaction( MouseCursor::eMouseCursor_Cursor_Cancle );
}
}
if(tooltip_string_code > 0)
{
uiToolTipMan* pUIMan = GET_DIALOG_MANAGER(uiToolTipMan, UIMAN_TOOLTIP);
if(pUIMan)
{
pUIMan->RegisterTooltipWithStringCode(tooltip_string_code);
pUIMan->SetTooltipDialogID(GetDialogKey());
}
}
}
}
void QuickContainer::UpdateEquip(SLOTIDX slot_index_prev, POSTYPE inven_pos_prev, SLOTCODE slot_code_prev,
SLOTIDX slot_index_next, POSTYPE inven_pos_next, SLOTCODE slot_code_next)// 인벤토리 갱신 때 찾아서 있으면 위치 갱신
{
if (slot_index_prev == slot_index_next &&
inven_pos_prev == inven_pos_next &&
slot_code_prev == slot_code_next)
{
return;
}
#if SOLAR_HASH_TABLE_VERSION >= 0x0200
ulong quick_slot_key = MakeQuickKey(slot_index_prev, inven_pos_prev, slot_code_prev);
QuickLinkTable::_Paircc ranges = quick_link_table_->equal_range(quick_slot_key);
if (ranges.first == ranges.second) {
return;
};
SCSlot& change_slot = g_pHero->GetSlotContainer(slot_index_next)->GetSlot(inven_pos_next);
for (; ranges.first != ranges.second; ++ranges.first)
{
QuickSlot* quick_slot = static_cast<QuickSlot*>(ranges.first->second);
quick_slot->SetOrgSlot(&change_slot);
};
#else
m_pItemHashTable->SetBucketFirst(MakeQuickKey(slot_index_prev, inven_pos_prev, slot_code_prev));
while (QuickSlot* quick_slot = (QuickSlot*)m_pItemHashTable->GetBucketNext())
{
SCSlot& change_slot = g_pHero->GetSlotContainer(slot_index_next)->GetSlot(inven_pos_next);
quick_slot->SetOrgSlot(&change_slot);
}
#endif
}
void QuickContainer::MoveDefaultWindowPos()
{
SolarDialog::MoveDefaultWindowPos();
ChangeSlotLine(double_size_);
ReFreshRenderSlot();
}
#ifdef _NA_000000_20130114_RENEWER_UI
VOID QuickContainer::SetHeroExp( float fPercent )
{
CControlWZ* ctl = getControl(QUICK_PICTURE_EXPP000);
assert( ctl );
CCtrlPictureWZ* exp_line_Max =
static_cast<CCtrlPictureWZ*>(getControl(QUICK_PICTURE_EXPP002));
if (exp_line_Max)
{
if ((g_pHero != NULL) &&
(GameOptionParser::Instance()->GetMaxLevelChangeOfClass1st() == g_pHero->GetLevel()))
{
exp_line_Max->ShowWindowWZ(WZ_SHOW);
}
else
{
exp_line_Max->ShowWindowWZ(WZ_HIDE);
}
}
if( !ctl )
{
return;
}
assert( fPercent <= 100 );
if (fPercent >= 100.0f)
{
fPercent = 100.0f;
}
if (fPercent < 0.0f)
{
fPercent = 0.0f;
}
RECT rect;
rect = ctl->GetSizeRect();
float width ;
float height = (float)ctl->GetSize().bottom;
if (exp_gauge_size >= 0.0f )
{
width = (exp_gauge_size/100.f) * fPercent;
ctl->GetCtrlImageFormat()->m_sImageState->m_sFRect.fHeight =height;
if(width>0.f)
{
ctl->GetCtrlImageFormat()->m_sImageState->m_sFRect.fWidth =width;
}
else
{
ctl->GetCtrlImageFormat()->m_sImageState->m_sFRect.fWidth =0.1f;
}
ctl->MoveWindowWZ( (float)rect.left, (float)rect.top, width, height );
}
if(Text_EXP_Info_)
{
float fExpPercent = CalculateExp();
Sprintf(m_szRenderInfo, _T("%.2f%%"), fExpPercent);
Text_EXP_Info_->SetTextWZA(m_szRenderInfo);
}
}
void QuickContainer::RenderText()
{
DWORD dwCurVal=0;
DWORD dwMaxVal=0;
RECT rc;
POINT pt;
if(Text_EXP_Info_)
{
float fExpPercent = CalculateExp();
//exp소수점 앞자리 그리기
rc = Text_EXP_Info_->GetSizeRect();
pt =g_InterfaceManager.RenderDrawNumber(rc,(int)fExpPercent,Text_EXP_Info_->GetCtrlStyle());
pt.x-=1;
pt = g_InterfaceManager.RenderDrawSign(pt,eIMG_DOT);
rc.left=pt.x;
rc.top=pt.y;
int arFraction[2];
char szTemp[2]={0,};
float fMinor = (fExpPercent-(int)(fExpPercent))*100.f;
Sprintf(m_szRenderInfo, _T("%02f"), fMinor);
//소수점 뒷자리 두개값얻기
szTemp[0] = m_szRenderInfo[0];
if(fMinor<10.f)
{
arFraction[0]=0;
arFraction[1]=atoi(&szTemp[0]);
}
else
{
arFraction[0]=atoi(&szTemp[0]);
arFraction[1]=atoi(&m_szRenderInfo[1]);
}
//exp소수점 뒷자리 랜더링(2자리만 그림)
for(int i=0;i<2;++i)
{
pt = g_InterfaceManager.RenderDrawNumber(rc,arFraction[i],DT_LEFT | DT_TOP);
rc.left=pt.x;
rc.top=pt.y;
}
g_InterfaceManager.RenderDrawSign(pt,eIMG_PERCENT);
}
}
#endif