#pragma once #include //#include "SUIWnd.h" #include "SGameMessage.h" #include "SUIDefine.h" class SUIDisplayInfo; class SInventorySlot; class SShopSlot_CRAFT; // // 상점 // // Azia Mafia New Craft Systeme class SUIShopWnd_CRAFT : public SUIWnd { public: SUIShopWnd_CRAFT( class SGameManager* pGameManager, SUIDisplayInfo* pDisplayInfo ); virtual ~SUIShopWnd_CRAFT(); virtual bool InitControls( KPoint kPos ); virtual void OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd = true ); virtual bool InitData( bool bReload = false ); virtual void* Perform( KID id, KArg& msg ); virtual void PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam ); virtual void ProcMsgAtStatic( SGameMessage* pMsg ); private: SUIDisplayInfo* m_pDisplayInfo; /// 아이템 슬롯 정보 표현용 control들의 ID struct SLOT_INFO_CRAFT { std::string strIconControl; std::string strStaticNameControl; std::string strStaticCountControl; std::string strStaticPriceControl; std::string strStaticUnitControl; }; SLOT_INFO_CRAFT* m_pSlotControlIDs; int m_nSlotStartIndex; ///< 첫번째 슬롯의 아이템 인덱스 ( 스크롤 시킴에 따라 바뀐다. ) int m_nSlotCountY; ///< 현재 보여지는 슬롯들의 세로 갯수 ( 리사이즈 시킴에 따라 바뀐다. ) int m_nScrollBarTopOffset; ///< 스크롤바 resize의 기준 offset int m_nScrollBarBottomOffset; UI_ITEM_CATEGORY m_CurrentCategory; ///< 현재 선택된 아이템 분류 int m_nCurrentSelect; ///< 현재 선택된 아이템 인덱스 (없으면 -1) std::vector m_vecSellItemList; std::vector m_vecBuyItemList; void RefreshScrollBar(); void RefreshSlots(); void RefreshSelection(); void RefreshItems(); void RefreshGold(); void RefreshWeight(); void RefreshSelectionCraft(); void SelectItemSendToCraft(); void MoveShoppingKartWindow(); void SetBuyModeShoppingKartWindow(); int GetSlotSellItemIndex( int nSlotControlNum ) const; int GetSlotBuyItemIndex( int nSlotControlNum ) const; SInventorySlot* GetSlotSellItem( int nSlotControlNum ) const; SShopSlot_CRAFT* GetSlotBuyItem( int nSlotControlNum ) const; bool IsBuyMode() const; int GetSlotControlNum( const char* szSlotControlID ) const; bool m_bCtrlKey; bool m_bShiptKey; }; /// /// LA KART /// class SUIShopKartWnd_CRAFT : public SUIWnd { public: SUIShopKartWnd_CRAFT(SGameManager* pGameManager, SUIDisplayInfo* pDisplayInfo); virtual ~SUIShopKartWnd_CRAFT(); virtual bool InitControls(KPoint kPos); virtual bool InitData(bool bReload = false); virtual void* Perform(KID id, KArg& msg); virtual void PumpUpMessage(LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam); virtual void ProcMsgAtStatic(SGameMessage* pMsg); virtual void OnNotifyUIWindowOpen(bool bOpen, bool bLimitWnd = true); private: SUIDisplayInfo* m_pDisplayInfo; /// 아이템 슬롯 정보 표현용 control들의 ID struct SLOT_INFO { std::string strIconControl; std::string strStaticNameControl; std::string strStaticCountControl; std::string strStaticPriceControl; std::string strStaticUnitControl; }; SLOT_INFO* m_pSlotControlIDs; int m_nSlotStartIndex; ///< 첫번째 슬롯의 아이템 인덱스 ( 스크롤 시킴에 따라 바뀐다. ) bool m_bIsShop; bool m_bBuyMode; ///< 구입 or 판매 bool m_bCtrlKey; bool m_bShiptKey; int m_nCurrentSelect; bool m_bAct; // 카트에 구분 : 기본 FALSE, 구입/판매 TRUE; DWORD m_PrevProcessTime; struct KART_BUYITEM { ItemBase::ItemCode ItemID; int nSummonID; int nEnhance; int nLevel; int nEndurance; int nFlag; count_t nItemCount; int nSocket[ItemBase::MAX_SOCKET_NUMBER]; int nIndex; int remain_time; char elemental_effect_type; int elemental_effect_remain_time; int elemental_effect_attack_point; int elemental_effect_magic_point; int ethereal_durability; // 노점bintitle ItemBase::ItemCode appearanceCode; TS_ITEM_BASE_INFO::AwakenOption stAwakenOption; TS_ITEM_BASE_INFO::RANDOM_OPTION stRandomOption; int nAdditionalItemEffect; // Fraun Sky Accessories 7/12/2025 KART_BUYITEM(ItemBase::ItemCode id, int _nSummonID, count_t _nItemCount, int _nEnhance = 0, int _nLevel = 0, int _nFlag = 0, int _nEndurance = 0, int* pnSocket = NULL, int _nIndex = 0, int _remain_time = 0, char elemental_effect_type_ = 0, int elemental_effect_remain_time_ = 0, int elemental_effect_attack_point_ = 0, int elemental_effect_magic_point_ = 0, int ethereal_durability_ = 0, ItemBase::ItemCode appearanceCode_ = 0, TS_ITEM_BASE_INFO::AwakenOption* pAwakenOption = NULL, // 아 짜증나... 위에 디폴트 인자 때문에 어쩔수없이 포인터로... 코드 꼬라지 보소 ㅠㅠ (lenahyang) TS_ITEM_BASE_INFO::RANDOM_OPTION* pRandomOption = NULL, int nAdditionalItemEffect = 0 // Fraun Sky Accessories 7/12/2025 ) : ItemID(id), nSummonID(_nSummonID), nItemCount(_nItemCount), nEnhance(_nEnhance), nLevel(_nLevel), nFlag(_nFlag), nEndurance(_nEndurance), nIndex(_nIndex), remain_time(_remain_time), elemental_effect_type(elemental_effect_type_), elemental_effect_remain_time(elemental_effect_remain_time_), elemental_effect_attack_point(elemental_effect_attack_point_), elemental_effect_magic_point(elemental_effect_magic_point_), ethereal_durability(ethereal_durability_), // bintitle appearanceCode(appearanceCode_) { if (pnSocket) memcpy(nSocket, pnSocket, sizeof(nSocket)); else memset(nSocket, 0, sizeof(nSocket)); if (pAwakenOption) memcpy(&stAwakenOption, pAwakenOption, sizeof(stAwakenOption)); if (pRandomOption) memcpy(&stRandomOption, pRandomOption, sizeof(stRandomOption)); } TS_ITEM_BASE_INFO::AwakenOption* GetAwakenOption(void) { return &stAwakenOption; } TS_ITEM_BASE_INFO::RANDOM_OPTION* GetRandomOption(void) { return &stRandomOption; } }; struct KART_SELLITEM { AR_HANDLE handle; count_t nItemCount; int nIndex; KART_SELLITEM(AR_HANDLE _handle, count_t _nItemCount, int _nIndex) : handle(_handle), nItemCount(_nItemCount), nIndex(_nIndex) { } }; typedef std::vector KARTBUYITEM_VECTOR; typedef std::vector KARTSELLITEM_VECTOR; KARTSELLITEM_VECTOR m_KartSellItemsVector; ///< 현재 표시중인 판매할 아이템 벡터 KARTBUYITEM_VECTOR m_KartBuyItemsVector; ///< 현재 표시중인 구입할 아이템 벡터 /// 카트 추가 예약 상태 enum KART_RESERVE { KART_NO_RESERVE, KART_BUYITEM_RESERVE, KART_SELLITEM_RESERVE, }; KART_RESERVE m_ReserveState; ItemBase::ItemCode m_ReserveBuyItemID; ///< 카트 추가 예약 구입 아이템 AR_HANDLE m_ReserveSellItemHandle; ///< 카트 추가 예약 판매 아이템 SUIShopKartWnd_CRAFT::KARTBUYITEM_VECTOR::iterator GetBuyItem(ItemBase::ItemCode ItemID); SUIShopKartWnd_CRAFT::KARTSELLITEM_VECTOR::iterator GetSellItem(AR_HANDLE hItem); void AddBuyItem(const KART_BUYITEM& itemInfo); void AddBuyItem(ItemBase::ItemCode ItemID , count_t nItemCount, ItemBase::ItemCode ItemID1, int nCount1, ItemBase::ItemCode ItemID2, int nCount2, ItemBase::ItemCode ItemID3, int nCount3 , ItemBase::ItemCode ItemID4, int nCount4, ItemBase::ItemCode ItemID5, int nCount5, ItemBase::ItemCode ItemID6, int nCount6, ItemBase::ItemCode ItemID7, int nCount7, ItemBase::ItemCode ItemID8, int nCount8, ItemBase::ItemCode ItemID9, int nCount9); void RemoveBuyItem(int nIndex); void RemoveBuyItem(int nIndex, count_t nCount); void AddSellItem(AR_HANDLE hItem, count_t nItemCount, int index); void RemoveSellItem(int nIndex); void RemoveSellItem(int nIndex, count_t nCount); void RemoveAllKartItems(); void ShopBuyOrder(); void ShopSellOrder(); void StoreBuyOrder(); void ShopSellbyUser(); void RefreshScrollBar(); void RefreshSlots(); void RefreshGoldAndWeight(); void Process(DWORD time); int GetSlotKartSellItemIndex(int nSlotControlNum) const; int GetSlotKartBuyItemIndex(int nSlotControlNum) const; const SUIShopKartWnd_CRAFT::KART_SELLITEM* GetSlotKartSellItem(int nSlotControlNum) const; const SUIShopKartWnd_CRAFT::KART_BUYITEM* GetSlotKartBuyItem(int nSlotControlNum) const; bool IsShop() const { return m_bIsShop; } bool IsBuyMode() const { return m_bBuyMode; } int GetSlotControlNum(const char* szSlotControlID) const; void GetTotalPriceAndWeight(money_t& rTotalPrice, float& rTotalWeight) const; void CheckWeightOver(int nItemCode, count_t& nItemCnt); };