Example #1
0
 public StandOffShipControl(
     App game,
     TacticalObjective to,
     CombatAI commanderAI,
     float minDist,
     float desiredDist)
     : base(game, to, commanderAI)
 {
     this.m_Type                = ShipControlType.StandOff;
     this.m_StandOffState       = StandOffShipControl.StandoffState.MoveToTargetPosition;
     this.m_MinStandOffDist     = minDist;
     this.m_DesiredStandOffDist = desiredDist;
     this.m_MoveFromInsideDir   = -Vector3.UnitZ;
     this.m_UseStoredDir        = false;
 }
Example #2
0
        protected override void OnAttackUpdate(int framesElapsed)
        {
            if (this.m_TaskGroupObjective == null || !(this.m_TaskGroupObjective is AttackGroupObjective))
            {
                return;
            }
            Vector3 currentPosition   = this.GetCurrentPosition();
            Vector3 lastKnownPosition = this.m_TaskGroupObjective.m_TargetEnemyGroup.m_LastKnownPosition;
            Vector3 zero1             = Vector3.Zero;
            Ship    ship     = this.m_GroupPriorityTarget != null ? this.m_GroupPriorityTarget : this.m_CommanderAI.GetBestShipTarget(currentPosition, this.m_TaskGroupObjective.m_TargetEnemyGroup.m_Ships);
            Vector3 enemyPos = ship == null ? lastKnownPosition : ship.Maneuvering.Position;

            enemyPos.Y = 0.0f;
            Vector3 vector3_1 = enemyPos - currentPosition;

            vector3_1.Y = 0.0f;
            float   num1 = vector3_1.Normalize();
            Vector3 v1   = this.GetAttackVector(currentPosition, enemyPos);

            if ((double)v1.LengthSquared <= 0.0)
            {
                v1 = -Vector3.UnitZ;
            }
            Vector3 vector3_2 = enemyPos + v1 * this.m_DesiredStandOffDist;

            switch (this.m_StandOffState)
            {
            case StandOffShipControl.StandoffState.Hold:
                if ((double)num1 > (double)this.m_DesiredStandOffDist)
                {
                    this.m_StandOffState = StandOffShipControl.StandoffState.MoveFromOutside;
                }
                else if ((double)num1 < (double)this.m_MinStandOffDist)
                {
                    this.m_StandOffState = StandOffShipControl.StandoffState.MoveFromInside;
                }
                this.m_UseStoredDir = false;
                break;

            case StandOffShipControl.StandoffState.MoveFromOutside:
                this.m_HoldGroundDuration = 0;
                if ((double)num1 < (double)this.m_DesiredStandOffDist && (double)num1 > (double)this.m_MinStandOffDist)
                {
                    this.m_StandOffState = (double)(currentPosition - vector3_2).LengthSquared <= (double)this.m_MinStandOffDist ? StandOffShipControl.StandoffState.Hold : StandOffShipControl.StandoffState.MoveToTargetPosition;
                }
                this.m_UseStoredDir = false;
                break;

            case StandOffShipControl.StandoffState.MoveFromInside:
                if ((double)num1 > (double)this.m_DesiredStandOffDist)
                {
                    this.m_StandOffState = StandOffShipControl.StandoffState.Hold;
                    break;
                }
                break;

            case StandOffShipControl.StandoffState.MoveToTargetPosition:
                if ((double)(currentPosition - vector3_2).LengthSquared < 250000.0)
                {
                    this.m_StandOffState = StandOffShipControl.StandoffState.MoveFromInside;
                    break;
                }
                break;
            }
            Vector3 zero2      = Vector3.Zero;
            Vector3 destFacing = -v1;
            Vector3 vector3_3;

            if (this.m_StandOffState == StandOffShipControl.StandoffState.Hold || this.m_HoldGroundDuration > 0)
            {
                this.FaceShipsToTarget();
                if ((double)num1 < (double)this.m_MinStandOffDist)
                {
                    this.m_HoldGroundDuration -= 2 * framesElapsed;
                }
                else if ((double)num1 < (double)this.m_DesiredStandOffDist)
                {
                    this.m_HoldGroundDuration -= framesElapsed;
                }
                vector3_3   = currentPosition;
                vector3_3.Y = enemyPos.Y;
            }
            else
            {
                if (this.m_StandOffState == StandOffShipControl.StandoffState.MoveFromInside && !(this is SurroundShipControl))
                {
                    if (this.m_HoldGroundDuration <= 0 && (double)num1 - (double)this.m_PrevDistFromEnemy < 20.0)
                    {
                        this.m_MinRunDuration -= framesElapsed;
                        if (this.m_MinRunDuration <= 0)
                        {
                            this.m_HoldGroundDuration = StandOffShipControl.kMinHoldGroundDuration;
                            this.m_MinRunDuration     = StandOffShipControl.kMinRunDuration;
                            Vector3 averageVelocity = this.m_TaskGroupObjective.m_TargetEnemyGroup.GetAverageVelocity(this.m_CommanderAI);
                            double  num2            = (double)averageVelocity.Normalize();
                            if ((double)v1.LengthSquared > 0.0)
                            {
                                this.m_MoveFromInsideDir = v1;
                            }
                            if ((double)Vector3.Dot(averageVelocity, v1) > 0.25)
                            {
                                this.m_MoveFromInsideDir *= -1f;
                            }
                            this.m_UseStoredDir = true;
                        }
                    }
                    else
                    {
                        this.m_MinRunDuration = StandOffShipControl.kMinRunDuration;
                    }
                }
                if (this.m_UseStoredDir)
                {
                    destFacing = -this.m_MoveFromInsideDir;
                }
                vector3_3 = enemyPos + -destFacing * this.m_DesiredStandOffDist;
                if ((this.m_CommanderAI != null ? this.m_CommanderAI.GetPlanetContainingPosition(vector3_3) : (StellarBody)null) != null)
                {
                    vector3_3 = enemyPos + destFacing * this.m_DesiredStandOffDist;
                }
                if (this.IsPlanetSeparatingTarget(vector3_3, currentPosition, 1000f))
                {
                    vector3_3 = enemyPos + vector3_1 * 5000f;
                }
            }
            this.m_PrevDistFromEnemy = num1;
            this.SetFUP(vector3_3, destFacing);
        }