//#include "../../libthecore/include/stdafx.h" //#include "" //#define __WIN32__ #include #include #include #include #include #include "lzo.h" //À©µµ¿ìexeÆÄÀÏ ¸¸µé¸é¼­ »õ·Î Ãß°¡ : ÆÄÀÏ Àоî¿Ã ¼ö ÀÖµµ·Ï ÇÏ¿´´Ù. #include "CsvFile.h" #include "ItemCSVReader.h" #pragma comment(lib, "lzo.lib") #define MAKEFOURCC(ch0, ch1, ch2, ch3) \ ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \ ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 )) typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; enum EMisc { CHARACTER_NAME_MAX_LEN = 24, MOB_SKILL_MAX_NUM = 5, }; enum EMobEnchants { MOB_ENCHANT_CURSE, MOB_ENCHANT_SLOW, MOB_ENCHANT_POISON, MOB_ENCHANT_STUN, MOB_ENCHANT_CRITICAL, MOB_ENCHANT_PENETRATE, MOB_ENCHANTS_MAX_NUM }; enum EMobResists { MOB_RESIST_SWORD, MOB_RESIST_TWOHAND, MOB_RESIST_DAGGER, MOB_RESIST_BELL, MOB_RESIST_FAN, MOB_RESIST_BOW, MOB_RESIST_FIRE, MOB_RESIST_ELECT, MOB_RESIST_MAGIC, MOB_RESIST_WIND, MOB_RESIST_POISON, MOB_RESISTS_MAX_NUM }; #pragma pack(1) typedef struct SMobSkillLevel { DWORD dwVnum; BYTE bLevel; } TMobSkillLevel; #pragma pack() #pragma pack(1) typedef struct SMobTable { DWORD dwVnum; char szName[CHARACTER_NAME_MAX_LEN + 1]; char szLocaleName[CHARACTER_NAME_MAX_LEN + 1]; BYTE bType; // Monster, NPC BYTE bRank; // PAWN, KNIGHT, KING BYTE bBattleType; // MELEE, etc.. BYTE bLevel; // Level BYTE bSize; DWORD dwGoldMin; DWORD dwGoldMax; DWORD dwExp; DWORD dwMaxHP; BYTE bRegenCycle; BYTE bRegenPercent; WORD wDef; DWORD dwAIFlag; DWORD dwRaceFlag; DWORD dwImmuneFlag; BYTE bStr, bDex, bCon, bInt; DWORD dwDamageRange[2]; short sAttackSpeed; short sMovingSpeed; BYTE bAggresiveHPPct; WORD wAggressiveSight; WORD wAttackRange; char cEnchants[MOB_ENCHANTS_MAX_NUM]; char cResists[MOB_RESISTS_MAX_NUM]; DWORD dwResurrectionVnum; DWORD dwDropItemVnum; BYTE bMountCapacity; BYTE bOnClickType; BYTE bEmpire; char szFolder[64 + 1]; float fDamMultiply; DWORD dwSummonVnum; DWORD dwDrainSP; DWORD dwMobColor; DWORD dwPolymorphItemVnum; TMobSkillLevel Skills[MOB_SKILL_MAX_NUM]; BYTE bBerserkPoint; BYTE bStoneSkinPoint; BYTE bGodSpeedPoint; BYTE bDeathBlowPoint; BYTE bRevivePoint; } TMobTable; #pragma pack() using namespace std; TMobTable * m_pMobTable = NULL; int m_iMobTableSize = 0; enum EItemMisc { ITEM_NAME_MAX_LEN = 24, ITEM_VALUES_MAX_NUM = 6, ITEM_SMALL_DESCR_MAX_LEN = 256, ITEM_LIMIT_MAX_NUM = 2, ITEM_APPLY_MAX_NUM = 3, ITEM_SOCKET_MAX_NUM = 3, ITEM_MAX_COUNT = 200, ITEM_ATTRIBUTE_MAX_NUM = 7, ITEM_ATTRIBUTE_MAX_LEVEL = 5, ITEM_AWARD_WHY_MAX_LEN = 50, REFINE_MATERIAL_MAX_NUM = 5, ITEM_ELK_VNUM = 50026, }; #pragma pack(1) typedef struct SItemLimit { BYTE bType; long lValue; } TItemLimit; #pragma pack() #pragma pack(1) typedef struct SItemApply { BYTE bType; long lValue; } TItemApply; #pragma pack() #pragma pack(1) typedef struct { DWORD dwVnum; DWORD dwVnumRange; char szName[ITEM_NAME_MAX_LEN + 1]; char szLocaleName[ITEM_NAME_MAX_LEN + 1]; BYTE bType; BYTE bSubType; BYTE bWeight; BYTE bSize; DWORD dwAntiFlags; DWORD dwFlags; DWORD dwWearFlags; DWORD dwImmuneFlag; DWORD dwGold; DWORD dwShopBuyPrice; TItemLimit aLimits[ITEM_LIMIT_MAX_NUM]; TItemApply aApplies[ITEM_APPLY_MAX_NUM]; long alValues[ITEM_VALUES_MAX_NUM]; long alSockets[ITEM_SOCKET_MAX_NUM]; DWORD dwRefinedVnum; WORD wRefineSet; BYTE bAlterToMagicItemPct; BYTE bSpecular; BYTE bGainSocketPct; } TClientItemTable; #pragma pack() bool operator < (const TClientItemTable& lhs, const TClientItemTable& rhs) { return lhs.dwVnum < rhs.dwVnum; } TClientItemTable * m_pItemTable = NULL; int m_iItemTableSize = 0; bool Set_Proto_Mob_Table(TMobTable *mobTable, cCsvTable &csvTable, std::map &nameMap) { int col = 0; mobTable->dwVnum = atoi(csvTable.AsStringByIndex(col++)); strncpy(mobTable->szName, csvTable.AsStringByIndex(col++), CHARACTER_NAME_MAX_LEN); //³×ÀÓ ÆÄÀÏÀÌ Á¸ÀçÇϸé Á¤º¸¸¦ Àоî¿È. map::iterator it; it = nameMap.find(mobTable->dwVnum); if (it != nameMap.end()) { const char * localeName = it->second; strncpy(mobTable->szLocaleName, localeName, sizeof (mobTable->szLocaleName)); } else { //³×ÀÓ ÆÄÀÏÀÌ ¾øÀ¸¸é, ÇѱÛÀ» ±×´ë·Î »ç¿ë. strncpy(mobTable->szLocaleName, mobTable->szName, sizeof (mobTable->szLocaleName)); } //4. RANK int rankValue = get_Mob_Rank_Value(csvTable.AsStringByIndex(col++)); mobTable->bRank = rankValue; //5. TYPE int typeValue = get_Mob_Type_Value(csvTable.AsStringByIndex(col++)); mobTable->bType = typeValue; //6. BATTLE_TYPE int battleTypeValue = get_Mob_BattleType_Value(csvTable.AsStringByIndex(col++)); mobTable->bBattleType = battleTypeValue; mobTable->bLevel = atoi(csvTable.AsStringByIndex(col++)); //8. SIZE int sizeValue = get_Mob_Size_Value(csvTable.AsStringByIndex(col++)); mobTable->bSize = sizeValue; //9. AI_FLAG int aiFlagValue = get_Mob_AIFlag_Value(csvTable.AsStringByIndex(col++)); mobTable->dwAIFlag = aiFlagValue; col++; //mount_capacity; //10. RACE_FLAG int raceFlagValue = get_Mob_RaceFlag_Value(csvTable.AsStringByIndex(col++)); mobTable->dwRaceFlag = raceFlagValue; //11. IMMUNE_FLAG int immuneFlagValue = get_Mob_ImmuneFlag_Value(csvTable.AsStringByIndex(col++)); mobTable->dwImmuneFlag = immuneFlagValue; mobTable->bEmpire = atoi(csvTable.AsStringByIndex(col++)); //folder strncpy(mobTable->szFolder, csvTable.AsStringByIndex(col++), sizeof(mobTable->szFolder)); mobTable->bOnClickType = atoi(csvTable.AsStringByIndex(col++)); mobTable->bStr = atoi(csvTable.AsStringByIndex(col++)); mobTable->bDex = atoi(csvTable.AsStringByIndex(col++)); mobTable->bCon = atoi(csvTable.AsStringByIndex(col++)); mobTable->bInt = atoi(csvTable.AsStringByIndex(col++)); mobTable->dwDamageRange[0] = atoi(csvTable.AsStringByIndex(col++)); mobTable->dwDamageRange[1] = atoi(csvTable.AsStringByIndex(col++)); mobTable->dwMaxHP = atoi(csvTable.AsStringByIndex(col++)); mobTable->bRegenCycle = atoi(csvTable.AsStringByIndex(col++)); mobTable->bRegenPercent = atoi(csvTable.AsStringByIndex(col++)); col++; //gold min col++; //gold max mobTable->dwExp = atoi(csvTable.AsStringByIndex(col++)); mobTable->wDef = atoi(csvTable.AsStringByIndex(col++)); mobTable->sAttackSpeed = atoi(csvTable.AsStringByIndex(col++)); mobTable->sMovingSpeed = atoi(csvTable.AsStringByIndex(col++)); mobTable->bAggresiveHPPct = atoi(csvTable.AsStringByIndex(col++)); mobTable->wAggressiveSight = atoi(csvTable.AsStringByIndex(col++)); mobTable->wAttackRange = atoi(csvTable.AsStringByIndex(col++)); mobTable->dwDropItemVnum = atoi(csvTable.AsStringByIndex(col++)); col++; //resurrectionVnum for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i) mobTable->cEnchants[i] = atoi(csvTable.AsStringByIndex(col++)); for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i) mobTable->cResists[i] = atoi(csvTable.AsStringByIndex(col++)); mobTable->fDamMultiply = atoi(csvTable.AsStringByIndex(col++)); mobTable->dwSummonVnum = atoi(csvTable.AsStringByIndex(col++)); mobTable->dwDrainSP = atoi(csvTable.AsStringByIndex(col++)); mobTable->dwMobColor = atoi(csvTable.AsStringByIndex(col++)); return true; } bool BuildMobTable() { //%%% <ÇÔ¼ö ¼³¸í> %%%// //1. ¿ä¾à : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' ÆÄÀÏÀ» Àаí, // m_pMobTable ¸¦ ±¸¼ºÇÑ´Ù. //2. ¼ø¼­ // 1)'mob_names.txt' ÆÄÀÏÀ» Àо vnum:name ¸ÊÀ» ¸¸µç´Ù. // 2)'mob_proto_test.txt' ÆÄÀÏÀ» Àо, // test_mob_table ¸¦ ¸¸µé°í, // vnum:TMobTable ¸ÊÀ» ¸¸µç´Ù. // 3)'mob_proto.txt' ÆÄÀÏÀ» Àаí, m_pMobTable¸¦ ±¸¼ºÇÑ´Ù. // test_mob_table¿¡ ÀÖ´Â vnumÀº Å×½ºÆ® µ¥ÀÌÅ͸¦ ³Ö´Â´Ù. // 4)test_mob_table µ¥ÀÌÅÍÁß¿¡, m_pMobTable ¿¡ ¾ø´Â µ¥ÀÌÅ͸¦ Ãß°¡ÇÑ´Ù. //3. Å×½ºÆ® // 1)'mob_proto.txt' Á¤º¸°¡ m_pMobTable¿¡ Àß µé¾î°¬´ÂÁö. -> ¿Ï·á // 2)'mob_names.txt' Á¤º¸°¡ m_pMobTable¿¡ Àß µé¾î°¬´ÂÁö. -> ¿Ï·á // 3)'mob_proto_test.txt' ¿¡¼­ [°ãÄ¡´Â] Á¤º¸°¡ m_pMobTable ¿¡ Àß µé¾î°¬´ÂÁö. -> ¿Ï·á // 4)'mob_proto_test.txt' ¿¡¼­ [»õ·Î¿î] Á¤º¸°¡ m_pMobTable ¿¡ Àß µé¾î°¬´ÂÁö. -> ¿Ï·á //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^// fprintf(stderr, "sizeof(TMobTable): %u\n", sizeof(TMobTable)); //==============================================================// //======localº° ¸ó½ºÅÍ À̸§À» ÀúÀåÇϰí ÀÖ´Â [¸Ê] vnum:name======// //==============================================================// bool isNameFile = true; map localMap; cCsvTable nameData; if(!nameData.Load("mob_names.txt",'\t')) { fprintf(stderr, "mob_names.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); isNameFile = false; } else { nameData.Next(); while(nameData.Next()) { localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1); } } //______________________________________________________________// //=========================================// //======¸ó½ºÅ͵éÀÇ vnumÀ» ÀúÀåÇÒ [¼Â]======// // *Å×½ºÆ®¿ë ÆÄÀÏÀ» »õ·Î Àоî¿Ã¶§, // // 1. ±âÁ¸¿¡ ÀÖ´ø µ¥ÀÌÅÍÀÎÁö È®ÀÏÇÒ¶§ »ç¿ë// //=========================================// set vnumSet; //_________________________________________// //==================================================// // 2)'mob_proto_test.txt' ÆÄÀÏÀ» Àо, // test_mob_table ¸¦ ¸¸µé°í, // vnum:TMobTable ¸ÊÀ» ¸¸µç´Ù. //==================================================// map test_map_mobTableByVnum; //1. ÆÄÀÏ Àоî¿À±â. cCsvTable test_data; if(!test_data.Load("mob_proto_test.txt",'\t')) { fprintf(stderr, "mob_proto_test.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); //return false; } else { test_data.Next(); //¼³¸í ·Î¿ì ³Ñ¾î°¡±â. //2. Å×½ºÆ® ¸ó½ºÅÍ Å×ÀÌºí »ý¼º. TMobTable * test_mob_table = NULL; int test_MobTableSize = test_data.m_File.GetRowCount()-1; test_mob_table = new TMobTable[test_MobTableSize]; memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize); //3. Å×½ºÆ® ¸ó½ºÅÍ Å×ÀÌºí¿¡ °ªÀ» ³Ö°í, ¸Ê¿¡±îÁö ³Ö±â. while(test_data.Next()) { if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆÃ ½ÇÆÐ.\n"); } test_map_mobTableByVnum.insert(std::map::value_type(test_mob_table->dwVnum, test_mob_table)); ++test_mob_table; } } //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^// //ÆÄÀÏ Àоî¿À±â. cCsvTable data; if(!data.Load("mob_proto.txt",'\t')) { fprintf(stderr, "mob_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); return false; } data.Next(); //¸Ç À­ÁÙ Á¦¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸íÇÏ´Â ºÎºÐ) //===== ¸÷ Å×ÀÌºí »ý¼º=====// if (m_pMobTable) { delete m_pMobTable; m_pMobTable = NULL; } //»õ·Î Ãß°¡µÇ´Â °¹¼ö¸¦ ÆÄ¾ÇÇÑ´Ù. int addNumber = 0; while(data.Next()) { int vnum = atoi(data.AsStringByIndex(0)); std::map::iterator it_map_mobTable; it_map_mobTable = test_map_mobTableByVnum.find(vnum); if(it_map_mobTable != test_map_mobTableByVnum.end()) { addNumber++; } } m_iMobTableSize = data.m_File.GetRowCount()-1 + addNumber; m_pMobTable = new TMobTable[m_iMobTableSize]; memset(m_pMobTable, 0, sizeof(TMobTable) * m_iMobTableSize); TMobTable * mob_table = m_pMobTable; //data¸¦ ´Ù½Ã ùÁÙ·Î ¿Å±ä´Ù.(´Ù½Ã Àоî¿Â´Ù;;) data.Destroy(); if(!data.Load("mob_proto.txt",'\t')) { fprintf(stderr, "mob_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); return false; } data.Next(); //¸Ç À­ÁÙ Á¦¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸íÇÏ´Â ºÎºÐ) while (data.Next()) { int col = 0; //Å×½ºÆ® ÆÄÀÏ¿¡ °°Àº vnumÀÌ ÀÖ´ÂÁö Á¶»ç. std::map::iterator it_map_mobTable; it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col))); if(it_map_mobTable == test_map_mobTableByVnum.end()) { if (!Set_Proto_Mob_Table(mob_table, data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆÃ ½ÇÆÐ.\n"); } } else { //$$$$$$$$$$$$$$$$$$$$$$$ Å×½ºÆ® ¸ó½ºÅÍ Á¤º¸°¡ ÀÖ´Ù! TMobTable *tempTable = it_map_mobTable->second; mob_table->dwVnum = tempTable->dwVnum; strncpy(mob_table->szName, tempTable->szName, CHARACTER_NAME_MAX_LEN); strncpy(mob_table->szLocaleName, tempTable->szLocaleName, CHARACTER_NAME_MAX_LEN); mob_table->bRank = tempTable->bRank; mob_table->bType = tempTable->bType; mob_table->bBattleType = tempTable->bBattleType; mob_table->bLevel = tempTable->bLevel; mob_table->bSize = tempTable->bSize; mob_table->dwAIFlag = tempTable->dwAIFlag; mob_table->dwRaceFlag = tempTable->dwRaceFlag; mob_table->dwImmuneFlag = tempTable->dwImmuneFlag; mob_table->bEmpire = tempTable->bEmpire; strncpy(mob_table->szFolder, tempTable->szFolder, CHARACTER_NAME_MAX_LEN); mob_table->bOnClickType = tempTable->bOnClickType; mob_table->bStr = tempTable->bStr; mob_table->bDex = tempTable->bDex; mob_table->bCon = tempTable->bCon; mob_table->bInt = tempTable->bInt; mob_table->dwDamageRange[0] = tempTable->dwDamageRange[0]; mob_table->dwDamageRange[1] = tempTable->dwDamageRange[1]; mob_table->dwMaxHP = tempTable->dwMaxHP; mob_table->bRegenCycle = tempTable->bRegenCycle; mob_table->bRegenPercent = tempTable->bRegenPercent; mob_table->dwExp = tempTable->dwExp; mob_table->wDef = tempTable->wDef; mob_table->sAttackSpeed = tempTable->sAttackSpeed; mob_table->sMovingSpeed = tempTable->sMovingSpeed; mob_table->bAggresiveHPPct = tempTable->bAggresiveHPPct; mob_table->wAggressiveSight = tempTable->wAggressiveSight; mob_table->wAttackRange = tempTable->wAttackRange; mob_table->dwDropItemVnum = tempTable->dwDropItemVnum; for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i) mob_table->cEnchants[i] = tempTable->cEnchants[i]; for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i) mob_table->cResists[i] = tempTable->cResists[i]; mob_table->fDamMultiply = tempTable->fDamMultiply; mob_table->dwSummonVnum = tempTable->dwSummonVnum; mob_table->dwDrainSP = tempTable->dwDrainSP; mob_table->dwMobColor = tempTable->dwMobColor; } fprintf(stdout, "MOB #%-5d %-16s %-16s sight: %u color %u[%s]\n", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->wAggressiveSight, mob_table->dwMobColor, 0); //¼Â¿¡ vnum Ãß°¡ vnumSet.insert(mob_table->dwVnum); ++mob_table; } //============================// //===== Å×½ºÆ® Á¤º¸ Ãß°¡ =====// //%%ÁÖÀÇ%% //%% -> »õ·Î¿î Á¤º¸¸¸ Ãß°¡µÊ // //Áߺ¹µÇ´Â Á¤º¸´Â À§¿¡¼­ Ãß°¡ // //============================// test_data.Destroy(); if(!test_data.Load("mob_proto_test.txt",'\t')) { fprintf(stderr, "mob_proto_test.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); //return false; } else { test_data.Next(); //¼³¸í ·Î¿ì ³Ñ¾î°¡±â. while (test_data.Next()) //Å×½ºÆ® µ¥ÀÌÅÍ °¢°¢À» ÈȾ°¡¸ç,»õ·Î¿î °ÍÀ» Ãß°¡ÇÑ´Ù. { //Áߺ¹µÇ´Â ºÎºÐÀÌ¸é ³Ñ¾î°£´Ù. set::iterator itVnum; itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0))); if (itVnum != vnumSet.end()) { continue; } if (!Set_Proto_Mob_Table(mob_table, test_data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆÃ ½ÇÆÐ.\n"); } fprintf(stdout, "[New]MOB #%-5d %-16s sight: %u color %u[%s]\n", mob_table->dwVnum, mob_table->szLocaleName, mob_table->wAggressiveSight, mob_table->dwMobColor, test_data.AsStringByIndex(54)); //¼Â¿¡ vnum Ãß°¡ vnumSet.insert(mob_table->dwVnum); ++mob_table; } } //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^// return true; } DWORD g_adwMobProtoKey[4] = { 4813894, 18955, 552631, 6822045 }; void SaveMobProto() { FILE * fp; fp = fopen("mob_proto", "wb"); if (!fp) { printf("cannot open %s for writing\n", "mob_proto"); return; } DWORD fourcc = MAKEFOURCC('M', 'M', 'P', 'T'); fwrite(&fourcc, sizeof(DWORD), 1, fp); DWORD dwElements = m_iMobTableSize; fwrite(&dwElements, sizeof(DWORD), 1, fp); CLZObject zObj; printf("sizeof(TMobTable) %d\n", sizeof(TMobTable)); if (!CLZO::instance().CompressEncryptedMemory(zObj, m_pMobTable, sizeof(TMobTable) * m_iMobTableSize, g_adwMobProtoKey)) { printf("cannot compress\n"); fclose(fp); return; } const CLZObject::THeader & r = zObj.GetHeader(); printf("MobProto count %u\n%u --Compress--> %u --Encrypt--> %u, GetSize %u\n", m_iMobTableSize, r.dwRealSize, r.dwCompressedSize, r.dwEncryptSize, zObj.GetSize()); DWORD dwDataSize = zObj.GetSize(); fwrite(&dwDataSize, sizeof(DWORD), 1, fp); fwrite(zObj.GetBuffer(), dwDataSize, 1, fp); fclose(fp); } void LoadMobProto() { FILE * fp; DWORD fourcc, tableSize, dataSize; fp = fopen("mob_proto", "rb"); fread(&fourcc, sizeof(DWORD), 1, fp); fread(&tableSize, sizeof(DWORD), 1, fp); fread(&dataSize, sizeof(DWORD), 1, fp); BYTE * data = (BYTE *) malloc(dataSize); if (data) { fread(data, dataSize, 1, fp); CLZObject zObj; if (CLZO::instance().Decompress(zObj, data, g_adwMobProtoKey)) { printf("real_size %u\n", zObj.GetSize()); for (DWORD i = 0; i < tableSize; ++i) { TMobTable & rTable = *((TMobTable *) zObj.GetBuffer() + i); printf("%u %s\n", rTable.dwVnum, rTable.szName); } } free(data); } fclose(fp); } //== ==// //== ==// //== ==// //===== ¿©±â¿¡¼­ºÎÅÍ ¾ÆÀÌÅÛ =====// //== ==// //== ==// //== ==// bool Set_Proto_Item_Table(TClientItemTable *itemTable, cCsvTable &csvTable, std::map &nameMap) { // vnum ¹× vnum range Àбâ. { std::string s(csvTable.AsStringByIndex(0)); int pos = s.find("~"); // vnum Çʵ忡 '~'°¡ ¾ø´Ù¸é ÆÐ½º if (std::string::npos == pos) { itemTable->dwVnum = atoi(s.c_str()); if (0 == itemTable->dwVnum) { printf ("INVALID VNUM %s\n", s.c_str()); return false; } itemTable->dwVnumRange = 0; } else { std::string s_start_vnum (s.substr(0, pos)); std::string s_end_vnum (s.substr(pos +1 )); int start_vnum = atoi(s_start_vnum.c_str()); int end_vnum = atoi(s_end_vnum.c_str()); if (0 == start_vnum || (0 != end_vnum && end_vnum < start_vnum)) { printf ("INVALID VNUM RANGE%s\n", s.c_str()); return false; } itemTable->dwVnum = start_vnum; itemTable->dwVnumRange = end_vnum - start_vnum; } } int col = 1; strncpy(itemTable->szName, csvTable.AsStringByIndex(col++), ITEM_NAME_MAX_LEN); //³×ÀÓ ÆÄÀÏÀÌ Á¸ÀçÇϸé Á¤º¸¸¦ Àоî¿È. map::iterator it; it = nameMap.find(itemTable->dwVnum); if (it != nameMap.end()) { const char * localeName = it->second; strncpy(itemTable->szLocaleName, localeName, sizeof(itemTable->szLocaleName)); } else { //³×ÀÓ ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é Çѱ۷Î.. strncpy(itemTable->szLocaleName, itemTable->szName, sizeof(itemTable->szLocaleName)); } itemTable->bType = get_Item_Type_Value(csvTable.AsStringByIndex(col++)); itemTable->bSubType = get_Item_SubType_Value(itemTable->bType, csvTable.AsStringByIndex(col++)); itemTable->bSize = atoi(csvTable.AsStringByIndex(col++)); itemTable->dwAntiFlags = get_Item_AntiFlag_Value(csvTable.AsStringByIndex(col++)); itemTable->dwFlags = get_Item_Flag_Value(csvTable.AsStringByIndex(col++)); itemTable->dwWearFlags = get_Item_WearFlag_Value(csvTable.AsStringByIndex(col++)); itemTable->dwImmuneFlag = get_Item_Immune_Value(csvTable.AsStringByIndex(col++)); itemTable->dwGold = atoi(csvTable.AsStringByIndex(col++)); itemTable->dwShopBuyPrice = atoi(csvTable.AsStringByIndex(col++)); itemTable->dwRefinedVnum = atoi(csvTable.AsStringByIndex(col++)); itemTable->wRefineSet = atoi(csvTable.AsStringByIndex(col++)); itemTable->bAlterToMagicItemPct = atoi(csvTable.AsStringByIndex(col++)); int i; for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i) { itemTable->aLimits[i].bType = get_Item_LimitType_Value(csvTable.AsStringByIndex(col++)); itemTable->aLimits[i].lValue = atoi(csvTable.AsStringByIndex(col++)); } for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i) { itemTable->aApplies[i].bType = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col++)); itemTable->aApplies[i].lValue = atoi(csvTable.AsStringByIndex(col++)); } for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i) itemTable->alValues[i] = atoi(csvTable.AsStringByIndex(col++)); itemTable->bSpecular = atoi(csvTable.AsStringByIndex(col++)); itemTable->bGainSocketPct = atoi(csvTable.AsStringByIndex(col++)); col++; //AddonType itemTable->bWeight = 0; return true; } bool BuildItemTable() { //%%% <ÇÔ¼ö ¼³¸í> %%%// //1. ¿ä¾à : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' ÆÄÀÏÀ» Àаí, // m_pItemTable ¸¦ ±¸¼ºÇÑ´Ù. //2. ¼ø¼­ // 1)'item_names.txt' ÆÄÀÏÀ» Àо vnum:name ¸ÊÀ» ¸¸µç´Ù. // 2)'item_proto_test.txt' ÆÄÀÏÀ» Àо, // test_item_table ¸¦ ¸¸µé°í, // vnum:TClientItemTable ¸ÊÀ» ¸¸µç´Ù. // 3)'item_proto.txt' ÆÄÀÏÀ» Àаí, m_pItemTable¸¦ ±¸¼ºÇÑ´Ù. // test_item_table¿¡ ÀÖ´Â vnumÀº Å×½ºÆ® µ¥ÀÌÅ͸¦ ³Ö´Â´Ù. // 4)test_item_table µ¥ÀÌÅÍÁß¿¡, m_pItemTable ¿¡ ¾ø´Â µ¥ÀÌÅ͸¦ Ãß°¡ÇÑ´Ù. //3. Å×½ºÆ® // 1)'item_proto.txt' Á¤º¸°¡ m_pItemTable¿¡ Àß µé¾î°¬´ÂÁö. // 2)'item_names.txt' Á¤º¸°¡ m_pItemTable¿¡ Àß µé¾î°¬´ÂÁö. // 3)'item_proto_test.txt' ¿¡¼­ [°ãÄ¡´Â] Á¤º¸°¡ m_pItemTable ¿¡ Àß µé¾î°¬´ÂÁö. // 4)'item_proto_test.txt' ¿¡¼­ [»õ·Î¿î] Á¤º¸°¡ m_pItemTable ¿¡ Àß µé¾î°¬´ÂÁö. //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^// fprintf(stderr, "sizeof(TClientItemTable): %u\n", sizeof(TClientItemTable)); //=================================================================// // 1)'item_names.txt' ÆÄÀÏÀ» Àо vnum:name ¸ÊÀ» ¸¸µç´Ù. //=================================================================// bool isNameFile = true; map localMap; cCsvTable nameData; if(!nameData.Load("item_names.txt",'\t')) { fprintf(stderr, "item_names.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); isNameFile = false; } else { nameData.Next(); while(nameData.Next()) { localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1); } } //_________________________________________________________________// //===================== =======================// // 2)'item_proto_test.txt' ÆÄÀÏÀ» Àо, // test_item_table ¸¦ ¸¸µé°í, // vnum:TClientItemTable ¸ÊÀ» ¸¸µç´Ù. //=============================================// map test_map_itemTableByVnum; //1. ÆÄÀÏ Àоî¿À±â. cCsvTable test_data; if(!test_data.Load("item_proto_test.txt",'\t')) { fprintf(stderr, "item_proto_test.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); //return false; } else { test_data.Next(); //¼³¸í ·Î¿ì ³Ñ¾î°¡±â. //2. Å×½ºÆ® ¾ÆÀÌÅÛ Å×ÀÌºí »ý¼º. TClientItemTable * test_item_table = NULL; int test_itemTableSize = test_data.m_File.GetRowCount()-1; test_item_table = new TClientItemTable[test_itemTableSize]; memset(test_item_table, 0, sizeof(TClientItemTable) * test_itemTableSize); //3. Å×½ºÆ® ¸ó½ºÅÍ Å×ÀÌºí¿¡ °ªÀ» ³Ö°í, ¸Ê¿¡±îÁö ³Ö±â. while(test_data.Next()) { if (!Set_Proto_Item_Table(test_item_table, test_data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆÃ ½ÇÆÐ.\n"); } test_map_itemTableByVnum.insert(std::map::value_type(test_item_table->dwVnum, test_item_table)); ++test_item_table; } } //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^// //================================================================// // 3)'item_proto.txt' ÆÄÀÏÀ» Àаí, m_pItemTable¸¦ ±¸¼ºÇÑ´Ù. // test_item_table¿¡ ÀÖ´Â vnumÀº Å×½ºÆ® µ¥ÀÌÅ͸¦ ³Ö´Â´Ù. //================================================================// //vnumµéÀ» ÀúÀåÇÒ ¼Â. »õ·Î¿î Å×½ºÆ® ¾ÆÀÌÅÛÀ» ÆÇº°ÇÒ¶§ »ç¿ëµÈ´Ù. set vnumSet; //ÆÄÀÏ Àоî¿À±â. cCsvTable data; if(!data.Load("item_proto.txt",'\t')) { fprintf(stderr, "item_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); return false; } data.Next(); //¸Ç À­ÁÙ Á¦¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸íÇÏ´Â ºÎºÐ) if (m_pItemTable) { free(m_pItemTable); m_pItemTable = NULL; } //===== ¾ÆÀÌÅÛ Å×ÀÌºí »ý¼º =====// //»õ·Î Ãß°¡µÇ´Â °¹¼ö¸¦ ÆÄ¾ÇÇÑ´Ù. int addNumber = 0; while(data.Next()) { int vnum = atoi(data.AsStringByIndex(0)); std::map::iterator it_map_itemTable; it_map_itemTable = test_map_itemTableByVnum.find(vnum); if(it_map_itemTable != test_map_itemTableByVnum.end()) { addNumber++; } } //data¸¦ ´Ù½Ã ùÁÙ·Î ¿Å±ä´Ù.(´Ù½Ã Àоî¿Â´Ù;;) data.Destroy(); if(!data.Load("item_proto.txt",'\t')) { fprintf(stderr, "item_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); return false; } data.Next(); //¸Ç À­ÁÙ Á¦¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸íÇÏ´Â ºÎºÐ) m_iItemTableSize = data.m_File.GetRowCount()-1+addNumber; m_pItemTable = new TClientItemTable[m_iItemTableSize]; memset(m_pItemTable, 0, sizeof(TClientItemTable) * m_iItemTableSize); TClientItemTable * item_table = m_pItemTable; while (data.Next()) { int col = 0; //Å×½ºÆ® ÆÄÀÏ¿¡ °°Àº vnumÀÌ ÀÖ´ÂÁö Á¶»ç. std::map::iterator it_map_itemTable; it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col))); if(it_map_itemTable == test_map_itemTableByVnum.end()) { if (!Set_Proto_Item_Table(item_table, data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆÃ ½ÇÆÐ.\n"); } } else { //$$$$$$$$$$$$$$$$$$$$$$$ Å×½ºÆ® ¾ÆÀÌÅÛ Á¤º¸°¡ ÀÖ´Ù! TClientItemTable *tempTable = it_map_itemTable->second; item_table->dwVnum = tempTable->dwVnum; strncpy(item_table->szName, tempTable->szName, ITEM_NAME_MAX_LEN); strncpy(item_table->szLocaleName, tempTable->szLocaleName, ITEM_NAME_MAX_LEN); item_table->bType = tempTable->bType; item_table->bSubType = tempTable->bSubType; item_table->bSize = tempTable->bSize; item_table->dwAntiFlags = tempTable->dwAntiFlags; item_table->dwFlags = tempTable->dwFlags; item_table->dwWearFlags = tempTable->dwWearFlags; item_table->dwImmuneFlag = tempTable->dwImmuneFlag; item_table->dwGold = tempTable->dwGold; item_table->dwShopBuyPrice = tempTable->dwShopBuyPrice; item_table->dwRefinedVnum = tempTable->dwRefinedVnum; item_table->wRefineSet = tempTable->wRefineSet; item_table->bAlterToMagicItemPct = tempTable->bAlterToMagicItemPct; int i; for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i) { item_table->aLimits[i].bType = tempTable->aLimits[i].bType; item_table->aLimits[i].lValue = tempTable->aLimits[i].lValue; } for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i) { item_table->aApplies[i].bType = tempTable->aApplies[i].bType; item_table->aApplies[i].lValue = tempTable->aApplies[i].lValue; } for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i) item_table->alValues[i] = tempTable->alValues[i]; item_table->bSpecular = tempTable->bSpecular; item_table->bGainSocketPct = tempTable->bGainSocketPct; item_table->bWeight = tempTable->bWeight; } fprintf(stdout, "ITEM #%-5u %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %u ANTI %u IMMUNE %u REFINE %u\n", item_table->dwVnum, item_table->szName, item_table->szLocaleName, item_table->alValues[0], item_table->alValues[1], item_table->alValues[2], item_table->alValues[3], item_table->alValues[4], item_table->alValues[5], item_table->dwWearFlags, item_table->dwAntiFlags, item_table->dwImmuneFlag, item_table->dwRefinedVnum); //vnum ÀúÀå. vnumSet.insert(item_table->dwVnum); ++item_table; } //==========================================================================// // 4)test_item_table µ¥ÀÌÅÍÁß¿¡, m_pItemTable ¿¡ ¾ø´Â µ¥ÀÌÅ͸¦ Ãß°¡ÇÑ´Ù. //==========================================================================// test_data.Destroy(); if(!test_data.Load("item_proto_test.txt",'\t')) { fprintf(stderr, "item_proto_test.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n"); //return false; } else { test_data.Next(); //¼³¸í ·Î¿ì ³Ñ¾î°¡±â. while (test_data.Next()) //Å×½ºÆ® µ¥ÀÌÅÍ °¢°¢À» ÈȾ°¡¸ç,»õ·Î¿î °ÍÀ» Ãß°¡ÇÑ´Ù. { //Áߺ¹µÇ´Â ºÎºÐÀÌ¸é ³Ñ¾î°£´Ù. set::iterator itVnum; itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0))); if (itVnum != vnumSet.end()) { continue; } if (!Set_Proto_Item_Table(item_table, test_data, localMap)) { fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆÃ ½ÇÆÐ.\n"); } fprintf(stdout, "[NEW]ITEM #%-5u %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %u ANTI %u IMMUNE %u REFINE %u\n", item_table->dwVnum, item_table->szName, item_table->szLocaleName, item_table->alValues[0], item_table->alValues[1], item_table->alValues[2], item_table->alValues[3], item_table->alValues[4], item_table->alValues[5], item_table->dwWearFlags, item_table->dwAntiFlags, item_table->dwImmuneFlag, item_table->dwRefinedVnum); //¼Â¿¡ vnum Ãß°¡ vnumSet.insert(item_table->dwVnum); ++item_table; } } return true; } DWORD g_adwItemProtoKey[4] = { 173217, 72619434, 408587239, 27973291 }; void SaveItemProto() { FILE * fp; fp = fopen("item_proto", "wb"); if (!fp) { printf("cannot open %s for writing\n", "item_proto"); return; } DWORD fourcc = MAKEFOURCC('M', 'I', 'P', 'X'); fwrite(&fourcc, sizeof(DWORD), 1, fp); DWORD dwVersion = 0x00000001; fwrite(&dwVersion, sizeof(DWORD), 1, fp); DWORD dwStride = sizeof(TClientItemTable); fwrite(&dwStride, sizeof(DWORD), 1, fp); DWORD dwElements = m_iItemTableSize; fwrite(&dwElements, sizeof(DWORD), 1, fp); CLZObject zObj; std::vector vec_item_table (&m_pItemTable[0], &m_pItemTable[m_iItemTableSize - 1]); sort (&m_pItemTable[0], &m_pItemTable[0] + m_iItemTableSize); if (!CLZO::instance().CompressEncryptedMemory(zObj, m_pItemTable, sizeof(TClientItemTable) * m_iItemTableSize, g_adwItemProtoKey)) { printf("cannot compress\n"); fclose(fp); return; } const CLZObject::THeader & r = zObj.GetHeader(); printf("Elements %d\n%u --Compress--> %u --Encrypt--> %u, GetSize %u\n", m_iItemTableSize, r.dwRealSize, r.dwCompressedSize, r.dwEncryptSize, zObj.GetSize()); DWORD dwDataSize = zObj.GetSize(); fwrite(&dwDataSize, sizeof(DWORD), 1, fp); fwrite(zObj.GetBuffer(), dwDataSize, 1, fp); fclose(fp); fp = fopen("item_proto", "rb"); if (!fp) { printf("Error!!\n"); return; } fread(&fourcc, sizeof(DWORD), 1, fp); fread(&dwElements, sizeof(DWORD), 1, fp); printf("Elements Check %u fourcc match %d\n", dwElements, fourcc == MAKEFOURCC('M', 'I', 'P', 'T')); fclose(fp); } int main(int argc, char ** argv) { if (BuildMobTable()) { SaveMobProto(); LoadMobProto(); cout << "BuildMobTable working normal" << endl; } if (BuildItemTable()) { SaveItemProto(); cout << "BuildItemTable working normal" << endl; } return 0; }