예제 #1
0
 private void CheckDamageRedirection(GenericShip ship, DamageSourceEventArgs e)
 {
     if (HostShip.DockedShips.Count > 0 && HostShip.DockedShips.First().State.ShieldsCurrent > 0 && HostShip.DockedShips.First().State.ShieldsCurrent > 0)
     {
         RegisterAbilityTrigger(TriggerTypes.OnTryDamagePrevention, AskToRedirectDamage);
     }
 }
예제 #2
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);
                }
            }
        }
예제 #3
0
        public override void ExplosionEffect(GenericShip ship, Action callBack)
        {
            _ship = ship;

            if (RuleSet.Instance is FirstEdition)
            {
                Triggers.RegisterTrigger(new Trigger()
                {
                    Name         = "Suffer damage from bomb",
                    TriggerType  = TriggerTypes.OnDamageIsDealt,
                    TriggerOwner = ship.Owner.PlayerNo,
                    EventHandler = DetonationFE,
                    EventArgs    = new DamageSourceEventArgs()
                    {
                        Source     = this,
                        DamageType = DamageTypes.BombDetonation
                    }
                });

                Triggers.ResolveTriggers(TriggerTypes.OnDamageIsDealt, callBack);
            }
            else if (RuleSet.Instance is SecondEdition)
            {
                DamageSourceEventArgs protonDamage = new DamageSourceEventArgs()
                {
                    Source     = this,
                    DamageType = DamageTypes.BombDetonation
                };

                _ship.Damage.TryResolveDamage(0, 1, protonDamage, callBack);
            }
        }
예제 #4
0
 private void RegisterDefendAbility(GenericShip ship, DamageSourceEventArgs e)
 {
     if (e.DamageType == DamageTypes.ShipAttack)
     {
         RegisterAbilityTrigger(TriggerTypes.OnTryDamagePrevention, AskToUseDefendAbility);
     }
 }
예제 #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);
                }
            }
        }
예제 #6
0
        private void CheckJosteroAbility(GenericShip damaged, DamageSourceEventArgs damage)
        {
            // Can we even bonus attack?
            if (!HostShip.CanBonusAttack)
            {
                return;
            }

            // Make sure the opposing ship is an enemy.
            if (damaged.Owner == HostShip.Owner)
            {
                return;
            }

            // If the ship is defending we're not interested.
            if (Combat.Defender == damaged || damage.DamageType == DamageTypes.ShipAttack)
            {
                return;
            }

            // Save the value for whether they've attacked or not.
            performedRegularAttack = HostShip.IsAttackPerformed;

            // It may be possible in the future for a non-defender to be damaged in combat so we've got to future proof here.
            if (Combat.AttackStep == CombatStep.None)
            {
                RegisterAbilityTrigger(TriggerTypes.OnDamageInstanceResolved, RegisterBonusAttack);
            }
            else
            {
                Combat.Attacker.OnCombatCheckExtraAttack += StartBonusAttack;
            }
        }
예제 #7
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);
            }
        }
예제 #8
0
 private void CheckAbility(GenericShip ship, DamageSourceEventArgs e)
 {
     if (HostUpgrade.State.Charges > 0 && DamageTypeIsSupported(e))
     {
         RegisterAbilityTrigger(TriggerTypes.OnTryDamagePrevention, AskToUseOwnAbility);
     }
 }
예제 #9
0
        public void CallOnDamageInstanceResolved(DamageSourceEventArgs dsource, Action callback)
        {
            if (OnDamageInstanceResolvedGlobal != null)
            {
                OnDamageInstanceResolvedGlobal(this, dsource);
            }

            Triggers.ResolveTriggers(TriggerTypes.OnDamageInstanceResolved, callback);
        }
예제 #10
0
        public void CallTryDamagePrevention(DamageSourceEventArgs e, Action callback)
        {
            if (OnTryDamagePreventionGlobal != null)
            {
                OnTryDamagePreventionGlobal(this, e);
            }

            Triggers.ResolveTriggers(TriggerTypes.OnTryDamagePrevention, callback);
        }
