public override void OnEventDidTrigger(RuleDealDamage evt)
        {
            var master = evt?.Target?.Descriptor?.Master.Value;

            if (master == null)
            {
                return;
            }


            if (master.Descriptor.State.IsDead)
            {
                return;
            }

            //Main.logger.Log($"{evt.Target.Damage}, {evt.Target.HPLeft}");
            int max_can_transfer  = master.HPLeft - 1;
            int max_need_transfer = (-evt.Target.HPLeft) - evt.Target.Stats.Constitution + 1;


            int transfer_damage = Math.Min(max_can_transfer, max_need_transfer);

            transfer_damage = Math.Min(transfer_damage, evt.Target.Damage);
            if (transfer_damage <= 0)
            {
                return;
            }

            evt.Target.Damage -= transfer_damage;
            var damage_bundle = new DamageBundle(new DirectDamage(new DiceFormula(transfer_damage, DiceType.One), 0));
            var rule          = this.Fact.MaybeContext.TriggerRule(new RuleDealDamage(evt.Target, master, damage_bundle));
        }
Example #2
0
        private int DealHitPointsDamage(ContextActionDealDamage2.DamageInfo info)
        {
            if (this.Context.MaybeCaster == null)
            {
                UberDebug.LogError(this, (object)"Caster is missing", (object[])Array.Empty <object>());
                return(0);
            }
            BaseDamage damage1 = this.DamageType.GetDamageDescriptor(info.Dices, info.Bonus).CreateDamage();

            damage1.EmpowerBonus = !info.Empower ? damage1.EmpowerBonus : 1.5f;
            damage1.Maximized    = info.Maximize || damage1.Maximized;
            BaseDamage baseDamage = damage1;
            DamageCriticalModifierType?criticalModifier = info.CriticalModifier;
            int?critModifier = criticalModifier.HasValue ? new int?(criticalModifier.GetValueOrDefault().IntValue()) : new int?();

            baseDamage.CriticalModifier = critModifier;
            damage1.Half           = this.Half;
            damage1.AlreadyHalved  = info.PreRolledValue.HasValue && this.Half && this.AlreadyHalved;
            damage1.PreRolledValue = info.PreRolledValue;
            if (this.IsAoE && !info.PreRolledValue.HasValue)
            {
                int?nullable2 = this.Context.AoEDamage.Get <ContextActionDealDamage, int?>(this, new int?());
                if (nullable2.HasValue)
                {
                    damage1.PreRolledValue = nullable2;
                }
            }
            ContextAttackData data    = ElementsContext.GetData <ContextAttackData>();
            DamageBundle      damage2 = (DamageBundle)damage1;

            damage2.Weapon = data?.AttackRoll?.Weapon;
            RuleDealDamage rule = new RuleDealDamage(this.Context.MaybeCaster, this.Target.Unit, damage2)
            {
                Projectile             = data?.Projectile,
                AttackRoll             = data?.AttackRoll,
                HalfBecauseSavingThrow = info.HalfBecauseSavingThrow,
                MinHPAfterDamage       = !this.UseMinHPAfterDamage ? new int?() : new int?(this.MinHPAfterDamage),
                SourceAbility          = this.Context.SourceAbility,
                SourceArea             = this.Context.AssociatedBlueprint as BlueprintAbilityAreaEffect
            };

            if (this.IsShadowEvocation)
            {
                RuleSavingThrow ruleSavingThrow = this.Context.TriggerRule(new RuleSavingThrow(this.Target.Unit, SavingThrowType.Will, this.Context.Params.DC));
                rule.ReducedBecauseOfShadowEvocation = ruleSavingThrow.IsPassed;
            }
            if (this.IsShadowEvocationGreater)
            {
                RuleSavingThrow ruleSavingThrow = this.Context.TriggerRule(new RuleSavingThrow(this.Target.Unit, SavingThrowType.Will, this.Context.Params.DC));
                rule.ReducedBecauseOfShadowEvocationGreater = ruleSavingThrow.IsPassed;
            }
            this.Context.TriggerRule <RuleDealDamage>(rule);
            if (this.IsAoE && !this.Context.AoEDamage.Get <ContextActionDealDamage, int?>(this, new int?()).HasValue)
            {
                this.Context.AoEDamage[this] = new int?(rule.Calculate.CalculatedDamage.FirstItem <DamageValue>().RolledValue);
            }
            return(rule.Damage);
        }
        public override void OnEventDidTrigger(RuleDealDamage evt)
        {
            if (evt.Target.Damage < 0)
            {
                return;
            }
            var pet = evt?.Target?.Descriptor?.Pet;

            if (pet == null)
            {
                return;
            }

            /*if (evt.Target.HPLeft <= 0)
             * {
             *  return;
             * }*/

            if (pet.Descriptor.State.IsDead)
            {
                return;
            }


            int max_can_transfer  = pet.HPLeft + pet.Stats.Constitution - 1;
            int max_need_transfer = threshold - evt.Target.HPLeft;

            int transfer_damage = Math.Min(max_can_transfer, max_need_transfer);

            transfer_damage = Math.Min(transfer_damage, evt.Target.Damage);
            if (transfer_damage <= 0)
            {
                return;
            }
            evt.Target.Damage -= transfer_damage;
            var damage_bundle = new DamageBundle(new DirectDamage(new DiceFormula(transfer_damage, DiceType.One), 0));
            var rule          = this.Fact.MaybeContext.TriggerRule(new RuleDealDamage(evt.Target, pet, damage_bundle));
        }
