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; }
public PilotPositionPair(UnitPilot Pilot, RelativeVector Position) { this.Pilot = Pilot; this.Position = Position; }
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; } }
/// <summary> /// orderes unit to fly to specified target /// </summary> /// <param name="Target">target to fly</param> public void GoTo(RelativeVector Target) { GoTo(Target, true); }
/// <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; }
/// <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); }
/// <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); }