Ejemplo n.º 1
0
        public void CanPerformAttack(ref bool result, List <string> stringList)
        {
            bool shipIsProtected = false;

            if (Selection.AnotherShip.ShipId != HostShip.ShipId)
            {
                if (Selection.AnotherShip.Owner.PlayerNo == HostShip.Owner.PlayerNo)
                {
                    BoardTools.DistanceInfo positionInfo = new BoardTools.DistanceInfo(Selection.AnotherShip, HostShip);
                    if (positionInfo.Range <= 1)
                    {
                        if (!Selection.ThisShip.ShipsBumped.Contains(HostShip))
                        {
                            if (Combat.ChosenWeapon.IsShotAvailable(HostShip))
                            {
                                shipIsProtected = true;
                            }
                        }
                    }
                }
            }

            if (shipIsProtected)
            {
                if (Roster.GetPlayer(Phases.CurrentPhasePlayer).GetType() == typeof(Players.HumanPlayer))
                {
                    stringList.Add("Biggs DarkLighter: You cannot attack target ship");
                }
                result = false;
            }
        }
Ejemplo n.º 2
0
        public static bool CheckInRange(GenericShip thisShip, GenericShip anotherShip, int minRange, int maxRange, RangeCheckReason reason = RangeCheckReason.Other)
        {
            DistanceInfo distInfo = new DistanceInfo(thisShip, anotherShip);
            bool         inRange  = distInfo.Range >= minRange && distInfo.Range <= maxRange;

            inRange = thisShip.CallOnCheckRange(anotherShip, minRange, maxRange, reason, inRange);

            return(inRange);
        }
Ejemplo n.º 3
0
 protected virtual void RegisterJanOrsAbility()
 {
     if (Combat.Attacker.Owner.PlayerNo == HostShip.Owner.PlayerNo && Combat.Attacker.ShipId != HostShip.ShipId)
     {
         BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(Combat.Attacker, HostShip);
         if (distanceInfo.Range < 4)
         {
             RegisterAbilityTrigger(TriggerTypes.OnAttackStart, AskJanOrsAbility);
         }
     }
 }
Ejemplo n.º 4
0
 protected override void RegisterJanOrsAbility()
 {
     if (Combat.Attacker.Owner.PlayerNo == HostShip.Owner.PlayerNo && Combat.Attacker.ShipId != HostShip.ShipId)
     {
         BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(Combat.Attacker, HostShip);
         if (distanceInfo.Range < 4 && Board.IsShipInArcByType(HostShip, Combat.Attacker, ArcTypes.Mobile))
         {
             RegisterAbilityTrigger(TriggerTypes.OnAttackStart, AskJanOrsAbility);
         }
     }
 }
Ejemplo n.º 5
0
        private int GetAiAbilityPriority(GenericShip ship)
        {
            var result = 0;

            var range = new BoardTools.DistanceInfo(HostShip, ship).Range;

            result += (3 - range) * 100;

            result += ship.PilotInfo.Cost;

            return(result);
        }
Ejemplo n.º 6
0
        protected virtual void CheckPilotAbility()
        {
            bool IsDifferentPlayer = (HostShip.Owner.PlayerNo != Combat.Attacker.Owner.PlayerNo);
            bool HasFocusTokens    = HostShip.Tokens.HasToken(typeof(Tokens.FocusToken));

            BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(HostShip, Combat.Attacker);

            if (IsDifferentPlayer && HasFocusTokens && distanceInfo.Range < 3)
            {
                RegisterAbilityTrigger(TriggerTypes.OnAttackStart, AskDecreaseAttack);
            }
        }
Ejemplo n.º 7
0
        public static float DistanceToNearestEnemy(GenericShip ship)
        {
            float result = float.MaxValue;

            foreach (GenericShip enemyShip in ship.Owner.EnemyShips.Values)
            {
                DistanceInfo distInfo = new DistanceInfo(ship, enemyShip);
                if (distInfo.MinDistance.DistanceReal < result)
                {
                    result = distInfo.MinDistance.DistanceReal;
                }
            }

            return(result);
        }
