⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 itemutil.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -