Guest User

dump_proto.cpp

a guest
Dec 24th, 2016
46
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //#include "../../libthecore/include/stdafx.h"
  2. //#include ""
  3. //#define __WIN32__
  4. #include <stdio.h>
  5. #include <string>
  6. #include <map>
  7. #include <set>
  8. #include <algorithm>
  9.  
  10. #include "lzo.h"
  11.  
  12. //À©µµ¿ìexeÆÄÀÏ ¸¸µé¸é¼­ »õ·Î Ãß°¡ : ÆÄÀÏ Àоî¿Ã ¼ö ÀÖµµ·Ï ÇÏ¿´´Ù.
  13. #include "CsvFile.h"
  14. #include "ItemCSVReader.h"
  15.  
  16.  
  17. #pragma comment(lib, "lzo.lib")
  18.  
  19.  
  20. #define MAKEFOURCC(ch0, ch1, ch2, ch3)                              \
  21.                 ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |   \
  22.                 ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
  23.  
  24. typedef unsigned char BYTE;
  25. typedef unsigned short WORD;
  26. typedef unsigned long DWORD;
  27.  
  28. enum EMisc
  29. {
  30.     CHARACTER_NAME_MAX_LEN  = 24,
  31.     MOB_SKILL_MAX_NUM       = 5,
  32. };
  33.  
  34. enum EMobEnchants
  35. {
  36.     MOB_ENCHANT_CURSE,
  37.     MOB_ENCHANT_SLOW,
  38.     MOB_ENCHANT_POISON,
  39.     MOB_ENCHANT_STUN,
  40.     MOB_ENCHANT_CRITICAL,
  41.     MOB_ENCHANT_PENETRATE,
  42.     MOB_ENCHANTS_MAX_NUM
  43. };
  44.  
  45. enum EMobResists
  46. {
  47.     MOB_RESIST_SWORD,
  48.     MOB_RESIST_TWOHAND,
  49.     MOB_RESIST_DAGGER,
  50.     MOB_RESIST_BELL,
  51.     MOB_RESIST_FAN,
  52.     MOB_RESIST_BOW,
  53.     MOB_RESIST_FIRE,
  54.     MOB_RESIST_ELECT,
  55.     MOB_RESIST_MAGIC,
  56.     MOB_RESIST_WIND,
  57.     MOB_RESIST_POISON,
  58.     MOB_RESIST_CLAW,
  59.     MOB_RESIST_BLEEDING,
  60.     MOB_RESISTS_MAX_NUM
  61. };
  62.  
  63.  
  64. #pragma pack(1)
  65. typedef struct SMobSkillLevel
  66. {
  67.     DWORD   dwVnum;
  68.     BYTE    bLevel;
  69. } TMobSkillLevel;
  70. #pragma pack()
  71.  
  72. #pragma pack(1)
  73. typedef struct SMobTable
  74. {
  75.     DWORD   dwVnum;
  76.     char    szName[CHARACTER_NAME_MAX_LEN + 1];
  77.     char    szLocaleName[CHARACTER_NAME_MAX_LEN + 1];
  78.  
  79.     BYTE    bType;          // Monster, NPC
  80.     BYTE    bRank;          // PAWN, KNIGHT, KING
  81.     BYTE    bBattleType;        // MELEE, etc..
  82.     BYTE    bLevel;         // Level
  83.     BYTE    bSize;
  84.  
  85.     DWORD   dwGoldMin;
  86.     DWORD   dwGoldMax;
  87.     DWORD   dwExp;
  88.     DWORD   dwMaxHP;
  89.     BYTE    bRegenCycle;
  90.     BYTE    bRegenPercent;
  91.     WORD    wDef;
  92.  
  93.     DWORD   dwAIFlag;
  94.     DWORD   dwRaceFlag;
  95.     DWORD   dwImmuneFlag;
  96.  
  97.     BYTE    bStr, bDex, bCon, bInt;
  98.     DWORD   dwDamageRange[2];
  99.  
  100.     short   sAttackSpeed;
  101.     short   sMovingSpeed;
  102.     BYTE    bAggresiveHPPct;
  103.     WORD    wAggressiveSight;
  104.     WORD    wAttackRange;
  105.  
  106.     char    cEnchants[MOB_ENCHANTS_MAX_NUM];
  107.     char    cResists[MOB_RESISTS_MAX_NUM];
  108.  
  109.     DWORD   dwResurrectionVnum;
  110.     DWORD   dwDropItemVnum;
  111.  
  112.     BYTE    bMountCapacity;
  113.     BYTE    bOnClickType;
  114.  
  115.     BYTE    bEmpire;
  116.     char    szFolder[64 + 1];
  117.  
  118.     float   fDamMultiply;
  119.  
  120.     DWORD   dwSummonVnum;
  121.     DWORD   dwDrainSP;
  122.     DWORD   dwMobColor;
  123.     DWORD   dwPolymorphItemVnum;
  124.  
  125.     TMobSkillLevel Skills[MOB_SKILL_MAX_NUM];
  126.  
  127.     BYTE    bBerserkPoint;
  128.     BYTE    bStoneSkinPoint;
  129.     BYTE    bGodSpeedPoint;
  130.     BYTE    bDeathBlowPoint;
  131.     BYTE    bRevivePoint;
  132. } TMobTable;
  133. #pragma pack()
  134.  
  135.  
  136. using namespace std;
  137.  
  138. TMobTable * m_pMobTable = NULL;
  139. int m_iMobTableSize = 0;
  140.  
  141.  
  142. enum EItemMisc
  143. {
  144.     ITEM_NAME_MAX_LEN           = 24,
  145.     ITEM_VALUES_MAX_NUM         = 6,
  146.     ITEM_SMALL_DESCR_MAX_LEN    = 256,
  147.     ITEM_LIMIT_MAX_NUM          = 2,
  148.     ITEM_APPLY_MAX_NUM          = 3,
  149.     ITEM_SOCKET_MAX_NUM         = 3,
  150.     ITEM_MAX_COUNT              = 200,
  151.     ITEM_ATTRIBUTE_MAX_NUM      = 7,
  152.     ITEM_ATTRIBUTE_MAX_LEVEL    = 5,
  153.     ITEM_AWARD_WHY_MAX_LEN      = 50,
  154.  
  155.     REFINE_MATERIAL_MAX_NUM     = 5,
  156.  
  157.     ITEM_ELK_VNUM               = 50026,
  158. };
  159. #pragma pack(1)
  160. typedef struct SItemLimit
  161. {
  162.     BYTE    bType;
  163.     long    lValue;
  164. } TItemLimit;
  165. #pragma pack()
  166.  
  167. #pragma pack(1)
  168. typedef struct SItemApply
  169. {
  170.     BYTE    bType;
  171.     long    lValue;
  172. } TItemApply;
  173. #pragma pack()
  174.  
  175. #pragma pack(1)
  176. typedef struct
  177. {
  178.     DWORD       dwVnum;
  179.     DWORD       dwVnumRange;
  180.     char        szName[ITEM_NAME_MAX_LEN + 1];
  181.     char    szLocaleName[ITEM_NAME_MAX_LEN + 1];
  182.     BYTE    bType;
  183.     BYTE    bSubType;
  184.  
  185.     BYTE        bWeight;
  186.     BYTE    bSize;
  187.  
  188.     DWORD   dwAntiFlags;
  189.     DWORD   dwFlags;
  190.     DWORD   dwWearFlags;
  191.     DWORD   dwImmuneFlag;
  192.  
  193.     DWORD       dwGold;
  194.     DWORD       dwShopBuyPrice;
  195.  
  196.     TItemLimit  aLimits[ITEM_LIMIT_MAX_NUM];
  197.     TItemApply  aApplies[ITEM_APPLY_MAX_NUM];
  198.     long        alValues[ITEM_VALUES_MAX_NUM];
  199.     long    alSockets[ITEM_SOCKET_MAX_NUM];
  200.     DWORD   dwRefinedVnum;
  201.     WORD    wRefineSet;
  202.     BYTE    bAlterToMagicItemPct;
  203.     BYTE    bSpecular;
  204.     BYTE    bGainSocketPct;
  205. } TClientItemTable;
  206. #pragma pack()
  207. bool    operator < (const TClientItemTable& lhs, const TClientItemTable& rhs)
  208. {
  209.     return lhs.dwVnum < rhs.dwVnum;
  210. }
  211.  
  212. TClientItemTable * m_pItemTable = NULL;
  213. int m_iItemTableSize = 0;
  214.  
  215.  
  216. bool Set_Proto_Mob_Table(TMobTable *mobTable, cCsvTable &csvTable, std::map<int,const char*> &nameMap)
  217. {
  218.     int col = 0;
  219.  
  220.     mobTable->dwVnum               = atoi(csvTable.AsStringByIndex(col++));
  221.     strncpy(mobTable->szName, csvTable.AsStringByIndex(col++), CHARACTER_NAME_MAX_LEN);
  222.     //³×ÀÓ ÆÄÀÏÀÌ Á¸ÀçÇϸé Á¤º¸¸¦ Àоî¿È.
  223.     map<int,const char*>::iterator it;
  224.     it = nameMap.find(mobTable->dwVnum);
  225.     if (it != nameMap.end()) {
  226.         const char * localeName = it->second;
  227.         strncpy(mobTable->szLocaleName, localeName, sizeof (mobTable->szLocaleName));
  228.     } else {    //³×ÀÓ ÆÄÀÏÀÌ ¾øÀ¸¸é, ÇѱÛÀ» ±×´ë·Î »ç¿ë.
  229.         strncpy(mobTable->szLocaleName, mobTable->szName, sizeof (mobTable->szLocaleName));
  230.     }
  231.     //4. RANK
  232.     int rankValue = get_Mob_Rank_Value(csvTable.AsStringByIndex(col++));
  233.     mobTable->bRank                = rankValue;
  234.     //5. TYPE
  235.     int typeValue = get_Mob_Type_Value(csvTable.AsStringByIndex(col++));
  236.     mobTable->bType                = typeValue;
  237.     //6. BATTLE_TYPE
  238.     int battleTypeValue = get_Mob_BattleType_Value(csvTable.AsStringByIndex(col++));
  239.     mobTable->bBattleType          = battleTypeValue;
  240.  
  241.     mobTable->bLevel        = atoi(csvTable.AsStringByIndex(col++));
  242.     //8. SIZE
  243.     int sizeValue = get_Mob_Size_Value(csvTable.AsStringByIndex(col++));
  244.     mobTable->bSize                = sizeValue;
  245.     //9. AI_FLAG
  246.     int aiFlagValue = get_Mob_AIFlag_Value(csvTable.AsStringByIndex(col++));
  247.     mobTable->dwAIFlag             = aiFlagValue;
  248.     col++; //mount_capacity;
  249.     //10. RACE_FLAG
  250.     int raceFlagValue = get_Mob_RaceFlag_Value(csvTable.AsStringByIndex(col++));
  251.     mobTable->dwRaceFlag           = raceFlagValue;
  252.     //11. IMMUNE_FLAG
  253.     int immuneFlagValue = get_Mob_ImmuneFlag_Value(csvTable.AsStringByIndex(col++));
  254.     mobTable->dwImmuneFlag         = immuneFlagValue;
  255.  
  256.     mobTable->bEmpire              = atoi(csvTable.AsStringByIndex(col++));
  257.  
  258.     //folder
  259.     strncpy(mobTable->szFolder, csvTable.AsStringByIndex(col++), sizeof(mobTable->szFolder));
  260.  
  261.  
  262.     mobTable->bOnClickType         = atoi(csvTable.AsStringByIndex(col++));
  263.  
  264.     mobTable->bStr                 = atoi(csvTable.AsStringByIndex(col++));
  265.     mobTable->bDex                 = atoi(csvTable.AsStringByIndex(col++));
  266.     mobTable->bCon                 = atoi(csvTable.AsStringByIndex(col++));
  267.     mobTable->bInt                 = atoi(csvTable.AsStringByIndex(col++));
  268.     mobTable->dwDamageRange[0]     = atoi(csvTable.AsStringByIndex(col++));
  269.     mobTable->dwDamageRange[1]     = atoi(csvTable.AsStringByIndex(col++));
  270.     mobTable->dwMaxHP              = atoi(csvTable.AsStringByIndex(col++));
  271.     mobTable->bRegenCycle          = atoi(csvTable.AsStringByIndex(col++));
  272.     mobTable->bRegenPercent        = atoi(csvTable.AsStringByIndex(col++));
  273.  
  274.     col++;  //gold min
  275.     col++;  //gold max
  276.     mobTable->dwExp                = atoi(csvTable.AsStringByIndex(col++));
  277.     mobTable->wDef                 = atoi(csvTable.AsStringByIndex(col++));
  278.     mobTable->sAttackSpeed         = atoi(csvTable.AsStringByIndex(col++));
  279.     mobTable->sMovingSpeed         = atoi(csvTable.AsStringByIndex(col++));
  280.     mobTable->bAggresiveHPPct      = atoi(csvTable.AsStringByIndex(col++));
  281.     mobTable->wAggressiveSight  = atoi(csvTable.AsStringByIndex(col++));
  282.     mobTable->wAttackRange      = atoi(csvTable.AsStringByIndex(col++));
  283.  
  284.     mobTable->dwDropItemVnum    = atoi(csvTable.AsStringByIndex(col++));
  285.     col++;  //resurrectionVnum
  286.  
  287.  
  288.     for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
  289.         mobTable->cEnchants[i] = atoi(csvTable.AsStringByIndex(col++));
  290.  
  291.     for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
  292.         mobTable->cResists[i] = atoi(csvTable.AsStringByIndex(col++));
  293.  
  294.     mobTable->fDamMultiply      = atoi(csvTable.AsStringByIndex(col++));
  295.     mobTable->dwSummonVnum      = atoi(csvTable.AsStringByIndex(col++));
  296.     mobTable->dwDrainSP     = atoi(csvTable.AsStringByIndex(col++));
  297.     mobTable->dwMobColor        = atoi(csvTable.AsStringByIndex(col++));
  298.    
  299.     return true;
  300. }
  301.  
  302.  
  303. bool BuildMobTable()
  304. {
  305.     //%%% <ÇÔ¼ö ¼³¸í> %%%//
  306.     //1. ¿ä¾à : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' ÆÄÀÏÀ» Àаí,
  307.     //      m_pMobTable ¸¦ ±¸¼ºÇÑ´Ù.
  308.     //2. ¼ø¼­
  309.     //  1)'mob_names.txt' ÆÄÀÏÀ» Àо vnum:name ¸ÊÀ» ¸¸µç´Ù.
  310.     //  2)'mob_proto_test.txt' ÆÄÀÏÀ» Àо,
  311.     //      test_mob_table ¸¦ ¸¸µé°í,
  312.     //      vnum:TMobTable ¸ÊÀ» ¸¸µç´Ù.
  313.     //  3)'mob_proto.txt' ÆÄÀÏÀ» Àаí, m_pMobTable¸¦ ±¸¼ºÇÑ´Ù.
  314.     //      test_mob_table¿¡ ÀÖ´Â vnumÀº Å×½ºÆ® µ¥ÀÌÅ͸¦ ³Ö´Â´Ù.
  315.     //  4)test_mob_table µ¥ÀÌÅÍÁß¿¡, m_pMobTable ¿¡ ¾ø´Â µ¥ÀÌÅ͸¦ Ãß°¡ÇÑ´Ù.
  316.     //3. Å×½ºÆ®
  317.     //  1)'mob_proto.txt' Á¤º¸°¡ m_pMobTable¿¡ Àß µé¾î°¬´ÂÁö. -> ¿Ï·á
  318.     //  2)'mob_names.txt' Á¤º¸°¡ m_pMobTable¿¡ Àß µé¾î°¬´ÂÁö. -> ¿Ï·á
  319.     //  3)'mob_proto_test.txt' ¿¡¼­ [°ãÄ¡´Â] Á¤º¸°¡ m_pMobTable ¿¡ Àß µé¾î°¬´ÂÁö. -> ¿Ï·á
  320.     //  4)'mob_proto_test.txt' ¿¡¼­ [»õ·Î¿î] Á¤º¸°¡ m_pMobTable ¿¡ Àß µé¾î°¬´ÂÁö. -> ¿Ï·á
  321.     //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
  322.  
  323.     fprintf(stderr, "sizeof(TMobTable): %u\n", sizeof(TMobTable));
  324.  
  325.  
  326.     //==============================================================//
  327.     //======localº° ¸ó½ºÅÍ À̸§À» ÀúÀåÇÏ°í ÀÖ´Â [¸Ê] vnum:name======//
  328.     //==============================================================//
  329.     bool isNameFile = true;
  330.     map<int,const char*> localMap;
  331.     cCsvTable nameData;
  332.     if(!nameData.Load("mob_names.txt",'\t'))
  333.     {
  334.         fprintf(stderr, "mob_names.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n");
  335.         isNameFile = false;
  336.     } else {
  337.         nameData.Next();
  338.         while(nameData.Next()) {
  339.             localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
  340.         }
  341.     }
  342.     //______________________________________________________________//
  343.  
  344.     //=========================================//
  345.     //======¸ó½ºÅ͵éÀÇ vnumÀ» ÀúÀåÇÒ [¼Â]======//
  346.     //  *Å×½ºÆ®¿ë ÆÄÀÏÀ» »õ·Î Àоî¿Ã¶§,        //
  347.     //  1. ±âÁ¸¿¡ ÀÖ´ø µ¥ÀÌÅÍÀÎÁö È®ÀÏÇÒ¶§ »ç¿ë//
  348.     //=========================================//
  349.     set<int> vnumSet;
  350.     //_________________________________________//
  351.    
  352.     //==================================================//
  353.     //  2)'mob_proto_test.txt' ÆÄÀÏÀ» Àо,
  354.     //      test_mob_table ¸¦ ¸¸µé°í,
  355.     //      vnum:TMobTable ¸ÊÀ» ¸¸µç´Ù.
  356.     //==================================================//
  357.     map<DWORD, TMobTable *> test_map_mobTableByVnum;
  358.  
  359.     //1. ÆÄÀÏ Àоî¿À±â.
  360.     cCsvTable test_data;
  361.     if(!test_data.Load("mob_proto_test.txt",'\t'))
  362.     {
  363.         fprintf(stderr, "mob_proto_test.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n");
  364.         //return false;
  365.     } else {
  366.         test_data.Next();   //¼³¸í ·Î¿ì ³Ñ¾î°¡±â.
  367.  
  368.         //2. Å×½ºÆ® ¸ó½ºÅÍ Å×ÀÌºí »ý¼º.
  369.         TMobTable * test_mob_table = NULL;
  370.         int test_MobTableSize = test_data.m_File.GetRowCount()-1;
  371.         test_mob_table = new TMobTable[test_MobTableSize];
  372.         memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize);
  373.  
  374.         //3. Å×½ºÆ® ¸ó½ºÅÍ Å×ÀÌºí¿¡ °ªÀ» ³Ö°í, ¸Ê¿¡±îÁö ³Ö±â.
  375.         while(test_data.Next()) {
  376.            
  377.             if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap))
  378.             {
  379.                 fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n");        
  380.             }
  381.            
  382.  
  383.             test_map_mobTableByVnum.insert(std::map<DWORD, TMobTable *>::value_type(test_mob_table->dwVnum, test_mob_table));
  384.             ++test_mob_table;
  385.         }
  386.     }
  387.    
  388.     //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
  389.    
  390.  
  391.     //ÆÄÀÏ Àоî¿À±â.
  392.     cCsvTable data;
  393.     if(!data.Load("mob_proto.txt",'\t'))
  394.     {
  395.         fprintf(stderr, "mob_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n");
  396.         return false;
  397.     }
  398.     data.Next(); //¸Ç À­ÁÙ Á¦¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸íÇÏ´Â ºÎºÐ)
  399.  
  400.  
  401.  
  402.     //===== ¸÷ Å×ÀÌºí »ý¼º=====//
  403.     if (m_pMobTable)
  404.     {
  405.         delete m_pMobTable;
  406.         m_pMobTable = NULL;
  407.     }
  408.  
  409.     //»õ·Î Ãß°¡µÇ´Â °¹¼ö¸¦ ÆľÇÇÑ´Ù.
  410.     int addNumber = 0;
  411.     while(data.Next()) {
  412.         int vnum = atoi(data.AsStringByIndex(0));
  413.         std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
  414.         it_map_mobTable = test_map_mobTableByVnum.find(vnum);
  415.         if(it_map_mobTable != test_map_mobTableByVnum.end()) {
  416.             addNumber++;
  417.         }
  418.     }
  419.  
  420.  
  421.     m_iMobTableSize = data.m_File.GetRowCount()-1 + addNumber;
  422.  
  423.     m_pMobTable = new TMobTable[m_iMobTableSize];
  424.     memset(m_pMobTable, 0, sizeof(TMobTable) * m_iMobTableSize);
  425.  
  426.     TMobTable * mob_table = m_pMobTable;
  427.  
  428.  
  429.     //data¸¦ ´Ù½Ã ùÁÙ·Î ¿Å±ä´Ù.(´Ù½Ã Àоî¿Â´Ù;;)
  430.     data.Destroy();
  431.     if(!data.Load("mob_proto.txt",'\t'))
  432.     {
  433.         fprintf(stderr, "mob_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n");
  434.         return false;
  435.     }
  436.     data.Next(); //¸Ç À­ÁÙ Á¦¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸íÇÏ´Â ºÎºÐ)
  437.  
  438.     while (data.Next())
  439.     {
  440.         int col = 0;
  441.         //Å×½ºÆ® ÆÄÀÏ¿¡ °°Àº vnumÀÌ ÀÖ´ÂÁö Á¶»ç.
  442.         std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
  443.         it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col)));
  444.         if(it_map_mobTable == test_map_mobTableByVnum.end()) {
  445.            
  446.             if (!Set_Proto_Mob_Table(mob_table, data, localMap))
  447.             {
  448.                 fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n");        
  449.             }
  450.  
  451.         } else {    //$$$$$$$$$$$$$$$$$$$$$$$ Å×½ºÆ® ¸ó½ºÅÍ Á¤º¸°¡ ÀÖ´Ù! 
  452.             TMobTable *tempTable = it_map_mobTable->second;
  453.  
  454.             mob_table->dwVnum               = tempTable->dwVnum;
  455.             strncpy(mob_table->szName, tempTable->szName, CHARACTER_NAME_MAX_LEN);
  456.             strncpy(mob_table->szLocaleName, tempTable->szLocaleName, CHARACTER_NAME_MAX_LEN);
  457.             mob_table->bRank                = tempTable->bRank;
  458.             mob_table->bType                = tempTable->bType;
  459.             mob_table->bBattleType          = tempTable->bBattleType;
  460.             mob_table->bLevel               = tempTable->bLevel;
  461.             mob_table->bSize                = tempTable->bSize;
  462.             mob_table->dwAIFlag             = tempTable->dwAIFlag;
  463.             mob_table->dwRaceFlag               = tempTable->dwRaceFlag;
  464.             mob_table->dwImmuneFlag             = tempTable->dwImmuneFlag;
  465.             mob_table->bEmpire              = tempTable->bEmpire;
  466.             strncpy(mob_table->szFolder, tempTable->szFolder, CHARACTER_NAME_MAX_LEN);
  467.             mob_table->bOnClickType         = tempTable->bOnClickType;
  468.             mob_table->bStr                 = tempTable->bStr;
  469.             mob_table->bDex                 = tempTable->bDex;
  470.             mob_table->bCon                 = tempTable->bCon;
  471.             mob_table->bInt                 = tempTable->bInt;
  472.             mob_table->dwDamageRange[0]     = tempTable->dwDamageRange[0];
  473.             mob_table->dwDamageRange[1]     = tempTable->dwDamageRange[1];
  474.             mob_table->dwMaxHP              = tempTable->dwMaxHP;
  475.             mob_table->bRegenCycle          = tempTable->bRegenCycle;
  476.             mob_table->bRegenPercent        = tempTable->bRegenPercent;
  477.             mob_table->dwExp                = tempTable->dwExp;
  478.             mob_table->wDef                 = tempTable->wDef;
  479.             mob_table->sAttackSpeed         = tempTable->sAttackSpeed;
  480.             mob_table->sMovingSpeed         = tempTable->sMovingSpeed;
  481.             mob_table->bAggresiveHPPct      = tempTable->bAggresiveHPPct;
  482.             mob_table->wAggressiveSight = tempTable->wAggressiveSight;
  483.             mob_table->wAttackRange     = tempTable->wAttackRange;
  484.             mob_table->dwDropItemVnum   = tempTable->dwDropItemVnum;
  485.             for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
  486.                 mob_table->cEnchants[i] = tempTable->cEnchants[i];
  487.             for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
  488.                 mob_table->cResists[i] = tempTable->cResists[i];
  489.             mob_table->fDamMultiply     = tempTable->fDamMultiply;
  490.             mob_table->dwSummonVnum     = tempTable->dwSummonVnum;
  491.             mob_table->dwDrainSP        = tempTable->dwDrainSP;
  492.             mob_table->dwMobColor       = tempTable->dwMobColor;
  493.  
  494.         }
  495.  
  496.         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);
  497.  
  498.         //¼Â¿¡ vnum Ãß°¡
  499.         vnumSet.insert(mob_table->dwVnum);
  500.  
  501.         ++mob_table;
  502.     }
  503.  
  504.  
  505.  
  506.     //============================//
  507.     //===== Å×½ºÆ® Á¤º¸ Ãß°¡ =====//
  508.     //%%ÁÖÀÇ%%
  509.     //%% -> »õ·Î¿î Á¤º¸¸¸ Ãß°¡µÊ  //
  510.     //Áߺ¹µÇ´Â Á¤º¸´Â À§¿¡¼­ Ãß°¡ //
  511.     //============================//
  512.     test_data.Destroy();
  513.     if(!test_data.Load("mob_proto_test.txt",'\t'))
  514.     {
  515.         fprintf(stderr, "mob_proto_test.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n");
  516.         //return false;
  517.     } else {
  518.         test_data.Next();   //¼³¸í ·Î¿ì ³Ñ¾î°¡±â.
  519.  
  520.         while (test_data.Next())    //Å×½ºÆ® µ¥ÀÌÅÍ °¢°¢À» ÈȾ°¡¸ç,»õ·Î¿î °ÍÀ» Ãß°¡ÇÑ´Ù.
  521.         {
  522.             //Áߺ¹µÇ´Â ºÎºÐÀÌ¸é ³Ñ¾î°£´Ù.
  523.             set<int>::iterator itVnum;
  524.             itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
  525.             if (itVnum != vnumSet.end()) {
  526.                 continue;
  527.             }
  528.  
  529.            
  530.             if (!Set_Proto_Mob_Table(mob_table, test_data, localMap))
  531.             {
  532.                 fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n");        
  533.             }
  534.  
  535.             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));
  536.  
  537.             //¼Â¿¡ vnum Ãß°¡
  538.             vnumSet.insert(mob_table->dwVnum);
  539.  
  540.             ++mob_table;
  541.         }
  542.     }
  543.     //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
  544.  
  545.  
  546.  
  547.     return true;
  548. }
  549.  
  550.  
  551.  
  552.  
  553. DWORD g_adwMobProtoKey[4] =
  554. {  
  555.     4813894,
  556.     18955,
  557.     552631,            
  558.     6822045
  559. };
  560.  
  561.  
  562. void SaveMobProto()
  563. {  
  564.     FILE * fp;          
  565.  
  566.     fp = fopen("mob_proto", "wb");
  567.  
  568.     if (!fp)
  569.     {
  570.         printf("cannot open %s for writing\n", "mob_proto");
  571.         return;
  572.     }
  573.  
  574.     DWORD fourcc = MAKEFOURCC('M', 'M', 'P', 'T');
  575.     fwrite(&fourcc, sizeof(DWORD), 1, fp);      
  576.  
  577.     DWORD dwElements = m_iMobTableSize;
  578.     fwrite(&dwElements, sizeof(DWORD), 1, fp);
  579.  
  580.     CLZObject zObj;    
  581.  
  582.     printf("sizeof(TMobTable) %d\n", sizeof(TMobTable));
  583.  
  584.     if (!CLZO::instance().CompressEncryptedMemory(zObj, m_pMobTable, sizeof(TMobTable) * m_iMobTableSize, g_adwMobProtoKey))  
  585.     {
  586.         printf("cannot compress\n");
  587.         fclose(fp);
  588.         return;
  589.     }
  590.  
  591.     const CLZObject::THeader & r = zObj.GetHeader();
  592.  
  593.     printf("MobProto count %u\n%u --Compress--> %u --Encrypt--> %u, GetSize %u\n",
  594.             m_iMobTableSize, r.dwRealSize, r.dwCompressedSize, r.dwEncryptSize, zObj.GetSize());
  595.  
  596.     DWORD dwDataSize = zObj.GetSize();
  597.     fwrite(&dwDataSize, sizeof(DWORD), 1, fp);
  598.     fwrite(zObj.GetBuffer(), dwDataSize, 1, fp);
  599.  
  600.     fclose(fp);
  601. }
  602.  
  603. void LoadMobProto()
  604. {
  605.     FILE * fp;
  606.     DWORD fourcc, tableSize, dataSize;
  607.  
  608.     fp = fopen("mob_proto", "rb");
  609.  
  610.     fread(&fourcc, sizeof(DWORD), 1, fp);
  611.     fread(&tableSize, sizeof(DWORD), 1, fp);
  612.     fread(&dataSize, sizeof(DWORD), 1, fp);
  613.     BYTE * data = (BYTE *) malloc(dataSize);
  614.  
  615.     if (data)
  616.     {
  617.         fread(data, dataSize, 1, fp);
  618.  
  619.         CLZObject zObj;
  620.  
  621.         if (CLZO::instance().Decompress(zObj, data, g_adwMobProtoKey))
  622.         {
  623.             printf("real_size %u\n", zObj.GetSize());
  624.  
  625.             for (DWORD i = 0; i < tableSize; ++i)
  626.             {
  627.                 TMobTable & rTable = *((TMobTable *) zObj.GetBuffer() + i);
  628.                 printf("%u %s\n", rTable.dwVnum, rTable.szName);
  629.             }
  630.         }
  631.  
  632.         free(data);
  633.     }
  634.  
  635.     fclose(fp);
  636. }
  637.  
  638.  
  639.  
  640.  
  641. //==                                                    ==//
  642. //==                                                    ==//
  643. //==                                                    ==//
  644. //===== ¿©±â¿¡¼­ºÎÅÍ ¾ÆÀÌÅÛ =====//
  645. //==                                                    ==//
  646. //==                                                    ==//
  647. //==                                                    ==//
  648.  
  649. bool Set_Proto_Item_Table(TClientItemTable *itemTable, cCsvTable &csvTable, std::map<int,const char*> &nameMap)
  650. {
  651.     // vnum ¹× vnum range Àбâ.
  652.     {
  653.         std::string s(csvTable.AsStringByIndex(0));
  654.         int pos = s.find("~");
  655.         // vnum Çʵ忡 '~'°¡ ¾ø´Ù¸é Æнº
  656.         if (std::string::npos == pos)
  657.         {
  658.             itemTable->dwVnum = atoi(s.c_str());
  659.             if (0 == itemTable->dwVnum)
  660.             {
  661.                 printf ("INVALID VNUM %s\n", s.c_str());
  662.                 return false;
  663.             }
  664.             itemTable->dwVnumRange = 0;
  665.         }
  666.         else
  667.         {
  668.             std::string s_start_vnum (s.substr(0, pos));
  669.             std::string s_end_vnum (s.substr(pos +1 ));
  670.  
  671.             int start_vnum = atoi(s_start_vnum.c_str());
  672.             int end_vnum = atoi(s_end_vnum.c_str());
  673.             if (0 == start_vnum || (0 != end_vnum && end_vnum < start_vnum))
  674.             {
  675.                 printf ("INVALID VNUM RANGE%s\n", s.c_str());
  676.                 return false;
  677.             }
  678.             itemTable->dwVnum = start_vnum;
  679.             itemTable->dwVnumRange = end_vnum - start_vnum;
  680.         }
  681.     }
  682.  
  683.     int col = 1;
  684.  
  685.     strncpy(itemTable->szName, csvTable.AsStringByIndex(col++), ITEM_NAME_MAX_LEN);
  686.     //³×ÀÓ ÆÄÀÏÀÌ Á¸ÀçÇϸé Á¤º¸¸¦ Àоî¿È.
  687.     map<int,const char*>::iterator it;
  688.     it = nameMap.find(itemTable->dwVnum);
  689.     if (it != nameMap.end()) {
  690.         const char * localeName = it->second;
  691.         strncpy(itemTable->szLocaleName, localeName, sizeof(itemTable->szLocaleName));
  692.     } else { //³×ÀÓ ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é Çѱ۷Î..
  693.         strncpy(itemTable->szLocaleName, itemTable->szName, sizeof(itemTable->szLocaleName));
  694.     }
  695.     itemTable->bType = get_Item_Type_Value(csvTable.AsStringByIndex(col++));
  696.     itemTable->bSubType = get_Item_SubType_Value(itemTable->bType, csvTable.AsStringByIndex(col++));
  697.     itemTable->bSize = atoi(csvTable.AsStringByIndex(col++));
  698.     itemTable->dwAntiFlags = get_Item_AntiFlag_Value(csvTable.AsStringByIndex(col++));
  699.     itemTable->dwFlags = get_Item_Flag_Value(csvTable.AsStringByIndex(col++));
  700.     itemTable->dwWearFlags = get_Item_WearFlag_Value(csvTable.AsStringByIndex(col++));
  701.     itemTable->dwImmuneFlag = get_Item_Immune_Value(csvTable.AsStringByIndex(col++));
  702.     itemTable->dwGold = atoi(csvTable.AsStringByIndex(col++));
  703.     itemTable->dwShopBuyPrice = atoi(csvTable.AsStringByIndex(col++));
  704.     itemTable->dwRefinedVnum = atoi(csvTable.AsStringByIndex(col++));
  705.     itemTable->wRefineSet = atoi(csvTable.AsStringByIndex(col++));
  706.     itemTable->bAlterToMagicItemPct = atoi(csvTable.AsStringByIndex(col++));
  707.  
  708.     int i;
  709.  
  710.     for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
  711.     {
  712.         itemTable->aLimits[i].bType = get_Item_LimitType_Value(csvTable.AsStringByIndex(col++));
  713.         itemTable->aLimits[i].lValue = atoi(csvTable.AsStringByIndex(col++));
  714.     }
  715.  
  716.     for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
  717.     {
  718.         itemTable->aApplies[i].bType = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col++));
  719.         itemTable->aApplies[i].lValue = atoi(csvTable.AsStringByIndex(col++));
  720.     }
  721.  
  722.     for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
  723.         itemTable->alValues[i] = atoi(csvTable.AsStringByIndex(col++));
  724.  
  725.     itemTable->bSpecular = atoi(csvTable.AsStringByIndex(col++));
  726.     itemTable->bGainSocketPct = atoi(csvTable.AsStringByIndex(col++));
  727.     col++; //AddonType
  728.    
  729.     itemTable->bWeight = 0;
  730.  
  731.     return true;
  732. }
  733.  
  734. bool BuildItemTable()
  735. {
  736.     //%%% <ÇÔ¼ö ¼³¸í> %%%//
  737.     //1. ¿ä¾à : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' ÆÄÀÏÀ» Àаí,
  738.     //      m_pItemTable ¸¦ ±¸¼ºÇÑ´Ù.
  739.     //2. ¼ø¼­
  740.     //  1)'item_names.txt' ÆÄÀÏÀ» Àо vnum:name ¸ÊÀ» ¸¸µç´Ù.
  741.     //  2)'item_proto_test.txt' ÆÄÀÏÀ» Àо,
  742.     //      test_item_table ¸¦ ¸¸µé°í,
  743.     //      vnum:TClientItemTable ¸ÊÀ» ¸¸µç´Ù.
  744.     //  3)'item_proto.txt' ÆÄÀÏÀ» Àаí, m_pItemTable¸¦ ±¸¼ºÇÑ´Ù.
  745.     //      test_item_table¿¡ ÀÖ´Â vnumÀº Å×½ºÆ® µ¥ÀÌÅ͸¦ ³Ö´Â´Ù.
  746.     //  4)test_item_table µ¥ÀÌÅÍÁß¿¡, m_pItemTable ¿¡ ¾ø´Â µ¥ÀÌÅ͸¦ Ãß°¡ÇÑ´Ù.
  747.     //3. Å×½ºÆ®
  748.     //  1)'item_proto.txt' Á¤º¸°¡ m_pItemTable¿¡ Àß µé¾î°¬´ÂÁö.
  749.     //  2)'item_names.txt' Á¤º¸°¡ m_pItemTable¿¡ Àß µé¾î°¬´ÂÁö.
  750.     //  3)'item_proto_test.txt' ¿¡¼­ [°ãÄ¡´Â] Á¤º¸°¡ m_pItemTable ¿¡ Àß µé¾î°¬´ÂÁö.
  751.     //  4)'item_proto_test.txt' ¿¡¼­ [»õ·Î¿î] Á¤º¸°¡ m_pItemTable ¿¡ Àß µé¾î°¬´ÂÁö.
  752.     //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
  753.  
  754.     fprintf(stderr, "sizeof(TClientItemTable): %u\n", sizeof(TClientItemTable));
  755.  
  756.     //=================================================================//
  757.     //  1)'item_names.txt' ÆÄÀÏÀ» Àо vnum:name ¸ÊÀ» ¸¸µç´Ù.
  758.     //=================================================================//
  759.     bool isNameFile = true;
  760.     map<int,const char*> localMap;
  761.     cCsvTable nameData;
  762.     if(!nameData.Load("item_names.txt",'\t'))
  763.     {
  764.         fprintf(stderr, "item_names.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n");
  765.         isNameFile = false;
  766.     } else {
  767.         nameData.Next();
  768.         while(nameData.Next()) {
  769.             localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
  770.         }
  771.     }
  772.     //_________________________________________________________________//
  773.  
  774.     //===================== =======================//
  775.     //  2)'item_proto_test.txt' ÆÄÀÏÀ» Àо,
  776.     //      test_item_table ¸¦ ¸¸µé°í,
  777.     //      vnum:TClientItemTable ¸ÊÀ» ¸¸µç´Ù.
  778.     //=============================================//
  779.     map<DWORD, TClientItemTable *> test_map_itemTableByVnum;
  780.  
  781.     //1. ÆÄÀÏ Àоî¿À±â.
  782.     cCsvTable test_data;
  783.     if(!test_data.Load("item_proto_test.txt",'\t'))
  784.     {
  785.         fprintf(stderr, "item_proto_test.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n");
  786.         //return false;
  787.     } else {
  788.         test_data.Next();   //¼³¸í ·Î¿ì ³Ñ¾î°¡±â.
  789.  
  790.         //2. Å×½ºÆ® ¾ÆÀÌÅÛ Å×ÀÌºí »ý¼º.
  791.         TClientItemTable * test_item_table = NULL;
  792.         int test_itemTableSize = test_data.m_File.GetRowCount()-1;
  793.         test_item_table = new TClientItemTable[test_itemTableSize];
  794.         memset(test_item_table, 0, sizeof(TClientItemTable) * test_itemTableSize);
  795.  
  796.         //3. Å×½ºÆ® ¸ó½ºÅÍ Å×ÀÌºí¿¡ °ªÀ» ³Ö°í, ¸Ê¿¡±îÁö ³Ö±â.
  797.         while(test_data.Next()) {
  798.            
  799.             if (!Set_Proto_Item_Table(test_item_table, test_data, localMap))
  800.             {
  801.                 fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n");        
  802.             }
  803.  
  804.  
  805.             test_map_itemTableByVnum.insert(std::map<DWORD, TClientItemTable *>::value_type(test_item_table->dwVnum, test_item_table));
  806.             ++test_item_table;
  807.         }
  808.     }
  809.    
  810.     //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
  811.  
  812.  
  813.     //================================================================//
  814.     //  3)'item_proto.txt' ÆÄÀÏÀ» Àаí, m_pItemTable¸¦ ±¸¼ºÇÑ´Ù.
  815.     //      test_item_table¿¡ ÀÖ´Â vnumÀº Å×½ºÆ® µ¥ÀÌÅ͸¦ ³Ö´Â´Ù.
  816.     //================================================================//
  817.  
  818.     //vnumµéÀ» ÀúÀåÇÒ ¼Â. »õ·Î¿î Å×½ºÆ® ¾ÆÀÌÅÛÀ» ÆǺ°ÇÒ¶§ »ç¿ëµÈ´Ù.
  819.     set<int> vnumSet;
  820.  
  821.     //ÆÄÀÏ Àоî¿À±â.
  822.     cCsvTable data;
  823.     if(!data.Load("item_proto.txt",'\t'))
  824.     {
  825.         fprintf(stderr, "item_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n");
  826.         return false;
  827.     }
  828.     data.Next(); //¸Ç À­ÁÙ Á¦¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸íÇÏ´Â ºÎºÐ)
  829.  
  830.     if (m_pItemTable)
  831.     {
  832.         free(m_pItemTable);
  833.         m_pItemTable = NULL;
  834.     }
  835.  
  836.     //===== ¾ÆÀÌÅÛ Å×ÀÌºí »ý¼º =====//
  837.     //»õ·Î Ãß°¡µÇ´Â °¹¼ö¸¦ ÆľÇÇÑ´Ù.
  838.     int addNumber = 0;
  839.     while(data.Next()) {
  840.         int vnum = atoi(data.AsStringByIndex(0));
  841.         std::map<DWORD, TClientItemTable *>::iterator it_map_itemTable;
  842.         it_map_itemTable = test_map_itemTableByVnum.find(vnum);
  843.         if(it_map_itemTable != test_map_itemTableByVnum.end()) {
  844.             addNumber++;
  845.         }
  846.     }
  847.     //data¸¦ ´Ù½Ã ùÁÙ·Î ¿Å±ä´Ù.(´Ù½Ã Àоî¿Â´Ù;;)
  848.     data.Destroy();
  849.     if(!data.Load("item_proto.txt",'\t'))
  850.     {
  851.         fprintf(stderr, "item_proto.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n");
  852.         return false;
  853.     }
  854.     data.Next(); //¸Ç À­ÁÙ Á¦¿Ü (¾ÆÀÌÅÛ Ä®·³À» ¼³¸íÇÏ´Â ºÎºÐ)
  855.  
  856.     m_iItemTableSize = data.m_File.GetRowCount()-1+addNumber;
  857.     m_pItemTable = new TClientItemTable[m_iItemTableSize];
  858.     memset(m_pItemTable, 0, sizeof(TClientItemTable) * m_iItemTableSize);
  859.  
  860.     TClientItemTable * item_table = m_pItemTable;
  861.  
  862.     while (data.Next())
  863.     {
  864.         int col = 0;
  865.  
  866.         //Å×½ºÆ® ÆÄÀÏ¿¡ °°Àº vnumÀÌ ÀÖ´ÂÁö Á¶»ç.
  867.         std::map<DWORD, TClientItemTable *>::iterator it_map_itemTable;
  868.         it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col)));
  869.         if(it_map_itemTable == test_map_itemTableByVnum.end()) {
  870.  
  871.            
  872.             if (!Set_Proto_Item_Table(item_table, data, localMap))
  873.             {
  874.                 fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n");        
  875.             }
  876.         } else {    //$$$$$$$$$$$$$$$$$$$$$$$ Å×½ºÆ® ¾ÆÀÌÅÛ Á¤º¸°¡ ÀÖ´Ù! 
  877.             TClientItemTable *tempTable = it_map_itemTable->second;
  878.  
  879.             item_table->dwVnum = tempTable->dwVnum;
  880.             strncpy(item_table->szName, tempTable->szName, ITEM_NAME_MAX_LEN);
  881.             strncpy(item_table->szLocaleName, tempTable->szLocaleName, ITEM_NAME_MAX_LEN);
  882.             item_table->bType = tempTable->bType;
  883.             item_table->bSubType = tempTable->bSubType;
  884.             item_table->bSize = tempTable->bSize;
  885.             item_table->dwAntiFlags = tempTable->dwAntiFlags;
  886.             item_table->dwFlags = tempTable->dwFlags;
  887.             item_table->dwWearFlags = tempTable->dwWearFlags;
  888.             item_table->dwImmuneFlag = tempTable->dwImmuneFlag;
  889.             item_table->dwGold = tempTable->dwGold;
  890.             item_table->dwShopBuyPrice = tempTable->dwShopBuyPrice;
  891.             item_table->dwRefinedVnum = tempTable->dwRefinedVnum;
  892.             item_table->wRefineSet = tempTable->wRefineSet;
  893.             item_table->bAlterToMagicItemPct = tempTable->bAlterToMagicItemPct;
  894.  
  895.             int i;
  896.             for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
  897.             {
  898.                 item_table->aLimits[i].bType = tempTable->aLimits[i].bType;
  899.                 item_table->aLimits[i].lValue = tempTable->aLimits[i].lValue;
  900.             }
  901.  
  902.             for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
  903.             {
  904.                 item_table->aApplies[i].bType = tempTable->aApplies[i].bType;
  905.                 item_table->aApplies[i].lValue = tempTable->aApplies[i].lValue;
  906.             }
  907.  
  908.             for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
  909.                 item_table->alValues[i] = tempTable->alValues[i];
  910.  
  911.             item_table->bSpecular = tempTable->bSpecular;
  912.             item_table->bGainSocketPct = tempTable->bGainSocketPct;
  913.            
  914.             item_table->bWeight = tempTable->bWeight;
  915.  
  916.         }
  917.  
  918.  
  919.         fprintf(stdout, "ITEM #%-5u %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %u ANTI %u IMMUNE %u REFINE %u\n",
  920.                 item_table->dwVnum,
  921.                 item_table->szName,
  922.                 item_table->szLocaleName,
  923.                 item_table->alValues[0],
  924.                 item_table->alValues[1],
  925.                 item_table->alValues[2],
  926.                 item_table->alValues[3],
  927.                 item_table->alValues[4],
  928.                 item_table->alValues[5],
  929.                 item_table->dwWearFlags,
  930.                 item_table->dwAntiFlags,
  931.                 item_table->dwImmuneFlag,
  932.                 item_table->dwRefinedVnum);
  933.  
  934.         //vnum ÀúÀå.
  935.         vnumSet.insert(item_table->dwVnum);
  936.         ++item_table;
  937.     }
  938.  
  939.     //==========================================================================//
  940.     //  4)test_item_table µ¥ÀÌÅÍÁß¿¡, m_pItemTable ¿¡ ¾ø´Â µ¥ÀÌÅ͸¦ Ãß°¡ÇÑ´Ù.
  941.     //==========================================================================//
  942.     test_data.Destroy();
  943.     if(!test_data.Load("item_proto_test.txt",'\t'))
  944.     {
  945.         fprintf(stderr, "item_proto_test.txt ÆÄÀÏÀ» Àоî¿ÀÁö ¸øÇß½À´Ï´Ù\n");
  946.         //return false;
  947.     } else {
  948.         test_data.Next();   //¼³¸í ·Î¿ì ³Ñ¾î°¡±â.
  949.  
  950.         while (test_data.Next())    //Å×½ºÆ® µ¥ÀÌÅÍ °¢°¢À» ÈȾ°¡¸ç,»õ·Î¿î °ÍÀ» Ãß°¡ÇÑ´Ù.
  951.         {
  952.             //Áߺ¹µÇ´Â ºÎºÐÀÌ¸é ³Ñ¾î°£´Ù.
  953.             set<int>::iterator itVnum;
  954.             itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
  955.             if (itVnum != vnumSet.end()) {
  956.                 continue;
  957.             }
  958.  
  959.             if (!Set_Proto_Item_Table(item_table, test_data, localMap))
  960.             {
  961.                 fprintf(stderr, "¸÷ ÇÁ·ÎÅä Å×ÀÌºí ¼ÂÆà ½ÇÆÐ.\n");        
  962.             }
  963.  
  964.             fprintf(stdout, "[NEW]ITEM #%-5u %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %u ANTI %u IMMUNE %u REFINE %u\n",
  965.                     item_table->dwVnum,
  966.                     item_table->szName,
  967.                     item_table->szLocaleName,
  968.                     item_table->alValues[0],
  969.                     item_table->alValues[1],
  970.                     item_table->alValues[2],
  971.                     item_table->alValues[3],
  972.                     item_table->alValues[4],
  973.                     item_table->alValues[5],
  974.                     item_table->dwWearFlags,
  975.                     item_table->dwAntiFlags,
  976.                     item_table->dwImmuneFlag,
  977.                     item_table->dwRefinedVnum);
  978.  
  979.            
  980.             //¼Â¿¡ vnum Ãß°¡
  981.             vnumSet.insert(item_table->dwVnum);
  982.  
  983.             ++item_table;
  984.  
  985.         }
  986.     }
  987.  
  988.     return true;
  989. }
  990.  
  991. DWORD g_adwItemProtoKey[4] =
  992. {
  993.     173217,
  994.     72619434,
  995.     408587239,
  996.     27973291
  997. };  
  998.  
  999. void SaveItemProto()
  1000. {
  1001.     FILE * fp;
  1002.  
  1003.     fp = fopen("item_proto", "wb");
  1004.  
  1005.     if (!fp)
  1006.     {
  1007.         printf("cannot open %s for writing\n", "item_proto");
  1008.         return;
  1009.     }  
  1010.  
  1011.     DWORD fourcc = MAKEFOURCC('M', 'I', 'P', 'X');
  1012.     fwrite(&fourcc, sizeof(DWORD), 1, fp);
  1013.  
  1014.     DWORD dwVersion = 0x00000001;
  1015.     fwrite(&dwVersion, sizeof(DWORD), 1, fp);
  1016.  
  1017.     DWORD dwStride = sizeof(TClientItemTable);
  1018.     fwrite(&dwStride, sizeof(DWORD), 1, fp);
  1019.  
  1020.     DWORD dwElements = m_iItemTableSize;
  1021.     fwrite(&dwElements, sizeof(DWORD), 1, fp);
  1022.  
  1023.     CLZObject zObj;
  1024.     std::vector <TClientItemTable> vec_item_table (&m_pItemTable[0], &m_pItemTable[m_iItemTableSize - 1]);
  1025.     sort (&m_pItemTable[0], &m_pItemTable[0] + m_iItemTableSize);
  1026.     if (!CLZO::instance().CompressEncryptedMemory(zObj, m_pItemTable, sizeof(TClientItemTable) * m_iItemTableSize, g_adwItemProtoKey))
  1027.     {
  1028.         printf("cannot compress\n");
  1029.         fclose(fp);
  1030.         return;
  1031.     }  
  1032.  
  1033.     const CLZObject::THeader & r = zObj.GetHeader();
  1034.  
  1035.     printf("Elements %d\n%u --Compress--> %u --Encrypt--> %u, GetSize %u\n",
  1036.             m_iItemTableSize,
  1037.             r.dwRealSize,
  1038.             r.dwCompressedSize,
  1039.             r.dwEncryptSize,
  1040.             zObj.GetSize());
  1041.  
  1042.     DWORD dwDataSize = zObj.GetSize();
  1043.     fwrite(&dwDataSize, sizeof(DWORD), 1, fp);
  1044.     fwrite(zObj.GetBuffer(), dwDataSize, 1, fp);
  1045.  
  1046.     fclose(fp);
  1047.  
  1048.     fp = fopen("item_proto", "rb");
  1049.  
  1050.     if (!fp)
  1051.     {
  1052.         printf("Error!!\n");
  1053.         return;
  1054.     }
  1055.  
  1056.     fread(&fourcc, sizeof(DWORD), 1, fp);
  1057.     fread(&dwElements, sizeof(DWORD), 1, fp);
  1058.  
  1059.     printf("Elements Check %u fourcc match %d\n", dwElements, fourcc == MAKEFOURCC('M', 'I', 'P', 'T'));
  1060.     fclose(fp);
  1061. }
  1062.  
  1063.  
  1064.  
  1065. int main(int argc, char ** argv)
  1066. {
  1067.  
  1068.    
  1069.     if (BuildMobTable())
  1070.     {
  1071.         SaveMobProto();
  1072.         LoadMobProto();
  1073.         cout << "BuildMobTable working normal" << endl;
  1074.     }
  1075.    
  1076.  
  1077.    
  1078.     if (BuildItemTable())
  1079.     {
  1080.         SaveItemProto();
  1081.         cout << "BuildItemTable working normal" << endl;
  1082.     }
  1083.    
  1084.    
  1085.  
  1086.     return 0;
  1087. }
RAW Paste Data