Пример #1
0
 bool EscapeFromThreatingUpdate()
 {
     List<IUnit> threating = this.computer.GetThreateningUnits();
     if (threating.Count > 0)
     {
         int RotateCW = Math.Sign(AngleClass.Difference(controlledUnit.RotationAngle, controlledUnit.AngleTo(threating[0].Position)));
         if (RotateCW == 0) RotateCW = 1;
         flyingTgt = new RelativeVector(GameVector.Normalize(threating[0].Position - controlledUnit.Position).Rotate(RotateCW
             * AngleClass.pi * 0.5f) * 100 + controlledUnit.Position);
         //if (controlledUnit.Name == "Destroyer -4-") { }
         //AI.game.GeometryViewer.DrawLine(new Line(controlledUnit.Position, flyingTgt.Value), Color.Blue);
         return true;
     }
     else return false;
 }
Пример #2
0
 public PilotPositionPair(UnitPilot Pilot, RelativeVector Position)
 {
     this.Pilot = Pilot;
     this.Position = Position;
 }
Пример #3
0
 internal void Update()
 {
     RemoveDeadTarget();
     //finite state machiene method.
     //implements all behaviours of unit.
     switch (behaviour)
     {
         case Behaviours.StandingBy:
             StopMoving();
             if (timer.TimeElapsed)
             {
                 timer.Reset();
                 noObstacles = AvoidObstacles(true);
             }
             UpdateGoingToSpeed();
             UpdateRotatingToAngle();
             //does nothing
             break;
         case Behaviours.PositionHolding:
             //"turret mode"
             //no movings
             //if there is a target in radius
             //then attacks it
             UpdateEnemy();
             TurnToTarget();
             ShootIfWillDamageEnemy();
             radar.Update();
             StopMoving();
             if (timer.TimeElapsed)
             {
                 timer.Reset();
                 noObstacles = AvoidObstacles(true);
             }
             UpdateRotatingToAngle();
             UpdateGoingToSpeed();
             break;
         case Behaviours.Going:
             {
                 radar.Update();
                 UpdateGoingToSpeed();
                 UpdateRotatingToAngle();
                 if (timer.TimeElapsed)
                 {
                     timer.Reset();
                     noObstacles = AvoidObstacles(true);
                 }
                 if (noObstacles)
                 {
                     // ReceivedToFlyingTgt = FlyToTgt(StopNearTgt);
                     ReceivedToFlyingTgt = FlyToTgt(true);
                 }
                 else ReceivedToFlyingTgt = false;
             }
             break;
         case Behaviours.AttackingTarget:
             if (target == null)
             {
                 Stop();
                 break;
             }
             if (timer.TimeElapsed)
             {
                 timer.Reset();
                 noObstacles = AvoidObstacles(true);
             }
             if (escapeThreting)
                 escaping = EscapeFromThreatingUpdate();
             else escaping = false;
             if (target != null && computer.IsInThisShootRadius(target) && !escaping)
             {
                 TurnToTarget();
                 StopMoving();
             }
             else
             {
                 if (noObstacles)
                 {
                     FlyToTgt(true);
                 }
             }
             ShootIfWillDamageEnemy();
             radar.Update();
             UpdateRotatingToAngle();
             UpdateGoingToSpeed();
             break;
         case Behaviours.AttackingClosest:
             EnemyRecalculated = UpdateEnemy();
             if (target != null)
             {
                 if (EnemyRecalculated)
                     flyingTgt = new RelativeVector(target, controlledUnit, controlledUnit.ShootingRadius * 0.9f);
             }
             if (timer.TimeElapsed)
             {
                 timer.Reset();
                 noObstacles = AvoidObstacles(true);
             }
             if (escapeThreting)
                 escaping = EscapeFromThreatingUpdate();
             else escaping = false;
             if (target != null && computer.IsInThisShootRadius(target) && !escaping)
             {
                 TurnToTarget();
                 StopMoving();
             }
             else
             {
                 if (noObstacles)
                 {
                     FlyToTgt(true);
                 }
             }
             UpdateRotatingToAngle();
             UpdateGoingToSpeed();
             if (target == null)
             {
                 Stop();
             }
             ShootIfWillDamageEnemy();
             radar.Update();
             break;
         case Behaviours.GoingRam:
             if (target != null)
             {
                 //radar.Game.GeometryViewer.DrawPoint(target.Position, Color.White);
                 UpdateGoingToSpeed();
                 noObstacles = AvoidObstacles(false);
                 if (noObstacles)
                 {
                     FlyToTgt(false);
                 }
                 ShootIfWillDamageEnemy();
                 radar.Update();
                 UpdateRotatingToAngle();
                 if (target == null) Stop();
             }
             else
             {
                 Stop();
                 HoldPosition();
             }
             break;
         case Behaviours.GoingRamToClosest:
             EnemyRecalculated = UpdateEnemy();
             if (target != null)
             {
                 //radar.Game.GeometryViewer.DrawPoint(target.Position, Color.White);
                 if (EnemyRecalculated) flyingTgt =
                     new RelativeVector(target);
             }
             noObstacles = AvoidObstacles(false);
             if (noObstacles)
             {
                 FlyToTgt(false);
             }
             UpdateRotatingToAngle();
             UpdateGoingToSpeed();
             ShootIfWillDamageEnemy();
             radar.Update();
             break;
         case Behaviours.MaintainOrder:
             ////if isn't near than allowed than tries to go close, else tries to follow leader state
             //if (GameVector.DistanceSquared(flyingTgt.Value, controlledUnit.Position) >
             //    maintainingInOrderData.AllowedDistToOrderedPlace * maintainingInOrderData.AllowedDistToOrderedPlace)
             //{
             //    radar.Update();
             //    UpdateGoingToSpeed();
             //    UpdateRotatingToAngle();
             //    noObstacles = AvoidObstacles(true);
             //    if (noObstacles)
             //    {
             //        FlyToTgt(false);
             //    }
             //    //AI.game.GeometryViewer.DrawPoint(controlledUnit.Position, new Color(0,1,1,1));
             //}
             //else
             //{
             //follow leader state
             SetAngle(maintainingInOrderData.RotationAngle);
             SetSpeed(maintainingInOrderData.Leader.controlledUnit.Speed);
             radar.Update();
             UpdateGoingToSpeed();
             UpdateRotatingToAngle();
             //AI.game.GeometryViewer.DrawPoint(controlledUnit.Position, Color.Green);
             //}
             //UpdateGoingToSpeed();
             //UpdateRotatingToAngle();
             //float AimIsToRepairOrder = GameVector.Distance(flyingTgt.Value, controlledUnit.Position) / maintainingInOrderData.AllowedDistToOrderedPlace;
             //if (AimIsToRepairOrder > 0.5f) AimIsToRepairOrder -= 0.5f;
             //else AimIsToRepairOrder = 0;
             //if (AimIsToRepairOrder > 1) AimIsToRepairOrder = 1;
             //AimIsToRepairOrder = 0;
             //if (GameVector.DistanceSquared(flyingTgt.Value, controlledUnit.Position) >
             //    maintainingInOrderData.AllowedDistToOrderedPlace * maintainingInOrderData.AllowedDistToOrderedPlace)
             //{
             //    noObstacles = AvoidObstacles(true);
             //    if (noObstacles)
             //    {
             //        FlyToTgt(false);
             //    }
             //}
             //float NeededAngle = (angleAim - maintainingInOrderData.RotationAngle) * AimIsToRepairOrder + maintainingInOrderData.RotationAngle;
             //float NeededSpeed = (speedAim - maintainingInOrderData.Leader.controlledUnit.Speed) * AimIsToRepairOrder + maintainingInOrderData.Leader.controlledUnit.Speed;
             //SetAngle(NeededAngle);
             //SetSpeed(NeededSpeed);
             break;
     }
 }
