#include "stdafx.h" #include "KUIControlStatic.h" //#include "KUIControl.h" #include "KUIControlScroll.h" #include "SGameManager.h" #include "SGameMessage.h" //#include "SGameMessageUI.h" #include "SkillBaseFile.h" #include "SItemDB.h" #include "SQuestDB.h" #include "SStringDB.h" #include "SUISysMsgDefine.h" #include "SUIQuestInfoWnd.h" #include "SQuestMgr.h" #include "SUIDisplayInfo.h" #include "SPlayerInfoMgr.h" #include "SInventoryMgr.h" // 2010.06.04 epic6에서 갖고옵 - prodongi #include "SGameSystem.h" #include "SGameAvatarEx.h" #include #include "SGameInterface.h" #include "KUIControlButton.h" #include "STitleMgr.h" #include "SUILazyTooltip.h" #include "SUIChattingWnd.h" namespace { //const char* c_szStaticExp = "static_exp"; //const char* c_szStaticJp = "static_jp"; //const char* c_szStaticRupy = "static_rupy"; //이유는 모르지만 prev,next가 잘못 처리 되어있다 =_= const char* c_szQuestPrevButton = "quest_smallbutton_next"; const char* c_szQuestNextButton = "quest_smallbutton_pre"; const char* c_szQuestYesButton = "quest_button_yes"; const char* c_szQuestNoButton = "quest_button_no"; const char* c_szQuestConfirmButton = "quest_button_confirm"; const char* c_szQuestPage = "quest_page_number"; unsigned int c_nPageStringSizeMax = 400; const unsigned int c_nImgCountMax = 10; /// 한 페이지당 최대 라인 수 //const int MAX_STORY_LINE_COUNT = 13; /// 2012.08.07 텍스트가 넘어가서 12줄로 수정함 const int MAX_STORY_LINE_COUNT = 12; const char* c_szImgControlName = "quest_dialog_backimg_"; const char *c_szQuestName = "questname"; //const char *c_szNpcName = "npc_name"; }; // 2010.06.04 epic6에서 갖고옴 - prodongi extern SGameSystem* g_pCurrentGameSystem; SUIQuestInfoWnd::~SUIQuestInfoWnd() { _ClearTriggerControls(); m_extractQuestTarget.clear(); /// 2011.08.19 - prodongi m_vQuestContent.clear(); m_triggerMenus.clear(); m_vHideCtrl.clear(); } extern void LoadTexture(const char *filename, K3DTexture* texture); void SUIQuestInfoWnd::Create(KUIWND_CREATE_ARG& CREATE_ARG) { SUIWnd::Create( CREATE_ARG ) ; int nFixImgWidth = 541; int nFixImgHeight = 320; for(int i=0;iCreateControl(arg); int nExpX, nExpY; K3DRenderDevice::GetSquareSize( nFixImgWidth, nFixImgHeight, nExpX, nExpY ); if( KUITextureManager::GetHWType() == KUITextureManager::HW_SUPPORT ) { spTmpTextrue = KDeviceManager::GetDeviceManager()->GetRenderDevice()->CreateTexture( nExpX, nExpY, KUSAGE_DYNAMIC, K3DFMT_A8R8G8B8, D3DPOOL_DEFAULT ); } else { //Intel Chip 계열에서 지원 안 되는 넘들이 있음. spTmpTextrue = KDeviceManager::GetDeviceManager()->GetRenderDevice()->CreateTexture( nExpX, nExpY, K3DFMT_A8R8G8B8, D3DPOOL_MANAGED ); } if( pWndDynamicTex ) pWndDynamicTex->SetRenderTarget( spTmpTextrue, nFixImgWidth, nFixImgHeight ); //LoadTexture( "test.png", spTmpTextrue ); //pWndDynamicTex->SetShow( false ); pWndDynamicTex->SetShow( false ); m_vQuestInfoImgName.push_back( "" ); m_vQuestInfospTexture.push_back( spTmpTextrue ); } } static int GetIconControlNum( const char* szSlotControlID ) { for( int nSlotIndex( 0 ); nSlotIndex < QuestBase::MAX_OPTIONAL_REWARD; ++nSlotIndex ) { if( 0 == ::_stricmp( CStringUtil::StringFormat( "quest_selectitem_item_%02d", nSlotIndex ).c_str(), szSlotControlID ) ) return nSlotIndex; } return (-1); } bool SUIQuestInfoWnd::InitControls( KPoint kPos ) { // 커스텀 윈도우 move 영역 설정 SetCustomMovingRect( KRect( 0, 0, 594, 25 ) ); struct closeQuestDialog : public ITriggerAction { closeQuestDialog( SGameManager& mgr ) : game_manager( mgr ) {} virtual void onRelease() { // game_manager.PostMsgAtDynamic( // new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_QUEST_DIALOG, false ) ); } private: SGameManager& game_manager; }; struct yesCloseQuestDialog : public closeQuestDialog { yesCloseQuestDialog( SGameManager& mgr ) : closeQuestDialog( mgr ) {} virtual bool isValid() const { return SQuestMgr::GetInstance().GetQuestCount(false) < SQuestMgr::MAX_QUEST_NUM; } }; _ClearTriggerControls(); _AddTriggerControl( "quest_button_yes", GetStringDB().GetString( 19 ), "ui_click_accept01.wav", new yesCloseQuestDialog( *m_pGameManager ) ); _AddTriggerControl( "quest_button_no", GetStringDB().GetString( 20 ), "", new closeQuestDialog( *m_pGameManager ) ); //SetChildCaption( c_szStaticExp, GetStringDB().GetString( STRING_EXP ) ); //SetChildCaption( c_szStaticJp, GetStringDB().GetString( STRING_JP ) ); //SetChildCaption( c_szStaticRupy, GetStringDB().GetString( STRING_R ) ); // #2.1.11 for(int i=0;i(GetChild(c_szQuestConfirmButton)); m_ctrlGiveUp = dynamicCast(GetChild("quest_button_giveup_01")); m_ctrlAccept = dynamicCast(GetChild(c_szQuestYesButton)); m_ctrlReject = dynamicCast(GetChild(c_szQuestNoButton)); m_ctrlQuestName = dynamicCast(GetChild(c_szQuestName)); /// give up 버튼 위치 조정 if (m_ctrlReject && m_ctrlGiveUp) { m_ctrlGiveUp->MovePos(m_ctrlReject->GetRect().left, m_ctrlReject->GetRect().top); } KUIControlSimpleButton* buttonPre = dynamicCast(GetChild("quest_smallbutton_pre_01")); if (buttonPre) buttonPre->SetTooltip(S(1463)); addhideCtrl("reward_text_03"); addhideCtrl("reward_bg_03"); addhideCtrl("questname_03"); return true; } void SUIQuestInfoWnd::addhideCtrl(LPCSTR ctrlName) { KUIControlStatic *pCtrl = dynamicCast(GetChild(ctrlName)); if(pCtrl) m_vHideCtrl.push_back(pCtrl); } void SUIQuestInfoWnd::setTitleShow(bool bShow) { for( size_t i=0 ; iSetShow(bShow); } void SUIQuestInfoWnd::setTitleName() { std::string strTitleName = m_TitleMgr.GetTitleNameForQuest(m_questCode); if( strTitleName != "") { GetChild("questname_03")->SetCaption(CStringUtil::StringFormat("<#f7941d>%s",strTitleName.c_str()).c_str()); setTitleShow(true); } else setTitleShow(false); } void SUIQuestInfoWnd::IconFocus( int nIndex ) { KUIWnd *pWnd = GetChild( "quest_selectitem" ); if( !pWnd ) return; QuestBase::QuestCode code = m_questCode; QuestBase *pBase = GetQuestDB().GetQuestData( code ); if( !pBase ) { pWnd->SetShow( false ); return; } int nOptionalRewardCount = 0; for( nOptionalRewardCount = QuestBase::MAX_OPTIONAL_REWARD; nOptionalRewardCount > 0; --nOptionalRewardCount ) { if( pBase->OptionalReward[ nOptionalRewardCount-1 ].nItemCode ) break; } if( nIndex < 0 || nIndex >= nOptionalRewardCount ) { pWnd->SetShow( false ); return; } m_rewardFocus = nIndex; pWnd->SetShow( true ); KUIWnd * pItemIcon = GetChild( CStringUtil::StringFormat( "quest_selectitem_itemback_%02d", nIndex ).c_str() ); if( pItemIcon ) { pWnd->MovePos( pItemIcon->GetRect().left, pItemIcon->GetRect().top ); } } void SUIQuestInfoWnd::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam ) { switch(nMessage) { case KUI_MESSAGE::KBUTTON_CLICK: { int nSlotIndex = GetIconControlNum( lpszControlID ); if( nSlotIndex >= 0 ) { m_pGameManager->StartSound( "ui_button_click.wav" ); IconFocus( nSlotIndex ); break; } else if( ::_stricmp( lpszControlID, "button_close" ) == 0 ) { m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_QUEST_INFO, false) ); break; } else if( ::_stricmp( lpszControlID, c_szQuestPrevButton ) == 0 ) { setCurPage(m_nCurrentPage - 1); } else if( ::_stricmp( lpszControlID, c_szQuestNextButton ) == 0 ) { setCurPage(m_nCurrentPage + 1); } else if (0 == ::_stricmp(lpszControlID, "quest_smallbutton_pre_01")) { setCurPage(m_vQuestContent.size() - 1); } else if( ::_stricmp( lpszControlID, c_szQuestConfirmButton ) == 0 ) { bool bSendResult = false; if( IsQuestNeedRewardItem() ) { if( m_rewardFocus >= 0 ) bSendResult = true; } else { bSendResult = true; m_rewardFocus = -1; } if( bSendResult ) { m_pGameManager->StartSound( "ui_click_complete01.wav" ); //퀘스트 완료 std::string strTrigger; XStringUtil::Format( strTrigger, "end_quest( %d, %d )", m_questCode, m_rewardFocus ); m_pGameManager->PostMsgAtDynamic( new SIMSG_UI_ACT_NPCDIALOG( strTrigger.c_str() ) ); m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_QUEST_INFO, false) ); } else { m_pDisplayInfo->AddSystemMessage( S(512), 99 ); m_pGameManager->ProcMsgAtStatic( &SIMSG_REQ_OPEN_MSGBOX( SIMSG_REQ_OPEN_MSGBOX::_MSGBOXID::MSGBOX_GENERAL, S(512), true ) ); } } else if( ::_stricmp( lpszControlID, "quest_button_giveup_01" ) == 0 ) { m_pGameManager->PostMsgAtDynamic( new SIMSG_REQ_OPEN_MSGBOX(SIMSG_REQ_OPEN_MSGBOX::MSGBOX_GIVEUPQUEST, (801), true) ); } else { _ReleaseTrigger( lpszControlID ); m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_QUEST_INFO, false) ); //quest_button_yes, quest_button_no,quest_button_confirm -> 창닫을껄 //m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_QUEST_INFO, false) ); } } break; case KUI_MESSAGE::KGENWND_MOVE: // 윈도우 이동 { LimitMoveWnd(); // 게임 외부로 나가지 못하게 제한 } break; } return SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam ); } void SUIQuestInfoWnd::Process(DWORD dwTime) { KUIGenWnd::Process(dwTime); // RefreshStoryText(); static AR_TIME nPrevArTime2 = 0; AR_TIME nCurArTime2 = GetArTime(); if ( nCurArTime2 > nPrevArTime2+50 ) { nPrevArTime2 = nCurArTime2; Refresh(false); refreshRealTime(); } // 2010.06.04 epic6에서 갖고옴 - prodongi if (m_nDialogType == TS_SC_DIALOG::TYPE_QUEST_INFO_AND_START) { SGameAvatarEx* pLocalPlayer = g_pCurrentGameSystem->GetLocalPlayer(); K3DVector local = *pLocalPlayer->GetPosition(); local.z = 0; float len = GetDistance( local, m_vecQuestStart ); if( len > 100.f ) m_pGameManager->PostMsgAtDynamic( new SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_QUEST_INFO, false) ); } } void* SUIQuestInfoWnd::Perform( KID id, KArg& msg ) { return SUIWnd::Perform( id, msg ); } void SUIQuestInfoWnd::ProcMsgAtStatic( SGameMessage* pMsg ) { switch( pMsg->nType ) { case MSG_NPC_DIALOG: { //SetChildShow(c_szQuestYesButton, false); //SetChildShow(c_szQuestNoButton, false); //SetChildShow(c_szQuestConfirmButton, false); SMSG_NPC_DIALOG* pData = dynamicCast< SMSG_NPC_DIALOG* >( pMsg ); // 2010.06.04 epic6에서 갖고옴 - prodongi SGameAvatarEx* pLocalPlayer = g_pCurrentGameSystem->GetLocalPlayer(); m_nDialogType = pData->nDialogType; refreshConfirmButtonStatus(m_nDialogType); if(TS_SC_DIALOG::TYPE_QUEST_INFO_AND_START == m_nDialogType || TS_SC_DIALOG::TYPE_QUEST_INFO_IN_PROGRESS == m_nDialogType || TS_SC_DIALOG::TYPE_QUEST_INFO_AND_END == m_nDialogType) { if(TS_SC_DIALOG::TYPE_QUEST_INFO_AND_START == m_nDialogType) { // 2010.06.04 epic6에서 갖고옴 - prodongi m_vecQuestStart = *pLocalPlayer->GetPosition(); m_vecQuestStart.z = 0; } } else { IconFocus( -1); m_rewardFocus = -1; Refresh(); break; } /* if(pData->nDialogType == TS_SC_DIALOG::TYPE_QUEST_INFO_AND_START) { // 2010.06.04 epic6에서 갖고옴 - prodongi m_vecQuestStart = *pLocalPlayer->GetPosition(); m_vecQuestStart.z = 0; //수락,거절 버튼 냅둘것. SetChildShow(c_szQuestYesButton, true); SetChildShow(c_szQuestNoButton, true); } else if(pData->nDialogType == TS_SC_DIALOG::TYPE_QUEST_INFO_IN_PROGRESS) { setConfirmButtonType(m_nDialogType); SetChildShow(c_szQuestConfirmButton, true); } else if(pData->nDialogType == TS_SC_DIALOG::TYPE_QUEST_INFO_AND_END) { //보상받기 버튼 냅둘것. setConfirmButtonType(m_nDialogType); SetChildShow(c_szQuestConfirmButton, true); } else { IconFocus( -1); m_rewardFocus = -1; Refresh(); break; } */ m_questCode = pData->nQuestCode; m_questTextId = pData->nQuestTextID; m_questNpc = pData->strTitle.c_str(); extractQuestTarget(); /// 2011.08.19 - prodongi _AssignTriggers( pData->vtMenus ); Refresh(); /// 2012.02.15 자동 선택 - prodongi autoSelectOptionalReward(m_questCode); } break; case IMSG_UI_SEND_DATA: { SIMSG_UI_SEND_DATA* pData = dynamicCast< SIMSG_UI_SEND_DATA* >( pMsg ); /* //퀘스트 내용 업데이트 if( pData->m_strString == "set_quest_code" ) { if( m_nQuestCode == pData->m_nNumber.getAmount() ) return; m_nQuestCode = pData->m_nNumber.getAmount(); Refresh(); } */ if( pData->m_strString == "quest_status_updated" ) { Refresh(true, false); } } break; case IMSG_UI_FOCUS: { m_pManager->SetFocus(this); pMsg->bUse = true; } break; /*(case MSG_NPC_DIALOG: { //퀘스트 시작시 넘어오는 곳?!?!? SMSG_NPC_DIALOG* pData = dynamicCast< SMSG_NPC_DIALOG* >( pMsg ); m_questCode = pData->nQuestCode; //m_questTextId = pData->nQuestTextID; //m_questNpc = pData->strTitle.c_str(); //_AssignTriggers( pData->vtMenus ); Refresh(); } break;*/ case IMSG_HOTKEY_EX: //servantes 2010.10.19 { SIMSG_HOTKEY_EX* pHotKey = dynamicCast(pMsg); if( pHotKey->wParam == VK_SHIFT ) m_bShiftKey = (pHotKey->bUp == 0); //servantes 2010.10.15 if( pHotKey->wParam == VK_CONTROL ) //servantes 2010.10.15 m_bControlKey = (pHotKey->bUp == 0); if( pHotKey->wParam == VK_MENU ) { bool bPreState = m_bAltKey; m_bAltKey = (pHotKey->bUp == 0); if( bPreState != m_bAltKey && IsShow() ) { QuestBase *pBase = GetQuestDB().GetQuestData(m_questCode); setCompensationItem(pBase); } } } break; default: break; } return SUIWnd::ProcMsgAtStatic( pMsg ); } void SUIQuestInfoWnd::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd ) { if( bOpen ) { m_pGameManager->StartSound( "ui_popup_window01.wav" ); //m_nStoryIndex = 0; // m_nSummaryIndex = 0; movePosAboutQuestList(); Refresh(); } return SUIWnd::OnNotifyUIWindowOpen( bOpen, false ); } void SUIQuestInfoWnd::movePosAboutQuestList() { KUIWnd *pWnd = m_pManager->FindWnd( "window_quest_list_main" ); if (!pWnd) return ; KRect questRect = pWnd->GetRect(); /// 퀘스트 리스트창 왼쪽 if (questRect.left <= questRect.GetWidth()) { MovePos( questRect.left + questRect.GetWidth(), questRect.top); } /// 퀘스트 리스트창 오른쪽 else { MovePos( questRect.left - GetRect().GetWidth(), questRect.top); } LimitMoveWnd(); } std::string SUIQuestInfoWnd::CoordinateQuestName( int nDifficulty, int nLimitLevel, const std::string & strQuestName ) { std::string strColor; m_pDisplayInfo->getQuestDifficultyColor(nDifficulty, nLimitLevel, strColor); return "" + strColor + strQuestName; } extern int SplitBR( std::string & strSrc, std::vector& strDstlist, bool bDef ); void SUIQuestInfoWnd::Refresh(bool bInit, bool initPage) { QuestBase::QuestCode code = m_questCode; QuestBase *pBase = GetQuestDB().GetQuestData( code ); if( !pBase ) { m_vQuestContent.clear(); RefreshStoryText(); return; } if(bInit) { refreshWhenRecv(initPage); } /* //SetChildShow( "quest_selectitem", false ); SetChildShow( "npcname", false ); //아직 데이타 없음. std::string strQuestText, strFontSize = ""; strQuestText += ParseQuestText( GetStringDB().GetString( m_questTextId ), m_questCode ); CStringUtil::ReplacePhrase( strQuestText, "

