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

📄 monsterai.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	HP_t CurHP = pMonster->getHP(ATTR_CURRENT);	HP_t MaxHP = pMonster->getHP(ATTR_MAX);	if (CurHP*4 < MaxHP) return true;	return false;}bool checkImDamaged(Monster* pMonster, Creature* pEnemy){	Assert(pMonster != NULL);	return pMonster->getBrain()->getDamaged();}bool checkImHiding(Monster* pMonster, Creature* pEnemy){	Assert(pMonster != NULL);	return pMonster->isFlag(Effect::EFFECT_CLASS_HIDE);}bool checkImWolf(Monster* pMonster, Creature* pEnemy){	Assert(pMonster != NULL);	return pMonster->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF);}bool checkImBat(Monster* pMonster, Creature* pEnemy){	Assert(pMonster != NULL);	return pMonster->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT);}bool checkImInvisible(Monster* pMonster, Creature* pEnemy){	Assert(pMonster != NULL);	return pMonster->isFlag(Effect::EFFECT_CLASS_INVISIBILITY);}bool checkImWalkingWall(Monster* pMonster, Creature* pEnemy){	Assert(pMonster != NULL);	MonsterAI* pAI = pMonster->getBrain();	Assert(pAI != NULL);	if (pAI->getWallCount() > 3 		&& (pAI->getMoveRule()==MOVE_RULE_LEFTWALL 			|| pAI->getMoveRule()==MOVE_RULE_RIGHTWALL))	{		return true;	}	return false;}bool checkTimingBloodDrain(Monster* pMonster, Creature* pEnemy){	Assert(pMonster != NULL);	// 阁胶磐啊 slayer啊 酒聪扼档 软趋窍霸 荐沥. by sigi. 2002.9.14	if (pEnemy == NULL		// Slayer啊 酒聪搁 软趋窍瘤 臼绰促.		|| pEnemy->isNPC()		// 捞固 软趋寸沁栏搁 软趋窍瘤 臼绰促.		|| pEnemy->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN)		// 公利. 软趋 搁开. by sigi. 2002.9.14		|| pEnemy->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)		|| pEnemy->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_BLOOD_DRAIN)) 	{		return false;	}	// 软趋芭府啊 登绰瘤 犬牢茄促.	Distance_t dist = pMonster->getDistance(pEnemy->getX(), pEnemy->getY());	if (dist > pMonster->getMeleeRange()) return false;	HP_t EnemyCurHP = 0;	HP_t EnemyMaxHP = 0;	if (pEnemy->isSlayer())	{		Slayer* pSlayer = dynamic_cast<Slayer*>(pEnemy);		EnemyCurHP = pSlayer->getHP(ATTR_CURRENT);		EnemyMaxHP = pSlayer->getHP(ATTR_MAX);	}	else if (pEnemy->isVampire())	{		Vampire* pVampire = dynamic_cast<Vampire*>(pEnemy);		EnemyCurHP = pVampire->getHP(ATTR_CURRENT);		EnemyMaxHP = pVampire->getHP(ATTR_MAX);	}	else if (pEnemy->isOusters())	{		Ousters* pOusters = dynamic_cast<Ousters*>(pEnemy);		EnemyCurHP = pOusters->getHP(ATTR_CURRENT);		EnemyMaxHP = pOusters->getHP(ATTR_MAX);	}	else if (pEnemy->isMonster())	{		Monster* pMonster = dynamic_cast<Monster*>(pEnemy);		EnemyCurHP = pMonster->getHP(ATTR_CURRENT);		EnemyMaxHP = pMonster->getHP(ATTR_MAX);	}	// HP啊 1/5捞惑 巢疽栏搁 软趋窍瘤 臼绰促.	if (EnemyCurHP*5 >= EnemyMaxHP) return false;	// 付魔郴... 软趋茄促~	return true;}bool checkTimingMasterBloodDrain(Monster* pMonster, Creature* pEnemy){	// 20% 眉农	// 拌魂 磊眉啊 糊矫骨肺..	//if (rand()%100 > 10)	//	return false;	Assert(pMonster != NULL);	if ((!pMonster->isMaster()#ifdef __UNDERWORLD__		&& pMonster->getMonsterType() != 599#endif		)		|| pEnemy == NULL)	{		return false;	}	int masterHPPercent = pMonster->getHP(ATTR_CURRENT)*100/pMonster->getHP(ATTR_MAX);	// 软趋 犬伏	//int startHPPercent 	= 70,	startBDPercent 	= 10;	//int endHPPercent 	= 30, 	endBDPercent 	= 30;	int startHPPercent 	= g_pVariableManager->getMasterBloodDrainStartHP();	int startBDPercent 	= g_pVariableManager->getMasterBloodDrainStartBD();	int endHPPercent 	= g_pVariableManager->getMasterBloodDrainEndHP();		int endBDPercent 	= g_pVariableManager->getMasterBloodDrainEndBD();	// HP啊 70% 捞惑捞搁 软趋窍瘤 臼绰促.	if (masterHPPercent >= startHPPercent)		return false;	int ratio = rand()%100;	// HP啊 30% 捞窍捞搁.. 30%狼 犬伏肺 软趋茄促.	if (masterHPPercent <= endHPPercent)	{		return ratio < endBDPercent;	}	// HP啊 30~70%捞搁 10~30%狼 犬伏肺 软趋茄促.	int maxBDPercent = max( startBDPercent, endBDPercent );	int gapHPPercent = startHPPercent - endHPPercent;	int gapBDPercent = abs( endBDPercent - startBDPercent );	//int permitRatio = maxBDPercent - (masterHPPercent-endHPPercent)/2;	int permitRatio = maxBDPercent - gapBDPercent * (masterHPPercent-endHPPercent) / gapHPPercent;	return ratio < permitRatio;	/*	if (masterHPPercent < 3 || masterHPPercent > 70)	{		return false;	}	*/	// 酒公唱 软趋且 荐 乐栏骨肺.. - -;	//return true;	/*	int x = pEnemy->getX();	int y = pEnemy->getY();	int Splash = 30; // 弊成 30付府父 眉农茄促.	int range = 3; // 7x7   //5;	// 11x11	list<Creature*> creatureList;	getSplashVictims(pMonster->getZone(), x, y, Creature::CREATURE_CLASS_MAX, creatureList, Splash, range);	list<Creature*>::iterator itr = creatureList.begin();	for (; itr != creatureList.end(); itr++)	{		Creature* pTargetCreature = (*itr);		Assert(pTargetCreature != NULL);			if (pMonster!=pTargetCreature			&& pTargetCreature->isNPC()			// 捞固 软趋寸沁栏搁 软趋窍瘤 臼绰促. 付胶磐啊 捞繁芭 蝶瘤摆唱 酵绢辑 化促.			//&& pTargetCreature->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN)			// 公利. 软趋 搁开. by sigi. 2002.9.14			&& pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)			&& pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_BLOOD_DRAIN)) 		{			HP_t EnemyCurHP = 0;			HP_t EnemyMaxHP = 0;			if (pTargetCreature->isSlayer())			{				Slayer* pSlayer = dynamic_cast<Slayer*>(pTargetCreature);				EnemyCurHP = pSlayer->getHP(ATTR_CURRENT);				EnemyMaxHP = pSlayer->getHP(ATTR_MAX);			}			else if (pTargetCreature->isVampire())			{				Vampire* pVampire = dynamic_cast<Vampire*>(pTargetCreature);				EnemyCurHP = pVampire->getHP(ATTR_CURRENT);				EnemyMaxHP = pVampire->getHP(ATTR_MAX);			}			else if (pTargetCreature->isMonster())			{				Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature);				EnemyCurHP = pMonster->getHP(ATTR_CURRENT);				EnemyMaxHP = pMonster->getHP(ATTR_MAX);			}				// 眉仿 50% 固父篮 软趋寸茄促			if (EnemyCurHP*2 < EnemyMaxHP) 				return true;		}	}	*/	return true;}//----------------------------------------------------------------------//// bool checkMasterSummonTiming(Monster* pMonster, Creature* pEnemy)////----------------------------------------------------------------------// 家券 扁贱阑 静霸 且妨绊 窍绰单..// 泅犁 粮捞 付胶磐 饭绢捞绊.. // 促弗 各捞 绝绢具 茄促.//----------------------------------------------------------------------bool checkMasterSummonTiming(Monster* pMonster, Creature* pEnemy){	//cout << "checkMasterSummonTiming: ";	Assert(pMonster != NULL);	// 付胶磐啊 酒聪搁 家侩绝促.	if (!pMonster->isMaster())		//|| !pMonster->hasNextMonsterSummonInfo())	{		//cout << "not Master" << endl;		return false;	}	// 付胶磐啊 乐绰 粮捞 付胶磐饭绢牢瘤 犬牢茄促.	Zone* pZone = pMonster->getZone();	Assert(pZone!=NULL);	// 付胶磐 饭绢啊 酒聪搁 狼固绝促.	if (!pZone->isMasterLair())	{		//cout << "not MasterLair" << endl;		return false;	}	MasterLairManager* pMasterLairManager = pZone->getMasterLairManager();	Assert(pMasterLairManager!=NULL);	// 酒流 付胶磐啊 轿快绰 惑怕啊 酒聪绊	// 粮俊 付胶磐 捞寇狼 阁胶磐啊 绝绰 版快 家券且 荐 乐促.	bool bSummonTiming = !pMasterLairManager->isMasterReady() && 						pZone->getMonsterManager()->getSize() <= 1;	/*	if (bSummonTiming)		cout << "Master Not Ready" << endl;	else		cout << "Master Ready" << endl;		*/	return bSummonTiming;}//----------------------------------------------------------------------//// bool checkMasterNotReady(Monster* pMonster, Creature* pEnemy)////----------------------------------------------------------------------bool checkMasterNotReady(Monster* pMonster, Creature* pEnemy){	Assert(pMonster != NULL);	// 付胶磐啊 酒聪搁 家侩绝促.	if (!pMonster->isMaster())	{		return false;	}	// 付胶磐啊 乐绰 粮捞 付胶磐饭绢牢瘤 犬牢茄促.	Zone* pZone = pMonster->getZone();	Assert(pZone!=NULL);	// 付胶磐 饭绢啊 酒聪搁 狼固绝促.	if (!pZone->isMasterLair())	{		return false;	}	MasterLairManager* pMasterLairManager = pZone->getMasterLairManager();	Assert(pMasterLairManager!=NULL);	// 酒流 付胶磐啊 轿快绰 惑怕啊 酒聪绊	// 粮俊 付胶磐 捞寇狼 阁胶磐啊 绝绰 版快 家券且 荐 乐促.	return !pMasterLairManager->isMasterReady();}//----------------------------------------------------------------------//// bool checkImInBadPosition(Monster* pMonster, Creature* pEnemy)////----------------------------------------------------------------------// 泅犁 困摹啊 救 亮篮 镑牢啊?//// pMonster啊 乐绰 鸥老俊 AcidSwamp捞 谎妨廉 乐绰 版快//----------------------------------------------------------------------bool checkImInBadPosition(Monster* pMonster, Creature* pEnemy){	Assert(pMonster!=NULL);	Zone* pZone = pMonster->getZone();	Assert(pZone!=NULL);	Tile& rTile = pZone->getTile( pMonster->getX(), pMonster->getY() );	// 公利 惑怕啊 酒聪绊	if (!pMonster->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)			// Acid 搁开捞 酒聪绊 官蹿俊 AcidSwap捞 彬妨乐促搁 救 亮瘤. - -;		&& (!pMonster->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_ACID)				&& rTile.getEffect(Effect::EFFECT_CLASS_ACID_SWAMP)!=NULL			|| rTile.getEffect(Effect::EFFECT_CLASS_BLOODY_WALL)!=NULL			|| rTile.getEffect(Effect::EFFECT_CLASS_GROUND_ATTACK)!=NULL)		)	{		return true;	}	return false;}//----------------------------------------------------------------------//// bool checkFindWeakEnemy(Monster* pMonster, Creature* pEnemy)////----------------------------------------------------------------------// 歹 距茄 利阑 茫阑 荐 乐唱?//// pEnemy狼 HP啊 100捞惑捞绊 HP percentage啊 60% 捞惑捞扼搁 // 促弗 距茄 利阑 窃 茫酒夯促.//----------------------------------------------------------------------bool checkFindWeakEnemy(Monster* pMonster, Creature* pEnemy){	// 老窜	//return false;	try	{		if (pEnemy==NULL) return false;		Assert(pMonster!=NULL);		Zone* pZone = pMonster->getZone();		Assert(pZone!=NULL);		int strongValue = getStrongValue(pEnemy);		if (strongValue==0) return false;		// 泅犁 利篮 粱 疥促..扼绊 魄窜阑 窍绊. --;		// 货肺款 距茄 利阑 茫绰促.		Creature* pWeakestCreature = NULL;		// 林困 八祸		ZoneCoord_t cx = pMonster->getX();		ZoneCoord_t cy = pMonster->getY();;		ZoneCoord_t ix = 0;		ZoneCoord_t iy = 0;		ZoneCoord_t endx = 0;		ZoneCoord_t endy = 0;		// 阁胶磐 矫具 裹困俊辑 茫绰促.		Sight_t sight = pMonster->getSight();			endx = min(pZone->getWidth() - 1, cx + sight + 1);		endy = min(pZone->getHeight() - 1, cy + sight  + 1);		for (ix =  max(0, cx - sight - 1); ix <= endx ; ix++) 		{			for (iy = max(0, cy - sight - 1); iy <= endy ; iy++) 			{				Tile& rTile = pZone->getTile(ix, iy);				// 鸥老俊 农府贸啊 乐绰 版快俊父				if (rTile.hasCreature()) 				{					const slist<Object*> & objectList = rTile.getObjectList();					for (slist<Object*>::const_iterator itr = objectList.begin() ; 						itr != objectList.end() && (*itr)->getObjectPriority() <= OBJECT_PRIORITY_BURROWING_CREATURE; 						itr++) 					{						Creature* pCreature = dynamic_cast<Creature*>(*itr);								Assert(pCreature != NULL);						// pMonster, pEnemy啊 酒聪扼搁..						// Player扼搁 傍拜窍霸 等促.						if (pCreature != pMonster 							&& pCreature != pEnemy							&& pCreature->isPC()							&& pMonster->isRealEnemy(pCreature))						{							int checkStrongValue = getStrongValue( pCreature );							// 歹 距茄逞阑 pWeakestCreature肺 烙疙~茄促							if (checkStrongValue < strongValue)							{								pWeakestCreature = pCreature;								strongValue = checkStrongValue;							}						} 					}				}			}		}		// 俩 距茄逞阑 茫篮 版快..		if (pWeakestCreature!=NULL)		{			pMonster->deleteAllEnemy();			pMonster->addEnemy( pWeakestCreature );			return true;		}		else		{		}	} catch (Throwable& t) {		// 葛电 exception阑 公矫茄促.		filelog("monsterAIBug.txt", "%s", t.toString().c_str());	}	return false;}bool checkEnemyNotHallucination(Monster* pMonster, Creature* pEnemy){	Assert(pMonster != NULL);	if (pEnemy == NULL) return false;	if (!pEnemy->isFlag(Effect::EFFECT_CLASS_HALLUCINATION)) return true;	return false;}bool checkTimingDuplicateSelf(Monster* pMonster, Creature* pEnemy){	Assert(pMonster != NULL);	// 付胶磐啊 酒聪搁 家侩绝促.	if (!pMonster->isMaster())	{		return false;	}	// 付胶磐啊 乐绰 粮捞 付胶磐饭绢牢瘤 犬牢茄促.	Zone* pZone = pMonster->getZone();	Assert(pZone!=NULL);	/*	// 付胶磐 饭绢啊 酒聪搁 狼固绝促.	if (!pZone->isMasterLair())	{		return false;	}	*/	HP_t currentHP = pMonster->getHP(ATTR_CURRENT);	HP_t maxHP = pMonster->getHP(ATTR_MAX);	// HP啊 70%啊 逞栏搁 荤侩救茄促.	if (currentHP*100/maxHP > 70)	{		return false;	}	// 12付府 捞惑捞搁 歹 家券 救茄促.	if (pZone->getMonsterManager()->getSize() > 12)	{		return false;	}	return true;}//----------------------------------------------------------------------//// bool checkPossibleSummonMonsters(Monster* pMonster, Creature* pEnemy)////----------------------------------------------------------------------// 家券 扁贱阑 静霸 且妨绊 窍绰单..//----------------------------------------------------------------------bool checkPossibleSummonMonsters(Monster* pMonster, Creature* pEnemy){	//cout << "checkMasterSummonTiming: ";	Assert(pMonster != NULL);	return pMonster->hasNextMonsterSummonInfo();}bool checkEnemyTileNotAcidSwamp(Monster* pMonster, Creature* pEnemy){	Zone* pZone = pEnemy->getZone();	Assert( pZone != NULL );	Tile& rTile = pZone->getTile( pEnemy->getX(), pEnemy->getY() );	if ( rTile.getEffect( Effect::EFFECT_CLASS_ACID_SWAMP ) == NULL ) return true;	return false;}bool checkEnemyOnAir(Monster* pMonster, Creature* pEnemy){	if ( pEnemy == NULL ) return false;	if ( pEnemy->getMoveMode() == Creature::MOVE_MODE_FLYING ) return true;	return false;}bool checkEnemyOnSafeZone(Monster* pMonster, Creature* pEnemy){	if ( pEnemy==NULL ) return false;	return ( ( pEnemy->getZone()->getZoneLevel( pEnemy->getX(), pEnemy->getY() ) & SAFE_ZONE ) != 0 );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -