#include "ItemCSVReader.h" #include #include #include #include #include #define ENABLE_WRITE_DEBUG #define ENABLE_NUMERIC_FIELD #ifdef ENABLE_NUMERIC_FIELD bool _IsNumericString(const std::string& trimInputString) { if (trimInputString.empty()) return false; bool isNumber = true; for (auto& c : trimInputString) { if (!std::isdigit(c) && c != '-' && c != '+') { isNumber = false; break; } } return isNumber; } #endif #ifdef ENABLE_WRITE_DEBUG bool bDebugFlag = false; void writeDebug(const char* szMsg, int iInput, int type_value) { static char __buf[512]; static FILE * f1 = NULL; if (NULL == f1) fopen_s(&f1, "debug.log", "a+"); if (type_value) _snprintf(__buf, sizeof(__buf), "ERROR: (%d->%d) %s\n", type_value, iInput, szMsg); else _snprintf(__buf, sizeof(__buf), "ERROR: (%d) %s\n", iInput, szMsg); fwrite(__buf, sizeof(char), strlen(__buf), f1); } #endif using namespace std; inline string trim_left(const string& str) { string::size_type n = str.find_first_not_of(" \t\v\n\r"); return n == string::npos ? str : str.substr(n, str.length()); } inline string trim_right(const string& str) { string::size_type n = str.find_last_not_of(" \t\v\n\r"); return n == string::npos ? str : str.substr(0, n + 1); } string trim(const string& str){return trim_left(trim_right(str));} static string* StringSplit(string strOrigin, string strTok) { int cutAt; int index = 0; string* strResult = new string[30]; while ((cutAt = strOrigin.find_first_of(strTok)) != strOrigin.npos) { if (cutAt > 0) { strResult[index++] = strOrigin.substr(0, cutAt); } strOrigin = strOrigin.substr(cutAt+1); } if(strOrigin.length() > 0) { strResult[index++] = strOrigin.substr(0, cutAt); } for( int i=0;i arItemType = { "ITEM_NONE", "ITEM_WEAPON", "ITEM_ARMOR", "ITEM_USE", "ITEM_AUTOUSE", "ITEM_MATERIAL", "ITEM_SPECIAL", "ITEM_TOOL", "ITEM_LOTTERY", "ITEM_ELK", "ITEM_METIN", "ITEM_CONTAINER", "ITEM_FISH", "ITEM_ROD", "ITEM_RESOURCE", "ITEM_CAMPFIRE", "ITEM_UNIQUE", "ITEM_SKILLBOOK", "ITEM_QUEST", "ITEM_POLYMORPH", "ITEM_TREASURE_BOX", "ITEM_TREASURE_KEY", "ITEM_SKILLFORGET", "ITEM_GIFTBOX", "ITEM_PICK", "ITEM_HAIR", "ITEM_TOTEM", "ITEM_BLEND", "ITEM_COSTUME", "ITEM_DS", "ITEM_SPECIAL_DS", "ITEM_EXTRACT", "ITEM_SECONDARY_COIN", "ITEM_RING", "ITEM_BELT", "ITEM_PET", "ITEM_MEDIUM", // 35,36 "ITEM_GACHA", "ITEM_SOUL" // 37,38 "ITEM_PASSIVE" // 39 }; int get_Item_Type_Value(std::string inputString) { #ifdef ENABLE_NUMERIC_FIELD if (_IsNumericString(inputString)) return std::stoi(inputString); #endif auto it = std::find(std::begin(arItemType), std::end(arItemType), inputString); if (it == std::end(arItemType)) return -1; return std::distance(std::begin(arItemType), it); } std::string set_Item_Type_Value(int iInput) // enum -1=None { if (iInput==(uint8_t)-1 || iInput < 0) return "NONE"; try { return arItemType.at(iInput); } catch (...) { #ifdef ENABLE_WRITE_DEBUG if (bDebugFlag) writeDebug("Item Type not found", iInput); #endif #ifdef ENABLE_NUMERIC_FIELD return std::to_string(iInput); #endif } return ""; } static const std::unordered_map> mapItemSubType { {1, { "WEAPON_SWORD", "WEAPON_DAGGER", "WEAPON_BOW", "WEAPON_TWO_HANDED", "WEAPON_BELL", "WEAPON_FAN", "WEAPON_ARROW", "WEAPON_MOUNT_SPEAR", "WEAPON_CLAW", "WEAPON_QUIVER", "WEAPON_BOUQUET"}}, {2, { "ARMOR_BODY", "ARMOR_HEAD", "ARMOR_SHIELD", "ARMOR_WRIST", "ARMOR_FOOTS", "ARMOR_NECK", "ARMOR_EAR", "ARMOR_PENDANT", "ARMOR_GLOVE", "ARMOR_NUM_TYPES"}}, {3, { "USE_POTION", "USE_TALISMAN", "USE_TUNING", "USE_MOVE", "USE_TREASURE_BOX", "USE_MONEYBAG", "USE_BAIT", "USE_ABILITY_UP", "USE_AFFECT", "USE_CREATE_STONE", "USE_SPECIAL", "USE_POTION_NODELAY", "USE_CLEAR", "USE_INVISIBILITY", "USE_DETACHMENT", "USE_BUCKET", "USE_POTION_CONTINUE", "USE_CLEAN_SOCKET", "USE_CHANGE_ATTRIBUTE", "USE_ADD_ATTRIBUTE", "USE_ADD_ACCESSORY_SOCKET", "USE_PUT_INTO_ACCESSORY_SOCKET", "USE_ADD_ATTRIBUTE2", "USE_RECIPE", "USE_CHANGE_ATTRIBUTE2", "USE_BIND", "USE_UNBIND", "USE_TIME_CHARGE_PER", "USE_TIME_CHARGE_FIX", "USE_PUT_INTO_BELT_SOCKET", "USE_PUT_INTO_RING_SOCKET", "USE_CHANGE_COSTUME_ATTR", "USE_RESET_COSTUME_ATTR", "USE_UNK33", "USE_CHANGE_ATTRIBUTE_PLUS"}}, {4, { "AUTOUSE_POTION", "AUTOUSE_ABILITY_UP", "AUTOUSE_BOMB", "AUTOUSE_GOLD", "AUTOUSE_MONEYBAG", "AUTOUSE_TREASURE_BOX"}}, {5, { "MATERIAL_LEATHER", "MATERIAL_BLOOD", "MATERIAL_ROOT", "MATERIAL_NEEDLE", "MATERIAL_JEWEL", "MATERIAL_DS_REFINE_NORMAL", "MATERIAL_DS_REFINE_BLESSED", "MATERIAL_DS_REFINE_HOLLY"}}, {6, { "SPECIAL_MAP", "SPECIAL_KEY", "SPECIAL_DOC", "SPECIAL_SPIRIT"}}, {7, { "TOOL_FISHING_ROD"}}, {8, { "LOTTERY_TICKET", "LOTTERY_INSTANT"}}, {10, { "METIN_NORMAL", "METIN_GOLD"}}, {12, { "FISH_ALIVE", "FISH_DEAD"}}, {14, { "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"}}, {16, { "UNIQUE_NONE", "UNIQUE_BOOK", "UNIQUE_SPECIAL_RIDE", "UNIQUE_3", "UNIQUE_4", "UNIQUE_5", "UNIQUE_6", "UNIQUE_7", "UNIQUE_8", "UNIQUE_9", "USE_SPECIAL"}}, {28, { "COSTUME_BODY", "COSTUME_HAIR", "COSTUME_MOUNT", "COSTUME_ACCE", "COSTUME_WEAPON"}}, {29, { "DS_SLOT1", "DS_SLOT2", "DS_SLOT3", "DS_SLOT4", "DS_SLOT5", "DS_SLOT6"}}, {31, { "EXTRACT_DRAGON_SOUL", "EXTRACT_DRAGON_HEART"}}, {35, { "PET_EGG", "PET_UPBRINGING", "PET_BAG", "PET_FEEDSTUFF", "PET_SKILL", "PET_SKILL_DEL_BOOK", "PET_NAME_CHANGE", "PET_EXPFOOD", "PET_SKILL_ALL_DEL_BOOK", "PET_EXPFOOD_PER", "PET_ATTR_DETERMINE", "PET_ATTR_CHANGE", "PET_PAY", "PET_PRIMIUM_FEEDSTUFF"}}, }; int get_Item_SubType_Value(int type_value, std::string inputString) { inputString = trim(inputString); #ifdef ENABLE_NUMERIC_FIELD if (_IsNumericString(inputString)) return std::stoi(inputString); #endif auto itType = mapItemSubType.find(type_value); if (itType == mapItemSubType.end()) { //sys_err("Type Out of range! (type_value: %d)", type_value); return -1; } auto vecSubtype = itType->second; auto itSubtype = std::find(vecSubtype.begin(), vecSubtype.end(), inputString); if (itSubtype == vecSubtype.end()) { //sys_err("Subtype Out of range! (type_value: %d)", type_value); return -1; } return std::distance(vecSubtype.begin(), itSubtype); } std::string set_Item_SubType_Value(int type, int subtype) // enum -1=None { if (type==(uint8_t)-1 || subtype==(uint8_t)-1 || type < 0 || subtype < 0) return "0"; auto itType = mapItemSubType.find(type); if (itType == mapItemSubType.end()) return "0"; auto vecSubtype = itType->second; try { return vecSubtype.at(subtype); } catch (...) { if (bDebugFlag) writeDebug("Item SubType not found type", subtype, type); #ifdef ENABLE_NUMERIC_FIELD return std::to_string(subtype); #else return ""; #endif } } string arIAFVAntiFlag[] = {"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_PET20", "ANTI_PET21"}; int get_Item_AntiFlag_Value(string inputString) { #ifdef ENABLE_NUMERIC_FIELD if (_IsNumericString(inputString)) return std::stoi(inputString); #endif int retValue = 0; string* arInputString = StringSplit(inputString, "|"); for(int i =0;i(pow(2.0, static_cast(i))); } if(tempString2.compare("") == 0) break; } } delete []arInputString; //cout << "AntiFlag : " << antiFlagStr << " -> " << retValue << endl; return retValue; } string set_Item_AntiFlag_Value(int iInput) // set { if (iInput==0) return "NONE"; // return ""; string inputString(""); int tmpFlag; auto iOldInput = iInput; for(int i =0;i(pow(2.0, static_cast(i))); if (iInput & tmpFlag) { iInput -= tmpFlag; if (!!inputString.compare("")) inputString += " | "; inputString += arIAFVAntiFlag[i]; } } #ifdef ENABLE_NUMERIC_FIELD if (iInput) return std::to_string(iOldInput); #endif if (bDebugFlag && iInput) writeDebug("Item AntiFlag not found", iInput); return inputString; } string arIFVFlag[] = {"ITEM_TUNABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE", "ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE", "QUEST_GIVE", "ITEM_QUEST", "LOG", "STACKABLE", "SLOW_QUERY", "REFINEABLE", "IRREMOVABLE", "ITEM_APPLICABLE"}; int get_Item_Flag_Value(string inputString) { #ifdef ENABLE_NUMERIC_FIELD if (_IsNumericString(inputString)) return std::stoi(inputString); #endif int retValue = 0; string* arInputString = StringSplit(inputString, "|"); for(int i =0;i(pow(2.0, static_cast(i))); } if(tempString2.compare("") == 0) break; } } delete []arInputString; //cout << "Flag : " << flagStr << " -> " << retValue << endl; return retValue; } string set_Item_Flag_Value(int iInput) // set { if (iInput==0) return "NONE"; // return ""; string inputString(""); int tmpFlag; auto iOldInput = iInput; for(int i =0;i(pow(2.0, static_cast(i))); if (iInput & tmpFlag) { iInput -= tmpFlag; if (!!inputString.compare("")) inputString += " | "; inputString += arIFVFlag[i]; } } #ifdef ENABLE_NUMERIC_FIELD if (iInput) return std::to_string(iOldInput); #endif if (bDebugFlag && iInput) writeDebug("Item Flag not found", iInput); return inputString; } string arIWFVWearrFlag[] = {"WEAR_BODY", "WEAR_HEAD", "WEAR_FOOTS", "WEAR_WRIST", "WEAR_WEAPON", "WEAR_NECK", "WEAR_EAR", "WEAR_SHIELD", "WEAR_UNIQUE", "WEAR_ARROW", "WEAR_HAIR", "WEAR_ABILITY", "WEAR_PENDANT", "WEAR_GLOVE"}; int get_Item_WearFlag_Value(string inputString) { #ifdef ENABLE_NUMERIC_FIELD if (_IsNumericString(inputString)) return std::stoi(inputString); #endif int retValue = 0; string* arInputString = StringSplit(inputString, "|"); for(int i =0;i(pow(2.0, static_cast(i))); } if(tempString2.compare("") == 0) break; } } delete []arInputString; //cout << "WearFlag : " << wearFlagStr << " -> " << retValue << endl; return retValue; } string set_Item_WearFlag_Value(int iInput) // set { if (iInput==0) return "NONE"; // return ""; string inputString(""); int tmpFlag; auto iOldInput = iInput; for(int i =0;i(pow(2.0, static_cast(i))); if (iInput & tmpFlag) { iInput -= tmpFlag; if (!!inputString.compare("")) inputString += " | "; inputString += arIWFVWearrFlag[i]; } } #ifdef ENABLE_NUMERIC_FIELD if (iInput) return std::to_string(iOldInput); #endif if (bDebugFlag && iInput) writeDebug("Item WearFlag not found", iInput); return inputString; } string arIIVImmune[] = {"PARA","CURSE","STUN","SLEEP","SLOW","POISON","TERROR","REFLECT"}; int get_Item_Immune_Value(string inputString) { #ifdef ENABLE_NUMERIC_FIELD if (_IsNumericString(inputString)) return std::stoi(inputString); #endif int retValue = 0; string* arInputString = StringSplit(inputString, "|"); for(int i =0;i(pow(2.0, static_cast(i))); } if(tempString2.compare("") == 0) break; } } delete []arInputString; //cout << "Immune : " << immuneStr << " -> " << retValue << endl; return retValue; } string set_Item_Immune_Value(int iInput) // set { if (iInput==0) return "NONE"; // return ""; string inputString(""); int tmpFlag; auto iOldInput = iInput; for(int i =0;i(pow(2.0, static_cast(i))); if (iInput & tmpFlag) { iInput -= tmpFlag; if (!!inputString.compare("")) inputString += " | "; inputString += arIIVImmune[i]; } } #ifdef ENABLE_NUMERIC_FIELD if (iInput) return std::to_string(iOldInput); #endif if (bDebugFlag && iInput) writeDebug("Item ImmuneFlag not found", iInput); return inputString; } string arILTVLimitType[] = {"LIMIT_NONE", "LEVEL", "STR", "DEX", "INT", "CON", "PC_BANG", "REAL_TIME", "REAL_TIME_FIRST_USE", "TIMER_BASED_ON_WEAR"}; int get_Item_LimitType_Value(string inputString) { #ifdef ENABLE_NUMERIC_FIELD if (_IsNumericString(inputString)) return std::stoi(inputString); #endif int retInt = -1; //cout << "LimitType : " << limitTypeStr << " -> "; for (int j=0;j "; for (int j=0;j "; for (int j=0;j "; for (int j=0;j "; for (int j=0;j "; for (int j=0;j(pow(2.0, static_cast(i))); } if(tempString2.compare("") == 0) break; } } delete []arInputString; //cout << "AIFlag : " << aiFlagStr << " -> " << retValue << endl; return retValue; } string set_Mob_AIFlag_Value(int iInput) // set { if (iInput==0) return ""; string inputString(""); int tmpFlag; auto iOldInput = iInput; for(int i =0;i(pow(2.0, static_cast(i))); if (iInput & tmpFlag) { iInput -= tmpFlag; if (!!inputString.compare("")) inputString += ","; inputString += arMOBAIFVAIFlag[i]; } } #ifdef ENABLE_NUMERIC_FIELD if (iInput) return std::to_string(iOldInput); #endif if (bDebugFlag && iInput) writeDebug("Mob AIFlag not found", iInput); return inputString; } string arMRFVRaceFlag[] = {"ANIMAL","UNDEAD","DEVIL","HUMAN","ORC","MILGYO","INSECT","FIRE","ICE","DESERT","TREE", "ATT_ELEC","ATT_FIRE","ATT_ICE","ATT_WIND","ATT_EARTH","ATT_DARK","ZODIAC"}; int get_Mob_RaceFlag_Value(string inputString) { #ifdef ENABLE_NUMERIC_FIELD if (_IsNumericString(inputString)) return std::stoi(inputString); #endif int retValue = 0; string* arInputString = StringSplit(inputString, ","); // @fixme201 for(int i =0;i(pow(2.0, static_cast(i))); } if(tempString2.compare("") == 0) break; } } delete []arInputString; //cout << "Race Flag : " << raceFlagStr << " -> " << retValue << endl; return retValue; } string set_Mob_RaceFlag_Value(int iInput) // set { if (iInput==0) return ""; string inputString(""); int tmpFlag; auto iOldInput = iInput; for(int i =0;i(pow(2.0, static_cast(i))); if (iInput & tmpFlag) { iInput -= tmpFlag; if (!!inputString.compare("")) inputString += ","; inputString += arMRFVRaceFlag[i]; } } #ifdef ENABLE_NUMERIC_FIELD if (iInput) return std::to_string(iOldInput); #endif if (bDebugFlag && iInput) writeDebug("Mob RaceFlag not found", iInput); return inputString; } string arMIFVImmuneFlag[] = {"STUN","SLOW","FALL","CURSE","POISON","TERROR", "REFLECT"}; int get_Mob_ImmuneFlag_Value(string inputString) { #ifdef ENABLE_NUMERIC_FIELD if (_IsNumericString(inputString)) return std::stoi(inputString); #endif int retValue = 0; string* arInputString = StringSplit(inputString, ","); for(int i =0;i(pow(2.0, static_cast(i))); } if(tempString2.compare("") == 0) break; } } delete []arInputString; //cout << "Immune Flag : " << immuneFlagStr << " -> " << retValue << endl; return retValue; } string set_Mob_ImmuneFlag_Value(int iInput) // set { if (iInput==0) return ""; string inputString(""); int tmpFlag; auto iOldInput = iInput; for(int i =0;i(pow(2.0, static_cast(i))); if (iInput & tmpFlag) { iInput -= tmpFlag; if (!!inputString.compare("")) inputString += ","; inputString += arMIFVImmuneFlag[i]; } } #ifdef ENABLE_NUMERIC_FIELD if (iInput) return std::to_string(iOldInput); #endif if (bDebugFlag && iInput) writeDebug("Mob ImmuneFlag not found", iInput); return inputString; } //martysama0134's 2e58d0b8baeb072acdf3afc4a5d1999f