#include "stdafx.h" #include "UINpcTelling.h" #include "Parser.h" #include "Page.h" #include "QuestDefine.h" #include "UIManager.h" #include "Npc_Common.h" #include "NpcScript.h" cUINpcTelling::cUINpcTelling() : mDefaultTextIndex(0) , mSpreadCount(0) , mTarotPrice(0) , mThemeIndex(0) , mFuncCount(0) { memset( mSpreadIndex, 0, sizeof(mSpreadIndex) ); memset( mTarotIndex, 0, sizeof(mTarotIndex) ); memset( mFunc, 0, sizeof(mFunc) ); memset( mJobData, 0, sizeof(mJobData) ); } cUINpcTelling::~cUINpcTelling() { cQuestLinkPage::cIterator i = mQuestLinkPage.Begin(); cQuestLinkPage::cIterator end = mQuestLinkPage.End(); for( ; i != end; ++i ) { sQuestLinkPage* link = (sQuestLinkPage*)(i->mSecond); SAFE_DELETE( link ); } mQuestLinkPage.Clear(); } bool cUINpcTelling::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_NPC_STORE: { mFunc[mFuncCount] = NPC_FUNC_STORE; if( mFuncCount < NPC_FUNCHAVE_MAX ) { mFuncCount++; } else { assert(0); } } break; case eTOKEN_NPC_WAREHOUSE: { mFunc[mFuncCount] = NPC_FUNC_WAREHOUSE; if( mFuncCount < NPC_FUNCHAVE_MAX ) { mFuncCount++; } else { assert(0); } } break; case eTOKEN_NPC_DISJOINT: { mFunc[mFuncCount] = NPC_FUNC_ITEMDISJOINT; if( mFuncCount < NPC_FUNCHAVE_MAX ) { mFuncCount++; } else { assert(0); } } break; case eTOKEN_NPC_GUILD: { mFunc[mFuncCount] = NPC_FUNC_GUILD; if( mFuncCount < NPC_FUNCHAVE_MAX ) { mFuncCount++; } else { assert(0); } } break; case eTOKEN_NPC_DEAL: { mFunc[mFuncCount] = NPC_FUNC_DEAL; if( mFuncCount < NPC_FUNCHAVE_MAX ) { mFuncCount++; } else { assert(0); } } break; case eTOKEN_NPC_FORTUNETAROT: { mFunc[mFuncCount] = NPC_FUNC_FORTUNETAROT; if( mFuncCount < NPC_FUNCHAVE_MAX ) { mFuncCount++; } else { assert(0); } /// Ÿ·Î ¿ä±Ý mTarotPrice = parser.ParseInt(); /// º¸À¯ÇÑ ½ºÇÁ·¹µå À妽º if( parser.ExpectTokenString( "{" ) == false ) return false; int count = 0; while( token != "}" ) { lexer->GetNextToken( &token ); if( token.mType == eTOKEN_INT ) { mTarotIndex[count] = (unsigned long)token.ToInt(); count++; } if( count > 22 ) { assert(0); break; } } } break; case eTOKEN_NPC_TAROT: { mFunc[mFuncCount] = NPC_FUNC_TAROT; if( mFuncCount < NPC_FUNCHAVE_MAX ) { mFuncCount++; } else { assert(0); } /// Ÿ·Î ¿ä±Ý mTarotPrice = parser.ParseInt(); /// º¸À¯ÇÑ ½ºÇÁ·¹µå À妽º if( parser.ExpectTokenString( "{" ) == false ) return false; int count = 0; while( token != "}" ) { lexer->GetNextToken( &token ); if( token.mType == eTOKEN_INT ) { mTarotIndex[count] = (unsigned long)token.ToInt(); count++; } if( count > 22 ) { assert(0); break; } } } break; case eTOKEN_NPC_THEME: { mFunc[mFuncCount] = NPC_FUNC_THEME; if( mFuncCount < NPC_FUNCHAVE_MAX ) { mFuncCount++; } else { assert( 0 ); } mThemeIndex = parser.ParseInt(); } break; case eTOKEN_NPC_SKILLPREVIEW: { mFunc[mFuncCount] = NPC_FUNC_SKILLPREVIEW; if( mFuncCount < NPC_FUNCHAVE_MAX ) { mFuncCount++; } else { assert(0); } mJobData[0] = parser.ParseInt(); mJobData[1] = parser.ParseInt(); } break; case eTOKEN_NPC_DEFAULT: { mDefaultTextIndex = parser.ParseInt(); unsigned long temp = 0; if( LoadPageList( parser, temp ) == false ) return false; } break; case eTOKEN_NPC_QUEST: { unsigned long questIndex = parser.ParseInt(); sQuestLinkPage* linkPage = new sQuestLinkPage; /// Äù½ºÆ® ¿¬°á ´ëÈ­ ÆÄ½Ì if( LoadQuestLink( parser, linkPage ) == false ) { assert( 0 && "failed to load page" ); SAFE_DELETE( linkPage ); return false; } /// Äù½ºÆ® ¸µÅ© ¸Ê¿¡ ´ã±â if( mQuestLinkPage.Insert( questIndex, linkPage ) == false ) { assert( 0 && "failed to insert quest link page" ); SAFE_DELETE( linkPage ); return false; } } break; case eTOKEN_NPC_FORTUNESPREAD: { /// º¸À¯ÇÑ ½ºÇÁ·¹µå À妽º if( parser.ExpectTokenString( "{" ) == false ) return false; while( token != "}" ) { lexer->GetNextToken( &token ); if( token.mType == eTOKEN_INT ) { mSpreadIndex[mSpreadCount] = (unsigned long)token.ToInt(); mSpreadCount++; } if( mSpreadCount > 5 ) { assert(0); break; } } } break; case eTOKEN_NPC_SPREAD: { /// º¸À¯ÇÑ ½ºÇÁ·¹µå À妽º if( parser.ExpectTokenString( "{" ) == false ) return false; while( token != "}" ) { lexer->GetNextToken( &token ); if( token.mType == eTOKEN_INT ) { mSpreadIndex[mSpreadCount] = (unsigned long)token.ToInt(); mSpreadCount++; } if( mSpreadCount > 5 ) { assert(0); break; } } } break; default: assert( 0 && "invalid token" ); cString msg; msg.Format("[%s] [Line:%d]", parser.GetFileName(), token.mLine ); MessageBoxA( NULL, msg.Cstr(), "invalid token", MB_OK | MB_ICONERROR ); return false; } } return true; } bool cUINpcTelling::LoadQuestLink( cParser& parser, sQuestLinkPage* linkPage ) { if( parser.ExpectTokenString( "{" ) == false ) return false; cToken token; cLexer* lexer = parser.GetLexer(); unsigned long rewardIndex = 0; while( lexer->GetNextToken( &token ) ) { if( token == "}" ) break; switch( token.mType ) { case eTOKEN_LCURLY: continue; case eTOKEN_NPC_NEW: { linkPage->newIndex = (unsigned long)parser.ParseInt(); if( LoadPageList( parser, rewardIndex ) == false ) return false; } break; case eTOKEN_NPC_PLAY: { linkPage->playIndex = (unsigned long)parser.ParseInt(); if( LoadPageList( parser, rewardIndex ) == false ) return false; } break; case eTOKEN_NPC_COMPLETE: { linkPage->completeIndex = (unsigned long)parser.ParseInt(); if( LoadPageList( parser, rewardIndex ) == false ) return false; linkPage->rewardIndex = rewardIndex; } break; default: assert( 0 && "invalid token" ); cString msg; msg.Format("[%s] [Line:%d]", parser.GetFileName(), token.mLine ); MessageBoxA( NULL, msg.Cstr(), "invalid token", MB_OK | MB_ICONERROR ); return false; } } return true; } bool cUINpcTelling::LoadPageList( cParser& parser, unsigned long& rewardIndex ) { if( parser.ExpectTokenString( "{" ) == false ) return false; cToken token; cLexer* lexer = parser.GetLexer(); while( lexer->GetNextToken( &token ) ) { if( token == "}" ) break; if( token.mType == eTOKEN_NPC_PAGE ) { unsigned long pageIndex = parser.ParseInt(); /// »õ ÆäÀÌÁö »ý¼º cPage* page = new cPage; if( LoadPage( parser, page ) == false ) { assert( 0 && "failed to load page data" ); SAFE_DELETE( page ); cString msg; msg.Format("[%s] [Line:%d]", parser.GetFileName(), token.mLine ); MessageBoxA( NULL, msg.Cstr(), "fail to parser", MB_OK | MB_ICONERROR ); return false; } /// º¸»ó ÆäÀÌÁö´Â complete ÆäÀÌÁö·ÎºÎÅÍ ½ÃÀÛÇÑ´Ù if( page->mAnswerType == eEVENT_COMPLETE ) rewardIndex = pageIndex; /// ÆäÀÌÁö »ðÀÔ if( UIMAN->AddPage( pageIndex, page ) == false ) { assert( 0 && "failed to insert page data" ); SAFE_DELETE( page ); cString msg; msg.Format("[%s] [Line:%d]", parser.GetFileName(), token.mLine ); MessageBoxA( NULL, msg.Cstr(), "fail to add page", MB_OK | MB_ICONERROR ); return false; } } else { assert( 0 && "invalid token" ); cString msg; msg.Format("[%s] [Line:%d]", parser.GetFileName(), token.mLine ); MessageBoxA( NULL, msg.Cstr(), "invalid token", MB_OK | MB_ICONERROR ); return false; } } return true; } bool cUINpcTelling::LoadPage( cParser& parser, cPage* page ) { if( parser.ExpectTokenString( "{" ) == false ) return false; cToken token; cLexer* lexer = parser.GetLexer(); while( lexer->GetNextToken( &token ) ) { if( token == "}" ) break; switch( token.mType ) { case eTOKEN_NPC_TEXT: { sPageText* pageText = new sPageText; pageText->textIndex = (unsigned int)parser.ParseInt(); pageText->numLine = (unsigned int)parser.ParseInt(); /// ±âº»´ë»ç ¹è¿­¿¡ Ãß°¡ page->mDefaultTextArray.PushBack( pageText ); } break; case eTOKEN_NPC_ANSWER: { /// ºÐ±â´ë»ç¿Í ´ÙÀ½ ÆäÀÌÁö ³Ñ±â±â´Â µ¿½Ã¿¡ ÀÖÀ»¼ö ¾ø´Ù if( page->mNextPageIndex > 0 ) { assert(0); return false; } sPageAnswer* pageAns = new sPageAnswer; pageAns->textIndex = (unsigned int)parser.ParseInt(); pageAns->numLine = (unsigned int)parser.ParseInt(); pageAns->nextPageIndex = (unsigned int)parser.ParseInt(); /// ºÐ±â ´ë»ç ¹è¿­¿¡ Ãß°¡ page->mAnswerArr.PushBack( pageAns ); } break; case eTOKEN_NPC_SOUND: break; case eTOKEN_NPC_SCENE: { page->mSceneIndex = (unsigned long)parser.ParseInt(); } break; case eTOKEN_NPC_NEXT: { /// ºÐ±â´ë»ç¿Í ´ÙÀ½ ÆäÀÌÁö ³Ñ±â±â´Â µ¿½Ã¿¡ ÀÖÀ»¼ö ¾ø´Ù if( page->mAnswerArr.GetSize() > 0 ) { assert(0); return false; } page->mNextPageIndex = (unsigned long)parser.ParseInt(); } break; case eTOKEN_NPC_EVENTYES: { page->mAnswerType = eEVENT_YES; } break; case eTOKEN_NPC_EVENTREWARD: { page->mAnswerType = eEVENT_REWARD; } break; case eTOKEN_NPC_EVENTCOMPLETE: { page->mAnswerType = eEVENT_COMPLETE; } break; default: assert( 0 && "invalid token" ); cString msg; msg.Format("[%s] [Line:%d]", parser.GetFileName(), token.mLine ); MessageBoxA( NULL, msg.Cstr(), "invalid token", MB_OK | MB_ICONERROR ); return false; } } return true; } /// ±âº»´ë»ç ·£´ýÀ¸·Î ȹµæ sPageText* cUINpcTelling::GetDefaultTextRandomly() { cPage* page = GetPage( mDefaultTextIndex ); if( !page ) { assert(0); return 0; } unsigned int i = page->mDefaultTextArray.GetSize(); i = rand() % i; return (sPageText*)page->mDefaultTextArray[i]; } unsigned long cUINpcTelling::GetDefaultScene() { cPage* page = GetPage( mDefaultTextIndex ); if( !page ) { assert(0); return 0; } return page->GetSceneIdx(); } /// Äù½ºÆ® °ü·Ã ÆäÀÌÁö Á¤º¸ ȹµæ sQuestLinkPage* cUINpcTelling::GetQuestLinkPage( unsigned long questIdx ) { return (sQuestLinkPage*)mQuestLinkPage.GetAt( questIdx ); } cPage* cUINpcTelling::GetPage( unsigned long pageIdx ) { return UIMAN->GetPage( pageIdx ); }