#include "StdAfx.h" #include "MakeSkillScript.h" #include "FileLoader.h" #include "Tokenizer.h" cMakeSkillScript* cMakeSkillScript::mpMakeSkillScript = NULL; cMakeSkillScript::cMakeSkillScript(void) { /// ½Ì±ÛÅæ if( !mpMakeSkillScript ) { mpMakeSkillScript = this; } } cMakeSkillScript::~cMakeSkillScript(void) { cPHashMap::cIterator b = mGroupMap.Begin(); cPHashMap::cIterator end = mGroupMap.End(); for( ; b != end; ++b ) { sGroupInfo* info = (sGroupInfo*)(b->mSecond); if( info ) { for( unsigned int i = 0; i < info->mRecipeArr.GetSize(); ++i ) { sRecipeGroupInfo* groupInfo = (sRecipeGroupInfo*)info->mRecipeArr[i]; SAFE_DELETE( groupInfo ); } info->mRecipeArr.Clear(); } SAFE_DELETE( info ); } mGroupMap.Clear(); b = mMakeSkillMap.Begin(); end = mMakeSkillMap.End(); for( ; b != end ; ++b ) { sMakeSkillScript* pMake = (sMakeSkillScript*)(*b).mSecond; if( pMake ) { cPAry* pAry = pMake->mpMaterial; if( pAry != NULL ) { for( unsigned long i = 0 ; i < pAry->GetSize() ; ++i ) { sMaterialScript* pMaterial = (sMaterialScript*)(*pAry)[i]; SAFE_DELETE( pMaterial ); } pAry->Clear(); } SAFE_DELETE( pAry ); } SAFE_DELETE( pMake ); } mMakeSkillMap.Clear(); #ifdef _CLIENT /// cItemMixedTypeMap::cIterator i = mItemMixedType.Begin(); cItemMixedTypeMap::cIterator iend = mItemMixedType.End(); for( ; i != iend ; ++i ) { cMixedTypeSet* pSet = (cMixedTypeSet*)(*i).mSecond; if( pSet ) { pSet->Clear(); delete pSet; } } mItemMixedType.Clear(); #endif } bool cMakeSkillScript::Init() { /// ½ºÅ³ ½ºÅ©¸³Æ® ·Îµå if( !MakeSkillScriptLoad() ) { assert(NULL); return false; } return true; } bool cMakeSkillScript::MakeSkillScriptLoad() { cFileLoader loader; cString pathName = "./script/resource/item_mixed.txt"; if( loader.Open( pathName, true ) == false ) { assert( 0 && "failed to load item_mixed.txt" ); return false; } cTokenizer tokenizer( loader.GetBufferPtr(), loader.GetSize(), " \t\r\n", pathName.Cstr() ); cString str; /// mix È®ÀÎ if( tokenizer.GetNext( &str ) == false ) return false; sMakeSkillScript* pMakeScript = NULL; sMaterialScript* pMaterialScript = NULL; sGroupInfo* pGroupInfo = NULL; while( tokenizer.IsEnd() == false ) { if( str.CompareNoCase( "mix" ) != 0 ) return true; pMakeScript = new sMakeSkillScript; /// Àü¹®±â¼ú if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mMakeSkill = (unsigned char)str.ToInt(); /// ´Ü°è if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mMakeStep = (unsigned char)str.ToInt(); /// ÃÖ¼Ò¼÷·Ãµµ if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mMinExp = (unsigned short)str.ToInt(); /// ±âº» ÃÖ¼Ò¼÷·Ãµµ if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mMinDefaultExp = (unsigned short)str.ToInt(); /// ±âº» ÃÖ´ë¼÷·Ãµµ if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mMaxDefaultExp = (unsigned short)str.ToInt(); /// ÃÖ´ë ¾÷ °¡´É ¼÷·Ãµµ if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mMaxExp = (unsigned short)str.ToInt(); /// ·¹½ÃÇÇ if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mRecipeIdx = str.ToInt(); /// ºÐ·ùŸÀÔ if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mType = str.ToInt(); /// ·¹½ÃÇDZ׷ì if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mGroupIdx = (unsigned char)str.ToInt(); /// ½Àµæ ±×·ìÀ» ±âÁØÀ¸·Î °ü·ÃµÈ ·¹½ÃÇÇ Á¤º¸µéÀ» ±â·ÏÇØµÎ´Â ÂüÁ¶hash map if( pMakeScript->mGroupIdx != 0 ) { pGroupInfo = (sGroupInfo*)mGroupMap.GetAt( pMakeScript->mGroupIdx ); if( pGroupInfo == NULL ) { pGroupInfo = new sGroupInfo; pGroupInfo->mStep = pMakeScript->mMakeStep; pGroupInfo->mExp = pMakeScript->mMinExp; if( mGroupMap.Insert( pMakeScript->mGroupIdx, pGroupInfo ) == false ) { assert(0); SAFE_DELETE( pGroupInfo ); return false; } } else { /// ±×·ì Áß ÃÖ´ë ´Ü°è if( pGroupInfo->mStep < pMakeScript->mMakeStep ) pGroupInfo->mStep = pMakeScript->mMakeStep; /// ±×·ì Áß Å« °ªÀÇ ÃÖ¼Ò ¼÷·Ãµµ if( pGroupInfo->mExp < pMakeScript->mMinExp ) pGroupInfo->mExp = pMakeScript->mMinExp; } sRecipeGroupInfo* pRecipeInfo = new sRecipeGroupInfo; pRecipeInfo->mRecipeIdx = pMakeScript->mRecipeIdx; pRecipeInfo->mMakeSkill = pMakeScript->mMakeSkill; pGroupInfo->mRecipeArr.PushBack( pRecipeInfo ); } for( int i = 0 ; i < MAKESKILL_MAKE_ITEM_CNT ; ++i ) { /// ¿Ï¼ºµÈ ¾ÆÀÌÅÛ if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mMakeItemIdx[i] = str.ToInt(); /// ¿Ï¼ºµÈ ¼ö·® if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mMakeCnt[i] = (unsigned char)str.ToInt(); /// ¼±Åà Ȯ·ü(ºñÀ²) if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mMakeRate[i] = (unsigned char)str.ToInt(); } /// Á¶Çսð£ if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mMakeTime = str.ToInt(); /// ÀçÁ¶Çսð£ if( tokenizer.GetNext( &str ) == false ) return false; pMakeScript->mNextMakeTime = str.ToInt(); if( pMakeScript->mpMaterial != NULL ) return false; cPAry* pMaterialAry = new cPAry; pMakeScript->mpMaterial = pMaterialAry; bool materialTrue = true; while( materialTrue ) { /// mix È®ÀÎ if( tokenizer.GetNext( &str ) == false ) break; if( str.CompareNoCase( "mix" ) == 0 ) break; pMaterialScript = new sMaterialScript; /// Àç·á ¾ÆÀÌÅÛ pMaterialScript->mItemIdx = str.ToInt(); /// º¸À¯¼ö·® if( tokenizer.GetNext( &str ) == false ) return false; pMaterialScript->mItemCnt = (unsigned char)str.ToInt(); pMaterialAry->PushBack( pMaterialScript ); #ifdef _CLIENT /// cMixedTypeSet* pSet = (cMixedTypeSet*)mItemMixedType.GetAt( pMaterialScript->mItemIdx ); if( pSet == 0 ) { pSet = new cMixedTypeSet; mItemMixedType.Insert( pMaterialScript->mItemIdx, pSet ); } if( pSet ) pSet->Insert( pMakeScript->mMakeSkill ); #endif } if( mMakeSkillMap.Insert( pMakeScript->mRecipeIdx, pMakeScript ) == false ) return false; } return true; } sMakeSkillScript* cMakeSkillScript::GetMakeSkill( unsigned long recipeIdx ) { return (sMakeSkillScript*)mMakeSkillMap.GetAt( recipeIdx ); } sGroupInfo* cMakeSkillScript::GetGroupInfo( unsigned long groupIdx ) { return (sGroupInfo*)mGroupMap.GetAt( groupIdx ); }