コード例 #1
0
//-----------------------------------------------------------------------------
// Purpose: Return true if this bug should flee
//-----------------------------------------------------------------------------
bool CNPC_Bug_Warrior::ShouldFlee( void )
{
	// I don't flee if I'm fighting to the death
	if ( m_bFightingToDeath )
		return false;

	// I don't flee if I'm not alone
	if ( !IsAlone() )
		return false;

	// I don't flee if I'm within sight of a bughole
	if ( m_hMyBugHole.Get() && FVisible( m_hMyBugHole ) )
		return false;

	return true;
}
コード例 #2
0
ファイル: Group.cpp プロジェクト: scaepz/shapist-game
bool CGroup::Update()
{
	if (Ai()->GroupDistanceToPlayer(groupMembers) > 1920) return false;
	if (groupMembers.size() == 0) return true;
	DecreaseDelays();
	ScanForPlayer();


	for (int i = 0; i < groupMembers.size(); i++)
	{
		if (M(i)->currentActivity == CEnemy::CurrentActivity::fighting
			|| M(i)->currentActivity == CEnemy::CurrentActivity::braveryboost
			|| M(i)->currentActivity == CEnemy::CurrentActivity::spottedPlayer
			|| M(i)->currentActivity == CEnemy::CurrentActivity::retreating)
		{
			if (M(i)->timeUntilAimCorrection >= 0)
			{
				if (M(i)->GetPlayerVisible())
					M(i)->SetOptimalXhairAngle(AIVector->at(M(i)->AI)->GetOptimalXhairAngle(M(i)));
			}
			else
			{
				if (M(i)->GetPlayerVisible())
					M(i)->timeUntilAimCorrection -= g_time;
			}
			M(i)->Aim();
		}
	}

	if (IsAlone())
	{
		if (Ai()->ContinuousChance(32000))
		{
			CEnemy::CurrentActivity tempActivity = M(0)->currentActivity;
			M(0)->currentActivity = CEnemy::CurrentActivity::alone;
			speechManager->AddSpeech(M(0), Ai()->GetSpeechString(M(0), IsCaptain(M(0))), GetColor(M(0)));
		}
	}

	if (groupIsAwareOfPlayer && timeSincePlayerSpotted > 7000 && activity != GroupActivity::alert)
	{
		groupIsAwareOfPlayer = false;
		for (int i = 0; i < groupMembers.size(); i++)
		{
			M(i)->SetAwareOfPlayer(false);
			M(i)->currentActivity = CEnemy::CurrentActivity::alert;
			M(i)->SetXhairAngle(0);
		}
		activity = GroupActivity::alert;
	}
	else if (groupIsAwareOfPlayer && timeSincePlayerSpotted > 2000 && activity != GroupActivity::searching)
	{
		activity = GroupActivity::searching;
		InitDelays();
		for (int i = 0; i < groupMembers.size(); i++)
		{
			if (Ai()->Chance(40))
			{
				M(i)->SetAwareOfPlayer(false);
			}
			if (M(i)->currentActivity != CEnemy::CurrentActivity::deserting)
				M(i)->currentActivity = CEnemy::CurrentActivity::searching;
		}
	}

	if (!losingMorals)
	{
		if (!IsGroupBrave() && AIVector->at(0)->ContinuousChance(2000))
		{
			LoseMorals();
		}
	}
	else
	{
		for (int i = 0; i < groupMembers.size(); i++)
		{
			if (M(i)->currentActivity == CEnemy::CurrentActivity::aboutToDesert)
			{
				if (Ai(i)->ContinuousChance(1600))
				{
					M(i)->currentActivity = CEnemy::CurrentActivity::deserting;
					if (Ai()->Chance(50))
					{
						speechManager->AddSpeech(M(i), Ai(i)->GetSpeechString(M(i), IsCaptain(M(i))), GetColor(i));
					}
				}
			}
		}
	}


	switch (activity)
	{
	case GroupActivity::alert:
		for (int i = 0; i < groupMembers.size(); i++)
		{
			Ai(i)->Idle(M(i));
			if (Ai(i)->ContinuousChance(12000) && !IsAlone())
			{
				speechManager->AddSpeech(M(i), Ai(i)->GetSpeechString(M(i), IsCaptain(M(i))), GetColor(i));
			}
		}
		break;
	case GroupActivity::idle:
		for (int i = 0; i < groupMembers.size(); i++)
		{
			Ai(i)->Idle(M(i));
			if (Ai(i)->ContinuousChance(22000))
			{
				speechManager->AddSpeech(M(i), Ai(i)->GetSpeechString(M(i), IsCaptain(M(i))), GetColor(i));
			}
		}
		break;
	case GroupActivity::gainingAwareness:
	{
											bool allAware = true;
											for (int i = 0; i < groupMembers.size(); i++)
											{
												if (!M(i)->IsAwareOfPlayer())
												{
													if (IsDelayZero(i))
													{
														M(i)->SetAwareOfPlayer(true);
														if (M(i)->currentActivity == CEnemy::CurrentActivity::spottedPlayer)
														{
															if (Ai()->Chance(90) && groupMembers.size() > 1)
															{
																speechManager->AddSpeech(M(i), AIVector->at(M(i)->AI)->GetSpeechString(M(i), (IsCaptain(M(i)))), GetColor(M(i)));
															}

														}
														else if (M(i) == captain && groupMembers.size() > 1)
														{
															if (Ai()->Chance(50))
															{
																captain->currentActivity = CEnemy::CurrentActivity::spottedPlayer;
																speechManager->AddSpeech(captain, AIVector->at(captain->AI)->GetSpeechString(captain, true), captainColor);
															}
														}
													}
													else allAware = false;
												}
												else
												{
													M(i)->currentActivity = CEnemy::CurrentActivity::fighting;
													Ai(i)->Attack(M(i));
													if (M(i)->GetPlayerVisible())
														M(i)->Aim();
												}
											}
											if (allAware)
											{
												activity = GroupActivity::fighting;
											}

	}
		break;
	case GroupActivity::retreating:
		for (int i = 0; i < groupMembers.size(); i++)
		{
			if (IsDelayZero(i))
			{	
				if (M(i)->currentActivity == CEnemy::CurrentActivity::retreating)
					Ai(i)->Retreat(M(i));
			}
			if (Ai()->ContinuousChance(7000))
			{
				InitDelays();
				activity = GroupActivity::fighting;

			}
		}
		break;

	case GroupActivity::fighting:
		for (int i = 0; i < groupMembers.size(); i++)
		{
			if (IsDelayZero(i))
			{
				if (M(i)->currentActivity != CEnemy::CurrentActivity::deserting)
				{
					Ai(i)->Attack(M(i));
					if (Ai(i)->ContinuousChance(20000))
						speechManager->AddSpeech(M(i), Ai(i)->GetSpeechString(M(i), (IsCaptain(M(i)))), GetColor(M(i)));
				}

			}
		}
		if (Ai()->ContinuousChance(100000) && IsCaptainAlive() && HasSufferedCasualties() && groupMembers.size() > 1)
		{
			captain->currentActivity = CEnemy::CurrentActivity::retreating;
			speechManager->AddSpeech(captain, Ai(0)->GetSpeechString(captain, true), captainColor);
			activity = GroupActivity::retreating;
			InitDelays();
			for (int i = 0; i < groupMembers.size(); i++)
			{
				if (M(i)->currentActivity != CEnemy::CurrentActivity::deserting)
				{
					M(i)->currentActivity = CEnemy::CurrentActivity::retreating;
				}
			}
		}
		if (Ai()->ContinuousChance(30000) && IsCaptainAlive() && captain->currentActivity != CEnemy::CurrentActivity::deserting && losingMorals)
		{
			braveryBoost = 100;
			captain->currentActivity = CEnemy::CurrentActivity::braveryboost;
			if (!IsAlone())
				speechManager->AddSpeech(captain, Ai()->GetSpeechString(captain, true), GetColor(captain));
			captain->currentActivity = CEnemy::CurrentActivity::fighting;
			for (int i = 0; i < groupMembers.size(); i++)
			{
				if (groupMembers[i]->currentActivity == CEnemy::CurrentActivity::deserting)
				{
					groupMembers[i]->currentActivity = CEnemy::CurrentActivity::fighting;
				}
			}
		}
		lastKnownDirection = Ai()->GetPlayerHorizontalDirection(Ai()->GetEnemyClosestToPlayerFromVector(groupMembers));
	case GroupActivity::searching:
		for (int i = 0; i < groupMembers.size(); i++)
		{
			if (M(i)->currentActivity == CEnemy::CurrentActivity::searching)
			{
				Ai(i)->Search(M(i), lastKnownDirection);
			}
		}
		if (Ai(0)->ContinuousChance(15000) && !IsAlone())
		{
			CEnemy * closest = Ai()->GetEnemyClosestToPlayerFromVector(groupMembers);
			speechManager->AddSpeech(closest, Ai(closest)->GetSpeechString(closest, IsCaptain(closest)), GetColor(closest));
		}
	}
	return false;
}