예제 #11
0
        public override void ExplosionEffect(GenericShip ship, Action callBack)
        {
            DamageSourceEventArgs thermaldetDamage = new DamageSourceEventArgs()
            {
                Source     = this,
                DamageType = DamageTypes.BombDetonation
            };

            ship.Damage.TryResolveDamage(1, thermaldetDamage, delegate { ship.Tokens.AssignToken(typeof(Tokens.StressToken), callBack); });
        }
예제 #12
0
        protected override void SufferNegativeEffect(Action callback)
        {
            DamageSourceEventArgs damageArgs = new DamageSourceEventArgs()
            {
                Source     = HostShip,
                DamageType = DamageTypes.CardAbility
            };

            HostShip.Damage.TryResolveDamage(1, damageArgs, callback);
        }
예제 #13
0
        public override void ExplosionEffect(GenericShip ship, Action callBack)
        {
            DamageSourceEventArgs seismicDamage = new DamageSourceEventArgs()
            {
                Source     = this,
                DamageType = DamageTypes.BombDetonation
            };

            ship.Damage.TryResolveDamage(1, seismicDamage, callBack);
        }
예제 #14
0
    private static void ResolveCombatDamage()
    {
        DamageSourceEventArgs damageArgs = new DamageSourceEventArgs()
        {
            Source     = Attacker,
            DamageType = DamageTypes.ShipAttack
        };

        Defender.Damage.TryResolveDamage(DiceRollAttack.DiceList, damageArgs, AfterShotIsPerformed);
    }
예제 #15
0
        private void SufferDamage()
        {
            DamageSourceEventArgs harpoonconditionDamage = new DamageSourceEventArgs()
            {
                Source     = "Electronic Baffle",
                DamageType = DamageTypes.CardAbility
            };

            HostShip.Damage.TryResolveDamage(1, harpoonconditionDamage, DecisionSubPhase.ConfirmDecision);
        }
예제 #16
0
        protected void DefenderSuffersDamage()
        {
            DamageSourceEventArgs ionturretDamage = new DamageSourceEventArgs()
            {
                Source     = "Ion Cannon Turret",
                DamageType = DamageTypes.ShipAttack
            };

            Combat.Defender.Damage.TryResolveDamage(1, ionturretDamage, Triggers.FinishTrigger);
        }
예제 #17
0
        private void CheckDrawTheirFireAbility(GenericShip ship, DamageSourceEventArgs e)
        {
            curToDamage   = ship;
            curDamageInfo = e;

            if (AbilityCanBeUsed())
            {
                RegisterAbilityTrigger(TriggerTypes.OnTryDamagePrevention, UseDrawTheirFireAbility);
            }
        }
예제 #18
0
        private void DefenderSuffersDamage()
        {
            DamageSourceEventArgs tltDamage = new DamageSourceEventArgs()
            {
                Source     = "Twin Laser Turret",
                DamageType = DamageTypes.ShipAttack
            };

            Combat.Defender.Damage.TryResolveDamage(1, tltDamage, Triggers.FinishTrigger);
        }
예제 #19
0
        protected void DefenderSuffersDamage(System.Action callback)
        {
            DamageSourceEventArgs ionWeaponDamage = new DamageSourceEventArgs()
            {
                Source     = HostShip,
                DamageType = DamageTypes.ShipAttack
            };

            Combat.Defender.Damage.TryResolveDamage(1, ionWeaponDamage, callback);
        }
예제 #20
0
        private void SufferDamage(object sender, System.EventArgs e)
        {
            DamageSourceEventArgs toranikuldaDamage = new DamageSourceEventArgs()
            {
                Source     = "Torani Kulda",
                DamageType = DamageTypes.CardAbility
            };

            Selection.ThisShip.Damage.TryResolveDamage(1, toranikuldaDamage, ConfirmDecision);
        }
