protected sealed override void PrepareProtoStaticWorldObject()
        {
            base.PrepareProtoStaticWorldObject();

            this.PrepareProtoObjectExplosive(out var explosionPreset);
            this.ExplosionPreset = explosionPreset
                                   ?? throw new Exception("No explosion preset provided");

            // prepare damage description for characters
            {
                var damageDistribution = new DamageDistribution();
                this.PrepareDamageDescriptionCharacters(
                    out var damageValue,
                    out var armorPiercingCoef,
                    out var finalDamageMultiplier,
                    damageDistribution);

                this.damageDescriptionCharacters = new DamageDescription(
                    damageValue,
                    armorPiercingCoef,
                    finalDamageMultiplier,
                    rangeMax: this.DamageRadius,
                    damageDistribution);
            }

            // prepare damage properties for structures
            {
                this.PrepareDamageDescriptionStructures(
                    out var damageValue,
                    out var defencePenetrationCoef);

                this.StructureDamage = damageValue;
                this.StructureDefensePenetrationCoef = MathHelper.Clamp(defencePenetrationCoef, 0, 1);
            }
        }
Beispiel #2
0
 public ViewModel(Attacker attacker, DamageDistribution damageDistribution)
 {
     _damageDistribution  = damageDistribution;
     _assignments         = new BlockerDamageAssignments(attacker);
     _attacker            = attacker;
     _totalDamageToAssign = attacker.Card.CalculateCombatDamageAmount();
     _damageLeftToAssign  = _totalDamageToAssign;
 }
Beispiel #3
0
 public ViewModel(Attacker attacker, DamageDistribution damageDistribution)
 {
     _damageDistribution = damageDistribution;
       _assignments = new BlockerDamageAssignments(attacker);
       _attacker = attacker;
       _totalDamageToAssign = attacker.Card.CalculateCombatDamageAmount();
       _damageLeftToAssign = _totalDamageToAssign;
 }
Beispiel #4
0
 protected override void PrepareDamageDescriptionCharacters(
     out double damageValue,
     out double armorPiercingCoef,
     out double finalDamageMultiplier,
     DamageDistribution damageDistribution)
 {
     damageValue           = 120;
     armorPiercingCoef     = 0;
     finalDamageMultiplier = 1;
     damageDistribution.Set(DamageType.Kinetic, 1);
 }
 protected override void PrepareDamageDescriptionCharacters(
     out double damageValue,
     out double armorPiercingCoef,
     out double finalDamageMultiplier,
     DamageDistribution damageDistribution)
 {
     // nobody can survive this explosion
     damageValue           = 10_000;
     armorPiercingCoef     = 1;
     finalDamageMultiplier = 1;
     damageDistribution.Set(DamageType.Kinetic, 1);
 }
        protected override void PrepareDamageDescriptionCharacters(
            out double damageValue,
            out double armorPiercingCoef,
            out double finalDamageMultiplier,
            DamageDistribution damageDistribution)
        {
            damageValue           = 60; // lower damage than other grenades due to higher radius and higher final multiplier
            armorPiercingCoef     = 0;
            finalDamageMultiplier = 1.25;

            damageDistribution.Set(DamageType.Explosion, 1.0);
        }
        protected override void PrepareDamageDescriptionCharacters(
            out double damageValue,
            out double armorPiercingCoef,
            out double finalDamageMultiplier,
            DamageDistribution damageDistribution)
        {
            damageValue           = 90;
            armorPiercingCoef     = 0.2;
            finalDamageMultiplier = 1;

            damageDistribution.Set(DamageType.Explosion, 0.6)
            .Set(DamageType.Cold, 0.4);
        }
Beispiel #8
0
 protected override void PrepareDamageDescription(
     out double damageValue,
     out double armorPiercingCoef,
     out double finalDamageMultiplier,
     out double rangeMax,
     DamageDistribution damageDistribution)
 {
     damageValue           = 17;
     armorPiercingCoef     = 0;
     finalDamageMultiplier = 1.2;
     rangeMax = 7;
     damageDistribution.Set(DamageType.Impact, 1);
 }
 protected override void PrepareDamageDescription(
     out double damageValue,
     out double armorPiercingCoef,
     out double finalDamageMultiplier,
     out double rangeMax,
     DamageDistribution damageDistribution)
 {
     damageValue           = 18;
     armorPiercingCoef     = 0.5;
     finalDamageMultiplier = 1;
     rangeMax = 10;
     damageDistribution.Set(DamageType.Kinetic, 1);
 }
