Example #1
0
        private bool FilterJamTargets(GenericShip ship)
        {
            if (ship.Owner.PlayerNo == Selection.ThisShip.Owner.PlayerNo)
            {
                return(false);
            }
            if (ship.Tokens.HasToken(typeof(JamToken)))
            {
                return(false);
            }

            BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(Selection.ThisShip, ship);
            if (distanceInfo.Range <= 1)
            {
                return(true);
            }

            BoardTools.ShotInfo shotInfo = new BoardTools.ShotInfo(Selection.ThisShip, ship, Selection.ThisShip.PrimaryWeapons);
            if (shotInfo.Range <= 2 && shotInfo.InPrimaryArc)
            {
                return(true);
            }

            return(false);
        }
Example #2
0
        public override bool IsDiceModificationAvailable()
        {
            bool result = false;

            if (Combat.AttackStep == (RerollType == RerollTypeEnum.AttackDice ? CombatStep.Attack : CombatStep.Defence))
            {
                var friendlyShip = RerollType == RerollTypeEnum.AttackDice ? Combat.Attacker : Combat.Defender;

                if (CanReRollWithWeaponClass())
                {
                    if (CanUseOwnAbility || friendlyShip != Host)
                    {
                        if (friendlyShip.Owner == Host.Owner)
                        {
                            BoardTools.DistanceInfo positionInfo = new BoardTools.DistanceInfo(Host, friendlyShip);
                            if (positionInfo.Range <= MaxFriendlyShipRange)
                            {
                                result = true;
                            }
                        }
                    }
                }
            }

            return(result);
        }
Example #3
0
        private void SaturationSalvoDamage(object sender, System.EventArgs e)
        {
            var allShips = Roster.AllShips.Select(x => x.Value).ToList();

            foreach (GenericShip ship in allShips)
            {
                if (ship.ShipId == Combat.Defender.ShipId)
                {
                    continue;
                }

                BoardTools.DistanceInfo shotInfo = new BoardTools.DistanceInfo(Combat.Defender, ship);

                if (shotInfo.Range == 1 && ship.Agility < (Combat.ChosenWeapon as GenericUpgrade).Cost)
                {
                    Triggers.RegisterTrigger(new Trigger()
                    {
                        Name         = ship.ShipId + ": Saturation Salvo Damage Check",
                        TriggerType  = TriggerTypes.OnAbilityDirect,
                        TriggerOwner = ship.Owner.PlayerNo,
                        EventHandler = StartSaturationSalvoCheckSubPhase,
                        Sender       = ship
                    });
                }
            }

            Triggers.ResolveTriggers(TriggerTypes.OnAbilityDirect, Triggers.FinishTrigger);
        }
Example #4
0
        private void CheckSelflessnessAbility(GenericShip toDamage, DamageSourceEventArgs e)
        {
            curToDamage   = toDamage;
            curDamageInfo = e;

            // Is this ship the defender in combat?
            if (Combat.Defender != curToDamage)
            {
                return;
            }

            // Is the damage type a ship attack?
            if (curDamageInfo.DamageType != DamageTypes.ShipAttack)
            {
                return;
            }

            // Is the defender on our team and not us? If not return.
            if (Combat.Defender.Owner.PlayerNo != HostShip.Owner.PlayerNo || Combat.Defender.ShipId == HostShip.ShipId)
            {
                return;
            }

            // If the defender is at range one of us we register our trigger to prevent damage.
            BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(Combat.Defender, HostShip);
            if (distanceInfo.Range == 1 && Combat.DiceRollAttack.RegularSuccesses > 0)
            {
                RegisterAbilityTrigger(TriggerTypes.OnTryDamagePrevention, UseSelflessnessAbility);
            }
        }