예제 #21
0
        public void TryResolveDamage(List <Die> damage, DamageSourceEventArgs e, Action callback)
        {
            // Populate AssignedDamageDiceroll with the results from the damage list.
            foreach (Die d in damage)
            {
                Host.AssignedDamageDiceroll.AddDice(d.Side);
            }

            Host.CallTryDamagePrevention(e, delegate { ResolveDamage(e, callback); });
        }
예제 #22
0
        private void SufferDamage()
        {
            DamageSourceEventArgs damageArgs = new DamageSourceEventArgs()
            {
                DamageType = DamageTypes.CardAbility,
                Source     = HostUpgrade
            };

            HostShip.Damage.TryResolveDamage(1, damageArgs, Triggers.FinishTrigger);
        }
예제 #23
0
        private void SufferCriticalDamage(Action <bool> callback)
        {
            DamageSourceEventArgs damageArgs = new DamageSourceEventArgs()
            {
                DamageType = DamageTypes.CardAbility,
                Source     = HostShip
            };

            HostShip.Damage.TryResolveDamage(0, 1, damageArgs, delegate { callback(true); });
        }
예제 #24
0
            private void ShipIsSelected()
            {
                DamageSourceEventArgs ruthlessDamage = new DamageSourceEventArgs()
                {
                    Source     = HostShip,
                    DamageType = DamageTypes.CardAbility
                };

                TargetShip.Damage.TryResolveDamage(1, ruthlessDamage, SelectShipSubPhase.FinishSelection);
            }
예제 #25
0
        private void DealOneDamage(GenericShip ship, Action callback)
        {
            DamageSourceEventArgs sabineDamage = new DamageSourceEventArgs()
            {
                Source     = this.HostUpgrade,
                DamageType = DamageTypes.CardAbility
            };

            HostShip.Damage.TryResolveDamage(1, sabineDamage, callback);
        }
예제 #26
0
        private void SufferDamage()
        {
            DamageSourceEventArgs asteroidDamage = new DamageSourceEventArgs()
            {
                Source     = "Asteroid",
                DamageType = DamageTypes.ObstacleCollision
            };

            TheShip.Damage.TryResolveDamage(CurrentDiceRoll.DiceList, asteroidDamage, CallBack);
        }
예제 #27
0
        public void TryResolveDamage(int damage, DamageSourceEventArgs e, Action callback)
        {
            List <Die> dice = new List <Die>();

            for (int d = 0; d < damage; d++)
            {
                dice.Add(new Die(null, DiceKind.Attack, DieSide.Success));
            }

            TryResolveDamage(dice, e, callback);
        }
예제 #28
0
 private bool DamageTypeIsSupported(DamageSourceEventArgs e)
 {
     return(
         e.DamageType == DamageTypes.ObstacleCollision ||
         (
             e.DamageType == DamageTypes.BombDetonation &&
             (e.Source as GenericUpgrade).UpgradeInfo.SubType == UpgradeSubType.Bomb &&
             (e.Source as GenericUpgrade).HostShip.Owner.PlayerNo == HostShip.Owner.PlayerNo
         )
         );
 }
예제 #29
0
        private void DealDamageToRemote(GenericShip ship, Action callBack)
        {
            _ship = ship;

            DamageSourceEventArgs damage = new DamageSourceEventArgs()
            {
                Source     = this,
                DamageType = DamageTypes.BombDetonation
            };

            _ship.Damage.TryResolveDamage(1, 0, damage, callBack);
        }
예제 #30
0
        private void SufferDamage()
        {
            Messages.ShowInfo("Cluster Mines: " + Selection.ActiveShip.PilotInfo.PilotName + " suffers damage.");

            DamageSourceEventArgs clusterMinesDamage = new DamageSourceEventArgs()
            {
                Source     = HostUpgrade,
                DamageType = DamageTypes.BombDetonation
            };

            Selection.ActiveShip.Damage.TryResolveDamage(CurrentDiceRoll.DiceList, clusterMinesDamage, CallBack);
        }