Beispiel #10
0
 protected override void PrepareDamageDescription(
     out double damageValue,
     out double armorPiercingCoef,
     out double finalDamageMultiplier,
     out double rangeMax,
     DamageDistribution damageDistribution)
 {
     // default values (not used)
     damageValue           = 0;
     armorPiercingCoef     = 0;
     finalDamageMultiplier = 1.0;
     rangeMax = 0;
 }
Beispiel #11
0
 protected override void PrepareDamageDescription(
     out double damageValue,
     out double armorPiercingCoef,
     out double finalDamageMultiplier,
     out double rangeMax,
     DamageDistribution damageDistribution)
 {
     damageValue           = 12;
     armorPiercingCoef     = 0;
     finalDamageMultiplier = 2;
     rangeMax = 9;
     damageDistribution.Set(DamageType.Kinetic, 0.6)
     .Set(DamageType.Chemical, 0.4);
 }
 protected override void PrepareDamageDescription(
     out double damageValue,
     out double armorPiercingCoef,
     out double finalDamageMultiplier,
     out double rangeMax,
     DamageDistribution damageDistribution)
 {
     damageValue           = 12; // actual damage won't be too big, due to pellets spread
     armorPiercingCoef     = 0;
     finalDamageMultiplier = 5;
     rangeMax = 7;
     damageDistribution.Set(DamageType.Kinetic, 0.8)
     .Set(DamageType.Impact, 0.2);
 }
 protected override void PrepareDamageDescription(
     out double damageValue,
     out double armorPiercingCoef,
     out double finalDamageMultiplier,
     out double rangeMax,
     DamageDistribution damageDistribution)
 {
     damageValue           = 20;
     armorPiercingCoef     = 0;
     finalDamageMultiplier = 1.5;
     rangeMax = 8;
     damageDistribution.Set(DamageType.Kinetic, 0.7)
     .Set(DamageType.Impact, 0.3);
 }
        protected override void PrepareProtoWeapon(
            out IEnumerable <IProtoItemAmmo> compatibleAmmoProtos,
            ref DamageDescription overrideDamageDescription)
        {
            // no ammo used
            compatibleAmmoProtos = null;

            var damageDistribution = new DamageDistribution()
                                     .Set(DamageType.Cold, 1.0);

            overrideDamageDescription = new DamageDescription(
                damageValue: 40,
                armorPiercingCoef: 0.6,
                finalDamageMultiplier: 1.25,
                rangeMax: 50,
                damageDistribution: damageDistribution);
        }
Beispiel #15
0
        public void AssignDamageToBlockers(Attacker attacker, DamageDistribution distribution)
        {
            foreach (var blocker in attacker.Blockers)
            {
                _assignedDamage.Add(new AssignedDamage(
                                        distribution[blocker],
                                        blocker.Attacker.Card,
                                        blocker.Card));
            }

            if (attacker.HasTrample || attacker.AssignsDamageAsThoughItWasntBlocked || attacker.IsBlocked == false)
            {
                _assignedDamage.Add(new AssignedDamage(
                                        amount: attacker.Card.CalculateCombatDamageAmount() - distribution.Total,
                                        source: attacker.Card,
                                        target: attacker.Planeswalker ?? (IDamageable)Players.Defending));
            }
        }
Beispiel #16
0
        protected override void PrepareProtoWeapon(
            out IEnumerable <IProtoItemAmmo> compatibleAmmoProtos,
            ref DamageDescription overrideDamageDescription)
        {
            // no ammo used
            compatibleAmmoProtos = null;

            var damageDistribution = new DamageDistribution()
                                     .Set(DamageType.Impact, 0.5)
                                     .Set(DamageType.Chemical, 0.5); // uses poison or something :)

            overrideDamageDescription = new DamageDescription(
                damageValue: 10,
                armorPiercingCoef: 0,
                finalDamageMultiplier: 1,
                rangeMax: 1.5,
                damageDistribution: damageDistribution);
        }