", "" ); replaceQuestTargetToText(strQuestText); /// 2011.08.19 - prodongi /// 2011.09.29 최대 라인 수로 쪼갠다 - prodongi std::string strPage; std::vector splitedStr; splitMaxLineString(strQuestText, splitedStr); for (size_t i = 0; i < splitedStr.size(); ++i) { strPage = strFontSize; strPage += splitedStr[i]; m_vQuestContent.push_back(strPage); } splitedStr.clear(); //요약 std::string strSummary = ParseQuestText( GetStringDB().GetQuestString( pBase->nSummaryTextId ), code ); replaceQuestTargetToText(strSummary); /// 2011.08.19 - prodongi strQuestText = strFontSize; strQuestText += GetStringDB().GetString( 6529 ); //퀘스트 목표 : strQuestText += "

"; strQuestText += strSummary; strQuestText += "

"; //진행 상황 std::string strProgress, strTmp; if( pBase->nStatusTextId ) strProgress = ParseQuestText( GetStringDB().GetQuestString( pBase->nStatusTextId ), code ); replaceQuestTargetToText(strProgress); /// 2011.08.19 - prodongi std::vector< std::string > strlist; SplitBR( strProgress, strlist, false ); for( unsigned i(0); strlist.size()>i; i++ ) { strQuestText += strlist[i]; strQuestText += "
"; } strlist.clear(); m_vQuestContent.push_back( strQuestText ); */ //이미지 태그추가 2009.11.26 sfreer. RefreshStoryText(); } void SUIQuestInfoWnd::SetItemSlot( ItemBase::ItemCode code, int nCount, const char *szIconControl, const char *szNumberControl, const char *szTooltipControl ) { // 아이콘 설정 KUIControlIconStatic *pIcon = dynamicCast< KUIControlIconStatic* >( GetChild( szIconControl ) ); if( pIcon ) { if( code ) { const ItemBaseEx_info * base = GetItemDB().GetItemData( code ); pIcon->SetIcon( c_szDEF_SPR_NAME, base->pIcon_name ); } else { pIcon->SetIcon( c_szDEF_SPR_NAME, "static_common_itemslot" ); } } // 수량 설정 KUIWnd* pNum = GetChild( szNumberControl ); if( pNum ) { if( code && GetItemDB().IsJoin( code, false ) ) { pNum->SetCaption( CStringUtil::StringFormat( "%d", nCount ).c_str() ); pNum->SetShow( true ); } else { pNum->SetShow( false ); } } KUIControl* pTooltip = dynamicCast< KUIControl* >(GetChild( szTooltipControl )); if(pTooltip) { if( code ) { const ItemBaseEx_info *base( GetItemDB().GetItemData( code ) ); if( base ) { std::string toolTip = m_pDisplayInfo->GetItemTooltipText(code, true, 0, 1, XFlag(), 0, 0, 0, 0, 0, 0, 0, 0, 0, false, -1, -1, 0, base->nSummonId, true,0); pTooltip->SetTooltip( toolTip.c_str() ); pTooltip->SetTooltipSprite( c_szDEF_SPR_NAME ); if( m_bAltKey ) { m_pDisplayInfo->SetComparableEquipItemSubTooltip( pTooltip, code ); } } } else { pTooltip->SetTooltip( "" ); } } } void SUIQuestInfoWnd::RefreshStoryText() { std::string strNewStory; //const int MAX_STORY_LINE_COUNT = 14; // 대화내용 넘침 방지 //std::vector< std::string > vLineList; //vLineList.clear(); //중동 오른쪽에서 왼쪽으로 퀘스트 내용 출력하게 수정 //스트링 db로 어케 해야 하지 않을지... //2009-06-29: hunee #ifdef _COUNTRY_ME_ strNewStory += ""; #endif KUIControl* pControl = dynamicCast(GetChild( "quest_dialog" )); if( !pControl ) return; if( m_vQuestContent.empty() ) return; if( m_nCurrentPage >= (int)m_vQuestContent.size() || m_nCurrentPage < 0 ) return; /// 2011.09.29 이미 페이지가 맥스 라인으로 쪼개져 있기 때문에 여기서는 고려 안해도 된다 - prodongi /* // pControl->SplitLine( vLineList, m_vQuestContent[m_nCurrentPage], S(6307), 9 ); pControl->SplitLine( vLineList, m_vQuestContent[m_nCurrentPage], S(6426), 9 ); if( vLineList.size() > MAX_STORY_LINE_COUNT ) { for( int i = 0; i < vLineList.size(); ++i ) { if( i >= MAX_STORY_LINE_COUNT ) break; if( vLineList.size() <= (m_nStoryIndex + i) ) break; if( vLineList[ (m_nStoryIndex + i) ].length() ) strNewStory += vLineList[ (m_nStoryIndex + i) ].c_str(); strNewStory += "
"; } } else { #ifdef _COUNTRY_ME_ strNewStory += m_vQuestContent[m_nCurrentPage]; #else strNewStory = m_vQuestContent[m_nCurrentPage]; #endif m_nStoryIndex = 0; } */ #ifdef _COUNTRY_ME_ strNewStory += m_vQuestContent[m_nCurrentPage]; #else strNewStory = m_vQuestContent[m_nCurrentPage]; #endif //m_nStoryIndex = 0; //퀘스트 남은 시간 출력 //2009-07-14: hunee //int nScrollMax = int( vLineList.size() ); //vLineList.clear(); static AR_TIME nPrevArTime = 0; AR_TIME nCurArTime = GetArTime(); if (m_nCurrentPage2 != m_nCurrentPage || nCurArTime > nPrevArTime+50 ) { nPrevArTime = nCurArTime; QuestBase::QuestCode code = m_questCode; QuestBase *pBase = GetQuestDB().GetQuestData( code ); if( m_nCurrentPage == (int)m_vQuestContent.size() - 1) { switch (SQuestMgr::GetInstance().GetQuestProgress( code )) { case SQuestMgr::QUEST_IN_PROGRESS: if (pBase->nTimeLimit > 0) { AR_TIME nTimeLimit = SQuestMgr::GetInstance().GetQuestTimeLimit( code ); if (nCurArTime < nTimeLimit) { nTimeLimit -= nCurArTime; int sec = nTimeLimit /100 % 60; int min = nTimeLimit / 6000 % 60; int hour = nTimeLimit / 360000; //100*60*60 1/100초 기준 std::string strRemain; strRemain = "
"; if (hour > 0) { strRemain += GetStringDB().GetString( 87 ); //"남은 시간 : #@time@#시간 #@min@#분" XStringUtil::Replace( strRemain, "#@time@#", SStringDB::ToString( hour ).c_str() ); XStringUtil::Replace( strRemain, "#@min@#", SStringDB::ToString( min ).c_str() ); XStringUtil::Replace( strRemain, "#@second@#", SStringDB::ToString( sec ).c_str() ); } else if (min > 0) { strRemain += GetStringDB().GetString( 539 ); //"남은 시간 : #@min@#분" XStringUtil::Replace( strRemain, "#@min@#", SStringDB::ToString( min ).c_str() ); } else if (sec > 0) { strRemain += GetStringDB().GetString( 582 ); //"남은 시간 : #@second@#초" XStringUtil::Replace( strRemain, "#@second@#", SStringDB::ToString( sec ).c_str() ); } strNewStory += strRemain; //nScrollMax += 2; } } break; case SQuestMgr::QUEST_SUCCEED: { //<#e04444>퀘스트 완료 std::string strRemain; strRemain = "
"; strRemain += GetStringDB().GetString( 536 ); strNewStory += strRemain; } break; case SQuestMgr::QUEST_FAILED: { //<#e04444>퀘스트 실패 std::string strRemain; strRemain = "
"; strRemain += GetStringDB().GetString( 534 ); strNewStory += strRemain; } break; } } m_nCurrentPage2 = m_nCurrentPage; for(int i=0;i(GetChild( CStringUtil::StringFormat("%s%02d", c_szImgControlName,nImgCount).c_str() )); KUIWnd *pWnd2 = GetChild( "quest_dialog_backimg_area" ); if(pWnd&&pWnd2) { KRect newrect(x+pWnd2->GetRect().left,y+pWnd2->GetRect().top, w+x+pWnd2->GetRect().left,h+y+pWnd2->GetRect().top); pWnd->SetRect( newrect ); //if( ::_strcmpi(aniname.c_str(), pWnd->GetAniName()) != 0 ) if(::_strcmpi( m_vQuestInfoImgName[nImgCount].c_str(), imgfilename.c_str() ) != 0) { //pWnd->SetAniName(aniname.c_str()); pWnd->SetRenderTarget( m_vQuestInfospTexture[nImgCount], newrect.GetWidth(), newrect.GetHeight() );//nFixImgWidth, nFixImgHeight ); LoadTexture( imgfilename.c_str(), m_vQuestInfospTexture[nImgCount] ); m_vQuestInfoImgName[nImgCount] = imgfilename; } pWnd->SetShow(true); m_nCurrentPage2 = m_nCurrentPage; } nImgCount++; } else { break; } strNewStory.erase( nFindPos, (nFindPos2-nFindPos)+2 ); nFindPos = strNewStory.find( "#@img:" ); } // if( nFindPos == std::string::npos ) break; SetChildCaption( "quest_dialog", CStringUtil::StringFormat( "%s%s", S(6425), strNewStory.c_str() ).c_str() ); /// 2011.09.29 refreshWhenRecv에서 설정 - prodongi /* int nCurPage = 0, nTotalPage = 0; if( m_vQuestContent.empty() == false ) { nCurPage = m_nCurrentPage+1; nTotalPage = (int)m_vQuestContent.size(); } std::string strPage; XStringUtil::Format( strPage, "%d/%d", nCurPage, nTotalPage ); SetChildCaption( c_szQuestPage, strPage.c_str() ); /// npc 이름은 없어짐 /* std::string strNpcName = "<#FF8040> "; strNpcName += m_questNpc; SetChildCaption( c_szNpcName, strNpcName.c_str() ); */ //QuestBase *pBase = GetQuestDB().GetQuestData( m_questCode ); /* std::string strQuestName = ""; strQuestName += GetStringDB().GetQuestString( pBase->nQuestTextId ); SetChildCaption( c_szQuestName, strQuestName.c_str() ); */ } } void SUIQuestInfoWnd::SetControlEnableWithColor( const char* lpControl, bool bEnable, const char* lpColor ) { if( lpControl == NULL ) return; SetControlEnable(lpControl, bEnable); if( bEnable ) SetControlEnableColor( lpControl, lpColor); else SetControlDisableColor( lpControl, lpColor); SetControlEnable( lpControl, bEnable ); } void SUIQuestInfoWnd::SetControlEnable( const char * pControlName, bool bEnable ) { if( pControlName == NULL ) return; KUIControl * pControl = dynamicCast(GetChild(pControlName)); if( pControl ) { if( bEnable ) pControl->Enable(); else pControl->Disable(); } } void SUIQuestInfoWnd::SetControlEnableColor( const char * pControlName, const char* lpColor ) { if( pControlName == NULL ) return; KUIControl * pControl = dynamicCast(GetChild(pControlName)); if( pControl ) { pControl->SetEnableColor(lpColor); } } void SUIQuestInfoWnd::SetControlDisableColor( const char * pControlName, const char* lpColor ) { if( pControlName == NULL ) return; KUIControl * pControl = dynamicCast(GetChild(pControlName)); if( pControl ) { pControl->SetDisableColor(lpColor); } } void SUIQuestInfoWnd::_AddTriggerControl( const char* control_name, const char* trigger_name, const char* trigger_sound, ITriggerAction* trigger_action ) { TriggerInfo* trigger = new TriggerInfo(); trigger->name = trigger_name; trigger->sound = trigger_sound; trigger->action = trigger_action; m_triggerControls.insert( std::make_pair( control_name, trigger ) ); } void SUIQuestInfoWnd::_ClearTriggerControls() { t_trigger_controls::iterator iTrigger = m_triggerControls.begin(); for( ; iTrigger != m_triggerControls.end(); ++iTrigger ) { SAFE_DELETE( iTrigger->second ); } m_triggerControls.clear(); } void SUIQuestInfoWnd::_AssignTriggers( const std::vector< SMSG_NPC_DIALOG::DLGMENU >& menus ) { m_triggerMenus.clear(); m_triggerMenus.assign( menus.begin(), menus.end() ); } bool SUIQuestInfoWnd::_ReleaseTrigger( const char* control_id ) { struct triggerFinder : public std::unary_function< SMSG_NPC_DIALOG::DLGMENU, bool > { triggerFinder( const std::string& menu_name ) : m_menu_name( menu_name ) {} bool operator () ( const SMSG_NPC_DIALOG::DLGMENU& menu ) const { return menu.strMenuName == m_menu_name; } const std::string& m_menu_name; }; t_trigger_controls::iterator iControl = m_triggerControls.find( control_id ); if( iControl != m_triggerControls.end() ) { TriggerInfo& trigger = *( iControl->second ); t_trigger_menus::iterator iTrigger = std::find_if( m_triggerMenus.begin(), m_triggerMenus.end(), triggerFinder( trigger.name ) ); if( iTrigger != m_triggerMenus.end() ) { if (trigger.action->isValid()) { m_pGameManager->ProcMsgAtStatic( &SIMSG_UI_ACT_NPCDIALOG( (*iTrigger).strTrigger.c_str() ) ); } else { m_pGameManager->GetGameInterface()->OpenMessageBox(SIMSG_REQ_OPEN_MSGBOX::MSGBOX_OK, SIMSG_REQ_OPEN_MSGBOX::MSGBOX_GENERAL, 0, -1, S(1464)); } m_pGameManager->StartSound( trigger.sound.c_str() ); trigger.action->onRelease(); return true; } } return false; } /// 2011.08.19 ParseQuestStringElement함수에서 갖고 옴 - prodongi void SUIQuestInfoWnd::extractQuestTarget() { extern void extractQuestTarget(std::vector& questTargetList, int questCode); extractQuestTarget(m_extractQuestTarget, m_questCode); } void SUIQuestInfoWnd::replaceQuestTargetToText(std::string& text, bool addMobNameDiff) { std::string replaceText, temp; std::vector::iterator it = m_extractQuestTarget.begin(); for (; it != m_extractQuestTarget.end(); ++it) { replaceText = makeQuestTargetTagText(*it); temp = *it; if (addMobNameDiff) temp += "_"; XStringUtil::Replace(text, temp, replaceText); } } std::string SUIQuestInfoWnd::makeQuestTargetTagText(std::string const& str) { std::string strRet; XStringUtil::Format(strRet, "<#ff0000>%s<#ffffff>", str.c_str()); return strRet; } void SUIQuestInfoWnd::refreshWhenRecv(bool initPage) { QuestBase *pBase = GetQuestDB().GetQuestData(m_questCode); std::string temp; /// difficulty setDifficultyIcon(pBase); /// quest name if (m_ctrlQuestName) { temp = CoordinateQuestName(pBase->nQuestDifficulty, pBase->nLimitLevel, GetStringDB().GetQuestString( pBase->nQuestTextId )); m_ctrlQuestName->SetCaption(temp.c_str()); } /* npc 이름은 없어짐 /// npc name temp = "<#a36109>"; temp += m_questNpc; SetChildCaption( c_szNpcName, temp.c_str() ); */ /// progress status setProgressStatus(m_questCode); /// if (initPage) { m_nCurrentPage = -1; m_nCurrentPage2 = -1; setCurPage(0); } /// setCompensationPoint(pBase); setCompensationItem(pBase); // setQuestContent(pBase); // 2012. 5. 21 - marine 퀘스트 완료시 획득 하는 호칭 이름 설정 setTitleName(); } void SUIQuestInfoWnd::setDifficultyIcon(QuestBase* base) { int diff = m_pDisplayInfo->getQuestDifficulty(base->nQuestDifficulty, base->nLimitLevel); KUIWnd* wnd = GetChild("quest_difficulty_easy_01"); if (!wnd) return ; char const* aniName = "common_mark_quest_difficulty_easy"; switch (diff) { case 0: aniName = "common_mark_quest_difficulty_easy"; break; case 1: aniName = "common_mark_quest_difficulty_nomal"; break; case 2: aniName = "common_mark_quest_difficulty_hard"; break; } wnd->SetAniName(aniName); } void SUIQuestInfoWnd::setProgressStatus(int questCode) { KUIWnd* wnd = GetChild("mark_status_quest_01"); if (!wnd) return ; int type = SQuestMgr::GetInstance().GetQuestProgress(questCode); char const* aniName = "common_mark_npc_quest01_big"; switch (type) { case SQuestMgr::STARTABLE: aniName = "common_mark_npc_quest01_big"; break; case SQuestMgr::QUEST_IN_PROGRESS: aniName = "common_mark_npc_quest02_big"; break; case SQuestMgr::QUEST_SUCCEED: aniName = "common_mark_npc_quest03_big"; break; case SQuestMgr::QUEST_FAILED: aniName = "common_mark_npc_quest03_big"; break; }; wnd->SetAniName(aniName); } void SUIQuestInfoWnd::setCurPage(int page) { if( m_vQuestContent.empty() ) return ; int nOldPage = m_nCurrentPage; int nQuestSize = (int)m_vQuestContent.size() - 1; if( page >= nQuestSize ) { SetControlEnable(c_szQuestPrevButton, true ); SetControlEnable(c_szQuestNextButton, false ); m_nCurrentPage = nQuestSize; } else if (0 >= page) { SetControlEnable(c_szQuestPrevButton, false ); SetControlEnable(c_szQuestNextButton, true ); m_nCurrentPage = 0; } else { SetControlEnable(c_szQuestPrevButton, true ); SetControlEnable(c_szQuestNextButton, true ); m_nCurrentPage = page; } if( nOldPage != m_nCurrentPage ) { RefreshStoryText(); int nCurPage = 0, nTotalPage = 0; if( m_vQuestContent.empty() == false ) { nCurPage = m_nCurrentPage+1; nTotalPage = (int)m_vQuestContent.size(); } std::string strPage; XStringUtil::Format( strPage, "%d/%d", nCurPage, nTotalPage ); SetChildCaption( c_szQuestPage, strPage.c_str() ); } } void SUIQuestInfoWnd::setCompensationPoint(QuestBase* base) { c_fixed10 fMod = GameRule::GetQuestRewardFactor( base ); char const* tag = ""; // EXP if( base->nExp ) { int nRewardExp = base->nExp * fMod; SetChildCaption( "quest_compens_expnumber", CStringUtil::StringFormat( "%s%s", tag, CStringUtil::GetCommaNumberString( nRewardExp ).c_str() ).c_str() ); } else { SetChildCaption( "quest_compens_expnumber", CStringUtil::StringFormat( "%s%d", tag, 0 ).c_str() ); } // JP if( base->nJP ) { int nRewardJP = base->nJP * fMod; SetChildCaption( "quest_compens_jpnumber", CStringUtil::StringFormat( "%s%s", tag, CStringUtil::GetCommaNumberString( nRewardJP ).c_str() ).c_str() ); } else { SetChildCaption( "quest_compens_jpnumber", CStringUtil::StringFormat( "%s%d", tag, 0 ).c_str() ); } // RP if( base->nGold ) { int nRewardGold = base->nGold * fMod; SetChildCaption( "quest_compens_rpnumber", CStringUtil::StringFormat( "%s%s", tag, CStringUtil::GetCommaNumberString( nRewardGold ).c_str() ).c_str() ); } else { SetChildCaption( "quest_compens_rpnumber", CStringUtil::StringFormat( "%s%d", tag, 0 ).c_str() ); } // P // 2009. 2. 13 hunee 은신감지 관련 추가, 기획쪽 담당자 김동민 if (base->nHolicPoint) { int nRewardP = base->nHolicPoint * fMod; SetChildCaption( "quest_compens_pointnumber", CStringUtil::StringFormat( "%s%s", tag, CStringUtil::GetCommaNumberString( nRewardP ).c_str() ).c_str() ); } else { SetChildCaption( "quest_compens_pointnumber", CStringUtil::StringFormat( "%s%d", tag, 0 ).c_str() ); } } void SUIQuestInfoWnd::setCompensationItem(QuestBase *base) { c_fixed10 fMod = GameRule::GetQuestRewardFactor( base ); // 기본아이템 if( base->DefaultReward.nItemCode ) { SetChildCaption( "static_quest_base", CStringUtil::StringFormat( "<#FFFFFFFF>%s", S(6201) ).c_str() ); SetItemSlot( base->DefaultReward.nItemCode, base->DefaultReward.nQuantity, "quest_baseitem_itemback", "quest_baseitem_itemnumber","quest_baseitem_itemback" ); } else { SetChildCaption( "static_quest_base", CStringUtil::StringFormat( "<#797979>%s", S(6201) ).c_str() ); SetItemSlot( 0, 0, "quest_baseitem_itemback", "quest_baseitem_itemnumber","quest_baseitem_itemback" ); } SetQuestRewardItem( false ); // 옵셔널 아이템 if( base->OptionalReward[0].nItemCode ) { SetChildCaption( "static_quest_select", CStringUtil::StringFormat( "<#FFFFFFFF>%s", S(6202) ).c_str() ); for( size_t slot_idx = 0; slot_idx < QuestBase::MAX_OPTIONAL_REWARD; ++slot_idx ) { ItemBase::ItemCode code = base->OptionalReward[slot_idx].nItemCode; int nCount = base->OptionalReward[slot_idx].nQuantity; SetItemSlot( code, nCount, CStringUtil::StringFormat( "quest_selectitem_itemback_%02d", slot_idx ).c_str(), CStringUtil::StringFormat( "quest_selectitem_itemnumber%02d", slot_idx ).c_str(), CStringUtil::StringFormat( "quest_selectitem_item_%02d", slot_idx ).c_str() ); } SetQuestRewardItem( true ); } else { SetChildCaption( "static_quest_select", CStringUtil::StringFormat( "<#797979>%s", S(6202) ).c_str() ); for( size_t slot_idx = 0; slot_idx < QuestBase::MAX_OPTIONAL_REWARD; ++slot_idx ) SetItemSlot( 0, 0, CStringUtil::StringFormat( "quest_selectitem_itemback_%02d", slot_idx ).c_str(), CStringUtil::StringFormat( "quest_selectitem_itemnumber%02d", slot_idx ).c_str(), CStringUtil::StringFormat( "quest_selectitem_item_%02d", slot_idx ).c_str() ); SetQuestRewardItem( false ); } } void SUIQuestInfoWnd::setDifficultyToolTip() { KUIControlStatic* diff = dynamicCast(GetChild("quest_difficulty_easy_01")); if (!diff) return ; std::string tooltip; tooltip += "#@quest_easy@#"; tooltip += " "; tooltip += S(1460); tooltip += "
"; tooltip += "#@quest_normal@#"; tooltip += " "; tooltip += S(1462); tooltip += "
"; tooltip += "#@quest_hard@#"; tooltip += " "; tooltip += S(1461); diff->SetTooltip(tooltip.c_str()); } void SUIQuestInfoWnd::splitMaxLineString(std::string const& totalStr, std::vector& splitedStr) { if (totalStr.empty()) return ; KUIControl* pControl = dynamicCast(GetChild( "quest_dialog" )); if( !pControl ) return; std::vector lineList; pControl->SplitLine(lineList, totalStr, "font_01", 10); std::string str; size_t count = 0; for (size_t i = 0; i < lineList.size(); ++i) { str += lineList[i]; ++count; if (count >= MAX_STORY_LINE_COUNT) { splitedStr.push_back(str); str.clear(); count = 0; } else { str += "
"; } } if (!str.empty()) { splitedStr.push_back(str); } lineList.clear(); } void SUIQuestInfoWnd::setQuestContent(QuestBase* pBase) { extern std::string ParseQuestText( const char *szQuestString, int nQuestCode ); // GameVM.cpp extern std::string ParseQuestTextAddMobDiff( const char *szQuestString, int nQuestCode ); // GameVM.cpp m_vQuestContent.clear(); SetChildShow( "npcname", false ); //아직 데이타 없음. std::string strQuestText, strFontSize = ""; /// 설명 strQuestText += ParseQuestText( GetStringDB().GetString( m_questTextId ), m_questCode ); CStringUtil::ReplacePhrase( strQuestText, "