Пример #4
0
 /// <summary>
 /// orderes unit to fly to specified target
 /// </summary>
 /// <param name="Target">target to fly</param>
 public void GoTo(RelativeVector Target)
 {
     GoTo(Target, true);
 }
Пример #5
0
        /// <summary>
        /// orderes unit to fly to specified target
        /// </summary>
        /// <param name="Target">target to fly</param>
        /// <param name="StopNearTgt">true if unit must take care about stop near target point</param>
        public void GoTo(RelativeVector Target, bool StopNearTgt)
        {
            computer.WeakAvoidingObstacles = false;
            this.StopNearTgt = StopNearTgt;
            //tgtPosition = Target;
            flyingTgt = Target;
            allowedSpeed = controlledUnit.Speed;
            relativeSpeedAim = controlledUnit.Speed;

            //allowedSpeed = 0;
            //relativeSpeedAim = 0;
            behaviour = Behaviours.Going;
        }
Пример #6
0
 /// <summary>
 /// orderes unit to go ram to specified target
 /// </summary>
 /// <param name="Target">target to go ram to</param>
 public void GoRam(IUnit Target)
 {
     computer.WeakAvoidingObstacles = false;
     behaviour = Behaviours.GoingRam;
     target = Target;
     AvoidingObstaclesEnabled = true;
     flyingTgt = new RelativeVector(target);
 }
Пример #7
0
 /// <summary>
 /// orderes unit to attack specified target
 /// </summary>
 /// <param name="Target">target to attack</param>
 public void AttackTarget(IUnit Target)
 {
     escapeThreting = false;
     computer.WeakAvoidingObstacles = false;
     behaviour = Behaviours.AttackingTarget;
     target = Target;
     AvoidingObstaclesEnabled = true;
     flyingTgt = new RelativeVector(target, controlledUnit, controlledUnit.ShootingRadius * 0.9f);
 }