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

Protoreader.cpp