#include "StdAfx.h" #include "MonsterScript.h" #include "Monster_Common.h" #include "Token.h" #include "Parser.h" #include "Lexer.h" #include "./util/FileLoader.h" #include "./util/Tokenizer.h" #include "Mode.h" #include "Stage_Common.h" //#include "BaseObject.h" #ifdef _CLIENT #include "GameResourceManager.h" #else #include "Drop_Common.h" #endif cMonsterScript* cMonsterScript::mpMonsterScript = NULL; cMonsterScript::cMonsterScript(void) { /// ½Ì±ÛÅæ if( mpMonsterScript ) { assert(NULL); } else { mpMonsterScript = this; } mpMonsterMap = new cPointHashMap( 999 ); mpMonsterModeAgentMap = new cPointHashMap( 999 ); mpRegenMonsterMap = new cPointHashMap( 999 ); mpRegenGroupMap = new cPointHashMap( 999 ); mpModelNumberMap = new cPointHashMap( 100 ); mpMonsterTalkMap = new cPointHashMap( 999 ); mpRegenSwitchGroup = new cPointHashMap( 100 ); mpMonsterPattern = new cPointHashMap( 100 ); mpSummonPatternMap = new cPointHashMap( 100 ); //mpMonsterCourseMoveMap = new cPointHashMap( 999 ); } bool cMonsterScript::Init() { /// ¸ó½ºÅÍ °íÀ¯ ¸®½ºÆ® ·Îµå if( !LoadMonsterList() ) { assert(NULL); return false; } #ifndef _CLIENT if( LoadMonsterTalkList() == false ) { assert(NULL); return false; } if( LoadSummonPattern() == false ) { assert(NULL); return false; } #endif return true; } bool cMonsterScript::StageInit( unsigned short mapNumber, unsigned char levelMode ) { if( mapNumber == MAP_NONE ) { cPointHashMap* pRegenMonsterMap = new cPointHashMap; cPointHashMap* pRegenGroupMap = new cPointHashMap; cPointHashMap* pRegenSwitchGroup = new cPointHashMap; cPointHashMap* pMonsterPattern = new cPointHashMap; for( unsigned short mapNum = MAP_MIN ; mapNum <= MAP_MAX ; ++mapNum ) { /// ¸Ê¿¡ À§Ä¡ÇÑ ¸ó½ºÅÍ ·Îµå if( !LoadRegenMonsterlist( mapNum, levelMode, pRegenMonsterMap, pRegenGroupMap, pRegenSwitchGroup ) ) { assert(NULL); return false; } if( LoadMonsterPattern( mapNum, levelMode, pMonsterPattern ) == false ) { assert(NULL); return false; } } mpRegenMonsterMap->Insert( 0, pRegenMonsterMap ); mpRegenGroupMap->Insert( 0, pRegenGroupMap ); mpRegenSwitchGroup->Insert( 0, pRegenSwitchGroup ); mpMonsterPattern->Insert( 0, pMonsterPattern ); } else { cPointHashMap* pRegenMonsterMap = new cPointHashMap; cPointHashMap* pRegenGroupMap = new cPointHashMap; cPointHashMap* pRegenSwitchGroup = new cPointHashMap; cPointHashMap* pMonsterPattern = new cPointHashMap; /// ¸Ê¿¡ À§Ä¡ÇÑ ¸ó½ºÅÍ ·Îµå if( !LoadRegenMonsterlist( mapNumber, levelMode, pRegenMonsterMap, pRegenGroupMap, pRegenSwitchGroup ) ) { assert(NULL); return false; } if( LoadMonsterPattern( mapNumber, levelMode, pMonsterPattern ) == false ) { assert(NULL); return false; } mpRegenMonsterMap->Insert( levelMode, pRegenMonsterMap ); mpRegenGroupMap->Insert( levelMode, pRegenGroupMap ); mpRegenSwitchGroup->Insert( levelMode, pRegenSwitchGroup ); mpMonsterPattern->Insert( levelMode, pMonsterPattern ); } return true; } void cMonsterScript::Release() { ReleaseSummonPattern(); ReleaseRegenSwitchGroup(); ReleaseMonsterTalk(); ReleaseModelNumber(); ReleaseRegenGroup(); ReleaseRegenMonster(); ReleaseMonsterMode(); ReleaseMonsterPattern(); ReleaseMonsterList(); SAFE_DELETE( mpSummonPatternMap ); SAFE_DELETE( mpRegenSwitchGroup ); SAFE_DELETE( mpMonsterTalkMap ); SAFE_DELETE( mpModelNumberMap ); SAFE_DELETE( mpRegenGroupMap ); SAFE_DELETE( mpRegenMonsterMap ); SAFE_DELETE( mpMonsterModeAgentMap ); SAFE_DELETE( mpMonsterPattern ); SAFE_DELETE( mpMonsterMap ); //mpMonsterCourseMoveMap = new cPointHashMap( 999 ); //ReleaseCourseMove(); } bool cMonsterScript::LoadMonsterList() { cFileLoader loader; cString pathName = "./Script/Resource/MonsterList.txt"; if( loader.Open( pathName, true ) == false ) { assert( 0 && "failed to load MonsterList.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; unsigned long nameIdx = 0; unsigned long jobnameIdx = 0; sMonsterScript* pList = NULL; while( tokenizer.IsEnd() == false ) { pList = new sMonsterScript; //¸ó½ºÅÍ Á¾·ù index if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mMonsterClassIdx = str.ToInt(); /// ¸ó½ºÅÍ À̸§Idx if( tokenizer.GetNext( &str ) == false ) { goto ERR; } nameIdx = str.ToInt(); /// ¸ó½ºÅÍ Á÷¾÷À̸§Idx if( tokenizer.GetNext( &str ) == false ) { goto ERR; } jobnameIdx = str.ToInt(); #ifdef _CLIENT /// ¸ó½ºÅÍ À̸§ _stprintf_s( pList->mName, _T( "%s" ), GAMERESOURCEMAN->GetMonsterName( nameIdx ) ); /// ¸ó½ºÅÍ Á÷¾÷¸í if( jobnameIdx > 0 ) { _stprintf_s( pList->mJobName, _T( "%s" ), GAMERESOURCEMAN->GetMonsterName( jobnameIdx ) ); } else { _stprintf_s( pList->mJobName, _T( "" ) ); } #else /// ¸ó½ºÅÍ À̸§ _stprintf( pList->mName, _T( "" ) ); #endif /// kfmÆÄÀÏidx if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mKfmIdx = str.ToInt(); /// À̸§ ³ôÀ̰ª if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mNameHeight = str.ToInt(); /// if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mKind = (unsigned char)str.ToInt(); /// ¼Ó¼º if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mType = (unsigned char)str.ToInt(); /// ·¹º§ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mLevel = (unsigned char)str.ToInt(); /// HP if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mMaxHp = str.ToInt(); /// MP if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mMaxMp = str.ToInt(); /// expȹµæ·® if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mExp = str.ToInt(); /// sxpȹµæ·® if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mSxp = str.ToInt(); /// ¹°¸®¹æ¾î if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mDef = (unsigned short)str.ToInt(); /// ¸¶¹ý¹æ¾î if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mMdef = (unsigned short)str.ToInt(); /// ¸íÁß¼öÄ¡ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mHit = str.ToInt(); /// ȸÇÇÀ² if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mAvoid = (unsigned short)str.ToInt(); /// ½Ã¾ß¹üÀ§ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mSeekRange = str.ToInt(); /// ºñÁß if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mImportance = (unsigned char)str.ToInt(); /// Å©±â if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mMonsterScale = str.ToFloat(); /// ¿¬ÃâÀÌÆåÆ® Å©±â if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mEffectScale = str.ToFloat(); /// ÇÇÇØ¹üÀ§ - º¸°£ »çÀÌÁî if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mMonsterFixSize = str.ToFloat(); /// Çൿ¹üÀ§ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mFreeMoveRange = str.ToInt(); /// Çൿ(Á¤Áö) if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mActionStopRatio = (unsigned short)str.ToInt(); /// Çൿ(°È±â) if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mActionWalkRatio = (unsigned short)str.ToInt(); /// Çൿ(¶Ù±â) if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mActionRunRatio = (unsigned short)str.ToInt(); /// Á¤Áö½Ã°£ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mActionStopTime = str.ToInt(); /// À̵¿¼Óµµ(°È±â) if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mActionWalkSpd = str.ToInt(); /// À̵¿¼Óµµ(¶Ù±â,µµ¸Á) if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mActionRunSpd = str.ToInt(); /// ¼±°ø¿©ºÎ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mIsPrecedeAttack = str.ToInt() == 1 ? true : false; /// º¯½ÅÀÎ½Ä if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mIsChgMonCheck = str.ToInt() == 1 ? true : false; /// ÃßÀû½Ã°£ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mFollowTime = str.ToInt(); /// ÃßÀû°Å¸® if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mFollowRange = str.ToInt(); /// µµ¸ÁÁ¶°Ç if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mEscapeType = (unsigned char)str.ToInt(); /// µµ¸ÁÈ®·ü if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mEscapePer = (unsigned char)str.ToInt(); /// ȸº¹¿©ºÎ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mIsRecovery = str.ToInt() == 1 ? true : false; /// ȸº¹½ÃÀ۽ð£ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mRecoveryTime = str.ToInt(); /// ÇØ½¬¿¡ ¸ó½ºÅÍ º°·Î ±â·Ï if( mpMonsterMap->Insert( pList->mMonsterClassIdx, pList ) == false ) { assert(0); goto ERR; } LoadMonsterMode( pList->mMonsterClassIdx ); } return true; ERR: delete pList; cString msg; msg.Format("[%s] [Line:%d]", pathName.Cstr(), tokenizer.mLine ); MessageBoxA( NULL, msg.Cstr(), "fail to parser", MB_OK | MB_ICONERROR ); return false; } sMonsterScript* cMonsterScript::GetMonsterListInfo( unsigned long monsterIdx ) { return (sMonsterScript*)mpMonsterMap->GetAt( monsterIdx ); } void cMonsterScript::ReleaseMonsterList() { if( mpMonsterMap ) { sMonsterScript* pInfo = NULL; cPointHashMap::cIterator i = mpMonsterMap->Begin(); cPointHashMap::cIterator end = mpMonsterMap->End(); cPointHashMap::cIterator q; cPointHashMap::cIterator qEnd; for( ; i != end; ++i ) { pInfo = (sMonsterScript*)((*i).mSecond); if( pInfo ) { #ifndef _CLIENT sDropQType* 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 = (sDropQType*)(*pAry)[j]; delete pDropQ; } pAry->Clear(); SAFE_DELETE( pAry ); } pDropMap->Clear(); SAFE_DELETE( pDropMap ); } #endif /// ¸ó½ºÅÍ Á¤º¸ Á¦°Å delete pInfo; pInfo = NULL; } } mpMonsterMap->Clear(); } } bool cMonsterScript::LoadRegenMonsterlist( unsigned short mapnum, unsigned char levelMode, tPointerHashMap* pRegenMonsterMap, tPointerHashMap* pRegenGroupMap, tPointerHashMap* pRegenSwitchGroup ) { if( pRegenMonsterMap == NULL ) return false; if( pRegenGroupMap == NULL ) return false; if( pRegenSwitchGroup == NULL ) return false; cFileLoader loader; cString pathName; pathName.Format( "./Script/Resource/MonsterRegen%d_%d.txt", mapnum, levelMode ); unsigned long insertIdx = 1; 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; unsigned long groupNumber = 0; sRegenGroupScript* pGroupList = NULL; sRegenScript* pList = NULL; cHashSet* pMondelNumberHashSet = (cHashSet*)mpModelNumberMap->GetAt( mapnum ); if( pMondelNumberHashSet == NULL ) { pMondelNumberHashSet = new cHashSet; /// ¸Ê¿¡ ÇØ´çÇÏ´Â ¸ðµ¨ Á¤º¸ ÇØ½¬¼ÂÀ» ±â·Ï if( mpModelNumberMap->Insert( mapnum, pMondelNumberHashSet ) == false ) { assert(NULL); goto ERR; } } float direction = 0; while( tok.IsEnd() == false ) { /// °ýÈ£»ó´Ü ùÁÙ ±×·ì¹øÈ£ tok.GetNext( &str ); groupNumber = (unsigned short)str.ToInt(); /// ±×·ì °íÀ¯¹øÈ£°¡ ¸Ê³Ñ¹ö ÀÚ¸®±îÁö ħ¹üÇϴ°ÍÀ» ¹æÁö if( MAPNUMBER_UNIT <= groupNumber ) { assert(NULL); goto ERR; } /// ¸Êº°·Î ±¸º°À» ÇϱâÀ§ÇÑ ±×·ì ³Ñ¹ö groupNumber = ( mapnum * MAPNUMBER_UNIT ) + groupNumber; /// ±×·ì ¹øÈ£ ¾ÈÀÇ ¼¼ºÎÇ׸ñ ½ÃÀÛ tok.GetNext( &str ); if( str != '{' ) { assert( 0 && "wrong script" ); goto ERR; } /// ±×·ì ¼³Á¤ Á¶°Ç pGroupList = new sRegenGroupScript; pGroupList->mGroupIdx = groupNumber; /// ¼­¹ö½ÃÀ۽à ¸®Á¨µÇ´Â ±×·ìÀÎÁö ¿©ºÎ tok.GetNext( &str ); pGroupList->mServerOnRegen = str.ToInt() == 0 ? false : true; /* /// ±×·ì ´ÜÀ§ ¸®Á¨ Á¶°Ç ¸¸Á·½Ã ¸®Á¨µÉ ±×·ì¹øÈ£ tok.GetNext( &str ); unsigned long regenGroupIdx = str.ToInt(); if( regenGroupIdx == 0 ) pGroupList->mRegenGroupIdx = regenGroupIdx; else pGroupList->mRegenGroupIdx = ( mapnum * MAPNUMBER_UNIT ) + regenGroupIdx; */ /// ¸®Á¨ ±×·ì ¸ó½ºÅͰ¡ ÀÏÁ¤ ÆÛ¼¾Æ¼Áö ÀÌÇÏ Àΰæ¿ì ¸®Á¨ tok.GetNext( &str ); pGroupList->mRegenPer = (unsigned char)str.ToInt(); tok.GetNext( &str ); pGroupList->mRegenRange = str.ToInt(); tok.GetNext( &str ); pGroupList->mRegenTime = str.ToInt(); /// ¸Ê ±×·ì¹øÈ£ tok.GetNext( &str ); pGroupList->mMapGroupIdx = str.ToInt(); /// ä³Î °øÀ¯ üũ tok.GetNext( &str ); pGroupList->mChannelCheck = str.ToInt() == 1 ? true : false; if( pGroupList->mChannelCheck == true ) { /// ä³Î°£ ¸®Á¨½Ã°£ÀÌ ³Ê¹« ª´Ù. if( pGroupList->mRegenTime <= SWITCH_RANDTIME + SWITCH_CHANNEL_CHECKTIME ) goto ERR; } /// ±×·ì ´ÜÀ§ ¸®Á¨ Á¶°Ç ¸¸Á·½Ã ¸®Á¨µÉ ±×·ì¹øÈ£ tok.GetNext( &str ); unsigned long regenGroupCount = str.ToInt(); if( regenGroupCount != 0 ) { for( unsigned int i=0; imRegenGroupAry.PushBack( ( mapnum * MAPNUMBER_UNIT ) + regenGroupIdx ); } } /// ¼±ÅÃÀûÀÎ ±×·ì ¸®Á¨ Á¤º¸ ÀúÀå if( pGroupList->mMapGroupIdx != 0 ) { cArray* pSwitchGroup = (cArray*)pRegenSwitchGroup->GetAt( pGroupList->mMapGroupIdx ); if( pSwitchGroup == NULL ) { pSwitchGroup = new cArray; if( pRegenSwitchGroup->Insert( pGroupList->mMapGroupIdx, pSwitchGroup ) == false ) goto ERR; } pSwitchGroup->PushBack( groupNumber ); } while( tok.IsEnd() == false ) { tok.GetNext( &str ); if( str == "}" ) break; /// °³°³ÀÇ ¸ó½ºÅÍ ¸®Á¨ ¼³Á¤ Á¶°Ç pList = new sRegenScript; /// ¸ó½ºÅÍ Á¾·ù ¹øÈ£ pList->mMonsterClassIdx = str.ToInt(); tok.GetNext( &str ); pList->mRegenX = str.ToFloat(); tok.GetNext( &str ); pList->mRegenY = str.ToFloat(); tok.GetNext( &str ); direction = str.ToFloat(); if( direction <= 1000.0f ) direction = S_ToRadian( direction ); pList->mDirection = direction; tok.GetNext( &str ); pList->mRegenTime = str.ToInt(); tok.GetNext( &str ); pList->mRegenLifeTime = str.ToInt(); tok.GetNext( &str ); pList->mFamilyNum = str.ToInt(); tok.GetNext( &str ); pList->mPatternIdx = str.ToInt(); pList->mMapNumber = mapnum; pList->mLevelMode = levelMode; pList->mGroupNumber = groupNumber; /// ¸ó½ºÅÍ °íÀ¯¹øÈ£°¡ ¸Ê³Ñ¹ö ÀÚ¸®±îÁö ħ¹üÇϴ°ÍÀ» ¹æÁö if( MAPNUMBER_UNIT <= insertIdx ) { assert(NULL); goto ERR; } pList->mRegenIdx = ( mapnum * MAPNUMBER_UNIT ) + insertIdx; /// ¸ó½ºÅÍ À妽º¸¸ º¸°í ¾î´À¸ÊÀÎÁö ±¸º°À» ½±°Ô ÇϱâÀ§ÇØ ¸Ê¹øÈ£¸¦ ¸ó½ºÅÍ °íÀ¯¹øÈ£¿¡ Æ÷ÇÔ if( pRegenMonsterMap->Insert( ( mapnum * MAPNUMBER_UNIT ) + insertIdx, pList ) == false ) { assert(NULL); goto ERR; } /// ±×·ì Á¤º¸¿¡ ¸ó½ºÅÍ °íÀ¯¹øÈ£¸¸ ±â·Ï pGroupList->mMonsterAry.PushBack( ( mapnum * MAPNUMBER_UNIT ) + insertIdx ); /// ¸ÊÁ¤º¸ Á¦¿ÜµÈ °íÀ¯¹øÈ£ Áõ°¡ ++insertIdx; /// Ŭ¶óÀÌ¾ðÆ®¿¡ loadstage½ÃÁ¡¿¡ ¸ÕÀú µ¥ÀÌŸ¸¦ Àоî¿Í¾ß ÇÒ ¸ó½ºÅÍ ¸ñ·Ï ±â·Ï if( pMondelNumberHashSet->GetCount( pList->mMonsterClassIdx ) == 0 ) { pMondelNumberHashSet->Insert( pList->mMonsterClassIdx ); } } /// ±×·ì¿¡ ÇØ´çÇÏ´Â ¸ó½ºÅÍ °¹¼ö¸¦ È®ÀÎ if( pGroupList->mMonsterAry.GetSize() == 0 ) { assert(NULL); goto ERR; } /// ±×·ì Á¤º¸ Ãß°¡ if( pRegenGroupMap->Insert( groupNumber, pGroupList ) == false ) { assert(NULL); goto ERR; } } return true; ERR: delete pList; delete pGroupList; return false; } sRegenScript* cMonsterScript::GetRegenMonsterInfo( unsigned char modeNum, unsigned long monsterIdx ) { if( mpRegenMonsterMap == NULL ) return NULL; cPointHashMap* pModeMap = (cPointHashMap*)mpRegenMonsterMap->GetAt( modeNum ); if( pModeMap == NULL ) return NULL; return (sRegenScript*)pModeMap->GetAt( monsterIdx ); } sRegenGroupScript* cMonsterScript::GetRegenGroupInfo( unsigned char modeNum, unsigned long groupIdx ) { if( mpRegenGroupMap == NULL ) return NULL; cPointHashMap* pModeMap = (cPointHashMap*)mpRegenGroupMap->GetAt( modeNum ); if( pModeMap == NULL ) return NULL; return (sRegenGroupScript*)pModeMap->GetAt( groupIdx ); } void cMonsterScript::ReleaseRegenMonster() { if( mpRegenMonsterMap ) { cPointHashMap::cIterator mI = mpRegenMonsterMap->Begin(); cPointHashMap::cIterator mE = mpRegenMonsterMap->End(); for( ; mI != mE ; ++mI ) { cPointHashMap* pRegenMonsterMap = (cPointHashMap*)(*mI).mSecond; if( pRegenMonsterMap != NULL ) { cPointHashMap::cIterator i = pRegenMonsterMap->Begin(); cPointHashMap::cIterator end = pRegenMonsterMap->End(); for( ; i != end; ++i ) { sRegenScript* pInfo = (sRegenScript*)((*i).mSecond); if( pInfo ) { delete pInfo; pInfo = NULL; } } pRegenMonsterMap->Clear(); SAFE_DELETE( pRegenMonsterMap ); } } mpRegenMonsterMap->Clear(); SAFE_DELETE( mpRegenMonsterMap ); } } void cMonsterScript::ReleaseRegenGroup() { if( mpRegenGroupMap ) { cPointHashMap::cIterator mI = mpRegenGroupMap->Begin(); cPointHashMap::cIterator mE = mpRegenGroupMap->End(); for( ; mI != mE ; ++mI ) { cPointHashMap* pRegenGroupMap = (cPointHashMap*)(*mI).mSecond; if( pRegenGroupMap != NULL ) { sRegenGroupScript* pInfo = NULL; cPointHashMap::cIterator i = pRegenGroupMap->Begin(); cPointHashMap::cIterator end = pRegenGroupMap->End(); for( ; i != end; ++i ) { pInfo = (sRegenGroupScript*)(*i).mSecond; if( pInfo ) { SAFE_DELETE(pInfo); } } pRegenGroupMap->Clear(); SAFE_DELETE( pRegenGroupMap ); } } mpRegenGroupMap->Clear(); SAFE_DELETE( mpRegenGroupMap ); } } void cMonsterScript::ReleaseModelNumber() { if( mpModelNumberMap ) { cHashSet* pInfo = NULL; cPointHashMap::cIterator i = mpModelNumberMap->Begin(); cPointHashMap::cIterator end = mpModelNumberMap->End(); for( ; i != end; ++i ) { pInfo = (cHashSet*)(*i).mSecond; if( pInfo ) { SAFE_DELETE(pInfo); } } mpModelNumberMap->Clear(); } } bool cMonsterScript::LoadMonsterTalkList() { cFileLoader loader; cString pathName = "./Script/Resource/MonsterSpeech.txt"; if( loader.Open( pathName, true ) == false ) { assert( 0 && "failed to load MonsterSpeech.txt" ); return false; } cTokenizer tokenizer( loader.GetBufferPtr(), loader.GetSize(), " \t\r\n", pathName.Cstr() ); cString str; sMonsterTalk* pList = NULL; sMonsterTalk** pArray = NULL; while( tokenizer.IsEnd() == false ) { pList = new sMonsterTalk; //¸ó½ºÅÍ Á¾·ù index if( tokenizer.GetNext( &str ) == false ) { goto ERR; } unsigned long monsterClassIdx = str.ToInt(); /// »óȲ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } eMONSTER_TALK_STATE talk = (eMONSTER_TALK_STATE)str.ToInt(); if( talk >= eMONSTERTALK_MAX ) { goto ERR; } /// Ç¥½Ã ¼³Á¤ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mViewType = (unsigned char)str.ToInt(); /// ´ë»ç Ç¥½Ã È®·ü if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mViewPercent = (unsigned char)str.ToInt(); /// ´ë»ç Ç¥½Ã üũ ½Ã°£ if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mCheckTime = str.ToInt(); /// ´ë»ç À妽º for( unsigned long i = 0 ; i < MONSTER_TALK_SIZE ; ++i ) { if( tokenizer.GetNext( &str ) == false ) { goto ERR; } pList->mTalkIdx[i] = str.ToInt(); } pArray = (sMonsterTalk**)mpMonsterTalkMap->GetAt( monsterClassIdx ); if( pArray == NULL ) { sMonsterTalk** arry = new sMonsterTalk*[eMONSTERTALK_MAX]; memset( arry, 0, sizeof(sMonsterTalk*) * eMONSTERTALK_MAX ); pArray = arry; /// ÇØ½¬¿¡ ¸ó½ºÅÍ º°·Î ±â·Ï if( mpMonsterTalkMap->Insert( monsterClassIdx, pArray ) == false ) { assert(NULL); goto ERR; } } if( pArray[talk] != NULL ) { assert(NULL); goto ERR; } pArray[talk] = pList; } return true; ERR: delete pList; return false; } sMonsterTalk* cMonsterScript::GetMonsterTalkInfo( unsigned long monsterClassIdx, unsigned char state ) { if( state >= eMONSTERTALK_MAX ) { assert(NULL); return NULL; } sMonsterTalk** pArray = (sMonsterTalk**)mpMonsterTalkMap->GetAt( monsterClassIdx ); if( pArray == NULL ) return NULL; return pArray[state]; } tPointerHashMap* cMonsterScript::GetSwitchGroup( unsigned char modeNum ) { if( mpRegenSwitchGroup == NULL ) return NULL; return (tPointerHashMap*)mpRegenSwitchGroup->GetAt( modeNum ); } void cMonsterScript::ReleaseMonsterTalk() { if( mpMonsterTalkMap ) { /// mMonsterDramaturgyInfoMap Clear cPointHashMap::cIterator i = mpMonsterTalkMap->Begin(); cPointHashMap::cIterator end = mpMonsterTalkMap->End(); for( ; i != end; ++i ) { sMonsterTalk** pInfo = (sMonsterTalk**)((*i).mSecond); for( unsigned int j = 0 ; j < eMONSTERTALK_MAX ; ++j ) SAFE_DELETE( pInfo[j] ); SAFE_DELETE_ARRAY( pInfo ); } mpMonsterTalkMap->Clear(); } } void cMonsterScript::LoadMonsterMode( unsigned long monsterIdx ) { cModeAgent* modeAgent = new cModeAgent; if( modeAgent == 0 ) { assert(0); return; } if( modeAgent->LoadFile( monsterIdx ) == false ) { delete modeAgent; return; } if( mpMonsterModeAgentMap->Insert( monsterIdx, modeAgent ) == false ) { assert(0); delete modeAgent; return; } } void cMonsterScript::ReleaseMonsterMode() { if( mpMonsterModeAgentMap ) { /// cPointHashMap::cIterator i = mpMonsterModeAgentMap->Begin(); cPointHashMap::cIterator end = mpMonsterModeAgentMap->End(); for( ; i != end; ++i ) { cModeAgent* agent = (cModeAgent*)((*i).mSecond); SAFE_DELETE( agent ); } mpMonsterModeAgentMap->Clear(); } } cModeAgent* cMonsterScript::GetMonsterModeAgent( unsigned long monsterIdx ) { return (cModeAgent*)mpMonsterModeAgentMap->GetAt( monsterIdx ); } sMonsterPattern* cMonsterScript::GetMonsterPattern( unsigned char levelMode, unsigned long patternIdx ) { if( mpMonsterPattern == NULL ) return NULL; cPointHashMap* pModeMap = (cPointHashMap*)mpMonsterPattern->GetAt( levelMode ); if( pModeMap == NULL ) return NULL; return (sMonsterPattern*)pModeMap->GetAt( patternIdx ); } void cMonsterScript::ReleaseRegenSwitchGroup() { if( mpRegenSwitchGroup ) { cPointHashMap::cIterator mI = mpRegenSwitchGroup->Begin(); cPointHashMap::cIterator mE = mpRegenSwitchGroup->End(); for( ; mI != mE ; ++mI ) { cPointHashMap* pRegenSwitchGroup = (cPointHashMap*)(*mI).mSecond; if( pRegenSwitchGroup != NULL ) { /// mpRegenSwitchGroup Clear cPointHashMap::cIterator i = pRegenSwitchGroup->Begin(); cPointHashMap::cIterator end = pRegenSwitchGroup->End(); for( ; i != end; ++i ) { cArray* pInfo = (cArray*)((*i).mSecond); SAFE_DELETE( pInfo ); } pRegenSwitchGroup->Clear(); SAFE_DELETE( pRegenSwitchGroup ); } } mpRegenSwitchGroup->Clear(); SAFE_DELETE( mpRegenSwitchGroup ); } } bool cMonsterScript::LoadMonsterPattern( unsigned short mapnum, unsigned char levelMode, tPointerHashMap* pMonsterPattern ) { cFileLoader loader; cString pathName; pathName.Format( "./script/resource/monsterpattern%d_%d.txt", mapnum, levelMode ); if( loader.Open( pathName, true ) == false ) { return true; } cTokenizer tok( loader.GetBufferPtr(), loader.GetSize(), " \t\r\n\"", pathName.Cstr() ); cString str; sMonsterPattern* pPattern = NULL; sMonsterPatternPos* pPos = NULL; while( tok.IsEnd() == false ) { pPattern = new sMonsterPattern; /// ÆÐÅÏidx tok.GetNext( &str ); pPattern->mPatternIdx = str.ToInt(); /// ÆÐÅϼ³Á¤ tok.GetNext( &str ); pPattern->mType = str.ToInt() == 1 ? true : false; /// À§Ä¡ Á¤º¸ ·Îµå tok.GetNext( &str ); if( str != '{' ) { assert( 0 && "wrong script" ); goto ERR; } cAryVoid* pPosAry = &pPattern->mPosAry; tok.GetNext( &str ); while( tok.IsEnd() == false ) { pPos = new sMonsterPatternPos; /// ÁÂÇ¥x pPos->mPosX = str.ToFloat(); /// ÁÂÇ¥y tok.GetNext( &str ); pPos->mPosY = str.ToFloat(); /// ÆÐÅϹüÀ§ tok.GetNext( &str ); pPos->mRange = str.ToInt(); /// °æÀ¯Áö¼³Á¤ tok.GetNext( &str ); pPos->mRelaxPoint = str.ToInt() == 1 ? true : false; /// ´ë±â½Ã°£ tok.GetNext( &str ); pPos->mWaitTime = str.ToInt(); pPosAry->PushBack( pPos ); tok.GetNext( &str ); if( str == "}" ) break; } pMonsterPattern->Insert( pPattern->mPatternIdx, pPattern ); } return true; ERR: delete pPattern; delete pPos; return false; } void cMonsterScript::ReleaseMonsterPattern() { if( mpMonsterPattern ) { cPointHashMap::cIterator mI = mpMonsterPattern->Begin(); cPointHashMap::cIterator mE = mpMonsterPattern->End(); for( ; mI != mE ; ++mI ) { cPointHashMap* pMonsterPattern = (cPointHashMap*)(*mI).mSecond; if( pMonsterPattern != NULL ) { cPointHashMap::cIterator i = pMonsterPattern->Begin(); cPointHashMap::cIterator end = pMonsterPattern->End(); for( ; i != end ; ++i ) { sMonsterPattern* pPattern = (sMonsterPattern*)i->mSecond; cAryVoid* pAry = &pPattern->mPosAry; for( unsigned long j = 0 ; j < pAry->GetSize() ; ++j ) { sMonsterPatternPos* pPos = (sMonsterPatternPos*)(*pAry)[j]; SAFE_DELETE( pPos ); } pAry->Clear(); pAry = NULL; SAFE_DELETE( pPattern ); } pMonsterPattern->Clear(); SAFE_DELETE( pMonsterPattern ); } } mpMonsterPattern->Clear(); SAFE_DELETE( mpMonsterPattern ); } } bool cMonsterScript::LoadSummonPattern() { cFileLoader loader; cString pathName; pathName.Format( "./script/resource/genpattern.txt" ); if( loader.Open( pathName, true ) == false ) { return true; } cTokenizer tok( loader.GetBufferPtr(), loader.GetSize(), " \t\r\n\"", pathName.Cstr() ); cString str; sSummonPatternScript* pPattern = NULL; while( tok.IsEnd() == false ) { /// ÆÐÅÏidx tok.GetNext( &str ); unsigned long patternIdx = str.ToInt(); cAryVoid* pAry = (cAryVoid*)mpSummonPatternMap->GetAt( patternIdx ); if( pAry == NULL ) { pAry = new cAryVoid; mpSummonPatternMap->Insert( patternIdx, pAry ); } pPattern = new sSummonPatternScript; /// ¹æÇâ tok.GetNext( &str ); pPattern->mDir = S_ToRadian( str.ToFloat() ); /// Áö¿¬½Ã°£ tok.GetNext( &str ); pPattern->mDelayTime = str.ToInt(); pAry->PushBack( pPattern ); } return true; } void cMonsterScript::ReleaseSummonPattern() { cPointHashMap::cIterator i = mpSummonPatternMap->Begin(); cPointHashMap::cIterator e = mpSummonPatternMap->End(); for( ; i != e ; ++i ) { cAryVoid* pAry = (cAryVoid*)(*i).mSecond; if( pAry != NULL ) { for( unsigned long b = 0 ; b < pAry->GetSize() ; ++b ) { sSummonPatternScript* pPattern = (sSummonPatternScript*)(*pAry)[b]; SAFE_DELETE( pPattern ); } SAFE_DELETE( pAry ); } } mpSummonPatternMap->Clear(); SAFE_DELETE( mpSummonPatternMap ); }