client/EterPythonLib/PythonSlotWindow.cpp

1443 lines
33 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "../eterBase/CRC32.h"
#include "../eterBase/Filename.h"
#include "PythonWindow.h"
#include "PythonSlotWindow.h"
//#define __RENDER_SLOT_AREA__
using namespace UI;
class UI::CSlotWindow::CSlotButton : public CButton
{
public:
enum ESlotButtonType
{
SLOT_BUTTON_TYPE_PLUS,
SLOT_BUTTON_TYPE_COVER,
};
public:
CSlotButton(ESlotButtonType dwType, DWORD dwSlotNumber, CSlotWindow * pParent) : CButton(NULL)
{
m_dwSlotButtonType = dwType;
m_dwSlotNumber = dwSlotNumber;
m_pParent = pParent;
}
virtual ~CSlotButton()
{
}
BOOL OnMouseLeftButtonDown()
{
if (!IsEnable())
return TRUE;
if (UI::CWindowManager::Instance().IsAttaching())
return TRUE;
m_isPressed = TRUE;
Down();
return TRUE;
}
BOOL OnMouseLeftButtonUp()
{
if (!IsEnable())
return TRUE;
if (!IsPressed())
return TRUE;
if (IsIn())
SetCurrentVisual(&m_overVisual);
else
SetCurrentVisual(&m_upVisual);
m_pParent->OnPressedSlotButton(m_dwSlotButtonType, m_dwSlotNumber);
return TRUE;
}
void OnMouseOverIn()
{
if (IsEnable())
{
SetCurrentVisual(&m_overVisual);
}
m_pParent->OnOverInItem(m_dwSlotNumber);
}
void OnMouseOverOut()
{
if (IsEnable())
{
SetUp();
SetCurrentVisual(&m_upVisual);
}
m_pParent->OnOverOutItem();
}
protected:
ESlotButtonType m_dwSlotButtonType;
DWORD m_dwSlotNumber;
CSlotWindow * m_pParent;
};
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
class UI::CSlotWindow::CCoverButton : public CSlotButton
{
public:
CCoverButton(ESlotButtonType dwType, DWORD dwSlotNumber, CSlotWindow * pParent) : CSlotButton(dwType, dwSlotNumber, pParent)
{
m_bLeftButtonEnable = TRUE;
m_bRightButtonEnable = TRUE;
}
virtual ~CCoverButton()
{
}
void SetLeftButtonEnable(BOOL bEnable)
{
m_bLeftButtonEnable = bEnable;
}
void SetRightButtonEnable(BOOL bEnable)
{
m_bRightButtonEnable = bEnable;
}
void OnRender()
{
}
void RenderButton()
{
CButton::OnRender();
}
BOOL OnMouseLeftButtonDown()
{
if (!IsEnable())
return TRUE;
if (m_bLeftButtonEnable)
{
CButton::OnMouseLeftButtonDown();
}
else
{
m_pParent->OnMouseLeftButtonDown();
}
return TRUE;
}
BOOL OnMouseLeftButtonUp()
{
if (!IsEnable())
return TRUE;
if (m_bLeftButtonEnable)
{
CButton::OnMouseLeftButtonUp();
m_pParent->OnMouseLeftButtonDown();
}
else
{
m_pParent->OnMouseLeftButtonUp();
}
return TRUE;
}
BOOL OnMouseRightButtonDown()
{
if (!IsEnable())
return TRUE;
if (m_bRightButtonEnable)
CButton::OnMouseLeftButtonDown();
return TRUE;
}
BOOL OnMouseRightButtonUp()
{
if (!IsEnable())
return TRUE;
m_pParent->OnMouseRightButtonDown();
if (m_bRightButtonEnable)
CButton::OnMouseLeftButtonUp();
return TRUE;
}
protected:
BOOL m_bLeftButtonEnable;
BOOL m_bRightButtonEnable;
};
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
class UI::CSlotWindow::CCoolTimeFinishEffect : public CAniImageBox
{
public:
CCoolTimeFinishEffect(CSlotWindow * pParent, DWORD dwSlotIndex) : CAniImageBox(NULL)
{
m_pParent = pParent;
m_dwSlotIndex = dwSlotIndex;
}
virtual ~CCoolTimeFinishEffect()
{
}
void OnEndFrame()
{
((CSlotWindow *)m_pParent)->ReserveDestroyCoolTimeFinishEffect(m_dwSlotIndex);
}
protected:
DWORD m_dwSlotIndex;
};
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
// Set & Append
void CSlotWindow::SetSlotType(DWORD dwType)
{
m_dwSlotType = dwType;
}
void CSlotWindow::SetSlotStyle(DWORD dwStyle)
{
m_dwSlotStyle = dwStyle;
}
void CSlotWindow::AppendSlot(DWORD dwIndex, int ixPosition, int iyPosition, int ixCellSize, int iyCellSize)
{
TSlot Slot;
Slot.pInstance = NULL;
Slot.pNumberLine = NULL;
Slot.pCoverButton = NULL;
Slot.pSlotButton = NULL;
Slot.pSignImage = NULL;
Slot.pFinishCoolTimeEffect = NULL;
ClearSlot(&Slot);
Slot.dwSlotNumber = dwIndex;
Slot.dwCenterSlotNumber = dwIndex;
Slot.ixPosition = ixPosition;
Slot.iyPosition = iyPosition;
Slot.ixCellSize = ixCellSize;
Slot.iyCellSize = iyCellSize;
m_SlotList.push_back(Slot);
}
void CSlotWindow::SetCoverButton(DWORD dwIndex, const char * c_szUpImageName, const char * c_szOverImageName, const char * c_szDownImageName, const char * c_szDisableImageName, BOOL bLeftButtonEnable, BOOL bRightButtonEnable)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
CCoverButton *& rpCoverButton = pSlot->pCoverButton;
if (!rpCoverButton)
{
rpCoverButton = new CCoverButton(CSlotButton::SLOT_BUTTON_TYPE_COVER, pSlot->dwSlotNumber, this);
CWindowManager::Instance().SetParent(rpCoverButton, this);
}
rpCoverButton->SetLeftButtonEnable(bLeftButtonEnable);
rpCoverButton->SetRightButtonEnable(bRightButtonEnable);
rpCoverButton->SetUpVisual(c_szUpImageName);
rpCoverButton->SetOverVisual(c_szOverImageName);
rpCoverButton->SetDownVisual(c_szDownImageName);
rpCoverButton->SetDisableVisual(c_szDisableImageName);
rpCoverButton->Enable();
rpCoverButton->Show();
// NOTE : Cover <20><>ư<EFBFBD><C6B0> Plus <20><>ư<EFBFBD><C6B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20>ڵ带..
if (pSlot->pSlotButton)
{
SetTop(pSlot->pSlotButton);
}
}
void CSlotWindow::EnableCoverButton(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (!pSlot->pCoverButton)
return;
pSlot->pCoverButton->Enable();
}
void CSlotWindow::DisableCoverButton(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (!pSlot->pCoverButton)
return;
pSlot->pCoverButton->Disable();
}
void CSlotWindow::SetAlwaysRenderCoverButton(DWORD dwIndex, bool bAlwaysRender)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (bAlwaysRender)
SET_BIT(pSlot->dwState, SLOT_STATE_ALWAYS_RENDER_COVER);
else
REMOVE_BIT(pSlot->dwState, SLOT_STATE_ALWAYS_RENDER_COVER);
}
void CSlotWindow::ShowSlotBaseImage(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->bRenderBaseSlotImage = true;
}
void CSlotWindow::HideSlotBaseImage(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->bRenderBaseSlotImage = false;
}
BOOL CSlotWindow::IsDisableCoverButton(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return FALSE;
if (!pSlot->pCoverButton)
return FALSE;
return pSlot->pCoverButton->IsDisable();
}
void CSlotWindow::SetSlotBaseImage(const char * c_szFileName, float fr, float fg, float fb, float fa)
{
__CreateBaseImage(c_szFileName, fr, fg, fb, fa);
}
void CSlotWindow::AppendSlotButton(const char * c_szUpImageName, const char * c_szOverImageName, const char * c_szDownImageName)
{
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
CSlotButton *& rpSlotButton = rSlot.pSlotButton;
if (!rpSlotButton)
{
rpSlotButton = new CSlotButton(CSlotButton::SLOT_BUTTON_TYPE_PLUS, rSlot.dwSlotNumber, this);
rpSlotButton->AddFlag(FLAG_FLOAT);
CWindowManager::Instance().SetParent(rpSlotButton, this);
}
rpSlotButton->SetUpVisual(c_szUpImageName);
rpSlotButton->SetOverVisual(c_szOverImageName);
rpSlotButton->SetDownVisual(c_szDownImageName);
rpSlotButton->SetPosition(rSlot.ixPosition + 1, rSlot.iyPosition + 19);
rpSlotButton->Hide();
}
}
void CSlotWindow::AppendRequirementSignImage(const char * c_szImageName)
{
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
CImageBox *& rpSignImage = rSlot.pSignImage;
if (!rpSignImage)
{
rpSignImage = new CImageBox(NULL);
CWindowManager::Instance().SetParent(rpSignImage, this);
}
rpSignImage->LoadImage(c_szImageName);
rpSignImage->Hide();
}
}
BOOL CSlotWindow::HasSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return FALSE;
return TRUE;
}
void CSlotWindow::SetSlot(DWORD dwIndex, DWORD dwVirtualNumber, BYTE byWidth, BYTE byHeight, CGraphicImage * pImage, D3DXCOLOR& diffuseColor)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (pSlot->isItem)
if (pSlot->dwItemIndex == dwVirtualNumber)
{
pSlot->dwState = 0;
pSlot->isItem = TRUE;
if (pImage && pSlot->pInstance)
{
pSlot->pInstance->SetImagePointer(pImage);
}
return;
}
ClearSlot(pSlot);
pSlot->dwState = 0;
pSlot->isItem = TRUE;
pSlot->dwItemIndex = dwVirtualNumber;
if (pImage)
{
assert(NULL == pSlot->pInstance);
pSlot->pInstance = CGraphicImageInstance::New();
pSlot->pInstance->SetDiffuseColor(diffuseColor.r, diffuseColor.g, diffuseColor.b, diffuseColor.a);
pSlot->pInstance->SetImagePointer(pImage);
}
pSlot->byxPlacedItemSize = byWidth;
pSlot->byyPlacedItemSize = byHeight;
if (pSlot->pCoverButton)
{
pSlot->pCoverButton->Show();
}
}
void CSlotWindow::SetSlotCount(DWORD dwIndex, DWORD dwCount)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (dwCount <= 0)
{
if (pSlot->pNumberLine)
{
delete pSlot->pNumberLine;
pSlot->pNumberLine = NULL;
}
}
else
{
char szCount[16+1];
_snprintf(szCount, sizeof(szCount), "%d", dwCount);
if (!pSlot->pNumberLine)
{
CNumberLine * pNumberLine = new UI::CNumberLine(this);
pNumberLine->SetHorizontalAlign(CNumberLine::HORIZONTAL_ALIGN_RIGHT);
pNumberLine->Show();
pSlot->pNumberLine = pNumberLine;
}
pSlot->pNumberLine->SetNumber(szCount);
}
}
void CSlotWindow::SetSlotCountNew(DWORD dwIndex, DWORD dwGrade, DWORD dwCount)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (dwCount <= 0)
{
if (pSlot->pNumberLine)
{
delete pSlot->pNumberLine;
pSlot->pNumberLine = NULL;
}
}
else
{
char szCount[16+1];
switch (dwGrade)
{
case 0:
_snprintf(szCount, sizeof(szCount), "%d", dwCount);
break;
case 1:
_snprintf(szCount, sizeof(szCount), "m%d", dwCount);
break;
case 2:
_snprintf(szCount, sizeof(szCount), "g%d", dwCount);
break;
case 3:
_snprintf(szCount, sizeof(szCount), "p");
break;
}
if (!pSlot->pNumberLine)
{
CNumberLine * pNumberLine = new UI::CNumberLine(this);
pNumberLine->SetHorizontalAlign(CNumberLine::HORIZONTAL_ALIGN_RIGHT);
pNumberLine->Show();
pSlot->pNumberLine = pNumberLine;
}
pSlot->pNumberLine->SetNumber(szCount);
}
}
void CSlotWindow::SetSlotCoolTime(DWORD dwIndex, float fCoolTime, float fElapsedTime)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->fCoolTime = fCoolTime;
pSlot->fStartCoolTime = CTimer::Instance().GetCurrentSecond() - fElapsedTime;
}
void CSlotWindow::ActivateSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->bActive = TRUE;
if (!m_pSlotActiveEffect)
{
__CreateSlotEnableEffect();
}
}
void CSlotWindow::DeactivateSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->bActive = FALSE;
}
void CSlotWindow::ClearSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
ClearSlot(pSlot);
}
void CSlotWindow::ClearSlot(TSlot * pSlot)
{
pSlot->bActive = FALSE;
pSlot->byxPlacedItemSize = 1;
pSlot->byyPlacedItemSize = 1;
pSlot->isItem = FALSE;
pSlot->dwState = 0;
pSlot->fCoolTime = 0.0f;
pSlot->fStartCoolTime = 0.0f;
pSlot->dwCenterSlotNumber = 0xffffffff;
pSlot->dwItemIndex = 0;
pSlot->bRenderBaseSlotImage = true;
if (pSlot->pInstance)
{
CGraphicImageInstance::Delete(pSlot->pInstance);
pSlot->pInstance = NULL;
}
if (pSlot->pCoverButton)
{
pSlot->pCoverButton->Hide();
}
if (pSlot->pSlotButton)
{
pSlot->pSlotButton->Hide();
}
if (pSlot->pSignImage)
{
pSlot->pSignImage->Hide();
}
if (pSlot->pFinishCoolTimeEffect)
{
pSlot->pFinishCoolTimeEffect->Hide();
}
}
void CSlotWindow::ClearAllSlot()
{
Destroy();
}
void CSlotWindow::RefreshSlot()
{
OnRefreshSlot();
// NOTE : Refresh <20>ɶ<EFBFBD> ToolTip <20><> <20><><EFBFBD><EFBFBD> <20>մϴ<D5B4> - [levites]
if (IsRendering())
{
TSlot * pSlot;
if (GetPickedSlotPointer(&pSlot))
{
OnOverOutItem();
OnOverInItem(pSlot->dwSlotNumber);
}
}
}
void CSlotWindow::OnRefreshSlot()
{
}
DWORD CSlotWindow::GetSlotCount()
{
return m_SlotList.size();
}
void CSlotWindow::LockSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->dwState |= SLOT_STATE_LOCK;
}
void CSlotWindow::UnlockSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->dwState ^= SLOT_STATE_LOCK;
}
void CSlotWindow::SetCantUseSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->dwState |= SLOT_STATE_CANT_USE;
}
void CSlotWindow::SetUseSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->dwState ^= SLOT_STATE_CANT_USE;
}
void CSlotWindow::EnableSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
REMOVE_BIT(pSlot->dwState, SLOT_STATE_DISABLE);
//pSlot->dwState |= SLOT_STATE_DISABLE;
}
void CSlotWindow::DisableSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
SET_BIT(pSlot->dwState, SLOT_STATE_DISABLE);
//pSlot->dwState ^= SLOT_STATE_DISABLE;
}
// Select
void CSlotWindow::SelectSlot(DWORD dwSelectingIndex)
{
std::list<DWORD>::iterator itor = m_dwSelectedSlotIndexList.begin();
for (; itor != m_dwSelectedSlotIndexList.end();)
{
if (dwSelectingIndex == *itor)
{
itor = m_dwSelectedSlotIndexList.erase(itor);
return;
}
else
{
++itor;
}
}
TSlot * pSlot;
if (GetSlotPointer(dwSelectingIndex, &pSlot))
{
if (!pSlot->isItem)
return;
m_dwSelectedSlotIndexList.push_back(dwSelectingIndex);
}
}
BOOL CSlotWindow::isSelectedSlot(DWORD dwIndex)
{
std::list<DWORD>::iterator itor = m_dwSelectedSlotIndexList.begin();
for (; itor != m_dwSelectedSlotIndexList.end(); ++itor)
{
if (dwIndex == *itor)
return TRUE;
}
return FALSE;
}
void CSlotWindow::ClearSelected()
{
m_dwSelectedSlotIndexList.clear();
}
DWORD CSlotWindow::GetSelectedSlotCount()
{
return m_dwSelectedSlotIndexList.size();
}
DWORD CSlotWindow::GetSelectedSlotNumber(DWORD dwIndex)
{
if (dwIndex >= m_dwSelectedSlotIndexList.size())
return DWORD(-1);
DWORD dwCount = 0;
std::list<DWORD>::iterator itor = m_dwSelectedSlotIndexList.begin();
for (; itor != m_dwSelectedSlotIndexList.end(); ++itor)
{
if (dwIndex == dwCount)
break;
++dwCount;
}
return *itor;
}
void CSlotWindow::ShowSlotButton(DWORD dwSlotNumber)
{
TSlot * pSlot;
if (!GetSlotPointer(dwSlotNumber, &pSlot))
return;
if (pSlot->pSlotButton)
{
pSlot->pSlotButton->Show();
}
}
void CSlotWindow::HideAllSlotButton()
{
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (rSlot.pSlotButton)
{
rSlot.pSlotButton->Hide();
}
}
}
void CSlotWindow::ShowRequirementSign(DWORD dwSlotNumber)
{
TSlot * pSlot;
if (!GetSlotPointer(dwSlotNumber, &pSlot))
return;
if (!pSlot->pSignImage)
return;
pSlot->pSignImage->Show();
}
void CSlotWindow::HideRequirementSign(DWORD dwSlotNumber)
{
TSlot * pSlot;
if (!GetSlotPointer(dwSlotNumber, &pSlot))
return;
if (!pSlot->pSignImage)
return;
pSlot->pSignImage->Hide();
}
// Event
BOOL CSlotWindow::OnMouseLeftButtonDown()
{
TSlot * pSlot;
if (!GetPickedSlotPointer(&pSlot))
{
UI::CWindowManager::Instance().DeattachIcon();
return TRUE;
}
if (pSlot->isItem && !(pSlot->dwState & SLOT_STATE_LOCK))
{
OnSelectItemSlot(pSlot->dwSlotNumber);
}
else
{
OnSelectEmptySlot(pSlot->dwSlotNumber);
}
return TRUE;
}
BOOL CSlotWindow::OnMouseLeftButtonUp()
{
if (UI::CWindowManager::Instance().IsAttaching())
if (UI::CWindowManager::Instance().IsDragging())
if (IsIn())
{
UI::CWindow * pWin = UI::CWindowManager::Instance().GetPointWindow();
if (pWin)
if (pWin->IsType(UI::CSlotWindow::Type()))
{
UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin;
TSlot * pSlot;
if (!pSlotWin->GetPickedSlotPointer(&pSlot))
{
UI::CWindowManager::Instance().DeattachIcon();
return TRUE;
}
if (pSlot->isItem)
pSlotWin->OnSelectItemSlot(pSlot->dwSlotNumber);
else
pSlotWin->OnSelectEmptySlot(pSlot->dwSlotNumber);
return TRUE;
}
return FALSE;
}
return FALSE;
}
BOOL CSlotWindow::OnMouseRightButtonDown()
{
TSlot * pSlot;
if (!GetPickedSlotPointer(&pSlot))
return TRUE;
if (pSlot->isItem)
{
OnUnselectItemSlot(pSlot->dwSlotNumber);
}
else
{
OnUnselectEmptySlot(pSlot->dwSlotNumber);
}
return TRUE;
}
BOOL CSlotWindow::OnMouseLeftButtonDoubleClick()
{
OnUseSlot();
return TRUE;
}
void CSlotWindow::OnMouseOverOut()
{
OnOverOutItem();
}
void CSlotWindow::OnMouseOver()
{
// FIXME : <20><><EFBFBD><EFBFBD><EFBFBD><20><EFBFBD><E5B7A1> <20>ϴ<EFBFBD> <20><><EFBFBD>߿<EFBFBD> SetTop<6F><70> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Capture<72><65> Ǯ<><C7AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20>װ<EFBFBD><D7B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>.
// <20><> <20><> <20>ٺ<EFBFBD><D9BA><EFBFBD><EFBFBD><EFBFBD> <20>ذ<EFBFBD>å<EFBFBD><C3A5> ã<>ƾ<EFBFBD> <20><> <20><> - [levites]
// if (UI::CWindowManager::Instance().IsCapture())
// if (!UI::CWindowManager::Instance().IsAttaching())
// return;
CWindow * pPointWindow = UI::CWindowManager::Instance().GetPointWindow();
if (this == pPointWindow)
{
TSlot * pSlot;
if (GetPickedSlotPointer(&pSlot))
{
if (OnOverInItem(pSlot->dwSlotNumber))
return;
}
}
OnOverOutItem();
}
void CSlotWindow::OnSelectEmptySlot(int iSlotNumber)
{
PyCallClassMemberFunc(m_poHandler, "OnSelectEmptySlot", Py_BuildValue("(i)", iSlotNumber));
}
void CSlotWindow::OnSelectItemSlot(int iSlotNumber)
{
// OnOverOutItem();
PyCallClassMemberFunc(m_poHandler, "OnSelectItemSlot", Py_BuildValue("(i)", iSlotNumber));
if (UI::CWindowManager::Instance().IsAttaching())
OnOverOutItem();
}
void CSlotWindow::OnUnselectEmptySlot(int iSlotNumber)
{
PyCallClassMemberFunc(m_poHandler, "OnUnselectEmptySlot", Py_BuildValue("(i)", iSlotNumber));
}
void CSlotWindow::OnUnselectItemSlot(int iSlotNumber)
{
PyCallClassMemberFunc(m_poHandler, "OnUnselectItemSlot", Py_BuildValue("(i)", iSlotNumber));
}
void CSlotWindow::OnUseSlot()
{
TSlot * pSlot;
if (GetPickedSlotPointer(&pSlot))
if (pSlot->isItem)
{
PyCallClassMemberFunc(m_poHandler, "OnUseSlot", Py_BuildValue("(i)", pSlot->dwSlotNumber));
}
}
BOOL CSlotWindow::OnOverInItem(DWORD dwSlotNumber)
{
TSlot * pSlot;
if (!GetSlotPointer(dwSlotNumber, &pSlot))
return FALSE;
if (!pSlot->isItem)
return FALSE;
if (pSlot->dwSlotNumber == m_dwToolTipSlotNumber)
return TRUE;
m_dwToolTipSlotNumber = dwSlotNumber;
PyCallClassMemberFunc(m_poHandler, "OnOverInItem", Py_BuildValue("(i)", dwSlotNumber));
return TRUE;
}
void CSlotWindow::OnOverOutItem()
{
if (SLOT_NUMBER_NONE == m_dwToolTipSlotNumber)
return;
m_dwToolTipSlotNumber = SLOT_NUMBER_NONE;
PyCallClassMemberFunc(m_poHandler, "OnOverOutItem", Py_BuildValue("()"));
}
void CSlotWindow::OnPressedSlotButton(DWORD dwType, DWORD dwSlotNumber, BOOL isLeft)
{
if (CSlotButton::SLOT_BUTTON_TYPE_PLUS == dwType)
{
PyCallClassMemberFunc(m_poHandler, "OnPressedSlotButton", Py_BuildValue("(i)", dwSlotNumber));
}
else if (CSlotButton::SLOT_BUTTON_TYPE_COVER == dwType)
{
if (isLeft)
{
OnMouseLeftButtonDown();
}
}
}
void CSlotWindow::OnUpdate()
{
for (std::deque<DWORD>::iterator itor = m_ReserveDestroyEffectDeque.begin(); itor != m_ReserveDestroyEffectDeque.end(); ++itor)
{
DWORD dwSlotIndex = *itor;
TSlot * pSlot;
if (!GetSlotPointer(dwSlotIndex, &pSlot))
continue;
__DestroyFinishCoolTimeEffect(pSlot);
}
m_ReserveDestroyEffectDeque.clear();
if (m_pSlotActiveEffect)
m_pSlotActiveEffect->Update();
}
void CSlotWindow::OnRender()
{
RenderSlotBaseImage();
switch (m_dwSlotStyle)
{
case SLOT_STYLE_PICK_UP:
OnRenderPickingSlot();
break;
case SLOT_STYLE_SELECT:
OnRenderSelectedSlot();
break;
}
std::for_each(m_pChildList.begin(), m_pChildList.end(), std::void_mem_fun(&CWindow::OnRender));
TSlotListIterator itor;
//
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׸<EFBFBD><D7B8><EFBFBD>
//////////////////////////////////////////////////////////////////////////
#ifdef __RENDER_SLOT_AREA__
CPythonGraphic::Instance().SetDiffuseColor(0.5f, 0.5f, 0.5f);
for (itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
CPythonGraphic::Instance().RenderBox2d(m_rect.left + rSlot.ixPosition,
m_rect.top + rSlot.iyPosition,
m_rect.left + rSlot.ixPosition + rSlot.ixCellSize,
m_rect.top + rSlot.iyPosition + rSlot.iyCellSize);
}
CPythonGraphic::Instance().SetDiffuseColor(1.0f, 0.0f, 0.0f, 1.0f);
CPythonGraphic::Instance().RenderBox2d(m_rect.left, m_rect.top, m_rect.right, m_rect.bottom);
#endif
//////////////////////////////////////////////////////////////////////////
for (itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (rSlot.pSlotButton)
{
rSlot.pSlotButton->SetPosition(rSlot.ixPosition + 1, rSlot.iyPosition + 19);
}
if (rSlot.pSignImage)
{
rSlot.pSignImage->SetPosition(rSlot.ixPosition - 7, rSlot.iyPosition + 10);
}
if (rSlot.pInstance)
{
rSlot.pInstance->SetPosition(m_rect.left + rSlot.ixPosition, m_rect.top + rSlot.iyPosition);
rSlot.pInstance->Render();
}
if (!rSlot.isItem)
{
if (IS_SET(rSlot.dwState, SLOT_STATE_ALWAYS_RENDER_COVER))
{
rSlot.pCoverButton->Show();
rSlot.pCoverButton->SetPosition(rSlot.ixPosition, rSlot.iyPosition);
rSlot.pCoverButton->RenderButton();
}
continue;
}
if (IS_SET(rSlot.dwState, SLOT_STATE_DISABLE))
{
CPythonGraphic::Instance().SetDiffuseColor(1.0f, 0.0f, 0.0f, 0.3f);
CPythonGraphic::Instance().RenderBar2d(m_rect.left + rSlot.ixPosition,
m_rect.top + rSlot.iyPosition,
m_rect.left + rSlot.ixPosition + rSlot.ixCellSize,
m_rect.top + rSlot.iyPosition + rSlot.iyCellSize);
}
if (rSlot.fCoolTime != 0.0f)
{
float fcurTime = CTimer::Instance().GetCurrentSecond();
float fPercentage = (fcurTime - rSlot.fStartCoolTime) / rSlot.fCoolTime;
CPythonGraphic::Instance().RenderCoolTimeBox(m_rect.left + rSlot.ixPosition + 16.0f, m_rect.top + rSlot.iyPosition + 16.0f, 16.0f, fPercentage);
if (fcurTime - rSlot.fStartCoolTime >= rSlot.fCoolTime)
{
// <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31> <20>̳<EFBFBD><CCB3><EFBFBD><EFBFBD><EFBFBD>..
if ((fcurTime - rSlot.fStartCoolTime) - rSlot.fCoolTime < 1.0f)
__CreateFinishCoolTimeEffect(&rSlot);
rSlot.fCoolTime = 0.0f;
rSlot.fStartCoolTime = 0.0f;
}
}
if (rSlot.pCoverButton)
{
rSlot.pCoverButton->SetPosition(rSlot.ixPosition, rSlot.iyPosition);
rSlot.pCoverButton->RenderButton();
}
if (rSlot.pNumberLine)
{
int ix = rSlot.byxPlacedItemSize*ITEM_WIDTH + rSlot.ixPosition - 4;
int iy = rSlot.iyPosition + rSlot.byyPlacedItemSize*ITEM_HEIGHT - 12 + 2;
rSlot.pNumberLine->SetPosition(ix, iy);
rSlot.pNumberLine->Update();
rSlot.pNumberLine->Render();
}
if (rSlot.pFinishCoolTimeEffect)
{
rSlot.pFinishCoolTimeEffect->SetPosition(rSlot.ixPosition, rSlot.iyPosition);
rSlot.pFinishCoolTimeEffect->Update();
rSlot.pFinishCoolTimeEffect->Render();
}
if (rSlot.bActive)
if (m_pSlotActiveEffect)
{
int ix = m_rect.left + rSlot.ixPosition;
int iy = m_rect.top + rSlot.iyPosition;
m_pSlotActiveEffect->SetPosition(ix, iy);
m_pSlotActiveEffect->Render();
}
}
RenderLockedSlot();
}
void CSlotWindow::RenderSlotBaseImage()
{
if (!m_pBaseImageInstance)
return;
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (!rSlot.bRenderBaseSlotImage)
continue;
m_pBaseImageInstance->SetPosition(m_rect.left + rSlot.ixPosition, m_rect.top + rSlot.iyPosition);
m_pBaseImageInstance->Render();
}
}
void CSlotWindow::OnRenderPickingSlot()
{
if (!UI::CWindowManager::Instance().IsAttaching())
return;
TSlot * pSlot;
if (!GetSelectedSlotPointer(&pSlot))
return;
CPythonGraphic::Instance().SetDiffuseColor(1.0f, 1.0f, 1.0f, 0.5f);
CPythonGraphic::Instance().RenderBar2d(m_rect.left + pSlot->ixPosition,
m_rect.top + pSlot->iyPosition,
m_rect.left + pSlot->ixPosition + pSlot->ixCellSize,
m_rect.top + pSlot->iyPosition + pSlot->iyCellSize);
}
void CSlotWindow::OnRenderSelectedSlot()
{
std::list<DWORD>::iterator itor = m_dwSelectedSlotIndexList.begin();
for (; itor != m_dwSelectedSlotIndexList.end(); ++itor)
{
TSlot * pSlot;
if (!GetSlotPointer(*itor, &pSlot))
continue;
CPythonGraphic::Instance().SetDiffuseColor(1.0f, 1.0f, 1.0f, 0.5f);
CPythonGraphic::Instance().RenderBar2d(m_rect.left + pSlot->ixPosition,
m_rect.top + pSlot->iyPosition,
m_rect.left + pSlot->ixPosition + pSlot->ixCellSize,
m_rect.top + pSlot->iyPosition + pSlot->iyCellSize);
}
}
void CSlotWindow::RenderLockedSlot()
{
CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 0.5f);
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (!rSlot.isItem)
continue;
if (rSlot.dwState & SLOT_STATE_LOCK)
{
CPythonGraphic::Instance().RenderBar2d(m_rect.left + rSlot.ixPosition,
m_rect.top + rSlot.iyPosition,
m_rect.left + rSlot.ixPosition + rSlot.ixCellSize,
m_rect.top + rSlot.iyPosition + rSlot.iyCellSize);
}
}
}
// Check Slot
BOOL CSlotWindow::GetSlotPointer(DWORD dwIndex, TSlot ** ppSlot)
{
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (dwIndex == rSlot.dwSlotNumber)
{
*ppSlot = &rSlot;
return TRUE;
}
}
return FALSE;
}
BOOL CSlotWindow::GetSelectedSlotPointer(TSlot ** ppSlot)
{
long lx, ly;
GetMouseLocalPosition(lx, ly);
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (lx >= rSlot.ixPosition)
if (ly >= rSlot.iyPosition)
if (lx <= rSlot.ixPosition + rSlot.ixCellSize)
if (ly <= rSlot.iyPosition + rSlot.iyCellSize)
{
*ppSlot = &rSlot;
return TRUE;
}
}
return FALSE;
}
BOOL CSlotWindow::GetPickedSlotPointer(TSlot ** ppSlot)
{
long lx, ly;
CWindowManager::Instance().GetMousePosition(lx, ly);
int ixLocal = lx - m_rect.left;
int iyLocal = ly - m_rect.top;
// NOTE : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD>
// <20><><EFBFBD>ʷ<EFBFBD> <20>˻<EFBFBD><CBBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> Slot<6F><74> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȴٴ<C8B4> Ư<><C6AF><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF>Ѵ<EFBFBD>. - [levites]
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
int ixCellSize = rSlot.ixCellSize;
int iyCellSize = rSlot.iyCellSize;
// NOTE : Item<65><6D> Hide <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>..
if (rSlot.isItem)
{
ixCellSize = max(rSlot.ixCellSize, int(rSlot.byxPlacedItemSize * ITEM_WIDTH));
iyCellSize = max(rSlot.iyCellSize, int(rSlot.byyPlacedItemSize * ITEM_HEIGHT));
}
if (ixLocal >= rSlot.ixPosition)
if (iyLocal >= rSlot.iyPosition)
if (ixLocal <= rSlot.ixPosition + ixCellSize)
if (iyLocal <= rSlot.iyPosition + iyCellSize)
{
*ppSlot = &rSlot;
return TRUE;
}
}
return FALSE;
}
void CSlotWindow::SetUseMode(BOOL bFlag)
{
m_isUseMode = bFlag;
}
void CSlotWindow::SetUsableItem(BOOL bFlag)
{
m_isUsableItem = bFlag;
}
void CSlotWindow::ReserveDestroyCoolTimeFinishEffect(DWORD dwSlotIndex)
{
m_ReserveDestroyEffectDeque.push_back(dwSlotIndex);
}
DWORD CSlotWindow::Type()
{
static int s_Type = GetCRC32("CSlotWindow", strlen("CSlotWindow"));
return s_Type;
}
BOOL CSlotWindow::OnIsType(DWORD dwType)
{
if (CSlotWindow::Type() == dwType)
return TRUE;
return CWindow::OnIsType(dwType);
}
void CSlotWindow::__CreateToggleSlotImage()
{
__DestroyToggleSlotImage();
m_pToggleSlotImage = new CImageBox(NULL);
m_pToggleSlotImage->LoadImage("d:/ymir work/ui/public/slot_toggle.sub");
m_pToggleSlotImage->Show();
}
void CSlotWindow::__CreateSlotEnableEffect()
{
__DestroySlotEnableEffect();
m_pSlotActiveEffect = new CAniImageBox(NULL);
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/00.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/01.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/02.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/03.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/04.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/05.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/06.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/07.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/08.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/09.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/10.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/11.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/12.sub");
m_pSlotActiveEffect->SetRenderingMode(CGraphicExpandedImageInstance::RENDERING_MODE_SCREEN);
m_pSlotActiveEffect->Show();
}
void CSlotWindow::__CreateFinishCoolTimeEffect(TSlot * pSlot)
{
__DestroyFinishCoolTimeEffect(pSlot);
CAniImageBox * pFinishCoolTimeEffect = new CCoolTimeFinishEffect(this, pSlot->dwSlotNumber);
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/00.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/01.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/02.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/03.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/04.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/05.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/06.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/07.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/08.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/09.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/10.sub");
pFinishCoolTimeEffect->SetRenderingMode(CGraphicExpandedImageInstance::RENDERING_MODE_SCREEN);
pFinishCoolTimeEffect->ResetFrame();
pFinishCoolTimeEffect->SetDelay(2);
pFinishCoolTimeEffect->Show();
pSlot->pFinishCoolTimeEffect = pFinishCoolTimeEffect;
}
void CSlotWindow::__CreateBaseImage(const char * c_szFileName, float fr, float fg, float fb, float fa)
{
__DestroyBaseImage();
CGraphicImage * pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(c_szFileName);
m_pBaseImageInstance = CGraphicImageInstance::New();
m_pBaseImageInstance->SetImagePointer(pImage);
m_pBaseImageInstance->SetDiffuseColor(fr, fg, fb, fa);
}
void CSlotWindow::__DestroyToggleSlotImage()
{
if (m_pToggleSlotImage)
{
delete m_pToggleSlotImage;
m_pToggleSlotImage = NULL;
}
}
void CSlotWindow::__DestroySlotEnableEffect()
{
if (m_pSlotActiveEffect)
{
delete m_pSlotActiveEffect;
m_pSlotActiveEffect = NULL;
}
}
void CSlotWindow::__DestroyFinishCoolTimeEffect(TSlot * pSlot)
{
if (pSlot->pFinishCoolTimeEffect)
{
delete pSlot->pFinishCoolTimeEffect;
pSlot->pFinishCoolTimeEffect = NULL;
}
}
void CSlotWindow::__DestroyBaseImage()
{
if (m_pBaseImageInstance)
{
CGraphicImageInstance::Delete(m_pBaseImageInstance);
m_pBaseImageInstance = NULL;
}
}
void CSlotWindow::__Initialize()
{
m_dwSlotType = 0;
m_dwSlotStyle = SLOT_STYLE_PICK_UP;
m_dwToolTipSlotNumber = SLOT_NUMBER_NONE;
m_isUseMode = FALSE;
m_isUsableItem = FALSE;
m_pToggleSlotImage = NULL;
m_pSlotActiveEffect = NULL;
m_pBaseImageInstance = NULL;
}
void CSlotWindow::Destroy()
{
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
ClearSlot(&rSlot);
if (rSlot.pNumberLine)
{
delete rSlot.pNumberLine;
rSlot.pNumberLine = NULL;
}
if (rSlot.pCoverButton)
{
CWindowManager::Instance().DestroyWindow(rSlot.pCoverButton);
}
if (rSlot.pSlotButton)
{
CWindowManager::Instance().DestroyWindow(rSlot.pSlotButton);
}
if (rSlot.pSignImage)
{
CWindowManager::Instance().DestroyWindow(rSlot.pSignImage);
}
if (rSlot.pFinishCoolTimeEffect)
{
CWindowManager::Instance().DestroyWindow(rSlot.pFinishCoolTimeEffect);
}
}
m_SlotList.clear();
__DestroyToggleSlotImage();
__DestroySlotEnableEffect();
__DestroyBaseImage();
__Initialize();
}
CSlotWindow::CSlotWindow(PyObject * ppyObject) : CWindow(ppyObject)
{
__Initialize();
}
CSlotWindow::~CSlotWindow()
{
Destroy();
}