Example #5
0
        private void DoSplashDamage(GenericShip harpoonedShip, Action callback)
        {
            Messages.ShowInfo("\"Harpooned!\" condition deals splash damage");

            var ships = Roster.AllShips.Select(x => x.Value).ToList();

            foreach (GenericShip ship in ships)
            {
                // Defending ship shouldn't suffer additional damage
                if (ship.ShipId == harpoonedShip.ShipId)
                {
                    continue;
                }

                BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(harpoonedShip, ship);

                if (distanceInfo.Range == 1)
                {
                    DamageSourceEventArgs harpoonconditionDamage = new DamageSourceEventArgs()
                    {
                        Source     = "Harpoon Condition",
                        DamageType = DamageTypes.CardAbility
                    };

                    ship.Damage.TryResolveDamage(1, harpoonconditionDamage, callback);
                }
            }
        }
Example #6
0
        private void AssaultMissilesHitEffect()
        {
            var ships = Roster.AllShips.Select(x => x.Value).ToList();

            foreach (GenericShip ship in ships)
            {
                // null refs?
                if (ship.Model == null || Combat.Defender == null || Combat.Defender.Model == null)
                {
                    continue;
                }

                // Defending ship shouldn't suffer additional damage
                if (ship.Model == Combat.Defender.Model)
                {
                    continue;
                }

                BoardTools.DistanceInfo shotInfo = new BoardTools.DistanceInfo(Combat.Defender, ship);

                if (shotInfo.Range == 1)
                {
                    //Messages.ShowErrorToHuman(string.Format("{0} is within range 1 of {1}; assault missile deals 1 damage!", ship.PilotName, Combat.Defender.PilotName));

                    DamageSourceEventArgs assaultsplashDamage = new DamageSourceEventArgs()
                    {
                        Source     = "Assault Missile",
                        DamageType = DamageTypes.CardAbility
                    };

                    ship.Damage.TryResolveDamage(1, assaultsplashDamage, Triggers.FinishTrigger);
                }
            }
        }
Example #7
0
        public void CanPerformTargetLock(ref bool result, GenericShip attacker, ITargetLockable defender)
        {
            bool abilityIsActive = false;

            if (defender is GenericShip)
            {
                if ((defender as GenericShip).ShipId != HostShip.ShipId)
                {
                    if ((defender as GenericShip).Owner.PlayerNo == HostShip.Owner.PlayerNo)
                    {
                        BoardTools.DistanceInfo positionInfo = new BoardTools.DistanceInfo(attacker, HostShip);
                        if (positionInfo.Range >= attacker.TargetLockMinRange && positionInfo.Range <= attacker.TargetLockMaxRange)
                        {
                            abilityIsActive = true;
                        }
                    }
                }

                if (abilityIsActive)
                {
                    if (Roster.GetPlayer(Phases.CurrentPhasePlayer).GetType() == typeof(Players.HumanPlayer))
                    {
                        Messages.ShowErrorToHuman("Captain Kagi: You cannot target lock that ship");
                    }
                    result = false;
                }
            }
        }
Example #8
0
        protected virtual bool IsAvailable()
        {
            if (Combat.AttackStep != CombatStep.Attack)
            {
                return(false);
            }

            if (Combat.Attacker == HostShip)
            {
                return(false);
            }
            if (Combat.Attacker.Owner != HostShip.Owner)
            {
                return(false);
            }

            if (Combat.ChosenWeapon.GetType() != typeof(PrimaryWeaponClass))
            {
                return(false);
            }

            BoardTools.DistanceInfo positionInfo = new BoardTools.DistanceInfo(HostShip, Combat.Attacker);
            if (positionInfo.Range > 1)
            {
                return(false);
            }

            return(true);
        }
Example #9
0
        protected override bool IsAvailable()
        {
            if (Combat.AttackStep != CombatStep.Attack)
            {
                return(false);
            }

            if (Combat.Attacker.Owner != HostShip.Owner)
            {
                return(false);
            }

            if (Combat.ChosenWeapon.WeaponType != WeaponTypes.PrimaryWeapon)
            {
                return(false);
            }

            BoardTools.DistanceInfo positionInfo = new BoardTools.DistanceInfo(HostShip, Combat.Attacker);
            if (positionInfo.Range > 1)
            {
                return(false);
            }

            return(true);
        }
