📄 itemutil.cpp
字号:
if (optionTypes.empty()) return false; try { OptionInfo* pOptionInfo = g_pOptionInfoManager->getOptionInfo( optionType ); if (pOptionInfo==NULL) return false; OptionClass newOptionClass = pOptionInfo->getClass(); list<OptionType_t>::const_iterator itr; for (itr=optionTypes.begin(); itr!=optionTypes.end(); itr++) { pOptionInfo = g_pOptionInfoManager->getOptionInfo( *itr ); if (pOptionInfo==NULL) return false; if (pOptionInfo->getClass()==newOptionClass) return true; } } catch (Throwable& t) { // 公矫.. filelog("hasOptionClassBug.txt", "%s", t.toString().c_str()); } return false;}void setOptionTypeFromField(list<OptionType_t>& optionTypes, const string& optionField){ if (optionField.empty()) return; //cout << "setOptionType: " << optionField.c_str() << " --> "; const char* pOptionField = optionField.c_str(); unsigned char ch; while (ch=*pOptionField++) { optionTypes.push_back( (OptionType_t)ch ); //cout << (int)ch << " "; } //cout << endl;}void setOptionTypeToField(const list<OptionType_t>& optionTypes, string& optionField){ if (optionTypes.empty()) return; //cout << "setOptionType: "; unsigned char ch; list<OptionType_t>::const_iterator itr; for (itr=optionTypes.begin(); itr!=optionTypes.end(); itr++) { ch = *itr; // 漂荐~巩磊牢 版快俊绰 捞芭 秦拎具等寸. if (ch=='\'' || ch=='\\') { optionField += '\\'; } optionField += ch; //cout << (int)ch << " "; } //cout << " --> " << optionField.c_str() << endl;}string getOptionTypeToString(const list<OptionType_t>& optionTypes){ if (optionTypes.empty()) return string("NONE"); string optionField; unsigned char ch; char str[12]; list<OptionType_t>::const_iterator itr; for (itr=optionTypes.begin(); itr!=optionTypes.end(); itr++) { ch = *itr; sprintf(str, "%d", (int)ch); optionField += str; optionField += " "; } return optionField;}//////////////////////////////////////////////////////////////////////////////// 饭绢 酒捞袍 : 促澜 可记阑 嘿老鳖?//////////////////////////////////////////////////////////////////////////////bool isPossibleNextOption(ITEM_TEMPLATE* pTemplate){ // 泅犁绰 可记捞 2俺鳖瘤观俊 救 嘿绰促. if (pTemplate->OptionType.size()>=2) return false; // 酒公巴档 绝促搁 公炼扒 嘿牢促...绊 窍绰扒 酒聪瘤父 绢露电 弊犯促 - -; if (pTemplate->OptionType.empty()) return true; // 酒捞袍俊 漂喊洒 利侩登绢 乐绰 可记 犬伏阑 利侩矫挪促. if (pTemplate->NextOptionRatio!=0) { int dice = rand()%100; //cout << "NextOptionRatio : " << dice << " < " << (int)pTemplate->NextOptionRatio << endl; return dice < pTemplate->NextOptionRatio; } try { // 酒捞袍 辆幅喊肺.. 促澜 可记捞 嘿阑 犬伏阑 备茄促. ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pTemplate->ItemClass, pTemplate->ItemType); Ratio_t nextItemRatio = pItemInfo->getNextOptionRatio(); // 泅犁 嘿篮 可记俊 措秦辑.. 促澜 可记捞 嘿阑 犬伏阑 备茄促. list<OptionType_t>::const_iterator itr = pTemplate->OptionType.begin(); Ratio_t nextOptionRatio = nextItemRatio; // 拌魂 临老妨绊.. Ratio_t baseMultiplier = 100; // 100% for (; itr!=pTemplate->OptionType.end(); itr++) { OptionInfo* pOptionInfo = g_pOptionInfoManager->getOptionInfo( *itr ); if (pOptionInfo==NULL) return false; nextOptionRatio *= pOptionInfo->getNextOptionRatio(); baseMultiplier *= 100; } // [抗力] 可记捞 滴 俺 嘿绢 乐绰 酒捞袍俊辑 // 技锅掳 可记捞 嘿阑 犬伏捞扼搁.. // // nextItemRatio = 10 % // nextOptionRatio1 = 20 % // nextOptionRatio2 = 30 % // // total nextOptionRatio = nextItemRatio * nextOptionRatio1 * nextOptionRatio2 // = 10 * 20 * 30 = 6000 // // baseMultiplier = 100(檬扁蔼) * 100(option1) * 100(option2) // = 1000000 // // selectRatio = 0~baseMultiplier = 0~1000000 // // Succeed = nextOptionRatio/baseMultiplier // = 6000/1000000 // = 6 / 1000 // = 0.6% Ratio_t selectRatio = rand()%baseMultiplier; // 饭绢 酒捞袍 风泼 犬伏阑 利侩矫挪促. nextOptionRatio = getPercentValue( nextOptionRatio, g_pVariableManager->getRareItemRatio() ); // 犬伏 眉农 return selectRatio < nextOptionRatio; } catch (Throwable& t) { // 老窜 公矫茄促. filelog("nextOptionBug.txt", "%s", t.toString().c_str()); } return false;}//////////////////////////////////////////////////////////////////////////////// 胺喉 酒捞袍 积己//////////////////////////////////////////////////////////////////////////////Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, int maxLevel) throw(Error){ __BEGIN_TRY Assert(pCreature!=NULL); InfoClassManager* pInfoClass = g_pItemInfoManager->getInfoManager( itemClass ); Assert(pInfoClass!=NULL); ItemType_t itemType = 0; OptionType_t optionType = 1; ItemInfo* pItemInfo = NULL; //---------------------------------------------------------------------- // Slayer牢 版快 //---------------------------------------------------------------------- if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); Attr_t CSTR = pSlayer->getSTR(ATTR_BASIC); Attr_t CDEX = pSlayer->getDEX(ATTR_BASIC); Attr_t CINT = pSlayer->getINT(ATTR_BASIC); Attr_t CSUM = CSTR + CDEX + CINT; Attr_t ReqSTR, ReqSTR2; Attr_t ReqDEX, ReqDEX2; Attr_t ReqINT, ReqINT2; Attr_t ReqSum, ReqSum2; Attr_t ReqGender; // gamble且 荐 乐绰 茄拌甫 粱 歹 臭囚夯促. CSTR += 3; CDEX += 3; CINT += 3; CSUM += 5; // level力茄 if (maxLevel!=0) { int maxAttr = maxLevel * 2 / 3; // attr篮 SUM狼 2/3栏肺 夯促. CSTR = min((int)maxAttr, (int)CSTR); CDEX = min((int)maxAttr, (int)CDEX); CINT = min((int)maxAttr, (int)CINT); CSUM = min((int)maxLevel, (int)CSUM); } // 10锅父 倒妨夯促. int i = 10; do { itemType = pInfoClass->getRandomItemType(); // 捞 itemType阑 积己秦档 登绰 level牢瘤 犬牢茄促. pItemInfo = g_pItemInfoManager->getItemInfo(itemClass, itemType); ReqSTR2 = ReqSTR = pItemInfo->getReqSTR(); ReqDEX2 = ReqDEX = pItemInfo->getReqDEX(); ReqINT2 = ReqINT = pItemInfo->getReqINT(); ReqSum2 = ReqSum = pItemInfo->getReqSum(); ReqGender = pItemInfo->getReqGender(); if (CSTR >= ReqSTR && CDEX >= ReqDEX && CINT >= ReqINT && CSUM >= ReqSum && (ReqGender==GENDER_BOTH || pSlayer->getSex() == MALE && ReqGender == GENDER_MALE || pSlayer->getSex() == FEMALE && ReqGender == GENDER_FEMALE)) { // 捞 item type栏肺 搬沥茄促. break; } } while (--i); if (i==0) { // 咯磊牢 版快绰 扁夯 item type捞 促福促. if ((itemClass==Item::ITEM_CLASS_COAT || itemClass==Item::ITEM_CLASS_TROUSER) && pSlayer->getSex()==FEMALE) { itemType = 1; } else { itemType = 0; } // 关俊辑 眉农且锭 公矫窍扁 困秦辑.. pItemInfo = NULL; } // 酒捞袍捞 可记阑 啊瘤绊 乐促搁, // 可记狼 辆幅俊 蝶扼辑 瓷仿摹 力茄阑 棵妨霖促. int maxOptionLevel = max(1, min(100, (int)(CSUM/3))); const vector<OptionType_t>& optionVector = g_pOptionInfoManager->getPossibleGambleOptionVector((Item::ItemClass)itemClass, maxOptionLevel); vector<OptionType_t>::const_iterator iOption; /* cout << "optionVector[" << (int)itemClass << "][" << (int)maxOptionLevel << "] = (" << optionVector.size() << ") = "; for (iOption=optionVector.begin(); iOption!=optionVector.end(); iOption++) { cout << (int)*iOption << " "; } cout << endl; */ // Total OptionRatio甫 备茄促. int itemOptionRatio = g_pOptionInfoManager->getTotalGambleRatio((Item::ItemClass)itemClass, maxOptionLevel); if (optionVector.size()>0 && itemOptionRatio>0 && (pItemInfo==NULL || !pItemInfo->isUnique())) { // 10锅父 倒妨夯促. int i = 10; do { // random栏肺 option阑 急琶茄促. int optionRatio = random()%itemOptionRatio; int ratioSum = 0; //cout << "Ratio = " << optionRatio << "/" << itemOptionRatio << endl; OptionInfo* pOptionInfo = NULL; for (iOption=optionVector.begin(); iOption!=optionVector.end(); iOption++) { optionType = *iOption; pOptionInfo = g_pOptionInfoManager->getOptionInfo( optionType ); ratioSum += pOptionInfo->getRatio(); if (optionRatio < ratioSum) { // 捞 option阑 急琶茄促. //cout << "select : " << (int)optionType << endl; break; } } // option狼 夸备 瓷仿摹甫 歹秦辑 if (ReqSTR != 0) ReqSTR = ReqSTR2 + (pOptionInfo->getReqSum() * 2); if (ReqDEX != 0) ReqDEX = ReqDEX2 + (pOptionInfo->getReqSum() * 2); if (ReqINT != 0) ReqINT = ReqINT2 + (pOptionInfo->getReqSum() * 2); if (ReqSum != 0) ReqSum = ReqSum2 + (pOptionInfo->getReqSum()); //if (ReqSTR != 0) cout << "CSTR = " << (int)CSTR << ", ReqSTR = " << (int)ReqSTR2 << " + " << (int)pOptionInfo->getReqSum() << "*2 = " << (int)ReqSTR << endl; //if (ReqDEX != 0) cout << "CDEX = " << (int)CDEX << ", ReqDEX = " << (int)ReqDEX2 << " + " << (int)pOptionInfo->getReqSum() << "*2 = " << (int)ReqDEX << endl; //if (ReqINT != 0) cout << "CINT = " << (int)CINT << ", ReqINT = " << (int)ReqINT2 << " + " << (int)pOptionInfo->getReqSum() << "*2 = " << (int)ReqINT << endl; //if (ReqSum != 0) cout << "CSUM = " << (int)CSUM << ", ReqSum = " << (int)ReqSum2 << " + " << (int)pOptionInfo->getReqSum() << " = " << (int)ReqSum << endl; //cout << "CSTR=" << CSTR << ", " // << "CDEX=" << CDEX << ", " // << "CINT=" << CINT << endl; // player狼 瓷仿摹俊 嘎绰 酒捞袍牢瘤 犬牢茄促. if (CSTR >= ReqSTR && CDEX >= ReqDEX && CINT >= ReqINT && CSUM >= ReqSum) { // 捞 option type栏肺 搬沥茄促. //cout << "OK!" << endl; break; } } while (--i); if (i==0) { optionType = 0; //(rand()%3==0? 1: (rand()%2? 6:11)); } } // 公可 // 利例茄霸 绝栏搁 STR+1, DEX+1, INT+1 吝俊辑 鞠芭唱.. else optionType = 0; //(rand()%3==0? 1: (rand()%2? 6:11)); } //---------------------------------------------------------------------- // Vampire牢 版快 //---------------------------------------------------------------------- else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pCreature); Level_t CLevel = pVampire->getLevel(); // gamble且 荐 乐绰 茄拌甫 粱 歹 臭囚夯促. CLevel += 3; // level力茄 if (maxLevel!=0) { CLevel = min((int)maxLevel, (int)CLevel); } Attr_t ReqLevel, ReqLevel2; Attr_t ReqGender; // 10锅父 倒妨夯促. int i = 10; do { itemType = pInfoClass->getRandomItemType(); // 捞 itemType阑 积己秦档 登绰 level牢瘤 犬牢茄促. pItemInfo = g_pItemInfoManager->getItemInfo(itemClass, itemType); ReqLevel2 = ReqLevel = pItemInfo->getReqLevel(); ReqGender = pItemInfo->getReqGender(); // 饭骇 力茄捞 绝芭唱 力茄 饭骇捞 臭绊 // 己喊捞 嘎酒具 茄促. if ((ReqLevel <= 0 || CLevel >= ReqLevel) && (ReqGender==GENDER_BOTH || pVampire->getSex()==MALE && ReqGender==GENDER_MALE || pVampire->getSex()==FEMALE && ReqGender==GENDER_FEMALE) ) { break; } } while (--i); if (i==0) { // 咯磊牢 版快绰 扁夯 item type捞 促福促. if (Item::ITEM_CLASS_VAMPIRE_COAT && pVampire->getSex()==FEMALE) { itemType = 1; } else { itemType = 0; } } // 酒捞袍捞 可记阑 啊瘤绊 乐促搁, // 可记狼 辆幅俊 蝶扼辑 瓷仿摹 力茄阑 棵妨霖促. int maxOptionLevel = max(1, min(100, (int)CLevel)); const vector<OptionType_t>& optionVector = g_pOptionInfoManager->getPossibleGambleOptionVector((Item::ItemClass)itemClass, maxOptionLevel); vector<OptionType_t>::const_iterator iOption; // Total OptionRatio甫 备茄促. int itemOptionRatio = g_pOptionInfoManager->getTotalGambleRatio((Item::ItemClass)itemClass, maxOptionLevel); /* cout << "optionVector[" << (int)itemClass << "][" << (int)maxOptionLevel << "] = (" << optionVector.size() << ") = "; for (iOption=optionVector.begin(); iOption!=optionVector.end(); iOption++) { cout << (int)*iOption << " "; } cout << endl; */ if (optionVector.size()>0 && itemOptionRatio>0 && (pItemInfo==NULL || !pItemInfo->isUnique())) { // 10锅父 倒妨夯促. int i = 10; do { // random栏肺 option阑 急琶茄促. int optionRatio = random()%itemOptionRatio; int ratioSum = 0; //cout << "Ratio = " << optionRatio << "/" << itemOptionRatio << endl; OptionInfo* pOptionInfo = NULL; for (iOption=optionVector.begin(); iOption!=optionVector.end(); iOption++) { optionType = *iOption; pOptionInfo = g_pOptionInfoManager->getOptionInfo( optionType ); ratioSum += pOptionInfo->getRatio(); if (optionRatio < ratioSum) { // 捞 option阑 急琶茄促. break; } } // option狼 夸备 瓷仿摹甫 歹秦辑 ReqLevel = ReqLevel2 + pOptionInfo->getReqLevel(); // player狼 瓷仿摹俊 嘎绰 酒捞袍牢瘤 犬牢茄促. if (ReqLevel <= 0 || CLevel >= ReqLevel) { // 捞 option type栏肺 搬沥茄促. break; } } while (--i); if (i==0) { optionType = 0;//(rand()%3==0? 1: (rand()%2? 6:11)); } } // 公可! // 利例茄霸 绝栏搁 STR+1, DEX+1, INT+1 吝俊辑 鞠芭唱.. else optionType = 0;//(rand()%3==0? 1: (rand()%2? 6:11)); } //---------------------------------------------------------------------- // Ousters牢 版快 //---------------------------------------------------------------------- else if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast<Ousters*>(pCreature);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -