Advertisement
Guest User

Update DB Struct #1

a guest
Jun 24th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 36.05 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3. #include <math.h>
  4. #include "ProtoReader.h"
  5.  
  6. #include "CsvReader.h"
  7.  
  8. #include <sstream>
  9.  
  10. using namespace std;
  11.  
  12. inline string trim_left(const string& str)
  13. {
  14.     string::size_type n = str.find_first_not_of(" \t\v\n\r");
  15.     return n == string::npos ? str : str.substr(n, str.length());
  16. }
  17.  
  18. inline string trim_right(const string& str)
  19. {
  20.     string::size_type n = str.find_last_not_of(" \t\v\n\r");
  21.     return n == string::npos ? str : str.substr(0, n + 1);
  22. }
  23.  
  24. string trim(const string& str){return trim_left(trim_right(str));}
  25.  
  26. static string* StringSplit(string strOrigin, string strTok)
  27. {
  28.     int     cutAt;                            //자르는위치
  29.     int     index     = 0;                    //문자열인덱스
  30.     string* strResult = new string[30];       //결과return 할변수
  31.  
  32.     //strTok을찾을때까지반복
  33.     while ((cutAt = strOrigin.find_first_of(strTok)) != strOrigin.npos)
  34.     {
  35.        if (cutAt > 0)  //자르는위치가0보다크면(성공시)
  36.        {
  37.             strResult[index++] = strOrigin.substr(0, cutAt);  //결과배열에추가
  38.        }
  39.        strOrigin = strOrigin.substr(cutAt+1);  //원본은자른부분제외한나머지
  40.     }
  41.  
  42.     if(strOrigin.length() > 0)  //원본이아직남았으면
  43.     {
  44.         strResult[index++] = strOrigin.substr(0, cutAt);  //나머지를결과배열에추가
  45.     }
  46.  
  47.     for( int i=0;i<index;i++)
  48.     {
  49.         strResult[i] = trim(strResult[i]);
  50.     }
  51.  
  52.     return strResult;  //결과return
  53. }
  54.  
  55.  
  56.  
  57. int get_Item_Type_Value(string inputString)
  58. {
  59.     string arType[] = {"ITEM_NONE", "ITEM_WEAPON",
  60.         "ITEM_ARMOR", "ITEM_USE",
  61.         "ITEM_AUTOUSE", "ITEM_MATERIAL",
  62.         "ITEM_SPECIAL", "ITEM_TOOL",
  63.         "ITEM_LOTTERY", "ITEM_ELK",                 //10개
  64.  
  65.         "ITEM_METIN", "ITEM_CONTAINER",
  66.         "ITEM_FISH", "ITEM_ROD",
  67.         "ITEM_RESOURCE", "ITEM_CAMPFIRE",
  68.         "ITEM_UNIQUE", "ITEM_SKILLBOOK",
  69.         "ITEM_QUEST", "ITEM_POLYMORPH",             //20개
  70.  
  71.         "ITEM_TREASURE_BOX", "ITEM_TREASURE_KEY",
  72.         "ITEM_SKILLFORGET", "ITEM_GIFTBOX",
  73.         "ITEM_PICK", "ITEM_HAIR",
  74.         "ITEM_TOTEM", "ITEM_BLEND",
  75.         "ITEM_COSTUME", "ITEM_DS",                  //30개
  76.    
  77.         "ITEM_SPECIAL_DS""ITEM_EXTRACT",
  78.         "ITEM_SECONDARY_COIN",                      //33개
  79.  
  80.         "ITEM_RING",
  81.         "ITEM_BELT",                                //35개 (EItemTypes 값으로 치면 34)
  82.        
  83. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  84.         "ITEM_PET",     // 35 GrowthPet
  85.         "ITEM_MEDIUM"// 36 Move Costume Attr
  86.         "ITEM_GACHA",   // 37
  87. #endif
  88.     };
  89.  
  90.    
  91.     int retInt = -1;
  92.     //cout << "Type : " << typeStr << " -> ";
  93.     for (int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) {
  94.         string tempString = arType[j];
  95.         if  (inputString.find(tempString)!=string::npos && tempString.find(inputString)!=string::npos) {
  96.             //cout << j << " ";
  97.             retInt =  j;
  98.             break;
  99.         }
  100.     }
  101.     //cout << endl;
  102.  
  103.     return retInt;
  104.  
  105. }
  106.  
  107. int get_Item_SubType_Value(int type_value, string inputString)
  108. {
  109.     static string arSub1[] = { "WEAPON_SWORD", "WEAPON_DAGGER", "WEAPON_BOW",
  110.         "WEAPON_TWO_HANDED", "WEAPON_BELL", "WEAPON_FAN", "WEAPON_ARROW", "WEAPON_MOUNT_SPEAR"
  111. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  112.         ,"WEAPON_CLAW", "WEAPON_QUIVER", "WEAPON_UNKNOW"
  113. #endif 
  114.     };
  115.     static string arSub2[] = { "ARMOR_BODY", "ARMOR_HEAD", "ARMOR_SHIELD", "ARMOR_WRIST", "ARMOR_FOOTS",
  116.                 "ARMOR_NECK", "ARMOR_EAR", "ARMOR_NUM_TYPES"};
  117.     static string arSub3[] = {
  118.         "USE_POTION", "USE_TALISMAN", "USE_TUNING", "USE_MOVE", "USE_TREASURE_BOX",
  119.         "USE_MONEYBAG", "USE_BAIT", "USE_ABILITY_UP", "USE_AFFECT", "USE_CREATE_STONE",
  120.         "USE_SPECIAL", "USE_POTION_NODELAY", "USE_CLEAR", "USE_INVISIBILITY",
  121.         "USE_DETACHMENT", "USE_BUCKET", "USE_POTION_CONTINUE", "USE_CLEAN_SOCKET",
  122.         "USE_CHANGE_ATTRIBUTE", "USE_ADD_ATTRIBUTE", "USE_ADD_ACCESSORY_SOCKET",
  123.         "USE_PUT_INTO_ACCESSORY_SOCKET", "USE_ADD_ATTRIBUTE2", "USE_RECIPE", "USE_CHANGE_ATTRIBUTE2", "USE_BIND", "USE_UNBIND",
  124.         "USE_TIME_CHARGE_PER", "USE_TIME_CHARGE_FIX", "USE_PUT_INTO_BELT_SOCKET", "USE_PUT_INTO_RING_SOCKET"
  125. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  126.         ,"USE_CHANGE_COSTUME_ATTR", "USE_RESET_COSTUME_ATTR", "USE_UNKNOWN_TYPE"
  127. #endif
  128.     };
  129.     static string arSub4[] = { "AUTOUSE_POTION", "AUTOUSE_ABILITY_UP", "AUTOUSE_BOMB", "AUTOUSE_GOLD", "AUTOUSE_MONEYBAG", "AUTOUSE_TREASURE_BOX"};
  130.     static string arSub5[] = { "MATERIAL_LEATHER", "MATERIAL_BLOOD", "MATERIAL_ROOT", "MATERIAL_NEEDLE", "MATERIAL_JEWEL",
  131.         "MATERIAL_DS_REFINE_NORMAL", "MATERIAL_DS_REFINE_BLESSED", "MATERIAL_DS_REFINE_HOLLY"};
  132.     static string arSub6[] = { "SPECIAL_MAP", "SPECIAL_KEY", "SPECIAL_DOC", "SPECIAL_SPIRIT"};
  133.     static string arSub7[] = { "TOOL_FISHING_ROD" };
  134.     static string arSub8[] = { "LOTTERY_TICKET", "LOTTERY_INSTANT" };
  135.     static string arSub10[] = { "METIN_NORMAL", "METIN_GOLD" };
  136.     static string arSub12[] = { "FISH_ALIVE", "FISH_DEAD"};
  137.     static string arSub14[] = { "RESOURCE_FISHBONE", "RESOURCE_WATERSTONEPIECE", "RESOURCE_WATERSTONE", "RESOURCE_BLOOD_PEARL",
  138.                         "RESOURCE_BLUE_PEARL", "RESOURCE_WHITE_PEARL", "RESOURCE_BUCKET", "RESOURCE_CRYSTAL", "RESOURCE_GEM",
  139.                         "RESOURCE_STONE", "RESOURCE_METIN", "RESOURCE_ORE" };
  140.     static string arSub16[] = { "UNIQUE_NONE", "UNIQUE_BOOK", "UNIQUE_SPECIAL_RIDE", "UNIQUE_3", "UNIQUE_4", "UNIQUE_5",
  141.                     "UNIQUE_6", "UNIQUE_7", "UNIQUE_8", "UNIQUE_9", "USE_SPECIAL"};
  142.     static string arSub28[] = { "COSTUME_BODY", "COSTUME_HAIR" };
  143.     static string arSub29[] = { "DS_SLOT1", "DS_SLOT2", "DS_SLOT3", "DS_SLOT4", "DS_SLOT5", "DS_SLOT6" };
  144.     static string arSub31[] = { "EXTRACT_DRAGON_SOUL", "EXTRACT_DRAGON_HEART" };
  145.    
  146. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  147.     static string arSub35[] = {
  148.         "PET_EGG",
  149.         "PET_UPBRINGING",
  150.         "PET_BAG",
  151.         "PET_FEEDSTUFF",
  152.         "PET_SKILL",
  153.         "PET_SKILL_DEL_BOOK",
  154.         "PET_NAME_CHANGE"
  155.     };
  156.     static string arSub36[] = {
  157.         "MEDIUM_MOVE_COSTUME_ATTR"
  158.     };
  159. #endif
  160.    
  161.     static string* arSubType[] = {
  162.         0,
  163.         arSub1,
  164.         arSub2,
  165.         arSub3,
  166.         arSub4,
  167.         arSub5,
  168.         arSub6,
  169.         arSub7,
  170.         arSub8,
  171.         0,
  172.         arSub10,
  173.         0,
  174.         arSub12,
  175.         0,
  176.         arSub14,
  177.         0,
  178.         arSub16,
  179.         0,
  180.         0,
  181.         0,
  182.         0,
  183.         0,
  184.         0,
  185.         0,
  186.         0,
  187.         0,
  188.         0,
  189.         0,
  190.         arSub28,
  191.         arSub29,
  192.         arSub29,
  193.         arSub31,
  194.         0,
  195.         0,
  196.         0,
  197. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  198.         arSub35,
  199.         arSub36,
  200.         0,
  201. #endif
  202.     };
  203.    
  204.     static int arNumberOfSubtype[_countof(arSubType)] = {
  205.         0,
  206.         sizeof(arSub1)/sizeof(arSub1[0]),
  207.         sizeof(arSub2)/sizeof(arSub2[0]),
  208.         sizeof(arSub3)/sizeof(arSub3[0]),
  209.         sizeof(arSub4)/sizeof(arSub4[0]),
  210.         sizeof(arSub5)/sizeof(arSub5[0]),
  211.         sizeof(arSub6)/sizeof(arSub6[0]),
  212.         sizeof(arSub7)/sizeof(arSub7[0]),
  213.         sizeof(arSub8)/sizeof(arSub8[0]),
  214.         0,
  215.         sizeof(arSub10)/sizeof(arSub10[0]),
  216.         0,
  217.         sizeof(arSub12)/sizeof(arSub12[0]),
  218.         0,
  219.         sizeof(arSub14)/sizeof(arSub14[0]),
  220.         0,
  221.         sizeof(arSub16)/sizeof(arSub16[0]),
  222.         0,
  223.         0,
  224.         0,
  225.         0,
  226.         0,
  227.         0,
  228.         0,
  229.         0,
  230.         0,
  231.         0,
  232.         0,
  233.         sizeof(arSub28)/sizeof(arSub28[0]),
  234.         sizeof(arSub29)/sizeof(arSub29[0]),
  235.         sizeof(arSub29)/sizeof(arSub29[0]),
  236.         sizeof(arSub31)/sizeof(arSub31[0]),
  237.         0,
  238.         0,
  239.         0,
  240. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  241.         sizeof(arSub35)/sizeof(arSub35[0]),     // 35 GrowthPet
  242.         sizeof(arSub36)/sizeof(arSub36[0]),     // 36 Move Change Costume Attr
  243.         0,                                      // 37 Item Gacha
  244. #endif
  245.     };
  246.    
  247.  
  248.     assert(_countof(arSubType) > type_value && "Subtype rule: Out of range!!");
  249.  
  250.     // assert 안 먹히는 듯..
  251.     if (_countof(arSubType) <= type_value)
  252.     {
  253.         sys_err("SubType : Out of range!! (type_value: %d, count of registered subtype: %d", type_value, _countof(arSubType));
  254.         return -1;
  255.     }
  256.  
  257.     //아이템 타입의 서브타입 어레이가 존재하는지 알아보고, 없으면 0 리턴
  258.     if (arSubType[type_value]==0) {
  259.         return 0;
  260.     }
  261.     //
  262.  
  263.     int retInt = -1;
  264.     //cout << "SubType : " << subTypeStr << " -> ";
  265.     for (int j=0;j<arNumberOfSubtype[type_value];j++) {
  266.         string tempString = arSubType[type_value][j];
  267.         string tempInputString = trim(inputString);
  268.         if  (tempInputString.compare(tempString)==0)
  269.         {
  270.             //cout << j << " ";
  271.             retInt =  j;
  272.             break;
  273.         }
  274.     }
  275.     //cout << endl;
  276.  
  277.     return retInt;
  278. }
  279.  
  280.  
  281.  
  282.  
  283.  
  284. int get_Item_AntiFlag_Value(string inputString)
  285. {
  286.  
  287.     string arAntiFlag[] = {
  288.         "ANTI_FEMALE",
  289.         "ANTI_MALE",
  290.         "ANTI_MUSA",
  291.         "ANTI_ASSASSIN",
  292.         "ANTI_SURA",
  293.         "ANTI_MUDANG",
  294.         "ANTI_GET",
  295.         "ANTI_DROP",
  296.         "ANTI_SELL",
  297.         "ANTI_EMPIRE_A",
  298.         "ANTI_EMPIRE_B",
  299.         "ANTI_EMPIRE_C",
  300.         "ANTI_SAVE",
  301.         "ANTI_GIVE",
  302.         "ANTI_PKDROP",
  303.         "ANTI_STACK",
  304.         "ANTI_MYSHOP",
  305.         "ANTI_SAFEBOX"
  306. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  307.         ,"ANTI_WOLFMAN"
  308. #endif
  309.     };
  310.  
  311.  
  312.     int retValue = 0;
  313.     string* arInputString = StringSplit(inputString, "|");              //프로토 정보 내용을 단어별로 쪼갠 배열.
  314.     for(int i =0;i<sizeof(arAntiFlag)/sizeof(arAntiFlag[0]);i++) {
  315.         string tempString = arAntiFlag[i];
  316.         for (int j=0; j<30 ; j++)       //최대 30개 단어까지. (하드코딩)
  317.         {
  318.             string tempString2 = arInputString[j];
  319.             if (tempString2.compare(tempString)==0) {               //일치하는지 확인.
  320.                 retValue = retValue + pow((float)2,(float)i);
  321.             }
  322.            
  323.             if(tempString2.compare("") == 0)
  324.                 break;
  325.         }
  326.     }
  327.     delete []arInputString;
  328.     //cout << "AntiFlag : " << antiFlagStr << " -> " << retValue << endl;
  329.  
  330.     return retValue;
  331. }
  332.  
  333. int get_Item_Flag_Value(string inputString)
  334. {
  335.  
  336.     string arFlag[] = {"ITEM_TUNABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE",
  337.             "ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE",
  338.             "QUEST_GIVE", "ITEM_QUEST", "LOG", "STACKABLE", "SLOW_QUERY", "REFINEABLE", "IRREMOVABLE", "ITEM_APPLICABLE"};
  339.  
  340.  
  341.     int retValue = 0;
  342.     string* arInputString = StringSplit(inputString, "|");              //프로토 정보 내용을 단어별로 쪼갠 배열.
  343.     for(int i =0;i<sizeof(arFlag)/sizeof(arFlag[0]);i++) {
  344.         string tempString = arFlag[i];
  345.         for (int j=0; j<30 ; j++)       //최대 30개 단어까지. (하드코딩)
  346.         {
  347.             string tempString2 = arInputString[j];
  348.             if (tempString2.compare(tempString)==0) {               //일치하는지 확인.
  349.                 retValue = retValue + pow((float)2,(float)i);
  350.             }
  351.            
  352.             if(tempString2.compare("") == 0)
  353.                 break;
  354.         }
  355.     }
  356.     delete []arInputString;
  357.     //cout << "Flag : " << flagStr << " -> " << retValue << endl;
  358.  
  359.     return retValue;
  360. }
  361.  
  362. int get_Item_WearFlag_Value(string inputString)
  363. {
  364.  
  365.     string arWearrFlag[] = {
  366.         "WEAR_BODY",
  367.         "WEAR_HEAD",
  368.         "WEAR_FOOTS",
  369.         "WEAR_WRIST",
  370.         "WEAR_WEAPON",
  371.         "WEAR_NECK",
  372.         "WEAR_EAR",
  373.         "WEAR_SHIELD",
  374.         "WEAR_UNIQUE",
  375.         "WEAR_ARROW",
  376.         "WEAR_HAIR",
  377.         "WEAR_ABILITY",
  378.         "WEAR_COSTUME_BODY",
  379.         "WEAR_COSTUME_HAIR",
  380. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  381.         "WEAR_COSTUME_MOUNT",
  382.         "WEAR_COSTUME_ACCE",
  383.         "WEAR_COSTUME_WEAPON",
  384. #endif
  385.     };
  386.  
  387.  
  388.     int retValue = 0;
  389.     string* arInputString = StringSplit(inputString, "|");              //프로토 정보 내용을 단어별로 쪼갠 배열.
  390.     for(int i =0;i<sizeof(arWearrFlag)/sizeof(arWearrFlag[0]);i++) {
  391.         string tempString = arWearrFlag[i];
  392.         for (int j=0; j<30 ; j++)       //최대 30개 단어까지. (하드코딩)
  393.         {
  394.             string tempString2 = arInputString[j];
  395.             if (tempString2.compare(tempString)==0) {               //일치하는지 확인.
  396.                 retValue = retValue + pow((float)2,(float)i);
  397.             }
  398.            
  399.             if(tempString2.compare("") == 0)
  400.                 break;
  401.         }
  402.     }
  403.     delete []arInputString;
  404.     //cout << "WearFlag : " << wearFlagStr << " -> " << retValue << endl;
  405.  
  406.     return retValue;
  407. }
  408.  
  409. int get_Item_Immune_Value(string inputString)
  410. {
  411.  
  412.     string arImmune[] = {"PARA","CURSE","STUN","SLEEP","SLOW","POISON","TERROR"};
  413.  
  414.     int retValue = 0;
  415.     string* arInputString = StringSplit(inputString, "|");              //프로토 정보 내용을 단어별로 쪼갠 배열.
  416.     for(int i =0;i<sizeof(arImmune)/sizeof(arImmune[0]);i++) {
  417.         string tempString = arImmune[i];
  418.         for (int j=0; j<30 ; j++)       //최대 30개 단어까지. (하드코딩)
  419.         {
  420.             string tempString2 = arInputString[j];
  421.             if (tempString2.compare(tempString)==0) {               //일치하는지 확인.
  422.                 retValue = retValue + pow((float)2,(float)i);
  423.             }
  424.            
  425.             if(tempString2.compare("") == 0)
  426.                 break;
  427.         }
  428.     }
  429.     delete []arInputString;
  430.     //cout << "Immune : " << immuneStr << " -> " << retValue << endl;
  431.  
  432.     return retValue;
  433. }
  434.  
  435.  
  436.  
  437.  
  438. int get_Item_LimitType_Value(string inputString)
  439. {
  440.     string arLimitType[] = {"LIMIT_NONE", "LEVEL", "STR", "DEX", "INT", "CON", "PC_BANG", "REAL_TIME", "REAL_TIME_FIRST_USE", "TIMER_BASED_ON_WEAR"};
  441.    
  442.     int retInt = -1;
  443.     //cout << "LimitType : " << limitTypeStr << " -> ";
  444.     for (int j=0;j<sizeof(arLimitType)/sizeof(arLimitType[0]);j++) {
  445.         string tempString = arLimitType[j];
  446.         string tempInputString = trim(inputString);
  447.         if  (tempInputString.compare(tempString)==0)
  448.         {
  449.             //cout << j << " ";
  450.             retInt =  j;
  451.             break;
  452.         }
  453.     }
  454.     //cout << endl;
  455.  
  456.     return retInt;
  457. }
  458.  
  459.  
  460. int get_Item_ApplyType_Value(string inputString)
  461. {
  462.     string arApplyType[] = {
  463.         "APPLY_NONE", "APPLY_MAX_HP", "APPLY_MAX_SP", "APPLY_CON", "APPLY_INT", "APPLY_STR", "APPLY_DEX", "APPLY_ATT_SPEED",
  464.         "APPLY_MOV_SPEED", "APPLY_CAST_SPEED", "APPLY_HP_REGEN", "APPLY_SP_REGEN", "APPLY_POISON_PCT", "APPLY_STUN_PCT",
  465.         "APPLY_SLOW_PCT", "APPLY_CRITICAL_PCT", "APPLY_PENETRATE_PCT", "APPLY_ATTBONUS_HUMAN", "APPLY_ATTBONUS_ANIMAL",
  466.         "APPLY_ATTBONUS_ORC", "APPLY_ATTBONUS_MILGYO", "APPLY_ATTBONUS_UNDEAD", "APPLY_ATTBONUS_DEVIL", "APPLY_STEAL_HP",
  467.         "APPLY_STEAL_SP", "APPLY_MANA_BURN_PCT", "APPLY_DAMAGE_SP_RECOVER", "APPLY_BLOCK", "APPLY_DODGE", "APPLY_RESIST_SWORD",
  468.         "APPLY_RESIST_TWOHAND", "APPLY_RESIST_DAGGER", "APPLY_RESIST_BELL", "APPLY_RESIST_FAN", "APPLY_RESIST_BOW", "APPLY_RESIST_FIRE",
  469.         "APPLY_RESIST_ELEC", "APPLY_RESIST_MAGIC", "APPLY_RESIST_WIND", "APPLY_REFLECT_MELEE", "APPLY_REFLECT_CURSE", "APPLY_POISON_REDUCE",
  470.         "APPLY_KILL_SP_RECOVER", "APPLY_EXP_DOUBLE_BONUS", "APPLY_GOLD_DOUBLE_BONUS", "APPLY_ITEM_DROP_BONUS", "APPLY_POTION_BONUS",
  471.         "APPLY_KILL_HP_RECOVER", "APPLY_IMMUNE_STUN", "APPLY_IMMUNE_SLOW", "APPLY_IMMUNE_FALL", "APPLY_SKILL", "APPLY_BOW_DISTANCE",
  472.         "APPLY_ATT_GRADE_BONUS", "APPLY_DEF_GRADE_BONUS", "APPLY_MAGIC_ATT_GRADE", "APPLY_MAGIC_DEF_GRADE", "APPLY_CURSE_PCT",
  473.         "APPLY_MAX_STAMINA", "APPLY_ATTBONUS_WARRIOR", "APPLY_ATTBONUS_ASSASSIN", "APPLY_ATTBONUS_SURA", "APPLY_ATTBONUS_SHAMAN",
  474.         "APPLY_ATTBONUS_MONSTER", "APPLY_MALL_ATTBONUS", "APPLY_MALL_DEFBONUS", "APPLY_MALL_EXPBONUS", "APPLY_MALL_ITEMBONUS",
  475.         "APPLY_MALL_GOLDBONUS", "APPLY_MAX_HP_PCT", "APPLY_MAX_SP_PCT", "APPLY_SKILL_DAMAGE_BONUS", "APPLY_NORMAL_HIT_DAMAGE_BONUS",
  476.         "APPLY_SKILL_DEFEND_BONUS", "APPLY_NORMAL_HIT_DEFEND_BONUS", "APPLY_PC_BANG_EXP_BONUS", "APPLY_PC_BANG_DROP_BONUS",
  477.         "APPLY_EXTRACT_HP_PCT", "APPLY_RESIST_WARRIOR", "APPLY_RESIST_ASSASSIN", "APPLY_RESIST_SURA", "APPLY_RESIST_SHAMAN",
  478.         "APPLY_ENERGY", "APPLY_DEF_GRADE", "APPLY_COSTUME_ATTR_BONUS", "APPLY_MAGIC_ATTBONUS_PER", "APPLY_MELEE_MAGIC_ATTBONUS_PER",
  479.         "APPLY_RESIST_ICE", "APPLY_RESIST_EARTH", "APPLY_RESIST_DARK", "APPLY_ANTI_CRITICAL_PCT", "APPLY_ANTI_PENETRATE_PCT"
  480. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  481.         ,"APPLY_BLEEDING_PCT", "APPLY_BLEEDING_REDUCE", "APPLY_ATTBONUS_WOLFMAN", "APPLY_RESIST_WOLFMAN", "APPLY_RESIST_CLAW",
  482.         "APPLY_ACCEDRAIN_RATE", "APPLY_RESIST_MAGIC_REDUCTION"
  483. #endif
  484.     };
  485.  
  486.     int retInt = -1;
  487.     //cout << "ApplyType : " << applyTypeStr << " -> ";
  488.     for (int j=0;j<sizeof(arApplyType)/sizeof(arApplyType[0]);j++) {
  489.         string tempString = arApplyType[j];
  490.         string tempInputString = trim(inputString);
  491.         if  (tempInputString.compare(tempString)==0)
  492.         {
  493.             //cout << j << " ";
  494.             retInt =  j;
  495.             break;
  496.         }
  497.     }
  498.     //cout << endl;
  499.  
  500.     return retInt;
  501.  
  502. }
  503.  
  504.  
  505. //몬스터 프로토도 읽는다.
  506.  
  507.  
  508. int get_Mob_Rank_Value(string inputString)
  509. {
  510.     string arRank[] = {"PAWN", "S_PAWN", "KNIGHT", "S_KNIGHT", "BOSS", "KING"};
  511.  
  512.     int retInt = -1;
  513.     //cout << "Rank : " << rankStr << " -> ";
  514.     for (int j=0;j<sizeof(arRank)/sizeof(arRank[0]);j++) {
  515.         string tempString = arRank[j];
  516.         string tempInputString = trim(inputString);
  517.         if  (tempInputString.compare(tempString)==0)
  518.         {
  519.             //cout << j << " ";
  520.             retInt =  j;
  521.             break;
  522.         }
  523.     }
  524.     //cout << endl;
  525.  
  526.     return retInt;
  527. }
  528.  
  529.  
  530. int get_Mob_Type_Value(string inputString)
  531. {
  532.     string arType[] = { "MONSTER", "NPC", "STONE", "WARP", "DOOR", "BUILDING", "PC", "POLYMORPH_PC", "HORSE", "GOTO"};
  533.  
  534.     int retInt = -1;
  535.     //cout << "Type : " << typeStr << " -> ";
  536.     for (int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) {
  537.         string tempString = arType[j];
  538.         string tempInputString = trim(inputString);
  539.         if  (tempInputString.compare(tempString)==0)
  540.         {
  541.             //cout << j << " ";
  542.             retInt =  j;
  543.             break;
  544.         }
  545.     }
  546.     //cout << endl;
  547.  
  548.     return retInt;
  549. }
  550.  
  551. int get_Mob_BattleType_Value(string inputString)
  552. {
  553.     string arBattleType[] = { "MELEE", "RANGE", "MAGIC", "SPECIAL", "POWER", "TANKER", "SUPER_POWER", "SUPER_TANKER"};
  554.  
  555.     int retInt = -1;
  556.     //cout << "Battle Type : " << battleTypeStr << " -> ";
  557.     for (int j=0;j<sizeof(arBattleType)/sizeof(arBattleType[0]);j++) {
  558.         string tempString = arBattleType[j];
  559.         string tempInputString = trim(inputString);
  560.         if  (tempInputString.compare(tempString)==0)
  561.         {
  562.             //cout << j << " ";
  563.             retInt =  j;
  564.             break;
  565.         }
  566.     }
  567.     //cout << endl;
  568.  
  569.     return retInt;
  570. }
  571.  
  572. int get_Mob_Size_Value(string inputString)
  573. {
  574.     string arSize[] = { "SAMLL", "MEDIUM", "BIG"};
  575.  
  576.     int retInt = 0;
  577.     //cout << "Size : " << sizeStr << " -> ";
  578.     for (int j=0;j<sizeof(arSize)/sizeof(arSize[0]);j++) {
  579.         string tempString = arSize[j];
  580.         string tempInputString = trim(inputString);
  581.         if  (tempInputString.compare(tempString)==0)
  582.         {
  583.             //cout << j << " ";
  584.             retInt =  j + 1;
  585.             break;
  586.         }
  587.     }
  588.     //cout << endl;
  589.  
  590.     return retInt;
  591. }
  592.  
  593. int get_Mob_AIFlag_Value(string inputString)
  594. {
  595.     string arAIFlag[] = {"AGGR","NOMOVE","COWARD","NOATTSHINSU","NOATTCHUNJO","NOATTJINNO","ATTMOB","BERSERK","STONESKIN","GODSPEED","DEATHBLOW","REVIVE"};
  596.  
  597.  
  598.     int retValue = 0;
  599.     string* arInputString = StringSplit(inputString, ",");              //프로토 정보 내용을 단어별로 쪼갠 배열.
  600.     for(int i =0;i<sizeof(arAIFlag)/sizeof(arAIFlag[0]);i++) {
  601.         string tempString = arAIFlag[i];
  602.         for (int j=0; j<30 ; j++)       //최대 30개 단어까지. (하드코딩)
  603.         {
  604.             string tempString2 = arInputString[j];
  605.             if (tempString2.compare(tempString)==0) {               //일치하는지 확인.
  606.                 retValue = retValue + pow((float)2,(float)i);
  607.             }
  608.            
  609.             if(tempString2.compare("") == 0)
  610.                 break;
  611.         }
  612.     }
  613.     delete []arInputString;
  614.     //cout << "AIFlag : " << aiFlagStr << " -> " << retValue << endl;
  615.  
  616.     return retValue;
  617. }
  618. int get_Mob_RaceFlag_Value(string inputString)
  619. {
  620.     string arRaceFlag[] = {"ANIMAL","UNDEAD","DEVIL","HUMAN","ORC","MILGYO","INSECT","FIRE","ICE","DESERT","TREE",
  621.         "ATT_ELEC","ATT_FIRE","ATT_ICE","ATT_WIND","ATT_EARTH","ATT_DARK"};
  622.  
  623.     int retValue = 0;
  624.     string* arInputString = StringSplit(inputString, ",");              //프로토 정보 내용을 단어별로 쪼갠 배열.
  625.     for(int i =0;i<sizeof(arRaceFlag)/sizeof(arRaceFlag[0]);i++) {
  626.         string tempString = arRaceFlag[i];
  627.         for (int j=0; j<30 ; j++)       //최대 30개 단어까지. (하드코딩)
  628.         {
  629.             string tempString2 = arInputString[j];
  630.             if (tempString2.compare(tempString)==0) {               //일치하는지 확인.
  631.                 retValue = retValue + pow((float)2,(float)i);
  632.             }
  633.            
  634.             if(tempString2.compare("") == 0)
  635.                 break;
  636.         }
  637.     }
  638.     delete []arInputString;
  639.     //cout << "Race Flag : " << raceFlagStr << " -> " << retValue << endl;
  640.  
  641.     return retValue;
  642. }
  643. int get_Mob_ImmuneFlag_Value(string inputString)
  644. {
  645.     string arImmuneFlag[] = {"STUN","SLOW","FALL","CURSE","POISON","TERROR", "REFLECT"};
  646.  
  647.     int retValue = 0;
  648.     string* arInputString = StringSplit(inputString, ",");              //프로토 정보 내용을 단어별로 쪼갠 배열.
  649.     for(int i =0;i<sizeof(arImmuneFlag)/sizeof(arImmuneFlag[0]);i++) {
  650.         string tempString = arImmuneFlag[i];
  651.         for (int j=0; j<30 ; j++)       //최대 30개 단어까지. (하드코딩)
  652.         {
  653.             string tempString2 = arInputString[j];
  654.             if (tempString2.compare(tempString)==0) {               //일치하는지 확인.
  655.                 retValue = retValue + pow((float)2,(float)i);
  656.             }
  657.            
  658.             if(tempString2.compare("") == 0)
  659.                 break;
  660.         }
  661.     }
  662.     delete []arInputString;
  663.     //cout << "Immune Flag : " << immuneFlagStr << " -> " << retValue << endl;
  664.  
  665.  
  666.     return retValue;
  667. }
  668.  
  669. //몹 테이블을 셋팅해준다.
  670. bool Set_Proto_Mob_Table(TMobTable *mobTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
  671. {
  672.     int col = 0;
  673.     str_to_number(mobTable->dwVnum, csvTable.AsStringByIndex(col++));
  674.     strlcpy(mobTable->szName, csvTable.AsStringByIndex(col++), sizeof(mobTable->szName));
  675.  
  676.     //3. 지역별 이름 넣어주기.
  677.     map<int,const char*>::iterator it;
  678.     it = nameMap.find(mobTable->dwVnum);
  679.     if (it != nameMap.end()) {
  680.         const char * localeName = it->second;
  681.         strlcpy(mobTable->szLocaleName, localeName, sizeof (mobTable->szLocaleName));
  682.     } else {
  683.         strlcpy(mobTable->szLocaleName, mobTable->szName, sizeof (mobTable->szLocaleName));
  684.     }
  685.  
  686.     //RANK
  687.     int rankValue = get_Mob_Rank_Value(csvTable.AsStringByIndex(col++));
  688.     mobTable->bRank = rankValue;
  689.     //TYPE
  690.     int typeValue = get_Mob_Type_Value(csvTable.AsStringByIndex(col++));
  691.     mobTable->bType = typeValue;
  692.     //BATTLE_TYPE
  693.     int battleTypeValue = get_Mob_BattleType_Value(csvTable.AsStringByIndex(col++));
  694.     mobTable->bBattleType = battleTypeValue;
  695.  
  696.     str_to_number(mobTable->bLevel, csvTable.AsStringByIndex(col++));
  697.     //SIZE
  698.     int sizeValue = get_Mob_Size_Value(csvTable.AsStringByIndex(col++));
  699.     mobTable->bSize = sizeValue;
  700.     //AI_FLAG
  701.     int aiFlagValue = get_Mob_AIFlag_Value(csvTable.AsStringByIndex(col++));
  702.     mobTable->dwAIFlag = aiFlagValue;
  703.     //mount_capacity;
  704.     col++;
  705.     //RACE_FLAG
  706.     int raceFlagValue = get_Mob_RaceFlag_Value(csvTable.AsStringByIndex(col++));
  707.     mobTable->dwRaceFlag = raceFlagValue;
  708.     //IMMUNE_FLAG
  709.     int immuneFlagValue = get_Mob_ImmuneFlag_Value(csvTable.AsStringByIndex(col++));
  710.     mobTable->dwImmuneFlag = immuneFlagValue;
  711.  
  712.     str_to_number(mobTable->bEmpire, csvTable.AsStringByIndex(col++));  //col = 11
  713.  
  714.     strlcpy(mobTable->szFolder, csvTable.AsStringByIndex(col++), sizeof(mobTable->szFolder));
  715.  
  716.     str_to_number(mobTable->bOnClickType, csvTable.AsStringByIndex(col++));
  717.  
  718.     str_to_number(mobTable->bStr, csvTable.AsStringByIndex(col++));
  719.     str_to_number(mobTable->bDex, csvTable.AsStringByIndex(col++));
  720.     str_to_number(mobTable->bCon, csvTable.AsStringByIndex(col++));
  721.     str_to_number(mobTable->bInt, csvTable.AsStringByIndex(col++));
  722.     str_to_number(mobTable->dwDamageRange[0], csvTable.AsStringByIndex(col++));
  723.     str_to_number(mobTable->dwDamageRange[1], csvTable.AsStringByIndex(col++));
  724.     str_to_number(mobTable->dwMaxHP, csvTable.AsStringByIndex(col++));
  725.     str_to_number(mobTable->bRegenCycle, csvTable.AsStringByIndex(col++));
  726.     str_to_number(mobTable->bRegenPercent,  csvTable.AsStringByIndex(col++));
  727.     str_to_number(mobTable->dwGoldMin, csvTable.AsStringByIndex(col++));
  728.     str_to_number(mobTable->dwGoldMax, csvTable.AsStringByIndex(col++));
  729.     str_to_number(mobTable->dwExp,  csvTable.AsStringByIndex(col++));
  730.     str_to_number(mobTable->wDef, csvTable.AsStringByIndex(col++));
  731.     str_to_number(mobTable->sAttackSpeed, csvTable.AsStringByIndex(col++));
  732.     str_to_number(mobTable->sMovingSpeed, csvTable.AsStringByIndex(col++));
  733.     str_to_number(mobTable->bAggresiveHPPct, csvTable.AsStringByIndex(col++));
  734.     str_to_number(mobTable->wAggressiveSight, csvTable.AsStringByIndex(col++));
  735.     str_to_number(mobTable->wAttackRange, csvTable.AsStringByIndex(col++));
  736.  
  737.     str_to_number(mobTable->dwDropItemVnum, csvTable.AsStringByIndex(col++));   //32
  738.     str_to_number(mobTable->dwResurrectionVnum, csvTable.AsStringByIndex(col++));
  739.     for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
  740.         str_to_number(mobTable->cEnchants[i], csvTable.AsStringByIndex(col++));
  741.  
  742.     for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
  743.         str_to_number(mobTable->cResists[i], csvTable.AsStringByIndex(col++));
  744.  
  745.     str_to_number(mobTable->fDamMultiply, csvTable.AsStringByIndex(col++));
  746.     str_to_number(mobTable->dwSummonVnum, csvTable.AsStringByIndex(col++));
  747.     str_to_number(mobTable->dwDrainSP, csvTable.AsStringByIndex(col++));
  748.  
  749.     //Mob_Color
  750.     ++col;
  751.  
  752.     str_to_number(mobTable->dwPolymorphItemVnum, csvTable.AsStringByIndex(col++));
  753.  
  754.     str_to_number(mobTable->Skills[0].bLevel, csvTable.AsStringByIndex(col++));
  755.     str_to_number(mobTable->Skills[0].dwVnum, csvTable.AsStringByIndex(col++));
  756.     str_to_number(mobTable->Skills[1].bLevel, csvTable.AsStringByIndex(col++));
  757.     str_to_number(mobTable->Skills[1].dwVnum, csvTable.AsStringByIndex(col++));
  758.     str_to_number(mobTable->Skills[2].bLevel, csvTable.AsStringByIndex(col++));
  759.     str_to_number(mobTable->Skills[2].dwVnum, csvTable.AsStringByIndex(col++));
  760.     str_to_number(mobTable->Skills[3].bLevel, csvTable.AsStringByIndex(col++));
  761.     str_to_number(mobTable->Skills[3].dwVnum, csvTable.AsStringByIndex(col++));
  762.     str_to_number(mobTable->Skills[4].bLevel, csvTable.AsStringByIndex(col++));
  763.     str_to_number(mobTable->Skills[4].dwVnum, csvTable.AsStringByIndex(col++));
  764.  
  765.     str_to_number(mobTable->bBerserkPoint, csvTable.AsStringByIndex(col++));
  766.     str_to_number(mobTable->bStoneSkinPoint, csvTable.AsStringByIndex(col++));
  767.     str_to_number(mobTable->bGodSpeedPoint, csvTable.AsStringByIndex(col++));
  768.     str_to_number(mobTable->bDeathBlowPoint, csvTable.AsStringByIndex(col++));
  769.     str_to_number(mobTable->bRevivePoint, csvTable.AsStringByIndex(col++));
  770.  
  771.     sys_log(0, "MOB #%-5d %-24s level: %-3u rank: %u empire: %d", mobTable->dwVnum, mobTable->szLocaleName, mobTable->bLevel, mobTable->bRank, mobTable->bEmpire);
  772.  
  773.     return true;
  774. }
  775.  
  776. bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
  777. {
  778.     int col = 0;
  779.  
  780. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  781.     int dataArray[35];
  782. #else
  783.     int dataArray[33];
  784. #endif
  785.     for (int i=0; i<sizeof(dataArray)/sizeof(dataArray[0]);i++) {
  786.         int validCheck = 0;
  787.         if (i==2) {
  788.             dataArray[i] = get_Item_Type_Value(csvTable.AsStringByIndex(col));
  789.             validCheck = dataArray[i];
  790.         } else if (i==3) {
  791.             dataArray[i] = get_Item_SubType_Value(dataArray[i-1], csvTable.AsStringByIndex(col));
  792.             validCheck = dataArray[i];
  793.         } else if (i==5) {
  794.             dataArray[i] = get_Item_AntiFlag_Value(csvTable.AsStringByIndex(col));
  795.             validCheck = dataArray[i];
  796.         } else if (i==6) {
  797.             dataArray[i] = get_Item_Flag_Value(csvTable.AsStringByIndex(col));
  798.             validCheck = dataArray[i];
  799.         } else if (i==7) {
  800.             dataArray[i] = get_Item_WearFlag_Value(csvTable.AsStringByIndex(col));
  801.             validCheck = dataArray[i];
  802.         } else if (i==8) {
  803.             dataArray[i] = get_Item_Immune_Value(csvTable.AsStringByIndex(col));
  804.             validCheck = dataArray[i];
  805.         } else if (i==14) {
  806.             dataArray[i] = get_Item_LimitType_Value(csvTable.AsStringByIndex(col));
  807.             validCheck = dataArray[i];
  808.         } else if (i==16) {
  809.             dataArray[i] = get_Item_LimitType_Value(csvTable.AsStringByIndex(col));
  810.             validCheck = dataArray[i];
  811.         } else if (i==18) {
  812.             dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
  813.             validCheck = dataArray[i];
  814.         } else if (i==20) {
  815.             dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
  816.             validCheck = dataArray[i];
  817.         } else if (i==22) {
  818.             dataArray[i] = get_Item_ApplyType_Value(csvTable.AsStringByIndex(col));
  819.             validCheck = dataArray[i];
  820.         }
  821. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  822.         else if (i==33) {
  823.             dataArray[i] = get_Item_Mask_Type_Value(csvTable.AsStringByIndex(col));
  824.             validCheck = dataArray[i];
  825.         } else if (i==34) {
  826.             dataArray[i] = get_Item_Mask_SubType_Value(dataArray[i-1], csvTable.AsStringByIndex(col));
  827.             validCheck = dataArray[i];
  828.         }
  829. #endif
  830.           else {
  831.             str_to_number(dataArray[i], csvTable.AsStringByIndex(col));
  832.         }
  833.  
  834.         if (validCheck == -1)
  835.         {
  836.             std::ostringstream dataStream;
  837.  
  838.             for (int j = 0; j < i; ++j)
  839.                 dataStream << dataArray[j] << ",";
  840.  
  841.             //fprintf(stderr, "ItemProto Reading Failed : Invalid value.\n");
  842.             sys_err("ItemProto Reading Failed : Invalid value. (index: %d, col: %d, value: %s)", i, col, csvTable.AsStringByIndex(col));
  843.             sys_err("\t%d ~ %d Values: %s", 0, i, dataStream.str().c_str());
  844.  
  845.             exit(0);
  846.         }
  847.        
  848.         col = col + 1;
  849.     }
  850.  
  851.     // vnum 및 vnum range 읽기.
  852.     {
  853.         std::string s(csvTable.AsStringByIndex(0));
  854.         int pos = s.find("~");
  855.         // vnum 필드에 '~'가 없다면 패스
  856.         if (std::string::npos == pos)
  857.         {
  858.             itemTable->dwVnum = dataArray[0];
  859.             itemTable->dwVnumRange = 0;
  860.         }
  861.         else
  862.         {
  863.             std::string s_start_vnum (s.substr(0, pos));
  864.             std::string s_end_vnum (s.substr(pos +1 ));
  865.  
  866.             int start_vnum = atoi(s_start_vnum.c_str());
  867.             int end_vnum = atoi(s_end_vnum.c_str());
  868.             if (0 == start_vnum || (0 != end_vnum && end_vnum < start_vnum))
  869.             {
  870.                 sys_err ("INVALID VNUM %s", s.c_str());
  871.                 return false;
  872.             }
  873.             itemTable->dwVnum = start_vnum;
  874.             itemTable->dwVnumRange = end_vnum - start_vnum;
  875.         }
  876.     }
  877.  
  878.     strlcpy(itemTable->szName, csvTable.AsStringByIndex(1), sizeof(itemTable->szName));
  879.     //지역별 이름 넣어주기.
  880.     map<int,const char*>::iterator it;
  881.     it = nameMap.find(itemTable->dwVnum);
  882.     if (it != nameMap.end()) {
  883.         const char * localeName = it->second;
  884.         strlcpy(itemTable->szLocaleName, localeName, sizeof (itemTable->szLocaleName));
  885.     } else {
  886.         strlcpy(itemTable->szLocaleName, itemTable->szName, sizeof (itemTable->szLocaleName));
  887.     }
  888.     itemTable->bType = dataArray[2];
  889.     itemTable->bSubType = dataArray[3];
  890.     itemTable->bSize = dataArray[4];
  891.     itemTable->dwAntiFlags = dataArray[5];
  892.     itemTable->dwFlags = dataArray[6];
  893.     itemTable->dwWearFlags = dataArray[7];
  894.     itemTable->dwImmuneFlag = dataArray[8];
  895.     itemTable->dwGold = dataArray[9];
  896.     itemTable->dwShopBuyPrice = dataArray[10];
  897.     itemTable->dwRefinedVnum = dataArray[11];
  898.     itemTable->wRefineSet = dataArray[12];
  899.     itemTable->bAlterToMagicItemPct = dataArray[13];
  900.     itemTable->cLimitRealTimeFirstUseIndex = -1;
  901.     itemTable->cLimitTimerBasedOnWearIndex = -1;
  902.  
  903.     int i;
  904.  
  905.     for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
  906.     {
  907.         itemTable->aLimits[i].bType = dataArray[14+i*2];
  908.         itemTable->aLimits[i].lValue = dataArray[15+i*2];
  909.  
  910.         if (LIMIT_REAL_TIME_START_FIRST_USE == itemTable->aLimits[i].bType)
  911.             itemTable->cLimitRealTimeFirstUseIndex = (char)i;
  912.  
  913.         if (LIMIT_TIMER_BASED_ON_WEAR == itemTable->aLimits[i].bType)
  914.             itemTable->cLimitTimerBasedOnWearIndex = (char)i;
  915.  
  916.     }
  917.  
  918.     for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
  919.     {
  920.         itemTable->aApplies[i].bType = dataArray[18+i*2];
  921.         itemTable->aApplies[i].lValue = dataArray[19+i*2];
  922.     }
  923.  
  924.     for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
  925.         itemTable->alValues[i] = dataArray[24+i];
  926.  
  927.     //column for 'Specular'
  928.     itemTable->bGainSocketPct = dataArray[31];
  929.     itemTable->sAddonType = dataArray[32];
  930. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  931.     itemTable->bMaskType = dataArray[33];
  932.     itemTable->bMaskSubType = dataArray[34];
  933. #endif
  934.  
  935.     //test
  936.     str_to_number(itemTable->bWeight, "0");
  937.            
  938.     return true;
  939.    
  940. #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT
  941. int get_Item_Mask_Type_Value(string inputString)
  942. {
  943.     string arMaskType[] = {
  944.         "MASK_ITEM_TYPE_NONE",
  945.         "MASK_ITEM_TYPE_MOUNT_PET",
  946.         "MASK_ITEM_TYPE_EQUIPMENT_WEAPON",
  947.         "MASK_ITEM_TYPE_EQUIPMENT_ARMOR",
  948.         "MASK_ITEM_TYPE_EQUIPMENT_JEWELRY",
  949.         "MASK_ITEM_TYPE_TUNING",
  950.         "MASK_ITEM_TYPE_POTION",
  951.         "MASK_ITEM_TYPE_FISHING_PICK",
  952.         "MASK_ITEM_TYPE_DRAGON_STONE",
  953.         "MASK_ITEM_TYPE_COSTUMES",
  954.         "MASK_ITEM_TYPE_SKILL",
  955.         "MASK_ITEM_TYPE_UNIQUE",
  956.         "MASK_ITEM_TYPE_ETC",
  957.         "MASK_ITEM_TYPE_MAX"
  958.     };
  959.  
  960.     int retInt = -1;
  961.     for (unsigned int j=0;j<sizeof(arMaskType)/sizeof(arMaskType[0]);j++) {
  962.         string tempString = arMaskType[j];
  963.         if  (inputString.find(tempString)!=string::npos && tempString.find(inputString)!=string::npos) {
  964.             retInt =  j;
  965.             break;
  966.         }
  967.     }
  968.     return retInt;
  969.  
  970. }
  971.  
  972. int get_Item_Mask_SubType_Value(int type_value, string inputString)
  973. {
  974.     static string arMaskSub1[] = {
  975.         "MASK_ITEM_SUBTYPE_MOUNT_PET_MOUNT",
  976.         "MASK_ITEM_SUBTYPE_MOUNT_PET_CHARGED_PET",
  977.         "MASK_ITEM_SUBTYPE_MOUNT_PET_FREE_PET",
  978.         "MASK_ITEM_SUBTYPE_MOUNT_PET_EGG"
  979.     };
  980.     static string arMaskSub2[] = {
  981.         "MASK_ITEM_SUBTYPE_WEAPON_WEAPON_SWORD",
  982.         "MASK_ITEM_SUBTYPE_WEAPON_WEAPON_DAGGER",
  983.         "MASK_ITEM_SUBTYPE_WEAPON_WEAPON_BOW",
  984.         "MASK_ITEM_SUBTYPE_WEAPON_WEAPON_TWO_HANDED",
  985.         "MASK_ITEM_SUBTYPE_WEAPON_WEAPON_BELL",
  986.         "MASK_ITEM_SUBTYPE_WEAPON_WEAPON_CLAW",
  987.         "MASK_ITEM_SUBTYPE_WEAPON_WEAPON_FAN",
  988.         "MASK_ITEM_SUBTYPE_WEAPON_WEAPON_MOUNT_SPEAR",
  989.         "MASK_ITEM_SUBTYPE_WEAPON_WEAPON_ARROW",
  990.         "MASK_ITEM_SUBTYPE_WEAPON_WEAPON_QUIVER"
  991.     };
  992.     static string arMaskSub3[] = {
  993.         "MASK_ITEM_SUBTYPE_ARMOR_ARMOR_BODY",
  994.         "MASK_ITEM_SUBTYPE_ARMOR_ARMOR_HEAD",
  995.         "MASK_ITEM_SUBTYPE_ARMOR_ARMOR_SHIELD"
  996.     };
  997.     static string arMaskSub4[] = {
  998.         "MASK_ITEM_SUBTYPE_JEWELRY_ARMOR_WRIST",
  999.         "MASK_ITEM_SUBTYPE_JEWELRY_ARMOR_FOOTS",
  1000.         "MASK_ITEM_SUBTYPE_JEWELRY_ARMOR_NECK",
  1001.         "MASK_ITEM_SUBTYPE_JEWELRY_ARMOR_EAR",
  1002.         "MASK_ITEM_SUBTYPE_JEWELRY_ITEM_BELT"
  1003.     };
  1004.     static string arMaskSub5[] = {
  1005.         "MASK_ITEM_SUBTYPE_TUNING_RESOURCE",
  1006.         "MASK_ITEM_SUBTYPE_TUNING_STONE",
  1007.         "MASK_ITEM_SUBTYPE_TUNING_ETC"
  1008.     };
  1009.     static string arMaskSub6[] = {
  1010.         "MASK_ITEM_SUBTYPE_POTION_ABILITY",
  1011.         "MASK_ITEM_SUBTYPE_POTION_HAIRDYE",
  1012.         "MASK_ITEM_SUBTYPE_POTION_ETC"
  1013.     };
  1014.     static string arMaskSub7[] = {
  1015.         "MASK_ITEM_SUBTYPE_FISHING_PICK_FISHING_POLE",
  1016.         "MASK_ITEM_SUBTYPE_FISHING_PICK_EQUIPMENT_PICK",
  1017.         "MASK_ITEM_SUBTYPE_FISHING_PICK_FOOD",
  1018.         "MASK_ITEM_SUBTYPE_FISHING_PICK_STONE",
  1019.         "MASK_ITEM_SUBTYPE_FISHING_PICK_ETC"
  1020.     };
  1021.     static string arMaskSub8[] = {
  1022.         "MASK_ITEM_SUBTYPE_DRAGON_STONE_DRAGON_DIAMOND",
  1023.         "MASK_ITEM_SUBTYPE_DRAGON_STONE_DRAGON_RUBY",
  1024.         "MASK_ITEM_SUBTYPE_DRAGON_STONE_DRAGON_JADE",
  1025.         "MASK_ITEM_SUBTYPE_DRAGON_STONE_DRAGON_SAPPHIRE",
  1026.         "MASK_ITEM_SUBTYPE_DRAGON_STONE_DRAGON_GARNET",
  1027.         "MASK_ITEM_SUBTYPE_DRAGON_STONE_DRAGON_ONYX",
  1028.         "MASK_ITEM_SUBTYPE_DRAGON_STONE_ETC"
  1029.     };
  1030.     static string arMaskSub9[] = {
  1031.         "MASK_ITEM_SUBTYPE_COSTUMES_COSTUME_WEAPON",
  1032.         "MASK_ITEM_SUBTYPE_COSTUMES_COSTUME_BODY",
  1033.         "MASK_ITEM_SUBTYPE_COSTUMES_COSTUME_HAIR",
  1034.         "MASK_ITEM_SUBTYPE_COSTUMES_SASH",
  1035.         "MASK_ITEM_SUBTYPE_COSTUMES_ETC"
  1036.     };
  1037.     static string arMaskSub10[] = {
  1038.         "MASK_ITEM_SUBTYPE_SKILL_PAHAE",
  1039.         "MASK_ITEM_SUBTYPE_SKILL_SKILL_BOOK",
  1040.         "MASK_ITEM_SUBTYPE_SKILL_BOOK_OF_OBLIVION",
  1041.         "MASK_ITEM_SUBTYPE_SKILL_ETC"
  1042.     };
  1043.     static string arMaskSub11[] = {
  1044.         "MASK_ITEM_SUBTYPE_UNIQUE_ABILITY",
  1045.         "MASK_ITEM_SUBTYPE_UNIQUE_ETC"
  1046.  
  1047.     };
  1048.     static string arMaskSub12[] = {
  1049.         "MASK_ITEM_SUBTYPE_ETC_GIFTBOX",
  1050.         "MASK_ITEM_SUBTYPE_ETC_MATRIMORY",
  1051.         "MASK_ITEM_SUBTYPE_ETC_EVENT",
  1052.         "MASK_ITEM_SUBTYPE_ETC_SEAL",
  1053.         "MASK_ITEM_SUBTYPE_ETC_PARTI",
  1054.         "MASK_ITEM_SUBTYPE_ETC_POLYMORPH",
  1055.         "MASK_ITEM_SUBTYPE_ETC_RECIPE",
  1056.         "MASK_ITEM_SUBTYPE_ETC_ETC"
  1057.     };
  1058.    
  1059.     static string* arMaskSubType[] = {
  1060.         0,          //0
  1061.         arMaskSub1,     //1
  1062.         arMaskSub2,     //2
  1063.         arMaskSub3,     //3
  1064.         arMaskSub4,     //4
  1065.         arMaskSub5,     //5
  1066.         arMaskSub6,     //6
  1067.         arMaskSub7,     //7
  1068.         arMaskSub8,     //8
  1069.         arMaskSub9,     //9
  1070.         arMaskSub10,    //10
  1071.         arMaskSub11,    //11
  1072.         arMaskSub12,    //12
  1073.         0,          //13
  1074.     };
  1075.    
  1076.     static int arNumberOfSubtype[_countof(arMaskSubType)] = {
  1077.         0,
  1078.         sizeof(arMaskSub1)/sizeof(arMaskSub1[0]),
  1079.         sizeof(arMaskSub2)/sizeof(arMaskSub2[0]),
  1080.         sizeof(arMaskSub3)/sizeof(arMaskSub3[0]),
  1081.         sizeof(arMaskSub4)/sizeof(arMaskSub4[0]),
  1082.         sizeof(arMaskSub5)/sizeof(arMaskSub5[0]),
  1083.         sizeof(arMaskSub6)/sizeof(arMaskSub6[0]),
  1084.         sizeof(arMaskSub7)/sizeof(arMaskSub7[0]),
  1085.         sizeof(arMaskSub8)/sizeof(arMaskSub8[0]),
  1086.         sizeof(arMaskSub9)/sizeof(arMaskSub9[0]),
  1087.         sizeof(arMaskSub10)/sizeof(arMaskSub10[0]),
  1088.         sizeof(arMaskSub11)/sizeof(arMaskSub11[0]),
  1089.         sizeof(arMaskSub12)/sizeof(arMaskSub12[0]),
  1090.         0,
  1091.     };
  1092.  
  1093.     assert(static_cast<long>(_countof(arMaskSubType)) > type_value && "Subtype rule: Out of range!!");
  1094.     if (static_cast<long>(_countof(arMaskSubType)) <= type_value)
  1095.     {
  1096.         sys_err("MaskSubType : Out of range!! (type_value: %d, count of registered masksubtype: %d", type_value, _countof(arMaskSubType));
  1097.         return -1;
  1098.     }
  1099.  
  1100.     if (arMaskSubType[type_value] == 0)
  1101.     {
  1102.         return 0;
  1103.     }
  1104.  
  1105.     int retInt = -1;
  1106.     for (int j=0;j<arNumberOfSubtype[type_value];j++)
  1107.     {
  1108.         string tempString = arMaskSubType[type_value][j];
  1109.         string tempInputString = trim(inputString);
  1110.         if  (tempInputString.compare(tempString) == 0)
  1111.         {
  1112.             retInt =  j;
  1113.             break;
  1114.         }
  1115.     }
  1116.  
  1117.     return retInt;
  1118. }
  1119. #endif
  1120.    
  1121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement