コード例 #1
0
ファイル: CZoanthropeAI.cpp プロジェクト: bmer/Mammoth
DWORD CZoanthropeAI::OnCommunicate (CSpaceObject *pSender, MessageTypes iMessage, CSpaceObject *pParam1, DWORD dwParam2)

//	Communicate
//
//	Handle communications from other objects

	{
	switch (iMessage)
		{
		case msgAttack:
		case msgAttackDeter:
			{
			switch (m_State)
				{
				case stateOnEscortCourse:
				case stateReturningFromThreat:
				case stateWaitingForThreat:
					SetState(stateAttackingThreat, m_pBase, pParam1);
					ASSERT(m_pTarget->DebugIsValid() && m_pTarget->NotifyOthersWhenDestroyed());
					return resAck;

				case stateOnPatrolOrbit:
					SetState(stateAttackingOnPatrol, m_pBase, pParam1);
					ASSERT(m_pTarget->DebugIsValid() && m_pTarget->NotifyOthersWhenDestroyed());
					return resAck;

				default:
					return resNoAnswer;
				}
			}

		case msgQueryEscortStatus:
			{
			if (GetEscortPrincipal() == pParam1)
				return resAck;
			else
				return resNoAnswer;
			}

		default:
			return resNoAnswer;
		}
	}
コード例 #2
0
DWORD CAutonAI::OnCommunicate (CSpaceObject *pSender, MessageTypes iMessage, CSpaceObject *pParam1, DWORD dwParam2)

//	Communicate
//
//	Handle communications from other objects

	{
	switch (iMessage)
		{
		case msgAttack:
		case msgAttackDeter:
			{
			if (GetCurrentOrder() == IShipController::orderEscort
					&& !m_AICtx.IsNonCombatant())
				{
				SetState(stateAttackingTarget);
				m_pTarget = pParam1;
				return resAck;
				}
			else
				return resNoAnswer;
			}

		case msgAbort:
			{
			SetState(stateNone);
			return resAck;
			}

		case msgFormUp:
			{
			if (m_State == stateWaiting || m_State == stateAttackingTarget)
				{
				SetState(stateNone);
				return resAck;
				}
			else
				return resNoAnswer;
			}

		case msgQueryCommunications:
			{
			if (GetCurrentOrder() == IShipController::orderEscort)
				{
				DWORD dwRes = 0;
				if (!m_AICtx.IsNonCombatant())
					dwRes |= resCanAttack;
				if (m_State == stateAttackingTarget)
					dwRes |= (resCanAbortAttack | resCanFormUp);
				if (m_State != stateWaiting)
					dwRes |= resCanWait;
				else
					dwRes |= resCanFormUp;

				return dwRes;
				}
			else
				return 0;
			}

		case msgQueryEscortStatus:
			{
			if (GetEscortPrincipal() == pParam1)
				return resAck;
			else
				return resNoAnswer;
			}

		case msgQueryWaitStatus:
			return (m_State == stateWaiting ? resAck : resNoAnswer);

		case msgWait:
			{
			if (GetCurrentOrder() == IShipController::orderEscort)
				{
				SetState(stateWaiting);
				m_pDest = GetCurrentOrderTarget();
				return resAck;
				}
			else
				return resNoAnswer;
			}

		default:
			return resNoAnswer;
		}
	}
コード例 #3
0
DWORD CFleetShipAI::OnCommunicate (CSpaceObject *pSender, MessageTypes iMessage, CSpaceObject *pParam1, DWORD dwParam2)

//	Communicate
//
//	Handle communications from other objects

	{
	switch (iMessage)
		{
		case msgAbort:
			{
			if (m_State == stateAttackTarget
					|| m_State == stateAttackAtWill
					|| m_State == stateAttackInFormation)
				SetState(stateNone);
			return resAck;
			}

		case msgAttack:
			{
			if (GetCurrentOrder() == IShipController::orderEscort)
				{
				SetState(stateAttackTarget);
				m_pTarget = pParam1;
				m_iCounter = 0;
				ASSERT(m_pTarget);
				return resAck;
				}
			else
				return resNoAnswer;
			}

		case msgAttackInFormation:
			{
			if (GetCurrentOrder() == IShipController::orderEscort)
				{
				SetState(stateAttackInFormation);
				m_iCounter = dwParam2;
				return resAck;
				}
			else
				return resNoAnswer;
			}

		case msgBreakAndAttack:
			{
			if (GetCurrentOrder() == IShipController::orderEscort)
				{
				SetState(stateAttackAtWill);
				return resAck;
				}
			else
				return resNoAnswer;
			}

		case msgFormUp:
			{
			if (GetCurrentOrder() == IShipController::orderEscort)
				{
				if (dwParam2 != 0xffffffff)
					SetCurrentOrderData(dwParam2);

				SetState(stateNone);
				return resAck;
				}
			else
				return resNoAnswer;
			}

		case msgQueryCommunications:
			{
			if (GetCurrentOrder() == IShipController::orderEscort && GetCurrentOrderTarget() == pSender)
				{
				DWORD dwRes = (resCanBeInFormation | resCanAttack | resCanBreakAndAttack);
				if (m_State == stateAttackTarget
						|| m_State == stateAttackAtWill
						|| m_State == stateAttackInFormation)
					dwRes |= resCanAbortAttack;
				else if (m_State == stateKeepFormation)
					dwRes |= resCanAttackInFormation;

				return dwRes;
				}
			else
				return resNoAnswer;
			}

		case msgQueryEscortStatus:
		case msgQueryFleetStatus:
			{
			if (GetEscortPrincipal() == pParam1)
				return resAck;
			else
				return resNoAnswer;
			}

		default:
			return resNoAnswer;
		}
	}