Beispiel #17
0
        protected override void PrepareProtoItem()
        {
            base.PrepareProtoItem();
            var damageDistribution = new DamageDistribution();

            this.PrepareDamageDescription(
                out var damageValue,
                out var armorPiercingCoef,
                out var finalDamageMultiplier,
                out var rangeMax,
                damageDistribution);

            this.DamageDescription = new DamageDescription(
                damageValue,
                armorPiercingCoef,
                finalDamageMultiplier,
                rangeMax,
                damageDistribution);
        }
Beispiel #18
0
        protected sealed override void PrepareDamageDescription(
            out double damageValue,
            out double armorPiercingCoef,
            out double finalDamageMultiplier,
            out double rangeMax,
            DamageDistribution damageDistribution)
        {
            this.PrepareExplosionPreset(out var explosionPreset);
            this.ExplosionPreset = explosionPreset
                                   ?? throw new Exception("No explosion preset provided");

            this.damageDescriptionForWeaponCache = new DamageDescription(
                damageValue: 0,
                armorPiercingCoef: 0,
                finalDamageMultiplier: 1,
                rangeMax: this.FireRangeMax,
                damageDistribution: new DamageDistribution());

            // prepare damage description for characters
            {
                rangeMax = this.FireRangeMax;

                this.PrepareDamageDescriptionCharacters(
                    out damageValue,
                    out armorPiercingCoef,
                    out finalDamageMultiplier,
                    damageDistribution);

                damageValue = this.SharedPrepareStatDamageToCharacters(damageValue);
            }

            // prepare damage properties for structures
            {
                this.PrepareDamageDescriptionStructures(
                    out var structureDamageValue,
                    out var structureDefencePenetrationCoef);

                this.StructureDamage = this.SharedPrepareStatDamageToStructures(structureDamageValue);
                this.StructureDefensePenetrationCoef = MathHelper.Clamp(structureDefencePenetrationCoef, 0, 1);
            }
        }
Beispiel #19
0
        public void DistributeDamageToBlockers(DamageDistribution distribution)
        {
            foreach (var blocker in _blockers)
            {
                var damage = new DamageFromSource(
                    distribution[blocker], source: Card);

                blocker.AssignDamage(damage);
            }

            var defender = Players.GetOpponent(_card.Controller);

            if (HasTrample || AssignsDamageAsThoughItWasntBlocked || _isBlocked == false)
            {
                var unassignedDamage = new DamageFromSource(
                    amount: Card.CalculateCombatDamageAmount() - distribution.Total,
                    source: _card);

                defender.AssignDamage(unassignedDamage);
            }
        }
Beispiel #20
0
        protected override void PrepareProtoItem()
        {
            base.PrepareProtoItem();

            this.listCompatibleWeaponProtos = new List <IProtoItemWeapon>();

            var damageDistribution = new DamageDistribution();

            this.FireTracePreset = this.PrepareFireTracePreset();

            this.PrepareDamageDescription(
                out var damageValue,
                out var armorPiercingCoef,
                out var finalDamageMultiplier,
                out var rangeMax,
                damageDistribution);

            this.DamageDescription = new DamageDescription(
                damageValue,
                armorPiercingCoef,
                finalDamageMultiplier,
                rangeMax,
                damageDistribution);
        }
Beispiel #21
0
        public void DistributeDamageToBlockers(DamageDistribution distribution)
        {
            foreach (var blocker in _blockers)
              {
            var damage = new DamageFromSource(
              distribution[blocker], source: Card);

            blocker.AssignDamage(damage);
              }

              var defender = Players.GetOpponent(_card.Controller);

              if (HasTrample || AssignsDamageAsThoughItWasntBlocked || _isBlocked == false)
              {
            var unassignedDamage = new DamageFromSource(
              amount: Card.CalculateCombatDamageAmount() - distribution.Total,
              source: _card);

            defender.AssignDamage(unassignedDamage);
              }
        }
Beispiel #22
0
 protected abstract void PrepareDamageDescription(
     out double damageValue,
     out double armorPiercingCoef,
     out double finalDamageMultiplier,
     out double rangeMax,
     DamageDistribution damageDistribution);