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; } }
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); }
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); } } }
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); } } }
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); }
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); } }
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); }
// 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); }
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; } } }
//util functions public static int GetRangeOfShips(GenericShip from, GenericShip to) { DistanceInfo positionInfo = new DistanceInfo(from, to); return(positionInfo.Range); }
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); * } * }*/ }