#include "StdAfx.h" #include "GatheringScript.h" #include "BaseObject_Common.h" #include "Gathering_Common.h" #include "Stage_Common.h" #include "Token.h" #include "Parser.h" #include "Lexer.h" #include "./util/FileLoader.h" #include "./util/Tokenizer.h" #include "./client/ResourceManager.h" #ifndef _CLIENT #include "Drop_Common.h" #endif cGatheringScript* cGatheringScript::mpGatheringScript = NULL; cGatheringScript::cGatheringScript(void) { /// ½Ì±ÛÅæ if( mpGatheringScript ) { assert(NULL); } else { mpGatheringScript = this; } } bool cGatheringScript::Init() { if( !LoadGatheringList() ) { assert(NULL); return false; } return true; } bool cGatheringScript::StageInit( unsigned short mapNumber, unsigned char levelMode ) { if( mapNumber == MAP_NONE ) { cPointHashMap* pGatheringRegenMap = new cPointHashMap; for( unsigned short mapNum = MAP_MIN ; mapNum <= MAP_MAX ; ++mapNum ) { /// ¸Ê¿¡ À§Ä¡ÇÑ Ã¤Áý ·Îµå if( !LoadGatheringRegen( mapNum, levelMode, pGatheringRegenMap ) ) { assert(NULL); return false; } } mGatheringRegenMap.Insert( levelMode, pGatheringRegenMap ); } else { cPointHashMap* pGatheringRegenMap = new cPointHashMap; if( !LoadGatheringRegen( mapNumber, levelMode, pGatheringRegenMap ) ) { assert(NULL); return false; } mGatheringRegenMap.Insert( levelMode, pGatheringRegenMap ); } return true; } void cGatheringScript::Release() { sGatheringList* pInfo = NULL; cPointHashMap::cIterator iList = mGatheringMap.Begin(); cPointHashMap::cIterator eList = mGatheringMap.End(); cPointHashMap::cIterator q; cPointHashMap::cIterator qEnd; for( ; iList != eList; ++iList ) { pInfo = (sGatheringList*)((*iList).mSecond); if( pInfo ) { #ifndef _CLIENT sDropQTypeGather* pDropQ; cAryVoid* pAry; /// Äù½ºÆ® ¾ÆÀÌÅÛ ¸ñ·Ï Á¦°Å cPointHashMap* pDropMap = pInfo->mpQuestItemDropMap; if( pDropMap != NULL ) { q = pDropMap->Begin(); qEnd = pDropMap->End(); for( ; q != qEnd; ++q ) { pAry = (cAryVoid*)((*q).mSecond); if( pAry == NULL ) continue; for( unsigned long j = 0 ; j < pAry->GetSize() ; ++j ) { pDropQ = (sDropQTypeGather*)(*pAry)[j]; delete pDropQ; } pAry->Clear(); SAFE_DELETE( pAry ); } pDropMap->Clear(); SAFE_DELETE( pDropMap ); } #endif SAFE_DELETE( pInfo ); } } mGatheringMap.Clear(); cPointHashMap::cIterator iMode = mGatheringRegenMap.Begin(); cPointHashMap::cIterator eMode = mGatheringRegenMap.End(); for( ; iMode != eMode ; ++iMode ) { cPointHashMap* pRegenMap = (cPointHashMap*)(*iMode).mSecond; if( pRegenMap == NULL ) continue; sGatheringRegenHeader* pHeader = NULL; cPointHashMap::cIterator iRegen = pRegenMap->Begin(); cPointHashMap::cIterator eRegen = pRegenMap->End(); for( ; iRegen != eRegen; ++iRegen ) { pHeader = (sGatheringRegenHeader*)((*iRegen).mSecond); if( pHeader != NULL ) { cAryVoid* pAry = &pHeader->mRegenDetail; if( pAry != NULL ) { sGatheringRegen* pDetail = NULL; for( unsigned int i = 0 ; i < pAry->GetSize() ; ++i ) { pDetail = (sGatheringRegen*)((*pAry)[i]); SAFE_DELETE( pDetail ); } pAry->Clear(); } pAry = NULL; } SAFE_DELETE( pHeader ); } pRegenMap->Clear(); SAFE_DELETE( pRegenMap ); } mGatheringRegenMap.Clear(); } bool cGatheringScript::LoadGatheringList() { cFileLoader loader; cString pathName = "./Script/Resource/GatheringList.txt"; if( loader.Open( pathName, true ) == false ) { assert( 0 && "failed to load GatheringList.txt" ); cString msg; msg.Format("[%s]", pathName.Cstr() ); MessageBoxA( NULL, msg.Cstr(), "fail to open file", MB_OK | MB_ICONERROR ); return false; } cTokenizer tokenizer( loader.GetBufferPtr(), loader.GetSize(), " \t\r\n", pathName.Cstr() ); cString str; sGatheringList* pList = NULL; while( tokenizer.IsEnd() == false ) { pList = new sGatheringList; /// Á¾·ù index if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mGatheringIdx = str.ToInt(); /// À̸§Idx if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mNameIdx = str.ToInt(); /// if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mNameHeight = str.ToInt(); /// ¸ðµ¨ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mFileName = str; /// Icon image index if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mIconIndex = str.ToInt(); /// effect ÆÄÀϸí if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mEffectFileName = str; /// Á¾·ù if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mType = (eGATHERING_TYPE)str.ToInt(); /// ÇÊ¿ä¾ÆÀÌÅÛ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mNeedItemIdx = str.ToInt(); /// ÇÊ¿ä¹öÇÁ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mNeedBuffIdx = str.ToInt(); /// ij¸¯ÅÍ·¹º§ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mNeedLevel = (unsigned char)str.ToInt(); /// ¿ä±¸ Á¦Á¶½ºÅ³ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mNeedMakeIdx = (unsigned char)str.ToInt(); /// ¿ä±¸ Äù½ºÆ® if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mNeedQuestIdx = str.ToInt(); /// È¿°ú À妽º if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mInfluenceIdx = str.ToInt(); /// äÁý ½Ã°£ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mGatheringTime = str.ToInt(); /// ÇØ½¬¿¡ ±â·Ï if( mGatheringMap.Insert( pList->mGatheringIdx, pList ) == false ) { assert(0); goto ERR; } else { // Resource ·Îµù Ãß°¡. [12/21/2009 Jo_Client] cString path; path.Format("./data/monster/%s", pList->mFileName.Cstr() ); if( RESOURCEMAN->LoadMapNIF( path.Cstr() ) == false ) { cString msg; msg.Format("[%s] [Line:%d]", pathName.Cstr(), tokenizer.mLine ); MessageBoxA( NULL, msg.Cstr(), "fail to parse", MB_OK | MB_ICONERROR ); } } } return true; ERR: delete pList; cString msg; msg.Format("[%s] [Line:%d]", pathName.Cstr(), tokenizer.mLine ); MessageBoxA( NULL, msg.Cstr(), "fail to parse", MB_OK | MB_ICONERROR ); return false; } sGatheringList* cGatheringScript::GetGatheringInfo( unsigned long gatheringIdx ) { return (sGatheringList*)mGatheringMap.GetAt( gatheringIdx ); } bool cGatheringScript::LoadGatheringRegen( unsigned short mapnum, unsigned char levelMode, tPointerHashMap* pGatheringRegenMap ) { if( pGatheringRegenMap == NULL ) return false; cFileLoader loader; cString pathName; pathName.Format( "./script/resource/gatheringregen%d_%d.txt", mapnum, levelMode ); if( loader.Open( pathName, true ) == false ) return true; if( loader.GetSize() == 0 ) return true; /// ÆÄ½Ì cTokenizer tok( loader.GetBufferPtr(), loader.GetSize(), " \t\r\n\"", pathName.Cstr() ); cString str; sGatheringRegenHeader* pHeader = NULL; sGatheringRegen* pDetail = NULL; while( tok.IsEnd() == false ) { /// ÇØ´õ Á¤º¸ »ý¼º pHeader = new sGatheringRegenHeader; /// ¸®Á¨ ¹øÈ£ ( ¸®Á¨ ½ºÅ©¸³Æ® °íÀ¯ ¹øÈ£ ) tok.GetNext( &str ); unsigned short groupNum = (unsigned short)str.ToInt(); /// °íÀ¯¹øÈ£°¡ ¸Ê³Ñ¹ö ÀÚ¸®±îÁö ħ¹üÇϴ°ÍÀ» ¹æÁö if( MAPNUMBER_UNIT <= mapnum ) { assert(NULL); goto ERR; } /// ¸®Á¨ ¹øÈ£ ( ¸®Á¨ ½ºÅ©¸³Æ® °íÀ¯ ¹øÈ£ ) unsigned long regenIdx = ( mapnum * MAPNUMBER_UNIT ) + groupNum; /// ¸®Á¨ ´ë±â½Ã°£ tok.GetNext( &str ); pHeader->mRegenWaitTime = str.ToInt(); /// ´ë±â½Ã°£ ÀÌÈÄ ·£´ý ¸®Á¨ ½Ã°£ tok.GetNext( &str ); pHeader->mRandTime = str.ToInt(); if( pGatheringRegenMap->Insert( regenIdx, pHeader ) == false ) { assert(0); goto ERR; } tok.GetNext( &str ); if( str != "{" ) goto ERR; while( tok.IsEnd() == false ) { tok.GetNext( &str ); if( str == "}" ) break; /// °³º° ¸®Á¨ Á¤º¸ ±â·Ï pDetail = new sGatheringRegen; /// äÁýIDX pDetail->mGatheringIdx = str.ToInt(); /// ¸Ê¹øÈ£ pDetail->mMapNumber = mapnum; /// ÁÂÇ¥ tok.GetNext( &str ); pDetail->mPosX = str.ToFloat(); tok.GetNext( &str ); pDetail->mPosY = str.ToFloat(); /// ȸÀü°ª tok.GetNext( &str ); pDetail->mDirection = S_ToRadian( str.ToFloat() ); /// ³ôÀÌ È®Àå°ª tok.GetNext( &str ); pDetail->mHeight = str.ToFloat(); pHeader->mRegenDetail.PushBack( pDetail ); } /// äÁýIDXº° ¸®Á¨À§Ä¡ °¹¼ö È®ÀÎ if( pHeader->mRegenDetail.GetSize() == 0 ) { assert(NULL); goto ERR; } } return true; ERR: delete pDetail; delete pHeader; cString msg; msg.Format("[%s] [Line:%d]", pathName.Cstr(), tok.mLine ); MessageBoxA( NULL, msg.Cstr(), "fail to parse", MB_OK | MB_ICONERROR ); return false; } const sGatheringRegenHeader* cGatheringScript::GetGatheringRegen( unsigned char levelMode, unsigned long regenIdx ) { cPointHashMap* pRegenMap = (cPointHashMap*)mGatheringRegenMap.GetAt( levelMode ); if( pRegenMap == NULL ) return NULL; return (const sGatheringRegenHeader*)pRegenMap->GetAt( regenIdx ); }