#include "Stdafx.h" #include "BuffWindow.h" #include "FontAgent.h" #include "UISkinLexer.h" #include "SkillManager.h" #include "SkillScript.h" #include "icon.h" #include "GameUIManager.h" #include "ObjectManager.h" #include "hero.h" #include "GameResourceManager.h" #include "Skill_Common.h" cBuffWindow::cBuffWindow() { mUpdateList = false; mStartX = mStartY = 0; mOverInfo.mOverIconIdx = (unsigned int)-1; mOverCheck = false; mChangeOverIcon = false; mRButtonClickIconIdx = (unsigned int)-1; mIsHeroBuffPage = false; mRowSpace = 0; mColumnSpace = 0; mBuffTipShow = false; mRow = 0; mColumn = 0; mIconSize = 0; mScale = 1; mImageFont = 0; /// ´Ù¸¥ À©µµ¿ìµéÀÌ ¾ÈºÙ°Ô ÇÑ´Ù SetExceptSnap( true ); } cBuffWindow::~cBuffWindow() { cBuffIconList::cIterator i = mIconList.Begin(); cBuffIconList::cIterator iend = mIconList.End(); for( ; i != iend; ++i ) { sBuffIcon* p = (sBuffIcon*)(*i); delete p; } mIconList.Clear(); } void cBuffWindow::Clear() { mUpdateList = false; mOverInfo.mOverIconIdx = (unsigned int)-1; mOverCheck = false; mChangeOverIcon = false; mRButtonClickIconIdx = (unsigned int)-1; cBuffIconList::cIterator i = mIconList.Begin(); cBuffIconList::cIterator iend = mIconList.End(); for( ; i != iend; ++i ) { sBuffIcon* p = (sBuffIcon*)(*i); delete p; } mIconList.Clear(); } void cBuffWindow::Open() { } void cBuffWindow::Close() { cUIWindow::Close(); Clear(); } bool cBuffWindow::OnCreate( cUINodeProperty* pproperty ) { mImageFont = UIMAN->GetImageFont( eIAMGEFONT_ITEMCOUNT ); return cUIWindow::OnCreate( pproperty ); } void cBuffWindow::OnShow() { cUIWindow::OnShow(); if( mIconList.IsEmpty() ) Hide(); } void cBuffWindow::OnHide() { cUIWindow::OnHide(); mOverInfo.mOverIconIdx = (unsigned int)-1; mChangeOverIcon = false; mOverCheck = false; } bool cBuffWindow::SetSkin( const cUINodeSkin* pskin ) { cBuffWindowSkin* p = (cBuffWindowSkin*)pskin; mHoldView = p->mHoldView; mStartX = p->mSkinInfo->mX; mStartY = p->mSkinInfo->mY; /// ºÎ¸ð°¡ ·çÆ® ŸÀÔÀÌ¸é ¸ðµÎ °»½Å if( mpParent->GetType() == eUINODE_ROOT ) { mStartX = GetScreenWidth() - mDefaultWidth + p->mSkinInfo->mX; } mRow = p->mRow; mColumn = p->mColumn; if( mRowSpace == 0 ) mRowSpace = p->mRowSpace; if( mColumnSpace == 0 ) mColumnSpace = p->mColumnSpace; mIconSize = p->mIconSize; mScale = p->mScale; SetRelativeRect( cUIRect(mStartX,mStartY,mStartX,mStartY) ); mTimerEnabled = true; mTimeOut = 100; return true; } void cBuffWindow::UpdateSkin() { cUISkin* pskin = UIMAN->GetSkin(); if( pskin == 0 ) { assert(0); return; } /// ³ëµå ½ºÅ² °Ë»ö cUINodeSkin* pnodeSkin = pskin->GetNodeSkin( mSkinName ); if( pnodeSkin == 0 ) { assert(0); return; } /// »çÀÌÁî´Â »õ·Î¿î »ó´ëÁÂÇ¥ * »õ·Î¿î ÇØ»óµµ mStartX = pnodeSkin->mSkinInfo->mX; mStartY = pnodeSkin->mSkinInfo->mY; /// ºÎ¸ð°¡ ·çÆ® ŸÀÔÀÌ¸é ¸ðµÎ °»½Å if( mpParent->GetType() == eUINODE_ROOT ) { mStartX = GetScreenWidth() - mDefaultWidth + pnodeSkin->mSkinInfo->mX; } /// Àû¿ë SetRelativeRect( cUIRect(mStartX,mStartY,mStartX,mStartY) ); /// ±âÁ¸ ÇØ»óµµ ÀúÀå mOldScreenWidth = GetScreenWidth(); mOldScreenHeight = GetScreenHeight(); mUpdateList = true; } void cBuffWindow::OnMouseMove( const cUIPos& pos ) { /// 1ÃÊ ´ÜÀ§ üũ if( mOverCheck == false ) return; mOverCheck = false; unsigned int x = mStartX; unsigned int y = mStartY; if( mpParent ) { x += mpParent->GetAbsoluteRect().mLeft; y += mpParent->GetAbsoluteRect().mTop; } unsigned int col; for( col=0; colIsJumping() == true ) return; if( IsNetLock() == true ) return; unsigned int x = mStartX; unsigned int y = mStartY; if( mpParent ) { x += mpParent->GetAbsoluteRect().mLeft; y += mpParent->GetAbsoluteRect().mTop; } unsigned int col; for( col=0; colGetInfluenceInfo( p->mInfluenceIdx ); if( pScript == 0 ) { assert(0); return; } /// ±ôºýÀ̱â if( p->mStartBlink ) { if( p->mBlinkTime == 0 ) p->mBlinkTime = accumTime; unsigned long checkTime = (p->mShow==true)? 1000:500; if( checkTime <= accumTime - p->mBlinkTime ) { p->mBlinkTime = accumTime; p->mShow = !p->mShow; } } /// ³²Àº ½Ã°£ ȹµæ cInfluenceObject* pInf = SKILLMAN->GetInfluenceObject( p->mUniqueIdx ); if( pScript->mType == eINFLUENCETYPE_BUF || pScript->mType == eINFLUENCETYPE_DEBUF || pScript->mType == eINFLUENCETYPE_CASH ) { if( pInf && pInf->GetIsRealTime() == false ) { unsigned int restTime = pInf->GetRestTime()/1000; if( restTime == 0 ) { p->mUnit.Clear(); } else { unsigned int d = (restTime / 60) / 60 / 24; unsigned int h = (restTime / 60) / 60 % 24; unsigned int m = (restTime / 60) % 60; unsigned int s = (restTime % 60) % 60 + 1; /// ¹Ý¿Ã¸²Çؼ­ Ãâ·Â if( d != 0 ) d++; if( h != 0 ) h++; if( m != 0 ) m++; if( d != 0 ) p->mUnit.Format( GAMERESOURCEMAN->GetGameText( 74 ), d ); else if( h != 0 ) p->mUnit.Format( GAMERESOURCEMAN->GetGameText( 70 ), h ); else if( m != 0 ) p->mUnit.Format( GAMERESOURCEMAN->GetGameText( 71 ), m ); else p->mUnit.Format( GAMERESOURCEMAN->GetGameText( 72 ), s ); } } } else p->mUnit.Clear(); if( pInf ) p->mGaurdCnt = pInf->GetGuardCnt(); if( count == mRow*mColumn ) continue; /// ¿µ¿ª Àç¼³Á¤ if( mUpdateList ) { unsigned int sx = mStartX; unsigned int sy = mStartY; if( mpParent ) { cUIRect parentAbsolute = mpParent->GetAbsoluteRect(); sx += parentAbsolute.mLeft; sy += parentAbsolute.mTop; } unsigned int x = sx + ((mColumn-(count%mColumn)-1) * (mIconSize+mColumnSpace)); unsigned int y = sy + ((count/mColumn) * (mIconSize+mRowSpace)); p->mImage.SetScreenRect( cUIRect(x, y, x+mIconSize, y+mIconSize) ); p->mTextX = x; p->mTextY = y+mIconSize + 1; } if( mChangeOverIcon && mOverInfo.mOverIconIdx == count ) { EventOverIcon( p, mOverInfo.mPos ); mChangeOverIcon = false; } if( mRButtonClickIconIdx == count ) { mRButtonClickIconIdx = (unsigned int)-1; if( pScript->mTypeDetail == eINFLUENCETYPEDETAIL_NAME ) return; if( p->mAuraType == false ) { if( pScript->mType == eINFLUENCETYPE_BUF ) { MSG_REQ_INFLUENCE_DELETE Msg; Msg.Category = NM_SKILL; Msg.Protocol = NM_SKILL_INFLUENCE_DELETE_REQ; Msg.mUniqueIdx = p->mUniqueIdx; NETWORK->SendNetworkMsg( (char*)&Msg, sizeof( Msg ) ); /// ¶ô NetLock(); } else if( pScript->mType == eINFLUENCETYPE_CASH ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_DELETE_CASHBUFF, eSKIN_YESNO, GAMERESOURCEMAN->GetGameText( 6501 ), GAMERESOURCEMAN->GetGameText( 6500 ), (void*)p->mUniqueIdx ); } } } count++; } } void cBuffWindow::OnRender( cUIFontItemKeeper* pKeeper ) { if( mUpdateList ) { /// window Àç°è»ê cUIRect r; r.mRight = mStartX + mColumn*(mIconSize+mColumnSpace) - mColumnSpace; r.mTop = mStartY; if( mIconList.GetSize() < mColumn ) r.mLeft = mStartX + (mColumn - mIconList.GetSize())*(mIconSize+mColumnSpace); else r.mLeft = mStartX; unsigned int row = min((mIconList.GetSize()-1)/mColumn + 1, mRow); r.mBottom = mStartY + row * (mIconSize+mRowSpace) - mRowSpace; SetRelativeRect( r ); } unsigned int count = 0; cBuffIconList::cIterator i = (--mIconList.End()); cBuffIconList::cIterator iend = (--mIconList.Begin()); for( ; i != iend; --i ) { if( count == mRow*mColumn ) break; sBuffIcon* p = (sBuffIcon*)(*i); if( !p ) { assert(0); return; } if( p->mShow ) { p->mImage.Draw(); if( p->mGaurdCnt != 0 ) { cUIRect rc; rc.mLeft = p->mImage.GetScreenPosX(); rc.mRight = rc.mLeft + p->mImage.GetWidth(); rc.mTop = p->mImage.GetScreenPosY(); rc.mBottom = rc.mTop + p->mImage.GetHeight(); if( p->mGaurdCnt > 999 ) { cStringT str = _T("*"); int w = FONTAGENT->GetTextExtent( cFontAgent::eFont_UI, const_cast(str.Cstr()), str.GetLength() ); int h = FONTAGENT->GetTextHeight( cFontAgent::eFont_UI ); pKeeper->AddFontItem( cFontAgent::eFont_UI, const_cast(str.Cstr()), rc.mRight - w - 3, rc.mBottom - h + 1, COLOR_WHITE ); } else { cString str; str.Format( "%d", p->mGaurdCnt ); if( mImageFont ) mImageFont->DrawText( rc.mRight - mImageFont->GetTextWidth(p->mGaurdCnt) - 1, rc.mBottom - mImageFont->GetTextHeight() - 1, str.Cstr() ); } } } pKeeper->AddFontItem( cFontAgent::eFont_System, p->mUnit.Cstr(), p->mTextX, p->mTextY, COLOR_WHITE ); count++; } mUpdateList = false; pKeeper->DrawAll(); } void cBuffWindow::AddIcon( unsigned long uniqueIdx, unsigned long influenceIdx ) { sInfluenceScript* pInfo = SKILLSCRIPT->GetInfluenceInfo( influenceIdx ); if( pInfo == 0 ) { assert(0); return; } cIconParam* pParam = UIMAN->GetIconParam( pInfo->mIconIdx ); if( pParam == 0 ) { assert(0); return; } sBuffIcon* p = new sBuffIcon; p->mTotalTime = pInfo->mContinuanceTime; p->mAuraType = (pInfo->mTypeDetail == eINFLUENCETYPEDETAIL_AURA); p->mUniqueIdx = uniqueIdx; p->mInfluenceIdx = influenceIdx; /// À̹ÌÁö ¼ÂÆÃ p->mImage.SetTexture( pParam->mpTexture ); /// ÅØ½ºÃ³ ¿µ¿ª ¼³Á¤ unsigned int tx = pParam->mTexPos.mX; unsigned int ty = pParam->mTexPos.mY; p->mImage.SetTextureRect( tx, ty, tx + ICON_SIZE, ty + ICON_SIZE ); mIconList.PushBack( p ); HideTip(); mUpdateList = true; /// npc À©µµ¿ì°¡ º¸ÀÌ¸é ¿ì¼± ¿¹¾à if( HERO->IsOpenNpcTalk() == false && GAMEUI->IsDuelMode() == false ) Show(); else UIMAN->SetRestoreShow( this ); mRButtonClickIconIdx = (unsigned int)-1; } void cBuffWindow::DelIcon( unsigned long uniqueIdx ) { cBuffIconList::cIterator i = mIconList.Begin(); cBuffIconList::cIterator iend = mIconList.End(); for( ; i != iend; ++i ) { sBuffIcon* p = (sBuffIcon*)(*i); if( !p ) { assert(0); return; } if( p->mUniqueIdx == uniqueIdx ) { delete p; mIconList.Erase( i ); break; } } HideTip(); mUpdateList = true; if( mIconList.IsEmpty() ) Hide(); mRButtonClickIconIdx = (unsigned int)-1; } void cBuffWindow::BlinkIcon( unsigned long uniqueIdx, unsigned long influenceIdx ) { cBuffIconList::cIterator i = mIconList.Begin(); cBuffIconList::cIterator iend = mIconList.End(); for( ; i != iend; ++i ) { sBuffIcon* p = (sBuffIcon*)(*i); if( !p ) { assert(0); return; } if( p->mInfluenceIdx == influenceIdx && p->mUniqueIdx == uniqueIdx ) { p->mStartBlink = true; break; } } } void cBuffWindow::EventOverIcon( sBuffBaseIcon* p, const cUIPos& pos ) { cBuffToolTipWindow* pTip = GAMEUI->GetBuffTip(); if( pTip && p ) { mBuffTipShow = true; UIMAN->ShowBuffTip( pTip, pos, p->mUniqueIdx, p->mInfluenceIdx, mIsHeroBuffPage ); } } void cBuffWindow::HideTip() { if( mBuffTipShow == true ) { mBuffTipShow = false; UIMAN->HideTip(); mOverInfo.mOverIconIdx = (unsigned long)-1; } } void cBuffWindow::OnNetLock( int lockTry ) { cUINode::NetLock( lockTry ); } void cBuffWindow::OnNetUnLock( int lockTry ) { cUINode::NetUnLock( lockTry ); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// cBuffWindowSkin::cBuffWindowSkin( eUINodeType type ) : cUIWindowSkin(type) { mRowSpace = 0; mColumnSpace = 0; mRow = 0; mColumn = 0; mIconSize = 0; mScale = 1.0f; } cBuffWindowSkin::~cBuffWindowSkin() { } bool cBuffWindowSkin::Load( cParser& parser ) { if( parser.ExpectTokenString( "{" ) == false ) { return false; } cToken token; cLexer* lexer = parser.GetLexer(); while( lexer->GetNextToken( &token ) ) { if( token == "}" ) { /// ºí·Ï Å»Ãâ ^^ break; } switch( token.mType ) { case eTOKEN_ICON_SIZE: { mIconSize = parser.ParseInt(); } break; case eTOKEN_BUFF_SPACE: { mColumnSpace = parser.ParseInt(); mRowSpace = parser.ParseInt(); } break; case eTOKEN_BUFF_ROW: { mRow = parser.ParseInt(); } break; case eTOKEN_BUFF_COLUMN: { mColumn = parser.ParseInt(); } break; case eTOKEN_BUFF_SCALE: { mScale = (float)parser.ParseInt()/100.0f; } break; case eTOKEN_HOLDVIEW: { if( parser.ParseString().Compare( "true" ) == 0 ) mHoldView = true; else mHoldView = false; } break; default: if( cUINodeSkin::ParseLine( parser, token ) == false ) { return false; } break; } } return true; }