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; } }
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; } }
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; } }