#include "stdafx.h" #include "ItemCountWindow.h" #include "GameUIManager.h" #include "ItemManager.h" #include "NumberEditBox.h" #include "ObjectManager.h" #include "Hero.h" #include "StageManager.h" #include "NpcStoreWindow.h" #include "GameResourceManager.h" cItemCountWindow::cItemCountWindow() : mMaxValue( 1 ) , mSlotIndex0( USHRT_MAX ) , mSlotIndex1( USHRT_MAX ) , mItemIndex( 0 ) , mNumEdit(0) , mPrice(0) { } cItemCountWindow::~cItemCountWindow() { } void cItemCountWindow::OnShow() { cUIWindow::OnShow(); if( mNumEdit ) { mNumEdit->Clear(); mNumEdit->SetMaxValue( mMaxValue ); mNumEdit->SetFocus(); } } bool cItemCountWindow::HandleEvent(const cUIEvent& event ) { if( mEnabled == false || mVisible == false ) return mpParent->HandleEvent( event ); switch( event.mType ) { case eUIEVENT_LBUTTON_DOWN: case eUIEVENT_LBUTTON_UP: case eUIEVENT_MOUSE_MOVE: { cUINode* pNode = this->GetNode( event.mPos ); if( pNode && (pNode->GetType() == eUINODE_BUTTON || pNode->GetType() == eUINODE_EDITBOX )) pNode->HandleEvent( event ); else cUIWindow::HandleEvent( event ); } break; case eUIEVENT_COMMAND: if( event.mID == eMESSAGE_BUTTON_NO ) { Hide(); } else cUIWindow::HandleEvent( event ); break; case eUIEVENT_EDITBOX_ENTER: case eUIEVENT_KEY_UP: case eUIEVENT_KEY_DOWN: { if( event.mCode == eKEY_RETURN ) { /// È®ÀÎ ¹öư ÀԷ¿ë OnCommand( 0, eUIID_ITEMCOUNT_OK ); } else if( event.mCode == eKEY_ESCAPE ) { OnCommand( 0, eUIID_ITEMCOUNT_CANCEL ); } } break; default: cUIWindow::HandleEvent( event ); break; } return true; } /// ½½·Ô ³¢¸®ÀÇ À̺¥Æ® void cItemCountWindow::ShowModal( eMSGBox_Event eventtype, unsigned long slotIndex0, unsigned long slotIndex1 ) { cItem* item0 = ITEMMAN->GetItem( (unsigned short)slotIndex0 ); if( !item0 ) { assert(0); return; } if( item0->GetCount() <= 1 ) return; cItem* item1 = ITEMMAN->GetItem( (unsigned short)slotIndex1 ); if( !item1 ) { assert(0); return; } if( item1->GetCount() && item0->GetIndex() != item1->GetIndex() ) return; mSlotIndex0 = slotIndex0; mSlotIndex1 = slotIndex1; mMaxValue = item0->GetCount(); mMsgHandler = STAGEMAN->GetStage( STAGEMAN->GetCurrentStage() ); mEventType = eventtype; cUIWindow::ShowModal( eventtype ); } void cItemCountWindow::ShowModal( eMSGBox_Event eventtype, unsigned long slotIndex, unsigned long itemIndex, unsigned long maxValue, unsigned long price ) { mSlotIndex0 = slotIndex; mItemIndex = itemIndex; // mMaxValue = maxValue; mPrice = price; unsigned long heroMoney = HERO->GetMoney(); unsigned long count = heroMoney / price; count = ( count > maxValue ) ? maxValue : count; mMaxValue = count; ///À¯Àú¿¡°Ô¼­ »ç´Â °æ¿ì ¹«°Ô, ÃÖ´ë°³¼ö Á¦ÇÑ, ºó°ø°£ üũµîÀ» ÇØ¾ßÇÔ. if( eventtype == eMBEVENT_ITEMCOUNT_USERSELLBUY ) { cItemDefine* itemDefine = ITEMMAN->GetItemDefine( mItemIndex ); if( itemDefine == NULL ) { assert(0); return; } /// ¹«°Ô unsigned long remainWei = HERO->GetMaxWeight() - (int)ITEMMAN->GetWeight(); unsigned long weiCount = ( itemDefine->GetWeight() > 0 ) ? remainWei / itemDefine->GetWeight() : remainWei; unsigned long mincount = ( count > weiCount ) ? weiCount : count; /// max inven üũ ( °¹¼ö Á¦ÇÑ ÀÖÀ»¶§¸¸ ) if( itemDefine->GetMaxHaveInven() > 0 ) { sItemCount* p = ITEMMAN->GetItemCount( mItemIndex ); int haveCnt = ( p ) ? p->total : 0; unsigned long maxInvenCnt = itemDefine->GetMaxHaveInven() - haveCnt; if( maxInvenCnt >= 0 ) { mincount = ( mincount > maxInvenCnt ) ? maxInvenCnt : mincount; } else { assert(0); mincount = 0; } } /// ½½·Ô¿¡ µé¾î°¥¼ö ÀÖ´Â °¹¼ö //unsigned long invenCount = ITEMMAN->GetRemainCount( mItemIndex, mincount ); //mMaxValue = ( invenCount > mincount ) ? mincount : invenCount; /// ½½·Ô full °Ë»ç unsigned short slotIndex = 0; ITEMMAN->FindEmptySlot( &slotIndex, INVENTORY_BAG_BEGIN, HERO->GetBagEndSlot() ); if( slotIndex == 0 ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 202 ), GAMERESOURCEMAN->GetGameText( 301 ) ); return; } } mMsgHandler = STAGEMAN->GetStage( STAGEMAN->GetCurrentStage() ); mEventType = eventtype; cUIWindow::ShowModal( eventtype ); } /// ¾ÆÀÌÅÛ À妽º¿Í °ü·ÃµÈ À̺¥Æ® void cItemCountWindow::ShowModal( eMSGBox_Event eventtype, unsigned long index ) { switch( eventtype ) { case eMBEVENT_ITEMCOUNT_BUY: { mItemIndex = index; cItemDefine* itemDefine = ITEMMAN->GetItemDefine( mItemIndex ); if( itemDefine && itemDefine->GetBuyType() != ItemBuyNone ) { mMaxValue = itemDefine->GetCapacity(); unsigned long money = 0; /// Çѹø¿¡ ±¸ÀÔÇÒ¼ö ÀÖ´Â ÃÖ´ë °¹¼ö. switch( itemDefine->GetBuyType() ) { case ItemBuyMoney: money = HERO->GetMoney(); break; case ItemBuyTarot: money = HERO->GetTarotPoint(); break; case ItemBuyPvp: { /// ¾î¶² ÀüÀå Æ÷ÀÎÆ®°¡ ¼Ò¸ðµÇ¾ß ÇÏ´ÂÁö´Â ´ëÈ­ÁßÀÎ npcÀÇ ÅÇÀÇ selltype() cNpcStoreWindow* win = GAMEUI->GetNpcStore(); if( win ) { unsigned char npcSellType = win->GetCurrentItemSellType(); switch( npcSellType ) { case eNPC_ITEM_SELL_TYPE_FIRE: money = HERO->GetFirePoint(); break; case eNPC_ITEM_SELL_TYPE_WATER: money = HERO->GetWaterPoint(); break; case eNPC_ITEM_SELL_TYPE_WIND: money = HERO->GetWindPoint(); break; case eNPC_ITEM_SELL_TYPE_EARTH: money = HERO->GetEarthPoint(); break; default: assert(0); break; } } else assert(0); } break; default: { /// ÄÚÀηù - ÄÚÀÎÀ϶§´Â GetBuyType() ÀÌ ¾ÆÀÌÅÛ À妽ºÀÓ. sItemCount* p = ITEMMAN->GetItemCount( itemDefine->GetBuyType() ); money = ( p ) ? p->bag : 0; } break; } /// ¼ÒÁö±Ý unsigned long count = money / itemDefine->GetBuyPrice(); /// ÇöÀç NPC°¡ ÆÇ¸Å ºñÀ²ÀÌ Àû¿ëµÇ¾î ÀÖ´ÂÁö üũ. cNpcStoreWindow* npcStoreWin = GAMEUI->GetNpcStore(); if( npcStoreWin ) { unsigned long sellRate = npcStoreWin->GetCurrentItemPriceRate(); if( sellRate == ULONG_MAX ) { //assert(0); sellRate = 100; } count = money / ( itemDefine->GetBuyPrice() * sellRate / 100 ) ; } /// ¹«°Ô unsigned long remainWei = HERO->GetMaxWeight() - (int)ITEMMAN->GetWeight(); unsigned long weiCount = ( itemDefine->GetWeight() > 0 ) ? remainWei / itemDefine->GetWeight() : remainWei; unsigned long mincount = ( count > weiCount ) ? weiCount : count; /// max inven üũ ( °¹¼ö Á¦ÇÑ ÀÖÀ»¶§¸¸ ) if( itemDefine->GetMaxHaveInven() > 0 ) { sItemCount* p = ITEMMAN->GetItemCount( mItemIndex ); int haveCnt = ( p ) ? p->total : 0; unsigned long maxInvenCnt = itemDefine->GetMaxHaveInven() - haveCnt; if( maxInvenCnt >= 0 ) { mincount = ( mincount > maxInvenCnt ) ? maxInvenCnt : mincount; } else { assert(0); mincount = 0; } } /// ½½·Ô¿¡ µé¾î°¥¼ö ÀÖ´Â °¹¼ö unsigned long invenCount = ITEMMAN->GetRemainCount( mItemIndex, mincount ); mMaxValue = ( invenCount > mincount ) ? mincount : invenCount; } else { assert(0); return; } } break; case eMBEVENT_ITEMCOUNT_SELL: { mSlotIndex0 = (unsigned short)index; cItem* item = ITEMMAN->GetItem( (unsigned short)mSlotIndex0 ); if( item ) { mMaxValue = item->GetCount(); } } break; default: assert( 0 && "invalid item try" ); return; } mMsgHandler = STAGEMAN->GetStage( STAGEMAN->GetCurrentStage() ); mEventType = eventtype; cUIWindow::ShowModal( eventtype ); } bool cItemCountWindow::OnCreate( cUINodeProperty* property ) { if( cUIWindow::OnCreate( property ) == false ) return false; mNumEdit = (cNumberEditBox*)GetChild( eUIID_ITEMCOUNT_NUMBER ); if( mNumEdit ) mNumEdit->SetUseZero( false ); return true; } void cItemCountWindow::OnCommand( cUINode*, unsigned int id ) { if( !mNumEdit ) { assert(0); return; } switch( id ) { case eUIID_ITEMCOUNT_UP: { unsigned long value = mNumEdit->GetValue(); value++; if( value > mMaxValue ) value = mMaxValue; mNumEdit->SetValue( value ); } break; case eUIID_ITEMCOUNT_DOWN: { unsigned long value = mNumEdit->GetValue(); value--; if( value < 1 ) value = 1; mNumEdit->SetValue( value ); } break; case eUIID_ITEMCOUNT_MAX: { mNumEdit->SetValue( mMaxValue ); } break; case eUIID_ITEMCOUNT_OK: { unsigned long value = mNumEdit->GetValue(); if( value > 0 ) { if( value >= mMaxValue ) value = mMaxValue; mNumEdit->SetValue( value ); if( mMsgHandler ) mMsgHandler->MsgBoxEventParser( mEventType, id, 0 ); Hide(); } } break; case eUIID_ITEMCOUNT_CLOSE: case eUIID_ITEMCOUNT_CANCEL: Hide(); break; default: assert(0); break; } } void cItemCountWindow::OnButtonDowned( cUINode* , unsigned int id ) { if( !mNumEdit ) { assert(0); return; } switch( id ) { case eUIID_ITEMCOUNT_UP: { unsigned long value = mNumEdit->GetValue(); value++; if( value > mMaxValue ) value = mMaxValue; mNumEdit->SetValue( value ); } break; case eUIID_ITEMCOUNT_DOWN: { int value = mNumEdit->GetValue(); value--; if( value < 1 ) value = 1; mNumEdit->SetValue( value ); } break; } } unsigned short cItemCountWindow::GetCount() { return (mNumEdit)? (unsigned short)mNumEdit->GetValue() : 0; }