#include "stdafx.h" #include "NpcTutorialWindow.h" #include "ObjectManager.h" #include "Hero.h" #include "Label.h" #include "TextBox.h" #include "ListBox.h" #include "QuestManager.h" #include "UIImage.h" #include "UINpcTelling.h" #include "UIFuncText.h" #include "GameResourceManager.h" #include "Page.h" #include "ResourceManager.h" #include "FontAgent.h" cNpcTutorialWindow::cNpcTutorialWindow() { SetExceptEvent( true ); SetExceptSnap( true ); } cNpcTutorialWindow::~cNpcTutorialWindow() { Clear(); SAFE_DELETE( mSceneImage ); } void cNpcTutorialWindow::Close() { cUIWindow::Close(); SAFE_DELETE( mSceneImage ); Clear(); if( mNameLabel ) mNameLabel->Clear(); if( mpQuestList ) mpQuestList->Hide(); HERO->CloseNpcTalk( false ); mNpcClassIndex = 0; mNpcIndex = 0; } void cNpcTutorialWindow::Show( unsigned int npcClassIdx, unsigned long npcIndex, LPCTSTR npcName ) { mNpcClassIndex = npcClassIdx; mNpcIndex = npcIndex; mIsUseQuest = false; /// À̸§À» ¼³Á¤ if( mNameLabel ) mNameLabel->SetText( npcName ); // HERO->OpenNpcTalk( npcIndex, false ); /// Äù½ºÆ® ¸®½ºÆ® ¼¼ÆÃ QUESTMAN->SetNpcQuestList( this, mNpcIndex, mNpcClassIndex ); /// ÀÚ±âÀڽŠº¸À̱â cUIWindow::Show(); } void cNpcTutorialWindow::OnShow() { cUIWindow::OnShow(); HERO->SetNpcFunc( NPC_FUNC_TUTORIALBOOK ); int x = (int)(( GetScreenWidth() - GetAbsoluteRect().GetWidth() ) * 0.5f); int y = (int)(( GetScreenHeight() - GetAbsoluteRect().GetHeight() ) * 0.5f); SetRelativePos( cUIPos( x, y ) ); /// ±âº» ´ë»ç¸¦ Ç¥½Ã cUIFuncTextParam textParam; textParam.mName = HERO->GetName(); if( mpTextBox ) mpTextBox->Clear(); mTelling = UIMAN->GetNpcTelling( mNpcClassIndex ); if( mTelling ) { sPageText* pageText = mTelling->GetDefaultTextRandomly(); if( pageText ) { for( unsigned int i = 0; i < pageText->numLine; ++i ) { if( mpTextBox ) mpTextBox->AddFucnText( UIMAN->GetNpcTextNode( pageText->textIndex + i ), &textParam ); } } /// Àå¸éÀÖÀ¸¸é À̹ÌÁö Ãâ·Â mSceneIndex = mTelling->GetDefaultScene(); UpdateScene(); } else { Hide(); } } void cNpcTutorialWindow::OnHide() { cUIWindow::OnHide(); if( HERO->GetNpcFunc() == NPC_FUNC_TUTORIALBOOK ) { HERO->CloseNpcTalk(); } mNpcClassIndex = 0; mNpcIndex = 0; /// Äù½ºÆ® Á¤º¸ Ŭ¸®¾î Clear(); if( mNameLabel ) mNameLabel->Clear(); if( mpQuestList ) mpQuestList->Hide(); } void cNpcTutorialWindow::ShowDefaultPage() { Clear(); /// À§Ä¡¼³Á¤ int x = (int)(( GetScreenWidth() - GetAbsoluteRect().GetWidth() ) * 0.5f); int y = (int)(( GetScreenHeight() - GetAbsoluteRect().GetHeight() ) * 0.5f); SetRelativePos( cUIPos( x, y ) ); /// ±âº» ´ë»ç¸¦ Ç¥½Ã cUIFuncTextParam textParam; textParam.mName = HERO->GetName(); if( mpTextBox ) mpTextBox->Clear(); mTelling = UIMAN->GetNpcTelling( mNpcClassIndex ); if( mTelling ) { sPageText* pageText = mTelling->GetDefaultTextRandomly(); if( pageText ) { for( unsigned int i = 0; i < pageText->numLine; ++i ) { if( mpTextBox ) mpTextBox->AddFucnText( UIMAN->GetNpcTextNode( pageText->textIndex + i ), &textParam ); } } /// Àå¸éÀÖÀ¸¸é À̹ÌÁö Ãâ·Â mSceneIndex = mTelling->GetDefaultScene(); UpdateScene(); } if( mpQuestList ) mpQuestList->Hide(); } bool cNpcTutorialWindow::OnCreate( cUINodeProperty* pproperty ) { if( cUIWindow::OnCreate( pproperty ) == false ) return false; mNameLabel = (cLabel*)GetChild( eUIID_TUTORIALBOOK_NAME ); mpTextBox = (cTextBox*)GetChild( eUIID_TUTORIALBOOK_TEXT ); mpQuestList = (cListBox*) GetChild( eUIID_TUTORIALBOOK_QUESTLIST ); mpClose = GetChild( eUIID_TUTORIALBOOK_CLOSE ); if( mpTextBox ) { mpTextBox->SetFontType( cFontAgent::eFont_Npc ); mpTextBox->SetDrawTextBottom( false ); } if( mpQuestList ) { mpQuestList->SetFontType( cFontAgent::eFont_Npc ); mpQuestList->SetContinueEvent( true ); mpQuestList->Hide(); } /// Àå¸éÀ̹ÌÁö »ý¼º cUISkin* pSkin = UIMAN->GetSkin(); if( !pSkin ) return false; /// À̹ÌÁö »ý¼º mSceneSkin = pSkin->GetNodeSkin( "TutorialBook_Scene" ); if( mSceneSkin ) { mSceneImage = new cUIImage; } /// npc À̸§»ö if( mNameLabel ) { mNameLabel->SetFontType( cFontAgent::eFont_Npc); mNameLabel->SetTextColor( 0xFFE9E47C ); } return true; } void cNpcTutorialWindow::UpdateSkin() { cUIWindow::UpdateSkin(); /// À§Ä¡¼³Á¤ int x = (int)(( GetScreenWidth() - GetAbsoluteRect().GetWidth() ) * 0.5f); int y = (int)(( GetScreenHeight() - GetAbsoluteRect().GetHeight() ) * 0.5f); SetRelativePos( cUIPos( x, y ) ); if( mSceneIndex > 0 && mSceneImage ) { sSceneData* scene = UIMAN->GetSceneData( mSceneIndex ); if( scene ) { unsigned int x = mSceneSkin->mSkinInfo->mX + GetAbsoluteRect().mLeft; unsigned int y = mSceneSkin->mSkinInfo->mY + GetAbsoluteRect().mTop; unsigned int w = scene->mTexWidth; unsigned int h = scene->mTexHeight; mSceneImage->SetScreenRect( cUIRect( x, y, x+w, y+h ) ); } } } void cNpcTutorialWindow::OnRender( cUIFontItemKeeper* pKeeper ) { if( mVisible == false ) return; /// À̹ÌÁö ·»´õ¸µ if( mpImage ) mpImage->Draw(); /// ÀÚ½Ä ·»´õ¸µ cChildList::cIterator i = mChildList.Begin(); cChildList::cIterator end = mChildList.End(); for( ; i != end; ++i ) { if( ((cUINode*)(*i))->IsVisible() == true ) { ((cUINode*)(*i))->OnRender(pKeeper); } } pKeeper->DrawAll(); /// NPC À̹ÌÁö ±×¸°ÈÄ, À©µµ¿ì ±×¸®±â if( mSceneIndex > 0 && mSceneImage ) mSceneImage->Draw(); } void cNpcTutorialWindow::OnCommand( cUINode*, unsigned int id ) { if( IsNetLock() == true ) return; switch( id ) { case eUIID_TUTORIALBOOK_CLOSE: Hide(); break; } } void cNpcTutorialWindow::OnListBoxChanged( cUINode* , unsigned int ) { if( IsNetLock() == true ) return; /// Äù½ºÆ® »ç¿ë»óÅÂÀÎÁö ¿©ºÎ if( mIsUseQuest == false ) { SelectQuest(); } else { unsigned int selectIdx = mpQuestList->GetSelectIndex(); unsigned int nextPageIdx = (unsigned int)mpQuestList->GetExtraData( selectIdx ); /// óÀ½À¸·Î ó¸® if( nextPageIdx == 0 ) { ShowDefaultPage(); // QUESTMAN->SetNpcQuestList( this, mNpcIndex, mNpcClassIndex ); } /// ´Ý±â ó¸® else if( nextPageIdx == ULONG_MAX ) { Hide(); } /// Àå¸é °»½Å else { cPage* nextPage = mTelling->GetPage( nextPageIdx ); if( !nextPage ) { assert(0); return; } eAnswerEvent event = nextPage->GetAnswerEvent(); bool retvalue = false; //if( (mStatus == eNPCQUEST_LOW_LEVEL_NEW || mStatus == eNPCQUEST_NEW) && event == eEVENT_YES ) if( mStatus == eNPCQUEST_NEW && event == eEVENT_YES ) { retvalue = QUESTMAN->QuestAddByNpc( mQuestIndex, mNpcIndex ); } else if( mStatus == eNPCQUEST_COMPLETE && event == eEVENT_COMPLETE ) { retvalue = QUESTMAN->QuestComplete( mQuestIndex, mNpcIndex ); } else if( mStatus == eNPCQUEST_COMPLETE && event == eEVENT_REWARD ) { retvalue = QUESTMAN->QuestReward( mQuestIndex, mNpcIndex ); } else if( mStatus == eNPCQUEST_REWARD && event == eEVENT_REWARD ) { retvalue = QUESTMAN->QuestReward( mQuestIndex, mNpcIndex ); } else { /// À̺¥Æ®°¡ ¾øÀ¸¸é ±×³É ´ÙÀ½ÆäÀÌÁö·Î ³Ñ±ä´Ù mNextPageIdx = nextPageIdx; UpdateDialog(); } /// °á°ú¿¡µû¸¥ ÆäÀÌÁö ÀúÀå if( retvalue == true ) mNextPageIdx = nextPageIdx; } } } void cNpcTutorialWindow::SelectQuest() { if( !mpQuestList ) return; mIsUseQuest = true; unsigned int selectIdx = mpQuestList->GetSelectIndex(); sQuestStatus* exData = (sQuestStatus*)mpQuestList->GetExtraData( selectIdx ); /// ´ÙÀ̾ó·Î±× Á¤º¸ ¼¼ÆÃ if( mTelling ) { if( SetDialog( exData->questIdx, exData->status ) == true ) { cQuestDefine* define = QUESTMAN->GetQuestDefine( exData->questIdx ); assert(define); if( define ) { if( mNameLabel ) mNameLabel->SetText( GAMERESOURCEMAN->GetQuestTitle( define->mTitleIndex ) ); } } } } /// Äù½ºÆ® °ü·Ã ´ë»çÁ¤º¸ °¡Á®¿Í¼­ È­¸é ±¸¼º bool cNpcTutorialWindow::SetDialog( unsigned long quetIdx, unsigned int status ) { mQuestIndex = quetIdx; mStatus = status; mNextPageIdx = 0; /// ¿¬°á ´ë»çÁ¤º¸ ȹµæ sQuestLinkPage* linkPage = mTelling->GetQuestLinkPage( quetIdx ); if( !linkPage ) return false; unsigned long pageIdx = 0; switch( mStatus ) { case eNPCQUEST_PLAYING: pageIdx = linkPage->playIndex; break; // case eNPCQUEST_LOW_LEVEL_NEW: pageIdx = linkPage->newIndex; break; case eNPCQUEST_NEW: pageIdx = linkPage->newIndex; break; case eNPCQUEST_COMPLETE: pageIdx = linkPage->completeIndex; break; /// complete ÆäÀÌÁö·ÎºÎÅÍ EVENT_COMPLETE ³ª¿À´Â ºÎºÐã±â case eNPCQUEST_REWARD: pageIdx = linkPage->rewardIndex; break; default: assert(0); return false; } /// È­¸é°»½Å ÆäÀÌÁö mNextPageIdx = pageIdx; /// ÆäÀÌÁö Á¤º¸ cPage* page = mTelling->GetPage( pageIdx ); if( !page ) { assert(0); return false; } eAnswerEvent event = page->GetAnswerEvent(); bool retvalue = true; switch( mStatus ) { // case eNPCQUEST_LOW_LEVEL_NEW: case eNPCQUEST_NEW: /// ½Å±Ô¿äû if( event == eEVENT_YES ) { retvalue = QUESTMAN->QuestAddByNpc( mQuestIndex, mNpcIndex ); } break; case eNPCQUEST_COMPLETE: /// ÁøÇà¿Ï·á¿äû if( event == eEVENT_COMPLETE ) { retvalue = QUESTMAN->QuestComplete( mQuestIndex, mNpcIndex ); } break; case eNPCQUEST_REWARD: /// º¸»ó¿äû if( event == eEVENT_REWARD ) { retvalue = QUESTMAN->QuestReward( mQuestIndex, mNpcIndex ); } break; case eNPCQUEST_PLAYING: break; default: assert(0); return false; } /// Àå¸é°»½Å return UpdateDialog(); } /// ´ÙÀ½ Àå¸é ±¸¼º bool cNpcTutorialWindow::UpdateDialog( bool rewardItemSeleted ) { if( !mpQuestList ) return false; if( !mpTextBox ) return false; /// ÃʱâÈ­ mpTextBox->Clear(); mpQuestList->Clear(); /// Ãâ·Â¿ë ÆäÀÌÁö °¡Á®¿À±â cPage* page = mTelling->GetPage( mNextPageIdx ); if( !page ) return false; /// Àå¸é ¼¼ÆÃ mSceneIndex = page->GetSceneIdx(); UpdateScene(); /// ±âº» ´ë»ç¸¦ Ç¥½Ã cUIFuncTextParam textParam; textParam.mName = HERO->GetName(); /// ±âº»´ë»ç Ãâ·Â sPageText* pageText = page->GetPageText(); if( pageText && mpTextBox ) { for( unsigned int i = 0; i < pageText->numLine; ++i ) { mpTextBox->AddFucnText( UIMAN->GetNpcTextNode( pageText->textIndex + i ), &textParam ); } } //cQuestDefine* define = QUESTMAN->GetQuestDefine( mQuestIndex ); //eAnswerEvent event = page->GetAnswerEvent(); /// Äù½ºÆ® Æ÷»ó ¾ÆÀÌÅÛ ¼±ÅÃÇØ¾ß ÇÒ °æ¿ì ¾È³»¹® °­Á¦ Ãâ·Â if( mpQuestList->IsEnabled() == false ) mpQuestList->SetEnabled( true ); /// ´ë´ä¿ë ´ë»ç Ãâ·Â typedef tArray cAnswerArr; cAnswerArr& ansArr = page->GetAnswerArr(); for( unsigned int b = 0; b < ansArr.GetSize(); ++b ) { sPageAnswer* ansText = (sPageAnswer*)ansArr[b]; if( !ansText ) { assert(0); return false; } unsigned long textcolor = mDefaultColor; for( unsigned i = 0; i < ansText->numLine; ++i ) { cUIFuncTextNode* node = UIMAN->GetNpcTextNode( ansText->textIndex + i ); if( !node ) { assert(0); continue; } for( ; node; node = node->GetNext() ) { if( node->mColor ) textcolor = node->mColor; if( node->mpString ) mpQuestList->AddRow( node->mpString, textcolor, (void*)ansText->nextPageIndex ); } } } /// ´ë»ç°¡ ¾ø°í next ÀÌ¸é ´ÙÀ½ÆäÀÌÁö ³Ñ±â±â if( ansArr.GetSize() == 0 ) { if( page->GetNextPageIdx() > 0 ) { mpQuestList->AddRow( UIMAN->GetUIText( 83 ), mDefaultColor, (void*)page->GetNextPageIdx() ); } else { /// ´ë»ç°¡ ¾øÀ¸¸é /// ½Å±ÔÆäÀÌÁöÀ̸é "´Ý±â"Ãâ·Â if( page->GetAnswerEvent() == eEVENT_YES ) { mpQuestList->AddRow( UIMAN->GetUIText( 112 ), mDefaultColor, (void*)(ULONG_MAX) ); } /// ³ª¸ÓÁö´Â "óÀ½À¸·Î" Ãâ·Â else { mpQuestList->AddRow( UIMAN->GetUIText( 84 ), mDefaultColor ); } } } return true; } void cNpcTutorialWindow::UpdateScene() { if( mSceneIndex == 0 || !mSceneImage ) return; sSceneData* scene = UIMAN->GetSceneData( mSceneIndex ); if( scene ) { cString path; path.Format("./Data/2DData/%s", scene->mTexName.Cstr() ); NiTexture* tex = RESOURCEMAN->LoadMapTexture( path, false ); if( tex ) { mSceneImage->SetTexture( tex ); unsigned int tx = scene->mTexPosX; unsigned int ty = scene->mTexPosY; unsigned int tw = scene->mTexWidth; unsigned int th = scene->mTexHeight; unsigned int x = mSceneSkin->mSkinInfo->mX + GetAbsoluteRect().mLeft; unsigned int y = mSceneSkin->mSkinInfo->mY + GetAbsoluteRect().mTop; mSceneImage->SetTextureRect( tx, ty, tx + tw, ty + th ); mSceneImage->SetScreenRect( cUIRect( x, y, x+tw, y+th ) ); } } else assert(0); } void cNpcTutorialWindow::OnNetLock( int lockTry ) { if( mpClose ) mpClose->NetLock( lockTry ); } void cNpcTutorialWindow::OnNetUnLock( int lockTry ) { if( mpClose ) mpClose->NetUnLock( lockTry ); }