Example #10
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;
            }
        }
Example #11
0
 private bool FilterTargets(GenericShip ship)
 {
     //Filter other friendly ships range 1
     BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(Host, ship);
     return(ship.Owner.PlayerNo != Host.Owner.PlayerNo &&
            ship != Host &&
            distanceInfo.Range == 1);
 }
Example #12
0
 private void CheckSelflessnessAbility()
 {
     if (Combat.Defender.Owner.PlayerNo == HostShip.Owner.PlayerNo && Combat.Defender.ShipId != HostShip.ShipId)
     {
         BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(Combat.Defender, HostShip);
         if (distanceInfo.Range == 1 && Combat.DiceRollAttack.RegularSuccesses > 0)
         {
             RegisterAbilityTrigger(TriggerTypes.OnTryDamagePrevention, UseSelflessnessAbility);
         }
     }
 }
Example #13
0
 private 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);
         }
     }
 }
Example #14
0
 private void RegisterJanOrsCrewAbility(GenericShip ship, System.Type tokenType)
 {
     if (tokenType == typeof(Tokens.FocusToken) && ship.Owner == HostShip.Owner && !IsAbilityUsed)
     {
         BoardTools.DistanceInfo positionInfo = new BoardTools.DistanceInfo(ship, HostShip);
         if (positionInfo.Range <= 3)
         {
             TargetShip = ship;
             RegisterAbilityTrigger(TriggerTypes.OnBeforeTokenIsAssigned, ShowDecision);
         }
     }
 }
Example #15
0
 private void CheckAbility(GenericShip ship)
 {
     if (!IsAbilityUsed && ship.Owner.PlayerNo == HostShip.Owner.PlayerNo && ship.AssignedManeuver.ColorComplexity == Movement.MovementComplexity.Normal)
     {
         BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(HostShip, ship);
         if (distanceInfo.Range < 3)
         {
             ShipToRemoveStress = ship;
             RegisterAbilityTrigger(TriggerTypes.OnMovementFinish, AskKananJarrusAbility);
         }
     }
 }
Example #16
0
 private void CheckCarnorJaxRestriction(GenericShip ship, ActionsList.GenericAction action, ref bool isAllowed)
 {
     if (ship.Owner != HostShip.Owner && action.TokensSpend.Any(token => token == typeof(FocusToken) || token == typeof(EvadeToken)))
     {
         BoardTools.DistanceInfo positionInfo = new BoardTools.DistanceInfo(ship, HostShip);
         if (positionInfo.Range <= 1)
         {
             Messages.ShowErrorToHuman("Carnor Jax: Cannot perform focus or evade actions, or spend focus or evade tokens");
             isAllowed = false;
         }
     }
 }
Example #17
0
 private void CaptainYorrPilotAbility(GenericShip ship, System.Type tokenType)
 {
     if (tokenType == typeof(Tokens.StressToken) && ship.Owner == HostShip.Owner && ship != HostShip && HostShip.Tokens.CountTokensByType(typeof(Tokens.StressToken)) <= 2)
     {
         BoardTools.DistanceInfo positionInfo = new BoardTools.DistanceInfo(ship, HostShip);
         if (positionInfo.Range <= 2)
         {
             TargetShip = ship;
             RegisterAbilityTrigger(TriggerTypes.OnBeforeTokenIsAssigned, ShowDecision);
         }
     }
 }
Example #18
0
        private void RegisterTrigger(GenericShip ship)
        {
            var range = new BoardTools.DistanceInfo(HostShip, Combat.Attacker).Range;

            if (Combat.Attacker.Owner == HostShip.Owner &&
                Combat.Defender.Owner != HostShip.Owner &&
                HostShip.SectorsInfo.IsShipInSector(Combat.Defender, Arcs.ArcType.Front) &&
                range >= 1 && range <= 2)
            {
                RegisterAbilityTrigger(TriggerTypes.OnAttackFinish, AskPerformFocusAction);
            }
        }
Example #19
0
        private 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);
            }
        }