Ejemplo n.º 8
0
        // TODO: Remove, used in AI/HotAC/TargetForAttackSelector
        public Dictionary <GenericShip, float> GetEnemyShipsAndDistance(GenericShip thisShip, bool ignoreCollided = false, bool inArcAndRange = false)
        {
            Dictionary <GenericShip, float> results = new Dictionary <GenericShip, float>();

            foreach (var shipHolder in Roster.GetPlayer(Roster.AnotherPlayer(thisShip.Owner.PlayerNo)).Ships)
            {
                if (!shipHolder.Value.IsDestroyed)
                {
                    if (ignoreCollided)
                    {
                        if (thisShip.LastShipCollision != null)
                        {
                            if (thisShip.LastShipCollision.ShipId == shipHolder.Value.ShipId)
                            {
                                continue;
                            }
                        }
                        if (shipHolder.Value.LastShipCollision != null)
                        {
                            if (shipHolder.Value.LastShipCollision.ShipId == thisShip.ShipId)
                            {
                                continue;
                            }
                        }
                    }

                    if (inArcAndRange)
                    {
                        BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(thisShip, shipHolder.Value);
                        if ((distanceInfo.Range > 3))
                        {
                            continue;
                        }
                    }

                    float distance = Vector3.Distance(thisShip.GetCenter(), shipHolder.Value.GetCenter());
                    results.Add(shipHolder.Value, distance);
                }
            }
            results = results.OrderBy(n => n.Value).ToDictionary(n => n.Key, n => n.Value);

            return(results);
        }
Ejemplo n.º 9
0
        private void CheckRange()
        {
            InArcInfo    = new Dictionary <GenericArc, bool>();
            InSectorInfo = new Dictionary <GenericArc, bool>();

            List <ArcType> WeaponArcRestrictions = new List <ArcType>(Weapon.WeaponInfo.ArcRestrictions);

            if (WeaponArcRestrictions.Contains(ArcType.DoubleTurret))
            {
                WeaponArcRestrictions.RemoveAll(a => a == ArcType.DoubleTurret);
                WeaponArcRestrictions.Add(ArcType.SingleTurret);
            }

            foreach (var arc in Ship1.ArcsInfo.Arcs)
            {
                ShotInfoArc shotInfoArc = new ShotInfoArc(Ship1, Ship2, arc);
                InArcInfo.Add(arc, shotInfoArc.InArc);
            }

            List <GenericArc> sectorsAndTurrets = new List <GenericArc>();

            sectorsAndTurrets.AddRange(Ship1.SectorsInfo.Arcs);
            sectorsAndTurrets.AddRange(Ship1.ArcsInfo.Arcs.Where(a => a.ArcType == ArcType.SingleTurret));
            foreach (var arc in sectorsAndTurrets)
            {
                ShotInfoArc shotInfoArc = new ShotInfoArc(Ship1, Ship2, arc);
                InSectorInfo.Add(arc, shotInfoArc.InArc);

                if (WeaponArcRestrictions.Count > 0 && !WeaponArcRestrictions.Contains(arc.ArcType))
                {
                    continue;
                }

                if (shotInfoArc.IsShotAvailable)
                {
                    if (IsShotAvailable == false)
                    {
                        MinDistance = shotInfoArc.MinDistance;
                    }
                    else
                    {
                        if (shotInfoArc.MinDistance.DistanceReal < MinDistance.DistanceReal)
                        {
                            MinDistance = shotInfoArc.MinDistance;
                        }
                    }

                    IsShotAvailable = true;

                    if (!(arc is ArcBullseye))
                    {
                        ShotAvailableFromArcs.Add(arc);
                    }
                }

                if (NearestFailedDistance == null)
                {
                    NearestFailedDistance = shotInfoArc.MinDistance;
                }
                else if (shotInfoArc.MinDistance.DistanceReal < NearestFailedDistance.DistanceReal)
                {
                    NearestFailedDistance = shotInfoArc.MinDistance;
                }
            }

            // For 360 arcs
            if (Weapon.WeaponInfo.CanShootOutsideArc)
            {
                DistanceInfo distInfo = new DistanceInfo(Ship1, Ship2);

                if (distInfo.Range < 4)
                {
                    MinDistance     = distInfo.MinDistance;
                    IsShotAvailable = true;
                }
                else
                {
                    NearestFailedDistance = distInfo.MinDistance;
                }
            }
        }