", "" ); replaceQuestTargetToText(strQuestText); /// 2011.08.19 - prodongi /// 2011.09.29 최대 라인 수로 쪼갠다 - prodongi std::string strPage; std::vector splitedStr; splitMaxLineString(strQuestText, splitedStr); for (size_t i = 0; i < splitedStr.size(); ++i) { strPage = strFontSize; strPage += splitedStr[i]; m_vQuestContent.push_back(strPage); } splitedStr.clear(); //요약 std::string strSummary = ParseQuestText( GetStringDB().GetQuestString( pBase->nSummaryTextId ), m_questCode ); replaceQuestTargetToText(strSummary); /// 2011.08.19 - prodongi strQuestText = strFontSize; strQuestText += GetStringDB().GetString( 6529 ); //퀘스트 목표 : strQuestText += "

"; strQuestText += strSummary; strQuestText += "

"; //진행 상황 std::string strProgress, strTmp; if( pBase->nStatusTextId ) strProgress = ParseQuestTextAddMobDiff( GetStringDB().GetQuestString( pBase->nStatusTextId ), m_questCode ); /// 중복되는 이름이 있을 경우, 이중 체크가 될 수 있기 때문에, 변환했는지를 체크하기 위해 스페이스 체크를 추가한다 replaceQuestTargetToText(strProgress, true); /// 2011.08.19 - prodongi std::vector< std::string > strlist; SplitBR( strProgress, strlist, false ); for( unsigned i(0); strlist.size()>i; i++ ) { strQuestText += strlist[i]; strQuestText += "
"; } strlist.clear(); m_vQuestContent.push_back( strQuestText ); } void SUIQuestInfoWnd::refreshConfirmButtonStatus(int dialogType) { if (!m_ctrlComplete || !m_ctrlAccept || !m_ctrlReject) return ; m_ctrlComplete->SetShow(false); m_ctrlGiveUp->SetShow(false); m_ctrlAccept->SetShow(false); m_ctrlReject->SetShow(false); std::string str; if (TS_SC_DIALOG::TYPE_QUEST_INFO_AND_START == dialogType) { m_ctrlAccept->SetShow(true); m_ctrlReject->SetShow(true); } else if (TS_SC_DIALOG::TYPE_QUEST_INFO_IN_PROGRESS == dialogType) { m_ctrlGiveUp->SetShow(true); } else if (TS_SC_DIALOG::TYPE_QUEST_INFO_AND_END == dialogType) { m_ctrlComplete->SetShow(true); m_ctrlGiveUp->SetShow(true); } } void SUIQuestInfoWnd::refreshRealTime() { QuestBase *pBase = GetQuestDB().GetQuestData(m_questCode); /// difficulty setDifficultyIcon(pBase); /// quest name if (m_ctrlQuestName) { std::string name = CoordinateQuestName(pBase->nQuestDifficulty, pBase->nLimitLevel, GetStringDB().GetQuestString( pBase->nQuestTextId )); if ( g_GMDEV ) { name += CStringUtil::StringFormat("(%d)",m_questCode).c_str(); } m_ctrlQuestName->SetCaption(name.c_str()); } /// progress status setProgressStatus(m_questCode); /// buttons refreshConfirmButtonStatus(m_nDialogType); } void SUIQuestInfoWnd::autoSelectOptionalReward(int questCode) { QuestBase* base = GetQuestDB().GetQuestData(questCode); if (!base) return ; QuestBase::Reward* reward = base->OptionalReward; /// 선택 보상 아이템 개수 int itemCount = 0; for (int i = 0; i < QuestBase::MAX_OPTIONAL_REWARD; ++i) { if (reward[i].nItemCode) ++itemCount; } /// 선택 보상이 한개일 때만 자동 선택함 if (1 == itemCount) { /// 선택 보상 아이템이 있는 슬롯을 찾아서 선택 for (int i = 0; i < QuestBase::MAX_OPTIONAL_REWARD; ++i) { if (reward[i].nItemCode) { IconFocus(i); return ; } } } else { IconFocus(-1); m_rewardFocus = -1; } }