Example #20
0
 private void RegisterAbility(GenericShip ship, Type tokenType)
 {
     if (tokenType == typeof(Tokens.WeaponsDisabledToken) && ship.Owner == HostShip.Owner && !ship.IsStressed && ship != HostShip && HostShip.State.Charges > 0)
     {
         BoardTools.DistanceInfo positionInfo = new BoardTools.DistanceInfo(ship, HostShip);
         if (positionInfo.Range == 1)
         {
             TargetShip = ship;
             RegisterAbilityTrigger(TriggerTypes.OnBeforeTokenIsAssigned, ShowDecision);
         }
     }
 }
Example #21
0
 private void RegisterScavengerCraneAbility(GenericShip destroyedShip, bool isFled)
 {
     BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(HostShip, destroyedShip);
     if (distanceInfo.Range <= 2)
     {
         var recoverableUpgrades = GetRecoverableUpgrades();
         if (recoverableUpgrades.Length > 0)
         {
             RegisterAbilityTrigger(TriggerTypes.OnShipIsDestroyed, AskUseScavengerCrane);
         }
     }
 }
Example #22
0
 private void CheckAbility(GenericShip ship)
 {
     if (ship.IsBumped || BoardTools.Board.IsOffTheBoard(ship) || !HostShip.Tokens.HasToken <ForceToken>())
     {
         return;
     }
     if (ship.Owner.PlayerNo == HostShip.Owner.PlayerNo && ship.AssignedManeuver.ColorComplexity == Movement.MovementComplexity.Normal)
     {
         BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(HostShip, ship);
         if (distanceInfo.Range < 3)
         {
             ShipToRemoveStress = ship;
             RegisterAbilityTrigger(TriggerTypes.OnMovementFinish, AskKananJarrusAbility);
         }
     }
 }
        private void AssaultMissilesHitEffect()
        {
            var ships = Roster.AllShips.Select(x => x.Value).ToList();

            foreach (GenericShip ship in ships)
            {
                // null refs?
                if (ship.Model == null || Combat.Defender == null || Combat.Defender.Model == null)
                {
                    continue;
                }

                // Defending ship shouldn't suffer additional damage
                if (ship.Model == Combat.Defender.Model)
                {
                    continue;
                }

                BoardTools.DistanceInfo shotInfo = new BoardTools.DistanceInfo(Combat.Defender, ship);

                if (shotInfo.Range == 1)
                {
                    //Messages.ShowErrorToHuman(string.Format("{0} is within range 1 of {1}; assault missile deals 1 damage!", ship.PilotName, Combat.Defender.PilotName));

                    var diceRoll = new DiceRoll(DiceKind.Attack, 0, DiceRollCheckType.Combat);
                    diceRoll.AddDice(DieSide.Success);
                    var hitDie = diceRoll.DiceList [0];
                    ship.AssignedDamageDiceroll.DiceList.Add(hitDie);

                    Triggers.RegisterTrigger(new Trigger()
                    {
                        Name         = "Suffer Assault Missile Damage",
                        TriggerType  = TriggerTypes.OnDamageIsDealt,
                        TriggerOwner = ship.Owner.PlayerNo,
                        EventHandler = ship.SufferDamage,
                        Skippable    = true,
                        EventArgs    = new DamageSourceEventArgs()
                        {
                            Source     = "Assault Missile",
                            DamageType = DamageTypes.CardAbility
                        }
                    });
                }
            }

            Triggers.ResolveTriggers(TriggerTypes.OnDamageIsDealt, Triggers.FinishTrigger);
        }
Example #24
0
        private void AssignIonTokens()
        {
            shipsToAssignIon = new List <GenericShip>();

            var ships = Roster.AllShips.Select(x => x.Value).ToList();

            foreach (GenericShip ship in ships)
            {
                BoardTools.DistanceInfo shotInfo = new BoardTools.DistanceInfo(Combat.Defender, ship);
                if (shotInfo.Range == 1)
                {
                    shipsToAssignIon.Add(ship);
                }
            }

            AssignIonTokensRecursive();
        }
