Files
2026-06-01 12:46:52 +02:00

334 lines
14 KiB
C++

#pragma once
//#include "SUIWnd.h"
#include "ItemInstance.h"
#include "KUIDragAndDrop.h"
#include "KUIControlStatic.h"
#include "KUIControlScroll.h"
#include "KUIControlButton.h"
#include "SUIDisplayInfo.h"
#include "SGameMessage.h"
#include "SDecomposeDB.h"
using std::map;
using std::vector;
using std::string;
namespace nsDecomposeUI
{
typedef struct stControlInfo
{
WORD m_wIndex; // 자신의 UI에서의 인덱스
WORD m_wLineNumber; // 자신의 UI에서의 줄 번호
string m_strIconControl; // 아이콘 컨트롤 이름
string m_strItemNameControl; // 아이템 이름 컨트롤 이름
string m_strItemDescControl; // 아이템 설명 컨트롤 이름
string m_strBackgroundControl; // 아이템 배경 컨트롤 이름
string m_strSelectControl; // 아이템 선택 컨트롤 이름
KUIControlMultiIcon* m_pIconControl; // 아이콘 컨트롤 포인터
KUIWnd* m_pItemNameControl; // 아이템 이름 컨트롤 포인터
KUIWnd* m_pItemDescControl; // 아이템 설명 컨트롤 포인터
KUIWnd* m_pBackgroundControl; // 아이템 배경 컨트롤 포인터
KUIWnd* m_pSelectControl; // 아이템 선택 컨트롤 포인터
money_t m_n64NeedPrice; // 아이템 분해 소모비용
KUIWnd* m_pItemAmountControl; // 아이템 개별수량 컨트롤, added by gmpbigsun( 201304 )
//---------------------------------------------
// 생성자
//---------------------------------------------h
stControlInfo( void )
: m_wIndex( NULL )
, m_wLineNumber( NULL )
, m_strIconControl( "" )
, m_strItemNameControl( "" )
, m_strItemDescControl( "" )
, m_strBackgroundControl( "" )
, m_strSelectControl( "" )
, m_pIconControl( NULL )
, m_pItemNameControl( NULL )
, m_pItemDescControl( NULL )
, m_pBackgroundControl( NULL )
, m_pSelectControl( NULL )
, m_n64NeedPrice( NULL )
, m_pItemAmountControl( NULL )
{
}
//---------------------------------------------
// 보이기 / 숨기기
// * Select Control 같은 경우에는 따로 처리하기 때문에 빠져있다.
//---------------------------------------------
void SetShow( bool bShow )
{
if( m_pIconControl )
m_pIconControl->SetShow( bShow );
if( m_pItemNameControl )
m_pItemNameControl->SetShow( bShow );
if( m_pItemDescControl )
m_pItemDescControl->SetShow( bShow );
if( m_pBackgroundControl )
m_pBackgroundControl->SetShow( bShow );
}
//---------------------------------------------
// 원래 위치로 초기화
// * KUIWnd에서 제공하는 MoveToOriginalPosition() 함수를 쓰면 엄청 느리다.
// * 그래서 Resize 까지 할 필요는 없어서 계산해서 해결한다.
//---------------------------------------------
void ReturnToOriginPos( void )
{
if( m_pIconControl )
{
KUIWnd* pParent( m_pIconControl->GetParent() );
if( pParent )
{
KRect rtParent( pParent->GetRect() );
rtParent = rtParent + m_pIconControl->GetOriginalOffset();
m_pIconControl->MovePos( rtParent.left, rtParent.top );
}
}
if( m_pItemDescControl )
{
KUIWnd* pParent( m_pItemDescControl->GetParent() );
if( pParent )
{
KRect rtParent( pParent->GetRect() );
rtParent = rtParent + m_pItemDescControl->GetOriginalOffset();
m_pItemDescControl->MovePos( rtParent.left, rtParent.top );
}
}
if( m_pItemNameControl )
{
KUIWnd* pParent( m_pItemNameControl->GetParent() );
if( pParent )
{
KRect rtParent( pParent->GetRect() );
rtParent = rtParent + m_pItemNameControl->GetOriginalOffset();
m_pItemNameControl->MovePos( rtParent.left, rtParent.top );
}
}
if( m_pBackgroundControl )
{
KUIWnd* pParent( m_pBackgroundControl->GetParent() );
if( pParent )
{
KRect rtParent( pParent->GetRect() );
rtParent = rtParent + m_pBackgroundControl->GetOriginalOffset();
m_pBackgroundControl->MovePos( rtParent.left, rtParent.top );
}
}
if( m_pSelectControl )
{
KUIWnd* pParent( m_pSelectControl->GetParent() );
if( pParent )
{
KRect rtParent( pParent->GetRect() );
rtParent = rtParent + m_pSelectControl->GetOriginalOffset();
m_pSelectControl->MovePos( rtParent.left, rtParent.top );
}
}
if( m_pItemAmountControl )
{
KUIWnd* pParent( m_pItemAmountControl->GetParent() );
if( pParent )
{
KRect rtParent( pParent->GetRect() );
rtParent = rtParent + m_pItemAmountControl->GetOriginalOffset();
m_pItemAmountControl->MovePos( rtParent.left, rtParent.top );
}
}
}
//---------------------------------------------
// 오프셋 만큼 위치 이동
//---------------------------------------------
void MovePosOffset( const int nOffSetX, const int nOffSetY )
{
if( m_pIconControl )
m_pIconControl->MovePosOffset( nOffSetX, -nOffSetY );
if( m_pItemNameControl )
m_pItemNameControl->MovePosOffset( nOffSetX, -nOffSetY );
if( m_pItemDescControl )
m_pItemDescControl->MovePosOffset( nOffSetX, -nOffSetY );
if( m_pBackgroundControl )
m_pBackgroundControl->MovePosOffset( nOffSetX, -nOffSetY );
if( m_pSelectControl )
m_pSelectControl->MovePosOffset( nOffSetX, -nOffSetY );
if( m_pItemAmountControl )
m_pItemAmountControl->MovePosOffset( nOffSetX, -nOffSetY );
}
}CONTROL_INFO, *PCONTROL_INFO;
};
using namespace KUI_MESSAGE;
using namespace CStringUtil;
using namespace nsDecomposeDB;
using namespace nsDecomposeUI;
//-----------------------------------------------------------------------------------------------------------------
// 분해 창
//-----------------------------------------------------------------------------------------------------------------
class SUIDecompositionWnd : public SUIWnd
{
public:
SUIDecompositionWnd( SGameManager* pGameManager, SUIDisplayInfo* pDisplayInfo );
~SUIDecompositionWnd( void );
virtual SUIWnd* CreateWnd( const char* szFile, KUIWndManager* pWndManager, KPoint kPos, int nWindowID );
virtual bool InitControls( KPoint kPos );
virtual bool InitData( bool bReload = false );
virtual DWORD OnMouseMessage( DWORD dwMessage, int x, int y );
virtual void OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd = true );
virtual void PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam );
virtual void ProcMsgAtStatic( SGameMessage* pMsg );
virtual void* Perform( KID id, KArg& msg );
void AppendItemUniqueID( const ItemInstance::ItemUID n64UniqueID );
private:
bool CreateBaseControlInfo( void ); // 기본 컨트롤 정보 생성
bool CreateCopyControlInfo( void ); // 복사 컨트롤 정보 생성
void ResetControlInfo( void ); // 컨트롤 정보 초기화
PCONTROL_INFO FindControlInfo( const WORD wIndex ); // 인덱스로 부터 컨트롤 정보 얻기
PCONTROL_INFO FindControlInfo( const KPoint ptMouse ); // 마우스 좌표로 부터 컨트롤 정보 얻기
void UpdateRupy( void ); // 돈( 루피 ) 갱신
void UpdateButton( void ); // 버튼 컨트롤들 갱신
void UpdateScrollBar( void ); // 스크롤 바 정보 갱신
void UpdateItemInfo( void ); // 아이템 정보 갱신
void UpdateControlInfo( void ); // 컨트롤 정보 갱신
void UpdateSelectControl( void ); // 선택 컨트롤 갱신
void UpdateAppendedItemCount( void ); // 등록 된 아이템 개수 갱신
void AutoScrollBarMoveWhenAppendItem( const WORD wIndex ); // 아이템 등록 시 스크롤 바 자동 이동
bool IsExistItemUniqueID( const ItemInstance::ItemUID n64UniqueID ); // 같은 유일한 아이디가 존재하는가?
void DeleteItemUniqueID( const WORD wIndex ); // 어아탬 고유 아이디 삭제하기
bool Process_UIBeginDrag( KUIBeginDragMessage* const pRecvMsg ); // 아이콘 드래그 시작 시 처리
void Process_UIReceiveDrop( const KUISendRecvDropMessage* const pRecvMsg ); // 아이콘 드롭 받을 시 처리
void Process_UISendDrop( const KUISendRecvDropMessage* const pRecvMsg ); // 아이콘 드롭 보낼 시 처리
money_t GetTotalDecompositionPrice( void ); // 분해하는데 드는 총 소모비용 얻기
void OutputResultSystemMessage( SMSG_DECOMPOSE_RESULT* const pRMsg ); // 분해 결과 시스템 메시지 출력
bool SendDoDecompsitionPacket( void ); // 분해 실행 패킷 전송
void ProcessMouseMessage_SelectControl( const PCONTROL_INFO pControlInfo ); // 마우스 메시지 처리 ( 선택 컨트롤 )
void ProcessMouseMessage_RemoveItem( const PCONTROL_INFO pControlInfo ); // 마우스 메시지 처리 ( 아이템 제거 )
bool IsOpenAnotherUIWindow( void ); // 열려 있으면 안되는 다른 UI가 열려 있는가 ?
bool IsNeedOpenCautionMessageBox( const ItemInstance::ItemUID n64UniqueID ); // 경고 메시지 박스를 열어야 필요가 있는가 ?
bool IsPossibleItemAppend( const ItemInstance::ItemUID n64UniqueID ); // 등록 가능 한 아이템 인가 ?
// 분해 가능 한 아이템 인가 ? (분해 DB로부터 검사)
bool IsPossibleDecompositionFromDB( const SInventorySlot* const pSlot, // 슬롯 정보
const ItemBaseEx_info* const pItemBase ); // 아이템 정보
// DB로 부터 유효한 조합식을 찾았는가 ?
bool IsFindValidDecomositionFormula( const SInventorySlot* const pSlot, // 슬롯 정보
const ItemBaseEx_info* const pItemBase, // 아이템 정보
DECOMPOSE_FORMULA_INFO* const pFormulaInfo ); // 분해 공식 정보
void OpenProgressiveBar( void ); // 프로그레스 바 윈도우 열기
bool SetAppendedItemToInventorySlot( const ItemInstance::ItemUID n64UniqueID, bool bAppend ); // 아이템 등록을 Inventory Slot에 설정한다.
private:
typedef vector<PCONTROL_INFO> CONTROL_INFO_LIST;
// typedef map<WORD, ItemInstance::ItemUID> ITEM_UNIQUE_ID_LIST;
struct IN_DATA
{
IN_DATA( ) { _id = 0, _count = count_t(1); }
ItemInstance::ItemUID _id;
count_t _count;
};
typedef map< WORD, IN_DATA > ITEM_UNIQUE_ID_LIST;
typedef ITEM_UNIQUE_ID_LIST::iterator ITER_ITEM_UNIQUE_ID_LIST;
SUIDisplayInfo* m_pDisplayInfo;
KUIControlVScrollSmallEx* m_pScrollBar; // 스크롤 바 컨트롤
KUIControlStatic* m_pRupyControl; // 돈 (루피) 컨트롤 포인터
KUIControlButton* m_pDoEmptyControl; // 비우기 버튼 컨트롤 포인터
KUIControlStatic* m_pItemCountControl; // 아이템 개수 컨트롤 포인터
KUIControlButton* m_pDoDecompositionControl; // 전체 분해 버튼 컨트롤 포인터
int m_nCurrentScrollPosition; // 현재 스크롤 바의 위치
WORD m_wCurrentSelectControlIndex; // 현재 선택 된 컨트롤 인덱스
int m_nBackgroundControlHeight; // 배경 컨트롤 높이
int m_nBackgroundControlWidth; // 배경 컨트롤 높이
string m_strRupyBasicColorValue; // 돈 (루피) 글짜의 기본 폰트 색상
string m_strRupyNotEnoughColorValue; // 돈 (루피) 글짜의 루피 부족 시 폰트 색상
string m_strItemCountBasicColorValue; // 아이템 개수 기본 폰트 색상
string m_strItemCountMaxColorValue; // 아이템 개수 최대치 일 시 폰트 색상
string m_strDoDecompositionEnableColorValue; // 전체 분해 버튼 활성화 폰트 색상
string m_strDoDecompositionDisableColorValue; // 전체 분해 버튼 비 활성화 폰트 색상
string m_strRupyPropertyTag; // 돈 (루피) 이름 속성 태그 <font:>,<size:>.. <etc>
string m_strItemNamePropertyTag; // 아이템 이름 속성 태그 <font:>,<size:>.. <etc>
string m_strItemDescPropertyTag; // 아이템 설명 속성 태그 <font:>,<size:>.. <etc>
string m_strItemCountPropertyTag; // 아이템 개수 속성 태그 <font:>,<size:>.. <etc>
string m_strDoDecompositionPropertyTag; // 전체 분해 버튼 속성 태그 <font:>,<size:>.. <etc>
ItemInstance::ItemUID m_n64WaitForAppendItemUniqueID; // 메시지 박스 출력으로 인해 등록을 기다리는 아이템의 고유 아이디
count_t m_ntCountForWaiting; // 의 수량
money_t m_n64NeedPriceTemporaryStorage; // 분해에 필요한 소모 비용 임시 저장소
money_t m_n64TotalNeedPrice; // 분해에 필요한 최종 소모 비용
CONTROL_INFO_LIST m_vecControlInfo; // 생성 된 컨트롤 정보들
ITEM_UNIQUE_ID_LIST m_mapUniqueID; // 분해 될 아이템의 고유 아이디
bool m_bIsNotEnoughMoney; // 돈이 부족한가?
bool m_bIsSendPacket; // 패킷을 전송했는가?
bool m_bIsOpenFinalCautionMessageBox; // 마지막 경고 메시지 박스를 출력해야 하는가?
};