Ejemplo n.º 10
0
        //util functions
        public static int GetRangeOfShips(GenericShip from, GenericShip to)
        {
            DistanceInfo positionInfo = new DistanceInfo(from, to);

            return(positionInfo.Range);
        }
Ejemplo n.º 11
0
        private void CheckRange()
        {
            InArcInfo    = new Dictionary <GenericArc, bool>();
            InSectorInfo = new Dictionary <GenericArc, bool>();

            foreach (var arc in Ship1.ArcsInfo.Arcs)
            {
                ShotInfoArc shotInfoArc = new ShotInfoArc(Ship1, Ship2, arc);
                InArcInfo.Add(arc, shotInfoArc.InArc);
            }

            List <GenericArc> sectorsAndTurrets = new List <GenericArc>();

            sectorsAndTurrets.AddRange(Ship1.SectorsInfo.Arcs);
            sectorsAndTurrets.AddRange(Ship1.ArcsInfo.Arcs.Where(a => a.ArcType == ArcType.SingleTurret));
            foreach (var arc in sectorsAndTurrets)
            {
                ShotInfoArc shotInfoArc = new ShotInfoArc(Ship1, Ship2, arc, Weapon);
                InSectorInfo.Add(arc, shotInfoArc.InArc);

                if (Weapon.WeaponInfo.ArcRestrictions.Count > 0 && !Weapon.WeaponInfo.ArcRestrictions.Contains(arc.ArcType))
                {
                    continue;
                }

                bool result = shotInfoArc.IsShotAvailable;
                if (arc.ArcType == ArcType.Bullseye)
                {
                    Ship1.CallOnBullseyeArcCheck(Ship2, ref result);
                }

                if (result)
                {
                    if (IsShotAvailable == false)
                    {
                        MinDistance             = shotInfoArc.MinDistance;
                        ObstructedByShips       = shotInfoArc.ObstructedByShips;
                        ObstructedByObstacles   = shotInfoArc.ObstructedByObstacles;
                        IsObstructedByBombToken = shotInfoArc.IsObstructedByBombToken;
                    }
                    else
                    {
                        if (shotInfoArc.MinDistance.DistanceReal < MinDistance.DistanceReal)
                        {
                            MinDistance             = shotInfoArc.MinDistance;
                            ObstructedByShips       = shotInfoArc.ObstructedByShips;
                            ObstructedByObstacles   = shotInfoArc.ObstructedByObstacles;
                            IsObstructedByBombToken = shotInfoArc.IsObstructedByBombToken;
                        }
                    }

                    IsShotAvailable = true;

                    if (!(arc is ArcBullseye) ||
                        (Weapon.WeaponInfo.ArcRestrictions.Count > 0 && Weapon.WeaponInfo.ArcRestrictions.Contains(ArcType.Bullseye)))
                    {
                        ShotAvailableFromArcs.Add(arc);
                    }
                }

                if (NearestFailedDistance == null)
                {
                    NearestFailedDistance = shotInfoArc.MinDistance;
                }
                else if (shotInfoArc.MinDistance.DistanceReal < NearestFailedDistance.DistanceReal)
                {
                    NearestFailedDistance = shotInfoArc.MinDistance;
                }
            }

            // For 360 arcs
            if (Weapon.WeaponInfo.CanShootOutsideArc)
            {
                DistanceInfo distInfo = new DistanceInfo(Ship1, Ship2);

                if (distInfo.Range < 4)
                {
                    MinDistance = distInfo.MinDistance;
                    //TODO: Obstructed shots for 360 arcs
                    IsShotAvailable = true;
                }
                else
                {
                    NearestFailedDistance = distInfo.MinDistance;
                }
            }

            /*Debug.Log("Check results:");
             * if (IsShotAvailable)
             * {
             *  foreach (var item in ObstructedByShips)
             *  {
             *      Debug.Log("Obstructed by " + item.PilotInfo.PilotName);
             *  }
             *  foreach (var item in ObstructedByObstacles)
             *  {
             *      Debug.Log("Obstructed by " + item.Name);
             *  }
             * }*/
        }