Example #25
0
        protected bool FilterTargetsByRange(GenericShip ship, int minRange, int maxRange)
        {
            bool result = true;

            if ((Phases.CurrentSubPhase as SelectShipSubPhase) == null || (Phases.CurrentSubPhase as SelectShipSubPhase).CanMeasureRangeBeforeSelection)
            {
                BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(Selection.ThisShip, ship);
                if (distanceInfo.Range < minRange)
                {
                    return(false);
                }
                if (distanceInfo.Range > maxRange)
                {
                    return(false);
                }
            }

            return(result);
        }
Example #26
0
        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);
        }
Example #27
0
        public override bool IsActionEffectAvailable()
        {
            bool result = true;

            foreach (var friendlyShip in Host.Owner.Ships)
            {
                if (friendlyShip.Value.ShipId != Host.ShipId)
                {
                    BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(Host, friendlyShip.Value);
                    if (distanceInfo.Range < 3)
                    {
                        result = false;
                        break;
                    }
                }
            }

            return(result);
        }
Example #28
0
        public bool IsDiceModificationAvailable()
        {
            var noFriendlyShipsInRange0to2 = true;

            foreach (var friendlyShip in HostShip.Owner.Ships)
            {
                if (friendlyShip.Value != HostShip)
                {
                    BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(HostShip, friendlyShip.Value);
                    if (distanceInfo.Range < 3)
                    {
                        noFriendlyShipsInRange0to2 = false;
                        break;
                    }
                }
            }

            return((HostShip.IsAttacking || HostShip.IsDefending) && noFriendlyShipsInRange0to2 && HostUpgrade.State.Charges > 0);
        }
Example #29
0
        private void DoSplashDamage(GenericShip harpoonedShip, Action callback)
        {
            Messages.ShowInfo("\"Harpooned!\" condition deals splash damage");

            var ships = Roster.AllShips.Select(x => x.Value).ToList();

            foreach (GenericShip ship in ships)
            {
                // Defending ship shouldn't suffer additional damage
                if (ship.ShipId == harpoonedShip.ShipId)
                {
                    continue;
                }

                BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(harpoonedShip, ship);

                if (distanceInfo.Range == 1)
                {
                    var diceRoll = new DiceRoll(DiceKind.Attack, 0, DiceRollCheckType.Combat);
                    diceRoll.AddDice(DieSide.Success);
                    var hitDie = diceRoll.DiceList[0];
                    ship.AssignedDamageDiceroll.DiceList.Add(hitDie);

                    Triggers.RegisterTrigger(new Trigger()
                    {
                        Name         = "Suffer \"Harpooned!\" condition damage",
                        TriggerType  = TriggerTypes.OnDamageIsDealt,
                        TriggerOwner = ship.Owner.PlayerNo,
                        EventHandler = ship.SufferDamage,
                        Skippable    = true,
                        EventArgs    = new DamageSourceEventArgs()
                        {
                            Source     = "\"Harpooned!\" condition",
                            DamageType = DamageTypes.CardAbility
                        }
                    });
                }
            }

            Triggers.ResolveTriggers(TriggerTypes.OnDamageIsDealt, callback);
        }
Example #30
0
        private void CheckIdenVersioAbilitySE(GenericShip toDamage, DamageSourceEventArgs e)
        {
            curToDamage = toDamage;

            // Is the defender on our team? If not return.
            if (curToDamage.Owner.PlayerNo != HostShip.Owner.PlayerNo)
            {
                return;
            }

            if (!(curToDamage is Ship.SecondEdition.TIELnFighter.TIELnFighter))
            {
                return;
            }

            // If the defender is at range one of us we register our trigger to prevent damage.
            BoardTools.DistanceInfo distanceInfo = new BoardTools.DistanceInfo(curToDamage, HostShip);
            if (distanceInfo.Range <= 1)
            {
                RegisterAbilityTrigger(TriggerTypes.OnTryDamagePrevention, UseIdenVersioAbilitySE);
            }
        }