Example #4
0
        private void triggerEffect()
        {
            int bonus = this.ContextValue.Calculate(this.Context);

            if (Stat != StatType.Unknown)
            {
                ModifiableValue    stat = this.Owner.Stats.GetStat(this.Stat);
                RuleDealStatDamage rule = new RuleDealStatDamage(this.Owner.Unit, this.Owner.Unit, this.Stat, DiceFormula.Zero, bonus);
                rule.Reason = (RuleReason)this.Fact;
                this.Context.TriggerRule <RuleDealStatDamage>(rule);
            }
            else
            {
                var hp_damage = new DamageBundle(new BaseDamage[1]
                {
                    (BaseDamage) new DirectDamage(new DiceFormula(0, DiceType.Zero), bonus)
                }
                                                 );
                RuleDealDamage rule = new RuleDealDamage(this.Owner.Unit, this.Owner.Unit, hp_damage);
                rule.Reason = (RuleReason)this.Fact;
                this.Context.TriggerRule <RuleDealDamage>(rule);
            }
        }
Example #5
0
        public override void RunAction()
        {
            UnitEntityData maybeCaster = this.Context.MaybeCaster;

            if (maybeCaster == null)
            {
                UberDebug.LogError((object)"Caster is missing", (object[])Array.Empty <object>());
            }
            else
            {
                var target = this.Target;
                if (target == null)
                {
                    return;
                }
                var            weapon           = maybeCaster.Body.PrimaryHand.MaybeWeapon;
                RuleAttackRoll attackWithWeapon = new RuleAttackRoll(maybeCaster, target.Unit, weapon, 0);
                attackWithWeapon.Reason     = (RuleReason)this.Context;
                attackWithWeapon.AttackType = AttackType.RangedTouch;
                RuleAttackRoll rule = attackWithWeapon;
                this.Context.TriggerRule <RuleAttackRoll>(rule);

                RuleCalculateWeaponStats weaponRule = new RuleCalculateWeaponStats(maybeCaster, weapon, (RuleAttackWithWeapon)null);
                this.Context.TriggerRule <RuleCalculateWeaponStats>(weaponRule);
                DamageBundle damage = (DamageBundle)null;
                foreach (DamageDescription damageDescription in weaponRule.DamageDescription)
                {
                    damageDescription.TypeDescription = new DamageTypeDescription()
                    {
                        Type   = DamageType.Energy,
                        Energy = this.damageType
                    };
                    if (damage == null)
                    {
                        damage = new DamageBundle(weapon, weaponRule.WeaponSize, damageDescription.CreateDamage());
                    }
                    else
                    {
                        damage.Add(damageDescription.CreateDamage());
                    }
                }

                if (rule.IsHit)
                {
                    action_on_success?.Run();
                    if (this.damageType == DamageEnergyType.PositiveEnergy)
                    {
                        if (target.Unit.Descriptor.HasFact(library.Get <BlueprintUnitFact>("734a29b693e9ec346ba2951b27987e33")))
                        {
                            this.Context.TriggerRule <RuleDealDamage>(new RuleDealDamage(this.Context.MaybeCaster, this.Target.Unit, damage));
                        }
                        else
                        {
                            foreach (var i in damage)
                            {
                                this.Context.TriggerRule <RuleHealDamage>(new RuleHealDamage(this.Context.MaybeCaster, this.Target.Unit, i.Dice, i.Bonus));
                            }
                        }
                    }
                    else
                    {
                        if (target.Unit.Descriptor.HasFact(library.Get <BlueprintUnitFact>("734a29b693e9ec346ba2951b27987e33")))
                        {
                            foreach (var i in damage)
                            {
                                this.Context.TriggerRule <RuleHealDamage>(new RuleHealDamage(this.Context.MaybeCaster, this.Target.Unit, i.Dice, i.Bonus));
                            }
                        }
                        else
                        {
                            this.Context.TriggerRule <RuleDealDamage>(new RuleDealDamage(this.Context.MaybeCaster, this.Target.Unit, damage));
                        }
                    }
                }
                else
                {
                    action_on_miss?.Run();
                }
            }
        }
Example #6
0
 public RuleDealDamageNew([NotNull] UnitEntityData initiator, [NotNull] UnitEntityData target, DamageBundle damage) : base(initiator, target, damage)
 {
 }