#include "StdAfx.h" #include "ItemMixWindow.h" #include "Label.h" #include "NumberEditBox.h" #include "ComboBox.h" #include "Button.h" #include "CheckBox.h" #include "UIImage.h" #include "ListFolderBox.h" #include "DoubleItemIconListBox.h" #include "ItemIcon.h" #include "Gauge.h" #include "ItemMixManager.h" #include "MakeSkillScript.h" #include "ItemManager.h" #include "GameResourceManager.h" #include "GameUIManager.h" #include "ObjectManager.h" #include "ChatManager.h" #include "Hero.h" #include "DuelManager.h" cItemMixWindow::cItemMixWindow() : mpCoolTime(0) , mpMixCount(0) , mpCompleteCount(0) , mpGaugeBar(0) , mpSkillCombo(0) , mpRecipeList(0) , mpHighImage(0) , mpItemList(0) , mpRecipeCool(0) , mpMixStart(0) , mpMixGiveUp(0) , mpMixStop(0) , mAutoRemainCount(0) , mAutoCount(0) , mAutoSpeed(0) //, mpGrade(0) , mpPoint(0) , mpGoalPoint(0) , mpMax(0) , mpPossibleRecipeCheck(0) { memset( mpResultRate, 0, sizeof(mpResultRate) ); memset( mpResultIcon, 0, sizeof(mpResultIcon) ); } cItemMixWindow::~cItemMixWindow() { SAFE_DELETE( mpHighImage ); } void cItemMixWindow::Clear() { InitCoolTime(); if( mpMixCount ) mpMixCount->SetValue( 1 ); if( mpCompleteCount ) mpCompleteCount->SetValue( 0 ); if( mpGrade ) mpGrade->Clear(); if( mpPoint ) mpPoint->SetValue( 0 ); if( mpGoalPoint ) mpGoalPoint->SetValue( 0 ); if( mpGaugeBar ) mpGaugeBar->ClearFront(); if( mpSkillCombo ) { mpSkillCombo->Clear(); mpSkillCombo->SetEnabled( true ); } if( mpRecipeList ) { mpRecipeList->Clear(); mpRecipeList->SetEnabled( true ); } if( mpItemList ) mpItemList->Clear(); if( mpMixGiveUp ) mpMixGiveUp->SetEnabled( false ); if( mpMixStart ) mpMixStart->SetEnabled( false ); if( mpMixStop ) mpMixStop->SetEnabled( false ); if( mpMixCount ) mpMixCount->SetEnabled( false ); if( mpMax ) mpMax->SetEnabled( false ); for( int i = 0; i < 3; ++i ) { mpResultRate[i]->Clear(); mpResultIcon[i]->ChangeImage(0); mpResultIcon[i]->SetNumber(0); mpResultIcon[i]->SetItemIndex(0); } mAutoRemainCount = 0; mAutoCount = 0; mAutoSpeed = 0; } void cItemMixWindow::OnShow() { cUIWindow::OnShow(); GAMEUI->HideItemSetWindow( this ); ITEMMAN->UpdateItem(); // º¸Á¶Á÷¾÷ ¸®½ºÆ® °»½Å UpdateMakeSkill(); } void cItemMixWindow::Open() { } void cItemMixWindow::Close() { cUIWindow::Close(); Clear(); UIMAN->HideTip(); } void cItemMixWindow::OnHide() { cUIWindow::OnHide(); Clear(); UIMAN->HideTip(); } void cItemMixWindow::HideESC( bool onsound ) { ITEMMIXMAN->ItemMixCancel(); } bool cItemMixWindow::OnCreate( cUINodeProperty* pproperty ) { if( cUIWindow::OnCreate( pproperty ) == false ) return false; mpCoolTime = (cLabel*)GetChild( eUIID_GAME_ITEMMIX_COOLTIME ); mpMixCount = (cNumberEditBox*)GetChild( eUIID_GAME_ITEMMIX_NUMBEREDIT ); mpMax = (cButton*)GetChild( eUIID_GAME_ITEMMIX_MAX ); mpCompleteCount = (cLabel*)GetChild( eUIID_GAME_ITEMMIX_COMPLETECOUNT ); mpGrade = (cLabel*)GetChild( eUIID_GAME_ITEMMIX_GRADE ); mpPoint = (cLabel*)GetChild( eUIID_GAME_ITEMMIX_SKILLNOW ); mpGoalPoint = (cLabel*)GetChild( eUIID_GAME_ITEMMIX_SKILLGOAL ); mpGaugeBar = (cGauge*)GetChild( eUIID_GAME_ITEMMIX_GAUGE ); mpSkillCombo = (cComboBox*)GetChild( eUIID_GAME_ITEMMIX_MIXSKILLCOMBO ); mpRecipeList = (cItemMixListFolder*)GetChild( eUIID_GAME_ITEMMIX_MIXSKILLFOLDER ); mpItemList = (cDoubleItemIconListBox*)GetChild( eUIID_GAME_ITEMMIX_MIXLIST ); mpMixStart = (cButton*)GetChild( eUIID_GAME_ITEMMIX_START ); mpMixGiveUp = (cButton*)GetChild( eUIID_GAME_ITEMMIX_GIVEUP ); mpMixStop = (cButton*)GetChild( eUIID_GAME_ITEMMIX_CANCEL ); mpPossibleRecipeCheck = (cCheckBox*)GetChild( eUIID_GAME_ITEMMIX_POSSIBLE_RECIPE ); mpResultRate[0] = (cLabel*)GetChild( eUIID_GAME_ITEMMIX_RESULT1 ); mpResultRate[1] = (cLabel*)GetChild( eUIID_GAME_ITEMMIX_RESULT2 ); mpResultRate[2] = (cLabel*)GetChild( eUIID_GAME_ITEMMIX_RESULT3 ); mpGrade->SetTextColor( mDefaultColor ); mpGoalPoint->SetTextColor( mDefaultColor ); mpPoint->SetTextColor( mDefaultColor ); /// mpItemList->CreateIcon( "ItemMix_Slot%02d", 6 ); mpItemList->SetEnableSelect( false ); /// °á°úÈ®·ü µî·Ï ¾ÆÀÌÄÜ cString str; for( int i = 0; i < 3; ++i ) { mpResultIcon[i] = new cItemIcon; str.Format( "ItemMixResult_Slot%02d", i ); if( mpResultIcon[i]->CreateBySkinName( str, this, i+100 ) == false ) return false; mpResultIcon[i]->SetUsedFlag( false, false ); } /// À̹ÌÁö »ý¼º cUISkin* pSkin = UIMAN->GetSkin(); if( !pSkin ) { assert(0); return false; } cUINodeSkin* pHighSkin = pSkin->GetNodeSkin( "ItemMix_FolderCheck" ); cUINodeSkin* pHighNoSkin = pSkin->GetNodeSkin( "ItemMix_FolderNoCheck" ); if( pHighSkin && pHighNoSkin ) { mpHighImage = new cUIImage( pHighSkin->mpTexture ); unsigned int tx = pHighSkin->mSkinInfo->mTexX; unsigned int ty = pHighSkin->mSkinInfo->mTexY; unsigned int w = pHighSkin->mSkinInfo->mWidth; unsigned int h = pHighSkin->mSkinInfo->mHeight; unsigned int x = pHighSkin->mSkinInfo->mX; unsigned int y = pHighSkin->mSkinInfo->mY; mpHighImage->SetTextureRect( tx, ty, tx + w, ty + h ); mpHighImage->SetScreenRect( cUIRect( x, y, x + w, y + h ) ); unsigned int tx2 = pHighNoSkin->mSkinInfo->mTexX; unsigned int ty2 = pHighNoSkin->mSkinInfo->mTexY; mpRecipeList->SetHighNoCheckPos( tx, ty ); mpRecipeList->SetHighCheckPos( tx2, ty2 ); /// ÇÏÀ§¿­ Ãâ·ÂÀ§Ä¡ Á¶Á¤ mpRecipeList->SetLowGap( w ); } if( mpGaugeBar ) mpGaugeBar->SetMaxValue( 100 ); Clear(); return true; } void cItemMixWindow::OnCommand( cUINode* , unsigned int id ) { switch( id ) { case eUIID_GAME_ITEMMIX_CLOSE: ITEMMIXMAN->ItemMixCancel(); break; case eUIID_GAME_ITEMMIX_GIVEUP: { if( ITEMMIXMAN->IsNetLock() ) return; if( HERO->GetStopFlag() == eSTOP_ITEMMIX ) return; /// ±â¼ú Æ÷±â unsigned char skillIndex = (unsigned char)mpSkillCombo->GetSelectData(); cStringT str; unsigned long textIndex = ITEMMIXMAN->GetKeepSkillText( skillIndex ); str.Format( GAMERESOURCEMAN->GetGameText( 2820 ), UIMAN->GetUIText( textIndex ) ); UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_ITEMMIX_DELETE, eSKIN_YESNO, (LPCTSTR)str.Cstr(), GAMERESOURCEMAN->GetGameText( 301 ), (void*)skillIndex ); } break; case eUIID_GAME_ITEMMIX_START: if( mpMixCount && mpMixCount->GetValue() > 0 ) { unsigned int row = mpRecipeList->GetSelectRow(); unsigned int column = mpRecipeList->GetSelectRowColumn(); unsigned long recipeIdx = (unsigned long)mpRecipeList->GetColumnData( row, column ); /// ¼±ÅÃµÈ ½ºÅ³ Á¤º¸ unsigned char skillIndex = (unsigned char)mpSkillCombo->GetSelectData(); /// ¸¸µé¼ö ÀÖ´Â ÃÖ°íÄ¡¸¦ ³ÑÁö ¸øÇÑ´Ù unsigned int total = GetMaxValue( recipeIdx ); int value = ( total < (int)mpMixCount->GetValue() ) ? total : mpMixCount->GetValue(); if( value == 0 ) return; if( value == UINT_MAX ) mpMixCount->SetValue( 1 ); else mpMixCount->SetValue( value ); /// if( ITEMMIXMAN->ItemMixStart( skillIndex, recipeIdx, value ) == true ) { mAutoRemainCount = value; mAutoCount = 0; SetCompleteCount( mAutoCount ); /// sMakeSkillScript* script = MAKESKILLSCRIPT->GetMakeSkill( recipeIdx ); if( script ) { float speed = 100.0f / ((float)script->mMakeTime*0.001f); if( speed > 0.0f ) { mAutoSpeed = speed; StartGauge( mAutoSpeed ); } } } } else { CHATMANAGER->AddSystemMsg( eSYSTEM_NORMAL, GAMERESOURCEMAN->GetGameText( 2809 ) ); } break; case eUIID_GAME_ITEMMIX_CANCEL: ITEMMIXMAN->ItemMixCancel( false ); break; case eUIID_GAME_ITEMMIX_MAX: { /// max ¹öư /// ¼±ÅÃµÈ Äù½ºÆ®ÀÇ º¸»óÁ¤º¸ ¼¼ÆÃ unsigned int row = mpRecipeList->GetSelectRow(); unsigned int column = mpRecipeList->GetSelectRowColumn(); unsigned long recipeIdx = (unsigned long)mpRecipeList->GetColumnData( row, column ); /// Àç·á ¼¼ÆÃ unsigned int total = GetMaxValue( recipeIdx ); if( mpMixCount ) { if( total == UINT_MAX ) mpMixCount->SetValue( 1 ); else mpMixCount->SetValue( total ); } } break; } } unsigned int cItemMixWindow::GetMaxValue( unsigned long recipeIdx, bool bChatMsg ) { /// ÇöÀç Ãѹ«°Ô >= ¹«°ÔÁ¦ÇÑ ÀÏ °æ¿ì 0°³. if( ITEMMAN->GetWeight() >= HERO->GetMaxWeight() ) { if( bChatMsg ) CHATMANAGER->AddSystemMsg( eSYSTEM_NORMAL, GAMERESOURCEMAN->GetGameText( 2824 ) ); return 0; } typedef tArray* cMaterialArr; cMaterialArr materialArr; /// Àç·á ÃÖ´ë °³¼ö¸¦ ³Ñ¾î°¥ ¼ö ¾ø´Ù. unsigned int total = UINT_MAX; sMakeSkillScript* script = MAKESKILLSCRIPT->GetMakeSkill( recipeIdx ); if( script ) { materialArr = script->mpMaterial; if( materialArr ) { /// Àç·áµéÀÇ ¹«°ÔÀÇ ÇÕ. int totalMaterialWeight = 0; for( unsigned int i = 0; i < materialArr->GetSize(); ++i ) { sMaterialScript* data = (sMaterialScript*)(*materialArr)[i]; if( data ) { sItemCount* p = ITEMMAN->GetItemCount( data->mItemIdx ); unsigned int invenCount = ( p ) ? p->bag : 0; cItemDefine* pItemDefine = ITEMMAN->GetItemDefine( data->mItemIdx ); if( pItemDefine ) totalMaterialWeight += ( pItemDefine->GetWeight() * data->mItemCnt ); /// ³²Àº Àç·á¸¸Å­ ¸¸µé¼ö ÀÖ´Â °³¼ö Á¶Á¤ unsigned int makeCount = (invenCount / data->mItemCnt); total = ( total < makeCount ) ? total : makeCount; } else { assert(0); return 0; } } // Àç·á ºÎÁ· if( total == 0 || total == UINT_MAX ) { if( bChatMsg ) CHATMANAGER->AddSystemMsg( eSYSTEM_NORMAL, GAMERESOURCEMAN->GetGameText( 2827 ) ); return 0; } for( unsigned int cnt = 0; cnt < MAKESKILL_MAKE_ITEM_CNT; ++cnt ) { if( script->mMakeItemIdx[cnt] == 0 ) continue; /// ¹«°Ô üũ cItemDefine* pItemDefine = ITEMMAN->GetItemDefine( script->mMakeItemIdx[cnt] ); if( pItemDefine ) { int resultItemWeight = pItemDefine->GetWeight() * script->mMakeCnt[cnt]; /// ÇöÀç Ãѹ«°Ô - ¼Ò¸ð¾ÆÀÌÅÛµé ¹«°Ô + »ý¼ºµÉ ¾ÆÀÌÅÛ ¹«°Ô > ÃÑ ¹«°ÔÁ¦ÇÑ ÀÏ °æ¿ì 0°³. if( ITEMMAN->GetWeight() - totalMaterialWeight + resultItemWeight > HERO->GetMaxWeight() ) { if( bChatMsg ) CHATMANAGER->AddSystemMsg( eSYSTEM_NORMAL, GAMERESOURCEMAN->GetGameText( 2824 ) ); return 0; } else if( resultItemWeight > totalMaterialWeight ) { /// »ý¼ºµÉ ¾ÆÀÌÅÛ ¹«°Ô > ¼Ò¸ð¾ÆÀÌÅÛµé ¹«°Ô ÀÏ °æ¿ì [ ÇöÀç ¿©À¯¹«°Ô / ¾ÆÀÌÅÛ »ý¼º ½Ã ´Ã¾î³¯ ¹«°Ô ] int itemCount = (HERO->GetMaxWeight() - FloatToInt(ITEMMAN->GetWeight())) / (resultItemWeight - totalMaterialWeight); if( itemCount > 0 ) total = ( total < (unsigned int)itemCount ) ? total : itemCount; } } else { assert( 0 && "Bad Item index" ); return 0; } /// º¸À¯°¡´É °³¼ö üũ if( pItemDefine->GetMaxHaveInven() > 0 ) { sItemCount* p = ITEMMAN->GetItemCount( script->mMakeItemIdx[cnt] ); unsigned int invenCount = ( p ) ? p->total : 0; int maxHaveInven = pItemDefine->GetMaxHaveInven() - invenCount - script->mMakeCnt[cnt]; if( maxHaveInven > 0 ) { total = (total < (unsigned int)maxHaveInven)? total : maxHaveInven; } else { if( bChatMsg ) CHATMANAGER->AddSystemMsg( eSYSTEM_NORMAL, GAMERESOURCEMAN->GetGameText( 2825 ) ); return 0; } } /// ºó½½·Ô °³¼ö¸¸Å­ °³¼ö Á¶Á¤ total = ITEMMAN->GetRemainCount( script->mMakeItemIdx[cnt], total ); if( total < 1 ) { if( bChatMsg ) CHATMANAGER->AddSystemMsg( eSYSTEM_NORMAL, GAMERESOURCEMAN->GetGameText( 2826 ) ); return 0; } } if( script->mNextMakeTime > 0 && total > 1) total = 1; } } return total; } void cItemMixWindow::OnComboSelected( cUINode* , unsigned int id ) { if( HERO->GetStopFlag() == eSTOP_ITEMMIX ) return; if( !mpSkillCombo ) { assert(0); return; } // º¸Á¶Á÷¾÷ ÄÞº¸ °»½Å if( id == eUIID_GAME_ITEMMIX_MIXSKILLCOMBO ) { unsigned char skillIndex = (unsigned char)mpSkillCombo->GetSelectData(); sHeroInfo* info = HERO->GetHeroInfo(); sMakeSkill* skill1 = &info->MakeSkill1; sMakeSkill* skill2 = &info->MakeSkill2; sMakeSkill* select = 0; if( skill1->mIndex == skillIndex ) { select = skill1; } else if( skill2->mIndex == skillIndex ) { select = skill2; } else { assert(0); return; } if( mpMixStart ) mpMixStart->SetEnabled( false ); if( mpMixStop ) mpMixStop->SetEnabled( false ); if( mpMixCount ) mpMixCount->SetEnabled( false ); if( mpMax ) mpMax->SetEnabled( false ); // µî±Þ & ¼÷·Ãµµ ¼¼ÆÃ unsigned long gradeIndex = 0; unsigned long maxpoint = 0; switch( select->mStep ) { case ITEM_MIX_SKILL_L1: gradeIndex = 2000871; maxpoint = MIXSKILL_EXP1; break; case ITEM_MIX_SKILL_L2: gradeIndex = 2000872; maxpoint = MIXSKILL_EXP2; break; case ITEM_MIX_SKILL_L3: gradeIndex = 2000873; maxpoint = MIXSKILL_EXP3; break; case ITEM_MIX_SKILL_L4: gradeIndex = 2000874; maxpoint = MIXSKILL_EXP4; break; default: assert(0); return; } if( mpGrade ) mpGrade->SetText( GAMERESOURCEMAN->GetItemToolTipText( gradeIndex ) ); if( mpPoint ) mpPoint->SetValue( select->mExp ); if( mpGoalPoint ) mpGoalPoint->SetValue( maxpoint ); if( mpPossibleRecipeCheck && mpPossibleRecipeCheck->IsPress() == true ) { UpdateRecipeList( skillIndex, true, true ); } else { // º¸Á¶Á÷¾÷ °ü·Ã ·¹½ÃÇÇ ¸®½ºÆ®·Î °»½Å UpdateRecipeList( skillIndex ); } } } void cItemMixWindow::UpdateSelectedRecipe() { /// ÃʱâÈ­ if( mpMixCount ) mpMixCount->SetValue( 1 ); if( mpCompleteCount ) mpCompleteCount->SetValue( 0 ); if( mpMixStart ) mpMixStart->SetEnabled( false ); if( mpMixCount ) mpMixCount->SetEnabled( false ); if( mpMax ) mpMax->SetEnabled( false ); if( mpItemList ) mpItemList->Clear(); for( int i = 0; i < MAKESKILL_MAKE_ITEM_CNT; ++i ) { /// ¾ÆÀÌÄÜ ÃʱâÈ­ mpResultIcon[i]->ChangeImage(0); mpResultIcon[i]->SetNumber(0); mpResultIcon[i]->SetItemIndex(0); mpResultRate[i]->Clear(); } InitCoolTime(); // Á¶ÇÕ¾ÆÀÌÅÛ ¸®½ºÆ® °»½Å ( »õ·Î¼±Åà ) typedef tArray* cMaterialArr; cMaterialArr materialArr; unsigned int row = mpRecipeList->GetSelectRow(); unsigned int column = mpRecipeList->GetSelectRowColumn(); unsigned long recipeIdx = (unsigned long)mpRecipeList->GetColumnData( row, column ); /// Àç·á ¼¼ÆÃ sMakeSkillScript* script = MAKESKILLSCRIPT->GetMakeSkill( recipeIdx ); if( !script ) return; sHeroInfo* info = HERO->GetHeroInfo(); sMakeSkill* skill1 = &info->MakeSkill1; sMakeSkill* skill2 = &info->MakeSkill2; /// 1. Àç»ç¿ë ½Ã°£ ¼¼ÆÃ unsigned char skillIndex = (unsigned char)mpSkillCombo->GetSelectData(); if( skill1->mIndex == skillIndex ) { mpRecipeCool = ITEMMIXMAN->GetKeepMixSkill1( recipeIdx ); } else if( skill2->mIndex == skillIndex ) { mpRecipeCool = ITEMMIXMAN->GetKeepMixSkill2( recipeIdx ); } else { assert(0); return; } bool readyToMix = true; if( mpRecipeCool ) { if( mpRecipeCool->mNextMakeTime > 0 && mpRecipeCool->mRestTime > 0 ) { readyToMix = false; } } else { assert(0); return; } /// 2. Àç·á ¼¼ÆÃ materialArr = script->mpMaterial; if( materialArr ) { for( unsigned int i = 0; i < materialArr->GetSize(); ++i ) { sMaterialScript* data = (sMaterialScript*)(*materialArr)[i]; if( data ) { cItemDefine* define = ITEMMAN->GetItemDefine( data->mItemIdx ); if( define ) { // ¾Õ : Àκ¥ °¹¼ö, µÚ : Á¶ÇÕÇʿ䷮ sItemCount* p = ITEMMAN->GetItemCount( data->mItemIdx ); int invenCount = ( p ) ? p->bag : 0; /// ºÎÁ·ÇÑ ¾ÆÀÌÅÛ ºÓÀº»öÀ¸·Î ¹Ù²Ù±â unsigned long color = mDefaultColor; if( invenCount < data->mItemCnt ) { color = COLOR_RED; readyToMix = false; } unsigned int row = mpItemList->AddRow( define->GetName(), color, (void*)data->mItemIdx ); if( row >= 0 ) { cStringT countStr; countStr.Format( _T("%d/%d"), invenCount, data->mItemCnt ); mpItemList->AddColume( row, (LPCTSTR)countStr.Cstr(), color ); } } else { assert(0); } } else { assert(0); } } } if( readyToMix == true && DUELMAN->IsDuelEnable() == false ) { if( mpMixStart ) mpMixStart->SetEnabled( true ); if( mpMixCount ) mpMixCount->SetEnabled( true ); if( mpMax ) mpMax->SetEnabled( true ); } unsigned int totalRate = 0; for( int i = 0; i < MAKESKILL_MAKE_ITEM_CNT; ++i ) { unsigned long itemIndex = script->mMakeItemIdx[i]; if( itemIndex > 0 ) totalRate = totalRate + script->mMakeRate[i]; } for( int i = 0; i < MAKESKILL_MAKE_ITEM_CNT; ++i ) { /// ¾ÆÀÌÄÜ ÃʱâÈ­ mpResultIcon[i]->ChangeImage(0); mpResultIcon[i]->SetNumber(0); mpResultIcon[i]->SetItemIndex(0); mpResultRate[i]->Clear(); unsigned long itemIndex = script->mMakeItemIdx[i]; unsigned int count = script->mMakeCnt[i]; unsigned short rate = script->mMakeRate[i]; if( itemIndex > 0 ) { cItemDefine* define = ITEMMAN->GetItemDefine( itemIndex ); if( define ) { mpResultIcon[i]->SetItemIndex( itemIndex ); mpResultIcon[i]->ChangeImage( define->GetIconParam() ); mpResultIcon[i]->SetNumber( count ); } float presentRate = (float)(rate * 100 / totalRate); cStringT str; str.Format( _T("%.f%%"), presentRate ); mpResultRate[i]->SetText( (LPCTSTR)str.Cstr() ); } } } void cItemMixWindow::UpdateRecipeList() { if( mpPossibleRecipeCheck == NULL || mpRecipeList == NULL || mpSkillCombo == NULL ) { assert(0); return; } unsigned char curIndex = 0; curIndex = (unsigned char)mpSkillCombo->GetSelectData(); if( curIndex <= 0 ) return; /// ¸®½ºÆ® ÃʱâÈ­Àü ¼±ÅõǾîÁø ·¹½ÃÇǸ¦ ÀúÀå unsigned int row = mpRecipeList->GetSelectRow(); unsigned int column = mpRecipeList->GetSelectRowColumn(); unsigned long recipeIdx = (unsigned long)mpRecipeList->GetColumnData( row, column ); if( mpPossibleRecipeCheck->IsPress() == true ) { UpdateRecipeList( curIndex, false, true ); } else { UpdateRecipeList( curIndex, false, false ); } /// ÀÌÀü¿¡ ¼±ÅõǾîÁø ·¹½ÃÇÇ ÀÖ´Ù¸é ¼³Á¤ sMakeSkillScript* script = MAKESKILLSCRIPT->GetMakeSkill( recipeIdx ); if( script ) { int col = mpRecipeList->FindColumnByExtra( script->mType, recipeIdx ); if( col >= 0 ) { mpRecipeList->ChangeSelectColumn( col ); } else { InitCoolTime(); for( int i = 0; i < 3; ++i ) { mpResultRate[i]->Clear(); mpResultIcon[i]->ChangeImage(0); mpResultIcon[i]->SetNumber(0); mpResultIcon[i]->SetItemIndex(0); } if( mpItemList ) mpItemList->Clear(); } } } void cItemMixWindow::OnListBoxChanged( cUINode* , unsigned int id ) { if( HERO->GetStopFlag() == eSTOP_ITEMMIX ) return; if( id == eUIID_GAME_ITEMMIX_MIXSKILLFOLDER ) { UpdateSelectedRecipe(); } } void cItemMixWindow::OnCheckBoxChanged( cUINode* , unsigned int id ) { if( mpPossibleRecipeCheck && mpSkillCombo ) { if( mpMixStart ) mpMixStart->SetEnabled( false ); if( mpMixStop ) mpMixStop->SetEnabled( false ); if( mpMixCount ) mpMixCount->SetEnabled( false ); if( mpMax ) mpMax->SetEnabled( false ); unsigned char curIndex = (unsigned char)mpSkillCombo->GetSelectData(); if( mpPossibleRecipeCheck->IsPress() == true ) { UpdateRecipeList( curIndex, true, true ); } else { if( mpSkillCombo ) { UpdateRecipeList( curIndex, true, false ); } else { assert(0); return; } } } else { assert(0); return; } } void cItemMixWindow::OnProcess( unsigned long deltaTime, unsigned long accumTime ) { cUIWindow::OnProcess( deltaTime, accumTime ); if( mpRecipeCool ) { cStringT th,tm,ts; unsigned long elapsedTime = accumTime - mpRecipeCool->mStartTime; // Àç »ç¿ë ´ë±â ½Ã°£ÀÌ ÀÖ´Â ¾ÆÀÌÅÛÀÎ °æ¿ì if( mpRecipeCool->mNextMakeTime > 0 ) { // ÇöÀç »ç¿ëÇÏ¿©¼­ ½Ã°£°ªÀÌ °»½ÅµÇ´Â °æ¿ì if( mpRecipeCool->mRestTime > 0 ) { if( mpRecipeCool->mRestTime > elapsedTime ) { short coolTime = (short)((mpRecipeCool->mRestTime - elapsedTime) / 1000); /// Àç»ç¿ë½Ã°£ ±¸Çؼ­ Ãâ·Â unsigned int h = (((unsigned int)coolTime ) / 60) / 60; unsigned int m = ((unsigned int)coolTime ) / 60 % 60; unsigned int s = ((unsigned int)coolTime % 60) % 60; if( h != 0 ) th.Format( GAMERESOURCEMAN->GetItemToolTipText( 2000855 ), h ); if( m != 0 ) tm.Format( GAMERESOURCEMAN->GetItemToolTipText( 2000809 ), m ); if( s != 0 ) ts.Format( GAMERESOURCEMAN->GetItemToolTipText( 2000808 ), s ); th += tm; th += ts; if( th.GetLength() == 0 ) th.Format( GAMERESOURCEMAN->GetItemToolTipText( 2000808 ), 0 ); cStringT str; str.Format( GAMERESOURCEMAN->GetGameText( 11250 ), th.Cstr(), mpRecipeCool->mStrNextMakeTime.Cstr() ); if( mpCoolTime ) mpCoolTime->SetText( (LPCTSTR)str.Cstr() ); if( mpMixStart ) mpMixStart->SetEnabled( false ); if( mpMixCount ) mpMixCount->SetEnabled( false ); if( mpMax ) mpMax->SetEnabled( false ); } else { mpRecipeCool->mRestTime = 0; mpRecipeCool->mStartTime = 0; if( mpMax ) { unsigned int row = mpRecipeList->GetSelectRow(); unsigned int column = mpRecipeList->GetSelectRowColumn(); unsigned long recipeIdx = (unsigned long)mpRecipeList->GetColumnData( row, column ); unsigned int total = GetMaxValue( recipeIdx, false ); bool enable = false; if( total > 0 ) { enable = true; } else { enable = false; } if( mpMixStart ) mpMixStart->SetEnabled( enable ); if( mpMixCount ) mpMixCount->SetEnabled( enable ); if( mpMax ) mpMax->SetEnabled( enable ); } else { assert(0); } } } else { if( mpCoolTime ) mpCoolTime->SetText( (LPCTSTR)mpRecipeCool->mStrNextMakeTime.Cstr() ); } } else { ts.Format( GAMERESOURCEMAN->GetItemToolTipText( 2000808 ), 0 ); if( mpCoolTime ) mpCoolTime->SetText( (LPCTSTR)ts.Cstr() ); } } } void cItemMixWindow::NetGaugeEnd( bool success ) { if( mpGaugeBar ) { mpGaugeBar->ClearFront(); if( success == true ) { /// ÀúÀåµÈ Ƚ¼ö¸¸Å­ ´Ù½Ã µ¹¸°´Ù if( mAutoRemainCount > 0 ) { mAutoCount++; mAutoRemainCount--; SetCompleteCount( mAutoCount ); mpMixCount->SetValue( mAutoRemainCount ); } /// Á¶ÇÕÇÒ°Ô ´õ ³²¾Ò´ÂÁö üũ. if( mAutoRemainCount > 0 ) { StartGauge( mAutoSpeed ); } else { StopGauge(); mpMixCount->SetValue( 1 ); } } else { StopGauge(); mpMixCount->SetValue( 1 ); } } } // ¼÷·Ãµµ °»½Å void cItemMixWindow::SetMixExp( unsigned char skillIndex, unsigned long exp ) { // ÇöÀç º¸°íÀÖ´Â º¸Á¶Á÷¾÷ÀÌ¸é °»½Å unsigned char curIndex = (unsigned char)mpSkillCombo->GetSelectData(); if( curIndex == skillIndex ) { if( mpPoint ) mpPoint->SetValue( exp ); // °¢ ¸®½ºÆ®ÀÇ Ä÷¯ °»½Å if( mpRecipeList ) { int rowCnt = mpRecipeList->GetRowCount(); for( int i = 0; i < rowCnt; ++i ) { // »óÀ§¿­ Á¦¿Ü int colCnt = mpRecipeList->GetColumnCount( i ); for( int j = 1; j < colCnt; ++j ) { unsigned long recipeIdx = (unsigned long)mpRecipeList->GetColumnData( i, j ); sMakeSkillScript* script = MAKESKILLSCRIPT->GetMakeSkill( recipeIdx ); if( script ) { sFolderData* folderData = mpRecipeList->GetFolderData( i, j ); if( !folderData ) { assert(0); continue; } // Ä÷¯ °ª ¾ò±â unsigned long newcolor = COLOR_WHITE; // ÃÖ¼Ò¼÷·Ãµµ ~ ±âº»ÃÖ¼Ò¼÷·Ãµµ if( exp >= script->mMinExp && exp < script->mMinDefaultExp ) { newcolor = COLOR_ORANGE; } // ±âº»ÃÖ¼Ò¼÷·Ãµµ ~ ±âº»ÃÖ´ë¼÷·Ãµµ else if( exp >= script->mMinDefaultExp && exp < script->mMaxDefaultExp ) { newcolor = COLOR_YELLOW; } // ±âº»ÃÖ´ë¼÷·Ãµµ ~ ÃÖ´ë¾÷°¡´É¼÷·Ãµµ else if( exp >= script->mMaxDefaultExp && exp < script->mMaxExp ) { newcolor = COLOR_GREEN; } folderData->mTextColor = newcolor; } } } } } } // ¼ÒÀ¯ º¸Á¶Á÷¾÷À¸·Î °»½Å void cItemMixWindow::UpdateMakeSkill() { if( !mpSkillCombo || !mpMixGiveUp ) { assert(0); return; } mpSkillCombo->Clear(); // sHeroInfo* info = HERO->GetHeroInfo(); sMakeSkill* skill1 = &info->MakeSkill1; sMakeSkill* skill2 = &info->MakeSkill2; if( skill1->mIndex == 0 && skill2->mIndex == 0 ) { mpMixGiveUp->SetEnabled( false ); return; } // º¸Á¶Á÷¾÷ 1 ³Ö±â if( skill1->mIndex > 0 ) { unsigned long textIndex = ITEMMIXMAN->GetKeepSkillText( skill1->mIndex ); mpSkillCombo->AddItem( UIMAN->GetUIText( textIndex ), (void*)skill1->mIndex ); } // º¸Á¶Á÷¾÷ 2 ³Ö±â if( skill2->mIndex > 0 ) { unsigned long textIndex = ITEMMIXMAN->GetKeepSkillText( skill2->mIndex ); mpSkillCombo->AddItem( UIMAN->GetUIText( textIndex ), (void*)skill2->mIndex ); } // mpMixGiveUp->SetEnabled( true ); mpSkillCombo->SetSelect( 0 ); } unsigned char cItemMixWindow::GetSelectSkill() { return ( mpSkillCombo ) ? (unsigned char)mpSkillCombo->GetSelectData() : 0; } // Á¦Á¶½ºÅ³ ¸®½ºÆ® °»½Å( ·¹½ÃÇǸñ·Ï ) void cItemMixWindow::UpdateRecipeList( unsigned char skillIndex, bool bInit, bool bPossible ) { if( skillIndex == eMAKESKILL_NONE ) return; /// ÇöÀç UI¸¦ º¸°í ÀÖÀ»¶§¸¸ °»½ÅÇÑ´Ù ( ¾Èº¼¶© showÇϸ鼭 ÀÚµ¿°»½Å ) if( mVisible == false ) return; if( bInit == true ) { /// ÃʱâÈ­ if( mpMixCount ) mpMixCount->SetValue( 1 ); if( mpCompleteCount ) mpCompleteCount->SetValue( 0 ); if( mpGaugeBar ) mpGaugeBar->ClearFront(); if( mpItemList ) mpItemList->Clear(); if( mpMixStart ) mpMixStart->SetEnabled( false ); if( mpMixStop ) mpMixStop->SetEnabled( false ); for( int i = 0; i < 3; ++i ) { mpResultRate[i]->Clear(); mpResultIcon[i]->ChangeImage(0); mpResultIcon[i]->SetNumber(0); mpResultIcon[i]->SetItemIndex(0); } } if( mpRecipeList ) mpRecipeList->Clear(); typedef tPointerHashMap cKeepRecipeMap; cKeepRecipeMap* keepRecipeMap = 0; sMakeSkill* select = 0; sHeroInfo* info = HERO->GetHeroInfo(); if( info ) { sMakeSkill* skill1 = &info->MakeSkill1; sMakeSkill* skill2 = &info->MakeSkill2; if( skill1->mIndex == skillIndex ) { keepRecipeMap = ITEMMIXMAN->GetKeepSkillMap1(); select = skill1; } else if( skill2->mIndex == skillIndex ) { keepRecipeMap = ITEMMIXMAN->GetKeepSkillMap2(); select = skill2; } else { assert(0); return; } } if( !keepRecipeMap ) return; /// ¼¼ÆÃ typedef tList cTempList; cTempList tempList; cKeepRecipeMap::cIterator i = keepRecipeMap->Begin(); cKeepRecipeMap::cIterator end = keepRecipeMap->End(); for( ; i != end; ++i ) { unsigned long key = (unsigned long)(i->mFirst); tempList.PushBack( key ); } // Á¤·Ä if( tempList.GetSize() > 1 ) { tempList.Sort(); } typedef tArray* cMaterialArr; cMaterialArr materialArr; cTempList::cIterator ti = tempList.Begin(); cTempList::cIterator tend = tempList.End(); for( ; ti != tend; ++ti ) { unsigned long key = (*ti); sKeepRecipe* data = (sKeepRecipe*)keepRecipeMap->GetAt( key ); if( data ) { sMakeSkillScript* script = MAKESKILLSCRIPT->GetMakeSkill( key ); if( script ) { materialArr = script->mpMaterial; bool bPossibleRecipe = true; unsigned int nMinPossibleCnt = INT_MAX; for( unsigned int i = 0; i < materialArr->GetSize(); i++ ) { sMaterialScript* data = (sMaterialScript*)(*materialArr)[i]; if( data ) { cItemDefine* pItemDefine = ITEMMAN->GetItemDefine( data->mItemIdx ); if( pItemDefine == NULL) { assert(0); return; } sItemCount* p = ITEMMAN->GetItemCount( data->mItemIdx ); unsigned int invenCount = ( p ) ? p->bag : 0; unsigned int makeCount = (invenCount / data->mItemCnt); if( makeCount == 0 ) { bPossibleRecipe = false; nMinPossibleCnt = 0; break; } nMinPossibleCnt = min( nMinPossibleCnt, makeCount ); } else { assert(0); break; } } // ÅØ½ºÆ® unsigned long textIndex = ITEMMIXMAN->GetTypeText( skillIndex, script->mType ); // Ä÷¯ °ª ¾ò±â unsigned long color = COLOR_WHITE; unsigned long exp = select->mExp; // ÃÖ¼Ò¼÷·Ãµµ ~ ±âº»ÃÖ¼Ò¼÷·Ãµµ if( exp >= script->mMinExp && exp < script->mMinDefaultExp ) { color = COLOR_ORANGE; } // ±âº»ÃÖ¼Ò¼÷·Ãµµ ~ ±âº»ÃÖ´ë¼÷·Ãµµ else if( exp >= script->mMinDefaultExp && exp < script->mMaxDefaultExp ) { color = COLOR_YELLOW; } // ±âº»ÃÖ´ë¼÷·Ãµµ ~ ÃÖ´ë¾÷°¡´É¼÷·Ãµµ else if( exp >= script->mMaxDefaultExp && exp < script->mMaxExp ) { color = COLOR_GREEN; } if( bPossible == true ) { if( bPossibleRecipe && nMinPossibleCnt > 0 && nMinPossibleCnt != INT_MAX ) { cStringT str; str.Format( GAMERESOURCEMAN->GetGameText(2834), ITEMMAN->GetItemName( key ), nMinPossibleCnt ); mpRecipeList->AddHighData( script->mType, GAMERESOURCEMAN->GetItemToolTipText( textIndex ), mDefaultColor, 0, mpHighImage ); mpRecipeList->AddLowData( script->mType, (LPTSTR)str.Cstr(), color, (void*)key ); } } else { mpRecipeList->AddHighData( script->mType, GAMERESOURCEMAN->GetItemToolTipText( textIndex ), mDefaultColor, 0, mpHighImage ); if( bPossibleRecipe && nMinPossibleCnt > 0 && nMinPossibleCnt != INT_MAX ) { cStringT str; str.Format( GAMERESOURCEMAN->GetGameText(2834), ITEMMAN->GetItemName( key ), nMinPossibleCnt ); mpRecipeList->AddLowData( script->mType, (LPTSTR)str.Cstr(), color, (void*)key ); } else { mpRecipeList->AddLowData( script->mType, ITEMMAN->GetItemName( key ), color, (void*)key ); } } } } } mpRecipeList->UpdateSelectImage(); } // Á¶ÇÕ °á°ú Àç·á¾ÆÀÌÅÛ °¹¼ö °»½Å void cItemMixWindow::UpdateItemCount() { if( mpMixStart ) mpMixStart->SetEnabled( false ); if( mpMixCount ) mpMixCount->SetEnabled( false ); if( mpMax ) mpMax->SetEnabled( false ); typedef tArray* cMaterialArr; cMaterialArr materialArr; unsigned int row = mpRecipeList->GetSelectRow(); unsigned int column = mpRecipeList->GetSelectRowColumn(); unsigned long recipeIdx = (unsigned long)mpRecipeList->GetColumnData( row, column ); /// Àç·á ¼¼ÆÃ bool readyToMix = true; sMakeSkillScript* script = MAKESKILLSCRIPT->GetMakeSkill( recipeIdx ); if( script ) { materialArr = script->mpMaterial; if( materialArr ) { mpItemList->ClearText(); for( unsigned int i = 0; i < materialArr->GetSize(); ++i ) { sMaterialScript* data = (sMaterialScript*)(*materialArr)[i]; if( data ) { cItemDefine* define = ITEMMAN->GetItemDefine( data->mItemIdx ); if( define ) { // ¾Õ : Àκ¥ °¹¼ö, µÚ : Á¶ÇÕÇʿ䷮ sItemCount* p = ITEMMAN->GetItemCount( data->mItemIdx ); int invenCount = ( p ) ? p->bag : 0; /// ºÎÁ·ÇÑ ¾ÆÀÌÅÛ ºÓÀº»öÀ¸·Î ¹Ù²Ù±â unsigned long color = mDefaultColor; if( invenCount < data->mItemCnt ) { color = COLOR_RED; readyToMix = false; } unsigned int row = mpItemList->AddRow( define->GetName(), color, (void*)data->mItemIdx ); if( row >= 0 ) { cStringT countStr; countStr.Format( _T("%d/%d"), invenCount, data->mItemCnt ); mpItemList->AddColume( row, (LPCTSTR)countStr.Cstr(), color ); } } else { assert(0); } } else { assert(0); } } /// ÀÚµ¿ Á¶ÇÕÁßÀÌ ¾Æ´Ï¸é ¹öư ´Ù½Ã Ȱ¼ºÈ­ if( readyToMix == true && mAutoRemainCount == 0 && DUELMAN->IsDuelEnable() == false ) { if( mpMixStart ) mpMixStart->SetEnabled( true ); if( mpMixCount ) mpMixCount->SetEnabled( true ); if( mpMax ) mpMax->SetEnabled( true ); } } } } void cItemMixWindow::InitCoolTime() { mpRecipeCool = 0; if( mpCoolTime ) { cStringT ts; ts.Format( GAMERESOURCEMAN->GetItemToolTipText( 2000808 ), 0 ); mpCoolTime->SetText( (LPCTSTR)ts.Cstr() ); } } void cItemMixWindow::SetCompleteCount( int count ) { if( mpCompleteCount ) mpCompleteCount->SetValue( count ); } void cItemMixWindow::StartGauge( float speed ) { if( mpGaugeBar ) { mpGaugeBar->SetGaugeSpeed( speed ); mpGaugeBar->SetGaugeAni( 100 ); } if( mpMixStop ) mpMixStop->SetEnabled( true ); if( mpRecipeList ) mpRecipeList->SetEnabled( false ); if( mpSkillCombo ) mpSkillCombo->SetEnabled( false ); if( mpMixStart ) mpMixStart->SetEnabled( false ); if( mpMixGiveUp ) mpMixGiveUp->SetEnabled( false ); if( mpMixCount ) mpMixCount->SetEnabled( false ); if( mpMax ) mpMax->SetEnabled( false ); if( mpPossibleRecipeCheck ) mpPossibleRecipeCheck->SetEnabled( false ); } void cItemMixWindow::StopGauge() { mAutoRemainCount = 0; mAutoCount = 0; mAutoSpeed = 0; if( mpGaugeBar ) mpGaugeBar->ClearFront(); if( mpRecipeList ) mpRecipeList->SetEnabled( true ); if( mpSkillCombo ) mpSkillCombo->SetEnabled( true ); if( mpMixStart ) mpMixStart->SetEnabled( true ); if( mpMixGiveUp ) mpMixGiveUp->SetEnabled( true ); if( mpMixCount ) mpMixCount->SetEnabled( true ); if( mpMax ) mpMax->SetEnabled( true ); if( mpMixStop ) mpMixStop->SetEnabled( false ); if( mpPossibleRecipeCheck ) mpPossibleRecipeCheck->SetEnabled( true ); } void cItemMixWindow::OnNetLock( int lockTry ) { if( lockTry == eLOCK_ITEMMIXDELETE ) { if( mpMixGiveUp ) mpMixGiveUp->SetEnabled( false ); } } void cItemMixWindow::OnNetUnLock( int lockTry ) { if( lockTry == eLOCK_ITEMMIXDELETE ) { sHeroInfo* info = HERO->GetHeroInfo(); // º¸Á¶½ºÅ³ÀÌ Çϳªµµ¾øÀ¸¸é Ȱ¼ºÈ­½ÃŰÁö ¾Ê´Â´Ù bool enable = ( info->MakeSkill1.mIndex == 0 && info->MakeSkill2.mIndex == 0 ) ? false : true; if( mpMixGiveUp ) mpMixGiveUp->SetEnabled( enable ); } } cItemMixListFolder::cItemMixListFolder() { } cItemMixListFolder::~cItemMixListFolder() { } int cItemMixListFolder::FindColumnByExtra( unsigned long type, unsigned long recipe ) { int totalCount = 0; for( unsigned int ri = 0; ri < mRows.GetSize(); ++ri ) { sRowData* p = (sRowData*)mRows[ri]; if( p && p->mColumes.GetSize() > 0 ) { sFolderData* data = (sFolderData*)p->mColumes[0]; if( !data ) { assert(0); continue; } if( data->key != (long)type ) { if( data->mCheck == true ) totalCount += p->mColumes.GetSize(); else totalCount += 1; } else { // Á¢ÇôÀÖÀ¸¸é ¸®ÅÏ if( data->mCheck == false ) return -1; /// µ¿ÀÏ µ¥ÀÌÅÍ °Ë»ö for( unsigned int ci = 0; ci < p->mColumes.GetSize(); ++ci ) { sFolderData* data = (sFolderData*)p->mColumes[ci]; if( !data ) { assert(0); continue; } if( ci > 0 && (unsigned long)(data->mExtraData) == recipe ) return totalCount; totalCount++; } break; } } } return -1; }